diff --git a/lib/screens/professional/professional_calendar_screen.dart b/lib/screens/professional/professional_calendar_screen.dart index bae7a34..503d083 100644 --- a/lib/screens/professional/professional_calendar_screen.dart +++ b/lib/screens/professional/professional_calendar_screen.dart @@ -6,6 +6,7 @@ import 'package:intl/intl.dart'; import 'package:professional_repository/professional_repository.dart'; import 'package:prosappco/blocs/service_bloc/service_bloc.dart'; import 'package:prosappco/screens/service/professional_service_screen.dart'; +import 'package:prosappco/utils/service_day.dart'; import 'package:prosappco/utils/time_of_day_extension.dart'; import 'package:prosappco/utils/time_of_day_utils.dart'; import 'package:service_repository/service_repository.dart'; @@ -596,7 +597,7 @@ class _ProfessionalCalendarScreenState TimeOfDay time, List? services, DateTime day) { if (services == null) return null; for (final s in services) { - if (day.toString() != s.day || s.range1Hour1 != time) continue; + if (!isSameServiceDay(day, s.day) || s.range1Hour1 != time) continue; if (s.status == ServiceStatus.cancelled || s.status == ServiceStatus.denied) { continue; diff --git a/lib/screens/user/user_calendar_screen.dart b/lib/screens/user/user_calendar_screen.dart index b63fba4..97a1205 100644 --- a/lib/screens/user/user_calendar_screen.dart +++ b/lib/screens/user/user_calendar_screen.dart @@ -5,6 +5,7 @@ import 'package:intl/intl.dart'; import 'package:professional_repository/professional_repository.dart'; import 'package:prosappco/blocs/professional_list_bloc/professional_list_bloc.dart'; import 'package:prosappco/utils/time_of_day_extension.dart'; +import 'package:prosappco/utils/service_day.dart'; import 'package:prosappco/utils/time_of_day_utils.dart'; import 'package:service_repository/service_repository.dart'; import 'package:setting_repository/setting_repository.dart'; @@ -233,14 +234,16 @@ class UserCalendarScreenState extends State { bool _isHora1Ocupada( TimeOfDay hora1, List? events, DateTime selectedDay) { - if (events != null) { - for (ServiceEntity event in events) { - if (selectedDay.toString() == event.day) { - if (hora1 == event.range1Hour1) { - return true; - } - } + // Treat "could not load the agenda" as busy rather than free: showing a + // taken slot as available leads straight to a double booking. + if (events == null) return true; + for (final event in events) { + if (!isSameServiceDay(selectedDay, event.day)) continue; + if (event.status == ServiceStatus.cancelled || + event.status == ServiceStatus.denied) { + continue; } + if (hora1 == event.range1Hour1) return true; } return false; } diff --git a/lib/utils/service_day.dart b/lib/utils/service_day.dart new file mode 100644 index 0000000..2e9fcfa --- /dev/null +++ b/lib/utils/service_day.dart @@ -0,0 +1,14 @@ +/// Whether a service's `day` field refers to the same calendar day as [day]. +/// +/// The backend returns ISO 8601 ("2026-07-13T00:00:00.000Z") while +/// `DateTime.toString()` produces a space separator ("2026-07-13 00:00:00.000Z"), +/// so comparing the two as raw strings never matched and every booked slot +/// rendered as free. Compare parsed calendar dates instead. +bool isSameServiceDay(DateTime day, String? serviceDay) { + if (serviceDay == null || serviceDay.isEmpty) return false; + final parsed = DateTime.tryParse(serviceDay); + if (parsed == null) return false; + return parsed.year == day.year && + parsed.month == day.month && + parsed.day == day.day; +}