import 'package:drift/drift.dart'; import '../api_service.dart'; import '../../database/database.dart'; import '../../database/daos/clienti_dao.dart'; import '../../database/daos/filiali_dao.dart'; import '../../dto/sync_customer_dto.dart'; class FilialeSyncService { final ApiService _api; final FilialiDao _dao; final ClientiDao _clientiDao; FilialeSyncService(this._api, this._dao, this._clientiDao); Future uploadNewDestinations(int idAgente, String codAgente) async { final dests = await _dao.getNewDestinations(); int sent = 0; for (final d in dests) { try { final dto = SyncFilialeDto( idFiliale: d.idFiliale, idCliente: d.idCliente, codFiliale: d.codFiliale, descrizione: d.descrizione, indirizzo: d.indirizzo, citta: d.citta, provincia: d.provincia, cap: d.cap, frazione: d.frazione, nazione: d.nazione, telefono: d.telefono, cellulare: d.cellulare, fax: d.fax, email: d.email, stato: d.stato, attivo: d.attivo, note: d.note, ); final resp = await _api.post('/rest/filiali/$codAgente', dto.toJson()); if (resp['status'] == 0) { await _dao.markAsSent(d.idFiliale); sent++; } } catch (_) {} } return sent; } Future downloadDestinations( int idAgente, String codAgente, String lastUpdate, ) async { try { final data = await _api.getList( '/rest/filiali/updates/$codAgente/$lastUpdate', ); final db = _dao.db; final cacheRemoteId = {}; final cacheCode = {}; final cacheCliente = {}; int count = 0; await db.transaction(() async { for (final json in data) { final dto = SyncFilialeDto.fromJson(json as Map); Filiale? existing; if (dto.idFiliale != null) { existing = cacheRemoteId[dto.idFiliale!]; if (existing == null) { existing = await _dao.getByRemoteId(dto.idFiliale!); if (existing != null) { cacheRemoteId[dto.idFiliale!] = existing; } } } if (existing == null && dto.codFiliale != null) { existing = cacheCode[dto.codFiliale!]; if (existing == null) { existing = await _dao.getByCode(dto.codFiliale!); if (existing != null) { cacheCode[dto.codFiliale!] = existing; } } } Cliente? localCliente; if (dto.codCliente != null) { localCliente = cacheCliente[dto.codCliente!]; if (localCliente == null) { final c = await _clientiDao.getByCode(idAgente, dto.codCliente!); localCliente = c; cacheCliente[dto.codCliente!] = localCliente; } } if (existing != null) { await db .update(db.filiali) .replace( Filiale( idFiliale: existing.idFiliale, idFilialeRemoto: dto.idFiliale, idCliente: localCliente?.idCliente ?? existing.idCliente, codFiliale: dto.codFiliale, descrizione: dto.descrizione, indirizzo: dto.indirizzo, citta: dto.citta, provincia: dto.provincia, cap: dto.cap, frazione: dto.frazione, nazione: dto.nazione, telefono: dto.telefono, cellulare: dto.cellulare, fax: dto.fax, email: dto.email, stato: dto.stato, attivo: dto.attivo ?? 1, note: dto.note, ), ); } else { await db .into(db.filiali) .insert( FilialiCompanion( idFilialeRemoto: Value(dto.idFiliale), idCliente: Value(localCliente?.idCliente), codFiliale: Value(dto.codFiliale), descrizione: Value(dto.descrizione), indirizzo: Value(dto.indirizzo), citta: Value(dto.citta), provincia: Value(dto.provincia), cap: Value(dto.cap), frazione: Value(dto.frazione), nazione: Value(dto.nazione), telefono: Value(dto.telefono), cellulare: Value(dto.cellulare), fax: Value(dto.fax), email: Value(dto.email), stato: Value(dto.stato), attivo: Value(dto.attivo ?? 1), note: Value(dto.note), ), ); } count++; } }); return count; } catch (_) { return 0; } } }