@@ -347,4 +344,39 @@ function controlla_sconto() {
}
}
';
-}
\ No newline at end of file
+}
+
+if (in_array($module['name'], ['Ordini fornitore'])) {
+ echo '
+
+
+
+
+
+
+
+
+
+ '.tr('Mese').'
+ '.tr('Q.tà').'
+ '.tr('Totale').'
+
+
+
+ ' . tr('Nessuna Vendita') . '
+
+
+
+
+
+
+
+ ';
+}
+
diff --git a/migration.sql b/migration.sql
new file mode 100644
index 000000000..9a3a83cfb
--- /dev/null
+++ b/migration.sql
@@ -0,0 +1,14 @@
+CREATE TABLE `mg_articoli_sedi` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `id_articolo` int(11) NOT NULL,
+ `id_sede` int(11) DEFAULT NULL,
+ `threshold_qta` int(11) NOT NULL COMMENT 'soglia minima',
+ `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
+ `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+
+INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`, `created_at`, `updated_at`, `order`, `help`)
+SELECT 'Gestisci soglia minima per magazzino', '1', 'boolean', '1', 'Magazzino', '2022-12-21 14:51:03', '2023-01-05 11:29:48', NULL, NULL
+FROM `zz_settings`
+WHERE ((`id` = '21'));
diff --git a/modules/articoli/actions.php b/modules/articoli/actions.php
index 9f7e1955a..e97a186bb 100755
--- a/modules/articoli/actions.php
+++ b/modules/articoli/actions.php
@@ -72,7 +72,7 @@
$articolo->um = post('um');
$articolo->um_secondaria = post('um_secondaria');
$articolo->fattore_um_secondaria = post('fattore_um_secondaria');
-
+
$articolo->save();
// Aggiornamento delle varianti per i campi comuni
@@ -109,6 +109,7 @@
// Modifica articolo
case 'update':
$qta = post('qta');
+ $tresholdSedi = post('threshold_qta_sedi');
// Inserisco l'articolo e avviso se esiste un altro articolo con stesso codice.
$numero_codice = Articolo::where([
@@ -130,7 +131,7 @@
$articolo->id_sottocategoria = post('subcategoria');
$articolo->abilita_serial = post('abilita_serial');
$articolo->ubicazione = post('ubicazione');
- $articolo->threshold_qta = post('threshold_qta');
+ $articolo->threshold_qta = $tresholdSedi[0];
$articolo->coefficiente = post('coefficiente');
$articolo->idiva_vendita = post('idiva_vendita');
$articolo->prezzo_acquisto = post('prezzo_acquisto');
@@ -158,14 +159,35 @@
$articolo->save();
+ // Aggiorno le soglie minime per le sedi
+ $gestisciMagazzini = $dbo->fetchOne('SELECT * FROM zz_settings WHERE nome = "Gestisci soglia minima per magazzino"');
+
+ if ($gestisciMagazzini['valore'] == '1') {
+ foreach ($tresholdSedi as $id_sede => $treshold) {
+ $item = $dbo->fetchOne(
+ 'SELECT * FROM mg_articoli_sedi WHERE id_articolo = ' . prepare($id_record) . ' AND id_sede = ' . prepare($id_sede)
+ );
+
+ if (empty($item)) {
+ $dbo->query(
+ 'INSERT INTO mg_articoli_sedi(id_articolo, id_sede, threshold_qta)
+ VALUES(' . prepare($id_record) . ', ' . prepare($id_sede) . ', ' . prepare($treshold) . ')'
+ );
+ } else {
+ $dbo->query(
+ 'UPDATE mg_articoli_sedi SET threshold_qta = '. prepare($treshold) . '
+ WHERE id_articolo = ' . prepare($id_record) . ' AND id_sede = ' . prepare($id_sede)
+ );
+ }
+ }
+ }
+
// Aggiornamento delle varianti per i campi comuni
Combinazione::sincronizzaVarianti($articolo);
// Leggo la quantità attuale per capire se l'ho modificata
- // TODO: gestire la movimentazione manuale per sede
- $id_sede = 0;
- $old_qta = $articolo->getGiacenze(post('data_movimento'));
- $movimento = $qta - $old_qta[$id_sede][0];
+ $old_qta = $record['qta'];
+ $movimento = $qta - $old_qta;
$qta_manuale = post('qta_manuale');
if (!empty($qta_manuale)) {
@@ -244,7 +266,7 @@
// Duplica articolo
case 'copy':
$new = $articolo->replicate();
-
+
//Se non specifico il codice articolo lo imposto uguale all'id della riga
if (empty(post('codice'))) {
$codice = $dbo->fetchOne('SELECT MAX(id) as codice FROM mg_articoli')['codice'] + 1;
diff --git a/modules/articoli/ajax/complete.php b/modules/articoli/ajax/complete.php
index 2396d6b17..9ecaab9f9 100755
--- a/modules/articoli/ajax/complete.php
+++ b/modules/articoli/ajax/complete.php
@@ -19,6 +19,8 @@
include_once __DIR__.'/../../../core.php';
+use Modules\Articoli\Articolo;
+
$idarticolo = get('idarticolo');
$limit = get('limit');
@@ -144,7 +146,7 @@
$prezzi = $database->fetchArray($query_anagrafica);
// Prezzi listini clienti
- $query = 'SELECT sconto_percentuale AS sconto_percentuale_listino,
+ $query = 'SELECT sconto_percentuale AS sconto_percentuale_listino, mg_listini.nome,
'.($prezzi_ivati ? 'prezzo_unitario_ivato' : 'prezzo_unitario').' AS prezzo_unitario_listino
FROM mg_listini
LEFT JOIN mg_listini_articoli ON mg_listini.id=mg_listini_articoli.id_listino
@@ -177,5 +179,138 @@
echo json_encode($results);
+ break;
+
+ case 'getGiacenze':
+ $id_articolo = get('id_articolo');
+ $id_anagrafica = get('id_anagrafica');
+ $direzione = get('dir') == 'uscita' ? 'uscita' : 'entrata';
+
+ if (empty($id_articolo) || empty($id_anagrafica)) {
+ return;
+ }
+
+ $articolo = Articolo::find($id_articolo);
+ $giacenze = $articolo->getGiacenze();
+ $sedi = $dbo->fetchArray('(SELECT "0" AS id, IF(indirizzo!=\'\', CONCAT_WS(" - ", "'.tr('Sede legale').'", CONCAT(citta, \' (\', indirizzo, \')\')), CONCAT_WS(" - ", "'.tr('Sede legale').'", citta)) AS nomesede FROM an_anagrafiche WHERE idanagrafica = '.prepare(setting('Azienda predefinita')).') UNION (SELECT id, IF(indirizzo!=\'\',CONCAT_WS(" - ", nomesede, CONCAT(citta, \' (\', indirizzo, \')\')), CONCAT_WS(" - ", nomesede, citta )) AS nomesede FROM an_sedi WHERE idanagrafica='.prepare(setting('Azienda predefinita')).')');
+
+ $results = [
+ 'articolo' => $articolo,
+ 'giacenze' => $giacenze,
+ 'sedi' => $sedi,
+ ];
+
+ echo json_encode($results);
+
+ break;
+
+ case 'getDatiVendita':
+ $id_articolo = get('id_articolo');
+ $id_anagrafica = get('id_anagrafica');
+ $direzione = get('dir') == 'uscita' ? 'uscita' : 'entrata';
+
+ if (empty($id_articolo) || empty($id_anagrafica)) {
+ return;
+ }
+
+ //get current date
+ $current_month = date('m');
+ $current_year = date('Y');
+
+ for ($i = 0; $i < 12; ++$i) {
+ $month = $current_month;
+ $year = $current_year;
+
+ $datiVendita[] = [
+ 'mese' => $month,
+ 'anno' => $year,
+ 'data' => $dbo->fetchArray(
+ 'SELECT SUM(IF(reversed=1, -co_righe_documenti.qta, co_righe_documenti.qta)) AS qta,
+ SUM(
+ IF(reversed=1, -(co_righe_documenti.subtotale - co_righe_documenti.sconto), (co_righe_documenti.subtotale - co_righe_documenti.sconto))
+ ) AS totale,
+ mg_articoli.id, mg_articoli.codice, mg_articoli.descrizione, mg_articoli.um
+ FROM co_documenti
+ INNER JOIN co_statidocumento ON co_statidocumento.id = co_documenti.idstatodocumento
+ INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id
+ INNER JOIN co_righe_documenti ON co_righe_documenti.iddocumento=co_documenti.id
+ INNER JOIN mg_articoli ON mg_articoli.id=co_righe_documenti.idarticolo
+ INNER JOIN zz_segments ON co_documenti.id_segment=zz_segments.id
+ WHERE co_tipidocumento.dir = "entrata"
+ AND
+ (co_statidocumento.descrizione = "Pagato"
+ OR co_statidocumento.descrizione = "Parzialmente pagato"
+ OR co_statidocumento.descrizione = "Emessa"
+ )
+ AND MONTH(co_documenti.data) = ' . $month . '
+ AND YEAR(co_documenti.data) = ' . $year . '
+ AND mg_articoli.id = ' . $id_articolo . '
+ AND zz_segments.autofatture=0
+ GROUP BY co_righe_documenti.idarticolo'
+ ),
+ ];
+
+ if ($current_month == 1) {
+ $current_month = 12;
+ $current_year--;
+ } else {
+ $current_month--;
+ }
+
+ }
+
+ $results = [
+ 'datiVendita' => $datiVendita,
+ ];
+
+ echo json_encode($results);
+
+ break;
+
+ case 'articoli_barcode_file':
+ $prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA');
+ $id_anagrafica = get('id_anagrafica'); // ID passato via URL in modo fisso
+ $barcodes = json_decode(get('barcodes'), true);
+ $barcodeTrovati = [];
+
+ foreach ($barcodes as $barcode => $qta) {
+ //select barcode
+ $rs = $dbo->fetchOne(
+ 'SELECT mg_articoli.*,
+ IFNULL(mg_fornitore_articolo.codice_fornitore, mg_articoli.codice) AS codice,
+ IFNULL(mg_fornitore_articolo.descrizione, mg_articoli.descrizione) AS descrizione,
+ IFNULL(mg_fornitore_articolo.prezzo_acquisto, mg_articoli.prezzo_acquisto) AS prezzo_acquisto,
+ mg_articoli.'.($prezzi_ivati ? 'prezzo_vendita_ivato' : 'prezzo_vendita').' AS prezzo_vendita,
+ mg_articoli.prezzo_vendita_ivato AS prezzo_vendita_ivato,
+ IFNULL(mg_fornitore_articolo.qta_minima, 0) AS qta_minima,
+ mg_fornitore_articolo.id AS id_dettaglio_fornitore
+ FROM mg_articoli
+ LEFT JOIN mg_fornitore_articolo
+ ON mg_fornitore_articolo.id_articolo = mg_articoli.id
+ AND mg_fornitore_articolo.deleted_at IS NULL
+ AND mg_fornitore_articolo.id_fornitore = '.prepare($id_anagrafica).'
+ WHERE mg_articoli.attivo = 1 AND mg_articoli.deleted_at IS NULL AND REPLACE(mg_articoli.barcode, "/", "-") = ' . prepare($barcode)
+ );
+
+ if (!empty($rs)) {
+ $barcodeTrovati[] = [
+ 'dettaglio' => $rs,
+ 'qta' => $qta,
+ ];
+ } else {
+ $barcodeTrovati[] = [
+ 'dettaglio' => null,
+ 'barcode' => $barcode,
+ 'qta' => $qta,
+ ];
+ }
+ }
+
+ $results = [
+ 'barcodeTrovati' => $barcodeTrovati,
+ ];
+
+ echo json_encode($results);
+
break;
}
diff --git a/modules/articoli/edit.php b/modules/articoli/edit.php
index e52d6f4c6..2046d5cae 100755
--- a/modules/articoli/edit.php
+++ b/modules/articoli/edit.php
@@ -166,16 +166,46 @@
-
+
{[ "type": "number", "label": "", "name": "prezzo_acquisto", "value": "$prezzo_acquisto$", "icon-after": "", "help": "." ]}
-
+
{[ "type": "number", "label": "", "name": "coefficiente", "value": "$coefficiente$", "help": "." ]}
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {[ "type": "number", "name": "threshold_qta_sedi[]", "value": "", "decimals": "qta", "min-value": "0" ]}
+
+
+
+
+
+
+ {[ "type": "number", "name": "threshold_qta_sedi[]", "value": "", "decimals": "qta", "min-value": "0" ]}
+
+
+
+
+
diff --git a/modules/articoli/init.php b/modules/articoli/init.php
index 9e0c0a3db..77d4f01f3 100755
--- a/modules/articoli/init.php
+++ b/modules/articoli/init.php
@@ -25,5 +25,35 @@
$articolo = Articolo::withTrashed()->find($id_record);
$articolo->nome_variante;
+ $gestisciMagazzini = $dbo->fetchOne('SELECT * FROM zz_settings WHERE nome = "Gestisci soglia minima per magazzino"');
+
+ if ($gestisciMagazzini['valore'] == '1') {
+ $articoloSedeLegale = $dbo->fetchOne(
+ 'SELECT "0" as id_sede , CONCAT("Sede legale - ", citta) as nomesede, mgas.id_articolo, mgas.threshold_qta
+ FROM an_anagrafiche ana
+ LEFT JOIN mg_articoli_sedi mgas
+ ON mgas.id_sede = " " AND mgas.id_articolo = ' . prepare($id_record) . '
+ WHERE ana.idanagrafica = 1'
+ );
+
+ $articoloSedi = $dbo->fetchArray(
+ 'SELECT ans.id as id_sede, ans.nomesede, mgas.id_articolo, mgas.threshold_qta
+ FROM an_sedi ans
+ LEFT JOIN mg_articoli_sedi mgas
+ ON ans.id = mgas.id_sede AND mgas.id_articolo = ' . prepare($id_record) . '
+ WHERE ans.idanagrafica = 1'
+ );
+ } else {
+ $articoloSedeLegale = $dbo->fetchOne(
+ 'SELECT "0" as id_sede , CONCAT("Sede legale - ", citta) as nomesede, mga.id as id_articolo, mga.threshold_qta
+ FROM an_anagrafiche ana
+ LEFT JOIN mg_articoli mga
+ ON ana.idanagrafica = 1
+ WHERE mga.id = ' . prepare($id_record) . ''
+ );
+
+ $articoloSedi = [];
+ }
+
$record = $dbo->fetchOne('SELECT *, (SELECT COUNT(id) FROM mg_prodotti WHERE id_articolo = mg_articoli.id) AS serial FROM mg_articoli WHERE id='.prepare($id_record));
}
diff --git a/modules/articoli/plugins/articoli.giacenze.php b/modules/articoli/plugins/articoli.giacenze.php
index c0e409244..43b640274 100755
--- a/modules/articoli/plugins/articoli.giacenze.php
+++ b/modules/articoli/plugins/articoli.giacenze.php
@@ -21,25 +21,59 @@
$impegnato = 0;
$ordinato = 0;
+$gestisciMagazzini = $dbo->fetchOne('SELECT * FROM zz_settings WHERE nome = "Gestisci soglia minima per magazzino"');
+$sedi = $dbo->fetchArray('(SELECT "0" AS id, IF(indirizzo!=\'\', CONCAT_WS(" - ", "'.tr('Sede legale').'", CONCAT(citta, \' (\', indirizzo, \')\')), CONCAT_WS(" - ", "'.tr('Sede legale').'", citta)) AS nomesede FROM an_anagrafiche WHERE idanagrafica = '.prepare(setting('Azienda predefinita')).') UNION (SELECT id, IF(indirizzo!=\'\',CONCAT_WS(" - ", nomesede, CONCAT(citta, \' (\', indirizzo, \')\')), CONCAT_WS(" - ", nomesede, citta )) AS nomesede FROM an_sedi WHERE idanagrafica='.prepare(setting('Azienda predefinita')).')');
+$giacenze = $articolo->getGiacenze();
-$query = 'SELECT
- or_ordini.id AS id,
- or_ordini.numero,
- or_ordini.numero_esterno,
- data,
- SUM(or_righe_ordini.qta) AS qta_ordinata,
- SUM(or_righe_ordini.qta - or_righe_ordini.qta_evasa) AS qta_impegnata,
- or_righe_ordini.um
-FROM or_ordini
- INNER JOIN or_righe_ordini ON or_ordini.id = or_righe_ordini.idordine
- INNER JOIN or_statiordine ON or_ordini.idstatoordine=or_statiordine.id
-WHERE idarticolo = '.prepare($articolo->id)."
- AND (SELECT dir FROM or_tipiordine WHERE or_tipiordine.id=or_ordini.idtipoordine) = '|dir|'
- AND (or_righe_ordini.qta - or_righe_ordini.qta_evasa) > 0
- AND or_righe_ordini.confermato = 1
- AND or_statiordine.impegnato = 1
-GROUP BY or_ordini.id
-HAVING qta_ordinata > 0";
+if ($gestisciMagazzini['valore'] == '1') {
+ $query = 'SELECT
+ or_ordini.id_sede_partenza,
+ or_ordini.id AS id,
+ or_ordini.numero,
+ or_ordini.numero_esterno,
+ data,
+ SUM(or_righe_ordini.qta) AS qta_ordinata,
+ SUM(or_righe_ordini.qta - or_righe_ordini.qta_evasa) AS qta_impegnata,
+ or_righe_ordini.um,
+ IF(
+ or_ordini.id_sede_partenza = 0,
+ CONCAT_WS(" - ", "Sede legale", CONCAT(citta, " (", indirizzo, ")")),
+ (
+ SELECT CONCAT_WS(" - ", nomesede, CONCAT(citta, " (", indirizzo, ")"))
+ FROM an_sedi WHERE idanagrafica="1" AND or_ordini.id_sede_partenza = an_sedi.id
+ )
+ ) AS Magazzino
+ FROM or_ordini
+ INNER JOIN or_righe_ordini ON or_ordini.id = or_righe_ordini.idordine
+ INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica = 1
+ INNER JOIN or_statiordine ON or_ordini.idstatoordine=or_statiordine.id
+ WHERE idarticolo = '.prepare($articolo->id).'
+ AND (SELECT dir FROM or_tipiordine WHERE or_tipiordine.id=or_ordini.idtipoordine) = "|dir|"
+ AND (or_righe_ordini.qta - or_righe_ordini.qta_evasa) > 0
+ AND or_righe_ordini.confermato = 1
+ AND or_statiordine.impegnato = 1
+ GROUP BY or_ordini.id
+ HAVING qta_ordinata > 0';
+} else {
+ $query = 'SELECT
+ or_ordini.id AS id,
+ or_ordini.numero,
+ or_ordini.numero_esterno,
+ data,
+ SUM(or_righe_ordini.qta) AS qta_ordinata,
+ SUM(or_righe_ordini.qta - or_righe_ordini.qta_evasa) AS qta_impegnata,
+ or_righe_ordini.um
+ FROM or_ordini
+ INNER JOIN or_righe_ordini ON or_ordini.id = or_righe_ordini.idordine
+ INNER JOIN or_statiordine ON or_ordini.idstatoordine=or_statiordine.id
+ WHERE idarticolo = '.prepare($articolo->id).'
+ AND (SELECT dir FROM or_tipiordine WHERE or_tipiordine.id=or_ordini.idtipoordine) = "|dir|"
+ AND (or_righe_ordini.qta - or_righe_ordini.qta_evasa) > 0
+ AND or_righe_ordini.confermato = 1
+ AND or_statiordine.impegnato = 1
+ GROUP BY or_ordini.id
+ HAVING qta_ordinata > 0';
+}
echo '
@@ -60,9 +94,18 @@
';
-/*
- ** Impegnato
+/**
+ * Impegnato
*/
+
+if ($gestisciMagazzini['valore'] == '1') {
+ $impegnatoPerSede = [];
+
+ foreach ($sedi as $sede) {
+ $impegnatoPerSede[$sede['id']] = 0;
+ }
+}
+
echo '
@@ -72,66 +115,91 @@
';
-
-$ordini = $dbo->fetchArray(str_replace('|dir|', 'entrata', $query));
-$impegnato = sum(array_column($ordini, 'qta_impegnata'));
-if (!empty($ordini)) {
- echo '
-
-
-
- '.tr('Descrizione').'
- '.$record['um'].'
+ $ordini = $dbo->fetchArray(str_replace('|dir|', 'entrata', $query));
+ $impegnato = sum(array_column($ordini, 'qta_impegnata'));
+ if (!empty($ordini)) {
+ echo '
+
+
+ ';
+ if ($gestisciMagazzini['valore'] == '1') {
+ echo
+ ''.tr('Magazzino').' ';
+ }
+ echo
+ ''.tr('Descrizione').'
+ '.$record['um'].'
+
+
+ ';
+ $modulo = Modules::get('Ordini cliente');
+ foreach ($ordini as $documento) {
+ $numero = !empty($documento['numero_esterno']) ? $documento['numero_esterno'] : $documento['numero'];
+ $qta = $documento['qta_impegnata'];
+ echo '
+ ';
+ if ($gestisciMagazzini['valore'] == '1') {
+ $impegnatoPerSede[$documento['id_sede_partenza']] += $qta;
+
+ echo
+ '
+
+ '.$documento['Magazzino'].'
+
+ ';
+ }
+
+ echo
+ '
+
+ '.Modules::link($modulo['id'], $documento['id'], tr('Ordine num. _NUM_ del _DATE_', [
+ '_NUM_' => $numero,
+ '_DATE_' => dateFormat($documento['data']),
+ ])).'
+
+
+
+ '.numberFormat($qta, 2).'
+
+ ';
+ }
+ echo '
+ ';
+ if ($gestisciMagazzini['valore'] == '1') {
+ echo
+ ' ';
+ }
+ echo
+ '
+ '.tr('Totale').'
+
+
+ '.numberFormat($impegnato, 2).'
+
-
+
';
+ } else {
+ echo '
+ '.tr('Nessun ordine cliente con quantità da evadere individuato').'.
';
+ }
+ echo '
+
+
+ ';
- ';
+ /**
+ * In ordine
+ */
- $modulo = Modules::get('Ordini cliente');
- foreach ($ordini as $documento) {
- $numero = !empty($documento['numero_esterno']) ? $documento['numero_esterno'] : $documento['numero'];
- $qta = $documento['qta_impegnata'];
+ if ($gestisciMagazzini['valore'] == '1') {
+ $ordinatoPerSede = [];
- echo '
-
-
-
- '.Modules::link($modulo['id'], $documento['id'], tr('Ordine num. _NUM_ del _DATE_', [
- '_NUM_' => $numero,
- '_DATE_' => dateFormat($documento['data']),
- ])).'
-
-
-
- '.numberFormat($qta).'
-
- ';
+ foreach ($sedi as $sede) {
+ $ordinatoPerSede[$sede['id']] = 0;
+ }
}
echo '
-
-
- '.tr('Totale').'
-
-
- '.numberFormat($impegnato).'
-
-
-
-
';
-} else {
- echo '
-
'.tr('Nessun ordine cliente con quantità da evadere individuato').'.
';
-}
-echo '
-
-
-
';
-
-/*
- ** In ordine
- */
-echo '
@@ -140,113 +208,218 @@
';
-$ordini = $dbo->fetchArray(str_replace('|dir|', 'uscita', $query));
-$ordinato = sum(array_column($ordini, 'qta_ordinata'));
-if (!empty($ordini)) {
- echo '
+ $ordini = $dbo->fetchArray(str_replace('|dir|', 'uscita', $query));
+ $ordinato = sum(array_column($ordini, 'qta_ordinata'));
+ if (!empty($ordini)) {
+ echo '
-
- '.tr('Descrizione').'
- '.$record['um'].'
+ ';
+ if ($gestisciMagazzini['valore'] == '1') {
+ echo
+ ''.tr('Magazzino').' ';
+ }
+ echo
+ ''.tr('Descrizione').'
+ '.$record['um'].'
';
-
- $modulo = Modules::get('Ordini fornitore');
- foreach ($ordini as $documento) {
- $numero = !empty($documento['numero_esterno']) ? $documento['numero_esterno'] : $documento['numero'];
- $qta = $documento['qta_ordinata'];
-
- echo '
-
-
-
- '.Modules::link($modulo['id'], $documento['id'], tr('Ordine num. _NUM_ del _DATE_', [
- '_NUM_' => $numero,
- '_DATE_' => dateFormat($documento['data']),
- ])).'
-
-
-
- '.numberFormat($qta).'
-
- ';
- }
-
- echo '
-
-
- '.tr('Totale').'
-
-
- '.numberFormat($ordinato).'
-
-
-
+ $modulo = Modules::get('Ordini fornitore');
+ foreach ($ordini as $documento) {
+ $numero = !empty($documento['numero_esterno']) ? $documento['numero_esterno'] : $documento['numero'];
+ $qta = $documento['qta_ordinata'];
+ echo '
+ ';
+ if ($gestisciMagazzini['valore'] == '1') {
+ $ordinatoPerSede[$documento['id_sede_partenza']] += $qta;
+
+ echo
+ '
+
+ '.$documento['Magazzino'].'
+
+ ';
+ }
+ echo
+ '
+
+ '.Modules::link($modulo['id'], $documento['id'], tr('Ordine num. _NUM_ del _DATE_', [
+ '_NUM_' => $numero,
+ '_DATE_' => dateFormat($documento['data']),
+ ])).'
+
+
+
+ '.numberFormat($qta, 2).'
+
+ ';
+ }
+ echo '
+ ';
+ if ($gestisciMagazzini['valore'] == '1') {
+ echo
+ ' ';
+ }
+ echo
+ '
+ '.tr('Totale').'
+
+
+ '.numberFormat($ordinato, 2).'
+
+
';
-} else {
- echo '
+ } else {
+ echo '
'.tr('Nessun ordine fornitore con quantità da evadere individuato').'.
';
-}
-
-echo '
-
+ }
+ echo '
+
';
-/**
- ** Da ordinare.
- */
-$qta_presente = $articolo->qta > 0 ? $articolo->qta : 0;
-$diff = ($qta_presente - $impegnato + $ordinato) * -1;
-$da_ordinare = (($diff <= 0) ? 0 : $diff);
+ /**
+ * Da ordinare.
+ */
+
+ if ($gestisciMagazzini['valore'] == '1') {
+ echo
+ '
+
+
+
'.tr('Da ordinare').'
+
+
+
+
+
+
+ '.tr('Magazzino').'
+ '.$record['um'].'
+
+
+ ';
+ foreach ($sedi as $sede) {
+ $articoloSede = $dbo->fetchOne(
+ 'SELECT threshold_qta, id_sede
+ FROM mg_articoli_sedi
+ WHERE id_articolo = '.prepare($id_record).'
+ AND id_sede = '.prepare($sede['id'])
+ );
+
+ $qta_presente = $giacenze[$sede['id']][0] > 0 ? $giacenze[$sede['id']][0] : 0;
+ $diff = (intval($qta_presente) - intval($impegnatoPerSede[$sede['id']]) +
+ intval($ordinatoPerSede[$sede['id']]) - intval($articoloSede['threshold_qta'])) * -1;
+
+ $da_ordinare = (($diff <= 0) ? 0 : $diff);
+
+ echo
+ '
+
+
+ '.$sede['nomesede'].'
+
+
+
+
+ '.numberFormat($da_ordinare, 2).'
+
+
+
+
+
+ ';
+ }
+ echo
+ '
+
+
+
+
';
+ } else {
+ $qta_presente = $articolo->qta > 0 ? $articolo->qta : 0;
+ $diff = ($qta_presente - $impegnato + $ordinato) * -1;
+ $da_ordinare = (($diff <= 0) ? 0 : $diff);
-echo '
-
-
-
-
'.tr('Da ordinare').'
-
-
-
-
-
- '.numberFormat($da_ordinare).' '.$articolo->um.'
-
-
-
-
-
';
+ echo '
+
+
+
+
'.tr('Da ordinare').'
+
+
+
+
+
+ '.numberFormat($da_ordinare, 2).' '.$articolo->um.'
+
+
+
+
+
';
+ }
-/**
- ** Disponibile.
- */
-$disponibile = $qta_presente - $impegnato;
-echo '
-
-
-
-
'.tr('Disponibile').'
+ /**
+ * Disponibile.
+ */
+ $qta_presente = $articolo->qta > 0 ? $articolo->qta : 0;
+ $disponibile = $qta_presente - $impegnato;
+
+ echo '
+
+
+
+
'.tr('Disponibile').'
-
-
+
+
-
-
- '.numberFormat($disponibile).' '.$articolo->um.'
-
-
+
+
+ '.numberFormat($disponibile, 2).' '.$articolo->um.'
+
+
-
-
-
+
+
+
';
-$sedi = $dbo->fetchArray('(SELECT "0" AS id, IF(indirizzo!=\'\', CONCAT_WS(" - ", "'.tr('Sede legale').'", CONCAT(citta, \' (\', indirizzo, \')\')), CONCAT_WS(" - ", "'.tr('Sede legale').'", citta)) AS nomesede FROM an_anagrafiche WHERE idanagrafica = '.prepare(setting('Azienda predefinita')).') UNION (SELECT id, IF(indirizzo!=\'\',CONCAT_WS(" - ", nomesede, CONCAT(citta, \' (\', indirizzo, \')\')), CONCAT_WS(" - ", nomesede, citta )) AS nomesede FROM an_sedi WHERE idanagrafica='.prepare(setting('Azienda predefinita')).')');
-$giacenze = $articolo->getGiacenze();
-
+/**
+ * Giacenze
+ */
echo '
@@ -266,20 +439,18 @@
';
-
-foreach ($sedi as $sede) {
- echo '
-
- '.$sede['nomesede'].'
- '.numberFormat($giacenze[$sede['id']][0]).' '.$articolo->um.'
-
-
-
-
-
- ';
-}
-
+ foreach ($sedi as $sede) {
+ echo '
+
+ '.$sede['nomesede'].'
+ '.numberFormat($giacenze[$sede['id']][0], 2).' '.$articolo->um.'
+
+
+
+
+
+ ';
+ }
echo '
@@ -296,4 +467,4 @@ 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 );
}
-';
\ No newline at end of file
+';
diff --git a/modules/ordini/actions.php b/modules/ordini/actions.php
index df04ea1da..078c85793 100755
--- a/modules/ordini/actions.php
+++ b/modules/ordini/actions.php
@@ -43,11 +43,12 @@
$idanagrafica = post('idanagrafica');
$data = post('data');
$id_segment = post('id_segment');
+ $id_sede_partenza = post('id_sede_partenza');
$anagrafica = Anagrafica::find($idanagrafica);
$tipo = Tipo::where('dir', $dir)->first();
- $ordine = Ordine::build($anagrafica, $tipo, $data, $id_segment);
+ $ordine = Ordine::build($anagrafica, $tipo, $data, $id_segment, $id_sede_partenza);
$id_record = $ordine->id;
flash()->info(tr('Aggiunto ordine numero _NUM_!', [
@@ -61,6 +62,7 @@
$idstatoordine = post('idstatoordine');
$idpagamento = post('idpagamento');
$idsede = post('idsede');
+ $id_sede_partenza = post('id_sede_partenza');
$totale_imponibile = get_imponibile_ordine($id_record);
$totale_ordine = get_totale_ordine($id_record);
@@ -92,6 +94,7 @@
$ordine->idstatoordine = $idstatoordine;
$ordine->idpagamento = $idpagamento;
$ordine->idsede = $idsede;
+ $ordine->id_sede_partenza = $id_sede_partenza;
$ordine->idconto = post('idconto');
$ordine->idrivalsainps = $idrivalsainps;
$ordine->idritenutaacconto = $idritenutaacconto;
@@ -332,7 +335,7 @@
// Scollegamento riga generica da ordine
case 'delete_riga':
$id_righe = (array)post('righe');
-
+
foreach ($id_righe as $id_riga) {
$riga = Articolo::find($id_riga) ?: Riga::find($id_riga);
$riga = $riga ?: Descrizione::find($id_riga);
@@ -356,7 +359,7 @@
// Duplicazione riga
case 'copy_riga':
$id_righe = (array)post('righe');
-
+
foreach ($id_righe as $id_riga) {
$riga = Articolo::find($id_riga) ?: Riga::find($id_riga);
$riga = $riga ?: Descrizione::find($id_riga);
@@ -424,7 +427,9 @@
if (post('create_document') == 'on') {
$tipo = Tipo::where('dir', $documento->direzione)->first();
- $ordine = Ordine::build($documento->anagrafica, $tipo, post('data'), post('id_segment'));
+ $id_sede_partenza = post('id_sede_partenza');
+
+ $ordine = Ordine::build($documento->anagrafica, $tipo, post('data'), post('id_segment'), $id_sede_partenza);
$ordine->idpagamento = $documento->idpagamento;
$ordine->idsede = $id_sede;
@@ -483,8 +488,9 @@
if (post('create_document') == 'on') {
$anagrafica = Anagrafica::find(post('idanagrafica'));
$tipo = Tipo::where('dir', $dir)->first();
+ $id_sede_partenza = post('id_sede_partenza');
- $ordine = Ordine::build($anagrafica, $tipo, post('data'), post('id_segment'));
+ $ordine = Ordine::build($anagrafica, $tipo, post('data'), post('id_segment'), $id_sede_partenza);
$ordine->save();
$id_record = $ordine->id;
@@ -548,8 +554,9 @@
if (post('create_document') == 'on') {
$anagrafica = Anagrafica::find(post('idanagrafica'));
$tipo = Tipo::where('dir', $dir)->first();
+ $id_sede_partenza = post('id_sede_partenza');
- $ordine = Ordine::build($anagrafica, $tipo, post('data'), post('id_segment'));
+ $ordine = Ordine::build($anagrafica, $tipo, post('data'), post('id_segment'), $id_sede_partenza);
$ordine->save();
$id_record = $ordine->id;
diff --git a/modules/ordini/ajax/select.php b/modules/ordini/ajax/select.php
index ee6bb6b3c..cf10cb4f0 100644
--- a/modules/ordini/ajax/select.php
+++ b/modules/ordini/ajax/select.php
@@ -48,4 +48,39 @@
}
break;
+
+ case 'sedi-partenza':
+ $gestisciMagazzini = $dbo->fetchOne('SELECT * FROM zz_settings WHERE nome = "Gestisci soglia minima per magazzino"');
+
+ if ($gestisciMagazzini['valore'] == '1') {
+ $query = '(
+ SELECT "0" AS id,
+ IF(
+ indirizzo != "",
+ CONCAT_WS(" - ", "Sede legale", CONCAT(citta, " (", indirizzo, ")")),
+ CONCAT_WS(" - ", "Sede legale", citta)
+ ) AS descrizione
+ FROM an_anagrafiche WHERE idanagrafica = "1"
+ ) UNION (
+ SELECT id,
+ IF(
+ indirizzo != "",
+ CONCAT_WS(" - ", nomesede, CONCAT(citta, " (", indirizzo, ")")),
+ CONCAT_WS(" - ", nomesede, citta )
+ ) AS descrizione
+ FROM an_sedi WHERE idanagrafica="1"
+ )';
+ } else {
+ $query = '(
+ SELECT "0" AS id,
+ IF(
+ indirizzo != "",
+ CONCAT_WS(" - ", "Sede legale", CONCAT(citta, " (", indirizzo, ")")),
+ CONCAT_WS(" - ", "Sede legale", citta)
+ ) AS descrizione
+ FROM an_anagrafiche WHERE idanagrafica = "1"
+ )';
+ }
+
+ break;
}
diff --git a/modules/ordini/src/Ordine.php b/modules/ordini/src/Ordine.php
index 220aa7647..7896ab165 100755
--- a/modules/ordini/src/Ordine.php
+++ b/modules/ordini/src/Ordine.php
@@ -51,7 +51,7 @@ class Ordine extends Document
*
* @return self
*/
- public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data, $id_segment = null)
+ public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data, $id_segment = null, $id_sede_partenza = 0)
{
$model = new static();
@@ -82,6 +82,7 @@ public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data
$model->tipo()->associate($tipo_documento);
$model->stato()->associate($stato_documento);
$model->id_segment = $id_segment;
+ $model->id_sede_partenza = $id_sede_partenza;
$model->save();
@@ -92,7 +93,7 @@ public static function build(Anagrafica $anagrafica, Tipo $tipo_documento, $data
$model->idpagamento = $id_pagamento;
}
- $model->numero = static::getNextNumero($data, $direzione, $id_segment);
+ $model->numero = static::getNextNumero($data, $direzione);
$model->numero_esterno = static::getNextNumeroSecondario($data, $direzione, $id_segment);
$model->save();