sync_provider.dart 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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. ref.read(agentiDaoProvider),
  40. );
  41. });
  42. final filialeSyncServiceProvider = Provider<FilialeSyncService>((ref) {
  43. return FilialeSyncService(
  44. ref.read(apiServiceProvider),
  45. ref.read(filialiDaoProvider),
  46. ref.read(clientiDaoProvider),
  47. );
  48. });
  49. final referenceSyncServiceProvider = Provider<ReferenceSyncService>((ref) {
  50. return ReferenceSyncService(
  51. ref.read(apiServiceProvider),
  52. ref.read(tabelleDaoProvider),
  53. ref.read(pagamentiDaoProvider),
  54. ref.read(scontiDaoProvider),
  55. ref.read(articoliDaoProvider),
  56. ref.read(listiniDaoProvider),
  57. ref.read(promozioniDaoProvider),
  58. ref.read(scadenzeDaoProvider),
  59. ref.read(statisticheDaoProvider),
  60. ref.read(parametriDaoProvider),
  61. ref.read(clientiDaoProvider),
  62. );
  63. });
  64. class SyncState {
  65. final bool isSyncing;
  66. final double progress;
  67. final String message;
  68. final String? error;
  69. const SyncState({
  70. this.isSyncing = false,
  71. this.progress = 0,
  72. this.message = '',
  73. this.error,
  74. });
  75. }
  76. class SyncNotifier extends Notifier<SyncState> {
  77. @override
  78. SyncState build() => const SyncState();
  79. Future<void> startFullSync(
  80. int idAgente,
  81. String codAgente, {
  82. bool forceFullSync = false,
  83. }) async {
  84. state = const SyncState(
  85. isSyncing: true,
  86. message: 'Avvio sincronizzazione...',
  87. );
  88. try {
  89. final agentiDao = ref.read(agentiDaoProvider);
  90. final agente = await agentiDao.findByCode(codAgente);
  91. if (agente?.pwd != null) {
  92. final authService = ref.read(authServiceProvider);
  93. final token = await authService.loginRemote(codAgente, agente!.pwd!);
  94. ref.read(apiServiceProvider).token = token;
  95. }
  96. _update('Token JWT acquisito', 0.02);
  97. final parametriDao = ref.read(parametriDaoProvider);
  98. final ordineSync = ref.read(ordineSyncServiceProvider);
  99. final filialeSync = ref.read(filialeSyncServiceProvider);
  100. final clienteSync = ref.read(clienteSyncServiceProvider);
  101. final refSync = ref.read(referenceSyncServiceProvider);
  102. final lastUpdateStr = forceFullSync
  103. ? '200001010000'
  104. : (await parametriDao.read('lastUpdate') ?? '200001010000');
  105. await clienteSync.uploadNewCustomers(idAgente, codAgente);
  106. _update('Clienti inviati', 0.12);
  107. await clienteSync.downloadCustomers(idAgente, codAgente, lastUpdateStr);
  108. _update('Clienti attivi scaricati', 0.16);
  109. await filialeSync.uploadNewDestinations(idAgente, codAgente);
  110. _update('Destinazioni inviate', 0.18);
  111. await filialeSync.downloadDestinations(
  112. idAgente,
  113. codAgente,
  114. lastUpdateStr,
  115. );
  116. _update('Destinazioni scaricate', 0.20);
  117. await ordineSync.uploadNewOrders(idAgente, codAgente);
  118. _update('Ordini inviati', 0.22);
  119. await Future.wait([
  120. refSync.downloadTabelle(lastUpdateStr),
  121. refSync.downloadPagamenti(lastUpdateStr),
  122. refSync.downloadSconti(lastUpdateStr),
  123. refSync.downloadArticoli(lastUpdateStr),
  124. refSync.downloadListini(lastUpdateStr),
  125. refSync.downloadListiniArticolo(lastUpdateStr),
  126. refSync.downloadPromozioni(lastUpdateStr),
  127. refSync.downloadStatistiche(idAgente, codAgente, lastUpdateStr),
  128. ]);
  129. _update('Dati di riferimento scaricati', 0.60);
  130. await Future.wait([
  131. refSync.downloadScadenze(idAgente, codAgente, lastUpdateStr),
  132. refSync.downloadListiniCliente(idAgente, codAgente, lastUpdateStr),
  133. refSync.downloadScontiCliente(idAgente, codAgente, lastUpdateStr),
  134. ordineSync.downloadRemoteOrders(idAgente, codAgente, lastUpdateStr),
  135. ]);
  136. _update('Dati per agente scaricati', 0.92);
  137. await refSync.downloadParametro('PALLET_PERC');
  138. _update('Parametri verificati', 0.98);
  139. final now = DateTime.now();
  140. final newLastUpdate =
  141. '${now.year}${_pad(now.month)}${_pad(now.day)}${_pad(now.hour)}${_pad(now.minute)}';
  142. await parametriDao.set('lastUpdate', newLastUpdate);
  143. state = const SyncState(
  144. message: 'Sincronizzazione completata!',
  145. progress: 1.0,
  146. );
  147. ref.invalidate(articleSearchProvider);
  148. ref.invalidate(activeArticleSearchProvider);
  149. ref.invalidate(priceCodesProvider);
  150. ref.invalidate(customerListProvider);
  151. ref.invalidate(customerSearchProvider);
  152. ref.invalidate(customerDestinationsProvider);
  153. ref.invalidate(customerPaymentsProvider);
  154. ref.invalidate(ordersViewProvider);
  155. ref.invalidate(ordersSearchViewProvider);
  156. ref.invalidate(orderStatsProvider);
  157. ref.invalidate(dashboardProvider);
  158. ref.invalidate(paymentsProvider);
  159. } catch (e) {
  160. state = SyncState(
  161. error: e.toString(),
  162. message: 'Errore durante la sincronizzazione',
  163. );
  164. }
  165. }
  166. String _pad(int n) => n.toString().padLeft(2, '0');
  167. void _update(String msg, double progress) {
  168. state = SyncState(isSyncing: true, message: msg, progress: progress);
  169. }
  170. }
  171. final syncProvider = NotifierProvider<SyncNotifier, SyncState>(
  172. SyncNotifier.new,
  173. );