Show clients unapplied payments and credits

This commit is contained in:
Hillel Coren 2022-07-31 12:27:45 +03:00
parent 4d42bb3d7e
commit fd40d4f411
2 changed files with 50 additions and 0 deletions

View File

@ -162,6 +162,40 @@ SettingsEntity getVendorSettings(AppState state, VendorEntity vendor) {
);
}
var memoizedGetClientUnappliedPayments = memo2(
(String clientId, BuiltMap<String, PaymentEntity> paymentMap) =>
getClientUnappliedPayments(clientId: clientId, paymentMap: paymentMap));
double getClientUnappliedPayments(
{String clientId, BuiltMap<String, PaymentEntity> paymentMap}) {
double amount = 0;
paymentMap.forEach((paymentId, payment) {
if (payment.clientId == clientId) {
amount += payment.amount - payment.applied;
}
});
return amount;
}
var memoizedGetClientAvailableCredits = memo2(
(String clientId, BuiltMap<String, InvoiceEntity> creditMap) =>
getClientAvailableCredits(clientId: clientId, creditMap: creditMap));
double getClientAvailableCredits(
{String clientId, BuiltMap<String, InvoiceEntity> creditMap}) {
double amount = 0;
creditMap.forEach((creditId, credit) {
if (credit.clientId == clientId) {
amount += credit.balance;
}
});
return amount;
}
bool hasClientChanges(
ClientEntity client, BuiltMap<String, ClientEntity> clientMap) =>
client.isNew ? client.isChanged : client != clientMap[client.id];

View File

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/client/client_selectors.dart';
import 'package:invoiceninja_flutter/ui/app/copy_to_clipboard.dart';
import 'package:invoiceninja_flutter/ui/app/entity_header.dart';
import 'package:invoiceninja_flutter/ui/app/form_card.dart';
@ -70,6 +71,11 @@ class _ClientViewFullwidthState extends State<ClientViewFullwidth>
!state.uiState.isEditing &&
state.prefState.isModuleTable;
final availableCredits =
memoizedGetClientAvailableCredits(client.id, state.creditState.map);
final unappliedPayments =
memoizedGetClientUnappliedPayments(client.id, state.paymentState.map);
return LayoutBuilder(builder: (context, layout) {
final minHeight = layout.maxHeight - (kMobileDialogPadding * 2) - 43;
return Row(
@ -94,6 +100,16 @@ class _ClientViewFullwidthState extends State<ClientViewFullwidth>
style: Theme.of(context).textTheme.headline6,
),
SizedBox(height: 8),
if (availableCredits != 0)
Text(localization.credit +
': ' +
formatNumber(availableCredits, context,
clientId: client.id)),
if (unappliedPayments != 0)
Text(localization.payments +
': ' +
formatNumber(unappliedPayments, context,
clientId: client.id)),
if (client.idNumber.isNotEmpty)
Padding(
padding: const EdgeInsets.only(bottom: 1),