Gestione prezzo minimo e listini visibili in add riga
This commit is contained in:
parent
07e8b5a0bc
commit
4bcebee6b4
|
@ -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("");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue