155 lines
4.2 KiB
Dart

// Flutter
import 'package:flutter/material.dart';
// Local
import 'package:flutter_expense_tracker/db.dart';
import 'package:flutter_expense_tracker/models/tracked_type_recurring.dart';
/// TODO:
/// - Expenses (total number, totals by day / month / year)
/// - Incomes (total number, totals by day / month / year)
/// - Assets (total number, total by day / month / year)
/// - Projected Assets in:
/// - 1 week, 1 month, 1 quarter, 1 year
/// - 1/2 year? 2 years? 5 years? Allow customization?
class ProjectionPage extends StatefulWidget {
const ProjectionPage({
super.key,
});
@override
State<ProjectionPage> createState() => _ProjectionPageState();
}
class _ProjectionPageState extends State<ProjectionPage> {
@override
Widget build(BuildContext context) {
Widget expenseSummary = SummaryCardForTotals(
list: DatabaseHelper.instance.getExpenses(),
summaryTypeLabel: "Expense",
);
return ListView(
children: [
expenseSummary,
SummaryCard(
name: "Income Totals",
leftText: "left",
middleText: "middle",
rightText: "right",
),
SummaryCard(
name: "Asset Totals",
leftText: "left",
middleText: "middle",
rightText: "right",
),
],
);
}
}
class SummaryCardForTotals extends StatelessWidget {
const SummaryCardForTotals({
super.key,
required this.list,
required this.summaryTypeLabel,
});
final Future<List<RecurringTrackedType>> list;
final String summaryTypeLabel;
@override
Widget build(BuildContext context) {
return FutureBuilder<List<RecurringTrackedType>>(
future: list,
builder: (
BuildContext context,
AsyncSnapshot<List<RecurringTrackedType>> snapshot,
) {
if (!snapshot.hasData) {
return Text('Loading $summaryTypeLabel Section...');
}
double dailyTotal = 0, monthlyTotal = 0, yearlyTotal = 0;
for (RecurringTrackedType e in snapshot.data!) {
dailyTotal += e.calcComparableAmountDaily();
monthlyTotal += e.calcComparableAmountYearly() / 12;
yearlyTotal += e.calcComparableAmountYearly();
}
String dailyEstimate =
dailyTotal.toStringAsFixed(3).endsWith("0") ? "" : "~",
monthlyEstimate =
monthlyTotal.toStringAsFixed(3).endsWith("0") ? "" : "~",
yearlyEstimate =
yearlyTotal.toStringAsFixed(3).endsWith("0") ? "" : "~";
return SummaryCard(
name: "$summaryTypeLabel Totals",
leftText: "$dailyEstimate${dailyTotal.toStringAsFixed(2)} Daily",
middleText:
"$monthlyEstimate${monthlyTotal.toStringAsFixed(2)} Monthly",
rightText:
"$yearlyEstimate${yearlyTotal.toStringAsFixed(2)} Yearly",
);
});
}
}
class SummaryCard extends StatelessWidget {
const SummaryCard({
super.key,
required this.name,
required this.leftText,
required this.middleText,
required this.rightText,
});
final String name;
final String leftText;
final String middleText;
final String rightText;
@override
Widget build(BuildContext context) {
return Card(
color: Theme.of(context).cardColor,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Card(
color: Theme.of(context).highlightColor,
child: Column(
children: [
Text(
name,
style: TextStyle(
decoration: TextDecoration.underline,
fontSize: 16
),
),
Row(
children: [
Spacer(
flex: 3,
),
Text(leftText),
Spacer(
flex: 1,
),
Text(middleText),
Spacer(
flex: 1,
),
Text(rightText),
Spacer(
flex: 3,
),
],
),
],
),
),
),
);
}
}