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

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

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

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

/**
 * Update KCO Order
 */
class KCO_Request_Update extends KCO_Request {
	/**
	 * Makes the request.
	 *
	 * @param string $klarna_order_id The Klarna order id.
	 * @param int    $order_id The WooCommerce order id.
	 * @param bool   $force If true always update the order, even if not needed.
	 * @return array
	 */
	public function request( $klarna_order_id, $order_id = null, $force = false ) {
		$request_url  = $this->get_api_url_base() . 'checkout/v3/orders/' . $klarna_order_id;
		$request_args = apply_filters( 'kco_wc_update_order', $this->get_request_args( $order_id ) );

		// Check if we need to update.
		if ( WC()->session->get( 'kco_update_md5' ) && WC()->session->get( 'kco_update_md5' ) === md5( wp_json_encode( $request_args ) ) && ! $force ) {
			return false;
		}
		WC()->session->set( 'kco_update_md5', md5( wp_json_encode( $request_args ) ) );

		$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 );

		// Log the request.
		$log = KCO_Logger::format_log( $klarna_order_id, 'POST', 'KCO update 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 string $order_id The WooCommerce order id.
	 * @return array
	 */
	public function get_body( $order_id ) {
		$cart_data = new KCO_Request_Cart();
		$cart_data->process_data();

		$request_options = new KCO_Request_Options();

		$request_body = array(
			'purchase_country'   => $this->get_purchase_country(),
			'purchase_currency'  => get_woocommerce_currency(),
			'locale'             => apply_filters( 'kco_locale', substr( str_replace( '_', '-', get_locale() ), 0, 5 ) ),
			'merchant_urls'      => KCO_WC()->merchant_urls->get_urls( $order_id ),
			'order_amount'       => $cart_data->get_order_amount(),
			'order_lines'        => $cart_data->get_order_lines(),
			'order_tax_amount'   => $cart_data->get_order_tax_amount( $cart_data->get_order_lines() ),
			'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(),
		);

		// If we have an order id, set the merchant references.
		if ( ! empty( $order_id ) ) {
			$order = wc_get_order( $order_id );
			// Set the merchant references to the order.
			$request_body['merchant_reference1'] = $order->get_order_number();
			$request_body['merchant_reference2'] = $order_id;
		}

		if ( kco_wc_prefill_allowed() ) {
			$request_body['billing_address'] = array(
				'email'             => WC()->checkout()->get_value( 'billing_email' ),
				'postal_code'       => WC()->checkout()->get_value( 'billing_postcode' ),
				'country'           => WC()->checkout()->get_value( 'billing_country' ),
				'phone'             => WC()->checkout()->get_value( 'billing_phone' ),
				'given_name'        => WC()->checkout()->get_value( 'billing_first_name' ),
				'family_name'       => WC()->checkout()->get_value( 'billing_last_name' ),
				'organization_name' => WC()->checkout()->get_value( 'billing_company' ),
				'street_address'    => WC()->checkout()->get_value( 'billing_address_1' ),
				'street_address2'   => WC()->checkout()->get_value( 'billing_address_2' ),
				'city'              => WC()->checkout()->get_value( 'billing_city' ),
				'region'            => WC()->checkout()->get_value( 'billing_state' ),
			);

			$request_body['shipping_address'] = array(
				'postal_code'       => WC()->checkout()->get_value( 'shipping_postcode' ),
				'country'           => WC()->checkout()->get_value( 'shipping_country' ),
				'given_name'        => WC()->checkout()->get_value( 'shipping_first_name' ),
				'family_name'       => WC()->checkout()->get_value( 'shipping_last_name' ),
				'organization_name' => WC()->checkout()->get_value( 'shipping_company' ),
				'street_address'    => WC()->checkout()->get_value( 'shipping_address_1' ),
				'street_address2'   => WC()->checkout()->get_value( 'shipping_address_2' ),
				'city'              => WC()->checkout()->get_value( 'shipping_city' ),
				'region'            => WC()->checkout()->get_value( 'shipping_state' ),
			);

			$request_body['shipping_address'] = wp_parse_args( $request_body['billing_address'], $request_body['shipping_address'] ?? array() );
		}

		if ( ( array_key_exists( 'shipping_methods_in_iframe', $this->settings ) && 'yes' === $this->settings['shipping_methods_in_iframe'] ) && WC()->cart->needs_shipping() ) {
			$request_body['shipping_options'] = KCO_Request_Shipping_Options::get_shipping_options( $this->separate_sales_tax );
		} elseif ( ! WC()->cart->needs_shipping() ) {
			// If the order had a shipping option before but is removed now, same needs to be sent to klarna else it will retain the old shipping option.
			$request_body['shipping_options'] = array();
		}

		return $request_body;
	}

	/**
	 * Gets the request args for the API call.
	 *
	 * @param string $order_id The WooCommerce order id.
	 * @return array
	 */
	protected function get_request_args( $order_id ) {
		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 ), $order_id ) ),
			'timeout'    => apply_filters( 'kco_wc_request_timeout', 10 ),
		);
	}
}