AOSSIE-Org / AOSSIE-Org/NeuroTrack

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

Open
#219 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Dart
Stars
29
Forks
50
PR merge metrics
No merged PRs in 30d

Description

### 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

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.