diff --git a/lib/models/schedules.dart b/lib/models/schedules.dart index 05dacd7..078b057 100644 --- a/lib/models/schedules.dart +++ b/lib/models/schedules.dart @@ -73,4 +73,18 @@ class Schedules { 'sunday': sunday.toJson(), }; } + + // Produces the array format expected by PATCH /professionals/me/schedules + // day_of_week: 0=Monday … 6=Sunday (matches backend DB convention) + List> toSchedulesArray() { + return [ + monday.toScheduleDto(0), + tuesday.toScheduleDto(1), + wednesday.toScheduleDto(2), + thursday.toScheduleDto(3), + friday.toScheduleDto(4), + saturday.toScheduleDto(5), + sunday.toScheduleDto(6), + ]; + } } diff --git a/lib/models/schedules_entity.dart b/lib/models/schedules_entity.dart index 4a461ac..99f31f0 100644 --- a/lib/models/schedules_entity.dart +++ b/lib/models/schedules_entity.dart @@ -73,20 +73,35 @@ class ScheduleEntity { return { 'habilitado': enabled, 'continuous_day': continuousDay, - 'range1Hour1': formatTimeOfDay(range1Hour1), - 'range1Hour2': formatTimeOfDay(range1Hour2), - 'range2Hour1': formatTimeOfDay(range2Hour1), - 'range2Hour2': formatTimeOfDay(range2Hour2), + 'range1Hour1': _formatTimePadded(range1Hour1), + 'range1Hour2': _formatTimePadded(range1Hour2), + 'range2Hour1': _formatTimePadded(range2Hour1), + 'range2Hour2': _formatTimePadded(range2Hour2), }; } - String? formatTimeOfDay(TimeOfDay? time) { - if (time != null) { - return "${time.hour.toString()}:${time.minute.toString()}"; - } - return null; + // Produces { day_of_week, enabled, continuous_day, range*_hour* } for PATCH /professionals/me/schedules + Map toScheduleDto(int dayOfWeek) { + return { + 'day_of_week': dayOfWeek, + 'enabled': enabled, + 'continuous_day': continuousDay, + 'range1_hour1': _formatTimePadded(range1Hour1), + 'range1_hour2': _formatTimePadded(range1Hour2), + 'range2_hour1': _formatTimePadded(range2Hour1), + 'range2_hour2': _formatTimePadded(range2Hour2), + }; } + static String? _formatTimePadded(TimeOfDay? time) { + if (time == null) return null; + final h = time.hour.toString().padLeft(2, '0'); + final m = time.minute.toString().padLeft(2, '0'); + return '$h:$m'; + } + + String? formatTimeOfDay(TimeOfDay? time) => _formatTimePadded(time); + static String? getFormatTime(TimeOfDay? time) { if (time == null) { return null; diff --git a/lib/models/service.dart b/lib/models/service.dart index bb5beca..fb96bb3 100644 --- a/lib/models/service.dart +++ b/lib/models/service.dart @@ -113,8 +113,10 @@ class Service { static TimeOfDay parseTimeOfDay(String timeString) => _parseTime(timeString); String? formatTimeOfDay(TimeOfDay? time) { - if (time != null) return '${time.hour}:${time.minute}'; - return null; + if (time == null) return null; + final h = time.hour.toString().padLeft(2, '0'); + final m = time.minute.toString().padLeft(2, '0'); + return '$h:$m'; } @override diff --git a/lib/providers/calendar_services_provider.dart b/lib/providers/calendar_services_provider.dart index c02a35b..b1ac390 100644 --- a/lib/providers/calendar_services_provider.dart +++ b/lib/providers/calendar_services_provider.dart @@ -18,6 +18,21 @@ class CalendarServicesProvider extends ChangeNotifier { notifyListeners(); } + // Returns services for a specific professional via the public endpoint (no auth needed). + // Used by CalendarView when a user browses a professional's availability. + Future> getPublicServicesForProfessional(String professionalId) async { + try { + final res = await _api.get('/services/public-calendar/$professionalId'); + final rawServices = (res as Map)['services'] as List? ?? []; + return rawServices.map((e) { + final m = e as Map; + return Service.fromJson(m, m['id'] as String); + }).toList(); + } catch (_) { + return []; + } + } + getServicesForProfessional(String userId) async { try { isLoading = true; diff --git a/lib/providers/professional_form_provider.dart b/lib/providers/professional_form_provider.dart index b422268..04b9233 100644 --- a/lib/providers/professional_form_provider.dart +++ b/lib/providers/professional_form_provider.dart @@ -106,12 +106,14 @@ class ProfessionalFormProvider with ChangeNotifier { Future updateProfesionalProfileScheduleInfo(String userId) async { try { - await _api.patch('/professionals/me', profesional!.toDocument()); + await _api.patch('/professionals/me/schedules', { + 'schedules': profesional!.schedules.toSchedulesArray(), + }); } catch (e) { NotificationsService.showSnackbar('Error al guardar: $e'); return false; } - NotificationsService.showSnackbar('Información actualizada'); + NotificationsService.showSnackbar('Horario actualizado'); return true; } diff --git a/lib/providers/professional_provider.dart b/lib/providers/professional_provider.dart index 5a29fbf..f2d16bc 100644 --- a/lib/providers/professional_provider.dart +++ b/lib/providers/professional_provider.dart @@ -44,6 +44,19 @@ class ProfessionalProvider extends ChangeNotifier { return profesional!; } + // Fetches any professional by UUID or user_id via the public endpoint. + // Used by CalendarView to load the target professional (not the logged-in user). + Future getProfessionalById(String id) async { + try { + final data = await _api.get('/professionals/$id'); + final prof = Profesional.fromDocument(data as Map); + notifyListeners(); + return prof; + } catch (_) { + return Profesional.empty(); + } + } + void logout() { _isProModeActive = false; notifyListeners(); diff --git a/lib/ui/views/calendar_view.dart b/lib/ui/views/calendar_view.dart index 462e32c..a7eff1f 100644 --- a/lib/ui/views/calendar_view.dart +++ b/lib/ui/views/calendar_view.dart @@ -45,12 +45,14 @@ class _CalendarViewState extends State { final proProvider = Provider.of(context, listen: false); + // Use public endpoint so we get THIS professional's schedule, not the viewer's own final professional = - await proProvider.getProfessional(widget.professionalId); + await proProvider.getProfessionalById(widget.professionalId); professionalFormProvider.setProfesional(professional); + // Use public calendar endpoint to get services for this specific professional final services = - await servicesProvider.getServicesForProfessional(professional.id); + await servicesProvider.getPublicServicesForProfessional(professional.id); setState(() { _services = services; });