order_provider.dart 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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 '../../business/pricing_service.dart';
  6. import 'database_provider.dart';
  7. class OrderState {
  8. final Ordine? order;
  9. final List<RigaOrdine> lines;
  10. final bool isLoading;
  11. final String? error;
  12. const OrderState({this.order, this.lines = const [], this.isLoading = false, this.error});
  13. double get totale {
  14. return lines.fold(0.0, (sum, l) => sum + (l.totale ?? 0));
  15. }
  16. double get totQta {
  17. return lines.fold(0.0, (sum, l) => sum + (l.quantita ?? 0));
  18. }
  19. }
  20. class OrderNotifier extends Notifier<OrderState> {
  21. @override
  22. OrderState build() => const OrderState();
  23. OrderManager _buildManager() {
  24. return OrderManager(
  25. ref.read(ordiniDaoProvider),
  26. ref.read(clientiDaoProvider),
  27. ref.read(filialiDaoProvider),
  28. ref.read(articoliDaoProvider),
  29. ref.read(listiniDaoProvider),
  30. ref.read(scontiDaoProvider),
  31. ref.read(pagamentiDaoProvider),
  32. ref.read(agentiDaoProvider),
  33. );
  34. }
  35. Future<void> createOrder(int idAgente, {int? idCliente}) async {
  36. final mgr = _buildManager();
  37. mgr.idAgente = idAgente;
  38. final order = await mgr.createOrder(idCliente: idCliente);
  39. state = OrderState(order: order);
  40. }
  41. Future<void> loadOrder(int id) async {
  42. state = const OrderState(isLoading: true);
  43. final mgr = _buildManager();
  44. final order = await mgr.loadOrder(id);
  45. if (order != null) {
  46. final lines = await mgr.getOrderLines(id);
  47. state = OrderState(order: order, lines: lines);
  48. } else {
  49. state = const OrderState(error: 'Ordine non trovato');
  50. }
  51. }
  52. Future<void> addLine(RigaOrdine line) async {
  53. if (state.order == null) return;
  54. final dao = ref.read(ordiniDaoProvider);
  55. await dao.insertOrderLine(line.copyWith(idOrdine: Value<int?>(state.order!.idOrdine)));
  56. final lines = await dao.getOrderLines(state.order!.idOrdine);
  57. state = OrderState(order: state.order, lines: lines);
  58. }
  59. Future<void> editLine(RigaOrdine line) async {
  60. if (state.order == null) return;
  61. final dao = ref.read(ordiniDaoProvider);
  62. await dao.updateOrderLine(line);
  63. final lines = await dao.getOrderLines(state.order!.idOrdine);
  64. state = OrderState(order: state.order, lines: lines);
  65. }
  66. Future<void> removeLine(int idRigaOrdine) async {
  67. if (state.order == null) return;
  68. final dao = ref.read(ordiniDaoProvider);
  69. await dao.deleteOrderLine(idRigaOrdine);
  70. final lines = await dao.getOrderLines(state.order!.idOrdine);
  71. state = OrderState(order: state.order, lines: lines);
  72. }
  73. Future<void> saveOrder() async {
  74. if (state.order == null) return;
  75. final mgr = _buildManager();
  76. mgr.idAgente = state.order!.idAgente ?? 0;
  77. mgr.setCurrentOrder(state.order!);
  78. await mgr.saveOrder();
  79. final updated = mgr.currentOrder;
  80. state = OrderState(order: updated, lines: state.lines);
  81. }
  82. Future<void> deleteOrder() async {
  83. if (state.order == null) return;
  84. final dao = ref.read(ordiniDaoProvider);
  85. await dao.deleteOrder(state.order!.idOrdine);
  86. state = const OrderState();
  87. }
  88. void setIdFiliale(int? v) {
  89. if (state.order == null) return;
  90. state = OrderState(
  91. order: state.order!.copyWith(idFiliale: Value<int?>(v)),
  92. lines: state.lines,
  93. );
  94. }
  95. void setIdListino(int? v) {
  96. if (state.order == null) return;
  97. state = OrderState(
  98. order: state.order!.copyWith(idListino: Value<int?>(v)),
  99. lines: state.lines,
  100. );
  101. }
  102. void setIdPagamento(int? v) {
  103. if (state.order == null) return;
  104. state = OrderState(
  105. order: state.order!.copyWith(idPagamento: Value<int?>(v)),
  106. lines: state.lines,
  107. );
  108. }
  109. void setNoteCliente(String? v) {
  110. if (state.order == null) return;
  111. state = OrderState(
  112. order: state.order!.copyWith(noteCliente: Value<String?>(v)),
  113. lines: state.lines,
  114. );
  115. }
  116. void setNoteOrdine(String? v) {
  117. if (state.order == null) return;
  118. state = OrderState(
  119. order: state.order!.copyWith(noteOrdine: Value<String?>(v)),
  120. lines: state.lines,
  121. );
  122. }
  123. void setRiferimento(String? v) {
  124. if (state.order == null) return;
  125. state = OrderState(
  126. order: state.order!.copyWith(riferimento: Value<String?>(v)),
  127. lines: state.lines,
  128. );
  129. }
  130. }
  131. final orderProvider = NotifierProvider<OrderNotifier, OrderState>(OrderNotifier.new);