orderItem = new WC_Order_Item_Product($order_item);
} else {
$this->orderItem = $order_item;
}
$this->has_changes = false;
}
public function get_id()
{
if (get_class($this->orderItem) == 'WC_Order_Item_Product') {
return $this->orderItem->get_id();
} else {
return $this->orderItem['id'];
}
}
public function get_order_id(): int
{
return $this->orderItem->get_order()->get_id();
}
public function get_name()
{
if (get_class($this->orderItem) == 'WC_Order_Item_Product') {
return $this->orderItem->get_name();
} else {
return $this->orderItem['name'];
}
}
public function get_product_id()
{
if (get_class($this->orderItem) == 'WC_Order_Item_Product') {
return $this->orderItem->get_product_id();
} else {
return $this->orderItem['product_id'];
}
}
public function get_variation_id()
{
if (get_class($this->orderItem) == 'WC_Order_Item_Product') {
return $this->orderItem->get_variation_id();
} else {
return $this->orderItem['variation_id'];
}
}
public function get_quantity()
{
if (get_class($this->orderItem) == 'WC_Order_Item_Product') {
return $this->orderItem->get_quantity();
} else {
return $this->orderItem['qty'];
}
}
public static function check_is_delivered(string $status): bool
{
$checkStatus = strtolower(trim($status));
$allowedStatuses = ['delivery successful', 'delivered', 'buyer_accept_goods', 'finish'];
return in_array($checkStatus, $allowedStatuses, true);
}
public function is_delivered(): bool
{
$tracking_status = $this->get_tracking_status();
if ($tracking_status) {
return self::check_is_delivered($tracking_status);
}
return false;
}
public function is_shipped(): bool
{
$status = $this->get_tracking_status();
if ($status) {
$checkStatus = strtolower(trim($status));
$allowedStatuses = ['seller_shipped', 'seller_send_goods', 'wait_buyer_accept_goods'];
return in_array($checkStatus, $allowedStatuses, true);
}
return false;
}
public function get_external_product_id(): ?string
{
$product_id = $this->get_product_id();
$WC_Product = wc_get_product($product_id);
$result = null;
if ($WC_Product) {
/**
* here can be a case when product is already deleted in Woocommerce
*/
$result = $WC_Product->get_meta(Constants::product_external_meta());
}
return $result;
}
public function get_external_order_id()
{
$external_order_id = $this->orderItem->get_meta(Constants::order_item_external_order_meta());
return is_array($external_order_id) ? $external_order_id[0] : '';
}
public function get_external_sku_id(): ?string
{
$productId = $this->get_product_id();
$variationId = $this->get_variation_id();
if (!$variationId && $productId) {
$WC_Product_Variable = new WC_Product_Variable($productId);
$variations = $WC_Product_Variable->get_available_variations();
if (!empty($variations)) {
$variationId = $variations[0]['variation_id'];
}
}
if (!$variationId) {
return null;
}
$skuId = get_post_meta($variationId, ImportedProductService::KEY_EXTERNAL_SKU_ID, true);
return $skuId !== '' ? $skuId : null;
}
private function get_tracking_data()
{
$tracking_data = $this->orderItem->get_meta(Constants::order_item_tracking_data_meta());
if (!$tracking_data) {
$tracking_data = array();
$tracking_data = array("tracking_codes" => array(), "carrier_name" => '', "carrier_url" => '', "tracking_status" => '');
}
if (!isset($tracking_data['tracking_codes'])) {
$tracking_data['tracking_codes'] = array();
}
if (!isset($tracking_data['carrier_name'])) {
$tracking_data['carrier_name'] = '';
}
if (!isset($tracking_data['carrier_url'])) {
$tracking_data['carrier_url'] = '';
}
if (!isset($tracking_data['tracking_status'])) {
$tracking_data['tracking_status'] = '';
}
return $tracking_data;
}
public function get_tracking_codes()
{
$tracking_data = $this->get_tracking_data();
return ($tracking_data && isset($tracking_data['tracking_codes'])) ? $tracking_data['tracking_codes'] : array();
return array();
}
public function get_tracking_status()
{
$tracking_data = $this->get_tracking_data();
$tracking_status = $tracking_data['tracking_status'];
return $tracking_status;
}
public function get_carrier_name()
{
$tracking_data = $this->get_tracking_data();
if ($tracking_data && isset($tracking_data['tracking_codes'])) {
return $tracking_data['carrier_name'];
}
return "";
}
public function get_ali_order_item_link()
{
$external_order_id = $this->get_external_order_id();
if ($external_order_id) {
$url = "https://trade.aliexpress.com/order_detail.htm?orderId={$external_order_id}";
return "" . $external_order_id . "";
} else {
return false;
}
}
public function get_formated_carrier_link()
{
$tracking_data = $this->get_tracking_data();
if ($tracking_data && isset($tracking_data['tracking_codes'])) {
$tracking_url = $tracking_data['carrier_url'];
$carrier_name = $tracking_data['carrier_name'];
if ($tracking_url && $carrier_name) {
return "" . $carrier_name . "";
} else if ($carrier_name) {
return $carrier_name;
}
}
return "";
}
public function get_formated_tracking_codes($plain = false)
{
$tracking_numbers = $this->get_tracking_codes();
$tracking_numbers_formated = array();
if (!$plain) {
$tracking_url_template = "https://global.cainiao.com/detail.htm?mailNoList={tracking_number}";
$tracking_url_template = apply_filters('a2wl_get_tracking_url_template', $tracking_url_template);
foreach ($tracking_numbers as $tracking_number) {
$tracking_url = str_replace('{tracking_number}', $tracking_number, $tracking_url_template);
$link_title = esc_html__('Click to see the tracking information', 'ali2woo');
$tracking_numbers_formated[] = "" . $tracking_number . "";
}
} else {
$tracking_numbers_formated = $tracking_numbers;
}
return !empty($tracking_numbers_formated) ? implode(",", $tracking_numbers_formated) : "";
}
public function get_ali_shipping_code()
{
$shipping_code = '';
$shipping_meta = $this->orderItem->get_meta(Shipping::get_order_item_shipping_meta_key());
$legacy_shipping_meta = $this->orderItem->get_meta(Shipping::get_order_item_legacy_shipping_meta_key());
if ($shipping_meta) {
$shipping_info = json_decode($shipping_meta, true);
$shipping_code = $shipping_info['service_name'];
} else
if ($legacy_shipping_meta) {
$shipping_code = $legacy_shipping_meta;
}
return $shipping_code;
}
public function update_tracking_data($tracking_codes, $carrier_name, $carrier_url, $tracking_status, $force_save = false)
{
foreach ($tracking_codes as $tracking_number) {
$order_id = $this->orderItem->get_order_id();
// $order_item_id = $this->orderItem->get_id();
do_action('wcae_after_add_tracking_code', $order_id, $tracking_number);
}
$this->orderItem->update_meta_data(Constants::order_item_tracking_data_meta(), array("tracking_codes" => $tracking_codes, "carrier_name" => $carrier_name, "carrier_url" => $carrier_url, "tracking_status" => $tracking_status));
$this->has_changes = true;
if ($force_save) {
$this->save();
}
}
public function update_tracking_codes($tracking_codes, $force_save = false)
{
foreach ($tracking_codes as $tracking_number) {
$order_id = $this->orderItem->get_order_id();
// $order_item_id = $this->orderItem->get_id();
do_action('wcae_after_add_tracking_code', $order_id, $tracking_number);
}
$tracking_data = $this->get_tracking_data();
$tracking_data["tracking_codes"] = $tracking_codes;
$this->orderItem->update_meta_data(Constants::order_item_tracking_data_meta(), $tracking_data);
$this->has_changes = true;
if ($force_save) {
$this->save();
}
}
public function update_external_order($external_order_id, $force_save = false)
{
$this->orderItem->update_meta_data(Constants::order_item_external_order_meta(), $external_order_id ? array($external_order_id) : "");
$this->has_changes = true;
if ($force_save) {
$this->save();
}
}
public function save()
{
if ($this->has_changes && get_class($this->orderItem) == 'WC_Order_Item_Product') {
$this->orderItem->save();
return true;
}
return false;
}
}