fixed imballaggi worksheet

This commit is contained in:
2026-03-20 12:24:22 +01:00
parent f477f393ba
commit 53b990ff40
+161 -151
View File
@@ -12,13 +12,12 @@ $worksheet_id = isset($_GET['id']) && is_numeric($_GET['id']) ? (int)$_GET['id']
// AJAX HANDLERS // AJAX HANDLERS
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['ajax'] == '1') { if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['ajax'] == '1') {
// Ensure clean JSON output (remove any echoed HTML/notices) // Ensure clean JSON output
while (ob_get_level()) { while (ob_get_level()) {
ob_end_clean(); ob_end_clean();
} }
header('Content-Type: application/json; charset=utf-8');
header('Content-Type: application/json'); header('Content-Type: application/json; charset=utf-8');
$action = $_POST['action'] ?? ''; $action = $_POST['action'] ?? '';
@@ -45,6 +44,12 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
$freq_jig = trim($_POST['control_frequency_jig'] ?? ''); $freq_jig = trim($_POST['control_frequency_jig'] ?? '');
$mode_jig = trim($_POST['control_mode_jig'] ?? ''); $mode_jig = trim($_POST['control_mode_jig'] ?? '');
// Package data moved to worksheet header
$requested_package_code = trim($_POST['requested_package_code'] ?? '');
$meters_per_package = $_POST['meters_per_package'] !== '' ? (int)$_POST['meters_per_package'] : null;
$meters_per_package_tolerance = trim($_POST['meters_per_package_tolerance'] ?? '');
$meters_per_package_notes = trim($_POST['meters_per_package_notes'] ?? '');
$box_type = trim($_POST['box_type'] ?? ''); $box_type = trim($_POST['box_type'] ?? '');
$pkg_box = $_POST['packages_or_pieces_per_box'] !== '' ? (int)$_POST['packages_or_pieces_per_box'] : null; $pkg_box = $_POST['packages_or_pieces_per_box'] !== '' ? (int)$_POST['packages_or_pieces_per_box'] : null;
$m_box = $_POST['meters_per_box'] !== '' ? (int)$_POST['meters_per_box'] : null; $m_box = $_POST['meters_per_box'] !== '' ? (int)$_POST['meters_per_box'] : null;
@@ -73,6 +78,10 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
control_frequency_drawing = ?, control_frequency_drawing = ?,
control_frequency_jig = ?, control_frequency_jig = ?,
control_mode_jig = ?, control_mode_jig = ?,
requested_package_code = ?,
meters_per_package = ?,
meters_per_package_tolerance = ?,
meters_per_package_notes = ?,
box_type = ?, box_type = ?,
packages_or_pieces_per_box = ?, packages_or_pieces_per_box = ?,
meters_per_box = ?, meters_per_box = ?,
@@ -97,6 +106,10 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
$freq_draw !== '' ? $freq_draw : null, $freq_draw !== '' ? $freq_draw : null,
$freq_jig !== '' ? $freq_jig : null, $freq_jig !== '' ? $freq_jig : null,
$mode_jig !== '' ? $mode_jig : null, $mode_jig !== '' ? $mode_jig : null,
$requested_package_code !== '' ? $requested_package_code : null,
$meters_per_package,
$meters_per_package_tolerance !== '' ? $meters_per_package_tolerance : null,
$meters_per_package_notes !== '' ? $meters_per_package_notes : null,
$box_type !== '' ? $box_type : null, $box_type !== '' ? $box_type : null,
$pkg_box, $pkg_box,
$m_box, $m_box,
@@ -117,19 +130,26 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
$stmt = $pdo->prepare(" $stmt = $pdo->prepare("
INSERT INTO work_sheets INSERT INTO work_sheets
(idmatrice, worksheet_date, customer_name, profile_type_code, marking, (
prod_control_measure_settings, control_frequency_cut, control_frequency_drawing, control_frequency_jig, control_mode_jig, idmatrice, worksheet_date, customer_name, profile_type_code, marking,
box_type, packages_or_pieces_per_box, meters_per_box, prod_control_measure_settings, control_frequency_cut, control_frequency_drawing,
pallet_type, boxes_or_packages_per_pallet, control_frequency_jig, control_mode_jig,
speed_expected_kg_h, speed_actual_kg_h, speed_expected_m_h, speed_actual_m_h, requested_package_code, meters_per_package, meters_per_package_tolerance, meters_per_package_notes,
approved_by, 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 VALUES
(?, ?, ?, ?, ?, (
?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?,
?, ?) ?, ?,
?, ?, ?, ?,
?, ?
)
"); ");
$stmt->execute([ $stmt->execute([
$idmatrice, $idmatrice,
@@ -142,6 +162,10 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
$freq_draw !== '' ? $freq_draw : null, $freq_draw !== '' ? $freq_draw : null,
$freq_jig !== '' ? $freq_jig : null, $freq_jig !== '' ? $freq_jig : null,
$mode_jig !== '' ? $mode_jig : null, $mode_jig !== '' ? $mode_jig : null,
$requested_package_code !== '' ? $requested_package_code : null,
$meters_per_package,
$meters_per_package_tolerance !== '' ? $meters_per_package_tolerance : null,
$meters_per_package_notes !== '' ? $meters_per_package_notes : null,
$box_type !== '' ? $box_type : null, $box_type !== '' ? $box_type : null,
$pkg_box, $pkg_box,
$m_box, $m_box,
@@ -168,10 +192,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
exit; exit;
} }
$row_id = (int)($_POST['row_id'] ?? 0); $row_id = (int)($_POST['row_id'] ?? 0);
$idmescola = (int)($_POST['idmescola'] ?? 0); $idmescola = (int)($_POST['idmescola'] ?? 0);
$pos = 0; // auto-assign $pos = 0; // auto-assign
if ($idmescola <= 0) { if ($idmescola <= 0) {
echo json_encode(['success' => false, 'message' => 'Seleziona una mescola']); echo json_encode(['success' => false, 'message' => 'Seleziona una mescola']);
@@ -186,43 +209,19 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
$lub_type = ($_POST['lubrication_type'] ?? '') !== '' ? $_POST['lubrication_type'] : null; $lub_type = ($_POST['lubrication_type'] ?? '') !== '' ? $_POST['lubrication_type'] : null;
$lub_note = trim($_POST['lubrication_notes'] ?? ''); $lub_note = trim($_POST['lubrication_notes'] ?? '');
$pkg_code = trim($_POST['requested_package_code'] ?? '');
$m_pkg = $_POST['meters_per_package'] !== '' ? (int)$_POST['meters_per_package'] : null;
$m_pkg_note = trim($_POST['meters_per_package_notes'] ?? '');
$m_pkg_tol = trim($_POST['meters_per_package_tolerance'] ?? '');
// Use transaction to keep constraints consistent
$pdo->beginTransaction(); $pdo->beginTransaction();
if ($row_id > 0) { if ($row_id > 0) {
// Auto-assign mix_position = max + 1 for this worksheet
$stmtPos = $pdo->prepare("
SELECT IFNULL(MAX(mix_position), 0) + 1
FROM work_sheet_mescole
WHERE worksheet_id = ?
FOR UPDATE
");
$stmtPos->execute([$worksheet_id]);
$pos = (int)$stmtPos->fetchColumn();
if ($pos <= 0) $pos = 1;
$stmt = $pdo->prepare(" $stmt = $pdo->prepare("
UPDATE work_sheet_mescole SET UPDATE work_sheet_mescole SET
idmescola = ?, idmescola = ?,
mix_weight_g_m = ?, mix_weight_g_m = ?,
required_density = ?, required_density = ?,
required_hardness_shore_a = ?, required_hardness_shore_a = ?,
lubrication_type = ?, lubrication_type = ?,
lubrication_notes = ?, lubrication_notes = ?
requested_package_code = ?, WHERE id = ? AND worksheet_id = ?
meters_per_package = ?, ");
meters_per_package_notes = ?,
meters_per_package_tolerance = ?
WHERE id = ? AND worksheet_id = ?
");
$stmt->execute([ $stmt->execute([
$idmescola, $idmescola,
$mix_weight, $mix_weight,
@@ -230,37 +229,33 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
$hardness !== '' ? $hardness : null, $hardness !== '' ? $hardness : null,
$lub_type, $lub_type,
$lub_note !== '' ? $lub_note : null, $lub_note !== '' ? $lub_note : null,
$pkg_code !== '' ? $pkg_code : null,
$m_pkg,
$m_pkg_note !== '' ? $m_pkg_note : null,
$m_pkg_tol !== '' ? $m_pkg_tol : null,
$row_id, $row_id,
$worksheet_id $worksheet_id
]); ]);
$pdo->commit(); $pdo->commit();
echo json_encode(['success' => true]); echo json_encode(['success' => true]);
exit; exit;
} }
// If position already used, auto-assign next (max+1) $stmtPos = $pdo->prepare("
$chk = $pdo->prepare("SELECT COUNT(*) FROM work_sheet_mescole WHERE worksheet_id = ? AND mix_position = ?"); SELECT IFNULL(MAX(mix_position), 0) + 1
$chk->execute([$worksheet_id, $pos]); FROM work_sheet_mescole
if ((int)$chk->fetchColumn() > 0) { WHERE worksheet_id = ?
$mx = $pdo->prepare("SELECT IFNULL(MAX(mix_position),0) + 1 FROM work_sheet_mescole WHERE worksheet_id = ?"); FOR UPDATE
$mx->execute([$worksheet_id]); ");
$pos = (int)$mx->fetchColumn(); $stmtPos->execute([$worksheet_id]);
} $pos = (int)$stmtPos->fetchColumn();
if ($pos <= 0) $pos = 1;
$stmt = $pdo->prepare(" $stmt = $pdo->prepare("
INSERT INTO work_sheet_mescole INSERT INTO work_sheet_mescole
(worksheet_id, idmescola, mix_position, mix_weight_g_m, required_density, required_hardness_shore_a, (
lubrication_type, lubrication_notes, worksheet_id, idmescola, mix_position, mix_weight_g_m,
requested_package_code, meters_per_package, meters_per_package_notes, meters_per_package_tolerance) required_density, required_hardness_shore_a,
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) lubrication_type, lubrication_notes
)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
"); ");
$stmt->execute([ $stmt->execute([
$worksheet_id, $worksheet_id,
@@ -270,11 +265,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
$density !== '' ? $density : null, $density !== '' ? $density : null,
$hardness !== '' ? $hardness : null, $hardness !== '' ? $hardness : null,
$lub_type, $lub_type,
$lub_note !== '' ? $lub_note : null, $lub_note !== '' ? $lub_note : null
$pkg_code !== '' ? $pkg_code : null,
$m_pkg,
$m_pkg_note !== '' ? $m_pkg_note : null,
$m_pkg_tol !== '' ? $m_pkg_tol : null
]); ]);
$pdo->commit(); $pdo->commit();
@@ -300,7 +291,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj
echo json_encode(['success' => false, 'message' => 'Azione sconosciuta']); echo json_encode(['success' => false, 'message' => 'Azione sconosciuta']);
exit; exit;
} catch (Exception $e) { } catch (Exception $e) {
if ($pdo->inTransaction()) $pdo->rollBack(); if ($pdo->inTransaction()) {
$pdo->rollBack();
}
echo json_encode(['success' => false, 'message' => $e->getMessage()]); echo json_encode(['success' => false, 'message' => $e->getMessage()]);
exit; exit;
} }
@@ -313,7 +306,7 @@ $matrici = $pdo->query("
ORDER BY nome ASC ORDER BY nome ASC
")->fetchAll(PDO::FETCH_ASSOC); ")->fetchAll(PDO::FETCH_ASSOC);
// Load worksheet lookup options // Load generic worksheet lookup options
$lookup = []; $lookup = [];
$lookupDefault = []; $lookupDefault = [];
@@ -333,6 +326,33 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $r) {
} }
} }
// Load packaging items from dedicated table
$packagingLookup = [
'PACKAGING_TYPE' => [],
'BOX' => [],
'PALLET' => []
];
$stmt = $pdo->prepare("
SELECT category, item_name, item_code
FROM packaging_items
WHERE is_active = 1
AND category IN ('PACKAGING_TYPE', 'BOX', 'PALLET')
ORDER BY category ASC, item_name ASC
");
$stmt->execute();
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $r) {
$label = $r['item_name'];
if (!empty($r['item_code'])) {
$label .= ' — ' . $r['item_code'];
}
$packagingLookup[$r['category']][] = [
'value' => $r['item_code'],
'label' => $label
];
}
// Load mescole dropdown for modal // Load mescole dropdown for modal
$mescole = $pdo->query(" $mescole = $pdo->query("
@@ -398,9 +418,25 @@ function ws_options($rows, $selectedValue, $defaultValue = '')
return $html; return $html;
} }
function packaging_options($rows, $selectedValue = '')
{
$selectedValue = (string)$selectedValue;
$html = '<option value="">--</option>';
if (!$rows) return $html;
foreach ($rows as $r) {
$val = h($r['value']);
$lab = h($r['label']);
$sel = ((string)$r['value'] === $selectedValue) ? ' selected' : '';
$html .= "<option value=\"{$val}\"{$sel}>{$lab}</option>";
}
return $html;
}
$isEdit = ($worksheet_id > 0); $isEdit = ($worksheet_id > 0);
?> ?>
<!doctype html> <!doctype html>
<html lang="it"> <html lang="it">
@@ -411,7 +447,6 @@ $isEdit = ($worksheet_id > 0);
<title><?= $isEdit ? 'Modifica Foglio di Lavoro' : 'Nuovo Foglio di Lavoro' ?></title> <title><?= $isEdit ? 'Modifica Foglio di Lavoro' : 'Nuovo Foglio di Lavoro' ?></title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<link rel="stylesheet" href="https://cdn.datatables.net/1.13.6/css/dataTables.bootstrap5.min.css"> <link rel="stylesheet" href="https://cdn.datatables.net/1.13.6/css/dataTables.bootstrap5.min.css">
@@ -422,7 +457,6 @@ $isEdit = ($worksheet_id > 0);
<link href="https://cdn.jsdelivr.net/npm/@ttskch/select2-bootstrap4-theme@1.5.2/dist/select2-bootstrap4.min.css" rel="stylesheet" /> <link href="https://cdn.jsdelivr.net/npm/@ttskch/select2-bootstrap4-theme@1.5.2/dist/select2-bootstrap4.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<style> <style>
body { body {
font-size: 0.95rem; font-size: 0.95rem;
@@ -492,7 +526,6 @@ $isEdit = ($worksheet_id > 0);
</div> </div>
<div class="card-body"> <div class="card-body">
<!-- HEADER FORM -->
<form id="worksheetHeaderForm"> <form id="worksheetHeaderForm">
<input type="hidden" name="id" id="wsId" value="<?= (int)$worksheet_id ?>"> <input type="hidden" name="id" id="wsId" value="<?= (int)$worksheet_id ?>">
@@ -533,7 +566,6 @@ $isEdit = ($worksheet_id > 0);
<select class="form-select" name="marking" id="marking"> <select class="form-select" name="marking" id="marking">
<?= ws_options($lookup['marking'] ?? [], $worksheet['marking'] ?? '', $lookupDefault['marking'] ?? '') ?> <?= ws_options($lookup['marking'] ?? [], $worksheet['marking'] ?? '', $lookupDefault['marking'] ?? '') ?>
</select> </select>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
@@ -552,53 +584,79 @@ $isEdit = ($worksheet_id > 0);
<select class="form-select" name="control_frequency_cut" id="control_frequency_cut"> <select class="form-select" name="control_frequency_cut" id="control_frequency_cut">
<?= ws_options($lookup['control_frequency_cut'] ?? [], $worksheet['control_frequency_cut'] ?? '', $lookupDefault['control_frequency_cut'] ?? '') ?> <?= ws_options($lookup['control_frequency_cut'] ?? [], $worksheet['control_frequency_cut'] ?? '', $lookupDefault['control_frequency_cut'] ?? '') ?>
</select> </select>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<label class="form-label fw-semibold">Controlli - Disegno</label> <label class="form-label fw-semibold">Controlli - Disegno</label>
<select class="form-select" name="control_frequency_drawing" id="control_frequency_drawing"> <select class="form-select" name="control_frequency_drawing" id="control_frequency_drawing">
<?= ws_options($lookup['control_frequency_drawing'] ?? [], $worksheet['control_frequency_drawing'] ?? '', $lookupDefault['control_frequency_drawing'] ?? '') ?> <?= ws_options($lookup['control_frequency_drawing'] ?? [], $worksheet['control_frequency_drawing'] ?? '', $lookupDefault['control_frequency_drawing'] ?? '') ?>
</select> </select>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<label class="form-label fw-semibold">Controlli - Dima</label> <label class="form-label fw-semibold">Controlli - Dima</label>
<select class="form-select" name="control_frequency_jig" id="control_frequency_jig"> <select class="form-select" name="control_frequency_jig" id="control_frequency_jig">
<?= ws_options($lookup['control_frequency_jig'] ?? [], $worksheet['control_frequency_jig'] ?? '', $lookupDefault['control_frequency_jig'] ?? '') ?> <?= ws_options($lookup['control_frequency_jig'] ?? [], $worksheet['control_frequency_jig'] ?? '', $lookupDefault['control_frequency_jig'] ?? '') ?>
</select> </select>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<label class="form-label fw-semibold">Modalità dima</label> <label class="form-label fw-semibold">Modalità dima</label>
<select class="form-select" name="control_mode_jig" id="control_mode_jig"> <select class="form-select" name="control_mode_jig" id="control_mode_jig">
<?= ws_options($lookup['control_mode_jig'] ?? [], $worksheet['control_mode_jig'] ?? '', $lookupDefault['control_mode_jig'] ?? '') ?> <?= ws_options($lookup['control_mode_jig'] ?? [], $worksheet['control_mode_jig'] ?? '', $lookupDefault['control_mode_jig'] ?? '') ?>
</select> </select>
</div>
<div class="col-md-4">
<label class="form-label fw-semibold">Codice confezione</label>
<select class="form-select" name="requested_package_code" id="requested_package_code">
<?= packaging_options($packagingLookup['PACKAGING_TYPE'] ?? [], $worksheet['requested_package_code'] ?? '') ?>
</select>
</div>
<div class="col-md-4">
<label class="form-label fw-semibold">Metri per confezione</label>
<input type="number" class="form-control" name="meters_per_package"
value="<?= $worksheet ? h($worksheet['meters_per_package']) : '' ?>">
</div>
<div class="col-md-4">
<label class="form-label fw-semibold">Tolleranza metri/confezione</label>
<input type="text" class="form-control" name="meters_per_package_tolerance"
value="<?= $worksheet ? h($worksheet['meters_per_package_tolerance']) : '' ?>"
placeholder="es. +/- 4m">
</div>
<div class="col-12">
<label class="form-label fw-semibold">Note metri/confezione</label>
<input type="text" class="form-control" name="meters_per_package_notes"
value="<?= $worksheet ? h($worksheet['meters_per_package_notes']) : '' ?>">
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<label class="form-label fw-semibold">Scatola (tipo)</label> <label class="form-label fw-semibold">Scatola (tipo)</label>
<select class="form-select" name="box_type" id="box_type"> <select class="form-select" name="box_type" id="box_type">
<?= ws_options($lookup['box_type'] ?? [], $worksheet['box_type'] ?? '', $lookupDefault['box_type'] ?? '') ?> <?= packaging_options($packagingLookup['BOX'] ?? [], $worksheet['box_type'] ?? '') ?>
</select> </select>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<label class="form-label fw-semibold"> conf./pezzi per scatola</label> <label class="form-label fw-semibold"> conf./pezzi per scatola</label>
<input type="number" class="form-control" name="packages_or_pieces_per_box" <input type="number" class="form-control" name="packages_or_pieces_per_box"
value="<?= $worksheet ? h($worksheet['packages_or_pieces_per_box']) : '' ?>"> value="<?= $worksheet ? h($worksheet['packages_or_pieces_per_box']) : '' ?>">
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<label class="form-label fw-semibold">Metri per scatola</label> <label class="form-label fw-semibold">Metri per scatola</label>
<input type="number" class="form-control" name="meters_per_box" <input type="number" class="form-control" name="meters_per_box"
value="<?= $worksheet ? h($worksheet['meters_per_box']) : '' ?>"> value="<?= $worksheet ? h($worksheet['meters_per_box']) : '' ?>">
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<label class="form-label fw-semibold">Bancale (tipo)</label> <label class="form-label fw-semibold">Bancale (tipo)</label>
<select class="form-select" name="pallet_type" id="pallet_type"> <select class="form-select" name="pallet_type" id="pallet_type">
<?= ws_options($lookup['pallet_type'] ?? [], $worksheet['pallet_type'] ?? '', $lookupDefault['pallet_type'] ?? '') ?> <?= packaging_options($packagingLookup['PALLET'] ?? [], $worksheet['pallet_type'] ?? '') ?>
</select> </select>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
@@ -612,16 +670,19 @@ $isEdit = ($worksheet_id > 0);
<input type="number" step="0.01" class="form-control" name="speed_expected_kg_h" <input type="number" step="0.01" class="form-control" name="speed_expected_kg_h"
value="<?= $worksheet ? h($worksheet['speed_expected_kg_h']) : '' ?>"> value="<?= $worksheet ? h($worksheet['speed_expected_kg_h']) : '' ?>">
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<label class="form-label fw-semibold">Vel. effettiva (kg/h)</label> <label class="form-label fw-semibold">Vel. effettiva (kg/h)</label>
<input type="number" step="0.01" class="form-control" name="speed_actual_kg_h" <input type="number" step="0.01" class="form-control" name="speed_actual_kg_h"
value="<?= $worksheet ? h($worksheet['speed_actual_kg_h']) : '' ?>"> value="<?= $worksheet ? h($worksheet['speed_actual_kg_h']) : '' ?>">
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<label class="form-label fw-semibold">Vel. prevista (m/h)</label> <label class="form-label fw-semibold">Vel. prevista (m/h)</label>
<input type="number" step="0.01" class="form-control" name="speed_expected_m_h" <input type="number" step="0.01" class="form-control" name="speed_expected_m_h"
value="<?= $worksheet ? h($worksheet['speed_expected_m_h']) : '' ?>"> value="<?= $worksheet ? h($worksheet['speed_expected_m_h']) : '' ?>">
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<label class="form-label fw-semibold">Vel. effettiva (m/h)</label> <label class="form-label fw-semibold">Vel. effettiva (m/h)</label>
<input type="number" step="0.01" class="form-control" name="speed_actual_m_h" <input type="number" step="0.01" class="form-control" name="speed_actual_m_h"
@@ -645,7 +706,6 @@ $isEdit = ($worksheet_id > 0);
<hr class="my-4"> <hr class="my-4">
<!-- MIX ROWS TABLE -->
<div class="d-flex justify-content-between align-items-center mb-2"> <div class="d-flex justify-content-between align-items-center mb-2">
<div class="section-title">Mescole associate al foglio</div> <div class="section-title">Mescole associate al foglio</div>
<div class="small-hint">Usa “Aggiungi Mescola” per inserire una o più righe</div> <div class="small-hint">Usa “Aggiungi Mescola” per inserire una o più righe</div>
@@ -661,8 +721,6 @@ $isEdit = ($worksheet_id > 0);
<th>Densità</th> <th>Densità</th>
<th>Durezza</th> <th>Durezza</th>
<th>Lubr.</th> <th>Lubr.</th>
<th>Confez.</th>
<th>m/conf.</th>
<th>Azioni</th> <th>Azioni</th>
</tr> </tr>
</thead> </thead>
@@ -680,8 +738,6 @@ $isEdit = ($worksheet_id > 0);
<td><?= h($r['required_density'] ?? '-') ?></td> <td><?= h($r['required_density'] ?? '-') ?></td>
<td><?= h($r['required_hardness_shore_a'] ?? '-') ?></td> <td><?= h($r['required_hardness_shore_a'] ?? '-') ?></td>
<td><?= h($r['lubrication_type'] ?? '-') ?></td> <td><?= h($r['lubrication_type'] ?? '-') ?></td>
<td><?= h($r['requested_package_code'] ?? '-') ?></td>
<td><?= h($r['meters_per_package'] ?? '-') ?></td>
<td class="text-nowrap"> <td class="text-nowrap">
<button class="btn btn-sm btn-outline-primary edit-mix" <button class="btn btn-sm btn-outline-primary edit-mix"
data-row='<?= h(json_encode($r, JSON_UNESCAPED_UNICODE)) ?>'> data-row='<?= h(json_encode($r, JSON_UNESCAPED_UNICODE)) ?>'>
@@ -735,7 +791,6 @@ $isEdit = ($worksheet_id > 0);
<input type="hidden" name="mix_position" id="mix_position" value=""> <input type="hidden" name="mix_position" id="mix_position" value="">
<div class="col-md-4"> <div class="col-md-4">
<label class="form-label fw-semibold">Peso metro mescola (g/m)</label> <label class="form-label fw-semibold">Peso metro mescola (g/m)</label>
<input type="number" step="0.01" class="form-control" name="mix_weight_g_m" id="mix_weight_g_m"> <input type="number" step="0.01" class="form-control" name="mix_weight_g_m" id="mix_weight_g_m">
@@ -756,7 +811,6 @@ $isEdit = ($worksheet_id > 0);
<select class="form-select" name="lubrication_type" id="lubrication_type"> <select class="form-select" name="lubrication_type" id="lubrication_type">
<?= ws_options($lookup['lubrication_type'] ?? [], '', $lookupDefault['lubrication_type'] ?? '') ?> <?= ws_options($lookup['lubrication_type'] ?? [], '', $lookupDefault['lubrication_type'] ?? '') ?>
</select> </select>
</div> </div>
<div class="col-md-8"> <div class="col-md-8">
@@ -764,29 +818,6 @@ $isEdit = ($worksheet_id > 0);
<input type="text" class="form-control" name="lubrication_notes" id="lubrication_notes"> <input type="text" class="form-control" name="lubrication_notes" id="lubrication_notes">
</div> </div>
<div class="col-md-4">
<label class="form-label fw-semibold">Codice confezione</label>
<select class="form-select" name="requested_package_code" id="requested_package_code">
<?= ws_options($lookup['requested_package_code'] ?? [], '', $lookupDefault['requested_package_code'] ?? '') ?>
</select>
</div>
<div class="col-md-4">
<label class="form-label fw-semibold">Metri per confezione</label>
<input type="number" class="form-control" name="meters_per_package" id="meters_per_package">
</div>
<div class="col-md-4">
<label class="form-label fw-semibold">Tolleranza metri/confezione</label>
<input type="text" class="form-control" name="meters_per_package_tolerance" id="meters_per_package_tolerance" placeholder="es. +/- 4m">
</div>
<div class="col-12">
<label class="form-label fw-semibold">Note metri/confezione</label>
<input type="text" class="form-control" name="meters_per_package_notes" id="meters_per_package_notes">
</div>
<div class="col-12 text-center mt-2"> <div class="col-12 text-center mt-2">
<button type="submit" class="btn btn-add">💾 Salva Mescola</button> <button type="submit" class="btn btn-add">💾 Salva Mescola</button>
</div> </div>
@@ -801,7 +832,6 @@ $isEdit = ($worksheet_id > 0);
<script> <script>
$(document).ready(function() { $(document).ready(function() {
const wsIdInput = $('#wsId'); const wsIdInput = $('#wsId');
const btnAddMix = $('#btnAddMix'); const btnAddMix = $('#btnAddMix');
@@ -826,7 +856,6 @@ $isEdit = ($worksheet_id > 0);
} }
}); });
function enableMixButtonIfSaved() { function enableMixButtonIfSaved() {
const id = parseInt(wsIdInput.val() || '0', 10); const id = parseInt(wsIdInput.val() || '0', 10);
if (id > 0) { if (id > 0) {
@@ -864,8 +893,6 @@ $isEdit = ($worksheet_id > 0);
}) })
.then(async (r) => { .then(async (r) => {
const text = await r.text(); const text = await r.text();
// Debug: if server returns warnings/HTML, you'll see it in console
try { try {
return JSON.parse(text); return JSON.parse(text);
} catch (err) { } catch (err) {
@@ -886,13 +913,11 @@ $isEdit = ($worksheet_id > 0);
wsIdInput.val(data.id); wsIdInput.val(data.id);
enableMixButtonIfSaved(); enableMixButtonIfSaved();
// If new, update URL to edit mode
if (!window.location.search.includes('id=')) { if (!window.location.search.includes('id=')) {
const newUrl = 'manage-worksheet.php?id=' + data.id; const newUrl = 'manage-worksheet.php?id=' + data.id;
window.history.replaceState({}, '', newUrl); window.history.replaceState({}, '', newUrl);
} }
// ✅ What you want: confirm + stay on page + open modal if user wants
Swal.fire({ Swal.fire({
icon: 'success', icon: 'success',
title: 'Testata salvata', title: 'Testata salvata',
@@ -916,7 +941,6 @@ $isEdit = ($worksheet_id > 0);
}); });
}); });
// Prepare modal for add // Prepare modal for add
$('#mixModal').on('show.bs.modal', function() { $('#mixModal').on('show.bs.modal', function() {
const wsId = parseInt(wsIdInput.val() || '0', 10); const wsId = parseInt(wsIdInput.val() || '0', 10);
@@ -929,12 +953,12 @@ $isEdit = ($worksheet_id > 0);
return false; return false;
} }
// Reset for add by default
$('#mixModalTitle').text('Aggiungi Mescola'); $('#mixModalTitle').text('Aggiungi Mescola');
$('#mixForm')[0].reset(); $('#mixForm')[0].reset();
$('#mixRowId').val('0'); $('#mixRowId').val('0');
$('#mixWorksheetId').val(wsId); $('#mixWorksheetId').val(wsId);
$('#idmescola').prop('disabled', false); $('#idmescola').prop('disabled', false).val('').trigger('change');
$('#lubrication_type').val('');
}); });
// Edit mix row // Edit mix row
@@ -942,32 +966,21 @@ $isEdit = ($worksheet_id > 0);
let row = $(this).attr('data-row'); let row = $(this).attr('data-row');
row = JSON.parse(row); row = JSON.parse(row);
// Titolo modale
$('#mixModalTitle').text('Modifica Mescola'); $('#mixModalTitle').text('Modifica Mescola');
// NON resettare in "add"
$('#mixForm')[0].reset(); $('#mixForm')[0].reset();
// Set id riga e worksheet
$('#mixRowId').val(row.id); $('#mixRowId').val(row.id);
$('#mixWorksheetId').val(row.worksheet_id); $('#mixWorksheetId').val(row.worksheet_id);
// Mescola (se usi select2 devi triggerare change)
$('#idmescola').prop('disabled', false); $('#idmescola').prop('disabled', false);
$('#idmescola').val(row.idmescola).trigger('change'); $('#idmescola').val(row.idmescola).trigger('change');
// Campi
$('#mix_weight_g_m').val(row.mix_weight_g_m ?? ''); $('#mix_weight_g_m').val(row.mix_weight_g_m ?? '');
$('#required_density').val(row.required_density ?? ''); $('#required_density').val(row.required_density ?? '');
$('#required_hardness_shore_a').val(row.required_hardness_shore_a ?? ''); $('#required_hardness_shore_a').val(row.required_hardness_shore_a ?? '');
$('#lubrication_type').val(row.lubrication_type ?? ''); $('#lubrication_type').val(row.lubrication_type ?? '');
$('#lubrication_notes').val(row.lubrication_notes ?? ''); $('#lubrication_notes').val(row.lubrication_notes ?? '');
$('#requested_package_code').val(row.requested_package_code ?? '');
$('#meters_per_package').val(row.meters_per_package ?? '');
$('#meters_per_package_tolerance').val(row.meters_per_package_tolerance ?? '');
$('#meters_per_package_notes').val(row.meters_per_package_notes ?? '');
// Apri modale
const modal = new bootstrap.Modal(document.getElementById('mixModal')); const modal = new bootstrap.Modal(document.getElementById('mixModal'));
modal.show(); modal.show();
}); });
@@ -988,11 +1001,10 @@ $isEdit = ($worksheet_id > 0);
.then(data => { .then(data => {
if (data.success) { if (data.success) {
Swal.fire({ Swal.fire({
icon: 'success', icon: 'success',
title: 'Salvata!', title: 'Salvata!',
timer: 800 timer: 800
}) }).then(() => location.reload());
.then(() => location.reload());
} else { } else {
Swal.fire({ Swal.fire({
icon: 'error', icon: 'error',
@@ -1029,11 +1041,10 @@ $isEdit = ($worksheet_id > 0);
.then(data => { .then(data => {
if (data.success) { if (data.success) {
Swal.fire({ Swal.fire({
icon: 'success', icon: 'success',
title: 'Eliminata!', title: 'Eliminata!',
timer: 800 timer: 800
}) }).then(() => location.reload());
.then(() => location.reload());
} else { } else {
Swal.fire({ Swal.fire({
icon: 'error', icon: 'error',
@@ -1044,7 +1055,6 @@ $isEdit = ($worksheet_id > 0);
}); });
}); });
}); });
}); });
</script> </script>
</body> </body>