Skip to content

Commit d247aa5

Browse files
credit transactions chart WIP, fixing HubDocumentsSectionWidget not passing fileInfo for audio files
1 parent b5fd1b4 commit d247aa5

6 files changed

Lines changed: 412 additions & 15 deletions

File tree

school_data_hub_flutter/lib/common/widgets/custom_expansion_tile/custom_expansion_tile_switch.dart

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,20 @@ class CustomExpansionTileSwitch extends WatchingWidget {
3232
expansionSwitchWidget != null &&
3333
includeSwitch != null &&
3434
includeSwitch == true
35-
? Row(
36-
mainAxisAlignment: MainAxisAlignment.end,
37-
children: [
38-
expansionSwitchWidget!,
39-
const Gap(10),
40-
AnimatedRotation(
41-
turns: isExpanded ? 0.5 : 0.0,
42-
duration: const Duration(milliseconds: 200),
43-
child: Icon(Icons.keyboard_arrow_down, color: switchColor!),
44-
),
45-
],
35+
? SingleChildScrollView(
36+
scrollDirection: Axis.horizontal,
37+
child: Row(
38+
mainAxisAlignment: MainAxisAlignment.end,
39+
children: [
40+
expansionSwitchWidget!,
41+
const Gap(10),
42+
AnimatedRotation(
43+
turns: isExpanded ? 0.5 : 0.0,
44+
duration: const Duration(milliseconds: 200),
45+
child: Icon(Icons.keyboard_arrow_down, color: switchColor!),
46+
),
47+
],
48+
),
4649
)
4750
: expansionSwitchWidget != null && includeSwitch != true
4851
? expansionSwitchWidget

school_data_hub_flutter/lib/features/statistics/chart_page/chart_page.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:school_data_hub_flutter/common/widgets/generic_components/generi
77
import 'package:school_data_hub_flutter/features/statistics/chart_page/widgets/attendance_stats_view.dart';
88
import 'package:school_data_hub_flutter/features/statistics/chart_page/widgets/book_lending_stats_view.dart';
99
import 'package:school_data_hub_flutter/features/statistics/chart_page/widgets/chart_page_bottom_bar.dart';
10+
import 'package:school_data_hub_flutter/features/statistics/chart_page/widgets/credit_transactions_stats_view.dart';
1011
import 'package:school_data_hub_flutter/features/statistics/chart_page/widgets/event_stats_view.dart';
1112
import 'package:school_data_hub_flutter/features/statistics/chart_page/widgets/pupil_stats_view.dart';
1213

@@ -36,6 +37,8 @@ class ChartPage extends WatchingWidget {
3637
final Map<DateTime, ({int excused, int unexcused, int goneHome})>
3738
attendanceChartData;
3839
final Map<DateTime, ({int currentlyLent})> bookLendingChartData;
40+
final Map<DateTime, ({int incoming, int outgoing, int balance})>
41+
creditTransactionsChartData;
3942
final List<Schoolday> schooldays;
4043

4144
const ChartPage({
@@ -44,6 +47,7 @@ class ChartPage extends WatchingWidget {
4447
required this.eventChartData,
4548
required this.attendanceChartData,
4649
required this.bookLendingChartData,
50+
required this.creditTransactionsChartData,
4751
required this.schooldays,
4852
});
4953

@@ -113,6 +117,11 @@ class ChartPage extends WatchingWidget {
113117
sortedSchooldays: sortedSchooldays,
114118
bookLendingChartData: bookLendingChartData,
115119
);
120+
case 4:
121+
return CreditTransactionsStatsView(
122+
sortedSchooldays: sortedSchooldays,
123+
creditTransactionsChartData: creditTransactionsChartData,
124+
);
116125
default:
117126
return const SizedBox.shrink();
118127
}

school_data_hub_flutter/lib/features/statistics/chart_page/chart_page_controller.dart

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ class _ChartPageControllerState extends State<ChartPageController> {
5252

5353
Map<DateTime, ({int currentlyLent})> _bookLendingChartData = {};
5454

55+
Map<DateTime, ({int incoming, int outgoing, int balance})>
56+
_creditTransactionsChartData = {};
57+
5558
@override
5659
void initState() {
5760
super.initState();
@@ -128,6 +131,7 @@ class _ChartPageControllerState extends State<ChartPageController> {
128131
_eventChartData = {};
129132
_attendanceChartData = {};
130133
_bookLendingChartData = {};
134+
_creditTransactionsChartData = {};
131135
_isLoading = false;
132136
});
133137
}
@@ -153,7 +157,8 @@ class _ChartPageControllerState extends State<ChartPageController> {
153157
// 3b. Pre-process Book Lendings
154158
// Normalize each lending to (lentDate, returnedDate?) for efficient
155159
// per-schoolday counting of currently outstanding books.
156-
final normalizedLendings = <({DateTime lentDate, DateTime? returnedDate})>[];
160+
final normalizedLendings =
161+
<({DateTime lentDate, DateTime? returnedDate})>[];
157162
for (final pupil in _pupilManager.allPupils) {
158163
final lendings = pupil.pupilBookLendings;
159164
if (lendings == null) continue;
@@ -256,6 +261,8 @@ class _ChartPageControllerState extends State<ChartPageController> {
256261
final attendanceChartData =
257262
<DateTime, ({int excused, int unexcused, int goneHome})>{};
258263
final bookLendingChartData = <DateTime, ({int currentlyLent})>{};
264+
final creditTransactionsChartData =
265+
<DateTime, ({int incoming, int outgoing, int balance})>{};
259266

260267
// 5. Iterate Schooldays
261268
for (final schoolday in schooldays) {
@@ -416,9 +423,10 @@ class _ChartPageControllerState extends State<ChartPageController> {
416423
// lentAt <= dayDate AND (returnedAt is null OR returnedAt > dayDate)
417424
int currentlyLent = 0;
418425
for (final lending in normalizedLendings) {
419-
final lentOnOrBefore = lending.lentDate.isBefore(dayDate) ||
420-
lending.lentDate == dayDate;
421-
final notYetReturned = lending.returnedDate == null ||
426+
final lentOnOrBefore =
427+
lending.lentDate.isBefore(dayDate) || lending.lentDate == dayDate;
428+
final notYetReturned =
429+
lending.returnedDate == null ||
422430
lending.returnedDate!.isAfter(dayDate);
423431
if (lentOnOrBefore && notYetReturned) {
424432
currentlyLent++;
@@ -428,6 +436,42 @@ class _ChartPageControllerState extends State<ChartPageController> {
428436
bookLendingChartData[schoolday.schoolday] = (
429437
currentlyLent: currentlyLent,
430438
);
439+
440+
// --- Credit Transactions ---
441+
int incoming = 0;
442+
int outgoing = 0;
443+
int balance = 0;
444+
445+
for (final pupil in pupils) {
446+
final transactions = pupil.creditTransactions;
447+
if (transactions == null) continue;
448+
449+
for (final transaction in transactions) {
450+
final transactionDate = transaction.dateTime.toLocal();
451+
final txDate = DateTime(
452+
transactionDate.year,
453+
transactionDate.month,
454+
transactionDate.day,
455+
);
456+
457+
// Only count transactions for this schoolday
458+
if (txDate != dayDate) continue;
459+
460+
if (transaction.amount > 0) {
461+
incoming += transaction.amount;
462+
balance += transaction.amount;
463+
} else if (transaction.amount < 0) {
464+
outgoing += transaction.amount.abs();
465+
balance += transaction.amount;
466+
}
467+
}
468+
}
469+
470+
creditTransactionsChartData[schoolday.schoolday] = (
471+
incoming: incoming,
472+
outgoing: outgoing,
473+
balance: balance,
474+
);
431475
}
432476

433477
if (mounted) {
@@ -437,6 +481,7 @@ class _ChartPageControllerState extends State<ChartPageController> {
437481
_eventChartData = eventChartData;
438482
_attendanceChartData = attendanceChartData;
439483
_bookLendingChartData = bookLendingChartData;
484+
_creditTransactionsChartData = creditTransactionsChartData;
440485
_isLoading = false;
441486
});
442487
}
@@ -495,6 +540,7 @@ class _ChartPageControllerState extends State<ChartPageController> {
495540
eventChartData: _eventChartData,
496541
attendanceChartData: _attendanceChartData,
497542
bookLendingChartData: _bookLendingChartData,
543+
creditTransactionsChartData: _creditTransactionsChartData,
498544
schooldays: _schooldays,
499545
);
500546
}

school_data_hub_flutter/lib/features/statistics/chart_page/widgets/chart_page_bottom_bar.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ class ChartPageBottomBar extends StatelessWidget {
8181
selectedIcon: Icon(Icons.menu_book),
8282
label: 'Ausleihen',
8383
),
84+
NavigationDestination(
85+
icon: Icon(Icons.account_balance_wallet_outlined),
86+
selectedIcon: Icon(Icons.account_balance_wallet),
87+
label: 'Kredite',
88+
),
8489
],
8590
),
8691
),

0 commit comments

Comments
 (0)