order_provider.dart 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  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. void setIdCliente(int idCliente) {
  52. if (state.order == null) return;
  53. state = OrderState(
  54. order: state.order!.copyWith(idCliente: Value<int?>(idCliente)),
  55. lines: state.lines,
  56. );
  57. }
  58. Future<void> addLine(RigaOrdine line) async {
  59. if (state.order == null) return;
  60. final dao = ref.read(ordiniDaoProvider);
  61. await dao.insertOrderLine(line.copyWith(idOrdine: Value<int?>(state.order!.idOrdine)));
  62. final lines = await dao.getOrderLines(state.order!.idOrdine);
  63. state = OrderState(order: state.order, lines: lines);
  64. }
  65. Future<void> editLine(RigaOrdine line) async {
  66. if (state.order == null) return;
  67. final dao = ref.read(ordiniDaoProvider);
  68. await dao.updateOrderLine(line);
  69. final lines = await dao.getOrderLines(state.order!.idOrdine);
  70. state = OrderState(order: state.order, lines: lines);
  71. }
  72. Future<void> removeLine(int idRigaOrdine) async {
  73. if (state.order == null) return;
  74. final dao = ref.read(ordiniDaoProvider);
  75. await dao.deleteOrderLine(idRigaOrdine);
  76. final lines = await dao.getOrderLines(state.order!.idOrdine);
  77. state = OrderState(order: state.order, lines: lines);
  78. }
  79. Future<void> saveOrder() async {
  80. if (state.order == null) return;
  81. final mgr = _buildManager();
  82. mgr.idAgente = state.order!.idAgente ?? 0;
  83. mgr.setCurrentOrder(state.order!);
  84. await mgr.saveOrder();
  85. final updated = mgr.currentOrder;
  86. state = OrderState(order: updated, lines: state.lines);
  87. }
  88. Future<void> deleteOrder() async {
  89. if (state.order == null) return;
  90. final dao = ref.read(ordiniDaoProvider);
  91. await dao.deleteOrder(state.order!.idOrdine);
  92. state = const OrderState();
  93. }
  94. void setIdFiliale(int? v) {
  95. if (state.order == null) return;
  96. state = OrderState(
  97. order: state.order!.copyWith(idFiliale: Value<int?>(v)),
  98. lines: state.lines,
  99. );
  100. }
  101. void setIdListino(int? v) {
  102. if (state.order == null) return;
  103. state = OrderState(
  104. order: state.order!.copyWith(idListino: Value<int?>(v)),
  105. lines: state.lines,
  106. );
  107. }
  108. void setIdPagamento(int? v) {
  109. if (state.order == null) return;
  110. state = OrderState(
  111. order: state.order!.copyWith(idPagamento: Value<int?>(v)),
  112. lines: state.lines,
  113. );
  114. }
  115. void setNoteCliente(String? v) {
  116. if (state.order == null) return;
  117. state = OrderState(
  118. order: state.order!.copyWith(noteCliente: Value<String?>(v)),
  119. lines: state.lines,
  120. );
  121. }
  122. void setNoteOrdine(String? v) {
  123. if (state.order == null) return;
  124. state = OrderState(
  125. order: state.order!.copyWith(noteOrdine: Value<String?>(v)),
  126. lines: state.lines,
  127. );
  128. }
  129. void setRiferimento(String? v) {
  130. if (state.order == null) return;
  131. state = OrderState(
  132. order: state.order!.copyWith(riferimento: Value<String?>(v)),
  133. lines: state.lines,
  134. );
  135. }
  136. }
  137. final orderProvider = NotifierProvider<OrderNotifier, OrderState>(OrderNotifier.new);
  138. final ordersViewProvider = FutureProvider.family<List<VOrdiniData>, int>((ref, idAgente) {
  139. return ref.read(ordiniDaoProvider).getOrdersView(idAgente);
  140. });
  141. final ordersSearchViewProvider = FutureProvider.family<List<VOrdiniData>, ({int idAgente, String filter})>(
  142. (ref, params) {
  143. return ref.read(ordiniDaoProvider).searchOrdersView(params.idAgente, params.filter);
  144. },
  145. );
  146. class OrderStats {
  147. final int daTrasmettere;
  148. final int numeroOrdini;
  149. final double volumeMensile;
  150. const OrderStats({
  151. this.daTrasmettere = 0,
  152. this.numeroOrdini = 0,
  153. this.volumeMensile = 0,
  154. });
  155. }
  156. final orderStatsProvider = FutureProvider.family<OrderStats, int>((ref, idAgente) async {
  157. final dao = ref.read(ordiniDaoProvider);
  158. final daTrasmettere = await dao.countNewOrdersForAgent(idAgente);
  159. final numeroOrdini = await dao.countOrdersForAgent(idAgente);
  160. final volumeMensile = await dao.getMonthlyVolume(idAgente);
  161. return OrderStats(
  162. daTrasmettere: daTrasmettere,
  163. numeroOrdini: numeroOrdini,
  164. volumeMensile: volumeMensile,
  165. );
  166. });