invoice/lib/redux/product/product_selectors.dart

157 lines
5.2 KiB
Dart

// Flutter imports:
import 'package:flutter/widgets.dart';
// Package imports:
import 'package:built_collection/built_collection.dart';
import 'package:memoize/memoize.dart';
// Project imports:
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
import 'package:invoiceninja_flutter/utils/formatting.dart';
int productNotificationThreshold({
@required ProductEntity product,
@required CompanyEntity company,
}) {
if (product.stockNotificationThreshold != 0) {
return product.stockNotificationThreshold;
}
return company.stockNotificationThreshold;
}
InvoiceItemEntity convertProductToInvoiceItem({
@required ProductEntity product,
@required CompanyEntity company,
@required InvoiceEntity invoice,
@required BuiltMap<String, CurrencyEntity> currencyMap,
ClientEntity client,
}) {
if (company.fillProducts) {
double cost = product.price;
if (company.convertProductExchangeRate &&
(client?.currencyId ?? '').isNotEmpty) {
double exchangeRate = invoice.exchangeRate;
if (!company.convertRateToClient && exchangeRate != 0) {
exchangeRate = 1 / exchangeRate;
}
cost =
round(cost * exchangeRate, currencyMap[client.currencyId].precision);
}
return InvoiceItemEntity().rebuild((b) => b
..productKey = product.productKey
..notes = product.notes
..cost = cost
..productCost = product.cost
..quantity = product.quantity == 0 ? 1 : product.quantity
..customValue1 = product.customValue1
..customValue2 = product.customValue2
..customValue3 = product.customValue3
..customValue4 = product.customValue4
..taxName1 = company.numberOfItemTaxRates >= 1 ? product.taxName1 : ''
..taxRate1 = company.numberOfItemTaxRates >= 1 ? product.taxRate1 : 0
..taxName2 = company.numberOfItemTaxRates >= 2 ? product.taxName2 : ''
..taxRate2 = company.numberOfItemTaxRates >= 2 ? product.taxRate2 : 0
..taxName3 = company.numberOfItemTaxRates >= 3 ? product.taxName3 : ''
..taxRate3 = company.numberOfItemTaxRates >= 3 ? product.taxRate3 : 0);
} else {
return InvoiceItemEntity(productKey: product.productKey);
}
}
var memoizedDropdownProductList = memo3(
(BuiltMap<String, ProductEntity> productMap, BuiltList<String> productList,
BuiltMap<String, UserEntity> userMap) =>
dropdownProductsSelector(productMap, productList, userMap));
List<String> dropdownProductsSelector(
BuiltMap<String, ProductEntity> productMap,
BuiltList<String> productList,
BuiltMap<String, UserEntity> userMap) {
final list =
productList.where((productId) => productMap[productId].isActive).toList();
list.sort((productAId, productBId) {
final productA = productMap[productAId];
final productB = productMap[productBId];
return productA.compareTo(
productB, ProductFields.productKey, true, userMap);
});
return list;
}
var memoizedProductList = memo1(
(BuiltMap<String, ProductEntity> productMap) => productList(productMap));
List<String> productList(BuiltMap<String, ProductEntity> productMap) {
final list = productMap.keys
.where((productId) => productMap[productId].isActive)
.toList();
list.sort((idA, idB) => productMap[idA]
.listDisplayName
.compareTo(productMap[idB].listDisplayName));
return list;
}
var memoizedFilteredProductList = memo5((SelectionState selectionState,
BuiltMap<String, ProductEntity> productMap,
BuiltList<String> productList,
ListUIState productListState,
BuiltMap<String, UserEntity> userMap) =>
filteredProductsSelector(
selectionState, productMap, productList, productListState, userMap));
List<String> filteredProductsSelector(
SelectionState selectionState,
BuiltMap<String, ProductEntity> productMap,
BuiltList<String> productList,
ListUIState productListState,
BuiltMap<String, UserEntity> userMap) {
final list = productList.where((productId) {
final product = productMap[productId];
if (product.id == selectionState.selectedId) {
return true;
}
if (!product.matchesStates(productListState.stateFilters)) {
return false;
}
if (!product.matchesFilter(productListState.filter)) {
return false;
}
if (productListState.custom1Filters.isNotEmpty &&
!productListState.custom1Filters.contains(product.customValue1)) {
return false;
} else if (productListState.custom2Filters.isNotEmpty &&
!productListState.custom2Filters.contains(product.customValue2)) {
return false;
} else if (productListState.custom3Filters.isNotEmpty &&
!productListState.custom3Filters.contains(product.customValue3)) {
return false;
} else if (productListState.custom4Filters.isNotEmpty &&
!productListState.custom4Filters.contains(product.customValue4)) {
return false;
}
return true;
}).toList();
list.sort((productAId, productBId) {
final productA = productMap[productAId];
final productB = productMap[productBId];
return productA.compareTo(productB, productListState.sortField,
productListState.sortAscending, userMap);
});
return list;
}