Files
torebki-fabiola.pl/wp-content/plugins/woocommerce-dpd/classes/class-woocommerce-dpd-shipment.php
2026-03-05 13:07:40 +01:00

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