added ledger as souec of funds for payouts
This commit is contained in:
@@ -1,13 +1,17 @@
|
||||
import 'package:pshared/controllers/balance_mask/wallets.dart';
|
||||
import 'package:pshared/controllers/payment/source.dart';
|
||||
import 'package:pshared/models/payment/asset.dart';
|
||||
import 'package:pshared/models/payment/chain_network.dart';
|
||||
import 'package:pshared/models/payment/customer.dart';
|
||||
import 'package:pshared/models/payment/currency_pair.dart';
|
||||
import 'package:pshared/models/payment/fees/treatment.dart';
|
||||
import 'package:pshared/models/payment/fx/intent.dart';
|
||||
import 'package:pshared/models/payment/fx/side.dart';
|
||||
import 'package:pshared/models/payment/kind.dart';
|
||||
import 'package:pshared/models/payment/methods/card.dart';
|
||||
import 'package:pshared/models/payment/methods/crypto_address.dart';
|
||||
import 'package:pshared/models/payment/methods/data.dart';
|
||||
import 'package:pshared/models/payment/methods/iban.dart';
|
||||
import 'package:pshared/models/payment/methods/ledger.dart';
|
||||
import 'package:pshared/models/payment/methods/managed_wallet.dart';
|
||||
import 'package:pshared/models/payment/methods/russian_bank.dart';
|
||||
import 'package:pshared/models/payment/methods/type.dart';
|
||||
@@ -18,7 +22,6 @@ import 'package:pshared/models/recipient/recipient.dart';
|
||||
import 'package:pshared/provider/payment/amount.dart';
|
||||
import 'package:pshared/provider/payment/flow.dart';
|
||||
import 'package:pshared/provider/recipient/provider.dart';
|
||||
import 'package:pshared/utils/currency.dart';
|
||||
import 'package:pshared/utils/payment/fx_helpers.dart';
|
||||
|
||||
class QuotationIntentBuilder {
|
||||
@@ -26,21 +29,23 @@ class QuotationIntentBuilder {
|
||||
|
||||
PaymentIntent? build({
|
||||
required PaymentAmountProvider payment,
|
||||
required WalletsController wallets,
|
||||
required PaymentSourceController source,
|
||||
required PaymentFlowProvider flow,
|
||||
required RecipientsProvider recipients,
|
||||
}) {
|
||||
final selectedWallet = wallets.selectedWallet;
|
||||
final sourceMethod = _resolveSourceMethod(source);
|
||||
final sourceCurrency = source.selectedCurrencyCode;
|
||||
final paymentData = flow.selectedPaymentData;
|
||||
final selectedMethod = flow.selectedMethod;
|
||||
if (selectedWallet == null || paymentData == null) return null;
|
||||
if (sourceMethod == null || sourceCurrency == null || paymentData == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final customer = _buildCustomer(
|
||||
recipient: recipients.currentObject,
|
||||
method: selectedMethod,
|
||||
data: paymentData,
|
||||
);
|
||||
final sourceCurrency = currencyCodeToString(selectedWallet.currency);
|
||||
final amountCurrency = payment.settlementMode == SettlementMode.fixReceived
|
||||
? _settlementCurrency
|
||||
: sourceCurrency;
|
||||
@@ -48,26 +53,22 @@ class QuotationIntentBuilder {
|
||||
amount: payment.amount.toString(),
|
||||
currency: amountCurrency,
|
||||
);
|
||||
final isLedgerSource = source.selectedLedgerAccount != null;
|
||||
final isCryptoToCrypto =
|
||||
paymentData is CryptoAddressPaymentMethod &&
|
||||
(paymentData.asset?.tokenSymbol ?? '').trim().toUpperCase() ==
|
||||
amount.currency;
|
||||
final fxIntent = FxIntentHelper.buildSellBaseBuyQuote(
|
||||
baseCurrency: sourceCurrency,
|
||||
quoteCurrency: _settlementCurrency, // TODO: exentd target currencies
|
||||
final fxIntent = _buildFxIntent(
|
||||
sourceCurrency: sourceCurrency,
|
||||
settlementMode: payment.settlementMode,
|
||||
isLedgerSource: isLedgerSource,
|
||||
enabled: !isCryptoToCrypto,
|
||||
);
|
||||
return PaymentIntent(
|
||||
kind: PaymentKind.payout,
|
||||
amount: amount,
|
||||
destination: paymentData,
|
||||
source: ManagedWalletPaymentMethod(
|
||||
managedWalletRef: selectedWallet.id,
|
||||
asset: PaymentAsset(
|
||||
tokenSymbol: selectedWallet.tokenSymbol ?? '',
|
||||
chain: selectedWallet.network ?? ChainNetwork.unspecified,
|
||||
),
|
||||
),
|
||||
source: sourceMethod,
|
||||
fx: fxIntent,
|
||||
feeTreatment: payment.payerCoversFee
|
||||
? FeeTreatment.addToSource
|
||||
@@ -77,6 +78,56 @@ class QuotationIntentBuilder {
|
||||
);
|
||||
}
|
||||
|
||||
FxIntent? _buildFxIntent({
|
||||
required String sourceCurrency,
|
||||
required SettlementMode settlementMode,
|
||||
required bool isLedgerSource,
|
||||
required bool enabled,
|
||||
}) {
|
||||
if (!enabled) return null;
|
||||
|
||||
// Ledger sources in fix_received mode need explicit reverse side.
|
||||
// BFF maps only settlement currency + fx side, then quotation derives pair.
|
||||
// For ledger this preserves source debit in ledger currency (e.g. USDT).
|
||||
if (isLedgerSource && settlementMode == SettlementMode.fixReceived) {
|
||||
final base = sourceCurrency.trim();
|
||||
final quote = _settlementCurrency;
|
||||
if (base.isEmpty || base.toUpperCase() == quote.toUpperCase()) {
|
||||
return null;
|
||||
}
|
||||
return FxIntent(
|
||||
pair: CurrencyPair(base: base, quote: quote),
|
||||
side: FxSide.buyBaseSellQuote,
|
||||
);
|
||||
}
|
||||
|
||||
return FxIntentHelper.buildSellBaseBuyQuote(
|
||||
baseCurrency: sourceCurrency,
|
||||
quoteCurrency: _settlementCurrency, // TODO: exentd target currencies
|
||||
enabled: true,
|
||||
);
|
||||
}
|
||||
|
||||
PaymentMethodData? _resolveSourceMethod(PaymentSourceController source) {
|
||||
final wallet = source.selectedWallet;
|
||||
if (wallet != null) {
|
||||
return ManagedWalletPaymentMethod(
|
||||
managedWalletRef: wallet.id,
|
||||
asset: PaymentAsset(
|
||||
tokenSymbol: wallet.tokenSymbol ?? '',
|
||||
chain: wallet.network ?? ChainNetwork.unspecified,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
final ledger = source.selectedLedgerAccount;
|
||||
if (ledger != null) {
|
||||
return LedgerPaymentMethod(ledgerAccountRef: ledger.ledgerAccountRef);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
Customer? _buildCustomer({
|
||||
required Recipient? recipient,
|
||||
required PaymentMethod? method,
|
||||
|
||||
Reference in New Issue
Block a user