ordini_dao.dart 6.7 KB

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