File "class-kco-request-create.php"

Full Path: /home/siazco/grocery.siazco.se/wp-content/plugins/klarna-checkout-for-woocommerce/classes/requests/checkout/post/class-kco-request-create.php
File size: 12.44 KB
MIME-type: text/x-php
Charset: utf-8

<?php
/**
 * Create KCO Order
 *
 * @package Klarna_Checkout/Classes/Request/Checkout/Post
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * Create KCO Order
 */
class KCO_Request_Create extends KCO_Request {
	/**
	 * Makes the request.
	 *
	 * @param int    $order_id The WooCommerce order id.
	 * @param string $checkout_flow Embedded in checkout page or redirect via Klarna HPP.
	 * @return array
	 */
	public function request( $order_id = null, $checkout_flow = 'embedded' ) {
		$request_url       = $this->get_api_url_base() . 'checkout/v3/orders';
		$request_args      = apply_filters( 'kco_wc_create_order', $this->get_request_args( $order_id, $checkout_flow ) );
		$response          = wp_remote_request( $request_url, $request_args );
		$code              = wp_remote_retrieve_response_code( $response );
		$formated_response = $this->process_response( $response, $request_args, $request_url );

		$klarna_order_id = is_wp_error( $formated_response ) ? null : $formated_response['order_id'];

		// Log the request.
		$log = KCO_Logger::format_log( $klarna_order_id, 'POST', 'KCO create order', $request_args, json_decode( wp_remote_retrieve_body( $response ), true ), $code, $request_url );
		KCO_Logger::log( $log );
		return $formated_response;
	}

	/**
	 * Gets the request body.
	 *
	 * @param int    $order_id The WooCommerce order id.
	 * @param string $checkout_flow Embedded in checkout page or redirect via Klarna HPP.
	 * @return array
	 */
	public function get_body( $order_id, $checkout_flow ) {
		$request_options = new KCO_Request_Options();

		$request_body = array(
			'purchase_country'   => $this->get_purchase_country(),
			'locale'             => apply_filters( 'kco_locale', substr( str_replace( '_', '-', get_locale() ), 0, 5 ) ),
			'merchant_urls'      => KCO_WC()->merchant_urls->get_urls( $order_id ),
			'billing_countries'  => KCO_Request_Countries::get_billing_countries(),
			'shipping_countries' => KCO_Request_Countries::get_shipping_countries(),
			'merchant_data'      => KCO_Request_Merchant_Data::get_merchant_data(),
			'options'            => $request_options->get_options( $checkout_flow ),
			'customer'           => array(
				'type' => ( in_array( $this->settings['allowed_customer_types'], array( 'B2B', 'B2BC' ), true ) ) ? 'organization' : 'person',
			),
		);

		if ( empty( $order_id ) ) {
			// If no order id, get order data from the cart.
			$cart_data = new KCO_Request_Cart();
			$cart_data->process_data();

			$request_body['purchase_currency'] = get_woocommerce_currency();
			$request_body['order_amount']      = $cart_data->get_order_amount();
			$request_body['order_lines']       = $cart_data->get_order_lines();
			$request_body['order_tax_amount']  = $cart_data->get_order_tax_amount( $cart_data->get_order_lines() );

			if ( kco_wc_prefill_allowed() ) {
				$billing_address  = self::get_billing_address_from_customer();
				$shipping_address = self::get_shipping_address_from_customer();

				if ( ! empty( $billing_address ) ) {
					$request_body['billing_address'] = $billing_address;
				}

				if ( 'yes' === $this->settings['allow_separate_shipping'] ) {
					if ( ! empty( $shipping_address ) ) {
						$request_body['shipping_address '] = $shipping_address;
					}
				} else {
					if ( ! empty( $billing_address ) ) {
						$request_body['shipping_address'] = $billing_address;
					}
				}
			}
		} else {
			// Else get it from the order.
			$order_data = new KCO_Request_Order();
			$order      = wc_get_order( $order_id );

			$request_body['purchase_currency'] = $order->get_currency();
			$request_body['order_amount']      = $order_data->get_order_amount( $order_id );
			$request_body['order_lines']       = $order_data->get_order_lines( $order_id );
			$request_body['order_tax_amount']  = $order_data->get_total_tax( $order_id );

			$billing_address  = self::get_billing_address_from_order( $order );
			$shipping_address = self::get_shipping_address_from_order( $order );

			if ( ! empty( $billing_address ) ) {
				$request_body['billing_address'] = $billing_address;
			}

			if ( ! empty( $shipping_address ) ) {
				$request_body['shipping_address '] = $shipping_address;
			}
		}

		if ( ( array_key_exists( 'shipping_methods_in_iframe', $this->settings ) && 'yes' === $this->settings['shipping_methods_in_iframe'] ) && WC()->cart->needs_shipping() && 'embedded' === $checkout_flow ) {
			$request_body['shipping_options'] = KCO_Request_Shipping_Options::get_shipping_options( $this->separate_sales_tax );
		}

		return $request_body;
	}

	/**
	 * Gets customer billing address from checkout.
	 *
	 * @return array
	 */
	public static function get_billing_address_from_customer() {

		$address = array();

		if ( WC()->checkout()->get_value( 'billing_first_name' ) ) {
			$address['given_name'] = WC()->checkout()->get_value( 'billing_first_name' );
		}

		if ( WC()->checkout()->get_value( 'billing_last_name' ) ) {
			$address['family_name'] = WC()->checkout()->get_value( 'billing_last_name' );
		}

		if ( WC()->checkout()->get_value( 'billing_company' ) ) {
			$address['organization_name'] = WC()->checkout()->get_value( 'billing_company' );
		}

		if ( WC()->checkout()->get_value( 'billing_address_1' ) ) {
			$address['street_address'] = WC()->checkout()->get_value( 'billing_address_1' );
		}

		if ( WC()->checkout()->get_value( 'billing_address_2' ) ) {
			$address['street_address2'] = WC()->checkout()->get_value( 'billing_address_2' );
		}

		if ( WC()->checkout()->get_value( 'billing_city' ) ) {
			$address['city'] = WC()->checkout()->get_value( 'billing_city' );
		}

		if ( WC()->checkout()->get_value( 'billing_state' ) ) {
			$address['region'] = WC()->checkout()->get_value( 'billing_state' );
		}

		if ( WC()->checkout()->get_value( 'billing_country' ) ) {
			$address['country'] = WC()->checkout()->get_value( 'billing_country' );
		}

		if ( WC()->checkout()->get_value( 'billing_email' ) ) {
			$address['email'] = WC()->checkout()->get_value( 'billing_email' );
		}

		if ( WC()->checkout()->get_value( 'billing_phone' ) ) {
			$address['phone'] = WC()->checkout()->get_value( 'billing_phone' );
		}

		if ( ! empty( WC()->checkout()->get_value( 'billing_postcode' ) ) ) {
			$postal_code            = str_replace( ' ', '', WC()->checkout()->get_value( 'billing_postcode' ) );
			$address['postal_code'] = $postal_code;
		}

		return $address;
	}

	/**
	 * Gets customer shipping address from checkout.
	 *
	 * @return array
	 */
	public static function get_shipping_address_from_customer() {

		$address = array();

		if ( WC()->checkout()->get_value( 'shipping_first_name' ) ) {
			$address['given_name'] = WC()->checkout()->get_value( 'shipping_first_name' );
		}

		if ( WC()->checkout()->get_value( 'shipping_last_name' ) ) {
			$address['family_name'] = WC()->checkout()->get_value( 'shipping_last_name' );
		}

		if ( WC()->checkout()->get_value( 'shipping_company' ) ) {
			$address['organization_name'] = WC()->checkout()->get_value( 'shipping_company' );
		}

		if ( WC()->checkout()->get_value( 'shipping_address_1' ) ) {
			$address['street_address'] = WC()->checkout()->get_value( 'shipping_address_1' );
		}

		if ( WC()->checkout()->get_value( 'shipping_address_2' ) ) {
			$address['street_address2'] = WC()->checkout()->get_value( 'shipping_address_2' );
		}

		if ( WC()->checkout()->get_value( 'shipping_city' ) ) {
			$address['city'] = WC()->checkout()->get_value( 'shipping_city' );
		}

		if ( WC()->checkout()->get_value( 'shipping_state' ) ) {
			$address['region'] = WC()->checkout()->get_value( 'shipping_state' );
		}

		if ( WC()->checkout()->get_value( 'shipping_country' ) ) {
			$address['country'] = WC()->checkout()->get_value( 'shipping_country' );
		}

		if ( ! empty( WC()->checkout()->get_value( 'shipping_email' ) ) ) {
			$shipping_email = WC()->checkout()->get_value( 'shipping_email' );
		} else {
			$shipping_email = WC()->checkout()->get_value( 'billing_email' );
		}
		if ( $shipping_email ) {
			$address['email'] = $shipping_email;
		}

		if ( ! empty( WC()->checkout()->get_value( 'shipping_phone' ) ) ) {
			$shipping_phone = WC()->checkout()->get_value( 'shipping_phone' );
		} else {
			$shipping_phone = WC()->checkout()->get_value( 'billing_phone' );
		}
		if ( $shipping_phone ) {
			$address['phone'] = $shipping_phone;
		}

		if ( ! empty( WC()->checkout()->get_value( 'shipping_postcode' ) ) ) {
			$postal_code            = str_replace( ' ', '', WC()->checkout()->get_value( 'shipping_postcode' ) );
			$address['postal_code'] = $postal_code;
		}

		return $address;
	}

	/**
	 * Gets customer billing address from order.
	 *
	 * @param object $order The WooCommerce order.
	 * @return array
	 */
	public static function get_billing_address_from_order( $order ) {
		$address = array();

		if ( $order->get_billing_first_name() ) {
			$address['given_name'] = $order->get_billing_first_name();
		}

		if ( $order->get_billing_last_name() ) {
			$address['family_name'] = $order->get_billing_last_name();
		}

		if ( $order->get_billing_company() ) {
			$address['organization_name'] = $order->get_billing_company();
		}

		if ( $order->get_billing_address_1() ) {
			$address['street_address'] = $order->get_billing_address_1();
		}

		if ( $order->get_billing_address_2() ) {
			$address['street_address2'] = $order->get_billing_address_2();
		}

		if ( $order->get_billing_city() ) {
			$address['city'] = $order->get_billing_city();
		}

		if ( $order->get_billing_state() ) {
			$address['region'] = $order->get_billing_state();
		}

		if ( $order->get_billing_country() ) {
			$address['country'] = $order->get_billing_country();
		}

		if ( $order->get_billing_email() ) {
			$address['email'] = $order->get_billing_email();
		}

		if ( $order->get_billing_phone() ) {
			$address['phone'] = $order->get_billing_phone();
		}

		if ( ! empty( $order->get_billing_postcode() ) ) {
			$postal_code            = str_replace( ' ', '', $order->get_billing_postcode() );
			$address['postal_code'] = $postal_code;
		}

		return $address;
	}

	/**
	 * Gets customer shipping address from order.
	 *
	 * @param object $order The WooCommerce order.
	 * @return array
	 */
	public static function get_shipping_address_from_order( $order ) {
		$address = array();

		if ( $order->get_shipping_first_name() ) {
			$address['given_name'] = $order->get_shipping_first_name();
		}

		if ( $order->get_shipping_last_name() ) {
			$address['family_name'] = $order->get_shipping_last_name();
		}

		if ( $order->get_shipping_company() ) {
			$address['organization_name'] = $order->get_shipping_company();
		}

		if ( $order->get_shipping_address_1() ) {
			$address['street_address'] = $order->get_shipping_address_1();
		}

		if ( $order->get_shipping_address_2() ) {
			$address['street_address2'] = $order->get_shipping_address_2();
		}

		if ( $order->get_shipping_city() ) {
			$address['city'] = $order->get_shipping_city();
		}

		if ( $order->get_shipping_state() ) {
			$address['region'] = $order->get_shipping_state();
		}

		if ( $order->get_shipping_country() ) {
			$address['country'] = $order->get_shipping_country();
		}

		$shipping_email = ! empty( $order->get_meta( '_shipping_email', true ) ) ? $order->get_meta( '_shipping_email', true ) : $order->get_billing_email();
		if ( $shipping_email ) {
			$address['email'] = $shipping_email;
		}

		// NOTE: Since we declare support for WC v4+, and WC_Order::get_shipping_phone was only added in 5.6.0, we need to use get_meta instead.
		if ( defined( 'WC_VERSION' ) && version_compare( WC_VERSION, '5.6.0', '>=' ) ) {
			$shipping_phone = $order->get_shipping_phone();
		} else {
			$shipping_phone = $order->get_meta( '_shipping_phone', true );
		}

		$shipping_phone = ! empty( $shipping_phone ) ? $shipping_phone : $order->get_billing_phone();
		if ( $shipping_phone ) {
			$address['phone'] = $shipping_phone;
		}

		if ( ! empty( $order->get_shipping_postcode() ) ) {
			$postal_code            = str_replace( ' ', '', $order->get_shipping_postcode() );
			$address['postal_code'] = $postal_code;
		}

		return $address;
	}

	/**
	 * Gets the request args for the API call.
	 *
	 * @param int    $order_id The WooCommerce order id.
	 * @param string $checkout_flow Embedded in checkout page or redirect via Klarna HPP.
	 * @return array
	 */
	protected function get_request_args( $order_id, $checkout_flow ) {
		return array(
			'headers'    => $this->get_request_headers(),
			'user-agent' => $this->get_user_agent(),
			'method'     => 'POST',
			'body'       => wp_json_encode( apply_filters( 'kco_wc_api_request_args', $this->get_body( $order_id, $checkout_flow ), $order_id ) ),
			'timeout'    => apply_filters( 'kco_wc_request_timeout', 10 ),
		);
	}
}