From cc2a95a39bc118df24e3bd7164cc117586dd1f8d Mon Sep 17 00:00:00 2001 From: Maicol Date: Sun, 23 Dec 2018 14:25:20 +0100 Subject: [PATCH] Prezzo di acquisto e guadagno - Fatture di vendita e preventivi (#385) * Implementato il guadagno sulle fatture di vendita * Fix calcolo guadagno e etichette degli input * Implementato prezzo di acquisto e guadagno nei preventivi --- include/common/riga.php | 56 +++++++++++++++++++++--- modules/fatture/actions.php | 1 + modules/fatture/row-list.php | 76 ++++++++++++++++++++++++++++----- modules/preventivi/actions.php | 6 ++- modules/preventivi/row-list.php | 71 +++++++++++++++++++++++++----- update/2_4_4.sql | 5 +++ 6 files changed, 187 insertions(+), 28 deletions(-) diff --git a/include/common/riga.php b/include/common/riga.php index 1a718e833..40fb7e6aa 100644 --- a/include/common/riga.php +++ b/include/common/riga.php @@ -26,20 +26,66 @@ echo ' '; -// Costo unitario +// Prezzo di acquisto unitario echo '
-
- {[ "type": "number", "label": "'.tr('Costo unitario').'", "name": "prezzo", "value": "'.$result['prezzo'].'", "required": 1, "icon-after": "€" ]} +
+ {[ "type": "number", "label": "'.tr('Prezzo di acquisto unitario').'", "name": "prezzo_acquisto", "value": "'.$result['prezzo_unitario_acquisto'].'", "required": 0, "icon-after": "€", "onkeyup": "aggiorna_guadagno()" ]} +
'; + +// Prezzo di vendita unitario +echo ' +
+ {[ "type": "number", "label": "'.tr('Prezzo di vendita unitario').'", "name": "prezzo", "value": "'.$result['prezzo'].'", "required": 1, "icon-after": "€", "onkeyup": "aggiorna_guadagno()" ]}
'; // Sconto unitario echo ' -
- {[ "type": "number", "label": "'.tr('Sconto unitario').'", "name": "sconto", "value": "'.$result['sconto_unitario'].'", "icon-after": "choice|untprc|'.$result['tipo_sconto'].'" ]} +
+ {[ "type": "number", "label": "'.tr('Sconto unitario').'", "name": "sconto", "value": "'.$result['sconto_unitario'].'", "icon-after": "choice|untprc|'.$result['tipo_sconto'].'", "onkeyup": "aggiorna_guadagno()"]} +
'; + +// Guadagno unitario +echo ' +
+ {[ "type": "number", "label": "'.tr('Guadagno unitario').'", "name": "guadagno", "value": "'.$result['sconto_unitario'].'", "icon-after": "€", "disabled": 1 ]}
'; +// Funzione per l'aggiornamento in tempo reale del guadagno + +echo ' + +'; + if ($module['name'] == 'Fatture di vendita') { $collapsed = empty($result['data_inizio_periodo']) && empty($result['data_fine_periodo']) && empty($result['riferimento_amministrazione']); diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index a939a27d8..f8aa3b7c0 100644 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -622,6 +622,7 @@ switch (post('op')) { $riga->id_rivalsa_inps = post('id_rivalsa_inps'); } + $riga->prezzo_unitario_acquisto = post("prezzo_acquisto"); $riga->prezzo_unitario_vendita = post('prezzo'); $riga->qta = $qta; $riga->sconto_unitario = post('sconto'); diff --git a/modules/fatture/row-list.php b/modules/fatture/row-list.php index 415a33428..e5cbb0e27 100644 --- a/modules/fatture/row-list.php +++ b/modules/fatture/row-list.php @@ -16,9 +16,11 @@ echo ' '.tr('Descrizione').' '.tr('Q.tà').' '.tr('U.m.').' - '.tr('Prezzo unitario').' + '.tr('Prezzo acq. unitario').' + '.tr('Prezzo vend. unitario').' '.tr('Iva').' '.tr('Importo').' + '.tr('Guadagno').' @@ -28,6 +30,7 @@ if (!empty($rs)) { foreach ($rs as $r) { // Valori assoluti $r['qta'] = abs($r['qta']); + $r['prezzo_unitario_acquisto'] = abs($r['prezzo_unitario_acquisto']); $r['subtotale'] = abs($r['subtotale']); $r['sconto_unitario'] = abs($r['sconto_unitario']); $r['sconto'] = abs($r['sconto']); @@ -143,7 +146,16 @@ if (!empty($rs)) { echo ' '; - // Prezzo unitario + // Prezzo di acquisto unitario + echo ' + '; + + if (empty($r['is_descrizione'])) { + echo ' + '.Translator::numberToLocale($r['prezzo_unitario_acquisto']).' €'; + } + + // Prezzo di vendita unitario echo ' '; @@ -186,6 +198,22 @@ if (!empty($rs)) { echo ' '; + // Guadagno + $guadagno = $r['subtotale'] - ($r['prezzo_unitario_acquisto'] * $r["qta"]) - ($r["sconto_unitario"] * $r["qta"]); + if ($guadagno < 0) { + $guadagno_style = "background-color: #FFC6C6; border: 3px solid red"; + } else { + $guadagno_style = ""; + } + echo ' + '; + if (empty($r['is_descrizione'])) { + echo ' + '.Translator::numberToLocale($guadagno).' €'; + } + echo ' + '; + // Possibilità di rimuovere una riga solo se la fattura non è pagata echo ' '; @@ -236,6 +264,10 @@ echo ' '; // Calcoli +$totale_acquisto = 0; +foreach ($rs as $r) { + $totale_acquisto += ($r["prezzo_unitario_acquisto"] * $r["qta"]); +} $imponibile = sum(array_column($rs, 'subtotale')); $sconto = sum(array_column($rs, 'sconto')); $iva = sum(array_column($rs, 'iva')); @@ -264,10 +296,15 @@ $totale_iva = abs($totale_iva); $totale = abs($totale); $netto_a_pagare = abs($netto_a_pagare); +$totale_guadagno = sum([ + $imponibile_scontato + -$totale_acquisto +]); + // IMPONIBILE echo ' - + '.tr('Imponibile', [], ['upper' => true]).': @@ -280,7 +317,7 @@ echo ' if (abs($sconto) > 0) { echo ' - + '.tr('Sconto', [], ['upper' => true]).': @@ -292,7 +329,7 @@ if (abs($sconto) > 0) { // IMPONIBILE SCONTATO echo ' - + '.tr('Imponibile scontato', [], ['upper' => true]).': @@ -306,7 +343,7 @@ if (abs($sconto) > 0) { if (abs($record['rivalsainps']) > 0) { echo ' - + '.tr('Rivalsa INPS', [], ['upper' => true]).': @@ -320,7 +357,7 @@ if (abs($record['rivalsainps']) > 0) { if (abs($totale_iva) > 0) { echo ' - + '.tr('Iva', [], ['upper' => true]).': @@ -333,7 +370,7 @@ if (abs($totale_iva) > 0) { // TOTALE echo ' - + '.tr('Totale', [], ['upper' => true]).': @@ -346,7 +383,7 @@ echo ' if (abs($record['bollo']) > 0) { echo ' - + '.tr('Marca da bollo', [], ['upper' => true]).': @@ -360,7 +397,7 @@ if (abs($record['bollo']) > 0) { if (abs($record['ritenutaacconto']) > 0) { echo ' - + '.tr("Ritenuta d'acconto", [], ['upper' => true]).': @@ -376,7 +413,7 @@ if (abs($record['ritenutaacconto']) > 0) { if ($totale != $netto_a_pagare) { echo ' - + '.tr('Netto a pagare', [], ['upper' => true]).': @@ -386,6 +423,23 @@ if ($totale != $netto_a_pagare) { '; } +// GUADAGNO TOTALE +if ($totale_guadagno < 0) { + $guadagno_style = "background-color: #FFC6C6; border: 3px solid red"; +} else { + $guadagno_style = ""; +} +echo ' + + + '.tr('Guadagno totale', [], ['upper' => true]).': + + + '.Translator::numberToLocale($totale_guadagno).' € + + + '; + echo ' '; diff --git a/modules/preventivi/actions.php b/modules/preventivi/actions.php index d3c5d63ea..2667dc985 100644 --- a/modules/preventivi/actions.php +++ b/modules/preventivi/actions.php @@ -236,6 +236,7 @@ switch (post('op')) { $qta = post('qta'); $prezzo = post('prezzo'); + $prezzo_acquisto = post("prezzo_acquisto"); // Calcolo dello sconto $sconto_unitario = post('sconto'); @@ -256,7 +257,7 @@ switch (post('op')) { $iva = ($subtot - $sconto) / 100 * $rs2[0]['percentuale']; $iva_indetraibile = $iva / 100 * $rs2[0]['indetraibile']; - $dbo->query('INSERT INTO co_righe_preventivi(idpreventivo, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, um, qta, sconto, sconto_unitario, tipo_sconto, is_descrizione, `order`) VALUES ('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($rs2[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($um).', '.prepare($qta).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare(empty($qta)).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_preventivi AS t WHERE idpreventivo='.prepare($id_record).'))'); + $dbo->query('INSERT INTO co_righe_preventivi(idpreventivo, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, prezzo_unitario_acquisto, subtotale, um, qta, sconto, sconto_unitario, tipo_sconto, is_descrizione, `order`) VALUES ('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($rs2[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo_acquisto).', '.prepare($subtot).', '.prepare($um).', '.prepare($qta).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare(empty($qta)).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_preventivi AS t WHERE idpreventivo='.prepare($id_record).'))'); // Messaggi informativi if (!empty($idarticolo)) { @@ -279,6 +280,7 @@ switch (post('op')) { $qta = post('qta'); $prezzo = post('prezzo'); + $prezzo_acquisto = post("prezzo_acquisto"); $subtot = $prezzo * $qta; // Calcolo dello sconto @@ -302,7 +304,7 @@ switch (post('op')) { if ($is_descrizione == 0) { // Modifica riga generica sul documento - $query = 'UPDATE co_righe_preventivi SET idarticolo='.prepare($idarticolo).', idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', qta='.prepare($qta).' WHERE id='.prepare($idriga); + $query = 'UPDATE co_righe_preventivi SET idarticolo='.prepare($idarticolo).', idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', prezzo_unitario_acquisto='.prepare($prezzo_acquisto).',subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', qta='.prepare($qta).' WHERE id='.prepare($idriga); } else { $query = 'UPDATE co_righe_preventivi SET descrizione='.prepare($descrizione).' WHERE id='.prepare($idriga); } diff --git a/modules/preventivi/row-list.php b/modules/preventivi/row-list.php index 44202cb2e..e5a7f2d1d 100644 --- a/modules/preventivi/row-list.php +++ b/modules/preventivi/row-list.php @@ -15,9 +15,11 @@ echo ' '.tr('Descrizione').' '.tr('Q.tà').' '.tr('U.m.').' - '.tr('Costo unitario').' + '.tr('Prezzo acq. unitario').' + '.tr('Prezzo vend. unitario').' '.tr('Iva').' '.tr('Imponibile').' + '.tr('Guadagno').' @@ -58,7 +60,16 @@ foreach ($rs as $r) { echo ' '; - // costo unitario + // Prezzo di acquisto unitario + echo ' + '; + + if (empty($r['is_descrizione'])) { + echo ' + '.Translator::numberToLocale($r['prezzo_unitario_acquisto']).' €'; + } + + // prezzo di vendita unitario echo ' '; if (empty($r['is_descrizione'])) { @@ -95,8 +106,22 @@ foreach ($rs as $r) { echo ' '.Translator::numberToLocale($r['subtotale'] - $r['sconto']).' €'; } - echo' - '; + + // Guadagno + $guadagno = $r['subtotale'] - ($r['prezzo_unitario_acquisto'] * $r["qta"]) - ($r["sconto_unitario"] * $r["qta"]); + if ($guadagno < 0) { + $guadagno_style = "background-color: #FFC6C6; border: 3px solid red"; + } else { + $guadagno_style = ""; + } + echo ' + '; + if (empty($r['is_descrizione'])) { + echo ' + '.Translator::numberToLocale($guadagno).' €'; + } + echo ' + '; // Possibilità di rimuovere una riga solo se il preventivo non è stato pagato echo ' @@ -130,6 +155,10 @@ foreach ($rs as $r) { } // Calcoli +$totale_acquisto = 0; +foreach ($rs as $r) { + $totale_acquisto += ($r["prezzo_unitario_acquisto"] * $r["qta"]); +} $imponibile = sum(array_column($rs, 'subtotale')); $sconto = sum(array_column($rs, 'sconto')); $iva = sum(array_column($rs, 'iva')); @@ -140,6 +169,11 @@ $totale = sum([ $imponibile_scontato, $iva, ]); +$totale_guadagno = sum([ + $imponibile_scontato + -$totale_acquisto +]); + echo ' '; @@ -148,7 +182,7 @@ echo ' if (abs($sconto) > 0) { echo ' - + '.tr('Imponibile', [], ['upper' => true]).': @@ -159,7 +193,7 @@ if (abs($sconto) > 0) { echo ' - + '.tr('Sconto', [], ['upper' => true]).': @@ -171,7 +205,7 @@ if (abs($sconto) > 0) { // Totale imponibile echo ' - + '.tr('Imponibile scontato', [], ['upper' => true]).': @@ -183,7 +217,7 @@ if (abs($sconto) > 0) { // Totale imponibile echo ' - + '.tr('Imponibile', [], ['upper' => true]).': @@ -196,7 +230,7 @@ if (abs($sconto) > 0) { // Totale iva echo ' - + '.tr('IVA', [], ['upper' => true]).': @@ -208,7 +242,7 @@ echo ' // Totale preventivo echo ' - + '.tr('Totale', [], ['upper' => true]).': @@ -217,6 +251,23 @@ echo ' '; +// GUADAGNO TOTALE +if ($totale_guadagno < 0) { + $guadagno_style = "background-color: #FFC6C6; border: 3px solid red"; +} else { + $guadagno_style = ""; +} +echo ' + + + '.tr('Guadagno totale', [], ['upper' => true]).': + + + '.Translator::numberToLocale($totale_guadagno).' € + + + '; + echo ' '; diff --git a/update/2_4_4.sql b/update/2_4_4.sql index 31e5804ba..db74a7cae 100644 --- a/update/2_4_4.sql +++ b/update/2_4_4.sql @@ -23,6 +23,11 @@ UPDATE `zz_views` SET `query` = '(SELECT `descrizione` FROM `fe_stati_documento` INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`) VALUES (NULL, 'OSMCloud Services API Token', '', 'string', 1, 'Fatturazione Elettronica', 11); +-- Prezzo di acquisto nelle fatture di vendita e nei preventivi + +ALTER TABLE `co_righe_documenti` ADD `prezzo_unitario_acquisto` DECIMAL(12,4) NOT NULL AFTER `descrizione`; +ALTER TABLE `co_righe_preventivi` ADD `prezzo_unitario_acquisto` DECIMAL(12,4) NOT NULL AFTER `descrizione`; + -- Allineo valore Iva predefinita secondo nuovi codici tabella co_iva UPDATE `zz_settings` SET `valore` = (SELECT id FROM `co_iva` WHERE `codice` = 22 LIMIT 0,1) WHERE `nome` = 'Iva predefinita' AND `valore` = 91;