public function can_auto_confirm_for_auto_assign($order_id)
 {
     $order = $this->get_order($order_id);
     if (empty($order)) {
         return FALSE;
     }
     $auto_comfirmed_contries = auto_comfirmed_contries();
     if (in_array($order->country, $auto_comfirmed_contries) && $order->gross <= 300 && !empty($order->name) && empty($order->note)) {
         $item_titles = explode(',', $order->item_title_str);
         $item_ids = explode(',', $order->item_id_str);
         $skus = explode(',', $order->sku_str);
         $qties = explode(',', $order->qty_str);
         if (count($item_titles) == count($item_ids) && count($item_ids) == count($skus) && count($skus) && count($qties) && !in_array('', $skus) && !in_array('', $qties)) {
             return TRUE;
         }
     }
     return FALSE;
 }
Beispiel #2
0
 public function handle_orders()
 {
     if (strpos($_SERVER['SCRIPT_FILENAME'], 'auto_handle_orders.php') === FALSE) {
         exit;
     }
     $order_log = array('merged' => 0, 'updated' => 0, 'created' => 0, 'deleted' => 0, 'waiting' => 0, 'duplicated' => 0);
     $orders = $this->paypal_model->fetch_all_unhandled_order_ids();
     $wait_for_confirmation_status = $this->order_statuses['wait_for_confirmation'];
     $wait_for_purchase_status = $this->order_statuses['wait_for_purchase'];
     $sku_prices = array();
     // array to store sku prices.
     $sku_weights = array();
     // array to store sku weight.
     $user_ids = array();
     // array to store user ids.
     $auto_comfirmed_contries = auto_comfirmed_contries();
     $waiting_skus = array();
     $waiting_skus_obj = $this->confirm_order_condition_model->fetch_all_wait_confirm_skus();
     foreach ($waiting_skus_obj as $row) {
         if ($row->sku) {
             $waiting_skus[] = $row->sku;
         }
     }
     $tmp = 0;
     foreach ($orders as $row) {
         $order_id = $row->id;
         $address_different = 0;
         // buyer has different address between paypal and ebay
         $split_order = FALSE;
         // is order sku qty changed?
         $new_orders = array();
         // shipping code as key
         $need_update_ids = array();
         // save order ids to update profit, role.
         $to_remove_order_id = 0;
         // order id to remove.
         $total_sku_price = 0;
         // total sku price.
         $order = $this->order_model->get_order($order_id);
         if (empty($order)) {
             continue;
         }
         if ($order->track_number != '' || $order->ship_confirm_user != '' || $order->print_label_user != '') {
             continue;
             //有追踪号  确认发货人  打印标签人的  不处理
         }
         $transaction_id = $order->transaction_id;
         //$item_titles = explode(ITEM_TITLE_SEP, $order->item_title_str);
         $item_titles = explode(ITEM_TITLE_SEP, preg_replace("/[\n| ]{2,}/", " ", $order->item_title_str));
         $item_ids = explode(',', $order->item_id_str);
         $skus = explode(',', $order->sku_str);
         $qties = explode(',', $order->qty_str);
         $input_user = $order->input_user;
         $shipping_code = $order->is_register;
         // check paypal and ebay address.
         $ebay_orders = $this->ebay_order_model->fetch_ebay_order_by_paypal($transaction_id);
         if (!empty($ebay_orders)) {
             foreach ($ebay_orders as $ebay_order) {
                 // check only if paypal name and ebay name are same.
                 if ($ebay_order->buyer_name == $order->name) {
                     if (trim(strtolower($ebay_order->street1)) != trim(strtolower($order->address_line_1)) && trim(strtolower($ebay_order->street2)) != trim(strtolower($order->address_line_2))) {
                         $address_different = 1;
                     }
                 }
                 break;
             }
         }
         /*超过80个字符的网名从ebay里面获取*/
         $ebay_order_ids = array();
         foreach ($item_titles as $key => $item_title) {
             $item_title = trim($item_title);
             $start_bracket = strrpos($item_title, '[');
             if (!strrpos($item_title, ']') && $start_bracket > 0) {
                 //去myebay_order_list去找完整的网名
                 echo $transaction_id . "\n";
                 $ebay_order_infos = $this->ebay_order_model->fetch_ebay_order_by_paypal_and_item($transaction_id, $item_ids[$key]);
                 var_dump($ebay_order_infos);
                 if (empty($ebay_order_infos)) {
                     continue;
                     //如果ebay订单还没有进来  那就不处理,继续下一个订单
                 }
                 foreach ($ebay_order_infos as $ebay_order_info) {
                     if (in_array($ebay_order_info->id, $ebay_order_ids)) {
                         //如果ebayorder的id已经被用过一次就不要用了。
                     } else {
                         echo "no+++++\n";
                         $item_titles[$key] = $ebay_order_info->item_title;
                         $ebay_order_ids[] = $ebay_order_info->id;
                         break;
                         //跳出本次foreach循环
                     }
                 }
             }
             //$item_titles[$key] = $item_title;
         }
         /*超过80个字符的网名从ebay里面获取结束*/
         $net_name_limit_126 = FALSE;
         foreach ($item_titles as $key => $item_title) {
             $item_title = trim($item_title);
             // paypal problem.
             if (strrpos($item_title, ']') == strlen($item_title) - 1 && $start_bracket > 0) {
                 $item_title = rtrim(rtrim($item_title, ']')) . ']';
                 $begin_title = substr($item_title, 0, $start_bracket);
                 $bracket_title = substr($item_title, $start_bracket);
                 $bracket_title = preg_replace("/\\s+,/", ",", $bracket_title);
                 $item_title = $begin_title . $bracket_title;
             }
             $item_titles[$key] = $item_title;
             if (strlen($item_title) > 126) {
                 $net_name_limit_126 = TRUE;
             }
         }
         $item_title_str = implode(ITEM_TITLE_SEP, $item_titles);
         if (isset($user_ids[$input_user])) {
             $user_id = $user_ids[$input_user];
         } else {
             $user_id = $this->order_model->get_user_id_by_name($input_user);
             $user_ids[$input_user] = $user_id;
         }
         $i = 0;
         $sku_missing = FALSE;
         $sku_wait = FALSE;
         // check sku shipping code, try to split order if needs
         $is_duplicated = $this->_check_duplicated($item_title_str, $order->item_id_str, $order->buyer_id, $order->name, $transaction_id);
         foreach ($item_titles as $item_title) {
             $item_id = $item_ids[$i];
             $sku = $skus[$i];
             $qty = $qties[$i];
             $i++;
             $data = array('item_title' => $item_title, 'shipping_code' => $shipping_code, 'input_user' => $input_user, 'currency' => $order->currency, 'gross' => $order->gross, 'country' => $order->country);
             $item_info = array('item_qties' => explode(',', $order->qty_str), 'item_codes' => explode(',', $order->sku_str), 'item_ids' => explode(',', $order->item_id_str), 'ship_to_country' => $order->country, 'gross' => $order->gross, 'gross_usd' => $this->order_model->to_usd($order->currency, $order->gross));
             $tmp_shipping_code = get_register($item_info, '', $order->currency, array($order->transaction_id));
             //if($tmp_shipping_code=='PED'){echo $tmp_shipping_code.'****<br>';var_dump($item_info);}
             //$tmp_shipping_code = $order->is_register;
             //$tmp_shipping_code = $this->_get_register($data);
             if (empty($sku)) {
                 $item_title = str_replace(" [", "[", $item_title);
                 $product_codes = $this->ebay_order_model->fetch_ebay_order_sku($item_id, str_replace(" ]", "]", $item_title), $transaction_id);
                 var_dump($product_codes);
                 //if(empty($product_codes)){die();}
                 $ebay_order_sku_exists = FALSE;
                 if ($product_codes) {
                     $ebay_order_sku_exists = TRUE;
                     $tmp_codes = explode(',', $product_codes);
                     foreach ($tmp_codes as $code) {
                         $tmp_code_qty = explode('^', $code);
                         // SKU  like DV7^10
                         if (count($tmp_code_qty) == 2) {
                             $code = $tmp_code_qty[0];
                         }
                         if (!$this->product_model->check_sku_exists($code)) {
                             $ebay_order_sku_exists = FALSE;
                             echo "sku: {$code} not in products\n";
                             break;
                         }
                     }
                 }
                 if (!$ebay_order_sku_exists) {
                     //$product_codes = $this->order_model->get_product_by_netname_copy($item_title, $user_id);
                 }
                 // there may be more than one sku for one item title.
                 if (empty($product_codes)) {
                     $product_codes = '';
                 }
                 if (substr_count($product_codes, ',')) {
                     $product_codes = explode(',', $product_codes);
                     $new_item_titles = array();
                     $new_item_ids = array();
                     $new_qties = array();
                     $new_skus = array();
                     foreach ($product_codes as $product_code) {
                         $new_item_titles[] = $item_title;
                         $new_item_ids[] = $item_id;
                         $new_qties[] = $qty;
                         $new_skus[] = $product_code;
                     }
                     $item_title = implode(ITEM_TITLE_SEP, $new_item_titles);
                     $item_id = implode(',', $new_item_ids);
                     $sku = implode(',', $new_skus);
                     $qty = implode(',', $new_qties);
                 } else {
                     $sku = $product_codes;
                 }
             }
             if (empty($sku)) {
                 $sku_missing = TRUE;
                 $netname_data = array('net_name' => $item_title, 'user_id' => $user_id);
                 if (!$this->sale_model->netname_exists($netname_data)) {
                     $netname_data['netname_id'] = -1;
                     $netname_data['item_id'] = $item_id;
                     $this->sale_model->save_netname($netname_data);
                     unset($netname_data);
                 }
                 echo "Missing: {$item_title}\n";
                 continue;
                 // no need to go forwards.
             }
             // sku may be a string with concat with ','
             $tmp_skus = explode(',', $sku);
             $tmp_qties = explode(',', $qty);
             $sku_price = 0;
             $sku_weight = 0;
             $tmp_i = 0;
             foreach ($tmp_skus as $key => $tmp_sku) {
                 $tmp_sku_qty = explode('^', $tmp_sku);
                 // SKU  like DV7^10
                 if (count($tmp_sku_qty) == 2) {
                     $tmp_sku = $tmp_sku_qty[0];
                     if (!is_numeric($tmp_sku_qty[1])) {
                         $sku_missing = TRUE;
                     }
                     $tmp_qty = $tmp_qties[$tmp_i] * $tmp_sku_qty[1];
                 } else {
                     $tmp_qty = $tmp_qties[$tmp_i];
                 }
                 $tmp_skus[$key] = $tmp_sku;
                 $tmp_qties[$tmp_i] = $tmp_qty;
                 // if sku price exists, sku weight should exists too.
                 if (isset($sku_prices[$tmp_sku])) {
                     $sku_price += $sku_prices[$tmp_sku] * $tmp_qty;
                     $sku_weight += $sku_weights[$tmp_sku] * $tmp_qty;
                 } else {
                     $product = $this->product_model->fetch_product_by_sku($tmp_sku);
                     $sku_prices[$tmp_sku] = $product->price;
                     $sku_weights[$tmp_sku] = $product->total_weight;
                     $sku_price += $sku_prices[$tmp_sku] * $tmp_qty;
                     $sku_weight += $sku_weights[$tmp_sku] * $tmp_qty;
                 }
                 // check if sku is in waiting for confirmation list.
                 if (in_array($tmp_sku, $waiting_skus)) {
                     $sku_wait = TRUE;
                 }
                 $tmp_i++;
             }
             // rebuild SKU.
             $sku = implode(',', $tmp_skus);
             $qty = implode(',', $tmp_qties);
             if (empty($new_orders[$tmp_shipping_code])) {
                 $new_orders[$tmp_shipping_code] = array('item_title_str' => $item_title, 'item_id_str' => $item_id, 'sku_str' => $sku, 'qty_str' => $qty, 'price' => $sku_price, 'shipping_weight' => $sku_weight);
             } else {
                 $tmp_item_title_str = $new_orders[$tmp_shipping_code]['item_title_str'];
                 $tmp_item_id_str = $new_orders[$tmp_shipping_code]['item_id_str'];
                 $tmp_sku_str = $new_orders[$tmp_shipping_code]['sku_str'];
                 $tmp_qty_str = $new_orders[$tmp_shipping_code]['qty_str'];
                 $tmp_price = $new_orders[$tmp_shipping_code]['price'];
                 $tmp_weight = $new_orders[$tmp_shipping_code]['shipping_weight'];
                 $new_orders[$tmp_shipping_code] = array('item_title_str' => $tmp_item_title_str . ITEM_TITLE_SEP . $item_title, 'item_id_str' => $tmp_item_id_str . ',' . $item_id, 'sku_str' => $tmp_sku_str . ',' . $sku, 'qty_str' => $tmp_qty_str . ',' . $qty, 'price' => $tmp_price + $sku_price, 'shipping_weight' => $tmp_weight + $sku_weight);
             }
             $total_sku_price += $sku_price;
         }
         // end of foreach ($item_titles as $item_title)
         if ($sku_missing) {
             $order_log['waiting']++;
             continue;
         }
         $shipping_code_count = count($new_orders);
         $not_trade_fee = FALSE;
         foreach ($new_orders as $key => $row) {
             if ($shipping_code_count > 1) {
                 //$split_order = TRUE;
                 $rate = $row['price'] / $total_sku_price;
                 $new_orders[$key]['gross'] = price($order->gross * $rate);
                 $new_orders[$key]['fee'] = price($order->fee * $rate);
                 $new_orders[$key]['net'] = price($order->net * $rate);
                 $new_orders[$key]['shippingamt'] = price($order->shippingamt * $rate);
             } else {
                 $new_orders[$key]['gross'] = $order->gross;
                 $new_orders[$key]['fee'] = $order->fee;
                 $new_orders[$key]['net'] = $order->net;
                 $new_orders[$key]['shippingamt'] = $order->shippingamt;
             }
             $order_data = array('item_id_str' => $new_orders[$key]['item_id_str'], 'gross' => $new_orders[$key]['gross'], 'net' => $new_orders[$key]['net'], 'currency' => $order->currency, 'transaction_ids' => $transaction_id, 'shipping_code' => $key, 'price' => $row['price'], 'shipping_weight' => $row['shipping_weight'], 'country' => $order->country);
             $new_orders[$key]['profit'] = $this->_calculate_profit_rate($order_data);
             if ($new_orders[$key]['profit']['trade_fee'] == 0) {
                 $not_trade_fee = TRUE;
             }
         }
         if ($not_trade_fee) {
             //continue;
         }
         echo $order_id, "\n";
         var_dump($new_orders);
         if ($is_duplicated) {
             $order_log['duplicated']++;
         }
         foreach ($new_orders as $key => $value) {
             $profit = $value['profit'];
             $data = array('TRANSACTIONID' => $transaction_id, 'SHIPTOSTREET' => $order->address_line_1, 'SHIPTOSTREET2' => $order->address_line_2, 'SHIPTONAME' => $order->name, 'SHIPTOCOUNTRYNAME' => $order->country, 'SHIPTOCITY' => $order->town_city);
             if ($is_duplicated) {
                 $to_merged_id = NULL;
             } else {
                 $to_merged_id = $this->paypal_model->can_merge_order($data, $input_user, $order->ebay_id, $key);
             }
             if ($to_merged_id) {
                 $need_update_ids[] = $to_merged_id;
                 $data = array('item_title_str' => $value['item_title_str'], 'item_id_str' => $value['item_id_str'], 'sku_str' => $value['sku_str'], 'qty_str' => $value['qty_str'], 'gross' => $value['gross'], 'fee' => $value['fee'], 'currency' => $order->currency, 'transaction_id' => $transaction_id, 'is_merged' => 1, 'shippingamt' => $value['shippingamt']);
                 echo "merging: ", $value['item_title_str'], "\n";
                 $this->_merge_order($to_merged_id, $data);
                 $to_remove_order_id = $order_id;
                 unset($new_orders[$key]);
                 $order_log['merged']++;
             } else {
                 // need to split order.
                 if ($split_order) {
                     $data = $order;
                     unset($data->id);
                     $data->is_register = $key;
                     $data->item_no = change_item_register($order->item_no, $order->is_register, $key);
                     $data->item_title_str = $value['item_title_str'];
                     $data->item_id_str = $value['item_id_str'];
                     $data->sku_str = $value['sku_str'];
                     $data->qty_str = $value['qty_str'];
                     $data->gross = $value['gross'];
                     $data->fee = $value['fee'];
                     $data->net = $value['net'];
                     $data->order_status = $wait_for_confirmation_status;
                     $data->is_splited = 1;
                     $data->is_duplicated = $is_duplicated;
                     $data->sys_remark = $order->sys_remark . ',' . sprintf(lang('split_order_remark'), get_current_time(), lang('program'), $transaction_id, $order->item_id_str);
                     $data->profit_rate = $profit['profit_rate'];
                     $data->shipping_cost = $profit['shipping_cost'];
                     $data->product_cost_all = $profit['product_cost'];
                     $data->trade_fee = $profit['trade_fee'];
                     $data->listing_fee = $profit['listing_fee'];
                     if (empty($data->contact_phone_number)) {
                         $data->contact_phone_number = $profit['phone'];
                     }
                     // order role
                     $order_role = $this->_get_order_role($value['sku_str'], $order->to_email);
                     $data->stock_user_id = $order_role['stock_user_id'];
                     $data->purchaser_id_str = $order_role['purchaser_id_str'];
                     $data->developer_id = $order_role['developer_id'];
                     $data->saler_id = $order_role['saler_id'];
                     $data->tester_id = $order_role['tester_id'];
                     $data->address_incorrect = $address_different;
                     echo "new order: ", $data->item_no, " ", $data->item_title_str, "\n";
                     $new_order_id = $this->_create_new_order($data);
                     $need_update_ids[] = $new_order_id;
                     $to_remove_order_id = $order_id;
                     $splited_data = array('order_id' => $new_order_id, 'item_id_str' => $order->item_id_str, 'transaction_id' => $order->transaction_id);
                     $this->paypal_model->save_splited_order($splited_data);
                     unset($new_orders[$key]);
                     $order_log['created']++;
                 } else {
                     $profit_rate = $profit['profit_rate'];
                     $usd_gross = $this->order_model->to_usd($order->currency, $value['gross']);
                     $order_status = $wait_for_confirmation_status;
                     $order_status_name = lang('wait_for_confirmation');
                     if ($usd_gross <= 200 && !$is_duplicated && !$sku_wait && !$address_different && !$net_name_limit_126 && empty($order->note) && count(explode(',', $value['sku_str'])) < 2) {
                         //$order_status = $wait_for_purchase_status;
                         //$order_status_name = lang('wait_for_purchase');
                     }
                     $data = array();
                     /*ebay 有备注的订单需要客服确认*/
                     if (!empty($ebay_orders)) {
                         foreach ($ebay_orders as $ebay_order) {
                             if ($ebay_order->buyercheckoutmessage != '' && $ebay_order->buyercheckoutmessage != NULL) {
                                 $order_status = $wait_for_confirmation_status;
                                 $order_status_name = lang('wait_for_confirmation');
                                 $data['note'] = $order->note . ";ebay note:" . $ebay_order->buyercheckoutmessage;
                             }
                             if (($order->contact_phone_number == '' || empty($order->contact_phone_number)) && $ebay_order->phone != '') {
                                 $data['contact_phone_number'] = $ebay_order->phone;
                             }
                             if (($order->buyer_id == '' || empty($order->buyer_id)) && $ebay_order->buyer_id != '') {
                                 $data['buyer_id'] = $ebay_order->buyer_id;
                             }
                             $data['created_at'] = $ebay_order->order_created_date;
                             $data['ebay_id'] = $ebay_order->ebay_id;
                             $data['domain'] = $ebay_order->ebay_id;
                         }
                     }
                     /*end*/
                     /*sku 不 存在的需要客服确认*/
                     foreach (explode(',', $value['sku_str']) as $sku) {
                         if (!$this->product_model->fetch_product_id(strtoupper($sku))) {
                             $order_status = $wait_for_confirmation_status;
                             $order_status_name = lang('wait_for_confirmation');
                         }
                     }
                     $data['order_status'] = $order_status;
                     if ($key != $shipping_code) {
                         $data['is_register'] = $key;
                         $data['item_no'] = change_item_register($order->item_no, $shipping_code, $key);
                     }
                     $data['order_status'] = $order_status;
                     if ($order_status == $wait_for_purchase_status) {
                         $data['check_date'] = get_current_time();
                         $data['check_user'] = $order->input_user;
                         $data['bursary_check_date'] = get_current_time();
                         $data['bursary_check_user'] = $order->input_user;
                     }
                     $data['item_title_str'] = $value['item_title_str'];
                     $data['item_id_str'] = $value['item_id_str'];
                     $data['sku_str'] = $value['sku_str'];
                     $data['qty_str'] = $value['qty_str'];
                     $data['sys_remark'] = $order->sys_remark . ',' . sprintf(lang('handle_remark'), get_current_time(), lang('program'), $order_status_name);
                     $data['profit_rate'] = $profit['profit_rate'];
                     $data['shipping_cost'] = $profit['shipping_cost'];
                     $data['product_cost_all'] = $profit['product_cost'];
                     $data['trade_fee'] = $profit['trade_fee'];
                     $data['listing_fee'] = $profit['listing_fee'];
                     if (empty($order->contact_phone_number)) {
                         $data['contact_phone_number'] = $profit['phone'];
                     }
                     // order role
                     $order_role = $this->_get_order_role($value['sku_str'], $order->to_email);
                     $data['stock_user_id'] = $order_role['stock_user_id'];
                     $data['purchaser_id_str'] = $order_role['purchaser_id_str'];
                     $data['developer_id'] = $order_role['developer_id'];
                     $data['saler_id'] = $order_role['saler_id'];
                     $data['tester_id'] = $order_role['tester_id'];
                     $data['is_duplicated'] = $is_duplicated;
                     $data['address_incorrect'] = $address_different;
                     echo "updating: ", $value['item_title_str'], "\n";
                     var_dump($data);
                     $this->_update_order($order_id, $data);
                     $need_update_ids[] = $order_id;
                     $to_remove_order_id = NULL;
                     $order_log['updated']++;
                 }
             }
         }
         if ($to_remove_order_id) {
             $this->paypal_model->delete_order($to_remove_order_id);
             $order_log['deleted']++;
         }
         $tmp++;
     }
     $message = sprintf(lang('handle_order_log'), $order_log['updated'], $order_log['created'], $order_log['merged'], $order_log['deleted'], $order_log['waiting'], $order_log['duplicated']);
     $data = array('import_date' => date("Y-m-d H:i:s"), 'user_name' => lang('program'), 'descript' => $message, 'user_login' => lang('program'));
     $this->paypal_model->import_log($data);
 }