Skip to content

Commit

Permalink
Added a new way to store payments and updated functionality in monthl…
Browse files Browse the repository at this point in the history
…y budget
  • Loading branch information
xMadKing committed Dec 22, 2023
1 parent c0f7e7b commit 8dcb2df
Show file tree
Hide file tree
Showing 10 changed files with 245 additions and 292 deletions.
83 changes: 46 additions & 37 deletions lib/backend/category.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'package:flutter/widgets.dart';
import 'package:graphic/graphic.dart';
import 'wyrm/database.dart';
import 'package:smartspend/backend/payments.dart';

class Category {
static final Wyrm database = Wyrm();
Expand All @@ -9,15 +11,6 @@ class Category {
late num currentSpending;
late int categoryColor;
late String categoryName;
late Map<String, num> lastWeekSpending = {
"Monday" : 1,
"Tuesday" : 1,
"Wednesday" : 1,
"Thursday" : 1,
"Friday" : 1,
"Saturday" : 1,
"Sunday" : 1 ,
};

Category({
required this.userID,
Expand All @@ -39,24 +32,53 @@ class Category {
};
}

Future<void> addExpense(String day, num expense) async {
await loadSpending();
lastWeekSpending[day] = lastWeekSpending[day] !+ expense;
currentSpending += expense;
static List<DateTime> getWeekDates() {
final List<DateTime> res = [];
DateTime mostRecentWeekday(DateTime date, int weekday) => //code from stackoverflow, thanks Irn
DateTime(date.year, date.month, date.day - (date.weekday - weekday) % 7);
DateTime monday = mostRecentWeekday(DateTime.now(), 1);
res.add(monday);
for(int i = 1; i < 7; i++){
res.add(monday.add(Duration(days: i)));
}
return res;
}

Map<String, dynamic> data = {
"categoryID" : categoryID,
};
Future<Map<String, num>> getWeekSpending() async {
final Map<String, num> res = {};
final List<DateTime> thisWeekDates = getWeekDates();
List<List<Payment>> paymentsPerDay = await database.getPaymentsByDate(thisWeekDates, categoryID);

for(int i = 0; i < paymentsPerDay.length; i++){
String date;
try {
date = DateTime.parse(paymentsPerDay[i].first.paymentDate).day.toString();
} catch (e) {
date = thisWeekDates[i].day.toString();
}

for (var key in lastWeekSpending.keys) {
data[key] = lastWeekSpending[key];
num amountSpent = 0;
for(int j = 0; j < paymentsPerDay[i].length; j++){
amountSpent += paymentsPerDay[i][j].paymentAmount;
}
res[date] = amountSpent;
}
return res;
}

await database.updateEntryInTable(
'weeklyspending',
'categoryID',
categoryID,
data,
Future<void> addExpense(String date, num amount) async {
currentSpending += amount;

Payment expense = Payment(
paymentID: DateTime.now().millisecondsSinceEpoch.toInt(),
categoryID: categoryID,
paymentDate: date,
paymentAmount: amount,
);

await database.insertToTable(
expense,
'payment'
);

await database.updateEntryInTable(
Expand All @@ -68,24 +90,11 @@ class Category {

}

Future<void> loadSpending() async {
Map<String, dynamic> data = (await database.weeklySpending(categoryID)).first;
lastWeekSpending = {
"Monday" : data['Monday'],
"Tuesday" : data['Tuesday'],
"Wednesday" : data['Wednesday'],
"Thursday" : data['Thursday'],
"Friday" : data['Friday'],
"Saturday" : data['Saturday'],
"Sunday" : data['Sunday'],
};
}

@override
String toString() {
Color tmp = Color(categoryColor);
return "Category{ID: $categoryID, userID: $userID, Color: $tmp, "
"Category Name: $categoryName, Spending Limit: $spendingLimit, "
"Current Spending: $currentSpending, weekly: $lastWeekSpending}";
"Current Spending: $currentSpending}";
}
}
29 changes: 29 additions & 0 deletions lib/backend/payments.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
class Payment {
final int paymentID;
final int categoryID;
final String paymentDate;
final num paymentAmount;


Payment({
required this.paymentID,
required this.categoryID,
required this.paymentDate,
required this.paymentAmount,
});

Map<String, dynamic> toMap() {
return {
"paymentID" : paymentID,
"categoryID" : categoryID,
"paymentDate" : paymentDate,
"paymentAmount" : paymentAmount,
};
}

@override
String toString(){
return 'Payment{ID: $paymentID, Category: $categoryID, '
'Payment Date: $paymentDate, Amount: $paymentAmount}';
}
}
107 changes: 63 additions & 44 deletions lib/backend/wyrm/database.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'dart:async';

import 'package:flutter/widgets.dart';
import 'package:path/path.dart';
import 'package:smartspend/backend/payments.dart';
import 'package:sqflite/sqflite.dart';
import 'package:smartspend/backend/user.dart';
import 'package:smartspend/backend/category.dart';
Expand All @@ -20,41 +21,64 @@ class Wyrm {
join(await getDatabasesPath(), '$name.db'),
onCreate: (db, version) async {
await db.execute(
'CREATE TABLE user'
'(userID INT PRIMARY KEY,'
'name TEXT,'
'passcode TEXT,'
'birthDate TEXT,'
'isNewUser TINYINT,'
'monthlyincome DECIMAL)'
'CREATE TABLE user'
'(userID INT PRIMARY KEY,'
'name TEXT,'
'passcode TEXT,'
'birthDate TEXT,'
'isNewUser TINYINT,'
'monthlyincome DECIMAL)'
);
await db.execute(
'CREATE TABLE category'
'(categoryID INT PRIMARY KEY,'
'userID INT,'
'categoryName TEXT,'
'spendingLimit DECIMAL,'
'currentSpending DECIMAL,'
'categoryColor INT)'
'CREATE TABLE category'
'(categoryID INT PRIMARY KEY,'
'userID INT,'
'categoryName TEXT,'
'spendingLimit DECIMAL,'
'currentSpending DECIMAL,'
'categoryColor INT)'
);
await db.execute(
'CREATE TABLE weeklyspending('
'CREATE TABLE payment('
'paymentID INT,'
'categoryID INT,'
'Monday DECIMAL,'
'Tuesday DECIMAL,'
'Wednesday DECIMAL,'
'Thursday DECIMAL,'
'Friday DECIMAL,'
'Saturday DECIMAL,'
'Sunday DECIMAL,'
'FOREIGN KEY (categoryID) REFERENCES category(categoryID))'
'paymentDate STRING,'
'paymentAmount DECIMAL)'
);
return;
},
version: 1,
);
}

Future<List<List<Payment>>> getPaymentsByDate
(List<DateTime> dates, int categoryID) async {
await initDB();
final db = database;

final List<List<Payment>> res = [];

for(int j = 0; j < dates.length; j++){
final List<Map<String, dynamic>> data = await db.query(
'payment',
where: "paymentDate=? and categoryID=? ",
whereArgs: ["${dates[j].year}-${dates[j].month}-${dates[j].day}".toString(), categoryID],
);
List<Payment> tmp = [];
for (int i = 0; i < data.length; i++){
tmp.add(Payment(
paymentID: data[i]['paymentID'] as int,
categoryID: data[i]['categoryID'] as int ,
paymentDate: data[i]['paymentDate'] as String,
paymentAmount: data[i]['paymentAmount'] as num,
));
}
res.add(tmp);
}

return res;
}

Future<void> insertToTable(dynamic entry, String table) async {
await initDB();
final db = database;
Expand All @@ -73,27 +97,6 @@ class Wyrm {
);
}

Future<List<Map<String, num>>> weeklySpending(int categoryID) async {
await initDB();
final db = database;

final List<Map<String, dynamic>> maps = await db.query('weeklyspending',
where: 'categoryID = ?', whereArgs: [categoryID]);

return List.generate(maps.length, (i) {
return {
"categoryID" : maps[i]['categoryID'] as int,
"Monday" : maps[i]['Monday'] as num,
"Tuesday" : maps[i]['Tuesday'] as num,
"Wednesday" : maps[i]['Wednesday'] as num,
"Thursday" : maps[i]['Thursday'] as num,
"Friday" : maps[i]['Friday'] as num,
"Saturday" : maps[i]['Saturday'] as num,
"Sunday" : maps[i]['Sunday'] as num,
};
});
}

Future<List<Category>> categories() async {
await initDB();
final db = database;
Expand All @@ -112,6 +115,22 @@ class Wyrm {
});
}

Future<List<Payment>> payments() async {
await initDB();
final db = database;

final List<Map<String, dynamic>> maps = await db.query("payment");

return List.generate(maps.length, (i) {
return Payment(
paymentID: maps[i]['paymentID'] as int,
categoryID: maps[i]['categoryID'] as int ,
paymentDate: maps[i]['paymentDate'] as String,
paymentAmount: maps[i]['paymentAmount'] as num,
);
});
}

Future<List<User>> users() async {
await initDB();
final db = database;
Expand Down
11 changes: 0 additions & 11 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -109,17 +109,6 @@ Future<List<Category>> initCategories(Wyrm database, User client) async {
];
for (int i = 0; i < categories.length; i++){
await database.insertToTable(categories[i], 'category');
await database.insertToTable({
"categoryID" : categories[i].categoryID,
"Monday" : 1,
"Tuesday" : 1,
"Wednesday" : 1,
"Thursday" : 1,
"Friday" : 1,
"Saturday" : 1,
"Sunday" : 1,
},
"weeklyspending");
}
}
return categories;
Expand Down
13 changes: 2 additions & 11 deletions lib/pages/addexpense.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,6 @@ class _AddExpensePageState extends State<AddExpensePage> {
bool _loading = true;
bool expenseAdded = false;
bool selectingCategory = false;
List<String> daysList = [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
];
late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;

@override
Expand Down Expand Up @@ -209,7 +200,7 @@ class _AddExpensePageState extends State<AddExpensePage> {
);
setState(() {
widget.controllers[1].text =
"${date?.day}/${date?.month}/${date?.year}";
"${date?.year}-${date?.month}-${date?.day}";
dateSelected = date!;
});
}
Expand Down Expand Up @@ -239,7 +230,7 @@ class _AddExpensePageState extends State<AddExpensePage> {
child: TextButton(
onPressed: !isActivated() ? null : () {
selectedCategory.addExpense(
daysList[dateSelected.weekday-1],
widget.controllers[1].text,
int.parse(widget.controllers[0].text),
);
setState(() {
Expand Down
12 changes: 0 additions & 12 deletions lib/pages/homepage.dart
Original file line number Diff line number Diff line change
Expand Up @@ -99,12 +99,8 @@ class _HomePageState extends State<HomePage>{
child: GestureDetector(
onDoubleTap: () async {
List<Category> categories = await database.categories();
for (var category in categories) {
await category.loadSpending();
}
Navigator.push(context,
MaterialPageRoute(builder: (context) => MonthlyBudgetPage(
categories: categories,
)));
},
child: Container(
Expand Down Expand Up @@ -180,13 +176,9 @@ class _HomePageState extends State<HomePage>{
GestureDetector(
onTap: () async {
List<Category> categories = await database.categories();
for (var category in categories) {
await category.loadSpending();
}
Navigator.push(context,
MaterialPageRoute(builder: (context)
=> MonthlyBudgetPage(
categories: categories,
)));
},
child: Container(
Expand Down Expand Up @@ -218,13 +210,9 @@ class _HomePageState extends State<HomePage>{
child: IconButton(
onPressed: () async {
List<Category> categories = await database.categories();
for (var category in categories) {
await category.loadSpending();
}
Navigator.push(context,
MaterialPageRoute(builder:
(context) => MonthlyBudgetPage(
categories: categories,
)));
},
icon: const Icon(
Expand Down
Loading

0 comments on commit 8dcb2df

Please sign in to comment.