filiale_sync_service.dart 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import 'package:drift/drift.dart';
  2. import '../api_service.dart';
  3. import '../../database/database.dart';
  4. import '../../database/daos/clienti_dao.dart';
  5. import '../../database/daos/filiali_dao.dart';
  6. import '../../dto/sync_customer_dto.dart';
  7. class FilialeSyncService {
  8. final ApiService _api;
  9. final FilialiDao _dao;
  10. final ClientiDao _clientiDao;
  11. FilialeSyncService(this._api, this._dao, this._clientiDao);
  12. Future<int> uploadNewDestinations(
  13. int idAgente,
  14. String codAgente, {
  15. void Function(int current, int total)? onProgress,
  16. }) async {
  17. final dests = await _dao.getNewDestinations();
  18. int sent = 0;
  19. final total = dests.length;
  20. for (int i = 0; i < dests.length; i++) {
  21. onProgress?.call(i + 1, total);
  22. try {
  23. final d = dests[i];
  24. final dto = SyncFilialeDto(
  25. idFiliale: d.idFiliale,
  26. idCliente: d.idCliente,
  27. codFiliale: d.codFiliale,
  28. descrizione: d.descrizione,
  29. indirizzo: d.indirizzo,
  30. citta: d.citta,
  31. provincia: d.provincia,
  32. cap: d.cap,
  33. frazione: d.frazione,
  34. nazione: d.nazione,
  35. telefono: d.telefono,
  36. cellulare: d.cellulare,
  37. fax: d.fax,
  38. email: d.email,
  39. stato: d.stato,
  40. attivo: d.attivo,
  41. note: d.note,
  42. );
  43. final resp = await _api.post('/rest/filiali/$codAgente', dto.toJson());
  44. if (resp['status'] == 0) {
  45. await _dao.markAsSent(d.idFiliale);
  46. sent++;
  47. }
  48. } catch (_) {}
  49. }
  50. return sent;
  51. }
  52. Future<int> downloadDestinations(
  53. int idAgente,
  54. String codAgente,
  55. String lastUpdate, {
  56. void Function(int current, int total)? onProgress,
  57. }) async {
  58. try {
  59. final data = await _api.getList(
  60. '/rest/filiali/updates/$codAgente/$lastUpdate',
  61. );
  62. final db = _dao.db;
  63. final cacheRemoteId = <int, Filiale?>{};
  64. final cacheCode = <String, Filiale?>{};
  65. final cacheCliente = <String, Cliente?>{};
  66. final total = data.length;
  67. int count = 0;
  68. await db.transaction(() async {
  69. for (final json in data) {
  70. count++;
  71. onProgress?.call(count, total);
  72. final dto = SyncFilialeDto.fromJson(json as Map<String, dynamic>);
  73. Filiale? existing;
  74. if (dto.idFiliale != null) {
  75. existing = cacheRemoteId[dto.idFiliale!];
  76. if (existing == null) {
  77. existing = await _dao.getByRemoteId(dto.idFiliale!);
  78. if (existing != null) {
  79. cacheRemoteId[dto.idFiliale!] = existing;
  80. }
  81. }
  82. }
  83. if (existing == null && dto.codFiliale != null) {
  84. existing = cacheCode[dto.codFiliale!];
  85. if (existing == null) {
  86. existing = await _dao.getByCode(dto.codFiliale!);
  87. if (existing != null) {
  88. cacheCode[dto.codFiliale!] = existing;
  89. }
  90. }
  91. }
  92. Cliente? localCliente;
  93. if (dto.codCliente != null) {
  94. localCliente = cacheCliente[dto.codCliente!];
  95. if (localCliente == null) {
  96. final c = await _clientiDao.getByCode(idAgente, dto.codCliente!);
  97. localCliente = c;
  98. cacheCliente[dto.codCliente!] = localCliente;
  99. }
  100. }
  101. if (existing != null) {
  102. await db
  103. .update(db.filiali)
  104. .replace(
  105. Filiale(
  106. idFiliale: existing.idFiliale,
  107. idFilialeRemoto: dto.idFiliale,
  108. idCliente: localCliente?.idCliente ?? existing.idCliente,
  109. codFiliale: dto.codFiliale,
  110. descrizione: dto.descrizione,
  111. indirizzo: dto.indirizzo,
  112. citta: dto.citta,
  113. provincia: dto.provincia,
  114. cap: dto.cap,
  115. frazione: dto.frazione,
  116. nazione: dto.nazione,
  117. telefono: dto.telefono,
  118. cellulare: dto.cellulare,
  119. fax: dto.fax,
  120. email: dto.email,
  121. stato: dto.stato,
  122. attivo: dto.attivo ?? 1,
  123. note: dto.note,
  124. ),
  125. );
  126. } else {
  127. await db
  128. .into(db.filiali)
  129. .insert(
  130. FilialiCompanion(
  131. idFilialeRemoto: Value(dto.idFiliale),
  132. idCliente: Value(localCliente?.idCliente),
  133. codFiliale: Value(dto.codFiliale),
  134. descrizione: Value(dto.descrizione),
  135. indirizzo: Value(dto.indirizzo),
  136. citta: Value(dto.citta),
  137. provincia: Value(dto.provincia),
  138. cap: Value(dto.cap),
  139. frazione: Value(dto.frazione),
  140. nazione: Value(dto.nazione),
  141. telefono: Value(dto.telefono),
  142. cellulare: Value(dto.cellulare),
  143. fax: Value(dto.fax),
  144. email: Value(dto.email),
  145. stato: Value(dto.stato),
  146. attivo: Value(dto.attivo ?? 1),
  147. note: Value(dto.note),
  148. ),
  149. );
  150. }
  151. }
  152. });
  153. return count;
  154. } catch (_) {
  155. return 0;
  156. }
  157. }
  158. }