176 lines
6.1 KiB
PHP
176 lines
6.1 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.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);
|