getConnection(); // --- LISTE LINEE --- $linee = $pdo->query("SELECT id, name 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']; // --- DATA E LINEA SELEZIONATE --- $selected_date = $_GET['date'] ?? date('Y-m-d'); $selected_line = $_GET['line'] ?? ''; // --- AVVIO / RIPRESA PRODUZIONE --- if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['start_production'])) { $id = (int)$_POST['id']; try { $sql = "UPDATE productiondata SET id_status = :status, data_avvio = UTC_TIMESTAMP() WHERE id = :id AND id_status IN (:programmato, :pausa)"; $stmt = $pdo->prepare($sql); $stmt->execute([ 'status' => $statusProduzioneId, 'id' => $id, 'programmato' => $statusProgrammatoId, 'pausa' => $statusPausaId ]); echo json_encode(['success' => true]); } catch (Exception $e) { echo json_encode(['success' => false, 'msg' => $e->getMessage()]); } exit; } // --- PAUSA PRODUZIONE (aggiorna tempo e stato in base al motivo) --- if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['pause_production'])) { $id = (int)$_POST['id']; $reason = $_POST['reason'] ?? 'tecnica'; $note = trim($_POST['note'] ?? ''); try { $sql = "SELECT data_avvio FROM productiondata WHERE id = :id AND id_status = :produzione"; $stmt = $pdo->prepare($sql); $stmt->execute(['id' => $id, 'produzione' => $statusProduzioneId]); $row = $stmt->fetch(); $seconds = 0; if ($row && $row['data_avvio']) { $start = new DateTime($row['data_avvio'], new DateTimeZone('UTC')); $now = new DateTime('now', new DateTimeZone('UTC')); $seconds = $now->getTimestamp() - $start->getTimestamp(); } // Stato di destinazione $nextStatus = ($reason === 'problema') ? 8 : $statusPausaId; // 8 = Problema in produzione $sql = "UPDATE productiondata SET id_status = :status, tempo_totale_produzione = COALESCE(tempo_totale_produzione, 0) + :seconds, note_operatore = :note WHERE id = :id AND id_status = :produzione"; $stmt = $pdo->prepare($sql); $stmt->execute([ 'status' => $nextStatus, 'seconds' => $seconds, 'note' => $note ?: null, 'id' => $id, 'produzione' => $statusProduzioneId ]); 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 data_avvio, id_status FROM productiondata WHERE id = :id"; $stmt = $pdo->prepare($sql); $stmt->execute(['id' => $id]); $row = $stmt->fetch(); $seconds = 0; if ($row && $row['data_avvio'] && $row['id_status'] == $statusProduzioneId) { $start = new DateTime($row['data_avvio'], 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, tempo_totale_produzione = COALESCE(tempo_totale_produzione, 0) + :seconds, data_avvio = NULL, note_operatore = :note WHERE id = :id AND id_status IN (:produzione, :pausa)"; $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 { // Calcolo automatico del tempo totale in ore $sql = "SELECT tempo_totale_produzione FROM productiondata WHERE id = :id"; $stmt = $pdo->prepare($sql); $stmt->execute(['id' => $id]); $seconds = (int)$stmt->fetchColumn(); $hours = round($seconds / 3600, 2); // Stato di destinazione $nextStatus = ($reason === 'problema') ? 8 : $statusQualita; $sql = "UPDATE productiondata SET kgprod = :kgprod, mtprod = :mtprod, scarto = :scarto, note_operatore = :note, hourprod = SEC_TO_TIME(:seconds), id_status = :status WHERE id = :id"; $stmt = $pdo->prepare($sql); $stmt->execute([ 'kgprod' => $kgprod, 'mtprod' => $mtprod, 'scarto' => $scarto, '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: carica record --- if (!empty($_GET['ajax'])) { $date = $_GET['date'] ?? date('Y-m-d'); $lineRaw = $_GET['line'] ?? ''; $lineArray = $lineRaw !== '' ? explode(',', $lineRaw) : []; $sql = "SELECT p.*, m.nome AS matrice, ms.nome AS mescola, 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 mescole ms ON p.idmescola = ms.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.data_produzione = :date AND p.id_status IN (:programmato, :produzione, :pausa)" . (!empty($lineArray) ? " AND p.id_linea IN (" . implode(',', array_map('intval', $lineArray)) . ")" : "") . " ORDER BY l.line_number, p.Data"; $params = [ ':date' => $date, ':programmato' => $statusProgrammatoId, ':produzione' => $statusProduzioneId, ':pausa' => $statusPausaId ]; try { $stmt = $pdo->prepare($sql); $stmt->execute($params); $records = $stmt->fetchAll(); } catch (PDOException $e) { echo '