ordini_dao.dart 7.2 KB

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