fixing worksheet
This commit is contained in:
@@ -496,14 +496,41 @@ function h($v)
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Select2 for category filter + modal selects
|
// Select2 solo per il filtro categoria (fuori dai modali)
|
||||||
$('#categoryFilter, #add_category, #edit_category').select2({
|
$('#categoryFilter').select2({
|
||||||
theme: 'bootstrap4',
|
theme: 'bootstrap4',
|
||||||
width: '100%',
|
width: '100%',
|
||||||
placeholder: '-- Seleziona --',
|
placeholder: '-- Seleziona --',
|
||||||
allowClear: true
|
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
|
// Filter redirect
|
||||||
$('#categoryFilter').on('change', function() {
|
$('#categoryFilter').on('change', function() {
|
||||||
const v = $(this).val() || '';
|
const v = $(this).val() || '';
|
||||||
|
|||||||
@@ -365,18 +365,13 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $r) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load packaging items from dedicated table
|
// Load ALL packaging items (tutte le categorie, distinct via GROUP nel dropdown)
|
||||||
$packagingLookup = [
|
$packagingByCategory = []; // categoria => [ {value, label}, ... ]
|
||||||
'PACKAGING_TYPE' => [],
|
|
||||||
'BOX' => [],
|
|
||||||
'PALLET' => []
|
|
||||||
];
|
|
||||||
|
|
||||||
$stmt = $pdo->prepare("
|
$stmt = $pdo->prepare("
|
||||||
SELECT category, item_name, item_code
|
SELECT id, category, item_name, item_code
|
||||||
FROM packaging_items
|
FROM packaging_items
|
||||||
WHERE is_active = 1
|
WHERE is_active = 1
|
||||||
AND category IN ('PACKAGING_TYPE', 'BOX', 'PALLET')
|
|
||||||
ORDER BY category ASC, item_name ASC
|
ORDER BY category ASC, item_name ASC
|
||||||
");
|
");
|
||||||
$stmt->execute();
|
$stmt->execute();
|
||||||
@@ -387,12 +382,20 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $r) {
|
|||||||
$label .= ' — ' . $r['item_code'];
|
$label .= ' — ' . $r['item_code'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$packagingLookup[$r['category']][] = [
|
$packagingByCategory[$r['category']][] = [
|
||||||
'value' => $r['item_code'],
|
'value' => (int)$r['id'], // salviamo l'ID
|
||||||
'label' => $label
|
'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
|
// Load mescole dropdown for modal
|
||||||
$mescole = $pdo->query("
|
$mescole = $pdo->query("
|
||||||
SELECT id, nome, nomeuscita
|
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
|
// Helpers
|
||||||
function h($v)
|
function h($v)
|
||||||
{
|
{
|
||||||
@@ -1045,14 +1061,28 @@ $isEdit = ($worksheet_id > 0);
|
|||||||
<div class="soft-badge">Packaging</div>
|
<div class="soft-badge">Packaging</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="section-body">
|
<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="row g-3">
|
||||||
<div class="col-lg-4">
|
<div class="col-lg-4">
|
||||||
<label class="form-label">Codice confezione</label>
|
<label class="form-label">Categoria imballo</label>
|
||||||
<select class="form-select" name="requested_package_code" id="requested_package_code">
|
<select class="form-select" id="packaging_category">
|
||||||
<?= packaging_options($packagingLookup['PACKAGING_TYPE'] ?? [], $worksheet['requested_package_code'] ?? '') ?>
|
<option value="">-- Seleziona --</option>
|
||||||
|
<?php foreach ($packagingCategories as $cat): ?>
|
||||||
|
<option value="<?= h($cat) ?>" <?= $savedPackageCategory === $cat ? 'selected' : '' ?>>
|
||||||
|
<?= h($cat) ?>
|
||||||
|
</option>
|
||||||
|
<?php endforeach; ?>
|
||||||
</select>
|
</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>
|
||||||
|
|
||||||
<div class="col-lg-4 col-md-6">
|
<div class="col-lg-4 col-md-6">
|
||||||
@@ -1074,13 +1104,6 @@ $isEdit = ($worksheet_id > 0);
|
|||||||
value="<?= $worksheet ? h($worksheet['meters_per_package_notes']) : '' ?>">
|
value="<?= $worksheet ? h($worksheet['meters_per_package_notes']) : '' ?>">
|
||||||
</div>
|
</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">
|
<div class="col-lg-3 col-md-6">
|
||||||
<label class="form-label">N° conf./pezzi per scatola</label>
|
<label class="form-label">N° 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"
|
||||||
@@ -1093,13 +1116,6 @@ $isEdit = ($worksheet_id > 0);
|
|||||||
value="<?= $worksheet ? h($worksheet['meters_per_box']) : '' ?>">
|
value="<?= $worksheet ? h($worksheet['meters_per_box']) : '' ?>">
|
||||||
</div>
|
</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">
|
<div class="col-lg-3 col-md-6">
|
||||||
<label class="form-label">Scatole/conf. per bancale</label>
|
<label class="form-label">Scatole/conf. per bancale</label>
|
||||||
<input type="number" class="form-control" name="boxes_or_packages_per_pallet"
|
<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() {
|
$('#mixModal').on('shown.bs.modal', function() {
|
||||||
if (!$('#idmescola').data('select2')) {
|
if (!$('#idmescola').data('select2')) {
|
||||||
$('#idmescola').select2({
|
$('#idmescola').select2({
|
||||||
|
|||||||
@@ -272,6 +272,13 @@
|
|||||||
<td><span class='qty-badge'>{$qtyTot}</span></td>
|
<td><span class='qty-badge'>{$qtyTot}</span></td>
|
||||||
<td>{$badge}</td>
|
<td>{$badge}</td>
|
||||||
<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'
|
<button class='btn btn-sm btn-outline-dark manage-stock'
|
||||||
data-id='{$r['id']}'
|
data-id='{$r['id']}'
|
||||||
data-name='" . htmlspecialchars($r['item_name'], ENT_QUOTES) . "'>
|
data-name='" . htmlspecialchars($r['item_name'], ENT_QUOTES) . "'>
|
||||||
@@ -342,7 +349,47 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</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 -->
|
<!-- MODALE: STOCK FORNITORI/LOTTI -->
|
||||||
<div class="modal fade" id="stockModal" tabindex="-1">
|
<div class="modal fade" id="stockModal" tabindex="-1">
|
||||||
<div class="modal-dialog modal-xl modal-dialog-centered">
|
<div class="modal-dialog modal-xl modal-dialog-centered">
|
||||||
@@ -505,7 +552,48 @@
|
|||||||
|
|
||||||
$('#filterActive, #filterCategory').on('change', refreshUrlParams);
|
$('#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
|
// Create new item
|
||||||
$("#addItemForm").on("submit", function(e) {
|
$("#addItemForm").on("submit", function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
@@ -558,11 +646,16 @@
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Flag: true se lo stock è stato modificato mentre il modale era aperto
|
||||||
|
let stockChanged = false;
|
||||||
|
|
||||||
// Open stock modal
|
// Open stock modal
|
||||||
$(document).on("click", ".manage-stock", function() {
|
$(document).on("click", ".manage-stock", function() {
|
||||||
const id = $(this).data("id");
|
const id = $(this).data("id");
|
||||||
const name = $(this).data("name");
|
const name = $(this).data("name");
|
||||||
|
|
||||||
|
stockChanged = false; // reset ad ogni apertura
|
||||||
|
|
||||||
$("#stockItemId").val(id);
|
$("#stockItemId").val(id);
|
||||||
$("#stockItemName").text(name);
|
$("#stockItemName").text(name);
|
||||||
|
|
||||||
@@ -571,6 +664,13 @@
|
|||||||
loadSuppliersSelect($("#stockSupplier"), $("#stockModal")).then(() => stockLoadRows(id));
|
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
|
// Click edit stock row
|
||||||
$(document).on("click", ".stock-edit", function() {
|
$(document).on("click", ".stock-edit", function() {
|
||||||
$("#stockEditId").val($(this).data("id"));
|
$("#stockEditId").val($(this).data("id"));
|
||||||
@@ -629,11 +729,9 @@
|
|||||||
.then(r => r.json())
|
.then(r => r.json())
|
||||||
.then(data => {
|
.then(data => {
|
||||||
if (data.success) {
|
if (data.success) {
|
||||||
|
stockChanged = true;
|
||||||
stockResetForm();
|
stockResetForm();
|
||||||
stockLoadRows(itemId);
|
stockLoadRows(itemId);
|
||||||
// Refresh totals by reloading page (simple and safe)
|
|
||||||
// If you want live update without reload, we can do it.
|
|
||||||
// location.reload();
|
|
||||||
} else {
|
} else {
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
icon: "error",
|
icon: "error",
|
||||||
@@ -669,8 +767,8 @@
|
|||||||
.then(r => r.json())
|
.then(r => r.json())
|
||||||
.then(data => {
|
.then(data => {
|
||||||
if (data.success) {
|
if (data.success) {
|
||||||
|
stockChanged = true;
|
||||||
stockLoadRows(itemId);
|
stockLoadRows(itemId);
|
||||||
// location.reload();
|
|
||||||
} else {
|
} else {
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
icon: "error",
|
icon: "error",
|
||||||
|
|||||||
@@ -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()]);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user