// Flutter import 'package:flutter/material.dart'; // Local import 'package:flutter_expense_tracker/db.dart'; import 'package:flutter_expense_tracker/models/asset.dart'; import 'package:flutter_expense_tracker/models/expense.dart'; import 'package:flutter_expense_tracker/models/income.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 createState() => _ProjectionPageState(); } class _ProjectionPageState extends State { @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; final String summaryTypeLabel; @override Widget build(BuildContext context) { return FutureBuilder>( future: list, builder: ( BuildContext context, AsyncSnapshot> 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(); } return SummaryCard( name: "$summaryTypeLabel Totals", leftText: "${dailyTotal.toStringAsFixed(2)} Daily", middleText: "${monthlyTotal.toStringAsFixed(2)} Monthly", rightText: "${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( child: Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ Row( children: [ Text(leftText), Spacer(), Center( child: Column( children: [ Text(name), Text(middleText), ], ), ), Spacer(), Text(rightText), ], ), ], ), ), ); } }