1
0
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:
Dasc3er 2021-02-26 10:32:50 +01:00
parent f6905aad3a
commit ec67ce259c
13 changed files with 73 additions and 49 deletions

View File

@ -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

View File

@ -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');

View File

@ -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);
}

View File

@ -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,

View File

@ -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

View File

@ -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>

View File

@ -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);
}

View File

@ -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[] = [

View File

@ -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) {

View File

@ -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;

View File

@ -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,
]);
}

View File

@ -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();

View File

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