articoli_dao.dart 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import 'package:drift/drift.dart';
  2. import '../database.dart';
  3. import '../tables/articoli.dart';
  4. import '../tables/listini.dart';
  5. import '../tables/listini_articolo.dart';
  6. import '../tables/listini_cliente.dart';
  7. import '../views/top_item.dart';
  8. class ArticoliDao {
  9. final AppDatabase db;
  10. ArticoliDao(this.db);
  11. Future<Articolo?> getByCode(String code) {
  12. return (db.select(
  13. db.articoli,
  14. )..where((t) => t.codArticolo.equals(code))).getSingleOrNull();
  15. }
  16. Future<List<Articolo>> getItems(String filter) async {
  17. final words = filter.split(' ').where((w) => w.isNotEmpty).toList();
  18. final q = db.select(db.articoli)
  19. ..where(
  20. (t) =>
  21. (t.gruppo.isNotNull() & t.gruppo.equals('*').not()) &
  22. (t.categoria.isNotNull() & t.categoria.equals('PPP').not()) &
  23. (t.descrizione.isNotNull() &
  24. t.descrizione.like('%.ANNULLATO%').not()),
  25. )
  26. ..orderBy([(t) => OrderingTerm(expression: t.descrizione)])
  27. ..limit(200);
  28. for (final word in words) {
  29. final pattern = '%$word%';
  30. q.where(
  31. (t) =>
  32. t.codArticolo.like(pattern) |
  33. t.descrizione.like(pattern) |
  34. t.ean.like(pattern),
  35. );
  36. }
  37. return q.get();
  38. }
  39. Future<List<Articolo>> getActiveItems(String filter) async {
  40. final items = await getItems(filter);
  41. return items.where((a) => a.attivo == 1).toList();
  42. }
  43. Future<List<TopItemData>> getMostSoldItems(int limit) {
  44. return (db.select(db.topItem)..limit(limit)).get();
  45. }
  46. Future<List<Listino>> getListini() {
  47. return (db.select(db.listini)..where(
  48. (t) =>
  49. t.codListino.isNotNull() &
  50. t.codListino.like('OF2').not() &
  51. t.codListino.like('OF4').not() &
  52. t.codListino.like('I0').not(),
  53. ))
  54. .get();
  55. }
  56. Future<List<ListinoArticolo>> getListinoArticoli(int idListino) {
  57. return (db.select(db.listiniArticolo)
  58. ..where((t) => t.idListino.equals(idListino) & (t.attivo.equals(1))))
  59. .get();
  60. }
  61. Future<ListinoArticolo?> getListPrice(
  62. int idListino,
  63. int idArticolo,
  64. String date,
  65. ) {
  66. return (db.select(db.listiniArticolo)..where(
  67. (t) =>
  68. t.idListino.equals(idListino) &
  69. t.idArticolo.equals(idArticolo) &
  70. (t.attivo.equals(1)),
  71. ))
  72. .getSingleOrNull();
  73. }
  74. Future<ListinoCliente?> getCustomerListPrice(
  75. int idCliente,
  76. int idArticolo,
  77. String date,
  78. ) {
  79. return (db.select(db.listiniCliente)
  80. ..where(
  81. (t) =>
  82. t.idCliente.equals(idCliente) &
  83. t.idArticolo.equals(idArticolo) &
  84. (t.attivo.equals(1)) &
  85. (t.annullato.equals('N')),
  86. )
  87. ..orderBy([
  88. (t) =>
  89. OrderingTerm(expression: t.validoDa, mode: OrderingMode.desc),
  90. ])
  91. ..limit(1))
  92. .getSingleOrNull();
  93. }
  94. Future<List<Listino>> getPriceCodes(int idArticolo) {
  95. return (db.select(db.listini)
  96. ..join([
  97. innerJoin(
  98. db.listiniArticolo,
  99. db.listiniArticolo.idListino.equalsExp(db.listini.idListino) &
  100. db.listiniArticolo.idArticolo.equals(idArticolo),
  101. ),
  102. ])
  103. ..where(
  104. (t) =>
  105. t.codListino.isNotNull() &
  106. t.codListino.like('OF2').not() &
  107. t.codListino.like('OF4').not() &
  108. t.codListino.like('I0').not(),
  109. ))
  110. .get();
  111. }
  112. Future<List<Articolo>> getArticoliPerListinoAttivo(String dataOrdine) async {
  113. final q =
  114. db.select(db.articoli).join([
  115. innerJoin(
  116. db.listiniArticolo,
  117. db.listiniArticolo.idArticolo.equalsExp(db.articoli.idArticolo),
  118. ),
  119. ])
  120. ..where(
  121. db.listiniArticolo.attivo.equals(1) &
  122. db.listiniArticolo.validoDa.isSmallerOrEqualValue(dataOrdine) &
  123. db.listiniArticolo.validoA.isBiggerOrEqualValue(dataOrdine) &
  124. db.articoli.attivo.equals(1) &
  125. db.articoli.gruppo.isNotNull() &
  126. db.articoli.gruppo.equals('*').not() &
  127. db.articoli.categoria.isNotNull() &
  128. db.articoli.categoria.equals('PPP').not() &
  129. db.articoli.descrizione.isNotNull() &
  130. db.articoli.descrizione.like('%.ANNULLATO%').not(),
  131. )
  132. ..orderBy([OrderingTerm(expression: db.articoli.descrizione)]);
  133. final results = await q.get();
  134. final seen = <int>{};
  135. final items = <Articolo>[];
  136. for (final row in results) {
  137. final art = row.readTable(db.articoli);
  138. if (seen.add(art.idArticolo)) items.add(art);
  139. }
  140. return items;
  141. }
  142. Future<List<Articolo>> getArticoliPerListinoCliente(
  143. int idCliente,
  144. String dataOrdine,
  145. ) async {
  146. final q =
  147. db.select(db.articoli).join([
  148. innerJoin(
  149. db.listiniCliente,
  150. db.listiniCliente.idArticolo.equalsExp(db.articoli.idArticolo),
  151. ),
  152. ])
  153. ..where(
  154. db.listiniCliente.idCliente.equals(idCliente) &
  155. db.listiniCliente.attivo.equals(1) &
  156. db.listiniCliente.annullato.equals('N') &
  157. db.listiniCliente.validoDa.isSmallerOrEqualValue(dataOrdine) &
  158. db.listiniCliente.validoA.isBiggerOrEqualValue(dataOrdine) &
  159. db.articoli.attivo.equals(1),
  160. )
  161. ..orderBy([OrderingTerm(expression: db.articoli.descrizione)]);
  162. final results = await q.get();
  163. final seen = <int>{};
  164. final items = <Articolo>[];
  165. for (final row in results) {
  166. final art = row.readTable(db.articoli);
  167. if (seen.add(art.idArticolo)) items.add(art);
  168. }
  169. return items;
  170. }
  171. }