cliente_sync_service.dart 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. import 'package:drift/drift.dart';
  2. import '../api_service.dart';
  3. import '../../database/daos/clienti_dao.dart';
  4. import '../../database/daos/clienti_agente_dao.dart';
  5. import '../../database/database.dart';
  6. import '../../dto/sync_customer_dto.dart';
  7. class ClienteSyncService {
  8. final ApiService _api;
  9. final ClientiDao _clientiDao;
  10. final ClientiAgenteDao _clientiAgenteDao;
  11. ClienteSyncService(this._api, this._clientiDao, this._clientiAgenteDao);
  12. Future<int> uploadNewCustomers(
  13. int idAgente,
  14. String codAgente, {
  15. void Function(int current, int total)? onProgress,
  16. }) async {
  17. final newClients = await _clientiDao.getNewCustomers(idAgente);
  18. int sent = 0;
  19. final total = newClients.length;
  20. for (int i = 0; i < newClients.length; i++) {
  21. onProgress?.call(i + 1, total);
  22. try {
  23. final c = newClients[i];
  24. final dto = _toDto(c);
  25. final resp = await _api.post('/rest/clienti/$codAgente', dto.toJson());
  26. if (resp['status'] == 0) {
  27. final idAssegnato = resp['idAssegnato'] as int?;
  28. if (idAssegnato != null) {
  29. await _clientiDao.markAsSent(c.idCliente, idAssegnato);
  30. sent++;
  31. }
  32. }
  33. } catch (_) {}
  34. }
  35. return sent;
  36. }
  37. Future<int> downloadCustomers(
  38. int idAgente,
  39. String codAgente,
  40. String lastUpdate, {
  41. void Function(int current, int total)? onProgress,
  42. }) async {
  43. try {
  44. final data = await _api.getList(
  45. '/rest/clienti/updates/$codAgente/$lastUpdate',
  46. );
  47. final db = _clientiDao.db;
  48. final cacheRemoteId = <int, Cliente?>{};
  49. final cacheCode = <String, Cliente?>{};
  50. final cacheAssoc = <String, bool>{};
  51. final total = data.length;
  52. int count = 0;
  53. await db.transaction(() async {
  54. for (final json in data) {
  55. count++;
  56. onProgress?.call(count, total);
  57. final dto = SyncCustomerDto.fromJson(json as Map<String, dynamic>);
  58. Cliente? existing;
  59. if (dto.idCliente != null) {
  60. existing = cacheRemoteId.putIfAbsent(dto.idCliente!, () => null);
  61. if (existing == null) {
  62. existing = await _clientiDao.getByRemoteId(
  63. idAgente,
  64. dto.idCliente!,
  65. );
  66. cacheRemoteId[dto.idCliente!] = existing;
  67. }
  68. }
  69. if (existing == null && dto.codCliente != null) {
  70. existing = cacheCode.putIfAbsent(dto.codCliente!, () => null);
  71. if (existing == null) {
  72. existing = await _clientiDao.getByCode(idAgente, dto.codCliente!);
  73. cacheCode[dto.codCliente!] = existing;
  74. }
  75. }
  76. int? savedId = existing?.idCliente;
  77. if (existing != null) {
  78. await db
  79. .update(db.clienti)
  80. .replace(
  81. Cliente(
  82. idCliente: existing.idCliente,
  83. idClienteRemoto: dto.idCliente,
  84. codCliente: dto.codCliente,
  85. ragioneSociale: dto.ragioneSociale,
  86. indirizzo: dto.indirizzo,
  87. citta: dto.citta,
  88. provincia: dto.provincia,
  89. cap: dto.cap,
  90. frazione: dto.frazione,
  91. nazione: dto.nazione,
  92. telefono: dto.telefono,
  93. cellulare: dto.cellulare,
  94. partitaIva: dto.partitaIva,
  95. codiceFiscale: dto.codiceFiscale,
  96. note: dto.note,
  97. noteOrdine: dto.noteOrdine,
  98. stato: 'T',
  99. attivo: dto.attivo ?? 1,
  100. idPagamento: dto.idPagamento,
  101. idListino: dto.idListino,
  102. dataModifica: dto.dataModifica,
  103. sdi: dto.sdi,
  104. pec: dto.pec,
  105. altreNote: dto.altreNote,
  106. numeroCivico: dto.numeroCivico,
  107. pod: dto.pod,
  108. pdr: dto.pdr,
  109. ubicazione: dto.ubicazione,
  110. banca: dto.banca,
  111. bancaFiliale: dto.bancaFiliale,
  112. codBlocco: dto.codBlocco,
  113. creditScoreColor: dto.creditScoreColor,
  114. dataCreditScore: dto.dataCreditScore,
  115. ),
  116. );
  117. } else {
  118. savedId = await db
  119. .into(db.clienti)
  120. .insert(
  121. ClientiCompanion(
  122. idClienteRemoto: Value(dto.idCliente),
  123. codCliente: Value(dto.codCliente),
  124. ragioneSociale: Value(dto.ragioneSociale),
  125. indirizzo: Value(dto.indirizzo),
  126. citta: Value(dto.citta),
  127. provincia: Value(dto.provincia),
  128. cap: Value(dto.cap),
  129. frazione: Value(dto.frazione),
  130. nazione: Value(dto.nazione),
  131. telefono: Value(dto.telefono),
  132. cellulare: Value(dto.cellulare),
  133. fax: Value(dto.fax),
  134. email: Value(dto.email),
  135. partitaIva: Value(dto.partitaIva),
  136. codiceFiscale: Value(dto.codiceFiscale),
  137. note: Value(dto.note),
  138. noteOrdine: Value(dto.noteOrdine),
  139. stato: const Value('T'),
  140. attivo: Value(dto.attivo ?? 1),
  141. idPagamento: Value(dto.idPagamento),
  142. idListino: Value(dto.idListino),
  143. dataModifica: Value(dto.dataModifica),
  144. sdi: Value(dto.sdi),
  145. pec: Value(dto.pec),
  146. altreNote: Value(dto.altreNote),
  147. numeroCivico: Value(dto.numeroCivico),
  148. pod: Value(dto.pod),
  149. pdr: Value(dto.pdr),
  150. ubicazione: Value(dto.ubicazione),
  151. banca: Value(dto.banca),
  152. bancaFiliale: Value(dto.bancaFiliale),
  153. codBlocco: Value(dto.codBlocco),
  154. creditScoreColor: Value(dto.creditScoreColor),
  155. dataCreditScore: Value(dto.dataCreditScore),
  156. ),
  157. );
  158. }
  159. final assocKey = '$savedId-$idAgente';
  160. if (!cacheAssoc.containsKey(assocKey)) {
  161. final assoc = await _clientiAgenteDao.findByClienteAgente(
  162. savedId!,
  163. idAgente,
  164. );
  165. if (assoc == null) {
  166. await db
  167. .into(db.clientiAgente)
  168. .insert(
  169. ClientiAgenteCompanion(
  170. idCliente: Value(savedId),
  171. idAgente: Value(idAgente),
  172. attivo: const Value(1),
  173. ),
  174. );
  175. }
  176. cacheAssoc[assocKey] = true;
  177. }
  178. }
  179. });
  180. return count;
  181. } catch (ex) {
  182. print('Error occurred while downloading customers: $ex');
  183. return 0;
  184. }
  185. }
  186. SyncCustomerDto _toDto(Cliente c) {
  187. return SyncCustomerDto(
  188. idCliente: c.idCliente,
  189. codCliente: c.codCliente,
  190. ragioneSociale: c.ragioneSociale,
  191. indirizzo: c.indirizzo,
  192. citta: c.citta,
  193. provincia: c.provincia,
  194. cap: c.cap,
  195. frazione: c.frazione,
  196. nazione: c.nazione,
  197. telefono: c.telefono,
  198. cellulare: c.cellulare,
  199. fax: c.fax,
  200. email: c.email,
  201. partitaIva: c.partitaIva,
  202. codiceFiscale: c.codiceFiscale,
  203. note: c.note,
  204. noteOrdine: c.noteOrdine,
  205. stato: c.stato,
  206. attivo: c.attivo,
  207. idPagamento: c.idPagamento,
  208. idListino: c.idListino,
  209. dataModifica: c.dataModifica,
  210. sdi: c.sdi,
  211. pec: c.pec,
  212. altreNote: c.altreNote,
  213. numeroCivico: c.numeroCivico,
  214. pod: c.pod,
  215. pdr: c.pdr,
  216. ubicazione: c.ubicazione,
  217. banca: c.banca,
  218. bancaFiliale: c.bancaFiliale,
  219. codBlocco: c.codBlocco,
  220. creditScoreColor: c.creditScoreColor,
  221. dataCreditScore: c.dataCreditScore,
  222. );
  223. }
  224. }