reference_sync_service.dart 19 KB

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