265 lines
8.8 KiB
PHP
265 lines
8.8 KiB
PHP
<?php
|
|
/**
|
|
* DPD Shipment.
|
|
*
|
|
* @package Woocommerce Dpd
|
|
*/
|
|
|
|
use DPDVendor\WpDesk\WooCommerce\ShippingMethod\SenderAddress;
|
|
use WPDesk\DPD\SanitizeTrait;
|
|
|
|
/**
|
|
* Can prepare DPD shipment data from Flexible Shipping shipment.
|
|
*/
|
|
class WPDesk_WooCommerce_DPD_Shipment {
|
|
use SanitizeTrait;
|
|
|
|
const ADDRESS = 'address';
|
|
const CITY = 'city';
|
|
const COMPANY = 'company';
|
|
const COUNTRY_CODE = 'countryCode';
|
|
const EMAIL = 'email';
|
|
const FID = 'fid';
|
|
const NAME = 'name';
|
|
const PHONE = 'phone';
|
|
const POSTAL_CODE = 'postalCode';
|
|
|
|
/**
|
|
* @var WPDesk_Flexible_Shipping_Shipment_dpd
|
|
*/
|
|
private $flexible_shipping_shipment;
|
|
|
|
/**
|
|
* @param WPDesk_Flexible_Shipping_Shipment_dpd $flexible_shipping_shipment .
|
|
*/
|
|
public function __construct( WPDesk_Flexible_Shipping_Shipment_dpd $flexible_shipping_shipment ) {
|
|
$this->flexible_shipping_shipment = $flexible_shipping_shipment;
|
|
}
|
|
|
|
/**
|
|
* @param string $postal_code .
|
|
*
|
|
* @return string
|
|
*/
|
|
private function format_postal_code( $postal_code ) {
|
|
return str_replace( [ '-', ' ' ], '', $postal_code );
|
|
}
|
|
|
|
/**
|
|
* Get sender.
|
|
*
|
|
* @param array $settings .
|
|
* @param SenderAddress[] $additional_addresses Additional sender addresses.
|
|
*
|
|
* @return array
|
|
*/
|
|
private function get_sender( array $settings, array $additional_addresses ) {
|
|
$dpd_sender_address_id = $this->flexible_shipping_shipment->get_meta( '_dpd_sender_address_id', '' );
|
|
if ( '' === $dpd_sender_address_id ) {
|
|
$sender = [];
|
|
$sender[ self::ADDRESS ] = $settings['sender_address'];
|
|
$sender[ self::CITY ] = $settings['sender_city'];
|
|
$sender[ self::COMPANY ] = $settings['sender_company'];
|
|
$sender[ self::COUNTRY_CODE ] = 'PL';
|
|
$sender[ self::EMAIL ] = $settings['sender_email'];
|
|
$sender[ self::FID ] = $settings[ self::FID ];
|
|
if ( 'yes' === $settings['test_mode'] ) {
|
|
$sender[ self::FID ] = $settings['fid_testmode'];
|
|
}
|
|
$sender[ self::NAME ] = $settings['sender_name'];
|
|
$sender[ self::PHONE ] = $settings['sender_phone'];
|
|
$sender[ self::POSTAL_CODE ] = $this->format_postal_code( $settings['sender_postal_code'] );
|
|
} else {
|
|
$sender = $this->prepare_sender_from_additional_addresses( $additional_addresses, $dpd_sender_address_id );
|
|
}
|
|
|
|
return $sender;
|
|
}
|
|
|
|
/**
|
|
* @param SenderAddress[] $additional_addresses Additional sender addresses.
|
|
* @param string $dpd_sender_address_id .
|
|
*
|
|
* @return array
|
|
*/
|
|
private function prepare_sender_from_additional_addresses( $additional_addresses, $dpd_sender_address_id ) {
|
|
$sender = [];
|
|
foreach ( $additional_addresses as $additional_address ) {
|
|
if ( $additional_address->get_address_id() === $dpd_sender_address_id ) {
|
|
$sender = $this->prepare_sender_from_additional_address( $additional_address );
|
|
break;
|
|
}
|
|
}
|
|
|
|
return $sender;
|
|
}
|
|
|
|
/**
|
|
* @param SenderAddress $additional_address .
|
|
*
|
|
* @return array
|
|
*/
|
|
private function prepare_sender_from_additional_address( $additional_address ) {
|
|
$sender = [];
|
|
$sender[ self::ADDRESS ] = $additional_address->get_address();
|
|
$sender[ self::CITY ] = $additional_address->get_city();
|
|
$sender[ self::COMPANY ] = $additional_address->get_company();
|
|
$sender[ self::COUNTRY_CODE ] = 'PL';
|
|
$sender[ self::EMAIL ] = $additional_address->get_email();
|
|
$sender[ self::NAME ] = $additional_address->get_name();
|
|
$sender[ self::PHONE ] = $additional_address->get_phone();
|
|
$sender[ self::POSTAL_CODE ] = $this->format_postal_code( $additional_address->get_postal_code() );
|
|
|
|
return $sender;
|
|
}
|
|
|
|
/**
|
|
* Get receiver.
|
|
*
|
|
* @param WC_Order $order .
|
|
*
|
|
* @return array
|
|
*/
|
|
private function get_receiver( WC_Order $order ) {
|
|
|
|
$receiver = [];
|
|
|
|
$address = $order->get_shipping_address_1();
|
|
if ( '' !== $order->get_shipping_address_2() ) {
|
|
$address .= ' ' . $order->get_shipping_address_2();
|
|
}
|
|
$receiver[ self::ADDRESS ] = $address;
|
|
$receiver[ self::CITY ] = $order->get_shipping_city();
|
|
$receiver[ self::COMPANY ] = $order->get_shipping_company();
|
|
$receiver[ self::COUNTRY_CODE ] = $order->get_shipping_country();
|
|
$receiver[ self::EMAIL ] = $order->get_billing_email();
|
|
|
|
$receiver[ self::NAME ] = '';
|
|
$receiver[ self::NAME ] .= $order->get_shipping_first_name();
|
|
$receiver[ self::NAME ] .= ' ';
|
|
$receiver[ self::NAME ] .= $order->get_shipping_last_name();
|
|
$receiver[ self::PHONE ] = ! empty( $order->get_shipping_phone() ) ? $order->get_shipping_phone() : $order->get_billing_phone();
|
|
$receiver[ self::POSTAL_CODE ] = $this->format_postal_code( $order->get_shipping_postcode() );
|
|
|
|
return $receiver;
|
|
}
|
|
|
|
/**
|
|
* Get parcels.
|
|
*
|
|
* @return array
|
|
*/
|
|
private function get_parcels() {
|
|
|
|
$parcels = [];
|
|
|
|
$parcel = [];
|
|
|
|
$parcel['content'] = $this->flexible_shipping_shipment->get_meta( '_dpd_package_content' );
|
|
$parcel['customerData1'] = $this->flexible_shipping_shipment->get_meta( '_dpd_ref' );
|
|
$parcel['sizeX'] = $this->flexible_shipping_shipment->get_meta( '_dpd_package_width' );
|
|
$parcel['sizeY'] = $this->flexible_shipping_shipment->get_meta( '_dpd_package_height' );
|
|
$parcel['sizeZ'] = $this->flexible_shipping_shipment->get_meta( '_dpd_package_depth' );
|
|
$parcel['weight'] = $this->flexible_shipping_shipment->get_meta( '_dpd_package_weight' );
|
|
|
|
$parcels[] = $parcel;
|
|
|
|
$additional_packages = $this->flexible_shipping_shipment->get_meta( '_additional_packages', [] );
|
|
foreach ( $additional_packages as $additional_key => $additional_package ) {
|
|
$parcel = [];
|
|
$parcel['content'] = $this->flexible_shipping_shipment->get_meta( '_dpd_package_content' );
|
|
$parcel['customerData1'] = $this->flexible_shipping_shipment->get_meta( '_dpd_ref' );
|
|
$parcel['sizeX'] = $additional_package['dpd_package_width'];
|
|
$parcel['sizeY'] = $additional_package['dpd_package_height'];
|
|
$parcel['sizeZ'] = $additional_package['dpd_package_depth'];
|
|
$parcel['weight'] = $additional_package['dpd_package_weight'];
|
|
$parcels[] = $parcel;
|
|
}
|
|
|
|
return $parcels;
|
|
}
|
|
|
|
/**
|
|
* @param array $shipment .
|
|
* @param array $settings .
|
|
*
|
|
* @return array
|
|
*/
|
|
private function prepare_payer_type( array $shipment, array $settings ) {
|
|
$dpd_sender_address_id = $this->flexible_shipping_shipment->get_meta( '_dpd_sender_address_id', '' );
|
|
if ( '' === $dpd_sender_address_id ) {
|
|
$shipment['payerType'] = 'SENDER';
|
|
} else {
|
|
$shipment['payerType'] = 'THIRD_PARTY';
|
|
$shipment['thirdPartyFID'] = $settings[ self::FID ];
|
|
}
|
|
|
|
return $shipment;
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function prepare_shipment() {
|
|
|
|
$shipping_method = $this->flexible_shipping_shipment->get_shipping_method();
|
|
|
|
$settings = $shipping_method->settings;
|
|
|
|
$order = $this->flexible_shipping_shipment->get_order();
|
|
|
|
$shipment = [];
|
|
|
|
$shipment['sender'] = $this->get_sender( $settings, $shipping_method->get_additional_sender_addresses() );
|
|
|
|
$shipment['receiver'] = $this->get_receiver( $order );
|
|
|
|
$shipment['parcels'] = $this->get_parcels();
|
|
|
|
$shipment = $this->prepare_payer_type( $shipment, $settings );
|
|
|
|
if ( 'PL' !== $order->get_shipping_country() ) {
|
|
$shipment['ref1'] = $this->flexible_shipping_shipment->get_meta( '_dpd_ref' );
|
|
$shipment['ref2'] = $this->flexible_shipping_shipment->get_meta( '_dpd_package_content' );
|
|
}
|
|
|
|
$shipment['services'] = [];
|
|
|
|
if ( intval( $this->flexible_shipping_shipment->get_meta( WPDesk_Flexible_Shipping_Shipment_dpd::META_DPD_COD, '0' ) ) === 1 ) {
|
|
$shipment['services']['cod'] = [
|
|
'amount' => $this->flexible_shipping_shipment->get_meta( '_dpd_cod_value' ),
|
|
'currency' => $order->get_currency(),
|
|
];
|
|
}
|
|
|
|
if ( intval( $this->flexible_shipping_shipment->get_meta( '_dpd_declared_value', '0' ) ) === 1 ) {
|
|
$shipment['services']['declaredValue'] = [
|
|
'amount' => $this->flexible_shipping_shipment->get_meta( '_dpd_declared_value_value' ),
|
|
'currency' => $order->get_currency(),
|
|
];
|
|
}
|
|
|
|
$pickup = $this->get_bool_value( $this->flexible_shipping_shipment->get_meta( WPDesk_Flexible_Shipping_Shipment_dpd::META_DPD_PICKUP ) );
|
|
$point_id = $this->flexible_shipping_shipment->get_meta( WPDesk_Flexible_Shipping_Shipment_dpd::META_DPD_PICKUP_POINT_ID );
|
|
if ( $pickup && $point_id ) {
|
|
$shipment['services']['dpdPickup'] = [
|
|
'pudo' => $point_id,
|
|
];
|
|
}
|
|
|
|
if ( (int) $this->flexible_shipping_shipment->get_meta( WPDesk_Flexible_Shipping_Shipment_dpd::META_DPD_SATURDAY, '0' ) === 1 ) {
|
|
$shipment['services']['guarantee'] = [
|
|
'type' => 'SATURDAY',
|
|
];
|
|
}
|
|
|
|
if ( (int) $this->flexible_shipping_shipment->get_meta( WPDesk_Flexible_Shipping_Shipment_dpd::META_DPD_NEXT_DAY, '0' ) === 1 ) {
|
|
$shipment['services']['guarantee'] = [
|
|
'type' => 'DPDNEXTDAY',
|
|
];
|
|
}
|
|
|
|
return $shipment;
|
|
}
|
|
}
|