114 lines
5.5 KiB
PHP
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()]);
|
|
}
|