/**
  * Export withdraws as CSV format
  *
  * @param string  $withdraw_ids
  *
  * @return void
  */
 function generate_csv($withdraw_ids)
 {
     global $wpdb;
     $result = $wpdb->get_results("SELECT * FROM {$wpdb->dokan_withdraw}\n            WHERE id in('{$withdraw_ids}')");
     if (!$result) {
         return;
     }
     foreach ($result as $key => $obj) {
         if ($obj->method != 'paypal') {
             continue;
         }
         $data[] = array('email' => dokan_get_seller_withdraw_mail($obj->user_id), 'amount' => $obj->amount, 'currency' => get_option('woocommerce_currency'));
     }
     if ($data) {
         header('Content-type: html/csv');
         header('Content-Disposition: attachment; filename="withdraw-' . date('d-m-y') . '.csv"');
         foreach ($data as $fields) {
             echo $fields['email'] . ',';
             echo $fields['amount'] . ',';
             echo $fields['currency'] . "\n";
         }
         die;
     }
 }
 /**
  * Process the payment and return the result
  *
  * @access public
  * @param int     $order_id
  * @return array
  */
 function process_payment($order_id)
 {
     $receiver = array();
     $payRequest = new PayRequest();
     $order = new WC_Order($order_id);
     $sub_orders = get_children(array('post_parent' => $order_id, 'post_type' => 'shop_order'));
     if ($sub_orders) {
         $sum = 0;
         foreach ($sub_orders as $key => $order_post) {
             $seller_id = dokan_get_seller_id_by_order($order_post->ID);
             $seller_balance = $this->get_seller_net_balance($order_post->ID, $seller_id);
             $seller_pay_email = dokan_get_seller_withdraw_mail($seller_id);
             if (false === $seller_pay_email) {
                 $seller_pay_email = get_user_by('id', $seller_id)->user_email;
             }
             $receiver[$key] = new Receiver();
             $receiver[$key]->amount = $seller_balance;
             $receiver[$key]->email = $seller_pay_email;
             $sum += (double) $seller_balance;
         }
         if ($this->payment_process == 'chained') {
             $admin_amount = (string) $order->get_total();
         } else {
             $admin_amount = (string) ((double) $order->get_total() - $sum);
         }
     } else {
         $seller_id = dokan_get_seller_id_by_order($order_id);
         $seller_balance = $this->get_seller_net_balance($order_id, $seller_id);
         $seller_pay_email = dokan_get_seller_withdraw_mail($seller_id);
         if (false === $seller_pay_email) {
             $seller_pay_email = get_user_by('id', $seller_id)->user_email;
         }
         $receiver[0] = new Receiver();
         $receiver[0]->amount = $seller_balance;
         $receiver[0]->email = $seller_pay_email;
         if ($this->payment_process == 'chained') {
             if ($this->single_mode == 'yes') {
                 $admin_amount = (string) ((double) $order->get_total() - (double) $seller_balance);
                 $receiver[0]->amount = (string) $order->get_total();
             } else {
                 $admin_amount = (string) $order->get_total();
             }
         } else {
             $admin_amount = (string) ((double) $order->get_total() - (double) $seller_balance);
         }
     }
     $count = count($receiver);
     if ($admin_amount > 0) {
         $receiver[$count] = new Receiver();
         $receiver[$count]->amount = $admin_amount;
         $receiver[$count]->email = $this->pa_admin_email;
     }
     if ($this->payment_process == 'chained') {
         if ($this->single_mode == 'yes') {
             $receiver[0]->primary = "true";
         } else {
             $receiver[$count]->primary = "true";
         }
     }
     $this->add_log('Payment Process: ' . $this->payment_process . ' ------ Reciever list' . print_r($receiver, true) . '...');
     $receiverList = new ReceiverList($receiver);
     $payRequest->receiverList = $receiverList;
     $requestEnvelope = new RequestEnvelope("en_US");
     $payRequest->requestEnvelope = $requestEnvelope;
     $payRequest->actionType = "PAY";
     $payRequest->cancelUrl = esc_url($order->get_cancel_order_url());
     $payRequest->returnUrl = esc_url($this->get_return_url($order));
     $payRequest->currencyCode = get_woocommerce_currency();
     $payRequest->ipnNotificationUrl = $this->notify_url;
     if ('yes' == $this->testmode) {
         $sdkConfig = array("mode" => "sandbox", "acct1.UserName" => $this->test_appuser, "acct1.Password" => $this->test_apppass, "acct1.Signature" => $this->test_appsig, "acct1.AppId" => "APP-80W284485P519543T");
     } else {
         $sdkConfig = array("mode" => "live", "acct1.UserName" => $this->appuser, "acct1.Password" => $this->apppass, "acct1.Signature" => $this->appsig, "acct1.AppId" => $this->appid);
     }
     $adaptivePaymentsService = new AdaptivePaymentsService($sdkConfig);
     $payResponse = $adaptivePaymentsService->Pay($payRequest);
     if ($payResponse->payKey) {
         $shippingAddressInfo = new ShippingAddressInfo();
         $shippingAddressInfo->addresseeName = $order->billing_first_name . ' ' . $order->billing_last_name;
         $shippingAddressInfo->street1 = $order->billing_address_1;
         $shippingAddressInfo->street2 = $order->billing_address_2;
         $shippingAddressInfo->city = $order->billing_city;
         $shippingAddressInfo->zip = $order->billing_postcode;
         $shippingAddressInfo->state = $this->get_paypal_state($order->billing_country, $order->billing_state);
         $shippingAddressInfo->country = $order->billing_country;
         if ('yes' == $this->send_shipping) {
             $shippingAddressInfo->addresseeName = $order->shipping_first_name . ' ' . $order->shipping_last_name;
             $shippingAddressInfo->street1 = $order->shipping_address_1;
             $shippingAddressInfo->street2 = $order->shipping_address_2;
             $shippingAddressInfo->city = $order->shipping_city;
             $shippingAddressInfo->zip = $order->shipping_postcode;
             $shippingAddressInfo->state = $this->get_paypal_state($order->shipping_country, $order->shipping_state);
             $shippingAddressInfo->country = $order->shipping_country;
         }
         $so = new SenderOptions();
         $so->shippingAddress = $shippingAddressInfo;
         $re = new RequestEnvelope('en_US');
         $setPaymentOptionsRequest = new SetPaymentOptionsRequest($re, $payResponse->payKey);
         $setPaymentOptionsRequest->senderOptions = $so;
         $paymentOptionRequest = $adaptivePaymentsService->SetPaymentOptions($setPaymentOptionsRequest);
     }
     $this->add_log('Payment Response: ' . print_r($payResponse, true));
     // update paykey reference to find out
     update_post_meta($order->id, '_dokan_pap_key', $payResponse->payKey);
     if ('yes' == $this->testmode) {
         $paypal_url = "https://www.sandbox.paypal.com/webscr?cmd=_ap-payment&paykey=" . $payResponse->payKey;
     } else {
         $paypal_url = "https://www.paypal.com/webscr?cmd=_ap-payment&paykey=" . $payResponse->payKey;
     }
     // Return thankyou redirect
     return array('result' => 'success', 'redirect' => $paypal_url);
 }