getConnection(); $linee = $pdo->query("SELECT id, name, color FROM production_lines ORDER BY line_number")->fetchAll(); $matrici = $pdo->query("SELECT id, nome FROM matrice ORDER BY nome")->fetchAll(); $mescole = $pdo->query("SELECT id, nome FROM mescole ORDER BY nome")->fetchAll(); if (!empty($_GET['ajax'])) { header('Content-Type: application/json'); $dateFrom = $_GET['date_from'] ?? ''; $dateTo = $_GET['date_to'] ?? ''; $lineRaw = $_GET['lines'] ?? ''; $lineArr = $lineRaw !== '' ? array_values(array_filter(array_map('intval', explode(',', $lineRaw)))) : []; $matId = isset($_GET['matrice_id']) && $_GET['matrice_id'] !== '' ? (int)$_GET['matrice_id'] : null; $mescId = isset($_GET['mescola_id']) && $_GET['mescola_id'] !== '' ? (int)$_GET['mescola_id'] : null; $where = ["pp.end_pause IS NOT NULL"]; $params = []; if ($dateFrom !== '') { $where[] = "p.Data >= :date_from"; $params['date_from'] = $dateFrom; } if ($dateTo !== '') { $where[] = "p.Data <= :date_to"; $params['date_to'] = $dateTo; } if (!empty($lineArr)) { $where[] = "p.id_linea IN (" . implode(',', $lineArr) . ")"; } if ($matId !== null) { $where[] = "p.idmatrice = :mat_id"; $params['mat_id'] = $matId; } if ($mescId !== null) { $where[] = "EXISTS (SELECT 1 FROM productiondata_mescole pm WHERE pm.id_productiondata = p.id AND pm.id_mescola = :mesc_id)"; $params['mesc_id'] = $mescId; } $whereSql = implode(' AND ', $where); try { $sqlKpi = "SELECT COUNT(*) AS n_pause, COUNT(DISTINCT pp.id_production) AS n_prod_con_pause, COALESCE(SUM(TIMESTAMPDIFF(SECOND, pp.start_pause, pp.end_pause)),0) AS tot_s, COALESCE(AVG(TIMESTAMPDIFF(SECOND, pp.start_pause, pp.end_pause)),0) AS media_s, COALESCE(MAX(TIMESTAMPDIFF(SECOND, pp.start_pause, pp.end_pause)),0) AS max_s, COALESCE(SUM(CASE WHEN pr.is_problem=1 THEN 1 ELSE 0 END),0) AS n_problemi, COALESCE(SUM(CASE WHEN pr.category='planned' THEN TIMESTAMPDIFF(SECOND, pp.start_pause, pp.end_pause) ELSE 0 END),0) AS planned_s, COALESCE(SUM(CASE WHEN pr.category='unplanned' THEN TIMESTAMPDIFF(SECOND, pp.start_pause, pp.end_pause) ELSE 0 END),0) AS unplanned_s FROM production_pauses pp JOIN productiondata p ON p.id = pp.id_production JOIN pause_reasons pr ON pr.id = pp.reason_id WHERE $whereSql"; $stmt = $pdo->prepare($sqlKpi); $stmt->execute($params); $kpi = $stmt->fetch(PDO::FETCH_ASSOC); $sqlMotivo = "SELECT pr.id, pr.name AS motivo, pr.is_problem, pr.category, COUNT(pp.id) AS n_pause, COALESCE(SUM(TIMESTAMPDIFF(SECOND, pp.start_pause, pp.end_pause)),0) AS durata_s, COALESCE(AVG(TIMESTAMPDIFF(SECOND, pp.start_pause, pp.end_pause)),0) AS media_s FROM production_pauses pp JOIN productiondata p ON p.id = pp.id_production JOIN pause_reasons pr ON pr.id = pp.reason_id WHERE $whereSql GROUP BY pr.id ORDER BY durata_s DESC"; $stmt = $pdo->prepare($sqlMotivo); $stmt->execute($params); $perMotivo = $stmt->fetchAll(PDO::FETCH_ASSOC); $totDurata = array_sum(array_map(fn($x) => (int)$x['durata_s'], $perMotivo)); $cum = 0; foreach ($perMotivo as &$m) { $cum += (int)$m['durata_s']; $m['cum_perc'] = ($totDurata > 0) ? round($cum / $totDurata * 100, 1) : 0; $m['perc'] = ($totDurata > 0) ? round($m['durata_s'] / $totDurata * 100, 1) : 0; } unset($m); $sqlLinea = "SELECT l.name AS linea, l.color, COUNT(pp.id) AS n_pause, COALESCE(SUM(TIMESTAMPDIFF(SECOND, pp.start_pause, pp.end_pause)),0) AS durata_s, COALESCE(SUM(CASE WHEN pr.is_problem=1 THEN 1 ELSE 0 END),0) AS n_problemi FROM production_pauses pp JOIN productiondata p ON p.id = pp.id_production JOIN production_lines l ON l.id = p.id_linea JOIN pause_reasons pr ON pr.id = pp.reason_id WHERE $whereSql GROUP BY l.id ORDER BY durata_s DESC"; $stmt = $pdo->prepare($sqlLinea); $stmt->execute($params); $perLinea = $stmt->fetchAll(PDO::FETCH_ASSOC); $sqlGiorno = "SELECT p.Data AS giorno, COUNT(pp.id) AS n_pause, COALESCE(SUM(TIMESTAMPDIFF(SECOND, pp.start_pause, pp.end_pause)),0) AS durata_s FROM production_pauses pp JOIN productiondata p ON p.id = pp.id_production JOIN pause_reasons pr ON pr.id = pp.reason_id WHERE $whereSql GROUP BY p.Data ORDER BY p.Data"; $stmt = $pdo->prepare($sqlGiorno); $stmt->execute($params); $perGiorno = $stmt->fetchAll(PDO::FETCH_ASSOC); $sqlDett = "SELECT pp.id, pp.start_pause, pp.end_pause, pp.note, TIMESTAMPDIFF(SECOND, pp.start_pause, pp.end_pause) AS durata_s, pr.name AS motivo, pr.is_problem, pr.category, l.name AS linea, m.nome AS matrice, p.id AS prod_id FROM production_pauses pp JOIN productiondata p ON p.id = pp.id_production LEFT JOIN production_lines l ON l.id = p.id_linea LEFT JOIN matrice m ON m.id = p.idmatrice JOIN pause_reasons pr ON pr.id = pp.reason_id WHERE $whereSql ORDER BY pp.start_pause DESC LIMIT 500"; $stmt = $pdo->prepare($sqlDett); $stmt->execute($params); $dettaglio = $stmt->fetchAll(PDO::FETCH_ASSOC); echo json_encode([ 'success' => true, 'kpi' => [ 'n_pause' => (int)$kpi['n_pause'], 'n_prod_con_pause' => (int)$kpi['n_prod_con_pause'], 'tot_s' => (int)$kpi['tot_s'], 'media_s' => (int)$kpi['media_s'], 'max_s' => (int)$kpi['max_s'], 'n_problemi' => (int)$kpi['n_problemi'], 'planned_s' => (int)$kpi['planned_s'], 'unplanned_s' => (int)$kpi['unplanned_s'], ], 'per_motivo' => $perMotivo, 'per_linea' => $perLinea, 'per_giorno' => $perGiorno, 'dettaglio' => $dettaglio, ]); } catch (Exception $e) { echo json_encode(['success' => false, 'msg' => $e->getMessage()]); } exit; } ?>