diff --git a/adm/helpers/HelperFormBootstrap.php b/adm/helpers/HelperFormBootstrap.php index 6fbc9f53..b76dfe06 100644 --- a/adm/helpers/HelperFormBootstrap.php +++ b/adm/helpers/HelperFormBootstrap.php @@ -817,13 +817,14 @@ class HelperFormBootstrap{ public function inputCheckbox($p = array()){ $checked = ((isset($p['checked']) && $p['checked']) ? $p['checked'] : false); - if ($this->_object) + if ($this->_object) { $checked = $this->_object->{$p['name']}; - $this->_html .= ''.$p['label'].' -
- - ' . (isset($p['text']) && $p['text'] ? '' : '') . ' -
+ } + $this->_html .=' +
+ ' . (isset($p['text']) && $p['text'] ? ' ' : '') . ' ' . ((isset($p['hint']) && $p['hint']) ? '

'.$p['hint'].'

' : '') . ' ' . ((isset($p['html']) && $p['html']) ? $p['html'] : '') . '
diff --git a/modules/ant_wp/AdminAntWp.php b/modules/ant_wp/AdminAntWp.php index 8377bd3c..07ce7b22 100644 --- a/modules/ant_wp/AdminAntWp.php +++ b/modules/ant_wp/AdminAntWp.php @@ -104,7 +104,7 @@ class AdminAntWp extends AdminTab $filename = Tools::getValue('filename')?'WP-Vente '.Tools::getValue('filename'):'WP-Vente'; $marque = Tools::getValue('filename')?Tools::getValue('filename'):'Marque'; $params = array('marque' => $marque, 'filename' => $filename, 'lines' => array()); - + $debug = (Tools::getValue('debug') !== false); $f = fopen($_FILES['csvfile']['tmp_name'], 'r'); fgetcsv($f, 0, ';'); $products = array(); @@ -113,6 +113,7 @@ class AdminAntWp extends AdminTab $callStartTime = microtime(true); $refs = array(); $eans = array(); + $refs_ean = array(); while($line = fgetcsv($f, 0, ';')) { if($line[0] == '' && $line[1] == '') { continue; @@ -122,48 +123,60 @@ class AdminAntWp extends AdminTab if(!isset($products[$ean])){ $products[$ean] = array( 'ean' => $ean, - 'supplier_ref' => trim((String)utf8_encode($line[1])), - 'name_ha' => trim((String)utf8_encode($line[2])), + 'supplier_ref' => trim(utf8_encode($line[1])), + 'name_ha' => trim(utf8_encode($line[2])), 'quantity' => trim($line[3]), 'ppc' => trim((float)$line[4]), 'prix_ha' => trim((float)$line[5]), 'name_attribute_ha' => trim((String)$line[6]) ); + $eans[] = $ean; }else{ - //as the product is using a duplicated EAN we add it by ref - $ref = trim((String)utf8_encode($line[1])); - if(!isset($products[$ref])) { - $products[$ref] = array( + //as the product is using a duplicated EAN we add it by ean¤ref + $ean = trim($line[0]); + $ref = trim(utf8_encode($line[1])); + $key_ean_ref = $ean . '¤' . $ref; + //we need to clean the old ean entry to add the ref + if(isset($products[$ean]) && $products[$ean]['supplier_ref'] != ''){ + $products[$ean . '¤' . $products[$ean]['supplier_ref']] = $products[$ean]; + $refs_ean[] = $ean . '¤' . $products[$ean]['supplier_ref']; + unset($products[$ean]); + $ean_array_key = array_search($ean,$eans,true); + if($ean_array_key !== false){ + unset($eans[$ean_array_key]); + } + } + if(!isset($products[$key_ean_ref])) { + $products[$key_ean_ref] = array( 'ean' => trim($line[0]), 'supplier_ref' => $ref, - 'name_ha' => trim((String)utf8_encode($line[2])), + 'name_ha' => trim(utf8_encode($line[2])), 'quantity' => trim($line[3]), 'ppc' => trim((float)$line[4]), 'prix_ha' => trim((float)$line[5]), - 'name_attribute_ha' => trim((String)utf8_encode($line[6])) + 'name_attribute_ha' => trim(utf8_encode($line[6])) ); + $refs_ean[] = $key_ean_ref; }else{ - $this->report[self::DUPLICATED_REFS_AND_EAN][] = $ean . "-" . $ref; + $this->report[self::DUPLICATED_REFS_AND_EAN][] = $key_ean_ref; } - $refs[] = $ref; } - $eans[] = $ean; } else { - $ref = trim((String)utf8_encode($line[1])); + $ref = trim(utf8_encode($line[1])); if(!isset($products[$ref])) { $products[$ref] = array( 'ean' => trim($line[0]), 'supplier_ref' => $ref, - 'name_ha' => trim((String)utf8_encode($line[2])), + 'name_ha' => trim(utf8_encode($line[2])), 'quantity' => trim($line[3]), 'ppc' => trim((float)$line[4]), 'prix_ha' => trim((float)$line[5]), - 'name_attribute_ha' => trim((String)utf8_encode($line[6])) + 'name_attribute_ha' => trim(utf8_encode($line[6])) ); + $refs[] = $ref; }else{ $this->report[self::DUPLICATED_REFS][] = $ref; } - $refs[] = $ref; } } $product_info = array(); @@ -171,6 +184,7 @@ class AdminAntWp extends AdminTab $ids = array(); $exclude_ids = $this->getBraderieProducts(); $timer_table[] = 'Excluded products gathered at '.(microtime(true)-$callStartTime); + $timer_table[] = 'Found by ean '.count($eans).', by ref'.count($refs).', duplicates ean '. count($refs_ean); if(count($eans) > 0) { $sql = ' SELECT p.`id_product`, p.`id_tax_rules_group`, p.`id_category_default`, p.`ean13`, p.`price`, p.`wholesale_price`, @@ -195,19 +209,11 @@ class AdminAntWp extends AdminTab $result = Db::getInstance()->executeS($sql); foreach ($result as $row) { - if($row['ean13'] == '8427077902761'){ - $timer_table[] = json_encode($row); - } if ($row['ean13'] != '' && isset($products[$row['ean13']])) { $products[$row['ean13']] = array_merge($products[$row['ean13']], $row); $product_found++; $ids[] = (int)$row['id_product']; } - // elseif($row['supplier_reference']!='' && isset($products[$row['supplier_reference']])){ - // $products[$row['supplier_reference']] = array_merge($products[$row['supplier_reference']], $row); - // $product_found++; - // $ids[] = (int)$row['id_product']; - // } } } $timer_table[] = 'Ean product gathered at '.(microtime(true)-$callStartTime); @@ -232,11 +238,6 @@ class AdminAntWp extends AdminTab AND p.`id_product` IS NOT NULL ORDER BY c.`position` ') as $row) { - // if($row['ean13']!='' && isset($products[$row['ean13']])){ - // $products[$row['ean13']] = array_merge($products[$row['ean13']], $row); - // $product_found++; - // $ids[] = (int)$row['id_product']; - // } else if ($row['supplier_reference'] != '' && isset($products[$row['supplier_reference']])) { $products[$row['supplier_reference']] = array_merge($products[$row['supplier_reference']], $row); $product_found++; @@ -245,6 +246,42 @@ class AdminAntWp extends AdminTab } } $timer_table[] = 'Ref product gathered at '.(microtime(true)-$callStartTime); + if(count($refs_ean) > 0) { + foreach($refs_ean as $key) { + $result[] = $key; + $sql = ' + SELECT p.`id_product`, p.`id_tax_rules_group`, p.`id_category_default`, p.`ean13`, p.`price`, p.`wholesale_price`, + p.`reference`, p.`supplier_reference`, p.`weight`, p.`height`, p.`width`, p.`depth`, c.`position`, cu.`nc8`, cu.`id_country` + FROM + `' . _DB_PREFIX_ . 'product` p + INNER JOIN ( + SELECT date_add, max(id_product) as maxid + FROM `' . _DB_PREFIX_ . 'product` + WHERE id_product NOT IN (' . implode(',', $exclude_ids) . ') + GROUP BY ean13, supplier_reference + ) as b + ON p.`id_product` = b.maxid + LEFT JOIN `' . _DB_PREFIX_ . 'category_product` c + ON (b.maxid = c.`id_product` AND p.`id_category_default` = c.`id_category`) + LEFT JOIN `' . _DB_PREFIX_ . 'product_customs` cu + ON (cu.`id_product` = p.`id_product`) + WHERE p.`ean13` = "' . explode('¤', $key)[0] . '" AND p.`supplier_reference` = "' . explode('¤', $key)[1] . '" + AND p.`id_product` IS NOT NULL + ORDER BY c.`position` + '; + $result = Db::getInstance()->executeS($sql); + + foreach ($result as $row) { + //$key = $row['ean13'] . '-' . $row['supplier_reference']; + if ($row['ean13'] != '' && $row['supplier_reference'] != '' && isset($products[$key])) { + $products[$key] = array_merge($products[$key], $row); + $product_found++; + $ids[] = (int)$row['id_product']; + } + } + } + } + $timer_table[] = 'Ean-Ref product gathered at '.(microtime(true)-$callStartTime); if(count($eans) > 0) { foreach (Db::getInstance()->executeS(' SELECT p.`id_product`, p.`id_tax_rules_group`, p.`id_category_default`, b.`id_product_attribute`, b.`ean13`, b.`supplier_reference` as at_ref, p.`price`, p.`wholesale_price`, @@ -278,19 +315,6 @@ class AdminAntWp extends AdminTab $ids[] = (int)$row['id_product']; } } - // elseif($row['supplier_reference']!='' && isset($products[$row['supplier_reference']])){ - // $products[$row['supplier_reference']] = array_merge($products[$row['supplier_reference']], $row); - // $product_found++; - // if(!in_array((int)$row['id_product'],$ids)){ - // $ids[] = (int)$row['id_product']; - // } - // } elseif($row['at_ref']!='' && isset($products[$row['at_ref']])){ - // $products[$row['at_ref']] = array_merge($products[$row['at_ref']], $row); - // $product_found++; - // if(!in_array((int)$row['id_product'],$ids)){ - // $ids[] = (int)$row['id_product']; - // } - // } } } $timer_table[] = 'Ean product attr gathered at '.(microtime(true)-$callStartTime); @@ -320,13 +344,6 @@ class AdminAntWp extends AdminTab AND p.`id_product` IS NOT NULL ORDER BY c.`position` ') as $row) { - // if($row['ean13']!='' && isset($products[$row['ean13']])){ - // $products[$row['ean13']] = array_merge($products[$row['ean13']], $row); - // $product_found++; - // if(!in_array((int)$row['id_product'],$ids)){ - // $ids[] = (int)$row['id_product']; - // } - // } if ($row['at_ref'] != '' && isset($products[$row['at_ref']])) { $products[$row['at_ref']] = array_merge($products[$row['at_ref']], $row); $product_found++; @@ -343,6 +360,47 @@ class AdminAntWp extends AdminTab } } $timer_table[] = 'Ref product attr gathered at '.(microtime(true)-$callStartTime); + if(count($refs_ean) > 0) { + foreach($refs_ean as $key){ + $sql = ' + SELECT p.`id_product`, p.`id_tax_rules_group`, p.`id_category_default`, b.`id_product_attribute`, b.`ean13`, b.`supplier_reference` as at_ref, p.`price`, p.`wholesale_price`, + p.`reference`, p.`supplier_reference`, p.`weight`, p.`height`, p.`width`, p.`depth`, c.`position`, cu.`nc8`, cu.`id_country`, + al.`name` as attribute_name + FROM + `' . _DB_PREFIX_ . 'product` p + INNER JOIN ( + SELECT max(id_product) as maxid, ean13, `supplier_reference`, `id_product_attribute` + FROM `' . _DB_PREFIX_ . 'product_attribute` + WHERE id_product NOT IN (' . implode(',', $exclude_ids) . ') + GROUP BY ean13 + ) as b + ON p.`id_product`= b.maxid + LEFT JOIN `' . _DB_PREFIX_ . 'category_product` c + ON (b.maxid = c.`id_product` AND p.`id_category_default` = c.`id_category`) + LEFT JOIN `' . _DB_PREFIX_ . 'product_customs` cu + ON (cu.`id_product` = p.`id_product`) + LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute_combination` ac + ON (ac.`id_product_attribute` = b.`id_product_attribute`) + LEFT JOIN `' . _DB_PREFIX_ . 'attribute_lang` al + ON (al.`id_attribute` = ac.`id_attribute` AND al.`id_lang` = 2) + WHERE b.`ean13` = "'.explode('¤',$key)[0].'" AND b.`supplier_reference` = "' . explode('¤',$key)[1] . '" + AND p.`id_product` IS NOT NULL + ORDER BY c.`position` + '; + + $result = Db::getInstance()->executeS($sql); + foreach ($result as $row) { + if ($row[$key] != '' && isset($products[$key])) { + $products[$key] = array_merge($products[$key], $row); + $product_found++; + if (!in_array((int)$row['id_product'], $ids)) { + $ids[] = (int)$row['id_product']; + } + } + } + } + } + $timer_table[] = 'Ean - Ref product attr gathered at '.(microtime(true)-$callStartTime); $new_products = count($products) - $product_found; if(!empty($ids)){ foreach (Db::getInstance()->executeS(' @@ -353,20 +411,28 @@ class AdminAntWp extends AdminTab AND (pl.id_lang = 2 OR pl.id_lang = 3) ORDER BY p.`id_product` ') as $row) { - if($row['ean13']!='' && isset($products[(int)$row['ean13']])){ - if(!isset($products[$row['ean13']]['lang'])){ + if ($row['ean13'] != '' && isset($products[(int)$row['ean13']])) { + if (!isset($products[$row['ean13']]['lang'])) { $products[$row['ean13']]['lang'] = array(); } - if(!isset($products[$row['ean13']]['lang'][(int)$row['id_lang']])){ + if (!isset($products[$row['ean13']]['lang'][(int)$row['id_lang']])) { $products[$row['ean13']]['lang'][(int)$row['id_lang']] = $row; } - } elseif($row['supplier_reference']!='' && isset($products[$row['supplier_reference']])){ - if(!isset($products[$row['supplier_reference']]['lang'])){ + } elseif ($row['supplier_reference'] != '' && isset($products[$row['supplier_reference']])) { + if (!isset($products[$row['supplier_reference']]['lang'])) { $products[$row['supplier_reference']]['lang'] = array(); } - if(!isset($products[$row['supplier_reference']]['lang'][(int)$row['id_lang']])){ + if (!isset($products[$row['supplier_reference']]['lang'][(int)$row['id_lang']])) { $products[$row['supplier_reference']]['lang'][(int)$row['id_lang']] = $row; } + } elseif ($row['supplier_reference'] != '' && $row['ean13'] != '' && isset($products[$row['ean13'] . '¤' . $row['supplier_reference']])) { + $key = $row['ean13'] . '¤' . $row['supplier_reference']; + if (!isset($products[$key]['lang'])) { + $products[$key]['lang'] = array(); + } + if (!isset($products[$key]['lang'][(int)$row['id_lang']])) { + $products[$key]['lang'][(int)$row['id_lang']] = $row; + } } } $timer_table[] = 'Additional info gathered at '.(microtime(true)-$callStartTime); @@ -379,31 +445,42 @@ class AdminAntWp extends AdminTab AND (pl.id_lang = 2 OR pl.id_lang = 3) ORDER BY p.`id_product` ') as $row) { - if($row['ean13']!='' && isset($products[(int)$row['ean13']])){ - if(!isset($products[$row['ean13']]['lang'])){ + if ($row['ean13'] != '' && isset($products[(int)$row['ean13']])) { + if (!isset($products[$row['ean13']]['lang'])) { $products[$row['ean13']]['lang'] = array(); } - if(!isset($products[$row['ean13']]['lang'][(int)$row['id_lang']])){ + if (!isset($products[$row['ean13']]['lang'][(int)$row['id_lang']])) { $products[$row['ean13']]['lang'][(int)$row['id_lang']] = $row; } - } elseif($row['supplier_reference']!='' && isset($products[$row['supplier_reference']])){ - if(!isset($products[$row['supplier_reference']]['lang'])){ + } elseif ($row['supplier_reference'] != '' && isset($products[$row['supplier_reference']])) { + if (!isset($products[$row['supplier_reference']]['lang'])) { $products[$row['supplier_reference']]['lang'] = array(); } - if(!isset($products[$row['supplier_reference']]['lang'][(int)$row['id_lang']])){ + if (!isset($products[$row['supplier_reference']]['lang'][(int)$row['id_lang']])) { $products[$row['supplier_reference']]['lang'][(int)$row['id_lang']] = $row; } - } elseif($row['at_ref']!='' && isset($products[$row['at_ref']])){ - if(!isset($products[$row['at_ref']]['lang'])){ + } elseif ($row['at_ref'] != '' && isset($products[$row['at_ref']])) { + if (!isset($products[$row['at_ref']]['lang'])) { $products[$row['at_ref']]['lang'] = array(); } - if(!isset($products[$row['at_ref']]['lang'][(int)$row['id_lang']])){ + if (!isset($products[$row['at_ref']]['lang'][(int)$row['id_lang']])) { $products[$row['at_ref']]['lang'][(int)$row['id_lang']] = $row; } + } elseif ($row['supplier_reference'] != '' && $row['ean13'] != '' && isset($products[$row['ean13'] . '¤' . $row['supplier_reference']])) { + $key = $row['ean13'] . '¤' . $row['supplier_reference']; + if (!isset($products[$key]['lang'])) { + $products[$key]['lang'] = array(); + } + if (!isset($products[$key]['lang'][(int)$row['id_lang']])) { + $products[$key]['lang'][(int)$row['id_lang']] = $row; + } } } $timer_table[] = 'Additional info (attr) gathered at '.(microtime(true)-$callStartTime); } + foreach($products as $product_key => $product_values){ + $timer_table[] = $product_key . ' - ' . $product_values['id_product']; + } $params['lines'] = $products; if(!empty($params['lines'])){ $wp = new GenerateWp(); @@ -418,8 +495,12 @@ class AdminAntWp extends AdminTab if (!empty($this->report[self::DUPLICATED_REFS_AND_EAN])) { $duplicated_formatted .= '
Duplications d\'EANs

' . implode('
', $this->report[self::DUPLICATED_REFS_AND_EAN]) . '

'; } + $debug_output =''; + if($debug){ + $debug_output = $duplicated_formatted.'


Timers :
'.$timer_table_formatted.'

'; + } $this->_html .= HelperFormBootstrap::displaySuccess('Génération complète
Télécharger le XLS'. - '
Produits trouvés : '.$product_found.'
Produits nouveaux : '.$new_products.$duplicated_formatted.'


Timers :
'.$timer_table_formatted.'

'); + '
Produits trouvés : '.$product_found.'
Produits nouveaux : '.$new_products. $debug_output); } else { $this->_html .= HelperFormBootstrap::displayErrors($this->l('Veuillez charger un fichier correct !')); } @@ -459,6 +540,13 @@ class AdminAntWp extends AdminTab 'label-class' => 'col-md-12 text-left', 'input-class' => 'col-md-6', ), + array( + 'type' => 'checkbox', + 'label' => $this->l('Debug'), + 'name' => 'debug', + 'text' => $this->l('Debug'), + 'class-group' => 'col-md-12 text-left', + ), ), 'actions' => array(), 'actions-class' => 'text-right',