added ledger as souec of funds for payouts

This commit is contained in:
Arseni
2026-03-03 21:03:30 +03:00
parent 3f578353da
commit 51c72a87ae
29 changed files with 796 additions and 385 deletions

View File

@@ -4,6 +4,7 @@ import 'package:pshared/models/payment/quote/quote.dart';
import 'package:pshared/utils/currency.dart';
import 'package:pshared/utils/money.dart';
Money? quoteFeeTotal(PaymentQuote? quote) {
final preferredCurrency =
quote?.amounts?.sourcePrincipal?.currency ??
@@ -14,6 +15,36 @@ Money? quoteFeeTotal(PaymentQuote? quote) {
);
}
Money? quoteSourceDebitTotal(
PaymentQuote? quote, {
String? preferredSourceCurrency,
}) {
final sourceDebitTotal = quote?.amounts?.sourceDebitTotal;
final preferredCurrency = _normalizeCurrency(
preferredSourceCurrency ?? quote?.amounts?.sourcePrincipal?.currency,
);
if (sourceDebitTotal == null) {
return _rebuildSourceDebitTotal(
quote,
preferredSourceCurrency: preferredCurrency,
);
}
final debitCurrency = _normalizeCurrency(sourceDebitTotal.currency);
if (preferredCurrency == null ||
debitCurrency == null ||
debitCurrency == preferredCurrency) {
return sourceDebitTotal;
}
final rebuilt = _rebuildSourceDebitTotal(
quote,
preferredSourceCurrency: preferredCurrency,
);
return rebuilt ?? sourceDebitTotal;
}
Money? quoteFeeTotalFromLines(
List<FeeLine>? lines, {
String? preferredCurrency,
@@ -74,6 +105,44 @@ List<Money> aggregateMoneyByCurrency(Iterable<Money?> values) {
.toList();
}
Money? _rebuildSourceDebitTotal(
PaymentQuote? quote, {
String? preferredSourceCurrency,
}) {
final sourcePrincipal = quote?.amounts?.sourcePrincipal;
if (sourcePrincipal == null) return null;
final principalCurrency = _normalizeCurrency(sourcePrincipal.currency);
if (principalCurrency == null) return null;
if (preferredSourceCurrency != null &&
principalCurrency != preferredSourceCurrency) {
return null;
}
final principalAmount = parseMoneyAmount(
sourcePrincipal.amount,
fallback: double.nan,
);
if (principalAmount.isNaN) return null;
double totalAmount = principalAmount;
final fee = quoteFeeTotalFromLines(
quote?.fees?.lines,
preferredCurrency: principalCurrency,
);
if (fee != null && _normalizeCurrency(fee.currency) == principalCurrency) {
final feeAmount = parseMoneyAmount(fee.amount, fallback: double.nan);
if (!feeAmount.isNaN) {
totalAmount += feeAmount;
}
}
return Money(
amount: amountToString(totalAmount),
currency: principalCurrency,
);
}
double _lineSign(String? side) {
final normalized = side?.trim().toLowerCase() ?? '';
switch (normalized) {