order_manager.dart 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import 'package:drift/drift.dart';
  2. import '../database/daos/ordini_dao.dart';
  3. import '../database/daos/clienti_dao.dart';
  4. import '../database/daos/filiali_dao.dart';
  5. import '../database/daos/articoli_dao.dart';
  6. import '../database/daos/listini_dao.dart';
  7. import '../database/daos/sconti_dao.dart';
  8. import '../database/daos/pagamenti_dao.dart';
  9. import '../database/daos/agenti_dao.dart';
  10. import '../database/database.dart';
  11. class OrderManager {
  12. final OrdiniDao _ordiniDao;
  13. final ClientiDao _clientiDao;
  14. final FilialiDao _filialiDao;
  15. final ArticoliDao _articoliDao;
  16. final ListiniDao _listiniDao;
  17. final ScontiDao _scontiDao;
  18. final PagamentiDao _pagamentiDao;
  19. final AgentiDao _agentiDao;
  20. Ordine? _currentOrder;
  21. int _idAgente = 0;
  22. bool _isChanged = false;
  23. OrderManager(
  24. this._ordiniDao,
  25. this._clientiDao,
  26. this._filialiDao,
  27. this._articoliDao,
  28. this._listiniDao,
  29. this._scontiDao,
  30. this._pagamentiDao,
  31. this._agentiDao,
  32. );
  33. Ordine? get currentOrder => _currentOrder;
  34. bool get isChanged => _isChanged;
  35. set idAgente(int v) => _idAgente = v;
  36. void setCurrentOrder(Ordine order) {
  37. _currentOrder = order;
  38. }
  39. Future<Ordine> createOrder({int? idCliente}) async {
  40. final num = await _ordiniDao.generaNumeroOrdine(_idAgente);
  41. _currentOrder = Ordine(
  42. idOrdine: 0,
  43. numeroOrdine: num,
  44. idAgente: _idAgente,
  45. stato: 'N',
  46. dataOrdine: DateTime.now().toIso8601String(),
  47. idCliente: idCliente,
  48. );
  49. _isChanged = true;
  50. return _currentOrder!;
  51. }
  52. Future<Ordine?> loadOrder(int id) async {
  53. _currentOrder = await _ordiniDao.getById(id);
  54. _isChanged = false;
  55. return _currentOrder;
  56. }
  57. void setCustomer(Cliente customer) {
  58. if (_currentOrder == null) return;
  59. _currentOrder = _currentOrder!.copyWith(
  60. idCliente: Value<int?>(customer.idCliente),
  61. idPagamento: Value<int?>(customer.idPagamento),
  62. noteCliente: Value<String?>(customer.noteOrdine),
  63. );
  64. _isChanged = true;
  65. }
  66. void setDestination(Filiale? filiale) {
  67. if (_currentOrder == null) return;
  68. _currentOrder = _currentOrder!.copyWith(
  69. idFiliale: Value<int?>(filiale?.idFiliale),
  70. );
  71. _isChanged = true;
  72. }
  73. void setHeaderFields({
  74. int? idFiliale,
  75. int? idListino,
  76. int? idPagamento,
  77. String? noteCliente,
  78. String? noteOrdine,
  79. String? riferimento,
  80. }) {
  81. if (_currentOrder == null) return;
  82. _currentOrder = _currentOrder!.copyWith(
  83. idFiliale: Value<int?>(idFiliale),
  84. idListino: Value<int?>(idListino),
  85. idPagamento: Value<int?>(idPagamento),
  86. noteCliente: Value<String?>(noteCliente),
  87. noteOrdine: Value<String?>(noteOrdine),
  88. riferimento: Value<String?>(riferimento),
  89. );
  90. _isChanged = true;
  91. }
  92. Future<String?> calcPriceForItem(int idArticolo) async {
  93. final idListino = _currentOrder?.idListino;
  94. if (idListino == null) return null;
  95. final lp = await _articoliDao.getListPrice(idListino, idArticolo, '');
  96. if (lp != null) return lp.prezzo?.toStringAsFixed(2);
  97. return null;
  98. }
  99. static double calcPrezzoNetto(
  100. double lordo, double s1, double s2, double s3, double s4, double s5) {
  101. double netto = lordo;
  102. netto *= (100 - s1) / 100;
  103. netto *= (100 - s2) / 100;
  104. netto *= (100 - s3) / 100;
  105. netto *= (100 - s4) / 100;
  106. netto *= (100 - s5) / 100;
  107. return netto;
  108. }
  109. Future<List<RigaOrdine>> getOrderLines(int idOrdine) =>
  110. _ordiniDao.getOrderLines(idOrdine);
  111. Future<int> addOrderLine(RigaOrdine line) async {
  112. if (_currentOrder == null) return 0;
  113. final saved = await _ordiniDao.insertOrderLine(line);
  114. _isChanged = true;
  115. return saved;
  116. }
  117. Future<void> editOrderLine(RigaOrdine line) async {
  118. await _ordiniDao.updateOrderLine(line);
  119. _isChanged = true;
  120. }
  121. Future<void> removeItem(int idRigaOrdine) async {
  122. await _ordiniDao.deleteOrderLine(idRigaOrdine);
  123. _isChanged = true;
  124. }
  125. Future<void> saveOrder() async {
  126. if (_currentOrder == null) return;
  127. if (_currentOrder!.idOrdine > 0) {
  128. await _ordiniDao.updateOrder(_currentOrder!);
  129. } else {
  130. final id = await _ordiniDao.insertOrder(_currentOrder!);
  131. _currentOrder = _currentOrder!.copyWith(idOrdine: id);
  132. }
  133. _isChanged = false;
  134. }
  135. Future<void> deleteOrder(int idOrdine) async {
  136. await _ordiniDao.deleteOrder(idOrdine);
  137. _currentOrder = null;
  138. _isChanged = false;
  139. }
  140. Future<double> getOrderTotal(int idOrdine) =>
  141. _ordiniDao.totalAmountItems(idOrdine);
  142. Future<double> getOrderQty(int idOrdine) =>
  143. _ordiniDao.totalQtyItems(idOrdine);
  144. }