getConnection();
// Recupera la scuola
$stmt = $pdo->prepare("SELECT id, name FROM schools WHERE owner_id = ?");
$stmt->execute([$iduserlogin]);
$school = $stmt->fetch();
if (!$school) die("Scuola non trovata.");
$school_id = (int)$school['id'];
// === UTENTI DELLA SCUOLA (dropdown cercabile) ===
$stmtUsers = $pdo->prepare("
SELECT au.id, au.first_name, au.last_name, au.email
FROM user_schools us
JOIN auth_users au ON au.id = us.user_id
WHERE us.school_id = ?
AND us.status = 'active'
ORDER BY au.first_name, au.last_name
");
$stmtUsers->execute([$school_id]);
$schoolUsers = $stmtUsers->fetchAll(PDO::FETCH_ASSOC);
// === PRODOTTI ATTIVI ===
$stmtProd = $pdo->prepare("
SELECT id, name, type
FROM products
WHERE school_id = ? AND status = 'active'
ORDER BY name
");
$stmtProd->execute([$school_id]);
$products = $stmtProd->fetchAll(PDO::FETCH_ASSOC);
// === VARIAZIONI ATTIVE (per filtro lato JS) ===
$variations = [];
if (!empty($products)) {
$prodIds = array_column($products, 'id');
$in = implode(',', array_fill(0, count($prodIds), '?'));
$stmtVar = $pdo->prepare("
SELECT id, product_id, name, price, duration_days, max_entries, max_recoveries
FROM product_variations
WHERE product_id IN ($in)
AND status = 'active'
ORDER BY product_id, name
");
$stmtVar->execute($prodIds);
$variations = $stmtVar->fetchAll(PDO::FETCH_ASSOC);
}
// === CLASSI ATTIVE ===
$stmtClasses = $pdo->prepare("
SELECT id, name
FROM classes
WHERE school_id = ? AND status = 'active'
ORDER BY name
");
$stmtClasses->execute([$school_id]);
$classes = $stmtClasses->fetchAll(PDO::FETCH_ASSOC);
// === CLASS TYPES (filtrati lato JS per class_id) ===
$stmtCT = $pdo->prepare("
SELECT ct.id, ct.class_id, ct.level, ct.day_of_week
FROM class_types ct
JOIN classes c ON ct.class_id = c.id
WHERE c.school_id = ?
ORDER BY c.name, ct.day_of_week, ct.level
");
$stmtCT->execute([$school_id]);
$classTypes = $stmtCT->fetchAll(PDO::FETCH_ASSOC);
$feedback = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$action = $_POST['action'] ?? '';
if ($action === 'add_order_manual') {
$user_id = (int)($_POST['user_id'] ?? 0);
$product_id = (int)($_POST['product_id'] ?? 0);
$variation_id = (int)($_POST['variation_id'] ?? 0);
$payment_method = trim($_POST['payment_method'] ?? '');
$status = trim($_POST['status'] ?? 'completed');
$price = isset($_POST['price']) ? (float)str_replace(',', '.', $_POST['price']) : 0.0;
$total_entries = ($_POST['total_entries'] ?? '') !== '' ? (int)$_POST['total_entries'] : null;
$available_entries = ($_POST['available_entries'] ?? '') !== '' ? (int)$_POST['available_entries'] : null;
$activation_date = $_POST['activation_date'] ?? date('Y-m-d');
$expiration_date = $_POST['expiration_date'] ?? null;
$expiration_date = ($expiration_date === '') ? null : $expiration_date;
$class_id = ($_POST['class_id'] ?? '') !== '' ? (int)$_POST['class_id'] : null;
$class_type_id = ($_POST['class_type_id'] ?? '') !== '' ? (int)$_POST['class_type_id'] : null;
// Validazioni base
if ($user_id <= 0 || $product_id <= 0 || $payment_method === '') {
$feedback = '
Compila utente, prodotto e metodo di pagamento.
';
} else {
// 1) utente appartiene alla scuola
$stmt = $pdo->prepare("SELECT 1 FROM user_schools WHERE school_id = ? AND user_id = ? AND status='active' LIMIT 1");
$stmt->execute([$school_id, $user_id]);
if (!$stmt->fetchColumn()) {
$feedback = '
Utente non associato alla scuola.
';
} else {
// 2) prodotto appartiene alla scuola
$stmt = $pdo->prepare("SELECT id FROM products WHERE id=? AND school_id=? AND status='active' LIMIT 1");
$stmt->execute([$product_id, $school_id]);
if (!$stmt->fetchColumn()) {
$feedback = '
Prodotto non valido.
';
} else {
// 3) se variation_id valorizzato, deve appartenere al prodotto
$varMeta = null;
if ($variation_id > 0) {
$stmt = $pdo->prepare("SELECT id, price, duration_days, max_entries, max_recoveries FROM product_variations WHERE id=? AND product_id=? AND status='active' LIMIT 1");
$stmt->execute([$variation_id, $product_id]);
$varMeta = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$varMeta) {
$feedback = '
Variazione non valida.
';
}
}
if ($feedback === '') {
// 4) class / class_type se presenti devono essere coerenti e della scuola
if ($class_id) {
$stmt = $pdo->prepare("SELECT 1 FROM classes WHERE id=? AND school_id=? LIMIT 1");
$stmt->execute([$class_id, $school_id]);
if (!$stmt->fetchColumn()) {
$feedback = '
Classe non valida.
';
}
}
if ($class_type_id) {
$stmt = $pdo->prepare("
SELECT 1
FROM class_types ct
JOIN classes c ON ct.class_id = c.id
WHERE ct.id=? AND c.school_id=?
LIMIT 1
");
$stmt->execute([$class_type_id, $school_id]);
if (!$stmt->fetchColumn()) {
$feedback = '
';
}
}
}
}
}
}
}
// Recupera tutti gli ordini con tutti i dati necessari
$stmt = $pdo->prepare("
SELECT
o.id,
o.order_number,
o.created_at,
o.price,
o.status,
o.payment_method,
o.total_entries,
o.available_entries,
o.expiration_date,
u.first_name,
u.last_name,
u.email,
p.name AS product_name,
pv.name AS variation_name,
c.name AS class_name,
ct.level,
ct.day_of_week
FROM orders o
JOIN auth_users u ON o.user_id = u.id
JOIN products p ON o.product_id = p.id
LEFT JOIN product_variations pv ON o.variation_id = pv.id
LEFT JOIN classes c ON o.class_id = c.id
LEFT JOIN class_types ct ON o.class_type_id = ct.id
WHERE o.school_id = ?
ORDER BY o.created_at DESC
");
$stmt->execute([$school_id]);
$orders = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
Ordini -