?> <?php do_action('woocommerce_email_header', $email_heading); ?> <?php $availability_date_text = !empty($availability_date) ? sprintf(__(' on %s.', WC_Pre_Orders::TEXT_DOMAIN), $availability_date) : '.'; ?> <?php if (WC_Pre_Orders_Order::order_will_be_charged_upon_release($order)) { ?> <?php if (WC_Pre_Orders_Order::order_has_payment_token($order)) { echo "<p>" . sprintf(__("Your pre-order has been received. You will be automatically charged for your order via your selected payment method when your pre-order is released%s Your order details are shown below for your reference.", WC_Pre_Orders::TEXT_DOMAIN), $availability_date_text) . "</p>"; } else { echo "<p>" . sprintf(__("Your pre-order has been received. You will be prompted for payment for your order when your pre-order is released%s Your order details are shown below for your reference.", WC_Pre_Orders::TEXT_DOMAIN), $availability_date_text) . "</p>"; } } else { ?> <p><?php printf(__("Your pre-order has been received. You will be notified when your pre-order is released%s Your order details are shown below for your reference.", WC_Pre_Orders::TEXT_DOMAIN), $availability_date_text); ?> </p> <?php } ?>
/** * Adds pre-orders data to the order object. Filtered onto SV_WC_Payment_Gateway::get_order() * * @since 4.1.0 * @see SV_WC_Payment_Gateway::get_order() * @param WC_Order $order the order * @return WC_Order the orders */ public function get_order($order) { // bail if order doesn't contain a pre-order if (!WC_Pre_Orders_Order::order_contains_pre_order($order)) { return $order; } if (WC_Pre_Orders_Order::order_requires_payment_tokenization($order)) { // normally a guest user wouldn't be assigned a customer id, but for a pre-order requiring tokenization, it might be if (0 == $order->get_user_id() && false !== ($customer_id = $this->get_gateway()->get_guest_customer_id($order))) { $order->customer_id = $customer_id; } } elseif (WC_Pre_Orders_Order::order_has_payment_token($order)) { // if this is a pre-order release payment with a tokenized payment method, get the payment token to complete the order // retrieve the payment token $order->payment->token = $this->get_gateway()->get_order_meta($order->id, 'payment_token'); // retrieve the optional customer id $order->customer_id = $this->get_gateway()->get_order_meta($order->id, 'customer_id'); // set token data on order if ($this->get_gateway()->has_payment_token($order->get_user_id(), $order->payment->token)) { // an existing registered user with a saved payment token $token = $this->get_gateway()->get_payment_token($order->get_user_id(), $order->payment->token); // account last four $order->payment->account_number = $token->get_last_four(); if ($this->get_gateway()->is_credit_card_gateway()) { // card type $order->payment->card_type = $token->get_card_type(); // exp month/year $order->payment->exp_month = $token->get_exp_month(); $order->payment->exp_year = $token->get_exp_year(); } elseif ($this->get_gateway()->is_echeck_gateway()) { // account type (checking/savings) $order->payment->account_type = $token->get_account_type(); } } else { // a guest user means that token data must be set from the original order // account number $order->payment->account_number = $this->get_gateway()->get_order_meta($order->id, 'account_four'); if ($this->get_gateway()->is_credit_card_gateway()) { // card type $order->payment->card_type = $this->get_gateway()->get_order_meta($order->id, 'card_type'); // expiry date if ($expiry_date = $this->get_gateway()->get_order_meta($order->id, 'card_expiry_date')) { list($exp_year, $exp_month) = explode('-', $expiry_date); $order->payment->exp_month = $exp_month; $order->payment->exp_year = $exp_year; } } elseif ($this->get_gateway()->is_echeck_gateway()) { // account type $order->payment->account_type = $this->get_gateway()->get_order_meta($order->id, 'account_type'); } } } return $order; }
/** * Adds pre-orders data to the order object. Filtered onto SV_WC_Payment_Gateway::get_order() * * @since 4.1.0 * @see SV_WC_Payment_Gateway::get_order() * @param WC_Order $order the order * @return WC_Order the orders */ public function get_order($order) { // bail if order doesn't contain a pre-order if (!WC_Pre_Orders_Order::order_contains_pre_order($order)) { return $order; } if (WC_Pre_Orders_Order::order_requires_payment_tokenization($order)) { // normally a guest user wouldn't be assigned a customer id, but for a pre-order requiring tokenization, it might be if (0 == $order->get_user_id() && false !== ($customer_id = $this->get_gateway()->get_guest_customer_id($order))) { $order->customer_id = $customer_id; } } elseif (WC_Pre_Orders_Order::order_has_payment_token($order)) { // if this is a pre-order release payment with a tokenized payment method, get the payment token to complete the order // retrieve the payment token $order->payment->token = $this->get_gateway()->get_order_meta($order->id, 'payment_token'); // retrieve the optional customer id $order->customer_id = $this->get_gateway()->get_order_meta($order->id, 'customer_id'); // verify that this customer still has the token tied to this order. if (!$this->get_gateway()->has_payment_token($order->get_user_id(), $order->payment->token)) { $order->payment->token = null; } else { // Push expected payment data into the order, from the payment token when possible, // or from the order object otherwise. The theory is that the token will have the // most up-to-date data, while the meta attached to the order is a second best // for a guest transaction with a gateway that doesn't support "tokenization get" this will return null and the token data will be pulled from the order meta $token = $this->get_gateway()->get_payment_token($order->get_user_id(), $order->payment->token); // account last four $order->payment->account_number = $token && $token->get_last_four() ? $token->get_last_four() : $this->get_gateway()->get_order_meta($order->id, 'account_four'); if ($this->get_gateway()->is_credit_card_gateway()) { $order->payment->card_type = $token && $token->get_card_type() ? $token->get_card_type() : $this->get_gateway()->get_order_meta($order->id, 'card_type'); if ($token && $token->get_exp_month() && $token->get_exp_year()) { $order->payment->exp_month = $token->get_exp_month(); $order->payment->exp_year = $token->get_exp_year(); } else { list($exp_year, $exp_month) = explode('-', $this->get_gateway()->get_order_meta($order->id, 'card_expiry_date')); $order->payment->exp_month = $exp_month; $order->payment->exp_year = $exp_year; } } elseif ($this->get_gateway()->is_echeck_gateway()) { // set the account type if available (checking/savings) $order->payment->account_type = $token && $token->get_account_type ? $token->get_account_type() : $this->get_gateway()->get_order_meta($order->id, 'account_type'); } } } return $order; }
/** * Completes the pre-order by updating the pre-order status to 'completed' and following this process for handling payment : * * - for a pre-order charged upon released AND containing a payment token, an action is fired for the supported gateway * to hook into an charge the total payment amount. Note that the supported gateway will then call WC_Order::payment_complete() * upon successful charge * * - for a pre-order charged upon released with no payment token, the order status is changed to 'pending' and an email * is sent containing a link for the customer to come back to and pay for their order * * - for a pre-order charged upfront, the order status is changed to 'completed' or 'processing' based on the same rules * from WC_Order::payment_complete() -- this is because payment_complete() has already occurred for these order * * @since 1.0 * @param int|WC_Order $order post IDs or order object to complete the pre-order for * @param string $message optional message to include in 'pre-order completed' email to customer */ public static function complete_pre_order($order, $message = '') { if (!is_object($order)) { $order = new WC_Order($order); } if (!self::can_pre_order_be_changed_to('completed', $order)) { return; } // complete pre-order charged upon release if (WC_Pre_Orders_Order::order_will_be_charged_upon_release($order)) { // update order status to pending so it can be paid by automatic payment, or on pay page by customer if 'pay later' gateway was used $order->update_status('pending'); if (WC_Pre_Orders_Order::order_has_payment_token($order)) { global $woocommerce; // load payment gateways $woocommerce->payment_gateways(); // fire action for payment gateway to charge pre-order do_action('wc_pre_orders_process_pre_order_completion_payment_' . $order->payment_method, $order); } // complete pre-order charged upfront } else { $product = WC_Pre_Orders_Order::get_pre_order_product($order); // update order status to completed or processing - based on same process from WC_Order::payment_complete() if ($product->is_downloadable() && $product->is_virtual() || !apply_filters('woocommerce_order_item_needs_processing', true, $product, $order->id)) { $order->update_status('completed'); } else { $order->update_status('processing'); } } // update pre-order status to completed WC_Pre_Orders_Order::update_pre_order_status($order, 'completed', $message); do_action('wc_pre_orders_pre_order_completed', $order, $message); }