From d8177bda1cbce5ec8f4da9ea6da8a9c1b48e5bdb Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Fri, 2 Sep 2022 11:02:04 +0200 Subject: [PATCH 01/46] Fix validation per variabile id_record --- src/HTMLBuilder/Wrapper/HTMLWrapper.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/HTMLBuilder/Wrapper/HTMLWrapper.php b/src/HTMLBuilder/Wrapper/HTMLWrapper.php index fd4cbcb72..ed1aa030b 100755 --- a/src/HTMLBuilder/Wrapper/HTMLWrapper.php +++ b/src/HTMLBuilder/Wrapper/HTMLWrapper.php @@ -129,6 +129,11 @@ class HTMLWrapper implements WrapperInterface var message = container.find("span"); var icon = container.find("i"); + var id_record = "'.$id_record.'"; + if ($(".modal-content").is(":visible")) { + var id_record = ""; + } + icon.attr("class", "fa fa-spinner fa-spin"); $.ajax({ @@ -136,7 +141,7 @@ class HTMLWrapper implements WrapperInterface type: "post", data: { id_module: "'.$id_module.'", - id_record: "'.$id_record.'", + id_record: id_record, name: "'.$name.'", value: value, op: "validate", From 690d1c3a0de83515fbe38f8496f1d73961b6736c Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Fri, 2 Sep 2022 17:24:12 +0200 Subject: [PATCH 02/46] Fix creazione intervento da ordine fornitore --- modules/interventi/actions.php | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index 7f0528004..811b3ac95 100644 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -32,6 +32,7 @@ use Modules\Interventi\Intervento; use Modules\Interventi\Stato; use Modules\TipiIntervento\Tipo as TipoSessione; use Plugins\ComponentiImpianti\Componente; +use Plugins\ListinoClienti\DettaglioPrezzo; use Plugins\PianificazioneInterventi\Promemoria; switch (post('op')) { @@ -629,18 +630,39 @@ switch (post('op')) { $id_record = $intervento->id; } + // Evado le righe solo se il documento originale non è un Ordine fornitore + $evadi_qta_parent = true; + if (post('op') == 'add_intervento') { + $evadi_qta_parent = false; + } + $righe = $documento->getRighe(); foreach ($righe as $riga) { if (post('evadere')[$riga->id] == 'on' and !empty(post('qta_da_evadere')[$riga->id])) { $qta = post('qta_da_evadere')[$riga->id]; - $copia = $riga->copiaIn($intervento, $qta); + $copia = $riga->copiaIn($intervento, $qta, $evadi_qta_parent); - // Aggiornamento seriali if ($copia->isArticolo()) { + // Aggiornamento seriali $serials = is_array(post('serial')[$riga->id]) ? post('serial')[$riga->id] : []; - $copia->serials = $serials; + + // Aggiornamento prezzi se il documento originale è un Ordine fornitore + if (post('op') == 'add_intervento') { + $articolo = $copia->articolo; + + $cliente = DettaglioPrezzo::dettagli($riga->idarticolo, $anagrafica->id, 'entrata', $qta)->first(); + if (empty($cliente)) { + $cliente = DettaglioPrezzo::dettaglioPredefinito($riga->idarticolo, $anagrafica->id, 'entrata')->first(); + } + + $prezzo_unitario = $cliente->prezzo_unitario - ($cliente->prezzo_unitario * $cliente->percentuale / 100); + + $copia->setPrezzoUnitario($cliente ? $prezzo_unitario : $cliente->prezzo_vendita, $copia->aliquota->id); + $copia->setSconto($cliente->sconto_percentuale ?: 0, 'PRC'); + $copia->costo_unitario = $riga->prezzo_unitario ?: 0; + } } $copia->save(); From d7b46ac3c0a36c3e0c8ed1507c82285e5c7e3061 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Fri, 2 Sep 2022 17:24:46 +0200 Subject: [PATCH 03/46] Fix calcolo cassa previdenziale import FE --- plugins/importFE/src/FatturaOrdinaria.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/plugins/importFE/src/FatturaOrdinaria.php b/plugins/importFE/src/FatturaOrdinaria.php index a4a78ae84..dba3c83a4 100755 --- a/plugins/importFE/src/FatturaOrdinaria.php +++ b/plugins/importFE/src/FatturaOrdinaria.php @@ -211,9 +211,7 @@ class FatturaOrdinaria extends FatturaElettronica $conto_arrotondamenti = $conto[$key]; } - if ($riga['Ritenuta'] == 'SI') { - $obj->id_rivalsa_inps = $id_rivalsa; - } + $obj->id_rivalsa_inps = $id_rivalsa; $obj->ritenuta_contributi = $ritenuta_contributi; @@ -341,7 +339,7 @@ class FatturaOrdinaria extends FatturaElettronica $totale_righe = sum($totali_righe, null, 2); } - $diff = round(abs($totale_righe) - abs($fattura->totale_imponibile), 2); + $diff = round(abs($totale_righe) - abs($fattura->totale_imponibile + $fattura->rivalsa_inps), 2); if (!empty($diff)) { // Rimozione dell'IVA calcolata automaticamente dal gestionale $iva_arrotondamento = database()->fetchOne('SELECT * FROM co_iva WHERE percentuale=0 AND deleted_at IS NULL'); @@ -418,9 +416,7 @@ class FatturaOrdinaria extends FatturaElettronica if (!empty($casse)) { $totale = 0; foreach ($righe as $riga) { - if ($riga['Ritenuta'] == 'SI') { - $totale += $riga['PrezzoTotale']; - } + $totale += $riga['PrezzoTotale']; } $casse = isset($casse[0]) ? $casse : [$casse]; From 94df2653291cdf1df12eeaf995772eba98b2cc2e Mon Sep 17 00:00:00 2001 From: Matteo Date: Mon, 5 Sep 2022 11:56:12 +0200 Subject: [PATCH 04/46] Fix per numero ordine in menu a tendina --- modules/ordini/ajax/select.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ordini/ajax/select.php b/modules/ordini/ajax/select.php index 184505ff8..ee6bb6b3c 100644 --- a/modules/ordini/ajax/select.php +++ b/modules/ordini/ajax/select.php @@ -27,7 +27,7 @@ switch ($resource) { case 'ordini-cliente': if (isset($superselect['idanagrafica'])) { $query = 'SELECT or_ordini.id AS id, - CONCAT("Ordine ", numero, " del ", DATE_FORMAT(data, "%d/%m/%Y"), " [", (SELECT `descrizione` FROM `or_statiordine` WHERE `or_statiordine`.`id` = `idstatoordine`) , "]") AS descrizione + CONCAT("Ordine ", numero_esterno, " del ", DATE_FORMAT(data, "%d/%m/%Y"), " [", (SELECT `descrizione` FROM `or_statiordine` WHERE `or_statiordine`.`id` = `idstatoordine`) , "]") AS descrizione FROM or_ordini INNER JOIN or_tipiordine ON or_ordini.idtipoordine = or_tipiordine.id INNER JOIN an_anagrafiche ON or_ordini.idanagrafica = an_anagrafiche.idanagrafica From cb9add0687f849d4a544878437308440f359ab48 Mon Sep 17 00:00:00 2001 From: loviuz Date: Mon, 5 Sep 2022 15:33:40 +0200 Subject: [PATCH 05/46] Rimozione file deprecato --- update/2_4_36.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/update/2_4_36.php b/update/2_4_36.php index c5db43ee6..c7f48c82c 100644 --- a/update/2_4_36.php +++ b/update/2_4_36.php @@ -1,5 +1,16 @@ $value) { + $files[$key] = realpath(base_dir().'/'.$value); +} + +delete($files); + $scadenze = $dbo->fetchArray('SELECT * FROM co_scadenziario'); foreach ($scadenze as $scadenza) { From 04dbc555c75faca6d99abe789bb3cde88ab2f35b Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Mon, 5 Sep 2022 16:59:33 +0200 Subject: [PATCH 06/46] Fix minore bulk impianti --- modules/impianti/bulk.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/impianti/bulk.php b/modules/impianti/bulk.php index bb8d4c9d0..5bd97ed08 100644 --- a/modules/impianti/bulk.php +++ b/modules/impianti/bulk.php @@ -28,8 +28,8 @@ switch (post('op')) { $exporter = new CSV($file); // Esportazione dei record selezionati - $fatture = Impianto::whereIn('id', $id_records)->get(); - $exporter->setRecords($fatture); + $impianti = Impianto::whereIn('id', $id_records)->get(); + $exporter->setRecords($impianti); $count = $exporter->exportRecords(); From df888e84ec7a2ccf975a7b06e561004282f98254 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Tue, 6 Sep 2022 13:04:32 +0200 Subject: [PATCH 07/46] Aggiunti prezzi ivati nella stampa documenti --- templates/contratti/body.php | 6 ++++-- templates/ddt/body.php | 6 ++++-- templates/fatture/body.php | 6 ++++-- templates/ordini/body.php | 6 ++++-- templates/preventivi/body.php | 5 +++-- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/templates/contratti/body.php b/templates/contratti/body.php index a34c8863b..df217bcce 100755 --- a/templates/contratti/body.php +++ b/templates/contratti/body.php @@ -21,6 +21,8 @@ use Carbon\CarbonInterval; include_once __DIR__.'/../../core.php'; +$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA'); + // Creazione righe fantasma $autofill = new \Util\Autofill($options['pricing'] ? 4 : 2); $autofill->setRows(20, 10); @@ -159,7 +161,7 @@ foreach ($righe as $riga) { // Prezzo unitario echo ' - '.moneyFormat($riga->prezzo_unitario); + '.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario); if ($riga->sconto > 0) { $text = discountInfo($riga, false); @@ -176,7 +178,7 @@ foreach ($righe as $riga) { // Imponibile echo ' - '.moneyFormat($riga->totale_imponibile).' + '.moneyFormat($prezzi_ivati ? $riga->totale : $riga->totale_imponibile).' '; } } else { diff --git a/templates/ddt/body.php b/templates/ddt/body.php index b9d7bf499..e8c541cc6 100755 --- a/templates/ddt/body.php +++ b/templates/ddt/body.php @@ -19,6 +19,8 @@ include_once __DIR__.'/../../core.php'; +$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA'); + // Creazione righe fantasma $autofill = new \Util\Autofill($options['pricing'] ? 7 : 4); $rows_per_page = 16; @@ -142,7 +144,7 @@ foreach ($righe as $riga) { // Prezzo unitario echo ' - '.moneyFormat($riga->prezzo_unitario); + '.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario); if ($riga->sconto > 0) { $text = discountInfo($riga, false); @@ -159,7 +161,7 @@ foreach ($righe as $riga) { // Imponibile echo ' - '.moneyFormat($riga->totale_imponibile).' + '.moneyFormat($prezzi_ivati ? $riga->totale : $riga->totale_imponibile).' '; // Iva diff --git a/templates/fatture/body.php b/templates/fatture/body.php index aaa57ce66..79638a6c0 100755 --- a/templates/fatture/body.php +++ b/templates/fatture/body.php @@ -24,6 +24,8 @@ include_once __DIR__.'/../../core.php'; $v_iva = []; $v_totale = []; +$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA'); + // Creazione righe fantasma $autofill = new \Util\Autofill(6, 40); $rows_per_page = $fattura_accompagnatoria ? 13 : 18; @@ -178,7 +180,7 @@ foreach ($righe as $riga) { // Prezzo unitario echo ' - '.moneyFormat($riga->prezzo_unitario); + '.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario); if ($riga->sconto > 0) { $text = discountInfo($riga, false); @@ -195,7 +197,7 @@ foreach ($righe as $riga) { // Imponibile echo ' - '.moneyFormat($riga->totale_imponibile).' + '.moneyFormat($prezzi_ivati ? ($riga->totale_imponibile + $riga->iva) : $riga->totale_imponibile).' '; // Iva diff --git a/templates/ordini/body.php b/templates/ordini/body.php index 464d624d2..4cf30e719 100755 --- a/templates/ordini/body.php +++ b/templates/ordini/body.php @@ -19,6 +19,8 @@ include_once __DIR__.'/../../core.php'; +$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA'); + // Righe documento $righe = $documento->getRighe(); @@ -169,7 +171,7 @@ foreach ($righe as $riga) { // Prezzo unitario echo ' - '.moneyFormat($riga->prezzo_unitario); + '.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario); if ($riga->sconto > 0) { $text = discountInfo($riga, false); @@ -186,7 +188,7 @@ foreach ($righe as $riga) { // Imponibile echo ' - '.moneyFormat($riga->totale_imponibile).' + '.moneyFormat($prezzi_ivati ? $riga->totale : $riga->totale_imponibile).' '; // Iva diff --git a/templates/preventivi/body.php b/templates/preventivi/body.php index 7d06ff1b0..908777ecc 100755 --- a/templates/preventivi/body.php +++ b/templates/preventivi/body.php @@ -27,6 +27,7 @@ include_once __DIR__.'/../../core.php'; $anagrafica = Anagrafica::find($documento['idanagrafica']); $anagrafica_azienda = Anagrafica::find(setting('Azienda predefinita')); +$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA'); $pagamento = Pagamento::find($documento['idpagamento']); @@ -235,7 +236,7 @@ foreach ($righe as $riga) { // Prezzo unitario echo ' - '.moneyFormat($riga->prezzo_unitario); + '.moneyFormat($prezzi_ivati ? $riga->prezzo_unitario_ivato : $riga->prezzo_unitario); if ($riga->sconto > 0) { $text = discountInfo($riga, false); @@ -252,7 +253,7 @@ foreach ($righe as $riga) { // Imponibile echo ' - '.( $options['hide_total'] ? moneyFormat($riga->totale) : moneyFormat($riga->totale_imponibile) ).' + '.( ($options['hide_total'] || $prezzi_ivati) ? moneyFormat($riga->totale) : moneyFormat($riga->totale_imponibile) ).' '; // Iva From 37cb00a7a68561e2734eec1f1e8006e6ba59cac6 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Wed, 7 Sep 2022 17:43:21 +0200 Subject: [PATCH 08/46] Fix minore select articoli --- modules/articoli/ajax/select.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/articoli/ajax/select.php b/modules/articoli/ajax/select.php index 0e6c3b273..bd4e24b86 100755 --- a/modules/articoli/ajax/select.php +++ b/modules/articoli/ajax/select.php @@ -37,8 +37,8 @@ switch ($resource) { $idagente = $superselect['idagente']; $query = "SELECT + DISTINCT mg_articoli.id, 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, From b9d1fb4aca94bfa147e2267bc42cb7336105c443 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Wed, 7 Sep 2022 17:44:01 +0200 Subject: [PATCH 09/46] =?UTF-8?q?Fix=20set=20stato=20default=20in=20fase?= =?UTF-8?q?=20di=20creazione=20attivit=C3=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/interventi/add.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/interventi/add.php b/modules/interventi/add.php index 1383f2b1f..c7f869735 100755 --- a/modules/interventi/add.php +++ b/modules/interventi/add.php @@ -47,8 +47,8 @@ if ($user['gruppo'] == 'Tecnici' && !empty($user['idanagrafica'])) { $id_cliente = $user['idanagrafica']; } -// Stato di default associato all'attivitò -$stato = $dbo->fetchArray("SELECT * FROM in_statiintervento WHERE codice = 'WIP'"); +// Stato di default associato all'attività +$stato = $dbo->fetchOne("SELECT * FROM in_statiintervento WHERE codice = 'WIP'"); $id_stato = $stato['idstatointervento']; // Se è indicata un'anagrafica relativa, si carica il tipo di intervento di default impostato From f22794bb242f6d026860ff86ab281368130995bc Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Wed, 7 Sep 2022 17:45:12 +0200 Subject: [PATCH 10/46] Migliorie creazione conto anagrafica in piano dei conti --- modules/anagrafiche/src/Anagrafica.php | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/modules/anagrafiche/src/Anagrafica.php b/modules/anagrafiche/src/Anagrafica.php index b29d9f1c8..b7baa7d8c 100755 --- a/modules/anagrafiche/src/Anagrafica.php +++ b/modules/anagrafiche/src/Anagrafica.php @@ -370,17 +370,19 @@ class Anagrafica extends Model ->where('idpianodeiconti2', '=', $categoria_conto_id); // Verifica su un possibile conto esistente ma non collegato - $conto = (clone $table) - ->where('descrizione', 'like', '%'.$anagrafica->ragione_sociale.'%') - ->first(); - if (!empty($conto)) { - $anagrafiche_collegate = Anagrafica::where($campo, '=', $conto->id)->count(); - $conto = $anagrafiche_collegate == 0 ? $conto : null; - } + if (!empty($anagrafica->ragione_sociale)) { + $conto = (clone $table) + ->where('descrizione', 'like', '%'.$anagrafica->ragione_sociale.'%') + ->first(); + if (!empty($conto)) { + $anagrafiche_collegate = Anagrafica::where($campo, '=', $conto->id)->count(); + $conto = $anagrafiche_collegate == 0 ? $conto : null; + } - // Collegamento a conto esistente - if (!empty($conto)) { - return $conto->id; + // Collegamento a conto esistente + if (!empty($conto)) { + return $conto->id; + } } // Calcolo prossimo numero cliente @@ -394,7 +396,7 @@ class Anagrafica extends Model $id_conto = $database->table('co_pianodeiconti3') ->insertGetId([ 'numero' => $new_numero, - 'descrizione' => $anagrafica->ragione_sociale, + 'descrizione' => $anagrafica->ragione_sociale ?: 'N.D.', 'idpianodeiconti2' => $categoria_conto_id, ]); From 2484ac2d6fc756f4f4196a1acee1b4fed183ae5f Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Fri, 9 Sep 2022 12:11:28 +0200 Subject: [PATCH 11/46] Fix selezione sottocategorie in Combinazioni --- modules/combinazioni_articoli/add.php | 11 +++++++++-- modules/combinazioni_articoli/edit.php | 14 ++++++++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/modules/combinazioni_articoli/add.php b/modules/combinazioni_articoli/add.php index b2f15bcc4..16d46241f 100644 --- a/modules/combinazioni_articoli/add.php +++ b/modules/combinazioni_articoli/add.php @@ -21,7 +21,6 @@ echo '
- '.Modules::link('Categorie articoli', $record['id_categoria'], null, null, 'class="pull-right"').' {[ "type": "select", "label": "'.tr('Categoria').'", "name": "id_categoria", "required": 0, "value": "$id_categoria$", "ajax-source": "categorie", "icon-after": "add|'.Modules::get('Categorie articoli')['id'].'" ]}
@@ -44,4 +43,12 @@ echo '
-'; + + +'; diff --git a/modules/combinazioni_articoli/edit.php b/modules/combinazioni_articoli/edit.php index d14688aef..8ad600a6d 100644 --- a/modules/combinazioni_articoli/edit.php +++ b/modules/combinazioni_articoli/edit.php @@ -26,8 +26,12 @@ echo '
-
- '.Modules::link('Categorie articoli', $record['id_categoria'], null, null, 'class="pull-right"').' +
'; + if (!empty($record['id_categoria'])) { + echo ' + '.Modules::link('Categorie articoli', $record['id_categoria'], null, null, 'class="pull-right"'); + } + echo ' {[ "type": "select", "label": "'.tr('Categoria').'", "name": "id_categoria", "required": 0, "value": "$id_categoria$", "ajax-source": "categorie", "icon-after": "add|'.Modules::get('Categorie articoli')['id'].'" ]}
@@ -127,4 +131,10 @@ function generaVarianti(button) { backto: "record-edit", }); } + +$("#id_categoria").change(function() { + updateSelectOption("id_categoria", $(this).val()); + + $("#id_sottocategoria").val(null).trigger("change"); +}); '; From 56082c7920a3870268bb83b53ee2649ad72bb7af Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Fri, 9 Sep 2022 16:06:35 +0200 Subject: [PATCH 12/46] Miglioramenti import articoli CSV --- modules/articoli/src/Import/CSV.php | 46 ++++++++++++++++------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/modules/articoli/src/Import/CSV.php b/modules/articoli/src/Import/CSV.php index 7a4dddbda..202efcd2c 100644 --- a/modules/articoli/src/Import/CSV.php +++ b/modules/articoli/src/Import/CSV.php @@ -231,10 +231,12 @@ class CSV extends CSVImporter continue; } - $database->query('DELETE FROM mg_prezzi_articoli WHERE id_articolo = '.prepare($articolo->id).' AND id_anagrafica = '.prepare($anagrafica->id)); + if (!empty($record['prezzo_listino'])) { + $database->query('DELETE FROM mg_prezzi_articoli WHERE id_articolo = '.prepare($articolo->id).' AND id_anagrafica = '.prepare($anagrafica->id)); + } - if (!empty($dettagli['codice_fornitore']) && !empty($dettagli['descrizione_fornitore'])) { - $database->query('DELETE FROM mg_fornitore_articolo WHERE id_articolo = '.prepare($articolo->id).' AND id_anagrafica = '.prepare($anagrafica->id)); + if (!empty($record['codice_fornitore']) && !empty($record['descrizione_fornitore'])) { + $database->query('DELETE FROM mg_fornitore_articolo WHERE id_articolo = '.prepare($articolo->id).' AND id_fornitore = '.prepare($anagrafica->id)); } } } @@ -285,12 +287,6 @@ class CSV extends CSVImporter } } - // Individuazione dell'IVA di vendita tramite il relativo Codice - $aliquota = null; - if (!empty($record['codice_iva_vendita'])) { - $aliquota = Aliquota::where('codice', $record['codice_iva_vendita'])->first(); - } - // Individuazione articolo e generazione $articolo = null; // Ricerca sulla base della chiave primaria se presente @@ -303,7 +299,13 @@ class CSV extends CSVImporter $articolo->restore(); } - $articolo->idiva_vendita = $aliquota->id; + // Individuazione dell'IVA di vendita tramite il relativo Codice + $aliquota = null; + if (!empty($record['codice_iva_vendita'])) { + $aliquota = Aliquota::where('codice', $record['codice_iva_vendita'])->first(); + $articolo->idiva_vendita = $aliquota->id; + } + $articolo->attivo = 1; // Esportazione della quantità indicata @@ -387,12 +389,13 @@ class CSV extends CSVImporter ]); // Prezzo di vendita - $articolo->setPrezzoVendita($record['prezzo_vendita'], $aliquota->id ? $aliquota->id : setting('Iva predefinita')); + if (!empty($record['prezzo_vendita'])) { + $articolo->setPrezzoVendita($record['prezzo_vendita'], $aliquota ? $aliquota->id : setting('Iva predefinita')); + } $articolo->save(); // Movimentazione della quantità registrata - $giacenze = $articolo->getGiacenze(); $anagrafica_azienda = Anagrafica::find(setting('Azienda predefinita')); $id_sede = 0; if (!empty($nome_sede)) { @@ -403,6 +406,7 @@ class CSV extends CSVImporter } if( isset($record['qta']) ) { + $giacenze = $articolo->getGiacenze(); $qta_movimento = $qta_registrata - $giacenze[$id_sede][0]; $articolo->movimenta($qta_movimento, tr('Movimento da importazione'), new Carbon(), false, [ @@ -442,7 +446,7 @@ class CSV extends CSVImporter } // Aggiungo Listino - if (!empty($anagrafica) && !empty($dettagli['dir'])) { + if (!empty($anagrafica) && !empty($dettagli['dir']) && $dettagli['prezzo_listino']) { $dettaglio_predefinito = DettaglioPrezzo::build($articolo, $anagrafica, $dettagli['dir']); $dettaglio_predefinito->sconto_percentuale = $dettagli['sconto_listino']; $dettaglio_predefinito->setPrezzoUnitario($dettagli['prezzo_listino']); @@ -453,15 +457,15 @@ class CSV extends CSVImporter } $dettaglio_predefinito->save(); + } - // Aggiungo dettagli fornitore - if ($dettagli['dir'] == 'uscita' && !empty($dettagli['codice_fornitore']) && !empty($dettagli['descrizione_fornitore'])) { - $fornitore = DettaglioFornitore::build($anagrafica, $articolo); - $fornitore->codice_fornitore = $dettagli['codice_fornitore']; - $fornitore->barcode_fornitore = $dettagli['barcode_fornitore']; - $fornitore->descrizione = $dettagli['descrizione_fornitore']; - $fornitore->save(); - } + // Aggiungo dettagli fornitore + if (!empty($anagrafica) && $dettagli['dir'] == 'uscita' && !empty($dettagli['codice_fornitore']) && !empty($dettagli['descrizione_fornitore'])) { + $fornitore = DettaglioFornitore::build($anagrafica, $articolo); + $fornitore->codice_fornitore = $dettagli['codice_fornitore']; + $fornitore->barcode_fornitore = $dettagli['barcode_fornitore']; + $fornitore->descrizione = $dettagli['descrizione_fornitore']; + $fornitore->save(); } // Imposto fornitore e prezzo predefinito From 3eefde3920dab19c6de95aa5467907953d61f84f Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Fri, 9 Sep 2022 16:07:17 +0200 Subject: [PATCH 13/46] Fix registrazione autofattura --- plugins/importFE/actions.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/importFE/actions.php b/plugins/importFE/actions.php index 6c1811067..5fc616c0b 100755 --- a/plugins/importFE/actions.php +++ b/plugins/importFE/actions.php @@ -23,6 +23,7 @@ use Carbon\Carbon; use Modules\DDT\DDT; use Modules\Ordini\Ordine; use Modules\Fatture\Fattura; +use Modules\Fatture\Stato; use Modules\PrimaNota\Mastrino; use Modules\PrimaNota\Movimento; use Plugins\ImportFE\FatturaElettronica; @@ -145,11 +146,16 @@ switch (filter('op')) { $fattura_pa->delete(); $fattura = Fattura::find($id_fattura); $id_autofattura = post('autofattura'); + $new_stato = Stato::where('descrizione', 'Pagato')->first(); if ($fattura->isAutofattura() && !empty($id_autofattura)) { $autofattura_collegata = Fattura::find($id_autofattura); $fattura->registraScadenze(true); $autofattura_collegata->registraScadenze(true); + + $fattura->stato()->associate($new_stato); + $autofattura_collegata->stato()->associate($new_stato); + $mastrino = Mastrino::build('Compensazione autofattura', $fattura->data, false, true); $movimento1 = Movimento::build($mastrino, $fattura->anagrafica->idconto_cliente); @@ -162,6 +168,7 @@ switch (filter('op')) { $fattura->id_autofattura = $id_autofattura; $fattura->save(); + $autofattura_collegata->save(); } // Aggiorno la tipologia di anagrafica fornitore From 81bd21aed294b57b45f0a789afa6d0ce67ef1bfe Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Mon, 12 Sep 2022 15:15:22 +0200 Subject: [PATCH 14/46] Fix minore --- src/Util/Generator.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Util/Generator.php b/src/Util/Generator.php index 7a802986f..2b9f3f72c 100755 --- a/src/Util/Generator.php +++ b/src/Util/Generator.php @@ -201,9 +201,6 @@ class Generator $maschera = Generator::complete($maschera, [], $date); $maschera = str_replace('#', '%', $maschera); - //Lunghezza maschera - $mask_length = strlen($maschera); - $query = Manager::table($table)->select($field)->where($field, 'like', $maschera)->orderByRaw('LENGTH('.$field.') DESC')->orderByRaw($order); foreach ($where as $and) { From bffe51c49b4a909d425fef9fd8135493badc47ec Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Mon, 12 Sep 2022 16:34:20 +0200 Subject: [PATCH 15/46] Fix visualizzazione notifica aggiornamenti --- modules/aggiornamenti/src/UpdateHook.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/aggiornamenti/src/UpdateHook.php b/modules/aggiornamenti/src/UpdateHook.php index 9a6f8b4c5..c8df87d1e 100755 --- a/modules/aggiornamenti/src/UpdateHook.php +++ b/modules/aggiornamenti/src/UpdateHook.php @@ -43,7 +43,7 @@ class UpdateHook extends CachedManager public function response() { - $update = $this->getCache()->content; + $update = $this->getCache()->content[0]; if ($update == Update::getVersion() || empty(setting('Attiva aggiornamenti'))) { $update = null; } From 29c89262f4254b3a43bd18744f6b87b07eabedb3 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Mon, 12 Sep 2022 17:00:58 +0200 Subject: [PATCH 16/46] Fix aggiunta modelli prima nota --- modules/modelli_primanota/add.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/modelli_primanota/add.php b/modules/modelli_primanota/add.php index 719f724a2..7e96a5529 100755 --- a/modules/modelli_primanota/add.php +++ b/modules/modelli_primanota/add.php @@ -164,15 +164,18 @@ echo ' }); $(document).on("change", "select", function() { - let row = $(this).parent().parent(); + let row = $(this).parent().parent().parent(); if (row.find("input[disabled]").length > 1) { row.find("input").prop("disabled", !$(this).val()); } + + // Trigger dell\'evento keyup() per la prima volta, per eseguire i dovuti controlli nel caso siano predisposte delle righe in prima nota + $("input[id*=dare][value!=\'\'], input[id*=avere][value!=\'\']").keyup(); }); $(document).on("keyup change", "input[id*=dare]", function() { - let row = $(this).parent().parent(); + let row = $(this).parent().parent().parent(); if (!$(this).prop("disabled")) { row.find("input[id*=avere]").prop("disabled", $(this).val().toEnglish()); @@ -180,7 +183,7 @@ echo ' }); $(document).on("keyup change", "input[id*=avere]", function() { - let row = $(this).parent().parent(); + let row = $(this).parent().parent().parent(); if (!$(this).prop("disabled")) { row.find("input[id*=dare]").prop("disabled", $(this).val().toEnglish()); From 7117e977704ef2d1ef553bd74bf2ee81f7b77927 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Tue, 13 Sep 2022 11:18:53 +0200 Subject: [PATCH 17/46] Gestione ritenuta previdenziale per export FE --- modules/ritenute_contributi/actions.php | 8 +++- modules/ritenute_contributi/add.php | 10 +++++ modules/ritenute_contributi/edit.php | 10 +++++ plugins/exportFE/src/FatturaElettronica.php | 31 ++++++++++---- templates/fatture/footer.php | 45 +++++++++++++++++---- update/2_4_36.sql | 5 ++- 6 files changed, 90 insertions(+), 19 deletions(-) diff --git a/modules/ritenute_contributi/actions.php b/modules/ritenute_contributi/actions.php index f924cc6c2..90e35af52 100755 --- a/modules/ritenute_contributi/actions.php +++ b/modules/ritenute_contributi/actions.php @@ -22,12 +22,14 @@ include_once __DIR__.'/../../core.php'; switch (filter('op')) { case 'update': $descrizione = filter('descrizione'); + $tipologia = filter('tipologia'); + $causale = filter('causale'); $percentuale = filter('percentuale'); $percentuale_imponibile = filter('percentuale_imponibile'); if (isset($descrizione) && isset($percentuale) && isset($percentuale_imponibile)) { if ($dbo->fetchNum('SELECT * FROM `co_ritenuta_contributi` WHERE `descrizione`='.prepare($descrizione).' AND `id`!='.prepare($id_record)) == 0) { - $dbo->query('UPDATE `co_ritenuta_contributi` SET `descrizione`='.prepare($descrizione).', `percentuale`='.prepare($percentuale).', `percentuale_imponibile`='.prepare($percentuale_imponibile).' WHERE `id`='.prepare($id_record)); + $dbo->query('UPDATE `co_ritenuta_contributi` SET `descrizione`='.prepare($descrizione).', `tipologia`='.prepare($tipologia).', `causale`='.prepare($causale).', `percentuale`='.prepare($percentuale).', `percentuale_imponibile`='.prepare($percentuale_imponibile).' WHERE `id`='.prepare($id_record)); flash()->info(tr('Salvataggio completato!')); } else { flash()->error(tr("E' già presente una tipologia di _TYPE_ con la stessa descrizione!", [ @@ -42,12 +44,14 @@ switch (filter('op')) { case 'add': $descrizione = filter('descrizione'); + $tipologia = filter('tipologia'); + $causale = filter('causale'); $percentuale = filter('percentuale'); $percentuale_imponibile = filter('percentuale_imponibile'); if (isset($descrizione) && isset($percentuale) && isset($percentuale_imponibile)) { if ($dbo->fetchNum('SELECT * FROM `co_ritenuta_contributi` WHERE `descrizione`='.prepare($descrizione)) == 0) { - $dbo->query('INSERT INTO `co_ritenuta_contributi` (`descrizione`, `percentuale`, `percentuale_imponibile`) VALUES ('.prepare($descrizione).', '.prepare($percentuale).', '.prepare($percentuale_imponibile).')'); + $dbo->query('INSERT INTO `co_ritenuta_contributi` (`descrizione`, `tipologia`, `causale`, `percentuale`, `percentuale_imponibile`) VALUES ('.prepare($descrizione).', '.prepare($tipologia).', '.prepare($causale).', '.prepare($percentuale).', '.prepare($percentuale_imponibile).')'); $id_record = $dbo->lastInsertedID(); flash()->info(tr('Aggiunta nuova tipologia di _TYPE_', [ diff --git a/modules/ritenute_contributi/add.php b/modules/ritenute_contributi/add.php index 02f009495..a031897f2 100755 --- a/modules/ritenute_contributi/add.php +++ b/modules/ritenute_contributi/add.php @@ -29,6 +29,16 @@ include_once __DIR__.'/../../core.php';
+
+
+ {[ "type": "select", "label": "", "name": "causale", "values": "query=SELECT codice AS id, CONCAT_WS(' - ', codice, descrizione) AS descrizione FROM fe_causali_pagamento_ritenuta", "required": "1" ]} +
+ +
+ {[ "type": "select", "label": "", "name": "tipologia", "values": "query=SELECT codice AS id, CONCAT_WS(' - ', codice, descrizione) AS descrizione FROM fe_tipi_ritenuta", "required": "1" ]} +
+
+
{[ "type": "number", "label": "", "name": "percentuale", "min-value": "1", "max-value": "100","icon-after": "", "value": "100" ]} diff --git a/modules/ritenute_contributi/edit.php b/modules/ritenute_contributi/edit.php index 5b16ad821..c9da17643 100755 --- a/modules/ritenute_contributi/edit.php +++ b/modules/ritenute_contributi/edit.php @@ -46,6 +46,16 @@ if ($record['doc_associati'] > 0) {
+
+
+ {[ "type": "select", "label": "", "name": "causale", "values": "query=SELECT codice AS id, CONCAT_WS(' - ', codice, descrizione) AS descrizione FROM fe_causali_pagamento_ritenuta", "value": "$causale$", "required": "1" ]} +
+ +
+ {[ "type": "select", "label": "", "name": "tipologia", "values": "query=SELECT codice AS id, CONCAT_WS(' - ', codice, descrizione) AS descrizione FROM fe_tipi_ritenuta", "value": "$tipologia$", "required": "1" ]} +
+
+
{[ "type": "number", "label": "", "name": "percentuale", "min-value": "1", "max-value": "100", "value": "$percentuale$", "icon-after": "" ]} diff --git a/plugins/exportFE/src/FatturaElettronica.php b/plugins/exportFE/src/FatturaElettronica.php index 02ea16b8f..e2a8cc948 100755 --- a/plugins/exportFE/src/FatturaElettronica.php +++ b/plugins/exportFE/src/FatturaElettronica.php @@ -887,8 +887,12 @@ class FatturaElettronica $righe = $fattura->getRighe(); // Ritenuta d'Acconto - $id_ritenuta = null; - $totale_ritenutaacconto = 0; + $id_ritenuta_acconto = null; + $totale_ritenuta_acconto = 0; + + // Ritenuta Contributi + $id_ritenuta_contributi = $documento->id_ritenuta_contributi; + $totale_ritenuta_contributi = $documento->totale_ritenuta_contributi; // Rivalsa $id_rivalsainps = null; @@ -896,8 +900,8 @@ class FatturaElettronica foreach ($righe as $riga) { if (!empty($riga['idritenutaacconto']) and empty($riga['is_descrizione'])) { - $id_ritenuta = $riga['idritenutaacconto']; - $totale_ritenutaacconto += $riga['ritenutaacconto']; + $id_ritenuta_acconto = $riga['idritenutaacconto']; + $totale_ritenuta_acconto += $riga['ritenutaacconto']; } if (!empty($riga['idrivalsainps']) and empty($riga['is_descrizione'])) { @@ -907,17 +911,28 @@ class FatturaElettronica } } - if (!empty($id_ritenuta)) { - $percentuale = database()->fetchOne('SELECT percentuale FROM co_ritenutaacconto WHERE id = '.prepare($id_ritenuta))['percentuale']; + if (!empty($id_ritenuta_acconto)) { + $percentuale = database()->fetchOne('SELECT percentuale FROM co_ritenutaacconto WHERE id = '.prepare($id_ritenuta_acconto))['percentuale']; // Con la nuova versione in vigore dal 01/01/2021, questo nodo diventa ripetibile. - $result['DatiRitenuta'] = [ + $result[]['DatiRitenuta'] = [ 'TipoRitenuta' => ($azienda['piva'] != $azienda['codice_fiscale'] & $azienda['tipo'] != 'Ente pubblico') ? 'RT01' : 'RT02', - 'ImportoRitenuta' => $totale_ritenutaacconto, + 'ImportoRitenuta' => $totale_ritenuta_acconto, 'AliquotaRitenuta' => $percentuale, 'CausalePagamento' => setting("Causale ritenuta d'acconto"), ]; } + if (!empty($id_ritenuta_contributi)) { + $ritenuta_contributi = database()->fetchOne('SELECT * FROM co_ritenuta_contributi WHERE id = '.prepare($id_ritenuta_contributi)); + // Con la nuova versione in vigore dal 01/01/2021, questo nodo diventa ripetibile. + $result[]['DatiRitenuta'] = [ + 'TipoRitenuta' => $ritenuta_contributi['tipologia'], + 'ImportoRitenuta' => $totale_ritenuta_contributi, + 'AliquotaRitenuta' => $ritenuta_contributi['percentuale'], + 'CausalePagamento' => $ritenuta_contributi['causale'], + ]; + } + // Bollo (2.1.1.6) // ImportoBollo --> con la nuova versione in vigore dal 01/01/2021, la compilazione di questo nodo è diventata facoltativa. // considerato che l'importo è noto e può essere solo di 2,00 Euro. diff --git a/templates/fatture/footer.php b/templates/fatture/footer.php index 4c65625fe..2bafb20fd 100755 --- a/templates/fatture/footer.php +++ b/templates/fatture/footer.php @@ -38,7 +38,7 @@ $peso_lordo = $documento->peso ?: $documento->peso_calcolato; $width = round(100 / ($show_sconto ? 5 : 3), 2); $has_rivalsa = !empty($record['rivalsainps']); -$has_ritenuta = !empty($record['ritenutaacconto']) || !empty($documento->totale_ritenuta_contributi) || !empty($record['spit_payment']); +$has_ritenuta = !empty($record['ritenutaacconto']) || !empty($documento->totale_ritenuta_contributi) || !empty($record['split_payment']); $has_split_payment = !empty($record['split_payment']); $has_sconto_finale = !empty($sconto_finale); @@ -267,22 +267,41 @@ if ($has_ritenuta) { --$second_colspan; } - $contributi = (!empty($record['ritenutaacconto']) ? ' - ' : '').tr('contributi: _PRC_%', [ + $contributi = tr('_DESCRIZIONE_: _PRC_%', [ + '_DESCRIZIONE_' => $documento->ritenutaContributi->descrizione, '_PRC_' => Translator::numberToLocale($documento->ritenutaContributi->percentuale, 2), ]); + $ritenuta_contributi_totale = abs($documento->totale_ritenuta_contributi); $acconto = tr('acconto: _PRC_%', [ '_PRC_' => Translator::numberToLocale($rs2[0]['percentuale'], 2), ]); - $ritenuta_totale = abs($documento->ritenuta_acconto) + abs($documento->totale_ritenuta_contributi); + $ritenuta_acconto_totale = abs($documento->ritenuta_acconto); + if (!empty($ritenuta_acconto_totale) && !empty($ritenuta_contributi_totale)) { + --$first_colspan; + } + + echo ' - + '; + if (!empty($ritenuta_acconto_totale)) { + echo ' - '.tr('Ritenuta (_ACCONTO__CONTRIBUTI_)', [ + '.tr('Ritenuta _ACCONTO_', [ + '_ACCONTO_' => $acconto, + ], ['upper' => true]).' + '; + } + + if (!empty($ritenuta_contributi_totale)) { + echo ' + + '.tr('_CONTRIBUTI_', [ '_ACCONTO_' => $acconto, '_CONTRIBUTI_' => empty($documento->ritenutaContributi) ? null : $contributi, ], ['upper' => true]).' '; + } echo ' @@ -292,12 +311,22 @@ if ($has_ritenuta) { echo ' - + '; + if (!empty($ritenuta_acconto_totale)) { + echo ' - '.moneyFormat($ritenuta_totale, 2).' + '.moneyFormat($ritenuta_acconto_totale, 2).' '; + } - $totale = $totale - $ritenuta_totale; + if (!empty($ritenuta_contributi_totale)) { + echo ' + + '.moneyFormat($ritenuta_contributi_totale, 2).' + '; + } + + $totale = $totale - ($ritenuta_acconto_totale + $ritenuta_contributi_totale); echo ' diff --git a/update/2_4_36.sql b/update/2_4_36.sql index dec7c1030..7c18e7c57 100644 --- a/update/2_4_36.sql +++ b/update/2_4_36.sql @@ -18,4 +18,7 @@ INSERT INTO `co_tipi_scadenze` (`id`, `nome`, `descrizione`, `ctgypurp`, `can_de UPDATE `zz_views` SET `query` = 'an_anagrafiche.ragione_sociale' WHERE `zz_views`.`name` = 'Anagrafica' AND `id_module`=(SELECT `id` FROM `zz_modules` WHERE `name`='Scadenzario'); -UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `co_scadenziario`\nLEFT JOIN `co_documenti` ON `co_scadenziario`.`iddocumento` = `co_documenti`.`id`\nLEFT JOIN `an_anagrafiche` ON `co_scadenziario`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\nLEFT JOIN `co_pagamenti` ON `co_documenti`.`idpagamento` = `co_pagamenti`.`id`\nLEFT JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id`\nLEFT JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id`\nLEFT JOIN (\n SELECT `zz_operations`.`id_email`, `zz_operations`.`id_record`\n FROM `zz_operations`\n INNER JOIN `em_emails` ON `zz_operations`.`id_email` = `em_emails`.`id`\n INNER JOIN `em_templates` ON `em_emails`.`id_template` = `em_templates`.`id`\n INNER JOIN `zz_modules` ON `zz_operations`.`id_module` = `zz_modules`.`id`\n WHERE `zz_modules`.`name` = \'Scadenzario\' AND `zz_operations`.`op` = \'send-email\'\n GROUP BY `zz_operations`.`id_record`\n ) AS `email` ON `email`.`id_record` = `co_scadenziario`.`id`\nWHERE 1=1 AND\n(`co_statidocumento`.`descrizione` IS NULL OR `co_statidocumento`.`descrizione` IN(\'Emessa\',\'Parzialmente pagato\',\'Pagato\'))\nHAVING 2=2\nORDER BY `scadenza` ASC' WHERE `zz_modules`.`name` = 'Scadenzario'; \ No newline at end of file +UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `co_scadenziario`\nLEFT JOIN `co_documenti` ON `co_scadenziario`.`iddocumento` = `co_documenti`.`id`\nLEFT JOIN `an_anagrafiche` ON `co_scadenziario`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\nLEFT JOIN `co_pagamenti` ON `co_documenti`.`idpagamento` = `co_pagamenti`.`id`\nLEFT JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id`\nLEFT JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id`\nLEFT JOIN (\n SELECT `zz_operations`.`id_email`, `zz_operations`.`id_record`\n FROM `zz_operations`\n INNER JOIN `em_emails` ON `zz_operations`.`id_email` = `em_emails`.`id`\n INNER JOIN `em_templates` ON `em_emails`.`id_template` = `em_templates`.`id`\n INNER JOIN `zz_modules` ON `zz_operations`.`id_module` = `zz_modules`.`id`\n WHERE `zz_modules`.`name` = \'Scadenzario\' AND `zz_operations`.`op` = \'send-email\'\n GROUP BY `zz_operations`.`id_record`\n ) AS `email` ON `email`.`id_record` = `co_scadenziario`.`id`\nWHERE 1=1 AND\n(`co_statidocumento`.`descrizione` IS NULL OR `co_statidocumento`.`descrizione` IN(\'Emessa\',\'Parzialmente pagato\',\'Pagato\'))\nHAVING 2=2\nORDER BY `scadenza` ASC' WHERE `zz_modules`.`name` = 'Scadenzario'; + +-- Aggiunta causale e tipologia in ritenute contributi +ALTER TABLE `co_ritenuta_contributi` ADD `id_tipo` VARCHAR(100) NOT NULL AFTER `descrizione`, ADD `causale` VARCHAR(100) NOT NULL AFTER `tipologia`; \ No newline at end of file From 03398d37f35b2c6b7f0dbd3cc409989550679230 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Tue, 13 Sep 2022 15:37:11 +0200 Subject: [PATCH 18/46] Eliminazione definitiva delle aliquote iva non utilizzate --- update/2_4_36.php | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/update/2_4_36.php b/update/2_4_36.php index c7f48c82c..0d56bfdf7 100644 --- a/update/2_4_36.php +++ b/update/2_4_36.php @@ -1,6 +1,9 @@ $value) { delete($files); +// Set dell'anagrafica a tutte le scadenze $scadenze = $dbo->fetchArray('SELECT * FROM co_scadenziario'); - foreach ($scadenze as $scadenza) { $idanagrafica = $dbo->selectOne('co_documenti', 'idanagrafica', ['id' => $scadenza['iddocumento']])['idanagrafica']; $dbo->update('co_scadenziario', [ @@ -20,4 +23,33 @@ foreach ($scadenze as $scadenza) { ], ['id' => $scadenza['id']]); } +// Eliminazione definitiva delle aliquote iva già eliminate, non utilizzate in nessuna tabella +$aliquote_eliminate = $dbo->fetchArray('SELECT * FROM co_iva WHERE deleted_at IS NOT NULL'); +foreach ($aliquote_eliminate as $aliquota) { + $elimina_iva = true; + if(!empty($dbo->select('mg_articoli', 'id', ['idiva_vendita' => $aliquota['id']]))) { + $elimina_iva = false; + } elseif (!empty($dbo->select('an_anagrafiche', 'idanagrafica', ['idiva_vendite' => $aliquota['id']]))) { + $elimina_iva = false; + } elseif (!empty($dbo->select('an_anagrafiche', 'idanagrafica', ['idiva_acquisti' => $aliquota['id']]))) { + $elimina_iva = false; + } elseif (!empty($dbo->select('co_righe_contratti', 'id', ['idiva' => $aliquota['id']]))) { + $elimina_iva = false; + } elseif (!empty($dbo->select('dt_righe_ddt', 'id', ['idiva' => $aliquota['id']]))) { + $elimina_iva = false; + } elseif (!empty($dbo->select('co_righe_documenti', 'id', ['idiva' => $aliquota['id']]))) { + $elimina_iva = false; + } elseif (!empty($dbo->select('in_righe_interventi', 'id', ['idiva' => $aliquota['id']]))) { + $elimina_iva = false; + } elseif (!empty($dbo->select('co_righe_preventivi', 'id', ['idiva' => $aliquota['id']]))) { + $elimina_iva = false; + } elseif (!empty($dbo->select('or_righe_ordini', 'id', ['idiva' => $aliquota['id']]))) { + $elimina_iva = false; + } + + if ($elimina_iva) { + $dbo->query('DELETE FROM co_iva WHERE id='.prepare($aliquota['id'])); + } +} + ?> \ No newline at end of file From 90682d16eb99d3b2acb63167f22e5f6fd3ee5b87 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Tue, 13 Sep 2022 17:27:01 +0200 Subject: [PATCH 19/46] Fix movimentazione articoli tra Ddt --- modules/ddt/actions.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/ddt/actions.php b/modules/ddt/actions.php index 8a5d7689b..b988fe9f5 100755 --- a/modules/ddt/actions.php +++ b/modules/ddt/actions.php @@ -351,12 +351,17 @@ switch (filter('op')) { $ddt->save(); + $evadi_qta_parent = true; + if ($documento->tipo->descrizione=='Ddt in uscita' || $documento->tipo->descrizione=='Ddt in entrata') { + $evadi_qta_parent = false; + } + $righe = $documento->getRighe(); foreach ($righe as $riga) { if (post('evadere')[$riga->id] == 'on' and !empty(post('qta_da_evadere')[$riga->id])) { $qta = post('qta_da_evadere')[$riga->id]; - $copia = $riga->copiaIn($ddt, $qta); + $copia = $riga->copiaIn($ddt, $qta, $evadi_qta_parent); // Aggiornamento seriali dalla riga dell'ordine if ($copia->isArticolo()) { From 8254ade2a13c3f017402eb9d4231444e97bcef05 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Tue, 13 Sep 2022 17:28:03 +0200 Subject: [PATCH 20/46] Gestione replace conto anagrafica per modelli prima nota --- modules/anagrafiche/variables.php | 15 ++++++++++++++- modules/fatture/variables.php | 13 ------------- modules/partitario/ajax/select.php | 4 ++-- modules/primanota/add.php | 16 ++++++++++------ 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/modules/anagrafiche/variables.php b/modules/anagrafiche/variables.php index 5d1f3ce1e..e4b85b282 100755 --- a/modules/anagrafiche/variables.php +++ b/modules/anagrafiche/variables.php @@ -21,9 +21,22 @@ use Modules\Anagrafiche\Anagrafica; $anagrafica = Anagrafica::find($id_record); +//cliente +if ($anagrafica->idconto_cliente != '') { + $conto = $anagrafica->idconto_cliente; + $conto_descrizione = $dbo->fetchOne('SELECT CONCAT ((SELECT numero FROM co_pianodeiconti2 WHERE id=co_pianodeiconti3.idpianodeiconti2), ".", numero, " ", descrizione) AS descrizione FROM co_pianodeiconti3 WHERE id='.prepare($conto))['descrizione']; +} +//Fornitore +elseif ($anagrafica->idconto_fornitore != '') { + $conto = $anagrafica->idconto_fornitore; + $conto_descrizione = $dbo->fetchOne('SELECT CONCAT ((SELECT numero FROM co_pianodeiconti2 WHERE id=co_pianodeiconti3.idpianodeiconti2), ".", numero, " ", descrizione) AS descrizione FROM co_pianodeiconti3 WHERE id='.prepare($conto))['descrizione']; +} + // Variabili da sostituire return [ 'ragione_sociale' => $anagrafica->ragione_sociale, 'codice' => $anagrafica->codice, 'id_anagrafica' => $anagrafica->idanagrafica, -]; + 'conto' => $conto, + 'conto_descrizione' => $conto_descrizione, +]; \ No newline at end of file diff --git a/modules/fatture/variables.php b/modules/fatture/variables.php index e79cbe368..c7a350d8e 100755 --- a/modules/fatture/variables.php +++ b/modules/fatture/variables.php @@ -38,17 +38,6 @@ if (!empty(setting('Logo stampe'))) { $logo_azienda = str_replace('\\', '/', $logo_azienda); } -//cliente -if ($r['idconto_cliente'] != '') { - $conto = $r['idconto_cliente']; - $conto_descrizione = $dbo->fetchOne('SELECT CONCAT ((SELECT numero FROM co_pianodeiconti2 WHERE id=co_pianodeiconti3.idpianodeiconti2), ".", numero, " ", descrizione) AS descrizione FROM co_pianodeiconti3 WHERE id='.prepare($conto))['descrizione']; -} -//Fornitore -elseif ($r['idconto_fornitore'] != '') { - $conto = $r['idconto_fornitore']; - $conto_descrizione = $dbo->fetchOne('SELECT CONCAT ((SELECT numero FROM co_pianodeiconti2 WHERE id=co_pianodeiconti3.idpianodeiconti2), ".", numero, " ", descrizione) AS descrizione FROM co_pianodeiconti3 WHERE id='.prepare($conto))['descrizione']; -} - $r_user = $dbo->fetchOne('SELECT * FROM an_anagrafiche WHERE idanagrafica='.prepare(Auth::user()['idanagrafica'])); $r_company = $dbo->fetchOne('SELECT * FROM an_anagrafiche WHERE idanagrafica='.prepare(setting('Azienda predefinita'))); @@ -62,8 +51,6 @@ return [ 'note' => $r['note'], 'data' => Translator::dateToLocale($r['data']), 'logo_azienda' => !empty($logo_azienda) ? '' : '', - 'conto' => $conto, - 'conto_descrizione' => $conto_descrizione, 'nome_utente' => $r_user['ragione_sociale'], 'telefono_utente' => $r_user['cellulare'], 'sito_web' => $r_company['sitoweb'], diff --git a/modules/partitario/ajax/select.php b/modules/partitario/ajax/select.php index 94a1cd456..2abd5d00d 100755 --- a/modules/partitario/ajax/select.php +++ b/modules/partitario/ajax/select.php @@ -147,8 +147,8 @@ switch ($resource) { $results[count($results) - 1]['children'][] = ['id' => $r2['id'], 'text' => $r['numero'].'.'.$r2['numero'].' '.$r2['descrizione']]; } - $results[] = ['text' => 'Conto cliente/fornitore fattura', 'children' => []]; - $results[count($results) - 1]['children'][] = ['id' => '-1', 'text' => '{Conto cliente/fornitore fattura}']; + $results[] = ['text' => 'Conto cliente/fornitore', 'children' => []]; + $results[count($results) - 1]['children'][] = ['id' => '-1', 'text' => '{Conto cliente/fornitore}']; } break; diff --git a/modules/primanota/add.php b/modules/primanota/add.php index 3071b1da6..310b26826 100755 --- a/modules/primanota/add.php +++ b/modules/primanota/add.php @@ -260,8 +260,12 @@ if (!empty($id_records) && get('origine') == 'fatture' && !empty($counter)) { } if (!empty(get('id_anagrafica'))) { $id_anagrafica = get('id_anagrafica'); -} else { - $id_anagrafica = $dbo->fetchOne('SELECT idanagrafica FROM co_documenti WHERE id IN('.(get('id_documenti') ?: '0').')')['idanagrafica']; +} +if (empty($id_anagrafica)) { + $id_anagrafica = $dbo->fetchOne('SELECT idanagrafica FROM co_documenti WHERE id IN('.($id_documenti ? implode(',',$id_documenti) : 0).')')['idanagrafica']; +} +if (empty($id_anagrafica)) { + $id_anagrafica = $dbo->fetchOne('SELECT idanagrafica FROM co_scadenziario WHERE id IN('.($id_scadenze ? implode(',',$id_scadenze) : 0).')')['idanagrafica']; } echo '
@@ -358,7 +362,7 @@ $("#modals > div #add-form").on("submit", function(e) { '; if ($permetti_modelli) { - $variables = Modules::get('Fatture di vendita')->getPlaceholders($id_documenti[0]); + $variables = Modules::get('Anagrafiche')->getPlaceholders($id_anagrafica); echo ' '; diff --git a/modules/interventi/modals/manage_sessione.php b/modules/interventi/modals/manage_sessione.php index 8a48ffc08..abcac25d9 100644 --- a/modules/interventi/modals/manage_sessione.php +++ b/modules/interventi/modals/manage_sessione.php @@ -123,8 +123,15 @@ echo ' $(document).ready(function () { // Quando modifico orario inizio, allineo anche l\'orario fine $("#orario_inizio").on("dp.change", function (e) { - $("#orario_fine").data("DateTimePicker").minDate(e.date); - $("#orario_fine").change(); + if($("#orario_fine").data("DateTimePicker").date() < e.date){ + $("#orario_fine").data("DateTimePicker").date(e.date); + } + }); + + $("#orario_fine").on("dp.change", function (e) { + if($("#orario_inizio").data("DateTimePicker").date() > e.date){ + $("#orario_inizio").data("DateTimePicker").date(e.date); + } }); $("#idtipointerventot").change(function() { From b02ef3f2f3c2a0b58a4028e4afe41d0fe0b9438e Mon Sep 17 00:00:00 2001 From: Pek5892 Date: Thu, 15 Sep 2022 17:53:16 +0200 Subject: [PATCH 27/46] Aggiornamento CHANGELOG --- CHANGELOG.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70c2e99b2..504894d0f 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Tutti i maggiori cambiamenti di questo progetto saranno documentati in questo fi Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://keepachangelog.com/), e il progetto segue il [Semantic Versioning](http://semver.org/) per definire le versioni delle release. +- [2.4.36 (2022-09-16)](#2436-2022-09-16) - [2.4.35 (2022-08-12)](#2435-2022-08-12) - [2.4.34 (2022-07-15)](#2434-2022-07-15) - [2.4.33 (2022-05-17)](#2433-2022-05-17) @@ -46,6 +47,38 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k - [2.2 (2016-11-10)](#22-2016-11-10) - [2.1 (2015-04-02)](#21-2015-04-02) + + +## 2.4.36 (2022-09-16) + +### Aggiunto (Added) +- Aggiunta selezione modulo iniziale per gruppo utenti +- Aggiunta validazione matricola in impianti +- Aggiunta anagrafica nelle scadenze +- Aggiunta prezzi ivati nella stampa documenti +### Modificato (Changed) +- Miglioria barra dei menu in modalità compatta +- Rimozione file deprecato controller_after.php +- Miglioria creazione conto anagrafica in piano dei conti +- Miglioria importazione articoli in CSV +- Rimozione delle aliquote IVA non utilizzate +- Miglioria riepilogo totali in stampa intervento +- Miglioria gestione ritenuta previdenziale +### Fixed +- Correzione controllo dei totali in fattura elettronica +- Correzione eliminazione attività collegate ai documenti +- Correzione numerazione progressiva +- Correzione creazione autofattura da nota di credito +- Correzione creazione intervento da ordine fornitore +- Correzione calcolo cassa previdenziale in importazione di fatture elettroniche +- Correzione stato di default in creazione attività +- Correzione selezione sottocategorie in Combinazioni +- Correzione registrazione autofattura +- Correzione aggiunta modelli prima nota +- Correzione movimentazione articoli tra DDT +- Correzione emissione fatture non fiscali da azioni di gruppo +- Correzione regime fiscale per fatture conto terzi +- Correzione date di inizio e fine attività ## 2.4.35 (2022-08-12) ### Aggiunto (Added) From 9a25b5b2d1c13954d3fb17140c053c1fc14a5c7d Mon Sep 17 00:00:00 2001 From: loviuz Date: Fri, 16 Sep 2022 11:20:33 +0200 Subject: [PATCH 28/46] Fix per velocizzazione apertura ddt --- modules/ddt/actions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ddt/actions.php b/modules/ddt/actions.php index b988fe9f5..42f80dcfa 100755 --- a/modules/ddt/actions.php +++ b/modules/ddt/actions.php @@ -560,7 +560,7 @@ switch (filter('op')) { // Aggiornamento stato degli ordini presenti in questa fattura in base alle quantità totali evase if (!empty($id_record) && setting('Cambia automaticamente stato ordini fatturati')) { - $rs = $dbo->fetchArray('SELECT idordine FROM dt_righe_ddt WHERE idddt='.prepare($id_record)); + $rs = $dbo->fetchArray('SELECT idordine FROM dt_righe_ddt WHERE idddt='.prepare($id_record).' AND idordine!=0'); for ($i = 0; $i < sizeof($rs); ++$i) { $dbo->query('UPDATE or_ordini SET idstatoordine=(SELECT id FROM or_statiordine WHERE descrizione="'.get_stato_ordine($rs[$i]['idordine']).'") WHERE id = '.prepare($rs[$i]['idordine'])); From 1aa836d638e660c691f5533b090b6fa1a3f61741 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Fri, 16 Sep 2022 11:49:15 +0200 Subject: [PATCH 29/46] Rimozione visualizzazione azioni di gruppo nei plugin --- include/manager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/manager.php b/include/manager.php index 2118d528d..0995a0d05 100755 --- a/include/manager.php +++ b/include/manager.php @@ -176,7 +176,7 @@ if (!empty($type) && $type != 'menu' && $type != 'custom') { '; + +echo '
'; -} // Requisiti echo ' From d45a5c30d1abd386acdc4c4125bd2f879b3968eb Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Tue, 27 Sep 2022 10:50:20 +0200 Subject: [PATCH 39/46] Fix visualizzazione immagini in stampa Preventivo --- templates/preventivi/body.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/preventivi/body.php b/templates/preventivi/body.php index 908777ecc..2ad6bf6de 100755 --- a/templates/preventivi/body.php +++ b/templates/preventivi/body.php @@ -198,7 +198,7 @@ foreach ($righe as $riga) { if ($riga->isArticolo() && !empty($riga->articolo->image)) { echo ' - articolo->image.'" style="max-height: 60px; max-width:80px"> + '; $autofill->set(5); From 97db20670055b6fae2d0940f6506bafbd8066722 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Wed, 28 Sep 2022 12:43:37 +0200 Subject: [PATCH 40/46] Fix ricerca riferimenti automatici --- plugins/importFE/actions.php | 84 +++++++++++++++++++++++------------- 1 file changed, 55 insertions(+), 29 deletions(-) diff --git a/plugins/importFE/actions.php b/plugins/importFE/actions.php index 5fc616c0b..6b1250f14 100755 --- a/plugins/importFE/actions.php +++ b/plugins/importFE/actions.php @@ -312,39 +312,65 @@ switch (filter('op')) { $replaces = ['n ','N ','n. ','N. ','nr ','NR ','nr. ','NR. ','num ','NUM ','num. ','NUM. ','numero ','NUMERO ']; - // Riorganizzazione dati ordini per numero di riga - $dati_ordini = []; - foreach ($DatiOrdini as $dato) { - foreach ($dato['RiferimentoNumeroLinea'] as $dati => $linea) { - foreach ($replaces as $replace) { - if(string_starts_with($dato['IdDocumento'], $replace)) { - $dato['IdDocumento'] = str_replace($replace, '', $dato['IdDocumento']); - break; + // Riorganizzazione dati ordini per numero di riga + $dati_ordini = []; + foreach ($DatiOrdini as $dato) { + if (is_array($dato['RiferimentoNumeroLinea'])) { + foreach ($dato['RiferimentoNumeroLinea'] as $dati => $linea) { + foreach ($replaces as $replace) { + if(string_starts_with($dato['IdDocumento'], $replace)) { + $dato['IdDocumento'] = str_replace($replace, '', $dato['IdDocumento']); + break; + } + } + $dati_ordini[(int)$linea] = [ + 'numero' => $dato['IdDocumento'], + 'anno' => ( new Carbon($dato['Data']) )->format('Y'), + ]; + } + } else { + foreach ($replaces as $replace) { + if(string_starts_with($dato['IdDocumento'], $replace)) { + $dato['IdDocumento'] = str_replace($replace, '', $dato['IdDocumento']); + break; + } + } + $dati_ordini[(int)$dato['RiferimentoNumeroLinea']] = [ + 'numero' => $dato['IdDocumento'], + 'anno' => ( new Carbon($dato['Data']) )->format('Y'), + ]; } } - $dati_ordini[(int)$linea] = [ - 'numero' => $dato['IdDocumento'], - 'anno' => ( new Carbon($dato['Data']) )->format('Y'), - ]; - } - } - - // Riorganizzazione dati ordini per numero di riga - $dati_ddt = []; - foreach ($DatiDDT as $dato) { - foreach ($dato['RiferimentoNumeroLinea'] as $dati => $linea) { - foreach ($replaces as $replace) { - if(string_starts_with($dato['NumeroDDT'], $replace)) { - $dato['NumeroDDT'] = str_replace($replace, '', $dato['NumeroDDT']); - break; + + // Riorganizzazione dati ordini per numero di riga + $dati_ddt = []; + foreach ($DatiDDT as $dato) { + if (is_array($dato['RiferimentoNumeroLinea'])) { + foreach ($dato['RiferimentoNumeroLinea'] as $dati => $linea) { + foreach ($replaces as $replace) { + if(string_starts_with($dato['NumeroDDT'], $replace)) { + $dato['NumeroDDT'] = str_replace($replace, '', $dato['NumeroDDT']); + break; + } + } + $dati_ddt[(int)$linea] = [ + 'numero' => $dato['NumeroDDT'], + 'anno' => ( new Carbon($dato['DataDDT']) )->format('Y'), + ]; + } + } else { + foreach ($replaces as $replace) { + if(string_starts_with($dato['NumeroDDT'], $replace)) { + $dato['NumeroDDT'] = str_replace($replace, '', $dato['NumeroDDT']); + break; + } + } + $dati_ddt[(int)$dato['RiferimentoNumeroLinea']] = [ + 'numero' => $dato['NumeroDDT'], + 'anno' => ( new Carbon($dato['DataDDT']) )->format('Y'), + ]; } } - $dati_ddt[(int)$linea] = [ - 'numero' => $dato['NumeroDDT'], - 'anno' => ( new Carbon($dato['DataDDT']) )->format('Y'), - ]; - } - } // Iterazione sulle singole righe $righe = $fattura_pa->getRighe(); From 8d65381243678284575e44c7634ae1e8042fc892 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Wed, 28 Sep 2022 15:27:27 +0200 Subject: [PATCH 41/46] Fix set data del nodo DatiOrdine in fase di export FE --- plugins/exportFE/src/FatturaElettronica.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/exportFE/src/FatturaElettronica.php b/plugins/exportFE/src/FatturaElettronica.php index 5939b9125..db8e21c07 100755 --- a/plugins/exportFE/src/FatturaElettronica.php +++ b/plugins/exportFE/src/FatturaElettronica.php @@ -164,7 +164,7 @@ class FatturaElettronica $documento = $this->getDocumento(); $database = database(); - $ordini = $database->fetchArray('SELECT `or_ordini`.`numero_cliente` AS id_documento, `or_ordini`.`num_item`, `or_ordini`.`codice_cig`, `or_ordini`.`codice_cup`, `or_ordini`.`codice_commessa`, `or_ordini`.`data_cliente`, `co_righe_documenti`.`order` AS riferimento_linea FROM `or_ordini` INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`idordine` = `or_ordini`.`id` WHERE `co_righe_documenti`.`iddocumento` = '.prepare($documento['id'])); + $ordini = $database->fetchArray('SELECT `or_ordini`.`numero_cliente` AS id_documento, `or_ordini`.`num_item`, `or_ordini`.`codice_cig`, `or_ordini`.`codice_cup`, `or_ordini`.`codice_commessa`, `or_ordini`.`data_cliente` AS `data`, `co_righe_documenti`.`order` AS riferimento_linea FROM `or_ordini` INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`idordine` = `or_ordini`.`id` WHERE `co_righe_documenti`.`iddocumento` = '.prepare($documento['id'])); $dati_aggiuntivi = $documento->dati_aggiuntivi_fe; $dati = $dati_aggiuntivi['dati_ordine'] ?: []; From c729ced731bcf8634c4e879094e463dc136a96c7 Mon Sep 17 00:00:00 2001 From: Luca Date: Thu, 29 Sep 2022 10:19:08 +0200 Subject: [PATCH 42/46] Fix caratteri rimossi dal body per invio newsletter dalle schede --- actions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions.php b/actions.php index d8777dcf6..580c3aa1c 100755 --- a/actions.php +++ b/actions.php @@ -324,7 +324,7 @@ elseif (post('op') == 'send-email') { // Contenuti $mail->subject = post('subject'); - $mail->content = post('body'); + $mail->content = $_POST['body']; // post('body', true); // Conferma di lettura $mail->read_notify = post('read_notify'); From d202d9f3df260bb9307b848c71242ce4c00ae3db Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Thu, 29 Sep 2022 15:22:24 +0200 Subject: [PATCH 43/46] =?UTF-8?q?Aggiunto=20flag=20impianti=20in=20fase=20?= =?UTF-8?q?di=20duplicazione=20attivit=C3=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/interventi/actions.php | 20 +++++++++++++++++++ modules/interventi/bulk.php | 23 +++++++++++++++++++++- modules/interventi/modals/duplicazione.php | 12 +++++++---- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index 811b3ac95..ff74a59eb 100644 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -802,6 +802,7 @@ switch (post('op')) { $data_richiesta = post('data_richiesta'); $copia_sessioni = post('copia_sessioni'); $copia_righe = post('copia_righe'); + $copia_impianti = post('copia_impianti'); $new = $intervento->replicate(); $new->idstatointervento = $id_stato; @@ -862,6 +863,25 @@ switch (post('op')) { } } + // Copia delle sessioni + if (!empty($copia_impianti)) { + $impianti = $dbo->select('my_impianti_interventi', '*', ['idintervento' => $intervento->id]); + foreach ($impianti as $impianto) { + $dbo->insert('my_impianti_interventi', [ + 'idintervento' => $id_record, + 'idimpianto' => $impianto['idimpianto'] + ]); + } + + $componenti = $dbo->select('my_componenti_interventi', '*', ['id_intervento' => $intervento->id]); + foreach ($componenti as $componente) { + $dbo->insert('my_componenti_interventi', [ + 'id_intervento' => $id_record, + 'id_componente' => $componente['id_componente'] + ]); + } + } + flash()->info(tr('Attività duplicata correttamente!')); break; diff --git a/modules/interventi/bulk.php b/modules/interventi/bulk.php index 6caf07786..244a9a89c 100755 --- a/modules/interventi/bulk.php +++ b/modules/interventi/bulk.php @@ -172,6 +172,7 @@ switch (post('op')) { $data_richiesta = post('data_richiesta'); $copia_sessioni = post('sessioni'); $copia_righe = post('righe'); + $copia_impianti = post('impianti'); foreach ($id_records as $idintervento) { $intervento = Intervento::find($idintervento); @@ -227,6 +228,25 @@ switch (post('op')) { } } + // Copia degli impianti + if (!empty($copia_impianti)) { + $impianti = $dbo->select('my_impianti_interventi', '*', ['idintervento' => $intervento->id]); + foreach ($impianti as $impianto) { + $dbo->insert('my_impianti_interventi', [ + 'idintervento' => $id_record, + 'idimpianto' => $impianto['idimpianto'] + ]); + } + + $componenti = $dbo->select('my_componenti_interventi', '*', ['id_intervento' => $intervento->id]); + foreach ($componenti as $componente) { + $dbo->insert('my_componenti_interventi', [ + 'id_intervento' => $id_record, + 'id_componente' => $componente['id_componente'] + ]); + } + } + flash()->info(tr('Attività duplicate correttamente!')); break; @@ -303,7 +323,8 @@ if (App::debug()) { 'msg' => '
{[ "type": "timestamp", "label": "'.tr('Data/ora richiesta').'", "name": "data_richiesta", "required": 0, "value": "-now-", "required":1 ]}
{[ "type": "select", "label": "'.tr('Stato').'", "name": "idstatointervento", "required": 1, "values": "query=SELECT idstatointervento AS id, descrizione, colore AS _bgcolor_ FROM in_statiintervento WHERE deleted_at IS NULL ORDER BY descrizione", "value": "" ]}
{[ "type":"checkbox", "label":"'.tr('Duplica righe').'", "name":"righe", "value":"" ]} -
{[ "type":"checkbox", "label":"'.tr('Duplica sessioni').'", "name":"sessioni", "value":"" ]}', +
{[ "type":"checkbox", "label":"'.tr('Duplica sessioni').'", "name":"sessioni", "value":"" ]} +
{[ "type":"checkbox", "label":"'.tr('Duplica impianti').'", "name":"impianti", "value":"" ]}', 'button' => tr('Procedi'), 'class' => 'btn btn-lg btn-warning', 'blank' => false, diff --git a/modules/interventi/modals/duplicazione.php b/modules/interventi/modals/duplicazione.php index 002ae8a45..4f40f0121 100644 --- a/modules/interventi/modals/duplicazione.php +++ b/modules/interventi/modals/duplicazione.php @@ -39,12 +39,16 @@ echo ' {[ "type": "select", "label": "'.tr('Stato').'", "name": "id_stato", "required": 1, "values": "query=SELECT idstatointervento AS id, descrizione, colore AS _bgcolor_ FROM in_statiintervento WHERE deleted_at IS NULL ORDER BY descrizione", "value": "" ]}
-
- {["type": "checkbox", "label": "'.tr('Duplica righe').'", "name": "copia_righe", "help": "'.tr('Selezione per riportare anche le righe nella nuova attività').'", "value": 1 ]} +
+ {["type": "checkbox", "label": "'.tr('Duplica righe').'", "name": "copia_righe", "help": "'.tr('Selezione per riportare anche le righe nella nuova attività').'" ]}
-
- {["type": "checkbox", "label": "'.tr('Duplica sessioni').'", "name": "copia_sessioni", "help": "'.tr('Selezione per riportare anche le sessioni di lavoro nella nuova attività').'", "value": 1 ]} +
+ {["type": "checkbox", "label": "'.tr('Duplica sessioni').'", "name": "copia_sessioni", "help": "'.tr('Selezione per riportare anche le sessioni di lavoro nella nuova attività').'" ]} +
+ +
+ {["type": "checkbox", "label": "'.tr('Duplica impianti').'", "name": "copia_impianti", "help": "'.tr('Selezione per riportare anche gli impianti nella nuova attività').'" ]}
From 3d6258f98c1c799e6d295e027ee6da13bcf28d5c Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Thu, 29 Sep 2022 16:06:05 +0200 Subject: [PATCH 44/46] Fix autocomplete indirizzi email --- modules/anagrafiche/ajax/complete.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/anagrafiche/ajax/complete.php b/modules/anagrafiche/ajax/complete.php index 244bde358..fac4117a3 100755 --- a/modules/anagrafiche/ajax/complete.php +++ b/modules/anagrafiche/ajax/complete.php @@ -81,8 +81,8 @@ switch ($resource) { ]; } - // Tutti gli agenti - $q = "SELECT DISTINCT(email), ragione_sociale, an_anagrafiche.idanagrafica FROM an_anagrafiche INNER JOIN an_tipianagrafiche_anagrafiche ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE idtipoanagrafica = (SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='Agente') AND email != '' ORDER BY idanagrafica"; + // Tutti gli agenti del cliente + $q = "SELECT DISTINCT(email), ragione_sociale, idanagrafica FROM an_anagrafiche WHERE email != '' AND (idanagrafica=(SELECT idagente FROM an_anagrafiche AS agenti WHERE 1=1 ".$where.") OR idanagrafica IN (SELECT idagente FROM an_anagrafiche_agenti WHERE 1=1 ".$where."))"; $rs = $dbo->fetchArray($q); foreach ($rs as $r) { @@ -96,7 +96,7 @@ switch ($resource) { $query = "SELECT DISTINCT(email) AS email, ragione_sociale, idanagrafica FROM an_anagrafiche WHERE email != '' ".$where; // Se type pec, propongo anche la pec if (get('type') == 'pec') { - $query .= " UNION SELECT DISTINCT(pec), ragione_sociale, idanagrafica FROM an_anagrafiche WHERE email != '' ".$where; + $query .= " UNION SELECT DISTINCT(pec), ragione_sociale, idanagrafica FROM an_anagrafiche WHERE pec != '' ".$where; } $query .= ' ORDER BY idanagrafica'; From 7bf477b31953e90e8c6ef4236ce35d1c495a10d9 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Thu, 29 Sep 2022 16:06:27 +0200 Subject: [PATCH 45/46] Fix minori --- modules/interventi/actions.php | 2 +- modules/interventi/variables.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index ff74a59eb..355d6deda 100644 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -863,7 +863,7 @@ switch (post('op')) { } } - // Copia delle sessioni + // Copia degli impianti if (!empty($copia_impianti)) { $impianti = $dbo->select('my_impianti_interventi', '*', ['idintervento' => $intervento->id]); foreach ($impianti as $impianto) { diff --git a/modules/interventi/variables.php b/modules/interventi/variables.php index 2c6d8eb8e..d35f6f425 100755 --- a/modules/interventi/variables.php +++ b/modules/interventi/variables.php @@ -18,6 +18,7 @@ */ $r = $dbo->fetchOne('SELECT *, + an_anagrafiche.idanagrafica AS id_anagrafica, an_anagrafiche.email, an_anagrafiche.pec, an_referenti.nome, @@ -42,7 +43,7 @@ return [ 'data' => Translator::dateToLocale($r['data_richiesta']), 'data richiesta' => Translator::dateToLocale($r['data_richiesta']), 'data fine intervento' => empty($r['data_fine']) ? Translator::dateToLocale($r['data_richiesta']) : Translator::dateToLocale($r['data_fine']), - 'id_anagrafica' => $r['idanagrafica'], + 'id_anagrafica' => $r['id_anagrafica'], 'stato' => $r['stato'], 'impianti' => $r['impianti'], 'nome_referente' => $r['nome'], From 29388fdabd6a49cad8ea5c76a29d94d95e086abe Mon Sep 17 00:00:00 2001 From: Pek5892 Date: Fri, 30 Sep 2022 12:18:45 +0200 Subject: [PATCH 46/46] Fix + migliorie grafiche minori --- .../plugins/preventivi.consuntivo.php | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/modules/preventivi/plugins/preventivi.consuntivo.php b/modules/preventivi/plugins/preventivi.consuntivo.php index 4496d436c..d4f15f32d 100755 --- a/modules/preventivi/plugins/preventivi.consuntivo.php +++ b/modules/preventivi/plugins/preventivi.consuntivo.php @@ -258,7 +258,7 @@ $diff = sum($budget, -$totale); echo '

- '.tr('Rapporto budget/spesa').':
'; + '.tr('Budget rimanente').':
'; if ($diff > 0) { echo ' +'.moneyFormat($diff).''; @@ -278,11 +278,11 @@ if ($diff > 0) { - - - - - + + + + + '; ksort($tipologie); foreach ($tipologie as $key => $tipologia){ @@ -307,12 +307,12 @@ if ($diff > 0) {
'.tr('Tipologia').''.tr('Ore').''.tr('Costo').''.tr('Ricavo').''.tr('Margine').''.tr('Ricarico').''.tr('Ore').''.tr('Costo').''.tr('Ricavo').''.tr('Margine').''.tr('Ricarico').'
- - - - - - + + + + + + '; ksort($tecnici); foreach ($tecnici as $key => $tecnico){ @@ -322,8 +322,8 @@ if ($diff > 0) { echo ' + - @@ -340,11 +340,11 @@ if ($diff > 0) {
'.tr('Tecnici').''.tr('km').''.tr('Ore').''.tr('Costo').''.tr('Ricavo').''.tr('Margine').''.tr('Ricarico').''.tr('Km').''.tr('Ore').''.tr('Costo').''.tr('Ricavo').''.tr('Margine').''.tr('Ricarico').'
'.$key.''.Translator::numberToLocale($tecnico['km']).' '.Translator::numberToLocale($tecnico['ore']).''.(int)$tecnico['km'].' '.Translator::numberToLocale($tecnico['costo']).' € '.Translator::numberToLocale($tecnico['ricavo']).' € '.Translator::numberToLocale($margine).' € ('.$margine_prc.'%)
- - - - - + + + + + '; ksort($stati_intervento); foreach ($stati_intervento as $key => $stato){ @@ -369,11 +369,11 @@ if ($diff > 0) {
'.tr('Stato').''.tr('Ore').''.tr('Costo').''.tr('Ricavo').''.tr('Margine').''.tr('Ricarico').''.tr('Ore').''.tr('Costo').''.tr('Ricavo').''.tr('Margine').''.tr('Ricarico').'
- - - - - + + + + + '; ksort($materiali_art); foreach ($materiali_art as $key => $materiali_array1){
'.tr('Materiale').''.tr('Qtà').''.tr('Costo').''.tr('Ricavo').''.tr('Margine').''.tr('Ricarico').''.tr('Qtà').''.tr('Costo').''.tr('Ricavo').''.tr('Margine').''.tr('Ricarico').'