clienti_dao.dart 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import 'package:drift/drift.dart';
  2. import '../database.dart';
  3. class ClientiDao {
  4. final AppDatabase db;
  5. ClientiDao(this.db);
  6. Future<Cliente?> getById(int id) {
  7. return (db.select(db.clienti)..where((t) => t.idCliente.equals(id))).getSingleOrNull();
  8. }
  9. Future<Cliente?> getByCode(int idAgente, String code) {
  10. return (db.select(db.clienti)
  11. ..join([
  12. innerJoin(db.clientiAgente, db.clientiAgente.idCliente.equalsExp(db.clienti.idCliente) & db.clientiAgente.idAgente.equals(idAgente)),
  13. ])
  14. ..where((t) => t.codCliente.equals(code))
  15. ).getSingleOrNull();
  16. }
  17. Future<Cliente?> getByRemoteId(int idAgente, int remoteId) {
  18. return (db.select(db.clienti)
  19. ..join([
  20. innerJoin(db.clientiAgente, db.clientiAgente.idCliente.equalsExp(db.clienti.idCliente) & db.clientiAgente.idAgente.equals(idAgente)),
  21. ])
  22. ..where((t) => t.idClienteRemoto.equals(remoteId))
  23. ).getSingleOrNull();
  24. }
  25. Future<List<Cliente>> getClienti(int idAgente, String filter) async {
  26. final words = filter.split(' ').where((w) => w.isNotEmpty).toList();
  27. final q = db.select(db.clienti)
  28. ..join([
  29. innerJoin(db.clientiAgente, db.clientiAgente.idCliente.equalsExp(db.clienti.idCliente) & db.clientiAgente.idAgente.equals(idAgente)),
  30. ])
  31. ..limit(200);
  32. if (words.isNotEmpty) {
  33. for (final word in words) {
  34. final pattern = '%$word%';
  35. q.where((t) =>
  36. t.codCliente.like(pattern) |
  37. t.ragioneSociale.like(pattern) |
  38. t.partitaIva.like(pattern)
  39. );
  40. }
  41. }
  42. return q.get();
  43. }
  44. Future<List<Cliente>> getActiveClients(int idAgente) {
  45. return (db.select(db.clienti)
  46. ..join([
  47. innerJoin(db.clientiAgente, db.clientiAgente.idCliente.equalsExp(db.clienti.idCliente) & db.clientiAgente.idAgente.equals(idAgente)),
  48. ])
  49. ..where((t) => t.attivo.equals(1))
  50. ..orderBy([(t) => OrderingTerm(expression: t.ragioneSociale)])
  51. ).get();
  52. }
  53. Future<List<TopCustomerData>> topCustomers(int limit) async {
  54. return (db.select(db.topCustomer)..limit(limit)).get();
  55. }
  56. Future<List<Cliente>> getNewCustomers(int idAgente) {
  57. return (db.select(db.clienti)
  58. ..join([
  59. innerJoin(db.clientiAgente, db.clientiAgente.idCliente.equalsExp(db.clienti.idCliente) & db.clientiAgente.idAgente.equals(idAgente)),
  60. ])
  61. ..where((t) => t.stato.equals('N'))
  62. ).get();
  63. }
  64. Future<int> countNewCustomers() async {
  65. final rows = await (db.select(db.clienti)..where((t) => t.stato.equals('N'))).get();
  66. return rows.length;
  67. }
  68. Future<List<Cliente>> inactiveCustomers(int idAgente, String sinceDate) async {
  69. final recentIds = await (db.select(db.ordini)
  70. ..where((t) => t.idCliente.isNotNull())
  71. ).get().then((orders) => orders.map((o) => o.idCliente!).toSet());
  72. return (db.select(db.clienti)
  73. ..join([
  74. innerJoin(db.clientiAgente, db.clientiAgente.idCliente.equalsExp(db.clienti.idCliente) & db.clientiAgente.idAgente.equals(idAgente)),
  75. ])
  76. ..where((t) => t.idCliente.isNotIn(recentIds))
  77. ).get();
  78. }
  79. Future<int> countCustomersToSend() async {
  80. final rows = await (db.select(db.clienti)..where((t) => t.stato.equals('N'))).get();
  81. return rows.length;
  82. }
  83. Future<int> countCustomersToSendForAgent(int idAgente) async {
  84. final rows = await (db.select(db.clienti)
  85. ..join([
  86. innerJoin(db.clientiAgente, db.clientiAgente.idCliente.equalsExp(db.clienti.idCliente) & db.clientiAgente.idAgente.equals(idAgente)),
  87. ])
  88. ..where((t) => t.stato.equals('N'))
  89. ).get();
  90. return rows.length;
  91. }
  92. Future<void> markAsSent(int idCliente, int idAssegnato) {
  93. return (db.update(db.clienti)..where((t) => t.idCliente.equals(idCliente)))
  94. .write(ClientiCompanion(stato: const Value('T')));
  95. }
  96. }