invoice/lib/redux/credit/credit_selectors.dart

183 lines
5.6 KiB
Dart

import 'package:invoiceninja_flutter/redux/static/static_state.dart';
import 'package:memoize/memoize.dart';
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
var memoizedDropdownCreditList = memo7(
(BuiltMap<String, InvoiceEntity> creditMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltList<String> creditList,
String clientId,
StaticState staticState,
BuiltMap<String, UserEntity> userMap,
List<String> excludedIds) =>
dropdownCreditSelector(creditMap, clientMap, creditList, clientId,
staticState, userMap, excludedIds));
List<String> dropdownCreditSelector(
BuiltMap<String, InvoiceEntity> creditMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltList<String> creditList,
String clientId,
StaticState staticState,
BuiltMap<String, UserEntity> userMap,
List<String> excludedIds) {
final list = creditList.where((creditId) {
final credit = creditMap[creditId];
if (excludedIds.contains(creditId)) {
return false;
}
if (clientId != null &&
clientId.isNotEmpty &&
credit.clientId != clientId) {
return false;
}
if (!clientMap.containsKey(credit.clientId) ||
!clientMap[credit.clientId].isActive) {
return false;
}
if (credit.balance == 0) {
return false;
}
return credit.isActive && credit.isUnpaid;
}).toList();
list.sort((creditAId, creditBId) {
final creditA = creditMap[creditAId];
final creditB = creditMap[creditBId];
return creditA.compareTo(
invoice: creditB,
clientMap: clientMap,
sortAscending: true,
sortField: ClientFields.name,
staticState: staticState,
userMap: userMap);
});
return list;
}
ClientEntity creditClientSelector(
InvoiceEntity credit, BuiltMap<String, ClientEntity> clientMap) {
return clientMap[credit.clientId];
}
var memoizedFilteredCreditList = memo6(
(BuiltMap<String, InvoiceEntity> creditMap,
BuiltList<String> creditList,
BuiltMap<String, ClientEntity> clientMap,
ListUIState creditListState,
StaticState staticState,
BuiltMap<String, UserEntity> userMap) =>
filteredCreditsSelector(creditMap, creditList, clientMap,
creditListState, staticState, userMap));
List<String> filteredCreditsSelector(
BuiltMap<String, InvoiceEntity> creditMap,
BuiltList<String> creditList,
BuiltMap<String, ClientEntity> clientMap,
ListUIState creditListState,
StaticState staticState,
BuiltMap<String, UserEntity> userMap) {
final list = creditList.where((creditId) {
final credit = creditMap[creditId];
final client =
clientMap[credit.clientId] ?? ClientEntity(id: credit.clientId);
if (!client.isActive && !creditListState.entityMatchesFilter(client)) {
return false;
}
if (creditListState.filterEntityType == EntityType.client) {
if (!creditListState.entityMatchesFilter(client)) {
return false;
}
} else if (creditListState.filterEntityType == EntityType.user) {
if (credit.assignedUserId != creditListState.filterEntityId) {
return false;
}
}
if (!credit.matchesStates(creditListState.stateFilters)) {
return false;
}
if (!credit.matchesStatuses(creditListState.statusFilters)) {
return false;
}
if (!credit.matchesFilter(creditListState.filter) &&
!client.matchesFilter(creditListState.filter)) {
return false;
}
if (creditListState.custom1Filters.isNotEmpty &&
!creditListState.custom1Filters.contains(credit.customValue1)) {
return false;
}
if (creditListState.custom2Filters.isNotEmpty &&
!creditListState.custom2Filters.contains(credit.customValue2)) {
return false;
}
return true;
}).toList();
list.sort((creditAId, creditBId) {
return creditMap[creditAId].compareTo(
invoice: creditMap[creditBId],
sortField: creditListState.sortField,
sortAscending: creditListState.sortAscending,
clientMap: clientMap,
staticState: staticState,
userMap: userMap);
});
return list;
}
var memoizedCreditStatsForClient = memo2(
(String clientId, BuiltMap<String, InvoiceEntity> creditMap) =>
creditStatsForClient(clientId, creditMap));
EntityStats creditStatsForClient(
String clientId, BuiltMap<String, InvoiceEntity> creditMap) {
int countActive = 0;
int countArchived = 0;
creditMap.forEach((creditId, credit) {
if (credit.clientId == clientId) {
if (credit.isActive) {
countActive++;
} else if (credit.isArchived) {
countArchived++;
}
}
});
return EntityStats(countActive: countActive, countArchived: countArchived);
}
var memoizedCreditStatsForUser = memo2(
(String userId, BuiltMap<String, InvoiceEntity> creditMap) =>
creditStatsForUser(userId, creditMap));
EntityStats creditStatsForUser(
String userId,
BuiltMap<String, InvoiceEntity> creditMap,
) {
int countActive = 0;
int countArchived = 0;
creditMap.forEach((creditId, credit) {
if (credit.assignedUserId == userId) {
if (credit.isActive) {
countActive++;
} else if (credit.isArchived) {
countArchived++;
}
}
});
return EntityStats(countActive: countActive, countArchived: countArchived);
}
bool hasCreditChanges(
InvoiceEntity credit, BuiltMap<String, InvoiceEntity> creditMap) =>
credit.isNew ? credit.isChanged : credit != creditMap[credit.id];