mirror of
https://github.com/devcode-it/openstamanager.git
synced 2025-02-05 10:17:30 +01:00
Correzioni su importi e movimentazione Note
This commit is contained in:
parent
f6905aad3a
commit
ec67ce259c
@ -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
|
||||
|
@ -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');
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -147,7 +147,7 @@ foreach ($righe as $riga) {
|
||||
// Quantità e unità di misura
|
||||
echo '
|
||||
<td class="text-center">
|
||||
'.numberFormat($fattura->isNota() ? -$riga->qta : $riga->qta, 'qta').' '.$riga->um.'
|
||||
'.numberFormat($riga->qta, 'qta').' '.$riga->um.'
|
||||
</td>';
|
||||
|
||||
// Prezzi unitari
|
||||
@ -182,7 +182,7 @@ foreach ($righe as $riga) {
|
||||
// Importo
|
||||
echo '
|
||||
<td class="text-right">
|
||||
'.moneyFormat($fattura->isNota() ? -$riga->importo : $riga->importo).'
|
||||
'.moneyFormat($riga->importo).'
|
||||
</td>';
|
||||
}
|
||||
|
||||
@ -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 '
|
||||
<tr>
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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[] = [
|
||||
|
@ -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) {
|
||||
|
@ -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,6 +204,7 @@ class Mastrino extends Model
|
||||
}
|
||||
|
||||
$totale_pagato = $totale_movimenti - $totale_insoluto;
|
||||
$is_nota = $documento->isNota();
|
||||
} else {
|
||||
$scadenze = [$scadenza];
|
||||
$dir = $movimento->totale < 0 ? 'entrata' : 'uscita';
|
||||
@ -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;
|
||||
|
@ -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,
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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`);
|
||||
|
Loading…
x
Reference in New Issue
Block a user