filiale_sync_service.dart 5.1 KB

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