autoreplace service operation

This commit is contained in:
2026-05-01 09:51:42 +02:00
parent 87b4661d33
commit 9c8576ada5
26 changed files with 136 additions and 134 deletions

View File

@@ -18,7 +18,7 @@ class ServicesRepository {
Future<ServiceModel> fetchServiceById(String id) async {
try {
final response = await _supabase
.from('service')
.from('operation')
.select('''
*,
customer(nome),
@@ -47,7 +47,7 @@ class ServicesRepository {
try {
// Nota: 'customer(name, surname)' serve per il display name nella card
var query = _supabase
.from('service')
.from('operation')
.select('''
*,
customer(nome),
@@ -89,7 +89,7 @@ class ServicesRepository {
required int limit,
}) {
return _supabase
.from('service')
.from('operation')
.stream(primaryKey: ['id'])
.eq('store_id', storeId)
.order('created_at', ascending: false)
@@ -101,12 +101,12 @@ class ServicesRepository {
}
// --- SALVATAGGIO COMPLETO (PRIMA PADRE, POI FIGLI) ---
Future<ServiceModel> saveFullService(ServiceModel service) async {
Future<ServiceModel> saveFullService(ServiceModel operation) async {
try {
// 1. Upsert del record principale
final serviceData = await _supabase
.from('service')
.upsert(service.toMap())
.from('operation')
.upsert(operation.toMap())
.select()
.single();
@@ -114,7 +114,7 @@ class ServicesRepository {
// 2. MODIFICA: Pulizia atomica dei figli
// Se stiamo modificando (id != null), resettiamo le tabelle collegate
if (service.id != null) {
if (operation.id != null) {
await Future.wait([
_supabase.from('energy_service').delete().eq('service_id', newId),
_supabase.from('fin_service').delete().eq('service_id', newId),
@@ -129,36 +129,36 @@ class ServicesRepository {
// 3. Inserimento dei moduli in parallelo per velocità
final List<Future> insertTasks = [];
if (service.energyServices.isNotEmpty) {
if (operation.energyServices.isNotEmpty) {
insertTasks.add(
_supabase
.from('energy_service')
.insert(
service.energyServices
operation.energyServices
.map((item) => item.copyWith(serviceId: newId).toMap())
.toList(),
),
);
}
if (service.finServices.isNotEmpty) {
if (operation.finServices.isNotEmpty) {
insertTasks.add(
_supabase
.from('fin_service')
.insert(
service.finServices
operation.finServices
.map((item) => item.copyWith(serviceId: newId).toMap())
.toList(),
),
);
}
if (service.entertainmentServices.isNotEmpty) {
if (operation.entertainmentServices.isNotEmpty) {
insertTasks.add(
_supabase
.from('entertainment_service')
.insert(
service.entertainmentServices
operation.entertainmentServices
.map((item) => item.copyWith(serviceId: newId).toMap())
.toList(),
),
@@ -171,7 +171,7 @@ class ServicesRepository {
// 4. UPLOAD DEI FILE LOCALI (Nuovi)
// Filtriamo solo i file che non hanno ancora un ID (quindi sono locali)
final localFilesToUpload = service.files
final localFilesToUpload = operation.files
.where((f) => f.id == null)
.toList();
@@ -180,7 +180,7 @@ class ServicesRepository {
for (var file in localFilesToUpload) {
final storagePath =
'$companyId/services/$newId/${DateTime.now().millisecondsSinceEpoch}_${file.name}.${file.extension}';
'$companyId/operations/$newId/${DateTime.now().millisecondsSinceEpoch}_${file.name}.${file.extension}';
final String mimeType = file.extension.toLowerCase() == 'pdf'
? 'application/pdf'
: 'image/${file.extension}';
@@ -216,7 +216,7 @@ class ServicesRepository {
// Interroghiamo Supabase per farci restituire la pratica con TUTTI gli ID generati
// (inclusi quelli della tabella service_file appena inseriti)
final updatedServiceData = await _supabase
.from('service')
.from('operation')
.select('''
*,
energy_service(*),
@@ -237,7 +237,7 @@ class ServicesRepository {
// --- ELIMINAZIONE ---
Future<void> deleteService(String id) async {
try {
await _supabase.from('service').delete().eq('id', id);
await _supabase.from('operation').delete().eq('id', id);
} catch (e) {
throw Exception('Errore durante l\'eliminazione: $e');
}
@@ -247,11 +247,11 @@ class ServicesRepository {
Future<List<String>> fetchTopEntertainmentTypes(String companyId) async {
try {
// Cerchiamo i tipi più frequenti associati ai servizi di questa company
// Nota: dobbiamo passare attraverso la tabella 'service' per filtrare per company_id
// Nota: dobbiamo passare attraverso la tabella 'operation' per filtrare per company_id
final response = await _supabase
.from('entertainment_service')
.select('type, service!inner(store!inner(company_id))')
.eq('service.store.company_id', companyId)
.select('type, operation!inner(store!inner(company_id))')
.eq('operation.store.company_id', companyId)
.limit(100); // Prendiamo un campione
// Logica rapida per contare le occorrenze e prendere i primi 5
@@ -297,7 +297,7 @@ class ServicesRepository {
'_',
);
final storagePath =
'$companyId/services/$serviceId/${DateTime.now().millisecondsSinceEpoch}_$cleanFileName';
'$companyId/operations/$serviceId/${DateTime.now().millisecondsSinceEpoch}_$cleanFileName';
final int fileSize = pickedFile.size;
final fileToSave = ServiceFileModel(
serviceId: serviceId,