fixing worksheet

This commit is contained in:
2026-07-30 09:17:52 +02:00
parent e0fbd26207
commit 35e57c303f
4 changed files with 244 additions and 34 deletions
+29 -2
View File
@@ -496,14 +496,41 @@ function h($v)
}
});
// Select2 for category filter + modal selects
$('#categoryFilter, #add_category, #edit_category').select2({
// Select2 solo per il filtro categoria (fuori dai modali)
$('#categoryFilter').select2({
theme: 'bootstrap4',
width: '100%',
placeholder: '-- Seleziona --',
allowClear: true
});
// Select2 per il modale ADD: inizializza quando il modale è visibile
// e aggancia il dropdown dentro il modale (altrimenti le opzioni non si vedono)
$('#addModal').on('shown.bs.modal', function() {
if (!$('#add_category').data('select2')) {
$('#add_category').select2({
theme: 'bootstrap4',
width: '100%',
placeholder: '-- Seleziona --',
allowClear: true,
dropdownParent: $('#addModal')
});
}
});
// Select2 per il modale EDIT: stessa logica
$('#editModal').on('shown.bs.modal', function() {
if (!$('#edit_category').data('select2')) {
$('#edit_category').select2({
theme: 'bootstrap4',
width: '100%',
placeholder: '-- Seleziona --',
allowClear: true,
dropdownParent: $('#editModal')
});
}
});
// Filter redirect
$('#categoryFilter').on('change', function() {
const v = $(this).val() || '';
+77 -28
View File
@@ -365,18 +365,13 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $r) {
}
}
// Load packaging items from dedicated table
$packagingLookup = [
'PACKAGING_TYPE' => [],
'BOX' => [],
'PALLET' => []
];
// Load ALL packaging items (tutte le categorie, distinct via GROUP nel dropdown)
$packagingByCategory = []; // categoria => [ {value, label}, ... ]
$stmt = $pdo->prepare("
SELECT category, item_name, item_code
SELECT id, 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();
@@ -387,12 +382,20 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $r) {
$label .= ' — ' . $r['item_code'];
}
$packagingLookup[$r['category']][] = [
'value' => $r['item_code'],
$packagingByCategory[$r['category']][] = [
'value' => (int)$r['id'], // salviamo l'ID
'label' => $label
];
}
// Elenco categorie distinte (per il primo dropdown)
$packagingCategories = array_keys($packagingByCategory);
sort($packagingCategories);
// Questi verranno calcolati DOPO il caricamento del worksheet
$savedPackageCode = '';
$savedPackageCategory = '';
// Load mescole dropdown for modal
$mescole = $pdo->query("
SELECT id, nome, nomeuscita
@@ -432,6 +435,19 @@ if ($worksheet_id > 0) {
}
}
// Ora che $worksheet è caricato, ricava categoria + codice salvati per l'imballo
$savedPackageCode = $worksheet['requested_package_code'] ?? '';
if ($savedPackageCode !== '' && $savedPackageCode !== null) {
foreach ($packagingByCategory as $cat => $items) {
foreach ($items as $it) {
if ((string)$it['value'] === (string)$savedPackageCode) {
$savedPackageCategory = $cat;
break 2;
}
}
}
}
// Helpers
function h($v)
{
@@ -1045,14 +1061,28 @@ $isEdit = ($worksheet_id > 0);
<div class="soft-badge">Packaging</div>
</div>
<div class="section-body">
<div class="section-grid-note">Compila prima la confezione, poi eventuali dettagli di scatola e bancale</div>
<div class="section-grid-note">Seleziona prima la categoria, poi lo specifico elemento di imballo</div>
<div class="row g-3">
<div class="col-lg-4">
<label class="form-label">Codice confezione</label>
<select class="form-select" name="requested_package_code" id="requested_package_code">
<?= packaging_options($packagingLookup['PACKAGING_TYPE'] ?? [], $worksheet['requested_package_code'] ?? '') ?>
<label class="form-label">Categoria imballo</label>
<select class="form-select" id="packaging_category">
<option value="">-- Seleziona --</option>
<?php foreach ($packagingCategories as $cat): ?>
<option value="<?= h($cat) ?>" <?= $savedPackageCategory === $cat ? 'selected' : '' ?>>
<?= h($cat) ?>
</option>
<?php endforeach; ?>
</select>
<div class="input-tip">Es. PACKAGING_TYPE, BOX, PALLET…</div>
</div>
<div class="col-lg-4">
<label class="form-label">Elemento imballo</label>
<select class="form-select" name="requested_package_code" id="requested_package_code">
<option value="">-- Prima scegli una categoria --</option>
</select>
<div class="input-tip">Il valore salvato è il codice dell'elemento</div>
</div>
<div class="col-lg-4 col-md-6">
@@ -1074,13 +1104,6 @@ $isEdit = ($worksheet_id > 0);
value="<?= $worksheet ? h($worksheet['meters_per_package_notes']) : '' ?>">
</div>
<div class="col-lg-3 col-md-6">
<label class="form-label">Scatola (tipo)</label>
<select class="form-select" name="box_type" id="box_type">
<?= packaging_options($packagingLookup['BOX'] ?? [], $worksheet['box_type'] ?? '') ?>
</select>
</div>
<div class="col-lg-3 col-md-6">
<label class="form-label"> conf./pezzi per scatola</label>
<input type="number" class="form-control" name="packages_or_pieces_per_box"
@@ -1093,13 +1116,6 @@ $isEdit = ($worksheet_id > 0);
value="<?= $worksheet ? h($worksheet['meters_per_box']) : '' ?>">
</div>
<div class="col-lg-3 col-md-6">
<label class="form-label">Bancale (tipo)</label>
<select class="form-select" name="pallet_type" id="pallet_type">
<?= packaging_options($packagingLookup['PALLET'] ?? [], $worksheet['pallet_type'] ?? '') ?>
</select>
</div>
<div class="col-lg-3 col-md-6">
<label class="form-label">Scatole/conf. per bancale</label>
<input type="number" class="form-control" name="boxes_or_packages_per_pallet"
@@ -1338,6 +1354,39 @@ $isEdit = ($worksheet_id > 0);
});
}
// ---- Imballo: categoria -> elemento filtrato ----
const packagingData = <?= json_encode($packagingByCategory, JSON_UNESCAPED_UNICODE) ?>;
const savedPackageCode = <?= json_encode($savedPackageCode, JSON_UNESCAPED_UNICODE) ?>;
function fillPackagingItems(category, selectedValue) {
const $items = $('#requested_package_code');
$items.empty();
if (!category || !packagingData[category]) {
$items.append('<option value="">-- Prima scegli una categoria --</option>');
return;
}
$items.append('<option value="">-- Seleziona --</option>');
packagingData[category].forEach(function(it) {
const sel = (String(it.value) === String(selectedValue)) ? ' selected' : '';
$items.append('<option value="' + it.value + '"' + sel + '>' + it.label + '</option>');
});
}
// Al cambio categoria, ricarica gli elementi (svuota selezione)
$('#packaging_category').on('change', function() {
fillPackagingItems($(this).val(), '');
});
// Popola all'avvio se in modifica c'è già una categoria selezionata
// Usiamo il valore direttamente dal PHP, non dal .val() del select
const initialCat = <?= json_encode($savedPackageCategory, JSON_UNESCAPED_UNICODE) ?>;
if (initialCat) {
$('#packaging_category').val(initialCat);
fillPackagingItems(initialCat, savedPackageCode);
}
$('#mixModal').on('shown.bs.modal', function() {
if (!$('#idmescola').data('select2')) {
$('#idmescola').select2({
+102 -4
View File
@@ -272,6 +272,13 @@
<td><span class='qty-badge'>{$qtyTot}</span></td>
<td>{$badge}</td>
<td>
<button class='btn btn-sm btn-outline-primary edit-item'
data-id='{$r['id']}'
data-category='" . htmlspecialchars($r['category'], ENT_QUOTES) . "'
data-name='" . htmlspecialchars($r['item_name'], ENT_QUOTES) . "'
data-code='" . htmlspecialchars($r['item_code'], ENT_QUOTES) . "'>
✏️ Modifica
</button>
<button class='btn btn-sm btn-outline-dark manage-stock'
data-id='{$r['id']}'
data-name='" . htmlspecialchars($r['item_name'], ENT_QUOTES) . "'>
@@ -342,7 +349,47 @@
</div>
</div>
</div>
<!-- MODALE: MODIFICA IMBALLO -->
<div class="modal fade" id="editItemModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header" style="background-color:#cfe3ff;">
<h5 class="modal-title">Modifica Imballo</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<form id="editItemForm">
<input type="hidden" id="editItemId">
<div class="mb-3">
<label class="form-label fw-semibold">Categoria</label>
<select class="form-select" id="editCategory" required>
<option value="PACKAGING_TYPE">Tipo Confezione</option>
<option value="BOX">Scatola</option>
<option value="PALLET">Pallet</option>
<option value="OTHER">Altro</option>
</select>
</div>
<div class="mb-3">
<label class="form-label fw-semibold">Nome</label>
<input type="text" class="form-control" id="editItemName" required>
</div>
<div class="mb-3">
<label class="form-label fw-semibold">Codice</label>
<input type="text" class="form-control" id="editItemCode" required>
</div>
<div class="text-center">
<button type="submit" class="btn btn-add">💾 Salva modifiche</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- MODALE: STOCK FORNITORI/LOTTI -->
<div class="modal fade" id="stockModal" tabindex="-1">
<div class="modal-dialog modal-xl modal-dialog-centered">
@@ -505,7 +552,48 @@
$('#filterActive, #filterCategory').on('change', refreshUrlParams);
});
// Open edit item modal
$(document).on("click", ".edit-item", function() {
$("#editItemId").val($(this).data("id"));
$("#editCategory").val($(this).data("category"));
$("#editItemName").val($(this).data("name"));
$("#editItemCode").val($(this).data("code"));
$("#editItemModal").modal("show");
});
// Save edited item
$("#editItemForm").on("submit", function(e) {
e.preventDefault();
const id = $("#editItemId").val();
const category = $("#editCategory").val();
const item_name = $("#editItemName").val().trim();
const item_code = $("#editItemCode").val().trim();
fetch("update_packaging_item.php", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: `id=${encodeURIComponent(id)}&category=${encodeURIComponent(category)}&item_name=${encodeURIComponent(item_name)}&item_code=${encodeURIComponent(item_code)}`
})
.then(r => r.json())
.then(data => {
if (data.success) {
Swal.fire({
icon: "success",
title: "Aggiornato!"
}).then(() => location.reload());
} else {
Swal.fire({
icon: "error",
title: "Errore",
text: data.message || "Non aggiornato"
});
}
});
});
// Create new item
$("#addItemForm").on("submit", function(e) {
e.preventDefault();
@@ -558,11 +646,16 @@
});
});
// Flag: true se lo stock è stato modificato mentre il modale era aperto
let stockChanged = false;
// Open stock modal
$(document).on("click", ".manage-stock", function() {
const id = $(this).data("id");
const name = $(this).data("name");
stockChanged = false; // reset ad ogni apertura
$("#stockItemId").val(id);
$("#stockItemName").text(name);
@@ -571,6 +664,13 @@
loadSuppliersSelect($("#stockSupplier"), $("#stockModal")).then(() => stockLoadRows(id));
});
// Alla chiusura del modale, se qualcosa è cambiato ricarica la pagina
$("#stockModal").on("hidden.bs.modal", function() {
if (stockChanged) {
location.reload();
}
});
// Click edit stock row
$(document).on("click", ".stock-edit", function() {
$("#stockEditId").val($(this).data("id"));
@@ -629,11 +729,9 @@
.then(r => r.json())
.then(data => {
if (data.success) {
stockChanged = true;
stockResetForm();
stockLoadRows(itemId);
// Refresh totals by reloading page (simple and safe)
// If you want live update without reload, we can do it.
// location.reload();
} else {
Swal.fire({
icon: "error",
@@ -669,8 +767,8 @@
.then(r => r.json())
.then(data => {
if (data.success) {
stockChanged = true;
stockLoadRows(itemId);
// location.reload();
} else {
Swal.fire({
icon: "error",
+36
View File
@@ -0,0 +1,36 @@
<?php
include('include/headscript.php');
header('Content-Type: application/json; charset=utf-8');
$db = DBHandlerSelect::getInstance();
$pdo = $db->getConnection();
try {
$id = (int)($_POST['id'] ?? 0);
$category = trim($_POST['category'] ?? '');
$item_name = trim($_POST['item_name'] ?? '');
$item_code = trim($_POST['item_code'] ?? '');
$allowedCats = ['PACKAGING_TYPE', 'BOX', 'PALLET', 'OTHER'];
if ($id <= 0 || $category === '' || $item_name === '' || $item_code === '') {
echo json_encode(['success' => false, 'message' => 'Dati non validi']);
exit;
}
if (!in_array($category, $allowedCats, true)) {
echo json_encode(['success' => false, 'message' => 'Categoria non valida']);
exit;
}
$stmt = $pdo->prepare("
UPDATE packaging_items
SET category = ?, item_name = ?, item_code = ?
WHERE id = ?
");
$stmt->execute([$category, $item_name, $item_code, $id]);
echo json_encode(['success' => true]);
} catch (Exception $e) {
echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}