ordini_dao.dart 7.3 KB

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