Files
zibo-dashboard/public/userarea/mescole_nomi_acquisto.php
2026-10-27 11:50:50 +01:00

114 lines
5.5 KiB
PHP

<?php
/**
* Nomi d'acquisto (Mago) delle mescole — tabella mescole_supplier_names.
*
* GET ?action=list&id=ID nomi della mescola con kg acquistati, prezzo €/kg della mescola
* GET ?action=unmatched descrizioni d'acquisto Mago non abbinate a nessuna mescola
* GET ?action=options mescole e fornitori per le tendine
* POST action=save (id) idmescola, idsupplier, name
* POST action=delete id
*/
require_once __DIR__ . '/include/headscript.php';
require_once __DIR__ . '/class/MagoClient.php';
require_once __DIR__ . '/class/MagoMixPurchases.php';
header('Content-Type: application/json; charset=utf-8');
function nm_out(array $d)
{
echo json_encode($d, JSON_UNESCAPED_UNICODE);
exit;
}
try {
$pdo = DBHandlerSelect::getInstance()->getConnection();
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$action = $_GET['action'] ?? $_POST['action'] ?? '';
/* ---------------- elenco nomi di una mescola ---------------- */
if ($action === 'list') {
$id = (int)($_GET['id'] ?? 0);
$st = $pdo->prepare("SELECT sn.id, sn.idsupplier, sn.supplier_mix_name, sn.note, s.supplier_name
FROM mescole_supplier_names sn LEFT JOIN suppliers s ON s.idsupplier = sn.idsupplier
WHERE sn.idmescola = ? ORDER BY s.supplier_name, sn.supplier_mix_name");
$st->execute([$id]);
$rows = $st->fetchAll(PDO::FETCH_ASSOC);
$lines = MagoMixPurchases::lines($pdo);
$stats = MagoMixPurchases::nameStats($pdo, $id, $lines);
foreach ($rows as &$r) {
$s = $stats[(int)$r['id']] ?? null;
$r['n'] = $s['n'] ?? 0;
$r['kg'] = $s ? round($s['kg'], 1) : 0;
$r['last_price'] = $s && $s['last_price'] !== null ? round($s['last_price'], 4) : null;
$r['last_date'] = $s['last_date'] ?? null;
$r['last_desc'] = $s['last_desc'] ?? null;
}
unset($r);
$prices = MagoMixPurchases::prices($pdo, MagoMixPurchases::PRICE_MONTHS, $lines);
nm_out(['success' => true, 'rows' => $rows, 'price' => $prices[$id] ?? null, 'months' => MagoMixPurchases::PRICE_MONTHS]);
}
/* ---------------- descrizioni non abbinate ---------------- */
if ($action === 'unmatched') {
$rows = MagoMixPurchases::unmatched($pdo);
$codes = $pdo->query("SELECT mago_code, idsupplier FROM suppliers WHERE mago_code IS NOT NULL AND mago_code <> ''")->fetchAll(PDO::FETCH_KEY_PAIR);
foreach ($rows as &$r) $r['idsupplier'] = $codes[$r['supplier_code']] ?? null;
unset($r);
$dups = [];
foreach (MagoMixPurchases::duplicateNames($pdo) as $k => $m) $dups[] = ['name' => $k, 'mescole' => array_values($m)];
$last = $pdo->query("SELECT MAX(synced_at) FROM mago_mix_purchases")->fetchColumn();
nm_out(['success' => true, 'rows' => $rows, 'synced_at' => $last, 'duplicates' => $dups]);
}
/* ---------------- tendine ---------------- */
if ($action === 'options') {
nm_out([
'success' => true,
'mescole' => $pdo->query("SELECT id, nome, nomeuscita FROM mescole WHERE is_active = 1 ORDER BY nome")->fetchAll(PDO::FETCH_ASSOC),
'suppliers' => $pdo->query("SELECT idsupplier, supplier_name, mago_code FROM suppliers ORDER BY supplier_name")->fetchAll(PDO::FETCH_ASSOC),
]);
}
if ($_SERVER['REQUEST_METHOD'] !== 'POST') nm_out(['success' => false, 'message' => 'Azione non valida']);
/* ---------------- salva ---------------- */
if ($action === 'save') {
$id = (int)($_POST['id'] ?? 0);
$idm = (int)($_POST['idmescola'] ?? 0);
$ids = (int)($_POST['idsupplier'] ?? 0);
$name = trim(preg_replace('/\s+/', ' ', (string)($_POST['name'] ?? '')));
if (!$idm || !$ids || $name === '') nm_out(['success' => false, 'message' => 'Mescola, fornitore e nome sono obbligatori']);
$tok = MagoMixPurchases::tokens($name);
if (!$tok) nm_out(['success' => false, 'message' => 'Il nome non contiene parole utili (es. solo "MESCOLA" o "STRISCIA")']);
// stesso nome (stesse parole) già su un'altra mescola?
foreach (MagoMixPurchases::names($pdo) as $n) {
if ((int)$n['id'] === $id || (int)$n['idmescola'] === $idm) continue;
if ($n['tokens'] == $tok) {
nm_out(['success' => false, 'message' => "Questo nome è già usato per la mescola \"{$n['mescola']}\". Toglilo da lì prima, oppure scrivi un nome più preciso."]);
}
}
if ($id) {
$st = $pdo->prepare("UPDATE mescole_supplier_names SET idsupplier = ?, supplier_mix_name = ? WHERE id = ? AND idmescola = ?");
$st->execute([$ids, $name, $id, $idm]);
} else {
$st = $pdo->prepare("INSERT IGNORE INTO mescole_supplier_names (idmescola, idsupplier, supplier_mix_name, is_preferred) VALUES (?, ?, ?, 0)");
$st->execute([$idm, $ids, $name]);
if (!$st->rowCount()) nm_out(['success' => false, 'message' => 'Questo nome c\'è già per la mescola e il fornitore']);
}
nm_out(['success' => true]);
}
/* ---------------- elimina ---------------- */
if ($action === 'delete') {
$st = $pdo->prepare("DELETE FROM mescole_supplier_names WHERE id = ?");
$st->execute([(int)($_POST['id'] ?? 0)]);
nm_out(['success' => true]);
}
nm_out(['success' => false, 'message' => 'Azione non valida']);
} catch (Throwable $e) {
nm_out(['success' => false, 'message' => $e->getMessage()]);
}