ordine_sync_service.dart 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. import 'package:drift/drift.dart';
  2. import 'package:ristoris/database/daos/agenti_dao.dart';
  3. import '../api_service.dart';
  4. import '../../database/database.dart';
  5. import '../../database/daos/ordini_dao.dart';
  6. import '../../database/daos/clienti_dao.dart';
  7. import '../../database/daos/filiali_dao.dart';
  8. import '../../dto/sync_order_dto.dart';
  9. class OrdineSyncService {
  10. final ApiService _api;
  11. final OrdiniDao _ordiniDao;
  12. final ClientiDao _clientiDao;
  13. final FilialiDao _filialiDao;
  14. final AgentiDao _agentiDao;
  15. OrdineSyncService(
  16. this._api,
  17. this._ordiniDao,
  18. this._clientiDao,
  19. this._filialiDao,
  20. this._agentiDao,
  21. );
  22. Future<int> uploadNewOrders(int idAgente, String codAgente) async {
  23. final orders = await _ordiniDao.getNewOrders();
  24. int sent = 0;
  25. for (final o in orders) {
  26. try {
  27. final lines = await _ordiniDao.getOrderLines(o.idOrdine);
  28. final dto = SyncOrderDto(
  29. idOrdine: o.idOrdine,
  30. idOrdineAgente: o.idOrdine,
  31. numeroOrdine: o.numeroOrdine,
  32. idCliente: o.idCliente,
  33. dataOrdine: o.dataOrdine,
  34. dataConsegna: o.dataConsegna,
  35. riferimento: o.riferimento,
  36. stato: o.stato,
  37. dataModifica: o.dataModifica,
  38. idAgente: o.idAgente,
  39. noteCliente: o.noteCliente,
  40. noteOrdine: o.noteOrdine,
  41. idPagamento: o.idPagamento,
  42. righeOrdine: lines
  43. .map(
  44. (l) => SyncOrderLineDto(
  45. idRigaOrdine: l.idRigaOrdine,
  46. idArticolo: l.idArticolo,
  47. idListino: l.idListino,
  48. quantita: l.quantita,
  49. prezzoLordo: l.prezzoLordo,
  50. sconto1: l.sconto1,
  51. sconto2: l.sconto2,
  52. sconto3: l.sconto3,
  53. sconto4: l.sconto4,
  54. sconto5: l.sconto5,
  55. scontoMerce: l.scontoMerce,
  56. prezzoNetto: l.prezzoNetto,
  57. totale: l.totale,
  58. dataConsegna: l.dataConsegna,
  59. qtaEvasa: l.qtaEvasa,
  60. stato: l.stato,
  61. colli: l.colli,
  62. promozione: l.promozione,
  63. rigaPromozione: l.rigaPromozione,
  64. ),
  65. )
  66. .toList(),
  67. );
  68. final resp = await _api.post('/rest/ordini/$codAgente', dto.toJson());
  69. if (resp['status'] == 0) {
  70. final idAssegnato = resp['idAssegnato'] as int?;
  71. if (idAssegnato != null) {
  72. await _ordiniDao.markAsSent(o.idOrdine, idAssegnato);
  73. sent++;
  74. }
  75. }
  76. } catch (_) {}
  77. }
  78. return sent;
  79. }
  80. Future<int> downloadRemoteOrders(
  81. int idAgente,
  82. String codAgente,
  83. String lastUpdate,
  84. ) async {
  85. try {
  86. final data = await _api.getList(
  87. '/rest/ordini/updates/$codAgente/$lastUpdate',
  88. );
  89. final db = _ordiniDao.db;
  90. final cacheCliente = <String, int?>{};
  91. final cacheAgente = <int, Agente>{};
  92. final cacheFilialeById = <int, int?>{};
  93. final cacheFilialeByRemoteId = <int, int?>{};
  94. int count = 0;
  95. await db.transaction(() async {
  96. for (final json in data) {
  97. final idOrdine = json['idOrdine'] as int?;
  98. final idOrdineAgente = json['idOrdineAgente'] as int?;
  99. final numeroOrdineSede = json['numeroOrdineSede'] as int?;
  100. final stato = json['stato'] as String?;
  101. Ordine? existing;
  102. if (idOrdineAgente != null) {
  103. existing ??= await _ordiniDao.getById(idOrdineAgente);
  104. }
  105. if (existing == null && idOrdine != null) {
  106. existing ??= await _ordiniDao.findByIdOrdineSede(idOrdine);
  107. }
  108. if (existing == null && numeroOrdineSede != null) {
  109. final numKey = numeroOrdineSede.toString();
  110. existing ??= await _ordiniDao.findByNumeroOrdineSede(numKey);
  111. }
  112. if (stato == 'X') {
  113. if (existing != null) {
  114. final deleteId = existing.idOrdine;
  115. await (db.delete(
  116. db.ordini,
  117. )..where((t) => t.idOrdine.equals(deleteId))).go();
  118. }
  119. continue;
  120. }
  121. final codAgente = json['codAgente'] as String?;
  122. Agente? agente = cacheAgente[idAgente];
  123. if (agente == null) {
  124. agente = await _agentiDao.findByCode(codAgente!);
  125. if (agente != null) {
  126. cacheAgente[idAgente] = agente;
  127. }
  128. }
  129. final codCliente = json['codCliente'] as String?;
  130. int? localIdCliente;
  131. if (codCliente != null) {
  132. localIdCliente = cacheCliente[codCliente];
  133. if (localIdCliente == null) {
  134. final c = await _clientiDao.getByCode(idAgente, codCliente);
  135. localIdCliente = c?.idCliente;
  136. cacheCliente[codCliente] = localIdCliente;
  137. }
  138. }
  139. final idFilialeRemoto = json['idFilialeRemoto'] as int?;
  140. final idFiliale = json['idFiliale'] as int?;
  141. int? localIdFiliale;
  142. if (idFilialeRemoto != null) {
  143. localIdFiliale = cacheFilialeById[idFilialeRemoto];
  144. if (localIdFiliale == null) {
  145. final f = await _filialiDao.getById(idFilialeRemoto);
  146. localIdFiliale = f?.idFiliale;
  147. cacheFilialeById[idFilialeRemoto] = localIdFiliale;
  148. }
  149. }
  150. if (localIdFiliale == null && idFiliale != null) {
  151. localIdFiliale = cacheFilialeByRemoteId[idFiliale];
  152. if (localIdFiliale == null) {
  153. final f = await _filialiDao.getByRemoteId(idFiliale);
  154. localIdFiliale = f?.idFiliale;
  155. cacheFilialeByRemoteId[idFiliale] = localIdFiliale;
  156. }
  157. }
  158. final ordineCompanion = OrdiniCompanion(
  159. idOrdine: existing != null
  160. ? Value(existing.idOrdine)
  161. : Value.absent(),
  162. idOrdineSede: Value(idOrdine),
  163. numeroOrdine: Value(json['numeroOrdine'] as int?),
  164. numeroOrdineSede: Value(numeroOrdineSede?.toString()),
  165. dataOrdine: Value(json['dataOrdine'] as String?),
  166. dataConsegna: Value(json['dataConsegna'] as String?),
  167. dataModifica: Value(json['dataModifica'] as String?),
  168. riferimento: Value(json['riferimento'] as String?),
  169. noteCliente: Value(json['noteCliente'] as String?),
  170. noteOrdine: Value(json['noteOrdine'] as String?),
  171. idCliente: Value(localIdCliente),
  172. idFiliale: Value(localIdFiliale),
  173. stato: Value('T'),
  174. idListino: Value(null),
  175. idAgente: Value(agente!.idAgente),
  176. idPagamento: Value(json['idPagamento'] as int?),
  177. );
  178. final insertedId = await db
  179. .into(db.ordini)
  180. .insertOnConflictUpdate(ordineCompanion);
  181. final savedId = existing?.idOrdine ?? insertedId;
  182. await (db.delete(
  183. db.righeOrdine,
  184. )..where((t) => t.idOrdine.equals(savedId))).go();
  185. final righe = json['righeOrdine'] as List<dynamic>?;
  186. if (righe != null && righe.isNotEmpty) {
  187. await db.batch((batch) {
  188. for (final r in righe) {
  189. final rigaJson = r as Map<String, dynamic>;
  190. batch.insert(
  191. db.righeOrdine,
  192. RigheOrdineCompanion(
  193. idOrdine: Value(savedId),
  194. idArticolo: Value(rigaJson['idArticolo'] as int?),
  195. idListino: Value(rigaJson['idListino'] as int?),
  196. quantita: Value(_toDouble(rigaJson['quantita'])),
  197. prezzoLordo: Value(_toDouble(rigaJson['prezzoLordo'])),
  198. sconto1: Value(_toDouble(rigaJson['sconto1'])),
  199. sconto2: Value(_toDouble(rigaJson['sconto2'])),
  200. sconto3: Value(_toDouble(rigaJson['sconto3'])),
  201. sconto4: Value(_toDouble(rigaJson['sconto4'])),
  202. sconto5: Value(_toDouble(rigaJson['sconto5'])),
  203. scontoMerce: Value(_toDouble(rigaJson['scontoMerce'])),
  204. prezzoNetto: Value(_toDouble(rigaJson['prezzoNetto'])),
  205. totale: Value(_toDouble(rigaJson['totale'])),
  206. dataConsegna: Value(rigaJson['dataConsegna'] as String?),
  207. dataModifica: Value(rigaJson['dataModifica'] as String?),
  208. qtaEvasa: Value(_toDouble(rigaJson['qtaEvasa'])),
  209. stato: Value(rigaJson['stato'] as String?),
  210. colli: Value(_toDouble(rigaJson['colli'])),
  211. promozione: Value(rigaJson['promozione'] as int?),
  212. rigaPromozione: Value(rigaJson['rigaPromozione'] as int?),
  213. prezzoManuale: Value(rigaJson['prezzoManuale'] as int?),
  214. ),
  215. );
  216. }
  217. });
  218. }
  219. count++;
  220. }
  221. });
  222. return count;
  223. } catch (ex) {
  224. print('Error downloading orders: $ex');
  225. return 0;
  226. }
  227. }
  228. double? _toDouble(dynamic value) {
  229. if (value == null) return null;
  230. if (value is double) return value;
  231. if (value is int) return value.toDouble();
  232. return double.tryParse(value.toString());
  233. }
  234. }