import 'package:drift/drift.dart'; import '../database.dart'; class ClientiDao { final AppDatabase db; ClientiDao(this.db); Future getById(int id) { return (db.select(db.clienti)..where((t) => t.idCliente.equals(id))).getSingleOrNull(); } Future getByCode(int idAgente, String code) { return (db.select(db.clienti) ..join([ innerJoin(db.clientiAgente, db.clientiAgente.idCliente.equalsExp(db.clienti.idCliente) & db.clientiAgente.idAgente.equals(idAgente)), ]) ..where((t) => t.codCliente.equals(code)) ).getSingleOrNull(); } Future getByRemoteId(int idAgente, int remoteId) { return (db.select(db.clienti) ..join([ innerJoin(db.clientiAgente, db.clientiAgente.idCliente.equalsExp(db.clienti.idCliente) & db.clientiAgente.idAgente.equals(idAgente)), ]) ..where((t) => t.idClienteRemoto.equals(remoteId)) ).getSingleOrNull(); } Future> getClienti(int idAgente, String filter) async { final words = filter.split(' ').where((w) => w.isNotEmpty).toList(); final q = db.select(db.clienti) ..join([ innerJoin(db.clientiAgente, db.clientiAgente.idCliente.equalsExp(db.clienti.idCliente) & db.clientiAgente.idAgente.equals(idAgente)), ]) ..limit(200); if (words.isNotEmpty) { for (final word in words) { final pattern = '%$word%'; q.where((t) => t.codCliente.like(pattern) | t.ragioneSociale.like(pattern) | t.partitaIva.like(pattern) ); } } return q.get(); } Future> getActiveClients(int idAgente) { return (db.select(db.clienti) ..join([ innerJoin(db.clientiAgente, db.clientiAgente.idCliente.equalsExp(db.clienti.idCliente) & db.clientiAgente.idAgente.equals(idAgente)), ]) ..where((t) => t.attivo.equals(1)) ..orderBy([(t) => OrderingTerm(expression: t.ragioneSociale)]) ).get(); } Future> topCustomers(int limit) async { return (db.select(db.topCustomer)..limit(limit)).get(); } Future> getNewCustomers(int idAgente) { return (db.select(db.clienti) ..join([ innerJoin(db.clientiAgente, db.clientiAgente.idCliente.equalsExp(db.clienti.idCliente) & db.clientiAgente.idAgente.equals(idAgente)), ]) ..where((t) => t.stato.equals('N')) ).get(); } Future countNewCustomers() async { final rows = await (db.select(db.clienti)..where((t) => t.stato.equals('N'))).get(); return rows.length; } Future> inactiveCustomers(int idAgente, String sinceDate) async { final recentIds = await (db.select(db.ordini) ..where((t) => t.idCliente.isNotNull()) ).get().then((orders) => orders.map((o) => o.idCliente!).toSet()); return (db.select(db.clienti) ..join([ innerJoin(db.clientiAgente, db.clientiAgente.idCliente.equalsExp(db.clienti.idCliente) & db.clientiAgente.idAgente.equals(idAgente)), ]) ..where((t) => t.idCliente.isNotIn(recentIds)) ).get(); } Future countCustomersToSend() async { final rows = await (db.select(db.clienti)..where((t) => t.stato.equals('N'))).get(); return rows.length; } Future countCustomersToSendForAgent(int idAgente) async { final rows = await (db.select(db.clienti) ..join([ innerJoin(db.clientiAgente, db.clientiAgente.idCliente.equalsExp(db.clienti.idCliente) & db.clientiAgente.idAgente.equals(idAgente)), ]) ..where((t) => t.stato.equals('N')) ).get(); return rows.length; } Future markAsSent(int idCliente, int idAssegnato) { return (db.update(db.clienti)..where((t) => t.idCliente.equals(idCliente))) .write(ClientiCompanion(stato: const Value('T'))); } }