sync_provider.dart 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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 'database_provider.dart';
  10. final apiServiceProvider = Provider<ApiService>((ref) {
  11. final parametriDao = ref.read(parametriDaoProvider);
  12. return ApiService(parametriDao);
  13. });
  14. final imageServiceProvider = Provider<ImageService>((ref) {
  15. final parametriDao = ref.read(parametriDaoProvider);
  16. return ImageService(parametriDao);
  17. });
  18. final agenteSyncServiceProvider = Provider<AgenteSyncService>((ref) {
  19. return AgenteSyncService(ref.read(apiServiceProvider));
  20. });
  21. final clienteSyncServiceProvider = Provider<ClienteSyncService>((ref) {
  22. final api = ref.read(apiServiceProvider);
  23. final clientiDao = ref.read(clientiDaoProvider);
  24. final clientiAgenteDao = ref.read(clientiAgenteDaoProvider);
  25. return ClienteSyncService(api, clientiDao, clientiAgenteDao);
  26. });
  27. final ordineSyncServiceProvider = Provider<OrdineSyncService>((ref) {
  28. return OrdineSyncService(
  29. ref.read(apiServiceProvider),
  30. ref.read(ordiniDaoProvider),
  31. ref.read(clientiDaoProvider),
  32. ref.read(filialiDaoProvider),
  33. );
  34. });
  35. final filialeSyncServiceProvider = Provider<FilialeSyncService>((ref) {
  36. return FilialeSyncService(
  37. ref.read(apiServiceProvider),
  38. ref.read(filialiDaoProvider),
  39. ref.read(clientiDaoProvider),
  40. );
  41. });
  42. final referenceSyncServiceProvider = Provider<ReferenceSyncService>((ref) {
  43. return ReferenceSyncService(
  44. ref.read(apiServiceProvider),
  45. ref.read(tabelleDaoProvider),
  46. ref.read(pagamentiDaoProvider),
  47. ref.read(scontiDaoProvider),
  48. ref.read(articoliDaoProvider),
  49. ref.read(listiniDaoProvider),
  50. ref.read(promozioniDaoProvider),
  51. ref.read(scadenzeDaoProvider),
  52. ref.read(statisticheDaoProvider),
  53. ref.read(parametriDaoProvider),
  54. ref.read(clientiDaoProvider),
  55. );
  56. });
  57. class SyncState {
  58. final bool isSyncing;
  59. final double progress;
  60. final String message;
  61. final String? error;
  62. const SyncState({
  63. this.isSyncing = false,
  64. this.progress = 0,
  65. this.message = '',
  66. this.error,
  67. });
  68. }
  69. class SyncNotifier extends Notifier<SyncState> {
  70. @override
  71. SyncState build() => const SyncState();
  72. Future<void> startFullSync(int idAgente, String codAgente, {bool forceFullSync = false}) async {
  73. state = const SyncState(isSyncing: true, message: 'Avvio sincronizzazione...');
  74. try {
  75. final parametriDao = ref.read(parametriDaoProvider);
  76. final ordineSync = ref.read(ordineSyncServiceProvider);
  77. final filialeSync = ref.read(filialeSyncServiceProvider);
  78. final clienteSync = ref.read(clienteSyncServiceProvider);
  79. final refSync = ref.read(referenceSyncServiceProvider);
  80. final lastUpdateStr = forceFullSync
  81. ? '200001010000'
  82. : (await parametriDao.read('lastUpdate') ?? '200001010000');
  83. await clienteSync.uploadNewCustomers(idAgente, codAgente);
  84. _update('Clienti inviati', 0.12);
  85. await clienteSync.downloadCustomers(idAgente, codAgente, lastUpdateStr);
  86. _update('Clienti attivi scaricati', 0.16);
  87. await filialeSync.uploadNewDestinations(idAgente, codAgente);
  88. _update('Destinazioni inviate', 0.18);
  89. await filialeSync.downloadDestinations(idAgente, codAgente, lastUpdateStr);
  90. _update('Destinazioni scaricate', 0.20);
  91. await ordineSync.uploadNewOrders(idAgente, codAgente);
  92. _update('Ordini inviati', 0.22);
  93. await Future.wait([
  94. refSync.downloadTabelle(lastUpdateStr),
  95. refSync.downloadPagamenti(lastUpdateStr),
  96. refSync.downloadSconti(lastUpdateStr),
  97. refSync.downloadArticoli(lastUpdateStr),
  98. refSync.downloadListini(lastUpdateStr),
  99. refSync.downloadListiniArticolo(lastUpdateStr),
  100. refSync.downloadPromozioni(lastUpdateStr),
  101. refSync.downloadStatistiche(idAgente, codAgente, lastUpdateStr),
  102. ]);
  103. _update('Dati di riferimento scaricati', 0.60);
  104. await Future.wait([
  105. refSync.downloadScadenze(idAgente, codAgente, lastUpdateStr),
  106. refSync.downloadListiniCliente(idAgente, codAgente, lastUpdateStr),
  107. refSync.downloadScontiCliente(idAgente, codAgente, lastUpdateStr),
  108. ordineSync.downloadRemoteOrders(idAgente, codAgente, lastUpdateStr),
  109. ]);
  110. _update('Dati per agente scaricati', 0.92);
  111. await refSync.downloadParametro('PALLET_PERC');
  112. _update('Parametri verificati', 0.98);
  113. final now = DateTime.now();
  114. final newLastUpdate =
  115. '${now.year}${_pad(now.month)}${_pad(now.day)}${_pad(now.hour)}${_pad(now.minute)}';
  116. await parametriDao.set('lastUpdate', newLastUpdate);
  117. state = const SyncState(message: 'Sincronizzazione completata!', progress: 1.0);
  118. } catch (e) {
  119. state = SyncState(error: e.toString(), message: 'Errore durante la sincronizzazione');
  120. }
  121. }
  122. String _pad(int n) => n.toString().padLeft(2, '0');
  123. void _update(String msg, double progress) {
  124. state = SyncState(isSyncing: true, message: msg, progress: progress);
  125. }
  126. }
  127. final syncProvider = NotifierProvider<SyncNotifier, SyncState>(SyncNotifier.new);