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>
391 lines
11 KiB
Dart
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();
|
|
}
|
|
}
|
|
}
|