?>

<?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);
 }