order_manager.dart 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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(double lordo, double s1, double s2, double s3, double s4, double s5) {
  100. double netto = lordo;
  101. netto *= (100 - s1) / 100;
  102. netto *= (100 - s2) / 100;
  103. netto *= (100 - s3) / 100;
  104. netto *= (100 - s4) / 100;
  105. netto *= (100 - s5) / 100;
  106. return netto;
  107. }
  108. Future<List<RigaOrdine>> getOrderLines(int idOrdine) => _ordiniDao.getOrderLines(idOrdine);
  109. Future<int> addOrderLine(RigaOrdine line) async {
  110. if (_currentOrder == null) return 0;
  111. final saved = await _ordiniDao.insertOrderLine(line);
  112. _isChanged = true;
  113. return saved;
  114. }
  115. Future<void> editOrderLine(RigaOrdine line) async {
  116. await _ordiniDao.updateOrderLine(line);
  117. _isChanged = true;
  118. }
  119. Future<void> removeItem(int idRigaOrdine) async {
  120. await _ordiniDao.deleteOrderLine(idRigaOrdine);
  121. _isChanged = true;
  122. }
  123. Future<void> saveOrder() async {
  124. if (_currentOrder == null) return;
  125. if (_currentOrder!.idOrdine > 0) {
  126. await _ordiniDao.updateOrder(_currentOrder!);
  127. } else {
  128. final id = await _ordiniDao.insertOrder(_currentOrder!);
  129. _currentOrder = _currentOrder!.copyWith(idOrdine: id);
  130. }
  131. _isChanged = false;
  132. }
  133. Future<void> deleteOrder(int idOrdine) async {
  134. await _ordiniDao.deleteOrder(idOrdine);
  135. _currentOrder = null;
  136. _isChanged = false;
  137. }
  138. Future<double> getOrderTotal(int idOrdine) => _ordiniDao.totalAmountItems(idOrdine);
  139. Future<double> getOrderQty(int idOrdine) => _ordiniDao.totalQtyItems(idOrdine);
  140. }