| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- import 'package:drift/drift.dart';
- import '../database.dart';
- class ArticoliDao {
- final AppDatabase db;
- ArticoliDao(this.db);
- Future<Articolo?> getByCode(String code) {
- return (db.select(
- db.articoli,
- )..where((t) => t.codArticolo.equals(code)))
- .getSingleOrNull();
- }
- Future<List<Articolo>> getItems(String filter) async {
- final words = filter.split(' ').where((w) => w.isNotEmpty).toList();
- final q = db.select(db.articoli)
- ..where(
- (t) =>
- (t.gruppo.isNotNull() & t.gruppo.equals('*').not()) &
- (t.categoria.isNotNull() & t.categoria.equals('PPP').not()) &
- (t.descrizione.isNotNull() &
- t.descrizione.like('%.ANNULLATO%').not()),
- )
- ..orderBy([(t) => OrderingTerm(expression: t.descrizione)])
- ..limit(200);
- for (final word in words) {
- final pattern = '%$word%';
- q.where(
- (t) =>
- t.codArticolo.like(pattern) |
- t.descrizione.like(pattern) |
- t.ean.like(pattern),
- );
- }
- return q.get();
- }
- Future<List<Articolo>> getActiveItems(String filter) async {
- final items = await getItems(filter);
- return items.where((a) => a.attivo == 1).toList();
- }
- Future<List<TopItemData>> getMostSoldItems(int limit) {
- return (db.select(db.topItem)..limit(limit)).get();
- }
- Future<List<Listino>> getListini() {
- return (db.select(db.listini)
- ..where(
- (t) =>
- t.codListino.isNotNull() &
- t.codListino.like('OF2').not() &
- t.codListino.like('OF4').not() &
- t.codListino.like('I0').not(),
- ))
- .get();
- }
- Future<List<ListinoArticolo>> getListinoArticoli(int idListino) {
- return (db.select(db.listiniArticolo)
- ..where((t) => t.idListino.equals(idListino) & (t.attivo.equals(1))))
- .get();
- }
- Future<ListinoArticolo?> getListPrice(
- int idListino,
- int idArticolo,
- String date,
- ) {
- return (db.select(db.listiniArticolo)
- ..where(
- (t) =>
- t.idListino.equals(idListino) &
- t.idArticolo.equals(idArticolo) &
- (t.attivo.equals(1)) &
- t.validoDa.isSmallerOrEqualValue(date) &
- t.validoA.isBiggerOrEqualValue(date),
- )
- ..orderBy([
- (t) =>
- OrderingTerm(expression: t.validoDa, mode: OrderingMode.desc),
- ])
- ..limit(1))
- .getSingleOrNull();
- }
- Future<ListinoCliente?> getCustomerListPrice(
- int idCliente,
- int idArticolo,
- String date,
- ) {
- return (db.select(db.listiniCliente)
- ..where(
- (t) =>
- t.idCliente.equals(idCliente) &
- t.idArticolo.equals(idArticolo) &
- (t.attivo.equals(1)) &
- (t.annullato.equals('N')),
- )
- ..orderBy([
- (t) =>
- OrderingTerm(expression: t.validoDa, mode: OrderingMode.desc),
- ])
- ..limit(1))
- .getSingleOrNull();
- }
- Future<List<Listino>> getPriceCodes(int idArticolo) {
- return (db.select(db.listini)
- ..join([
- innerJoin(
- db.listiniArticolo,
- db.listiniArticolo.idListino.equalsExp(db.listini.idListino) &
- db.listiniArticolo.idArticolo.equals(idArticolo),
- ),
- ])
- ..where(
- (t) =>
- t.codListino.isNotNull() &
- t.codListino.like('OF2').not() &
- t.codListino.like('OF4').not() &
- t.codListino.like('I0').not(),
- ))
- .get();
- }
- Future<List<Articolo>> getArticoliPerListinoAttivo(
- String dataOrdine,
- String filtro,
- ) async {
- final words = filtro.split(' ').where((w) => w.isNotEmpty).toList();
- final buffer = StringBuffer('''
- SELECT DISTINCT a.*
- FROM "Articoli" a
- JOIN "Listini_articolo" la ON la."idArticolo" = a."idArticolo"
- JOIN "Listini" l ON l."idListino" = la."idListino"
- WHERE la."attivo" = 1
- AND la."validoDa" <= ?
- AND la."validoA" >= ?
- AND l."codListino" NOT IN ('OF2', 'OF4', 'I0')
- ''');
- final variables = <Variable>[
- Variable.withString(dataOrdine),
- Variable.withString(dataOrdine),
- ];
- if (words.isNotEmpty) {
- buffer.write(' AND (');
- final filters = <String>[];
- for (final word in words) {
- filters.add(
- '(a."codArticolo" LIKE ? OR a."descrizione" LIKE ? OR a."ean" LIKE ?)',
- );
- final pattern = '%$word%';
- variables.addAll([
- Variable.withString(pattern),
- Variable.withString(pattern),
- Variable.withString(pattern),
- ]);
- }
- buffer.write(filters.join(' AND '));
- buffer.write(')');
- }
- buffer.write(' ORDER BY a."descrizione" ASC');
- final rows = await db
- .customSelect(
- buffer.toString(),
- variables: variables,
- )
- .get();
- return rows.map((row) => Articolo.fromJson(row.data)).toList();
- }
- Future<List<Listino>> getListiniArticoloValidi(
- int idArticolo,
- String dataOrdine,
- ) {
- final sql = "select distinct l.* from Listini l "
- "join Listini_articolo la on la.idListino = l.idListino "
- "where la.idArticolo = ? and la.attivo = 1 and "
- "la.validoDa <= ? and la.validoA >= ? and "
- "l.codListino not in ('OF2', 'OF4', 'I0') "
- " order by l.codListino";
- final rows = db.customSelect(
- sql,
- variables: [
- Variable.withInt(idArticolo),
- Variable.withString(dataOrdine),
- Variable.withString(dataOrdine),
- ],
- );
- return rows.map((row) => Listino.fromJson(row.data)).get();
- /*
- return (db.select(
- db.listiniArticolo,
- )..where(
- (t) =>
- t.idArticolo.equals(idArticolo) &
- t.attivo.equals(1) &
- t.validoDa.isSmallerOrEqualValue(dataOrdine) &
- t.validoA.isBiggerOrEqualValue(dataOrdine),
- ))
- .get();
- */
- }
- Future<List<Articolo>> getArticoliPerListinoCliente(
- int idCliente,
- String dataOrdine,
- ) async {
- final lcRows = await (db.select(db.listiniCliente)
- ..where(
- (t) =>
- t.idCliente.equals(idCliente) &
- t.attivo.equals(1) &
- t.annullato.equals('N') &
- t.validoDa.isSmallerOrEqualValue(dataOrdine) &
- t.validoA.isBiggerOrEqualValue(dataOrdine),
- ))
- .get();
- final validIds =
- lcRows.map((r) => r.idArticolo).whereType<int>().toSet().toList();
- if (validIds.isEmpty) return [];
- return (db.select(db.articoli)
- ..where(
- (t) => t.idArticolo.isIn(validIds) & t.attivo.equals(1),
- )
- ..orderBy([(t) => OrderingTerm(expression: t.descrizione)]))
- .get();
- }
- Future<List<ListinoCliente>> getListiniClienteValidi(
- int idCliente,
- int idArticolo,
- String dataOrdine,
- ) {
- return (db.select(db.listiniCliente)
- ..where(
- (t) =>
- t.idCliente.equals(idCliente) &
- t.idArticolo.equals(idArticolo) &
- t.attivo.equals(1) &
- t.annullato.equals('N') &
- t.validoDa.isSmallerOrEqualValue(dataOrdine) &
- t.validoA.isBiggerOrEqualValue(dataOrdine),
- ))
- .get();
- }
- }
|