AccountingEvent.java

package com.tradecloud.domain.model.events;

import org.hibernate.annotations.AccessType;

import javax.persistence.Entity;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import java.util.Date;

/**
 * Encapsulation of accounting events.
 * <p>
 * TODO: remove local AccountingEventType
 */
@SuppressWarnings("serial")
@Entity
@Table(name = "accountingevent")
@AccessType("field")
@NamedQueries({@NamedQuery(query = "select e from AccountingEvent e where e.reference = :reference and e.eventType = " +
        ":eventType order by created asc", name = "findEventByTypeAndReference"),
        @NamedQuery(query = "select e from AccountingEvent e where e.consumerTag = :consumerTag order by created asc",
                name = "findAllAccountingEventsForUser")})
public class AccountingEvent extends Event {
    private String shipmentNumber;
    private Long paymentId;
    private String serviceProvider;

    /**
     * The event types on an accounting event..
     */
    public static enum AccountingEventType {
        SUBMITTED, DIRECT_INVOICE_SIGN_OFF, DIRECT_INVOICE_UNSIGN_OFF, INDIRECT_INVOICE_SIGN_OFF, INDIRECT_INVOICE_UNSIGN_OFF,
        DIRECT_CREDIT_NOTE_SIGN_OFF, DIRECT_CREDIT_NOTE_UNSIGN_OFF, INDIRECT_CREDIT_NOTE_SIGN_OFF, INDIRECT_CREDIT_NOTE_UNSIGN_OFF,
        ORDER_PAYMENT, SPI_PAYMENT, CI_PAYMENT, SPLIT_INDIRECT_INVOICE_SIGN_OFF, SPLIT_INDIRECT_INVOICE_UNSIGN_OFF, INVOICE_BALANCED,
        ORDER_PAYMENT_REALLOCATION, PAYMENT_TO_INVOICE_ALLOCATION, COMMERCIAL_INVOICE_COMPLETE, BONDED_INVOICE_SIGN_OFF,
        BONDED_INVOICE_UNSIGN_OFF, BONDED_INVOICE_SETTLED, BONDED_INVOICE_REJECT, BONDED_INVOICE_DELETE;
    }

    /**
     * only used by hibernate.
     */
    protected AccountingEvent() {

    }

    @Override
    public Class getInstanceClass() {
        return AccountingEvent.class;
    }

    /**
     * Initialising constructor.
     *
     * @param reference          {@link Event#getId()}
     * @param reference          {@link Event#getReference()}
     * @param timestamp          {@link Event#getTimestamp()}
     * @param organisationalUnit {@link Event#getOrganisationalUnit()}
     * @param eventType          {@link Event#getEventType()}
     */
    public AccountingEvent(final Long id, final String reference, final Date timestamp, final String organisationalUnit,
                           final AccountingEventType eventType, final String consumerTag) {
        super(id, reference, timestamp, organisationalUnit, eventType.name(), consumerTag);
    }

    public AccountingEvent(String reference, Date timestamp, String organisationalUnit, String eventType, String consumerTag) {
        super(reference, timestamp, organisationalUnit, eventType, consumerTag);
    }

    public AccountingEvent(String reference, Date timestamp, String organisationalUnit, String eventType, String consumerTag,
                           String shipmentNumber, Long paymentId, String serviceProvider) {
        super(reference, timestamp, organisationalUnit, eventType, consumerTag);
        this.shipmentNumber = shipmentNumber;
        this.paymentId = paymentId;
        this.serviceProvider = serviceProvider;
    }

    public boolean isDirectInvoiceSignOff() {
        return AccountingEventType.DIRECT_INVOICE_SIGN_OFF.equals(AccountingEventType.valueOf(getEventType()))
                || AccountingEventType.COMMERCIAL_INVOICE_COMPLETE.equals(AccountingEventType.valueOf(getEventType()));
    }

    public boolean isDirectInvoiceUnSignOff() {
        return AccountingEventType.DIRECT_INVOICE_UNSIGN_OFF.equals(AccountingEventType.valueOf(getEventType()));
    }

    public boolean isDirectCreditNoteSignOff() {
        return AccountingEventType.DIRECT_CREDIT_NOTE_SIGN_OFF.equals(AccountingEventType.valueOf(getEventType()));
    }

    public boolean isDirectCreditNoteUnSignOff() {
        return AccountingEventType.DIRECT_CREDIT_NOTE_UNSIGN_OFF.equals(AccountingEventType.valueOf(getEventType()));
    }

    public boolean isInDirectInvoiceSignOff() {
        return AccountingEventType.INDIRECT_INVOICE_SIGN_OFF.equals(AccountingEventType.valueOf(getEventType()));
    }

    public boolean isInDirectInvoiceUnSignOff() {
        return AccountingEventType.INDIRECT_INVOICE_UNSIGN_OFF.equals(AccountingEventType.valueOf(getEventType()));
    }

    public boolean isSplitInvoice() {
        if (isDirectInvoiceSignOff()) {
            return AccountingEventType.SPLIT_INDIRECT_INVOICE_SIGN_OFF.equals(AccountingEventType.valueOf(getEventType()));
        } else {
            return AccountingEventType.SPLIT_INDIRECT_INVOICE_UNSIGN_OFF.equals(AccountingEventType.valueOf(getEventType()));
        }
    }

    public boolean isInDirectCreditNoteSignOff() {
        return AccountingEventType.INDIRECT_CREDIT_NOTE_SIGN_OFF.equals(AccountingEventType.valueOf(getEventType()));
    }

    public boolean isInDirectCreditNoteUnSignOff() {
        return AccountingEventType.INDIRECT_CREDIT_NOTE_UNSIGN_OFF.equals(AccountingEventType.valueOf(getEventType()));
    }

    public boolean isOrderPayment() {
        return AccountingEventType.ORDER_PAYMENT.equals(AccountingEventType.valueOf(getEventType()));
    }

    public boolean isDirectPayment() {
        return AccountingEventType.CI_PAYMENT.equals(AccountingEventType.valueOf(getEventType()));
    }

    public boolean isInDirectPayment() {
        return AccountingEventType.SPI_PAYMENT.equals(AccountingEventType.valueOf(getEventType()));
    }

    public String getShipmentNumber() {
        return shipmentNumber;
    }

    public void setShipmentNumber(String shipmentNumber) {
        this.shipmentNumber = shipmentNumber;
    }

    public Long getPaymentId() {
        return paymentId;
    }

    public void setPaymentId(Long paymentId) {
        this.paymentId = paymentId;
    }

    public String getServiceProvider() {
        return serviceProvider;
    }

    public void setServiceProvider(String serviceProvider) {
        this.serviceProvider = serviceProvider;
    }
}