ordini_dao.dart 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import 'package:drift/drift.dart';
  2. import '../database.dart';
  3. class OrdiniDao {
  4. final AppDatabase db;
  5. OrdiniDao(this.db);
  6. Future<Ordine?> getById(int id) {
  7. return (db.select(db.ordini)..where((t) => t.idOrdine.equals(id))).getSingleOrNull();
  8. }
  9. Future<Ordine?> getByNumber(int numeroOrdine) {
  10. return (db.select(db.ordini)..where((t) => t.numeroOrdine.equals(numeroOrdine))).getSingleOrNull();
  11. }
  12. Future<List<Ordine>> customerOrders(int idCliente, bool includeReferences) {
  13. return (db.select(db.ordini)
  14. ..where((t) => t.idCliente.equals(idCliente))
  15. ..orderBy([(t) => OrderingTerm(expression: t.dataOrdine, mode: OrderingMode.desc)])
  16. ..limit(200)
  17. ).get();
  18. }
  19. Future<List<Ordine>> getLastOrders(int idAgente, int max) {
  20. return (db.select(db.ordini)
  21. ..where((t) => t.idAgente.equals(idAgente))
  22. ..orderBy([(t) => OrderingTerm(expression: t.dataOrdine, mode: OrderingMode.desc)])
  23. ..limit(max)
  24. ).get();
  25. }
  26. Future<List<VOrdiniData>> getOrdersView(int idAgente, {int limit = 200}) {
  27. return (db.select(db.vOrdini)
  28. ..where((t) => t.idAgente.equals(idAgente))
  29. ..orderBy([(t) => OrderingTerm(expression: t.dataOrdine, mode: OrderingMode.desc)])
  30. ..limit(limit)
  31. ).get();
  32. }
  33. Future<List<VOrdiniData>> searchOrdersView(int idAgente, String filter) async {
  34. final words = filter.split(' ').where((w) => w.isNotEmpty).toList();
  35. final patterns = words.map((w) => '%$w%').toList();
  36. final query = db.select(db.vOrdini)
  37. ..where((t) => t.idAgente.equals(idAgente))
  38. ..orderBy([(t) => OrderingTerm(expression: t.dataOrdine, mode: OrderingMode.desc)]);
  39. for (final p in patterns) {
  40. query.where((t) =>
  41. t.ragioneSociale.like(p) |
  42. t.filiale.like(p) |
  43. t.indirizzo.like(p) |
  44. t.citta.like(p) |
  45. CustomExpression<String>('CAST(numeroOrdine AS TEXT)').like(p)
  46. );
  47. }
  48. return query.get();
  49. }
  50. Future<int> countNewOrdersForAgent(int idAgente) async {
  51. final rows = await (db.select(db.vOrdini)
  52. ..where((t) => t.idAgente.equals(idAgente) & t.stato.equals('N'))
  53. ).get();
  54. return rows.length;
  55. }
  56. Future<int> countOrdersForAgent(int idAgente) async {
  57. final rows = await (db.select(db.vOrdini)
  58. ..where((t) => t.idAgente.equals(idAgente))
  59. ).get();
  60. return rows.length;
  61. }
  62. Future<double> getMonthlyVolume(int idAgente) async {
  63. final now = DateTime.now();
  64. final firstOfMonth = DateTime(now.year, now.month, 1);
  65. final dateStr =
  66. '${firstOfMonth.year.toString().padLeft(4, '0')}-'
  67. '${firstOfMonth.month.toString().padLeft(2, '0')}-01';
  68. final rows = await (db.select(db.vOrdini)
  69. ..where((t) =>
  70. t.idAgente.equals(idAgente) &
  71. t.dataOrdine.isNotNull() &
  72. t.dataOrdine.isBiggerOrEqualValue(dateStr))
  73. ).get();
  74. return rows.fold<double>(0, (sum, r) => sum + (r.totale ?? 0));
  75. }
  76. Future<int> countNewOrders() async {
  77. final rows = await (db.select(db.ordini)..where((t) => t.stato.equals('N'))).get();
  78. return rows.length;
  79. }
  80. Future<int> countOrdersOnHold() async {
  81. final rows = await (db.select(db.ordini)..where((t) => t.stato.equals('H'))).get();
  82. return rows.length;
  83. }
  84. Future<List<Ordine>> getNewOrders() {
  85. return (db.select(db.ordini)..where((t) => t.stato.equals('N'))).get();
  86. }
  87. Future<List<Ordine>> getUnsentOrders(int max) {
  88. return (db.select(db.ordini)
  89. ..where((t) => t.stato.equals('N') | t.stato.equals('H'))
  90. ..limit(max)
  91. ).get();
  92. }
  93. Future<int> generaNumeroOrdine(int idAgente) async {
  94. final result = await (db.select(db.ordini)
  95. ..where((t) => t.idAgente.equals(idAgente))
  96. ..orderBy([(t) => OrderingTerm(expression: t.numeroOrdine, mode: OrderingMode.desc)])
  97. ..limit(1)
  98. ).getSingleOrNull();
  99. return (result?.numeroOrdine ?? 0) + 1;
  100. }
  101. Future<void> markAsSent(int idOrdine, int idAssegnato) {
  102. return (db.update(db.ordini)..where((t) => t.idOrdine.equals(idOrdine)))
  103. .write(OrdiniCompanion(stato: const Value('T')));
  104. }
  105. Future<void> markAsSentStatus(int idOrdine) {
  106. return (db.update(db.ordini)..where((t) => t.idOrdine.equals(idOrdine)))
  107. .write(OrdiniCompanion(stato: const Value('T')));
  108. }
  109. Future<int> insertOrder(Ordine order) {
  110. return db.into(db.ordini).insert(order);
  111. }
  112. Future<bool> updateOrder(Ordine order) {
  113. return db.update(db.ordini).replace(order);
  114. }
  115. Future<void> deleteOrder(int idOrdine) {
  116. return (db.delete(db.ordini)..where((t) => t.idOrdine.equals(idOrdine))).go();
  117. }
  118. Future<int> insertOrderLine(RigaOrdine line) {
  119. return db.into(db.righeOrdine).insert(line);
  120. }
  121. Future<bool> updateOrderLine(RigaOrdine line) {
  122. return db.update(db.righeOrdine).replace(line);
  123. }
  124. Future<List<RigaOrdine>> getOrderLines(int idOrdine) {
  125. return (db.select(db.righeOrdine)..where((t) => t.idOrdine.equals(idOrdine))).get();
  126. }
  127. Future<void> deleteOrderLine(int idRigaOrdine) {
  128. return (db.delete(db.righeOrdine)..where((t) => t.idRigaOrdine.equals(idRigaOrdine))).go();
  129. }
  130. Future<void> zapOrderLines(int idOrdine) {
  131. return (db.delete(db.righeOrdine)..where((t) => t.idOrdine.equals(idOrdine))).go();
  132. }
  133. Future<Ordine?> findByNumeroOrdineSede(String numSede) {
  134. return (db.select(db.ordini)..where((t) => t.numeroOrdineSede.equals(numSede))).getSingleOrNull();
  135. }
  136. Future<Ordine?> findByIdOrdineSede(int idSede) {
  137. return (db.select(db.ordini)..where((t) => t.idOrdineSede.equals(idSede))).getSingleOrNull();
  138. }
  139. Future<double> totalAmountItems(int idOrdine) async {
  140. final lines = await (db.select(db.righeOrdine)
  141. ..where((t) => t.idOrdine.equals(idOrdine) & (t.rigaPromozione.equals(0) | t.rigaPromozione.isNull()))
  142. ).get();
  143. return lines.fold<double>(0.0, (sum, l) => sum + (l.totale ?? 0.0));
  144. }
  145. Future<double> totalQtyItems(int idOrdine) async {
  146. final lines = await (db.select(db.righeOrdine)
  147. ..where((t) => t.idOrdine.equals(idOrdine) & (t.rigaPromozione.equals(0) | t.rigaPromozione.isNull()))
  148. ).get();
  149. return lines.fold<double>(0.0, (sum, l) => sum + (l.quantita ?? 0.0));
  150. }
  151. }