Files
2026-07-28 09:16:10 +02:00

175 lines
6.0 KiB
PHP

<?php
/**
* orders_detail.php
* --------------------------------------------------------------------------
* Restituisce gli ordini dell'utente, ciascuno con:
* - dati ordine (numero, data, classe, scadenza, riprogrammazioni, ...)
* - conteggi calcolati lato server (totale, completate, perse, scadute,
* programmate, da confermare, da programmare)
* - elenco delle lezioni dell'ordine con stato "etichettato".
*
* Posizione: public/api/orders_detail.php
* Metodo: GET
* Auth: Bearer token (Sanctum)
*
* Regole stato (come concordato):
* - Scaduta : expirylesson = 'Y' (vince su persa)
* - Persa : lostlesson = 'Y' (e non scaduta)
* - Completata: status='completed' OPPURE (status='booked' e data passata,
* non persa, non scaduta)
* - Programmata: status='booked' e data futura (non persa/scaduta)
* - Da confermare: status='pending'
* - Da programmare: tickets - (tutte le precedenti) [0 se scaduto -> 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);