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`);