diff --git a/include/common/articolo.php b/include/common/articolo.php index f2d9d2bfc..30297455e 100755 --- a/include/common/articolo.php +++ b/include/common/articolo.php @@ -21,21 +21,42 @@ $qta_minima = 0; $id_listino = $dbo->selectOne('an_anagrafiche', 'id_listino', ['idanagrafica' => $options['idanagrafica']])['id_listino']; +$module_articoli_id = Modules::get('Articoli')['id']; + // Articolo -$database = database(); -$articolo = $database->fetchOne('SELECT mg_articoli.id, - mg_fornitore_articolo.id AS id_dettaglio_fornitore, - 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.qta_minima, 0) AS qta_minima -FROM mg_articoli - LEFT JOIN mg_fornitore_articolo ON mg_fornitore_articolo.id_articolo = mg_articoli.id AND mg_fornitore_articolo.id = '.prepare($result['id_dettaglio_fornitore']).' -WHERE mg_articoli.id = '.prepare($result['idarticolo'])); - -$qta_minima = $articolo['qta_minima']; +if (empty($result['idarticolo'])) { + // Sede partenza + if ($module['name'] == 'Interventi') { + echo ' +
+
+ {[ "type": "select", "label": "'.tr('Partenza merce').'", "required": "1", "id":"idsede", "name": "idsede_partenza", "ajax-source": "sedi_azienda", "value": "'.($result['idsede_partenza'] ?: $options['idsede_partenza']).'" ]} +
+
'; + } + echo ' +
+
+ {[ "type": "select", "label": "'.tr('Articolo').'", "name": "idarticolo", "required": 1, "value": "'.$result['idarticolo'].'", "ajax-source": "articoli", "select-options": '.json_encode($options['select-options']['articoli']).', "icon-after": "add|'.Modules::get('Articoli')['id'].'" ]} +
+
+ + '; +} else { + $database = database(); + $articolo = $database->fetchOne('SELECT mg_articoli.id, + mg_fornitore_articolo.id AS id_dettaglio_fornitore, + 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.qta_minima, 0) AS qta_minima + FROM mg_articoli + LEFT JOIN mg_fornitore_articolo ON mg_fornitore_articolo.id_articolo = mg_articoli.id AND mg_fornitore_articolo.id = '.prepare($result['id_dettaglio_fornitore']).' + WHERE mg_articoli.id = '.prepare($result['idarticolo'])); + + $qta_minima = $articolo['qta_minima']; echo ' - {[ "type": "select", "disabled":"1", "label": "'.tr('Articolo').'", "name": "idarticolo", "value": "'.$result['idarticolo'].'", "ajax-source": "articoli", "select-options": '.json_encode($options['select-options']['articoli']).' ]} + {[ "type": "select", "disabled":"1", "label": "'.tr('Articolo').'", "name": "idarticolo", "value": "'.$result['idarticolo'].'", "ajax-source": "articoli", "select-options": '.json_encode($options['select-options']['articoli']).', "icon-after": "add|'.Modules::get('Articoli')['id'].'" ]} + '; +} +//giacenze +echo +'
+
+ + + + + + + + + + + + +
'.tr('Sede').''.tr('Q.tà').'#
' . tr('Nessuna giacenza disponibile') . '
+
+
'; + + +echo ' @@ -155,19 +199,19 @@ $("#idiva").selectSetNew($data.idiva_vendita, $data.iva_vendita, {"percentuale": $data.percentuale}); } } - + else { $("#id_dettaglio_fornitore").val($data.id_dettaglio_fornitore); $("#qta_minima").val($data.qta_minima); aggiornaQtaMinima(); } - + let id_conto = $data.idconto_'.($options['dir'] == 'entrata' ? 'vendita' : 'acquisto').'; let id_conto_title = $data.idconto_'.($options['dir'] == 'entrata' ? 'vendita' : 'acquisto').'_title; if(id_conto) { $("#idconto").selectSetNew(id_conto, id_conto_title); } - + $("#um").selectSetNew($data.um, $data.um); if ($data.provvigione) { @@ -178,6 +222,10 @@ input("tipo_provvigione").set(input("tipo_provvigione_default").get()); } }); + + getGiacenzeArticoloPerSede($data.id); + + getDatiVenditaArticolo($data.id); }); $("#idsede").on("change", function() { @@ -192,6 +240,90 @@ verificaMinimoVendita(); }); +/** + * Restituisce le giacenze dell\'articolo per ogni sede e le mostra in tabella + */ +function getGiacenzeArticoloPerSede(id_articolo) { + $.get( + globals.rootdir + "/ajax_complete.php?module=Articoli&op=getGiacenze&id_anagrafica=' . $options['idanagrafica'] . '&id_articolo=" + id_articolo + "&dir=" + direzione, + function(response) { + const data = JSON.parse(response); + + var sedi = data.sedi; + var giacenze = data.giacenze; + var articolo = data.articolo; + + var html = ""; + for (var i = 0; i < sedi.length; i++) { + var sede = sedi[i]; + + if (giacenze[sede["id"]] !== undefined) { + html += + "" + + "" + sede.nomesede + "" + + "" + giacenze[sede["id"]][0] + " " + articolo.um + "" + + "" + + "" + + "" + + "" + + "" + + ""; + } + } + + if (html == "") { + html = "" + "' . tr('Nessuna giacenza disponibile') . '" + ""; + } + + $("#tbl_giacenze tbody").html(html); + } + ); +} + +function getDatiVenditaArticolo(id_articolo) { + $.get( + globals.rootdir + "/ajax_complete.php?module=Articoli&op=getDatiVendita&id_anagrafica=' . $options['idanagrafica'] . '&id_articolo=" + id_articolo + "&dir=" + direzione, + function(response) { + const data = JSON.parse(response); + + var datiVendita = data.datiVendita; + + var html = ""; + for (var i = 0; i < datiVendita.length; i++) { + var venditaMese = datiVendita[i]; + + if (venditaMese.data[0] !== undefined) { + if (venditaMese.data.length > 0) { + html += + "" + + "" + venditaMese.mese + " - " + venditaMese.anno + "" + + "" + parseFloat(venditaMese.data[0].qta).toFixed(2) + " " + venditaMese.data[0].um + "" + + "" + parseFloat(venditaMese.data[0].totale).toFixed(2) + "" + + ""; + } + } + } + + if (html == "") { + html = "" + "' . tr('Nessuna vendita') . '" + ""; + } + + $("#tbl_vendite tbody").html(html); + } + ); +} + +/** + * Apre la modal per il dettaglio della sede. + */ +function getDettagli(id_sede, id_articolo) { + // Apertura modal + openModal( + "' . tr('Dettagli') . '", + globals.rootdir + "/modules/articoli/plugins/dettagli_giacenze.php?id_module=' . $module_articoli_id . '&id_record=" + id_articolo + "&idsede=" + id_sede + ); +} + /** * Restituisce il dettaglio registrato per una specifica quantità dell\'articolo. */ @@ -243,8 +375,19 @@ function getPrezzoListino() { } } - return dettaglio_listino ? parseFloat(dettaglio_listino.prezzo_unitario_listino) : 0; -} + if (dettaglio_listino != null) { + var ret = { + prezzo_unitario_listino: parseFloat(dettaglio_listino.prezzo_unitario_listino), + nome: dettaglio_listino.nome, + }; + } else { + var ret = { + prezzo_unitario_listino: 0, + nome: "", + }; + } + + return ret;} /** * Restituisce il prezzo della scheda articolo. @@ -297,7 +440,7 @@ function getPrezziListinoVisibili(nome = "") { dettaglio_prezzi_visibili = parseFloat(dettaglio.prezzo_unitario_listino_visibile); continue; } - } else { + } else { dettaglio_prezzi_visibili.push(dettaglio); } } @@ -382,13 +525,13 @@ function verificaPrezzoArticolo() { let prezzo_minimo = parseFloat($("#idarticolo").selectData().minimo_vendita); let prezzi_visibili = getPrezziListinoVisibili(); - if (prezzo_anagrafica || prezzo_listino || prezzo_std || prezzo_last || prezzo_minimo || prezzi_visibili) { + if (prezzo_anagrafica || prezzo_listino.prezzo_unitario_listino || prezzo_std || prezzo_last || prezzo_minimo || prezzi_visibili) { div.html(``); } let table = $(".table-prezzi"); - if (prezzo_anagrafica) { - table.append(``); + if (prezzo_anagrafica) { + table.append(``); let tr = $(".pr_anagrafica").parent(); if (prezzo_unitario == prezzo_anagrafica.toFixed(2)) { @@ -399,11 +542,17 @@ function verificaPrezzoArticolo() { table.append(``); } - if (prezzo_listino) { - table.append(``); + if (prezzo_listino.prezzo_unitario_listino) { + table.append( + ` + + ` + ); let tr = $(".pr_listino").parent(); - if (prezzo_unitario == prezzo_listino.toFixed(2)) { + if (prezzo_unitario == prezzo_listino.prezzo_unitario_listino.toFixed(2)) { tr.append(``); } else{ tr.append(``); @@ -412,7 +561,7 @@ function verificaPrezzoArticolo() { } if (prezzo_std) { - table.append(``); + table.append(``); let tr = $(".pr_std").parent(); if (prezzo_unitario == prezzo_std.toFixed(2)) { @@ -423,7 +572,7 @@ function verificaPrezzoArticolo() { } if (prezzo_last) { - table.append(``); + table.append(``); let tr = $(".pr_last").parent(); if (prezzo_unitario == prezzo_last.toFixed(2)) { @@ -434,7 +583,7 @@ function verificaPrezzoArticolo() { } if (prezzo_minimo) { - table.append(``); + table.append(``); let tr = $(".pr_minimo").parent(); if (prezzo_unitario == prezzo_minimo.toFixed(2)) { @@ -470,7 +619,6 @@ function verificaPrezzoArticolo() { * Funzione per verificare se lo sconto unitario corrisponde a quello registrato per l\'articolo, e proporre in automatico una correzione. */ function verificaScontoArticolo() { - let qta = $("#qta").val().toEnglish(); let prezzo_unitario_input = $("#prezzo_unitario"); let prezzo_unitario = prezzo_unitario_input.val().toEnglish(); let prezzo_anagrafica = getPrezzoPerQuantita(qta); @@ -480,8 +628,9 @@ function verificaScontoArticolo() { if (prezzo_unitario == prezzo_anagrafica.toFixed(2)) { + let qta = $("#qta").val().toEnglish(); sconto_previsto = getScontoPerQuantita(qta); - } else if (prezzo_unitario == prezzo_listino.toFixed(2)) { + } else if (prezzo_unitario == prezzo_listino.prezzo_unitario_listino.toFixed(2)) { sconto_previsto = getScontoListino(); } else { for (const prezzo_visibile of prezzi_visibili) { @@ -513,7 +662,7 @@ function verificaScontoArticolo() { function aggiornaPrezzoArticolo(aggiorna = "") { let prezzo_previsto = 0; if (aggiorna == "listino") { - prezzo_previsto = getPrezzoListino(); + prezzo_previsto = getPrezzoListino().prezzo_unitario_listino; } else if (aggiorna == "anagrafica") { let qta = $("#qta").val().toEnglish(); prezzo_previsto = getPrezzoPerQuantita(qta); @@ -529,11 +678,11 @@ function aggiornaPrezzoArticolo(aggiorna = "") { // Inserisco il prezzo più basso tra listino e netto cliente, se mancanti imposto il prezzo della scheda articolo let qta = $("#qta").val().toEnglish(); prezzo1 = getPrezzoPerQuantita(qta); - prezzo2 = getPrezzoListino(); + prezzo2 = getPrezzoListino().prezzo_unitario_listino; prezzo3 = getPrezzoScheda(); prezzo_previsto = (!prezzo1 ? prezzo2 : (!prezzo2 ? prezzo1 : (prezzo1 > prezzo2 ? prezzo2 : prezzo1))); prezzo_previsto = (prezzo_previsto ? prezzo_previsto : prezzo3); - } + } $("#prezzo_unitario").val(prezzo_previsto).trigger("change"); $("#sconto").val(0).trigger("change"); @@ -548,7 +697,6 @@ function aggiornaPrezzoArticolo(aggiorna = "") { * Funzione per aggiornare lo sconto unitario sulla base dei valori automatici. */ function aggiornaScontoArticolo() { - let qta = $("#qta").val().toEnglish(); let prezzo_unitario_input = $("#prezzo_unitario"); let prezzo_unitario = prezzo_unitario_input.val().toEnglish(); let prezzo_anagrafica = getPrezzoPerQuantita(qta); @@ -558,8 +706,9 @@ function aggiornaScontoArticolo() { if (prezzo_unitario == prezzo_anagrafica.toFixed(2)) { + let qta = $("#qta").val().toEnglish(); sconto_previsto = getScontoPerQuantita(qta); - } else if (prezzo_unitario == prezzo_listino.toFixed(2)) { + } else if (prezzo_unitario == prezzo_listino.prezzo_unitario_listino.toFixed(2)) { sconto_previsto = getScontoListino(); } else { for (const prezzo_visibile of prezzi_visibili) { @@ -621,7 +770,7 @@ function verificaMinimoVendita() { if (input("blocca_minimo_vendita").get() == "1") { prezzo_unitario_input.val(minimo_vendita); div.html(`

'.tr('Attenzione:
non è possibile inserire un prezzo inferiore al prezzo minimo di vendita ').'` + minimo_vendita.toLocale() + ` ` + globals.currency + `

`); - } + } } } '; diff --git a/include/common/barcode.php b/include/common/barcode.php new file mode 100644 index 000000000..5c8ab6dc1 --- /dev/null +++ b/include/common/barcode.php @@ -0,0 +1,699 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +$incorpora_iva = setting('Utilizza prezzi di vendita comprensivi di IVA'); +$intestazione_prezzo = ($options['dir'] == 'uscita' ? tr('Prezzo di acquisto') : ($incorpora_iva ? tr('Prezzo vendita ivato') : tr('Prezzo vendita imponibile'))); + +// Articolo +echo ' +
+
+ {[ "type": "text", "label": "' . tr('Inserisci barcode manualmente') . '", "name": "barcode", "value": "", "icon-before": "" ]} +
+
+ {[ "type": "file", "label": "' . tr('Inserisci file') . '", "id": "barcode_file", "name": "barcode_file", "value": "", "icon-before": "", "multiple": true ]} +
+
+ + + + + +
+
+
'.($options['dir'] == 'uscita' ? tr('Prezzo listino') : tr('Netto cliente')).': '.Plugins::link(($options['dir'] == 'uscita' ? 'Listino Fornitori' : 'Netto Clienti'), $result['idarticolo'], tr('Visualizza'), null, '').'` + prezzo_anagrafica.toLocale() + ` ` + globals.currency + `
'.($options['dir'] == 'uscita' ? tr('Prezzo listino') : tr('Netto cliente')).': '.Plugins::link(($options['dir'] == 'uscita' ? 'Listino Fornitori' : 'Netto Clienti'), $result['idarticolo'], '', null, '').'` + prezzo_anagrafica.toLocale() + ` ` + globals.currency + `
'.tr('Prezzo listino').': '.Modules::link('Listini Cliente', $id_listino, tr('Visualizza'), null, '').'` + prezzo_listino.toLocale() + ` ` + globals.currency + `
+ '.tr('Prezzo ').'` + prezzo_listino.nome + `: '.Modules::link('Listini Cliente', $id_listino, '', null, '').' + ` + prezzo_listino.prezzo_unitario_listino.toLocale() + ` ` + globals.currency + `
'.tr('Prezzo articolo').': '.Modules::link('Articoli', $result['idarticolo'], tr('Visualizza'), null, '').'` + prezzo_std.toLocale() + ` ` + globals.currency + `
'.tr('Prezzo articolo').': '.Modules::link('Articoli', $result['idarticolo'], '', null, '').'` + prezzo_std.toLocale() + ` ` + globals.currency + `
'.tr('Ultimo prezzo').': '.Modules::link('Articoli', $result['idarticolo'], tr('Visualizza'), null, '').'` + prezzo_last.toLocale() + ` ` + globals.currency + `
'.tr('Ultimo prezzo').': '.Modules::link('Articoli', $result['idarticolo'], '', null, '').'` + prezzo_last.toLocale() + ` ` + globals.currency + `
'.tr('Prezzo minimo').': '.Modules::link('Articoli', $result['idarticolo'], tr('Visualizza'), null, '').'` + prezzo_minimo.toLocale() + ` ` + globals.currency + `
'.tr('Prezzo minimo').': '.Modules::link('Articoli', $result['idarticolo'], '', null, '').'` + prezzo_minimo.toLocale() + ` ` + globals.currency + `
+ + + + + + + +
'.tr('Articolo').''.$intestazione_prezzo.''.tr('Sconto').''.tr('Q.tà').'#
+ + + +'; + +echo ' + + + + + + + + + + + + + + + +'; diff --git a/include/common/importa.php b/include/common/importa.php index 0d1bcf38d..acc348141 100755 --- a/include/common/importa.php +++ b/include/common/importa.php @@ -70,6 +70,10 @@ '; + if ($options['type'] == 'ordine') { + echo ''; + } + // Creazione fattura dal documento if (!empty($options['create_document'])) { echo ' @@ -115,7 +119,7 @@
{[ "type": "select", "label": "'.tr('Tipo documento').'", "name": "idtipodocumento", "required": 1, "values": "query=SELECT id, CONCAT(codice_tipo_documento_fe, \' - \', descrizione) AS descrizione FROM co_tipidocumento WHERE enabled = 1 AND dir = '.prepare($dir).' ORDER BY codice_tipo_documento_fe", "value": "'.$idtipodocumento.'" ]}
- +
{[ "type": "select", "label": "'.tr('Ritenuta previdenziale').'", "name": "id_ritenuta_contributi", "value": "$id_ritenuta_contributi$", "values": "query=SELECT * FROM co_ritenuta_contributi" ]}
'; @@ -178,6 +182,13 @@ '; } + if ($options['type'] == 'preventivo' && ($options['op'] == 'add_ordine_cliente' || $options['op'] == 'add_ordine_fornitore' || $options['op'] == 'add_preventivo')) { + echo ' +
+ {[ "type": "select", "label": "'.tr('Sede di partenza').'", "name": "id_sede_partenza", "required": 1, "ajax-source": "sedi-partenza", "select-options": '.json_encode(['id_module' => $id_module, 'is_sezionale' => 1]).', "value": "0" ]} +
'; + } + echo '
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "ajax-source": "segmenti", "select-options": '.json_encode(['id_module' => $final_module['id'], 'is_sezionale' => 1]).', "value": "'.$id_segment.'" ]} @@ -656,7 +667,7 @@ function ricalcolaTotale() { ricalcolaTotale(); }); - $("#import_all").click(function(){ + $("#import_all").click(function(){ if( $(this).is(":checked") ){ $(".check").each(function(){ if( !$(this).is(":checked") ){ diff --git a/include/common/riga.php b/include/common/riga.php index 4e10c2de3..957231a4a 100755 --- a/include/common/riga.php +++ b/include/common/riga.php @@ -67,27 +67,24 @@ function aggiorna_guadagno() { var prezzi_ivati = input("prezzi_ivati").get(); var costo_unitario = $("#costo_unitario").val().toEnglish(); var prezzo = 0; - var sconto = $("#sconto").val().toEnglish(); - - if ($("#modals select[id^=\'tipo_sconto\']").val() === "PRC") { - sconto = sconto / 100 * $("#prezzo_unitario").val().toEnglish(); - } if (prezzi_ivati!=0) { percentuale_iva = input("idiva").getElement().selectData().percentuale; - prezzo = ($("#prezzo_unitario").val().toEnglish() / (1 + percentuale_iva / 100)) - (sconto / (1 + percentuale_iva / 100)); + prezzo = $("#prezzo_unitario").val().toEnglish() / (1 + percentuale_iva / 100); } else { - prezzo = $("#prezzo_unitario").val().toEnglish() - sconto; + prezzo = $("#prezzo_unitario").val().toEnglish(); + } + var sconto = $("#sconto").val().toEnglish(); + if ($("#modals select[id^=\'tipo_sconto\']").val() === "PRC") { + sconto = sconto / 100 * prezzo; } - var provvigione = $("#provvigione").val().toEnglish(); if ($("#modals select[id^=\'tipo_provvigione\']").val() === "PRC") { - provvigione = provvigione / 100 * prezzo; + provvigione = provvigione / 100 * (prezzo - sconto); } - var guadagno = prezzo - provvigione - costo_unitario; - var ricarico = ((prezzo / costo_unitario) - 1) * 100; - var margine = (1 - (costo_unitario / prezzo)) * 100; - var parent = $("#costo_unitario").closest("div").parent(); + var guadagno = prezzo - sconto - provvigione - costo_unitario; + var ricarico = (((prezzo - sconto) / costo_unitario) - 1) * 100; + var margine = (1 - (costo_unitario / (prezzo - sconto))) * 100; var parent = $("#costo_unitario").closest("div").parent(); var div = $(".margine"); var mediaponderata = 0; @@ -144,7 +141,7 @@ function aggiorna_guadagno() { \ \ "); - + if (guadagno < 0) { parent.addClass("has-error"); $(".table-margine").addClass("label-danger").removeClass("label-success"); @@ -185,7 +182,7 @@ function aggiorna_guadagno() {
'; - + // Provvigione echo '
@@ -347,4 +344,39 @@ function controlla_sconto() { } } '; -} \ No newline at end of file +} + +if (in_array($module['name'], ['Ordini fornitore'])) { + echo ' +
+
+

'.tr('Dati di vendita').'

+
+ +
+
+ +
+
+
+ + + + + + + + + + + +
'.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 ' - - - - - + $ordini = $dbo->fetchArray(str_replace('|dir|', 'entrata', $query)); + $impegnato = sum(array_column($ordini, 'qta_impegnata')); + if (!empty($ordini)) { + echo ' +
'.tr('Descrizione').''.$record['um'].'
+ + '; + if ($gestisciMagazzini['valore'] == '1') { + echo + ''; + } + echo + ' + + + + '; + $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 + ''; + } + + echo + ' + + '; + } + echo ' + '; + if ($gestisciMagazzini['valore'] == '1') { + echo + ''; + } + echo + ' + - +
'.tr('Magazzino').''.tr('Descrizione').''.$record['um'].'
+ + '.$documento['Magazzino'].' + + + + '.Modules::link($modulo['id'], $documento['id'], tr('Ordine num. _NUM_ del _DATE_', [ + '_NUM_' => $numero, + '_DATE_' => dateFormat($documento['data']), + ])).' + + + '.numberFormat($qta, 2).' +
+ '.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 ' - - - + '; + if ($gestisciMagazzini['valore'] == '1') { + echo + ''; + } + echo + ' + '; - - $modulo = Modules::get('Ordini fornitore'); - foreach ($ordini as $documento) { - $numero = !empty($documento['numero_esterno']) ? $documento['numero_esterno'] : $documento['numero']; - $qta = $documento['qta_ordinata']; - - echo ' - - - - '; - } - - echo ' - - - - - + $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 + ''; + } + echo + ' + + '; + } + echo ' + '; + if ($gestisciMagazzini['valore'] == '1') { + echo + ''; + } + echo + ' + +
'.tr('Descrizione').''.$record['um'].'
'.tr('Magazzino').''.tr('Descrizione').''.$record['um'].'
- - '.Modules::link($modulo['id'], $documento['id'], tr('Ordine num. _NUM_ del _DATE_', [ - '_NUM_' => $numero, - '_DATE_' => dateFormat($documento['data']), - ])).' - - - '.numberFormat($qta).' -
- '.tr('Totale').' - - '.numberFormat($ordinato).' -
+ + '.$documento['Magazzino'].' + + + + '.Modules::link($modulo['id'], $documento['id'], tr('Ordine num. _NUM_ del _DATE_', [ + '_NUM_' => $numero, + '_DATE_' => dateFormat($documento['data']), + ])).' + + + '.numberFormat($qta, 2).' +
+ '.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').' +

+
+
+ + + + + + + + '; + 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 + ' + + + '; + } + echo + ' +
'.tr('Magazzino').''.$record['um'].'
+ + '.$sede['nomesede'].' + + + + '.numberFormat($da_ordinare, 2).' + + + + +
+
+
+
'; + } 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();