diff --git a/modules/philea_magistor/script/resend_command.php b/modules/philea_magistor/script/resend_command.php new file mode 100644 index 00000000..0e7d4e88 --- /dev/null +++ b/modules/philea_magistor/script/resend_command.php @@ -0,0 +1,456 @@ + 'COLINT', // Livraison internationnale à domicile + 'DOM' => 'SOCOLMDSS', // Livraison à domicile + 'DOS' => 'SOCOLMDS', + 'RDV' => 'SOCOLMRDV', // Livraison sur Rendez-vous + 'CIT' => 'SOCOLCITY', // Livraison en Cityssimo + 'BPR' => 'SOCOLMBP', // Livraison en Bureau de Poste + 'CDI' => 'SOCOLMBP', // Centre de distribution + 'A2P' => 'SOCOLMC', // Livraison Commerce de proximité + 'ACP' => 'SOCOLMBP', // Agence ColiPoste +); + +$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é +); + +if($magistorModule->active) { + global $regex_file_out; + $regex_file_out = '@^CDC02(.*)\.(BAL|DAT)@'; + @set_time_limit(0); + + $db = Db::getInstance(); + $id_order_state = 2; + + $orders = $db->ExecuteS(' + SELECT * FROM `'._DB_PREFIX_.'orders` + WHERE `date_add` > "2017-10-01 00:00:00" + '.(count($include_orders) > 0? 'AND `id_order` IN ('.implode(', ', $include_orders).')': '').' + '); + + if(count($orders) == 0) { + exit; + } + + if((int) Db::getInstance()->getValue(' + SELECT `featured` + FROM `'._DB_PREFIX_.'privatesale` + WHERE `id_sale` = '.(int) $id_sale.' + ')) { + $code_societe = 78;//(int)(Configuration::get('PHILEA_MAGISTOR_CODE_STE')); + } else { + $code_societe = (int)(Configuration::get('PHILEA_MAGISTOR_CODE_STE')); + } + + $delai_livraison = 2; //(int)(Configuration::get('PHILEA_MAGISTOR_DELAI_LIVRAISON')); + + //@TODO rendre configurable le champs "reference" entre "reference" et "ean13" + $referenceField = 'reference';//Configuration::get('PHILEA_MAGISTOR_REF_FIELD'); + $fileName = dirname(__FILE__) . '/OUT/CDC02' . $dateNow; + + $repo_archive = dirname(__FILE__) . '/archives/OUT/CMD/'; + $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); + } + + $fileArchive = $repo_archive . 'CDC02' . date('ymdHis'); + + $data = ''; + foreach($orders as $o) { + $partialOrder = false; + $order = new Order($o['id_order']); + + $sales = array(); + $sales[(int)$id_sale] = (int) $id_sale; + + // ANTADIS - check if multi and order already sent + // $other_sales = Db::getInstance()->getValue(' + // SELECT COUNT(`id_sale`) + // FROM `'._DB_PREFIX_.'philea_sent` + // WHERE `id_order` = '.(int) $o['id_order'].' + // '); + // if($other_sales > 0){ + // // order already sent to philea + // continue; + // } + + $products = $order->getProducts(); + // ANTADIS + $products_ids = array(); + foreach($products as $product) { + $products_ids[] = (int) $product['product_id']; + } + + $nbProducts = 0; + $nbProducts = (int) Db::getInstance()->getValue(' + SELECT COUNT(d.`id_order_detail`) + FROM `'._DB_PREFIX_.'order_detail` d + LEFT JOIN `'._DB_PREFIX_.'product_ps_cache` c ON d.`product_id` = c.`id_product` + WHERE c.`id_sale` = '.(int) $id_sale.' + AND d.`id_order` = '.(int) $o['id_order'].' + AND d.`product_quantity` - d.`product_quantity_refunded` > 0 + '); + + $prid = false; + $delivery_info = false; + $carrier_value = false; + + if($nbProducts) { + $carriers_socol = array(67,87,88,89); + $carriers_mr = array(91); + + $customer = new Customer($order->id_customer); + $address_invoice = new Address($order->id_address_invoice); + $address_delivery = new Address($order->id_address_delivery); + + if(in_array((int) $order->id_carrier, $carriers_socol)) { + $delivery_info = $db->getRow(' + SELECT * + FROM `'._DB_PREFIX_.'socolissimo_delivery_info` + WHERE `id_cart` = '.(int) $order->id_cart.' + AND `delivery_mode` != "" + '); + /* SOCOL */ + if($delivery_info) { + if($delivery_info['cecountry'] != 'FR') { + $carrier_value = $socol_to_magistor['DOMINTER']; + } else { + $carrier_value = $socol_to_magistor[$delivery_info['delivery_mode']]; + } + $prid = $delivery_info['prid']; + } + } elseif(in_array((int) $order->id_carrier, $carriers_mr)) { + /* MONDIAL RELAY */ + $delivery_info = $db->getRow(' + SELECT mr_m.`col_mode`, mr_m.`dlv_mode`, mr_s.* + FROM `'._DB_PREFIX_.'mr_selected` mr_s + LEFT JOIN `'._DB_PREFIX_.'mr_method` mr_m ON (mr_m.`id_mr_method` = mr_s.`id_method`) + WHERE mr_s.`id_cart` = '.(int) $order->id_cart.' + AND mr_m.`id_carrier` = '.(int) $order->id_carrier.' + AND `MR_Selected_Num` IS NOT NULL + '); + if($delivery_info) { + $carrier_value = $mr_to_magistor[$delivery_info['dlv_mode']]; + $prid = substr($delivery_info['MR_Selected_Num'], -5); + } + } + + + if(!$carrier_value) { + if((int)$address_delivery->id_country == 8) { + $carrier_value = $tab_conversion_carrier[$order->id_carrier.':']; + } else { + $carrier_value = $socol_to_magistor['DOMINTER']; + } + } + + ## ASSIGN DATA + $data .= str_pad( 'E01', 10, ' ', STR_PAD_RIGHT ); + $data .= str_pad( $code_societe, 20, ' ', STR_PAD_RIGHT ); + $data .= str_pad( 'OP'.(int) $id_sale.'-'.$order->id, 50, ' ', STR_PAD_RIGHT ); + $data .= str_pad( $order->id_customer, 8, ' ', STR_PAD_RIGHT ); + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT ); + $data .= str_pad( date('Ymd',strtotime($order->date_add)+86400*$delai_livraison), 8, '0', STR_PAD_LEFT ); + $data .= str_pad( '', 4, '0', STR_PAD_LEFT ); + $data .= str_pad( $carrier_value , 50, ' ', STR_PAD_RIGHT );//$db->getValue('SELECT name FROM `'._DB_PREFIX_.'carrier` WHERE id_carrier = '.$order->id_carrier) + $data .= str_pad( substr(utf8_decode(cleanChar($address_invoice->firstname.' '.$address_invoice->lastname)),0,50), 50, ' ', STR_PAD_RIGHT ); + if(in_array((int) $order->id_carrier, $carriers_mr) + && $delivery_info + && !in_array($delivery_info['dlv_mode'], array('LD1', 'LDS', 'HOM')) + ) { + // no company name for a delivery in relay point + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT ); + } else { + $data .= str_pad( substr(utf8_decode(cleanChar($address_invoice->company)),0,50), 50, ' ', STR_PAD_RIGHT ); + } + $data .= str_pad( substr(utf8_decode(cleanChar($address_invoice->address1)),0,50), 50, ' ', STR_PAD_RIGHT ); + $data .= str_pad( substr(utf8_decode(cleanChar($address_invoice->address2)),0,50), 50, ' ', STR_PAD_RIGHT ); + $data .= str_pad( substr(utf8_decode(cleanChar($address_invoice->other)),0,50), 50, ' ', STR_PAD_RIGHT ); + $data .= str_pad( substr(utf8_decode($address_invoice->postcode),0,8), 8, ' ', STR_PAD_RIGHT ); + $data .= str_pad( substr(utf8_decode($address_invoice->city),0,50), 50, ' ', STR_PAD_RIGHT ); + $data .= str_pad( utf8_decode($db->getValue('SELECT iso_code FROM `'._DB_PREFIX_.'country` WHERE id_country = '.$address_invoice->id_country)), 50, ' ', STR_PAD_RIGHT ); + $data .= str_pad( (!empty($address_invoice->phone_mobile)?$address_invoice->phone_mobile:$address_invoice->phone), 50, ' ', STR_PAD_RIGHT ); + $data .= str_pad( substr(utf8_decode($customer->email), 0, 50), 50, ' ', STR_PAD_RIGHT ); + + // LIVRAISON DOMICILE SOCOL + if(in_array((int) $order->id_carrier, $carriers_socol) + && $delivery_info + && $delivery_info['delivery_mode'] == 'DOM' + ) { + $data .= str_pad(substr(utf8_decode(cleanChar($address_delivery->lastname)), 0, 50), 50, ' ', STR_PAD_RIGHT); + $data .= str_pad(substr(utf8_decode(cleanChar($address_invoice->firstname.' '.$address_invoice->lastname)), 0, 50), 50, ' ', STR_PAD_RIGHT); + } + // LIVRAISON DOMICILE MONDIAL RELAY + elseif(in_array((int) $order->id_carrier, $carriers_mr) + && $delivery_info + && in_array($delivery_info['dlv_mode'], array('LD1', 'LDS', 'HOM')) + ) { + $data .= str_pad(substr(utf8_decode(cleanChar($address_delivery->lastname)), 0, 50), 50, ' ', STR_PAD_RIGHT); + $data .= str_pad(substr(utf8_decode(cleanChar($address_invoice->firstname.' '.$address_invoice->lastname)), 0, 50), 50, ' ', STR_PAD_RIGHT); + } + // LIVRAISON MR (NO DOMICILE) + elseif(in_array((int) $order->id_carrier, $carriers_mr) + && $delivery_info + && !in_array($delivery_info['dlv_mode'], array('LD1', 'LDS', 'HOM')) + ) { + $data .= str_pad(substr(utf8_decode(cleanChar($address_delivery->firstname.' '.$address_delivery->lastname)), 0, 50), 50, ' ', STR_PAD_RIGHT); + // no company name for a delivery in relay point + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT ); + } + else { + $data .= str_pad(substr(utf8_decode(cleanChar($address_delivery->firstname.' '.$address_delivery->lastname)), 0, 50), 50, ' ', STR_PAD_RIGHT); + $data .= str_pad(substr(utf8_decode(cleanChar($address_delivery->company)), 0, 50), 50, ' ', STR_PAD_RIGHT); + } + + $data .= str_pad(substr(utf8_decode(cleanChar($address_delivery->address1)), 0, 50), 50, ' ', STR_PAD_RIGHT); + $data .= str_pad(substr(utf8_decode(cleanChar($address_delivery->address2)), 0, 50), 50, ' ', STR_PAD_RIGHT); + $data .= str_pad(substr(utf8_decode(cleanChar($address_delivery->other)),0, 50), 50, ' ', STR_PAD_RIGHT); //ADRESSE 3 + $data .= str_pad(substr(utf8_decode($address_delivery->postcode), 0, 8), 8, ' ', STR_PAD_RIGHT); + $data .= str_pad(substr(utf8_decode($address_delivery->city), 0, 50), 50, ' ', STR_PAD_RIGHT); + $data .= str_pad(utf8_decode($db->getValue('SELECT iso_code FROM `'._DB_PREFIX_.'country` WHERE id_country = '.$address_delivery->id_country)), 50, ' ', STR_PAD_RIGHT ); + $data .= str_pad((!empty($address_delivery->phone_mobile)?$address_delivery->phone_mobile:$address_delivery->phone), 50, ' ', STR_PAD_RIGHT ); + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT ); + // LIVRAISON SOCOL + if(in_array((int) $order->id_carrier, $carriers_socol) && $delivery_info) { + if($delivery_info['delivery_mode'] == 'DOM') { + $data .= str_pad(substr(utf8_decode(cleanChar($address_delivery->firstname.' '.$address_delivery->lastname)), 0, 50), 50, ' ', STR_PAD_RIGHT); + $data .= str_pad(substr(utf8_decode(cleanChar($address_delivery->company)), 0, 50), 50, ' ', STR_PAD_RIGHT); + } else { + $data .= str_pad(substr(utf8_decode(cleanChar($address_delivery->lastname)), 0, 50), 50, ' ', STR_PAD_RIGHT); + $data .= str_pad(substr(utf8_decode(cleanChar($address_invoice->firstname.' '.$address_invoice->lastname)), 0, 50), 50, ' ', STR_PAD_RIGHT); + } + $data .= str_pad(substr(utf8_decode(cleanChar($address_delivery->address1)), 0, 50), 50, ' ', STR_PAD_RIGHT); + $data .= str_pad(substr(utf8_decode(cleanChar($address_delivery->address2)), 0, 50), 50, ' ', STR_PAD_RIGHT); + $data .= str_pad(substr(utf8_decode(cleanChar($address_delivery->other)), 0, 50), 50, ' ', STR_PAD_RIGHT); //ADRESSE 3 + $data .= str_pad(substr(utf8_decode($address_delivery->postcode), 0, 8), 8, ' ', STR_PAD_RIGHT); + $data .= str_pad(substr(utf8_decode($address_delivery->city), 0, 50), 50, ' ', STR_PAD_RIGHT); + $data .= str_pad(utf8_decode($db->getValue('SELECT `iso_code` FROM `'._DB_PREFIX_.'country` WHERE `id_country` = '.$address_delivery->id_country)), 50, ' ', STR_PAD_RIGHT); + $data .= str_pad((isset($address_delivery->phone_mobile)?$address_delivery->phone_mobile:$address_delivery->phone), 50, ' ', STR_PAD_RIGHT); + $data .= str_pad('', 50, ' ', STR_PAD_RIGHT); + } + // LIVRAISON MONDIAL RELAY + elseif (in_array((int) $order->id_carrier, $carriers_mr) && $delivery_info) { + // MR DOMICILE + if (in_array($delivery_info['dlv_mode'], array('LD1', 'LDS', 'HOM'))){ + $data .= str_pad( substr(utf8_decode(cleanChar($address_delivery->firstname.' '.$address_delivery->lastname)), 0, 50), 50, ' ', STR_PAD_RIGHT); + $data .= str_pad( substr(utf8_decode(cleanChar($address_delivery->company)), 0, 50), 50, ' ', STR_PAD_RIGHT); + } else { + $data .= str_pad( substr(utf8_decode(cleanChar($address_delivery->lastname)), 0, 50), 50, ' ', STR_PAD_RIGHT); + $data .= str_pad( substr(utf8_decode(cleanChar($address_invoice->firstname.' '.$address_invoice->lastname)), 0, 50), 50, ' ', STR_PAD_RIGHT); + } + $data .= str_pad( substr(utf8_decode($address_delivery->address1),0,50), 50, ' ', STR_PAD_RIGHT ); + $data .= str_pad( substr(utf8_decode($address_delivery->address2),0,50), 50, ' ', STR_PAD_RIGHT ); + $data .= str_pad( substr(utf8_decode(cleanChar($address_delivery->other)),0,50), 50, ' ', STR_PAD_RIGHT );//ADRESSE 3 + $data .= str_pad( substr(utf8_decode($address_delivery->postcode),0,8), 8, ' ', STR_PAD_RIGHT ); + $data .= str_pad( substr(utf8_decode($address_delivery->city),0,50), 50, ' ', STR_PAD_RIGHT ); + $data .= str_pad( utf8_decode($db->getValue('SELECT iso_code FROM `'._DB_PREFIX_.'country` WHERE id_country = '.$address_delivery->id_country)), 50, ' ', STR_PAD_RIGHT ); + $data .= str_pad( (isset($address_delivery->phone_mobile)?$address_delivery->phone_mobile:$address_delivery->phone), 50, ' ', STR_PAD_RIGHT ); + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT ); + } + // LIVRAISON DOMICILE + else{ + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT); + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT); + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT); + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT); + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT);//ADRESSE 3 + $data .= str_pad( '', 8, ' ', STR_PAD_RIGHT); + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT); + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT); + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT); + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT); + } + + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT); // INFO_RELAIS_1 + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT); // INFO_RELAIS_2 + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT); // INFO_RELAIS_3 + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT); // INFO_RELAIS_4 + $data .= str_pad($prid? $prid: '', 50, ' ', STR_PAD_RIGHT); // INFO_RELAIS_5 + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT); // INFO_RELAIS_6 + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT); // INFO_RELAIS_7 + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT); // INFO_RELAIS_8 + + if(Configuration::get('PHILEA_MAGISTOR_ASSURANCE') + && Configuration::get('PHILEA_MAGISTOR_ASSURANCE') <= ($order->total_paid_real - $order->total_shipping) + && Configuration::get('PHILEA_MAGISTOR_ASSURANCE') > 0 + ) { + $data .= str_pad( str_replace('.',',',($order->total_paid_real - $order->total_shipping)), 50, ' ', STR_PAD_RIGHT ); // VALEUR DE COMMANDE + } else { + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT ); // VALEUR DE COMMANDE + } + $data .= str_pad( '', 50, ' ', STR_PAD_RIGHT );// ZONE_10 + $data .= str_pad(utf8_decode(cleanChar($address_delivery->other)), 400, ' ', STR_PAD_RIGHT ); + $data .= PHP_EOL; + $products = $order->getProducts(); + + $nb_ligne = 0; + $product_packs = array(); + $product_rows = array(); + foreach($products as $product) + { + if(!empty($product_restrictions) && !in_array($product['product_id'],$product_restrictions) ){ + continue; + } + if(!Db::getInstance()->getRow(' + SELECT `id_product` + FROM `'._DB_PREFIX_.'product_ps_cache` + WHERE `id_sale` = '.(int) $id_sale.' + AND `id_product` = '.(int) $product['product_id'].' + ')) { + $other_sale_id = Db::getInstance()->getValue(' + SELECT `id_sale` + FROM `'._DB_PREFIX_.'product_ps_cache` + WHERE `id_product` = '.(int) $product['product_id'].' + '); + $sales[(int)$other_sale_id] = (int)$other_sale_id; + } + /** + * @Override get pack items + */ + if(Pack::isPack((int)$product['product_id'])) { + $pack_items = Pack::getCompleteSimplePack((int) $product['product_id']); + foreach ($pack_items as $pack_item) { + $ean = !empty($pack_item['ean13'])? $pack_item['ean13']: $pack_item['supplier_reference']; + $ref = $pack_item['id_product']; + + $p_key = $pack_item['id_product']; + if (!isset($product_rows[$p_key])) { + $product_rows[$p_key] = array( + str_replace(array("\r", "\n"), '', $ref), + 0, + substr(utf8_decode(cleanChar($pack_item['name'])),0,50), + substr(str_replace(array("\r", "\n"), "", $ean),0,14) + ); + } + $product_rows[$p_key][1] += (max($product['product_quantity'] - max($product['product_quantity_return'], $product['product_quantity_refunded']), 0) * $pack_item['pack_quantity']); + } + } else { + $ean = !empty($product['product_ean13'])? $product['product_ean13']: $product['product_supplier_reference']; + $ref = ($product['product_attribute_id']?$product['product_id'].'_'.$product['product_attribute_id']:$product['product_id']); + + $p_key = ($product['product_attribute_id']?$product['product_id'].'_'.$product['product_attribute_id']:$product['product_id']); + if (!isset($product_rows[$p_key])) { + $product_rows[$p_key] = array( + str_replace(array("\r", "\n"), '', $ref), + 0, + substr(utf8_decode(cleanChar($product['product_name'])),0,50), + substr(str_replace(array("\r", "\n"), "", $ean),0,14), + ); + } + $product_rows[$p_key][1] += max($product['product_quantity'] - max($product['product_quantity_return'], $product['product_quantity_refunded']), 0); + } + } + + // Add products to data + $nb_ligne = 0; + foreach ($product_rows as $p_key => $product) { + $nb_ligne++; + + $data .= str_pad('L01', 10, ' ', STR_PAD_RIGHT); + $data .= str_pad('OP'.(int) $id_sale.'-'.$order->id, 50, ' ', STR_PAD_RIGHT); + $data .= str_pad($nb_ligne, 4, '0', STR_PAD_LEFT); + $data .= str_pad($product[0], 50, ' ', STR_PAD_RIGHT); // ref + $data .= str_pad($product[1], 8, '0', STR_PAD_LEFT); // quantity + $data .= str_pad($product[2], 50, ' ', STR_PAD_RIGHT); // product name + $data .= str_pad($product[3], 14, ' ', STR_PAD_LEFT); // ean + $data .= PHP_EOL; + } + + foreach ($sales as $key => $sale_id) { + $already_existing = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'philea_sent` WHERE `id_order` = '.(int)$order->id.' AND `id_sale` = '.(int)$sale_id); + if($already_existing) { + Db::getInstance()->ExecuteS(' + UPDATE INTO `'._DB_PREFIX_.'philea_sent` + SET `date_add` = NOW() + WHERE `id_order` = '.(int) $order->id.' AND `id_sale` = '.(int) $sale_id.' + '); + } else { + Db::getInstance()->ExecuteS(' + INSERT INTO `'._DB_PREFIX_.'philea_sent` + VALUES ( + '.(int) $order->id.', + '.(int) $sale_id.', + NOW() + ) + '); + } + } + // if(count($sales)>1) { + // $multi[] = (int) $order->id; + // } + } //End if nbproducts + }//End foreach + + + if($orders and is_array($orders)) + { + $file = 'CDC02'.$dateNow.'.DAT'; + Db::getInstance()->Execute(' + INSERT INTO `'._DB_PREFIX_.'philea_syncreport` (`id_sale`, `filename`, `date_add`) + VALUES ( + '.(int)$id_sale.', + "'.pSQL($file).'", + NOW() + ) + '); + file_put_contents($fileName . '.DAT', "\xEF\xBB\xBF".utf8_encode($data)); + file_put_contents($fileName . '.BAL', ''); + + file_put_contents($fileArchive . '.DAT', "\xEF\xBB\xBF".utf8_encode($data)); + + require_once('connection_ftp.php'); + } + +} + +function cleanChar($string) { + $unicode_0 = json_decode('"\u0006"'); + $unicode_1 = json_decode('"\u200b"'); + + $string = str_replace("\r\n",' ',$string); + $string = str_replace("\r",' ',$string); + $string = str_replace("\r",' ',$string); + $string = str_replace("\n",' ',$string); + $string = str_replace("\n",' ',$string); + $string = str_replace(array('®', '©', '™'), array('', '' ,''), $string); + $string = str_replace( + array('"', 'ľ', '°', 'º', 'ª', 'Á', '°', 'º', 'º', 'º', 'ª', "\t", "\n", "\r", ' ', '–', '', $unicode_0, $unicode_1, '«', '»',), + array('', 'l\'', '.', '.', '.', 'A', '', '', '', '', 'a', ' ', ' ', ' ', ' ', '-', '', '', '', '', '',), + $string + ); + return str_replace(array('°', 'º', 'ª', '&', ';'), '', $string); +} \ No newline at end of file diff --git a/modules/philea_magistor/script/test_recept_expedition.php b/modules/philea_magistor/script/test_recept_expedition.php new file mode 100644 index 00000000..4112b013 --- /dev/null +++ b/modules/philea_magistor/script/test_recept_expedition.php @@ -0,0 +1,575 @@ + 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_TEST/'; + + $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; + } + + // Test + if ($id_sale == 0 || $id_sale != 9007) { + $unknownO[] = $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 (in_array($order, $unknownO)) { + + if (! isset($badOrder)) { + $badOrder = 0; + } + + if ($details[(int) $order][$key]['quantity'] > $product['quantity_to_sent']) { + $badOrder ++; + echo $order . ' - ' . $badOrder . ' : ' . $details[(int) $order][$key]['quantity'] . ' <= ' . $product['quantity_to_sent'] . "\n"; + // $details[(int)$order][$key]['quantity'] = $product['quantity_to_sent']; + print_r($details[(int) $order][$key]['shipping_numbers']); + } + + // Traitement commande non envoyée + 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'] . '" + ) + '); + } + } + } + + // Partially sent + 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'; \ No newline at end of file