database.dart 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import 'package:drift/drift.dart';
  2. import 'package:ristoris/core/constants.dart';
  3. import 'db_connector.dart';
  4. import 'tables/agenti.dart';
  5. import 'tables/articoli.dart';
  6. import 'tables/clienti.dart';
  7. import 'tables/ordini.dart';
  8. import 'tables/righe_ordine.dart';
  9. import 'tables/filiali.dart';
  10. import 'tables/listini.dart';
  11. import 'tables/listini_articolo.dart';
  12. import 'tables/listini_cliente.dart';
  13. import 'tables/sconti.dart';
  14. import 'tables/sconti_cliente.dart';
  15. import 'tables/pagamenti.dart';
  16. import 'tables/parametri.dart';
  17. import 'tables/tabelle.dart';
  18. import 'tables/promozioni.dart';
  19. import 'tables/promo_articoli.dart';
  20. import 'tables/promo_listini.dart';
  21. import 'tables/promo_omaggi.dart';
  22. import 'tables/clienti_agente.dart';
  23. import 'tables/scadenze.dart';
  24. import 'tables/statistiche_vendita.dart';
  25. import 'views/articoli_con_promo.dart';
  26. import 'views/ordini_senza_righe.dart';
  27. import 'views/top_item.dart';
  28. import 'views/top_customer.dart';
  29. import 'views/v_ordini.dart';
  30. part 'database.g.dart';
  31. @DriftDatabase(
  32. tables: [
  33. Agenti,
  34. Articoli,
  35. Clienti,
  36. Ordini,
  37. RigheOrdine,
  38. Filiali,
  39. Listini,
  40. ListiniArticolo,
  41. ListiniCliente,
  42. Sconti,
  43. ScontiCliente,
  44. Pagamenti,
  45. Parametri,
  46. Tabelle,
  47. Promozioni,
  48. PromoArticoli,
  49. PromoListini,
  50. PromoOmaggi,
  51. ClientiAgente,
  52. Scadenze,
  53. StatisticheVendita,
  54. ArticoliConPromo,
  55. OrdiniSenzaRighe,
  56. TopItem,
  57. TopCustomer,
  58. VOrdini,
  59. ],
  60. )
  61. class AppDatabase extends _$AppDatabase {
  62. AppDatabase() : super(_createDatabase());
  63. static String? _dbDirPath;
  64. static QueryExecutor _createDatabase() {
  65. return createDb(_dbDirPath ?? '', AppConstants.kDbName);
  66. }
  67. static Future<void> ensureDatabaseReady() async {
  68. _dbDirPath = await ensureDbReady();
  69. }
  70. static Future<bool> isDbEmpty() async {
  71. return isDatabaseEmpty(_dbDirPath ?? '');
  72. }
  73. @override
  74. int get schemaVersion => 9;
  75. @override
  76. MigrationStrategy get migration => MigrationStrategy(
  77. onCreate: (m) async {
  78. await m.createAll();
  79. },
  80. onUpgrade: (m, from, to) async {
  81. if (from < 2) {
  82. await m.addColumn(
  83. statisticheVendita,
  84. statisticheVendita.codStatistiche,
  85. );
  86. }
  87. if (from < 3) {
  88. await customStatement(
  89. 'CREATE INDEX IF NOT EXISTS ndx_ro_idordine ON Righe_ordine(idOrdine)',
  90. );
  91. }
  92. if (from < 4) {
  93. await customStatement(
  94. 'CREATE INDEX IF NOT EXISTS NDX_FILIALE_REMOTO ON Filiali(idFilialeRemoto)',
  95. );
  96. await customStatement(
  97. 'CREATE INDEX IF NOT EXISTS NDX_CLI_COD ON Clienti(codCliente)',
  98. );
  99. await customStatement(
  100. 'CREATE INDEX IF NOT EXISTS NDX_CLI_REMOTO ON Clienti(idClienteRemoto)',
  101. );
  102. await customStatement(
  103. 'CREATE INDEX IF NOT EXISTS NDX_idOrdine_SEDE ON Ordini(idOrdineSede)',
  104. );
  105. }
  106. if (from < 5) {
  107. await customStatement(
  108. 'CREATE INDEX IF NOT EXISTS NDX_NUMERO_ORDINE ON Ordini(numeroOrdine)',
  109. );
  110. }
  111. if (from < 6) {
  112. await customStatement(
  113. 'CREATE INDEX IF NOT EXISTS NDX_filiali_cliente ON Filiali(idCliente)',
  114. );
  115. }
  116. if (from < 7) {
  117. await customStatement(
  118. 'CREATE INDEX IF NOT EXISTS ndx_stat_cliart ON Statistiche_vendita(idCliente, idArticolo)',
  119. );
  120. await customStatement(
  121. 'CREATE INDEX IF NOT EXISTS ndx_righeOrdine_promo ON Righe_ordine(idOrdine, rigaPromozione)',
  122. );
  123. }
  124. if (from < 8) {
  125. await customStatement('DROP VIEW IF EXISTS v_ordini');
  126. await customStatement('''
  127. CREATE VIEW v_ordini AS
  128. SELECT
  129. a.codAgente,
  130. c.codCliente,
  131. c.ragioneSociale,
  132. f.codFiliale,
  133. f.descrizione Filiale,
  134. CASE WHEN o.idFiliale IS NOT NULL THEN f.indirizzo ELSE c.indirizzo END AS indirizzo,
  135. CASE WHEN o.idFiliale IS NOT NULL THEN f.citta ELSE c.citta END AS citta,
  136. CASE WHEN o.idFiliale IS NOT NULL THEN f.provincia ELSE c.provincia END AS provincia,
  137. CASE WHEN o.idFiliale IS NOT NULL THEN f.cap ELSE c.cap END AS cap,
  138. o.*,
  139. (SELECT SUM(ro.totale) FROM Righe_ordine ro WHERE ro.idOrdine = o.idOrdine) AS totale
  140. FROM Ordini o
  141. JOIN Clienti c ON c.idCliente = o.idCliente
  142. LEFT JOIN Filiali f ON f.idFiliale = o.idFiliale
  143. JOIN Agenti a ON a.idAgente = o.idAgente
  144. ''');
  145. }
  146. if (from < 9) {
  147. await m.addColumn(clienti, clienti.creditScoreColor);
  148. await m.addColumn(clienti, clienti.dataCreditScore);
  149. }
  150. },
  151. );
  152. }