getConnection();
function h($v)
{
return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8');
}
function formatDateIT($d)
{
if (!$d || $d === '0000-00-00') return '—';
return date('d/m/Y', strtotime($d));
}
function formatDateTimeIT($d)
{
if (!$d || $d === '0000-00-00 00:00:00') return '—';
return date('d/m/Y H:i', strtotime($d));
}
function getRevisionLabel($rev)
{
$rev = trim((string)$rev);
return $rev !== '' ? $rev : '0';
}
function getWorksheetLabel($num)
{
$num = (int)$num;
return $num > 0 ? 'FL' . $num : '—';
}
// AJAX HANDLERS
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['ajax'] == '1') {
header('Content-Type: application/json; charset=utf-8');
$action = $_POST['action'] ?? '';
try {
if ($action === 'delete') {
$id = (int)($_POST['id'] ?? 0);
if ($id <= 0) {
echo json_encode(['success' => false, 'message' => 'ID non valido']);
exit;
}
$stmt = $pdo->prepare("DELETE FROM work_sheets WHERE id = ?");
$stmt->execute([$id]);
echo json_encode(['success' => true]);
exit;
}
if ($action === 'create_revision') {
$id = (int)($_POST['id'] ?? 0);
if ($id <= 0) {
echo json_encode(['success' => false, 'message' => 'ID non valido']);
exit;
}
$stmt = $pdo->prepare("
SELECT *
FROM work_sheets
WHERE id = ?
LIMIT 1
");
$stmt->execute([$id]);
$source = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$source) {
echo json_encode(['success' => false, 'message' => 'Foglio non trovato']);
exit;
}
if (($source['worksheet_status'] ?? 'active') !== 'active') {
echo json_encode([
'success' => false,
'message' => 'Questo foglio è già inattivo/revisionato e non può essere revisionato di nuovo'
]);
exit;
}
$idmatrice = (int)$source['idmatrice'];
if ($idmatrice <= 0) {
echo json_encode(['success' => false, 'message' => 'ID matrice non valido']);
exit;
}
$worksheetNumber = (int)($source['worksheet_number'] ?? 0);
if ($worksheetNumber <= 0) {
echo json_encode(['success' => false, 'message' => 'Numero foglio non valido o non valorizzato']);
exit;
}
$pdo->beginTransaction();
// Trova la prossima revisione sulla stessa numerazione foglio
$stmtMaxRev = $pdo->prepare("
SELECT revision_code
FROM work_sheets
WHERE worksheet_number = ?
ORDER BY
CASE
WHEN revision_code IS NULL OR revision_code = '' THEN 0
WHEN revision_code REGEXP '^R[0-9]+$' THEN CAST(SUBSTRING(revision_code, 2) AS UNSIGNED)
ELSE 0
END DESC,
id DESC
LIMIT 1
");
$stmtMaxRev->execute([$worksheetNumber]);
$lastRevisionCode = $stmtMaxRev->fetchColumn();
$nextRevisionNumber = 1;
if ($lastRevisionCode && preg_match('/^R(\d+)$/', $lastRevisionCode, $m)) {
$nextRevisionNumber = ((int)$m[1]) + 1;
}
$newRevisionCode = 'R' . $nextRevisionNumber;
// Rendi inattivo il foglio corrente
$stmtDeactivate = $pdo->prepare("
UPDATE work_sheets
SET worksheet_status = 'inactive'
WHERE id = ?
");
$stmtDeactivate->execute([$id]);
// Crea clone del foglio mantenendo lo stesso worksheet_number
$stmtInsert = $pdo->prepare("
INSERT INTO work_sheets (
worksheet_number,
idmatrice,
worksheet_date,
customer_name,
profile_type_code,
revision_code,
worksheet_status,
marking,
prod_control_measure_settings,
control_frequency_cut,
control_frequency_drawing,
control_frequency_jig,
control_mode_jig,
requested_package_code,
meters_per_package,
meters_per_package_tolerance,
meters_per_package_notes,
box_type,
packages_or_pieces_per_box,
meters_per_box,
pallet_type,
boxes_or_packages_per_pallet,
speed_expected_kg_h,
speed_actual_kg_h,
speed_expected_m_h,
speed_actual_m_h,
approved_by,
notes
) VALUES (
?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?
)
");
$stmtInsert->execute([
$worksheetNumber,
$source['idmatrice'],
$source['worksheet_date'],
$source['customer_name'],
$source['profile_type_code'],
$newRevisionCode,
'active',
$source['marking'],
$source['prod_control_measure_settings'],
$source['control_frequency_cut'],
$source['control_frequency_drawing'],
$source['control_frequency_jig'],
$source['control_mode_jig'],
$source['requested_package_code'],
$source['meters_per_package'],
$source['meters_per_package_tolerance'],
$source['meters_per_package_notes'],
$source['box_type'],
$source['packages_or_pieces_per_box'],
$source['meters_per_box'],
$source['pallet_type'],
$source['boxes_or_packages_per_pallet'],
$source['speed_expected_kg_h'],
$source['speed_actual_kg_h'],
$source['speed_expected_m_h'],
$source['speed_actual_m_h'],
$source['approved_by'],
$source['notes']
]);
$newWorksheetId = (int)$pdo->lastInsertId();
// Duplica le mescole collegate
$stmtMixes = $pdo->prepare("
SELECT
idmescola,
mix_position,
mix_weight_g_m,
required_density,
required_hardness_shore_a,
lubrication_type,
lubrication_notes
FROM work_sheet_mescole
WHERE worksheet_id = ?
ORDER BY mix_position ASC, id ASC
");
$stmtMixes->execute([$id]);
$mixRows = $stmtMixes->fetchAll(PDO::FETCH_ASSOC);
if ($mixRows) {
$stmtInsertMix = $pdo->prepare("
INSERT INTO work_sheet_mescole (
worksheet_id,
idmescola,
mix_position,
mix_weight_g_m,
required_density,
required_hardness_shore_a,
lubrication_type,
lubrication_notes
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
");
foreach ($mixRows as $mix) {
$stmtInsertMix->execute([
$newWorksheetId,
$mix['idmescola'],
$mix['mix_position'],
$mix['mix_weight_g_m'],
$mix['required_density'],
$mix['required_hardness_shore_a'],
$mix['lubrication_type'],
$mix['lubrication_notes']
]);
}
}
$pdo->commit();
echo json_encode([
'success' => true,
'message' => 'Revisione creata correttamente',
'new_id' => $newWorksheetId,
'new_revision_code' => $newRevisionCode,
'worksheet_number_label' => 'FL' . $worksheetNumber
]);
exit;
}
echo json_encode(['success' => false, 'message' => 'Azione sconosciuta']);
exit;
} catch (Exception $e) {
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
echo json_encode(['success' => false, 'message' => $e->getMessage()]);
exit;
}
}
// Worksheets list + row count
$worksheets = $pdo->query("
SELECT
ws.id,
ws.worksheet_number,
ws.worksheet_date,
ws.customer_name,
ws.profile_type_code,
ws.revision_code,
ws.worksheet_status,
ws.approved_by,
ws.created_at,
ws.updated_at,
m.nome AS matrice_nome,
m.cliente AS matrice_cliente,
(
SELECT COUNT(*)
FROM work_sheet_mescole wsm
WHERE wsm.worksheet_id = ws.id
) AS mixes_count
FROM work_sheets ws
LEFT JOIN matrice m ON ws.idmatrice = m.id
ORDER BY ws.worksheet_number DESC, ws.id DESC
")->fetchAll(PDO::FETCH_ASSOC);
?>
Fogli di Lavoro
Storico
| Foglio |
Rev |
Data |
Matrice/Profilo |
Cliente |
Codice Profilo |
Stato |
Mescole |
Visto |
Creato |
Azioni |
|
= h($worksheetLabel) ?>
|
= h($revisionLabel) ?>
|
= h(formatDateIT($ws['worksheet_date'] ?? '')) ?> |
= h($ws['matrice_nome'] ?? '-') ?> |
= h($ws['customer_name'] ?: ($ws['matrice_cliente'] ?? '-')) ?> |
= h($ws['profile_type_code'] ?? '-') ?> |
Attivo
Inattivo
|
= (int)$ws['mixes_count'] ?> |
= h($ws['approved_by'] ?? '-') ?> |
= h(formatDateTimeIT($ws['created_at'] ?? '')) ?> |
|