import 'package:drift/drift.dart'; import '../database.dart'; class OrdiniDao { final AppDatabase db; OrdiniDao(this.db); Future getById(int id) { return (db.select( db.ordini, )..where((t) => t.idOrdine.equals(id))) .getSingleOrNull(); } Future getByNumber(int numeroOrdine) { return (db.select( db.ordini, )..where((t) => t.numeroOrdine.equals(numeroOrdine))) .getSingleOrNull(); } Future> customerOrders(int idCliente, bool includeReferences) { return (db.select(db.ordini) ..where((t) => t.idCliente.equals(idCliente)) ..orderBy([ (t) => OrderingTerm(expression: t.dataOrdine, mode: OrderingMode.desc), ]) ..limit(200)) .get(); } Future> getLastOrders(int idAgente, int max) { return (db.select(db.ordini) ..where((t) => t.idAgente.equals(idAgente)) ..orderBy([ (t) => OrderingTerm(expression: t.dataOrdine, mode: OrderingMode.desc), ]) ..limit(max)) .get(); } Future> getOrdersView(int idAgente, {int limit = 200}) { return (db.select(db.vOrdini) ..where((t) => t.idAgente.equals(idAgente)) ..orderBy([ (t) => OrderingTerm(expression: t.dataOrdine, mode: OrderingMode.desc), ]) ..limit(limit)) .get(); } Future> searchOrdersView( int idAgente, String filter, ) async { final words = filter.split(' ').where((w) => w.isNotEmpty).toList(); final patterns = words.map((w) => '%$w%').toList(); final query = db.select(db.vOrdini) ..where((t) => t.idAgente.equals(idAgente)) ..orderBy([ (t) => OrderingTerm(expression: t.dataOrdine, mode: OrderingMode.desc), ]); for (final p in patterns) { query.where( (t) => t.ragioneSociale.like(p) | t.filiale.like(p) | t.indirizzo.like(p) | t.citta.like(p) | CustomExpression('CAST(numeroOrdine AS TEXT)').like(p), ); } return query.get(); } Future countNewOrdersForAgent(int idAgente) async { final rows = await (db.select( db.vOrdini, )..where((t) => t.idAgente.equals(idAgente) & t.stato.equals('N'))) .get(); return rows.length; } Future countOrdersForAgent(int idAgente) async { final rows = await (db.select( db.vOrdini, )..where((t) => t.idAgente.equals(idAgente))) .get(); return rows.length; } Future getMonthlyVolume(int idAgente) async { final now = DateTime.now(); final firstOfMonth = DateTime(now.year, now.month, 1); final dateStr = '${firstOfMonth.year.toString().padLeft(4, '0')}-' '${firstOfMonth.month.toString().padLeft(2, '0')}-01'; final rows = await (db.select(db.vOrdini) ..where( (t) => t.idAgente.equals(idAgente) & t.dataOrdine.isNotNull() & t.dataOrdine.isBiggerOrEqualValue(dateStr), )) .get(); return rows.fold(0, (sum, r) => sum + (r.totale ?? 0)); } Future countNewOrders() async { final rows = await (db.select( db.ordini, )..where((t) => t.stato.equals('N'))) .get(); return rows.length; } Future countOrdersOnHold() async { final rows = await (db.select( db.ordini, )..where((t) => t.stato.equals('H'))) .get(); return rows.length; } Future> getNewOrders() { return (db.select(db.ordini)..where((t) => t.stato.equals('N'))).get(); } Future> getUnsentOrders(int max) { return (db.select(db.ordini) ..where((t) => t.stato.equals('N') | t.stato.equals('H')) ..limit(max)) .get(); } Future generaNumeroOrdine(int idAgente) async { final result = await (db.select(db.ordini) ..where((t) => t.idAgente.equals(idAgente)) ..orderBy([ (t) => OrderingTerm( expression: t.numeroOrdine, mode: OrderingMode.desc, ), ]) ..limit(1)) .getSingleOrNull(); return (result?.numeroOrdine ?? 0) + 1; } Future markAsSent(int idOrdine, int idAssegnato) { return (db.update(db.ordini)..where((t) => t.idOrdine.equals(idOrdine))) .write(OrdiniCompanion(stato: const Value('T'))); } Future markAsSentStatus(int idOrdine) { return (db.update(db.ordini)..where((t) => t.idOrdine.equals(idOrdine))) .write(OrdiniCompanion(stato: const Value('T'))); } Future insertOrder(Ordine order) { return db.into(db.ordini).insert( order.toCompanion(true).copyWith(idOrdine: const Value.absent())); } Future updateOrder(Ordine order) { return db.update(db.ordini).replace(order); } Future deleteOrder(int idOrdine) { return (db.delete( db.ordini, )..where((t) => t.idOrdine.equals(idOrdine))) .go(); } Future insertOrderLine(RigaOrdine line) { return db.into(db.righeOrdine).insert(line.toCompanion(true).copyWith( idRigaOrdine: const Value.absent(), )); } Future updateOrderLine(RigaOrdine line) { return db.update(db.righeOrdine).replace(line.toCompanion(true).copyWith( idRigaOrdine: const Value.absent(), )); } Future> getOrderLines(int idOrdine) { return (db.select( db.righeOrdine, )..where((t) => t.idOrdine.equals(idOrdine))) .get(); } Future deleteOrderLine(int idRigaOrdine) { return (db.delete( db.righeOrdine, )..where((t) => t.idRigaOrdine.equals(idRigaOrdine))) .go(); } Future zapOrderLines(int idOrdine) { return (db.delete( db.righeOrdine, )..where((t) => t.idOrdine.equals(idOrdine))) .go(); } Future findByNumeroOrdineSede(String numSede) { return (db.select( db.ordini, )..where((t) => t.numeroOrdineSede.equals(numSede))) .getSingleOrNull(); } Future findByIdOrdineSede(int idSede) { return (db.select( db.ordini, )..where((t) => t.idOrdineSede.equals(idSede))) .getSingleOrNull(); } Future totalAmountItems(int idOrdine) async { final lines = await (db.select(db.righeOrdine) ..where( (t) => t.idOrdine.equals(idOrdine) & (t.rigaPromozione.equals(0) | t.rigaPromozione.isNull()), )) .get(); return lines.fold(0.0, (sum, l) => sum + (l.totale ?? 0.0)); } Future totalQtyItems(int idOrdine) async { final lines = await (db.select(db.righeOrdine) ..where( (t) => t.idOrdine.equals(idOrdine) & (t.rigaPromozione.equals(0) | t.rigaPromozione.isNull()), )) .get(); return lines.fold(0.0, (sum, l) => sum + (l.quantita ?? 0.0)); } }