refactor of money utils with new money2 package

This commit is contained in:
Arseni
2026-03-13 03:17:29 +03:00
parent b4eb1437f6
commit 0091191d97
72 changed files with 453 additions and 982 deletions

View File

@@ -1,96 +1,27 @@
import 'package:flutter/widgets.dart';
import 'package:pshared/models/asset.dart';
import 'package:pshared/models/money.dart';
import 'package:money2/money2.dart';
import 'package:pshared/utils/currency.dart';
import 'package:pshared/utils/money.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
String unavailableMoneyValue(BuildContext context) {
return AppLocalizations.of(context)!.valueUnavailable;
}
String unavailableMoneyValueFromL10n(AppLocalizations l10n) {
return l10n.valueUnavailable;
}
String formatMoneyUi(
BuildContext context,
Money? money, {
String separator = ' ',
}) {
return formatMoneyUiWithL10n(
AppLocalizations.of(context)!,
money,
separator: separator,
);
}
String formatMoneyUiWithL10n(
AppLocalizations l10n,
Money? money, {
String separator = ' ',
}) {
final unavailableValue = unavailableMoneyValueFromL10n(l10n);
return formatMoneyDisplay(
money,
fallback: unavailableValue,
invalidAmountFallback: unavailableValue,
separator: separator,
);
String formatMoneyUi(BuildContext context, Money? money) {
final l10n = AppLocalizations.of(context)!;
if (money == null) return l10n.valueUnavailable;
return money.toString();
}
String formatAmountUi(
BuildContext context, {
required double amount,
required String currency,
String separator = ' ',
}) {
return formatAmountUiWithL10n(
AppLocalizations.of(context)!,
amount: amount,
currency: currency,
separator: separator,
);
}
final l10n = AppLocalizations.of(context)!;
final moneyCurrency = money2CurrencyFromCode(currency);
if (moneyCurrency == null) return l10n.valueUnavailable;
String formatAmountUiWithL10n(
AppLocalizations l10n, {
required double amount,
required String currency,
String separator = ' ',
}) {
return formatMoneyUiWithL10n(
l10n,
Money(amount: amountToString(amount), currency: currency),
separator: separator,
);
}
String formatAssetUi(
BuildContext context,
Asset? asset, {
String separator = ' ',
}) {
return formatAssetUiWithL10n(
AppLocalizations.of(context)!,
asset,
separator: separator,
);
}
String formatAssetUiWithL10n(
AppLocalizations l10n,
Asset? asset, {
String separator = ' ',
}) {
if (asset == null) return unavailableMoneyValueFromL10n(l10n);
return formatAmountUiWithL10n(
l10n,
amount: asset.amount,
currency: currencyCodeToString(asset.currency),
separator: separator,
);
final money = Money.fromNumWithCurrency(amount, moneyCurrency);
return money.toString();
}

View File

@@ -1,5 +1,3 @@
import 'package:pshared/utils/money.dart';
import 'package:pweb/models/payment/multiple_payouts/csv_row.dart';
@@ -82,8 +80,8 @@ class MultipleCsvParser {
throw FormatException('CSV row ${i + 1}: amount is required');
}
final parsedAmount = parseMoneyAmount(amount, fallback: double.nan);
if (parsedAmount.isNaN || parsedAmount <= 0) {
final parsedAmount = double.tryParse(amount);
if (parsedAmount == null || parsedAmount <= 0) {
throw FormatException(
'CSV row ${i + 1}: amount must be greater than 0',
);

View File

@@ -1,4 +1,3 @@
import 'package:pshared/models/money.dart';
import 'package:pshared/models/payment/customer.dart';
import 'package:pshared/models/payment/fees/treatment.dart';
import 'package:pshared/models/payment/intent.dart';
@@ -6,6 +5,7 @@ import 'package:pshared/models/payment/kind.dart';
import 'package:pshared/models/payment/methods/card.dart';
import 'package:pshared/models/payment/methods/data.dart';
import 'package:pshared/models/payment/settlement_mode.dart';
import 'package:pshared/utils/money.dart';
import 'package:pshared/utils/payment/fx_helpers.dart';
import 'package:pweb/models/payment/multiple_payouts/csv_row.dart';
@@ -30,7 +30,12 @@ class MultipleIntentBuilder {
.map((entry) {
final rowIndex = entry.key;
final row = entry.value;
final amount = Money(amount: row.amount, currency: _currency);
final amount = parseMoneyWithCurrencyCode(row.amount, _currency);
if (amount == null) {
throw FormatException(
'Invalid CSV amount at row ${rowIndex + 1}: ${row.amount}',
);
}
final destination = CardPaymentMethod(
pan: row.pan,
firstName: row.firstName,

View File

@@ -2,15 +2,14 @@ import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:pshared/models/money.dart';
import 'package:money2/money2.dart';
import 'package:pshared/utils/localization.dart';
import 'package:pweb/utils/money_display.dart';
String formatMoney(BuildContext context, Money? money) {
if (money == null || money.amount.trim().isEmpty) {
return unavailableMoneyValue(context);
}
return formatMoneyUi(context, money);
}

View File

@@ -3,7 +3,6 @@ import 'package:pshared/models/payment/operation.dart';
import 'package:pshared/models/payment/payment.dart';
import 'package:pshared/models/payment/state.dart';
import 'package:pshared/models/payment/status.dart';
import 'package:pshared/utils/money.dart';
import 'package:pweb/utils/payment/upload_metadata.dart';
import 'package:pweb/utils/report/operations/document_rule.dart';
@@ -14,12 +13,12 @@ OperationItem mapPaymentToOperation(Payment payment) {
final settlement = payment.lastQuote?.amounts?.destinationSettlement;
final amountMoney = debit ?? settlement;
final amount = parseMoneyAmount(amountMoney?.amount);
final currency = amountMoney?.currency ?? '';
final amount = amountMoney?.toDouble() ?? 0;
final currency = amountMoney?.currency.isoCode ?? '';
final toAmount = settlement == null
? amount
: parseMoneyAmount(settlement.amount);
final toCurrency = settlement?.currency ?? currency;
: settlement.toDouble();
final toCurrency = settlement?.currency.isoCode ?? currency;
final payId = _firstNonEmpty([payment.paymentRef]) ?? '-';
final name =