ordine_sync_service.dart 8.8 KB

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