Files
prosappweb/lib/providers/services_provider.dart
T
Lizandro GuarnizoandClaude Sonnet 4.6 15175c1b91 replace: swap prosappweb content for prosapp_web_app (more complete version)
prosapp_web_app has chat, dashboard, calendar, support, 13 providers and
Fluro URL routing. Keep Dockerfile + nginx.conf from previous prosappweb.
Upgrade google_fonts 6.2.1 → 8.1.0 (Dart 3.12 compat fix).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 15:26:32 -05:00

391 lines
11 KiB
Dart

import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:prosapp_web_app/models/pro_state.dart';
import 'package:prosapp_web_app/models/service.dart';
import 'package:prosapp_web_app/models/service_status.dart';
import 'package:prosapp_web_app/models/servicio_profesional.dart';
import 'package:prosapp_web_app/models/usuario.dart';
class ServicesProvider extends ChangeNotifier {
List<ServicioProfesional> services = [];
ServicioProfesional? service;
bool isLoading = true;
final _servicesCollection = FirebaseFirestore.instance.collection('services');
final _usersCollection = FirebaseFirestore.instance.collection('users');
void logout() {
services = [];
service = null;
isLoading = false;
notifyListeners();
}
Future<void> changeServiceStatus(
String serviceId, ServiceStatus newStatus) async {
try {
final statusValue = enumToIntService(newStatus);
await FirebaseFirestore.instance
.collection('services')
.doc(serviceId)
.update({'status': statusValue});
notifyListeners();
} catch (e) {
print('Error al actualizar el estado: $e');
}
}
// cambiar el user_scored a true
Future<void> changeUserScored(String serviceId) async {
try {
await FirebaseFirestore.instance
.collection('services')
.doc(serviceId)
.update({'user_scored': true});
notifyListeners();
} catch (e) {
print('Error al actualizar el estado: $e');
}
}
// cambiar el professional_scored a true
Future<void> changeProfessionalScored(String serviceId) async {
try {
await FirebaseFirestore.instance
.collection('services')
.doc(serviceId)
.update({'professional_scored': true});
notifyListeners();
} catch (e) {
print('Error al actualizar el estado: $e');
}
}
void clearServices() {
services.clear();
notifyListeners();
}
getServiceForUser(String serviceId) async {
try {
isLoading = true;
final queryService = await _servicesCollection.doc(serviceId).get();
final servicio = Service.fromDocument(queryService);
final queryUsers =
await _usersCollection.doc(servicio.professionalId).get();
final user = Usuario.fromDocument(queryUsers.data()!);
service = ServicioProfesional(
user: user,
service: servicio,
);
} catch (e) {
service = null;
} finally {
isLoading = false;
notifyListeners();
}
}
getServiceForProfessional(String serviceId) async {
try {
isLoading = true;
final queryService = await _servicesCollection.doc(serviceId).get();
final servicio = Service.fromDocument(queryService);
final queryUsers = await _usersCollection.doc(servicio.userId).get();
final user = Usuario.fromDocument(queryUsers.data()!);
service = ServicioProfesional(
user: user,
service: servicio,
);
} catch (e) {
service = null;
} finally {
isLoading = false;
notifyListeners();
}
}
getServicesForUser(String userId) async {
try {
isLoading = true;
final queryServices = await _servicesCollection
.where('user_id', isEqualTo: userId)
.where('status', whereIn: [0, 1, 3]).get();
final servicios = queryServices.docs.map(Service.fromDocument).toList();
final professionalIds =
servicios.map((service) => service.professionalId).toList();
final queryUsers = await _usersCollection
.where('professional_state', isEqualTo: ProState.active.index)
.where(FieldPath.documentId, whereIn: professionalIds)
.get();
final professionalUsers =
queryUsers.docs.map((e) => Usuario.fromDocument(e.data())).toList();
final professionalUsersMap = {
for (var user in professionalUsers) user.id: user
};
final servicesMap = (servicios.map((service) {
final user = professionalUsersMap[service.professionalId];
return ServicioProfesional(
user: user!,
service: service,
);
}).toList());
services = servicesMap
..sort((a, b) {
final dateA = DateTime.parse(a.service.day);
final dateB = DateTime.parse(b.service.day);
final range1A =
a.service.range1Hour1.hour * 60 + a.service.range1Hour1.minute;
final range1B =
b.service.range1Hour1.hour * 60 + b.service.range1Hour1.minute;
if (dateA.compareTo(dateB) != 0) {
return dateA.compareTo(dateB);
} else {
return range1A.compareTo(range1B);
}
});
} catch (e) {
print('Error obteniendo servicios: $e');
} finally {
isLoading = false;
notifyListeners();
}
}
getServicesRequestsForProfessional(String userId) async {
try {
isLoading = true;
final queryServices = await _servicesCollection
.where('professional_id', isEqualTo: userId)
.where('status', whereIn: [0]).get();
final servicios = queryServices.docs.map(Service.fromDocument).toList();
final userIds = servicios.map((service) => service.userId).toList();
final queryUsers = await _usersCollection
.where(FieldPath.documentId, whereIn: userIds)
.get();
final users =
queryUsers.docs.map((e) => Usuario.fromDocument(e.data())).toList();
final usersMap = {for (var doc in users) doc.id: doc};
final servicesMap = (servicios.map((service) {
final user = usersMap[service.userId];
return ServicioProfesional(
user: user!,
service: service,
);
}).toList());
services = servicesMap
..sort((a, b) {
final dateA = DateTime.parse(a.service.day);
final dateB = DateTime.parse(b.service.day);
final range1A =
a.service.range1Hour1.hour * 60 + a.service.range1Hour1.minute;
final range1B =
b.service.range1Hour1.hour * 60 + b.service.range1Hour1.minute;
if (dateA.compareTo(dateB) != 0) {
return dateA.compareTo(dateB);
} else {
return range1A.compareTo(range1B);
}
});
} catch (e) {
print('Error obteniendo servicios: $e');
} finally {
isLoading = false;
notifyListeners();
}
}
getServicesForProfessional(String userId) async {
try {
isLoading = true;
final queryServices = await _servicesCollection
.where('professional_id', isEqualTo: userId)
.where('status', whereIn: [1, 3]).get();
final servicios = queryServices.docs.map(Service.fromDocument).toList();
final userIds = servicios.map((service) => service.userId).toList();
final queryUsers = await _usersCollection
.where(FieldPath.documentId, whereIn: userIds)
.get();
final users =
queryUsers.docs.map((e) => Usuario.fromDocument(e.data())).toList();
final usersMap = {for (var doc in users) doc.id: doc};
final servicesMap = (servicios.map((service) {
final user = usersMap[service.userId];
return ServicioProfesional(
user: user!,
service: service,
);
}).toList());
services = servicesMap
..sort((a, b) {
final dateA = DateTime.parse(a.service.day);
final dateB = DateTime.parse(b.service.day);
final range1A =
a.service.range1Hour1.hour * 60 + a.service.range1Hour1.minute;
final range1B =
b.service.range1Hour1.hour * 60 + b.service.range1Hour1.minute;
if (dateA.compareTo(dateB) != 0) {
return dateA.compareTo(dateB);
} else {
return range1A.compareTo(range1B);
}
});
} catch (e) {
print('Error obteniendo servicios: $e');
} finally {
isLoading = false;
notifyListeners();
}
}
getServicesHistoryForUser(String userId) async {
try {
isLoading = true;
final queryServices = await _servicesCollection
.where('user_id', isEqualTo: userId)
.where('status', whereIn: [2, 4, 5]).get();
final servicios = queryServices.docs.map(Service.fromDocument).toList();
final professionalIds =
servicios.map((service) => service.professionalId).toList();
final queryUsers = await _usersCollection
.where('professional_state', isEqualTo: ProState.active.index)
.where(FieldPath.documentId, whereIn: professionalIds)
.get();
final professionalUsers =
queryUsers.docs.map((e) => Usuario.fromDocument(e.data())).toList();
final professionalUsersMap = {
for (var user in professionalUsers) user.id: user
};
final servicesMap = (servicios.map((service) {
final user = professionalUsersMap[service.professionalId];
return ServicioProfesional(
user: user!,
service: service,
);
}).toList());
services = servicesMap
..sort((a, b) {
final dateA = DateTime.parse(a.service.day);
final dateB = DateTime.parse(b.service.day);
final range1A =
a.service.range1Hour1.hour * 60 + a.service.range1Hour1.minute;
final range1B =
b.service.range1Hour1.hour * 60 + b.service.range1Hour1.minute;
if (dateA.compareTo(dateB) != 0) {
return dateA.compareTo(dateB);
} else {
return range1A.compareTo(range1B);
}
});
} catch (e) {
print('Error obteniendo servicios: $e');
} finally {
isLoading = false;
notifyListeners();
}
}
getServicesHistoryForProfessional(String userId) async {
try {
isLoading = true;
final queryServices = await _servicesCollection
.where('professional_id', isEqualTo: userId)
.where('status', whereIn: [2, 4, 5]).get();
final servicios = queryServices.docs.map(Service.fromDocument).toList();
final userIds = servicios.map((service) => service.userId).toList();
final queryUsers = await _usersCollection
.where(FieldPath.documentId, whereIn: userIds)
.get();
final users =
queryUsers.docs.map((e) => Usuario.fromDocument(e.data())).toList();
final usersMap = {for (var doc in users) doc.id: doc};
final servicesMap = (servicios.map((service) {
final user = usersMap[service.userId];
return ServicioProfesional(
user: user!,
service: service,
);
}).toList());
services = servicesMap
..sort((a, b) {
final dateA = DateTime.parse(a.service.day);
final dateB = DateTime.parse(b.service.day);
final range1A =
a.service.range1Hour1.hour * 60 + a.service.range1Hour1.minute;
final range1B =
b.service.range1Hour1.hour * 60 + b.service.range1Hour1.minute;
if (dateA.compareTo(dateB) != 0) {
return dateA.compareTo(dateB);
} else {
return range1A.compareTo(range1B);
}
});
} catch (e) {
print('Error obteniendo servicios: $e');
} finally {
isLoading = false;
notifyListeners();
}
}
}