public function log_shipment_response($order_id, $response)
 {
     if (strpos($order_id, '_') !== false) {
         $parts = explode('_', $order_id);
         $order_id = $parts[0];
     }
     if (get_post_type($order_id) != 'order_shipment') {
         return;
     }
     $order = WC_MS_Compatibility::wc_get_order($order_id);
     if ($order) {
         //Store the values of shipped order which we are getting from ShippingEasy.
         $tracking_number = $response['shipment']['tracking_number'];
         $carrier_key = $response['shipment']['carrier_key'];
         $carrier_service_key = $response['shipment']['carrier_service_key'];
         $shipment_cost_cents = $response['shipment']['shipment_cost'];
         $shipment_cost = $shipment_cost_cents / 100;
         $comment_update = 'Shipping Tracking Number: ' . $tracking_number . '<br/> Carrier Key: ' . $carrier_key . '<br/> Carrier Service Key: ' . $carrier_service_key . '<br/> Cost: ' . $shipment_cost;
         $order->add_order_note($comment_update);
     }
 }
<?php

$shipments = WC_MS_Order_Shipment::get_by_order($post->ID);
foreach ($shipments as $shipment_id) {
    $shipment = WC_MS_Compatibility::wc_get_order($shipment_id);
    ?>
    <div class="wc-shipment" id="wc-shipment-<?php 
    echo $shipment_id;
    ?>
">

        <div class="address">
            <strong><?php 
    _e('<strong>Ship To:</strong><br/>', 'wc_shipping_multiple_address');
    ?>
</strong>
            <?php 
    echo $shipment->get_formatted_shipping_address();
    ?>
            <br/>
            (<a href="#" class="edit-shipment-address">Edit</a>)
        </div>

        <div class="edit_shipping_address" style="display:none;">
            <?php 
    $shipFields = WC()->countries->get_address_fields($shipment->shipping_country, 'shipping_');
    if ($shipFields) {
        foreach ($shipFields as $key => $field) {
            if (!isset($field['type'])) {
                $field['type'] = 'text';
            }
        function list_order_item_addresses($order_id)
        {
            global $woocommerce;
            if (false == apply_filters('wcms_list_order_item_addresses', true, $order_id)) {
                return;
            }
            if ($order_id instanceof WC_Order) {
                $order = $order_id;
                $order_id = $order->id;
            } else {
                $order = WC_MS_Compatibility::wc_get_order($order_id);
            }
            $methods = get_post_meta($order_id, '_shipping_methods', true);
            $shipping_methods = $order->get_shipping_methods();
            $packages = get_post_meta($order_id, '_wcms_packages', true);
            $multiship = get_post_meta($order_id, '_multiple_shipping', true);
            if (!$packages || count($packages) == 1) {
                return;
            }
            // load the address fields
            $this->load_cart_files();
            $cart = new WC_Cart();
            echo '<p><strong>' . __('This order ships to multiple addresses.', 'wc_shipping_multiple_address') . '</strong></p>';
            echo '<table class="shop_table shipping_packages" cellspacing="0" cellpadding="6" style="width: 100%; border: 1px solid #eee;" border="1" bordercolor="#eee">';
            echo '<thead><tr>';
            echo '<th scope="col" style="text-align:left; border: 1px solid #eee;">' . __('Products', 'woocommerce') . '</th>';
            echo '<th scope="col" style="text-align:left; border: 1px solid #eee;">' . __('Address', 'woocommerce') . '</th>';
            echo '<th scope="col" style="text-align:left; border: 1px solid #eee;">' . __('Notes', 'woocommerce') . '</th>';
            echo '</tr></thead><tbody>';
            foreach ($packages as $x => $package) {
                $products = $package['contents'];
                $method = $methods[$x]['label'];
                foreach ($shipping_methods as $ship_method) {
                    if ($ship_method['method_id'] == $method) {
                        $method = $ship_method['name'];
                        break;
                    }
                }
                $address = '';
                if (!empty($package['full_address'])) {
                    $address = wcms_get_formatted_address($package['full_address']);
                }
                ?>
                <tr>
                    <td style="text-align:left; vertical-align:middle; border: 1px solid #eee;"><ul>
                    <?php 
                foreach ($products as $i => $product) {
                    ?>
                        <li><?php 
                    echo get_the_title($product['data']->id) . ' &times; ' . $product['quantity'] . '<br />' . $cart->get_item_data($product, true);
                    ?>
</li>
                    <?php 
                }
                ?>
                    </ul></td>
                    <td style="text-align:left; vertical-align:middle; border: 1px solid #eee;">
                        <?php 
                echo $address;
                ?>
                        <br/>
                        <em>(<?php 
                echo $method;
                ?>
)</em>
                    </td>
                    <td style="text-align:left; vertical-align:middle; border: 1px solid #eee;">
                        <?php 
                if (!empty($package['note'])) {
                    echo $package['note'];
                } else {
                    echo '&ndash;';
                }
                if (!empty($package['date'])) {
                    echo '<p>' . sprintf(__('Delivery date: %s', 'wc_shipping_multiple_address'), $package['date']) . '</p>';
                }
                ?>
                    </td>
                </tr>
                <?php 
            }
            echo '</table>';
        }
 public function checkout_process($order_id)
 {
     global $woocommerce;
     $sess_item_address = wcms_session_get('cart_item_addresses');
     $has_item_address = !wcms_session_isset('cart_item_addresses') || empty($sess_item_address) ? false : true;
     do_action('wc_ms_before_checkout_process', $order_id);
     $packages = $woocommerce->cart->get_shipping_packages();
     $sess_item_address = wcms_session_isset('cart_item_addresses') ? wcms_session_get('cart_item_addresses') : false;
     $sess_packages = wcms_session_isset('wcms_packages') ? wcms_session_get('wcms_packages') : false;
     $sess_methods = wcms_session_isset('shipping_methods') ? wcms_session_get('shipping_methods') : false;
     $sess_rates = wcms_session_isset('wcms_package_rates') ? wcms_session_get('wcms_package_rates') : false;
     // Allow outside code to modify session data one last time
     $sess_item_address = apply_filters('wc_ms_checkout_session_item_address', $sess_item_address);
     $sess_packages = apply_filters('wc_ms_checkout_session_packages', $sess_packages);
     $sess_methods = apply_filters('wc_ms_checkout_session_methods', $sess_methods);
     $sess_rates = apply_filters('wc_ms_checkout_session_rates', $sess_rates);
     if ($has_item_address) {
         update_post_meta($order_id, '_multiple_shipping', 'yes');
     }
     // update the taxes
     $packages = $this->calculate_taxes(null, $packages, true);
     $sess_packages = $this->calculate_taxes(null, $sess_packages, true);
     if ($packages) {
         update_post_meta($order_id, '_shipping_packages', $packages);
     }
     if ($sess_item_address !== false && !empty($sess_item_address)) {
         update_post_meta($order_id, '_shipping_addresses', $sess_item_address);
         wcms_session_delete('cart_item_addresses');
         if ($sess_packages) {
             if ($has_item_address) {
                 // remove the shipping address
                 update_post_meta($order_id, '_shipping_first_name', '');
                 update_post_meta($order_id, '_shipping_last_name', '');
                 update_post_meta($order_id, '_shipping_company', '');
                 update_post_meta($order_id, '_shipping_address_1', '');
                 update_post_meta($order_id, '_shipping_address_2', '');
                 update_post_meta($order_id, '_shipping_city', '');
                 update_post_meta($order_id, '_shipping_postcode', '');
                 update_post_meta($order_id, '_shipping_country', '');
                 update_post_meta($order_id, '_shipping_state', '');
             }
         }
     }
     if ($sess_packages !== false && !empty($sess_packages) && $has_item_address) {
         update_post_meta($order_id, '_wcms_packages', $sess_packages);
     }
     if ($sess_methods !== false && !empty($sess_methods) && $has_item_address) {
         $methods = $sess_methods;
         update_post_meta($order_id, '_shipping_methods', $methods);
     } else {
         $order = WC_MS_Compatibility::wc_get_order($order_id);
         $methods = $order->get_shipping_methods();
         $ms_methods = array();
         if ($sess_packages) {
             foreach ($sess_packages as $pkg_idx => $package) {
                 foreach ($methods as $method) {
                     $ms_methods[$pkg_idx] = array('id' => $method['method_id'], 'label' => $method['name']);
                     continue 2;
                 }
             }
         }
         update_post_meta($order_id, '_shipping_methods', $ms_methods);
     }
     if ($sess_rates !== false) {
         update_post_meta($order_id, '_shipping_rates', $sess_rates);
     }
     do_action('wc_ms_after_checkout_process', $order_id);
 }
 function show_multiple_addresses_line($column)
 {
     global $post, $woocommerce, $the_order;
     if (empty($the_order) || $the_order->id != $post->ID) {
         $the_order = WC_MS_Compatibility::wc_get_order($post->ID);
     }
     if ($column == 'shipping_address') {
         $packages = get_post_meta($post->ID, '_wcms_packages', true);
         if (!$the_order->get_formatted_shipping_address() && count($packages) > 1) {
             _e('Ships to multiple addresses ', 'woocommerce');
         }
     }
 }
 public static function send_package_email($order_id, $package_index)
 {
     global $woocommerce;
     $settings = get_option('woocommerce_multiple_shipping_settings', array());
     $order = WC_MS_Compatibility::wc_get_order($order_id);
     $subject = isset($settings['email_subject']) && !empty($settings['email_subject']) ? $settings['email_subject'] : __('Part of your order has been shipped', 'wc_shipping_multiple_address');
     $message = isset($settings['email_message']) && !empty($settings['email_message']) ? $settings['email_message'] : false;
     if (!$message) {
         $message = self::get_default_email_body();
     }
     $mailer = $woocommerce->mailer();
     $message = $mailer->wrap_message($subject, $message);
     $ts = strtotime($order->order_date);
     $order_date = date(get_option('date_format'), $ts);
     $order_time = date(get_option('time_format'), $ts);
     $search = array('{order_id}', '{order_date}', '{order_time}', '{customer_first_name}', '{customer_last_name}', '{products_table}', '{addresses_table}');
     $replacements = array($order->get_order_number(), $order_date, $order_time, $order->billing_first_name, $order->billing_last_name, self::render_products_table($order, $package_index), self::render_addresses_table($order, $package_index));
     $message = str_replace($search, $replacements, $message);
     $mailer->send($order->billing_email, $subject, $message);
 }
 /**
  * Create a new Order Shipment
  *
  * @param array $args
  * @return int|WP_Error
  */
 public function create_shipment($args)
 {
     $default_args = array('status' => '', 'customer_id' => null, 'customer_note' => null, 'created_via' => '', 'parent' => 0);
     $args = wp_parse_args($args, $default_args);
     $shipment_data = array();
     if (empty($args['parent'])) {
         return new WP_Error('create_shipment', __('Cannot create a shipment without an Order ID', 'wc_shipping_multiple_address'));
     }
     $order_id = $args['parent'];
     $wc_order = WC_MS_Compatibility::wc_get_order($order_id);
     $updating = false;
     $shipment_data['post_type'] = 'order_shipment';
     $shipment_data['post_status'] = 'wc-' . apply_filters('wc_ms_default_shipment_status', 'pending');
     $shipment_data['ping_status'] = 'closed';
     $shipment_data['post_author'] = 1;
     $shipment_data['post_password'] = $wc_order->post->post_password;
     $shipment_data['post_title'] = sprintf(__('Shipment &ndash; %s', 'wc_shipping_multiple_address'), strftime(_x('%b %d, %Y @ %I:%M %p', 'Order date parsed by strftime', 'wc_shipping_multiple_address')));
     $shipment_data['post_parent'] = $order_id;
     if ($args['status']) {
         if (!in_array('wc-' . $args['status'], array_keys(wc_get_order_statuses()))) {
             return new WP_Error('woocommerce_invalid_order_status', __('Invalid shipment status', 'wc_shipping_multiple_address'));
         }
         $shipment_data['post_status'] = 'wc-' . $args['status'];
     }
     if (!is_null($args['customer_note'])) {
         $shipment_data['post_excerpt'] = $args['customer_note'];
     }
     $shipment_id = wp_insert_post(apply_filters('wc_ms_new_shipment_data', $shipment_data), true);
     if (is_wp_error($shipment_id)) {
         return $shipment_id;
     }
     update_post_meta($shipment_id, '_shipment_key', 'wc_' . apply_filters('wc_ms_generate_shipment_key', uniqid('shipment_')));
     update_post_meta($shipment_id, '_created_via', sanitize_text_field($args['created_via']));
     $shipment = WC_MS_Compatibility::wc_get_order($shipment_id);
     $shipment->add_order_note('Shipment for Order ' . $wc_order->get_order_number());
     return $shipment_id;
 }