Files
carpseeds.pl/wp-content/plugins/flexible-shipping/classes/wp-wpdesk-fs-shipment/shipment/cpt-shipment.php
2024-07-15 11:28:08 +02:00

345 lines
14 KiB
PHP

<?php
if ( !defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
class WPDesk_Flexible_Shipping_Shipment_CPT {
const POST_TYPE_SHIPMENT = 'shipment';
private $plugin = null;
/**
* Is order processed on checkout?
*
* @var bool
*/
private $is_order_processed_on_checkout = false;
public function __construct( Flexible_Shipping_Plugin $plugin ) {
$this->plugin = $plugin;
$this->hooks();
}
public function hooks() {
add_action( 'init', array( $this, 'register_post_types' ), 20 );
add_action( 'init', array( $this, 'flexible_shipping_get_label' ), 9999999 );
add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ), 20, 2 );
$last_priority = PHP_INT_MAX;
add_action( 'woocommerce_checkout_update_order_meta', array( $this, 'create_shipping_for_order' ), $last_priority );
add_action( 'woocommerce_order_details_after_order_table', array( $this, 'woocommerce_order_details_after_order_table' ) );
add_action( 'woocommerce_email_after_order_table', array( $this, 'woocommerce_email_after_order_table' ), 10, 2 );
}
/**
* Register post types.
*/
public function register_post_types() {
if ( post_type_exists( self::POST_TYPE_SHIPMENT ) ) {
return;
}
register_post_type( self::POST_TYPE_SHIPMENT,
array(
'labels' => array(
'name' => __( 'Shipments', 'flexible-shipping' ),
'singular_name' => __( 'Shipment', 'flexible-shipping' ),
'menu_name' => __( 'Shipments', 'flexible-shipping' ),
'parent_item_colon' => '',
'all_items' => __( 'Shipments', 'flexible-shipping' ),
'view_item' => __( 'View Shipments', 'flexible-shipping' ),
'add_new_item' => __( 'Add new Shipment', 'flexible-shipping' ),
'add_new' => __( 'Add new Shipment', 'flexible-shipping' ),
'edit_item' => __( 'Edit Shipment', 'flexible-shipping' ),
'update_item' => __( 'Save Shipment', 'flexible-shipping' ),
'search_items' => __( 'Search Shipments', 'flexible-shipping' ),
'not_found' => __( 'Shipment not found', 'flexible-shipping' ),
'not_found_in_trash' => __( 'Shipment not found in trash', 'flexible-shipping' )
),
'description' => __( 'Shipments.', 'flexible-shipping' ),
'public' => false,
'show_ui' => false,
'capability_type' => 'post',
'capabilities' => array(),
'map_meta_cap' => true,
'publicly_queryable' => false,
'exclude_from_search' => true,
'hierarchical' => false,
'query_var' => true,
'supports' => array( 'title' ),
'has_archive' => false,
'show_in_nav_menus' => true,
'menu_icon' => 'dashicons-upload',
)
);
$shipment_statuses = apply_filters( 'flexible_shipping_register_shipment_statuses',
array(
'fs-new' => array(
'label' => _x( 'New', 'Shipment status', 'flexible-shipping' ),
'public' => false,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop( 'New <span class="count">(%s)</span>', 'New <span class="count">(%s)</span>', 'flexible-shipping' ),
),
'fs-created' => array(
'label' => _x( 'Created', 'Shipment status', 'flexible-shipping' ),
'public' => false,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop( 'Created <span class="count">(%s)</span>', 'Created <span class="count">(%s)</span>', 'flexible-shipping' ),
),
'fs-confirmed' => array(
'label' => _x( 'Confirmed', 'Shipment status', 'flexible-shipping' ),
'public' => false,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop( 'Confirmed <span class="count">(%s)</span>', 'Confirmed <span class="count">(%s)</span>', 'flexible-shipping' ),
),
'fs-manifest' => array(
'label' => _x( 'Manifest created', 'Shipment status', 'flexible-shipping' ),
'public' => false,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop( 'Confirmed <span class="count">(%s)</span>', 'Confirmed <span class="count">(%s)</span>', 'flexible-shipping' ),
),
'fs-failed' => array(
'label' => _x( 'Failed', 'Shipment status', 'flexible-shipping' ),
'public' => false,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop( 'Failed <span class="count">(%s)</span>', 'Failed <span class="count">(%s)</span>', 'flexible-shipping' ),
),
)
);
foreach ( $shipment_statuses as $shipment_status => $values ) {
register_post_status( $shipment_status, $values );
}
}
public function add_meta_boxes( $post_type, $post ) {
if ( $post_type == self::POST_TYPE_SHIPMENT ) {
add_meta_box(
'shipment_meta_box',
__('Shipment data', 'flexible-shipping'),
array( $this, 'metabox' ),
'shipment',
'normal',
'high'
);
}
if ( $post_type == 'shop_order' ) {
$shipments = fs_get_order_shipments( $post->ID );
foreach ( $shipments as $shipment ) {
$args = array( 'shipment' => $shipment );
add_meta_box(
'shipment_meta_box_' . $shipment->get_id(),
$shipment->get_order_metabox_title(),
array( $this, 'order_metabox' ),
'shop_order',
$shipment->get_order_metabox_context(),
'default',
$args
);
}
}
}
public function order_metabox( $post, $args ) {
/** @var WPDesk_Flexible_Shipping_Shipment $shipment */
$shipment = $args['args']['shipment'];
$shipment_id = $shipment->get_id();
$message = $shipment->get_error_message();
$message_heading = $shipment->get_order_metabox_title();
$message_css_style = '';
include( 'views/order-metabox.php' );
}
public function metabox() {
global $post;
echo '<pre>';
print_r( $post );
echo '</pre>';
$meta_data = get_post_meta( $post->ID );
foreach ( $meta_data as $key => $val ) {
echo '<pre>';
echo $key;
echo ' = ';
print_r( maybe_unserialize( $val[0] ) );
echo '</pre>';
}
}
public function flexible_shipping_get_label() {
if ( !empty( $_GET['flexible_shipping_get_label'] ) && !empty( $_GET['nonce'] ) ) {
$nonce = $_GET['nonce'];
if ( !wp_verify_nonce( $nonce, 'flexible_shipping_get_label' ) ) {
echo __( 'Invalid nonce!', 'flexible-shipping' );
exit;
}
try {
$shipment_id = $_GET['flexible_shipping_get_label'];
$shipment = fs_get_shipment( $shipment_id );
$label_data = $shipment->get_label();
header( "Content-type: application/octet-stream" );
header( "Content-Disposition: attachment; filename=" . $label_data['file_name'] );
echo $label_data['content'];
}
catch ( Exception $e ) {
echo $e->getMessage();
}
exit();
}
}
/**
* Get Flexible Shipping method from order shipping method meta data.
*
* @param WC_Order_Item_Shipping $shipping_method
*
* @return array
*/
private function get_fs_method_from_order_shipping_method( $shipping_method ) {
$fs_method = array();
if ( version_compare( WC_VERSION, '2.6', '<' ) ) {
if ( isset( $shipping_method['item_meta'] )
&& isset( $shipping_method['item_meta']['method_id'] )
&& isset( $shipping_method['item_meta']['method_id'][0] )
) {
$all_shipping_methods = flexible_shipping_get_all_shipping_methods();
$flexible_shipping = $all_shipping_methods['flexible_shipping'];
$flexible_shipping_rates = $flexible_shipping->get_all_rates();
$fs_method = $flexible_shipping_rates[ $shipping_method['item_meta']['method_id'][0] ];
}
}
if ( version_compare( WC_VERSION, '2.7', '<' ) ) {
if ( isset( $shipping_method['item_meta'] )
&& isset( $shipping_method['item_meta']['_fs_method'] )
&& isset( $shipping_method['item_meta']['_fs_method'][0] )
) {
$fs_method = unserialize( $shipping_method['item_meta']['_fs_method'][0] );
}
} else {
if ( isset( $shipping_method['item_meta'] )
&& isset( $shipping_method['item_meta']['_fs_method'] )
) {
$fs_method = $shipping_method['item_meta']['_fs_method'];
}
}
return $fs_method;
}
/**
* Create shipment for order and shipping method.
*
* @param WC_Order $order Order.
* @param array $fs_method Flexible Shipping shipping method.
* @param string $shipping_id Shipping Id.
* @param WC_Order_Item_Shipping $shipping_method Shipping method.
* @param array $packages Packages.
* @param int $package_id Package Id.
*
* @return WPDesk_Flexible_Shipping_Shipment
*/
private function create_shipment_for_order_and_fs_shipping_method(
WC_Order $order,
array $fs_method,
$shipping_id,
WC_Order_Item_Shipping $shipping_method,
array $packages,
$package_id
) {
$shipment = fs_create_shipment( $order, $fs_method );
$shipment->set_meta( '_fs_method', $fs_method );
$shipment->set_meta( '_shipping_id', $shipping_id );
$shipment->set_meta( '_shipping_method', $shipping_method );
$shipment->set_meta( '_package', $packages[ $package_id ] );
$shipment->set_meta( '_packages', $packages );
$shipment->set_created_via_checkout();
$shipment->checkout( $fs_method, $packages[ $package_id ] );
$shipment->save();
return $shipment;
}
/**
* Create shipping for order.
*
* @param $order_id
*/
public function create_shipping_for_order( $order_id ) {
$order = wc_get_order( $order_id );
if ( $order && ! $this->is_order_processed_on_checkout ) {
$mutex = \FSVendor\WPDesk\Mutex\WordpressPostMutex::fromOrder( $order );
$mutex->acquireLock();
$shipments = fs_get_order_shipments( $order_id );
if ( 0 === count( $shipments ) ) {
$this->is_order_processed_on_checkout = true;
$order_shipping_methods = $order->get_shipping_methods();
$packages = WC()->shipping->get_packages();
$package_id = - 1;
global $fs_package_id;
foreach ( $order_shipping_methods as $shipping_id => $shipping_method ) {
$package_id ++;
$fs_package_id = $package_id;
$fs_method = $this->get_fs_method_from_order_shipping_method( $shipping_method );
if ( ! empty( $fs_method['method_integration'] ) ) {
if ( fs_shipment_integration_exists( $fs_method['method_integration'] ) ) {
$shipment = $this->create_shipment_for_order_and_fs_shipping_method(
$order, $fs_method, $shipping_id, $shipping_method, $packages, $package_id
);
}
}
}
}
$mutex->releaseLock();
}
}
/**
* Hook woocommerce_order_details_after_order_table.
*
* @param WC_Abstract_Order $order Order.
*/
public function woocommerce_order_details_after_order_table( $order ) {
if ( version_compare( WC_VERSION, '2.7', '<' ) ) {
$order_id = $order->id;
}
else {
$order_id = $order->get_id();
}
$shipments = fs_get_order_shipments( $order_id );
foreach ( $shipments as $shipment ) {
echo $shipment->get_after_order_table();
}
}
public function woocommerce_email_after_order_table( $order, $sent_to_admin ) {
if ( version_compare( WC_VERSION, '2.7', '<' ) ) {
$order_id = $order->id;
}
else {
$order_id = $order->get_id();
}
$shipments = fs_get_order_shipments( $order_id );
foreach ( $shipments as $shipment ) {
echo $shipment->get_email_after_order_table();
}
}
}