/** * 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); }
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; }