/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.conversion; import java.util.ArrayList; import java.util.List; import org.threeten.bp.LocalDate; import org.threeten.bp.ZoneOffset; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.instrument.InstrumentDefinition; import com.opengamma.analytics.financial.instrument.annuity.AnnuityDefinition; import com.opengamma.analytics.financial.instrument.payment.CouponFixedDefinition; import com.opengamma.core.position.Trade; import com.opengamma.core.security.Security; import com.opengamma.financial.convention.calendar.MondayToFridayCalendar; import com.opengamma.financial.security.FinancialSecurityUtils; import com.opengamma.financial.security.irs.PayReceiveType; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.Currency; //TODO: REQS-554 Holidays and calendars /** * Convert fees on a trade to an instrument definition. */ public class TradeFeeConverter implements TradeConverter { private static final TradeFeeConverter INSTANCE = new TradeFeeConverter(); private static final String FEE_DATE = "FEE_%d_DATE"; private static final String FEE_CURRENCY = "FEE_%d_CURRENCY"; private static final String FEE_AMOUNT = "FEE_%d_AMOUNT"; private static final String FEE_DIRECTION = "FEE_%d_DIRECTION"; /** * Get an instance * * @return the instance */ public static final TradeFeeConverter getInstance() { return INSTANCE; } /** * Construct a definition from the fees on a trade. * * @param trade the trade, not null * @return the definition, null if no fees */ public InstrumentDefinition<?> convert(final Trade trade) { ArgumentChecker.notNull(trade, "trade"); List<CouponFixedDefinition> fees = new ArrayList<>(); Security security = trade.getSecurity(); Currency securityCcy = FinancialSecurityUtils.getCurrency(security); for (int i = 1;; i++) { if (!trade.getAttributes().containsKey(String.format(FEE_DATE, i))) { break; } final LocalDate feeDate = LocalDate.parse(trade.getAttributes().get(String.format(FEE_DATE, i))); final ZonedDateTime feeTime = feeDate.atStartOfDay(ZoneOffset.UTC); final Currency ccy = Currency.of(trade.getAttributes().get(String.format(FEE_CURRENCY, i))); ArgumentChecker.isTrue(securityCcy.equals(ccy), "Fee must be in security currency {} got {}", securityCcy, ccy); final Double amount = Double.parseDouble(trade.getAttributes().get(String.format(FEE_AMOUNT, i))); final PayReceiveType payOrReceive = PayReceiveType.valueOf(trade.getAttributes().get(String.format(FEE_DIRECTION, i))); final CouponFixedDefinition payment = new CouponFixedDefinition(ccy, feeTime, feeTime, feeTime, 1, payOrReceive == PayReceiveType.PAY ? -amount : amount, 1); fees.add(payment); } if (!fees.isEmpty()) { return new AnnuityDefinition<>(fees.toArray(new CouponFixedDefinition[fees.size()]), new MondayToFridayCalendar("")); } else { return null; } } }