oont-contents/plugins/flexible-shipping/vendor/wpdesk/wp-wpdesk-fs-shipment-interfaces/classes/shipment/class-shipment.php
2025-02-08 15:10:23 +01:00

521 lines
11 KiB
PHP

<?php
/**
* Shipment.
*
* @package Flexible Shipping
*/
use Psr\Log\LoggerInterface;
/**
* Can handle shipment functionality.
*/
abstract class WPDesk_Flexible_Shipping_Shipment {
const STATUS_FS_NEW = 'fs-new';
const STATUS_FS_CREATED = 'fs-created';
const STATUS_FS_CONFIRMED = 'fs-confirmed';
const STATUS_FS_FAILED = 'fs-failed';
const STATUS_FS_MANIFEST = 'fs-manifest';
const CREATED_VIA = 'created_via';
const SENT_VIA_METABOX = 'metabox';
const SENT_VIA_BULK = 'bulk';
const SENT_VIA_AUTO = 'auto';
const SENT_VIA = '_sent_via';
const NOT_SET = 'not_set';
const LABEL_ACTION_DOWNLOAD = 'download';
const LABEL_ACTION_OPEN = 'open';
/**
* Logger provided by Flexible Shipping plugin.
*
* @var LoggerInterface
*/
protected static $fs_logger;
/**
* @var int
*/
private $id;
/**
* @var WP_Post
* Post assigned to shipment
*/
private $post;
/**
* @var null|WC_Order
* WC_Order assigned to shipment
*/
private $order = null;
/**
* @var bool
* True if assigned post ich changed. Used when saving post
*/
private $save_post = false;
/**
* @var null
* Holds old status when shipment status is changed
*/
private $old_status = null;
/**
* @var bool
* True when status changing
*/
private $status_changed = false;
/**
* @var array
* Shipment metadata (from postmeta table)
*/
private $meta_data = array();
/**
* @var bool
* True when shipment metadata loaded
*/
private $meta_data_loaded = false;
/**
* @var array
* Holds changed metadata keys. Used when saving shipment
*/
private $meta_data_save_keys = array();
/**
* @var string
* Context for order metabox
*/
private $order_metabox_context = 'side';
/**
* WPDesk_Flexible_Shipping_Shipment constructor.
*
* @param int|WP_Post|WPDesk_Flexible_Shipping_Shipment $shipment Shipment or shipment ID.
* @param WC_Order|null $order Order.
*/
public function __construct( $shipment, $order = null ) {
if ( is_numeric( $shipment ) ) {
$this->id = absint( $shipment );
$this->post = get_post( $this->id );
} elseif ( $shipment instanceof WPDesk_Flexible_Shipping_Shipment ) {
$this->id = absint( $shipment->get_id() );
$this->post = $shipment->get_post();
} elseif ( isset( $shipment->ID ) ) {
$this->id = absint( $shipment->ID );
$this->post = $shipment;
}
$this->order = $order;
}
/**
* @return mixed
*/
public function get_id() {
return $this->id;
}
/**
* @return mixed
*/
public function get_post() {
return $this->post;
}
/**
* Set logger. This logger is set by Flexible Shipping plugin.
*
* @param LoggerInterface $fs_logger .
*/
public static function set_fs_logger( $fs_logger ) {
static::$fs_logger = $fs_logger;
}
/**
* @return string
*/
public function get_order_metabox_context() {
return $this->order_metabox_context;
}
/**
* @param string $order_metabox_context .
*/
public function set_order_metabox_context( $order_metabox_context ) {
$this->order_metabox_context = $order_metabox_context;
}
/**
* @param string $meta_key .
*/
public function delete_meta( $meta_key ) {
unset( $this->meta_data[ $meta_key ] );
$this->meta_data_save_keys[ $meta_key ] = $meta_key;
}
/**
* Saves shipment data to database.
*/
public function save() {
if ( $this->save_post ) {
wp_update_post( $this->post );
$this->fs_log( 'debug', 'Shipment post saved', array( 'post' => $this->post ) );
$this->save_post = false;
}
foreach ( $this->meta_data_save_keys as $key ) {
if ( isset( $this->meta_data[ $key ] ) ) {
update_post_meta( $this->id, $key, $this->meta_data[ $key ][0] );
$this->fs_log(
'debug',
'Shipment meta data saved',
array(
'key' => $key,
'value' => $this->meta_data[ $key ][0],
)
);
} else {
delete_post_meta( $this->id, $key );
$this->fs_log( 'debug', 'Shipment meta data deleted', array( 'key' => $key ) );
}
unset( $this->meta_data_save_keys[ $key ] );
}
if ( $this->status_changed ) {
do_action( 'flexible_shipping_shipment_status_updated', $this->old_status, $this->post->post_status, $this );
$this->status_changed = false;
$this->old_status = null;
}
}
/**
* Writes log message to log provided by Flexible Shipping plugin.
*
* @param mixed $level .
* @param string $message .
* @param array $context .
*/
private function fs_log( $level, $message, array $context = array() ) {
if ( static::$fs_logger ) {
$context['order_id'] = $this->get_order()->get_id();
$context['shipment_id'] = $this->get_id();
$current_user = wp_get_current_user();
$context['user_id'] = $current_user->ID;
if ( isset( $_SERVER['REQUEST_URI'] ) ) {
$context['request_uri'] = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) );
}
static::$fs_logger->log( $level, $message, $context );
}
}
/**
* @return WC_Order
*/
public function get_order() {
if ( null === $this->order ) {
$this->order = wc_get_order( $this->post->post_parent );
}
return $this->order;
}
/**
* @return string|null
* Returns integration assigned to shipment
*/
public function get_integration() {
return $this->get_meta( '_integration' );
}
/**
* @param string $meta_key .
* @param null|string $default .
*
* @return array|string|null
*/
public function get_meta( $meta_key = '', $default = null ) {
$this->load_meta_data();
if ( '' === $meta_key ) {
return $this->meta_data;
}
if ( isset( $this->meta_data[ $meta_key ] ) ) {
return maybe_unserialize( $this->meta_data[ $meta_key ][0] );
} else {
return $default;
}
return null;
}
/**
* @return array
*/
public function get_meta_data() {
$this->load_meta_data();
return $this->meta_data;
}
/**
* Loads all meta data from postmeta
*/
public function load_meta_data() {
if ( ! $this->meta_data_loaded ) {
$this->meta_data = get_post_meta( $this->id );
$this->meta_data_loaded = true;
}
}
/**
* @return string
* Returns URL for admin metabox for this shipment
*/
public function get_order_metabox_url() {
return admin_url( 'post.php?post=' . $this->get_order_id() . '&action=edit#shipment_meta_box_' . $this->get_id() );
}
/**
* @return int
*/
public function get_order_id() {
return $this->post->post_parent;
}
/**
* @return string
*/
public function get_status_for_shipping_column() {
$statuses = array(
self::STATUS_FS_NEW => 'new',
self::STATUS_FS_CREATED => 'created',
self::STATUS_FS_CONFIRMED => 'confirmed',
self::STATUS_FS_FAILED => 'error',
self::STATUS_FS_MANIFEST => 'manifest',
);
return $statuses[ $this->get_status() ];
}
/**
* @return string
*/
public function get_status() {
return $this->post->post_status;
}
/**
* @return null|string
* Returns URL for label
*/
public function get_label_url() {
if ( in_array(
$this->get_status(),
array(
self::STATUS_FS_NEW,
self::STATUS_FS_CREATED,
self::STATUS_FS_FAILED,
)
) ) {
return null;
}
$label_url_args = array(
'action' => 'flexible_shipping_get_label',
'label_action' => $this->get_label_action(),
'shipment_id' => $this->get_id(),
);
$label_url = add_query_arg( $label_url_args, admin_url( 'admin-post.php' ) );
return wp_nonce_url( $label_url, 'flexible_shipping_get_label' );
}
/**
* Should open label?
* By default label should be downloaded. Integration can override this method when label should be opened in browser.
*
* @return bool
*/
protected function get_label_action() {
return self::LABEL_ACTION_DOWNLOAD;
}
/**
* @param string $new_status .
*/
public function update_status( $new_status ) {
$this->old_status = $this->post->post_status;
$this->post->post_status = $new_status;
$this->save_post = true;
$this->status_changed = true;
}
/**
* @param WPDesk_Flexible_Shipping_Manifest $manifest .
*/
public function add_to_manifest( WPDesk_Flexible_Shipping_Manifest $manifest ) {
$this->set_meta( '_manifest', $manifest->get_id() );
}
/**
* @param string $meta_key .
* @param int|string|array|object|null $value .
*/
public function set_meta( $meta_key, $value ) {
$this->load_meta_data();
if ( ! isset( $this->meta_data[ $meta_key ] ) ) {
$this->meta_data[ $meta_key ] = array();
}
$this->meta_data[ $meta_key ][0] = $value;
$this->meta_data_save_keys[ $meta_key ] = $meta_key;
}
/**
* @return bool
*/
public function label_avaliable() {
if ( in_array( $this->get_status(), array( self::STATUS_FS_CONFIRMED, self::STATUS_FS_MANIFEST ) ) ) {
return true;
}
return false;
}
/**
* Displays shipping column in orders list view.
* Must be overwritten!
*/
public function shipping_column() {
echo esc_html( __( 'Please override shipping_column method!', 'flexible-shipping' ) );
echo '<pre>';
print_r( $this->post );
echo '</pre>';
echo '<pre>';
print_r( $this->meta_data );
echo '</pre>';
}
/**
* Is status fs-new?
*
* @return bool
*/
public function is_status_fs_new() {
return self::STATUS_FS_NEW === $this->get_status();
}
/**
* Is status fs-created?
*
* @return bool
*/
public function is_status_fs_created() {
return self::STATUS_FS_CREATED === $this->get_status();
}
/**
* Is status fs-confirmed?
*
* @return bool
*/
public function is_status_fs_confirmed() {
return self::STATUS_FS_CONFIRMED === $this->get_status();
}
/**
* Is status fs-failed?
*
* @return bool
*/
public function is_status_fs_failed() {
return self::STATUS_FS_FAILED === $this->get_status();
}
/**
* Is status fs-manifest?
*
* @return bool
*/
public function is_status_fs_manifest() {
return self::STATUS_FS_MANIFEST === $this->get_status();
}
/**
* Set created via checkout.
*/
public function set_created_via_checkout() {
$this->set_created_via( 'checkout' );
}
/**
* Set created via.
*
* @param string $created_via Created via.
*/
public function set_created_via( $created_via ) {
$this->set_meta( self::CREATED_VIA, $created_via );
}
/**
* Set created via add shipment.
*/
public function set_created_via_add_shipment() {
$this->set_created_via( 'add_shipment' );
}
/**
* Get created via.
*
* @return string
*/
public function get_created_via() {
return $this->get_meta( self::CREATED_VIA, self::NOT_SET );
}
/**
* Set sent via bulk.
*/
public function set_sent_via_bulk() {
$this->set_sent_via( self::SENT_VIA_BULK );
}
/**
* Set sent via.
*
* @param string $sent_via .
*/
public function set_sent_via( $sent_via ) {
$this->set_meta( self::SENT_VIA, $sent_via );
}
/**
* Set sent via auto.
*/
public function set_sent_via_auto() {
$this->set_sent_via( self::SENT_VIA_AUTO );
}
/**
* Set sent via metabox.
*/
public function set_sent_via_metabox() {
$this->set_sent_via( self::SENT_VIA_METABOX );
}
/**
* Get sent via.
*
* @return string
*/
public function get_sent_via() {
return $this->get_meta( self::SENT_VIA, self::NOT_SET );
}
/**
* Get meta shipping method.
*
* @return WC_Order_Item_Shipping
*/
protected function get_meta_shipping_method() {
return $this->get_meta( '_shipping_method' );
}
}