Gestione prezzo minimo e listini visibili in add riga

This commit is contained in:
MatteoPistorello 2022-11-17 12:47:29 +01:00
parent 07e8b5a0bc
commit 4bcebee6b4
3 changed files with 119 additions and 10 deletions

View File

@ -70,7 +70,8 @@ if (empty($result['idarticolo'])) {
echo ' echo '
<input type="hidden" name="qta_minima" id="qta_minima" value="'.$qta_minima.'"> <input type="hidden" name="qta_minima" id="qta_minima" value="'.$qta_minima.'">
<input type="hidden" name="provvigione_default" id="provvigione_default" value="'.$result['provvigione_default'].'"> <input type="hidden" name="provvigione_default" id="provvigione_default" value="'.$result['provvigione_default'].'">
<input type="hidden" name="tipo_provvigione_default" id="provvigione_default" value="'.$result['tipo_provvigione_default'].'">'; <input type="hidden" name="tipo_provvigione_default" id="provvigione_default" value="'.$result['tipo_provvigione_default'].'">
<input type="hidden" name="blocca_minimo_vendita" value="'.setting('Bloccare i prezzi inferiori al minimo di vendita').'">';
// Selezione impianto per gli Interventi // Selezione impianto per gli Interventi
if ($module['name'] == 'Interventi') { if ($module['name'] == 'Interventi') {
@ -302,6 +303,30 @@ function getPrezzoUltimo() {
return dettaglio_ultimo ? parseFloat(dettaglio_ultimo.prezzo_ultimo) : 0; return dettaglio_ultimo ? parseFloat(dettaglio_ultimo.prezzo_ultimo) : 0;
} }
/**
* Restituisce i prezzi dei listini sempre visibili registrati per l\'articolo.
*/
function getPrezziListinoVisibili(nome = "") {
const data = globals.aggiunta_articolo.dettagli;
if (!data) return null;
let dettaglio_prezzi_visibili = [];
for (const dettaglio of data) {
if (dettaglio.prezzo_unitario_listino_visibile != null) {
if (nome != "") {
if (dettaglio.nome == nome) {
dettaglio_prezzi_visibili = parseFloat(dettaglio.prezzo_unitario_listino_visibile);
continue;
}
} else {
dettaglio_prezzi_visibili.push(dettaglio);
}
}
}
return dettaglio_prezzi_visibili;
}
/** /**
* Restituisce lo sconto registrato del listino registrato per l\'articolo-anagrafica. * Restituisce lo sconto registrato del listino registrato per l\'articolo-anagrafica.
*/ */
@ -320,6 +345,24 @@ function getScontoListino() {
return dettaglio_listino ? parseFloat(dettaglio_listino.sconto_percentuale_listino) : 0; return dettaglio_listino ? parseFloat(dettaglio_listino.sconto_percentuale_listino) : 0;
} }
/**
* Restituisce lo sconto registrato del listino sempre visibile dell\'articolo.
*/
function getScontoListinoVisibile(nome) {
const data = globals.aggiunta_articolo.dettagli;
if (!data) return null;
let dettaglio_listino_visibile = null;
for (const dettaglio of data) {
if (dettaglio.nome == nome) {
dettaglio_listino_visibile = dettaglio;
continue;
}
}
return dettaglio_listino_visibile ? parseFloat(dettaglio_listino_visibile.sconto_percentuale_listino_visibile) : 0;
}
/** /**
* Restituisce lo sconto registrato per una specifica quantità dell\'articolo. * Restituisce lo sconto registrato per una specifica quantità dell\'articolo.
*/ */
@ -357,8 +400,10 @@ function verificaPrezzoArticolo() {
let prezzo_listino = getPrezzoListino(); let prezzo_listino = getPrezzoListino();
let prezzo_std = getPrezzoScheda(); let prezzo_std = getPrezzoScheda();
let prezzo_last = getPrezzoUltimo(); let prezzo_last = getPrezzoUltimo();
let prezzo_minimo = parseFloat($("#idarticolo").selectData().minimo_vendita);
let prezzi_visibili = getPrezziListinoVisibili();
if (prezzo_anagrafica || prezzo_listino || prezzo_std || prezzo_last) { if (prezzo_anagrafica || prezzo_listino || prezzo_std || prezzo_last || prezzo_minimo || prezzi_visibili) {
div.html(`<table class="table table-extra-condensed table-prezzi" style="background:#eee; margin-top:-13px;"><tbody>`); div.html(`<table class="table table-extra-condensed table-prezzi" style="background:#eee; margin-top:-13px;"><tbody>`);
} }
let table = $(".table-prezzi"); let table = $(".table-prezzi");
@ -409,8 +454,35 @@ function verificaPrezzoArticolo() {
} }
} }
if (prezzo_minimo) {
table.append(`<tr><td class="pr_minimo"><small>'.tr('Prezzo minimo').': '.Modules::link('Articoli', $result['idarticolo'], tr('Visualizza'), null, '').'</small></td><td align="right" class="pr_minimo"><small>` + prezzo_minimo.toLocale() + ` ` + globals.currency + `</small></td></tr>`);
if (prezzo_anagrafica || prezzo_listino || prezzo_std) { let tr = $(".pr_minimo").parent();
if (prezzo_unitario == prezzo_minimo.toFixed(2)) {
tr.append(`<td><button type="button" class="btn btn-xs btn-info pull-right disabled" style="font-size:10px;"><i class="fa fa-check"></i> '.tr('Aggiorna').'</button></td>`);
} else{
tr.append(`<td><button type="button" class="btn btn-xs btn-info pull-right" onclick="aggiornaPrezzoArticolo(\'minimo\')" style="font-size:10px;"><i class="fa fa-refresh"></i> '.tr('Aggiorna').'</button></td>`);
}
}
if (prezzi_visibili) {
let i = 0;
for (const prezzo_visibile of prezzi_visibili) {
i++;
let prezzo_listino_visibile = parseFloat(prezzo_visibile.prezzo_unitario_listino_visibile);
table.append(`<tr><td class="pr_visibile_`+ i +`"><small>'.tr('Listino visibile ').'(` + prezzo_visibile.nome + `): </small></td><td align="right" class="pr_visibile_`+ i +`"><small>` + prezzo_listino_visibile.toLocale() + ` ` + globals.currency + `</small></td></tr>`);
let tr = $(".pr_visibile_"+ i).parent();
if (prezzo_unitario == prezzo_listino_visibile.toFixed(2)) {
tr.append(`<td><button type="button" class="btn btn-xs btn-info pull-right disabled" style="font-size:10px;"><i class="fa fa-check"></i> '.tr('Aggiorna').'</button></td>`);
} else{
tr.append(`<td><button type="button" class="btn btn-xs btn-info pull-right" onclick="aggiornaPrezzoArticolo(\'` + prezzo_visibile.nome + `\')" style="font-size:10px;"><i class="fa fa-refresh"></i> '.tr('Aggiorna').'</button></td>`);
}
}
}
if (prezzo_anagrafica || prezzo_listino || prezzo_std || prezzo_last || prezzo_minimo || prezzi_visibili) {
table.append(`</tbody></table>`); table.append(`</tbody></table>`);
} }
} }
@ -423,6 +495,7 @@ function verificaScontoArticolo() {
let prezzo_unitario = prezzo_unitario_input.val().toEnglish(); let prezzo_unitario = prezzo_unitario_input.val().toEnglish();
let prezzo_anagrafica = getPrezzoPerQuantita(qta); let prezzo_anagrafica = getPrezzoPerQuantita(qta);
let prezzo_listino = getPrezzoListino(); let prezzo_listino = getPrezzoListino();
let prezzi_visibili = getPrezziListinoVisibili();
let sconto_previsto = 0; let sconto_previsto = 0;
@ -431,6 +504,13 @@ function verificaScontoArticolo() {
sconto_previsto = getScontoPerQuantita(qta); sconto_previsto = getScontoPerQuantita(qta);
} else if (prezzo_unitario == prezzo_listino.toFixed(2)) { } else if (prezzo_unitario == prezzo_listino.toFixed(2)) {
sconto_previsto = getScontoListino(); sconto_previsto = getScontoListino();
} else {
for (const prezzo_visibile of prezzi_visibili) {
let prezzo_listino_visibile = parseFloat(prezzo_visibile.prezzo_unitario_listino_visibile);
if (prezzo_unitario == prezzo_listino_visibile.toFixed(2)) {
sconto_previsto = getScontoListinoVisibile(prezzo_visibile.nome);
}
}
} }
let sconto_input = $("#sconto"); let sconto_input = $("#sconto");
@ -462,6 +542,10 @@ function aggiornaPrezzoArticolo(aggiorna = "") {
prezzo_previsto = getPrezzoScheda(); prezzo_previsto = getPrezzoScheda();
} else if (aggiorna == "last") { } else if (aggiorna == "last") {
prezzo_previsto = getPrezzoUltimo(); prezzo_previsto = getPrezzoUltimo();
} else if (aggiorna == "minimo") {
prezzo_previsto = parseFloat($("#idarticolo").selectData().minimo_vendita);
} else if (aggiorna != "") {
prezzo_previsto = getPrezziListinoVisibili(aggiorna);
} else { } else {
let qta = $("#qta").val().toEnglish(); let qta = $("#qta").val().toEnglish();
prezzo1 = getPrezzoPerQuantita(qta); prezzo1 = getPrezzoPerQuantita(qta);
@ -485,6 +569,7 @@ function aggiornaScontoArticolo() {
let prezzo_unitario = prezzo_unitario_input.val().toEnglish(); let prezzo_unitario = prezzo_unitario_input.val().toEnglish();
let prezzo_anagrafica = getPrezzoPerQuantita(qta); let prezzo_anagrafica = getPrezzoPerQuantita(qta);
let prezzo_listino = getPrezzoListino(); let prezzo_listino = getPrezzoListino();
let prezzi_visibili = getPrezziListinoVisibili();
let sconto_previsto = 0; let sconto_previsto = 0;
@ -493,6 +578,13 @@ function aggiornaScontoArticolo() {
sconto_previsto = getScontoPerQuantita(qta); sconto_previsto = getScontoPerQuantita(qta);
} else if (prezzo_unitario == prezzo_listino.toFixed(2)) { } else if (prezzo_unitario == prezzo_listino.toFixed(2)) {
sconto_previsto = getScontoListino(); sconto_previsto = getScontoListino();
} else {
for (const prezzo_visibile of prezzi_visibili) {
let prezzo_listino_visibile = parseFloat(prezzo_visibile.prezzo_unitario_listino_visibile);
if (prezzo_unitario == prezzo_listino_visibile.toFixed(2)) {
sconto_previsto = getScontoListinoVisibile(prezzo_visibile.nome);
}
}
} }
$("#sconto").val(sconto_previsto).trigger("change"); $("#sconto").val(sconto_previsto).trigger("change");
@ -535,8 +627,16 @@ function verificaMinimoVendita() {
let div = $(".minimo_vendita"); let div = $(".minimo_vendita");
div.css("margin-top", "-13px"); div.css("margin-top", "-13px");
if (prezzo_unitario <= minimo_vendita) {
if (input("blocca_minimo_vendita").get() == "1") {
prezzo_unitario_input.val(minimo_vendita);
div.html(`<p class="label-warning">'.tr('Attenzione:<br>non è possibile inserire un prezzo inferiore al prezzo minimo di vendita ').'` + minimo_vendita.toLocale() + ` ` + globals.currency + `</p>`);
}
}
if (prezzo_unitario < minimo_vendita) { if (prezzo_unitario < minimo_vendita) {
div.html(`<p class="label-warning">'.tr('Attenzione:<br>valore inferiore al prezzo minimo di vendita ').'` + minimo_vendita.toLocale() + ` ` + globals.currency + `</p>`); if (input("blocca_minimo_vendita").get() == "0") {
div.html(`<p class="label-warning">'.tr('Attenzione:<br>valore inferiore al prezzo minimo di vendita ').'` + minimo_vendita.toLocale() + ` ` + globals.currency + `</p>`);
}
} else { } else {
div.html(""); div.html("");
} }

View File

@ -131,32 +131,39 @@ switch ($resource) {
$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA'); $prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA');
// Prezzi netti clienti / listino fornitore
$query = 'SELECT minimo, massimo, $query = 'SELECT minimo, massimo,
sconto_percentuale, sconto_percentuale,
'.($prezzi_ivati ? 'prezzo_unitario_ivato' : 'prezzo_unitario').' AS prezzo_unitario '.($prezzi_ivati ? 'prezzo_unitario_ivato' : 'prezzo_unitario').' AS prezzo_unitario
FROM mg_prezzi_articoli FROM mg_prezzi_articoli
WHERE id_articolo = '.prepare($id_articolo).' AND dir = '.prepare($direzione).' |where| WHERE id_articolo = '.prepare($id_articolo).' AND dir = '.prepare($direzione).' |where|
ORDER BY minimo ASC, massimo DESC'; ORDER BY minimo ASC, massimo DESC';
// Lettura dei prezzi relativi all'anagrafica
$query_anagrafica = replace($query, [ $query_anagrafica = replace($query, [
'|where|' => ' AND id_anagrafica = '.prepare($id_anagrafica), '|where|' => ' AND id_anagrafica = '.prepare($id_anagrafica),
]); ]);
$prezzi = $database->fetchArray($query_anagrafica); $prezzi = $database->fetchArray($query_anagrafica);
// Prezzi listini clienti
$query = 'SELECT sconto_percentuale AS sconto_percentuale_listino, $query = 'SELECT sconto_percentuale AS sconto_percentuale_listino,
'.($prezzi_ivati ? 'prezzo_unitario_ivato' : 'prezzo_unitario').' AS prezzo_unitario_listino '.($prezzi_ivati ? 'prezzo_unitario_ivato' : 'prezzo_unitario').' AS prezzo_unitario_listino
FROM mg_listini FROM mg_listini
LEFT JOIN mg_listini_articoli ON mg_listini.id=mg_listini_articoli.id_listino LEFT JOIN mg_listini_articoli ON mg_listini.id=mg_listini_articoli.id_listino
LEFT JOIN an_anagrafiche ON mg_listini.id=an_anagrafiche.id_listino LEFT JOIN an_anagrafiche ON mg_listini.id=an_anagrafiche.id_listino
WHERE (mg_listini.is_sempre_visibile=1 OR (mg_listini.data_attivazione<=NOW() AND mg_listini_articoli.data_scadenza>=NOW())) AND id_articolo = '.prepare($id_articolo).' AND dir = '.prepare($direzione).' |where|'; WHERE mg_listini.data_attivazione<=NOW() AND mg_listini_articoli.data_scadenza>=NOW() AND id_articolo = '.prepare($id_articolo).' AND dir = '.prepare($direzione).' |where|';
// Lettura dei prezzi relativi all'anagrafica
$query_anagrafica = replace($query, [ $query_anagrafica = replace($query, [
'|where|' => ' AND idanagrafica = '.prepare($id_anagrafica), '|where|' => ' AND idanagrafica = '.prepare($id_anagrafica),
]); ]);
$listino = $database->fetchArray($query_anagrafica); $listino = $database->fetchArray($query_anagrafica);
// Lettura dei prezzi registrati direttamente sull'articolo, per compatibilità con il formato standard // Prezzi listini clienti sempre visibili
$query = 'SELECT mg_listini.nome, sconto_percentuale AS sconto_percentuale_listino_visibile,
'.($prezzi_ivati ? 'prezzo_unitario_ivato' : 'prezzo_unitario').' AS prezzo_unitario_listino_visibile
FROM mg_listini
LEFT JOIN mg_listini_articoli ON mg_listini.id=mg_listini_articoli.id_listino
WHERE mg_listini.is_sempre_visibile=1 AND id_articolo = '.prepare($id_articolo).' AND dir = '.prepare($direzione);
$listini_sempre_visibili = $database->fetchArray($query);
// Prezzi scheda articolo
if ($direzione == 'uscita') { if ($direzione == 'uscita') {
$prezzo_articolo = $database->fetchArray('SELECT prezzo_acquisto AS prezzo_scheda FROM mg_articoli WHERE id = '.prepare($id_articolo)); $prezzo_articolo = $database->fetchArray('SELECT prezzo_acquisto AS prezzo_scheda FROM mg_articoli WHERE id = '.prepare($id_articolo));
} else { } else {
@ -166,7 +173,7 @@ switch ($resource) {
// Ultimo prezzo al cliente // Ultimo prezzo al cliente
$ultimo_prezzo = $dbo->fetchArray('SELECT '.($prezzi_ivati ? '(prezzo_unitario_ivato-sconto_unitario_ivato)' : '(prezzo_unitario-sconto_unitario)').' AS prezzo_ultimo FROM co_righe_documenti LEFT JOIN co_documenti ON co_documenti.id=co_righe_documenti.iddocumento WHERE idarticolo='.prepare($id_articolo).' AND idanagrafica='.prepare($id_anagrafica).' AND idtipodocumento IN(SELECT id FROM co_tipidocumento WHERE dir='.prepare($direzione).') ORDER BY data DESC LIMIT 0,1'); $ultimo_prezzo = $dbo->fetchArray('SELECT '.($prezzi_ivati ? '(prezzo_unitario_ivato-sconto_unitario_ivato)' : '(prezzo_unitario-sconto_unitario)').' AS prezzo_ultimo FROM co_righe_documenti LEFT JOIN co_documenti ON co_documenti.id=co_righe_documenti.iddocumento WHERE idarticolo='.prepare($id_articolo).' AND idanagrafica='.prepare($id_anagrafica).' AND idtipodocumento IN(SELECT id FROM co_tipidocumento WHERE dir='.prepare($direzione).') ORDER BY data DESC LIMIT 0,1');
$results = array_merge($prezzi, $listino, $prezzo_articolo, $ultimo_prezzo); $results = array_merge($prezzi, $listino, $listini_sempre_visibili, $prezzo_articolo, $ultimo_prezzo);
echo json_encode($results); echo json_encode($results);

View File

@ -24,5 +24,7 @@ UPDATE `zz_plugins` SET `title` = 'Netto clienti', `name` = 'Netto Clienti' WHER
ALTER TABLE `mg_articoli` ADD `minimo_vendita` DECIMAL(15,6) NOT NULL AFTER `prezzo_vendita_ivato`; ALTER TABLE `mg_articoli` ADD `minimo_vendita` DECIMAL(15,6) NOT NULL AFTER `prezzo_vendita_ivato`;
ALTER TABLE `mg_articoli` ADD `minimo_vendita_ivato` DECIMAL(15,6) NOT NULL AFTER `minimo_vendita`; ALTER TABLE `mg_articoli` ADD `minimo_vendita_ivato` DECIMAL(15,6) NOT NULL AFTER `minimo_vendita`;
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES (NULL, 'Bloccare i prezzi inferiori al minimo di vendita', '0', 'boolean', '1', 'Fatturazione', NULL, NULL);
-- Aggiunto task invio mail -- Aggiunto task invio mail
INSERT INTO `zz_tasks` (`id`, `name`, `class`, `expression`, `next_execution_at`, `last_executed_at`) VALUES (NULL, 'Invio automatico mail', 'Modules\\Emails\\EmailTask', '*/1 * * * *', NULL, NULL); INSERT INTO `zz_tasks` (`id`, `name`, `class`, `expression`, `next_execution_at`, `last_executed_at`) VALUES (NULL, 'Invio automatico mail', 'Modules\\Emails\\EmailTask', '*/1 * * * *', NULL, NULL);