sync_provider.dart 6.4 KB

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