articoli_dao.dart 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. import 'package:drift/drift.dart';
  2. import '../database.dart';
  3. class ArticoliDao {
  4. final AppDatabase db;
  5. ArticoliDao(this.db);
  6. Future<Articolo?> getByCode(String code) {
  7. return (db.select(
  8. db.articoli,
  9. )..where((t) => t.codArticolo.equals(code)))
  10. .getSingleOrNull();
  11. }
  12. Future<List<Articolo>> getItems(String filter) async {
  13. final words = filter.split(' ').where((w) => w.isNotEmpty).toList();
  14. final q = db.select(db.articoli)
  15. ..where(
  16. (t) =>
  17. (t.gruppo.isNotNull() & t.gruppo.equals('*').not()) &
  18. (t.categoria.isNotNull() & t.categoria.equals('PPP').not()) &
  19. (t.descrizione.isNotNull() &
  20. t.descrizione.like('%.ANNULLATO%').not()),
  21. )
  22. ..orderBy([(t) => OrderingTerm(expression: t.descrizione)])
  23. ..limit(200);
  24. for (final word in words) {
  25. final pattern = '%$word%';
  26. q.where(
  27. (t) =>
  28. t.codArticolo.like(pattern) |
  29. t.descrizione.like(pattern) |
  30. t.ean.like(pattern),
  31. );
  32. }
  33. return q.get();
  34. }
  35. Future<List<Articolo>> getActiveItems(String filter) async {
  36. final items = await getItems(filter);
  37. return items.where((a) => a.attivo == 1).toList();
  38. }
  39. Future<List<TopItemData>> getMostSoldItems(int limit) {
  40. return (db.select(db.topItem)..limit(limit)).get();
  41. }
  42. Future<List<Listino>> getListini() {
  43. return (db.select(db.listini)
  44. ..where(
  45. (t) =>
  46. t.codListino.isNotNull() &
  47. t.codListino.like('OF2').not() &
  48. t.codListino.like('OF4').not() &
  49. t.codListino.like('I0').not(),
  50. ))
  51. .get();
  52. }
  53. Future<List<ListinoArticolo>> getListinoArticoli(int idListino) {
  54. return (db.select(db.listiniArticolo)
  55. ..where((t) => t.idListino.equals(idListino) & (t.attivo.equals(1))))
  56. .get();
  57. }
  58. Future<ListinoArticolo?> getListPrice(
  59. int idListino,
  60. int idArticolo,
  61. String date,
  62. ) {
  63. return (db.select(db.listiniArticolo)
  64. ..where(
  65. (t) =>
  66. t.idListino.equals(idListino) &
  67. t.idArticolo.equals(idArticolo) &
  68. (t.attivo.equals(1)) &
  69. t.validoDa.isSmallerOrEqualValue(date) &
  70. t.validoA.isBiggerOrEqualValue(date),
  71. )
  72. ..orderBy([
  73. (t) =>
  74. OrderingTerm(expression: t.validoDa, mode: OrderingMode.desc),
  75. ])
  76. ..limit(1))
  77. .getSingleOrNull();
  78. }
  79. Future<ListinoCliente?> getCustomerListPrice(
  80. int idCliente,
  81. int idArticolo,
  82. String date,
  83. ) {
  84. return (db.select(db.listiniCliente)
  85. ..where(
  86. (t) =>
  87. t.idCliente.equals(idCliente) &
  88. t.idArticolo.equals(idArticolo) &
  89. (t.attivo.equals(1)) &
  90. (t.annullato.equals('N')),
  91. )
  92. ..orderBy([
  93. (t) =>
  94. OrderingTerm(expression: t.validoDa, mode: OrderingMode.desc),
  95. ])
  96. ..limit(1))
  97. .getSingleOrNull();
  98. }
  99. Future<List<Listino>> getPriceCodes(int idArticolo) {
  100. return (db.select(db.listini)
  101. ..join([
  102. innerJoin(
  103. db.listiniArticolo,
  104. db.listiniArticolo.idListino.equalsExp(db.listini.idListino) &
  105. db.listiniArticolo.idArticolo.equals(idArticolo),
  106. ),
  107. ])
  108. ..where(
  109. (t) =>
  110. t.codListino.isNotNull() &
  111. t.codListino.like('OF2').not() &
  112. t.codListino.like('OF4').not() &
  113. t.codListino.like('I0').not(),
  114. ))
  115. .get();
  116. }
  117. Future<List<Articolo>> getArticoliPerListinoAttivo(
  118. String dataOrdine,
  119. String filtro,
  120. ) async {
  121. final words = filtro.split(' ').where((w) => w.isNotEmpty).toList();
  122. final buffer = StringBuffer('''
  123. SELECT DISTINCT a.*
  124. FROM "Articoli" a
  125. JOIN "Listini_articolo" la ON la."idArticolo" = a."idArticolo"
  126. JOIN "Listini" l ON l."idListino" = la."idListino"
  127. WHERE la."attivo" = 1
  128. AND la."validoDa" <= ?
  129. AND la."validoA" >= ?
  130. AND l."codListino" NOT IN ('OF2', 'OF4', 'I0')
  131. ''');
  132. final variables = <Variable>[
  133. Variable.withString(dataOrdine),
  134. Variable.withString(dataOrdine),
  135. ];
  136. if (words.isNotEmpty) {
  137. buffer.write(' AND (');
  138. final filters = <String>[];
  139. for (final word in words) {
  140. filters.add(
  141. '(a."codArticolo" LIKE ? OR a."descrizione" LIKE ? OR a."ean" LIKE ?)',
  142. );
  143. final pattern = '%$word%';
  144. variables.addAll([
  145. Variable.withString(pattern),
  146. Variable.withString(pattern),
  147. Variable.withString(pattern),
  148. ]);
  149. }
  150. buffer.write(filters.join(' AND '));
  151. buffer.write(')');
  152. }
  153. buffer.write(' ORDER BY a."descrizione" ASC');
  154. final rows = await db
  155. .customSelect(
  156. buffer.toString(),
  157. variables: variables,
  158. )
  159. .get();
  160. return rows.map((row) => Articolo.fromJson(row.data)).toList();
  161. }
  162. Future<List<Listino>> getListiniArticoloValidi(
  163. int idArticolo,
  164. String dataOrdine,
  165. ) {
  166. final sql = "select distinct l.* from Listini l "
  167. "join Listini_articolo la on la.idListino = l.idListino "
  168. "where la.idArticolo = ? and la.attivo = 1 and "
  169. "la.validoDa <= ? and la.validoA >= ? and "
  170. "l.codListino not in ('OF2', 'OF4', 'I0') "
  171. " order by l.codListino";
  172. final rows = db.customSelect(
  173. sql,
  174. variables: [
  175. Variable.withInt(idArticolo),
  176. Variable.withString(dataOrdine),
  177. Variable.withString(dataOrdine),
  178. ],
  179. );
  180. return rows.map((row) => Listino.fromJson(row.data)).get();
  181. /*
  182. return (db.select(
  183. db.listiniArticolo,
  184. )..where(
  185. (t) =>
  186. t.idArticolo.equals(idArticolo) &
  187. t.attivo.equals(1) &
  188. t.validoDa.isSmallerOrEqualValue(dataOrdine) &
  189. t.validoA.isBiggerOrEqualValue(dataOrdine),
  190. ))
  191. .get();
  192. */
  193. }
  194. Future<List<Articolo>> getArticoliPerListinoCliente(
  195. int idCliente,
  196. String dataOrdine,
  197. ) async {
  198. final lcRows = await (db.select(db.listiniCliente)
  199. ..where(
  200. (t) =>
  201. t.idCliente.equals(idCliente) &
  202. t.attivo.equals(1) &
  203. t.annullato.equals('N') &
  204. t.validoDa.isSmallerOrEqualValue(dataOrdine) &
  205. t.validoA.isBiggerOrEqualValue(dataOrdine),
  206. ))
  207. .get();
  208. final validIds =
  209. lcRows.map((r) => r.idArticolo).whereType<int>().toSet().toList();
  210. if (validIds.isEmpty) return [];
  211. return (db.select(db.articoli)
  212. ..where(
  213. (t) => t.idArticolo.isIn(validIds) & t.attivo.equals(1),
  214. )
  215. ..orderBy([(t) => OrderingTerm(expression: t.descrizione)]))
  216. .get();
  217. }
  218. Future<List<ListinoCliente>> getListiniClienteValidi(
  219. int idCliente,
  220. int idArticolo,
  221. String dataOrdine,
  222. ) {
  223. return (db.select(db.listiniCliente)
  224. ..where(
  225. (t) =>
  226. t.idCliente.equals(idCliente) &
  227. t.idArticolo.equals(idArticolo) &
  228. t.attivo.equals(1) &
  229. t.annullato.equals('N') &
  230. t.validoDa.isSmallerOrEqualValue(dataOrdine) &
  231. t.validoA.isBiggerOrEqualValue(dataOrdine),
  232. ))
  233. .get();
  234. }
  235. }