Added "All" logic for Dashboard Panels

This commit is contained in:
Gianfranco Gasbarri 2019-09-05 22:41:55 +01:00
parent d79e5d066f
commit 2066f57013
2 changed files with 100 additions and 26 deletions

View File

@ -1,10 +1,13 @@
import 'package:built_collection/built_collection.dart';
import 'package:charts_common/common.dart'; import 'package:charts_common/common.dart';
import 'package:flutter/cupertino.dart';
import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/dashboard/dashboard_state.dart'; import 'package:invoiceninja_flutter/redux/dashboard/dashboard_state.dart';
import 'package:invoiceninja_flutter/redux/task/task_selectors.dart'; import 'package:invoiceninja_flutter/redux/task/task_selectors.dart';
import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart';
import 'package:invoiceninja_flutter/utils/money.dart';
import 'package:memoize/memoize.dart'; import 'package:memoize/memoize.dart';
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
class ChartDataGroup { class ChartDataGroup {
ChartDataGroup(this.name); ChartDataGroup(this.name);
@ -24,17 +27,20 @@ class ChartMoneyData {
final double amount; final double amount;
} }
var memoizedChartInvoices = memo4((CompanyEntity company, var memoizedChartInvoices = memo5((BuildContext context,
CompanyEntity company,
DashboardUIState settings, DashboardUIState settings,
BuiltMap<int, InvoiceEntity> invoiceMap, BuiltMap<int, InvoiceEntity> invoiceMap,
BuiltMap<int, ClientEntity> clientMap) => BuiltMap<int, ClientEntity> clientMap) =>
chartInvoices( chartInvoices(
context: context,
company: company, company: company,
settings: settings, settings: settings,
invoiceMap: invoiceMap, invoiceMap: invoiceMap,
clientMap: clientMap)); clientMap: clientMap));
List<ChartDataGroup> chartInvoices({ List<ChartDataGroup> chartInvoices({
BuildContext context,
CompanyEntity company, CompanyEntity company,
DashboardUIState settings, DashboardUIState settings,
BuiltMap<int, InvoiceEntity> invoiceMap, BuiltMap<int, InvoiceEntity> invoiceMap,
@ -74,8 +80,21 @@ List<ChartDataGroup> chartInvoices({
totals[STATUS_ACTIVE][invoice.invoiceDate] = 0.0; totals[STATUS_ACTIVE][invoice.invoiceDate] = 0.0;
totals[STATUS_OUTSTANDING][invoice.invoiceDate] = 0.0; totals[STATUS_OUTSTANDING][invoice.invoiceDate] = 0.0;
} }
totals[STATUS_ACTIVE][invoice.invoiceDate] += invoice.amount;
totals[STATUS_OUTSTANDING][invoice.invoiceDate] += invoice.balance; double amount = invoice.amount;
double balance = invoice.balance;
// Handle "All"
if (settings.currencyId == kCurrencyAll &&
currencyId != company.currencyId) {
amount *= getExchangeRate(context,
fromCurrencyId: currencyId, toCurrencyId: company.currencyId);
balance *= getExchangeRate(context,
fromCurrencyId: currencyId, toCurrencyId: company.currencyId);
}
totals[STATUS_ACTIVE][invoice.invoiceDate] += amount;
totals[STATUS_OUTSTANDING][invoice.invoiceDate] += balance;
counts[STATUS_ACTIVE]++; counts[STATUS_ACTIVE]++;
if (invoice.balance > 0) { if (invoice.balance > 0) {
@ -119,17 +138,20 @@ List<ChartDataGroup> chartInvoices({
return data; return data;
} }
var memoizedChartQuotes = memo4((CompanyEntity company, var memoizedChartQuotes = memo5((BuildContext context,
CompanyEntity company,
DashboardUIState settings, DashboardUIState settings,
BuiltMap<int, InvoiceEntity> quoteMap, BuiltMap<int, InvoiceEntity> quoteMap,
BuiltMap<int, ClientEntity> clientMap) => BuiltMap<int, ClientEntity> clientMap) =>
chartQuotes( chartQuotes(
context: context,
company: company, company: company,
settings: settings, settings: settings,
quoteMap: quoteMap, quoteMap: quoteMap,
clientMap: clientMap)); clientMap: clientMap));
List<ChartDataGroup> chartQuotes({ List<ChartDataGroup> chartQuotes({
BuildContext context,
CompanyEntity company, CompanyEntity company,
DashboardUIState settings, DashboardUIState settings,
BuiltMap<int, InvoiceEntity> quoteMap, BuiltMap<int, InvoiceEntity> quoteMap,
@ -174,7 +196,16 @@ List<ChartDataGroup> chartQuotes({
totals[STATUS_UNAPPROVED][quote.invoiceDate] = 0.0; totals[STATUS_UNAPPROVED][quote.invoiceDate] = 0.0;
} }
totals[STATUS_ACTIVE][quote.invoiceDate] += quote.amount; double amount = quote.amount;
// Handle "All"
if (settings.currencyId == kCurrencyAll &&
currencyId != company.currencyId) {
amount *= getExchangeRate(context,
fromCurrencyId: currencyId, toCurrencyId: company.currencyId);
}
totals[STATUS_ACTIVE][quote.invoiceDate] += amount;
counts[STATUS_ACTIVE]++; counts[STATUS_ACTIVE]++;
if (quote.isApproved) { if (quote.isApproved) {
totals[STATUS_APPROVED][quote.invoiceDate] += quote.amount; totals[STATUS_APPROVED][quote.invoiceDate] += quote.amount;
@ -229,14 +260,17 @@ List<ChartDataGroup> chartQuotes({
return data; return data;
} }
var memoizedChartPayments = memo5((CompanyEntity company, var memoizedChartPayments = memo6((BuildContext context,
CompanyEntity company,
DashboardUIState settings, DashboardUIState settings,
BuiltMap<int, InvoiceEntity> invoiceMap, BuiltMap<int, InvoiceEntity> invoiceMap,
BuiltMap<int, ClientEntity> clientMap, BuiltMap<int, ClientEntity> clientMap,
BuiltMap<int, PaymentEntity> paymentMap) => BuiltMap<int, PaymentEntity> paymentMap) =>
chartPayments(company, settings, invoiceMap, clientMap, paymentMap)); chartPayments(
context, company, settings, invoiceMap, clientMap, paymentMap));
List<ChartDataGroup> chartPayments( List<ChartDataGroup> chartPayments(
BuildContext context,
CompanyEntity company, CompanyEntity company,
DashboardUIState settings, DashboardUIState settings,
BuiltMap<int, InvoiceEntity> invoiceMap, BuiltMap<int, InvoiceEntity> invoiceMap,
@ -275,8 +309,21 @@ List<ChartDataGroup> chartPayments(
totals[STATUS_ACTIVE][payment.paymentDate] = 0.0; totals[STATUS_ACTIVE][payment.paymentDate] = 0.0;
totals[STATUS_REFUNDED][payment.paymentDate] = 0.0; totals[STATUS_REFUNDED][payment.paymentDate] = 0.0;
} }
totals[STATUS_ACTIVE][payment.paymentDate] += payment.completedAmount;
totals[STATUS_REFUNDED][payment.paymentDate] += payment.refunded; double completedAmount = payment.completedAmount;
double refunded = payment.refunded;
// Handle "All"
if (settings.currencyId == kCurrencyAll &&
currencyId != company.currencyId) {
completedAmount *= getExchangeRate(context,
fromCurrencyId: currencyId, toCurrencyId: company.currencyId);
refunded *= getExchangeRate(context,
fromCurrencyId: currencyId, toCurrencyId: company.currencyId);
}
totals[STATUS_ACTIVE][payment.paymentDate] += completedAmount;
totals[STATUS_REFUNDED][payment.paymentDate] += refunded;
counts[STATUS_ACTIVE]++; counts[STATUS_ACTIVE]++;
if (payment.refunded > 0) { if (payment.refunded > 0) {
@ -321,6 +368,7 @@ List<ChartDataGroup> chartPayments(
} }
List<ChartDataGroup> chartTasks( List<ChartDataGroup> chartTasks(
BuildContext context,
CompanyEntity company, CompanyEntity company,
DashboardUIState settings, DashboardUIState settings,
BuiltMap<int, TaskEntity> taskMap, BuiltMap<int, TaskEntity> taskMap,
@ -368,7 +416,14 @@ List<ChartDataGroup> chartTasks(
final taskRate = taskRateSelector( final taskRate = taskRateSelector(
company: company, project: project, client: client); company: company, project: project, client: client);
final double amount = taskRate * round(duration.inSeconds / 3600, 3); double amount = taskRate * round(duration.inSeconds / 3600, 3);
// Handle "All"
if (settings.currencyId == kCurrencyAll &&
currencyId != company.currencyId) {
amount *= getExchangeRate(context,
fromCurrencyId: currencyId, toCurrencyId: company.currencyId);
}
if (task.isInvoiced) { if (task.isInvoiced) {
if (invoiceMap.containsKey(task.invoiceId) && if (invoiceMap.containsKey(task.invoiceId) &&
@ -429,15 +484,18 @@ List<ChartDataGroup> chartTasks(
return data; return data;
} }
var memoizedChartTasks = memo6((CompanyEntity company, var memoizedChartTasks = memo7((BuildContext context,
CompanyEntity company,
DashboardUIState settings, DashboardUIState settings,
BuiltMap<int, TaskEntity> taskMap, BuiltMap<int, TaskEntity> taskMap,
BuiltMap<int, InvoiceEntity> invoiceMap, BuiltMap<int, InvoiceEntity> invoiceMap,
BuiltMap<int, ProjectEntity> projectMap, BuiltMap<int, ProjectEntity> projectMap,
BuiltMap<int, ClientEntity> clientMap) => BuiltMap<int, ClientEntity> clientMap) =>
chartTasks(company, settings, taskMap, invoiceMap, projectMap, clientMap)); chartTasks(context, company, settings, taskMap, invoiceMap, projectMap,
clientMap));
List<ChartDataGroup> chartExpenses( List<ChartDataGroup> chartExpenses(
BuildContext context,
CompanyEntity company, CompanyEntity company,
DashboardUIState settings, DashboardUIState settings,
BuiltMap<int, InvoiceEntity> invoiceMap, BuiltMap<int, InvoiceEntity> invoiceMap,
@ -464,7 +522,7 @@ List<ChartDataGroup> chartExpenses(
expenseMap.forEach((int, expense) { expenseMap.forEach((int, expense) {
final currencyId = expense.expenseCurrencyId; final currencyId = expense.expenseCurrencyId;
final date = expense.expenseDate; final date = expense.expenseDate;
final amount = expense.amountWithTax; double amount = expense.amountWithTax;
if (expense.isDeleted) { if (expense.isDeleted) {
// skip it // skip it
@ -481,6 +539,13 @@ List<ChartDataGroup> chartExpenses(
totals[STATUS_PAID][date] = 0.0; totals[STATUS_PAID][date] = 0.0;
} }
// Handle "All"
if (settings.currencyId == kCurrencyAll &&
currencyId != company.currencyId) {
amount *= getExchangeRate(context,
fromCurrencyId: currencyId, toCurrencyId: company.currencyId);
}
if (expense.isInvoiced) { if (expense.isInvoiced) {
final invoice = invoiceMap[expense.invoiceId] ?? InvoiceEntity(); final invoice = invoiceMap[expense.invoiceId] ?? InvoiceEntity();
if (invoice.isPaid) { if (invoice.isPaid) {
@ -549,8 +614,9 @@ List<ChartDataGroup> chartExpenses(
return data; return data;
} }
var memoizedChartExpenses = memo4((CompanyEntity company, var memoizedChartExpenses = memo5((BuildContext context,
CompanyEntity company,
DashboardUIState settings, DashboardUIState settings,
BuiltMap<int, InvoiceEntity> invoiceMap, BuiltMap<int, InvoiceEntity> invoiceMap,
BuiltMap<int, ExpenseEntity> expenseMap) => BuiltMap<int, ExpenseEntity> expenseMap) =>
chartExpenses(company, settings, invoiceMap, expenseMap)); chartExpenses(context, company, settings, invoiceMap, expenseMap));

View File

@ -95,9 +95,10 @@ class DashboardPanels extends StatelessWidget {
child: DropdownButton<int>( child: DropdownButton<int>(
items: memoizedGetCurrencyIds(company, clientMap) items: memoizedGetCurrencyIds(company, clientMap)
.map((currencyId) => DropdownMenuItem<int>( .map((currencyId) => DropdownMenuItem<int>(
child: Text( child: Text(currencyId == kCurrencyAll
viewModel.currencyMap[currencyId]?.code ?? ? localization.all
localization.all), : viewModel
.currencyMap[currencyId]?.code),
value: currencyId, value: currencyId,
)) ))
.toList(), .toList(),
@ -184,12 +185,13 @@ class DashboardPanels extends StatelessWidget {
final isLoaded = viewModel.state.invoiceState.isLoaded; final isLoaded = viewModel.state.invoiceState.isLoaded;
final settings = viewModel.dashboardUIState; final settings = viewModel.dashboardUIState;
final state = viewModel.state; final state = viewModel.state;
final currentData = memoizedChartInvoices(state.selectedCompany, settings, final currentData = memoizedChartInvoices(context, state.selectedCompany,
state.invoiceState.map, state.clientState.map); settings, state.invoiceState.map, state.clientState.map);
List<ChartDataGroup> previousData; List<ChartDataGroup> previousData;
if (settings.enableComparison) { if (settings.enableComparison) {
previousData = memoizedChartInvoices( previousData = memoizedChartInvoices(
context,
state.selectedCompany, state.selectedCompany,
settings.rebuild((b) => b..offset += 1), settings.rebuild((b) => b..offset += 1),
state.invoiceState.map, state.invoiceState.map,
@ -209,6 +211,7 @@ class DashboardPanels extends StatelessWidget {
final settings = viewModel.dashboardUIState; final settings = viewModel.dashboardUIState;
final state = viewModel.state; final state = viewModel.state;
final currentData = memoizedChartPayments( final currentData = memoizedChartPayments(
context,
state.selectedCompany, state.selectedCompany,
settings, settings,
state.invoiceState.map, state.invoiceState.map,
@ -218,6 +221,7 @@ class DashboardPanels extends StatelessWidget {
List<ChartDataGroup> previousData; List<ChartDataGroup> previousData;
if (settings.enableComparison) { if (settings.enableComparison) {
previousData = memoizedChartPayments( previousData = memoizedChartPayments(
context,
state.selectedCompany, state.selectedCompany,
settings.rebuild((b) => b..offset += 1), settings.rebuild((b) => b..offset += 1),
state.invoiceState.map, state.invoiceState.map,
@ -237,12 +241,13 @@ class DashboardPanels extends StatelessWidget {
final settings = viewModel.dashboardUIState; final settings = viewModel.dashboardUIState;
final state = viewModel.state; final state = viewModel.state;
final isLoaded = state.quoteState.isLoaded; final isLoaded = state.quoteState.isLoaded;
final currentData = memoizedChartQuotes(state.selectedCompany, settings, final currentData = memoizedChartQuotes(context, state.selectedCompany,
state.quoteState.map, state.clientState.map); settings, state.quoteState.map, state.clientState.map);
List<ChartDataGroup> previousData; List<ChartDataGroup> previousData;
if (settings.enableComparison) { if (settings.enableComparison) {
previousData = memoizedChartQuotes( previousData = memoizedChartQuotes(
context,
state.selectedCompany, state.selectedCompany,
settings.rebuild((b) => b..offset += 1), settings.rebuild((b) => b..offset += 1),
state.quoteState.map, state.quoteState.map,
@ -263,6 +268,7 @@ class DashboardPanels extends StatelessWidget {
final isLoaded = state.taskState.isLoaded; final isLoaded = state.taskState.isLoaded;
final currentData = memoizedChartTasks( final currentData = memoizedChartTasks(
context,
state.selectedCompany, state.selectedCompany,
settings, settings,
state.taskState.map, state.taskState.map,
@ -273,6 +279,7 @@ class DashboardPanels extends StatelessWidget {
List<ChartDataGroup> previousData; List<ChartDataGroup> previousData;
if (settings.enableComparison) { if (settings.enableComparison) {
previousData = memoizedChartTasks( previousData = memoizedChartTasks(
context,
state.selectedCompany, state.selectedCompany,
settings.rebuild((b) => b..offset += 1), settings.rebuild((b) => b..offset += 1),
state.taskState.map, state.taskState.map,
@ -293,12 +300,13 @@ class DashboardPanels extends StatelessWidget {
final settings = viewModel.dashboardUIState; final settings = viewModel.dashboardUIState;
final state = viewModel.state; final state = viewModel.state;
final isLoaded = state.expenseState.isLoaded; final isLoaded = state.expenseState.isLoaded;
final currentData = memoizedChartExpenses(state.selectedCompany, settings, final currentData = memoizedChartExpenses(context, state.selectedCompany,
state.invoiceState.map, state.expenseState.map); settings, state.invoiceState.map, state.expenseState.map);
List<ChartDataGroup> previousData; List<ChartDataGroup> previousData;
if (settings.enableComparison) { if (settings.enableComparison) {
previousData = memoizedChartExpenses( previousData = memoizedChartExpenses(
context,
state.selectedCompany, state.selectedCompany,
settings.rebuild((b) => b..offset += 1), settings.rebuild((b) => b..offset += 1),
state.invoiceState.map, state.invoiceState.map,