· 5 years ago · Sep 24, 2020, 04:44 PM
1<?php
2/**
3 * Tous droits réservés NDKDESIGN
4 *
5 * @author Hendrik Masson <postmaster@ndk-design.fr>
6 * @copyright Copyright 2013 - 2014 Hendrik Masson
7 * @license Tous droits réservés
8*/
9
10if (!defined('_PS_VERSION_'))
11 exit;
12
13class ProductsDlcDluo extends Module
14{
15 const __DLCDLUO_MAIL_DELIMITOR__ = ',';
16
17 public function __construct()
18 {
19 $this->name = 'productsdlcdluo';
20 $this->tab = 'administration';
21 $this->version = '1.5.3';
22 $this->author = 'Ndkdesign';
23 $this->need_instance = 0;
24 $this->secure_key = Tools::encrypt($this->name);
25 $this->module_key = 'accecc2e52ec0ca754cfd8ce8da8b944';
26
27 parent::__construct();
28
29 $this->displayName = $this->l('Manage you stock traceability');
30 $this->description = $this->l('Manage you stock traceability');
31 }
32
33 public function install() {
34
35
36
37 if (parent::install() == false
38 OR $this->resetDb() == false
39 OR $this->registerHook('header') == false
40 OR $this->registerHook('backOfficeHeader') == false
41 //OR !$this->registerHook('actionValidateOrder')
42 //OR !$this->registerHook('ActionValidateOrder')
43 OR !$this->registerHook('updateQuantity')
44 OR !$this->registerHook('actionOrderStatusUpdate')
45 OR !$this->registerHook('deleteProduct')
46 OR !$this->registerHook('deleteProductAttribute')
47 OR !$this->registerHook('productFooter')
48 OR !$this->hookStandard()
49 OR !$this->registerHook('displayPdfInvoice')
50 OR !$this->registerHook('displayPdfDeliverySlip')
51 OR !$this->registerHook('displayAdminOrder')
52 )
53 return false;
54
55
56
57 $id_tab = $this->getIdTab('AdminCatalog');
58 $this->installModuleTab('AdminSearchDluo', array((int)$this->context->language->id=>'Manage traceability'), $id_tab);
59
60 return true;
61 }
62
63 public function hookStandard(){
64 if( (float)_PS_VERSION_ > 1.6 )
65 return $this->registerHook('displayAdminProductsQuantitiesStepBottom');
66 else
67 return $this->registerHook('displayAdminProductsExtra');
68 }
69
70 public function uninstall()
71 {
72 $id_tab = $this->getIdTab('AdminCatalog');
73 if (!parent::uninstall() || !$this->uninstallModuleTab('AdminSearchDluo', $id_tab))
74 return false;
75 else
76 return true;
77 }
78
79 private function getIdTab($tabClass)
80 {
81 $sql = 'SELECT id_tab FROM '._DB_PREFIX_.'tab WHERE class_name = "'.pSQL($tabClass).'"';
82 $row = Db::getInstance()->GetRow($sql);
83 return $row['id_tab'];
84 }
85
86 private function installModuleTab($tabClass, $tabName, $idTabParent)
87 {
88 $tab = new Tab();
89
90 $langues = Language::getLanguages(false);
91 foreach ($langues as $langue)
92 $tabName[$langue['id_lang']] = $tabName[(int)$this->context->language->id];
93
94 $tab->name = $tabName;
95 $tab->class_name = $tabClass;
96 $tab->module = $this->name;
97 $tab->id_parent = $idTabParent;
98 $id_tab = $tab->save();
99 if (!$id_tab)
100 return false;
101
102 //$this->installcleanPositions($tab->id, $idTabParent);
103
104 return true;
105 }
106
107 private function uninstallModuleTab($tabClass, $idTabParent)
108 {
109 $idTab = Tab::getIdFromClassName($tabClass);
110 if ($idTab != 0)
111 {
112 $tab = new Tab($idTab);
113 $tab->delete();
114 //$this->uninstallcleanPositions($idTabParent);
115 return true;
116 }
117 return false;
118 }
119
120
121 public function installcleanPositions($id, $id_parent)
122 {
123 $result = Db::getInstance()->ExecuteS('
124 SELECT `id_tab`,`position`
125 FROM `'._DB_PREFIX_.'tab`
126 WHERE `id_parent` = '.(int)($id_parent).'
127 AND `id_tab` != '.(int)($id).'
128 ORDER BY `position`');
129 $sizeof = count($result);
130 for ($i = 0; $i < $sizeof; ++$i)
131 {
132 Db::getInstance()->Execute('
133 UPDATE `'._DB_PREFIX_.'tab`
134 SET `position` = '.(int)($result[$i]['position'] + 1).'
135 WHERE `id_tab` = '.(int)($result[$i]['id_tab']));
136 }
137
138 Db::getInstance()->Execute('
139 UPDATE `'._DB_PREFIX_.'tab`
140 SET `position` = 1
141 WHERE `id_tab` = '.(int)($id));
142
143 return true;
144 }
145
146 public function uninstallcleanPositions($id_parent)
147 {
148 $result = Db::getInstance()->ExecuteS('
149 SELECT `id_tab`
150 FROM `'._DB_PREFIX_.'tab`
151 WHERE `id_parent` = '.(int)($id_parent).'
152 ORDER BY `position`');
153 $sizeof = count($result);
154 for ($i = 0; $i < $sizeof; ++$i)
155 {
156 Db::getInstance()->Execute('
157 UPDATE `'._DB_PREFIX_.'tab`
158 SET `position` = '.($i + 1).'
159 WHERE `id_tab` = '.(int)($result[$i]['id_tab']));
160 }
161 return true;
162 }
163
164
165
166 private function resetDb() {
167
168 $prefix = _DB_PREFIX_;
169 $engine = _MYSQL_ENGINE_;
170
171 $statements = array();
172
173 //$statements[] = "DROP TABLE IF EXISTS `${prefix}products_dlc_dluo`";
174 $statements[] = "CREATE TABLE IF NOT EXISTS `${prefix}products_dlc_dluo` ("
175 . '`id` int(10) unsigned NOT NULL AUTO_INCREMENT,'
176 . '`id_product` int(10) unsigned NOT NULL,'
177 . '`id_combinaison` int(10) unsigned NOT NULL,'
178 . '`id_warehouse` int(10) unsigned NOT NULL,'
179 . '`is_current_stock` int(10) unsigned NOT NULL DEFAULT \'0\','
180 . '`numero_lot` varchar(255) NOT NULL,'
181 . '`dlc` date NOT NULL,'
182 . '`dluo` date NOT NULL,'
183 . '`stock` int(10) unsigned NOT NULL,'
184 . '`entry_date` date NOT NULL,'
185 . '`alert1` int(10) unsigned NOT NULL,'
186 . '`alert2` int(10) unsigned NOT NULL,'
187 . ' PRIMARY KEY (`id`)'
188 . ") ENGINE=$engine"
189 ;
190
191 //$statements[] = "DROP TABLE IF EXISTS `${prefix}products_dlc_dluo_orders`";
192 $statements[] = "CREATE TABLE IF NOT EXISTS `${prefix}products_dlc_dluo_orders` ("
193 . '`id` int(10) unsigned NOT NULL AUTO_INCREMENT,'
194 . '`id_order` int(10) unsigned NOT NULL,'
195 . '`id_dlc_dluo` int(10) unsigned NOT NULL,'
196 . '`id_product` int(10) unsigned NOT NULL,'
197 . '`quantity` int(10) unsigned NOT NULL,'
198 . '`id_combinaison` int(10) unsigned NOT NULL,'
199 . ' PRIMARY KEY (`id`)'
200 . ") ENGINE=$engine"
201 ;
202
203 foreach ($statements as $statement) {
204 if (!Db::getInstance()->Execute($statement)) {
205 return false;
206 }
207 }
208
209 Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'products_dlc_dluo` CHANGE `dlc` `dlc` DATE NOT NULL');
210 Db::getInstance()->execute('ALTER TABLE `'._DB_PREFIX_.'products_dlc_dluo` CHANGE `dluo` `dluo` DATE NOT NULL');
211
212 return true;
213
214 }
215
216 public function getContent(){
217 require_once(dirname(__FILE__).'/ProductsDlcDluoClass.php');
218 require_once(dirname(__FILE__).'/OrdersDlcDluo.php');
219 $errors = array();
220 $id_dlc = Tools::getValue('id_dlc_dluo');
221 $is_comb = Tools::getValue('is_comb');
222 $qtty = Tools::getValue('qtty');
223 $id_product_attribute = Tools::getValue('id_product_attribute');
224 $id_product = Tools::getValue('id_product');
225
226 if (Tools::isSubmit('submitdlcdluo') || Tools::isSubmit('submitdlcdluonext_2')|| Tools::isSubmit('submitdlcdluonext_3') || Tools::isSubmit('submitdlcdluonext_4') || Tools::isSubmit('submitdlcdluonext_5') || Tools::isSubmit('submitdlcdluonext_6')){
227 if (!sizeof($errors) AND Tools::getValue('numero_lot'))
228 {
229 $next = array();
230 $current = DlcDluoClass::getCurrentDlcDluo(Tools::getValue('id_product'),(int)Tools::getValue('id_combinaison'));
231
232 for ($i = 2; $i < 7; $i++) {
233 $next[$i] = DlcDluoClass::getNextDlcDluo(Tools::getValue('id_product'), (int)Tools::getValue('id_combinaison'), $i);
234 if(Tools::isSubmit('submitdlcdluonext_'.$i)){
235 $dlcdluo = new DlcDluoClass($next[$i]);
236 }
237
238 }
239
240 if($current !='' AND Tools::isSubmit('submitdlcdluo')){
241 $dlcdluo = new DlcDluoClass((int)$current);
242 }
243
244 else{
245 if(!$dlcdluo)
246 $dlcdluo = new DlcDluoClass();
247 }
248 $dlcdluo->id_product = strip_tags(Tools::getValue('id_product'));
249 $dlcdluo->id_combinaison = strip_tags(Tools::getValue('id_combinaison'));
250 $dlcdluo->is_current_stock = strip_tags(Tools::getValue('is_current_stock'));
251 $dlcdluo->numero_lot = strip_tags(Tools::getValue('numero_lot'));
252 $dlcdluo->dlc = date(strip_tags(Tools::getValue('dlc')));
253 $dlcdluo->dluo = date(strip_tags(Tools::getValue('dluo')));
254 $dlcdluo->stock = strip_tags(Tools::getValue('stock'));
255 $dlcdluo->entry_date = date(strip_tags(Tools::getValue('entry_date')));
256 $dlcdluo->alert1 = date(strip_tags(Tools::getValue('alert1')));
257 $dlcdluo->alert2 = date(strip_tags(Tools::getValue('alert2')));
258 $dlcdluo->id_warehouse = date(strip_tags(Tools::getValue('id_warehouse')));
259 }
260
261 if (!$dlcdluo->numero_lot)
262 $errors[] = $this->l('Lot number is required');
263 else
264 {
265 $dlcdluo->save();
266 print($dlcdluo->id);
267 }
268
269 }
270 elseif(Tools::getValue('submitreinput') == 1 && Tools::getValue('qtty') !=''){
271 $id_dlc = Tools::getValue('id_dlc_dluo');
272 $is_comb = Tools::getValue('is_comb');
273 $qtty = Tools::getValue('qtty');
274 $id_product_attribute = Tools::getValue('id_product_attribute');
275 $id_product = Tools::getValue('id_product');
276
277 DlcDluoClass::reinputLot($id_dlc, $is_comb, $qtty, $id_product_attribute, $id_product);
278
279 }
280 else
281 {
282 $html = '<h2 class="tab">'.$this->displayName.'</h2>';
283 if (Tools::isSubmit('submitdlcdluoconfig'))
284 {
285 $mails = Tools::getValue('DLCDLUO_EMAILS');
286 Configuration::updateValue('DLCDLUO_EMAILS', $mails);
287 }
288
289 $html.='<p><b>'.$this->l('Cron task').' : </b>'.Configuration::get('PS_SHOP_DOMAIN').__PS_BASE_URI__.'modules/productsdlcdluo/croncheck.php</p>';
290 $html.='<form action="'.$_SERVER['REQUEST_URI'].'" method="post">
291 <fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend>
292 <label>'.$this->l('Notification email (comma separated) :').'</label>
293 <div class="margin-form">
294 <textarea class="datepicker" name="DLCDLUO_EMAILS">'.Configuration::get('DLCDLUO_EMAILS', str_replace(self::__DLCDLUO_MAIL_DELIMITOR__, "\n", Configuration::get('DLCDLUO_EMAILS'))).'</textarea>
295 </div>
296 <center><input type="submit" name="submitdlcdluoconfig" value="'.$this->l('Save').'" class="button " /></center>
297 </fieldset>
298 </form><br/><br/>';
299
300
301
302
303 $html.='<form action="'.$_SERVER['REQUEST_URI'].'" method="post">
304 <fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Search').'</legend>
305 <label>'.$this->l('Search by lot number:').'</label>
306 <div class="margin-form">
307 <input type="text" name="numero_lot" value="'.Tools::getValue('numero_lot').'"/>
308 </div>
309 <center><input type="submit" name="searchdlcdluo" value="'.$this->l('Search').'" class="button" /></center>
310 </fieldset>
311 </form><br/><br/>';
312
313 if (Tools::isSubmit('searchdlcdluo'))
314 {
315 $results = DlcDluoClass::getOrdersForLot(Tools::getValue('numero_lot'));
316 if($results){
317 $token = Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')).(int)($this->context->cookie->id_employee));
318 $html.='<fieldset><legend>'.$this->l('Result').'</legend><table>';
319 foreach ($results as $result) {
320 $html.='<tr><td>'.$this->l('reference : ').$result->reference.'</td><td> | '.$this->l('Order date : ').$result->date_add.'</td><td> | <a target="_blank" href="./index.php?controller=AdminOrders&id_order='.$result->id.'&vieworder&token='.$token.'"><img src="/img/admin/details.gif"/></a></td></tr>';
321 }
322 $html.='</table></fieldset>';
323 }
324 }
325
326
327 return $html;
328 }
329 }
330
331
332 public function hookHeader($params) {
333 //print_r($params);
334 $this->context->controller->addJS(_MODULE_DIR_.'/productsdlcdluo/views/js/productsdlcdluo.js');
335 $this->context->controller->addCSS(_MODULE_DIR_.'/productsdlcdluo/views/css/productsdlcdluo.css');
336 }
337
338 public function hookProductFooter($params) {
339 require_once(dirname(__FILE__).'/ProductsDlcDluoClass.php');
340 $product = new Product(Tools::getValue('id_product'));
341 $combinaisons = $product->getAttributesResume($this->context->cookie->id_lang);
342 $p_lot = true;
343 $c_lot = true;
344 if($combinaisons){
345 $p_lot = false;
346 $is_combinaison = 1;
347 $lot = array();
348 $i = 0;
349 foreach ($combinaisons as $combinaison) {
350 $comb_name = DlcDluoClass::getCombinaisonsName(Tools::getValue('id_product'), $combinaison['id_product_attribute'], (int)($this->context->cookie->id_lang));
351 $lot[$i] = new DlcDluoClass(DlcDluoClass::getCurrentDlcDluo($combinaison['id_product_attribute'], 1));
352 $lot[$i]->combname = $combinaison['attribute_designation'];
353 $i++;
354 }
355 if($lot[0]->id_product < 1)
356 $c_lot= false;
357
358 }else{
359 $c_lot = false;
360 $is_combinaison = 0;
361 $lot = new DlcDluoClass(DlcDluoClass::getCurrentDlcDluo(Tools::getValue('id_product')));
362 if($lot->id_product < 1)
363 $p_lot= false;
364 }
365 if(!$p_lot && !$c_lot)
366 return;
367
368 $this->context->smarty->assign(array('is_combinaison' => $is_combinaison, 'combinaisons' => $combinaisons, 'lot' => $lot));
369 return $this->display(__FILE__, 'productsdlcdluo.tpl');
370 }
371
372
373 public function hookDisplayPdfInvoice($params) {
374 require_once(dirname(__FILE__).'/ProductsDlcDluoClass.php');
375 require_once(dirname(__FILE__).'/OrdersDlcDluo.php');
376
377 $object = $params['object'];
378 if ($object->id_order != null){
379 $order_items = DlcDluoOrderClass::getOrderDlcDluo($object->id_order);
380
381 $order_tab = '<table class="product" width="100%" cellpadding="4" cellspacing="0">';
382 $order_tab .= '<thead><tr><th colspan="12"><p><b>'.$this->l('Traceability').'</b></p></th></tr>';
383 $order_tab .= '<tr><th class="product " colspan="2">'.$this->l('Product').' : </th>';
384 $order_tab .= '<th class="product " colspan="2">'.$this->l('Lot number').' : </th>';
385 $order_tab .= '<th class="product " colspan="2">'.$this->l('Quantity').' : </th>';
386 $order_tab .= '<th class="product " colspan="2">'.$this->l('by date').' : </th>';
387 $order_tab .= '<th class="product " colspan="2">'.$this->l('deadline for optimal use').' : </th>';
388 $order_tab .= '<th class="product " colspan="2">'.$this->l('Wharehouse').' : </th></tr></thead><tbody>';
389
390 $num = 0;
391 foreach($order_items as $item){
392 $even = ($num % 2 == 0);
393 $odd = ($num % 2 != 0);
394 if($even)
395 $class = 'color_line_even';
396 else
397 $class= 'color_line_odd';
398
399 $order_item = new DlcDluoClass($item['id_dlc_dluo']);
400 $product = new Product($order_item->id_product);
401 $comb_name = DlcDluoClass::getCombinaisonsName($order_item->id_product, $order_item->id_combinaison, (int)($this->context->cookie->id_lang));
402
403 $warehouse = new Warehouse($order_item->id_warehouse);
404
405
406 $order_tab .= '<tr class="product '.$class.'"><td colspan="2"><b>'.$product->name[$this->context->cookie->id_lang].' - '.$comb_name['product_name'].' : </b>'.$comb_name['group_name'].' => '.$comb_name['attribute_name'].'( id='.$order_item->id_product.')</td>';
407 $order_tab .= '<td colspan="2">'.$order_item->numero_lot.'</td>';
408 $order_tab .= '<td colspan="2">'.$item['quantity'].'</td>';
409 $order_tab .= '<td colspan="2">'.$order_item->dlc.'</td>';
410 $order_tab .= '<td colspan="2">'.$order_item->dluo.'</td>';
411 $order_tab .= '<td colspan="2">'.$warehouse->name.'</td></tr>';
412 $num++;
413 }
414 $order_tab .= '</tbody></table>';
415
416
417 $this->context->smarty->assign(array('order_tab' => $order_tab));
418 return $this->display(__FILE__, 'displayPdf.tpl');
419
420 }
421 else
422 {
423 $this->context->smarty->assign(array('order_tab' => $object));
424 return $this->display(__FILE__, 'displayPdf.tpl');
425 }
426
427 }
428
429 public function hookDisplayPdfDeliverySlip($params)
430 {
431 return $this->hookDisplayPdfInvoice($params);
432 }
433
434
435 public function hookBackOfficeHeader()
436 {
437 if (!$this->active || (Context::getContext()->controller->php_self != 'AdminProducts' && Tools::getValue('controller') != 'AdminProducts' && Tools::getValue('controller') != 'AdminStockManagement') )
438 return;
439
440 $this->context->controller->addJquery();
441 $this->context->controller->addJS($this->_path.'views/js/back.js');
442 $this->context->controller->addCSS($this->_path.'views/css/back.css');
443 }
444
445 public function hookDisplayAdminProductsExtra($params) {
446
447 if (!$this->active || (Context::getContext()->controller->php_self != 'AdminProducts' && Tools::getValue('controller') != 'AdminProducts' && Tools::getValue('controller') != 'AdminStockManagement') )
448 return;
449
450 if(!isset($params['id_product']))
451 $id_product = (int)Tools::getValue('id_product');
452 else
453 $id_product = (int)$params['id_product'];
454
455 if($id_product == 0)
456 return;
457
458 $link = new Link();
459 $token = Tools::getAdminToken('AdminModules'.(int)(Tab::getIdFromClassName('AdminModules')).(int)($this->context->cookie->id_employee));
460 $params = array();
461 $params['configure'] = 'productsdlcdluo';
462 $params['token'] = $token;
463 if((float)_PS_VERSION_ > 1.6)
464 $ajax_link = $link->getAdminLink('AdminModules', true, array(), $params);
465 else
466 $ajax_link = $link->getAdminLink('AdminModules', false).'&configure='.$params['configure'].'&token='.$params['token'];
467
468
469 require_once(dirname(__FILE__).'/ProductsDlcDluoClass.php');
470 require_once(dirname(__FILE__).'/OrdersDlcDluo.php');
471
472
473 $id_lang = (is_object($this->context->cookie) AND isset($this->context->cookie->id_lang)) ? (int)$this->context->cookie->id_lang : (int)Configuration::get('PS_LANG_DEFAULT');
474 //$combinaisons = DlcDluoClass::getAttributeCombinaisons(Tools::getValue('id_product'), (int)($this->context->cookie->id_lang));
475 $tab_content = '';
476
477
478 $warehouses = Warehouse::getWarehouses(true);
479 $product = new Product($id_product);
480 $attributes = $product->getAttributesResume($this->context->language->id);
481 // Get available quantities
482 $available_quantity = array();
483 $product_designation = array();
484 if($attributes){
485 foreach ($attributes as $attribute)
486 {
487 // Get available quantity for the current product attribute in the current shop
488 $available_quantity[$attribute['id_product_attribute']] = StockAvailable::getQuantityAvailableByProduct((int)$product->id,$attribute['id_product_attribute']);
489 // Get all product designation
490 $product_designation[$attribute['id_product_attribute']] = rtrim(
491 $product->name[$this->context->language->id].' - '.$attribute['attribute_designation'],
492 ' - '
493 );
494 }
495 }
496 if($attributes){
497 $productQtty = StockAvailable::getQuantityAvailableByProduct($id_product);
498
499 $qtty_infos='<div class="infos_qtty"><span class="prod_qtty">Quantités en stocks : <span class="general_stock">'.$productQtty.'</span></span><br/><span class="frac_qtty">Quantités réparties : <span id="prod_stock"> </span></span><span class="info_price clearfix">Prix achat : '.$product->wholesale_price.'</span></div>';
500
501 foreach ($attributes as $combinaison) {
502 $next = array();
503 $attributeQtty = StockAvailable::getQuantityAvailableByProduct($id_product, $combinaison['id_product_attribute']);
504 for ($i = 2; $i < 6; $i++) {
505 $next[$i] = new DlcDluoClass(DlcDluoClass::getNextDlcDluo($combinaison['id_product_attribute'], 1, $i));
506 }
507 $current = new DlcDluoClass(DlcDluoClass::getCurrentDlcDluo($combinaison['id_product_attribute'], 1));
508 $archived = DlcDluoClass::getArchivedDlcDluo($combinaison['id_product_attribute'], 1);
509
510 $all = DlcDluoClass::getProductDlcDluo($combinaison['id_product_attribute'], 1);
511 $archiveds = DlcDluoClass::getArchivedDlcDluo($id_product, $combinaison['id_product_attribute']);
512
513 if(sizeof($warehouses) > 0){
514 $warehouse_input_c = '<select name="id_warehouse"><option value="0">'.$this->l('None').'</option>';
515 foreach($warehouses as $warehouse){
516 $warehouse_input_c .= '<option '.($current->id_warehouse == (int)$warehouse['id_warehouse'] ? 'selected="selected"' : '').' value="'.(int)$warehouse['id_warehouse'].'">'.$warehouse['name'].'</option>';
517 }
518 $warehouse_input_c .= '</select>';
519 }
520
521
522 $archive_content = '<br/><br/><a class="button btn show_archive btn-default" class="show_archives">'.$this->l('Show archives').'</a><br/><br/><table style="display:none" class="archive_table">';
523 foreach($archiveds as $archive){
524 $archive = new DlcDluoClass($archive['id']);
525 $archive_content .= '<tr><td>'.$this->l('Lot number').' : </td><td>'.(isset($archive->numero_lot) ? $archive->numero_lot : '').'<td></tr>';
526 $archive_content .= '<tr><td>'.$this->l('By date').' : </td><td>'.(isset($archive->dlc) ? $archive->dlc : '').'<td></tr>';
527 $archive_content .= '<tr><td>'.$this->l('Deadline for optimal use').' : </td><td>'.(isset($archive->dluo) ? $archive->dluo : '').'<td></tr>';
528 $archive_content .= '<tr><td class="col-left">'.$this->l('Entry date').' : </td><td>'.(isset($archive->entry_date) ? $archive->entry_date : '').'<td></tr></tr>';
529 $archive_content .= '<tr><td colspan="2"><div class="dlcform" method="post" action="'.$ajax_link.'">';
530 $archive_content .= ''.$this->l('Quantity').' : <input type="hidden" name="id_dlc_dluo" value="'.(isset($archive->id) ? $archive->id : '').'"/><input type="hidden" name="id_product_attribute" value="'.(isset($archive->id_combinaison) ? $archive->id_combinaison : '').'"/><input type="hidden" name="id_product" value="'.(isset($archive->id_product) ? $archive->id_product : '').'"/><input type="hidden" name="is_comb" value="1"/><input type="text" name="qtty" /><input type="submit" name="submitreinput" class="submitreinput" value="Ré-inputer le lot"/><hr></hr></div></td></tr>';
531 }
532 $archive_content .= '</table>';
533
534 //courant//
535 $tab_content .= '<fieldset><h3 class="toggleforme" data-target="'.$id_product.'_'.$combinaison['id_product_attribute'].'">'.$product_designation[$combinaison['id_product_attribute']].' - '.$this->l('Available quantity').' : '.$attributeQtty.'</h3><div method="post" class="dlcform dlcfrom_'.$id_product.'_'.$combinaison['id_product_attribute'].'_0" id="dlcdluoform_current" action="'.$ajax_link.'">';
536
537
538
539 $tab_content .='<fieldset class="'.$id_product.'_'.$combinaison['id_product_attribute'].'"><h4>'.$this->l('Current lot').'</h4>';
540 $tab_content .='<div class="infos_qtty infos_attribute"><span class="prod_qtty">'.$this->l('Available quantity for this combination').' : <span class="attr_info_stock" id="attr_stock_'.$combinaison['id_product_attribute'].'">'.$attributeQtty.'</span></span><br/><span class="frac_qtty">'.$this->l('Distributed quantities').' : <span class="attr_count" id="attr_dlc_'.$combinaison['id_product_attribute'].'"> </span></span></div>';
541
542 $tab_content .='<input type="hidden" name="is_current_stock" value="1"/><input type="hidden" name="is_comb" value="1"/>';
543 $tab_content .='<input type="hidden" name="id_product" value="'.$id_product.'"/>';
544 $tab_content .='<input type="hidden" name="id_combinaison" value="'.$combinaison['id_product_attribute'].'"/>';
545
546 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Lot number').' :</label><input type="text" name="numero_lot" value="'.(isset($current->numero_lot) ? $current->numero_lot :'').'"/></div>';
547 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('By date').'</label><input type="date" class="datepicker hasDatepicker" name="dlc" value="'.(isset($current->dlc) ? $current->dlc :'').'"/></div>';
548 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Deadline for optimal use').'</label><input type="date" class="datepicker hasDatepicker" name="dluo" value="'.(isset($current->dluo) ? $current->dluo :'').'"/></div>';
549 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Entry date').'</label><input type="date" class="datepicker hasDatepicker" name="entry_date" value="'.(isset($current->entry_date) ? $current->entry_date : date('Y-m-d')).'"/></div>';
550 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Warehouse').'</label>'.$warehouse_input_c.'</div>';
551 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Stock').'</label><input data-checkstock="attr_dlc_'.$combinaison['id_product_attribute'].'" type="text" class="stockval attribute_count" name="stock" value="'.(isset($current->stock) ? $current->stock :'').'"/></div>';
552 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Alert level 1 (days)').' :</label><input class="alert1" type="text" name="alert1" value="'.(isset($current->alert1) ? $current->alert1 :'30').'"/></div>';
553 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Alert level 2 (days)').' :</label><input class="alert2" type="text" name="alert2" value="'.(isset($current->alert2) ? $current->alert2 :'60').'"/></div>';
554 $tab_content .='<div class="margin-form"><input type="hidden" name="id_lot" value="'.(int)$current->id.'"/></div>';
555 $tab_content .='<div class="margin-form"><input type="hidden" name="submitdlcdluo" value="1"/><input data-target="dlcfrom_'.$id_product.'_'.$combinaison['id_product_attribute'].'_0" type="submit" class="button submitdlcdluo" name="submitdlcdluo" value="'.$this->l('Save').'"/></div>';
556 $tab_content .='<hr></hr></div></fieldset>';
557 $tab_content .= $qtty_infos;
558
559 //suivant//
560
561
562
563 for ($i = 2; $i < 6; $i++) {
564 if(sizeof($warehouses) > 0){
565
566 $warehouse_input_s=array();
567 $warehouse_input_s[$i] = '<select name="id_warehouse"><option value="0">'.$this->l('None').'</option>';
568 foreach($warehouses as $warehouse){
569 $warehouse_input_s[$i] .= '<option '.($next[$i]->id_warehouse == (int)$warehouse['id_warehouse'] ? 'selected="selected"' : '').' value="'.(int)$warehouse['id_warehouse'].'">'.$warehouse['name'].'</option>';
570 }
571 $warehouse_input_s[$i].= '</select>';
572 }
573
574
575 $tab_content .='<fieldset class="'.$id_product.'_'.$combinaison['id_product_attribute'].'"><h4>'.$this->l('Following lot').' ('.$i.')</h4>';
576 $tab_content .= '<div method="post" id="dlcdluoform_current" class="dlcform dlcfrom_'.$id_product.'_'.$combinaison['id_product_attribute'].'_'.$i.'" action="'.$ajax_link.'">';
577 $tab_content .='<input type="hidden" name="is_current_stock" value="'.$i.'"/><input type="hidden" name="is_comb" value="1"/>';
578 $tab_content .='<input type="hidden" name="id_product" value="'.$id_product.'"/>';
579 $tab_content .='<input type="hidden" name="id_combinaison" value="'.$combinaison['id_product_attribute'].'"/>';
580 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Lot number').' :</label><input type="text" name="numero_lot" value="'.(isset($next[$i] ->numero_lot) ? $next[$i] ->numero_lot :'').'"/></div>';
581 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('By date').'</label><input type="date" class="datepicker hasDatepicker" name="dlc" value="'.(isset($next[$i] ->dlc) ? $next[$i] ->dlc :'').'"/></div>';
582 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Deadline for optimal use').'</label><input type="date" class="datepicker hasDatepicker" name="dluo" value="'.(isset($next[$i] ->dluo) ? $next[$i] ->dluo :'').'"/></div>';
583 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Entry date').'</label><input type="date" class="datepicker hasDatepicker" name="entry_date" value="'.(isset($next[$i]->entry_date) ? $next[$i] ->entry_date : date('Y-m-d')).'"/></div>';
584 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Warehouse').'</label>'.$warehouse_input_s[$i].'</div>';
585 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Stock').'</label><input type="text" data-checkstock="attr_dlc_'.$combinaison['id_product_attribute'].'" class="stockval attribute_count" name="stock" value="'.(isset($next[$i] ->stock) ? $next[$i] ->stock :'').'"/></div>';
586 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Alert level 1 (days)').' :</label><input class="alert1" type="text" name="alert1" value="'.(isset($next[$i]->alert1) ? $next[$i]->alert1 :'30').'"/></div>';
587 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Alert level 2 (days)').' :</label><input class="alert2" type="text" name="alert2" value="'.(isset($next[$i]->alert2) ? $next[$i]->alert2 :'60').'"/></div>';
588 $tab_content .='<div class="margin-form"><input type="hidden" name="id_lot" value="'.(int)$next[$i]->id.'"/></div>';
589 $tab_content .='<div class="margin-form"><input type="hidden" name="submitdlcdluonext_'.$i.'" value="1"/><input type="submit" data-target="dlcfrom_'.$id_product.'_'.$combinaison['id_product_attribute'].'_'.$i.'" class="button submitdlcdluo" name="submitdlcdluonext_'.$i.'" value="'.$this->l('Save').'"/></div>';
590 $tab_content .='<hr></hr></div></fieldset>';
591
592 }
593 $tab_content .='<fieldset><h4>'.$this->l('Archives').'</h4>'.$archive_content.'</fieldset></fieldset>';
594 }
595 }else{
596
597 $next = array();
598 for ($i = 2; $i < 6; $i++) {
599 $next[$i] = new DlcDluoClass(DlcDluoClass::getNextDlcDluo($id_product,0,$i));
600 }
601
602 $current = new DlcDluoClass(DlcDluoClass::getCurrentDlcDluo($id_product));
603 $archived = DlcDluoClass::getArchivedDlcDluo($id_product);
604 $productQtty = StockAvailable::getQuantityAvailableByProduct($id_product);
605 $all = DlcDluoClass::getProductDlcDluo($id_product);
606
607 $archiveds = DlcDluoClass::getArchivedDlcDluo($id_product);
608
609 if(sizeof($warehouses) > 0){
610
611 $warehouse_input_c = '<select name="id_warehouse"><option value="0">'.$this->l('None').'</option>';
612 foreach($warehouses as $warehouse){
613 $warehouse_input_c .= '<option '.($current->id_warehouse == (int)$warehouse['id_warehouse'] ? 'selected="selected"' : '').' value="'.(int)$warehouse['id_warehouse'].'">'.$warehouse['name'].'</option>';
614 }
615 $warehouse_input_c .= '</select>';
616 }
617
618 $archive_content = '<br/><br/><a class="button show_archive" class="show_archives">'.$this->l('Show archives').'</a><br/><br/><table style="display:none" class="archive_table">';
619 foreach($archiveds as $archive){
620 $archive = new DlcDluoClass($archive['id']);
621
622 $archive_content .= '<tr><td>'.$this->l('Lot number').' : </td><td>'.$archive->numero_lot.'<td></tr>';
623 $archive_content .= '<tr><td>DLC : </td><td>'.$archive->dlc.'<td></tr>';
624 $archive_content .= '<tr><td>DLUO : </td><td>'.$archive->dluo.'<td></tr>';
625 $archive_content .= '<tr><td class="col-left">'.$this->l('Entry date').' : </td><td>'.$archive->entry_date.'<td></tr></tr>';
626 $archive_content .= '<tr><td colspan="2"><div class="dlcform" method="post" action="'.$ajax_link.'">';
627 $archive_content .= 'Quantité : <input type="hidden" name="id_dlc_dluo" value="'.$archive->id.'"/><input type="hidden" name="id_product_attribute" value="'.$archive->id_combinaison.'"/><input type="hidden" name="id_product" value="'.$archive->id_product.'"/><input type="hidden" name="is_comb" value="0"/><input type="text" name="qtty" /><input type="submit" name="submitreinput" class="submitreinput" value="Ré-inputer le lot"/><hr></hr></div></td></tr>';
628 }
629 $archive_content .= '</table>';
630 //courant//
631 $tab_content .= '</fieldset><div class="dlcform dlcfrom_'.$id_product.'_'.$combinaison['id_product_attribute'].'_0" method="post" id="dlcdluoform_current" action="'.$ajax_link.'">';
632 $tab_content .='<fieldset><h4>'.$this->l('Current lot').'</h4>';
633 $tab_content .='<input type="hidden" name="is_current_stock" value="1"/>';
634 $tab_content .='<input type="hidden" name="id_product" value="'.$id_product.'"/>';
635 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Lot number').' :</label><input type="text" name="numero_lot" value="'.(isset($current->numero_lot) ? $current->numero_lot :'').'"/></div>';
636 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('By date').'</label><input type="date" class="datepicker hasDatepicker" name="dlc" value="'.(isset($current->dlc) ? $current->dlc :'').'"/></div>';
637 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Deadline for optimal use').'</label><input type="date" class="datepicker hasDatepicker" name="dluo" value="'.(isset($current->dluo) ? $current->dluo :'').'"/></div>';
638 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Entry date').'</label><input type="date" class="datepicker hasDatepicker" name="entry_date" value="'.(isset($current->entry_date) ? $current->entry_date : date('Y-m-d')).'"/></div>';
639 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Warehouse').'</label>'.$warehouse_input_c.'</div>';
640 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Stock').'</label><input type="text" class="stockval" name="stock" value="'.(isset($current->stock) ? $current->stock :'').'"/></div>';
641 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Alert level 1 (days)').' :</label><input class="alert1" type="text" name="alert1" value="'.(isset($current->alert1) ? $current->alert1 :'30').'"/></div>';
642 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Alert level 2 (days)').' :</label><input class="alert2" type="text" name="alert2" value="'.(isset($current->alert2) ? $current->alert2 :'60').'"/></div>';
643 $tab_content .='<div class="margin-form"><input type="hidden" name="id_lot" value="'.(int)$current->id.'"/></div>';
644 $tab_content .='<div class="margin-form"><input type="hidden" name="submitdlcdluo" value=""/><input data-target="dlcfrom_'.$id_product.'_'.$combinaison['id_product_attribute'].'_0" type="submit" class="btn btn-default submitdlcdluo" name="submitdlcdluo" value="'.$this->l('Save').'"/></div>';
645 $tab_content .='</fieldset><hr></hr></div>';
646 $tab_content .='<div class="infos_qtty"><span class="prod_qtty">Quantités en stocks : <span class="general_stock">'.$productQtty.'</span></span><br/><span class="frac_qtty">'.$this->l('Distributed quantities').' : <span id="prod_stock"> </span></span></div>';
647
648
649 //suivant//
650 for ($i = 2; $i < 6; $i++) {
651 for ($i = 2; $i < 6; $i++) {
652 if(sizeof($warehouses) > 0){
653
654 $warehouse_input_s=array();
655 $warehouse_input_s[$i] = '<select name="id_warehouse"><option value="0">'.$this->l('None').'</option>';
656 foreach($warehouses as $warehouse){
657 $warehouse_input_s[$i] .= '<option '.($next[$i]->id_warehouse == (int)$warehouse['id_warehouse'] ? 'selected="selected"' : '').' value="'.(int)$warehouse['id_warehouse'].'">'.$warehouse['name'].'</option>';
658 }
659 $warehouse_input_s[$i].= '</select>';
660 }
661
662
663 $tab_content .= '<div class="dlcform dlcfrom_'.$id_product.'_'.$combinaison['id_product_attribute'].'_'.$i.'" method="post" id="dlcdluoform_current" action="'.$ajax_link.'">';
664 $tab_content .='<fieldset><h4>'.$this->l('Following lot').'('.$i.')</h4>';
665 $tab_content .='<div class="margin-form"><input type="hidden" name="is_current_stock" value="'.$i.'"/></div>';
666 $tab_content .='<div class="margin-form"><input type="hidden" name="id_product" value="'.$id_product.'"/></div>';
667 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Lot number').' :</label><input type="text" name="numero_lot" value="'.(isset($next[$i]->numero_lot) ? $next[$i]->numero_lot :'').'"/></div>';
668 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('By date').'</label><input type="date" class="datepicker hasDatepicker" name="dlc" value="'.(isset($next[$i]->dlc) ? $next[$i]->dlc :'').'"/></div>';
669 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Deadline for optimal use').'</label><input type="date" class="datepicker hasDatepicker" name="dluo" value="'.(isset($next[$i]->dluo) ? $next[$i]->dluo :'').'"/></div>';
670 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Entry date').'</label><input type="date" class="datepicker hasDatepicker" name="entry_date" value="'.(isset($next[$i]->entry_date) ? $next[$i]->entry_date : date('Y-m-d')).'"/></div>';
671 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Warehouse').'</label>'.$warehouse_input_s[$i].'</div>';
672 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Stock').'</label><input type="text" class="stockval" name="stock" value="'.(isset($next[$i]->stock) ? $next[$i]->stock :'').'"/></div>';
673 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Alert level 1 (days)').' :</label><input class="alert1" type="text" name="alert1" value="'.(isset($next[$i]->alert1) ? $next[$i]->alert1 :'30').'"/></div>';
674 $tab_content .='<div class="form-group"><label class="control-label form-control-label dlc-label">'.$this->l('Alert level 2 (days)').' :</label><input class="alert2" type="text" name="alert2" value="'.(isset($next[$i]->alert2) ? $next[$i]->alert2 :'60').'"/></div>';
675 $tab_content .='<div class="margin-form"><input type="hidden" name="id_lot" value="'.(int)$next[$i]->id.'"/></div>';
676 $tab_content .='<div class="margin-form"><input type="hidden" name="submitdlcdluonext_'.$i.'" value=""/><input data-target="dlcfrom_'.$id_product.'_'.$combinaison['id_product_attribute'].'_'.$i.'" type="submit" class="btn btn-default submitdlcdluo" name="submitdlcdluonext_'.$i.'" value="'.$this->l('Save').'"/></div>';
677 $tab_content .='<hr></hr></div></fieldset>';
678 }
679 $tab_content .='<fieldset><h4>Archives</h4>'.$archive_content.'</fieldset></fieldset>';
680
681 }
682 }
683
684 $tab_content .='<div class="thanks">'.$this->l('Saved').'</div>';
685
686 $this->context->controller->addJS(_MODULE_DIR_.'/productsdlcdluo/views/js/back.js');
687 $this->context->controller->addCSS(_MODULE_DIR_.'/productsdlcdluo/views/css/back.css');
688
689 $this->context->smarty->assign(array(
690 'tab_content' => $tab_content,
691 'productQtty' => $productQtty,
692 'ps_version' => (float)_PS_VERSION_,
693 'my_module_dir' => _PS_MODULE_DIR_.$this->name
694 ));
695 $this->context->smarty->assign('base_url', Tools::getHttpHost(true).__PS_BASE_URI__);
696 $output = $this->display(__FILE__,'adminProductTab.tpl');
697 return $output;
698 }
699
700 public function hookDisplayAdminProductsQuantitiesStepBottom($params)
701 {
702 return $this->hookDisplayAdminProductsExtra($params);
703 }
704
705 public function escapeJavaScriptText($string)
706 {
707 return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
708 }
709
710 public function hookActionValidateOrder($params)
711 {
712 require_once(dirname(__FILE__).'/ProductsDlcDluoClass.php');
713 require_once(dirname(__FILE__).'/OrdersDlcDluo.php');
714
715 if (!Validate::isLoadedObject($params['order']))
716 die(Tools::displayError('Missing parameters'));
717 // Getting differents vars
718 $context = Context::getContext();
719 $id_lang = (int)$context->language->id;
720 $id_shop = (int)$context->shop->id;
721 $currency = $params['currency'];
722 $order = $params['order'];
723 $products = $params['order']->getProducts();
724 $order_status = $params['orderStatus'];
725 if($order_status->logable)
726 {
727 $products_infos = array();
728 foreach ($products AS $key => $product){
729 if(Pack::isPack($product['product_id'])){
730 $pack_items = Pack::getItems($product['product_id']);
731 foreach($pack_items as $pack_item)
732 {
733 $products_infos[$pack_item->id][$pack_item->id_pack_product_attribute] += $pack_item->pack_quantity*$product['product_quantity'];
734 }
735 }
736 else
737 {
738 $products_infos[$product['product_id']][$product['product_attribute_id']] += $product['product_quantity'];
739 }
740 }
741
742 foreach($products_infos as $id_product => $infos)
743 {
744 foreach($infos as $id_product_attribute => $qtty)
745 {
746 if((int)$id_product_attribute > 0)
747 $this->assignMylots($context, $order->id, $id_product, $id_product_attribute, $qtty, 1);
748 else
749 $this->assignMylots($context, $order->id, $id_product, $id_product_attribute, $qtty, 0);
750 }
751 }
752 }
753
754
755 }
756
757
758 public function hookActionOrderStatusUpdate($params)
759 {
760 require_once(dirname(__FILE__).'/ProductsDlcDluoClass.php');
761 require_once(dirname(__FILE__).'/OrdersDlcDluo.php');
762
763 $context = Context::getContext();
764 $id_lang = (int)$context->language->id;
765 $id_shop = (int)$context->shop->id;
766 $order = new Order((int)$params['id_order']);
767 $new_os = $params['newOrderStatus'];
768 $products = $order->getProducts();
769 $order_status = $params['newOrderStatus'];
770 $json = json_encode($order_status);
771 error_log("@@@@@@@@@@@_:".$json);
772 if($order_status->logable)
773 {
774 $valid = $order->valid;
775 // validate order (if valid = 1) dont do anything
776 if(!$valid){
777 $products_infos = array();
778 foreach ($products AS $key => $product){
779 if(Pack::isPack($product['product_id'])){
780 $pack_items = Pack::getItems($product['product_id']);
781 foreach($pack_items as $pack_item)
782 {
783 $products_infos[$pack_item->id][$pack_item->id_pack_product_attribute] += $pack_item->pack_quantity*$product['product_quantity'];
784 }
785 }
786 else
787 {
788 $products_infos[$product['product_id']][$product['product_attribute_id']] += $product['product_quantity'];
789 }
790 }
791
792 foreach($products_infos as $id_product => $infos)
793 {
794 foreach($infos as $id_product_attribute => $qtty)
795 {
796 if((int)$id_product_attribute > 0)
797 $this->assignMylots($context, $order->id, $id_product, $id_product_attribute, $qtty, 1);
798 else
799 $this->assignMylots($context, $order->id, $id_product, $id_product_attribute, $qtty, 0);
800 }
801 }
802 } //end validate
803
804 }
805 else //on annule les lots et le reinpute
806 {
807
808 $order_items = DlcDluoOrderClass::getOrderDlcDluo($order->id);
809 foreach($order_items as $item)
810 {
811 $orderLot = new DlcDluoOrderClass($item['id']);
812 $is_comb = ((int)$orderLot->id_combinaison > 0 ? 1 : 0);
813 //var_dump($orderLot);
814 DlcDluoClass::reinputLot($orderLot->id_dlc_dluo, $is_comb, $orderLot->quantity, $orderLot->id_combinaison, $orderLot->id_product);
815
816 $orderLot->delete();
817 }
818 }
819
820 }
821
822 public function assignMylots($context, $order_id, $product_id, $product_attribute_id, $quantity, $attribute = 0){
823
824 $id_lang = (int)$context->language->id;
825 $id_shop = (int)$context->shop->id;
826 $iso = Language::getIsoById((int)$id_lang);
827
828 $current = new DlcDluoClass(DlcDluoClass::getCurrentDlcDluo(( $attribute == 1 ? $product_attribute_id : $product_id), $attribute));
829
830 if((int)$current->id > 0 && (int)DlcDluoOrderClass::checkOrderDlcDluo((int)$order_id, (int)$product_id, (int)$product_attribute_id, (int)$current->id) < 1)
831 {
832
833 if($current->numero_lot !=''){
834 //attribution du nouveau lot courant si nécessaire//
835 if((int)$quantity >= (int)$current->stock){
836 $all = DlcDluoClass::getProductDlcDluo(( $attribute == 1 ? $product_attribute_id : $product_id), $attribute);
837
838 $current_stock = $current->stock;
839
840 $current->stock = 0;
841 $current->save();
842
843
844 if((int)$quantity > (int)$current_stock)
845 {
846 $new_current = new DlcDluoClass(DlcDluoClass::getCurrentDlcDluo(( $attribute == 1 ? $product_attribute_id : $product_id), $attribute));
847 //on ajoute le second lot a la commande
848 $dlcdluo_order = new DlcDluoOrderClass();
849 $dlcdluo_order->id_product = (int)($product_id);
850 ( $attribute == 1 ? $dlcdluo_order->id_combinaison = (int)($product_attribute_id) : $dlcdluo_order->id_combinaison = (int)(0) );
851 $dlcdluo_order->id_dlc_dluo = (int)($new_current->id);
852 $dlcdluo_order->id_order = (int)$order_id;
853 $dlcdluo_order->quantity = (int)$current_stock;
854 $dlcdluo_order->save();
855 //on récupère le nouveau lot
856 }
857 else
858 {
859 if($current_stock > 0 && (int)$quantity == (int)$current_stock)
860 {
861 $dlcdluo_order = new DlcDluoOrderClass();
862 $dlcdluo_order->id_product = (int)($product_id);
863 ( $attribute == 1 ? $dlcdluo_order->id_combinaison = (int)($product_attribute_id) : $dlcdluo_order->id_combinaison = (int)(0) );
864 $dlcdluo_order->id_dlc_dluo = (int)($current->id);
865 $dlcdluo_order->id_order = (int)$order_id;
866 $dlcdluo_order->quantity = (int)$current_stock;
867 $dlcdluo_order->save();
868 }
869
870 }
871
872 foreach ($all as $dlc_entry ) {
873 $item = new DlcDluoClass($dlc_entry['id']);
874 $item->is_current_stock = (int)($item->is_current_stock - 1);
875 $item->save();
876 }
877
878 //$new_current->stock = (int)($new_current->stock - (int)((int)$quantity - (int)$current_stock));
879 //$new_current->save();
880
881 //on envoie un mail alerte
882 $product = new Product($product_id, true, $id_lang, $id_shop, $context);
883 $templateVars = array(
884 '{product_name}' => $product->name,
885 '{lot_fini}' => $current->numero_lot,
886 '{nouveau_lot}' => $new_current->numero_lot,
887 '{nouvelle_quantite}' => $new_current->stock );
888
889 if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.txt') AND file_exists(dirname(__FILE__).'/mails/'.$iso.'/productoutofstock.html'))
890 Mail::Send(
891 (int)Configuration::get('PS_LANG_DEFAULT'), 'productoutofstock', Mail::l('Product out of stock', (int)Configuration::get('PS_LANG_DEFAULT')), $templateVars, explode(self::__DLCDLUO_MAIL_DELIMITOR__, Configuration::get('DLCDLUO_EMAILS')), NULL, Configuration::get('PS_SHOP_EMAIL'),Configuration::get('PS_SHOP_NAME'), NULL, NULL, dirname(__FILE__).'/mails/');
892
893 //faire : traitement recursif si on saute encore un lot
894
895 if($new_current->numero_lot != ''){
896 $new_quantity = (int)($quantity - $current_stock);
897 $this->assignMylots($context, $order_id, $product_id, $product_attribute_id, $new_quantity, $attribute );
898 }
899
900 }else{
901 if($quantity > 0)
902 {
903 $current->stock = (int)($current->stock - $quantity );
904 $current->save();
905 $dlcdluo_order = new DlcDluoOrderClass();
906 $dlcdluo_order->id_product = (int)($product_id);
907 ( $attribute == 1 ? $dlcdluo_order->id_combinaison = (int)($product_attribute_id) : $dlcdluo_order->id_combinaison = (int)(0) );
908 $dlcdluo_order->id_dlc_dluo = (int)($current->id);
909 $dlcdluo_order->id_order = (int)$order_id;
910 $dlcdluo_order->quantity = (int)$quantity;
911 $dlcdluo_order->save();
912 }
913 }
914 }
915 }
916 }
917
918
919 public function hookUpdateQuantity($params)
920 {
921
922 require_once(dirname(__FILE__).'/ProductsDlcDluoClass.php');
923 require_once(dirname(__FILE__).'/OrdersDlcDluo.php');
924
925 $id_product = (int)$params['id_product'];
926 $id_product_attribute = (int)$params['id_product_attribute'];
927 $quantity = (int)$params['quantity'];
928 $context = Context::getContext();
929 $id_shop = (int)$context->shop->id;
930 $id_lang = (int)$context->language->id;
931 $iso = Language::getIsoById((int)$id_lang);
932 $product = new Product($id_product, true, $id_lang, $id_shop, $context);
933
934 if($id_product_attribute && $id_product_attribute !=''){
935 $current = new DlcDluoClass(DlcDluoClass::getCurrentDlcDluo($id_product_attribute, 1));
936 if($current->numero_lot !=''){
937 $archived = DlcDluoClass::getArchivedDlcDluo($id_product_attribute, 1);
938 $productQtty = StockAvailable::getQuantityAvailableByProduct($id_product, $id_product_attribute);
939 $all = DlcDluoClass::getProductDlcDluo($id_product_attribute, 1);
940
941
942 $alert1 = $current->alert1;
943 $alert2 = $current->alert2;
944 $now = date("Y-m-d");
945 $DlcCritique1 = date('Y-m-d', strtotime($current->dlc.' -'.$alert1.' days'));
946 $DlcCritique2 = date('Y-m-d', strtotime($current->dlc.' -'.$alert2.' days'));
947 $DluoCritique1 = date('Y-m-d', strtotime($current->dluo.' -'.$alert1.' days'));
948 $DluoCritique2 = date('Y-m-d', strtotime($current->dluo.' -'.$alert2.' days'));
949 if ($now == $DlcCritique1 || $now == $DlcCritique2 || $now == $DluoCritique2 || $now == $DluoCritique2)
950 {
951
952 //on envoie un mail alerte
953 $templateVars = array(
954 '{product_name}' => $product->name.' ('.$id_product.') ',
955 '{lot}' => $current->numero_lot,
956 '{dlc}' => $current->dlc,
957 '{dluo}' => $current->dluo,
958 '{hook}' => 'updateQuantity'.$productQtty );
959 if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/alertdlcdluo.txt') AND file_exists(dirname(__FILE__).'/mails/'.$iso.'/alertdlcdluo.html'))
960 Mail::Send(
961 (int)Configuration::get('PS_LANG_DEFAULT'), 'alertdlcdluo', Mail::l('Alerte DLC/DLUO', (int)Configuration::get('PS_LANG_DEFAULT')), $templateVars, explode(self::__DLCDLUO_MAIL_DELIMITOR__, Configuration::get('DLCDLUO_EMAILS')), NULL, Configuration::get('PS_SHOP_EMAIL'),Configuration::get('PS_SHOP_NAME'), NULL, NULL, dirname(__FILE__).'/mails/');
962 }
963 }
964
965 }else{
966 $current = new DlcDluoClass(DlcDluoClass::getCurrentDlcDluo($id_product));
967 if($current->numero_lot !=''){
968 $archived = DlcDluoClass::getArchivedDlcDluo($id_product);
969 $productQtty = StockAvailable::getQuantityAvailableByProduct($id_product);
970 $all = DlcDluoClass::getProductDlcDluo($id_product);
971 $alert1 = $current->alert1;
972 $alert2 = $current->alert2;
973 $now = date("Y-m-d");
974 $DlcCritique1 = date('Y-m-d', strtotime($current->dlc.' -'.$alert1.' days'));
975 $DlcCritique2 = date('Y-m-d', strtotime($current->dlc.' -'.$alert2.' days'));
976 $DluoCritique1 = date('Y-m-d', strtotime($current->dluo.' -'.$alert1.' days'));
977 $DluoCritique2 = date('Y-m-d', strtotime($current->dluo.' -'.$alert2.' days'));
978 if ($now == $DlcCritique1 || $now == $DlcCritique2 || $now == $DluoCritique2 || $now == $DluoCritique2)
979 {
980 //on envoie un mail alerte
981 $templateVars = array(
982 '{product_name}' => $product->name,
983 '{lot}' => $current->numero_lot,
984 '{dlc}' => $current->dlc,
985 '{dluo}' => $current->dluo,
986 '{hook}' => 'updateQuantity' );
987 if (file_exists(dirname(__FILE__).'/mails/'.$iso.'/alertdlcdluo.txt') AND file_exists(dirname(__FILE__).'/mails/'.$iso.'/alertdlcdluo.html'))
988 Mail::Send(
989 (int)Configuration::get('PS_LANG_DEFAULT'), 'alertdlcdluo', Mail::l('Alerte DLC/DLUO', (int)Configuration::get('PS_LANG_DEFAULT')), $templateVars, explode(self::__DLCDLUO_MAIL_DELIMITOR__, Configuration::get('DLCDLUO_EMAILS')), NULL, Configuration::get('PS_SHOP_EMAIL'),Configuration::get('PS_SHOP_NAME'), NULL, NULL, dirname(__FILE__).'/mails/');
990 }
991 }
992 }
993
994 }
995
996
997
998 public function hookDeleteProduct($params)
999 {
1000 require_once(dirname(__FILE__).'/ProductsDlcDluoClass.php');
1001 require_once(dirname(__FILE__).'/OrdersDlcDluo.php');
1002
1003 Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'products_dlc_dluo` WHERE `id_product` = '.(int)$params['product']->id);
1004 }
1005
1006 public function hookDeleteProductAttribute($params)
1007 {
1008 require_once(dirname(__FILE__).'/ProductsDlcDluoClass.php');
1009 require_once(dirname(__FILE__).'/OrdersDlcDluo.php');
1010
1011 Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'products_dlc_dluo` WHERE `id_product` = '.(int)$params['id_product'].' AND `id_combinaison` = '.(int)$params['id_product_attribute']);
1012 }
1013
1014
1015 private function _getFormatedAddress(Address $the_address, $line_sep, $fields_style = array())
1016 {
1017 return AddressFormat::generateAddress($the_address, array('avoid' => array()), $line_sep, ' ', $fields_style);
1018 }
1019
1020 public function hookDisplayAdminOrder($params)
1021 {
1022 require_once(dirname(__FILE__).'/ProductsDlcDluoClass.php');
1023 require_once(dirname(__FILE__).'/OrdersDlcDluo.php');
1024 //var_dump($params);
1025 $order_tab ='';
1026 $id_lang = $this->context->cookie->id_lang;
1027 if ($params['id_order'] != null){
1028 $order_items = DlcDluoOrderClass::getOrderDlcDluo($params['id_order']);
1029
1030 $order_tab = '<table class="table" width="100%">';
1031 $order_tab .= '<thead>';
1032 $order_tab .= '<tr><th class="product-line-row " colspan="2">'.$this->l('Product').' : </th>';
1033 $order_tab .= '<th class="product-line-row " colspan="2">'.$this->l('Lot number').' : </th>';
1034 $order_tab .= '<th class="product-line-row " colspan="2">'.$this->l('Quantity').' : </th>';
1035 $order_tab .= '<th class="product-line-row " colspan="2">'.$this->l('by date').' : </th>';
1036 $order_tab .= '<th class="product-line-row " colspan="2">'.$this->l('deadline for optimal use').' : </th>';
1037 $order_tab .= '<th class="product-line-row " colspan="2">'.$this->l('Wharehouse').' : </th></tr></thead><tbody>';
1038
1039 $num = 0;
1040 foreach($order_items as $item){
1041 $even = ($num % 2 == 0);
1042 $odd = ($num % 2 != 0);
1043 if($even)
1044 $class = 'color_line_even';
1045 else
1046 $class= 'color_line_odd';
1047
1048 $order_item = new DlcDluoClass($item['id_dlc_dluo']);
1049 $product = new Product($order_item->id_product);
1050 $comb_name = DlcDluoClass::getCombinaisonsName($order_item->id_product, $order_item->id_combinaison, (int)($this->context->cookie->id_lang));
1051
1052 $warehouse = new Warehouse($order_item->id_warehouse);
1053
1054
1055 $order_tab .= '<tr class="product-line-row '.$class.'"><td colspan="2"><b>'.$product->name[$id_lang].' - '.$comb_name['product_name'].' : </b>'.$comb_name['group_name'].' => '.$comb_name['attribute_name'].'( id='.$order_item->id_product.')</td>';
1056 $order_tab .= '<td colspan="2">'.$order_item->numero_lot.'</td>';
1057 $order_tab .= '<td colspan="2">'.$item['quantity'].'</td>';
1058 $order_tab .= '<td colspan="2">'.$order_item->dlc.'</td>';
1059 $order_tab .= '<td colspan="2">'.$order_item->dluo.'</td>';
1060 $order_tab .= '<td colspan="2">'.$warehouse->name.'</td></tr>';
1061 $num++;
1062 }
1063 $order_tab .= '</tbody></table>';
1064
1065 $this->context->smarty->assign(array('order_tab' => $order_tab));
1066 return $this->display(__FILE__, 'adminOrderTab.tpl');
1067 }
1068 }
1069
1070}