FEC.java
package com.tradecloud.domain.model.fec;
import com.tradecloud.domain.model.ForexGroup;
import com.tradecloud.domain.model.Money;
import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import org.hibernate.annotations.DiscriminatorOptions;
import org.joda.time.LocalDate;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Currency;
import java.util.Date;
import java.util.List;
/**
* FEC is the root entity of the FEC aggregate. FEC stands for Foreign Exchange
* Contract. An FEC represents a contract with a particular bank to buy or sell
* an amount of foreign exchange at a specific rate (forward rate) on a
* particular date (maturity date). The details that constitute a FEC are
* captured by a Treasurer using a separation of concerns Context Mapping
* Strategy (see the Domain Driven Design book by Eric Evans).
*/
@Entity
@Table(name = "fec")
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING, length = 255)
@DiscriminatorValue("FEC")
@DiscriminatorOptions(force = true)
public class FEC extends AbstractFEC {
/**
* for JPA use only.
*/
public FEC() {
}
public static FEC createFEC(LocalDate dealDate, BankReference bankReference, InternalReference internalReference, Money amount,
LocalDate maturityDate, BankDetails bankDetails, Money spotRate, Money forwardRate,
OrganisationalUnit organisationalUnit,
ForexGroup forexGroup, FECTransactionType fecTransactionType) {
return new FEC(dealDate, bankReference, internalReference, amount, maturityDate, bankDetails, spotRate, forwardRate, organisationalUnit,
forexGroup, fecTransactionType);
}
protected FEC(LocalDate dealDate, BankReference bankReference, InternalReference internalReference, Money amount, LocalDate maturityDate,
BankDetails bankDetails, Money spotRate, Money forwardRate, OrganisationalUnit organisationalUnit,
ForexGroup forexGroup, FECTransactionType fecTransactionType) {
this.bankReference = bankReference;
this.internalReference = internalReference;
this.amount = amount;
this.maturityDate = maturityDate;
this.bankDetails = bankDetails;
this.spotRate = spotRate;
this.forwardRate = forwardRate;
this.dealDate = dealDate;
if (this.dealDate == null) {
this.dealDate = new LocalDate();
}
this.unlinkedAmount = amount;
this.organisationalUnit = organisationalUnit;
this.forexGroup = forexGroup;
this.fecTransactionType = fecTransactionType;
type = FECType.FEC;
}
public static FEC createBlankFEC(LocalDate maturityDate, Money amount, Currency currency) {
return new FEC(new LocalDate(), null, null, amount, maturityDate, null, new Money(BigDecimal.ZERO, currency), new Money(BigDecimal.ZERO,
currency), null, null, null);
}
@Override
public void confirm() {
confirmed = true;
confirmedDateTime = new Date();
}
@Override
public void update(BankReference bankReference, InternalReference internalReference, Money amount, LocalDate dealDate, LocalDate maturityDate,
BankDetails bankDetails, Money spotRate, Money forwardRate, FECTransactionType fecTransactionType) {
this.bankReference = bankReference;
this.internalReference = internalReference;
this.unlinkedAmount = this.unlinkedAmount.add(amount.subtract(this.amount));
this.amount = amount;
this.maturityDate = maturityDate;
this.dealDate = dealDate;
this.bankDetails = bankDetails;
this.spotRate = spotRate;
this.forwardRate = forwardRate;
this.fecTransactionType = fecTransactionType;
}
@Override
public BankReference getBankReference() {
return bankReference;
}
@Override
public InternalReference getInternalReference() {
return internalReference;
}
@Override
public Money getForwardRate() {
return forwardRate;
}
@Override
public Money getSpotRate() {
return spotRate;
}
@Override
public LocalDate getMaturityDate() {
return maturityDate;
}
@Override
public LocalDate getDealDate() {
return dealDate;
}
@Override
public boolean isConfirmed() {
return confirmed;
}
@Override
public boolean isSurrender() {
return false;
}
public static StringBuilder getFECListAsXml(List<IFEC> fecs) {
StringBuilder builder = new StringBuilder();
builder.append("<fecs>");
for (IFEC fec : fecs) {
builder.append(fec.getStateAsXML());
}
builder.append("</fecs>");
return builder;
}
@Override
public BankDetails getBankDetails() {
return bankDetails;
}
@Override
public Money getUnlinkedAmount() {
return unlinkedAmount;
}
@Override
public Money getLinkedAmount() {
return getAmount().subtract(getUnlinkedAmount());
}
@Override
public void setUnlinkedAmount(Money unlinkedAmount) {
this.unlinkedAmount = unlinkedAmount;
}
}