AOSSIE-Org / AOSSIE-Org/NeuroTrack

BUG: Appointment booking ignores selected time slot, every appointment saved at midnight to Supabase

Abierto
#219 0 comentarios 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
Dart
Estrellas
29
Forks
50
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

### Is there an existing issue for this?

- [x] I have searched the existing issues

### What happened?

## 📌 Issue Overview

The appointment booking flow silently discards the time slot the patient selects. Every appointment is written to the Supabase `session` table with a timestamp of midnight (T00:00:00) on the selected date, regardless of which slot was chosen.

The `slot` field is captured in `PatientScheduleAppointmentModel` but `toEntity()` builds the timestamp using only `DateTime.parse(date)` - the date-only ISO string from `_selectedDate!.toIso8601String()`. The slot string is never parsed or merged into the timestamp. `PatientScheduleAppointmentEntity` has no slot field at all.

Additionally, `therapistId` is hardcoded to `''` in `createAppointment()` at line 180 of `appointments_provider.dart`, meaning every booking is inserted with an empty therapist ID.

As a result, the slot availability check which compares booked appointment hours against available slots never matches the midnight row, so the same slot can be booked unlimited times.

## 🔍 Steps to Reproduce
1. Log in as a patient who has an assigned therapist
2. Navigate to **Appointments → Schedule an Appointment**
3. Select a service type, a date, and a specific time slot e.g. **10:00 AM**
4. Tap **Schedule It**
5. Check the `session` table in Supabase

## 🎯 Expected Behavior

The inserted row should have `timestamp = 2025-04-15T10:00:00.000` reflecting the
selected slot. The slot should then appear as unavailable for the same date.

## 🚨 Actual Behavior

The inserted row has `timestamp = 2025-04-15T00:00:00.000` regardless of the
selected slot. `therapist_id` is empty string. The same slot remains bookable
indefinitely since the availability check never matches a midnight timestamp.

Root cause in `appointments_provider.dart` line 180-183:
```dart
therapistId: '', // hardcoded empty string
date: _selectedDate!.toIso8601String(), // midnight date only
slot: _selectedTimeSlot, // captured but never used downstream
```

Root cause in `patient_schedule_appointment_model.dart` line 34:
```dart
timestamp: DateTime.parse(date), // slot string never parsed or merged
```

## 📷 Screenshot

Not applicable. The corruption is in data written to Supabase.

## 💡 Suggested Improvements

1. In `appointments_provider.dart`, parse `_selectedTimeSlot` (e.g. "10:00 AM")
into hour and minute, then combine with `_selectedDate` to produce a full DateTime
before passing to the model. Also pass the resolved `therapistId` from the
availability fetch instead of hardcoding `''`.
2. In `patient_schedule_appointment_model.dart`, update `toEntity()` to accept
and use the time-resolved DateTime rather than parsing the date-only string.
3. In `patient_schedule_appointment_entity.dart`, ensure the full timestamp flows
through to `toConsultationRequestEntity()` unchanged.
4. Add an `_isSubmitting` guard on the Schedule It button to prevent duplicate
inserts on double tap.

### Record

- [x] I agree to follow this project's Code of Conduct
- [x] I want to work on this issue

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.