database.dart 5.7 KB

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