Skip to content

Commit 6abc456

Browse files
Merge pull request #374 from lucaantonelli/main
Fix: CountNetWorth and Main Account removal correct handling
2 parents 6a000da + 70d842d commit 6abc456

File tree

12 files changed

+376
-183
lines changed

12 files changed

+376
-183
lines changed

lib/custom_widgets/transactions_list.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@ class TransactionsList extends StatefulWidget {
1616
const TransactionsList({
1717
super.key,
1818
required this.transactions,
19+
this.margin = const EdgeInsets.symmetric(horizontal: 16),
1920
this.padding,
2021
});
2122

2223
final List<Transaction> transactions;
24+
final EdgeInsetsGeometry? margin;
2325
final EdgeInsetsGeometry? padding;
2426

2527
@override
@@ -62,6 +64,7 @@ class _TransactionsListState extends State<TransactionsList> with Functions {
6264
Widget build(BuildContext context) {
6365
return transactions.isNotEmpty
6466
? DefaultContainer(
67+
margin: widget.margin,
6568
child: ListView.separated(
6669
physics: const NeverScrollableScrollPhysics(),
6770
padding: widget.padding,
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import 'package:sqflite/sqflite.dart';
2+
import '../migration_base.dart';
3+
4+
// Models
5+
import '/model/bank_account.dart';
6+
7+
class AccountNetWorth extends Migration {
8+
AccountNetWorth() : super(
9+
version: 2,
10+
description: 'Add account net worth column'
11+
);
12+
13+
@override
14+
Future<void> up(Database db) async {
15+
const integerNotNull = 'INTEGER NOT NULL';
16+
17+
// Bank accounts Table
18+
await db.execute('''
19+
ALTER TABLE `$bankAccountTable` ADD COLUMN `${BankAccountFields.countNetWorth}` $integerNotNull CHECK (${BankAccountFields.countNetWorth} IN (0, 1)) DEFAULT 1;
20+
''');
21+
}
22+
}

lib/database/migrations/migration_registry.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ library;
1313

1414

1515
import '0001_initial_schema.dart';
16+
import '0002_account_net_worth.dart';
1617
import '../migration_base.dart';
1718

1819

@@ -24,7 +25,8 @@ import '../migration_base.dart';
2425
/// determines which runs first.
2526
List<Migration> getMigrations() {
2627
return [
27-
InitialSchema()
28+
InitialSchema(),
29+
AccountNetWorth(),
2830
// Add future migrations here
2931
];
3032
}

lib/database/sossoldi_database.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ class SossoldiDatabase {
351351
} catch (error) {
352352
throw Exception('DbBase.resetDatabase: $error');
353353
}
354-
await _createDB(_database!, 1);
354+
await _createDB(_database!, _migrationManager.latestVersion);
355355
}
356356

357357
Future clearDatabase() async {

lib/model/bank_account.dart

Lines changed: 62 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class BankAccountFields extends BaseEntityFields {
1414
static String color = 'color';
1515
static String startingValue = 'startingValue';
1616
static String active = 'active';
17+
static String countNetWorth = 'countNetWorth';
1718
static String mainAccount = 'mainAccount';
1819
static String total = 'total';
1920
static String createdAt = BaseEntityFields.getCreatedAt;
@@ -26,6 +27,7 @@ class BankAccountFields extends BaseEntityFields {
2627
color,
2728
startingValue,
2829
active,
30+
countNetWorth,
2931
mainAccount,
3032
BaseEntityFields.createdAt,
3133
BaseEntityFields.updatedAt
@@ -38,6 +40,7 @@ class BankAccount extends BaseEntity {
3840
final int color;
3941
final num startingValue;
4042
final bool active;
43+
final bool countNetWorth;
4144
final bool mainAccount;
4245
final num? total;
4346

@@ -48,46 +51,52 @@ class BankAccount extends BaseEntity {
4851
required this.color,
4952
required this.startingValue,
5053
required this.active,
54+
required this.countNetWorth,
5155
required this.mainAccount,
5256
this.total,
5357
super.createdAt,
5458
super.updatedAt,
5559
});
5660

57-
BankAccount copy(
58-
{int? id,
59-
String? name,
60-
String? symbol,
61-
int? color,
62-
num? startingValue,
63-
bool? active,
64-
bool? mainAccount,
65-
DateTime? createdAt,
66-
DateTime? updatedAt,}) =>
61+
BankAccount copy({
62+
int? id,
63+
String? name,
64+
String? symbol,
65+
int? color,
66+
num? startingValue,
67+
bool? active,
68+
bool? countNetWorth,
69+
bool? mainAccount,
70+
DateTime? createdAt,
71+
DateTime? updatedAt,
72+
}) =>
6773
BankAccount(
68-
id: id ?? this.id,
69-
name: name ?? this.name,
70-
symbol: symbol ?? this.symbol,
71-
color: color ?? this.color,
72-
startingValue: startingValue ?? this.startingValue,
73-
active: active ?? this.active,
74-
mainAccount: mainAccount ?? this.mainAccount,
75-
createdAt: createdAt ?? this.createdAt,
76-
updatedAt: updatedAt ?? this.updatedAt,
77-
total: total
78-
);
74+
id: id ?? this.id,
75+
name: name ?? this.name,
76+
symbol: symbol ?? this.symbol,
77+
color: color ?? this.color,
78+
startingValue: startingValue ?? this.startingValue,
79+
active: active ?? this.active,
80+
countNetWorth: countNetWorth ?? this.countNetWorth,
81+
mainAccount: mainAccount ?? this.mainAccount,
82+
createdAt: createdAt ?? this.createdAt,
83+
updatedAt: updatedAt ?? this.updatedAt,
84+
total: total,
85+
);
7986

8087
static BankAccount fromJson(Map<String, Object?> json) => BankAccount(
81-
id: json[BaseEntityFields.id] as int,
82-
name: json[BankAccountFields.name] as String,
83-
symbol: json[BankAccountFields.symbol] as String,
84-
color: json[BankAccountFields.color] as int,
85-
startingValue: json[BankAccountFields.startingValue] as num,
86-
active: json[BankAccountFields.active] == 1 ? true : false,
87-
mainAccount: json[BankAccountFields.mainAccount] == 1 ? true : false,
88-
total: json[BankAccountFields.total] as num?,
89-
createdAt: DateTime.parse(json[BaseEntityFields.createdAt] as String),
90-
updatedAt: DateTime.parse(json[BaseEntityFields.updatedAt] as String));
88+
id: json[BaseEntityFields.id] as int,
89+
name: json[BankAccountFields.name] as String,
90+
symbol: json[BankAccountFields.symbol] as String,
91+
color: json[BankAccountFields.color] as int,
92+
startingValue: json[BankAccountFields.startingValue] as num,
93+
active: json[BankAccountFields.active] == 1 ? true : false,
94+
countNetWorth: json[BankAccountFields.countNetWorth] == 1 ? true : false,
95+
mainAccount: json[BankAccountFields.mainAccount] == 1 ? true : false,
96+
total: json[BankAccountFields.total] as num?,
97+
createdAt: DateTime.parse(json[BaseEntityFields.createdAt] as String),
98+
updatedAt: DateTime.parse(json[BaseEntityFields.updatedAt] as String),
99+
);
91100

92101
Map<String, Object?> toJson({bool update = false}) => {
93102
BaseEntityFields.id: id,
@@ -96,9 +105,11 @@ class BankAccount extends BaseEntity {
96105
BankAccountFields.color: color,
97106
BankAccountFields.startingValue: startingValue,
98107
BankAccountFields.active: active ? 1 : 0,
108+
BankAccountFields.countNetWorth: countNetWorth ? 1 : 0,
99109
BankAccountFields.mainAccount: mainAccount ? 1 : 0,
100-
BaseEntityFields.createdAt:
101-
update ? createdAt?.toIso8601String() : DateTime.now().toIso8601String(),
110+
BaseEntityFields.createdAt: update
111+
? createdAt?.toIso8601String()
112+
: DateTime.now().toIso8601String(),
102113
BaseEntityFields.updatedAt: DateTime.now().toIso8601String(),
103114
};
104115
}
@@ -152,7 +163,8 @@ class BankAccountMethods extends SossoldiDatabase {
152163

153164
final orderByASC = '${BankAccountFields.createdAt} ASC';
154165
final where = '${BankAccountFields.active} = 1 ';
155-
final recurringFilter = '(t.${TransactionFields.recurring} = 0 OR t.${TransactionFields.recurring} IS NULL)';
166+
final recurringFilter =
167+
'(t.${TransactionFields.recurring} = 0 OR t.${TransactionFields.recurring} IS NULL)';
156168

157169
final result = await db.rawQuery('''
158170
SELECT b.*, (b.${BankAccountFields.startingValue} +
@@ -207,15 +219,19 @@ class BankAccountMethods extends SossoldiDatabase {
207219
Future<int> deleteById(int id) async {
208220
final db = await database;
209221

210-
return await db.delete(bankAccountTable, where: '${BankAccountFields.id} = ?', whereArgs: [id]);
222+
return await db.delete(
223+
bankAccountTable,
224+
where: '${BankAccountFields.id} = ?',
225+
whereArgs: [id],
226+
);
211227
}
212228

213229
Future<int> deactivateById(int id) async {
214230
final db = await database;
215231

216232
return await db.update(
217233
bankAccountTable,
218-
{'active': 0},
234+
{BankAccountFields.active: 0, BankAccountFields.mainAccount: 0},
219235
where: '${BankAccountFields.id} = ?',
220236
whereArgs: [id],
221237
);
@@ -225,8 +241,11 @@ class BankAccountMethods extends SossoldiDatabase {
225241
final db = await database;
226242

227243
//get account infos first
228-
final result =
229-
await db.query(bankAccountTable, where: '${BankAccountFields.id} = $id', limit: 1);
244+
final result = await db.query(
245+
bankAccountTable,
246+
where: '${BankAccountFields.id} = $id',
247+
limit: 1,
248+
);
230249
final singleObject = result.isNotEmpty ? result[0] : null;
231250

232251
if (singleObject != null) {
@@ -323,14 +342,16 @@ class BankAccountMethods extends SossoldiDatabase {
323342
double runningTotal = statritngValue[0]['Value'] as double;
324343

325344
var result = resultQuery.map((e) {
326-
runningTotal += double.parse(e['income'].toString()) - double.parse(e['expense'].toString());
345+
runningTotal += double.parse(e['income'].toString()) -
346+
double.parse(e['expense'].toString());
327347
return {"day": e["day"], "balance": runningTotal};
328348
}).toList();
329349

330350
if (dateRangeStart != null) {
331351
return result
332-
.where((element) => dateRangeStart
333-
.isBefore(DateTime.parse(element["day"].toString()).add(const Duration(days: 1))))
352+
.where((element) => dateRangeStart.isBefore(
353+
DateTime.parse(element["day"].toString())
354+
.add(const Duration(days: 1))))
334355
.toList();
335356
}
336357

lib/model/transaction.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -396,11 +396,12 @@ class TransactionMethods extends SossoldiDatabase {
396396

397397
final result = await db.rawQuery('''
398398
SELECT
399-
strftime('$frequencyDateParser', ${TransactionFields.date}) as $freqencyString,
400-
SUM(CASE WHEN ${TransactionFields.type} = 'IN' THEN ${TransactionFields.amount} ELSE 0 END) as income,
401-
SUM(CASE WHEN ${TransactionFields.type} = 'OUT' THEN ${TransactionFields.amount} ELSE 0 END) as expense
402-
FROM "$transactionTable"
403-
WHERE $sqlFilters
399+
strftime('$frequencyDateParser', t.${TransactionFields.date}) as $freqencyString,
400+
SUM(CASE WHEN t.${TransactionFields.type} = 'IN' THEN t.${TransactionFields.amount} ELSE 0 END) as income,
401+
SUM(CASE WHEN t.${TransactionFields.type} = 'OUT' THEN t.${TransactionFields.amount} ELSE 0 END) as expense
402+
FROM "$transactionTable" t
403+
JOIN $bankAccountTable b ON t.${TransactionFields.idBankAccount} = b.${BankAccountFields.id}
404+
WHERE $sqlFilters AND b.${BankAccountFields.countNetWorth} = 1 AND b.${BankAccountFields.active} = 1
404405
GROUP BY $freqencyString
405406
''');
406407

lib/pages/accounts/add_account.dart

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class _AddAccountState extends ConsumerState<AddAccount> with Functions {
3434
balanceController.text = numToCurrency(selectedAccount.total);
3535
accountIcon = selectedAccount.symbol;
3636
accountColor = selectedAccount.color;
37-
countNetWorth = selectedAccount.active;
37+
countNetWorth = selectedAccount.countNetWorth;
3838
mainAccount = selectedAccount.mainAccount;
3939
}
4040
super.initState();
@@ -367,7 +367,7 @@ class _AddAccountState extends ConsumerState<AddAccount> with Functions {
367367
account: selectedAccount,
368368
onPressed: () => ref
369369
.read(accountsProvider.notifier)
370-
.removeAccount(selectedAccount.id!)
370+
.removeAccount(selectedAccount)
371371
.whenComplete(
372372
() {
373373
if (context.mounted) {
@@ -430,24 +430,16 @@ class _AddAccountState extends ConsumerState<AddAccount> with Functions {
430430
name: nameController.text,
431431
icon: accountIcon,
432432
color: accountColor,
433-
active: countNetWorth,
433+
balance: currencyToNum(balanceController.text),
434+
countNetWorth: countNetWorth,
434435
mainAccount: mainAccount,
435436
);
436-
if (currencyToNum(balanceController.text) !=
437-
selectedAccount.total) {
438-
await ref
439-
.read(accountsProvider.notifier)
440-
.reconcileAccount(
441-
newBalance: currencyToNum(balanceController.text),
442-
account: selectedAccount,
443-
);
444-
}
445437
} else {
446438
await ref.read(accountsProvider.notifier).addAccount(
447439
name: nameController.text,
448440
icon: accountIcon,
449441
color: accountColor,
450-
active: countNetWorth,
442+
countNetWorth: countNetWorth,
451443
mainAccount: mainAccount,
452444
startingValue: currencyToNum(balanceController.text),
453445
);

lib/pages/transactions_page/widgets/list_tab.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class ListTab extends ConsumerWidget with Functions {
1616
child: asyncTransactions.when(
1717
data: (transactions) {
1818
return TransactionsList(
19-
padding: const EdgeInsets.symmetric(vertical: 16.0),
19+
margin: const EdgeInsets.all(16.0),
2020
transactions: transactions,
2121
);
2222
},

0 commit comments

Comments
 (0)