Begin making the Expense page more arbitrary for future re-use by creating superclasses which will fit all 3 object use cases.

This commit is contained in:
2025-02-11 14:33:38 -07:00
parent 7a3eaf70b5
commit ab9b3e0bf9
4 changed files with 91 additions and 55 deletions

@ -1,51 +1,24 @@
import '/models/recurring_tracked_type.dart';
import '/models/frequency.dart';
class Expense {
final int? id;
final String name;
final double cost;
final Frequency frequency;
final String description;
class Expense extends RecurringTrackedType {
static String amountText = "Cost";
const Expense({
this.id,
required this.name,
required this.cost,
required this.frequency,
required this.description,
Expense({
super.id,
required super.name,
required super.amount,
required super.frequency,
required super.description,
});
@override
String toString() {
//return "$name, $cost, ${frequency.title}, $description";
return toMap().toString();
}
double calcComparableCost() {
return cost * frequency.timesPerYear;
}
double calcComparableCostDaily() {
return cost / frequency.numDays;
}
factory Expense.fromMap(Map<String, dynamic> json) => Expense(
id: json['id'],
name: json['name'],
cost: json['cost'],
amount: json['cost'],
frequency: Frequency.values
.where((expense) => expense.title == json['frequency'])
.where((freq) => freq.title == json['frequency'])
.first,
description: json['description'],
);
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
'cost': cost,
'frequency': frequency.title,
'description': description,
};
}
}

@ -0,0 +1,34 @@
// Local
import '/models/tracked_type.dart';
import '/models/frequency.dart';
abstract class RecurringTrackedType extends TrackedType {
Frequency frequency;
RecurringTrackedType({
super.id,
required super.name,
required super.amount,
required this.frequency,
required super.description,
});
double calcComparableAmountYearly() {
return amount * frequency.timesPerYear;
}
double calcComparableAmountDaily() {
return amount / frequency.numDays;
}
@override
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
'amount': amount,
'frequency': frequency.title,
'description': description,
};
}
}

@ -0,0 +1,27 @@
abstract class TrackedType {
int? id;
String name;
double amount;
String description;
TrackedType({
this.id,
required this.name,
required this.amount,
required this.description,
});
@override
String toString() {
return toMap().toString();
}
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
'amount': amount,
'description': description,
};
}
}