diff --git a/modules/articoli/plugins/articoli.giacenze.php b/modules/articoli/plugins/articoli.giacenze.php index 3cffffd41..44e414496 100644 --- a/modules/articoli/plugins/articoli.giacenze.php +++ b/modules/articoli/plugins/articoli.giacenze.php @@ -1,46 +1,243 @@ fetchArray('(SELECT "0" AS id, "Sede legale" AS nomesede) UNION (SELECT id, CONCAT(nomesede, " - ", citta ) AS nomesede FROM an_sedi WHERE idanagrafica='.prepare(setting('Azienda predefinita')).')'); -?> +include_once __DIR__.'/../../../core.php'; +$impegnato = 0; +$ordinato = 0; + +$query = 'SELECT + or_ordini.id AS id, + or_ordini.numero, + or_ordini.numero_esterno, + data, + SUM(or_righe_ordini.qta) AS qta_ordinata, + or_righe_ordini.um +FROM or_ordini + INNER JOIN or_righe_ordini ON or_ordini.id = or_righe_ordini.idordine +WHERE idarticolo = '.prepare($articolo->id)." + AND (SELECT dir FROM or_tipiordine WHERE or_tipiordine.id=or_ordini.idtipoordine) = '|direzione|' + AND (or_righe_ordini.qta - or_righe_ordini.qta_evasa) > 0 +GROUP BY or_ordini.id +HAVING qta_ordinata > 0"; + +/* + ** Impegnato + */ +echo '
-
-
-
-

-
- -
- - - - - - - +
+
+ Quantità impegnate in ordini cliente che non siano già completamente evasi o articoli in cesta commessa +
-
- fetchOne("SELECT SUM(mg_movimenti.qta) AS qta, IF(mg_movimenti.idsede_azienda= 0,'Sede legale',(CONCAT_WS(' - ',an_sedi.nomesede,an_sedi.citta))) as sede FROM mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_azienda WHERE mg_movimenti.idarticolo=".prepare($id_record).' AND idsede_azienda='.prepare($sede['id']).' GROUP BY idsede_azienda'); +
+
+

Impegnato

+
+
- // Lettura eventuali movimenti ad una propria sede (nel caso di movimenti fra sedi della mia azienda) - if ($sede['id'] != 0) { - $qta_controparte = $dbo->fetchOne("SELECT SUM(mg_movimenti.qta) AS qta, IF(mg_movimenti.idsede_controparte= 0,'Sede legale',(CONCAT_WS(' - ',an_sedi.nomesede,an_sedi.citta))) as sede FROM mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_controparte WHERE mg_movimenti.idarticolo=".prepare($id_record).' AND idsede_controparte='.prepare($sede['id']).' GROUP BY idsede_controparte'); - } else { - $qta_controparte = $dbo->fetchOne("SELECT SUM(mg_movimenti.qta) AS qta, IF(mg_movimenti.idsede_controparte= 0,'Sede legale',(CONCAT_WS(' - ',an_sedi.nomesede,an_sedi.citta))) as sede FROM ((( mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_controparte ) LEFT JOIN dt_ddt ON mg_movimenti.idddt = dt_ddt.id ) LEFT JOIN co_documenti ON mg_movimenti.iddocumento = co_documenti.id ) WHERE mg_movimenti.idarticolo=".prepare($id_record).' AND idsede_controparte='.prepare($sede['id']).' AND IFNULL( dt_ddt.idanagrafica, co_documenti.idanagrafica ) = '.prepare(setting('Azienda predefinita')).' GROUP BY idsede_controparte'); - } +
+ + + + + + + + '; - echo ' +$ordini = $dbo->fetchArray(str_replace('|dir|', 'entrata', $query)); +$impegnato = sum(array_column($ordini, 'qta_ordinata')); + +$modulo = Modules::get('Ordini cliente'); +foreach ($ordini as $documento) { + $numero = !empty($documento['numero_esterno']) ? $documento['numero_esterno'] : $documento['numero']; + $qta = $documento['qta_ordinata']; + + echo ' + + + + '; +} + +echo ' + + + + + +
DescrizioneQta
+ '.Modules::link($modulo['id'], $documento['id'], tr('Ordine num. _NUM_ del _DATE_', [ + '_NUM_' => $numero, + '_DATE_' => dateFormat($documento['data']), + ])).' + + '.numberFormat($qta).' '.$documento['um'].' +
+ Totale + + '.numberFormat($impegnato).' +
+
+
+
'; + +/* + ** In ordine + */ +echo ' +
+
Quantità ordinate al fornitore in ordini che non siano già completamente evasi
+ +
+
+

In ordine

+
+
+ + + + + + + + + + '; + +$ordini = $dbo->fetchArray(str_replace('|dir|', 'uscita', $query)); +$ordinato = sum(array_column($ordini, 'qta_ordinata')); + +$modulo = Modules::get('Ordini cliente'); +foreach ($ordini as $documento) { + $numero = !empty($documento['numero_esterno']) ? $documento['numero_esterno'] : $documento['numero']; + $qta = $documento['qta_ordinata']; + + echo ' + + + + '; +} + +echo ' + + + + + +
DescrizioneQta
+ '.Modules::link($modulo['id'], $documento['id'], tr('Ordine num. _NUM_ del _DATE_', [ + '_NUM_' => $numero, + '_DATE_' => dateFormat($documento['data']), + ])).' + + '.numberFormat($qta).' '.$documento['um'].' +
+ Totale + + '.numberFormat($ordinato).' +
+
+
+
'; + +/** + ** Da ordinare. + */ +$qta_presente = $articolo->qta > 0 ? $articolo->qta : 0; +$diff = ($qta_presente - $impegnato + $ordinato) * -1; +$da_ordinare = $diff < 0 ? 0 : $diff; + +echo ' +
+
Quantità richieste dal cliente meno le quantità già ordinate
+ +
+
+

Da ordinare

+
+
+
+
+ + '.numberFormat($da_ordinare).' '.$articolo->um.' +
+
+
+
+
'; + +/** + ** Disponibile. + */ +$qta_disponibile = $qta_presente - $impegnato; +$disponibile = $qta_presente < 0 ? 0 : $qta_presente; +echo ' +
+
Quantità disponibili nel magazzino
+ +
+
+

Disponibile

+
+
+ +
+
+ '.numberFormat($disponibile).' '.$articolo->um.' +
+
+ +
+
+
+
'; + +$sedi = $dbo->fetchArray('(SELECT "0" AS id, "Sede legale" AS nomesede) UNION (SELECT id, CONCAT(nomesede, " - ", citta ) AS nomesede FROM an_sedi WHERE idanagrafica='.prepare(setting('Azienda predefinita')).')'); + +echo ' +
+
+
+
+

'.tr('Giacenze').'

+
+ +
+ + + + + + + + + '; + +foreach ($sedi as $sede) { + // Lettura movimenti delle mie sedi + $qta_azienda = $dbo->fetchOne("SELECT SUM(mg_movimenti.qta) AS qta, IF(mg_movimenti.idsede_azienda= 0,'Sede legale',(CONCAT_WS(' - ',an_sedi.nomesede,an_sedi.citta))) as sede FROM mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_azienda WHERE mg_movimenti.idarticolo=".prepare($id_record).' AND idsede_azienda='.prepare($sede['id']).' GROUP BY idsede_azienda'); + + // Lettura eventuali movimenti ad una propria sede (nel caso di movimenti fra sedi della mia azienda) + if ($sede['id'] != 0) { + $qta_controparte = $dbo->fetchOne("SELECT SUM(mg_movimenti.qta) AS qta, IF(mg_movimenti.idsede_controparte= 0,'Sede legale',(CONCAT_WS(' - ',an_sedi.nomesede,an_sedi.citta))) as sede FROM mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_controparte WHERE mg_movimenti.idarticolo=".prepare($id_record).' AND idsede_controparte='.prepare($sede['id']).' GROUP BY idsede_controparte'); + } else { + $qta_controparte = $dbo->fetchOne("SELECT SUM(mg_movimenti.qta) AS qta, IF(mg_movimenti.idsede_controparte= 0,'Sede legale',(CONCAT_WS(' - ',an_sedi.nomesede,an_sedi.citta))) as sede FROM ((( mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_controparte ) LEFT JOIN dt_ddt ON mg_movimenti.idddt = dt_ddt.id ) LEFT JOIN co_documenti ON mg_movimenti.iddocumento = co_documenti.id ) WHERE mg_movimenti.idarticolo=".prepare($id_record).' AND idsede_controparte='.prepare($sede['id']).' AND IFNULL( dt_ddt.idanagrafica, co_documenti.idanagrafica ) = '.prepare(setting('Azienda predefinita')).' GROUP BY idsede_controparte'); + } + + echo ' '; - } ?> - -
'.tr('Sede').''.tr('Q.tà').'
'.$sede['nomesede'].' '.Translator::numberToLocale($qta_azienda['qta'] - $qta_controparte['qta']).'
-
+} + + echo ' + + +
+
- - +'; diff --git a/modules/articoli/plugins/articoli.movimenti.php b/modules/articoli/plugins/articoli.movimenti.php index 259215cb1..a3288c207 100644 --- a/modules/articoli/plugins/articoli.movimenti.php +++ b/modules/articoli/plugins/articoli.movimenti.php @@ -3,7 +3,6 @@ include_once __DIR__.'/../../../core.php'; // Movimentazione degli articoli - echo '
@@ -30,9 +29,8 @@ if (empty($_GET['show_all1'])) { $query .= ' LIMIT 0, 20'; } -$rs2 = $dbo->fetchArray($query); - -if (!empty($rs2)) { +$movimenti = $dbo->fetchArray($query); +if (!empty($movimenti)) { if (empty($_GET['show_all1'])) { echo '

[ '.tr('Mostra tutti i movimenti').' ]

'; @@ -44,42 +42,63 @@ if (!empty($rs2)) { echo ' - - - + + + + '; - foreach ($rs2 as $r) { + + foreach ($movimenti as $i => $movimento) { + // Quantità progressiva + if ($i == 0) { + $movimento['progressivo_finale'] = $articolo->qta; + } else { + $movimento['progressivo_finale'] = $movimenti[$i - 1]['progressivo_iniziale']; + } + $movimento['progressivo_iniziale'] = $movimento['progressivo_finale'] - intval($movimento['qta']); + + $movimenti[$i]['progressivo_iniziale'] = $movimento['progressivo_iniziale']; + $movimenti[$i]['progressivo_finale'] = $movimento['progressivo_finale']; + // Quantità echo ' - '; + + + '; // Causale - $dir = ($r['qta'] < 0) ? 'vendita' : 'acquisto'; + $dir = ($movimento['qta'] < 0) ? 'vendita' : 'acquisto'; - if (!empty($r['iddocumento'])) { - $dir = $dbo->fetchArray('SELECT dir FROM co_tipidocumento WHERE id = (SELECT idtipodocumento FROM co_documenti WHERE id = '.prepare($r['iddocumento']).')')[0]['dir'] == 'entrata' ? 'vendita' : 'acquisto'; + if (!empty($movimento['iddocumento'])) { + $dir = $dbo->fetchArray('SELECT dir FROM co_tipidocumento WHERE id = (SELECT idtipodocumento FROM co_documenti WHERE id = '.prepare($movimento['iddocumento']).')')[0]['dir'] == 'entrata' ? 'vendita' : 'acquisto'; } echo ' - '; // Data echo ' - '; + '; // Operazioni echo ' '; } + echo '
'.tr('Q.tà').''.tr('Causale').''.tr('Data').''.tr('Q.tà').''.tr('Q.tà progressiva').''.tr('Causale').''.tr('Data').' #
'.Translator::numberToLocale($r['qta'], 'qta').' '.$record['um'].' + '.numberFormat($movimento['qta'], 'qta').' '.$record['um'].' + + '.numberFormat($movimento['progressivo_iniziale'], 'qta').' '.$record['um'].' + + '.numberFormat($movimento['progressivo_finale'], 'qta').' '.$record['um'].' + '.$r['movimento'].' - '.((!empty($r['idintervento'])) ? Modules::link('Interventi', $r['idintervento']) : '').' - '.((!empty($r['idddt'])) ? (Modules::link('DDt di '.$dir, $r['idddt'], null, null, (intval($database->fetchOne('SELECT * FROM `dt_ddt` WHERE `id` ='.prepare($r['idddt'])))) ? '' : 'class="disabled"')) : '').' - '.((!empty($r['iddocumento'])) ? (Modules::link('Fatture di '.$dir, $r['iddocumento'], null, null, (intval($database->fetchOne('SELECT * FROM `co_documenti` WHERE `id` ='.prepare($r['iddocumento'])))) ? '' : 'class="disabled"')) : '').' + '.$movimento['movimento'].' + '.((!empty($movimento['idintervento'])) ? Modules::link('Interventi', $movimento['idintervento']) : '').' + '.((!empty($movimento['idddt'])) ? (Modules::link('DDt di '.$dir, $movimento['idddt'], null, null, (intval($database->fetchOne('SELECT * FROM `dt_ddt` WHERE `id` ='.prepare($movimento['idddt'])))) ? '' : 'class="disabled"')) : '').' + '.((!empty($movimento['iddocumento'])) ? (Modules::link('Fatture di '.$dir, $movimento['iddocumento'], null, null, (intval($database->fetchOne('SELECT * FROM `co_documenti` WHERE `id` ='.prepare($movimento['iddocumento'])))) ? '' : 'class="disabled"')) : '').' '.Translator::dateToLocale($r['data']).' '.Translator::dateToLocale($movimento['data']).' '; - if (Auth::admin() && $r['manuale'] == '1') { + if (Auth::admin() && $movimento['manuale'] == '1') { echo ' - + '; } @@ -88,13 +107,14 @@ if (!empty($rs2)) {
'; } else { echo '
- '.tr('Questo articolo non è ancora stato movimentato', []).'. + '.tr('Questo articolo non è ancora stato movimentato').'.
'; }