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; }
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); }