import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/client_model.dart'; import 'package:invoiceninja_flutter/data/models/company_model.dart'; import 'package:invoiceninja_flutter/data/models/dashboard_model.dart'; import 'package:invoiceninja_flutter/redux/reports/reports_state.dart'; import 'package:invoiceninja_flutter/ui/reports/reports_screen.dart'; import 'package:invoiceninja_flutter/utils/dates.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:memoize/memoize.dart'; var memoizedClientReport = memo3((UserCompanyEntity userCompany, ReportsUIState reportsUIState, BuiltMap clientMap) => clientReport(userCompany, reportsUIState, clientMap)); ReportResult clientReport(UserCompanyEntity userCompany, ReportsUIState reportsUIState, BuiltMap clientMap) { final List> data = []; BuiltList columns; final reportSettings = userCompany.settings.reportSettings; final clientReportSettings = reportSettings != null && reportSettings.containsKey(kReportClient) ? reportSettings[kReportClient] : ReportSettingsEntity(); if (clientReportSettings != null) { columns = clientReportSettings.columns; } else { columns = BuiltList([ ClientFields.name, ]); } for (var clientId in clientMap.keys) { final client = clientMap[clientId]; if (client.isDeleted) { continue; } bool skip = false; final List row = []; for (var column in columns) { String value = ''; switch (column) { case ClientFields.name: value = client.name; break; case ClientFields.idNumber: value = client.idNumber; break; case ClientFields.vatNumber: value = client.vatNumber; break; case ClientFields.state: value = client.state; break; case ClientFields.createdAt: value = convertTimestampToDateString(client.createdAt); break; case ClientFields.updatedAt: value = convertTimestampToDateString(client.updatedAt); break; } if (reportsUIState.filters.containsKey(column)) { final filter = reportsUIState.filters[column]; if (filter.isNotEmpty) { if (getReportColumnType(column) == ReportColumnType.dateTime) { final startDate = calculateStartDate( dateRange: DateRange.valueOf(filter), company: userCompany.company, //customEndDate: customEndDate, //customStartDate: customStartDate, ); final endDate = calculateEndDate( dateRange: DateRange.valueOf(filter), company: userCompany.company, //customEndDate: customEndDate, //customStartDate: customStartDate, ); if (!(startDate.compareTo(value) <= 0 && endDate.compareTo(value) >= 0)) { skip = true; } } else if (!value.toLowerCase().contains(filter.toLowerCase())) { skip = true; } } } row.add(client.getReportValue(value: value)); } if (!skip) { data.add(row); } } data.sort((rowA, rowB) { if (rowA.length <= clientReportSettings.sortIndex || rowB.length <= clientReportSettings.sortIndex) { return 0; } final valueA = rowA[clientReportSettings.sortIndex].sortString(); final valueB = rowB[clientReportSettings.sortIndex].sortString(); if (clientReportSettings.sortAscending) { return valueA.compareTo(valueB); } else { return valueB.compareTo(valueA); } }); return ReportResult( allColumns: [ ClientFields.name, ClientFields.idNumber, ClientFields.vatNumber, ClientFields.state, ClientFields.createdAt, ClientFields.updatedAt, ], columns: columns.toList(), data: data, ); }