diff --git a/db/migrations/20260909121829_create_work_sheet_packages.php b/db/migrations/20260909121829_create_work_sheet_packages.php new file mode 100644 index 00000000..6fa6b652 --- /dev/null +++ b/db/migrations/20260909121829_create_work_sheet_packages.php @@ -0,0 +1,25 @@ +table('work_sheet_packages', ['id' => 'id']) + ->addColumn('worksheet_id', 'integer', ['limit' => 11]) + ->addColumn('package_code', 'integer', ['limit' => 11, 'comment' => 'FK -> packaging_items.id']) + ->addColumn('package_position', 'integer', ['default' => 1]) + ->addColumn('created_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP']) + ->addColumn('updated_at', 'timestamp', ['default' => 'CURRENT_TIMESTAMP', 'update' => 'CURRENT_TIMESTAMP']) + ->addIndex(['worksheet_id'], ['name' => 'idx_wsp_ws']) + ->addIndex(['package_code'], ['name' => 'idx_wsp_pkg']) + ->addIndex(['worksheet_id', 'package_code'], ['unique' => true, 'name' => 'uk_wsp_ws_pkg']) + ->addIndex(['worksheet_id', 'package_position'], ['unique' => true, 'name' => 'uk_wsp_ws_position']) + ->addForeignKey('worksheet_id', 'work_sheets', 'id', ['delete' => 'CASCADE', 'update' => 'CASCADE']) + ->addForeignKey('package_code', 'packaging_items', 'id', ['update' => 'CASCADE']) + ->create(); + } +} diff --git a/public/userarea/include/headscript.php b/public/userarea/include/headscript.php index 91d5a1ac..d44b3b75 100644 --- a/public/userarea/include/headscript.php +++ b/public/userarea/include/headscript.php @@ -61,3 +61,11 @@ require_once(__DIR__ . '/../../languages/en/general.php'); //include("generalsettings.php"); require_once __DIR__ . '/permissions_helper.php'; require_once(__DIR__ . '/popup-moved.php'); + +// Timbra la sessione dell'utente a ogni pagina (rolling manuale) +try { + $pdoSess = DBHandlerSelect::getInstance()->getConnection(); + $pdoSess->prepare("UPDATE auth_sessions SET last_activity = ? WHERE user_id = ? ORDER BY last_activity DESC LIMIT 1") + ->execute([time(), $iduserlogin]); +} catch (\Throwable $e) { /* non bloccare la pagina */ +} diff --git a/public/userarea/manage-worksheet.php b/public/userarea/manage-worksheet.php index ea5e554c..e115f032 100644 --- a/public/userarea/manage-worksheet.php +++ b/public/userarea/manage-worksheet.php @@ -327,6 +327,68 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax']) && $_POST['aj exit; } + // Add package row + if ($action === 'save_package_row') { + $worksheet_id = (int)($_POST['worksheet_id'] ?? 0); + if ($worksheet_id <= 0) { + echo json_encode(['success' => false, 'message' => 'Salva prima il foglio (testata)']); + exit; + } + + $package_code = (int)($_POST['package_code'] ?? 0); + if ($package_code <= 0) { + echo json_encode(['success' => false, 'message' => 'Seleziona un imballo']); + exit; + } + + $pdo->beginTransaction(); + + $stmtPos = $pdo->prepare(" + SELECT IFNULL(MAX(package_position), 0) + 1 + FROM work_sheet_packages + WHERE worksheet_id = ? + FOR UPDATE + "); + $stmtPos->execute([$worksheet_id]); + $pos = (int)$stmtPos->fetchColumn(); + if ($pos <= 0) $pos = 1; + + try { + $stmt = $pdo->prepare(" + INSERT INTO work_sheet_packages + (worksheet_id, package_code, package_position) + VALUES (?, ?, ?) + "); + $stmt->execute([$worksheet_id, $package_code, $pos]); + } catch (PDOException $ex) { + $pdo->rollBack(); + if ((int)$ex->errorInfo[1] === 1062) { + echo json_encode(['success' => false, 'message' => 'Imballo già presente in questo foglio']); + exit; + } + throw $ex; + } + + $pdo->commit(); + echo json_encode(['success' => true]); + exit; + } + + // Delete package row + if ($action === 'delete_package_row') { + $row_id = (int)($_POST['row_id'] ?? 0); + if ($row_id <= 0) { + echo json_encode(['success' => false, 'message' => 'ID riga non valido']); + exit; + } + + $stmt = $pdo->prepare("DELETE FROM work_sheet_packages WHERE id = ?"); + $stmt->execute([$row_id]); + + echo json_encode(['success' => true]); + exit; + } + echo json_encode(['success' => false, 'message' => 'Azione sconosciuta']); exit; } catch (Exception $e) { @@ -406,6 +468,7 @@ $mescole = $pdo->query(" // Load worksheet (edit) $worksheet = null; $mixRows = []; +$packageRows = []; if ($worksheet_id > 0) { $stmt = $pdo->prepare(" @@ -430,6 +493,20 @@ if ($worksheet_id > 0) { "); $stmt->execute([$worksheet_id]); $mixRows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + $stmt = $pdo->prepare(" + SELECT + wsp.*, + pi.item_name AS package_name, + pi.item_code AS package_item_code, + pi.category AS package_category + FROM work_sheet_packages wsp + LEFT JOIN packaging_items pi ON pi.id = wsp.package_code + WHERE wsp.worksheet_id = ? + ORDER BY wsp.package_position ASC, wsp.id ASC + "); + $stmt->execute([$worksheet_id]); + $packageRows = $stmt->fetchAll(PDO::FETCH_ASSOC); } else { $worksheet_id = 0; } @@ -1079,10 +1156,56 @@ $isEdit = ($worksheet_id > 0);
| Pos | +Categoria | +Imballo | +Azioni | +
|---|---|---|---|
| = (int)$pr['package_position'] ?> | += h($pr['package_category'] ?? '-') ?> | +
+ = h($pr['package_name'] ?? '-') ?>
+
+ = h($pr['package_item_code']) ?>
+
+ |
+ + + | +