getConnection(); // --- LISTE LINEE --- $linee = $pdo->query("SELECT id, name, color FROM production_lines ORDER BY line_number")->fetchAll(); // --- STATUS DINAMICI --- $statusProgrammato = $pdo->query("SELECT id, nome, badge_color, line_color FROM production_status WHERE id = 6 LIMIT 1")->fetch(); $statusProduzione = $pdo->query("SELECT id, nome, badge_color, line_color FROM production_status WHERE id = 2 LIMIT 1")->fetch(); $statusPausa = $pdo->query("SELECT id, nome, badge_color, line_color FROM production_status WHERE id = 7 LIMIT 1")->fetch(); $statusQualita = $pdo->query("SELECT id FROM production_status WHERE id = 3 LIMIT 1")->fetchColumn(); if (!$statusProgrammato || !$statusProduzione || !$statusPausa || !$statusQualita) { die("Errore: uno o più status non trovati in production_status"); } $statusProgrammatoId = $statusProgrammato['id']; $statusProduzioneId = $statusProduzione['id']; $statusPausaId = $statusPausa['id']; // --- PAUSE REASONS --- $pauseReasons = $pdo->query("SELECT id, name, is_problem FROM pause_reasons ORDER BY name")->fetchAll(); // --- AVVIO / RIPRESA PRODUZIONE --- if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['start_production'])) { $id = (int)$_POST['id']; try { // 1) Leggo stato attuale $sql = "SELECT id_status FROM productiondata WHERE id = :id LIMIT 1"; $stmt = $pdo->prepare($sql); $stmt->execute(['id' => $id]); $currentStatus = $stmt->fetchColumn(); if ($currentStatus === false) { echo json_encode(['success' => false, 'msg' => 'Record produzione non trovato.']); exit; } // 2) Primo avvio: da PROGRAMMATO (6) → PRODUZIONE (2) + set start_time if ((int)$currentStatus === (int)$statusProgrammatoId) { $sqlUpdate = "UPDATE productiondata SET id_status = :status, start_time = UTC_TIMESTAMP(), end_time = NULL WHERE id = :id AND id_status = :programmato"; $stmtUpdate = $pdo->prepare($sqlUpdate); $stmtUpdate->execute([ 'status' => $statusProduzioneId, 'id' => $id, 'programmato' => $statusProgrammatoId ]); // 3) Ripresa: da PAUSA (7) → PRODUZIONE (2) **senza toccare start_time** } elseif ((int)$currentStatus === (int)$statusPausaId) { $sqlUpdate = "UPDATE productiondata SET id_status = :status, end_time = NULL WHERE id = :id AND id_status = :pausa"; $stmtUpdate = $pdo->prepare($sqlUpdate); $stmtUpdate->execute([ 'status' => $statusProduzioneId, 'id' => $id, 'pausa' => $statusPausaId ]); } else { echo json_encode([ 'success' => false, 'msg' => 'Lo stato corrente non consente avvio/ripresa (stato id: ' . $currentStatus . ')' ]); exit; } echo json_encode(['success' => true]); } catch (Exception $e) { echo json_encode(['success' => false, 'msg' => $e->getMessage()]); } exit; } // --- PAUSA PRODUZIONE (crea record in production_pauses + cambia stato) --- // --- PAUSA PRODUZIONE (crea record in production_pauses + cambia stato) --- if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['pause_production'])) { $id = (int)$_POST['id']; $reasonId = isset($_POST['reason_id']) ? (int)$_POST['reason_id'] : 0; $note = trim($_POST['note'] ?? ''); try { if ($reasonId <= 0) { echo json_encode(['success' => false, 'msg' => 'Motivo pausa non valido.']); exit; } // Leggo se il motivo è "problema" oppure pausa normale $sql = "SELECT is_problem FROM pause_reasons WHERE id = :id LIMIT 1"; $stmt = $pdo->prepare($sql); $stmt->execute(['id' => $reasonId]); $isProblem = $stmt->fetchColumn(); if ($isProblem === false) { echo json_encode(['success' => false, 'msg' => 'Motivo pausa non trovato.']); exit; } $isProblem = (int)$isProblem; // ❌ PRIMA – sbagliato per la tua logica: // $nextStatus = $isProblem ? 8 : $statusPausaId; // 8 = Problema in produzione // ✅ ORA – in PAUSA lo stato è SEMPRE pausa (7) $nextStatus = $statusPausaId; // Aggiorno lo stato sulla produzione SOLO se è in produzione (id_status = produzione) $sql = "UPDATE productiondata SET id_status = :status, note_operatore = :note WHERE id = :id AND id_status = :produzione"; $stmtUpdate = $pdo->prepare($sql); $stmtUpdate->execute([ 'status' => $nextStatus, 'note' => $note ?: null, 'id' => $id, 'produzione' => $statusProduzioneId ]); // Se effettivamente ho cambiato lo stato, registro la pausa if ($stmtUpdate->rowCount() > 0) { $sqlPause = "INSERT INTO production_pauses (id_production, reason_id, start_pause, note) VALUES (:id_production, :reason_id, UTC_TIMESTAMP(), :note)"; $stmtPause = $pdo->prepare($sqlPause); $stmtPause->execute([ 'id_production' => $id, 'reason_id' => $reasonId, 'note' => $note ?: null ]); } echo json_encode(['success' => true]); } catch (Exception $e) { echo json_encode(['success' => false, 'msg' => $e->getMessage()]); } exit; } // --- STOP PRODUZIONE (vai a Qualità + salva tempo finale) --- if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['stop_production'])) { $id = (int)$_POST['id']; $reason = $_POST['reason'] ?? 'fine'; $note = trim($_POST['note'] ?? ''); try { $sql = "SELECT start_time, id_status FROM productiondata WHERE id = :id"; $stmt = $pdo->prepare($sql); $stmt->execute(['id' => $id]); $row = $stmt->fetch(); $seconds = 0; if ($row && $row['start_time'] && $row['id_status'] == $statusProduzioneId) { $start = new DateTime($row['start_time'], new DateTimeZone('UTC')); $now = new DateTime('now', new DateTimeZone('UTC')); $seconds = $now->getTimestamp() - $start->getTimestamp(); } // Stato di destinazione $nextStatus = ($reason === 'problema') ? 8 : $statusQualita; // 8 = Problema in produzione $sql = "UPDATE productiondata SET id_status = :status, end_time = UTC_TIMESTAMP(), note_operatore = :note WHERE id = :id AND id_status IN ($statusProduzioneId, $statusPausaId)"; $stmt = $pdo->prepare($sql); $stmt->execute([ 'status' => $nextStatus, 'seconds' => $seconds, 'note' => $note ?: null, 'id' => $id, 'produzione' => $statusProduzioneId, 'pausa' => $statusPausaId ]); echo json_encode(['success' => true]); } catch (Exception $e) { echo json_encode(['success' => false, 'msg' => $e->getMessage()]); } exit; } // --- SALVATAGGIO DATI FINE PRODUZIONE --- if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['save_final_data'])) { $id = (int)$_POST['id']; $kgprod = (float)$_POST['kgprod']; $mtprod = (float)$_POST['mtprod']; $scarto = (float)$_POST['scarto']; $note = trim($_POST['note'] ?? ''); $reason = $_POST['reason'] ?? 'fine'; try { // Recupero tempo totale già calcolato $sql = "SELECT tempo_totale_produzione FROM productiondata WHERE id = :id"; $stmt = $pdo->prepare($sql); $stmt->execute(['id' => $id]); $seconds = (int)$stmt->fetchColumn(); // Calcolo scarto % $totaleKg = $kgprod + $scarto; $scartoPerc = 0.00; if ($totaleKg > 0) { $scartoPerc = round(($scarto / $totaleKg) * 100, 2); } // Stato destinazione $nextStatus = ($reason === 'problema') ? 8 : $statusQualita; // Update finale $sql = "UPDATE productiondata SET kgprod = :kgprod, mtprod = :mtprod, scarto = :scarto, scarto_perc = :scarto_perc, note_operatore = :note, hourprod = SEC_TO_TIME(:seconds), id_status = :status, end_time = COALESCE(end_time, UTC_TIMESTAMP()) WHERE id = :id"; $stmt = $pdo->prepare($sql); $stmt->execute([ 'kgprod' => $kgprod, 'mtprod' => $mtprod, 'scarto' => $scarto, 'scarto_perc' => $scartoPerc, 'note' => $note, 'seconds' => $seconds, 'status' => $nextStatus, 'id' => $id ]); echo json_encode(['success' => true]); } catch (Exception $e) { echo json_encode(['success' => false, 'msg' => $e->getMessage()]); } exit; } // --- AJAX PRINCIPALE: carica i record della data selezionata --- if (!empty($_GET['ajax'])) { $lineRaw = $_GET['line'] ?? ''; $lineArray = $lineRaw !== '' ? explode(',', $lineRaw) : []; // --- RECORD IN PRODUZIONE (2,7,8) $sql = "SELECT p.*, m.nome AS matrice, ( SELECT GROUP_CONCAT(m.nome ORDER BY m.nome SEPARATOR ' | ') FROM productiondata_mescole pm JOIN mescole m ON m.id = pm.id_mescola WHERE pm.id_productiondata = p.id ) AS mescole_list, l.name AS linea, c.nome AS cliente, s.nome AS status_nome, s.badge_color, s.line_color, p.tempo_totale_produzione FROM productiondata p LEFT JOIN matrice m ON p.idmatrice = m.id LEFT JOIN production_lines l ON p.id_linea = l.id LEFT JOIN clients c ON p.id_cliente = c.id LEFT JOIN production_status s ON p.id_status = s.id WHERE p.id_status IN (2, 7, 8) " . (!empty($lineArray) ? " AND p.id_linea IN (" . implode(',', array_map('intval', $lineArray)) . ")" : "") . " ORDER BY l.line_number, p.Data"; $stmt = $pdo->prepare($sql); $stmt->execute(); $records = $stmt->fetchAll(); foreach ($records as $r) { // --- PARAMETRI LINEA (slot dinamici) $sqlParams = "SELECT position, short_label, icon FROM production_line_params WHERE line_id = :line ORDER BY position ASC"; $stmtP = $pdo->prepare($sqlParams); $stmtP->execute(['line' => $r['id_linea']]); $paramsLinea = $stmtP->fetchAll(); $r['param_slots'] = $paramsLinea; include __DIR__ . "/render_production_card.php"; } // --- RECORD IN STATO 6 ORDINATI PER PRIORITY $sql2 = "SELECT p.*, m.nome AS matrice, ( SELECT GROUP_CONCAT(m2.nome ORDER BY m2.nome SEPARATOR ' | ') FROM productiondata_mescole pm JOIN mescole m2 ON m2.id = pm.id_mescola WHERE pm.id_productiondata = p.id ) AS mescole_list, l.name AS linea, c.nome AS cliente, s.nome AS status_nome, s.badge_color, s.line_color, p.tempo_totale_produzione FROM productiondata p LEFT JOIN matrice m ON p.idmatrice = m.id LEFT JOIN production_lines l ON p.id_linea = l.id LEFT JOIN clients c ON p.id_cliente = c.id LEFT JOIN production_status s ON p.id_status = s.id WHERE p.id_status = 6 " . (!empty($lineArray) ? " AND p.id_linea IN (" . implode(',', array_map('intval', $lineArray)) . ")" : "") . " ORDER BY p.priority ASC "; $stmt2 = $pdo->prepare($sql2); $stmt2->execute(); $recordsPriority = $stmt2->fetchAll(); if (!empty($recordsPriority)) { echo '