Skip to content

Commit 3391c9c

Browse files
feat: gestione range quantità nei listini cliente
1 parent 6e938ee commit 3391c9c

9 files changed

Lines changed: 326 additions & 54 deletions

File tree

include/common/articolo.php

Lines changed: 82 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -236,19 +236,30 @@ function getPrezzoPerQuantita(qta) {
236236
/**
237237
* Restituisce il prezzo del listino registrato per l\'articolo-anagrafica.
238238
*/
239-
function getPrezzoListino() {
239+
function getPrezzoListino(qta = null) {
240240
const data = globals.aggiunta_articolo.dettagli;
241241
if (!data) return null;
242242
243-
let dettaglio_listino = null;
243+
let dettaglio_predefinito = null;
244+
let dettaglio_selezionato = null;
244245
for (const dettaglio of data) {
245246
if (dettaglio.prezzo_unitario_listino != null) {
246-
dettaglio_listino = dettaglio;
247-
continue;
247+
if (dettaglio.minimo == null && dettaglio.massimo == null) {
248+
dettaglio_predefinito = dettaglio;
249+
continue;
250+
}
251+
252+
if (qta != null && qta >= dettaglio.minimo && qta <= dettaglio.massimo) {
253+
dettaglio_selezionato = dettaglio;
254+
}
248255
}
249256
}
250257
251-
return dettaglio_listino ? parseFloat(dettaglio_listino.prezzo_unitario_listino) : 0;
258+
if (dettaglio_selezionato == null) {
259+
dettaglio_selezionato = dettaglio_predefinito;
260+
}
261+
262+
return dettaglio_selezionato ? parseFloat(dettaglio_selezionato.prezzo_unitario_listino) : 0;
252263
}
253264
254265
/**
@@ -290,7 +301,7 @@ function getPrezzoUltimo() {
290301
/**
291302
* Restituisce i prezzi dei listini sempre visibili registrati per l\'articolo.
292303
*/
293-
function getPrezziListinoVisibili(nome = "") {
304+
function getPrezziListinoVisibili(nome = "", qta = null) {
294305
const data = globals.aggiunta_articolo.dettagli;
295306
if (!data) return null;
296307
@@ -299,7 +310,25 @@ function getPrezziListinoVisibili(nome = "") {
299310
if (dettaglio.prezzo_unitario_listino_visibile != null) {
300311
if (nome != "") {
301312
if (dettaglio.nome == nome) {
302-
dettaglio_prezzi_visibili = parseFloat(dettaglio.prezzo_unitario_listino_visibile);
313+
if (qta != null) {
314+
// Cerca il dettaglio appropriato per la quantità specificata
315+
let dettaglio_predefinito = null;
316+
let dettaglio_selezionato = null;
317+
for (const d of data) {
318+
if (d.prezzo_unitario_listino_visibile != null && d.nome == nome) {
319+
if (d.minimo == null && d.massimo == null) {
320+
dettaglio_predefinito = d;
321+
continue;
322+
}
323+
if (qta >= d.minimo && qta <= d.massimo) {
324+
dettaglio_selezionato = d;
325+
}
326+
}
327+
}
328+
dettaglio_prezzi_visibili = parseFloat((dettaglio_selezionato || dettaglio_predefinito).prezzo_unitario_listino_visibile);
329+
} else {
330+
dettaglio_prezzi_visibili = parseFloat(dettaglio.prezzo_unitario_listino_visibile);
331+
}
303332
continue;
304333
}
305334
} else {
@@ -314,37 +343,59 @@ function getPrezziListinoVisibili(nome = "") {
314343
/**
315344
* Restituisce lo sconto registrato del listino registrato per l\'articolo-anagrafica.
316345
*/
317-
function getScontoListino() {
346+
function getScontoListino(qta = null) {
318347
const data = globals.aggiunta_articolo.dettagli;
319348
if (!data) return null;
320349
321-
let dettaglio_listino = null;
350+
let dettaglio_predefinito = null;
351+
let dettaglio_selezionato = null;
322352
for (const dettaglio of data) {
323353
if (dettaglio.sconto_percentuale_listino != null) {
324-
dettaglio_listino = dettaglio;
325-
continue;
354+
if (dettaglio.minimo == null && dettaglio.massimo == null) {
355+
dettaglio_predefinito = dettaglio;
356+
continue;
357+
}
358+
359+
if (qta != null && qta >= dettaglio.minimo && qta <= dettaglio.massimo) {
360+
dettaglio_selezionato = dettaglio;
361+
}
326362
}
327363
}
328364
329-
return dettaglio_listino ? parseFloat(dettaglio_listino.sconto_percentuale_listino) : 0;
365+
if (dettaglio_selezionato == null) {
366+
dettaglio_selezionato = dettaglio_predefinito;
367+
}
368+
369+
return dettaglio_selezionato ? parseFloat(dettaglio_selezionato.sconto_percentuale_listino) : 0;
330370
}
331371
332372
/**
333373
* Restituisce lo sconto registrato del listino sempre visibile dell\'articolo.
334374
*/
335-
function getScontoListinoVisibile(nome) {
375+
function getScontoListinoVisibile(nome, qta = null) {
336376
const data = globals.aggiunta_articolo.dettagli;
337377
if (!data) return null;
338378
339-
let dettaglio_listino_visibile = null;
379+
let dettaglio_predefinito = null;
380+
let dettaglio_selezionato = null;
340381
for (const dettaglio of data) {
341382
if (dettaglio.nome == nome) {
342-
dettaglio_listino_visibile = dettaglio;
343-
continue;
383+
if (dettaglio.minimo == null && dettaglio.massimo == null) {
384+
dettaglio_predefinito = dettaglio;
385+
continue;
386+
}
387+
388+
if (qta != null && qta >= dettaglio.minimo && qta <= dettaglio.massimo) {
389+
dettaglio_selezionato = dettaglio;
390+
}
344391
}
345392
}
346393
347-
return dettaglio_listino_visibile ? parseFloat(dettaglio_listino_visibile.sconto_percentuale_listino_visibile) : 0;
394+
if (dettaglio_selezionato == null) {
395+
dettaglio_selezionato = dettaglio_predefinito;
396+
}
397+
398+
return dettaglio_selezionato ? parseFloat(dettaglio_selezionato.sconto_percentuale_listino_visibile) : 0;
348399
}
349400
350401
/**
@@ -381,11 +432,11 @@ function verificaPrezzoArticolo() {
381432
382433
let qta = $("#qta").val().toEnglish();
383434
let prezzo_anagrafica = getPrezzoPerQuantita(qta);
384-
let prezzo_listino = getPrezzoListino();
435+
let prezzo_listino = getPrezzoListino(qta);
385436
let prezzo_std = getPrezzoScheda();
386437
let prezzo_last = getPrezzoUltimo();
387438
let prezzo_minimo = parseFloat($("#idarticolo").selectData().minimo_vendita);
388-
let prezzi_visibili = getPrezziListinoVisibili();
439+
let prezzi_visibili = getPrezziListinoVisibili("", qta);
389440
390441
if (prezzo_anagrafica || prezzo_listino || prezzo_std || prezzo_last || prezzo_minimo || prezzi_visibili) {
391442
div.html(`<table class="table table-extra-condensed table-prezzi" style="background:#eee; margin-top:-13px;"><tbody>`);
@@ -479,20 +530,20 @@ function verificaScontoArticolo() {
479530
let prezzo_unitario_input = $("#prezzo_unitario");
480531
let prezzo_unitario = prezzo_unitario_input.val().toEnglish();
481532
let prezzo_anagrafica = getPrezzoPerQuantita(qta);
482-
let prezzo_listino = getPrezzoListino();
483-
let prezzi_visibili = getPrezziListinoVisibili();
533+
let prezzo_listino = getPrezzoListino(qta);
534+
let prezzi_visibili = getPrezziListinoVisibili("", qta);
484535
let sconto_previsto = 0;
485536
486537
487538
if (prezzo_unitario == prezzo_anagrafica.toFixed(2)) {
488539
sconto_previsto = getScontoPerQuantita(qta);
489540
} else if (prezzo_unitario == prezzo_listino.toFixed(2)) {
490-
sconto_previsto = getScontoListino();
541+
sconto_previsto = getScontoListino(qta);
491542
} else {
492543
for (const prezzo_visibile of prezzi_visibili) {
493544
let prezzo_listino_visibile = parseFloat(prezzo_visibile.prezzo_unitario_listino_visibile);
494545
if (prezzo_unitario == prezzo_listino_visibile.toFixed(2)) {
495-
sconto_previsto = getScontoListinoVisibile(prezzo_visibile.nome);
546+
sconto_previsto = getScontoListinoVisibile(prezzo_visibile.nome, qta);
496547
}
497548
}
498549
}
@@ -517,10 +568,10 @@ function verificaScontoArticolo() {
517568
*/
518569
function aggiornaPrezzoArticolo(aggiorna = "") {
519570
let prezzo_previsto = 0;
571+
let qta = $("#qta").val().toEnglish();
520572
if (aggiorna == "listino") {
521-
prezzo_previsto = getPrezzoListino();
573+
prezzo_previsto = getPrezzoListino(qta);
522574
} else if (aggiorna == "anagrafica") {
523-
let qta = $("#qta").val().toEnglish();
524575
prezzo_previsto = getPrezzoPerQuantita(qta);
525576
} else if (aggiorna == "std") {
526577
prezzo_previsto = getPrezzoScheda();
@@ -529,12 +580,11 @@ function aggiornaPrezzoArticolo(aggiorna = "") {
529580
} else if (aggiorna == "minimo") {
530581
prezzo_previsto = parseFloat($("#idarticolo").selectData().minimo_vendita);
531582
} else if (aggiorna != "") {
532-
prezzo_previsto = getPrezziListinoVisibili(aggiorna);
583+
prezzo_previsto = getPrezziListinoVisibili(aggiorna, qta);
533584
} else {
534585
// Inserisco il prezzo più basso tra listino e netto cliente, se mancanti imposto il prezzo della scheda articolo
535-
let qta = $("#qta").val().toEnglish();
536586
prezzo1 = getPrezzoPerQuantita(qta);
537-
prezzo2 = getPrezzoListino();
587+
prezzo2 = getPrezzoListino(qta);
538588
prezzo3 = getPrezzoScheda();
539589
prezzo_previsto = (!prezzo1 ? prezzo2 : (!prezzo2 ? prezzo1 : (prezzo1 > prezzo2 ? prezzo2 : prezzo1)));
540590
prezzo_previsto = (prezzo_previsto ? prezzo_previsto : prezzo3);
@@ -557,20 +607,20 @@ function aggiornaScontoArticolo() {
557607
let prezzo_unitario_input = $("#prezzo_unitario");
558608
let prezzo_unitario = prezzo_unitario_input.val().toEnglish();
559609
let prezzo_anagrafica = getPrezzoPerQuantita(qta);
560-
let prezzo_listino = getPrezzoListino();
561-
let prezzi_visibili = getPrezziListinoVisibili();
610+
let prezzo_listino = getPrezzoListino(qta);
611+
let prezzi_visibili = getPrezziListinoVisibili("", qta);
562612
let sconto_previsto = 0;
563613
564614
565615
if (prezzo_unitario == prezzo_anagrafica.toFixed(2)) {
566616
sconto_previsto = getScontoPerQuantita(qta);
567617
} else if (prezzo_unitario == prezzo_listino.toFixed(2)) {
568-
sconto_previsto = getScontoListino();
618+
sconto_previsto = getScontoListino(qta);
569619
} else {
570620
for (const prezzo_visibile of prezzi_visibili) {
571621
let prezzo_listino_visibile = parseFloat(prezzo_visibile.prezzo_unitario_listino_visibile);
572622
if (prezzo_unitario == prezzo_listino_visibile.toFixed(2)) {
573-
sconto_previsto = getScontoListinoVisibile(prezzo_visibile.nome);
623+
sconto_previsto = getScontoListinoVisibile(prezzo_visibile.nome, qta);
574624
}
575625
}
576626
}

lib/common.php

Lines changed: 61 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -301,21 +301,22 @@ function getPrezzoConsigliato($id_anagrafica, $direzione, $id_articolo, $riga =
301301
$prezzi = database()->fetchArray($query);
302302

303303
// Prezzi listini clienti
304-
$query = 'SELECT sconto_percentuale AS sconto_percentuale_listino,
304+
$query = 'SELECT minimo, massimo,
305+
sconto_percentuale AS sconto_percentuale_listino,
305306
'.($prezzi_ivati ? 'prezzo_unitario_ivato' : 'prezzo_unitario').' AS prezzo_unitario_listino
306307
FROM mg_listini
307308
LEFT JOIN mg_listini_articoli ON mg_listini.id=mg_listini_articoli.id_listino
308309
LEFT JOIN an_anagrafiche ON mg_listini.id=an_anagrafiche.id_listino
309-
WHERE mg_listini.data_attivazione<=NOW()
310+
WHERE mg_listini.data_attivazione<=NOW()
310311
AND (mg_listini_articoli.data_scadenza>=NOW() OR (mg_listini_articoli.data_scadenza IS NULL AND mg_listini.data_scadenza_predefinita>=NOW()))
311312
AND mg_listini.attivo=1
312313
AND id_articolo = '.prepare($id_articolo).'
313314
AND dir = '.prepare($direzione).'
314315
AND idanagrafica = '.prepare($id_anagrafica);
315-
$listino = database()->fetchOne($query);
316+
$listini = database()->fetchArray($query);
316317

317318
// Prezzi listini clienti sempre visibili
318-
$query = 'SELECT mg_listini.nome, sconto_percentuale AS sconto_percentuale_listino_visibile,
319+
$query = 'SELECT mg_listini.nome, minimo, massimo, sconto_percentuale AS sconto_percentuale_listino_visibile,
319320
'.($prezzi_ivati ? 'prezzo_unitario_ivato' : 'prezzo_unitario').' AS prezzo_unitario_listino_visibile
320321
FROM mg_listini
321322
LEFT JOIN mg_listini_articoli ON mg_listini.id=mg_listini_articoli.id_listino
@@ -343,16 +344,64 @@ function getPrezzoConsigliato($id_anagrafica, $direzione, $id_articolo, $riga =
343344
}
344345
}
345346
}
346-
if ($listino) {
347-
$show_notifica_prezzo = $listino['prezzo_unitario_listino'] != $prezzo_unitario_corrente ? true : $show_notifica_prezzo;
348-
$show_notifica_sconto = $listino['sconto_percentuale_listino'] != $sconto_percentuale_corrente ? true : $show_notifica_sconto;
349-
$prezzo_unitario = $listino['prezzo_unitario_listino'];
350-
$sconto = $listino['sconto_percentuale_listino'];
347+
// Gestione listini con logica minimo/massimo
348+
$listino_predefinito = null;
349+
$listino_selezionato = null;
350+
if ($listini) {
351+
foreach ($listini as $listino_item) {
352+
if ($listino_item['minimo'] == null && $listino_item['massimo'] == null && $listino_item['prezzo_unitario_listino'] != null) {
353+
$listino_predefinito = $listino_item;
354+
continue;
355+
}
356+
357+
if ($qta >= $listino_item['minimo'] && $qta <= $listino_item['massimo']) {
358+
$listino_selezionato = $listino_item;
359+
}
360+
}
361+
362+
$listino = $listino_selezionato ?: $listino_predefinito;
363+
364+
if ($listino) {
365+
$show_notifica_prezzo = $listino['prezzo_unitario_listino'] != $prezzo_unitario_corrente ? true : $show_notifica_prezzo;
366+
$show_notifica_sconto = $listino['sconto_percentuale_listino'] != $sconto_percentuale_corrente ? true : $show_notifica_sconto;
367+
$prezzo_unitario = $listino['prezzo_unitario_listino'];
368+
$sconto = $listino['sconto_percentuale_listino'];
369+
}
351370
}
371+
372+
// Gestione listini sempre visibili con logica minimo/massimo
352373
if ($listini_sempre_visibili) {
353-
foreach ($listini_sempre_visibili as $listino_sempre_visibile) {
354-
$show_notifica_prezzo = $listino_sempre_visibile['prezzo_unitario_listino_visibile'] != $prezzo_unitario_corrente ? true : $show_notifica_prezzo;
355-
$show_notifica_sconto = $listino_sempre_visibile['sconto_percentuale_listino_visibile'] != $sconto_percentuale_corrente ? true : $show_notifica_sconto;
374+
// Raggruppa i listini sempre visibili per nome
375+
$listini_visibili_per_nome = [];
376+
foreach ($listini_sempre_visibili as $listino_visibile) {
377+
$nome = $listino_visibile['nome'];
378+
if (!isset($listini_visibili_per_nome[$nome])) {
379+
$listini_visibili_per_nome[$nome] = [];
380+
}
381+
$listini_visibili_per_nome[$nome][] = $listino_visibile;
382+
}
383+
384+
// Per ogni nome, seleziona il listino appropriato per la quantità
385+
foreach ($listini_visibili_per_nome as $nome => $listini_con_stesso_nome) {
386+
$listino_predefinito_visibile = null;
387+
$listino_selezionato_visibile = null;
388+
foreach ($listini_con_stesso_nome as $listino_visibile) {
389+
if ($listino_visibile['minimo'] == null && $listino_visibile['massimo'] == null && $listino_visibile['prezzo_unitario_listino_visibile'] != null) {
390+
$listino_predefinito_visibile = $listino_visibile;
391+
continue;
392+
}
393+
394+
if ($qta >= $listino_visibile['minimo'] && $qta <= $listino_visibile['massimo']) {
395+
$listino_selezionato_visibile = $listino_visibile;
396+
}
397+
}
398+
399+
$listino_visibile_selezionato = $listino_selezionato_visibile ?: $listino_predefinito_visibile;
400+
401+
if ($listino_visibile_selezionato) {
402+
$show_notifica_prezzo = $listino_visibile_selezionato['prezzo_unitario_listino_visibile'] != $prezzo_unitario_corrente ? true : $show_notifica_prezzo;
403+
$show_notifica_sconto = $listino_visibile_selezionato['sconto_percentuale_listino_visibile'] != $sconto_percentuale_corrente ? true : $show_notifica_sconto;
404+
}
356405
}
357406
}
358407

modules/articoli/ajax/complete.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,8 @@
255255
$prezzi = $database->fetchArray($query_anagrafica);
256256

257257
// Prezzi listini clienti
258-
$query = 'SELECT sconto_percentuale AS sconto_percentuale_listino,
258+
$query = 'SELECT minimo, massimo,
259+
sconto_percentuale AS sconto_percentuale_listino,
259260
'.($prezzi_ivati ? 'prezzo_unitario_ivato' : 'prezzo_unitario').' AS prezzo_unitario_listino
260261
FROM mg_listini
261262
LEFT JOIN mg_listini_articoli ON mg_listini.id=mg_listini_articoli.id_listino
@@ -265,11 +266,13 @@
265266
AND mg_listini.attivo=1
266267
AND id_articolo = '.prepare($id_articolo).'
267268
AND dir = '.prepare($direzione).'
268-
AND idanagrafica = '.prepare($id_anagrafica);
269+
AND idanagrafica = '.prepare($id_anagrafica).'
270+
ORDER BY minimo ASC, massimo DESC';
269271
$listino = $database->fetchArray($query);
270272

271273
// Prezzi listini clienti sempre visibili
272-
$query = 'SELECT mg_listini.nome, sconto_percentuale AS sconto_percentuale_listino_visibile,
274+
$query = 'SELECT minimo, massimo,
275+
mg_listini.nome, sconto_percentuale AS sconto_percentuale_listino_visibile,
273276
'.($prezzi_ivati ? 'prezzo_unitario_ivato' : 'prezzo_unitario').' AS prezzo_unitario_listino_visibile
274277
FROM mg_listini
275278
LEFT JOIN mg_listini_articoli ON mg_listini.id=mg_listini_articoli.id_listino
@@ -278,7 +281,8 @@
278281
AND mg_listini.attivo=1
279282
AND mg_listini.is_sempre_visibile=1
280283
AND id_articolo = '.prepare($id_articolo).'
281-
AND dir = '.prepare($direzione);
284+
AND dir = '.prepare($direzione).'
285+
ORDER BY minimo ASC, massimo DESC';
282286
$listini_sempre_visibili = $database->fetchArray($query);
283287

284288
// Prezzi scheda articolo

0 commit comments

Comments
 (0)