dashboard fix
This commit is contained in:
@@ -0,0 +1,281 @@
|
||||
<?php
|
||||
include('include/headscript.php');
|
||||
$db = DBHandlerSelect::getInstance();
|
||||
$pdo = $db->getConnection();
|
||||
|
||||
// --- Filtro periodo ---
|
||||
$from = $_GET['from'] ?? date('Y-m-01');
|
||||
$to = $_GET['to'] ?? date('Y-m-t');
|
||||
|
||||
// --- Query base ---
|
||||
$baseWhere = "WHERE p.data_produzione BETWEEN :from AND :to";
|
||||
|
||||
// --- KPI ---
|
||||
$kpi = $pdo->prepare("
|
||||
SELECT
|
||||
COUNT(*) AS totale,
|
||||
SUM(p.ore_previste) AS orepreviste,
|
||||
SUM(p.metri) AS metri,
|
||||
SUM(p.kg_sp) AS kgsp
|
||||
FROM productiondata p
|
||||
$baseWhere
|
||||
");
|
||||
$kpi->execute(['from' => $from, 'to' => $to]);
|
||||
$kpi = $kpi->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
// --- Grafico stati ---
|
||||
$stati = $pdo->prepare("
|
||||
SELECT s.nome, COUNT(*) AS totale
|
||||
FROM productiondata p
|
||||
LEFT JOIN production_status s ON p.id_status = s.id
|
||||
$baseWhere
|
||||
GROUP BY p.id_status
|
||||
");
|
||||
$stati->execute(['from' => $from, 'to' => $to]);
|
||||
$data_stati = $stati->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// --- Grafico per linea ---
|
||||
$linee = $pdo->prepare("
|
||||
SELECT l.name, COUNT(*) AS totale
|
||||
FROM productiondata p
|
||||
LEFT JOIN production_lines l ON p.id_linea = l.id
|
||||
$baseWhere
|
||||
GROUP BY p.id_linea
|
||||
");
|
||||
$linee->execute(['from' => $from, 'to' => $to]);
|
||||
$data_linee = $linee->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// --- Metri per mescola ---
|
||||
$mescole = $pdo->prepare("
|
||||
SELECT ms.nome, SUM(p.metri) AS metri
|
||||
FROM productiondata p
|
||||
LEFT JOIN mescole ms ON p.idmescola = ms.id
|
||||
$baseWhere
|
||||
GROUP BY p.idmescola
|
||||
");
|
||||
$mescole->execute(['from' => $from, 'to' => $to]);
|
||||
$data_mescole = $mescole->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// --- Ore previste per cliente ---
|
||||
$clienti = $pdo->prepare("
|
||||
SELECT c.nome, SUM(p.ore_previste) AS ore
|
||||
FROM productiondata p
|
||||
LEFT JOIN clients c ON p.id_cliente = c.id
|
||||
$baseWhere
|
||||
GROUP BY p.id_cliente
|
||||
");
|
||||
$clienti->execute(['from' => $from, 'to' => $to]);
|
||||
$data_clienti = $clienti->fetchAll(PDO::FETCH_ASSOC);
|
||||
?>
|
||||
|
||||
<!doctype html>
|
||||
<html lang="it">
|
||||
|
||||
<head>
|
||||
<?php include('cssinclude.php'); ?>
|
||||
<title>Statistiche Produzione | <?= $titlewebsite ?></title>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
|
||||
|
||||
<style>
|
||||
.kpi-box {
|
||||
background: #f8f9fa;
|
||||
border-radius: 10px;
|
||||
padding: 18px;
|
||||
text-align: center;
|
||||
border: 1px solid #dee2e6;
|
||||
transition: 0.2s;
|
||||
}
|
||||
|
||||
.kpi-box:hover {
|
||||
background: #eef2ff;
|
||||
}
|
||||
|
||||
.kpi-value {
|
||||
font-size: 1.8rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.kpi-label {
|
||||
font-size: .95rem;
|
||||
color: #555;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<?php include('include/navbar.php'); ?>
|
||||
<?php include('include/topbar.php'); ?>
|
||||
|
||||
<div class="page-wrapper">
|
||||
<div class="page-content">
|
||||
|
||||
<!-- ====================== -->
|
||||
<!-- FILTRO PERIODO -->
|
||||
<!-- ====================== -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">Filtra periodo</div>
|
||||
<div class="card-body">
|
||||
<form method="GET" class="row g-3">
|
||||
<div class="col-md-4">
|
||||
<label class="form-label">Dal</label>
|
||||
<input type="date" name="from" value="<?= $from ?>" class="form-control">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label">Al</label>
|
||||
<input type="date" name="to" value="<?= $to ?>" class="form-control">
|
||||
</div>
|
||||
<div class="col-md-4 d-flex align-items-end">
|
||||
<button class="btn btn-primary w-100">Applica filtro</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ====================== -->
|
||||
<!-- KPI BOX -->
|
||||
<!-- ====================== -->
|
||||
<div class="row g-3 mb-4">
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="kpi-box">
|
||||
<div class="kpi-value"><?= $kpi['totale'] ?></div>
|
||||
<div class="kpi-label">Produzioni</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="kpi-box">
|
||||
<div class="kpi-value"><?= number_format($kpi['orepreviste'], 2, ',', '.') ?></div>
|
||||
<div class="kpi-label">Ore previste</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="kpi-box">
|
||||
<div class="kpi-value"><?= number_format($kpi['metri'], 2, ',', '.') ?></div>
|
||||
<div class="kpi-label">Metri totali</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="kpi-box">
|
||||
<div class="kpi-value"><?= number_format($kpi['kgsp'], 2, ',', '.') ?></div>
|
||||
<div class="kpi-label">Kg SP totali</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- ====================== -->
|
||||
<!-- GRAFICO STATI -->
|
||||
<!-- ====================== -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">Distribuzione per stato</div>
|
||||
<div class="card-body">
|
||||
<div id="chartStati"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ====================== -->
|
||||
<!-- GRAFICO PER LINEA -->
|
||||
<!-- ====================== -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">Produzioni per linea</div>
|
||||
<div class="card-body">
|
||||
<div id="chartLinee"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ====================== -->
|
||||
<!-- METRI PER MESCOLA -->
|
||||
<!-- ====================== -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">Metri programmati per mescola</div>
|
||||
<div class="card-body">
|
||||
<div id="chartMescole"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ====================== -->
|
||||
<!-- ORE PER CLIENTE -->
|
||||
<!-- ====================== -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">Ore previste per cliente</div>
|
||||
<div class="card-body">
|
||||
<div id="chartClienti"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php include('include/footer.php'); ?>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// ======== GRAFICO STATI ========
|
||||
new ApexCharts(document.querySelector("#chartStati"), {
|
||||
chart: {
|
||||
type: 'donut',
|
||||
height: 350
|
||||
},
|
||||
labels: <?= json_encode(array_column($data_stati, 'nome')) ?>,
|
||||
series: <?= json_encode(array_map('intval', array_column($data_stati, 'totale'))) ?>,
|
||||
}).render();
|
||||
|
||||
// ======== GRAFICO PER LINEA ========
|
||||
new ApexCharts(document.querySelector("#chartLinee"), {
|
||||
chart: {
|
||||
type: 'bar',
|
||||
height: 350
|
||||
},
|
||||
series: [{
|
||||
name: 'Produzioni',
|
||||
data: <?= json_encode(array_map('intval', array_column($data_linee, 'totale'))) ?>
|
||||
}],
|
||||
xaxis: {
|
||||
categories: <?= json_encode(array_column($data_linee, 'name')) ?>
|
||||
}
|
||||
}).render();
|
||||
|
||||
// ======== METRI PER MESCOLA ========
|
||||
new ApexCharts(document.querySelector("#chartMescole"), {
|
||||
chart: {
|
||||
type: 'bar',
|
||||
height: 350
|
||||
},
|
||||
series: [{
|
||||
name: 'Metri',
|
||||
data: <?= json_encode(array_map('floatval', array_column($data_mescole, 'metri'))) ?>
|
||||
}],
|
||||
xaxis: {
|
||||
categories: <?= json_encode(array_column($data_mescole, 'nome')) ?>
|
||||
}
|
||||
}).render();
|
||||
|
||||
// ======== ORE PER CLIENTE ========
|
||||
new ApexCharts(document.querySelector("#chartClienti"), {
|
||||
chart: {
|
||||
type: 'bar',
|
||||
height: 350
|
||||
},
|
||||
plotOptions: {
|
||||
bar: {
|
||||
horizontal: true
|
||||
}
|
||||
},
|
||||
series: [{
|
||||
name: 'Ore previste',
|
||||
data: <?= json_encode(array_map('floatval', array_column($data_clienti, 'ore'))) ?>
|
||||
}],
|
||||
xaxis: {
|
||||
categories: <?= json_encode(array_column($data_clienti, 'nome')) ?>
|
||||
}
|
||||
}).render();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
Reference in New Issue
Block a user