Skip to content

Commit 4170b4f

Browse files
committed
fix: evasione seriali nel caso di seriali senza documento di acquisto associato
1 parent e3bb031 commit 4170b4f

1 file changed

Lines changed: 36 additions & 23 deletions

File tree

modules/articoli/ajax/select.php

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -340,37 +340,50 @@
340340

341341
case 'serial-articolo':
342342
// Query per selezionare i serial disponibili in magazzino
343-
// Un serial è disponibile se l'ultimo movimento cronologico è dir='uscita' (articolo entrato in magazzino)
344-
$query = 'SELECT serial AS id, serial AS descrizione FROM mg_prodotti |where|';
343+
// Un serial è disponibile se il suo ultimo movimento cronologico ha dir='uscita'
344+
$data_movimento = "COALESCE(`co_documenti`.`data`, `dt_ddt`.`data`, `or_ordini`.`data`, '1000-01-01')";
345+
346+
$movimenti_seriali = 'SELECT
347+
`mg_prodotti`.`id`,
348+
`mg_prodotti`.`id_articolo`,
349+
`mg_prodotti`.`serial`,
350+
`mg_prodotti`.`dir`,
351+
'.$data_movimento.' AS `data_movimento`
352+
FROM `mg_prodotti`
353+
LEFT JOIN `co_righe_documenti` ON `mg_prodotti`.`id_riga_documento` = `co_righe_documenti`.`id`
354+
LEFT JOIN `co_documenti` ON `co_righe_documenti`.`iddocumento` = `co_documenti`.`id`
355+
LEFT JOIN `dt_righe_ddt` ON `mg_prodotti`.`id_riga_ddt` = `dt_righe_ddt`.`id`
356+
LEFT JOIN `dt_ddt` ON `dt_righe_ddt`.`idddt` = `dt_ddt`.`id`
357+
LEFT JOIN `or_righe_ordini` ON `mg_prodotti`.`id_riga_ordine` = `or_righe_ordini`.`id`
358+
LEFT JOIN `or_ordini` ON `or_righe_ordini`.`idordine` = `or_ordini`.`id`
359+
WHERE `mg_prodotti`.`serial` IS NOT NULL';
360+
361+
$query = 'SELECT `seriali_disponibili`.`serial` AS id, `seriali_disponibili`.`serial` AS descrizione
362+
FROM (
363+
SELECT
364+
`movimenti`.`id_articolo`,
365+
`movimenti`.`serial`,
366+
SUBSTRING_INDEX(GROUP_CONCAT(`movimenti`.`dir` ORDER BY `movimenti`.`data_movimento` DESC, `movimenti`.`id` DESC), ",", 1) AS `ultimo_dir`
367+
FROM ('.$movimenti_seriali.') AS `movimenti`
368+
GROUP BY `movimenti`.`id_articolo`, `movimenti`.`serial`
369+
) AS `seriali_disponibili`
370+
|where|
371+
ORDER BY `seriali_disponibili`.`serial` ASC';
345372

346373
foreach ($elements as $element) {
347-
$filter[] = 'serial='.prepare($element);
374+
$filter[] = '`seriali_disponibili`.`serial`='.prepare($element);
348375
}
349376

377+
$where[] = '`seriali_disponibili`.`id_articolo`='.prepare($superselect['idarticolo']);
378+
350379
if (!empty($filter)) {
351-
$query .= ' OR (('.implode(' OR ', $filter).') AND mg_prodotti.dir=\'entrata\')';
380+
$where[] = '(`seriali_disponibili`.`ultimo_dir`=\'uscita\' OR ('.implode(' OR ', $filter).'))';
381+
} else {
382+
$where[] = '`seriali_disponibili`.`ultimo_dir`=\'uscita\'';
352383
}
353384

354-
$where[] = 'mg_prodotti.id_articolo='.prepare($superselect['idarticolo']);
355-
$where[] = 'mg_prodotti.dir=\'uscita\'';
356-
357-
$where[] = 'mg_prodotti.id = (
358-
SELECT m.id
359-
FROM mg_prodotti AS m
360-
LEFT JOIN co_righe_documenti rd ON rd.id = m.id_riga_documento
361-
LEFT JOIN co_documenti doc ON doc.id = rd.iddocumento
362-
LEFT JOIN dt_righe_ddt rdt ON rdt.id = m.id_riga_ddt
363-
LEFT JOIN dt_ddt ddt ON ddt.id = rdt.idddt
364-
LEFT JOIN or_righe_ordini ro ON ro.id = m.id_riga_ordine
365-
LEFT JOIN or_ordini ord ON ord.id = ro.idordine
366-
WHERE m.id_articolo = mg_prodotti.id_articolo
367-
AND m.serial = mg_prodotti.serial
368-
ORDER BY COALESCE(doc.data, ddt.data, ord.data, m.created_at) DESC, m.id DESC
369-
LIMIT 1
370-
)';
371-
372385
if (!empty($search)) {
373-
$search_fields[] = '`mg_prodotti`.`serial` LIKE '.prepare('%'.$search.'%');
386+
$search_fields[] = '`seriali_disponibili`.`serial` LIKE '.prepare('%'.$search.'%');
374387
}
375388

376389
break;

0 commit comments

Comments
 (0)