- {[ "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;