Aggiunto colonna sconto per le coppie anagrafica articolo

This commit is contained in:
MatteoPistorello 2020-10-30 11:18:15 +01:00
parent 961249c9b5
commit f080081653
6 changed files with 133 additions and 13 deletions

View File

@ -52,6 +52,10 @@ if (empty($result['idarticolo'])) {
ottieniPrezziArticolo("'.$articolo['id'].'").then(function (){
verificaPrezzoArticolo();
});
ottieniScontiArticolo("'.$articolo['id'].'").then(function (){
verificaScontoArticolo();
});
});
</script>';
}
@ -111,6 +115,17 @@ $(document).ready(function () {
}
});
$("#tipo_sconto").on("change", function() {
let $data = $("#idarticolo").selectData();
ottieniScontiArticolo($data.id).then(function() {
if ($("#sconto").val().toEnglish() === 0){
aggiornaScontoArticolo();
} else {
verificaScontoArticolo();
}
});
});
$("#idarticolo").on("change", function() {
// Operazioni sui prezzi in fondo alla pagina
let prezzi_precedenti = $("#prezzi_articolo button");
@ -136,12 +151,20 @@ $("#idarticolo").on("change", function() {
let $data = $(this).selectData();
ottieniPrezziArticolo($data.id).then(function() {
if ($("#prezzo_unitario").val().toEnglish() === 0){
aggiornaPrezzoArticolo();
aggiornaPrezzoArticolo()
} else {
verificaPrezzoArticolo();
}
});
ottieniScontiArticolo($data.id).then(function() {
if ($("#sconto").val().toEnglish() === 0){
aggiornaScontoArticolo();
} else {
verificaScontoArticolo();
}
});
$("#costo_unitario").val($data.prezzo_acquisto);
$("#descrizione_riga").val($data.descrizione);
@ -170,8 +193,9 @@ $("#idarticolo").on("change", function() {
}
});
$(document).on("change", "input[name^=qta], input[name^=prezzo_unitario]", function() {
$(document).on("change", "input[name^=qta], input[name^=prezzo_unitario], input[name^=sconto]", function() {
verificaPrezzoArticolo();
verificaScontoArticolo();
});
/**
@ -201,6 +225,34 @@ function getPrezzoPerQuantita(qta) {
return parseFloat(prezzo_selezionato);
}
/**
* Restituisce lo sconto registrato per una specifica quantità dell\'articolo.
*/
function getScontoPerQuantita(qta) {
const data = $("#sconto").data("sconti");
if (!data) return 0;
let sconto_predefinito = null;
let sconto_selezionato = null;
for (const prezzo of data) {
if (prezzo.minimo == null && prezzo.massimo == null) {
sconto_predefinito = prezzo.sconto;
continue;
}
if (qta >= prezzo.minimo && qta <= prezzo.massimo) {
sconto_selezionato = prezzo.sconto;
}
}
if (sconto_selezionato == null) {
sconto_selezionato = sconto_predefinito;
}
return parseFloat(sconto_selezionato);
}
/**
* Funzione per registrare localmente i prezzi definiti per l\'articolo in relazione ad una specifica anagrafica.
*/
@ -212,6 +264,18 @@ function ottieniPrezziArticolo(id_articolo) {
});
}
/**
* Funzione per registrare localmente gli sconti definiti per l\'articolo in relazione ad una specifica anagrafica.
*/
function ottieniScontiArticolo(id_articolo) {
return $.get(globals.rootdir + "/ajax_complete.php?module=Articoli&op=prezzi_articolo&id_anagrafica='.$options['idanagrafica'].'&id_articolo=" + id_articolo + "&dir=" + direzione, function(response) {
const data = JSON.parse(response);
$("#sconto").data("sconti", data);
});
}
/**
* Funzione per verificare se il prezzo unitario corrisponde a quello registrato per l\'articolo, e proporre in automatico una correzione.
*/
@ -232,7 +296,29 @@ function verificaPrezzoArticolo() {
}
div.css("padding-top", "5px");
div.html(`<small class="label label-warning" >'.tr('Prezzo registrato').': ` + prezzo_previsto.toLocale() + globals.currency + `<button type="button" class="btn btn-xs btn-info pull-right" onclick="aggiornaPrezzoArticolo()"><i class="fa fa-refresh"></i> '.tr('Aggiorna').'</button></small>`);
div.html(`<small class="label label-warning" >'.tr('Prezzo suggerito').': ` + prezzo_previsto.toLocale() + globals.currency + `<button type="button" class="btn btn-xs btn-info pull-right" onclick="aggiornaPrezzoArticolo()"><i class="fa fa-refresh"></i> '.tr('Aggiorna').'</button></small>`);
}
/**
* Funzione per verificare se lo sconto unitario corrisponde a quello registrato per l\'articolo, e proporre in automatico una correzione.
*/
function verificaScontoArticolo() {
let qta = $("#qta").val().toEnglish();
let sconto_previsto = getScontoPerQuantita(qta);
console.log(sconto_previsto);
let sconto_input = $("#sconto");
let sconto = sconto_input.val().toEnglish();
let div = sconto_input.parent().next();
if (sconto_previsto === sconto || $("#tipo_sconto").val() === "UNT") {
div.css("padding-top", "0");
div.html("");
return;
}
div.css("padding-top", "5px");
div.html(`<small class="label label-warning" >'.tr('Sconto suggerito').': ` + sconto_previsto.toLocale() + `%<button type="button" class="btn btn-xs btn-info pull-right" onclick="aggiornaScontoArticolo()"><i class="fa fa-refresh"></i> '.tr('Aggiorna').'</button></small>`);
}
/**
@ -245,6 +331,16 @@ function aggiornaPrezzoArticolo() {
$("#prezzo_unitario").val(prezzo_previsto).trigger("change");
}
/**
* Funzione per aggiornare lo sconto unitario sulla base dei valori automatici.
*/
function aggiornaScontoArticolo() {
let qta = $("#qta").val().toEnglish();
let sconto_previsto = getScontoPerQuantita(qta);
$("#sconto").val(sconto_previsto).trigger("change");
}
/**
* Funzione per l\'aggiornamento dinamico della quantità minima per l\'articolo.
*/

View File

@ -127,7 +127,7 @@ switch ($resource) {
$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA');
$query = 'SELECT minimo, massimo,
$query = 'SELECT minimo, massimo, sconto,
'.($prezzi_ivati ? 'prezzo_unitario_ivato' : 'prezzo_unitario').' AS prezzo_unitario
FROM mg_prezzi_articoli
WHERE id_articolo = '.prepare($id_articolo).' AND dir = '.prepare($direzione).' |where|

View File

@ -69,11 +69,13 @@ switch (filter('op')) {
// Salvataggio del prezzo predefinito
$prezzo_unitario = filter('prezzo_unitario_fisso');
$sconto = filter('sconto_fisso');
$dettaglio_predefinito = DettaglioPrezzo::dettaglioPredefinito($id_articolo, $id_anagrafica, $direzione)
->first();
if (empty($dettaglio_predefinito)) {
$dettaglio_predefinito = DettaglioPrezzo::build($articolo, $anagrafica, $direzione);
}
$dettaglio_predefinito->sconto = $sconto;
$dettaglio_predefinito->setPrezzoUnitario($prezzo_unitario);
$dettaglio_predefinito->save();
@ -84,6 +86,7 @@ switch (filter('op')) {
$prezzi_unitari = (array) filter('prezzo_unitario');
$minimi = filter('minimo');
$massimi = filter('massimo');
$sconti = (array) filter('sconto');
// Rimozione dei prezzi cancellati
$registrati = filter('dettaglio');
@ -99,6 +102,7 @@ switch (filter('op')) {
$dettaglio->minimo = $minimi[$key];
$dettaglio->massimo = $massimi[$key];
$dettaglio->sconto = $sconti[$key];
$dettaglio->setPrezzoUnitario($prezzo_unitario);
$dettaglio->save();
}

View File

@ -62,15 +62,18 @@ echo '
<input type="hidden" name="id_articolo" value="'.$id_articolo.'">
<div class="row">
<div class="col-md-6">
<div class="col-md-4">
<p>'.tr('Prezzo unitario predefinito: _TOT_', [
'_TOT_' => moneyFormat($prezzo_predefinito),
]).'</p>
</div>
<div class="col-md-6">
<div class="col-md-4">
{[ "type": "checkbox", "label": "'.tr("Modifica prezzo per l'anagrafica").'", "name": "modifica_prezzi", "value": "'.intval(!$dettagli->isEmpty() || !empty($dettaglio_predefinito)).'" ]}
</div>
<div class="col-md-4">
{[ "type": "checkbox", "label": "'.tr('Imposta un prezzo unitario fisso').'", "name": "prezzo_fisso", "value": "'.intval($dettagli->count() == 0).'" ]}
</div>
</div>
<div class="row">
@ -79,8 +82,10 @@ echo '
</div>
<div class="col-md-6">
{[ "type": "checkbox", "label": "'.tr('Imposta un prezzo unitario fisso').'", "name": "prezzo_fisso", "value": "'.intval($dettagli->count() == 0).'" ]}
{[ "type": "number", "label": "'.tr('Sconto predefinito').'", "name": "sconto_fisso", "value": "'.$dettaglio_predefinito->sconto.'", "icon-after": "%"]}
</div>
</div>
<div class="box" id="prezzi">
@ -106,6 +111,7 @@ echo '
<th class="text-center tip" title="'.($prezzi_ivati ? tr('Importo IVA inclusa') : '').'">
'.tr('Prezzo unitario').' <i class="fa fa-question-circle-o"></i>
</th>
<th class="text-center">'.tr('Sconto').'</th>
<th>#</th>
</tr>
</thead>
@ -127,7 +133,8 @@ foreach ($dettagli as $key => $dettaglio) {
<td>
{[ "type": "number", "name": "prezzo_unitario['.$key.']", "icon-after": "'.currency().'", "value": "'.($prezzi_ivati ? $dettaglio->prezzo_unitario_ivato : $dettaglio->prezzo_unitario).'" ]}
</td>
<td>
{[ "type": "number", "name": "sconto['.$key.']", "min-value": 0, "value": "'.$dettaglio->sconto.'", "icon-after":"%" ]}
<td>
<button type="button" class="btn btn-xs btn-danger" onclick="rimuoviPrezzo(this)">
<i class="fa fa-trash"></i>
@ -168,6 +175,10 @@ echo '
{[ "type": "number", "name": "prezzo_unitario[-id-]", "icon-after": "'.currency().'" ]}
</td>
<td>
{[ "type": "number", "name": "sconto[-id-]", "min-value": 0, "icon-after": "%" ]}
</td>
<td>
<button type="button" class="btn btn-xs btn-danger" onclick="rimuoviPrezzo(this)">
<i class="fa fa-trash"></i>

View File

@ -73,6 +73,7 @@ if (!$clienti->isEmpty()) {
<th class="text-center" width="210">'.tr('Q. minima').'</th>
<th class="text-center" width="210">'.tr('Q. massima').'</th>
<th class="text-center" width="150">'.tr('Prezzo unitario').'</th>
<th class="text-center" width="150">'.tr('Sconto').'</th>
<th class="text-center" width="150">#</th>
</tr>
</thead>
@ -84,7 +85,7 @@ if (!$clienti->isEmpty()) {
echo '
<tr data-id_anagrafica="'.$id_cliente.'" data-direzione="entrata">
<td colspan="4">
<td colspan="5">
'.Modules::link('Anagrafiche', $anagrafica->id, $anagrafica->ragione_sociale).'
</td>
@ -121,6 +122,10 @@ if (!$clienti->isEmpty()) {
'.moneyFormat($dettaglio->prezzo_unitario).'
</td>
<td class="text-right">
'.numberFormat($dettaglio->sconto).'%
</td>
<td>';
if (!isset($dettaglio->minimo) && !isset($dettaglio->massimo)) {
@ -280,11 +285,11 @@ if (!$fornitori_disponibili->isEmpty()) {
if (!empty($prezzi) && !$prezzi->isEmpty()) {
echo '
<tr>
<td></td>
<td></td>
<th class="text-center">'.tr('Q. minima').'</th>
<th class="text-center">'.tr('Q. massima').'</th>
<th class="text-center">'.tr('Prezzo unitario').'</th>
<th class="text-center">'.tr('Sconto').'</th>
<td></td>
</tr>';
@ -292,7 +297,6 @@ if (!$fornitori_disponibili->isEmpty()) {
echo '
<tr>
<td></td>
<td></td>
<td class="text-right">
'.($dettaglio->minimo ? numberFormat($dettaglio->minimo) : '-').'
@ -305,7 +309,9 @@ if (!$fornitori_disponibili->isEmpty()) {
<td class="text-right">
'.moneyFormat($dettaglio->prezzo_unitario).'
</td>
<td class="text-right">
'.numberFormat($dettaglio->sconto).'%
</td>
<td>';
if (!isset($dettaglio->minimo) && !isset($dettaglio->massimo)) {

View File

@ -326,4 +326,7 @@ UPDATE `zz_modules` SET `options` = 'custom' WHERE `name` = 'Impostazioni';
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `co_scadenziario`\r\n LEFT JOIN `co_documenti` ON `co_scadenziario`.`iddocumento` = `co_documenti`.`id`\r\n LEFT JOIN `an_anagrafiche` ON `co_documenti`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\r\n LEFT JOIN `co_pagamenti` ON `co_documenti`.`idpagamento` = `co_pagamenti`.`id`\r\n LEFT JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id`\r\n LEFT JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id`\r\nWHERE 1=1 AND\r\n (`co_scadenziario`.`scadenza` BETWEEN \'|period_start|\' AND \'|period_end|\' OR ABS(`co_scadenziario`.`pagato`) < ABS(`co_scadenziario`.`da_pagare`)) AND\r\n (`co_statidocumento`.`descrizione` IS NULL OR `co_statidocumento`.`descrizione` IN(\'Emessa\',\'Parzialmente pagato\',\'Pagato\'))\r\nHAVING 2=2\r\nORDER BY `scadenza` ASC' WHERE `zz_modules`.`name` = 'Scadenzario';
-- Elimino token disabilitati
DELETE FROM `zz_tokens` WHERE `zz_tokens`.`enabled` = 0;
DELETE FROM `zz_tokens` WHERE `zz_tokens`.`enabled` = 0;
-- Aggiunto colonna sconto per le coppie anagrafica articolo
ALTER TABLE `mg_prezzi_articoli` ADD `sconto` DECIMAL(15,6) NOT NULL AFTER `massimo`;