sync_provider.dart 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import 'package:flutter_riverpod/flutter_riverpod.dart';
  2. import 'package:ristoris/database/database.dart';
  3. import 'package:ristoris/database/tables/agenti.dart';
  4. import '../services/api_service.dart';
  5. import '../services/sync/agente_sync_service.dart';
  6. import '../services/sync/cliente_sync_service.dart';
  7. import '../services/sync/ordine_sync_service.dart';
  8. import '../services/sync/filiale_sync_service.dart';
  9. import '../services/sync/reference_sync_service.dart';
  10. import '../services/image_service.dart';
  11. import 'article_provider.dart';
  12. import 'auth_provider.dart';
  13. import 'customer_provider.dart';
  14. import 'dashboard_provider.dart';
  15. import 'database_provider.dart';
  16. import 'order_provider.dart';
  17. import '../ui/pages/payments/payments_page.dart';
  18. final apiServiceProvider = Provider<ApiService>((ref) {
  19. final parametriDao = ref.read(parametriDaoProvider);
  20. return ApiService(parametriDao);
  21. });
  22. final imageServiceProvider = Provider<ImageService>((ref) {
  23. final parametriDao = ref.read(parametriDaoProvider);
  24. return ImageService(parametriDao);
  25. });
  26. final agenteSyncServiceProvider = Provider<AgenteSyncService>((ref) {
  27. final agentiDao = ref.read(agentiDaoProvider);
  28. return AgenteSyncService(ref.read(apiServiceProvider), agentiDao);
  29. });
  30. final clienteSyncServiceProvider = Provider<ClienteSyncService>((ref) {
  31. final api = ref.read(apiServiceProvider);
  32. final clientiDao = ref.read(clientiDaoProvider);
  33. final clientiAgenteDao = ref.read(clientiAgenteDaoProvider);
  34. return ClienteSyncService(api, clientiDao, clientiAgenteDao);
  35. });
  36. final ordineSyncServiceProvider = Provider<OrdineSyncService>((ref) {
  37. return OrdineSyncService(
  38. ref.read(apiServiceProvider),
  39. ref.read(ordiniDaoProvider),
  40. ref.read(clientiDaoProvider),
  41. ref.read(filialiDaoProvider),
  42. ref.read(agentiDaoProvider),
  43. );
  44. });
  45. final filialeSyncServiceProvider = Provider<FilialeSyncService>((ref) {
  46. return FilialeSyncService(
  47. ref.read(apiServiceProvider),
  48. ref.read(filialiDaoProvider),
  49. ref.read(clientiDaoProvider),
  50. );
  51. });
  52. final referenceSyncServiceProvider = Provider<ReferenceSyncService>((ref) {
  53. return ReferenceSyncService(
  54. ref.read(apiServiceProvider),
  55. ref.read(tabelleDaoProvider),
  56. ref.read(pagamentiDaoProvider),
  57. ref.read(scontiDaoProvider),
  58. ref.read(articoliDaoProvider),
  59. ref.read(listiniDaoProvider),
  60. ref.read(promozioniDaoProvider),
  61. ref.read(scadenzeDaoProvider),
  62. ref.read(statisticheDaoProvider),
  63. ref.read(parametriDaoProvider),
  64. ref.read(clientiDaoProvider),
  65. );
  66. });
  67. class SyncState {
  68. final bool isSyncing;
  69. final double progress;
  70. final String message;
  71. final String? error;
  72. const SyncState({
  73. this.isSyncing = false,
  74. this.progress = 0,
  75. this.message = '',
  76. this.error,
  77. });
  78. }
  79. class SyncNotifier extends Notifier<SyncState> {
  80. @override
  81. SyncState build() => const SyncState();
  82. Future<void> startFullSync(
  83. int idAgente,
  84. String codAgente, {
  85. bool forceFullSync = false,
  86. }) async {
  87. state = const SyncState(
  88. isSyncing: true,
  89. message: 'Avvio sincronizzazione...',
  90. );
  91. try {
  92. final agentiDao = ref.read(agentiDaoProvider);
  93. final agente = await agentiDao.findByCode(codAgente);
  94. if (agente?.pwd != null) {
  95. final authService = ref.read(authServiceProvider);
  96. final token = await authService.loginRemote(codAgente, agente!.pwd!);
  97. ref.read(apiServiceProvider).token = token;
  98. }
  99. _update('Autenticazione riuscita', 0.02);
  100. final parametriDao = ref.read(parametriDaoProvider);
  101. final agenteSync = ref.read(agenteSyncServiceProvider);
  102. final ordineSync = ref.read(ordineSyncServiceProvider);
  103. final filialeSync = ref.read(filialeSyncServiceProvider);
  104. final clienteSync = ref.read(clienteSyncServiceProvider);
  105. final refSync = ref.read(referenceSyncServiceProvider);
  106. final lastUpdateStr = forceFullSync ? '200001010000' : (await parametriDao.read('lastUpdate') ?? '200001010000');
  107. await agenteSync.downloadAgenti(idAgente, codAgente, lastUpdateStr);
  108. await clienteSync.uploadNewCustomers(idAgente, codAgente);
  109. _update('Clienti inviati', 0.12);
  110. // cicla per tutti gli agenti a db
  111. List<Agente> agenti = await agentiDao.listAll();
  112. await filialeSync.uploadNewDestinations(idAgente, codAgente);
  113. _update('Destinazioni inviate', 0.18);
  114. await ordineSync.uploadNewOrders(idAgente, codAgente);
  115. _update('Ordini inviati', 0.22);
  116. await Future.wait([
  117. refSync.downloadTabelle(lastUpdateStr),
  118. refSync.downloadPagamenti(lastUpdateStr),
  119. refSync.downloadSconti(lastUpdateStr),
  120. refSync.downloadArticoli(lastUpdateStr),
  121. refSync.downloadListini(lastUpdateStr),
  122. refSync.downloadListiniArticolo(lastUpdateStr),
  123. refSync.downloadPromozioni(lastUpdateStr),
  124. refSync.downloadStatistiche(idAgente, codAgente, lastUpdateStr),
  125. ]);
  126. _update('Dati di riferimento scaricati', 0.60);
  127. for (int i = 0; i < agenti.length; i++) {
  128. final agente = agenti[i];
  129. _update('Aggiornamento per codice ${agente.codAgente} ', 0.16);
  130. await clienteSync.downloadCustomers(agente.idAgente, agente.codAgente!, lastUpdateStr);
  131. _update('(${agente.codAgente}) Clienti attivi scaricati', 0.16);
  132. await filialeSync.downloadDestinations(
  133. agente.idAgente,
  134. agente.codAgente!,
  135. lastUpdateStr,
  136. );
  137. _update('(${agente.codAgente}) Destinazioni scaricate', 0.20);
  138. await Future.wait([
  139. refSync.downloadScadenze(agente.idAgente, agente.codAgente!, lastUpdateStr),
  140. refSync.downloadListiniCliente(agente.idAgente, agente.codAgente!, lastUpdateStr),
  141. refSync.downloadScontiCliente(agente.idAgente, agente.codAgente!, lastUpdateStr),
  142. ordineSync.downloadRemoteOrders(agente.idAgente, agente.codAgente!, lastUpdateStr),
  143. ]);
  144. }
  145. _update('Dati per agente scaricati', 0.92);
  146. await refSync.downloadParametro('PALLET_PERC');
  147. _update('Parametri verificati', 0.98);
  148. final now = DateTime.now();
  149. final newLastUpdate = '${now.year}${_pad(now.month)}${_pad(now.day)}${_pad(now.hour)}${_pad(now.minute)}';
  150. await parametriDao.set('lastUpdate', newLastUpdate);
  151. state = const SyncState(
  152. message: 'Sincronizzazione completata!',
  153. progress: 1.0,
  154. );
  155. ref.invalidate(articleSearchProvider);
  156. ref.invalidate(activeArticleSearchProvider);
  157. ref.invalidate(priceCodesProvider);
  158. ref.invalidate(customerListProvider);
  159. ref.invalidate(customerSearchProvider);
  160. ref.invalidate(customerDestinationsProvider);
  161. ref.invalidate(customerPaymentsProvider);
  162. ref.invalidate(ordersViewProvider);
  163. ref.invalidate(ordersSearchViewProvider);
  164. ref.invalidate(orderStatsProvider);
  165. ref.invalidate(orderProvider);
  166. ref.invalidate(dashboardProvider);
  167. ref.invalidate(paymentsProvider);
  168. } catch (e) {
  169. state = SyncState(
  170. error: e.toString(),
  171. message: 'Errore durante la sincronizzazione',
  172. );
  173. }
  174. }
  175. String _pad(int n) => n.toString().padLeft(2, '0');
  176. void _update(String msg, double progress) {
  177. state = SyncState(isSyncing: true, message: msg, progress: progress);
  178. }
  179. }
  180. final syncProvider = NotifierProvider<SyncNotifier, SyncState>(
  181. SyncNotifier.new,
  182. );