[Back] <?php
/*
* Copyright (c) 2024 LatePoint LLC. All rights reserved.
*/
class OsOrderIntentHelper {
public static function generate_continue_intent_url( $order_intent_key ) {
return OsRouterHelper::build_admin_post_link( [
'orders',
'continue_order_intent'
], [ 'order_intent_key' => $order_intent_key ] );
}
public static function get_order_id_from_intent_key( $intent_key ) {
if ( empty( $intent_key ) ) {
return false;
}
$order_intent = new OsOrderIntentModel();
$order_intent = $order_intent->where( [ 'intent_key' => $intent_key ] )->set_limit( 1 )->get_results_as_models();
if ( $order_intent && $order_intent->order_id ) {
return $order_intent->order_id;
} else {
return null;
}
}
public static function set_order_intent_data_from_cart( OsOrderIntentModel $order_intent, OsCartModel $cart ): OsOrderIntentModel {
$cart_items = $cart->get_items();
$cart_items_data = [];
foreach ( $cart_items as $cart_item ) {
$cart_item_data = json_decode( $cart_item->item_data, true );
// cart item could have been added while user was not logged in, make sure to update customer id when creating order intent
$cart_item_data['customer_id'] = $order_intent->customer_id;
$cart_items_data[] = [
'variant' => $cart_item->variant,
'item_data' => $cart_item_data,
'subtotal' => $cart_item->get_subtotal(),
'total' => $cart_item->get_total(),
'coupon_discount' => $cart_item->get_coupon_discount(),
'coupon_code' => $cart_item->get_coupon_code(),
'tax_total' => $cart_item->get_tax_total(),
];
}
$order_intent->cart_items_data = wp_json_encode( $cart_items_data );
$order_intent->charge_amount = $cart->amount_to_charge();
$order_intent->specs_charge_amount = $cart->specs_calculate_amount_to_charge();
$order_intent->total = $cart->get_total();
$order_intent->subtotal = $cart->get_subtotal();
$order_intent->tax_total = $cart->get_tax_total();
$order_intent->coupon_code = $cart->get_coupon_code();
if ( ! empty( $cart->get_coupon_code() ) ) {
$order_intent->coupon_discount = $cart->get_coupon_discount();
}
// hide "payments & credits" row if we are not accepting payments
$rows_to_hide = ( ! OsPaymentsHelper::is_accepting_payments() ) ? [ 'payments' ] : [];
$order_intent->price_breakdown = wp_json_encode( $cart->generate_price_breakdown_rows( $rows_to_hide ) );
$order_intent->payment_data = wp_json_encode( [
'processor' => $cart->payment_processor,
'time' => $cart->payment_time,
'method' => $cart->payment_method,
'portion' => $cart->payment_portion,
'token' => $cart->payment_token
] );
/**
* Sets order intent from a cart
*
* @param {OsOrderIntentModel} $order_intent Order intent
* @param {OsCartModel} $cart Cart that order intent is using
* @returns {OsOrderIntentModel} The filtered order intent object
*
* @since 5.0.0
* @hook set_order_intent_data_from_cart
*
*/
return apply_filters( 'set_order_intent_data_from_cart', $order_intent, $cart );
}
/**
* @param OsCartItemModel $cart
* @param array $restrictions_data
* @param array $presets_data
* @param string $booking_form_page_url
*
* @return OsOrderIntentModel
*/
public static function create_or_update_order_intent( OsCartModel $cart, array $restrictions_data = [], array $presets_data = [], string $booking_form_page_url = '', $customer_id = false ): OsOrderIntentModel {
if ( empty( $booking_form_page_url ) ) {
$booking_form_page_url = OsUtilHelper::get_referrer();
}
$order_intent = new OsOrderIntentModel();
if ( ! empty( $cart->order_intent_id ) ) {
$order_intent->load_by_id( $cart->order_intent_id );
}
$is_new = $order_intent->is_new_record();
if ( ! $is_new ) {
if($order_intent->is_converted()){
return $order_intent;
}
$old_order_intent = clone $order_intent;
}
$order_intent->restrictions_data = wp_json_encode( $restrictions_data );
$order_intent->presets_data = wp_json_encode( $presets_data );
// override only if not empty
if(!empty($booking_form_page_url)) $order_intent->booking_form_page_url = urldecode( $booking_form_page_url );
if(empty($customer_id)){
$order_intent->customer_id = OsAuthHelper::get_logged_in_customer_id();
}else{
$order_intent->customer_id = $customer_id;
}
$order_intent = self::set_order_intent_data_from_cart( $order_intent, $cart );
/**
* Filters order intent right before it's about to be saved when created or updated from cart
*
* @param {OsOrderIntentModel} $order_intent Order intent to be filtered
* @returns {OsOrderIntentModel} The filtered order intent
*
* @since 5.0.0
* @hook latepoint_before_order_intent_save_from_cart
*
*/
$order_intent = apply_filters( 'latepoint_before_order_intent_save_from_cart', $order_intent );
if ( $order_intent->save() ) {
if ( $is_new ) {
$cart->update_attributes( [ 'order_intent_id' => $order_intent->id ] );
/**
* Order intent is created
*
* @param {OsOrderIntentModel} $order_intent Instance of order intent model that was created
*
* @since 5.0.0
* @hook latepoint_order_intent_created
*
*/
do_action( 'latepoint_order_intent_created', $order_intent );
} else {
/**
* Order intent is updated
*
* @param {OsOrderIntentModel} $order_intent Updated instance of order intent model
* @param {OsOrderIntentModel} $old_order_intent Instance of order intent model before it was updated
*
* @since 5.0.0
* @hook latepoint_order_intent_updated
*
*/
do_action( 'latepoint_order_intent_updated', $order_intent, $old_order_intent );
}
} else {
$action_type = $is_new ? 'creating' : 'updating';
OsDebugHelper::log( 'Error ' . $action_type . ' order intent', 'error_saving_order_intent', $order_intent->get_error_messages() );
}
return $order_intent;
}
public static function get_order_intent_by_intent_key( string $intent_key ) : OsOrderIntentModel {
$order_intent = new OsOrderIntentModel();
if(empty($intent_key)) return $order_intent;
$order_intent = $order_intent->where( [ 'intent_key' => $intent_key ] )->set_limit( 1 )->get_results_as_models();
if(!empty($order_intent)){
return $order_intent;
}else{
return new OsOrderIntentModel();
}
}
public static function is_converted( $order_intent_id ) {
$order_intent = new OsOrderIntentModel( $order_intent_id );
if ( ! empty( $order_intent->order_id ) ) {
return $order_intent->order_id;
} else {
return false;
}
}
}