getConnection(); try { // Inizia una transazione $pdo->beginTransaction(); // Seleziona gli ordini con status 'completed' e lezioni disponibili $stmt = $pdo->prepare(" SELECT o.id, o.user_id, o.class_type_id, o.available_entries, o.school_id FROM orders o WHERE o.status = 'completed' AND o.available_entries > 0 "); $stmt->execute(); $orders = $stmt->fetchAll(PDO::FETCH_ASSOC); $bookings_created = 0; $orders_propagated = 0; foreach ($orders as $order) { $order_id = $order['id']; $user_id = $order['user_id']; $class_type_id = $order['class_type_id']; $available_entries = $order['available_entries']; $school_id = $order['school_id']; // Recupera i giorni di chiusura della scuola $offStmt = $pdo->prepare(" SELECT start_date, end_date FROM day_off WHERE school_id = ? AND ( (start_date >= CURDATE()) OR (end_date >= CURDATE()) OR (start_date <= CURDATE() AND end_date >= CURDATE()) ) "); $offStmt->execute([$school_id]); $off_periods = $offStmt->fetchAll(PDO::FETCH_ASSOC); // Crea un array di date di chiusura $off_dates = []; foreach ($off_periods as $period) { $start_date = new DateTime($period['start_date']); $end_date = new DateTime($period['end_date']); $interval = new DateInterval('P1D'); $date_range = new DatePeriod($start_date, $interval, $end_date->modify('+1 day')); foreach ($date_range as $date) { $off_dates[] = $date->format('Y-m-d'); } } // Trova le prossime sessioni disponibili per questo class_type_id $sessionStmt = $pdo->prepare(" SELECT id, session_date FROM class_sessions WHERE class_type_id = ? AND session_date >= CURDATE() AND status = 'scheduled' ORDER BY session_date ASC, start_time ASC LIMIT ? "); $sessionStmt->execute([$class_type_id, $available_entries]); $sessions = $sessionStmt->fetchAll(PDO::FETCH_ASSOC); $bookings_for_order = 0; foreach ($sessions as $session) { $session_id = $session['id']; $session_date = $session['session_date']; // Salta se la data è un giorno di chiusura if (in_array($session_date, $off_dates)) { continue; } // Verifica la capacità massima della sessione $capacityStmt = $pdo->prepare(" SELECT max_capacity FROM class_sessions WHERE id = ? "); $capacityStmt->execute([$session_id]); $max_capacity = $capacityStmt->fetchColumn(); $bookingCountStmt = $pdo->prepare(" SELECT COUNT(*) FROM session_bookings WHERE session_id = ? AND status IN ('booked', 'attended', 'rescheduled') "); $bookingCountStmt->execute([$session_id]); $current_bookings = $bookingCountStmt->fetchColumn(); if ($max_capacity !== null && $current_bookings >= $max_capacity) { continue; // Salta se la sessione è piena } // Inserisci la prenotazione in session_bookings $insertStmt = $pdo->prepare(" INSERT INTO session_bookings ( session_id, user_id, status, booked_at, created_at, updated_at ) VALUES (?, ?, 'booked', NOW(), NOW(), NOW()) "); $insertStmt->execute([ $session_id, $user_id ]); $bookings_created++; $bookings_for_order++; } // Aggiorna available_entries e lo stato dell'ordine if ($bookings_for_order > 0) { $updateStmt = $pdo->prepare(" UPDATE orders SET available_entries = available_entries - ?, status = 'propagated' WHERE id = ? "); $updateStmt->execute([$bookings_for_order, $order_id]); $orders_propagated++; } } // Conferma la transazione $pdo->commit(); echo "Propagazione completata con successo: $bookings_created prenotazioni create, $orders_propagated ordini aggiornati."; } catch (PDOException $e) { // In caso di errore, annulla la transazione $pdo->rollBack(); echo "Errore durante la propagazione: " . $e->getMessage(); }