From 72e1be49c768501deb56f6cb115f0ba1018ce2c6 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Wed, 20 Nov 2024 08:59:35 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20gestione=20sottoscorta=20per=20sede=20e?= =?UTF-8?q?=20aggiornamento=20quantit=C3=A0=20da=20plugin=20Giacenze?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/articoli/actions.php | 53 +++++++++++++++++- modules/articoli/add.php | 8 +-- modules/articoli/edit.php | 6 +-- .../articoli/plugins/articoli.giacenze.php | 54 +++++++++++++++++-- .../articoli/widgets/articoli.dashboard.php | 47 +++++++++++----- update/2_6.sql | 10 ++++ 6 files changed, 148 insertions(+), 30 deletions(-) diff --git a/modules/articoli/actions.php b/modules/articoli/actions.php index 071d8df9a..b5fdf1474 100755 --- a/modules/articoli/actions.php +++ b/modules/articoli/actions.php @@ -61,7 +61,6 @@ switch (post('op')) { $articolo->name = post('descrizione'); } $articolo->barcode = post('barcode'); - $articolo->threshold_qta = post('threshold_qta'); $articolo->coefficiente = post('coefficiente'); $articolo->idiva_vendita = post('idiva_vendita'); $articolo->prezzo_acquisto = post('prezzo_acquisto'); @@ -138,7 +137,6 @@ switch (post('op')) { $articolo->id_sottocategoria = post('subcategoria'); $articolo->abilita_serial = post('abilita_serial'); $articolo->ubicazione = post('ubicazione'); - $articolo->threshold_qta = post('threshold_qta'); $articolo->coefficiente = post('coefficiente'); $articolo->idiva_vendita = post('idiva_vendita'); $articolo->prezzo_acquisto = post('prezzo_acquisto'); @@ -405,6 +403,57 @@ switch (post('op')) { ]); } + break; + + case 'update_soglia_minima': + $has_soglia_minima = $dbo->selectOne('mg_scorte_sedi', '*', ['id_articolo' => $id_record, 'id_sede' => post('id_sede')])['threshold_qta']; + + if ($has_soglia_minima) { + if (post('threshold_qta')) { + $dbo->update('mg_scorte_sedi', [ + 'threshold_qta' => post('threshold_qta'), + ],[ + 'id_articolo' => $id_record, + 'id_sede' => post('id_sede'), + ]); + } else { + $dbo->delete('mg_scorte_sedi', [ + 'id_articolo' => $id_record, + 'id_sede' => post('id_sede'), + ]); + } + } else { + $dbo->insert('mg_scorte_sedi', [ + 'id_articolo' => $id_record, + 'id_sede' => post('id_sede'), + 'threshold_qta' => post('threshold_qta'), + ]); + } + + flash()->info(tr('Soglia minima aggiornata!')); + + break; + + case 'update_giacenza': + $data = date('Y-m-d'); + + $qta = post('qta') ?: 0; + $new_qta = post('new_qta') ?: 0; + + $qta_movimento = $new_qta - $qta; + if ($qta_movimento > 0) { + $descrizione = tr('Carico manuale'); + } elseif ($qta_movimento < 0) { + $descrizione = tr('Scarico manuale'); + } + + // Registrazione del movimento con variazione della quantità + $articolo->movimenta($qta_movimento, $descrizione, $data, 1, [ + 'idsede' => post('id_sede') + ]); + + flash()->info(tr('Giacenza aggiornata!')); + break; } diff --git a/modules/articoli/add.php b/modules/articoli/add.php index b47d5ade4..7ec5a8b5b 100755 --- a/modules/articoli/add.php +++ b/modules/articoli/add.php @@ -96,7 +96,7 @@ $aliquota_predefinita = floatval(Aliquota::find($iva_predefinita)->percentuale);
- {[ "type": "number", "label": "", "name": "threshold_qta", "decimals": "qta", "min-value": "undefined" ]} + {[ "type": "checkbox", "label": "", "name": "abilita_serial_add", "help": "", "value": "","placeholder": "" ]}
@@ -128,12 +128,6 @@ $aliquota_predefinita = floatval(Aliquota::find($iva_predefinita)->percentuale); - -
-
- {[ "type": "checkbox", "label": "", "name": "abilita_serial_add", "help": "", "value": "","placeholder": "" ]} -
-
diff --git a/modules/articoli/edit.php b/modules/articoli/edit.php index bbf12608a..09e10fd1e 100755 --- a/modules/articoli/edit.php +++ b/modules/articoli/edit.php @@ -180,13 +180,9 @@ use Modules\Iva\Aliquota;
-
+
{[ "type": "number", "label": "", "name": "prezzo_acquisto", "value": "$prezzo_acquisto$", "icon-after": "", "help": "." ]}
- -
- {[ "type": "number", "label": "", "name": "threshold_qta", "value": "$threshold_qta$", "decimals": "qta", "min-value": "undefined" ]} -
diff --git a/modules/articoli/plugins/articoli.giacenze.php b/modules/articoli/plugins/articoli.giacenze.php index 3abcf3984..4f4fcc197 100755 --- a/modules/articoli/plugins/articoli.giacenze.php +++ b/modules/articoli/plugins/articoli.giacenze.php @@ -246,7 +246,8 @@ echo ' '.tr('Sede').' - '.tr('Q.tà').' + '.tr('Soglia minima quantità').' + '.tr('Giacenza').' # @@ -254,10 +255,16 @@ echo ' '; foreach ($sedi as $sede) { + $scorta = $dbo->selectOne('mg_scorte_sedi', '*', ['id_sede' => $sede['id'], 'id_articolo' => $id_record]); echo ' - + '.$sede['nomesede'].' - '.numberFormat($giacenze[$sede['id']][0], 'qta').' '.$articolo->um.' + + {[ "type": "number", "decimals": "qta", "name": "scorta_'.$sede['id'].'", "value": "'.$scorta['threshold_qta'].'", "onchange": "aggiornaSogliaMinima($(this).closest(\'tr\').data(\'id\'))" ]} + + + {[ "type": "number", "decimals": "qta", "name": "giacenza_'.$sede['id'].'", "value": "'.$giacenze[$sede['id']][0].'", "onchange": "aggiornaGiacenza($(this).closest(\'tr\').data(\'id\'),\''.$giacenze[$sede['id']][0].'\')" ]} + @@ -282,4 +289,45 @@ function getDettagli(idsede) { openModal("'.tr('Dettagli').'", "'.$rootdir.'/modules/articoli/plugins/dettagli_giacenze.php?id_module=" + globals.id_module + "&id_record=" + globals.id_record + "&idsede=" + idsede ); } +function aggiornaSogliaMinima(id_sede) { + $.ajax({ + url: globals.rootdir + "/actions.php", + type: "POST", + data: { + id_module: globals.id_module, + id_record: globals.id_record, + op: "update_soglia_minima", + id_sede: id_sede, + threshold_qta: $("#scorta_"+id_sede).val() + }, + success: function(response) { + renderMessages(); + }, + error: function(xhr, status, error) { + renderMessages(); + } + }); +} + +function aggiornaGiacenza(id_sede, giacenza) { + content_was_modified = false; + $.ajax({ + url: globals.rootdir + "/actions.php", + type: "POST", + data: { + id_module: globals.id_module, + id_record: globals.id_record, + op: "update_giacenza", + id_sede: id_sede, + qta: giacenza, + new_qta: $("#giacenza_"+id_sede).val() + }, + success: function(response) { + location.reload(); + }, + error: function(xhr, status, error) { + location.reload(); + } + }); +} '; diff --git a/modules/articoli/widgets/articoli.dashboard.php b/modules/articoli/widgets/articoli.dashboard.php index 702e1afc9..ebe106554 100755 --- a/modules/articoli/widgets/articoli.dashboard.php +++ b/modules/articoli/widgets/articoli.dashboard.php @@ -19,28 +19,49 @@ include_once __DIR__.'/../../../core.php'; -$rs = $dbo->fetchArray('SELECT `mg_articoli`.`id`, `mg_articoli_lang`.`title` as descrizione, `qta`, `threshold_qta`, `codice`, `um` AS unitamisura FROM `mg_articoli` LEFT JOIN `mg_articoli_lang` ON (`mg_articoli`.`id` = `mg_articoli_lang`.`id_record` AND `mg_articoli_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') WHERE `qta` < `threshold_qta` AND `attivo` = 1 AND `deleted_at` IS NULL ORDER BY `qta` ASC'); +use Modules\Anagrafiche\Anagrafica; +use Modules\Anagrafiche\Sede; +use Modules\Articoli\Articolo; + +$rs = $dbo->fetchArray('SELECT `mg_articoli`.`id`, `mg_articoli_lang`.`title` as descrizione, `codice`, `um`, mg_scorte_sedi.threshold_qta, mg_scorte_sedi.id_sede FROM `mg_articoli` LEFT JOIN `mg_articoli_lang` ON (`mg_articoli`.`id` = `mg_articoli_lang`.`id_record` AND `mg_articoli_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') INNER JOIN `mg_scorte_sedi` ON `mg_articoli`.`id` = `mg_scorte_sedi`.`id_articolo` WHERE `attivo` = 1 AND `deleted_at` IS NULL ORDER BY `codice` ASC'); +$anagrafica_azienda = Anagrafica::find(setting('Azienda predefinita')); if (!empty($rs)) { echo ' - - + + + + '; - foreach ($rs as $r) { +foreach ($rs as $r) { + $articolo = Articolo::find($r['id']); + $giacenze = $articolo->getGiacenze(); + if ($giacenze[$r['id_sede']][0] < $r['threshold_qta']) { + if (!empty($r['id_sede'])) { + $sede = Sede::find($r['id_sede'])->nomesede; + } else { + $sede = 'Sede Legale'; + } echo ' - - - - '; + + + + + + '; } +} echo '
'.tr('Articolo').''.tr('Q.tà').''.tr('Articolo').''.tr('Sede').''.tr('Soglia minima').''.tr('Q.tà').'
- '.Modules::link('Articoli', $r['id'], $r['descrizione']).' -
'.$r['codice'].' -
- '.Translator::numberToLocale($r['qta'], 'qta').' '.$r['unitamisura'].' -
+ '.Modules::link('Articoli', $r['id'], $r['codice'].' - '.$r['descrizione']).' + + '.$sede.' + + '.Translator::numberToLocale($r['threshold_qta'], 'qta').' '.$articolo->um.' + + '.Translator::numberToLocale($giacenze[$r['id_sede']][0], 'qta').' '.$articolo->um.' +
'; diff --git a/update/2_6.sql b/update/2_6.sql index 058103b4e..b8879f09e 100644 --- a/update/2_6.sql +++ b/update/2_6.sql @@ -116,3 +116,13 @@ INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`, `ord INSERT INTO `zz_settings_lang` (`id_record`, `id_lang`, `title`) VALUES (LAST_INSERT_ID(), 1, 'Metodo di importazione XML fatture di vendita'), (LAST_INSERT_ID(), 2, 'Metodo di importazione XML fatture di vendita'); + +-- Gestione sottoscorta per sede +UPDATE `zz_widgets` SET `query` = 'SELECT COUNT(mg_articoli.id) AS dato, scorte_sedi.id_sede, IFNULL(movimenti.tot, 0), IFNULL(scorte_sedi.threshold_qta, 0)\nFROM `mg_articoli` LEFT JOIN ( SELECT sedi.id AS id_sede, mg_scorte_sedi.id_articolo, IFNULL(threshold_qta, 0) AS threshold_qta FROM ( SELECT \'0\' AS id UNION SELECT id FROM an_sedi ) sedi LEFT JOIN `mg_scorte_sedi` ON sedi.id = mg_scorte_sedi.id_sede GROUP BY sedi.id, mg_scorte_sedi.id_articolo, IFNULL(threshold_qta, 0) ) scorte_sedi ON ( scorte_sedi.id_articolo = mg_articoli.id OR scorte_sedi.id_articolo IS NULL ) LEFT JOIN( SELECT IFNULL(SUM(qta), 0) AS tot, idarticolo, idsede FROM mg_movimenti GROUP BY idarticolo, idsede ) movimenti ON movimenti.idsede = scorte_sedi.id_sede AND movimenti.idarticolo = mg_articoli.id\nWHERE `attivo` = 1 AND `deleted_at` IS NULL AND IFNULL(movimenti.tot,0)