ServiceProviderInvoice.java
package com.tradecloud.domain.document.invoice;
import com.tradecloud.domain.base.utils.MathUtils;
import com.tradecloud.domain.common.Currency;
import com.tradecloud.domain.costing.ALCRateDefault;
import com.tradecloud.domain.costing.CostGroup;
import com.tradecloud.domain.document.ServiceProviderCreditNote;
import com.tradecloud.domain.model.payment.PaymentTerm;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import java.math.BigDecimal;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
/**
* The service provider invoice.
* Used for capturing all the indirect costs from the various service providers
* e.g. freight, customs and clearing fees.
*/
@Entity
@Table(name = "serviceproviderinvoice")
@NamedQueries({
@NamedQuery(name = "serviceProviderInvoice.byReference",
query = "from ServiceProviderInvoice spi where spi.reference = :reference and spi.state != 'DELETED'"),
@NamedQuery(name = "serviceProviderInvoice.byReferenceAndServiceProvider",
query = "from ServiceProviderInvoice spi where spi.reference = :reference and spi.serviceProvider = :serviceProvider" +
" and spi.state != 'DELETED'")})
@Access(AccessType.FIELD)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "ServiceProviderInvoice")
public class ServiceProviderInvoice extends BaseServiceProviderInvoice {
private static final long serialVersionUID = 1L;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "serviceProviderInvoice", fetch = FetchType.EAGER)
private List<ServiceProviderCreditNote> serviceProviderCreditNotes = new LinkedList<>();
private String splitInvoiceReference;
@ManyToOne
private Currency splitInvoiceCurrency;
@Transient
@XmlTransient
private ALCRateDefault alcRateDefault;
private BigDecimal netLocalVatable;
private BigDecimal netLocalNonVatable;
@ElementCollection
@CollectionTable(name = "mrnNumbers", joinColumns = @JoinColumn(name = "id"))
@Column(name = "number")
private List<String> mrnNumbers;
@ElementCollection
@CollectionTable(name = "lrnNumbers", joinColumns = @JoinColumn(name = "id"))
@Column(name = "number")
private List<String> lrnNumbers;
private String paymentReference;
private String clientAccount;
@Enumerated(value = EnumType.STRING)
private InvoiceType invoiceType = InvoiceType.OTHER;
private boolean generated;
@ManyToOne(fetch = FetchType.LAZY)
private PaymentTerm paymentTerm;
private boolean includeCustomsCostGroup = true;
@ElementCollection
@CollectionTable(name = "billOfEntryDates", joinColumns = @JoinColumn(name = "id"))
@Column(name = "date")
private List<Date> billOfEntryDates;
@ElementCollection
@CollectionTable(name = "cpcCodes", joinColumns = @JoinColumn(name = "id"))
@Column(name = "code")
private List<String> cpcCodes;
@Enumerated(value = EnumType.STRING)
private ClearingLevel clearingLevel;
public enum ClearingLevel {
ITEM, STYLE;
}
public List<ServiceProviderCreditNote> getServiceProviderCreditNotes() {
return serviceProviderCreditNotes;
}
public void setServiceProviderCreditNotes(List<ServiceProviderCreditNote> serviceProviderCreditNotes) {
this.serviceProviderCreditNotes = serviceProviderCreditNotes;
}
public String getSplitInvoiceReference() {
return splitInvoiceReference;
}
public void setSplitInvoiceReference(String splitInvoiceReference) {
this.splitInvoiceReference = splitInvoiceReference;
}
public Currency getSplitInvoiceCurrency() {
return splitInvoiceCurrency;
}
public void setSplitInvoiceCurrency(Currency splitInvoiceCurrency) {
this.splitInvoiceCurrency = splitInvoiceCurrency;
}
public ALCRateDefault getAlcRateDefault() {
return alcRateDefault;
}
public void setAlcRateDefault(ALCRateDefault alcRateDefault) {
this.alcRateDefault = alcRateDefault;
}
public BigDecimal getNetLocalVatable() {
return netLocalVatable;
}
public void setNetLocalVatable(BigDecimal netLocalVatable) {
this.netLocalVatable = netLocalVatable;
}
public BigDecimal getNetLocalNonVatable() {
return netLocalNonVatable;
}
public void setNetLocalNonVatable(BigDecimal netLocalNonVatable) {
this.netLocalNonVatable = netLocalNonVatable;
}
@Transient
public String getType() {
return "SPI";
}
public List<String> getMrnNumbers() {
return mrnNumbers;
}
public void setMrnNumbers(List<String> mrnNumbers) {
this.mrnNumbers = mrnNumbers;
}
public List<String> getLrnNumbers() {
return lrnNumbers;
}
public void setLrnNumbers(List<String> lrnNumbers) {
this.lrnNumbers = lrnNumbers;
}
public boolean isCustomsInvoice() {
List<CostLineCostingCell> costLineCostingCells = getCostLineCosting().getCostLineCostingCells();
for (CostLineCostingCell costingCell : costLineCostingCells) {
if (costingCell.getCostLine().getCostLineTemplate().getCostGroup() == CostGroup.CUSTOMS &&
MathUtils.isNonZero(costingCell.getTransactionAmount())) {
return true;
}
}
return false;
}
public String getPaymentReference() {
return paymentReference;
}
public void setPaymentReference(String paymentReference) {
this.paymentReference = paymentReference;
}
public String getClientAccount() {
return clientAccount;
}
public void setClientAccount(String clientAccount) {
this.clientAccount = clientAccount;
}
public InvoiceType getInvoiceType() {
return invoiceType;
}
public void setInvoiceType(InvoiceType invoiceType) {
this.invoiceType = invoiceType;
}
public boolean isGenerated() {
return generated;
}
public void setGenerated(boolean generated) {
this.generated = generated;
}
public PaymentTerm getPaymentTerm() {
return paymentTerm;
}
public void setPaymentTerm(PaymentTerm paymentTerm) {
this.paymentTerm = paymentTerm;
}
public boolean isIncludeCustomsCostGroup() {
return includeCustomsCostGroup;
}
public void setIncludeCustomsCostGroup(boolean includeCustomsCostGroup) {
this.includeCustomsCostGroup = includeCustomsCostGroup;
}
public void setBillOfEntryDates(List<Date> billOfEntryDates) {
this.billOfEntryDates = billOfEntryDates;
}
public List<Date> getBillOfEntryDates() {
return billOfEntryDates;
}
public void setCpcCodes(List<String> cpcCodes) {
this.cpcCodes = cpcCodes;
}
public List<String> getCpcCodes() {
return cpcCodes;
}
public ClearingLevel getClearingLevel() {
return clearingLevel;
}
public void setClearingLevel(ClearingLevel clearingLevel) {
this.clearingLevel = clearingLevel;
}
}