fixed products

This commit is contained in:
2025-12-06 20:11:54 +01:00
parent 279bdd615e
commit 8c5b9a0d85
4 changed files with 641 additions and 290 deletions
+235 -205
View File
@@ -663,221 +663,251 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
</div>
</div>
<!-- Modale per aggiungere un prodotto -->
<div class="modal-body">
<input type="hidden" name="action" value="add_product">
<div class="row">
<div class="col-md-6 mb-3">
<label for="add_product_name" class="form-label">Nome Prodotto</label>
<input type="text" class="form-control" id="add_product_name" name="name" required>
</div>
<div class="col-md-6 mb-3">
<label for="add_product_variation_name" class="form-label">Nome Variazione</label>
<input type="text" class="form-control" id="add_product_variation_name" name="variation_name" required placeholder="Es. 5 Ingressi">
</div>
<div class="col-md-6 mb-3">
<label for="add_product_type" class="form-label">Tipo</label>
<select class="form-control" id="add_product_type" name="type" required>
<option value="carnet">Carnet</option>
<option value="subscription">Abbonamento</option>
<option value="drop_in">Lezione Singola</option>
</select>
</div>
<div class="col-md-6 mb-3">
<label for="add_product_price" class="form-label">Prezzo (€)</label>
<input type="number" step="0.01" class="form-control" id="add_product_price" name="price" required>
</div>
<div class="col-md-6 mb-3">
<label for="add_product_duration_days" class="form-label">Durata (giorni)</label>
<input type="number" class="form-control" id="add_product_duration_days" name="duration_days">
<small class="form-text text-muted">Lascia vuoto per lezioni singole.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_product_max_entries" class="form-label">Numero Massimo di Ingressi</label>
<input type="number" class="form-control" id="add_product_max_entries" name="max_entries">
<small class="form-text text-muted">Lascia vuoto per abbonamenti illimitati.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_product_weekly_limit" class="form-label">Limite Settimanale</label>
<input type="number" class="form-control" id="add_product_weekly_limit" name="weekly_limit">
<small class="form-text text-muted">Lascia vuoto se non applicabile.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_product_max_recoveries" class="form-label">Numero Massimo di Recuperi</label>
<input type="number" class="form-control" id="add_product_max_recoveries" name="max_recoveries">
<small class="form-text text-muted">Lascia vuoto se non applicabile.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_product_recovery_validity_days" class="form-label">Validità Recuperi (giorni)</label>
<input type="number" class="form-control" id="add_product_recovery_validity_days" name="recovery_validity_days">
<small class="form-text text-muted">Lascia vuoto se non applicabile.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_product_max_inventory" class="form-label">Inventario Massimo</label>
<input type="number" class="form-control" id="add_product_max_inventory" name="max_inventory">
<small class="form-text text-muted">Lascia vuoto per illimitato.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_product_allow_freeze" class="form-label">Permetti Congelamento</label>
<select class="form-control" id="add_product_allow_freeze" name="allow_freeze">
<option value="0">No</option>
<option value="1">Sì</option>
</select>
</div>
<div class="col-md-6 mb-3">
<label for="add_product_freeze_max_days" class="form-label">Giorni Massimi di Congelamento</label>
<input type="number" class="form-control" id="add_product_freeze_max_days" name="freeze_max_days">
<small class="form-text text-muted">Lascia vuoto se non applicabile.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_product_is_full_access" class="form-label">Accesso Completo</label>
<select class="form-control" id="add_product_is_full_access" name="is_full_access">
<option value="0">No</option>
<option value="1">Sì</option>
</select>
<small class="form-text text-muted">Se sì, il prodotto dà accesso a tutte le classi.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_product_auto_propagate" class="form-label">Propaga in Automatico all'Ordine</label>
<select class="form-control" id="add_product_auto_propagate" name="auto_propagate_to_order">
<option value="0">No</option>
<option value="1">Sì</option>
</select>
<small class="form-text text-muted">Se sì, il prodotto verrà aggiunto automaticamente agli ordini futuri.</small>
</div>
<div class="col-md-12 mb-3" id="add_class_types_section">
<label class="form-label">Classi e Variazioni Associate</label>
<?php foreach ($all_classes as $class_id => $class): ?>
<div class="form-check">
<input class="form-check-input class-checkbox" type="checkbox" id="add_class_<?php echo $class_id; ?>" data-class-id="<?php echo $class_id; ?>">
<label class="form-check-label" for="add_class_<?php echo $class_id; ?>">
<?php echo htmlspecialchars($class['name']); ?>
</label>
<?php if (!empty($class['variations'])): ?>
<div class="ms-4">
<?php foreach ($class['variations'] as $variation): ?>
<div class="form-check">
<input class="form-check-input variation-checkbox" type="checkbox" name="class_types[]" value="<?php echo $variation['id']; ?>" id="add_variation_<?php echo $variation['id']; ?>" data-class-id="<?php echo $class_id; ?>">
<label class="form-check-label" for="add_variation_<?php echo $variation['id']; ?>">
<?php echo htmlspecialchars($variation['name']); ?>
</label>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<!-- ================================================================== -->
<!-- MODALE AGGIUNGI PRODOTTO (era mancante!) -->
<!-- ================================================================== -->
<div class="modal fade" id="addProductModal" tabindex="-1" aria-labelledby="addProductModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" style="max-width: 90vw; height: 90vh;">
<div class="modal-content d-flex flex-column" style="height: 100%;">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="addProductModalLabel">Aggiungi Nuovo Prodotto</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<?php endforeach; ?>
<form action="" method="POST">
<div class="modal-body">
<input type="hidden" name="action" value="add_product">
<div class="row g-3">
<div class="col-md-6">
<label class="form-label">Nome Prodotto <span class="text-danger">*</span></label>
<input type="text" class="form-control" name="name" required>
</div>
<div class="col-md-6">
<label class="form-label">Nome Variazione <span class="text-danger">*</span></label>
<input type="text" class="form-control" name="variation_name" required placeholder="es. 10 ingressi">
</div>
<div class="col-md-6">
<label class="form-label">Tipo <span class="text-danger">*</span></label>
<select class="form-select" name="type" required>
<option value="carnet">Carnet</option>
<option value="subscription">Abbonamento</option>
<option value="drop_in">Lezione Singola</option>
</select>
</div>
<div class="col-md-6">
<label class="form-label">Prezzo (€) <span class="text-danger">*</span></label>
<input type="number" step="0.01" class="form-control" name="price" required>
</div>
<div class="col-md-6">
<label class="form-label">Durata (giorni)</label>
<input type="number" class="form-control" name="duration_days">
<small class="text-muted">Lascia vuoto per lezioni singole</small>
</div>
<div class="col-md-6">
<label class="form-label">Max Ingressi</label>
<input type="number" class="form-control" name="max_entries">
<small class="text-muted">Lascia vuoto per abbonamenti illimitati</small>
</div>
<div class="col-md-6">
<label class="form-label">Limite settimanale</label>
<input type="number" class="form-control" name="weekly_limit">
</div>
<div class="col-md-6">
<label class="form-label">Max Recuperi</label>
<input type="number" class="form-control" name="max_recoveries">
</div>
<div class="col-md-6">
<label class="form-label">Validità recuperi (giorni)</label>
<input type="number" class="form-control" name="recovery_validity_days">
</div>
<div class="col-md-6">
<label class="form-label">Inventario massimo</label>
<input type="number" class="form-control" name="max_inventory">
</div>
<div class="col-md-6">
<label class="form-label">Permetti congelamento</label>
<select class="form-select" name="allow_freeze">
<option value="0">No</option>
<option value="1">Sì</option>
</select>
</div>
<div class="col-md-6">
<label class="form-label">Giorni max congelamento</label>
<input type="number" class="form-control" name="freeze_max_days">
</div>
<div class="col-md-6">
<label class="form-label">Accesso completo a tutte le classi</label>
<select class="form-select" id="add_product_is_full_access" name="is_full_access" onchange="toggleClassTypesSection(this.value, 'add')">
<option value="0">No</option>
<option value="1">Sì</option>
</select>
</div>
<div class="col-md-6">
<label class="form-label">Propaga automaticamente all'ordine</label>
<select class="form-select" name="auto_propagate_to_order">
<option value="0">No</option>
<option value="1">Sì</option>
</select>
</div>
<!-- SEZIONE CLASSI (nascondibile) -->
<div class="col-12" id="add_class_types_section">
<label class="form-label">Classi e orari associati</label>
<div class="border rounded p-3" style="max-height: 300px; overflow-y: auto;">
<?php foreach ($all_classes as $class_id => $class): ?>
<div class="form-check">
<input class="form-check-input class-checkbox" type="checkbox" id="add_class_<?php echo $class_id; ?>" data-class-id="<?php echo $class_id; ?>">
<label class="form-check-label fw-bold" for="add_class_<?php echo $class_id; ?>">
<?php echo htmlspecialchars($class['name']); ?>
</label>
<?php if (!empty($class['variations'])): ?>
<div class="ms-4">
<?php foreach ($class['variations'] as $variation): ?>
<div class="form-check">
<input class="form-check-input variation-checkbox" type="checkbox" name="class_types[]" value="<?php echo $variation['id']; ?>" id="add_variation_<?php echo $variation['id']; ?>" data-class-id="<?php echo $class_id; ?>">
<label class="form-check-label" for="add_variation_<?php echo $variation['id']; ?>">
<?php echo htmlspecialchars($variation['name']); ?>
</label>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annulla</button>
<button type="submit" class="btn btn-primary">Crea Prodotto</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- Modale per aggiungere una variazione a un prodotto esistente -->
<!-- Modale per aggiungere una variazione a un prodotto esistente -->
<div class="modal fade" id="addVariationModal" tabindex="-1" aria-labelledby="addVariationModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="addVariationModalLabel">Aggiungi Variazione</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form action="" method="POST">
<div class="modal-body">
<input type="hidden" name="action" value="add_variation">
<input type="hidden" name="product_id" id="add_variation_product_id">
<div class="row">
<div class="col-md-6 mb-3">
<label for="add_variation_product_name" class="form-label">Nome Prodotto</label>
<input type="text" class="form-control" id="add_variation_product_name" disabled>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_name" class="form-label">Nome Variazione</label>
<input type="text" class="form-control" id="add_variation_name" name="variation_name" required placeholder="Es. 5 Ingressi">
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_price" class="form-label">Prezzo (€)</label>
<input type="number" step="0.01" class="form-control" id="add_variation_price" name="price" required>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_duration_days" class="form-label">Durata (giorni)</label>
<input type="number" class="form-control" id="add_variation_duration_days" name="duration_days">
<small class="form-text text-muted">Lascia vuoto per lezioni singole.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_max_entries" class="form-label">Numero Massimo di Ingressi</label>
<input type="number" class="form-control" id="add_variation_max_entries" name="max_entries">
<small class="form-text text-muted">Lascia vuoto per abbonamenti illimitati.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_weekly_limit" class="form-label">Limite Settimanale</label>
<input type="number" class="form-control" id="add_variation_weekly_limit" name="weekly_limit">
<small class="form-text text-muted">Lascia vuoto se non applicabile.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_max_recoveries" class="form-label">Numero Massimo di Recuperi</label>
<input type="number" class="form-control" id="add_variation_max_recoveries" name="max_recoveries">
<small class="form-text text-muted">Lascia vuoto se non applicabile.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_recovery_validity_days" class="form-label">Validità Recuperi (giorni)</label>
<input type="number" class="form-control" id="add_variation_recovery_validity_days" name="recovery_validity_days">
<small class="form-text text-muted">Lascia vuoto se non applicabile.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_max_inventory" class="form-label">Inventario Massimo</label>
<input type="number" class="form-control" id="add_variation_max_inventory" name="max_inventory">
<small class="form-text text-muted">Lascia vuoto per illimitato.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_allow_freeze" class="form-label">Permetti Congelamento</label>
<select class="form-control" id="add_variation_allow_freeze" name="allow_freeze">
<option value="0">No</option>
<option value="1">Sì</option>
</select>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_freeze_max_days" class="form-label">Giorni Massimi di Congelamento</label>
<input type="number" class="form-control" id="add_variation_freeze_max_days" name="freeze_max_days">
<small class="form-text text-muted">Lascia vuoto se non applicabile.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_auto_propagate" class="form-label">Propaga in Automatico all'Ordine</label>
<select class="form-control" id="add_variation_auto_propagate" name="auto_propagate_to_order">
<option value="0">No</option>
<option value="1">Sì</option>
</select>
<small class="form-text text-muted">Se sì, la variazione verrà aggiunta automaticamente agli ordini futuri.</small>
</div>
<div class="col-md-12 mb-3" id="add_variation_class_types_section">
<label class="form-label">Classi e Variazioni Associate</label>
<p class="text-muted small">Se non selezioni nessuna classe, verranno ereditate le classi del prodotto.</p>
<?php foreach ($all_classes as $class_id => $class): ?>
<div class="form-check">
<input class="form-check-input class-checkbox" type="checkbox" id="add_variation_class_<?php echo $class_id; ?>" data-class-id="<?php echo $class_id; ?>">
<label class="form-check-label" for="add_variation_class_<?php echo $class_id; ?>">
<?php echo htmlspecialchars($class['name']); ?>
</label>
<?php if (!empty($class['variations'])): ?>
<div class="ms-4">
<?php foreach ($class['variations'] as $variation): ?>
<div class="form-check">
<input class="form-check-input variation-checkbox" type="checkbox" name="class_types[]" value="<?php echo $variation['id']; ?>" id="add_variation_variation_<?php echo $variation['id']; ?>" data-class-id="<?php echo $class_id; ?>">
<label class="form-check-label" for="add_variation_variation_<?php echo $variation['id']; ?>">
<?php echo htmlspecialchars($variation['name']); ?>
</label>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
<?php endforeach; ?>
<div class="modal-dialog modal-dialog-centered" style="max-width: 90vw; height: 90vh;">
<div class="modal-content d-flex flex-column" style="height: 100%;">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="addVariationModalLabel">Aggiungi Variazione</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form action="" method="POST">
<div class="modal-body">
<input type="hidden" name="action" value="add_variation">
<input type="hidden" name="product_id" id="add_variation_product_id">
<div class="row">
<div class="col-md-6 mb-3">
<label for="add_variation_product_name" class="form-label">Nome Prodotto</label>
<input type="text" class="form-control" id="add_variation_product_name" disabled>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_name" class="form-label">Nome Variazione</label>
<input type="text" class="form-control" id="add_variation_name" name="variation_name" required placeholder="Es. 5 Ingressi">
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_price" class="form-label">Prezzo (€)</label>
<input type="number" step="0.01" class="form-control" id="add_variation_price" name="price" required>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_duration_days" class="form-label">Durata (giorni)</label>
<input type="number" class="form-control" id="add_variation_duration_days" name="duration_days">
<small class="form-text text-muted">Lascia vuoto per lezioni singole.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_max_entries" class="form-label">Numero Massimo di Ingressi</label>
<input type="number" class="form-control" id="add_variation_max_entries" name="max_entries">
<small class="form-text text-muted">Lascia vuoto per abbonamenti illimitati.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_weekly_limit" class="form-label">Limite Settimanale</label>
<input type="number" class="form-control" id="add_variation_weekly_limit" name="weekly_limit">
<small class="form-text text-muted">Lascia vuoto se non applicabile.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_max_recoveries" class="form-label">Numero Massimo di Recuperi</label>
<input type="number" class="form-control" id="add_variation_max_recoveries" name="max_recoveries">
<small class="form-text text-muted">Lascia vuoto se non applicabile.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_recovery_validity_days" class="form-label">Validità Recuperi (giorni)</label>
<input type="number" class="form-control" id="add_variation_recovery_validity_days" name="recovery_validity_days">
<small class="form-text text-muted">Lascia vuoto se non applicabile.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_max_inventory" class="form-label">Inventario Massimo</label>
<input type="number" class="form-control" id="add_variation_max_inventory" name="max_inventory">
<small class="form-text text-muted">Lascia vuoto per illimitato.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_allow_freeze" class="form-label">Permetti Congelamento</label>
<select class="form-control" id="add_variation_allow_freeze" name="allow_freeze">
<option value="0">No</option>
<option value="1">Sì</option>
</select>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_freeze_max_days" class="form-label">Giorni Massimi di Congelamento</label>
<input type="number" class="form-control" id="add_variation_freeze_max_days" name="freeze_max_days">
<small class="form-text text-muted">Lascia vuoto se non applicabile.</small>
</div>
<div class="col-md-6 mb-3">
<label for="add_variation_auto_propagate" class="form-label">Propaga in Automatico all'Ordine</label>
<select class="form-control" id="add_variation_auto_propagate" name="auto_propagate_to_order">
<option value="0">No</option>
<option value="1">Sì</option>
</select>
<small class="form-text text-muted">Se sì, la variazione verrà aggiunta automaticamente agli ordini futuri.</small>
</div>
<div class="col-md-12 mb-3" id="add_variation_class_types_section">
<label class="form-label">Classi e Variazioni Associate</label>
<p class="text-muted small">Se non selezioni nessuna classe, verranno ereditate le classi del prodotto.</p>
<?php foreach ($all_classes as $class_id => $class): ?>
<div class="form-check">
<input class="form-check-input class-checkbox" type="checkbox" id="add_variation_class_<?php echo $class_id; ?>" data-class-id="<?php echo $class_id; ?>">
<label class="form-check-label" for="add_variation_class_<?php echo $class_id; ?>">
<?php echo htmlspecialchars($class['name']); ?>
</label>
<?php if (!empty($class['variations'])): ?>
<div class="ms-4">
<?php foreach ($class['variations'] as $variation): ?>
<div class="form-check">
<input class="form-check-input variation-checkbox" type="checkbox" name="class_types[]" value="<?php echo $variation['id']; ?>" id="add_variation_variation_<?php echo $variation['id']; ?>" data-class-id="<?php echo $class_id; ?>">
<label class="form-check-label" for="add_variation_variation_<?php echo $variation['id']; ?>">
<?php echo htmlspecialchars($variation['name']); ?>
</label>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Chiudi</button>
<button type="submit" class="btn btn-primary">Aggiungi Variazione</button>
</div>
</form>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Chiudi</button>
<button type="submit" class="btn btn-primary">Aggiungi Variazione</button>
</div>
</form>
</div>
</div>
</div>
</div>