getConnection(); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // --- Permessi: stessa autorizzazione della programmazione --- if (!userCan('production.programming.view')) { if (isset($_GET['action']) || isset($_POST['action'])) { MagoSalesStats::jsonOut(['success' => false, 'message' => 'Non hai i permessi per questa pagina']); } while (ob_get_level()) ob_end_clean(); http_response_code(403); echo '

Accesso non consentito

Non hai i permessi per visualizzare questa pagina.

Torna alla Dashboard
'; exit; } // chi importa (per la tracciabilità): nome dell'utente collegato $userName = ''; if (!empty($iduserlogin)) { try { $st = $pdo->prepare("SELECT COALESCE(NULLIF(TRIM(CONCAT_WS(' ', first_name, last_name)), ''), username, email) FROM auth_users WHERE id = ?"); $st->execute([(int)$iduserlogin]); $userName = (string)$st->fetchColumn(); } catch (Throwable $e) { $userName = 'utente ' . $iduserlogin; } } /* ============================================================ * AJAX * ============================================================ */ $action = $_POST['action'] ?? ($_GET['action'] ?? ''); if ($action !== '') { try { // liste per i menu a tendina (una volta sola) if ($action === 'options') { MagoSalesStats::jsonOut([ 'success' => true, 'matrici' => $pdo->query("SELECT id, TRIM(nome) AS nome FROM matrice WHERE TRIM(nome) <> '' ORDER BY TRIM(nome)")->fetchAll(PDO::FETCH_ASSOC), 'linee' => $pdo->query("SELECT id, name FROM production_lines ORDER BY line_number")->fetchAll(PDO::FETCH_ASSOC), 'mescole' => $pdo->query("SELECT id, nome FROM mescole WHERE is_active = 1 ORDER BY nome")->fetchAll(PDO::FETCH_ASSOC), 'from' => MagoProduction::QUEUE_FROM_DATE, 'auto' => MagoProduction::AUTO_IMPORT, ]); } // elenco della coda if ($action === 'list') { $counts = ['nuovo' => 0, 'importato' => 0, 'scartato' => 0, 'chiuso_mago' => 0, 'modificati' => 0]; foreach ($pdo->query("SELECT queue_status, COUNT(*) n, SUM(mago_changed) ch FROM mago_prod_queue GROUP BY queue_status") as $r) { $counts[$r['queue_status']] = (int)$r['n']; if ($r['queue_status'] === 'importato') $counts['modificati'] = (int)$r['ch']; } $view = $_GET['view'] ?? 'nuovo'; $where = $view === 'modificati' ? "q.queue_status = 'importato' AND q.mago_changed = 1" : (in_array($view, ['nuovo', 'importato', 'scartato', 'chiuso_mago'], true) ? "q.queue_status = " . $pdo->quote($view) : "q.queue_status = 'nuovo'"); $rows = $pdo->query(" SELECT q.*, TRIM(m.nome) AS matrice_nome, p.id_status AS prod_status, s.nome AS prod_status_nome, COALESCE(s.badge_color, '#6c757d') AS prod_badge FROM mago_prod_queue q LEFT JOIN matrice m ON m.id = q.idmatrice LEFT JOIN productiondata p ON p.id = q.productiondata_id LEFT JOIN production_status s ON s.id = p.id_status WHERE $where ORDER BY q.zibo_date IS NULL, q.zibo_date, q.internal_ord_no, q.line_no LIMIT 3000 ")->fetchAll(PDO::FETCH_ASSOC); MagoSalesStats::jsonOut(['success' => true, 'counts' => $counts, 'rows' => $rows]); } // proposta di compilazione (anche al cambio matrice nella finestra) if ($action === 'prefill') { $idm = isset($_GET['idmatrice']) && $_GET['idmatrice'] !== '' ? (int)$_GET['idmatrice'] : null; $p = MagoProduction::prefill($pdo, (int)($_GET['id'] ?? 0), $idm); if (!$p) MagoSalesStats::jsonOut(['success' => false, 'message' => 'Riga non trovata']); MagoSalesStats::jsonOut(['success' => true, 'prefill' => $p]); } if ($_SERVER['REQUEST_METHOD'] !== 'POST') MagoSalesStats::jsonOut(['success' => false, 'message' => 'Richiesta non valida']); // porta una riga in programmazione if ($action === 'import') { $pid = MagoProduction::import($pdo, (int)$_POST['id'], [ 'idmatrice' => $_POST['idmatrice'] ?? 0, 'id_linea' => $_POST['id_linea'] ?? 0, 'mescole' => $_POST['mescole'] ?? [], 'metri' => $_POST['metri'] ?? 0, 'kg_sp' => $_POST['kg_sp'] ?? 0, 'kg_p' => $_POST['kg_p'] ?? 0, 'ore_previste' => $_POST['ore_previste'] ?? 0, 'data_zibo' => $_POST['data_zibo'] ?? null, 'data_cliente' => $_POST['data_cliente'] ?? null, 'note_extra' => $_POST['note_extra'] ?? '', 'id_status' => $_POST['id_status'] ?? MagoProduction::STATUS_DA_PROGRAMMARE, 'remember' => !empty($_POST['remember']), ], $userName); MagoSalesStats::jsonOut(['success' => true, 'productiondata_id' => $pid]); } // più righe insieme: solo quelle con matrice e linea già certe if ($action === 'bulk_import') { $ok = []; $skip = []; $status = (int)($_POST['id_status'] ?? MagoProduction::STATUS_DA_PROGRAMMARE); foreach ((array)($_POST['ids'] ?? []) as $id) { $p = MagoProduction::prefill($pdo, (int)$id); if (!$p) continue; $label = $p['queue']['internal_ord_no'] . ' riga ' . $p['queue']['line_no']; if (!$p['idmatrice']) { $skip[] = "$label: manca la matrice"; continue; } if (!$p['id_linea']) { $skip[] = "$label: la matrice ha " . (count($p['lines']) ? count($p['lines']) . ' linee possibili' : 'nessuna linea') . ', sceglila a mano'; continue; } try { $p['id_status'] = $status; $ok[] = MagoProduction::import($pdo, (int)$id, $p, $userName); } catch (Throwable $e) { $skip[] = $e->getMessage(); } } MagoSalesStats::jsonOut(['success' => true, 'imported' => count($ok), 'skipped' => $skip]); } if ($action === 'discard') { $pdo->prepare("UPDATE mago_prod_queue SET queue_status = 'scartato', discard_reason = ?, updated_at = NOW() WHERE id = ? AND queue_status = 'nuovo'") ->execute([mb_substr(trim((string)($_POST['reason'] ?? '')), 0, 255), (int)$_POST['id']]); MagoSalesStats::jsonOut(['success' => true]); } if ($action === 'restore') { $pdo->prepare("UPDATE mago_prod_queue SET queue_status = 'nuovo', discard_reason = '', updated_at = NOW() WHERE id = ? AND queue_status = 'scartato'") ->execute([(int)$_POST['id']]); MagoSalesStats::jsonOut(['success' => true]); } if ($action === 'ack') { $pdo->prepare("UPDATE mago_prod_queue SET mago_changed = 0, updated_at = NOW() WHERE id = ?")->execute([(int)$_POST['id']]); MagoSalesStats::jsonOut(['success' => true]); } if ($action === 'refresh') { MagoSalesStats::jsonOut(['success' => true, 'report' => MagoProduction::refreshQueue($pdo)]); } MagoSalesStats::jsonOut(['success' => false, 'message' => 'Azione sconosciuta']); } catch (Throwable $e) { MagoSalesStats::jsonOut(['success' => false, 'message' => $e->getMessage()]); } } ?> Nuovi da Mago - <?= htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?>
Nuovi ordini da Mago
Righe d'ordine da portare in programmazione
Programmazione
Nuovi
—
da portare in programmazione
Modificati in Mago
—
già in produzione, cambiati dopo
In programmazione
—
già portati in produzione
Scartati
—
da non produrre
Chiusi in Mago
—
consegnati o annullati prima
0 righe selezionate verranno portate solo quelle con matrice collegata e linea unica