1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2024-12-22 21:28:08 +01:00

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
This commit is contained in:
Maicol 2018-12-23 14:25:20 +01:00 committed by Thomas Zilio
parent ac2c2e0a6f
commit cc2a95a39b
6 changed files with 187 additions and 28 deletions

View File

@ -26,20 +26,66 @@ echo '
</div>
</div>';
// Costo unitario
// Prezzo di acquisto unitario
echo '
<div class="row">
<div class="col-md-6">
{[ "type": "number", "label": "'.tr('Costo unitario').'", "name": "prezzo", "value": "'.$result['prezzo'].'", "required": 1, "icon-after": "&euro;" ]}
<div class="col-md-3">
{[ "type": "number", "label": "'.tr('Prezzo di acquisto unitario').'", "name": "prezzo_acquisto", "value": "'.$result['prezzo_unitario_acquisto'].'", "required": 0, "icon-after": "&euro;", "onkeyup": "aggiorna_guadagno()" ]}
</div>';
// Prezzo di vendita unitario
echo '
<div class="col-md-3">
{[ "type": "number", "label": "'.tr('Prezzo di vendita unitario').'", "name": "prezzo", "value": "'.$result['prezzo'].'", "required": 1, "icon-after": "&euro;", "onkeyup": "aggiorna_guadagno()" ]}
</div>';
// Sconto unitario
echo '
<div class="col-md-6">
{[ "type": "number", "label": "'.tr('Sconto unitario').'", "name": "sconto", "value": "'.$result['sconto_unitario'].'", "icon-after": "choice|untprc|'.$result['tipo_sconto'].'" ]}
<div class="col-md-3">
{[ "type": "number", "label": "'.tr('Sconto unitario').'", "name": "sconto", "value": "'.$result['sconto_unitario'].'", "icon-after": "choice|untprc|'.$result['tipo_sconto'].'", "onkeyup": "aggiorna_guadagno()"]}
</div>';
// Guadagno unitario
echo '
<div class="col-md-3">
{[ "type": "number", "label": "'.tr('Guadagno unitario').'", "name": "guadagno", "value": "'.$result['sconto_unitario'].'", "icon-after": "&euro;", "disabled": 1 ]}
</div>
</div>';
// Funzione per l'aggiornamento in tempo reale del guadagno
echo '
<script>
function aggiorna_guadagno() {
var prezzo_acquisto = parseFloat($("#prezzo_acquisto").val().replace(/\./g, ""));
var prezzo = parseFloat($("#prezzo").val().replace(/\./g, ""));
var sconto = parseFloat($("#sconto").val().replace(/\./g, ""));
if ($("#tipo_sconto").val() === "PRC") {
sconto = sconto / 100 * prezzo
}
var guadagno = $("#guadagno");
var parentdiv = guadagno.parent();
var errorsdiv = parentdiv.parent().find("div[id*=\'errors\']");
guadagno.val(prezzo - sconto - prezzo_acquisto);
if (parseFloat(guadagno.val().replace(/\./g, "")) < 0) {
guadagno.css("color", "red");
parentdiv.addClass("has-error");
errorsdiv.addClass("has-error");
if (errorsdiv.find(".help-block").length === 0) {
errorsdiv.append("<span class=\'help-block\'>Il guadagno è negativo!</span>");
}
} else {
guadagno.css("color", "black");
parentdiv.removeClass("has-error");
errorsdiv.removeClass("has-error");
errorsdiv.find(".help-block").remove()
}
}
aggiorna_guadagno();
$("#tipo_sconto").change(aggiorna_guadagno)
</script>
';
if ($module['name'] == 'Fatture di vendita') {
$collapsed = empty($result['data_inizio_periodo']) && empty($result['data_fine_periodo']) && empty($result['riferimento_amministrazione']);

View File

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

View File

@ -16,9 +16,11 @@ echo '
<th>'.tr('Descrizione').'</th>
<th width="120">'.tr('Q.').'</th>
<th width="80">'.tr('U.m.').'</th>
<th width="120">'.tr('Prezzo unitario').'</th>
<th width="150">'.tr('Prezzo acq. unitario').'</th>
<th width="160">'.tr('Prezzo vend. unitario').'</th>
<th width="120">'.tr('Iva').'</th>
<th width="120">'.tr('Importo').'</th>
<th width="120">'.tr('Guadagno').'</th>
<th width="60"></th>
</tr>
</thead>
@ -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 '
</td>';
// Prezzo unitario
// Prezzo di acquisto unitario
echo '
<td class="text-right">';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['prezzo_unitario_acquisto']).' &euro;';
}
// Prezzo di vendita unitario
echo '
<td class="text-right">';
@ -186,6 +198,22 @@ if (!empty($rs)) {
echo '
</td>';
// 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 '
<td class="text-right" style="' . $guadagno_style . '">';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($guadagno).' &euro;';
}
echo '
</td>';
// Possibilità di rimuovere una riga solo se la fattura non è pagata
echo '
<td class="text-center">';
@ -236,6 +264,10 @@ echo '
</tbody>';
// 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>
<td colspan="5" class="text-right">
<td colspan="7" class="text-right">
<b>'.tr('Imponibile', [], ['upper' => true]).':</b>
</td>
<td align="right">
@ -280,7 +317,7 @@ echo '
if (abs($sconto) > 0) {
echo '
<tr>
<td colspan="5" class="text-right">
<td colspan="7" class="text-right">
<b>'.tr('Sconto', [], ['upper' => true]).':</b>
</td>
<td align="right">
@ -292,7 +329,7 @@ if (abs($sconto) > 0) {
// IMPONIBILE SCONTATO
echo '
<tr>
<td colspan="5" class="text-right">
<td colspan="7" class="text-right">
<b>'.tr('Imponibile scontato', [], ['upper' => true]).':</b>
</td>
<td align="right">
@ -306,7 +343,7 @@ if (abs($sconto) > 0) {
if (abs($record['rivalsainps']) > 0) {
echo '
<tr>
<td colspan="5" class="text-right">
<td colspan="7" class="text-right">
<b>'.tr('Rivalsa INPS', [], ['upper' => true]).':</b>
</td>
<td align="right">
@ -320,7 +357,7 @@ if (abs($record['rivalsainps']) > 0) {
if (abs($totale_iva) > 0) {
echo '
<tr>
<td colspan="5" class="text-right">
<td colspan="7" class="text-right">
<b>'.tr('Iva', [], ['upper' => true]).':</b>
</td>
<td align="right">
@ -333,7 +370,7 @@ if (abs($totale_iva) > 0) {
// TOTALE
echo '
<tr>
<td colspan="5" class="text-right">
<td colspan="7" class="text-right">
<b>'.tr('Totale', [], ['upper' => true]).':</b>
</td>
<td align="right">
@ -346,7 +383,7 @@ echo '
if (abs($record['bollo']) > 0) {
echo '
<tr>
<td colspan="5" class="text-right">
<td colspan="7" class="text-right">
<b>'.tr('Marca da bollo', [], ['upper' => true]).':</b>
</td>
<td align="right">
@ -360,7 +397,7 @@ if (abs($record['bollo']) > 0) {
if (abs($record['ritenutaacconto']) > 0) {
echo '
<tr>
<td colspan="5" class="text-right">
<td colspan="7" class="text-right">
<b>'.tr("Ritenuta d'acconto", [], ['upper' => true]).':</b>
</td>
<td align="right">
@ -376,7 +413,7 @@ if (abs($record['ritenutaacconto']) > 0) {
if ($totale != $netto_a_pagare) {
echo '
<tr>
<td colspan="5" class="text-right">
<td colspan="7" class="text-right">
<b>'.tr('Netto a pagare', [], ['upper' => true]).':</b>
</td>
<td align="right">
@ -386,6 +423,23 @@ if ($totale != $netto_a_pagare) {
</tr>';
}
// GUADAGNO TOTALE
if ($totale_guadagno < 0) {
$guadagno_style = "background-color: #FFC6C6; border: 3px solid red";
} else {
$guadagno_style = "";
}
echo '
<tr>
<td colspan="7" class="text-right">
<b>'.tr('Guadagno totale', [], ['upper' => true]).':</b>
</td>
<td align="right" style="' . $guadagno_style . '">
'.Translator::numberToLocale($totale_guadagno).' &euro;
</td>
<td></td>
</tr>';
echo '
</table>';

View File

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

View File

@ -15,9 +15,11 @@ echo '
<th>'.tr('Descrizione').'</th>
<th width="120">'.tr('Q.').'</th>
<th width="80">'.tr('U.m.').'</th>
<th width="120">'.tr('Costo unitario').'</th>
<th width="150">'.tr('Prezzo acq. unitario').'</th>
<th width="160">'.tr('Prezzo vend. unitario').'</th>
<th width="120">'.tr('Iva').'</th>
<th width="120">'.tr('Imponibile').'</th>
<th width="120">'.tr('Guadagno').'</th>
<th width="60"></th>
</tr>
</thead>
@ -58,7 +60,16 @@ foreach ($rs as $r) {
echo '
</td>';
// costo unitario
// Prezzo di acquisto unitario
echo '
<td class="text-right">';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['prezzo_unitario_acquisto']).' &euro;';
}
// prezzo di vendita unitario
echo '
<td class="text-right">';
if (empty($r['is_descrizione'])) {
@ -95,8 +106,22 @@ foreach ($rs as $r) {
echo '
'.Translator::numberToLocale($r['subtotale'] - $r['sconto']).' &euro;';
}
echo'
</td>';
// 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 '
<td class="text-right" style="' . $guadagno_style . '">';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($guadagno).' &euro;';
}
echo '
</td>';
// 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 '
</tbody>';
@ -148,7 +182,7 @@ echo '
if (abs($sconto) > 0) {
echo '
<tr>
<td colspan="5" class="text-right">
<td colspan="7" class="text-right">
<b>'.tr('Imponibile', [], ['upper' => true]).':</b>
</td>
<td align="right">
@ -159,7 +193,7 @@ if (abs($sconto) > 0) {
echo '
<tr>
<td colspan="5" class="text-right">
<td colspan="7" class="text-right">
<b>'.tr('Sconto', [], ['upper' => true]).':</b>
</td>
<td align="right">
@ -171,7 +205,7 @@ if (abs($sconto) > 0) {
// Totale imponibile
echo '
<tr>
<td colspan="5" class="text-right">
<td colspan="7" class="text-right">
<b>'.tr('Imponibile scontato', [], ['upper' => true]).':</b>
</td>
<td align="right">
@ -183,7 +217,7 @@ if (abs($sconto) > 0) {
// Totale imponibile
echo '
<tr>
<td colspan="5" class="text-right">
<td colspan="7" class="text-right">
<b>'.tr('Imponibile', [], ['upper' => true]).':</b>
</td>
<td align="right">
@ -196,7 +230,7 @@ if (abs($sconto) > 0) {
// Totale iva
echo '
<tr>
<td colspan="5" class="text-right">
<td colspan="7" class="text-right">
<b>'.tr('IVA', [], ['upper' => true]).':</b>
</td>
<td align="right">
@ -208,7 +242,7 @@ echo '
// Totale preventivo
echo '
<tr>
<td colspan="5" class="text-right">
<td colspan="7" class="text-right">
<b>'.tr('Totale', [], ['upper' => true]).':</b>
</td>
<td align="right">
@ -217,6 +251,23 @@ echo '
<td></td>
</tr>';
// GUADAGNO TOTALE
if ($totale_guadagno < 0) {
$guadagno_style = "background-color: #FFC6C6; border: 3px solid red";
} else {
$guadagno_style = "";
}
echo '
<tr>
<td colspan="7" class="text-right">
<b>'.tr('Guadagno totale', [], ['upper' => true]).':</b>
</td>
<td align="right" style="' . $guadagno_style . '">
'.Translator::numberToLocale($totale_guadagno).' &euro;
</td>
<td></td>
</tr>';
echo '
</table>';

View File

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