From ec67ce259c6bc1e9c325c6c75e66bd1ac87db167 Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Fri, 26 Feb 2021 10:32:50 +0100 Subject: [PATCH] Correzioni su importi e movimentazione Note --- .../src/Controlli/DatiFattureElettroniche.php | 2 -- modules/articoli/actions.php | 3 +- .../articoli/plugins/articoli.movimenti.php | 3 +- modules/articoli/src/Articolo.php | 2 +- modules/fatture/actions.php | 16 +--------- modules/fatture/row-list.php | 15 ++-------- modules/fatture/src/Components/Articolo.php | 30 ++++++++++++++++--- modules/fatture/src/Gestori/Movimenti.php | 15 ++++++++-- modules/fatture/src/Gestori/Scadenze.php | 15 ++++++++-- modules/primanota/src/Mastrino.php | 6 +++- src/Common/Components/Article.php | 7 ++--- src/Common/Components/Component.php | 3 ++ update/2_4_22.sql | 5 +++- 13 files changed, 73 insertions(+), 49 deletions(-) diff --git a/modules/aggiornamenti/src/Controlli/DatiFattureElettroniche.php b/modules/aggiornamenti/src/Controlli/DatiFattureElettroniche.php index 9edb8fd93..5f784ea13 100644 --- a/modules/aggiornamenti/src/Controlli/DatiFattureElettroniche.php +++ b/modules/aggiornamenti/src/Controlli/DatiFattureElettroniche.php @@ -77,8 +77,6 @@ class DatiFattureElettroniche extends Controllo } else { $totale_documento_xml = $totale_documento_indicato; } - - $totale_documento_xml = $fattura_vendita->isNota() ? -$totale_documento_xml : $totale_documento_xml; } // Se riscontro un'anomalia diff --git a/modules/articoli/actions.php b/modules/articoli/actions.php index 0611fc98e..68bab8ddf 100755 --- a/modules/articoli/actions.php +++ b/modules/articoli/actions.php @@ -131,7 +131,8 @@ switch (post('op')) { $old_qta = $record['qta']; $movimento = $qta - $old_qta; - if (post('qta_manuale') == 1) { + $qta_manuale = post('qta_manuale'); + if (!empty($qta_manuale)) { $descrizione_movimento = post('descrizione_movimento'); $data_movimento = post('data_movimento'); diff --git a/modules/articoli/plugins/articoli.movimenti.php b/modules/articoli/plugins/articoli.movimenti.php index 48f90f6ad..0eb1cf108 100755 --- a/modules/articoli/plugins/articoli.movimenti.php +++ b/modules/articoli/plugins/articoli.movimenti.php @@ -62,7 +62,8 @@ echo ' // Individuazione movimenti $movimenti = $articolo->movimentiComposti() - ->orderBy('data', 'id'); + ->orderBy('data', 'DESC') + ->orderBy('id', 'DESC'); if (empty($_GET['movimentazione_completa'])) { $movimenti->limit(20); } diff --git a/modules/articoli/src/Articolo.php b/modules/articoli/src/Articolo.php index c98799cbb..29788b9f2 100755 --- a/modules/articoli/src/Articolo.php +++ b/modules/articoli/src/Articolo.php @@ -102,7 +102,7 @@ class Articolo extends Model } // Movimento il magazzino solo se l'articolo non è un servizio - if ($this->servizio == 0) { + if (empty($this->servizio)) { // Registrazione della movimentazione database()->insert('mg_movimenti', array_merge($array, [ 'idarticolo' => $this->id, diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index 1b7f303a9..54ca06eef 100755 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -255,8 +255,6 @@ switch (post('op')) { } else { $totale_documento = $totale_documento_indicato; } - - $totale_documento = $fattura->isNota() ? -$totale_documento : $totale_documento; } } catch (Exception $e) { } @@ -460,11 +458,6 @@ switch (post('op')) { $id_conto = $originale->idconto_acquisto; } - // Inversione quantità per Note - if (!empty($record['is_reversed'])) { - $qta = -$qta; - } - // Creazione articolo $originale = ArticoloOriginale::find($id_articolo); $articolo = Articolo::build($fattura, $originale); @@ -495,10 +488,6 @@ switch (post('op')) { } $qta = post('qta'); - // Inversione quantità per Note - if (!empty($record['is_reversed'])) { - $qta = -$qta; - } $articolo->descrizione = post('descrizione'); $articolo->um = post('um') ?: null; @@ -736,9 +725,6 @@ switch (post('op')) { foreach ($righe as $riga) { if (post('evadere')[$riga->id] == 'on') { $qta = post('qta_da_evadere')[$riga->id]; - if ($reversed) { - $qta = -$qta; - } $copia = $riga->copiaIn($fattura, $qta); $copia->id_conto = $id_conto; @@ -802,7 +788,7 @@ switch (post('op')) { if (post('evadere')[$riga->id] == 'on' and !empty(post('qta_da_evadere')[$riga->id])) { $qta = post('qta_da_evadere')[$riga->id]; - $copia = $riga->copiaIn($nota, -$qta); + $copia = $riga->copiaIn($nota, $qta); $copia->ref_riga_documento = $riga->id; // Aggiornamento seriali dalla riga dell'ordine diff --git a/modules/fatture/row-list.php b/modules/fatture/row-list.php index 94e2809be..6f70dc049 100755 --- a/modules/fatture/row-list.php +++ b/modules/fatture/row-list.php @@ -147,7 +147,7 @@ foreach ($righe as $riga) { // Quantità e unità di misura echo ' - '.numberFormat($fattura->isNota() ? -$riga->qta : $riga->qta, 'qta').' '.$riga->um.' + '.numberFormat($riga->qta, 'qta').' '.$riga->um.' '; // Prezzi unitari @@ -182,7 +182,7 @@ foreach ($righe as $riga) { // Importo echo ' - '.moneyFormat($fattura->isNota() ? -$riga->importo : $riga->importo).' + '.moneyFormat($riga->importo).' '; } @@ -239,17 +239,6 @@ $rivalsa_inps = $fattura->rivalsa_inps; $ritenuta_acconto = $fattura->ritenuta_acconto; $ritenuta_contributi = $fattura->totale_ritenuta_contributi; -// Inversione dei valori per le Note -$imponibile = $fattura->isNota() ? -$imponibile : $imponibile; -$sconto = $fattura->isNota() ? -$sconto : $sconto; -$totale_imponibile = $fattura->isNota() ? -$totale_imponibile : $totale_imponibile; -$iva = $fattura->isNota() ? -$iva : $iva; -$totale = $fattura->isNota() ? -$totale : $totale; -$netto_a_pagare = $fattura->isNota() ? -$netto_a_pagare : $netto_a_pagare; -$rivalsa_inps = $fattura->isNota() ? -$rivalsa_inps : $rivalsa_inps; -$ritenuta_acconto = $fattura->isNota() ? -$ritenuta_acconto : $ritenuta_acconto; -$ritenuta_contributi = $fattura->isNota() ? -$ritenuta_contributi : $ritenuta_contributi; - // IMPONIBILE echo ' diff --git a/modules/fatture/src/Components/Articolo.php b/modules/fatture/src/Components/Articolo.php index 9ff952d25..32dcdedf1 100755 --- a/modules/fatture/src/Components/Articolo.php +++ b/modules/fatture/src/Components/Articolo.php @@ -33,19 +33,41 @@ class Articolo extends Article public function movimenta($qta) { - if (!$this->getDocument()->movimenta_magazzino) { + $documento = $this->getDocument(); + if (!$documento->movimenta_magazzino) { return; } $movimenta = true; - // Movimenta il magazzino solo se l'articolo non è già stato movimentato da un documento precedente - // Movimentazione forzata per Note di credito/debito - if ($this->hasOriginalComponent() && !$this->getDocument()->isNota()) { + // Controllo sul documento di origine dell'articolo: effettua il movimento di magazzino solo se non è già stato effettuato + // Se il documento corrente è una Nota (di credito/debito) si veda il controllo successivo + if (!$documento->isNota() && $this->hasOriginalComponent()) { $original = $this->getOriginalComponent(); $movimenta = !$original->getDocument()->movimenta_magazzino; } + // Gestione casistica per Note (di credito/debito) + if ($documento->isNota()) { + // Correzione delle quantità per gestione dei movimenti invertiti + $qta = -$qta; + + if ($this->hasOriginalComponent()) { + $original = $this->getOriginalComponent(); + $original_document = $original->getDocument(); + $direzione_inversa = $original_document->direzione != $this->getDocument()->direzione; + + // Inversione aggiuntiva in caso di origine da documenti della tipologia inversa + $qta = $direzione_inversa ? -$qta : $qta; + + // Controllo sul documento di origine dell'articolo: se i movimenti sono già stati effettuati e la direzione è invertita rispetto alla Nota, non si effettuano altri movimenti + // Esempio: DDT in entrata (documento di uscita) -> Nota di credito (documento di entrata) + if ($original_document->movimenta_magazzino && $direzione_inversa) { + $movimenta = false; + } + } + } + if ($movimenta) { $this->movimentaMagazzino($qta); } diff --git a/modules/fatture/src/Gestori/Movimenti.php b/modules/fatture/src/Gestori/Movimenti.php index e63419951..ca78c4f9e 100644 --- a/modules/fatture/src/Gestori/Movimenti.php +++ b/modules/fatture/src/Gestori/Movimenti.php @@ -74,12 +74,17 @@ class Movimenti $direzione = $this->fattura->direzione; $is_acquisto = $direzione == 'uscita'; $split_payment = $this->fattura->split_payment; + $is_nota = $this->fattura->isNota(); // Totali utili per i movimenti $totale = $this->fattura->totale; - $iva = $this->fattura->iva; $iva_indetraibile = $this->fattura->iva_indetraibile; - $iva_detraibile = $iva - $iva_indetraibile; + $iva_detraibile = $this->fattura->iva - $iva_indetraibile; + + // Inversione di segno per le note + $totale = $is_nota ? -$totale : $totale; + $iva_indetraibile = $is_nota ? -$iva_indetraibile : $iva_indetraibile; + $iva_detraibile = $is_nota ? -$iva_detraibile : $iva_detraibile; /* * 1) Movimento relativo al conto dell'anagrafica del documento @@ -114,10 +119,11 @@ class Movimenti $id_conto = $riga->id_conto ?: $this->fattura->idconto; $imponibile = $riga->imponibile; + $imponibile = $is_nota ? -$imponibile : $imponibile; // Inversione di segno per le note if (!empty($imponibile)) { $movimenti[] = [ 'id_conto' => $id_conto, - 'avere' => $riga->imponibile, + 'avere' => $imponibile, ]; } } @@ -151,6 +157,7 @@ class Movimenti * Rivalsa INPS (senza IVA) -> AVERE per Vendita, DARE per Acquisto */ $rivalsa_inps = $this->fattura->rivalsa_inps; + $rivalsa_inps = $is_nota ? -$rivalsa_inps : $rivalsa_inps; // Inversione di segno per le note if (!empty($rivalsa_inps)) { $id_conto = setting('Conto per Erario c/INPS'); $movimenti[] = [ @@ -165,6 +172,7 @@ class Movimenti * Conto della controparte: AVERE per Vendita, DARE per Acquisto */ $ritenuta_acconto = $this->fattura->ritenuta_acconto; + $ritenuta_acconto = $is_nota ? -$ritenuta_acconto : $ritenuta_acconto; // Inversione di segno per le note if (!empty($ritenuta_acconto)) { $id_conto = setting("Conto per Erario c/ritenute d'acconto"); $movimenti[] = [ @@ -184,6 +192,7 @@ class Movimenti * Conto della controparte: AVERE per Vendita, DARE per Acquisto */ $ritenuta_contributi = $this->fattura->totale_ritenuta_contributi; + $ritenuta_contributi = $is_nota ? -$ritenuta_contributi : $ritenuta_contributi; // Inversione di segno per le note if (!empty($ritenuta_contributi)) { $id_conto = setting('Conto per Erario c/enasarco'); $movimenti[] = [ diff --git a/modules/fatture/src/Gestori/Scadenze.php b/modules/fatture/src/Gestori/Scadenze.php index d64c41fcd..a1e5f2b3a 100644 --- a/modules/fatture/src/Gestori/Scadenze.php +++ b/modules/fatture/src/Gestori/Scadenze.php @@ -57,8 +57,12 @@ class Scadenze $this->registraScadenzeTradizionali($is_pagato); } - $direzione = $this->fattura->tipo->dir; + // Registrazione scadenza per Ritenuta d'Acconto + // Inversione di segno per le note $ritenuta_acconto = $this->fattura->ritenuta_acconto; + $ritenuta_acconto = $this->fattura->isNota() ? -$ritenuta_acconto : $ritenuta_acconto; + + $direzione = $this->fattura->tipo->dir; $is_ritenuta_pagata = $this->fattura->is_ritenuta_pagata; // Se c'è una ritenuta d'acconto, la aggiungo allo scadenzario al 15 del mese dopo l'ultima scadenza di pagamento @@ -128,7 +132,7 @@ class Scadenze foreach ($rate as $rata) { $scadenza = !empty($rata['DataScadenzaPagamento']) ? FatturaElettronicaImport::parseDate($rata['DataScadenzaPagamento']) : $this->fattura->data; - $importo = ($this->fattura->isNota()) ? $rata['ImportoPagamento'] : -$rata['ImportoPagamento']; + $importo = $this->fattura->isNota() ? $rata['ImportoPagamento'] : -$rata['ImportoPagamento']; self::registraScadenza($this->fattura, $importo, $scadenza, $is_pagato); } @@ -144,7 +148,12 @@ class Scadenze */ protected function registraScadenzeTradizionali($is_pagato = false) { - $rate = $this->fattura->pagamento->calcola($this->fattura->netto, $this->fattura->data); + // Inversione di segno per le note + $netto = $this->fattura->netto; + $netto = $this->fattura->isNota() ? -$netto : $netto; + + // Calcolo delle rate + $rate = $this->fattura->pagamento->calcola($netto, $this->fattura->data); $direzione = $this->fattura->tipo->dir; foreach ($rate as $rata) { diff --git a/modules/primanota/src/Mastrino.php b/modules/primanota/src/Mastrino.php index 4c049cba1..20103f4aa 100755 --- a/modules/primanota/src/Mastrino.php +++ b/modules/primanota/src/Mastrino.php @@ -184,6 +184,8 @@ class Mastrino extends Model protected function correggiScadenza(Movimento $movimento, Scadenza $scadenza = null, Fattura $documento = null) { + $is_nota = false; + $documento = $documento ?: $scadenza->documento; if ($documento) { $dir = $documento->direzione; @@ -202,9 +204,10 @@ class Mastrino extends Model } $totale_pagato = $totale_movimenti - $totale_insoluto; + $is_nota = $documento->isNota(); } else { $scadenze = [$scadenza]; - $dir = $movimento->totale<0 ? 'entrata' : 'uscita'; + $dir = $movimento->totale < 0 ? 'entrata' : 'uscita'; $totale_pagato = $movimento->totale; } @@ -237,6 +240,7 @@ class Mastrino extends Model } $pagato = $dir == 'uscita' ? -$pagato : $pagato; + $pagato = $is_nota ? -$pagato : $pagato; // Inversione di segno per le note $scadenza->pagato = $pagato; $scadenza->data_pagamento = $pagato ? $this->data : null; diff --git a/src/Common/Components/Article.php b/src/Common/Components/Article.php index 1abca576b..d1efbee72 100755 --- a/src/Common/Components/Article.php +++ b/src/Common/Components/Article.php @@ -292,16 +292,15 @@ abstract class Article extends Accounting $qta_movimento = $documento->direzione == 'uscita' ? $qta : -$qta; $movimento = Movimento::descrizioneMovimento($qta_movimento, $documento->direzione).' - '.$documento->getReference(); - $idsede = $documento->direzione == 'uscita' ? $documento->idsede_destinazione : $documento->idsede_partenza; + $id_sede = $documento->direzione == 'uscita' ? $documento->idsede_destinazione : $documento->idsede_partenza; // Fix per valori di sede a NULL - $partenza = $partenza ?: 0; - $arrivo = $arrivo ?: 0; + $id_sede = $id_sede ?: 0; $this->articolo->movimenta($qta_movimento, $movimento, $data, false, [ 'reference_type' => get_class($documento), 'reference_id' => $documento->id, - 'idsede' => $idsede, + 'idsede' => $id_sede, ]); } diff --git a/src/Common/Components/Component.php b/src/Common/Components/Component.php index f43b9e0f1..8f16ce3ce 100644 --- a/src/Common/Components/Component.php +++ b/src/Common/Components/Component.php @@ -118,9 +118,11 @@ abstract class Component extends Model $previous = $this->qta; $diff = $value - $previous; + // Controlli su eventuale massimo per la quantità if ($this->hasOriginalComponent()) { $original = $this->getOriginalComponent(); + // Controllo per evitare di superare la quantità totale del componente di origine if ($original->qta_rimanente < $diff) { $diff = $original->qta_rimanente; $value = $previous + $diff; @@ -129,6 +131,7 @@ abstract class Component extends Model $this->attributes['qta'] = $value; + // Aggiornamento della quantità evasa di origine if ($this->hasOriginalComponent()) { $original = $this->getOriginalComponent(); diff --git a/update/2_4_22.sql b/update/2_4_22.sql index 0192a00b0..0f87dd10d 100644 --- a/update/2_4_22.sql +++ b/update/2_4_22.sql @@ -191,7 +191,7 @@ ALTER TABLE `or_ordini` ADD `codice_commessa` VARCHAR(100) NULL AFTER `updated_a UPDATE `or_ordini` SET `numero_cliente`= `id_documento_fe` WHERE `id_documento_fe`!='' AND `id_documento_fe` IS NOT NULL; -- Fix nome file con il tipo documento di vendita -UPDATE `zz_prints` SET `filename` = '{tipo_documento} num. {numero} del {data}' WHERE `zz_prints`.`name` = 'Fattura di vendita'; +UPDATE `zz_prints` SET `filename` = '{tipo_documento} num. {numero} del {data}' WHERE `zz_prints`.`name` = 'Fattura di vendita'; -- Risorsa API per sincronizzazione rapida di un singolo intervento INSERT INTO `zz_api_resources` (`id`, `version`, `type`, `resource`, `class`, `enabled`) VALUES (NULL, 'app-v1', 'update', 'intervento-flash', 'API\\App\\v1\\Flash\\Intervento', '1'); @@ -199,3 +199,6 @@ INSERT INTO `zz_api_resources` (`id`, `version`, `type`, `resource`, `class`, `e -- Colonna categoria impianto INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES (NULL, (SELECT id FROM zz_modules WHERE name='Impianti'), 'Categoria', '(SELECT nome FROM my_impianti_categorie WHERE my_impianti_categorie.id=id_categoria)', 6, 1, 0, 0, '', '', 1, 0, 0); + +-- Fix quantità positiva per Note di credito +UPDATE `co_righe_documenti` SET `qta` = ABS(`qta`), `qta_evasa` = ABS(`qta_evasa`);