cliente_sync_service.dart 7.7 KB

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