diff --git a/public/api/orders_detail.php b/public/api/orders_detail.php new file mode 100644 index 0000000..3d8aa27 --- /dev/null +++ b/public/api/orders_detail.php @@ -0,0 +1,175 @@ + 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.is_reprogrammed, 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, + 'is_reprogrammed' => (($l['is_reprogrammed'] ?? 'N') === 'Y'), + ]; + } + + // 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);