in scadute] * -------------------------------------------------------------------------- */ require_once __DIR__ . '/_bootstrap.php'; $userId = (int) $user->id; $now = new DateTime(); $today = $now->format('Y-m-d'); // ========================================================================== // 1) Ordini dell'utente // ========================================================================== $stmt = $db->prepare(" SELECT ob.idorderbook, ob.order_id, ob.idservice, ob.order_date_created, ob.quantityclass, ob.nticket, ob.first_lesson_date, ob.expireon, ob.maxreschedule, ob.reprogrammed, s.servicename, s.day, s.time FROM orderbook ob LEFT JOIN service s ON ob.idservice = s.idservice WHERE ob.iduser = :uid ORDER BY ob.idorderbook DESC "); $stmt->execute([':uid' => $userId]); $orderRows = $stmt->fetchAll(); // Prepared per le lezioni di un ordine $lessonStmt = $db->prepare(" SELECT bc.idbookingclass, bc.bookingstart, bc.status, bc.lostlesson, bc.expirylesson, bc.idservice, s.servicename FROM bookingclass bc LEFT JOIN service s ON bc.idservice = s.idservice WHERE bc.idorder = :oid AND bc.iduser = :uid ORDER BY bc.bookingstart ASC "); $orders = []; foreach ($orderRows as $o) { $orderId = (int) $o['idorderbook']; // "tickets" totali: preferiamo quantityclass se presente, altrimenti nticket $tickets = (int) ($o['quantityclass'] !== null && $o['quantityclass'] !== '' ? $o['quantityclass'] : ($o['nticket'] ?? 0)); $expireon = $o['expireon'] ?? null; $isExpired = ($expireon !== null && $expireon < $today); // Lezioni dell'ordine $lessonStmt->execute([':oid' => $orderId, ':uid' => $userId]); $lessonRows = $lessonStmt->fetchAll(); $completed = 0; $lost = 0; $expired = 0; $booked = 0; $pending = 0; $lessons = []; foreach ($lessonRows as $l) { $status = (string) $l['status']; $lost_y = (($l['lostlesson'] ?? 'N') === 'Y'); $exp_y = (($l['expirylesson'] ?? 'N') === 'Y'); $startRaw = $l['bookingstart'] ?? null; $isPast = false; $dateIso = null; if ($startRaw && $startRaw !== '0000-00-00 00:00:00') { try { $dt = new DateTime($startRaw); $isPast = ($dt < $now); $dateIso = $dt->format('Y-m-d H:i:s'); } catch (Throwable $e) { $dateIso = null; } } // Etichetta stato (ordine di priorità come concordato) if ($exp_y) { $label = 'expired'; $expired++; } elseif ($lost_y) { $label = 'lost'; $lost++; } elseif ($status === 'pending') { $label = 'pending'; $pending++; } elseif ($status === 'completed') { $label = 'completed'; $completed++; } elseif ($status === 'booked') { if ($isPast) { $label = 'completed'; $completed++; } else { $label = 'booked'; $booked++; } } else { $label = $status !== '' ? $status : 'unknown'; } $lessons[] = [ 'booking_id' => (int) $l['idbookingclass'], 'datetime' => $dateIso, 'class_name' => (string) ($l['servicename'] ?? ''), 'status' => $label, ]; } // Da programmare = tickets - (booked + completed + lost + expired + pending) $toSchedule = $tickets - ($booked + $completed + $lost + $expired + $pending); if ($toSchedule < 0) { $toSchedule = 0; } // Se l'ordine è scaduto, le "da programmare" diventano "scadute" if ($isExpired && $toSchedule > 0) { $expired += $toSchedule; $toSchedule = 0; } $orders[] = [ 'order_id' => $orderId, 'order_number' => $o['order_id'] !== null ? (int) $o['order_id'] : null, 'service_id' => (int) $o['idservice'], 'service_name' => (string) ($o['servicename'] ?? ''), 'day' => (string) ($o['day'] ?? ''), 'time' => (string) ($o['time'] ?? ''), 'order_date' => $o['order_date_created'] ?? null, 'first_lesson_date' => $o['first_lesson_date'] ?? null, 'expire_on' => $expireon, 'is_expired' => $isExpired, 'max_reschedule' => (int) ($o['maxreschedule'] ?? 0), 'reprogrammed' => (int) ($o['reprogrammed'] ?? 0), 'tickets' => $tickets, 'summary' => [ 'total' => $tickets, 'completed' => $completed, 'lost' => $lost, 'expired' => $expired, 'booked' => $booked, 'pending' => $pending, 'to_schedule' => $toSchedule, ], 'lessons' => $lessons, ]; } echo json_encode([ 'success' => true, 'orders' => $orders, ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);