database.dart 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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. Future<void> _renameColumn(
  78. String table,
  79. String oldName,
  80. String newName,
  81. ) async {
  82. try {
  83. await customStatement(
  84. 'ALTER TABLE $table RENAME COLUMN $oldName TO $newName',
  85. );
  86. } catch (_) {
  87. // Column might already be renamed or not exist
  88. }
  89. }
  90. @override
  91. int get schemaVersion => 12;
  92. @override
  93. MigrationStrategy get migration => MigrationStrategy(
  94. onCreate: (m) async {
  95. await m.createAll();
  96. },
  97. onUpgrade: (m, from, to) async {
  98. if (from < 2) {
  99. await m.addColumn(
  100. statisticheVendita,
  101. statisticheVendita.codStatistiche,
  102. );
  103. }
  104. if (from < 3) {
  105. await customStatement(
  106. 'CREATE INDEX IF NOT EXISTS ndx_ro_idordine ON Righe_ordine(idOrdine)',
  107. );
  108. }
  109. if (from < 4) {
  110. await customStatement(
  111. 'CREATE INDEX IF NOT EXISTS NDX_FILIALE_REMOTO ON Filiali(idFilialeRemoto)',
  112. );
  113. await customStatement(
  114. 'CREATE INDEX IF NOT EXISTS NDX_CLI_COD ON Clienti(codCliente)',
  115. );
  116. await customStatement(
  117. 'CREATE INDEX IF NOT EXISTS NDX_CLI_REMOTO ON Clienti(idClienteRemoto)',
  118. );
  119. await customStatement(
  120. 'CREATE INDEX IF NOT EXISTS NDX_idOrdine_SEDE ON Ordini(idOrdineSede)',
  121. );
  122. }
  123. if (from < 5) {
  124. await customStatement(
  125. 'CREATE INDEX IF NOT EXISTS NDX_NUMERO_ORDINE ON Ordini(numeroOrdine)',
  126. );
  127. }
  128. if (from < 6) {
  129. await customStatement(
  130. 'CREATE INDEX IF NOT EXISTS NDX_filiali_cliente ON Filiali(idCliente)',
  131. );
  132. }
  133. if (from < 7) {
  134. await customStatement(
  135. 'CREATE INDEX IF NOT EXISTS ndx_stat_cliart ON Statistiche_vendita(idCliente, idArticolo)',
  136. );
  137. await customStatement(
  138. 'CREATE INDEX IF NOT EXISTS ndx_righeOrdine_promo ON Righe_ordine(idOrdine, rigaPromozione)',
  139. );
  140. }
  141. if (from < 8) {
  142. await customStatement('DROP VIEW IF EXISTS v_ordini');
  143. await customStatement('''
  144. CREATE VIEW v_ordini AS
  145. SELECT
  146. a.codAgente,
  147. c.codCliente,
  148. c.ragioneSociale,
  149. f.codFiliale,
  150. f.descrizione Filiale,
  151. CASE WHEN o.idFiliale IS NOT NULL THEN f.indirizzo ELSE c.indirizzo END AS indirizzo,
  152. CASE WHEN o.idFiliale IS NOT NULL THEN f.citta ELSE c.citta END AS citta,
  153. CASE WHEN o.idFiliale IS NOT NULL THEN f.provincia ELSE c.provincia END AS provincia,
  154. CASE WHEN o.idFiliale IS NOT NULL THEN f.cap ELSE c.cap END AS cap,
  155. o.*,
  156. (SELECT SUM(ro.totale) FROM Righe_ordine ro WHERE ro.idOrdine = o.idOrdine) AS totale
  157. FROM Ordini o
  158. JOIN Clienti c ON c.idCliente = o.idCliente
  159. LEFT JOIN Filiali f ON f.idFiliale = o.idFiliale
  160. JOIN Agenti a ON a.idAgente = o.idAgente
  161. ''');
  162. await customStatement('DROP VIEW IF EXISTS v_righe_ordine');
  163. await customStatement('''
  164. CREATE VIEW v_righe_ordine AS
  165. SELECT ro.*, a.codArticolo, a.descrizione, l.codListino, l.descrizione AS Listino
  166. FROM Righe_ordine ro
  167. JOIN Articoli a ON a.idArticolo = ro.idArticolo
  168. LEFT JOIN Listini l ON l.idListino = ro.idListino
  169. ''');
  170. }
  171. if (from < 9) {
  172. await m.addColumn(clienti, clienti.creditScoreColor);
  173. await m.addColumn(clienti, clienti.dataCreditScore);
  174. }
  175. if (from < 10) {
  176. // await m.addColumn(listini, listini.listinoAgente);
  177. }
  178. if (from < 11) {
  179. await customStatement('DROP VIEW IF EXISTS v_scadenze');
  180. await customStatement('''
  181. CREATE VIEW v_scadenze AS
  182. SELECT s.*, c.codCliente, c.ragioneSociale
  183. FROM Scadenze s
  184. LEFT JOIN Clienti c ON c.idCliente = s.idCliente
  185. ''');
  186. }
  187. if (from < 12) {
  188. await _renameColumn('Agenti', 'CodAgente', 'codAgente');
  189. await _renameColumn('Agenti', 'Pwd', 'pwd');
  190. await _renameColumn('Promozioni', 'TipoPromozione', 'tipoPromozione');
  191. await _renameColumn('Promozioni', 'Descrizione', 'descrizione');
  192. await _renameColumn('Promozioni', 'DataInizio', 'dataInizio');
  193. await _renameColumn('Promozioni', 'DataFine', 'dataFine');
  194. await _renameColumn('Promozioni', 'LimiteQta', 'limiteQta');
  195. await _renameColumn('Promozioni', 'QuantitaOmaggio', 'quantitaOmaggio');
  196. await _renameColumn('Promozioni', 'LimiteImporto', 'limiteImporto');
  197. await _renameColumn('Promozioni', 'Stato', 'stato');
  198. await _renameColumn('Promozioni', 'Priorita', 'priorita');
  199. await _renameColumn('PromoArticoli', 'QuantitaOmaggio', 'quantitaOmaggio');
  200. await _renameColumn('PromoOmaggi', 'Riga', 'riga');
  201. await _renameColumn('PromoOmaggi', 'Quantita', 'quantita');
  202. await _renameColumn('Listini_cliente', 'ValidoDa', 'validoDa');
  203. await _renameColumn('Listini_cliente', 'ValidoA', 'validoA');
  204. await _renameColumn('Listini_cliente', 'Prezzo', 'prezzo');
  205. await _renameColumn('Listini_cliente', 'Annullato', 'annullato');
  206. await _renameColumn('Clienti_Agente', 'Attivo', 'attivo');
  207. await _renameColumn('Clienti', 'partitaIVA', 'partitaIva');
  208. await _renameColumn('Clienti', 'Pod', 'pod');
  209. }
  210. },
  211. );
  212. }