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 '
|
||||
<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="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
|
||||
if ($module['name'] == 'Interventi') {
|
||||
|
@ -302,6 +303,30 @@ function getPrezzoUltimo() {
|
|||
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.
|
||||
*/
|
||||
|
@ -320,6 +345,24 @@ function getScontoListino() {
|
|||
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.
|
||||
*/
|
||||
|
@ -357,8 +400,10 @@ function verificaPrezzoArticolo() {
|
|||
let prezzo_listino = getPrezzoListino();
|
||||
let prezzo_std = getPrezzoScheda();
|
||||
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>`);
|
||||
}
|
||||
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>`);
|
||||
}
|
||||
}
|
||||
|
@ -423,6 +495,7 @@ function verificaScontoArticolo() {
|
|||
let prezzo_unitario = prezzo_unitario_input.val().toEnglish();
|
||||
let prezzo_anagrafica = getPrezzoPerQuantita(qta);
|
||||
let prezzo_listino = getPrezzoListino();
|
||||
let prezzi_visibili = getPrezziListinoVisibili();
|
||||
let sconto_previsto = 0;
|
||||
|
||||
|
||||
|
@ -431,6 +504,13 @@ function verificaScontoArticolo() {
|
|||
sconto_previsto = getScontoPerQuantita(qta);
|
||||
} else if (prezzo_unitario == prezzo_listino.toFixed(2)) {
|
||||
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");
|
||||
|
@ -462,6 +542,10 @@ function aggiornaPrezzoArticolo(aggiorna = "") {
|
|||
prezzo_previsto = getPrezzoScheda();
|
||||
} else if (aggiorna == "last") {
|
||||
prezzo_previsto = getPrezzoUltimo();
|
||||
} else if (aggiorna == "minimo") {
|
||||
prezzo_previsto = parseFloat($("#idarticolo").selectData().minimo_vendita);
|
||||
} else if (aggiorna != "") {
|
||||
prezzo_previsto = getPrezziListinoVisibili(aggiorna);
|
||||
} else {
|
||||
let qta = $("#qta").val().toEnglish();
|
||||
prezzo1 = getPrezzoPerQuantita(qta);
|
||||
|
@ -485,6 +569,7 @@ function aggiornaScontoArticolo() {
|
|||
let prezzo_unitario = prezzo_unitario_input.val().toEnglish();
|
||||
let prezzo_anagrafica = getPrezzoPerQuantita(qta);
|
||||
let prezzo_listino = getPrezzoListino();
|
||||
let prezzi_visibili = getPrezziListinoVisibili();
|
||||
let sconto_previsto = 0;
|
||||
|
||||
|
||||
|
@ -493,6 +578,13 @@ function aggiornaScontoArticolo() {
|
|||
sconto_previsto = getScontoPerQuantita(qta);
|
||||
} else if (prezzo_unitario == prezzo_listino.toFixed(2)) {
|
||||
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");
|
||||
|
@ -535,8 +627,16 @@ function verificaMinimoVendita() {
|
|||
|
||||
let div = $(".minimo_vendita");
|
||||
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) {
|
||||
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 {
|
||||
div.html("");
|
||||
}
|
||||
|
|
|
@ -131,32 +131,39 @@ switch ($resource) {
|
|||
|
||||
$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA');
|
||||
|
||||
// Prezzi netti clienti / listino fornitore
|
||||
$query = 'SELECT minimo, massimo,
|
||||
sconto_percentuale,
|
||||
'.($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|
|
||||
ORDER BY minimo ASC, massimo DESC';
|
||||
|
||||
// Lettura dei prezzi relativi all'anagrafica
|
||||
$query_anagrafica = replace($query, [
|
||||
'|where|' => ' AND id_anagrafica = '.prepare($id_anagrafica),
|
||||
]);
|
||||
$prezzi = $database->fetchArray($query_anagrafica);
|
||||
|
||||
// Prezzi listini clienti
|
||||
$query = 'SELECT sconto_percentuale AS sconto_percentuale_listino,
|
||||
'.($prezzi_ivati ? 'prezzo_unitario_ivato' : 'prezzo_unitario').' AS prezzo_unitario_listino
|
||||
FROM mg_listini
|
||||
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
|
||||
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|';
|
||||
// Lettura dei prezzi relativi all'anagrafica
|
||||
WHERE mg_listini.data_attivazione<=NOW() AND mg_listini_articoli.data_scadenza>=NOW() AND id_articolo = '.prepare($id_articolo).' AND dir = '.prepare($direzione).' |where|';
|
||||
$query_anagrafica = replace($query, [
|
||||
'|where|' => ' AND idanagrafica = '.prepare($id_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') {
|
||||
$prezzo_articolo = $database->fetchArray('SELECT prezzo_acquisto AS prezzo_scheda FROM mg_articoli WHERE id = '.prepare($id_articolo));
|
||||
} else {
|
||||
|
@ -166,7 +173,7 @@ switch ($resource) {
|
|||
// 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');
|
||||
|
||||
$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);
|
||||
|
||||
|
|
|
@ -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_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
|
||||
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