array(1,10), 'CODE_SOC' => array(11,20), 'NO_CLIENT' => array(31,8), 'N_CDE' => array(39,50), 'NO_COLIS' => array(89,50), 'NO_TRACKING' => array(139,50), 'NO_EXPEDITION' => array(189,50), 'DATE_EXPED' => array(239,8), 'TRANSPORTEUR' => array(247,50), 'CODE_ART' => array(297, 50), 'QTE' => array(347, 10), ); $tab_conversion_carrier = philea_magistor::getTabState(); $socol_to_magistor = array( 'DOM' => 'SOCOLMDSS', 'DOS' => 'SOCOLMDS', 'RDV' => 'SOCOLMRDV', 'CIT' => 'SOCOLCITY', 'BPR' => 'SOCOLMBP', 'CDI' => 'SOCOLMBP', 'A2P' => 'SOCOLMC', 'ACP' => 'SOCOLMBP', ); $mr_to_magistor = array( '24R' => 'MRMDSS', // Point relais 'DRI' => 'MRMDS', // Colis drive 'LD1' => 'MRMRDV', // Domicile RDC (1 pers) 'LDS' => 'MRCITY', // Domicile spé (2 pers) 'HOM' => 'MRMBP', // Domicile spé ); $format = $CRE; if($magistorModule->active) { require_once('connection_ftp.php'); @set_time_limit(0); // Checking for ".bal" files with a "CRE" prefix that has an equivalent ".dat" file and process them... $inFolder = dirname(__FILE__) . '/IN/'; $iterator = new DirectoryIterator($inFolder); $id_order_state = Configuration::get('PHILEA_MAGISTOR_STATUS_CRE'); foreach ($iterator as $fileinfo) { if ($fileinfo->isFile()) { if( preg_match('@^CRE(.*)\.BAL@', $fileinfo->getFilename())) { $datFile = $fileinfo->getPath() . '/' . preg_replace( '@BAL$@', 'DAT', $fileinfo->getFilename() ); if(file_exists($datFile)) { $content = file_get_contents($datFile); $lines = preg_split('@\n@',$content); $id_order_details = array(); $shipping_numbers = array(); $parcel_carrier = array(); if(!empty($lines)) { $details = array(); $order_details = array(); // GET DATA foreach( $lines as $line ) { $data = array(); foreach($format as $field=>$value) { $data[] = substr($line, ($value[0]-1), $value[1]); } if(!isset($data[2]) || (isset($data[2]) && !$data[2])){ continue; } $id_sale = 0; $id_order = (string) $data[3]; if(substr($id_order, 0, 2) == 'OP') { $id_order = explode('-', $id_order); if(count($id_order) < 2) { continue; } $id_sale = (int) str_replace('OP', '', $id_order[0]); $id_order = (int) $id_order[1]; } else { $id_order = (int) $id_order; } if(!isset($details[(int)$id_order])){ $details[(int)$id_order] = array(); } $code_art = explode("_", trim($data[9])); if(count($code_art)>1) { list($id_product, $id_attribute) = $code_art; } else { $id_product = $code_art[0]; $id_attribute = 0; } $order = new Order((int) $id_order); // GET CARRIER ID $carrier_found = false; $id_active_carrier = false; $id_inactive_carrier = false; if (isset($data[8]) && $data[8]){ $carrier_name = trim($data[8]); if($carrier_name == 'COLINT') { $carrier_name = 'SOCOLMDSS'; } $carriers = philea_magistor::getCarriersIdByRef($carrier_name); if ($carriers){ foreach ($carriers as $carrier) { if ($carrier['name'] == 'GLS' && $carrier_name == 'DPD') { continue; } if ($carrier['active'] == 1 && $carrier['deleted'] == 0) { $id_active_carrier = (int) $carrier['id_carrier']; } if ($carrier['active'] == 0 && $carrier['deleted'] == 0) { $id_inactive_carrier = (int) $carrier['id_carrier']; } if ((int) $order->id_carrier == (int) $carrier['id_carrier']){ $carrier_found = (int) $order->id_carrier; } } } } if ($carrier_found) $id_carrier = (int) $carrier_found; elseif ($id_active_carrier) $id_carrier = (int) $id_active_carrier; elseif ($id_inactive_carrier) $id_carrier = (int) $id_inactive_carrier; else $id_carrier = (int) $order->id_carrier; if(isset($id_carrier) && $id_carrier) { $parcel_carrier[(int) $id_order.'|'.trim($data[5])] = $id_carrier; } $shipping_numbers[] = '"'.pSQL(trim($data[5])).'"'; if(!isset($details[(int)$id_order][$id_product.'_'.$id_attribute])) { $details[(int)$id_order][$id_product.'_'.$id_attribute] = array( 'shipping_numbers' => array(), 'quantity' => 0 ); } $details[(int)$id_order][$id_product.'_'.$id_attribute]['quantity'] += (int) trim($data[10]); $details[(int)$id_order][$id_product.'_'.$id_attribute]['shipping_numbers'][] = array( 'number' => trim($data[5]), 'date' => pSQL(substr($data[7], 0, 4).'-'.substr($data[7], 4, 2).'-'.substr($data[7], 6, 2).' 18:00:00'), 'quantity' => (int) trim($data[10]) ); if(!isset($order_details[(int)$id_order])){ $order_details[(int)$id_order] = array(); foreach(Db::getInstance()->ExecuteS(' SELECT DISTINCT `id_order_detail`, `product_id`, `product_attribute_id`, `product_quantity` - GREATEST(`product_quantity_return`, `product_quantity_refunded`) AS `quantity` FROM `'._DB_PREFIX_.'order_detail` WHERE `id_order` = '.(int) $id_order.' ') as $key => $row) { $sent = (int) Db::getInstance()->getValue(' SELECT SUM(`quantity`) FROM `'._DB_PREFIX_.'philea_parcel` WHERE `id_order_detail` = '.(int) $row['id_order_detail'].' '); $id_order_details[] = (int) $row['id_order_detail']; if(Pack::isPack((int)$row['product_id'])) { $items = Pack::getSimplePack($row['product_id']); foreach($items as $item) { if(!isset($order_details[(int)$id_order][$item['id_product_item'].'_0'])) { $order_details[(int)$id_order][$item['id_product_item'].'_0'] = array( 'id_order_details' => array(), 'quantity_to_sent' => 0 ); } $order_details[$id_order][$item['id_product_item'].'_0']['quantity_to_sent'] += (($row['quantity'] - $sent) * $item['quantity']); $order_details[$id_order][$item['id_product_item'].'_0']['id_order_details'][$row['id_order_detail']] = array( 'detail_quantity' => ($row['quantity'] - $sent), 'id_order_detail' => $row['id_order_detail'] ); } } else { if(!isset($order_details[(int)$id_order][$row['product_id'].'_'.$row['product_attribute_id']])) { $order_details[(int)$id_order][$row['product_id'].'_'.$row['product_attribute_id']] = array( 'id_order_details' => array(), 'quantity_to_sent' => 0 ); } $order_details[(int)$id_order][$row['product_id'].'_'.$row['product_attribute_id']]['quantity_to_sent'] += ($row['quantity'] - $sent); $order_details[(int)$id_order][$row['product_id'].'_'.$row['product_attribute_id']]['id_order_details'][$row['id_order_detail']] = array( 'detail_quantity' => ($row['quantity'] - $sent), 'id_order_detail' => $row['id_order_detail'] ); } } } } // end foreach lines foreach($order_details as $order => $order_detail){ foreach ($order_detail as $key => $product) { if(isset($details[(int)$order][$key])) { if($details[(int)$order][$key]['quantity'] <= $product['quantity_to_sent']) { if(count($details[(int)$order][$key]['shipping_numbers'])>1) { foreach($details[(int)$order][$key]['shipping_numbers'] as $shipping_number) { foreach($product['id_order_details'] as $id_order_detail => $row) { Db::getInstance()->ExecuteS(' INSERT INTO `'._DB_PREFIX_.'philea_parcel` VALUES ( '.(int) $id_order_detail.', '.(int) $row['detail_quantity'].', "'.pSQL(trim($shipping_number['number'])).'", "'.$shipping_number['date'].'" ) '); } } } else { foreach($product['id_order_details'] as $id_order_detail => $row) { Db::getInstance()->ExecuteS(' INSERT INTO `'._DB_PREFIX_.'philea_parcel` VALUES ( '.(int) $id_order_detail.', '.(int) $row['detail_quantity'].', "'.pSQL($details[(int)$order][$key]['shipping_numbers'][0]['number']).'", "'.$details[(int)$order][$key]['shipping_numbers'][0]['date'].'" ) '); } } } else { // $message = "Commande : ".$order."\r\n Produit : ".$key."\r\n Quantity to sent : ".$product['quantity_to_sent']."\r\n Quantity : ".$details[(int)$order][$key]['quantity']; // mail('marion@antadis.com', '[BBB] Erreurs quantity expe Philea', $message); } } else { // $message = "Commande : ".$order."\r\n Produit : ".$key."\r\n Produit non présent dans le fichier expe philea"; // mail('marion@antadis.com', '[BBB] Erreurs produit expe Philea', $message); } } } unset($details); unset($order_details); } // end if lines $id_order_details = array_unique($id_order_details); $shipping_numbers = array_unique($shipping_numbers); if(count($id_order_details) > 0) { $id_orders = array(); $orders_infos = array(); foreach(Db::getInstance()->ExecuteS(' SELECT d.`id_order`, p.`shipping_number`, p.`date_add` FROM `'._DB_PREFIX_.'philea_parcel` p LEFT JOIN `'._DB_PREFIX_.'order_detail` d ON (p.`id_order_detail` = d.`id_order_detail`) WHERE d.`id_order_detail` IN ('.implode(', ', $id_order_details).') AND p.`shipping_number` IN ('.implode(', ', $shipping_numbers).') GROUP BY d.`id_order`, p.`shipping_number` ') as $row) { Db::getInstance()->ExecuteS(' INSERT INTO `'._DB_PREFIX_.'shipping_history` VALUES ( '.(int) $row['id_order'].', "'.pSQL($row['shipping_number']).'", "'.pSQL($row['date_add']).'", '.(int) $parcel_carrier[(int) $row['id_order'].'|'.$row['shipping_number']].', 0 ) '); $id_orders[] = (int) $row['id_order']; if(!isset($orders_infos[(int) $row['id_order']])) { $orders_infos[(int) $row['id_order']] = array(); } $orders_infos[(int) $row['id_order']][] = array($row['shipping_number'], $row['date_add'], (int) $parcel_carrier[(int) $row['id_order'].'|'.$row['shipping_number']]); } $id_orders = array_unique($id_orders); $products = Db::getInstance()->ExecuteS(' SELECT d.`id_order_detail`, d.`id_order`, c.`id_sale`, d.`product_quantity` - GREATEST(d.`product_quantity_refunded`, d.`product_quantity_return`) AS `quantity` FROM ps_order_detail d LEFT JOIN `'._DB_PREFIX_.'product_ps_cache` c ON (d.`product_id` = c.`id_product`) WHERE d.`id_order` IN ('.implode(', ', $id_orders).') '); $sent_sales = array(); foreach(Db::getInstance()->ExecuteS(' SELECT `id_order`, `id_sale` FROM `'._DB_PREFIX_.'shipping_history` WHERE `id_order` IN ('.implode(', ', $id_orders).') AND `id_sale` != 0 GROUP BY `id_order`, `id_sale` ') as $row) { if(!isset($sent_sales[(int) $row['id_order']])) { $sent_sales[(int) $row['id_order']] = array(); } $sent_sales[(int) $row['id_order']][] = (int) $row['id_sale']; } $to_send = array(); foreach($products as $product) { if ((int) $product['quantity'] > 0 && (!isset($sent_sales[(int) $product['id_order']]) || !in_array((int) $product['id_sale'], $sent_sales[(int) $product['id_order']]))) { $to_send[] = $product; } } unset($products); $sent_products = array(); foreach(Db::getInstance()->ExecuteS(' SELECT l.`id_order_detail`, SUM(l.`quantity`) AS `quantity` FROM `'._DB_PREFIX_.'lapostews` l LEFT JOIN `'._DB_PREFIX_.'order_detail` d ON (l.`id_order_detail` = d.`id_order_detail`) WHERE d.`id_order` IN ('.implode(', ', $id_orders).') GROUP BY l.`id_order_detail` ') as $row) { $sent_products[(int) $row['id_order_detail']] = (int) $row['quantity']; } foreach(Db::getInstance()->ExecuteS(' SELECT l.`id_order_detail`, SUM(l.`quantity`) AS `quantity` FROM `'._DB_PREFIX_.'mondialrelay_parcel` l LEFT JOIN `'._DB_PREFIX_.'order_detail` d ON (l.`id_order_detail` = d.`id_order_detail`) WHERE d.`id_order` IN ('.implode(', ', $id_orders).') GROUP BY l.`id_order_detail` ') as $row) { $sent_products[(int) $row['id_order_detail']] = (int) $row['quantity']; } foreach(Db::getInstance()->ExecuteS(' SELECT l.`id_order_detail`, SUM(l.`quantity`) AS `quantity` FROM `'._DB_PREFIX_.'philea_parcel` l LEFT JOIN `'._DB_PREFIX_.'order_detail` d ON (l.`id_order_detail` = d.`id_order_detail`) WHERE d.`id_order` IN ('.implode(', ', $id_orders).') GROUP BY l.`id_order_detail` ') as $row) { $sent_products[(int) $row['id_order_detail']] = (int) $row['quantity']; } foreach(Db::getInstance()->ExecuteS(' SELECT l.`id_order_detail`, SUM(l.`quantity`) AS `quantity` FROM `'._DB_PREFIX_.'ant_dropshipping_parcel` l LEFT JOIN `'._DB_PREFIX_.'order_detail` d ON (l.`id_order_detail` = d.`id_order_detail`) WHERE d.`id_order` IN ('.implode(', ', $id_orders).') GROUP BY l.`id_order_detail` ') as $row) { $sent_products[(int) $row['id_order_detail']] = (int) $row['quantity']; } $orders_to_send = array(); $orders_list = array(); $total = count($to_send); foreach($to_send as $product) { if(!in_array((int) $product['id_order'], $orders_list)) { $orders_list[] = (int) $product['id_order']; } if(!in_array((int) $product['id_order'], $orders_to_send)) { if(!isset($sent_products[(int) $product['id_order_detail']]) || $product['quantity'] > $sent_products[(int) $product['id_order_detail']]) { $orders_to_send[] = (int) $product['id_order']; } } } unset($sent_products); unset($to_send); $orders_sent = array(); foreach($orders_list as $order) { if(!in_array($order, $orders_to_send)) { $orders_sent[] = $order; } } unset($orders_list); $status_sent = array(); $status_partially_sent = array(); foreach($orders_sent as $order) { if((int) Db::getInstance()->getValue(' SELECT `id_order_state` FROM `'._DB_PREFIX_.'order_history` WHERE `id_order` = '.(int) $order.' ORDER BY `date_add` DESC LIMIT 1 ') != 4) { $status_sent[] = (int) $order; } } foreach($id_orders as $order) { if(!in_array($order, $status_sent)) { if(!in_array((int) Db::getInstance()->getValue(' SELECT `id_order_state` FROM `'._DB_PREFIX_.'order_history` WHERE `id_order` = '.(int) $order.' ORDER BY `date_add` DESC LIMIT 1 '), array(4, 17, 9, 19))) { $status_partially_sent[] = (int) $order; } } } unset($orders_sent); unset($orders_to_send); foreach($orders_infos as $id_order => $parcels) { $order = new Order($id_order); $customer = new Customer((int) $order->id_customer); foreach($parcels as $parcel) { $products_sent = ''; $products_names = array(); foreach(Db::getInstance()->ExecuteS(' SELECT d.`id_order_detail`, d.`product_name`, SUM(p.`quantity`) AS `quantity` FROM `'._DB_PREFIX_.'philea_parcel` p LEFT JOIN `'._DB_PREFIX_.'order_detail` d ON (p.`id_order_detail` = d.`id_order_detail`) WHERE d.`id_order` = '.(int) $id_order.' AND p.`shipping_number` = "'.pSQL($parcel[0]).'" AND p.`date_add` = "'.pSQL($parcel[1]).'" GROUP BY d.`id_order_detail` ') as $p) { $products_sent .= '
'."\r\n".$p['quantity'].' x '.$p['product_name']; } $carrier = new Carrier($parcel[2], (int) $order->id_lang); if((int) $order->id_lang == 3) { if(preg_match('/colissimo/i', $carrier->name)) { $carrier->url .= '&language=es_ES'; } $content_html = 'Contenido del paquete:'; $content_txt = 'Contenido del paquete:'; } else { $content_html = 'Contenu du colis :'; $content_txt = 'Contenu du colis :'; } $templateVars = array( '{followup}' => str_replace('@', $parcel[0], $carrier->url), '{firstname}' => $customer->firstname, '{lastname}' => $customer->lastname, '{id_order}' => (int) $order->id, '{product_list}' => !empty($products_sent)? $content_html.$products_sent: '', '{product_list_txt}' => !empty($products_sent)? $content_txt.strip_tags($products_sent): '', ); $order->shipping_number = $parcel[0]; $order->update(); $last_state = Db::getInstance()->getValue(' SELECT `id_order_state` FROM `'._DB_PREFIX_.'order_state_current` WHERE `id_order` ='.(int)$order->id ); if(in_array($order->id, $status_sent) && (int)$last_state != 4) { $history = new OrderHistory(); $history->id_order = (int) $order->id; $history->changeIdOrderState(4, (int) $order->id); $history->addWithemail(true, $templateVars); } elseif(in_array($order->id, $status_partially_sent)) { $history = new OrderHistory(); $history->id_order = (int) $order->id; $history->changeIdOrderState(17, (int) $order->id); $history->addWithemail(true, $templateVars); } $subjects = array( 1 => 'Package in transit', 2 => 'Livraison en cours', 3 => 'Pedido en tránsito', ); Mail::Send( intval($order->id_lang), 'in_transit', $subjects[(int) $order->id_lang], $templateVars, $customer->email, $customer->firstname.' '.$customer->lastname ); } } } $repo_archive = './archives/IN/LIVRAISON/'; $repo_paths = array(date('Y'), date('m')); foreach ($repo_paths as $repo_path) { $repo_archive .= $repo_path . '/'; if (!file_exists($repo_archive)) mkdir($repo_archive); } copy($datFile, $repo_archive . preg_replace( '@BAL$@', 'DAT', $fileinfo->getFilename() )); unlink($inFolder.$fileinfo->getFilename()); unlink($datFile); } } } } } echo 'fin';