database.dart 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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. import 'views/v_righe_ordine.dart';
  31. part 'database.g.dart';
  32. @DriftDatabase(
  33. tables: [
  34. Agenti,
  35. Articoli,
  36. Clienti,
  37. Ordini,
  38. RigheOrdine,
  39. Filiali,
  40. Listini,
  41. ListiniArticolo,
  42. ListiniCliente,
  43. Sconti,
  44. ScontiCliente,
  45. Pagamenti,
  46. Parametri,
  47. Tabelle,
  48. Promozioni,
  49. PromoArticoli,
  50. PromoListini,
  51. PromoOmaggi,
  52. ClientiAgente,
  53. Scadenze,
  54. StatisticheVendita,
  55. ArticoliConPromo,
  56. OrdiniSenzaRighe,
  57. TopItem,
  58. TopCustomer,
  59. VOrdini,
  60. VRigheOrdine,
  61. ],
  62. )
  63. class AppDatabase extends _$AppDatabase {
  64. AppDatabase() : super(_createDatabase());
  65. static String? _dbDirPath;
  66. static QueryExecutor _createDatabase() {
  67. return createDb(_dbDirPath ?? '', AppConstants.kDbName);
  68. }
  69. static Future<void> ensureDatabaseReady() async {
  70. _dbDirPath = await ensureDbReady();
  71. }
  72. static Future<bool> isDbEmpty() async {
  73. return isDatabaseEmpty(_dbDirPath ?? '');
  74. }
  75. @override
  76. int get schemaVersion => 9;
  77. @override
  78. MigrationStrategy get migration => MigrationStrategy(
  79. onCreate: (m) async {
  80. await m.createAll();
  81. },
  82. onUpgrade: (m, from, to) async {
  83. if (from < 2) {
  84. await m.addColumn(
  85. statisticheVendita,
  86. statisticheVendita.codStatistiche,
  87. );
  88. }
  89. if (from < 3) {
  90. await customStatement(
  91. 'CREATE INDEX IF NOT EXISTS ndx_ro_idordine ON Righe_ordine(idOrdine)',
  92. );
  93. }
  94. if (from < 4) {
  95. await customStatement(
  96. 'CREATE INDEX IF NOT EXISTS NDX_FILIALE_REMOTO ON Filiali(idFilialeRemoto)',
  97. );
  98. await customStatement(
  99. 'CREATE INDEX IF NOT EXISTS NDX_CLI_COD ON Clienti(codCliente)',
  100. );
  101. await customStatement(
  102. 'CREATE INDEX IF NOT EXISTS NDX_CLI_REMOTO ON Clienti(idClienteRemoto)',
  103. );
  104. await customStatement(
  105. 'CREATE INDEX IF NOT EXISTS NDX_idOrdine_SEDE ON Ordini(idOrdineSede)',
  106. );
  107. }
  108. if (from < 5) {
  109. await customStatement(
  110. 'CREATE INDEX IF NOT EXISTS NDX_NUMERO_ORDINE ON Ordini(numeroOrdine)',
  111. );
  112. }
  113. if (from < 6) {
  114. await customStatement(
  115. 'CREATE INDEX IF NOT EXISTS NDX_filiali_cliente ON Filiali(idCliente)',
  116. );
  117. }
  118. if (from < 7) {
  119. await customStatement(
  120. 'CREATE INDEX IF NOT EXISTS ndx_stat_cliart ON Statistiche_vendita(idCliente, idArticolo)',
  121. );
  122. await customStatement(
  123. 'CREATE INDEX IF NOT EXISTS ndx_righeOrdine_promo ON Righe_ordine(idOrdine, rigaPromozione)',
  124. );
  125. }
  126. if (from < 8) {
  127. await customStatement('DROP VIEW IF EXISTS v_ordini');
  128. await customStatement('''
  129. CREATE VIEW v_ordini AS
  130. SELECT
  131. a.codAgente,
  132. c.codCliente,
  133. c.ragioneSociale,
  134. f.codFiliale,
  135. f.descrizione Filiale,
  136. CASE WHEN o.idFiliale IS NOT NULL THEN f.indirizzo ELSE c.indirizzo END AS indirizzo,
  137. CASE WHEN o.idFiliale IS NOT NULL THEN f.citta ELSE c.citta END AS citta,
  138. CASE WHEN o.idFiliale IS NOT NULL THEN f.provincia ELSE c.provincia END AS provincia,
  139. CASE WHEN o.idFiliale IS NOT NULL THEN f.cap ELSE c.cap END AS cap,
  140. o.*,
  141. (SELECT SUM(ro.totale) FROM Righe_ordine ro WHERE ro.idOrdine = o.idOrdine) AS totale
  142. FROM Ordini o
  143. JOIN Clienti c ON c.idCliente = o.idCliente
  144. LEFT JOIN Filiali f ON f.idFiliale = o.idFiliale
  145. JOIN Agenti a ON a.idAgente = o.idAgente
  146. ''');
  147. await customStatement('DROP VIEW IF EXISTS v_righe_ordine');
  148. await customStatement('''
  149. CREATE VIEW v_righe_ordine AS
  150. SELECT ro.*, a.codArticolo, a.descrizione, l.codListino, l.descrizione AS Listino
  151. FROM Righe_ordine ro
  152. JOIN Articoli a ON a.idArticolo = ro.idArticolo
  153. LEFT JOIN Listini l ON l.idListino = ro.idListino
  154. ''');
  155. }
  156. if (from < 9) {
  157. await m.addColumn(clienti, clienti.creditScoreColor);
  158. await m.addColumn(clienti, clienti.dataCreditScore);
  159. }
  160. },
  161. );
  162. }