ordini_dao.dart 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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.ragioneSociale.like(p) |
  63. t.filiale.like(p) |
  64. t.indirizzo.like(p) |
  65. t.citta.like(p) |
  66. CustomExpression<String>('CAST(numeroOrdine AS TEXT)').like(p),
  67. );
  68. }
  69. return query.get();
  70. }
  71. Future<int> countNewOrdersForAgent(int idAgente) async {
  72. final rows = await (db.select(
  73. db.vOrdini,
  74. )..where((t) => t.idAgente.equals(idAgente) & t.stato.equals('N')))
  75. .get();
  76. return rows.length;
  77. }
  78. Future<int> countOrdersForAgent(int idAgente) async {
  79. final rows = await (db.select(
  80. db.vOrdini,
  81. )..where((t) => t.idAgente.equals(idAgente)))
  82. .get();
  83. return rows.length;
  84. }
  85. Future<double> getMonthlyVolume(int idAgente) async {
  86. final now = DateTime.now();
  87. final firstOfMonth = DateTime(now.year, now.month, 1);
  88. final dateStr = '${firstOfMonth.year.toString().padLeft(4, '0')}-'
  89. '${firstOfMonth.month.toString().padLeft(2, '0')}-01';
  90. final rows = await (db.select(db.vOrdini)
  91. ..where(
  92. (t) =>
  93. t.idAgente.equals(idAgente) &
  94. t.dataOrdine.isNotNull() &
  95. t.dataOrdine.isBiggerOrEqualValue(dateStr),
  96. ))
  97. .get();
  98. return rows.fold<double>(0, (sum, r) => sum + (r.totale ?? 0));
  99. }
  100. Future<int> countNewOrders() async {
  101. final rows = await (db.select(
  102. db.ordini,
  103. )..where((t) => t.stato.equals('N')))
  104. .get();
  105. return rows.length;
  106. }
  107. Future<int> countOrdersOnHold() async {
  108. final rows = await (db.select(
  109. db.ordini,
  110. )..where((t) => t.stato.equals('H')))
  111. .get();
  112. return rows.length;
  113. }
  114. Future<List<Ordine>> getNewOrders() {
  115. return (db.select(db.ordini)..where((t) => t.stato.equals('N'))).get();
  116. }
  117. Future<List<Ordine>> getUnsentOrders(int max) {
  118. return (db.select(db.ordini)
  119. ..where((t) => t.stato.equals('N') | t.stato.equals('H'))
  120. ..limit(max))
  121. .get();
  122. }
  123. Future<int> generaNumeroOrdine(int idAgente) async {
  124. final result = await (db.select(db.ordini)
  125. ..where((t) => t.idAgente.equals(idAgente))
  126. ..orderBy([
  127. (t) => OrderingTerm(
  128. expression: t.numeroOrdine,
  129. mode: OrderingMode.desc,
  130. ),
  131. ])
  132. ..limit(1))
  133. .getSingleOrNull();
  134. return (result?.numeroOrdine ?? 0) + 1;
  135. }
  136. Future<void> markAsSent(int idOrdine, int idAssegnato) {
  137. return (db.update(db.ordini)..where((t) => t.idOrdine.equals(idOrdine)))
  138. .write(OrdiniCompanion(stato: const Value('T')));
  139. }
  140. Future<void> markAsSentStatus(int idOrdine) {
  141. return (db.update(db.ordini)..where((t) => t.idOrdine.equals(idOrdine)))
  142. .write(OrdiniCompanion(stato: const Value('T')));
  143. }
  144. Future<int> insertOrder(Ordine order) {
  145. return db.into(db.ordini).insert(
  146. order.toCompanion(true).copyWith(idOrdine: const Value.absent()));
  147. }
  148. Future<bool> updateOrder(Ordine order) {
  149. return db.update(db.ordini).replace(order);
  150. }
  151. Future<void> deleteOrder(int idOrdine) {
  152. return (db.delete(
  153. db.ordini,
  154. )..where((t) => t.idOrdine.equals(idOrdine)))
  155. .go();
  156. }
  157. Future<int> insertOrderLine(RigaOrdine line) {
  158. return db.into(db.righeOrdine).insert(line.toCompanion(true).copyWith(
  159. idRigaOrdine: const Value.absent(),
  160. ));
  161. }
  162. Future<bool> updateOrderLine(RigaOrdine line) {
  163. return db.update(db.righeOrdine).replace(line.toCompanion(true).copyWith(
  164. idRigaOrdine: const Value.absent(),
  165. ));
  166. }
  167. Future<List<RigaOrdine>> getOrderLines(int idOrdine) {
  168. return (db.select(
  169. db.righeOrdine,
  170. )..where((t) => t.idOrdine.equals(idOrdine)))
  171. .get();
  172. }
  173. Future<void> deleteOrderLine(int idRigaOrdine) {
  174. return (db.delete(
  175. db.righeOrdine,
  176. )..where((t) => t.idRigaOrdine.equals(idRigaOrdine)))
  177. .go();
  178. }
  179. Future<void> zapOrderLines(int idOrdine) {
  180. return (db.delete(
  181. db.righeOrdine,
  182. )..where((t) => t.idOrdine.equals(idOrdine)))
  183. .go();
  184. }
  185. Future<Ordine?> findByNumeroOrdineSede(String numSede) {
  186. return (db.select(
  187. db.ordini,
  188. )..where((t) => t.numeroOrdineSede.equals(numSede)))
  189. .getSingleOrNull();
  190. }
  191. Future<Ordine?> findByIdOrdineSede(int idSede) {
  192. return (db.select(
  193. db.ordini,
  194. )..where((t) => t.idOrdineSede.equals(idSede)))
  195. .getSingleOrNull();
  196. }
  197. Future<double> totalAmountItems(int idOrdine) async {
  198. final lines = await (db.select(db.righeOrdine)
  199. ..where(
  200. (t) =>
  201. t.idOrdine.equals(idOrdine) &
  202. (t.rigaPromozione.equals(0) | t.rigaPromozione.isNull()),
  203. ))
  204. .get();
  205. return lines.fold<double>(0.0, (sum, l) => sum + (l.totale ?? 0.0));
  206. }
  207. Future<double> totalQtyItems(int idOrdine) async {
  208. final lines = await (db.select(db.righeOrdine)
  209. ..where(
  210. (t) =>
  211. t.idOrdine.equals(idOrdine) &
  212. (t.rigaPromozione.equals(0) | t.rigaPromozione.isNull()),
  213. ))
  214. .get();
  215. return lines.fold<double>(0.0, (sum, l) => sum + (l.quantita ?? 0.0));
  216. }
  217. }