feat: service set repos and cubit

This commit is contained in:
2026-04-15 19:31:08 +02:00
parent 61442339fe
commit 29790a7a36
2 changed files with 149 additions and 13 deletions

View File

@@ -1,3 +1,4 @@
import 'package:flutter/material.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
import '../models/service_model.dart';
// Importa gli altri modelli se sono in file separati
@@ -6,24 +7,48 @@ class ServicesRepository {
final _supabase = Supabase.instance.client;
// --- RECUPERO TUTTI I SERVIZI ---
Future<List<ServiceModel>> fetchAllServices() async {
Future<List<ServiceModel>> fetchServices({
required int offset,
int limit = 50,
String? searchTerm,
DateTimeRange? dateRange,
}) async {
try {
// La stringa di selezione tira giù il padre e TUTTI i record correlati dalle tabelle figlie
final response = await _supabase
.from('service')
.select('''
*,
energy_service(*),
fin_service(*),
entertainment_service(*)
''')
.order('created_at', ascending: false);
var query = _supabase.from('service').select('''
*,
energy_service(*),
fin_service(*),
entertainment_service(*)
''');
return (response as List)
// Filtro per range di date
if (dateRange != null) {
query = query
.gte('created_at', dateRange.start.toIso8601String())
.lte('created_at', dateRange.end.toIso8601String());
}
// Ordinamento e Paginazione
final response = await query
.order('created_at', ascending: false)
.range(offset, offset + limit - 1);
final List<ServiceModel> services = (response as List)
.map((map) => ServiceModel.fromMap(map))
.toList();
// Filtro testuale lato client per semplicità (o potresti farlo in SQL se preferisci)
if (searchTerm != null && searchTerm.isNotEmpty) {
return services.where((s) {
// Qui cercheremo per numero pratica o note (il nome cliente lo vedremo poi con le Join)
return s.number.toLowerCase().contains(searchTerm.toLowerCase()) ||
s.note.toLowerCase().contains(searchTerm.toLowerCase());
}).toList();
}
return services;
} catch (e) {
throw Exception('Errore nel recupero servizi: $e');
throw Exception('Errore fetch: $e');
}
}