articoli_dao.dart 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  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<Articolo?> getById(int id) {
  13. return (db.select(db.articoli)..where((t) => t.idArticolo.equals(id)))
  14. .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)
  48. ..where(
  49. (t) =>
  50. t.codListino.isNotNull() &
  51. t.codListino.like('OF2').not() &
  52. t.codListino.like('OF4').not() &
  53. t.codListino.like('I0').not(),
  54. ))
  55. .get();
  56. }
  57. Future<List<ListinoArticolo>> getListinoArticoli(int idListino) {
  58. return (db.select(db.listiniArticolo)
  59. ..where((t) => t.idListino.equals(idListino) & (t.attivo.equals(1))))
  60. .get();
  61. }
  62. Future<ListinoArticolo?> getListPrice(
  63. int idListino,
  64. int idArticolo,
  65. String date,
  66. ) {
  67. return (db.select(db.listiniArticolo)
  68. ..where(
  69. (t) =>
  70. t.idListino.equals(idListino) &
  71. t.idArticolo.equals(idArticolo) &
  72. (t.attivo.equals(1)) &
  73. t.validoDa.isSmallerOrEqualValue(date) &
  74. t.validoA.isBiggerOrEqualValue(date),
  75. )
  76. ..orderBy([
  77. (t) =>
  78. OrderingTerm(expression: t.validoDa, mode: OrderingMode.desc),
  79. ])
  80. ..limit(1))
  81. .getSingleOrNull();
  82. }
  83. Future<ListinoCliente?> getCustomerListPrice(
  84. int idCliente,
  85. int idArticolo,
  86. String date,
  87. ) {
  88. return (db.select(db.listiniCliente)
  89. ..where(
  90. (t) =>
  91. t.idCliente.equals(idCliente) &
  92. t.idArticolo.equals(idArticolo) &
  93. (t.attivo.equals(1)) &
  94. (t.annullato.equals('N')),
  95. )
  96. ..orderBy([
  97. (t) =>
  98. OrderingTerm(expression: t.validoDa, mode: OrderingMode.desc),
  99. ])
  100. ..limit(1))
  101. .getSingleOrNull();
  102. }
  103. Future<List<Listino>> getPriceCodes(int idArticolo) {
  104. return (db.select(db.listini).join([
  105. innerJoin(
  106. db.listiniArticolo,
  107. db.listiniArticolo.idListino.equalsExp(db.listini.idListino) &
  108. db.listiniArticolo.idArticolo.equals(idArticolo),
  109. ),
  110. ])
  111. ..where(
  112. db.listini.codListino.isNotNull() &
  113. db.listini.codListino.like('OF2').not() &
  114. db.listini.codListino.like('OF4').not() &
  115. db.listini.codListino.like('I0').not(),
  116. ))
  117. .map((row) => row.readTable(db.listini))
  118. .get();
  119. }
  120. Future<List<Articolo>> getArticoliPerListinoAttivo(
  121. String dataOrdine,
  122. String filtro,
  123. ) async {
  124. final words = filtro.split(' ').where((w) => w.isNotEmpty).toList();
  125. final buffer = StringBuffer('''
  126. SELECT DISTINCT a.*
  127. FROM "Articoli" a
  128. JOIN "Listini_articolo" la ON la."idArticolo" = a."idArticolo"
  129. JOIN "Listini" l ON l."idListino" = la."idListino"
  130. WHERE la."attivo" = 1
  131. AND la."validoDa" <= ?
  132. AND la."validoA" >= ?
  133. AND l."codListino" NOT IN ('OF2', 'OF4', 'I0')
  134. ''');
  135. final variables = <Variable>[
  136. Variable.withString(dataOrdine),
  137. Variable.withString(dataOrdine),
  138. ];
  139. if (words.isNotEmpty) {
  140. buffer.write(' AND (');
  141. final filters = <String>[];
  142. for (final word in words) {
  143. filters.add(
  144. '(a."codArticolo" LIKE ? OR a."descrizione" LIKE ? OR a."ean" LIKE ?)',
  145. );
  146. final pattern = '%$word%';
  147. variables.addAll([
  148. Variable.withString(pattern),
  149. Variable.withString(pattern),
  150. Variable.withString(pattern),
  151. ]);
  152. buffer.write(filters.join(' AND '));
  153. buffer.write(')');
  154. }
  155. }
  156. buffer.write(' ORDER BY a."descrizione" ASC');
  157. final rows = await db
  158. .customSelect(
  159. buffer.toString(),
  160. variables: variables,
  161. )
  162. .get();
  163. return rows.map((row) => Articolo.fromJson(row.data)).toList();
  164. }
  165. Future<List<ArticoliConPromoData>> getActiveItemsWithPromo(
  166. String filter,
  167. int idCliente,
  168. ) async {
  169. final words = filter.split(' ').where((w) => w.isNotEmpty).toList();
  170. final buffer = StringBuffer('''
  171. SELECT DISTINCT a.idArticolo, a.codArticolo,a.descrizione, 0 as prezzoBase,
  172. a.attivo, a."nonDisponibile",
  173. 0 AS inPromo,
  174. (SELECT ROUND(sv.importo / sv.qta, 2)
  175. FROM "Statistiche_vendita" sv
  176. WHERE sv.idCliente = ? AND sv.idArticolo = a.idArticolo
  177. ORDER BY sv."dataFattura" DESC LIMIT 1 OFFSET 1) AS ultimoPrezzo,
  178. (SELECT sv."dataFattura"
  179. FROM "Statistiche_vendita" sv
  180. WHERE sv.idCliente = ? AND sv.idArticolo = a.idArticolo
  181. ORDER BY sv."dataFattura" DESC LIMIT 1 OFFSET 1) AS lastDateSold
  182. FROM "Articoli" a
  183. WHERE a.attivo = 1
  184. ''');
  185. final variables = <Variable>[
  186. Variable.withInt(idCliente),
  187. Variable.withInt(idCliente),
  188. ];
  189. if (words.isNotEmpty) {
  190. for (final word in words) {
  191. buffer.write(' AND (a."codArticolo" LIKE ? OR a.descrizione LIKE ?)');
  192. final pattern = '%$word%';
  193. variables.addAll([
  194. Variable.withString(pattern),
  195. Variable.withString(pattern),
  196. ]);
  197. }
  198. }
  199. buffer.write(' ORDER BY a.descrizione LIMIT 4000');
  200. final rows = await db
  201. .customSelect(
  202. buffer.toString(),
  203. variables: variables,
  204. )
  205. .get();
  206. return rows.map((row) => ArticoliConPromoData.fromJson(row.data)).toList();
  207. }
  208. Future<List<Listino>> getListiniArticoloValidi(
  209. int idArticolo,
  210. int idCliente,
  211. String dataOrdine,
  212. ) {
  213. final sql = "select distinct l.* from Listini l "
  214. "join Listini_articolo la on la.idListino = l.idListino "
  215. "where la.idArticolo = ? and la.attivo = 1 and "
  216. "la.validoDa <= ? and la.validoA >= ? and "
  217. "l.codListino not in ('OF2', 'OF4', 'I0') "
  218. " order by l.codListino";
  219. final rows = db.customSelect(
  220. sql,
  221. variables: [
  222. Variable.withInt(idArticolo),
  223. Variable.withString(dataOrdine),
  224. Variable.withString(dataOrdine),
  225. ],
  226. );
  227. return rows.map((row) => Listino.fromJson(row.data)).get();
  228. /*
  229. return (db.select(
  230. db.listiniArticolo,
  231. )..where(
  232. (t) =>
  233. t.idArticolo.equals(idArticolo) &
  234. t.attivo.equals(1) &
  235. t.validoDa.isSmallerOrEqualValue(dataOrdine) &
  236. t.validoA.isBiggerOrEqualValue(dataOrdine),
  237. ))
  238. .get();
  239. */
  240. }
  241. Future<List<Articolo>> getArticoliPerListinoCliente(
  242. int idCliente,
  243. String dataOrdine,
  244. ) async {
  245. final lcRows = await (db.select(db.listiniCliente)
  246. ..orderBy([(t) => OrderingTerm.desc(t.validoDa)])
  247. ..where((t) =>
  248. t.idCliente.equals(idCliente) &
  249. t.attivo.equals(1) &
  250. t.annullato.equals('N') &
  251. t.validoDa.isSmallerOrEqualValue(dataOrdine)))
  252. .get();
  253. final validIds =
  254. lcRows.map((r) => r.idArticolo).whereType<int>().toSet().toList();
  255. if (validIds.isEmpty) return [];
  256. return (db.select(db.articoli)
  257. ..where(
  258. (t) => t.idArticolo.isIn(validIds) & t.attivo.equals(1),
  259. )
  260. ..orderBy([(t) => OrderingTerm(expression: t.descrizione)]))
  261. .get();
  262. }
  263. Future<List<ListinoCliente>> getListiniClienteValidi(
  264. int idCliente,
  265. int idArticolo,
  266. String dataOrdine,
  267. ) {
  268. return (db.select(db.listiniCliente)
  269. ..where(
  270. (t) =>
  271. t.idCliente.equals(idCliente) &
  272. t.idArticolo.equals(idArticolo) &
  273. t.attivo.equals(1) &
  274. t.annullato.equals('N') &
  275. t.validoDa.isSmallerOrEqualValue(dataOrdine) &
  276. t.validoA.isBiggerOrEqualValue(dataOrdine),
  277. ))
  278. .get();
  279. }
  280. }