configurable slot duration: UI picker + genRanges stepMinutes

- Fix TimeOfDayExtension.add() to handle minute overflow via total-minutes math
- genRanges() now takes stepMinutes param (default 30, clamp 5-480)
- Profesional model: slotDurationMinutes field (parsed from slot_duration_minutes)
- ProfessionalFormProvider: saves slot duration alongside schedules on Guardar
- schedule_view: _SlotDurationPicker chip selector (15/20/30/45/60/90/120 min)
- ProfessionalCalendarView + CalendarView: pass slotDurationMinutes to genRanges

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-12 19:25:08 -05:00
co-authored by Claude Sonnet 4.6
parent 46acad0b55
commit 920ae7144d
7 changed files with 105 additions and 20 deletions
+5
View File
@@ -23,6 +23,7 @@ class Profesional {
final List<String> specializationsPictures;
final Schedules schedules;
final PaymentMethodEntity paymentMethods;
final int slotDurationMinutes;
const Profesional({
required this.id,
@@ -44,6 +45,7 @@ class Profesional {
required this.specializationsPictures,
required this.schedules,
required this.paymentMethods,
this.slotDurationMinutes = 30,
});
static Profesional empty() => Profesional(
@@ -148,6 +150,7 @@ class Profesional {
specializationsPictures: specPics,
schedules: parsedSchedules,
paymentMethods: pm,
slotDurationMinutes: (doc['slot_duration_minutes'] as int?) ?? 30,
);
}
@@ -171,6 +174,7 @@ class Profesional {
List<String>? specializationsPictures,
Schedules? schedules,
PaymentMethodEntity? paymentMethods,
int? slotDurationMinutes,
}) {
return Profesional(
id: id ?? this.id,
@@ -194,6 +198,7 @@ class Profesional {
specializationsPictures ?? this.specializationsPictures,
schedules: schedules ?? this.schedules,
paymentMethods: paymentMethods ?? this.paymentMethods,
slotDurationMinutes: slotDurationMinutes ?? this.slotDurationMinutes,
);
}