Files
prosappweb/lib/models/service.dart
T
Lizandro GuarnizoandClaude Sonnet 4.6 46acad0b55 fix blocked/occupied slot detection always returning false
Service.fromJson stored day as the raw Prisma JSON string
"2024-01-15T00:00:00.000Z", but _isSelfBooked/_isOccupied/_isBlocked
compared it against "2024-01-15" (toIso8601String().split('T').first),
so the match always failed and every slot appeared as Disponible.

Normalize day to the date-only portion in fromJson so all comparisons
work correctly across ProfessionalCalendarView and CalendarView.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-12 19:14:42 -05:00

127 lines
4.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:prosapp_web_app/models/service_location_preferences.dart';
import 'package:prosapp_web_app/models/service_status.dart';
class Service {
final String? id;
final String professionalId;
final bool professionalScored;
final String userId;
final bool userScored;
final String address;
final String aditionalAddress;
final double latitude;
final double longitude;
final String day;
final String createdAt;
final String description;
final TimeOfDay range1Hour1;
final TimeOfDay range1Hour2;
final String rate;
final ServiceStatus status;
final ServiceLocationPreferences location;
Service({
required this.id,
required this.professionalId,
required this.professionalScored,
required this.userId,
required this.userScored,
required this.address,
required this.aditionalAddress,
required this.latitude,
required this.longitude,
required this.day,
required this.createdAt,
required this.description,
required this.range1Hour1,
required this.range1Hour2,
required this.rate,
required this.status,
required this.location,
});
static const _statusMap = {
'pending': 0, 'accepted': 1, 'denied': 2, 'active': 3,
'cancelled': 4, 'completed': 5, 'self_booked': 6,
};
static Service fromJson(Map<String, dynamic> doc, String id) {
final rawStatus = doc['status'];
final statusInt = rawStatus is int ? rawStatus
: rawStatus is String ? (_statusMap[rawStatus] ?? 0)
: (rawStatus as num?)?.toInt() ?? 0;
final rawLoc = doc['location_preference'] ?? doc['location'];
final locInt = rawLoc == 'delivery' ? 1
: rawLoc == 'office' ? 0
: (rawLoc as num?)?.toInt() ?? 0;
return Service(
id: id,
professionalId: doc['professional_id'] as String,
professionalScored: doc['professional_scored'] as bool? ?? false,
userId: doc['user_id'] as String,
userScored: doc['user_scored'] as bool? ?? false,
address: doc['address'] as String? ?? '',
aditionalAddress: (doc['additional_address'] ?? doc['aditional_address']) as String? ?? '',
latitude: (doc['latitude'] as num?)?.toDouble() ?? 0.0,
longitude: (doc['longitude'] as num?)?.toDouble() ?? 0.0,
day: (doc['day']?.toString() ?? '').split('T').first,
createdAt: doc['created_at']?.toString() ?? '',
description: doc['description'] as String? ?? '',
range1Hour1: _parseTime(doc['range1_hour1']?.toString() ?? '0:0'),
range1Hour2: _parseTime(doc['range1_hour2']?.toString() ?? '0:0'),
status: intToEnumService(statusInt),
rate: doc['rate']?.toString() ?? '',
location: intToEnum(locInt),
);
}
static TimeOfDay _parseTime(String t) {
// Handle ISO8601 (e.g. "1970-01-01T08:30:00.000Z") or "H:M"
final s = t.contains('T') ? t.split('T')[1] : t;
final parts = s.split(':');
return TimeOfDay(
hour: int.tryParse(parts[0]) ?? 0,
minute: int.tryParse(parts.length > 1 ? parts[1] : '0') ?? 0,
);
}
Map<String, dynamic> toDocument() {
return {
'id': id,
'professional_id': professionalId,
'professional_scored': professionalScored,
'user_id': userId,
'user_scored': userScored,
'address': address,
'aditional_address': aditionalAddress,
'latitude': latitude,
'longitude': longitude,
'day': day,
'created_at': createdAt,
'description': description,
'range1_hour1': formatTimeOfDay(range1Hour1),
'range1_hour2': formatTimeOfDay(range1Hour2),
'rate': rate,
'status': enumToIntService(status),
'location': enumToInt(location),
};
}
static TimeOfDay parseTimeOfDay(String timeString) => _parseTime(timeString);
String? formatTimeOfDay(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';
}
@override
String toString() {
return 'Service{professionalId: $professionalId, userId: $userId, day: $day, status: $status}';
}
}