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()]); }