import nl.strohalm.cyclos.entities.accounts.transactions.Transfer; //导入方法依赖的package包/类
@Override
public TransactionFeePreviewDTO preview(AccountOwner from, final AccountOwner to, TransferType transferType, final BigDecimal amount, final RatesResultDTO rates) {
Calendar rawARate = rates.getEmissionDate();
Calendar rawDRate = rates.getExpirationDate();
final LocalSettings localSettings = settingsService.getLocalSettings();
if (from == null) {
from = LoggedUser.accountOwner();
}
boolean showZeroFees = (rates instanceof RatesPreviewDTO && ((RatesPreviewDTO) rates).isGraph());
final Account fromAccount = accountService.getAccount(new AccountDTO(from, transferType.getFrom()));
final Account toAccount = accountService.getAccount(new AccountDTO(to, transferType.getTo()));
BigDecimal finalAmount = amount;
final Map map = new LinkedHashMap();
transferType = fetchService.fetch(transferType, TransferType.Relationships.TRANSACTION_FEES);
final Collection extends TransactionFee> fees = transferType.getTransactionFees();
final Calendar processDate = (rates != null && rates.getDate() != null) ? rates.getDate() : Calendar.getInstance();
if (fees != null && !fees.isEmpty()) {
// Search for enabled fees that the source pays
for (final TransactionFee fee : fees) {
// We just want fees the source member would pay
if (!shouldPreviewFee(from, to, amount, fee)) {
continue;
}
// The buildTransfer() method returns a transfer if the fee should be applied or null
final BuildTransferWithFeesDTO buildParams = new BuildTransferWithFeesDTO(processDate, fromAccount, toAccount, amount, fee, true);
buildParams.setEmissionDate(rawARate);
buildParams.setExpirationDate(rawDRate);
buildParams.setShowZeroFees(showZeroFees);
final Transfer generatedTransfer = buildTransfer(buildParams);
if (generatedTransfer != null) {
final BigDecimal feeAmount = generatedTransfer.getAmount();
map.put(fee, feeAmount);
// Check deducted amount
if (fee.isDeductAmount()) {
finalAmount = finalAmount.subtract(feeAmount);
}
}
}
}
final TransactionFeePreviewForRatesDTO result = new TransactionFeePreviewForRatesDTO();
result.setFees(map);
result.setFinalAmount(localSettings.round(finalAmount));
result.setAmount(localSettings.round(amount));
result.setARate(rates.getaRate());
result.setDRate(rates.getdRate());
return result;
}