order detail api
This commit is contained in:
@@ -0,0 +1,175 @@
|
||||
<?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.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);
|
||||
Reference in New Issue
Block a user