reference_sync_service.dart 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  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: (json['iva'] as Map<String, dynamic>?)?['idTabella']
  140. as int?,
  141. idClassifica1:
  142. (json['classifica1'] as Map<String, dynamic>?)?['idTabella']
  143. as int?,
  144. idClassifica2:
  145. (json['classifica2'] as Map<String, dynamic>?)?['idTabella']
  146. as int?,
  147. idClassifica3:
  148. (json['classifica3'] as Map<String, dynamic>?)?['idTabella']
  149. as int?,
  150. idClassifica4:
  151. (json['classifica4'] as Map<String, dynamic>?)?['idTabella']
  152. as int?,
  153. peso: _toDouble(json['peso']),
  154. giacenza: _toDouble(json['giacenza']),
  155. unitaMisura: json['unitaMisura'] as String?,
  156. attivo: json['attivo'] as int? ?? 1,
  157. pezziConfezione: _toDouble(json['pezziConfezione']),
  158. fileFoto: json['fileFoto'] as String?,
  159. schedaProdotto: json['schedaProdotto'] as String?,
  160. prezzoBase: json['prezzoBase']?.toString(),
  161. stato: json['stato'] as String?,
  162. dataModifica: json['dataModifica'] as String?,
  163. gruppo: json['gruppo'] as String?,
  164. categoria: json['categoria'] as String?,
  165. colliPerStrato: json['colliPerStrato']?.toString(),
  166. stratiPerPallet: json['stratiPerPallet']?.toString(),
  167. ),
  168. mode: InsertMode.insertOrReplace,
  169. );
  170. }
  171. });
  172. return data.length;
  173. } catch (_) {
  174. return 0;
  175. }
  176. }
  177. Future<int> downloadListini(String lastUpdate) async {
  178. try {
  179. final data = await _api.getList('/rest/listini/updates/$lastUpdate');
  180. final db = _listiniDao.db;
  181. await db.batch((batch) {
  182. for (final json in data) {
  183. batch.insert(
  184. db.listini,
  185. Listino(
  186. idListino: json['idListino'] as int? ?? 0,
  187. codListino: json['codListino'] as String?,
  188. descrizione: json['descrizione'] as String?,
  189. validoDa: json['validoDa'] as String?,
  190. validoA: json['validoA'] as String?,
  191. attivo: json['attivo'] as int? ?? 1,
  192. dataModifica: json['dataModifica'] as String?,
  193. ),
  194. mode: InsertMode.insertOrReplace,
  195. );
  196. }
  197. });
  198. return data.length;
  199. } catch (_) {
  200. return 0;
  201. }
  202. }
  203. Future<int> downloadListiniArticolo(String lastUpdate) async {
  204. try {
  205. final data = await _api.getList(
  206. '/rest/listinoArticoli/updates/$lastUpdate',
  207. );
  208. final db = _listiniDao.db;
  209. await db.batch((batch) {
  210. for (final json in data) {
  211. final articolo = json['articolo'] as Map<String, dynamic>?;
  212. final listino = json['listino'] as Map<String, dynamic>?;
  213. final sconto = json['sconto'] as Map<String, dynamic>?;
  214. batch.insert(
  215. db.listiniArticolo,
  216. ListinoArticolo(
  217. idListinoArticoli: json['idListinoArticoli'] as int? ?? 0,
  218. idListino:
  219. listino?['idListino'] as int? ?? json['idListino'] as int?,
  220. idArticolo:
  221. articolo?['idArticolo'] as int? ??
  222. json['idArticolo'] as int?,
  223. prezzo: _toDouble(json['prezzo']),
  224. idSconto:
  225. sconto?['idSconto'] as int? ?? json['idSconto'] as int?,
  226. validoDa: json['validoDa'] as String?,
  227. validoA: json['validoA'] as String?,
  228. attivo: json['attivo'] as int? ?? 1,
  229. ),
  230. mode: InsertMode.insertOrReplace,
  231. );
  232. }
  233. });
  234. return data.length;
  235. } catch (_) {
  236. return 0;
  237. }
  238. }
  239. Future<int> downloadListiniCliente(
  240. int idAgente,
  241. String codAgente,
  242. String lastUpdate,
  243. ) async {
  244. try {
  245. final data = await _api.getList(
  246. '/rest/listinoCliente/updates/$codAgente/$lastUpdate',
  247. );
  248. final db = _listiniDao.db;
  249. final cacheCliente = <int, int?>{};
  250. final items = <ListinoCliente>[];
  251. for (final json in data) {
  252. final articolo = json['articolo'] as Map<String, dynamic>?;
  253. final listino = json['listino'] as Map<String, dynamic>?;
  254. final sconto = json['sconto'] as Map<String, dynamic>?;
  255. final jsonIdCliente = json['idCliente'] as int?;
  256. int? localIdCliente;
  257. if (jsonIdCliente != null) {
  258. localIdCliente = cacheCliente[jsonIdCliente];
  259. if (localIdCliente == null) {
  260. final c =
  261. await _clientiDao.getByRemoteId(idAgente, jsonIdCliente);
  262. localIdCliente = c?.idCliente;
  263. cacheCliente[jsonIdCliente] = localIdCliente;
  264. }
  265. }
  266. items.add(
  267. ListinoCliente(
  268. idListinoCliente: json['idListinoCliente'] as int? ?? 0,
  269. idListino: listino?['idListino'] as int?,
  270. idCliente: localIdCliente,
  271. idArticolo:
  272. articolo?['idArticolo'] as int? ??
  273. json['idArticolo'] as int?,
  274. idSconto: sconto?['idSconto'] as int?,
  275. validoDa: json['validoDa'] as String?,
  276. validoA: json['validoA'] as String?,
  277. prezzo: _toDouble(json['prezzo']),
  278. attivo: json['attivo'] as int? ?? 1,
  279. annullato: json['annullato'] as String? ?? 'N',
  280. listinoSostitutivo: json['listinoSostitutivo'] as String?,
  281. stato: json['stato'] as String?,
  282. ),
  283. );
  284. }
  285. await db.batch((batch) {
  286. for (final item in items) {
  287. batch.insert(db.listiniCliente, item, mode: InsertMode.insertOrReplace);
  288. }
  289. });
  290. return data.length;
  291. } catch (_) {
  292. return 0;
  293. }
  294. }
  295. Future<int> downloadScontiCliente(
  296. int idAgente,
  297. String codAgente,
  298. String lastUpdate,
  299. ) async {
  300. try {
  301. final data = await _api.getList(
  302. '/rest/scontocliente/updates/$codAgente/$lastUpdate',
  303. );
  304. final db = _scontiDao.db;
  305. await db.batch((batch) {
  306. for (final json in data) {
  307. batch.insert(
  308. db.scontiCliente,
  309. ScontoCliente(
  310. idScontoCliente: json['idScontoCliente'] as int? ?? 0,
  311. idCliente: json['idCliente'] as int?,
  312. idArticolo: json['idArticolo'] as int?,
  313. linea: json['linea'] as String?,
  314. idSconto: json['idSconto'] as int?,
  315. validoDa: json['validoDa'] as String?,
  316. validoA: json['validoA'] as String?,
  317. stato: json['stato'] as String?,
  318. dataModifica: json['dataModifica'] as String?,
  319. ),
  320. mode: InsertMode.insertOrReplace,
  321. );
  322. }
  323. });
  324. return data.length;
  325. } catch (_) {
  326. return 0;
  327. }
  328. }
  329. Future<int> downloadPromozioni(String lastUpdate) async {
  330. try {
  331. final data = await _api.getList('/rest/promozioni/updates/$lastUpdate');
  332. final db = _promozioniDao.db;
  333. int count = 0;
  334. await db.transaction(() async {
  335. await db.delete(db.promoOmaggi).go();
  336. await db.delete(db.promoListini).go();
  337. await db.delete(db.promoArticoli).go();
  338. await db.delete(db.promozioni).go();
  339. for (final json in data) {
  340. final dto = SyncPromoDto.fromJson(json as Map<String, dynamic>);
  341. await db.into(db.promozioni).insert(
  342. Promozione(
  343. progressivo: dto.progressivo ?? 0,
  344. tipoPromozione: dto.tipoPromozione,
  345. descrizione: dto.descrizione,
  346. dataInizio: dto.dataInizio,
  347. dataFine: dto.dataFine,
  348. limiteQta: dto.limiteQta,
  349. quantitaOmaggio: dto.quantitaOmaggio,
  350. limiteImporto: dto.limiteImporto,
  351. stato: dto.stato,
  352. priorita: dto.priorita ?? 0,
  353. codice: dto.codice,
  354. idArticoloOmaggio: dto.articoloOmaggio?.idArticolo,
  355. idSconto: dto.sconto?.idSconto,
  356. idListino: dto.listinoOmaggio?.idListino,
  357. ),
  358. );
  359. for (final art in dto.promozioneArticoli) {
  360. await db.into(db.promoArticoli).insert(
  361. PromoArticolo(
  362. progressivo: dto.progressivo ?? 0,
  363. riga: art.promozioneArticoloKey?.riga ?? 0,
  364. quantitaOmaggio: art.promozioneArticoloKey?.riga?.toDouble(),
  365. idArticolo: art.articolo?.idArticolo,
  366. ),
  367. );
  368. }
  369. for (final l in dto.promozioneListini) {
  370. await db.into(db.promoListini).insert(
  371. PromoListino(
  372. progressivo: dto.progressivo ?? 0,
  373. idListino: l.promozioneListinoKey?.idListino ?? 0,
  374. ),
  375. );
  376. }
  377. for (final om in dto.promozioneOmaggio) {
  378. await db.into(db.promoOmaggi).insert(
  379. PromoOmaggio(
  380. progressivo: dto.progressivo ?? 0,
  381. riga: om.promozioneOmaggioKey?.riga ?? 0,
  382. idArticolo: om.articolo?.idArticolo,
  383. quantita: om.quantita,
  384. ),
  385. );
  386. }
  387. count++;
  388. }
  389. });
  390. return count;
  391. } catch (_) {
  392. return 0;
  393. }
  394. }
  395. Future<int> downloadScadenze(
  396. int idAgente,
  397. String codAgente,
  398. String lastUpdate,
  399. ) async {
  400. try {
  401. final data = await _api.getList(
  402. '/rest/scadenze/updates/$codAgente/$lastUpdate',
  403. );
  404. final db = _scadenzeDao.db;
  405. await db.transaction(() async {
  406. await db.delete(db.scadenze).go();
  407. await db.batch((batch) {
  408. for (final json in data) {
  409. batch.insert(
  410. db.scadenze,
  411. Scadenza(
  412. idScadenza: json['idScadenza'] as int? ?? 0,
  413. idCliente: json['idCliente'] as int?,
  414. idAgente: json['idAgente'] as int?,
  415. chiave: json['chiave'] as String?,
  416. numPartita: json['numPartita'] as String?,
  417. dataScadenza: json['dataScadenza'] as String?,
  418. segno: json['segno'] as String?,
  419. importoFattura: _toDouble(json['importoFattura']),
  420. valuta: json['valuta'] as String?,
  421. numDoc: json['numDoc'] as String?,
  422. serieDoc: json['serieDoc'] as String?,
  423. dataDoc: json['dataDoc'] as String?,
  424. importoScadenza: _toDouble(json['importoScadenza']),
  425. saldo: _toDouble(json['saldo']),
  426. tipoPagamento: json['tipoPagamento'] as String?,
  427. flgSoppressa: json['flgSoppressa'] as int?,
  428. importoAbbuono: _toDouble(json['importoAbbuono']),
  429. note: json['note'] as String?,
  430. dataModifica: json['dataModifica'] as String?,
  431. stato: json['stato'] as String?,
  432. ),
  433. );
  434. }
  435. });
  436. });
  437. return data.length;
  438. } catch (ex) {
  439. print('Error downloading scadenze: $ex');
  440. return 0;
  441. }
  442. }
  443. Future<int> downloadStatistiche(
  444. int idAgente,
  445. String codAgente,
  446. String lastUpdate,
  447. ) async {
  448. try {
  449. final data = await _api.getList(
  450. '/rest/statistiche/updates/$codAgente/$lastUpdate',
  451. );
  452. final db = _statisticheDao.db;
  453. await db.transaction(() async {
  454. await db.delete(db.statisticheVendita).go();
  455. await db.batch((batch) {
  456. for (final json in data) {
  457. batch.insert(
  458. db.statisticheVendita,
  459. StatisticheVenditaData(
  460. id: json['id'] as int? ?? 0,
  461. idAgente: json['idAgente'] as int?,
  462. idCliente: json['idCliente'] as int?,
  463. idArticolo: json['idArticolo'] as int?,
  464. codStatistiche: json['codStatistiche'] as String?,
  465. riga: json['riga'] as int?,
  466. numeroFattura: json['numeroFattura'] as String?,
  467. dataFattura: json['dataFattura'] as String?,
  468. qta: _toDouble(json['qta']),
  469. importo: _toDouble(json['importo']),
  470. tipoVendita: json['tipoVendita'] as String?,
  471. ),
  472. );
  473. }
  474. });
  475. });
  476. return data.length;
  477. } catch (_) {
  478. return 0;
  479. }
  480. }
  481. Future<void> downloadParametro(String nome) async {
  482. try {
  483. final resp = await _api.get('/rest/parametro/$nome');
  484. if (resp['status'] == 0 && resp['valore'] != null) {
  485. await _parametriDao.set(nome, resp['valore'].toString());
  486. }
  487. } catch (_) {}
  488. }
  489. double? _toDouble(dynamic value) {
  490. if (value == null) return null;
  491. if (value is double) return value;
  492. if (value is int) return value.toDouble();
  493. return double.tryParse(value.toString());
  494. }
  495. }