From d76ca979bae31408bdf69118607d6cdb1438ed7d Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Tue, 20 Oct 2020 11:33:34 +0200 Subject: [PATCH] Miglioramento select degli Articoli --- assets/src/js/functions/select.js | 10 +-- modules/articoli/ajax/select.php | 115 ++++++++++-------------------- 2 files changed, 43 insertions(+), 82 deletions(-) diff --git a/assets/src/js/functions/select.js b/assets/src/js/functions/select.js index 0c8fd175b..bbc5d8bf1 100755 --- a/assets/src/js/functions/select.js +++ b/assets/src/js/functions/select.js @@ -27,7 +27,7 @@ function start_superselect() { }); } -function selectBackground(data, container) { +function selectOptionRender(data, container) { let bg; if (data._bgcolor_) { @@ -210,7 +210,7 @@ function initStaticSelectInput(input) { escapeMarkup: function (text) { return text; }, - templateResult: selectBackground, + templateResult: selectOptionRender, }); } @@ -230,7 +230,7 @@ function initDynamicSelectInput(input) { escapeMarkup: function (text) { return text; }, - templateResult: selectBackground, + templateResult: selectOptionRender, ajax: { url: globals.rootdir + "/ajax_select.php?op=" + $input.data('source'), dataType: 'json', @@ -250,7 +250,7 @@ function initDynamicSelectInput(input) { let results = data.results; // Interpretazione forzata per campi optgroup - if (results && results[0] && [0]['optgroup']) { + if (results && results[0] && results[0]['optgroup']) { let groups = results.reduce(function (r, a) { r[a.optgroup] = r[a.optgroup] || []; r[a.optgroup].push(a); @@ -258,7 +258,7 @@ function initDynamicSelectInput(input) { }, {}); let results_groups = []; - for (const key in groups) { + for ([key, results] of Object.entries(groups)) { results_groups.push({ text: key, children: groups[key], diff --git a/modules/articoli/ajax/select.php b/modules/articoli/ajax/select.php index 3656a2c73..c36c8457b 100755 --- a/modules/articoli/ajax/select.php +++ b/modules/articoli/ajax/select.php @@ -31,11 +31,14 @@ switch ($resource) { $sedi_non_impostate = !isset($superselect['idsede_partenza']) && !isset($superselect['idsede_destinazione']); $prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA'); $usare_dettaglio_fornitore = $superselect['dir'] == 'uscita'; + $usare_iva_anagrafica = $superselect['dir'] == 'entrata' && !empty($superselect['idanagrafica']); - $query = 'SELECT + $query = "SELECT + IF(`categoria`.`nome` IS NOT NULL, CONCAT(`categoria`.`nome`, IF(`sottocategoria`.`nome` IS NOT NULL, CONCAT(' (', `sottocategoria`.`nome`, ')'), '-')), '".tr('Nessuna categoria')."') AS optgroup, mg_articoli.id, mg_articoli.barcode, - mg_articoli.'.($prezzi_ivati ? 'prezzo_vendita_ivato' : 'prezzo_vendita').' AS prezzo_vendita, + + mg_articoli.".($prezzi_ivati ? 'prezzo_vendita_ivato' : 'prezzo_vendita').' AS prezzo_vendita, mg_articoli.prezzo_vendita_ivato AS prezzo_vendita_ivato,'; // Informazioni relative al fornitore specificato dal documenti di acquisto @@ -57,20 +60,30 @@ switch ($resource) { NULL AS id_dettaglio_fornitore,'; } + if ($usare_iva_anagrafica){ + $query .= ' + IFNULL(iva_anagrafica.id, IFNULL(iva_predefinita.id, iva_articolo.id)) AS idiva_vendita, + IFNULL(iva_anagrafica.descrizione, IFNULL(iva_predefinita.descrizione, iva_articolo.descrizione)) AS iva_vendita,'; + }else{ + $query .= ' + IFNULL(iva_predefinita.id, iva_articolo.id) AS idiva_vendita, + IFNULL(iva_predefinita.descrizione, iva_articolo.descrizione) AS iva_vendita,'; + } + $query .= ' - round(mg_articoli.qta,'.setting('Cifre decimali per quantità').') AS qta, + round(mg_articoli.qta,'.setting('Cifre decimali per quantità').") AS qta, mg_articoli.um, mg_articoli.servizio, - mg_articoli.idiva_vendita, + mg_articoli.idconto_vendita, mg_articoli.idconto_acquisto, categoria.`nome` AS categoria, sottocategoria.`nome` AS sottocategoria, - co_iva.descrizione AS iva_vendita, - CONCAT(conto_vendita_categoria .numero, ".", conto_vendita_sottocategoria.numero, " ", conto_vendita_sottocategoria.descrizione) AS idconto_vendita_title, - CONCAT(conto_acquisto_categoria .numero, ".", conto_acquisto_sottocategoria.numero, " ", conto_acquisto_sottocategoria.descrizione) AS idconto_acquisto_title + + CONCAT(conto_vendita_categoria .numero, '.', conto_vendita_sottocategoria.numero, ' ', conto_vendita_sottocategoria.descrizione) AS idconto_vendita_title, + CONCAT(conto_acquisto_categoria .numero, '.', conto_acquisto_sottocategoria.numero, ' ', conto_acquisto_sottocategoria.descrizione) AS idconto_acquisto_title + FROM mg_articoli - LEFT JOIN co_iva ON mg_articoli.idiva_vendita = co_iva.id LEFT JOIN `mg_categorie` AS categoria ON `categoria`.`id` = `mg_articoli`.`id_categoria` LEFT JOIN `mg_categorie` AS sottocategoria ON `sottocategoria`.`id` = `mg_articoli`.`id_sottocategoria` LEFT JOIN co_pianodeiconti3 AS conto_vendita_sottocategoria ON conto_vendita_sottocategoria.id=mg_articoli.idconto_vendita @@ -78,6 +91,16 @@ switch ($resource) { LEFT JOIN co_pianodeiconti3 AS conto_acquisto_sottocategoria ON conto_acquisto_sottocategoria.id=mg_articoli.idconto_acquisto LEFT JOIN co_pianodeiconti2 AS conto_acquisto_categoria ON conto_acquisto_sottocategoria.idpianodeiconti2=conto_acquisto_categoria.id + LEFT JOIN co_iva AS iva_articolo ON iva_articolo.id = mg_articoli.idiva_vendita + LEFT JOIN co_iva AS iva_predefinita ON iva_predefinita.id = (SELECT valore FROM zz_settings WHERE nome = 'Iva predefinita')"; + + if ($usare_iva_anagrafica) { + $query .= " + LEFT JOIN co_iva AS iva_anagrafica ON iva_anagrafica.id = (SELECT idiva_vendite FROM an_anagrafiche WHERE idanagrafica = ".prepare($superselect['idanagrafica']).')'; + } + + $query .= ' + LEFT JOIN mg_fornitore_articolo ON mg_fornitore_articolo.id_articolo = mg_articoli.id AND mg_fornitore_articolo.deleted_at IS NULL AND mg_fornitore_articolo.id_fornitore = '.prepare($superselect['idanagrafica']); // Se c'è una sede settata, carico tutti gli articoli presenti in quella sede @@ -130,90 +153,28 @@ switch ($resource) { $data = AJAX::selectResults($query, $where, $filter, $search_fields, $limit, $custom); $rs = $data['results']; - // Individuazione di eventuali listini - if (!empty($superselect['dir']) && !empty($superselect['idanagrafica'])) { - $listino = $dbo->fetchOne('SELECT prc_guadagno as percentuale FROM mg_listini WHERE id=(SELECT idlistino_'.($superselect['dir'] == 'uscita' ? 'acquisti' : 'vendite').' FROM an_anagrafiche WHERE idanagrafica='.prepare($superselect['idanagrafica']).')'); - } - - //per le vendite leggo iva predefinita da anagrafica, se settata - if (!empty($superselect['dir']) && $superselect['dir'] == 'entrata' && !empty($superselect['idanagrafica'])) { - $idiva_predefinita_anagrafica = $dbo->fetchOne('SELECT idiva_vendite FROM an_anagrafiche WHERE idanagrafica = '.prepare($superselect['idanagrafica']))['idiva_vendite']; - $iva_predefinita_anagrafica = $dbo->fetchOne('SELECT descrizione FROM co_iva WHERE id = '.prepare($idiva_predefinita_anagrafica))['descrizione']; - } - // IVA da impostazioni - $idiva_predefinita = setting('Iva predefinita'); - $iva_predefinita = $dbo->fetchOne('SELECT descrizione FROM co_iva WHERE id='.prepare($idiva_predefinita))['descrizione']; - - $previous_category = -1; - $previous_subcategory = -1; - foreach ($rs as $r) { + foreach ($rs as $k => $r) { // Lettura movimenti delle mie sedi - $qta_azienda = $dbo->fetchOne("SELECT SUM(mg_movimenti.qta) AS qta, IF(mg_movimenti.idsede_azienda= 0,'Sede legale',(CONCAT_WS(' - ',an_sedi.nomesede,an_sedi.citta))) as sede FROM mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_azienda WHERE mg_movimenti.idarticolo=".prepare($r['id']).' AND idsede_azienda='.prepare($superselect['idsede_partenza']).' GROUP BY idsede_azienda'); + $qta_azienda = $dbo->fetchOne("SELECT SUM(mg_movimenti.qta) AS qta FROM mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_azienda WHERE mg_movimenti.idarticolo = ".prepare($r['id']).' AND idsede_azienda = '.prepare($superselect['idsede_partenza'])); // Lettura eventuali movimenti ad una propria sede (nel caso di movimenti fra sedi della mia azienda) per il calcolo corretto delle quantità if ($superselect['idsede_partenza'] != 0) { - $qta_controparte = $dbo->fetchOne("SELECT SUM(mg_movimenti.qta) AS qta, IF(mg_movimenti.idsede_controparte= 0,'Sede legale',(CONCAT_WS(' - ',an_sedi.nomesede,an_sedi.citta))) as sede FROM mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_controparte WHERE mg_movimenti.idarticolo=".prepare($r['id']).' AND idsede_controparte='.prepare($superselect['idsede_partenza']).' GROUP BY idsede_controparte'); + $qta_controparte = $dbo->fetchOne("SELECT SUM(mg_movimenti.qta) AS qta FROM mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_controparte WHERE mg_movimenti.idarticolo = ".prepare($r['id']).' AND idsede_controparte = '.prepare($superselect['idsede_partenza'])); } else { - $qta_controparte = $dbo->fetchOne("SELECT SUM(mg_movimenti.qta) AS qta, IF(mg_movimenti.idsede_controparte= 0,'Sede legale',(CONCAT_WS(' - ',an_sedi.nomesede,an_sedi.citta))) as sede FROM ((( mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_controparte ) LEFT JOIN dt_ddt ON mg_movimenti.idddt = dt_ddt.id ) LEFT JOIN co_documenti ON mg_movimenti.iddocumento = co_documenti.id ) WHERE mg_movimenti.idarticolo=".prepare($r['id']).' AND idsede_controparte='.prepare($superselect['idsede_partenza']).' AND IFNULL( dt_ddt.idanagrafica, co_documenti.idanagrafica ) = '.prepare(setting('Azienda predefinita')).' GROUP BY idsede_controparte'); + $qta_controparte = $dbo->fetchOne("SELECT SUM(mg_movimenti.qta) AS qta FROM ((( mg_movimenti LEFT JOIN an_sedi ON an_sedi.id = mg_movimenti.idsede_controparte ) LEFT JOIN dt_ddt ON mg_movimenti.idddt = dt_ddt.id ) LEFT JOIN co_documenti ON mg_movimenti.iddocumento = co_documenti.id ) WHERE mg_movimenti.idarticolo = ".prepare($r['id']).' AND idsede_controparte = '.prepare($superselect['idsede_partenza']).' AND IFNULL(dt_ddt.idanagrafica, co_documenti.idanagrafica) = '.prepare(setting('Azienda predefinita'))); } $qta = $qta_azienda['qta'] - $qta_controparte['qta']; - if ($previous_category != $r['categoria'] || $previous_subcategory != $r['sottocategoria']) { - $previous_category = $r['categoria']; - $previous_subcategory = $r['sottocategoria']; - - $text = ''.tr('Nessuna categoria').''; - if (!empty($r['categoria'])) { - $text = $r['categoria'].' ('.(!empty($r['sottocategoria']) ? $r['sottocategoria'] : '-').')'; - } - - $results[] = [ - 'text' => $text, - 'children' => [], - ]; - } - - // Iva dell'articolo - if (!empty($idiva_predefinita_anagrafica)) { - $idiva = $idiva_predefinita_anagrafica; - $iva = $iva_predefinita_anagrafica; - } elseif (empty($r['idiva_vendita'])) { - $idiva = $idiva_predefinita; - $iva = $iva_predefinita; - } else { - $idiva = $r['idiva_vendita']; - $iva = $r['iva_vendita']; - } - - $prezzo_vendita = $r['prezzo_vendita']; - - $results[count($results) - 1]['children'][] = [ - 'id' => $r['id'], + $rs[$k] = array_merge($r, [ 'text' => $r['codice'].' - '.$r['descrizione'].' '.(!$r['servizio'] ? '('.Translator::numberToLocale($qta).(!empty($r['um']) ? ' '.$r['um'] : '').')' : ''), - 'codice' => $r['codice'], - 'descrizione' => $r['descrizione'], - 'qta_minima' => $r['qta_minima'], - 'id_dettaglio_fornitore' => $r['id_dettaglio_fornitore'], - 'barcode' => $r['barcode'], - 'qta' => $r['qta'], - 'um' => $r['um'], - 'idiva_vendita' => $idiva, - 'iva_vendita' => $iva, - 'idconto_vendita' => $r['idconto_vendita'], - 'idconto_vendita_title' => $r['idconto_vendita_title'], - 'idconto_acquisto' => $r['idconto_acquisto'], - 'idconto_acquisto_title' => $r['idconto_acquisto_title'], - 'prezzo_acquisto' => $r['prezzo_acquisto'], - 'prezzo_vendita' => $prezzo_vendita, - 'prezzo_vendita_ivato' => $r['prezzo_vendita_ivato'], 'disabled' => $r['qta'] <= 0 && !$superselect['permetti_movimento_a_zero'] && !$r['servizio'], - ]; + ]); } $results = [ - 'results' => $results, + 'results' => $rs, 'recordsFiltered' => $data['recordsFiltered'], ];