| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542 |
- import 'package:drift/drift.dart';
- import '../api_service.dart';
- import '../../database/daos/articoli_dao.dart';
- import '../../database/daos/clienti_dao.dart';
- import '../../database/daos/listini_dao.dart';
- import '../../database/daos/tabelle_dao.dart';
- import '../../database/daos/pagamenti_dao.dart';
- import '../../database/daos/sconti_dao.dart';
- import '../../database/daos/promozioni_dao.dart';
- import '../../database/daos/scadenze_dao.dart';
- import '../../database/daos/statistiche_dao.dart';
- import '../../database/daos/parametri_dao.dart';
- import '../../database/database.dart';
- import '../../dto/sync_promo_dto.dart';
- class ReferenceSyncService {
- final ApiService _api;
- final TabelleDao _tabelleDao;
- final PagamentiDao _pagamentiDao;
- final ScontiDao _scontiDao;
- final ArticoliDao _articoliDao;
- final ListiniDao _listiniDao;
- final PromozioniDao _promozioniDao;
- final ScadenzeDao _scadenzeDao;
- final StatisticheDao _statisticheDao;
- final ParametriDao _parametriDao;
- final ClientiDao _clientiDao;
- ReferenceSyncService(
- this._api,
- this._tabelleDao,
- this._pagamentiDao,
- this._scontiDao,
- this._articoliDao,
- this._listiniDao,
- this._promozioniDao,
- this._scadenzeDao,
- this._statisticheDao,
- this._parametriDao,
- this._clientiDao,
- );
- Future<int> downloadTabelle(String lastUpdate) async {
- try {
- final data = await _api.getList('/rest/tabelle/updates/$lastUpdate');
- final db = _tabelleDao.db;
- await db.batch((batch) {
- for (final json in data) {
- batch.insert(
- db.tabelle,
- Tabella(
- idTabella: json['idTabella'] as int? ?? 0,
- tipoTabella: json['tipoTabella'] as String? ?? '',
- codTabella: json['codTabella'] as String?,
- descrizione: json['descrizione'] as String?,
- stringa1: json['stringa1'] as String?,
- stringa2: json['stringa2'] as String?,
- stringa3: json['stringa3'] as String?,
- stringa4: json['stringa4'] as String?,
- stringa5: json['stringa5'] as String?,
- valore1: _toDouble(json['valore1']),
- valore2: _toDouble(json['valore2']),
- valore3: _toDouble(json['valore3']),
- valore4: _toDouble(json['valore4']),
- valore5: _toDouble(json['valore5']),
- dataModifica: json['dataModifica'] as String?,
- ),
- mode: InsertMode.insertOrReplace,
- );
- }
- });
- return data.length;
- } catch (_) {
- return 0;
- }
- }
- Future<int> downloadPagamenti(String lastUpdate) async {
- try {
- final data = await _api.getList('/rest/pagamenti/updates/$lastUpdate');
- final db = _pagamentiDao.db;
- await db.batch((batch) {
- for (final json in data) {
- batch.insert(
- db.pagamenti,
- Pagamento(
- idPagamento: json['idPagamento'] as int? ?? 0,
- codPagamento: json['codPagamento'] as String?,
- descrizione: json['descrizione'] as String?,
- dataModifica: json['dataModifica'] as String?,
- attivo: json['attivo'] as int?,
- ),
- mode: InsertMode.insertOrReplace,
- );
- }
- });
- return data.length;
- } catch (_) {
- return 0;
- }
- }
- Future<int> downloadSconti(String lastUpdate) async {
- try {
- final data = await _api.getList('/rest/sconti/updates/$lastUpdate');
- final db = _scontiDao.db;
- await db.batch((batch) {
- for (final json in data) {
- batch.insert(
- db.sconti,
- Sconto(
- idSconto: json['idSconto'] as int? ?? 0,
- codSconto: json['codSconto'] as String?,
- descrizione: json['descrizione'] as String?,
- sconto1: _toDouble(json['sconto1']),
- sconto2: _toDouble(json['sconto2']),
- sconto3: _toDouble(json['sconto3']),
- sconto4: _toDouble(json['sconto4']),
- sconto5: _toDouble(json['sconto5']),
- ),
- mode: InsertMode.insertOrReplace,
- );
- }
- });
- return data.length;
- } catch (_) {
- return 0;
- }
- }
- Future<int> downloadArticoli(String lastUpdate) async {
- try {
- final data = await _api.getList('/rest/articoli/updates/$lastUpdate');
- final db = _articoliDao.db;
- await db.batch((batch) {
- for (final json in data) {
- batch.insert(
- db.articoli,
- Articolo(
- idArticolo: json['idArticolo'] as int? ?? 0,
- posizione: json['posizione'] as int?,
- codArticolo: json['codArticolo'] as String? ?? '',
- descrizione: json['descrizione'] as String?,
- ean: json['ean'] as String?,
- idIva:
- (json['iva'] as Map<String, dynamic>?)?['idTabella'] as int?,
- idClassifica1: (json['classifica1']
- as Map<String, dynamic>?)?['idTabella'] as int?,
- idClassifica2: (json['classifica2']
- as Map<String, dynamic>?)?['idTabella'] as int?,
- idClassifica3: (json['classifica3']
- as Map<String, dynamic>?)?['idTabella'] as int?,
- idClassifica4: (json['classifica4']
- as Map<String, dynamic>?)?['idTabella'] as int?,
- peso: _toDouble(json['peso']),
- giacenza: _toDouble(json['giacenza']),
- unitaMisura: json['unitaMisura'] as String?,
- attivo: json['attivo'] as int? ?? 1,
- pezziConfezione: _toDouble(json['pezziConfezione']),
- fileFoto: json['fileFoto'] as String?,
- schedaProdotto: json['schedaProdotto'] as String?,
- prezzoBase: json['prezzoBase']?.toString(),
- stato: json['stato'] as String?,
- dataModifica: json['dataModifica'] as String?,
- gruppo: json['gruppo'] as String?,
- categoria: json['categoria'] as String?,
- colliPerStrato: json['colliPerStrato']?.toString(),
- stratiPerPallet: json['stratiPerPallet']?.toString(),
- ),
- mode: InsertMode.insertOrReplace,
- );
- }
- });
- return data.length;
- } catch (_) {
- return 0;
- }
- }
- Future<int> downloadListini(String lastUpdate) async {
- try {
- final data = await _api.getList('/rest/listini/updates/$lastUpdate');
- final db = _listiniDao.db;
- await db.batch((batch) {
- for (final json in data) {
- batch.insert(
- db.listini,
- Listino(
- idListino: json['idListino'] as int? ?? 0,
- codListino: json['codListino'] as String?,
- descrizione: json['descrizione'] as String?,
- validoDa: json['validoDa'] as String?,
- validoA: json['validoA'] as String?,
- attivo: json['attivo'] as int? ?? 1,
- dataModifica: json['dataModifica'] as String?,
- listinoAgente: json['listinoAgente'] as int?,
- ),
- mode: InsertMode.insertOrReplace,
- );
- }
- });
- return data.length;
- } catch (_) {
- return 0;
- }
- }
- Future<int> downloadListiniArticolo(String lastUpdate) async {
- try {
- final data = await _api.getList(
- '/rest/listinoArticoli/updates/$lastUpdate',
- );
- final db = _listiniDao.db;
- await db.batch((batch) {
- for (final json in data) {
- final articolo = json['articolo'] as Map<String, dynamic>?;
- final listino = json['listino'] as Map<String, dynamic>?;
- final sconto = json['sconto'] as Map<String, dynamic>?;
- batch.insert(
- db.listiniArticolo,
- ListinoArticolo(
- idListinoArticoli: json['idListinoArticoli'] as int? ?? 0,
- idListino:
- listino?['idListino'] as int? ?? json['idListino'] as int?,
- idArticolo:
- articolo?['idArticolo'] as int? ?? json['idArticolo'] as int?,
- prezzo: _toDouble(json['prezzo']),
- idSconto: sconto?['idSconto'] as int? ?? json['idSconto'] as int?,
- validoDa: json['validoDa'] as String?,
- validoA: json['validoA'] as String?,
- attivo: json['attivo'] as int? ?? 1,
- ),
- mode: InsertMode.insertOrReplace,
- );
- }
- });
- return data.length;
- } catch (_) {
- return 0;
- }
- }
- Future<int> downloadListiniCliente(
- int idAgente,
- String codAgente,
- String lastUpdate,
- ) async {
- try {
- final data = await _api.getList(
- '/rest/listinoCliente/updates/$codAgente/$lastUpdate',
- );
- final db = _listiniDao.db;
- final cacheCliente = <int, int?>{};
- final items = <ListinoCliente>[];
- for (final json in data) {
- final articolo = json['articolo'] as Map<String, dynamic>?;
- final listino = json['listino'] as Map<String, dynamic>?;
- final sconto = json['sconto'] as Map<String, dynamic>?;
- final jsonIdCliente = json['idCliente'] as int?;
- int? localIdCliente;
- if (jsonIdCliente != null) {
- localIdCliente = cacheCliente[jsonIdCliente];
- if (localIdCliente == null) {
- final c = await _clientiDao.getByRemoteId(idAgente, jsonIdCliente);
- localIdCliente = c?.idCliente;
- cacheCliente[jsonIdCliente] = localIdCliente;
- }
- }
- items.add(
- ListinoCliente(
- idListinoCliente: json['idListinoCliente'] as int? ?? 0,
- idListino: listino?['idListino'] as int?,
- idCliente: localIdCliente,
- idArticolo:
- articolo?['idArticolo'] as int? ?? json['idArticolo'] as int?,
- idSconto: sconto?['idSconto'] as int?,
- validoDa: json['validoDa'] as String?,
- validoA: json['validoA'] as String?,
- prezzo: _toDouble(json['prezzo']),
- attivo: json['attivo'] as int? ?? 1,
- annullato: json['annullato'] as String? ?? 'N',
- listinoSostitutivo: json['listinoSostitutivo'] as String?,
- stato: json['stato'] as String?,
- ),
- );
- }
- await db.batch((batch) {
- for (final item in items) {
- batch.insert(db.listiniCliente, item,
- mode: InsertMode.insertOrReplace);
- }
- });
- return data.length;
- } catch (_) {
- return 0;
- }
- }
- Future<int> downloadScontiCliente(
- int idAgente,
- String codAgente,
- String lastUpdate,
- ) async {
- try {
- final data = await _api.getList(
- '/rest/scontocliente/updates/$codAgente/$lastUpdate',
- );
- final db = _scontiDao.db;
- await db.batch((batch) {
- for (final json in data) {
- batch.insert(
- db.scontiCliente,
- ScontoCliente(
- idScontoCliente: json['idScontoCliente'] as int? ?? 0,
- idCliente: json['idCliente'] as int?,
- idArticolo: json['idArticolo'] as int?,
- linea: json['linea'] as String?,
- idSconto: json['idSconto'] as int?,
- validoDa: json['validoDa'] as String?,
- validoA: json['validoA'] as String?,
- stato: json['stato'] as String?,
- dataModifica: json['dataModifica'] as String?,
- ),
- mode: InsertMode.insertOrReplace,
- );
- }
- });
- return data.length;
- } catch (_) {
- return 0;
- }
- }
- Future<int> downloadPromozioni(String lastUpdate) async {
- try {
- final data = await _api.getList('/rest/promozioni/updates/$lastUpdate');
- final db = _promozioniDao.db;
- int count = 0;
- await db.transaction(() async {
- await db.delete(db.promoOmaggi).go();
- await db.delete(db.promoListini).go();
- await db.delete(db.promoArticoli).go();
- await db.delete(db.promozioni).go();
- for (final json in data) {
- final dto = SyncPromoDto.fromJson(json as Map<String, dynamic>);
- await db.into(db.promozioni).insert(
- Promozione(
- progressivo: dto.progressivo ?? 0,
- tipoPromozione: dto.tipoPromozione,
- descrizione: dto.descrizione,
- dataInizio: dto.dataInizio,
- dataFine: dto.dataFine,
- limiteQta: dto.limiteQta,
- quantitaOmaggio: dto.quantitaOmaggio,
- limiteImporto: dto.limiteImporto,
- stato: dto.stato,
- priorita: dto.priorita ?? 0,
- codice: dto.codice,
- idArticoloOmaggio: dto.articoloOmaggio?.idArticolo,
- idSconto: dto.sconto?.idSconto,
- idListino: dto.listinoOmaggio?.idListino,
- ),
- );
- for (final art in dto.promozioneArticoli) {
- await db.into(db.promoArticoli).insert(
- PromoArticolo(
- progressivo: dto.progressivo ?? 0,
- riga: art.promozioneArticoloKey?.riga ?? 0,
- quantitaOmaggio:
- art.promozioneArticoloKey?.riga?.toDouble(),
- idArticolo: art.articolo?.idArticolo,
- ),
- );
- }
- for (final l in dto.promozioneListini) {
- await db.into(db.promoListini).insert(
- PromoListino(
- progressivo: dto.progressivo ?? 0,
- idListino: l.promozioneListinoKey?.idListino ?? 0,
- ),
- );
- }
- for (final om in dto.promozioneOmaggio) {
- await db.into(db.promoOmaggi).insert(
- PromoOmaggio(
- progressivo: dto.progressivo ?? 0,
- riga: om.promozioneOmaggioKey?.riga ?? 0,
- idArticolo: om.articolo?.idArticolo,
- quantita: om.quantita,
- ),
- );
- }
- count++;
- }
- });
- return count;
- } catch (_) {
- return 0;
- }
- }
- Future<int> downloadScadenze(
- int idAgente,
- String codAgente,
- String lastUpdate,
- ) async {
- Map<int, Cliente> cacheCliente = {};
- try {
- final data = await _api.getList(
- '/rest/scadenze/updates/$codAgente/$lastUpdate',
- );
- final db = _scadenzeDao.db;
- await db.transaction(() async {
- //await _scadenzeDao.markAllAsDeleted(idAgente);
- await db.batch((batch) async {
- for (final json in data) {
- // cerca il cliente nella cache usando idClienteRemoto
- final idClienteRemoto = json['idCliente'] as int?;
- Cliente? cliente = cacheCliente[idClienteRemoto];
- if (cliente == null) {
- cliente =
- await _clientiDao.getByRemoteId(idAgente, idClienteRemoto!);
- if (cliente != null) {
- cacheCliente[idClienteRemoto] = cliente;
- }
- }
- if (cliente != null) {
- batch.insert(
- db.scadenze,
- Scadenza(
- idScadenza: json['idScadenza'] as int? ?? 0,
- idCliente: cliente.idCliente,
- idAgente: idAgente,
- chiave: json['chiave'] as String?,
- numPartita: json['numPartita'] as String?,
- dataScadenza: json['dataScadenza'] as String?,
- segno: json['segno'] as String?,
- importoFattura: _toDouble(json['importoFattura']),
- valuta: json['valuta'] as String?,
- numDoc: json['numDoc'] as String?,
- serieDoc: json['serieDoc'] as String?,
- dataDoc: json['dataDoc'] as String?,
- importoScadenza: _toDouble(json['importoScadenza']),
- saldo: _toDouble(json['saldo']),
- tipoPagamento: json['tipoPagamento'] as String?,
- flgSoppressa: json['flgSoppressa'] as int?,
- importoAbbuono: _toDouble(json['importoAbbuono']),
- note: json['note'] as String?,
- dataModifica: json['dataModifica'] as String?,
- stato: json['stato'] as String?,
- ),
- mode: InsertMode.insertOrReplace,
- );
- }
- }
- });
- });
- _scadenzeDao.removeDeleted();
- return data.length;
- } catch (ex) {
- print('Error downloading scadenze: $ex');
- return 0;
- }
- }
- Future<int> downloadStatistiche(
- int idAgente,
- String codAgente,
- String lastUpdate,
- ) async {
- Map<int, Cliente> cacheCliente = {};
- try {
- final data = await _api.getList(
- '/rest/statistiche/updates/$codAgente/$lastUpdate',
- );
- final db = _statisticheDao.db;
- await db.transaction(() async {
- await db.batch((batch) async {
- for (final json in data) {
- final idAgente = json['idAgente'] as int?;
- // cerca il cliente nella cache usando idClienteRemoto
- final idClienteRemoto = json['idCliente'] as int?;
- Cliente? cliente = cacheCliente[idClienteRemoto];
- if (cliente == null) {
- cliente =
- await _clientiDao.getByRemoteId(idAgente!, idClienteRemoto!);
- if (cliente != null) {
- cacheCliente[idClienteRemoto] = cliente;
- }
- }
- if (cliente != null) {
- batch.insert(
- db.statisticheVendita,
- StatisticheVenditaData(
- id: json['id'] as int? ?? 0,
- idAgente: json['idAgente'] as int?,
- idCliente: cliente.idCliente,
- idArticolo: json['idArticolo'] as int?,
- codStatistiche: json['codStatistiche'] as String?,
- riga: json['riga'] as int?,
- numeroFattura: json['numeroFattura'] as String?,
- dataFattura: json['dataFattura'] as String?,
- qta: _toDouble(json['qta']),
- importo: _toDouble(json['importo']),
- tipoVendita: json['tipoVendita'] as String?,
- ),
- mode: InsertMode.insertOrReplace,
- );
- }
- }
- });
- });
- return data.length;
- } catch (_) {
- return 0;
- }
- }
- Future<void> downloadParametro(String nome) async {
- try {
- final resp = await _api.get('/rest/parametro/$nome');
- if (resp['status'] == 0 && resp['valore'] != null) {
- await _parametriDao.set(nome, resp['valore'].toString());
- }
- } catch (_) {}
- }
- double? _toDouble(dynamic value) {
- if (value == null) return null;
- if (value is double) return value;
- if (value is int) return value.toDouble();
- return double.tryParse(value.toString());
- }
- }
|