/**
* 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.HashMap;
import java.util.Map;
import org.joda.beans.impl.flexi.FlexiBean;
import org.threeten.bp.LocalDate;
import org.threeten.bp.LocalTime;
import org.threeten.bp.ZoneOffset;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.analytics.financial.equity.EquityDefinition;
import com.opengamma.analytics.financial.equity.trs.definition.EquityTotalReturnSwapDefinition;
import com.opengamma.analytics.financial.instrument.InstrumentDefinition;
import com.opengamma.analytics.financial.instrument.annuity.AnnuityDefinition;
import com.opengamma.analytics.financial.instrument.payment.PaymentDefinition;
import com.opengamma.analytics.financial.legalentity.GICSCode;
import com.opengamma.analytics.financial.legalentity.LegalEntity;
import com.opengamma.analytics.financial.legalentity.Sector;
import com.opengamma.core.convention.ConventionSource;
import com.opengamma.core.holiday.HolidaySource;
import com.opengamma.core.security.SecuritySource;
import com.opengamma.financial.security.FinancialSecurity;
import com.opengamma.financial.security.FinancialSecurityVisitorAdapter;
import com.opengamma.financial.security.bond.BondSecurity;
import com.opengamma.financial.security.equity.EquitySecurity;
import com.opengamma.financial.security.irs.FloatingInterestRateSwapLeg;
import com.opengamma.financial.security.irs.NotionalExchange;
import com.opengamma.financial.security.irs.PayReceiveType;
import com.opengamma.financial.security.swap.EquityTotalReturnSwapSecurity;
import com.opengamma.util.ArgumentChecker;
/**
* Converts {@link EquityTotalReturnSwapSecurity} classes to {@link EquityTotalReturnSwapDefinition},
* which are required for use in the analytics library.
*/
public class EquityTotalReturnSwapSecurityConverter extends FinancialSecurityVisitorAdapter<InstrumentDefinition<?>> {
/** The convention source */
private final ConventionSource _conventionSource;
/** The holiday source */
private final HolidaySource _holidaySource;
/** The security source */
private final SecuritySource _securitySource;
/**
* @param conventionSource The convention source, not null
* @param holidaySource The holiday source, not null
* @param securitySource The security source, not null
*/
public EquityTotalReturnSwapSecurityConverter(final ConventionSource conventionSource, final HolidaySource holidaySource,
final SecuritySource securitySource) {
ArgumentChecker.notNull(conventionSource, "conventionSource");
ArgumentChecker.notNull(holidaySource, "holidaySource");
ArgumentChecker.notNull(securitySource, "securitySource");
_conventionSource = conventionSource;
_holidaySource = holidaySource;
_securitySource = securitySource;
}
@Override
public EquityTotalReturnSwapDefinition visitEquityTotalReturnSwapSecurity(final EquityTotalReturnSwapSecurity security) {
ArgumentChecker.notNull(security, "security");
final FinancialSecurity underlying = (FinancialSecurity) _securitySource.getSingle(security.getAssetId().toBundle()); //TODO ignoring version
if (underlying instanceof BondSecurity) {
throw new OpenGammaRuntimeException("Underlying for equity TRS was not an equity");
}
final FloatingInterestRateSwapLeg fundingLeg = security.getFundingLeg();
final boolean isPayer = fundingLeg.getPayReceiveType() == PayReceiveType.PAY ? true : false;
final LocalDate startDate = security.getEffectiveDate();
final LocalDate endDate = security.getMaturityDate();
final NotionalExchange notionalExchange = NotionalExchange.NO_EXCHANGE;
final AnnuityDefinition<? extends PaymentDefinition> annuityDefinition = AnnuityUtils.buildFloatingAnnuityDefinition(_conventionSource, _holidaySource, _securitySource, isPayer,
startDate, endDate, notionalExchange, fundingLeg);
final EquitySecurity equity = (EquitySecurity) underlying;
final LegalEntity legalEntity = getLegalEntityForEquity(equity);
final EquityDefinition equityDefinition = new EquityDefinition(legalEntity, equity.getCurrency(), security.getNumberOfShares());
final ZonedDateTime startDateTime = startDate.atTime(LocalTime.MIN).atZone(ZoneOffset.UTC);
final ZonedDateTime endDateTime = endDate.atTime(LocalTime.MIN).atZone(ZoneOffset.UTC);
return new EquityTotalReturnSwapDefinition(startDateTime, endDateTime, annuityDefinition, equityDefinition, security.getNotionalAmount(),
security.getNotionalCurrency(), security.getDividendPercentage() / 100.);
}
/**
* Gets the legal entity of an equity from information in the security. Sets the ticker, short name and the
* sector (GICS code only) if the GICS code is available.
* @param equity The equity
* @return The legal entity
*/
private static LegalEntity getLegalEntityForEquity(final EquitySecurity equity) {
if (equity.getGicsCode() != null) {
final GICSCode gics = GICSCode.of(equity.getGicsCode().getCode());
final Map<String, Object> map = new HashMap<>();
final FlexiBean classifications = new FlexiBean();
map.put(GICSCode.NAME, gics);
classifications.putAll(map);
final Sector sector = Sector.of(equity.getGicsCode().getSectorDescription(), classifications);
return new LegalEntity(equity.getShortName(), equity.getCompanyName(), null, sector, null);
}
return new LegalEntity(equity.getShortName(), equity.getCompanyName(), null, null, null);
}
}