api pending
This commit is contained in:
@@ -200,16 +200,21 @@ try {
|
|||||||
// 2b) Anti-duplicato
|
// 2b) Anti-duplicato
|
||||||
// ------------------------------------------------------------------
|
// ------------------------------------------------------------------
|
||||||
$dup = $db->prepare(
|
$dup = $db->prepare(
|
||||||
"SELECT COUNT(*) FROM bookingclass
|
"SELECT status FROM bookingclass
|
||||||
WHERE iduser = :uid
|
WHERE iduser = :uid
|
||||||
AND idserviceschedule = :idschedule
|
AND idserviceschedule = :idschedule
|
||||||
AND status != 'cancelled'"
|
AND status != 'cancelled'
|
||||||
|
LIMIT 1"
|
||||||
);
|
);
|
||||||
$dup->execute([':uid' => $userid, ':idschedule' => $idserviceschedule]);
|
$dup->execute([':uid' => $userid, ':idschedule' => $idserviceschedule]);
|
||||||
if ((int) $dup->fetchColumn() > 0) {
|
$dupStatus = $dup->fetchColumn();
|
||||||
|
if ($dupStatus !== false) {
|
||||||
$db->rollBack();
|
$db->rollBack();
|
||||||
http_response_code(409);
|
http_response_code(409);
|
||||||
echo json_encode(['success' => false, 'message' => 'Questo utente è già prenotato in questa classe.']);
|
$msg = ($dupStatus === 'pending')
|
||||||
|
? 'Questo utente ha una prenotazione in attesa in questa classe: confermala o rimuovila dalla sezione "In attesa".'
|
||||||
|
: 'Questo utente è già prenotato in questa classe.';
|
||||||
|
echo json_encode(['success' => false, 'message' => $msg]);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -63,13 +63,14 @@ if (!empty($scheduleIds)) {
|
|||||||
$sqlBookings = "SELECT bookingclass.idbookingclass,
|
$sqlBookings = "SELECT bookingclass.idbookingclass,
|
||||||
bookingclass.idserviceschedule,
|
bookingclass.idserviceschedule,
|
||||||
bookingclass.lostlesson,
|
bookingclass.lostlesson,
|
||||||
|
bookingclass.status,
|
||||||
auth_users.first_name,
|
auth_users.first_name,
|
||||||
auth_users.last_name,
|
auth_users.last_name,
|
||||||
auth_users.avatar
|
auth_users.avatar
|
||||||
FROM bookingclass
|
FROM bookingclass
|
||||||
LEFT JOIN auth_users ON bookingclass.iduser = auth_users.id
|
LEFT JOIN auth_users ON bookingclass.iduser = auth_users.id
|
||||||
WHERE bookingclass.idserviceschedule IN ($ph)
|
WHERE bookingclass.idserviceschedule IN ($ph)
|
||||||
AND bookingclass.status = 'booked'
|
AND bookingclass.status IN ('booked', 'pending')
|
||||||
ORDER BY auth_users.last_name, auth_users.first_name";
|
ORDER BY auth_users.last_name, auth_users.first_name";
|
||||||
$stmtB = $db->prepare($sqlBookings);
|
$stmtB = $db->prepare($sqlBookings);
|
||||||
$stmtB->execute(array_values($scheduleIds));
|
$stmtB->execute(array_values($scheduleIds));
|
||||||
@@ -85,6 +86,7 @@ if (!empty($scheduleIds)) {
|
|||||||
'last_name' => $last,
|
'last_name' => $last,
|
||||||
'full_name' => trim($first . ' ' . $last),
|
'full_name' => trim($first . ' ' . $last),
|
||||||
'is_lost' => ($b['lostlesson'] === 'Y'),
|
'is_lost' => ($b['lostlesson'] === 'Y'),
|
||||||
|
'is_pending' => ($b['status'] === 'pending'),
|
||||||
// avatar: solo il filename; l'app compone l'URL se serve
|
// avatar: solo il filename; l'app compone l'URL se serve
|
||||||
'avatar' => $avatar !== '' ? $avatar : null,
|
'avatar' => $avatar !== '' ? $avatar : null,
|
||||||
];
|
];
|
||||||
@@ -96,7 +98,13 @@ $classes = [];
|
|||||||
foreach ($scheduleRows as $sch) {
|
foreach ($scheduleRows as $sch) {
|
||||||
$sid = (int) $sch['idserviceschedule'];
|
$sid = (int) $sch['idserviceschedule'];
|
||||||
$participants = $bookingsBySchedule[$sid] ?? [];
|
$participants = $bookingsBySchedule[$sid] ?? [];
|
||||||
$count = count($participants); // tutti i booked, perse incluse
|
// contatore: solo confermati (booked, perse incluse); i pending NON contano
|
||||||
|
$count = 0;
|
||||||
|
foreach ($participants as $pp) {
|
||||||
|
if (empty($pp['is_pending'])) {
|
||||||
|
$count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
$maxcap = (int) $sch['maxcapacity'];
|
$maxcap = (int) $sch['maxcapacity'];
|
||||||
|
|
||||||
$classes[] = [
|
$classes[] = [
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* api_teacher_confirm_pending.php
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
* Conferma una prenotazione in attesa: pending -> booked.
|
||||||
|
* Solo staff (Admin=1 / teacher=3).
|
||||||
|
*
|
||||||
|
* Posizione: public/api/api_teacher_confirm_pending.php
|
||||||
|
* Metodo: POST
|
||||||
|
* Auth: Bearer token (Sanctum) via _bootstrap.php
|
||||||
|
* Body: booking_id=<int>
|
||||||
|
* --------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once __DIR__ . '/_bootstrap.php';
|
||||||
|
|
||||||
|
// Gate staff
|
||||||
|
$roleId = (int) $user->role_id;
|
||||||
|
if (!in_array($roleId, [1, 3], true)) {
|
||||||
|
http_response_code(403);
|
||||||
|
echo json_encode(['success' => false, 'message' => 'Forbidden']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$bookingId = isset($_POST['booking_id']) ? (int) $_POST['booking_id'] : 0;
|
||||||
|
|
||||||
|
if ($bookingId <= 0) {
|
||||||
|
http_response_code(400);
|
||||||
|
echo json_encode(['success' => false, 'message' => 'ID prenotazione non valido']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Conferma solo se davvero in pending
|
||||||
|
$stmt = $db->prepare(
|
||||||
|
"UPDATE bookingclass SET status = 'booked'
|
||||||
|
WHERE idbookingclass = :id AND status = 'pending'"
|
||||||
|
);
|
||||||
|
$stmt->execute([':id' => $bookingId]);
|
||||||
|
|
||||||
|
echo json_encode([
|
||||||
|
'success' => true,
|
||||||
|
'booking_id' => $bookingId,
|
||||||
|
'confirmed' => $stmt->rowCount(),
|
||||||
|
], JSON_UNESCAPED_UNICODE);
|
||||||
|
} catch (Throwable $ex) {
|
||||||
|
error_log('api_teacher_confirm_pending error: ' . $ex->getMessage());
|
||||||
|
http_response_code(500);
|
||||||
|
echo json_encode(['success' => false, 'message' => 'Errore conferma']);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user