From 14ae98604dfd87fe2e9f96be9e1be3a2575ceca9 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Tue, 5 Sep 2017 17:31:58 +0200 Subject: [PATCH] Aggiornamento seriali Aggiornamento del sistema di gestione dei seriali, ora unficato e semplificato all'interno della tabella mg_prodotii. Generalizzazione delle operazioni di trasferimento delle righe tra ordini, ddt e fatture (file modules/fatture/crea_documento.php).. --- ajax_autocomplete.php | 10 +- ajax_select.php | 5 +- editor.php | 3 +- lib/classes/Auth.php | 2 +- lib/functions.js | 14 +- modules/articoli/actions.php | 15 +- modules/articoli/plugins/articoli.lotti.php | 190 ++++++------ .../articoli/plugins/articoli.movimenti.php | 19 +- .../contratti.fatturaordiniservizio.php | 2 +- modules/ddt/actions.php | 127 +++----- modules/ddt/add_serial.php | 108 ------- modules/ddt/creafattura.php | 236 -------------- modules/ddt/edit.php | 2 +- modules/ddt/modutil.php | 30 +- modules/ddt/row-list.php | 51 ++-- modules/fatture/actions.php | 184 +++++------ modules/fatture/add_ddt.php | 2 +- modules/fatture/add_ddt_righe.php | 216 ------------- modules/fatture/add_serial.php | 114 ++++--- modules/fatture/crea_documento.php | 289 ++++++++++++++++++ modules/fatture/init.php | 10 +- modules/fatture/modutil.php | 86 +++--- modules/fatture/row-list.php | 69 ++--- modules/interventi/actions.php | 31 +- modules/interventi/add_serial.php | 47 --- modules/interventi/ajax_articoli.php | 29 +- modules/ordini/actions.php | 99 +++--- modules/ordini/add_serial.php | 108 ------- modules/ordini/creaddt.php | 252 --------------- modules/ordini/creafattura.php | 245 --------------- modules/ordini/edit.php | 4 +- modules/ordini/modutil.php | 30 +- modules/ordini/row-list.php | 27 +- modules/preventivi/actions.php | 4 +- plugin_editor.php | 1 + templates/interventi/actions.php | 2 +- update/2_3.sql | 49 +-- 37 files changed, 854 insertions(+), 1858 deletions(-) delete mode 100644 modules/ddt/add_serial.php delete mode 100644 modules/ddt/creafattura.php delete mode 100644 modules/fatture/add_ddt_righe.php create mode 100644 modules/fatture/crea_documento.php delete mode 100644 modules/interventi/add_serial.php delete mode 100644 modules/ordini/add_serial.php delete mode 100644 modules/ordini/creaddt.php delete mode 100644 modules/ordini/creafattura.php diff --git a/ajax_autocomplete.php b/ajax_autocomplete.php index ce31600e2..4a85419e4 100644 --- a/ajax_autocomplete.php +++ b/ajax_autocomplete.php @@ -240,7 +240,7 @@ switch ($module_name) { // Elenco lotti in base all'articolo elseif ($op == 'getlotti') { $idarticolo = $get['idarticolo']; - $q = 'SELECT DISTINCT(lotto) FROM mg_prodotti WHERE idarticolo="'.$idarticolo.'" '.Modules::getAdditionalsQuery('Magazzino').' ORDER BY lotto ASC'; + $q = 'SELECT DISTINCT(lotto) FROM mg_prodotti WHERE id_articolo="'.$idarticolo.'" '.Modules::getAdditionalsQuery('Magazzino').' ORDER BY lotto ASC'; $rs = $dbo->fetchArray($q); $n = sizeof($rs); @@ -249,7 +249,7 @@ switch ($module_name) { for ($i = 0; $i < $n; ++$i) { $dir = 'entrata'; - $qs = 'SELECT COUNT(serial) AS num_seriali FROM mg_prodotti WHERE idarticolo='.prepare($idarticolo).' AND lotto='.prepare($rs[$i]['lotto']).' '. + $qs = 'SELECT COUNT(serial) AS num_seriali FROM mg_prodotti WHERE id_articolo='.prepare($idarticolo).' AND lotto='.prepare($rs[$i]['lotto']).' '. 'AND (serial NOT IN(SELECT serial FROM co_righe_documenti INNER JOIN co_documenti ON co_righe_documenti.iddocumento = co_documenti.id INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento = co_tipidocumento.id WHERE lotto='.prepare($rs[$i]['lotto']).' AND serial=mg_prodotti.serial AND dir = '.prepare($dir).') '. 'AND serial NOT IN(SELECT serial FROM or_righe_ordini INNER JOIN or_ordini ON or_righe_ordini.idordine = or_ordini.id INNER JOIN or_tipiordine ON or_ordini.idtipoordine = or_tipiordine.id WHERE lotto='.prepare($rs[$i]['lotto']).' AND serial=mg_prodotti.serial AND dir = '.prepare($dir).') '. 'AND serial NOT IN(SELECT serial FROM dt_righe_ddt INNER JOIN dt_ddt ON dt_righe_ddt.idddt = dt_ddt.id INNER JOIN dt_tipiddt ON dt_ddt.idtipoddt = dt_tipiddt.id WHERE lotto='.prepare($rs[$i]['lotto']).' AND serial=mg_prodotti.serial AND dir = '.prepare($dir).') '. @@ -283,7 +283,7 @@ switch ($module_name) { } if ($dir == 'entrata') { - $q = 'SELECT DISTINCT(serial) FROM mg_prodotti WHERE idarticolo='.prepare($idarticolo).' AND lotto='.prepare($lotto). + $q = 'SELECT DISTINCT(serial) FROM mg_prodotti WHERE id_articolo='.prepare($idarticolo).' AND lotto='.prepare($lotto). ' AND (serial NOT IN(SELECT serial FROM co_righe_documenti INNER JOIN co_documenti ON co_righe_documenti.iddocumento = co_documenti.id INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento = co_tipidocumento.id WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial AND dir = '.prepare($dir).')'. ' AND serial NOT IN(SELECT serial FROM or_righe_ordini INNER JOIN or_ordini ON or_righe_ordini.idordine = or_ordini.id INNER JOIN or_tipiordine ON or_ordini.idtipoordine = or_tipiordine.id WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial AND dir = '.prepare($dir).') '. ' AND serial NOT IN(SELECT serial FROM dt_righe_ddt INNER JOIN dt_ddt ON dt_righe_ddt.idddt = dt_ddt.id INNER JOIN dt_tipiddt ON dt_ddt.idtipoddt = dt_tipiddt.id WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial AND dir = '.prepare($dir).') '. @@ -292,7 +292,7 @@ switch ($module_name) { $rs = $dbo->fetchArray($q); $n = sizeof($rs); } else { - $q = 'SELECT DISTINCT(serial) FROM mg_prodotti WHERE idarticolo='.prepare($idarticolo).' AND lotto='.prepare($lotto).' AND (serial NOT IN(SELECT serial FROM co_righe_documenti WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial ) AND serial NOT IN(SELECT serial FROM or_righe_ordini WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial) AND serial NOT IN(SELECT serial FROM dt_righe_ddt WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial) AND serial NOT IN(SELECT serial FROM mg_articoli_interventi WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial) '.$additional_where_serial.' ) '.Modules::getAdditionalsQuery('Magazzino').' ORDER BY serial ASC'; + $q = 'SELECT DISTINCT(serial) FROM mg_prodotti WHERE id_articolo='.prepare($idarticolo).' AND lotto='.prepare($lotto).' AND (serial NOT IN(SELECT serial FROM co_righe_documenti WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial ) AND serial NOT IN(SELECT serial FROM or_righe_ordini WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial) AND serial NOT IN(SELECT serial FROM dt_righe_ddt WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial) AND serial NOT IN(SELECT serial FROM mg_articoli_interventi WHERE lotto='.prepare($lotto).' AND serial=mg_prodotti.serial) '.$additional_where_serial.' ) '.Modules::getAdditionalsQuery('Magazzino').' ORDER BY serial ASC'; $rs = $dbo->fetchArray($q); $n = sizeof($rs); } @@ -314,7 +314,7 @@ switch ($module_name) { $idarticolo = $get['idarticolo']; $lotto = $get['lotto']; $serial = $get['serial']; - $q = 'SELECT DISTINCT(altro) FROM mg_prodotti WHERE idarticolo="'.$idarticolo.'" AND lotto="'.$lotto.'" AND serial="'.$serial.'" AND (altro NOT IN(SELECT altro FROM co_righe_documenti WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro) AND altro NOT IN(SELECT altro FROM or_righe_ordini WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro) AND altro NOT IN(SELECT altro FROM dt_righe_ddt WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro) AND altro NOT IN(SELECT altro FROM mg_articoli_interventi WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro)) '.Modules::getAdditionalsQuery('Magazzino').' ORDER BY altro ASC'; + $q = 'SELECT DISTINCT(altro) FROM mg_prodotti WHERE id_articolo="'.$idarticolo.'" AND lotto="'.$lotto.'" AND serial="'.$serial.'" AND (altro NOT IN(SELECT altro FROM co_righe_documenti WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro) AND altro NOT IN(SELECT altro FROM or_righe_ordini WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro) AND altro NOT IN(SELECT altro FROM dt_righe_ddt WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro) AND altro NOT IN(SELECT altro FROM mg_articoli_interventi WHERE lotto="'.$lotto.'" AND serial="'.$serial.'" AND altro=mg_prodotti.altro)) '.Modules::getAdditionalsQuery('Magazzino').' ORDER BY altro ASC'; $rs = $dbo->fetchArray($q); $n = sizeof($rs); diff --git a/ajax_select.php b/ajax_select.php index 2f75c790b..6d712b452 100644 --- a/ajax_select.php +++ b/ajax_select.php @@ -232,6 +232,7 @@ switch ($op) { if (!empty($search)) { $search_fields[] = 'descrizione LIKE '.prepare('%'.$search.'%'); + $search_fields[] = 'codice LIKE '.prepare('%'.$search.'%'); } $wh = ''; @@ -522,7 +523,7 @@ switch ($op) { if (Modules::getModule('Magazzino')['permessi'] != '-') { $query = 'SELECT DISTINCT serial AS descrizione FROM mg_prodotti |where|'; - $where[] = 'idarticolo='.prepare($superselect['idarticolo']); + $where[] = 'id_articolo='.prepare($superselect['idarticolo']); $where[] = 'lotto='.prepare($superselect['lotto']); foreach ($elements as $element) { @@ -540,7 +541,7 @@ switch ($op) { if (Modules::getModule('Magazzino')['permessi'] != '-') { $query = 'SELECT DISTINCT altro AS descrizione FROM mg_prodotti |where|'; - $where[] = 'idarticolo='.prepare($superselect['idarticolo']); + $where[] = 'id_articolo='.prepare($superselect['idarticolo']); $where[] = 'lotto='.prepare($superselect['lotto']); $where[] = 'serial='.prepare($superselect['serial']); diff --git a/editor.php b/editor.php index 614322468..da65cf1c9 100755 --- a/editor.php +++ b/editor.php @@ -68,7 +68,7 @@ if (file_exists($docroot.'/modules/'.$module_dir.'/add.php') && $module['permess echo ' '; } -echo ' + echo ' '.tr("Torna all'elenco").' '; @@ -122,6 +122,7 @@ $backto = filter('backto'); // Scelta del redirect dopo un submit if (!empty($backto)) { $hash = filter('hash'); + $hash = !starts_with($hash, '#') ? '#'.$hash : $hash; if ($backto == 'record-edit') { redirect(ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.$hash); exit(); diff --git a/lib/classes/Auth.php b/lib/classes/Auth.php index c7a340c5c..4841efe16 100644 --- a/lib/classes/Auth.php +++ b/lib/classes/Auth.php @@ -378,7 +378,7 @@ class Auth extends \Util\Singleton { $database = Database::getConnection(); - if ($database->isInstalled()) { + if ($database->isInstalled() || !$database->fetchNum("SHOW TABLES LIKE 'zz_logs'")) { return false; } diff --git a/lib/functions.js b/lib/functions.js index c2dea4361..86b13a044 100644 --- a/lib/functions.js +++ b/lib/functions.js @@ -862,11 +862,20 @@ function start_superselect() { }); } +/** + * Reimposta i contenuti di un creato con select2. */ jQuery.fn.selectReset = function () { - this.val('').trigger("change"); + this.selectClear(); this.empty(); return this; @@ -1130,6 +1139,9 @@ String.prototype.toLocale = function () { x[0] = x[0].split("").reverse().join(""); x[0] = x[0].replace(/(.{3})/g, "$1" + globals.thousands); x[0] = x[0].split("").reverse().join(""); + if(x[0][0] == globals.thousands){ + x[0] = x[0].substr(1); + } } return x[0] + globals.decimals + x[1]; diff --git a/modules/articoli/actions.php b/modules/articoli/actions.php index 40f18b4aa..22028c560 100644 --- a/modules/articoli/actions.php +++ b/modules/articoli/actions.php @@ -159,7 +159,7 @@ switch (post('op')) { $n_prodotti = $n_lotti * $n_serial * $n_altro; // Creo la query per le combinazioni prodotto con ogni combinazione - $query = 'INSERT INTO mg_prodotti(idarticolo, lotto, serial, altro) VALUES'; + $query = 'INSERT INTO mg_prodotti(id_articolo, lotto, serial, altro) VALUES'; // Contatore prodotti da inserire $c = 0; @@ -182,7 +182,7 @@ switch (post('op')) { $insert = str_replace('|altro|', prepare($this_altro), $insert); // Verifico che questa combinazione non esista già - $np = $dbo->fetchNum('SELECT id FROM mg_prodotti WHERE idarticolo='.prepare($id_record).' AND lotto='.prepare($this_lotto).' AND serial='.prepare($this_serial).' AND altro='.prepare($this_altro)); + $np = $dbo->fetchNum('SELECT id FROM mg_prodotti WHERE id_articolo='.prepare($id_record).' AND lotto='.prepare($this_lotto).' AND serial='.prepare($this_serial).' AND altro='.prepare($this_altro)); if ($np == 0) { $query .= $insert.', '; ++$c; @@ -227,10 +227,19 @@ switch (post('op')) { } break; + case 'delmovimento': + $idmovimento = post('idmovimento'); + + $query = 'DELETE FROM mg_movimenti WHERE id='.prepare($idmovimento); + if ($dbo->query($query)) { + $_SESSION['infos'][] = tr('Movimento rimosso!'); + } + break; + case 'delete': $dbo->query('DELETE FROM mg_articoli WHERE id='.prepare($id_record)); $dbo->query('DELETE FROM mg_movimenti WHERE idarticolo='.prepare($id_record)); - $dbo->query('DELETE FROM mg_prodotti WHERE idarticolo='.prepare($id_record)); + $dbo->query('DELETE FROM mg_prodotti WHERE id_articolo='.prepare($id_record)); $dbo->query('DELETE FROM mg_articoli_automezzi WHERE idarticolo='.prepare($id_record)); $_SESSION['infos'][] = tr('Articolo eliminato!'); diff --git a/modules/articoli/plugins/articoli.lotti.php b/modules/articoli/plugins/articoli.lotti.php index 1978d7dcf..a8f3f0eec 100644 --- a/modules/articoli/plugins/articoli.lotti.php +++ b/modules/articoli/plugins/articoli.lotti.php @@ -16,10 +16,10 @@ $search_serial = $get['search_serial']; $search_altro = $get['search_altro']; // Calcolo prossimo lotto e serial number -$rs = $dbo->fetchArray('SELECT MAX(lotto) AS max_lotto, MAX(serial) AS max_serial, MAX(altro) AS max_altro FROM mg_prodotti WHERE idarticolo='.prepare($id_record)); -$max_lotto = $rs[0]['max_lotto']; +$rs = $dbo->fetchArray('SELECT MAX(lotto) AS max_lotto, MAX(serial) AS max_serial, MAX(altro) AS max_altro FROM mg_prodotti WHERE id_articolo='.prepare($id_record)); +//$max_lotto = $rs[0]['max_lotto']; $max_serial = $rs[0]['max_serial']; -$max_altro = $rs[0]['max_altro']; +//$max_altro = $rs[0]['max_altro']; //$next_lotto = get_next_code($max_lotto); $next_serial = get_next_code($max_serial); @@ -138,29 +138,27 @@ echo '
'; + // Visualizzo, in base alle impostazioni scelte, se il magazzino verrà movimentato if (get_var("Movimenta il magazzino durante l'inserimento o eliminazione dei lotti/serial number")) { echo tr("La cancellazione decrementerà la quantità dell'articolo!"); } else { echo tr("L'inserimento decrementerà la quantità dell'articolo!"); } + echo '
'; // Conteggio totale prodotti -$rs = $dbo->fetchArray('SELECT COUNT(id) AS tot FROM mg_prodotti WHERE idarticolo='.prepare($id_record)); +$rs = $dbo->fetchArray('SELECT COUNT(id) AS tot FROM mg_prodotti WHERE id_articolo='.prepare($id_record)); $tot_prodotti = $rs[0]['tot']; // Visualizzazione di tutti i prodotti -$query = 'SELECT * FROM mg_prodotti WHERE idarticolo='.prepare($id_record).' AND lotto LIKE '.prepare('%'.$search_lotto.'%').' AND serial LIKE '.prepare('%'.$search_serial.'%').' AND altro LIKE '.prepare('%'.$search_altro.'%').' ORDER BY created_at DESC, lotto DESC, serial DESC, altro DESC'; - -if (!empty($get['show_all3']) && $search_lotto == '' && $search_serial == '' && $search_altro == '') { - $query .= ' LIMIT 0, 20'; -} - +$query = 'SELECT * FROM mg_prodotti WHERE id_articolo='.prepare($id_record).(!empty($search_serial) ? ' AND serial LIKE '.prepare('%'.$search_serial.'%') : '').' ORDER BY created_at DESC, lotto DESC, serial DESC, altro DESC'; $rs2 = $dbo->fetchArray($query); - echo ' + +echo ' @@ -168,129 +166,135 @@ $rs2 = $dbo->fetchArray($query); - + '; - for ($i = 0; $i < count($rs2); ++$i) { +for ($i = 0; $i < count($rs2); ++$i) { + echo ' + + + '; + + echo ' + '; + + // Ricerca vendite + $vendite = $dbo->fetchArray('SELECT * FROM mg_prodotti WHERE dir=\'entrata\' AND id_articolo='.prepare($id_record).' AND serial='.prepare($rs2[$i]['serial'])); + + if (!empty($vendite)) { echo ' - + '; + $totali = []; - echo ' - '; - - // Ricerca vendite su ddt - $query3 = 'SELECT *, ( SELECT descrizione FROM dt_tipiddt WHERE id=(SELECT idtipoddt FROM dt_ddt WHERE id=idddt) ) AS tipo_documento, ( SELECT `dir` FROM dt_tipiddt WHERE id=(SELECT idtipoddt FROM dt_ddt WHERE id=idddt) ) AS `dir`, ( SELECT numero FROM dt_ddt WHERE id=idddt ) AS numero, ( SELECT numero_esterno FROM dt_ddt WHERE id=idddt ) AS numero_esterno, ( SELECT data FROM dt_ddt WHERE id=idddt ) AS data FROM dt_righe_ddt WHERE idarticolo='.prepare($id_record).' AND lotto='.prepare($rs2[$i]['lotto']).' AND serial='.prepare($rs2[$i]['serial']).' AND altro='.prepare($rs2[$i]['altro']); - $rs3 = $dbo->fetchArray($query3); - - // Ricerca vendite su fatture - $query4 = 'SELECT *, ( SELECT descrizione FROM co_tipidocumento WHERE id=(SELECT idtipodocumento FROM co_documenti WHERE id=iddocumento) ) AS tipo_documento, ( SELECT `dir` FROM co_tipidocumento WHERE id=(SELECT idtipodocumento FROM co_documenti WHERE id=iddocumento) ) AS `dir`, ( SELECT numero FROM co_documenti WHERE id=iddocumento ) AS numero, ( SELECT numero_esterno FROM co_documenti WHERE id=iddocumento ) AS numero_esterno, ( SELECT data FROM co_documenti WHERE id=iddocumento ) AS data FROM co_righe_documenti WHERE idarticolo='.prepare($id_record).' AND lotto='.prepare($rs2[$i]['lotto']).' AND serial='.prepare($rs2[$i]['serial']).' AND altro='.prepare($rs2[$i]['altro']); - $rs4 = $dbo->fetchArray($query4); - - // Ricerca inserimenti su ordini - $query5 = 'SELECT *, ( SELECT descrizione FROM or_tipiordine WHERE id=(SELECT idtipoordine FROM or_ordini WHERE id=idordine) ) AS tipo_documento, ( SELECT `dir` FROM or_tipiordine WHERE id=(SELECT idtipoordine FROM or_ordini WHERE id=idordine) ) AS `dir`, ( SELECT numero FROM or_ordini WHERE id=idordine ) AS numero, ( SELECT numero_esterno FROM or_ordini WHERE id=idordine ) AS numero_esterno, ( SELECT data FROM or_ordini WHERE id=idordine ) AS data FROM or_righe_ordini WHERE idarticolo='.prepare($id_record).' AND lotto='.prepare($rs2[$i]['lotto']).' AND serial='.prepare($rs2[$i]['serial']).' AND altro='.prepare($rs2[$i]['altro']); - $rs5 = $dbo->fetchArray($query5); - - // Ricerca inserimenti su interventi - $query6 = 'SELECT mg_articoli_interventi.*, in_interventi.codice, ( SELECT orario_inizio FROM in_interventi_tecnici WHERE idintervento=mg_articoli_interventi.idintervento LIMIT 0,1 ) AS data FROM mg_articoli_interventi JOIN in_interventi ON in_interventi.id = mg_articoli_interventi.idintervento WHERE idarticolo='.prepare($id_record).' AND lotto='.prepare($rs2[$i]['lotto']).' AND serial='.prepare($rs2[$i]['serial']).' AND altro='.prepare($rs2[$i]['altro']); - $rs6 = $dbo->fetchArray($query6); - - if (!empty($rs3) || !empty($rs4) || !empty($rs5) || !empty($rs6)) { + foreach ($vendite as $vendita) { // Venduto su fatture - if (!empty($rs4)) { - $numero = ($rs4[0]['numero_esterno'] != '') ? $rs4[0]['numero_esterno'] : $rs4[0]['numero']; + if (!empty($vendita['id_riga_documento'])) { $module_id = Modules::getModule('Fatture di vendita')['id']; - $id = $rs4[0]['iddocumento']; - $documento = $rs4[0]['tipo_documento']; - $data = $rs4[0]['data']; - $subtotale = $rs4[0]['subtotale']; - $iva = $rs4[0]['iva']; + // Ricerca vendite su fatture + $query = 'SELECT *, ( SELECT descrizione FROM co_tipidocumento WHERE id=(SELECT idtipodocumento FROM co_documenti WHERE id=iddocumento) ) AS tipo_documento, ( SELECT `dir` FROM co_tipidocumento WHERE id=(SELECT idtipodocumento FROM co_documenti WHERE id=iddocumento) ) AS `dir`, ( SELECT numero FROM co_documenti WHERE id=iddocumento ) AS numero, ( SELECT numero_esterno FROM co_documenti WHERE id=iddocumento ) AS numero_esterno, ( SELECT data FROM co_documenti WHERE id=iddocumento ) AS data FROM co_righe_documenti WHERE co_righe_documenti.id='.prepare($vendita['id_riga_documento']); + $data = $dbo->fetchArray($query); + + $id = $data[0]['iddocumento']; } // Venduto su ddt - elseif (!empty($rs3)) { + elseif (!empty($vendita['id_riga_ddt'])) { $numero = ($rs3[0]['numero_esterno'] != '') ? $rs3[0]['numero_esterno'] : $rs3[0]['numero']; $module_id = Modules::getModule('Ddt di vendita')['id']; - $id = $rs3[0]['idddt']; - $documento = $rs3[0]['tipo_documento']; - $data = $rs3[0]['data']; - $subtotale = $rs3[0]['subtotale']; - $iva = $rs3[0]['iva']; + $query = 'SELECT *, ( SELECT descrizione FROM dt_tipiddt WHERE id=(SELECT idtipoddt FROM dt_ddt WHERE id=idddt) ) AS tipo_documento, ( SELECT `dir` FROM dt_tipiddt WHERE id=(SELECT idtipoddt FROM dt_ddt WHERE id=idddt) ) AS `dir`, ( SELECT numero FROM dt_ddt WHERE id=idddt ) AS numero, ( SELECT numero_esterno FROM dt_ddt WHERE id=idddt ) AS numero_esterno, ( SELECT data FROM dt_ddt WHERE id=idddt ) AS data FROM dt_righe_ddt WHERE dt_righe_ddt.id='.prepare($vendita['id_riga_ddt']); + $data = $dbo->fetchArray($query); + + $id = $data[0]['idddt']; } // Inserito su ordini - elseif (!empty($rs5)) { - $numero = ($rs5[0]['numero_esterno'] != '') ? $rs5[0]['numero_esterno'] : $rs5[0]['numero']; + elseif (!empty($vendita['id_riga_ordine'])) { $module_id = Modules::getModule('Ordini cliente')['id']; - $id = $rs5[0]['idordine']; - $documento = $rs5[0]['tipo_documento']; - $data = $rs5[0]['data']; - $subtotale = $rs5[0]['subtotale']; - $iva = $rs5[0]['iva']; + // Ricerca inserimenti su ordini + $query = 'SELECT *, ( SELECT descrizione FROM or_tipiordine WHERE id=(SELECT idtipoordine FROM or_ordini WHERE id=idordine) ) AS tipo_documento, ( SELECT `dir` FROM or_tipiordine WHERE id=(SELECT idtipoordine FROM or_ordini WHERE id=idordine) ) AS `dir`, ( SELECT numero FROM or_ordini WHERE id=idordine ) AS numero, ( SELECT numero_esterno FROM or_ordini WHERE id=idordine ) AS numero_esterno, ( SELECT data FROM or_ordini WHERE id=idordine ) AS data FROM or_righe_ordini WHERE or_righe_ordini.id='.prepare($vendita['id_riga_ordine']); + $data = $dbo->fetchArray($query); + + $id = $data[0]['idordine']; } // Inserito su intervento - elseif (!empty($rs6)) { - $numero = ($rs6[0]['numero_esterno'] != '') ? $rs6[0]['numero_esterno'] : $rs6[0]['numero']; + elseif (!empty($vendita['id_riga_intervento'])) { $module_id = Modules::getModule('Interventi')['id']; - $id = $rs6[0]['idintervento']; - $documento = tr('Intervento').' '.$rs6[0]['codice']; - $data = $rs6[0]['data']; - $extra = str_replace('_QTA_', $rs6[0]['qta'], tr('(q.tà _QTA_)')); - $totale = $rs6[0]['prezzo_vendita'] * $rs6[0]['qta']; + // Ricerca inserimenti su interventi + $query = 'SELECT mg_articoli_interventi.*, in_interventi.codice, ( SELECT orario_inizio FROM in_interventi_tecnici WHERE idintervento=mg_articoli_interventi.idintervento LIMIT 0,1 ) AS data FROM mg_articoli_interventi JOIN in_interventi ON in_interventi.id = mg_articoli_interventi.idintervento WHERE mg_articoli_interventi.id='.prepare($vendita['id_riga_intervento']); + $data = $dbo->fetchArray($query); + + $id = $data[0]['idintervento']; + + $data[0]['tipo_documento'] = tr('Intervento').' '.$data[0]['codice']; + $data[0]['subtotale'] = $data[0]['prezzo_vendita'] * $data[0]['qta']; + $data[0]['iva'] = 0; + + $extra = str_replace('_QTA_', $data[0]['qta'], tr('(q.tà _QTA_)')); } - if (empty($totale) && !empty($subtotale) && !empty($iva)) { - $totale = $subtotale + $iva; - } + $totali[] = [$data[0]['subtotale'], $data[0]['iva']]; - $text = str_replace(['_DOC_', '_NUM_', '_DATE_'], [$documento, $numero, Translator::dateToLocale($data)], tr('_DOC_ no _NUM_ del _DATE_')).(!empty($extra) ? ' '.$extra : ''); + $numero = !empty($rs6[0]['numero_esterno']) ? $data[0]['numero_esterno'] : $data[0]['numero']; + + $text = str_replace(['_DOC_', '_NUM_', '_DATE_', '_TOT_'], [$data[0]['tipo_documento'], $numero, Translator::dateToLocale($data[0]['data'])], tr('_DOC_ no _NUM_ del _DATE_')).(!empty($extra) ? ' '.$extra : ''); echo ' - + '.Modules::link($module_id, $id, $text).'
'; + } - + + - - '; +
'; } - // Non venduto - else { - // Documento di vendita - echo ' - '; - // Totale - echo ' - '; - - echo ' - '; - } echo ' - '; + + + '; + } + + // Non venduto + else { + // Documento di vendita + echo ' + '; + + // Totale + echo ' + '; + + echo ' + '; } echo ' + '; +} +echo '
'.tr('Data di creazione').' '.tr('Documento di vendita').' '.tr('Totale').'#
'.$rs2[$i]['serial'].''.Translator::timestampToLocale($rs2[$i]['created_at']).'
'; - '.$rs2[$i]['serial'].''.Translator::timestampToLocale($rs2[$i]['created_at']).' - '.Modules::link($module_id, $id, $text).' - - € '.Translator::numberToLocale($totale).''; + echo ' + '; + foreach ($totali as $value) { + $subtotale = $value[0]; + $iva = $value[1]; + + echo ' + € '.Translator::numberToLocale($subtotale + $iva).''; if (!empty($subtotale) && !empty($iva)) { echo ' -
- '.Translator::numberToLocale($subtotale).' + '.Translator::numberToLocale($iva).''; + ('.Translator::numberToLocale($subtotale).' + '.Translator::numberToLocale($iva).')'; } echo ' -
- - - -
+ + + +
diff --git a/modules/articoli/plugins/articoli.movimenti.php b/modules/articoli/plugins/articoli.movimenti.php index 2b184c388..e49042d31 100644 --- a/modules/articoli/plugins/articoli.movimenti.php +++ b/modules/articoli/plugins/articoli.movimenti.php @@ -41,8 +41,9 @@ if (!empty($rs2)) { '.tr('Q.tà').' '.tr('Causale').' '.tr('Data').' + # '; - foreach($rs2 as $r){ + foreach ($rs2 as $r) { // Quantità echo ' @@ -54,7 +55,21 @@ if (!empty($rs2)) { // Data echo ' - '.Translator::timestampToLocale($r['created_at']).' + '.Translator::timestampToLocale($r['created_at']).''; + + // Operazioni + echo ' + '; + + if (Auth::admin()) { + echo ' + + + '; + } + + echo ' + '; } echo ' diff --git a/modules/contratti/plugins/contratti.fatturaordiniservizio.php b/modules/contratti/plugins/contratti.fatturaordiniservizio.php index 176c16fbf..eb2103ca4 100644 --- a/modules/contratti/plugins/contratti.fatturaordiniservizio.php +++ b/modules/contratti/plugins/contratti.fatturaordiniservizio.php @@ -121,7 +121,7 @@ elseif ($get['op'] == 'addfattura') { $iva_indetraibile = $importo / 100 * $rs2[0]['indetraibile']; // Inserimento riga in fattura - $dbo->query('INSERT INTO co_righe_documenti(iddocumento, descrizione, desc_iva, iva, iva_indetraibile, subtotale, um, qta, idgruppo, `order`) VALUES('.prepare($iddocumento).', '.prepare($descrizione).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($importo).", '-', 1, (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento=".prepare($iddocumento)."), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento=".prepare($iddocumento)."))"); + $dbo->query('INSERT INTO co_righe_documenti(iddocumento, descrizione, desc_iva, iva, iva_indetraibile, subtotale, um, qta, `order`) VALUES('.prepare($iddocumento).', '.prepare($descrizione).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($importo).", '-', 1, (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento=".prepare($iddocumento)."))"); redirect($rootdir.'/editor.php?id_module='.Modules::getModule('Fatture di vendita')['id'].'&id_record='.$iddocumento.'&dir=entrata'); exit(); diff --git a/modules/ddt/actions.php b/modules/ddt/actions.php index 17428a746..2805f9924 100644 --- a/modules/ddt/actions.php +++ b/modules/ddt/actions.php @@ -150,11 +150,7 @@ switch (post('op')) { $sconto = ($tipo_sconto == 'PRC') ? ($prezzo * $sconto_unitario) / 100 : $sconto_unitario; $sconto = $sconto * $qta; - // Calcolo idgruppo per questo inserimento - $ridgruppo = $dbo->fetchArray('SELECT IFNULL(MAX(idgruppo) + 1, 0) AS idgruppo FROM dt_righe_ddt WHERE idddt = '.prepare($id_record)); - $idgruppo = $ridgruppo[0]['idgruppo']; - - add_articolo_inddt($id_record, $idarticolo, $descrizione, $idiva, $qta, $prezzo * $qta, $sconto, $sconto_unitario, $tipo_sconto, $lotto, $serial, $altro, $idgruppo); + add_articolo_inddt($id_record, $idarticolo, $descrizione, $idiva, $qta, $prezzo * $qta, $sconto, $sconto_unitario, $tipo_sconto); // Ricalcolo inps, ritenuta e bollo ricalcola_costiagg_ddt($id_record); @@ -186,7 +182,7 @@ switch (post('op')) { $iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale']; $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile']; - $query = 'INSERT INTO dt_righe_ddt(idddt, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($id_record).'))'; + $query = 'INSERT INTO dt_righe_ddt(idddt, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, `order`) VALUES('.prepare($id_record).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($id_record).'))'; if ($dbo->query($query)) { $_SESSION['infos'][] = tr('Riga aggiunta!'); @@ -224,12 +220,13 @@ switch (post('op')) { for ($i = 0; $i < sizeof($post['qta_da_evadere']); ++$i) { // Processo solo le righe da evadere if ($post['evadere'][$i] == 'on') { - $idrigaordine = post('idrigaordine')[$i]; + $idrigaordine = post('idriga')[$i]; $idarticolo = post('idarticolo')[$i]; $descrizione = post('descrizione')[$i]; $qta = $post['qta_da_evadere'][$i]; $um = post('um')[$i]; + $abilita_serial = post('abilita_serial')[$i]; $subtot = $post['subtot'][$i] * $qta; $sconto = $post['sconto'][$i]; @@ -243,12 +240,12 @@ switch (post('op')) { $rs = $dbo->fetchArray($q); $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile']; - // Lettura lotto, serial, altro dalla riga dell'ordine - $q = 'SELECT lotto, serial, altro FROM or_righe_ordini WHERE id='.prepare($idrigaordine); - $rs = $dbo->fetchArray($q); - // Inserisco la riga in ddt - $dbo->query('INSERT INTO dt_righe_ddt(idddt, idordine, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, um, qta, lotto, serial, altro, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idordine).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($um).', '.prepare($qta).', '.prepare($rs[0]['lotto']).', '.prepare($rs[0]['serial']).', '.prepare($rs[0]['altro']).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($id_record).'))'); + $dbo->query('INSERT INTO dt_righe_ddt(idddt, idordine, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, um, qta, abilita_serial, `order`) VALUES('.prepare($id_record).', '.prepare($idordine).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($um).', '.prepare($qta).', '.prepare($abilita_serial).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($id_record).'))'); + $riga = $dbo->lastInsertedID(); + + // Aggiornamento seriali dalla riga dell'ordine + $dbo->sync('mg_prodotti', ['id_riga_ddt' => $riga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => (array) $post['serial'][$i]]); // Scalo la quantità dall'ordine $dbo->query('UPDATE or_righe_ordini SET qta_evasa = qta_evasa+'.$qta.' WHERE id='.prepare($idrigaordine)); @@ -277,24 +274,20 @@ switch (post('op')) { $idriga = post('idriga'); $idarticolo = post('idarticolo'); - if ($id_record != '' && $idarticolo != '') { - $res = rimuovi_articolo_daddt($idarticolo, $id_record, $idriga); + if (!rimuovi_articolo_daddt($idarticolo, $id_record, $idriga)) { + $_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!'); - if (!$res) { - $_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!'); - - return; - } - - // Ricalcolo inps, ritenuta e bollo - if ($post['dir'] == 'entrata') { - ricalcola_costiagg_ddt($id_record); - } else { - ricalcola_costiagg_ddt($id_record, 0, 0, 0); - } - - $_SESSION['infos'][] = tr('Articolo rimosso!'); + return; } + + // Ricalcolo inps, ritenuta e bollo + if ($dir == 'entrata') { + ricalcola_costiagg_ddt($id_record); + } else { + ricalcola_costiagg_ddt($id_record, 0, 0, 0); + } + + $_SESSION['infos'][] = tr('Articolo rimosso!'); break; // Scollegamento riga generica da ddt @@ -347,13 +340,20 @@ switch (post('op')) { $subtot = $prezzo * $qta; // Lettura idarticolo dalla riga ddt - $rs = $dbo->fetchArray('SELECT idgruppo, idddt, abilita_serial, idarticolo, idordine, qta FROM dt_righe_ddt WHERE id='.prepare($idriga)); + $rs = $dbo->fetchArray('SELECT idddt, abilita_serial, idarticolo, idordine, qta FROM dt_righe_ddt WHERE id='.prepare($idriga)); $idarticolo = $rs[0]['idarticolo']; $idordine = $rs[0]['idordine']; $old_qta = $rs[0]['qta']; - $idgruppo = $rs[0]['idgruppo']; $idddt = $rs[0]['idddt']; - $abilita_serial = $rs[0]['abilita_serial']; + + // Controllo per gestire i serial + if (!empty($idarticolo)) { + if (!controlla_seriali('id_riga_ddt', $idriga, $old_qta, $qta, $dir)) { + $_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!'); + + return; + } + } // Calcolo iva $query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva); @@ -363,40 +363,9 @@ switch (post('op')) { $desc_iva = $rs[0]['descrizione']; // Modifica riga generica sul ddt - $query = 'UPDATE dt_righe_ddt SET idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).' WHERE idgruppo='.prepare($idgruppo).' AND idddt='.prepare($idddt); + $query = 'UPDATE dt_righe_ddt SET idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', qta='.prepare($qta).' WHERE id='.prepare($idriga); if ($dbo->query($query)) { - // Modifica della quantità - $dbo->query('UPDATE dt_righe_ddt SET qta='.prepare($qta).' WHERE idgruppo='.prepare($idgruppo)); - - // Modifica per gestire i serial if (!empty($idarticolo)) { - $new_qta = $qta - $old_qta; - $new_qta = ($old_qta < $qta) ? $new_qta : -$new_qta; - - if (!empty($abilita_serial)) { - if ($old_qta < $qta) { - for ($i = 0; $i < $new_qta; ++$i) { - $dbo->query('INSERT INTO dt_righe_ddt(idddt, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idgruppo, `order`) SELECT idddt, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idgruppo, `order` FROM dt_righe_ddt WHERE id='.prepare($idriga)); - } - } else { - if ($dir == 'uscita') { - if ($new_qta > $dbo->fetchArray("SELECT COUNT(*) AS rimovibili FROM dt_righe_ddt WHERE serial NOT IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idgruppo=".prepare($idgruppo).' AND idddt='.prepare($idddt))[0]['rimovibili']) { - $_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!'); - - return; - } else { - $deletes = $dbo->fetchArray('SELECT id FROM dt_righe_ddt AS t WHERE idgruppo = '.prepare($idgruppo).' AND idddt='.prepare($idddt)." AND serial NOT IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') ORDER BY serial ASC LIMIT ".$new_qta); - } - } else { - $deletes = $dbo->fetchArray('SELECT id FROM dt_righe_ddt AS t WHERE idgruppo = '.prepare($idgruppo).' AND idddt='.prepare($idddt).' ORDER BY serial ASC LIMIT '.$new_qta); - } - - foreach ((array) $deletes as $delete) { - $dbo->query('DELETE FROM dt_righe_ddt WHERE id = '.prepare($delete['id'])); - } - } - } - // Controlli aggiuntivi sulle quantità evase degli ordini if (!empty($idordine) && $qta > 0) { $rs = $dbo->fetchArray('SELECT qta_evasa, qta FROM or_righe_ordini WHERE idordine='.prepare($idordine).' AND idarticolo='.prepare($idarticolo)); @@ -409,8 +378,7 @@ switch (post('op')) { $dbo->query('UPDATE or_righe_ordini SET qta_evasa = '.prepare($qta_ordine).' WHERE idordine='.prepare($idordine).' AND idarticolo='.prepare($idarticolo)); } - $new_qta = ($old_qta < $qta) ? $new_qta : -$new_qta; - + $new_qta = $qta - $old_qta; $new_qta = ($dir == 'entrata') ? -$new_qta : $new_qta; add_movimento_magazzino($idarticolo, $new_qta, ['idddt' => $id_record]); } @@ -429,19 +397,18 @@ switch (post('op')) { // eliminazione ddt case 'delete': - if ($dir == 'uscita') { - $non_rimovibili = $dbo->fetchArray("SELECT COUNT(*) AS non_rimovibili FROM dt_righe_ddt WHERE serial IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idddt=".prepare($id_record))[0]['non_rimovibili']; - if ($non_rimovibili != 0) { + // Se ci sono degli articoli collegati + $rs = $dbo->fetchArray('SELECT id, idarticolo FROM dt_righe_ddt WHERE idddt='.prepare($id_record)); + + foreach ($rs as $value) { + $non_rimovibili = seriali_non_rimuovibili('id_riga_ddt', $value['id'], $dir); + if (!empty($non_rimovibili)) { $_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!'); return; } } - // Se ci sono degli articoli collegati - $query = 'SELECT id, idarticolo FROM dt_righe_ddt WHERE idddt='.prepare($id_record); - $rs = $dbo->fetchArray($query); - for ($i = 0; $i < sizeof($rs); ++$i) { rimuovi_articolo_daddt($rs[$i]['idarticolo'], $id_record, $rs[$i]['id']); } @@ -464,16 +431,18 @@ switch (post('op')) { break; case 'add_serial': - $idgruppo = $post['idgruppo']; - $serial = $post['serial']; + $idriga = $post['idriga']; + $idarticolo = $post['idarticolo']; - $q = 'SELECT * FROM dt_righe_ddt WHERE idddt='.prepare($id_record).' AND idgruppo='.prepare($idgruppo).' ORDER BY id'; - $rs = $dbo->fetchArray($q); - - foreach ($rs as $i => $r) { - $dbo->query('UPDATE dt_righe_ddt SET serial='.prepare($serial[$i]).' WHERE id='.prepare($r['id'])); + $serials = (array) $post['serial']; + foreach ($serials as $key => $value) { + if (empty($value)) { + unset($serials[$key]); + } } + $dbo->sync('mg_prodotti', ['id_riga_ddt' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]); + break; case 'update_position': diff --git a/modules/ddt/add_serial.php b/modules/ddt/add_serial.php deleted file mode 100644 index ec26c997a..000000000 --- a/modules/ddt/add_serial.php +++ /dev/null @@ -1,108 +0,0 @@ -fetchArray($q2); - -echo ' -

'.tr('Articolo').': '.$rs2[0]['codice'].' - '.$rs2[0]['descrizione'].'

- -
- - - - '; - -$serials = []; -$array = array_column($rs2, 'serial'); -foreach ($array as $value) { - if (!empty($value)) { - $serials[] = $value; - } -} - -if ($dir == 'entrata') { - echo ' -
-
- {[ "type": "select", "label": "'.tr('Serial').'", "name": "serial[]", "multiple": 1, "value": "'.implode(',', $serials).'", "values": "query=SELECT serial AS id, serial AS descrizione FROM vw_serials WHERE dir=\'uscita\' AND serial NOT IN (SELECT serial FROM vw_serials WHERE dir=\'entrata\' AND record != \'ddt-'.$id_record.'\')", "extra": "data-maximum=\"'.count($rs2).'\"" ]} -
-
'; -} else { - echo ' -

'.tr('Inserisci i numeri seriali degli articoli aggiunti:').'

'; - - foreach ($array as $key => $serial) { - if ($key % 3 == 0) { - echo ' -
'; - } - - $res = $dbo->fetchArray("SELECT record FROM vw_serials WHERE dir='entrata' AND serial = ".prepare($serial)); - - echo ' -
- {[ "type": "text", "name": "serial[]", "value": "'.$serial.'"'.(!empty($res) ? ', "readonly": 1' : '').' ]}'; - - if (!empty($res)) { - $pieces = explode('-', $res[0]['record']); - switch ($pieces[0]) { - case 'int': - $modulo = 'Interventi'; - break; - - case 'ddt': - $modulo = 'Ddt di vendita'; - break; - - case 'fat': - $modulo = 'Fatture di vendita'; - break; - - case 'ord': - $modulo = 'Ordini cliente'; - break; - } - - echo ' - '.Modules::link($modulo, $pieces[1], tr('Visualizza vendita').' ', null); - } - echo ' -
'; - - if (($key + 1) % 3 == 0) { - echo ' -
-
'; - } - } - if (($key + 1) % 3 != 0) { - echo ' - '; - } -} - -echo ' - - -
-
- -
-
-
'; - -echo ' - '; diff --git a/modules/ddt/creafattura.php b/modules/ddt/creafattura.php deleted file mode 100644 index 42219dadb..000000000 --- a/modules/ddt/creafattura.php +++ /dev/null @@ -1,236 +0,0 @@ -fetchArray($q); -$numero = $rs[0]['numero']; -$idanagrafica = $rs[0]['idanagrafica']; -$idpagamento = $rs[0]['idpagamento']; -$idconto = $rs[0]['idconto']; - -/* -Form di inserimento riga documento -*/ - -echo ' -

'.str_replace('_NUM_', $numero, tr('Ddt numero _NUM_')).'

'; - -//Selezione articoli del ddt da portare nella fattura, escludo quelli completamente evasi -$query = 'SELECT *, (qta - qta_evasa) AS qta_rimanente FROM dt_ddt INNER JOIN dt_righe_ddt ON dt_ddt.id=dt_righe_ddt.idddt WHERE dt_ddt.id='.prepare($idddt).' HAVING qta_rimanente > 0'; -$rs = $dbo->fetchArray($query); - -if (!empty($rs)) { - echo ' -

'.tr('Seleziona le righe che vuoi inserire nella fattura e la relativa quantità').'.



'; - - echo ' -'; -} else { - echo ' - '.tr('Non ci sono articoli da evadere in questo ddt').'...'; -} - -echo ' - '; - -?> - - diff --git a/modules/ddt/edit.php b/modules/ddt/edit.php index c7d95330f..f76dda7b7 100644 --- a/modules/ddt/edit.php +++ b/modules/ddt/edit.php @@ -157,7 +157,7 @@ if ($records[0]['stato'] != 'Evaso') { if ($records[0]['stato'] != 'Evaso') { ?> - + ... fetchArray($query); $qta = floatval($rs[0]['qta']); $subtotale = $rs[0]['subtotale']; - $idgruppo = $rs[0]['idgruppo']; - // Leggo l'idordine $query = 'SELECT idordine FROM dt_righe_ddt WHERE id='.prepare($idrigaddt); $rs = $dbo->fetchArray($query); $idordine = $rs[0]['idordine']; - if ($dir == 'uscita') { - $non_rimovibili = $dbo->fetchArray("SELECT COUNT(*) AS non_rimovibili FROM dt_righe_ddt WHERE serial IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idgruppo=".prepare($idgruppo).' AND idddt='.prepare($idddt))[0]['non_rimovibili']; - if ($non_rimovibili != 0) { - return false; - } + $non_rimovibili = seriali_non_rimuovibili('id_riga_ddt', $idrigaddt, $dir); + if (!empty($non_rimovibili)) { + return false; } // Ddt di vendita @@ -97,7 +93,7 @@ function rimuovi_articolo_daddt($idarticolo, $idddt, $idrigaddt) $dbo->query($query); // Elimino la riga dal ddt - $dbo->query('DELETE FROM `dt_righe_ddt` WHERE idgruppo='.prepare($idgruppo).' AND idddt='.prepare($idddt)); + $dbo->query('DELETE FROM `dt_righe_ddt` WHERE id='.prepare($idrigaddt).' AND idddt='.prepare($idddt)); return true; } @@ -274,7 +270,7 @@ function ricalcola_costiagg_ddt($idddt, $idrivalsainps = '', $idritenutaacconto * $qta float quantità dell'articolo nell'ordine * $prezzo float prezzo totale degli articoli (prezzounitario*qtà). */ -function add_articolo_inddt($idddt, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT', $lotto = '', $serial = '', $altro = '', $idgruppo = 0) +function add_articolo_inddt($idddt, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT') { global $dbo; global $dir; @@ -300,20 +296,8 @@ function add_articolo_inddt($idddt, $idarticolo, $descrizione, $idiva, $qta, $pr if ($qta > 0) { $rsart = $dbo->fetchArray('SELECT abilita_serial FROM mg_articoli WHERE id='.prepare($idarticolo)); - $qta_in = !empty($rsart[0]['abilita_serial']) ? $qta : 1; - for ($i = 0; $i < $qta_in; ++$i) { - /* - $iva = $iva / $qta_in; - $qta = $qta / $qta_in; - $ubtotale = $subtotale / $qta_in; - $sconto = $sconto / $qta_in; - - $iva_indetraibile = $iva / 100 * $rs2[0]['indetraibile']; - */ - - $dbo->query('INSERT INTO dt_righe_ddt(idddt, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, qta, abilita_serial, serial, um, idgruppo, `order`) VALUES ('.prepare($idddt).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($qta).', '.prepare($rsart[0]['abilita_serial']).', '.prepare($serial).', '.prepare($um).', '.prepare($idgruppo).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($idddt).'))'); - } + $dbo->query('INSERT INTO dt_righe_ddt(idddt, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, qta, abilita_serial, um, `order`) VALUES ('.prepare($idddt).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($qta).', '.prepare($rsart[0]['abilita_serial']).', '.prepare($um).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($idddt).'))'); $idriga = $dbo->lastInsertedID(); diff --git a/modules/ddt/row-list.php b/modules/ddt/row-list.php index 3769f8d0e..2c7349aef 100644 --- a/modules/ddt/row-list.php +++ b/modules/ddt/row-list.php @@ -19,31 +19,21 @@ echo ' /* Articoli e righe generiche */ -$q_art = 'SELECT *, (SELECT codice FROM mg_articoli WHERE id=idarticolo) AS codice FROM `dt_righe_ddt` WHERE idddt='.prepare($id_record).' GROUP BY idgruppo ORDER BY `order`'; +$q_art = 'SELECT *, (SELECT codice FROM mg_articoli WHERE id=idarticolo) AS codice FROM `dt_righe_ddt` WHERE idddt='.prepare($id_record).' ORDER BY `order`'; $rs = $dbo->fetchArray($q_art); if (!empty($rs)) { foreach ($rs as $r) { - if (!empty($r['idarticolo'])) { - $qserial = 'SELECT * FROM dt_righe_ddt WHERE idddt='.prepare($id_record).' AND idarticolo='.prepare($r['idarticolo']).' AND idgruppo='.prepare($r['idgruppo']); - $rsserial = $dbo->fetchArray($qserial); - $mancanti = 0; - $serials = []; - - if (!empty($r['abilita_serial'])) { - foreach ($rsserial as $seriali) { - $seriali['serial'] = trim($seriali['serial']); - if (!empty($seriali['serial'])) { - $serials[] = $seriali['serial']; - } else { - ++$mancanti; - } - } - } + // Individuazione dei seriali + if (!empty($r['idarticolo']) && !empty($r['abilita_serial'])) { + $serials = array_column($dbo->fetchArray('SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND id_riga_ddt='.prepare($r['id'])), 'serial'); + $mancanti = $r['qta'] - count($serials); if ($mancanti > 0) { $extra = 'class="warning"'; + } else { + $mancanti = 0; } } @@ -60,20 +50,11 @@ if (!empty($rs)) { echo '
'.str_replace('_NUM_', $mancanti, tr('_NUM_ serial mancanti')).''; } + if (!empty($serials)) { echo '
'.tr('SN').': '.implode(', ', $serials); } - } else { - if ($r['lotto'] != '') { - echo '
Lotto: '.$r['lotto']; - } - if ($r['serial'] != '') { - echo '
SN: '.$r['serial']; - } - if ($r['altro'] != '') { - echo '
'.$r['altro']; - } } } else { echo nl2br($r['descrizione']); @@ -81,10 +62,20 @@ if (!empty($rs)) { // Aggiunta riferimento a ordine if (!empty($r['idordine'])) { - $rso = $dbo->fetchArray('SELECT numero, numero_esterno, data FROM or_ordini WHERE id='.prepare($r['idordine'])); + $rso = $dbo->fetchArray('SELECT numero, numero_esterno, data, dir FROM or_ordini JOIN or_tipiordine ON or_tipiordine.id = or_ordini.idtipoordine WHERE or_ordini.id='.prepare($r['idordine'])); $numero = ($rso[0]['numero_esterno'] != '') ? $rso[0]['numero_esterno'] : $rso[0]['numero']; - echo '
Rif. ordine no'.$numero.' del '.Translator::dateToLocale($rso[0]['data']); + + $ref = $rso[0]['dir'] == 'entrata' ? 'Ordini cliente' : 'Ordini fornitore'; + $ref_id = $r['idordine']; + + $descrizione = str_replace(['_NUM_', '_DATE_'], [$numero, Translator::dateToLocale($rso[0]['data'])], tr('Rif. ordine _NUM_ del _DATE_')); } + + if(!empty($descrizione)){ + echo ' +
'.Modules::link($ref, $ref_id, $descrizione.' ', $descrizione); + } + echo ' '; @@ -159,7 +150,7 @@ if (!empty($rs)) { if (!empty($r['idarticolo']) && $r['abilita_serial']) { echo " - "; + "; } echo " diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index 9e569ea08..cd8438d1e 100644 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -182,15 +182,24 @@ switch (post('op')) { // eliminazione documento case 'delete': - if ($dir == 'uscita') { - $non_rimovibili = $dbo->fetchArray("SELECT COUNT(*) AS non_rimovibili FROM co_righe_documenti WHERE serial IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND iddocumento=".prepare($id_record))[0]['non_rimovibili']; - if ($non_rimovibili != 0) { + // Se ci sono degli articoli collegati (ma non collegati a preventivi o interventi) li rimetto nel magazzino + $query = 'SELECT id, idarticolo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND NOT idarticolo=0 AND idpreventivo=0 AND idintervento IS NULL'; + $rs = $dbo->fetchArray($query); + + foreach ($rs as $value) { + $non_rimovibili = seriali_non_rimuovibili('id_riga_documenti', $value['id'], $dir); + if (!empty($non_rimovibili)) { $_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!'); return; } } + for ($i = 0; $i < sizeof($rs); ++$i) { + rimuovi_articolo_dafattura($rs[$i]['idarticolo'], $id_record, $rs[$i]['id']); + } + + // Se ci sono dei preventivi collegati li rimetto nello stato "In attesa di pagamento" $query = 'SELECT idpreventivo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idpreventivo IS NOT NULL'; $rs = $dbo->fetchArray($query); @@ -207,14 +216,6 @@ switch (post('op')) { $dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE descrizione='Completato') WHERE id=".prepare($rs[$i]['idintervento'])); } - // Se ci sono degli articoli collegati (ma non collegati a preventivi o interventi) li rimetto nel magazzino - $query = 'SELECT id, idarticolo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND NOT idarticolo=0 AND idpreventivo=0 AND idintervento IS NULL'; - $rs = $dbo->fetchArray($query); - - for ($i = 0; $i < sizeof($rs); ++$i) { - rimuovi_articolo_dafattura($rs[$i]['idarticolo'], $id_record, $rs[$i]['id']); - } - // Se delle righe sono state create da un ordine, devo riportare la quantità evasa nella tabella degli ordini al valore di prima, riaggiungendo la quantità che sto togliendo $rs = $dbo->fetchArray('SELECT qta, descrizione, idarticolo, idordine, idiva FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento)); foreach ($rs as $r) { @@ -267,11 +268,11 @@ switch (post('op')) { // TODO: sistemare la duplicazione delle righe generiche e degli articoli, ingorando interventi, ddt, ordini, preventivi /* foreach ($righe as $riga) { - $dbo->query('INSERT INTO co_righe_documenti(iddocumento, idordine, idddt, idintervento, idarticolo, idpreventivo, idcontratto, idtecnico, idagente, idautomezzo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, idritenutaacconto, ritenutaacconto, idrivalsainps, rivalsainps, um, qta, lotto, serial, altro, idgruppo, `order`) VALUES('.prepare($id_record).', 0, 0, 0, '.prepare($riga['idarticolo']).', '.prepare($riga['idpreventivo']).', '.prepare($riga['idcontratto']).', '.prepare($riga['idtecnico']).', '.prepare($riga['idagente']).', '.prepare($riga['idautomezzo']).', '.prepare($riga['idiva']).', '.prepare($riga['desc_iva']).', '.prepare($riga['iva']).', '.prepare($riga['iva_indetraibile']).', '.prepare($riga['descrizione']).', '.prepare($riga['subtotale']).', '.prepare($riga['sconto']).', '.prepare($riga['idritenutaacconto']).', '.prepare($riga['ritenutaacconto']).', '.prepare($riga['idrivalsainps']).', '.prepare($riga['rivalsainps']).', '.prepare($riga['um']).', '.prepare($riga['qta']).', '.prepare($riga['lotto']).', '.prepare($riga['serial']).', '.prepare($riga['altro']).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'); + $dbo->query('INSERT INTO co_righe_documenti(iddocumento, idordine, idddt, idintervento, idarticolo, idpreventivo, idcontratto, idtecnico, idagente, idautomezzo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, idritenutaacconto, ritenutaacconto, idrivalsainps, rivalsainps, um, qta, `order`) VALUES('.prepare($id_record).', 0, 0, 0, '.prepare($riga['idarticolo']).', '.prepare($riga['idpreventivo']).', '.prepare($riga['idcontratto']).', '.prepare($riga['idtecnico']).', '.prepare($riga['idagente']).', '.prepare($riga['idautomezzo']).', '.prepare($riga['idiva']).', '.prepare($riga['desc_iva']).', '.prepare($riga['iva']).', '.prepare($riga['iva_indetraibile']).', '.prepare($riga['descrizione']).', '.prepare($riga['subtotale']).', '.prepare($riga['sconto']).', '.prepare($riga['idritenutaacconto']).', '.prepare($riga['ritenutaacconto']).', '.prepare($riga['idrivalsainps']).', '.prepare($riga['rivalsainps']).', '.prepare($riga['um']).', '.prepare($riga['qta']).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'); // Scarico/carico nuovamente l'articolo da magazzino if (!empty($riga['idarticolo'])) { - add_articolo_infattura($id_record, $riga['idarticolo'], $riga['descrizione'], $riga['idiva'], $riga['qta'], $riga['subtotale'], 0, 0, 0); + add_articolo_infattura($id_record, $riga['idarticolo'], $riga['descrizione'], $riga['idiva'], $riga['qta'], $riga['subtotale']); } } */ @@ -326,7 +327,10 @@ switch (post('op')) { // Collego in fattura eventuali articoli collegati all'intervento $rs2 = $dbo->fetchArray('SELECT mg_articoli_interventi.*, idarticolo FROM mg_articoli_interventi INNER JOIN mg_articoli ON mg_articoli_interventi.idarticolo=mg_articoli.id WHERE idintervento='.prepare($idintervento).' AND ( idintervento NOT IN(SELECT idintervento FROM co_righe_preventivi WHERE idpreventivo IN(SELECT idpreventivo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).')) AND idintervento NOT IN(SELECT idintervento FROM co_righe_contratti WHERE idcontratto IN(SELECT idcontratto FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).')) )'); for ($i = 0; $i < sizeof($rs2); ++$i) { - add_articolo_infattura($id_record, $rs2[$i]['idarticolo'], $rs2[$i]['descrizione'], $idiva, $rs2[$i]['qta'], $rs2[$i]['prezzo_vendita'] * $rs2[$i]['qta'], $rs2[$i]['sconto'], $rs2[$i]['sconto_unitario'], $rs2[$i]['tipo_sconto'], $idintervento, '', $rs2[$i]['serial']); + $riga = add_articolo_infattura($id_record, $rs2[$i]['idarticolo'], $rs2[$i]['descrizione'], $idiva, $rs2[$i]['qta'], $rs2[$i]['prezzo_vendita'] * $rs2[$i]['qta'], $rs2[$i]['sconto'], $rs2[$i]['sconto_unitario'], $rs2[$i]['tipo_sconto'], $idintervento); + + // Lettura lotto, serial, altro dalla riga dell'ordine + $rs = $dbo->query('INSERT INTO mg_prodotti (id_riga_documento, id_articolo, dir, serial, lotto, altro) SELECT '.prepare($riga).', '.prepare($idarticolo).', '.prepare($dir).', serial, lotto, altro FROM mg_prodotti AS t WHERE id_riga_intervento='.prepare($rs2[$i]['id'])); } // Subtot @@ -358,7 +362,7 @@ switch (post('op')) { $rs = $dbo->fetchArray($query); $ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale']; - $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, idgruppo, `order`) VALUES('.prepare($id_record).', NULL, '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Trasferta intervento '.$codice.' del '.Translator::dateToLocale($data)).', '.prepare($subtot).", 'km' ".prepare($km).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; + $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, `order`) VALUES('.prepare($id_record).', NULL, '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Trasferta intervento '.$codice.' del '.Translator::dateToLocale($data)).', '.prepare($subtot).", 'km' ".prepare($km).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; $dbo->query($query); } @@ -386,7 +390,7 @@ switch (post('op')) { $rs = $dbo->fetchArray($query); $ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale']; - $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, idgruppo, `order`) VALUES('.prepare($id_record).', NULL, '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($rsr[$i]['descrizione']).', '.prepare($subtot).", 0, 0, 'UNT', ".prepare($rsr[$i]['um']).', '.prepare($rsr[$i]['qta']).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; + $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, `order`) VALUES('.prepare($id_record).', NULL, '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($rsr[$i]['descrizione']).', '.prepare($subtot).", 0, 0, 'UNT', ".prepare($rsr[$i]['um']).', '.prepare($rsr[$i]['qta']).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; $dbo->query($query); } } @@ -415,7 +419,7 @@ switch (post('op')) { $ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale']; // Aggiunta riga intervento sul documento - $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idintervento).', '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).", '-', ".prepare($qta).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; + $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, `order`) VALUES('.prepare($id_record).', '.prepare($idintervento).', '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).", '-', ".prepare($qta).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; if ($dbo->query($query)) { // Ricalcolo inps, ritenuta e bollo if ($dir == 'entrata') { @@ -496,7 +500,6 @@ switch (post('op')) { 'sconto' => $riga['sconto'], 'sconto_unitario' => $riga['sconto_unitario'], '#order' => '(SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).')', - '#idgruppo' => '(SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).')', 'idritenutaacconto' => get_var("Percentuale ritenuta d'acconto"), 'ritenutaacconto' => $ritenutaacconto, 'idrivalsainps' => get_var('Percentuale rivalsa INPS'), @@ -509,7 +512,7 @@ switch (post('op')) { } } else { // Aggiunta riga preventivo sul documento - $query = 'INSERT INTO co_righe_documenti(iddocumento, idpreventivo, idconto, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idritenutaacconto, ritenutaacconto, idrivalsainps, rivalsainps, `order`, idgruppo) VALUES('.prepare($id_record).', '.prepare($idpreventivo).', '.prepare($idconto).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).", '-', 1, ".prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; + $query = 'INSERT INTO co_righe_documenti(iddocumento, idpreventivo, idconto, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idritenutaacconto, ritenutaacconto, idrivalsainps, rivalsainps, `order`) VALUES('.prepare($id_record).', '.prepare($idpreventivo).', '.prepare($idconto).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).", '-', 1, ".prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; $dbo->query($query); // Aggiorno lo stato degli interventi collegati al preventivo se ce ne sono @@ -580,7 +583,7 @@ switch (post('op')) { $ritenutaacconto = ($prezzo - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale']; // Aggiunta riga contratto sul documento - $query = 'INSERT INTO co_righe_documenti(iddocumento, idcontratto, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idcontratto).', '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).", '-', 1, ".prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; + $query = 'INSERT INTO co_righe_documenti(iddocumento, idcontratto, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, `order`) VALUES('.prepare($id_record).', '.prepare($idcontratto).', '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).", '-', 1, ".prepare(get_var('Percentuale rivalsa INPS')).', '.prepare($rivalsainps).', '.prepare(get_var("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; if ($dbo->query($query)) { $_SESSION['infos'][] = str_replace('_NUM_', $numero, tr('Contratto _NUM_ aggiunto!')); @@ -619,11 +622,7 @@ switch (post('op')) { $sconto = ($tipo_sconto == 'PRC') ? ($prezzo * $sconto_unitario) / 100 : $sconto_unitario; $sconto = $sconto * $qta; - // Calcolo idgruppo per questo inserimento - $ridgruppo = $dbo->fetchArray('SELECT IFNULL(MAX(idgruppo) + 1, 0) AS idgruppo FROM co_righe_documenti WHERE iddocumento = '.prepare($id_record)); - $idgruppo = $ridgruppo[0]['idgruppo']; - - add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva, $qta, $prezzo * $qta, $sconto, $sconto_unitario, $tipo_sconto, '0', $lotto, $serial, $altro, $idgruppo, $idconto, $idum); + add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva, $qta, $prezzo * $qta, $sconto, $sconto_unitario, $tipo_sconto, '0', $idconto, $idum); $_SESSION['infos'][] = tr('Articolo aggiunto!'); } @@ -664,12 +663,8 @@ switch (post('op')) { $rs = $dbo->fetchArray($query); $ritenutaacconto = (($prezzo * $qta) + $rivalsainps) / 100 * $rs[0]['percentuale']; - // Calcolo idgruppo per questo inserimento - $ridgruppo = $dbo->fetchArray('SELECT IFNULL(MAX(idgruppo) + 1, 0) AS idgruppo FROM co_righe_documenti WHERE iddocumento = '.prepare($id_record)); - $idgruppo = $ridgruppo[0]['idgruppo']; - // Aggiunta riga generica sul documento - $query = 'INSERT INTO co_righe_documenti(iddocumento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', '.prepare(post('idrivalsainps')).', '.prepare($rivalsainps).', '.prepare(post('idritenutaacconto')).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; + $query = 'INSERT INTO co_righe_documenti(iddocumento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, `order`) VALUES('.prepare($id_record).', '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', '.prepare(post('idrivalsainps')).', '.prepare($rivalsainps).', '.prepare(post('idritenutaacconto')).', '.prepare($ritenutaacconto).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; if ($dbo->query($query)) { $_SESSION['infos'][] = tr('Riga aggiunta!'); @@ -705,13 +700,21 @@ switch (post('op')) { $subtot = $prezzo * $qta; // Lettura idarticolo dalla riga documento - $rs = $dbo->fetchArray('SELECT idgruppo, iddocumento, idarticolo, qta, abilita_serial FROM co_righe_documenti WHERE id='.prepare($idriga)); + $rs = $dbo->fetchArray('SELECT iddocumento, idarticolo, qta, abilita_serial FROM co_righe_documenti WHERE id='.prepare($idriga)); $idarticolo = $rs[0]['idarticolo']; $old_qta = $rs[0]['qta']; - $idgruppo = $rs[0]['idgruppo']; $iddocumento = $rs[0]['iddocumento']; $abilita_serial = $rs[0]['abilita_serial']; + // Controllo per gestire i serial + if (!empty($idarticolo)) { + if (!controlla_seriali('id_riga_documento', $idriga, $old_qta, $qta, $dir)) { + $_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!'); + + return; + } + } + // Calcolo iva $query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva); $rs = $dbo->fetchArray($query); @@ -730,42 +733,11 @@ switch (post('op')) { $ritenutaacconto = (($prezzo * $qta) - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale']; // Modifica riga generica sul documento - $query = 'UPDATE co_righe_documenti SET idconto='.prepare($idconto).', idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', idritenutaacconto='.prepare(post('idritenutaacconto')).', ritenutaacconto='.prepare($ritenutaacconto).', idrivalsainps='.prepare(post('idrivalsainps')).', rivalsainps='.prepare($rivalsainps).' WHERE idgruppo='.prepare($idgruppo).' AND iddocumento='.prepare($iddocumento); + $query = 'UPDATE co_righe_documenti SET idconto='.prepare($idconto).', idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', idritenutaacconto='.prepare(post('idritenutaacconto')).', ritenutaacconto='.prepare($ritenutaacconto).', idrivalsainps='.prepare(post('idrivalsainps')).', rivalsainps='.prepare($rivalsainps).', qta='.prepare($qta).' WHERE id='.prepare($idriga).' AND iddocumento='.prepare($iddocumento); if ($dbo->query($query)) { - // Modifica della quantità - $dbo->query('UPDATE co_righe_documenti SET qta='.prepare($qta).' WHERE idgruppo='.prepare($idgruppo)); - // Modifica per gestire i serial if (!empty($idarticolo)) { $new_qta = $qta - $old_qta; - $new_qta = ($old_qta < $qta) ? $new_qta : -$new_qta; - - if (!empty($abilita_serial)) { - if ($old_qta < $qta) { - for ($i = 0; $i < $new_qta; ++$i) { - $dbo->query('INSERT INTO co_righe_documenti(iddocumento, idarticolo, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, idgruppo, `order`) SELECT iddocumento, idarticolo, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, idgruppo, `order` FROM co_righe_documenti WHERE id='.prepare($idriga)); - } - } else { - if ($dir == 'uscita') { - if ($new_qta > $dbo->fetchArray("SELECT COUNT(*) AS rimovibili FROM co_righe_documenti WHERE serial NOT IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idgruppo=".prepare($idgruppo).' AND iddocumento='.prepare($iddocumento))[0]['rimovibili']) { - $_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!'); - - return; - } else { - $deletes = $dbo->fetchArray('SELECT id FROM co_righe_documenti AS t WHERE idgruppo = '.prepare($idgruppo).' AND iddocumento='.prepare($iddocumento)." AND serial NOT IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') ORDER BY serial ASC LIMIT ".$new_qta); - } - } else { - $deletes = $dbo->fetchArray('SELECT id FROM co_righe_documenti AS t WHERE idgruppo = '.prepare($idgruppo).' AND iddocumento='.prepare($iddocumento).' ORDER BY serial ASC LIMIT '.$new_qta); - } - - foreach ((array) $deletes as $delete) { - $dbo->query('DELETE FROM co_righe_documenti WHERE id = '.prepare($delete['id'])); - } - } - } - - $new_qta = ($old_qta < $qta) ? $new_qta : -$new_qta; - $new_qta = ($dir == 'entrata') ? -$new_qta : $new_qta; add_movimento_magazzino($idarticolo, $new_qta, ['iddocumento' => $id_record]); } @@ -809,7 +781,7 @@ switch (post('op')) { for ($i = 0; $i < sizeof($post['qta_da_evadere']); ++$i) { // Processo solo le righe da evadere if ($post['evadere'][$i] == 'on') { - $idrigaddt = post('idrigaddt')[$i]; + $idrigaddt = post('idriga')[$i]; $idarticolo = post('idarticolo')[$i]; $descrizione = post('descrizione')[$i]; $qta = $post['qta_da_evadere'][$i]; @@ -819,7 +791,7 @@ switch (post('op')) { $sconto = $sconto * $qta; $idiva = post('idiva')[$i]; - $qprc = 'SELECT tipo_sconto, sconto_unitario FROM dt_righe_ddt WHERE id='.$idrigaddt; + $qprc = 'SELECT tipo_sconto, sconto_unitario FROM dt_righe_ddt WHERE id='.prepare($idrigaddt); $rsprc = $dbo->fetchArray($qprc); $sconto_unitario = $rsprc[0]['sconto_unitario']; @@ -837,31 +809,19 @@ switch (post('op')) { $rs = $dbo->fetchArray($q); $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile']; - // Lettura lotto, serial, altro dalla riga dell'ordine - $q = 'SELECT lotto, serial, altro, descrizione FROM dt_righe_ddt WHERE id='.prepare($idrigaddt); - $rs = $dbo->fetchArray($q); - // Se sto aggiungendo un articolo uso la funzione per inserirlo e incrementare la giacenza if (!empty($idarticolo)) { $idiva_acquisto = $idiva; $prezzo_acquisto = $subtot; - add_articolo_infattura($id_record, $idarticolo, $rs[0]['descrizione'], $idiva_acquisto, $qta, $prezzo_acquisto, $sconto, $sconto_unitario, $tipo_sconto, $rs[0]['lotto'], $rs[0]['serial'], $rs[0]['altro'], $rs[0]['idgruppo']); + $riga = add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva_acquisto, $qta, $prezzo_acquisto, $sconto, $sconto_unitario, $tipo_sconto); + + // Aggiornamento seriali dalla riga dell'ordine + $dbo->sync('mg_prodotti', ['id_riga_documento' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => (array) $post['serial'][$i]]); } // Inserimento riga normale elseif ($qta != 0) { - // Se la riga che sto inserendo è simile ad altre già inserite, aggiorno solo la quantità... - $query = 'SELECT id FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND descrizione='.prepare($descrizione).' AND (subtotale/qta)='.($subtot / $qta).' AND um='.prepare($um).' AND sconto='.prepare($sconto / $qta).' AND idiva='.prepare($idiva); - $rs = $dbo->fetchArray($query); - - if (sizeof($rs) > 0) { - $query = 'UPDATE co_righe_documenti SET qta=qta+'.$qta.' WHERE id='.prepare($rs[0]['id']); - } - - // ...altrimenti aggiungo una nuova riga - else { - $query = 'INSERT INTO co_righe_documenti(iddocumento, idarticolo, descrizione, idddt, idiva, desc_iva, iva, iva_indetraibile, subtotale, sconto, um, qta, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($descrizione).', '.prepare($idddt).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; - } + $query = 'INSERT INTO co_righe_documenti(iddocumento, idarticolo, descrizione, idddt, idiva, desc_iva, iva, iva_indetraibile, subtotale, sconto, um, qta, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($descrizione).', '.prepare($idddt).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; $dbo->query($query); } @@ -899,7 +859,7 @@ switch (post('op')) { for ($i = 0; $i < sizeof($post['qta_da_evadere']); ++$i) { // Processo solo le righe da evadere if ($post['evadere'][$i] == 'on') { - $idrigaordine = post('idrigaordine')[$i]; + $idrigaordine = post('idriga')[$i]; $idarticolo = post('idarticolo')[$i]; $descrizione = post('descrizione')[$i]; $qta = post('qta_da_evadere')[$i]; @@ -926,15 +886,14 @@ switch (post('op')) { $rs = $dbo->fetchArray($query); $desc_iva = $rs[0]['descrizione']; - // Lettura lotto, serial, altro dalla riga dell'ordine - $q = 'SELECT lotto, serial, altro, descrizione FROM or_righe_ordini WHERE id='.prepare($idrigaordine); - $rs = $dbo->fetchArray($q); - // Se sto aggiungendo un articolo uso la funzione per inserirlo e incrementare la giacenza if (!empty($idarticolo)) { $idiva_acquisto = $idiva; $prezzo_acquisto = $subtot; - $idriga = add_articolo_infattura($id_record, $idarticolo, $rs[0]['descrizione'], $idiva_acquisto, $qta, $prezzo_acquisto, $sconto, $sconto_unitario, $tipo_sconto, '0', $rs[0]['lotto'], $rs[0]['serial'], $rs[0]['altro']); + $idriga = add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva_acquisto, $qta, $prezzo_acquisto, $sconto, $sconto_unitario, $tipo_sconto); + + // Aggiornamento seriali dalla riga dell'ordine + $dbo->sync('mg_prodotti', ['id_riga_documento' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => (array) $post['serial'][$i]]); // Imposto la provenienza dell'ordine $dbo->query('UPDATE co_righe_documenti SET idordine='.prepare($idordine).' WHERE id='.prepare($idriga)); @@ -942,7 +901,7 @@ switch (post('op')) { // Inserimento riga normale elseif ($qta != 0) { - $dbo->query('INSERT INTO co_righe_documenti(iddocumento, idarticolo, idordine, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, um, qta, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($idordine).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'); + $dbo->query('INSERT INTO co_righe_documenti(iddocumento, idarticolo, idordine, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, um, qta, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($idordine).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'); $idriga = $dbo->lastInsertedID(); } @@ -958,7 +917,7 @@ switch (post('op')) { // aggiungi righe da ddt case 'add_ddt': - $idddt = $post['idddt']; + $idddt = $post['iddocumento']; $rs = $dbo->fetchArray('SELECT * FROM co_documenti WHERE id='.prepare($id_record)); $idconto = $rs[0]['idconto']; @@ -967,7 +926,7 @@ switch (post('op')) { for ($i = 0; $i < sizeof($post['qta_da_evadere']); ++$i) { // Processo solo le righe da evadere if ($post['evadere'][$i] == 'on') { - $idrigaddt = post('idrigaddt')[$i]; + $idrigaddt = post('idriga')[$i]; $idarticolo = post('idarticolo')[$i]; $descrizione = post('descrizione')[$i]; @@ -997,20 +956,19 @@ switch (post('op')) { $rs = $dbo->fetchArray($query); $desc_iva = $rs[0]['descrizione']; - // Lettura lotto, serial, altro dalla riga dell'ordine - $q = 'SELECT lotto, serial, altro, descrizione FROM dt_righe_ddt WHERE id='.prepare($idrigaddt); - $rs = $dbo->fetchArray($q); - // Se sto aggiungendo un articolo uso la funzione per inserirlo e incrementare la giacenza if (!empty($idarticolo)) { $idiva_acquisto = $idiva; $prezzo_acquisto = $subtot; - add_articolo_infattura($id_record, $idarticolo, $rs[0]['descrizione'], $idiva_acquisto, $qta, $prezzo_acquisto, 0, 0, 'UNT', 0, $rs[0]['lotto'], $rs[0]['serial'], $rs[0]['altro'], 0, $idconto); + $riga = add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva_acquisto, $qta, $prezzo_acquisto, 0, 0, 'UNT', 0, $idconto); + + // Lettura lotto, serial, altro dalla riga dell'ddt + $rs = $dbo->query('INSERT INTO mg_prodotti (id_riga_documento, id_articolo, dir, serial, lotto, altro) SELECT '.prepare($riga).', '.prepare($idarticolo).', '.prepare($dir).', serial, lotto, altro FROM mg_prodotti AS t WHERE id_riga_ddt='.prepare($idrigaddt)); } // Inserimento riga normale elseif ($qta != 0) { - $query = 'INSERT INTO co_righe_documenti(iddocumento, idarticolo, descrizione, idconto, idddt, idiva, desc_iva, iva, iva_indetraibile, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($descrizione).', '.prepare($idconto).', '.prepare($idddt).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; + $query = 'INSERT INTO co_righe_documenti(iddocumento, idarticolo, descrizione, idconto, idddt, idiva, desc_iva, iva, iva_indetraibile, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($descrizione).', '.prepare($idconto).', '.prepare($idddt).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))'; $dbo->query($query); } @@ -1031,13 +989,12 @@ switch (post('op')) { $idriga = post('idriga'); // Lettura preventivi collegati - $query = 'SELECT idgruppo, iddocumento, idintervento FROM co_righe_documenti WHERE id='.prepare($idriga); + $query = 'SELECT iddocumento, idintervento FROM co_righe_documenti WHERE id='.prepare($idriga); $rsp = $dbo->fetchArray($query); $id_record = $rsp[0]['iddocumento']; - $idgruppo = $rsp[0]['idgruppo']; $idintervento = $rsp[0]['idintervento']; - $query = 'DELETE FROM `co_righe_documenti` WHERE iddocumento='.prepare($id_record).' AND idgruppo='.prepare($idgruppo); + $query = 'DELETE FROM `co_righe_documenti` WHERE iddocumento='.prepare($id_record).' AND id='.prepare($idriga); $dbo->query($query); @@ -1073,9 +1030,7 @@ switch (post('op')) { $idriga = post('idriga'); $idarticolo = post('idarticolo'); - $res = rimuovi_articolo_dafattura($idarticolo, $id_record, $idriga); - - if (!$res) { + if (!rimuovi_articolo_dafattura($idarticolo, $id_record, $idriga)) { $_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!'); return; @@ -1100,13 +1055,12 @@ switch (post('op')) { $idriga = post('idriga'); // Lettura preventivi collegati - $query = 'SELECT idgruppo, iddocumento, idpreventivo FROM co_righe_documenti WHERE id='.prepare($idriga); + $query = 'SELECT iddocumento, idpreventivo FROM co_righe_documenti WHERE id='.prepare($idriga); $rsp = $dbo->fetchArray($query); $id_record = $rsp[0]['iddocumento']; - $idgruppo = $rsp[0]['idgruppo']; $idpreventivo = $rsp[0]['idpreventivo']; - $query = 'DELETE FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idgruppo='.prepare($idgruppo); + $query = 'DELETE FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND id='.prepare($idriga); if ($dbo->query($query)) { // Se ci sono dei preventivi collegati li rimetto nello stato "In attesa di pagamento" @@ -1230,16 +1184,18 @@ switch (post('op')) { break; case 'add_serial': - $idgruppo = $post['idgruppo']; - $serial = $post['serial']; + $idriga = $post['idriga']; + $idarticolo = $post['idarticolo']; - $q = 'SELECT * FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idgruppo='.prepare($idgruppo).' ORDER BY id'; - $rs = $dbo->fetchArray($q); - - foreach ($rs as $i => $r) { - $dbo->query('UPDATE co_righe_documenti SET serial='.prepare($serial[$i]).' WHERE id='.prepare($r['id'])); + $serials = (array) $post['serial']; + foreach ($serials as $key => $value) { + if (empty($value)) { + unset($serials[$key]); + } } + $dbo->sync('mg_prodotti', ['id_riga_documento' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]); + break; case 'update_position': diff --git a/modules/fatture/add_ddt.php b/modules/fatture/add_ddt.php index f7c9e2f00..06bffc52e 100644 --- a/modules/fatture/add_ddt.php +++ b/modules/fatture/add_ddt.php @@ -37,6 +37,6 @@ echo ' $('#id_ddt').change( function(){ $('#righeddt').html('Caricamento in corso...'); - $('#righeddt').load(globals.rootdir + '/modules/fatture/add_ddt_righe.php?id_module=' + globals.id_module + '&id_record=' + globals.id_record + '&idddt=' + $(this).find('option:selected').val()); + $('#righeddt').load(globals.rootdir + '/modules/fatture/crea_documento.php?id_module=' + + '&id_record=' + $(this).find('option:selected').val() + '&documento=fattura&op=add_ddt&iddocumento=' + globals.id_record); }); diff --git a/modules/fatture/add_ddt_righe.php b/modules/fatture/add_ddt_righe.php deleted file mode 100644 index 1ce082d47..000000000 --- a/modules/fatture/add_ddt_righe.php +++ /dev/null @@ -1,216 +0,0 @@ -fetchArray($q); - -$numero = $rs[0]['numero']; -$idanagrafica = $rs[0]['idanagrafica']; -$idpagamento = $rs[0]['idpagamento']; -$idconto = $rs[0]['idconto']; - -/* - Form di inserimento riga documento -*/ -echo ' -
- - - - '; - -// Selezione righe ddt da portare nella fattura -$query = "SELECT *, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo),'') AS codice FROM dt_ddt INNER JOIN dt_righe_ddt ON dt_ddt.id=dt_righe_ddt.idddt WHERE dt_ddt.id=".prepare($idddt).' AND (qta - qta_evasa) > 0'; -$rs = $dbo->fetchArray($query); - -if (!empty($rs)) { - echo ' -

'.tr('Seleziona le righe che vuoi inserire nella fattura e la quantità').':

- - - - - - - - - '; - - $totale = 0.00; - - foreach ($rs as $i => $r) { - // Descrizione - echo ' - - '; - - // Q.tà rimanente - echo ' - '; - - // Q.tà da evadere - echo ' - '; - - // Subtotale - $subtotale = $r['subtotale'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']); - $sconto = $r['sconto'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']); - $iva = $r['iva'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']); - - echo ' - '; - - // Checkbox - da evadere? - echo ' - - '; - - $totale += $subtotale - $sconto + $iva; - } - - // Totale - echo ' - - - - '; - echo ' -
'.tr('Descrizione').''.tr('Q.tà').''.tr('Q.tà da evadere').''.tr('Subtot.').''.tr('Da evadere').'
- - - '; - - if ($r['codice'] != '') { - echo ' - '.$r['codice'].'
'; - } - - echo ' - '.nl2br($r['descrizione']).' - '; - - if ($r['lotto'] != '') { - echo ' -
Lotto: '.$r['lotto']; - } - if ($r['serial'] != '') { - echo ' -
SN: '.$r['serial']; - } - if ($r['altro'] != '') { - echo ' -
'.$r['altro']; - } - - echo ' -
-
- - - '.Translator::numberToLocale(($r['qta'] - $r['qta_evasa'])).' - - {[ "type": "number", "name": "qta_da_evadere[]", "id": "qta_'.$i.'", "value": "'.($r['qta'] - $r['qta_evasa']).'", "decimals": "qta", "extra": "onkeyup=\"ricalcola_subtotale_riga('.$i.');\"" ]} - - - - - - - '.Translator::numberToLocale($subtotale - $sconto + $iva).' €
'.Translator::numberToLocale($subtotale - $sconto).' + '.Translator::numberToLocale($iva).' -
- -
- Totale: - - '.Translator::numberToLocale($totale).' € -
'; -} else { - echo ' -

'.tr('Non ci sono articoli da evadere in questo ddt').'...

'; -} - -echo ' - - -
-
- -
-
-
'; - -echo ' - '; - -?> - - diff --git a/modules/fatture/add_serial.php b/modules/fatture/add_serial.php index a1f88aa2c..22f8ecad7 100644 --- a/modules/fatture/add_serial.php +++ b/modules/fatture/add_serial.php @@ -4,91 +4,123 @@ include_once __DIR__.'/../../core.php'; $module = Modules::getModule($id_module); -if ($module['name'] == 'Fatture di vendita') { +// Controllo sulla direzione monetaria +$entrate = [ + 'Fatture di vendita', + 'Ddt di vendita', + 'Ordini cliente', +]; + +if (in_array($module['name'], $entrate)) { $dir = 'entrata'; } else { $dir = 'uscita'; } -$idarticolo = get('idarticolo'); -$idgruppo = get('idgruppo'); +$data = [ + 'fat' => [ + 'table' => 'co_righe_documenti', + 'id' => 'iddocumento', + ], + 'ddt' => [ + 'table' => 'dt_righe_ddt', + 'id' => 'idddt', + ], + 'ord' => [ + 'table' => 'or_righe_ordini', + 'id' => 'idordine', + ], + 'int' => [ + 'table' => 'mg_articoli_interventi', + 'id' => 'idintervento', + ], +]; -$q2 = 'SELECT * FROM co_righe_documenti INNER JOIN mg_articoli ON co_righe_documenti.idarticolo=mg_articoli.id WHERE co_righe_documenti.iddocumento='.prepare($id_record).' AND co_righe_documenti.idgruppo='.prepare($idgruppo); -$rs2 = $dbo->fetchArray($q2); +// Individuazione delle tabelle interessate +if (in_array($module['name'], ['Fatture di vendita', 'Fatture di acquisto'])) { + $modulo = 'fat'; +} elseif (in_array($module['name'], ['Ddt di vendita', 'Ddt di acquisto'])) { + $modulo = 'ddt'; +} elseif (in_array($module['name'], ['Ordini cliente', 'Ordini fornitore'])) { + $modulo = 'ord'; +} else { + $modulo = 'int'; +} + +$table = $data[$modulo]['table']; +$id = $data[$modulo]['id']; +$riga = str_replace('id', 'id_riga_', $id); + +$idarticolo = get('idarticolo'); +$idriga = get('idriga'); + +$rs = $dbo->fetchArray('SELECT mg_articoli.codice, mg_articoli.descrizione, '.$table.'.qta FROM '.$table.' INNER JOIN mg_articoli ON '.$table.'.idarticolo=mg_articoli.id WHERE '.$table.'.'.$id.'='.prepare($id_record).' AND '.$table.'.id='.prepare($idriga)); echo ' -

'.tr('Articolo').': '.$rs2[0]['codice'].' - '.$rs2[0]['descrizione'].'

+

'.tr('Articolo').': '.$rs[0]['codice'].' - '.$rs[0]['descrizione'].'

- + + '; -$serials = []; -$array = array_column($rs2, 'serial'); -foreach ($array as $value) { - if (!empty($value)) { - $serials[] = $value; - } -} +$info = $dbo->fetchArray('SELECT * FROM mg_prodotti WHERE serial IS NOT NULL AND '.$riga.'='.prepare($idriga)); +$serials = array_column($info, 'serial'); if ($dir == 'entrata') { echo '
- {[ "type": "select", "label": "'.tr('Serial').'", "name": "serial[]", "multiple": 1, "value": "'.implode(',', $serials).'", "values": "query=SELECT serial AS id, serial AS descrizione FROM vw_serials WHERE dir=\'uscita\' AND serial NOT IN (SELECT serial FROM vw_serials WHERE dir=\'entrata\' AND record != \'fat-'.$id_record.'\')", "extra": "data-maximum=\"'.count($rs2).'\"" ]} + {[ "type": "select", "label": "'.tr('Serial').'", "name": "serial[]", "multiple": 1, "value": "'.implode(',', $serials).'", "values": "query=SELECT DISTINCT serial AS id, serial AS descrizione FROM mg_prodotti WHERE dir=\'uscita\' AND serial NOT IN (SELECT serial FROM mg_prodotti WHERE dir=\'entrata\' AND '.$riga.' != \''.$idriga.'\')", "extra": "data-maximum=\"'.intval($rs[0]['qta']).'\"" ]}
'; } else { echo '

'.tr('Inserisci i numeri seriali degli articoli aggiunti:').'

'; - - foreach ($array as $key => $serial) { - if ($key % 3 == 0) { + for ($i = 0; $i < $rs[0]['qta']; ++$i) { + if ($i % 3 == 0) { echo '
'; } - $res = $dbo->fetchArray("SELECT record FROM vw_serials WHERE dir='entrata' AND serial = ".prepare($serial)); + $res = $dbo->fetchArray("SELECT * FROM mg_prodotti WHERE dir='entrata' AND serial = ".prepare($serials[$i])); echo '
- {[ "type": "text", "name": "serial[]", "value": "'.$serial.'"'.(!empty($res) ? ', "readonly": 1' : '').' ]}'; + {[ "type": "text", "name": "serial[]", "value": "'.$serials[$i].'"'.(!empty($res) ? ', "readonly": 1' : '').' ]}'; - if(!empty($res)){ - $pieces = explode('-', $res[0]['record']); - switch($pieces[0]){ - case 'int': - $modulo = 'Interventi'; - break; - - case 'ddt': - $modulo = 'Ddt di vendita'; - break; - - case 'fat': - $modulo = 'Fatture di vendita'; - break; - - case 'ord': - $modulo = 'Ordini cliente'; - break; + if (!empty($res)) { + if (!empty($res[0]['id_riga_intervento'])) { + $modulo = 'Interventi'; + $pos = 'int'; + } elseif (!empty($res[0]['id_riga_ddt'])) { + $modulo = 'Ddt di vendita'; + $pos = 'ddt'; + } elseif (!empty($res[0]['id_riga_documento'])) { + $modulo = 'Fatture di vendita'; + $pos = 'fat'; + } elseif (!empty($res[0]['id_riga_ordine'])) { + $modulo = 'Ordini cliente'; + $pos = 'ord'; } + $r = $dbo->select($data[$pos]['table'], $data[$pos]['id'], ['id' => $res[0][str_replace('id', 'id_riga_', $data[$pos]['id'])]]); + echo ' - '.Modules::link($modulo, $pieces[1], tr('Visualizza vendita').' ', null); + '.Modules::link($modulo, $r[0][$data[$pos]['id']], tr('Visualizza vendita').' ', null); } echo '
'; - if (($key + 1) % 3 == 0) { + if (($i + 1) % 3 == 0) { echo '

'; } } - if (($key + 1) % 3 != 0) { + if ($i % 3 != 0) { echo ' '; } diff --git a/modules/fatture/crea_documento.php b/modules/fatture/crea_documento.php new file mode 100644 index 000000000..1ef1d3ef0 --- /dev/null +++ b/modules/fatture/crea_documento.php @@ -0,0 +1,289 @@ + [ + 'table' => 'dt_ddt', + 'rows' => 'dt_righe_ddt', + 'id' => 'idddt', + 'condition' => '(id_riga_documento IS NOT NULL)', + ], + 'ord' => [ + 'table' => 'or_ordini', + 'rows' => 'or_righe_ordini', + 'id' => 'idordine', + 'condition' => '(id_riga_ddt IS NOT NULL OR id_riga_documento IS NOT NULL)', + ], +]; + +$documento = get('documento'); + +if ($module['name'] == 'Ordini cliente' || $module['name'] == 'Ordini fornitore') { + $pos = 'ord'; + $op = ($documento == 'ddt') ? 'ddt_da_ordine' : 'fattura_da_ordine'; + + $head = tr('Ordine numero _NUM_'); +} else { + $pos = 'ddt'; + $op = 'fattura_da_ddt'; + + $head = tr('Ddt numero _NUM_'); +} + +$table = $data[$pos]['table']; +$rows = $data[$pos]['rows']; +$id = $data[$pos]['id']; +$row = str_replace('id', 'id_riga_', $id); + +if ($module['name'] == 'Ordini cliente' || $module['name'] == 'Ddt di vendita') { + $dir = 'entrata'; +} else { + $dir = 'uscita'; +} + +if ($module['name'] == 'Ordini cliente') { + $module_name = ($documento == 'ddt') ? 'Ddt di vendita' : 'Fatture di vendita'; +} elseif ($module['name'] == 'Ordini fornitore') { + $module_name = ($documento == 'ddt') ? 'Ddt di acquisto' : 'Fatture di acquisto'; +} elseif ($module['name'] == 'Ddt di acquisto') { + $module_name = 'Fatture di acquisto'; +} elseif ($module['name'] == 'Ddt di vendita') { + $module_name = 'Fatture di vendita'; +} + +$op = !empty($get['op']) ? $get['op'] : $op; + +$button = ($documento == 'ddt') ? tr('Crea ddt') : tr('Crea fattura'); +$button = !empty($get['op']) ? tr('Aggiungi') : $button; + +// Info documento +$rs = $dbo->fetchArray('SELECT * FROM '.$table.' WHERE id='.prepare($id_record)); +$numero = !empty($rs[0]['numero_esterno']) ? $rs[0]['numero_esterno'] : $rs[0]['numero']; +$idanagrafica = $rs[0]['idanagrafica']; +$idpagamento = $rs[0]['idpagamento']; +$idconto = $rs[0]['idconto']; + +/* + Form di inserimento riga documento +*/ +echo ' +

'.str_replace('_NUM_', $numero, $head).'.

'; + +// Selezione articoli dell'ordine da portare nel ddt +$rs = $dbo->fetchArray('SELECT *, (qta - qta_evasa) AS qta_rimanente FROM '.$table.' INNER JOIN '.$rows.' ON '.$table.'.id='.$rows.'.'.$id.' WHERE '.$table.'.id='.prepare($id_record).' HAVING qta_rimanente > 0'); + +if (!empty($rs)) { + echo ' +

'.tr('Seleziona le righe che vuoi inserire nel documento e la quantità').'.

+ + + + + + + + + + + '; + + if (empty($get['op'])) { + echo ' +
+
+ {[ "type": "date", "label": "'.tr('Data del documento').'", "name": "data", "required": 1, "value": "-now-" ]} +
+
'; + } + + echo ' +
+
+ + + + + + + + + '; + + $totale = 0.00; + + foreach ($rs as $i => $r) { + // Descrizione + echo ' + + '; + + // Q.tà rimanente + echo ' + '; + + // Q.tà da evadere + echo ' + '; + + // Subtotale + $subtotale = $r['subtotale'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']); + $sconto = $r['sconto'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']); + $iva = $r['iva'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']); + + echo ' + '; + + // Seriali + echo ' + + '; + + $totale += $subtotale - $sconto + $iva; + } + + // Totale + echo ' + + + + +
'.tr('Descrizione').''.tr('Q.tà').''.tr('Q.tà da evadere').''.tr('Subtot.').''.tr('Seriali').'
+ + + + '; + + // Checkbox - da evadere? + echo ' + '; + + echo nl2br($r['descrizione']); + + echo ' + + + +

'.Translator::numberToLocale($r['qta_rimanente']).'

+
+ {[ "type": "number", "name": "qta_da_evadere[]", "id": "qta_'.$i.'", "required": 1, "value": "'.$r['qta_rimanente'].'", "extra" : "onchange=\"ricalcola_subtotale_riga('.$i.');\"" ]} + + + + + + + '.Translator::numberToLocale($subtotale - $sconto + $iva).' €
+ + '.Translator::numberToLocale($subtotale - $sconto).' + '.Translator::numberToLocale($iva).' +
'; + if (!empty($r['abilita_serial'])) { + echo ' + {[ "type": "select", "name": "serial['.$i.'][]", "id": "serial_'.$i.'", "multiple": 1, "values": "query=SELECT DISTINCT serial AS id, serial AS descrizione FROM mg_prodotti WHERE dir=\''.$dir.'\' AND '.$row.' = \''.$r['id'].'\' AND serial NOT IN (SELECT serial FROM mg_prodotti WHERE dir=\''.$dir.'\' AND '.$data[$pos]['condition'].' AND dir=\''.$dir.'\')", "extra": "data-maximum=\"'.intval($r['qta_rimanente']).'\"" ]} + '; + } else { + echo '-'; + } + echo ' +
+ '.tr('Totale').': + + '.Translator::numberToLocale($totale).' € +
'; + + echo ' + + +
+
+ +
+
+
'; +} else { + echo ' +

'.tr('Non ci sono articoli da evadere').'...

'; +} + +echo ' + '; + +?> + + diff --git a/modules/fatture/init.php b/modules/fatture/init.php index 4174a538a..7a1c0b21e 100644 --- a/modules/fatture/init.php +++ b/modules/fatture/init.php @@ -2,6 +2,12 @@ include_once __DIR__.'/../../core.php'; -if (isset($id_record)) { - $records = $dbo->fetchArray('SELECT *, co_documenti.idagente AS idagente_fattura, co_documenti.note, co_documenti.note_aggiuntive, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipodoc`, (SELECT descrizione FROM co_ritenutaacconto WHERE id=idritenutaacconto) AS ritenutaacconto_desc, (SELECT descrizione FROM co_rivalsainps WHERE id=idrivalsainps) AS rivalsainps_desc FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($id_record)); +if ($module['name'] == 'Fatture di vendita') { + $dir = 'entrata'; +} else { + $dir = 'uscita'; +} + +if (isset($id_record)) { + $records = $dbo->fetchArray('SELECT *, co_documenti.idagente AS idagente_fattura, co_documenti.note, co_documenti.note_aggiuntive, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipodoc`, (SELECT descrizione FROM co_ritenutaacconto WHERE id=idritenutaacconto) AS ritenutaacconto_desc, (SELECT descrizione FROM co_rivalsainps WHERE id=idrivalsainps) AS rivalsainps_desc FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_tipidocumento.dir = '.prepare($dir).' AND co_documenti.id='.prepare($id_record)); } diff --git a/modules/fatture/modutil.php b/modules/fatture/modutil.php index abc8ac819..9249b71dc 100644 --- a/modules/fatture/modutil.php +++ b/modules/fatture/modutil.php @@ -597,7 +597,7 @@ function ricalcola_costiagg_fattura($iddocumento, $idrivalsainps = '', $idritenu * $prezzo float prezzo totale dell'articolo (prezzounitario*qtà) * $idintervento integer id dell'intervento da cui arriva l'articolo (per non creare casini quando si rimuoverà un articolo dalla fattura). */ -function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT', $idintervento = 0, $lotto = '', $serial = '', $altro = '', $idgruppo = 0, $idconto = 0, $idum = 0) +function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT', $idintervento = 0, $idconto = 0, $idum = 0) { global $dbo; global $dir; @@ -616,10 +616,6 @@ function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva, $um = $idum; } - if (empty($idgruppo)) { - $idgruppo = $dbo->fetchArray('SELECT IFNULL(MAX(`idgruppo`) + 1, 0) AS idgruppo FROM co_righe_documenti AS t WHERE iddocumento='.prepare($iddocumento))[0]['idgruppo']; - } - // Lettura iva dell'articolo $rs2 = $dbo->fetchArray('SELECT * FROM co_iva WHERE id='.prepare($idiva)); $iva = ($prezzo - $sconto) / 100 * $rs2[0]['percentuale']; @@ -627,21 +623,8 @@ function add_articolo_infattura($iddocumento, $idarticolo, $descrizione, $idiva, if ($qta > 0) { $rsart = $dbo->fetchArray('SELECT abilita_serial FROM mg_articoli WHERE id='.prepare($idarticolo)); - $qta_in = !empty($rsart[0]['abilita_serial']) ? $qta : 1; - - for ($i = 0; $i < $qta_in; ++$i) { - /* - $iva = $iva / $qta_in; - $qta = $qta / $qta_in; - $ubtotale = $subtotale / $qta_in; - $sconto = $sconto / $qta_in; - - $iva_indetraibile = $iva / 100 * $rs2[0]['indetraibile']; - */ - - $dbo->query('INSERT INTO co_righe_documenti(iddocumento, idarticolo, idintervento, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, qta, abilita_serial, serial, idconto, um, idgruppo, `order`) VALUES ('.prepare($iddocumento).', '.prepare($idarticolo).', '.(!empty($idintervento) ? prepare($idintervento) : 'NULL').', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($qta).', '.prepare($rsart[0]['abilita_serial']).', '.prepare($serial).', '.prepare($idconto).', '.prepare($um).', '.prepare($idgruppo).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($iddocumento).'))'); - } + $dbo->query('INSERT INTO co_righe_documenti(iddocumento, idarticolo, idintervento, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, qta, abilita_serial, idconto, um, `order`) VALUES ('.prepare($iddocumento).', '.prepare($idarticolo).', '.(!empty($idintervento) ? prepare($idintervento) : 'NULL').', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($qta).', '.prepare($rsart[0]['abilita_serial']).', '.prepare($idconto).', '.prepare($um).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($iddocumento).'))'); $idriga = $dbo->lastInsertedID(); /* @@ -682,7 +665,7 @@ function rimuovi_articolo_dafattura($idarticolo, $iddocumento, $idrigadocumento) global $dir; // Leggo la quantità di questo articolo in fattura - $query = 'SELECT idgruppo, qta, idintervento, idpreventivo, idordine, idddt, subtotale, descrizione, lotto, serial, altro FROM co_righe_documenti WHERE id='.prepare($idrigadocumento); + $query = 'SELECT qta, idintervento, idpreventivo, idordine, idddt, subtotale, descrizione, lotto, serial, altro FROM co_righe_documenti WHERE id='.prepare($idrigadocumento); $rs = $dbo->fetchArray($query); $idintervento = $rs[0]['idintervento']; $idpreventivo = $rs[0]['idpreventivo']; @@ -691,19 +674,15 @@ function rimuovi_articolo_dafattura($idarticolo, $iddocumento, $idrigadocumento) $qta = $rs[0]['qta']; $subtotale = $rs[0]['subtotale']; - $idgruppo = $rs[0]['idgruppo']; - $descrizione = $rs[0]['descrizione']; $lotto = $rs[0]['lotto']; $serial = $rs[0]['serial']; $altro = $rs[0]['altro']; - if ($dir == 'uscita') { - $non_rimovibili = $dbo->fetchArray("SELECT COUNT(*) AS non_rimovibili FROM co_righe_documenti WHERE serial IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idgruppo=".prepare($idgruppo).' AND iddocumento='.prepare($iddocumento))[0]['non_rimovibili']; - if ($non_rimovibili != 0) { - return false; - } + $non_rimovibili = seriali_non_rimuovibili('id_riga_documento', $idrigadocumento, $dir); + if (!empty($non_rimovibili)) { + return false; } // Se l'articolo è stato aggiunto in fattura perché era collegato ad un intervento o @@ -735,15 +714,15 @@ function rimuovi_articolo_dafattura($idarticolo, $iddocumento, $idrigadocumento) if ($dir == 'uscita') { // Elimino eventuali articoli caricati in mg_prodotti esclusivamente con la fattura di acquisto - $query = 'SELECT lotto, serial, altro, idarticolo FROM co_righe_documenti WHERE id='.prepare($idrigadocumento).' AND idddt = 0 AND idordine = 0'; + $query = 'SELECT lotto, serial, altro, id_articolo FROM co_righe_documenti WHERE id='.prepare($idrigadocumento).' AND idddt = 0 AND idordine = 0'; $rs = $dbo->fetchArray($query); if (sizeof($rs) > 0) { - $dbo->query('DELETE FROM `mg_prodotti` WHERE lotto='.prepare($rs[0]['lotto']).' AND serial='.prepare($rs[0]['serial']).' AND altro='.prepare($rs[0]['altro']).' AND idarticolo='.prepare($rs[0]['idarticolo'])); + $dbo->query('DELETE FROM `mg_prodotti` WHERE lotto='.prepare($rs[0]['lotto']).' AND serial='.prepare($rs[0]['serial']).' AND altro='.prepare($rs[0]['altro']).' AND id_articolo='.prepare($rs[0]['id_articolo'])); } } // Elimino la riga dal documento - $dbo->query('DELETE FROM `co_righe_documenti` WHERE idgruppo='.prepare($idgruppo).' AND iddocumento='.prepare($iddocumento)); + $dbo->query('DELETE FROM `co_righe_documenti` WHERE id='.prepare($idrigadocumento).' AND iddocumento='.prepare($iddocumento)); // Elimino i movimenti avvenuti nel magazzino per questo articolo lotto, serial, altro $dbo->query('DELETE FROM `mg_movimenti` WHERE idarticolo = '.prepare($idarticolo).' AND iddocumento = '.prepare($iddocumento).' AND id = '.prepare($idrigadocumento)); @@ -761,9 +740,6 @@ function aggiorna_sconto($tables, $fields, $id_record, $options = []) $descrizione = strtoupper(tr('Sconto')); - // Opzione per disabilitare l'idgruppo (per preventivi) - $id_gruppo = !isset($options['idgruppo']) || !empty($options['idgruppo']); - // Rimozione dello sconto precedente $dbo->query('DELETE FROM '.$tables['row']." WHERE descrizione LIKE '%".$descrizione."%' AND ".$fields['row'].'='.prepare($id_record)); @@ -774,7 +750,7 @@ function aggiorna_sconto($tables, $fields, $id_record, $options = []) // Aggiorno l'eventuale sconto gestendolo con le righe in fattura if (!empty($sconto[0]['sconto_globale'])) { if ($sconto[0]['tipo_sconto_globale'] == 'PRC') { - $subtotale = $dbo->fetchArray('SELECT SUM(subtotale - sconto) AS imponibile FROM (SELECT '.$tables['row'].'.subtotale, '.$tables['row'].'.sconto FROM '.$tables['row'].' WHERE '.$fields['row'].'='.prepare($id_record).($id_gruppo ? ' GROUP BY idgruppo' : '').') AS t')[0]['imponibile']; + $subtotale = $dbo->fetchArray('SELECT SUM(subtotale - sconto) AS imponibile FROM (SELECT '.$tables['row'].'.subtotale, '.$tables['row'].'.sconto FROM '.$tables['row'].' WHERE '.$fields['row'].'='.prepare($id_record).') AS t')[0]['imponibile']; $subtotale = -$subtotale / 100 * $sconto[0]['sconto_globale']; $descrizione = $descrizione.' '.Translator::numberToLocale($sconto[0]['sconto_globale']).'%'; @@ -798,10 +774,44 @@ function aggiorna_sconto($tables, $fields, $id_record, $options = []) '#order' => '(SELECT IFNULL(MAX(`order`) + 1, 0) FROM '.$tables['row'].' AS t WHERE '.$fields['row'].'='.prepare($id_record).')', ]; - if ($id_gruppo) { - $values['#idgruppo'] = '(SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM '.$tables['row'].' AS t WHERE '.$fields['row'].'='.prepare($id_record).')'; - } - $dbo->insert($tables['row'], $values); } } + +function controlla_seriali($field, $id_riga, $old_qta, $new_qta, $dir) +{ + $dbo = Database::getConnection(); + + if ($old_qta >= $new_qta) { + // Controllo sulla possibilità di rimuovere i seriali (se non utilizzati da documenti di vendita) + if ($dir == 'uscita' && $new_qta < count(seriali_non_rimuovibili($field, $id_riga, $dir))) { + return false; + } else { + // Controllo sul numero di seriali effettivi da rimuovere + $count = $dbo->fetchArray('SELECT COUNT(*) AS tot FROM mg_prodotti WHERE '.$field.'='.prepare($id_riga))[0]['tot']; + if ($new_qta < $count) { + $deletes = $dbo->fetchArray("SELECT id FROM mg_prodotti WHERE serial NOT IN (SELECT serial FROM mg_prodotti WHERE dir = 'entrata' AND ".$field.'!='.prepare($id_riga).') AND '.$field.'='.prepare($id_riga).' ORDER BY serial DESC LIMIT '.abs($count - $new_qta)); + + // Rimozione + foreach ($deletes as $delete) { + $dbo->query('DELETE FROM mg_prodotti WHERE id = '.prepare($delete['id'])); + } + } + } + } + + return true; +} + +function seriali_non_rimuovibili($field, $id_riga, $dir) +{ + $dbo = Database::getConnection(); + + $results = []; + + if ($dir == 'uscita') { + $results = $dbo->fetchArray("SELECT serial FROM mg_prodotti WHERE serial IN (SELECT serial FROM mg_prodotti WHERE dir = 'entrata') AND ".$field.'='.prepare($id_riga)); + } + + return $results; +} diff --git a/modules/fatture/row-list.php b/modules/fatture/row-list.php index 881da6686..7db7df35e 100644 --- a/modules/fatture/row-list.php +++ b/modules/fatture/row-list.php @@ -5,7 +5,7 @@ include_once __DIR__.'/../../core.php'; /* Righe fattura */ -$q = "SELECT *, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo),'') AS codice, (SELECT descrizione FROM co_pianodeiconti3 WHERE co_pianodeiconti3.id=IF(co_righe_documenti.idconto = 0, (SELECT idconto FROM co_documenti WHERE iddocumento=".prepare($id_record)." LIMIT 1), co_righe_documenti.idconto)) AS descrizione_conto FROM `co_righe_documenti` WHERE iddocumento=".prepare($id_record).' GROUP BY idgruppo ORDER BY `order`'; +$q = "SELECT *, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo),'') AS codice, (SELECT descrizione FROM co_pianodeiconti3 WHERE co_pianodeiconti3.id=IF(co_righe_documenti.idconto = 0, (SELECT idconto FROM co_documenti WHERE iddocumento=".prepare($id_record)." LIMIT 1), co_righe_documenti.idconto)) AS descrizione_conto FROM `co_righe_documenti` WHERE iddocumento=".prepare($id_record).' ORDER BY `order`'; $rs = $dbo->fetchArray($q); echo ' @@ -34,26 +34,18 @@ if (!empty($rs)) { $delete = 'unlink_articolo'; - $qserial = 'SELECT * FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND idarticolo='.prepare($r['idarticolo']).' AND idgruppo='.prepare($r['idgruppo']); - $rsserial = $dbo->fetchArray($qserial); - - $mancanti = 0; - $serials = []; - + // Individuazione dei seriali if (!empty($r['abilita_serial'])) { - foreach ($rsserial as $seriali) { - $seriali['serial'] = trim($seriali['serial']); - if (!empty($seriali['serial'])) { - $serials[] = $seriali['serial']; - } else { - ++$mancanti; - } + $serials = array_column($dbo->fetchArray('SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND id_riga_documento='.prepare($r['id'])), 'serial'); + $mancanti = $r['qta'] - count($serials); + + if ($mancanti > 0) { + $extra = 'class="warning"'; + } else { + $mancanti = 0; } } - if ($mancanti > 0) { - $extra = 'class="warning"'; - } } // Preventivi elseif (!empty($r['idpreventivo'])) { @@ -101,36 +93,37 @@ if (!empty($rs)) { echo '
'.tr('SN').': '.implode(', ', $serials); } - } else { - if ($r['lotto'] != '') { - echo ' -
'.tr('Lotto').': '.$r['lotto']; - } - if ($r['serial'] != '') { - echo ' -
'.tr('SN').': '.$r['serial']; - } - if ($r['altro'] != '') { - echo ' -
'.$r['altro']; - } } // Aggiunta riferimento a ordine if (!empty($r['idordine'])) { - $rso = $dbo->fetchArray('SELECT numero, numero_esterno, data FROM or_ordini WHERE id='.prepare($r['idordine'])); + $rso = $dbo->fetchArray('SELECT numero, numero_esterno, data, dir FROM or_ordini JOIN or_tipiordine ON or_tipiordine.id = or_ordini.idtipoordine WHERE or_ordini.id='.prepare($r['idordine'])); $numero = ($rso[0]['numero_esterno'] != '') ? $rso[0]['numero_esterno'] : $rso[0]['numero']; - echo ' -
'.str_replace(['_NUM_', '_DATE_'], [$numero, Translator::dateToLocale($rso[0]['data'])], tr('Rif. ordine _NUM_ del _DATE_')); + + $ref = $rso[0]['dir'] == 'entrata' ? 'Ordini cliente' : 'Ordini fornitore'; + $ref_id = $r['idordine']; + + $descrizione = str_replace(['_NUM_', '_DATE_'], [$numero, Translator::dateToLocale($rso[0]['data'])], tr('Rif. ordine _NUM_ del _DATE_')); } elseif (!empty($r['idddt'])) { - $rso = $dbo->fetchArray('SELECT numero, numero_esterno, data FROM dt_ddt WHERE id='.prepare($r['idddt'])); + $rso = $dbo->fetchArray('SELECT numero, numero_esterno, data FROM dt_ddt JOIN dt_tipiddt ON dt_tipiddt.id = dt_ddt.idtipoddt WHERE dt_ddt.id='.prepare($r['idddt'])); $numero = ($rso[0]['numero_esterno'] != '') ? $rso[0]['numero_esterno'] : $rso[0]['numero']; - echo ' -
'.str_replace(['_NUM_', '_DATE_'], [$numero, Translator::dateToLocale($rso[0]['data'])], tr('Rif. ddt _NUM_ del _DATE_')); + + $ref = $rso[0]['dir'] == 'entrata' ? 'Ddt di vendita' : 'Ddt di acquisto'; + $ref_id = $r['idddt']; + + $descrizione = str_replace(['_NUM_', '_DATE_'], [$numero, Translator::dateToLocale($rso[0]['data'])], tr('Rif. ddt _NUM_ del _DATE_')); } elseif (!empty($r['idpreventivo'])) { $rso = $dbo->fetchArray('SELECT numero, data_bozza FROM co_preventivi WHERE id='.prepare($r['idpreventivo'])); + + $ref = 'Preventivi'; + $ref_id = $r['idpreventivo']; + + $descrizione = str_replace(['_NUM_', '_DATE_'], [$rso[0]['numero'], Translator::dateToLocale($rso[0]['data_bozza'])], tr('Rif. preventivo _NUM_ del _DATE_')); + } + + if(!empty($descrizione)){ echo ' -
'.str_replace(['_NUM_', '_DATE_'], [$rso[0]['numero'], Translator::dateToLocale($rso[0]['data_bozza'])], tr('Rif. preventivo _NUM_ del _DATE_')); +
'.Modules::link($ref, $ref_id, $descrizione.' ', $descrizione); } echo ' @@ -194,7 +187,7 @@ if (!empty($rs)) { if (!empty($r['idarticolo']) && $r['abilita_serial'] && (empty($r['idddt']) || empty($r['idintervento']))) { echo " - "; + "; } echo " diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index 4b832a1b5..cec802e35 100644 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -437,11 +437,8 @@ switch (post('op')) { add_movimento_magazzino($idarticolo_originale, $qta, ['idautomezzo' => $idautomezzo, 'idintervento' => $id_record]); - $rs = $dbo->fetchArray('SELECT idgruppo FROM mg_articoli_interventi WHERE id='.prepare($idriga)); - $idgruppo = $rs[0]['idgruppo']; - // Elimino questo articolo dall'intervento - $dbo->query('DELETE FROM mg_articoli_interventi WHERE idgruppo='.prepare($idgruppo)); + $dbo->query('DELETE FROM mg_articoli_interventi WHERE id='.prepare($idriga)); // Elimino il collegamento al componente $dbo->query('DELETE FROM my_impianto_componenti WHERE idimpianto='.prepare($idimpianto).' AND idintervento='.prepare($id_record)); @@ -469,17 +466,13 @@ switch (post('op')) { // Aggiorno l'automezzo dell'intervento $dbo->query('UPDATE in_interventi SET idautomezzo='.prepare($idautomezzo).' WHERE id='.prepare($id_record).' '.Modules::getAdditionalsQuery($id_module)); - // Calcolo idgruppo per questo inserimento - $ridgruppo = $dbo->fetchArray('SELECT IFNULL(MAX(idgruppo) + 1, 0) AS idgruppo FROM mg_articoli_interventi WHERE idintervento = '.prepare($id_record)); - $idgruppo = $ridgruppo[0]['idgruppo']; - $rsart = $dbo->fetchArray('SELECT abilita_serial, prezzo_acquisto FROM mg_articoli WHERE id='.prepare($idarticolo)); $qta_in = !empty($rsart[0]['abilita_serial']) ? $qta : 1; $prezzo_acquisto = $rsart[0]['prezzo_acquisto']; for ($i = 0; $i < $qta_in; ++$i) { // Aggiunto il collegamento fra l'articolo e l'intervento - $dbo->query('INSERT INTO mg_articoli_interventi(idarticolo, idintervento, idimpianto, idautomezzo, descrizione, prezzo_vendita, prezzo_acquisto, sconto, sconto_unitario, tipo_sconto, idiva_vendita, qta, um, abilita_serial, serial, idgruppo) VALUES ('.prepare($idarticolo).', '.prepare($id_record).', '.(empty($idimpianto) ? 'NULL' : prepare($idimpianto)).', '.prepare($idautomezzo).', '.prepare($descrizione).', '.prepare($prezzo_vendita).', '.prepare($prezzo_acquisto).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', (SELECT idiva_vendita FROM mg_articoli WHERE id='.prepare($idarticolo).'), '.prepare($qta).', '.prepare($um).', '.prepare($rsart[0]['abilita_serial']).', '.prepare(!empty($serials[$i]) ? $serials[$i] : '').', '.prepare($idgruppo).')'); + $dbo->query('INSERT INTO mg_articoli_interventi(idarticolo, idintervento, idimpianto, idautomezzo, descrizione, prezzo_vendita, prezzo_acquisto, sconto, sconto_unitario, tipo_sconto, idiva_vendita, qta, um, abilita_serial, serial) VALUES ('.prepare($idarticolo).', '.prepare($id_record).', '.(empty($idimpianto) ? 'NULL' : prepare($idimpianto)).', '.prepare($idautomezzo).', '.prepare($descrizione).', '.prepare($prezzo_vendita).', '.prepare($prezzo_acquisto).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', (SELECT idiva_vendita FROM mg_articoli WHERE id='.prepare($idarticolo).'), '.prepare($qta).', '.prepare($um).', '.prepare($rsart[0]['abilita_serial']).', '.prepare(!empty($serials[$i]) ? $serials[$i] : '').')'); } link_componente_to_articolo($id_record, $idimpianto, $idarticolo, $qta); @@ -502,10 +495,8 @@ switch (post('op')) { add_movimento_magazzino($idarticolo, $qta, ['idautomezzo' => $idautomezzo, 'idintervento' => $id_record]); - $idgruppo = $dbo->fetchArray('SELECT idgruppo FROM mg_articoli_interventi WHERE id='.prepare($idriga).' AND idintervento='.prepare($id_record))[0]['idgruppo']; - // Elimino questo articolo dall'intervento - $dbo->query('DELETE FROM mg_articoli_interventi WHERE idgruppo='.prepare($idgruppo).' AND idintervento='.prepare($id_record)); + $dbo->query('DELETE FROM mg_articoli_interventi WHERE id='.prepare($idriga).' AND idintervento='.prepare($id_record)); // Elimino il collegamento al componente $dbo->query('DELETE FROM my_impianto_componenti WHERE idimpianto='.prepare($idimpianto).' AND idintervento='.prepare($id_record)); @@ -514,16 +505,18 @@ switch (post('op')) { break; case 'add_serial': - $idgruppo = $post['idgruppo']; - $serial = $post['serial']; + $idriga = $post['idriga']; + $idarticolo = $post['idarticolo']; - $q = 'SELECT * FROM mg_articoli_interventi WHERE idintervento='.prepare($id_record).' AND idgruppo='.prepare($idgruppo).' ORDER BY id'; - $rs = $dbo->fetchArray($q); - - foreach ($rs as $i => $r) { - $dbo->query('UPDATE mg_articoli_interventi SET serial='.prepare($serial[$i]).' WHERE id='.prepare($r['id'])); + $serials = (array) $post['serial']; + foreach ($serials as $key => $value) { + if (empty($value)) { + unset($serials[$key]); + } } + $dbo->sync('mg_prodotti', ['id_riga_intervento' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]); + break; case 'firma': diff --git a/modules/interventi/add_serial.php b/modules/interventi/add_serial.php deleted file mode 100644 index b586a7845..000000000 --- a/modules/interventi/add_serial.php +++ /dev/null @@ -1,47 +0,0 @@ -fetchArray($q2); - -echo ' -

'.tr('Articolo').': '.$rs2[0]['codice'].' - '.$rs2[0]['descrizione'].'

- -
- - - - - '; - -$serials = []; -$array = array_column($rs2, 'serial'); -foreach ($array as $value) { - if (!empty($value)) { - $serials[] = $value; - } -} - - echo ' -
-
- {[ "type": "select", "label": "'.tr('Serial').'", "name": "serial[]", "multiple": 1, "value": "'.implode(',', $serials).'", "values": "query=SELECT serial AS id, serial AS descrizione FROM vw_serials WHERE dir=\'uscita\' AND serial NOT IN (SELECT serial FROM vw_serials WHERE dir=\'entrata\' AND record != \'int-'.$id_record.'\')", "extra": "data-maximum=\"'.count($rs2).'\"" ]} -
-
'; - -echo ' - - -
-
- -
-
-
'; - -echo ' - '; diff --git a/modules/interventi/ajax_articoli.php b/modules/interventi/ajax_articoli.php index f2689afb1..48e269324 100644 --- a/modules/interventi/ajax_articoli.php +++ b/modules/interventi/ajax_articoli.php @@ -4,7 +4,7 @@ include_once __DIR__.'/../../core.php'; include_once $docroot.'/modules/articoli/modutil.php'; -$query = 'SELECT *, (SELECT codice FROM mg_articoli WHERE id=mg_articoli_interventi.idarticolo) AS codice, mg_articoli_interventi.id AS idriga, (SELECT prc_guadagno FROM mg_listini WHERE id=(SELECT idlistino FROM an_anagrafiche WHERE idanagrafica=(SELECT idanagrafica FROM in_interventi WHERE id=mg_articoli_interventi.idintervento) ) ) AS prc_guadagno FROM mg_articoli_interventi WHERE idintervento='.prepare($id_record).' '.Modules::getAdditionalsQuery('Magazzino').' GROUP BY idgruppo'; +$query = 'SELECT *, (SELECT codice FROM mg_articoli WHERE id=mg_articoli_interventi.idarticolo) AS codice, mg_articoli_interventi.id AS idriga, (SELECT prc_guadagno FROM mg_listini WHERE id=(SELECT idlistino FROM an_anagrafiche WHERE idanagrafica=(SELECT idanagrafica FROM in_interventi WHERE id=mg_articoli_interventi.idintervento) ) ) AS prc_guadagno FROM mg_articoli_interventi WHERE idintervento='.prepare($id_record).' '.Modules::getAdditionalsQuery('Magazzino'); $rs = $dbo->fetchArray($query); if (!empty($rs)) { @@ -33,27 +33,18 @@ if (!empty($rs)) { '; foreach ($rs as $r) { - $qserial = 'SELECT * FROM mg_articoli_interventi WHERE idintervento='.prepare($id_record).' AND idarticolo='.prepare($r['idarticolo']).' AND idgruppo='.prepare($r['idgruppo']); - $rsserial = $dbo->fetchArray($qserial); + // Individuazione dei seriali + if (!empty($r['idarticolo']) && !empty($r['abilita_serial'])) { + $serials = array_column($dbo->fetchArray('SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND id_riga_intervento='.prepare($r['id'])), 'serial'); + $mancanti = $r['qta'] - count($serials); - $mancanti = 0; - $serials = []; - - if (!empty($r['abilita_serial'])) { - foreach ($rsserial as $seriali) { - $seriali['serial'] = trim($seriali['serial']); - if (!empty($seriali['serial'])) { - $serials[] = $seriali['serial']; - } else { - ++$mancanti; - } + if ($mancanti > 0) { + $extra = 'class="warning"'; + } else { + $mancanti = 0; } } - if ($mancanti > 0) { - $extra = 'class="warning"'; - } - echo ' @@ -132,7 +123,7 @@ if (!empty($rs)) { if ($r['abilita_serial']) { echo ' - '; + '; } echo ' diff --git a/modules/ordini/actions.php b/modules/ordini/actions.php index 7c3a0947e..aff983e03 100644 --- a/modules/ordini/actions.php +++ b/modules/ordini/actions.php @@ -144,11 +144,7 @@ switch (post('op')) { $sconto = ($tipo_sconto == 'PRC') ? ($prezzo * $sconto_unitario) / 100 : $sconto_unitario; $sconto = $sconto * $qta; - // Calcolo idgruppo per questo inserimento - $ridgruppo = $dbo->fetchArray('SELECT IFNULL(MAX(idgruppo) + 1, 0) AS idgruppo FROM or_righe_ordini WHERE idordine = '.prepare($id_record)); - $idgruppo = $ridgruppo[0]['idgruppo']; - - add_articolo_inordine($id_record, $idarticolo, $descrizione, $idiva, $qta, $prezzo_vendita * $qta, $sconto, $sconto_unitario, $tipo_sconto, '', '', '', $idgruppo); + add_articolo_inordine($id_record, $idarticolo, $descrizione, $idiva, $qta, $prezzo_vendita * $qta, $sconto, $sconto_unitario, $tipo_sconto); $_SESSION['infos'][] = tr('Articolo aggiunto!'); } @@ -177,7 +173,7 @@ switch (post('op')) { $iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale']; $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile']; - $query = 'INSERT INTO or_righe_ordini(idordine, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idgruppo, `order`) VALUES('.prepare($id_record).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`idgruppo`) + 1, 0) FROM or_righe_ordini AS t WHERE idordine='.prepare($id_record).'), (SELECT IFNULL(MAX(`order`) + 1, 0) FROM or_righe_ordini AS t WHERE idordine='.prepare($id_record).'))'; + $query = 'INSERT INTO or_righe_ordini(idordine, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, `order`) VALUES('.prepare($id_record).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM or_righe_ordini AS t WHERE idordine='.prepare($id_record).'))'; if ($dbo->query($query)) { $_SESSION['infos'][] = tr('Riga aggiunta!'); @@ -198,7 +194,11 @@ switch (post('op')) { $idriga = post('idriga'); if ($id_record != '' && $idarticolo != '') { - rimuovi_articolo_daordine($idarticolo, $id_record, $idriga); + if (!rimuovi_articolo_daordine($idarticolo, $id_record, $idriga)) { + $_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!'); + + return; + } // if( $dbo->query($query) ){ // Ricalcolo inps, ritenuta e bollo @@ -250,6 +250,22 @@ switch (post('op')) { $sconto = ($tipo_sconto == 'PRC') ? ($prezzo * $sconto_unitario) / 100 : $sconto_unitario; $sconto = $sconto * $qta; + // Lettura idarticolo dalla riga documento + $rs = $dbo->fetchArray('SELECT idordine, idarticolo, qta, abilita_serial FROM or_righe_ordini WHERE id='.prepare($idriga)); + $idarticolo = $rs[0]['idarticolo']; + $old_qta = $rs[0]['qta']; + $idordine = $rs[0]['idordine']; + $abilita_serial = $rs[0]['abilita_serial']; + + // Controllo per gestire i serial + if (!empty($idarticolo)) { + if (!controlla_seriali('id_riga_ordine', $idriga, $old_qta, $qta, $dir)) { + $_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!'); + + return; + } + } + // Calcolo iva $query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva); $rs = $dbo->fetchArray($query); @@ -257,50 +273,9 @@ switch (post('op')) { $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile']; $desc_iva = $rs[0]['descrizione']; - // Lettura idarticolo dalla riga documento - $rs = $dbo->fetchArray('SELECT idgruppo, idordine, idarticolo, qta, abilita_serial FROM or_righe_ordini WHERE id='.prepare($idriga)); - $idarticolo = $rs[0]['idarticolo']; - $old_qta = $rs[0]['qta']; - $idgruppo = $rs[0]['idgruppo']; - $idordine = $rs[0]['idordine']; - $abilita_serial = $rs[0]['abilita_serial']; - // Modifica riga generica sul documento - $query = 'UPDATE or_righe_ordini SET idiva='.prepare($idiva).', desc_iva='.prepare($rs[0]['descrizione']).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).' WHERE idgruppo='.prepare($idgruppo).' AND idordine='.prepare($idordine); + $query = 'UPDATE or_righe_ordini SET idiva='.prepare($idiva).', desc_iva='.prepare($rs[0]['descrizione']).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', qta='.prepare($qta).' WHERE id='.prepare($idriga); if ($dbo->query($query)) { - // Modifica della quantità - $dbo->query('UPDATE or_righe_ordini SET qta='.prepare($qta).' WHERE idgruppo='.prepare($idgruppo)); - - // Modifica per gestire i serial - if (!empty($idarticolo)) { - $new_qta = $qta - $old_qta; - $new_qta = ($old_qta < $qta) ? $new_qta : -$new_qta; - - if (!empty($abilita_serial)) { - if ($old_qta < $qta) { - for ($i = 0; $i < $new_qta; ++$i) { - $dbo->query('INSERT INTO or_righe_ordini(idordine, idarticolo, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idgruppo, `order`) SELECT idordine, idarticolo, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idgruppo, `order` FROM or_righe_ordini WHERE id='.prepare($idriga)); - } - } else { - if ($dir == 'uscita') { - if ($new_qta > $dbo->fetchArray("SELECT COUNT(*) AS rimovibili FROM or_righe_ordini WHERE serial NOT IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idgruppo=".prepare($idgruppo).' AND idordine='.prepare($idordine))[0]['rimovibili']) { - $_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!'); - - return; - } else { - $deletes = $dbo->fetchArray('SELECT id FROM or_righe_ordini AS t WHERE idgruppo = '.prepare($idgruppo).' AND idordine='.prepare($idordine)." AND serial NOT IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') ORDER BY serial ASC LIMIT ".$new_qta); - } - } else { - $deletes = $dbo->fetchArray('SELECT id FROM or_righe_ordini AS t WHERE idgruppo = '.prepare($idgruppo).' AND idordine='.prepare($idordine).' ORDER BY serial ASC LIMIT '.$new_qta); - } - - foreach ((array) $deletes as $delete) { - $dbo->query('DELETE FROM or_righe_ordini WHERE id = '.prepare($delete['id'])); - } - } - } - } - $_SESSION['infos'][] = tr('Riga modificata!'); // Ricalcolo inps, ritenuta e bollo @@ -315,9 +290,13 @@ switch (post('op')) { // eliminazione ordine case 'delete': - if ($dir == 'uscita') { - $non_rimovibili = $dbo->fetchArray("SELECT COUNT(*) AS non_rimovibili FROM or_righe_ordini WHERE serial IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idordine=".prepare($id_record))[0]['non_rimovibili']; - if ($non_rimovibili != 0) { + // Se ci sono degli articoli collegati (ma non collegati a preventivi o interventi) li rimetto nel magazzino + $query = 'SELECT id, idarticolo FROM or_righe_ordini WHERE idordine='.prepare($id_record).' AND NOT idarticolo=0'; + $rs = $dbo->fetchArray($query); + + foreach ($rs as $value) { + $non_rimovibili = seriali_non_rimuovibili('id_riga_documenti', $value['id'], $dir); + if (!empty($non_rimovibili)) { $_SESSION['errors'][] = tr('Alcuni serial number sono già stati utilizzati!'); return; @@ -331,16 +310,18 @@ switch (post('op')) { break; case 'add_serial': - $idgruppo = $post['idgruppo']; - $serial = $post['serial']; + $idriga = $post['idriga']; + $idarticolo = $post['idarticolo']; - $q = 'SELECT * FROM or_righe_ordini WHERE idordine='.prepare($id_record).' AND idgruppo='.prepare($idgruppo).' ORDER BY id'; - $rs = $dbo->fetchArray($q); - - foreach ($rs as $i => $r) { - $dbo->query('UPDATE or_righe_ordini SET serial='.prepare($serial[$i]).' WHERE id='.prepare($r['id'])); + $serials = (array) $post['serial']; + foreach ($serials as $key => $value) { + if (empty($value)) { + unset($serials[$key]); + } } + $dbo->sync('mg_prodotti', ['id_riga_ordine' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]); + break; case 'update_position': diff --git a/modules/ordini/add_serial.php b/modules/ordini/add_serial.php deleted file mode 100644 index b4a977546..000000000 --- a/modules/ordini/add_serial.php +++ /dev/null @@ -1,108 +0,0 @@ -fetchArray($q2); - -echo ' -

'.tr('Articolo').': '.$rs2[0]['codice'].' - '.$rs2[0]['descrizione'].'

- -
- - - - '; - -$serials = []; -$array = array_column($rs2, 'serial'); -foreach ($array as $value) { - if (!empty($value)) { - $serials[] = $value; - } -} - -if ($dir == 'entrata') { - echo ' -
-
- {[ "type": "select", "label": "'.tr('Serial').'", "name": "serial[]", "multiple": 1, "value": "'.implode(',', $serials).'", "values": "query=SELECT serial AS id, serial AS descrizione FROM vw_serials WHERE dir=\'uscita\' AND serial NOT IN (SELECT serial FROM vw_serials WHERE dir=\'entrata\' AND record != \'fat-'.$id_record.'\')", "extra": "data-maximum=\"'.count($rs2).'\"" ]} -
-
'; -} else { - echo ' -

'.tr('Inserisci i numeri seriali degli articoli aggiunti:').'

'; - - foreach ($array as $key => $serial) { - if ($key % 3 == 0) { - echo ' -
'; - } - - $res = $dbo->fetchArray("SELECT record FROM vw_serials WHERE dir='entrata' AND serial = ".prepare($serial)); - - echo ' -
- {[ "type": "text", "name": "serial[]", "value": "'.$serial.'"'.(!empty($res) ? ', "readonly": 1' : '').' ]}'; - - if (!empty($res)) { - $pieces = explode('-', $res[0]['record']); - switch ($pieces[0]) { - case 'int': - $modulo = 'Interventi'; - break; - - case 'ddt': - $modulo = 'Ddt di vendita'; - break; - - case 'fat': - $modulo = 'Fatture di vendita'; - break; - - case 'ord': - $modulo = 'Ordini cliente'; - break; - } - - echo ' - '.Modules::link($modulo, $pieces[1], tr('Visualizza vendita').' ', null); - } - echo ' -
'; - - if (($key + 1) % 3 == 0) { - echo ' -
-
'; - } - } - if (($key + 1) % 3 != 0) { - echo ' - '; - } -} - -echo ' - - -
-
- -
-
-
'; - -echo ' - '; diff --git a/modules/ordini/creaddt.php b/modules/ordini/creaddt.php deleted file mode 100644 index f3e3db8cc..000000000 --- a/modules/ordini/creaddt.php +++ /dev/null @@ -1,252 +0,0 @@ -fetchArray("SELECT * FROM or_ordini WHERE id=".prepare($id_record)); -$numero = (!empty($rs[0]['numero_esterno'])) ? $rs[0]['numero_esterno'] : $rs[0]['numero']; -$idanagrafica = $rs[0]['idanagrafica']; -$idpagamento = $rs[0]['idpagamento']; -$idconto = $rs[0]['idconto']; - -/* - Form di inserimento riga documento -*/ - -echo "

Ordine numero $numero

"; -echo "Seleziona le righe che vuoi inserire nel ddt e la quantità:

"; - -echo '