order_provider.dart 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import 'package:drift/drift.dart';
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import '../database/database.dart';
  4. import '../../business/order_manager.dart';
  5. import 'database_provider.dart';
  6. class OrderState {
  7. final Ordine? order;
  8. final List<RigaOrdine> lines;
  9. final bool isLoading;
  10. final String? error;
  11. const OrderState({this.order, this.lines = const [], this.isLoading = false, this.error});
  12. double get totale {
  13. return lines.fold(0.0, (sum, l) => sum + (l.totale ?? 0));
  14. }
  15. double get totQta {
  16. return lines.fold(0.0, (sum, l) => sum + (l.quantita ?? 0));
  17. }
  18. }
  19. class OrderNotifier extends Notifier<OrderState> {
  20. @override
  21. OrderState build() => const OrderState();
  22. OrderManager _buildManager() {
  23. return OrderManager(
  24. ref.read(ordiniDaoProvider),
  25. ref.read(clientiDaoProvider),
  26. ref.read(filialiDaoProvider),
  27. ref.read(articoliDaoProvider),
  28. ref.read(listiniDaoProvider),
  29. ref.read(scontiDaoProvider),
  30. ref.read(pagamentiDaoProvider),
  31. ref.read(agentiDaoProvider),
  32. );
  33. }
  34. Future<void> createOrder(int idAgente, {int? idCliente}) async {
  35. final mgr = _buildManager();
  36. mgr.idAgente = idAgente;
  37. final order = await mgr.createOrder(idCliente: idCliente);
  38. state = OrderState(order: order);
  39. }
  40. Future<void> loadOrder(int id) async {
  41. state = const OrderState(isLoading: true);
  42. final mgr = _buildManager();
  43. final order = await mgr.loadOrder(id);
  44. if (order != null) {
  45. final lines = await mgr.getOrderLines(id);
  46. state = OrderState(order: order, lines: lines);
  47. } else {
  48. state = const OrderState(error: 'Ordine non trovato');
  49. }
  50. }
  51. Future<void> addLine(RigaOrdine line) async {
  52. if (state.order == null) return;
  53. final dao = ref.read(ordiniDaoProvider);
  54. await dao.insertOrderLine(line.copyWith(idOrdine: Value<int?>(state.order!.idOrdine)));
  55. final lines = await dao.getOrderLines(state.order!.idOrdine);
  56. state = OrderState(order: state.order, lines: lines);
  57. }
  58. Future<void> editLine(RigaOrdine line) async {
  59. if (state.order == null) return;
  60. final dao = ref.read(ordiniDaoProvider);
  61. await dao.updateOrderLine(line);
  62. final lines = await dao.getOrderLines(state.order!.idOrdine);
  63. state = OrderState(order: state.order, lines: lines);
  64. }
  65. Future<void> removeLine(int idRigaOrdine) async {
  66. if (state.order == null) return;
  67. final dao = ref.read(ordiniDaoProvider);
  68. await dao.deleteOrderLine(idRigaOrdine);
  69. final lines = await dao.getOrderLines(state.order!.idOrdine);
  70. state = OrderState(order: state.order, lines: lines);
  71. }
  72. Future<void> saveOrder() async {
  73. if (state.order == null) return;
  74. final mgr = _buildManager();
  75. mgr.idAgente = state.order!.idAgente ?? 0;
  76. mgr.setCurrentOrder(state.order!);
  77. await mgr.saveOrder();
  78. final updated = mgr.currentOrder;
  79. state = OrderState(order: updated, lines: state.lines);
  80. }
  81. Future<void> deleteOrder() async {
  82. if (state.order == null) return;
  83. final dao = ref.read(ordiniDaoProvider);
  84. await dao.deleteOrder(state.order!.idOrdine);
  85. state = const OrderState();
  86. }
  87. void setIdFiliale(int? v) {
  88. if (state.order == null) return;
  89. state = OrderState(
  90. order: state.order!.copyWith(idFiliale: Value<int?>(v)),
  91. lines: state.lines,
  92. );
  93. }
  94. void setIdListino(int? v) {
  95. if (state.order == null) return;
  96. state = OrderState(
  97. order: state.order!.copyWith(idListino: Value<int?>(v)),
  98. lines: state.lines,
  99. );
  100. }
  101. void setIdPagamento(int? v) {
  102. if (state.order == null) return;
  103. state = OrderState(
  104. order: state.order!.copyWith(idPagamento: Value<int?>(v)),
  105. lines: state.lines,
  106. );
  107. }
  108. void setNoteCliente(String? v) {
  109. if (state.order == null) return;
  110. state = OrderState(
  111. order: state.order!.copyWith(noteCliente: Value<String?>(v)),
  112. lines: state.lines,
  113. );
  114. }
  115. void setNoteOrdine(String? v) {
  116. if (state.order == null) return;
  117. state = OrderState(
  118. order: state.order!.copyWith(noteOrdine: Value<String?>(v)),
  119. lines: state.lines,
  120. );
  121. }
  122. void setRiferimento(String? v) {
  123. if (state.order == null) return;
  124. state = OrderState(
  125. order: state.order!.copyWith(riferimento: Value<String?>(v)),
  126. lines: state.lines,
  127. );
  128. }
  129. }
  130. final orderProvider = NotifierProvider<OrderNotifier, OrderState>(OrderNotifier.new);
  131. final ordersViewProvider = FutureProvider.family<List<VOrdiniData>, int>((ref, idAgente) {
  132. return ref.read(ordiniDaoProvider).getOrdersView(idAgente);
  133. });
  134. final ordersSearchViewProvider = FutureProvider.family<List<VOrdiniData>, ({int idAgente, String filter})>(
  135. (ref, params) {
  136. return ref.read(ordiniDaoProvider).searchOrdersView(params.idAgente, params.filter);
  137. },
  138. );
  139. class OrderStats {
  140. final int daTrasmettere;
  141. final int numeroOrdini;
  142. final double volumeMensile;
  143. const OrderStats({
  144. this.daTrasmettere = 0,
  145. this.numeroOrdini = 0,
  146. this.volumeMensile = 0,
  147. });
  148. }
  149. final orderStatsProvider = FutureProvider.family<OrderStats, int>((ref, idAgente) async {
  150. final dao = ref.read(ordiniDaoProvider);
  151. final daTrasmettere = await dao.countNewOrdersForAgent(idAgente);
  152. final numeroOrdini = await dao.countOrdersForAgent(idAgente);
  153. final volumeMensile = await dao.getMonthlyVolume(idAgente);
  154. return OrderStats(
  155. daTrasmettere: daTrasmettere,
  156. numeroOrdini: numeroOrdini,
  157. volumeMensile: volumeMensile,
  158. );
  159. });