reference_sync_service.dart 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. import 'package:drift/drift.dart';
  2. import '../api_service.dart';
  3. import '../../database/daos/articoli_dao.dart';
  4. import '../../database/daos/clienti_dao.dart';
  5. import '../../database/daos/listini_dao.dart';
  6. import '../../database/daos/tabelle_dao.dart';
  7. import '../../database/daos/pagamenti_dao.dart';
  8. import '../../database/daos/sconti_dao.dart';
  9. import '../../database/daos/promozioni_dao.dart';
  10. import '../../database/daos/scadenze_dao.dart';
  11. import '../../database/daos/statistiche_dao.dart';
  12. import '../../database/daos/parametri_dao.dart';
  13. import '../../database/database.dart';
  14. import '../../dto/sync_promo_dto.dart';
  15. class ReferenceSyncService {
  16. final ApiService _api;
  17. final TabelleDao _tabelleDao;
  18. final PagamentiDao _pagamentiDao;
  19. final ScontiDao _scontiDao;
  20. final ArticoliDao _articoliDao;
  21. final ListiniDao _listiniDao;
  22. final PromozioniDao _promozioniDao;
  23. final ScadenzeDao _scadenzeDao;
  24. final StatisticheDao _statisticheDao;
  25. final ParametriDao _parametriDao;
  26. final ClientiDao _clientiDao;
  27. ReferenceSyncService(
  28. this._api,
  29. this._tabelleDao,
  30. this._pagamentiDao,
  31. this._scontiDao,
  32. this._articoliDao,
  33. this._listiniDao,
  34. this._promozioniDao,
  35. this._scadenzeDao,
  36. this._statisticheDao,
  37. this._parametriDao,
  38. this._clientiDao,
  39. );
  40. Future<int> downloadTabelle(
  41. String lastUpdate, {
  42. void Function(int current, int total)? onProgress,
  43. }) async {
  44. try {
  45. final data = await _api.getList('/rest/tabelle/updates/$lastUpdate');
  46. final db = _tabelleDao.db;
  47. final total = data.length;
  48. await db.batch((batch) {
  49. for (int i = 0; i < data.length; i++) {
  50. final json = data[i];
  51. onProgress?.call(i + 1, total);
  52. batch.insert(
  53. db.tabelle,
  54. Tabella(
  55. idTabella: json['idTabella'] as int? ?? 0,
  56. tipoTabella: json['tipoTabella'] as String? ?? '',
  57. codTabella: json['codTabella'] as String?,
  58. descrizione: json['descrizione'] as String?,
  59. stringa1: json['stringa1'] as String?,
  60. stringa2: json['stringa2'] as String?,
  61. stringa3: json['stringa3'] as String?,
  62. stringa4: json['stringa4'] as String?,
  63. stringa5: json['stringa5'] as String?,
  64. valore1: _toDouble(json['valore1']),
  65. valore2: _toDouble(json['valore2']),
  66. valore3: _toDouble(json['valore3']),
  67. valore4: _toDouble(json['valore4']),
  68. valore5: _toDouble(json['valore5']),
  69. dataModifica: json['dataModifica'] as String?,
  70. ),
  71. mode: InsertMode.insertOrReplace,
  72. );
  73. }
  74. });
  75. return data.length;
  76. } catch (_) {
  77. return 0;
  78. }
  79. }
  80. Future<int> downloadPagamenti(
  81. String lastUpdate, {
  82. void Function(int current, int total)? onProgress,
  83. }) async {
  84. try {
  85. final data = await _api.getList('/rest/pagamenti/updates/$lastUpdate');
  86. final db = _pagamentiDao.db;
  87. final total = data.length;
  88. await db.batch((batch) {
  89. for (int i = 0; i < data.length; i++) {
  90. final json = data[i];
  91. onProgress?.call(i + 1, total);
  92. batch.insert(
  93. db.pagamenti,
  94. Pagamento(
  95. idPagamento: json['idPagamento'] as int? ?? 0,
  96. codPagamento: json['codPagamento'] as String?,
  97. descrizione: json['descrizione'] as String?,
  98. dataModifica: json['dataModifica'] as String?,
  99. attivo: json['attivo'] as int?,
  100. ),
  101. mode: InsertMode.insertOrReplace,
  102. );
  103. }
  104. });
  105. return data.length;
  106. } catch (_) {
  107. return 0;
  108. }
  109. }
  110. Future<int> downloadSconti(
  111. String lastUpdate, {
  112. void Function(int current, int total)? onProgress,
  113. }) async {
  114. try {
  115. final data = await _api.getList('/rest/sconti/updates/$lastUpdate');
  116. final db = _scontiDao.db;
  117. final total = data.length;
  118. await db.batch((batch) {
  119. for (int i = 0; i < data.length; i++) {
  120. final json = data[i];
  121. onProgress?.call(i + 1, total);
  122. batch.insert(
  123. db.sconti,
  124. Sconto(
  125. idSconto: json['idSconto'] as int? ?? 0,
  126. codSconto: json['codSconto'] as String?,
  127. descrizione: json['descrizione'] as String?,
  128. sconto1: _toDouble(json['sconto1']),
  129. sconto2: _toDouble(json['sconto2']),
  130. sconto3: _toDouble(json['sconto3']),
  131. sconto4: _toDouble(json['sconto4']),
  132. sconto5: _toDouble(json['sconto5']),
  133. ),
  134. mode: InsertMode.insertOrReplace,
  135. );
  136. }
  137. });
  138. return data.length;
  139. } catch (_) {
  140. return 0;
  141. }
  142. }
  143. Future<int> downloadArticoli(
  144. String lastUpdate, {
  145. void Function(int current, int total)? onProgress,
  146. }) async {
  147. try {
  148. final data = await _api.getList('/rest/articoli/updates/$lastUpdate');
  149. final db = _articoliDao.db;
  150. final total = data.length;
  151. await db.batch((batch) {
  152. for (int i = 0; i < data.length; i++) {
  153. final json = data[i];
  154. onProgress?.call(i + 1, total);
  155. batch.insert(
  156. db.articoli,
  157. Articolo(
  158. idArticolo: json['idArticolo'] as int? ?? 0,
  159. posizione: json['posizione'] as int?,
  160. codArticolo: json['codArticolo'] as String? ?? '',
  161. descrizione: json['descrizione'] as String?,
  162. ean: json['ean'] as String?,
  163. idIva:
  164. (json['iva'] as Map<String, dynamic>?)?['idTabella'] as int?,
  165. idClassifica1: (json['classifica1']
  166. as Map<String, dynamic>?)?['idTabella'] as int?,
  167. idClassifica2: (json['classifica2']
  168. as Map<String, dynamic>?)?['idTabella'] as int?,
  169. idClassifica3: (json['classifica3']
  170. as Map<String, dynamic>?)?['idTabella'] as int?,
  171. idClassifica4: (json['classifica4']
  172. as Map<String, dynamic>?)?['idTabella'] as int?,
  173. peso: _toDouble(json['peso']),
  174. giacenza: _toDouble(json['giacenza']),
  175. unitaMisura: json['unitaMisura'] as String?,
  176. attivo: json['attivo'] as int? ?? 1,
  177. pezziConfezione: _toDouble(json['pezziConfezione']),
  178. fileFoto: json['fileFoto'] as String?,
  179. schedaProdotto: json['schedaProdotto'] as String?,
  180. prezzoBase: json['prezzoBase']?.toString(),
  181. stato: json['stato'] as String?,
  182. dataModifica: json['dataModifica'] as String?,
  183. gruppo: json['gruppo'] as String?,
  184. categoria: json['categoria'] as String?,
  185. colliPerStrato: json['colliPerStrato']?.toString(),
  186. stratiPerPallet: json['stratiPerPallet']?.toString(),
  187. ),
  188. mode: InsertMode.insertOrReplace,
  189. );
  190. }
  191. });
  192. return data.length;
  193. } catch (_) {
  194. return 0;
  195. }
  196. }
  197. Future<int> downloadListini(
  198. String lastUpdate, {
  199. void Function(int current, int total)? onProgress,
  200. }) async {
  201. try {
  202. final data = await _api.getList('/rest/listini/updates/$lastUpdate');
  203. final db = _listiniDao.db;
  204. final total = data.length;
  205. await db.batch((batch) {
  206. for (int i = 0; i < data.length; i++) {
  207. final json = data[i];
  208. onProgress?.call(i + 1, total);
  209. batch.insert(
  210. db.listini,
  211. Listino(
  212. idListino: json['idListino'] as int? ?? 0,
  213. codListino: json['codListino'] as String?,
  214. descrizione: json['descrizione'] as String?,
  215. validoDa: json['validoDa'] as String?,
  216. validoA: json['validoA'] as String?,
  217. attivo: json['attivo'] as int? ?? 1,
  218. dataModifica: json['dataModifica'] as String?,
  219. listinoAgente: json['listinoAgente'] as int?,
  220. ),
  221. mode: InsertMode.insertOrReplace,
  222. );
  223. }
  224. });
  225. return data.length;
  226. } catch (_) {
  227. return 0;
  228. }
  229. }
  230. Future<int> downloadListiniArticolo(
  231. String lastUpdate, {
  232. void Function(int current, int total)? onProgress,
  233. }) async {
  234. try {
  235. final data = await _api.getList(
  236. '/rest/listinoArticoli/updates/$lastUpdate',
  237. );
  238. final db = _listiniDao.db;
  239. final total = data.length;
  240. await db.batch((batch) {
  241. for (int i = 0; i < data.length; i++) {
  242. final json = data[i];
  243. onProgress?.call(i + 1, total);
  244. final articolo = json['articolo'] as Map<String, dynamic>?;
  245. final listino = json['listino'] as Map<String, dynamic>?;
  246. final sconto = json['sconto'] as Map<String, dynamic>?;
  247. batch.insert(
  248. db.listiniArticolo,
  249. ListinoArticolo(
  250. idListinoArticoli: json['idListinoArticoli'] as int? ?? 0,
  251. idListino:
  252. listino?['idListino'] as int? ?? json['idListino'] as int?,
  253. idArticolo:
  254. articolo?['idArticolo'] as int? ?? json['idArticolo'] as int?,
  255. prezzo: _toDouble(json['prezzo']),
  256. idSconto: sconto?['idSconto'] as int? ?? json['idSconto'] as int?,
  257. validoDa: json['validoDa'] as String?,
  258. validoA: json['validoA'] as String?,
  259. attivo: json['attivo'] as int? ?? 1,
  260. ),
  261. mode: InsertMode.insertOrReplace,
  262. );
  263. }
  264. });
  265. return data.length;
  266. } catch (_) {
  267. return 0;
  268. }
  269. }
  270. Future<int> downloadListiniCliente(
  271. int idAgente,
  272. String codAgente,
  273. String lastUpdate, {
  274. void Function(int current, int total)? onProgress,
  275. }) async {
  276. try {
  277. final data = await _api.getList(
  278. '/rest/listinoCliente/updates/$codAgente/$lastUpdate',
  279. );
  280. final db = _listiniDao.db;
  281. final cacheCliente = <int, int?>{};
  282. final items = <ListinoCliente>[];
  283. final total = data.length;
  284. for (int i = 0; i < data.length; i++) {
  285. onProgress?.call(i + 1, total);
  286. final json = data[i];
  287. final articolo = json['articolo'] as Map<String, dynamic>?;
  288. final listino = json['listino'] as Map<String, dynamic>?;
  289. final sconto = json['sconto'] as Map<String, dynamic>?;
  290. final jsonIdCliente = json['idCliente'] as int?;
  291. int? localIdCliente;
  292. if (jsonIdCliente != null) {
  293. localIdCliente = cacheCliente[jsonIdCliente];
  294. if (localIdCliente == null) {
  295. final c = await _clientiDao.getByRemoteId(idAgente, jsonIdCliente);
  296. localIdCliente = c?.idCliente;
  297. cacheCliente[jsonIdCliente] = localIdCliente;
  298. }
  299. }
  300. items.add(
  301. ListinoCliente(
  302. idListinoCliente: json['idListinoCliente'] as int? ?? 0,
  303. idListino: listino?['idListino'] as int?,
  304. idCliente: localIdCliente,
  305. idArticolo:
  306. articolo?['idArticolo'] as int? ?? json['idArticolo'] as int?,
  307. idSconto: sconto?['idSconto'] as int?,
  308. validoDa: json['validoDa'] as String?,
  309. validoA: json['validoA'] as String?,
  310. prezzo: _toDouble(json['prezzo']),
  311. attivo: json['attivo'] as int? ?? 1,
  312. annullato: json['annullato'] as String? ?? 'N',
  313. listinoSostitutivo: json['listinoSostitutivo'] as String?,
  314. stato: json['stato'] as String?,
  315. ),
  316. );
  317. }
  318. await db.batch((batch) {
  319. for (final item in items) {
  320. batch.insert(db.listiniCliente, item,
  321. mode: InsertMode.insertOrReplace);
  322. }
  323. });
  324. return data.length;
  325. } catch (_) {
  326. return 0;
  327. }
  328. }
  329. Future<int> downloadScontiCliente(
  330. int idAgente,
  331. String codAgente,
  332. String lastUpdate, {
  333. void Function(int current, int total)? onProgress,
  334. }) async {
  335. try {
  336. final data = await _api.getList(
  337. '/rest/scontocliente/updates/$codAgente/$lastUpdate',
  338. );
  339. final db = _scontiDao.db;
  340. final total = data.length;
  341. await db.batch((batch) {
  342. for (int i = 0; i < data.length; i++) {
  343. final json = data[i];
  344. onProgress?.call(i + 1, total);
  345. batch.insert(
  346. db.scontiCliente,
  347. ScontoCliente(
  348. idScontoCliente: json['idScontoCliente'] as int? ?? 0,
  349. idCliente: json['idCliente'] as int?,
  350. idArticolo: json['idArticolo'] as int?,
  351. linea: json['linea'] as String?,
  352. idSconto: json['idSconto'] as int?,
  353. validoDa: json['validoDa'] as String?,
  354. validoA: json['validoA'] as String?,
  355. stato: json['stato'] as String?,
  356. dataModifica: json['dataModifica'] as String?,
  357. ),
  358. mode: InsertMode.insertOrReplace,
  359. );
  360. }
  361. });
  362. return data.length;
  363. } catch (_) {
  364. return 0;
  365. }
  366. }
  367. Future<int> downloadPromozioni(
  368. String lastUpdate, {
  369. void Function(int current, int total)? onProgress,
  370. }) async {
  371. try {
  372. final data = await _api.getList('/rest/promozioni/updates/$lastUpdate');
  373. final db = _promozioniDao.db;
  374. int count = 0;
  375. final total = data.length;
  376. await db.transaction(() async {
  377. await db.delete(db.promoOmaggi).go();
  378. await db.delete(db.promoListini).go();
  379. await db.delete(db.promoArticoli).go();
  380. await db.delete(db.promozioni).go();
  381. for (int i = 0; i < data.length; i++) {
  382. count++;
  383. onProgress?.call(count, total);
  384. final json = data[i];
  385. final dto = SyncPromoDto.fromJson(json as Map<String, dynamic>);
  386. await db.into(db.promozioni).insert(
  387. Promozione(
  388. progressivo: dto.progressivo ?? 0,
  389. tipoPromozione: dto.tipoPromozione,
  390. descrizione: dto.descrizione,
  391. dataInizio: dto.dataInizio,
  392. dataFine: dto.dataFine,
  393. limiteQta: dto.limiteQta,
  394. quantitaOmaggio: dto.quantitaOmaggio,
  395. limiteImporto: dto.limiteImporto,
  396. stato: dto.stato,
  397. priorita: dto.priorita ?? 0,
  398. codice: dto.codice,
  399. idArticoloOmaggio: dto.articoloOmaggio?.idArticolo,
  400. idSconto: dto.sconto?.idSconto,
  401. idListino: dto.listinoOmaggio?.idListino,
  402. ),
  403. );
  404. for (final art in dto.promozioneArticoli) {
  405. await db.into(db.promoArticoli).insert(
  406. PromoArticolo(
  407. progressivo: dto.progressivo ?? 0,
  408. riga: art.promozioneArticoloKey?.riga ?? 0,
  409. quantitaOmaggio:
  410. art.promozioneArticoloKey?.riga?.toDouble(),
  411. idArticolo: art.articolo?.idArticolo,
  412. ),
  413. );
  414. }
  415. for (final l in dto.promozioneListini) {
  416. await db.into(db.promoListini).insert(
  417. PromoListino(
  418. progressivo: dto.progressivo ?? 0,
  419. idListino: l.promozioneListinoKey?.idListino ?? 0,
  420. ),
  421. );
  422. }
  423. for (final om in dto.promozioneOmaggio) {
  424. await db.into(db.promoOmaggi).insert(
  425. PromoOmaggio(
  426. progressivo: dto.progressivo ?? 0,
  427. riga: om.promozioneOmaggioKey?.riga ?? 0,
  428. idArticolo: om.articolo?.idArticolo,
  429. quantita: om.quantita,
  430. ),
  431. );
  432. }
  433. count++;
  434. }
  435. });
  436. return count;
  437. } catch (_) {
  438. return 0;
  439. }
  440. }
  441. Future<int> downloadScadenze(
  442. int idAgente,
  443. String codAgente,
  444. String lastUpdate, {
  445. void Function(int current, int total)? onProgress,
  446. }) async {
  447. Map<int, Cliente> cacheCliente = {};
  448. try {
  449. final data = await _api.getList(
  450. '/rest/scadenze/updates/$codAgente/$lastUpdate',
  451. );
  452. final db = _scadenzeDao.db;
  453. final total = data.length;
  454. int count = 0;
  455. await db.transaction(() async {
  456. //await _scadenzeDao.markAllAsDeleted(idAgente);
  457. await db.batch((batch) async {
  458. for (final json in data) {
  459. count++;
  460. onProgress?.call(count, total);
  461. // cerca il cliente nella cache usando idClienteRemoto
  462. final idClienteRemoto = json['idCliente'] as int?;
  463. Cliente? cliente = cacheCliente[idClienteRemoto];
  464. if (cliente == null) {
  465. cliente =
  466. await _clientiDao.getByRemoteId(idAgente, idClienteRemoto!);
  467. if (cliente != null) {
  468. cacheCliente[idClienteRemoto] = cliente;
  469. }
  470. }
  471. if (cliente != null) {
  472. batch.insert(
  473. db.scadenze,
  474. Scadenza(
  475. idScadenza: json['idScadenza'] as int? ?? 0,
  476. idCliente: cliente.idCliente,
  477. idAgente: idAgente,
  478. chiave: json['chiave'] as String?,
  479. numPartita: json['numPartita'] as String?,
  480. dataScadenza: json['dataScadenza'] as String?,
  481. segno: json['segno'] as String?,
  482. importoFattura: _toDouble(json['importoFattura']),
  483. valuta: json['valuta'] as String?,
  484. numDoc: json['numDoc'] as String?,
  485. serieDoc: json['serieDoc'] as String?,
  486. dataDoc: json['dataDoc'] as String?,
  487. importoScadenza: _toDouble(json['importoScadenza']),
  488. saldo: _toDouble(json['saldo']),
  489. tipoPagamento: json['tipoPagamento'] as String?,
  490. flgSoppressa: json['flgSoppressa'] as int?,
  491. importoAbbuono: _toDouble(json['importoAbbuono']),
  492. note: json['note'] as String?,
  493. dataModifica: json['dataModifica'] as String?,
  494. stato: json['stato'] as String?,
  495. ),
  496. mode: InsertMode.insertOrReplace,
  497. );
  498. }
  499. }
  500. });
  501. });
  502. _scadenzeDao.removeDeleted();
  503. return data.length;
  504. } catch (ex) {
  505. print('Error downloading scadenze: $ex');
  506. return 0;
  507. }
  508. }
  509. Future<int> downloadStatistiche(
  510. int idAgente,
  511. String codAgente,
  512. String lastUpdate, {
  513. void Function(int current, int total)? onProgress,
  514. }) async {
  515. Map<int, Cliente> cacheCliente = {};
  516. try {
  517. final data = await _api.getList(
  518. '/rest/statistiche/updates/$codAgente/$lastUpdate',
  519. );
  520. final db = _statisticheDao.db;
  521. final total = data.length;
  522. int count = 0;
  523. await db.transaction(() async {
  524. await db.batch((batch) async {
  525. for (final json in data) {
  526. count++;
  527. onProgress?.call(count, total);
  528. final idAgente = json['idAgente'] as int?;
  529. // cerca il cliente nella cache usando idClienteRemoto
  530. final idClienteRemoto = json['idCliente'] as int?;
  531. Cliente? cliente = cacheCliente[idClienteRemoto];
  532. if (cliente == null) {
  533. cliente =
  534. await _clientiDao.getByRemoteId(idAgente!, idClienteRemoto!);
  535. if (cliente != null) {
  536. cacheCliente[idClienteRemoto] = cliente;
  537. }
  538. }
  539. if (cliente != null) {
  540. batch.insert(
  541. db.statisticheVendita,
  542. StatisticheVenditaData(
  543. id: json['id'] as int? ?? 0,
  544. idAgente: json['idAgente'] as int?,
  545. idCliente: cliente.idCliente,
  546. idArticolo: json['idArticolo'] as int?,
  547. codStatistiche: json['codStatistiche'] as String?,
  548. riga: json['riga'] as int?,
  549. numeroFattura: json['numeroFattura'] as String?,
  550. dataFattura: json['dataFattura'] as String?,
  551. qta: _toDouble(json['qta']),
  552. importo: _toDouble(json['importo']),
  553. tipoVendita: json['tipoVendita'] as String?,
  554. ),
  555. mode: InsertMode.insertOrReplace,
  556. );
  557. }
  558. }
  559. });
  560. });
  561. return data.length;
  562. } catch (_) {
  563. return 0;
  564. }
  565. }
  566. Future<void> downloadParametro(String nome) async {
  567. try {
  568. final resp = await _api.get('/rest/parametro/$nome');
  569. if (resp['status'] == 0 && resp['valore'] != null) {
  570. await _parametriDao.set(nome, resp['valore'].toString());
  571. }
  572. } catch (_) {}
  573. }
  574. double? _toDouble(dynamic value) {
  575. if (value == null) return null;
  576. if (value is double) return value;
  577. if (value is int) return value.toDouble();
  578. return double.tryParse(value.toString());
  579. }
  580. }