/**
  * Create or update an order coupon.
  *
  * @param WC_Order $order Order data.
  * @param array $coupon Item data.
  * @param string $action 'create' to add coupon or 'update' to update it.
  * @throws WC_REST_Exception Invalid data, server error.
  */
 protected function set_coupon($order, $coupon, $action)
 {
     // Coupon discount must be positive float.
     if (isset($coupon['discount']) && 0 > floatval($coupon['discount'])) {
         throw new WC_REST_Exception('woocommerce_rest_invalid_coupon_total', __('Coupon discount must be a positive amount.', 'woocommerce'), 400);
     }
     if ('create' === $action) {
         // Coupon code is required.
         if (empty($coupon['code'])) {
             throw new WC_REST_Exception('woocommerce_rest_invalid_coupon_coupon', __('Coupon code is required.', 'woocommerce'), 400);
         }
         $coupon_id = $order->add_coupon($coupon['code'], floatval($coupon['discount']));
         if (!$coupon_id) {
             throw new WC_REST_Exception('woocommerce_rest_cannot_create_order_coupon', __('Cannot create coupon, try again.', 'woocommerce'), 500);
         }
     } else {
         $coupon_args = array();
         if (isset($coupon['code'])) {
             $coupon_args['code'] = $coupon['code'];
         }
         if (isset($coupon['discount'])) {
             $coupon_args['discount_amount'] = floatval($coupon['discount']);
         }
         $coupon_id = $order->update_coupon($coupon['id'], $coupon_args);
         if (!$coupon_id) {
             throw new WC_REST_Exception('woocommerce_rest_cannot_update_order_coupon', __('Cannot update coupon, try again.', 'woocommerce'), 500);
         }
     }
 }
 /**
  * Charge Payment
  * Method ini digunakan untuk mendapatkan link halaman pembayaran Veritrans
  * dengan mengirimkan JSON yang berisi data transaksi
  */
 function charge_payment($order_id)
 {
     global $woocommerce;
     $order_items = array();
     $cart = $woocommerce->cart;
     $order = new WC_Order($order_id);
     // add discount
     // WC()->cart->add_discount( 'veritrans' );
     $cart->add_discount('veritrans');
     $order->add_coupon('veritrans', WC()->cart->get_coupon_discount_amount('veritrans'), WC()->cart->get_coupon_discount_tax_amount('veritrans'));
     $order->set_total(WC()->cart->shipping_total, 'shipping');
     $order->set_total(WC()->cart->get_cart_discount_total(), 'cart_discount');
     $order->set_total(WC()->cart->get_cart_discount_tax_total(), 'cart_discount_tax');
     $order->set_total(WC()->cart->tax_total, 'tax');
     $order->set_total(WC()->cart->shipping_tax_total, 'shipping_tax');
     $order->set_total(WC()->cart->total);
     // $order->add_coupon('veritrans',10000);
     // end of add discount
     Veritrans_Config::$isProduction = $this->environment == 'production' ? true : false;
     Veritrans_Config::$serverKey = Veritrans_Config::$isProduction ? $this->server_key_v2_production : $this->server_key_v2_sandbox;
     Veritrans_Config::$is3ds = true;
     Veritrans_Config::$isSanitized = $this->enable_sanitization == 'yes' ? true : false;
     $params = array('transaction_details' => array('order_id' => $order_id, 'gross_amount' => 0), 'vtweb' => array());
     $enabled_payments = array();
     // if ($this->enable_credit_card == 'yes'){
     //   $enabled_payments[] = 'credit_card';
     // }
     // check enabled payment
     if ($this->enable_credit_card == 'yes') {
         $params['vtweb']['enabled_payments'] = 'credit_card';
     }
     if ($this->enable_permata_va == 'yes') {
         $params['vtweb']['enabled_payments'] = 'bank_transfer';
     }
     // add bin filter
     $bins = $this->bin_filter;
     $bins = explode(',', $bins);
     $params['vtweb']['credit_card_bins'] = $bins;
     $customer_details = array();
     $customer_details['first_name'] = $order->billing_first_name;
     $customer_details['last_name'] = $order->billing_last_name;
     $customer_details['email'] = $order->billing_email;
     $customer_details['phone'] = $order->billing_phone;
     $billing_address = array();
     $billing_address['first_name'] = $order->billing_first_name;
     $billing_address['last_name'] = $order->billing_last_name;
     $billing_address['address'] = $order->billing_address_1;
     $billing_address['city'] = $order->billing_city;
     $billing_address['postal_code'] = $order->billing_postcode;
     $billing_address['phone'] = $order->billing_phone;
     $billing_address['country_code'] = strlen($this->convert_country_code($order->billing_country) != 3) ? 'IDN' : $this->convert_country_code($order->billing_country);
     $customer_details['billing_address'] = $billing_address;
     $customer_details['shipping_address'] = $billing_address;
     if (isset($_POST['ship_to_different_address'])) {
         $shipping_address = array();
         $shipping_address['first_name'] = $order->shipping_first_name;
         $shipping_address['last_name'] = $order->shipping_last_name;
         $shipping_address['address'] = $order->shipping_address_1;
         $shipping_address['city'] = $order->shipping_city;
         $shipping_address['postal_code'] = $order->shipping_postcode;
         $shipping_address['phone'] = $order->billing_phone;
         $shipping_address['country_code'] = strlen($this->convert_country_code($order->shipping_country) != 3) ? 'IDN' : $this->convert_country_code($order->billing_country);
         $customer_details['shipping_address'] = $shipping_address;
     }
     $params['customer_details'] = $customer_details;
     //error_log(print_r($params,true));
     $items = array();
     if (sizeof($order->get_items()) > 0) {
         foreach ($order->get_items() as $item) {
             if ($item['qty']) {
                 $product = $order->get_product_from_item($item);
                 $veritrans_item = array();
                 $veritrans_item['id'] = $item['product_id'];
                 $veritrans_item['price'] = $order->get_item_subtotal($item, false);
                 $veritrans_item['quantity'] = $item['qty'];
                 $veritrans_item['name'] = $item['name'];
                 $items[] = $veritrans_item;
             }
         }
     }
     // Shipping fee
     if ($order->get_total_shipping() > 0) {
         $items[] = array('id' => 'shippingfee', 'price' => $order->get_total_shipping(), 'quantity' => 1, 'name' => 'Shipping Fee');
     }
     // Tax
     if ($order->get_total_tax() > 0) {
         $items[] = array('id' => 'taxfee', 'price' => $order->get_total_tax(), 'quantity' => 1, 'name' => 'Tax');
     }
     // Discount
     if ($order->get_cart_discount() > 0) {
         $items[] = array('id' => 'totaldiscount', 'price' => $order->get_cart_discount() * -1, 'quantity' => 1, 'name' => 'Total Discount');
     }
     // Fees
     if (sizeof($order->get_fees()) > 0) {
         $fees = $order->get_fees();
         $i = 0;
         foreach ($fees as $item) {
             $items[] = array('id' => 'itemfee' . $i, 'price' => $item['line_total'], 'quantity' => 1, 'name' => $item['name']);
             $i++;
         }
     }
     //calculate gross amount
     $total_amount = 0;
     // error_log('print r items[]' . print_r($items,true)); //debugan
     foreach ($items as $item) {
         $total_amount += $item['price'] * $item['quantity'];
         // error_log('|||| Per item[]' . print_r($item,true)); //debugan
     }
     $params['transaction_details']['gross_amount'] = $total_amount;
     // error_log('bni'.$this->enable_bni);
     // error_log('mandiri'.$this->enable_mandiri);
     // if($this->enable_bni == 'yes' || $this->enable_mandiri == 'yes')
     if (false) {
         $installment_terms = array();
         $payment_options = array('installment' => array('required' => true, 'installment_terms' => new stdClass(), 'offline_installment_terms' => array()));
         // $term_bni = $this->bni_terms;
         // error_log('term bni '.$term_bni);
         // $term_bni_array = explode(',' , $term_bni);
         // if($term_bni == "yes" || $term_bni_array != null)
         // {
         //   $installment_terms['bni'] = $term_bni_array;
         // }
         // $term_mandiri =  $this->mandiri_terms;
         // error_log('term mandiri '.$term_mandiri);
         // $term_mandiri_array = explode(',' , $term_mandiri);
         // if($term_mandiri == "yes" || $term_mandiri_array != null)
         // {
         //   $installment_terms['mandiri'] = $term_mandiri_array;
         // }
         $term = $this->installment_terms;
         error_log('============installment_terms ' . $term);
         $term_array = explode(',', $term);
     }
     // sift through the entire item to ensure that currency conversion is applied
     if (get_woocommerce_currency() != 'IDR') {
         foreach ($items as &$item) {
             $item['price'] = $item['price'] * $this->to_idr_rate;
         }
         unset($item);
         $params['transaction_details']['gross_amount'] *= $this->to_idr_rate;
     }
     $params['item_details'] = $items;
     // if($params['transaction_details']['gross_amount'] >= $this->min_amount)
     // {
     //   $payment_options['installment']['offline_installment_terms'] = $term_array;
     //   $params['vtweb']['payment_options'] = $payment_options;
     // }
     $woocommerce->cart->empty_cart();
     error_log(print_r($params, TRUE));
     // error_log(json_encode($params));
     return Veritrans_VtWeb::getRedirectionUrl($params);
 }
Esempio n. 3
0
 public function update_cart_by_woocart($order_id, $data)
 {
     global $wp;
     global $wpdb, $woocommerce, $pwa;
     $xml = simplexml_load_string($data);
     $order = new WC_Order($order_id);
     $billing_address = array('first_name' => (string) $xml->ProcessedOrder->BuyerInfo->BuyerName, 'last_name' => '', 'company' => '', 'email' => (string) $xml->ProcessedOrder->BuyerInfo->BuyerEmailAddress, 'phone' => '', 'address_1' => '', 'address_2' => '', 'city' => '', 'state' => '', 'postcode' => '', 'country' => '');
     $shipping_address = array('first_name' => (string) $xml->ProcessedOrder->ShippingAddress->Name, 'last_name' => '', 'company' => '', 'email' => '', 'phone' => '', 'address_1' => (string) $xml->ProcessedOrder->ShippingAddress->AddressFieldOne, 'address_2' => (string) $xml->ProcessedOrder->ShippingAddress->AddressFieldTwo, 'city' => (string) $xml->ProcessedOrder->ShippingAddress->City, 'state' => (string) $xml->ProcessedOrder->ShippingAddress->State, 'postcode' => (string) $xml->ProcessedOrder->ShippingAddress->PostalCode, 'country' => (string) $xml->ProcessedOrder->ShippingAddress->CountryCode);
     $order->set_address($shipping_address, 'shipping');
     add_post_meta($order_id, '_payment_method', 'pwa');
     add_post_meta($order_id, '_payment_method_title', 'Pay with Amazon');
     $total_amount = 0;
     $subtotal_amount = 0;
     $shipping_amount = 0;
     $ClientRequestId = 0;
     try {
         foreach ($xml->ProcessedOrder->ProcessedOrderItems->ProcessedOrderItem as $item) {
             // XML DATA
             $ClientRequestId = (int) $item->ClientRequestId;
             foreach ($item->ItemCharges->Component as $amount_type) {
                 $item_charge_type = (string) $amount_type->Type;
                 if ($item_charge_type == 'Shipping') {
                     $Shipping = (string) $amount_type->Charge->Amount;
                 }
             }
             $shipping_amount = $shipping_amount + $Shipping;
         }
     } catch (Exception $e) {
         $param['message'] = 'IOPN Notifications : Caught exception : ' . $e->getMessage() . '.';
         $this->generate_log($param);
     }
     if ($ClientRequestId == 0) {
         $order->set_address($billing_address, 'billing');
     }
     // CART DATA
     $cartdata = '';
     $user_id = 0;
     $prefix = $wpdb->prefix;
     $carts = $wpdb->get_results("SELECT * FROM `" . $prefix . "pwa_before_cart_save` WHERE id = {$ClientRequestId} ");
     foreach ($carts as $key => $value) {
         $cartdata = maybe_unserialize($value->cart_data);
         $user_id = $value->user_id;
     }
     update_post_meta($order_id, '_customer_user', $user_id);
     // ENTRY
     try {
         foreach ($cartdata->cart_contents as $key => $value) {
             $product_id = $value['product_id'];
             $cart_product = get_product($product_id);
             $product = array();
             $product['order_item_name'] = $cart_product->get_title();
             $product['order_item_type'] = 'line_item';
             $order_item_id = wc_add_order_item($order_id, $product);
             wc_add_order_item_meta($order_item_id, '_qty', $value['quantity']);
             wc_add_order_item_meta($order_item_id, '_product_id', $product_id);
             wc_add_order_item_meta($order_item_id, '_line_total', $value['line_total']);
             wc_add_order_item_meta($order_item_id, '_line_subtotal', $value['line_subtotal']);
             wc_add_order_item_meta($order_item_id, '_line_tax', $value['line_tax']);
             wc_add_order_item_meta($order_item_id, '_line_subtotal_tax', $value['line_subtotal_tax']);
             wc_add_order_item_meta($order_item_id, '_line_tax_data', maybe_serialize($value['line_tax_data']));
             foreach ($value['line_tax_data']['total'] as $tax_rate_id => $tax_data) {
                 $tax_class = $wpdb->get_results("SELECT * FROM `" . $prefix . "woocommerce_tax_rates` WHERE tax_rate_id = {$tax_rate_id} ");
                 wc_add_order_item_meta($order_item_id, '_tax_class', $tax_class[0]->tax_rate_class);
             }
             if ($value['variation_id'] > 0) {
                 wc_add_order_item_meta($order_item_id, '_variation_id', $value['variation_id']);
             }
             foreach ($value['variation'] as $attrib_key => $attrib_value) {
                 $meta_key = str_replace('attribute_', '', $attrib_key);
                 wc_add_order_item_meta($order_item_id, $meta_key, $attrib_value);
             }
             $this->reduce_order_stock($product_id, $value['quantity']);
             $total_amount = $total_amount + $value['line_total'] + $value['line_tax'];
             $subtotal_amount = $subtotal_amount + $value['line_subtotal'];
         }
     } catch (Exception $e) {
         $param['message'] = 'IOPN Notifications : Caught exception : ' . $e->getMessage() . '.';
         $this->generate_log($param);
     }
     add_post_meta($order_id, '_order_total', $total_amount + $shipping_amount);
     add_post_meta($order_id, '_order_shipping', $shipping_amount);
     add_post_meta($order_id, '_cart_discount', $cartdata->discount_cart);
     add_post_meta($order_id, '_cart_discount_tax', $cartdata->discount_cart_tax);
     add_post_meta($order_id, '_order_tax', $cartdata->tax_total);
     $shipitem = array();
     $shipitem['order_item_name'] = (string) $xml->ProcessedOrder->ShippingServiceLevel;
     $shipitem['order_item_type'] = 'shipping';
     $order_shipping_id = wc_add_order_item($order_id, $shipitem);
     wc_add_order_item_meta($order_shipping_id, 'method_id', str_replace(' ', '_', strtolower((string) $xml->ProcessedOrder->ShippingServiceLevel)));
     wc_add_order_item_meta($order_shipping_id, 'cost', $shipping_amount);
     if (!empty($cartdata->taxes)) {
         foreach ($cartdata->taxes as $key => $value) {
             $order->add_tax($key, $value);
         }
     }
     if (!empty($cartdata->applied_coupons)) {
         foreach ($cartdata->applied_coupons as $key => $value) {
             $order->add_coupon($value, $cartdata->coupon_discount_amounts[$value], $cartdata->coupon_discount_tax_amounts[$value]);
         }
     }
     // Send notification mails to seller and customer for order
     $mail_class = new WC_Emails();
     $mail_class->emails['WC_Email_New_Order']->trigger($order_id);
     // Acknowledge the order in seller central using MWS FEED API
     $pwa->pwa_acknowledge_feed($order_id);
 }
 /**
  * Create or update an order coupon
  *
  * @since 2.2
  * @param \WC_Order $order
  * @param array $coupon item data
  * @param string $action 'create' to add coupon or 'update' to update it
  * @throws WC_API_Exception invalid data, server error
  */
 private function set_coupon($order, $coupon, $action)
 {
     // coupon amount must be positive float
     if (isset($coupon['amount']) && floatval($coupon['amount']) < 0) {
         throw new WC_API_Exception('woocommerce_invalid_coupon_total', __('Coupon discount total must be a positive amount', 'woocommerce'), 400);
     }
     if ('create' === $action) {
         // coupon code is required
         if (empty($coupon['code'])) {
             throw new WC_API_Exception('woocommerce_invalid_coupon_coupon', __('Coupon code is required', 'woocommerce'), 400);
         }
         $coupon_id = $order->add_coupon($coupon['code'], isset($coupon['amount']) ? floatval($coupon['amount']) : 0);
         if (!$coupon_id) {
             throw new WC_API_Exception('woocommerce_cannot_create_order_coupon', __('Cannot create coupon, try again', 'woocommerce'), 500);
         }
     } else {
         $coupon_args = array();
         if (isset($coupon['code'])) {
             $coupon_args['code'] = $coupon['code'];
         }
         if (isset($coupon['amount'])) {
             $coupon_args['discount_amount'] = floatval($coupon['amount']);
         }
         $coupon_id = $order->update_coupon($coupon['id'], $coupon_args);
         if (!$coupon_id) {
             throw new WC_API_Exception('woocommerce_cannot_update_order_coupon', __('Cannot update coupon, try again', 'woocommerce'), 500);
         }
     }
 }
 /**
  * Add an item to the provided order
  *
  * @since 3.0.0
  * @param \WC_Order $order
  * @param array $item Parsed item data from CSV
  * @param string $type Line item type
  * @return int|false ID of the inserted order item, false on failure
  */
 private function add_order_item(WC_Order $order, $item, $type)
 {
     $result = false;
     switch ($type) {
         case 'line_item':
             $product = $this->get_product_for_item($item);
             $args = $this->prepare_product_args($item);
             $result = $order->add_product($product, $args['qty'], $args);
             if (!$result) {
                 wc_csv_import_suite()->log(sprintf(__('> > Warning: cannot add order item "%s".', 'woocommerce-csv-import-suite'), esc_html($identifier)));
             }
             break;
         case 'shipping':
             $args = array('order_item_name' => $item['method_title'], 'order_item_type' => 'shipping');
             // we're using wc_add_order_item instead of $order->add_shipping because
             // we do not want the order total to be recalculated
             $result = wc_add_order_item($order->id, $args);
             if (!$result) {
                 wc_csv_import_suite()->log(sprintf(__('> > Warning: cannot add shipping method "%s".', 'woocommerce-csv-import-suite'), esc_html($item['title'])));
             }
             break;
         case 'tax':
             $args = array('order_item_name' => $item['code'], 'order_item_type' => 'tax');
             $result = wc_add_order_item($order->id, $args);
             if (!$result) {
                 wc_csv_import_suite()->log(sprintf(__('> > Warning: cannot add tax "%s".', 'woocommerce-csv-import-suite'), esc_html($item['label'])));
             }
             break;
         case 'coupon':
             $result = $order->add_coupon($item['code'], $item['amount']);
             if (!$result) {
                 wc_csv_import_suite()->log(sprintf(__('> > Warning: cannot add coupon "%s".', 'woocommerce-csv-import-suite'), esc_html($item['code'])));
             }
             break;
         case 'fee':
             $order_fee = new stdClass();
             $order_fee->id = sanitize_title($item['title']);
             $order_fee->name = $item['title'];
             $order_fee->amount = isset($item['total']) ? floatval($item['total']) : 0;
             $order_fee->taxable = false;
             $order_fee->tax = 0;
             $order_fee->tax_data = array();
             $order_fee->tax_class = '';
             // if taxable, tax class and total are required
             if (isset($item['taxable']) && $item['taxable']) {
                 $order_fee->taxable = true;
                 $order_fee->tax_class = $item['tax_class'];
                 if (isset($item['total_tax'])) {
                     $order_fee->tax = isset($item['total_tax']) ? wc_format_refund_total($item['total_tax']) : 0;
                 }
                 if (isset($item['tax_data'])) {
                     $tax_data = isset($item['tax_data']['total']) ? $item['tax_data']['total'] : $item['tax_data'];
                     $order_fee->tax = wc_format_refund_total(array_sum($tax_data));
                     $order_fee->tax_data = array_map('wc_format_refund_total', $tax_data);
                 }
             }
             $result = $order->add_fee($order_fee);
             if (!$result) {
                 wc_csv_import_suite()->log(sprintf(__('> > Warning: cannot add fee "%s".', 'woocommerce-csv-import-suite'), esc_html($item['title'])));
             }
             break;
     }
     // store original order item ID
     if ($result && isset($item['order_item_id']) && $item['order_item_id'] > 0) {
         wc_update_order_item_meta($result, '_original_order_item_id', $item['order_item_id']);
     }
     return $result;
 }