AccountingEvents.java

package com.tradecloud.domain.configuration;

import com.tradecloud.authentication.User;
import com.tradecloud.domain.document.DocumentState;
import com.tradecloud.domain.model.events.AccountingEvent;
import org.hibernate.annotations.ForeignKey;

import javax.persistence.*;
import javax.xml.bind.annotation.*;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import static com.tradecloud.domain.model.events.AccountingEvent.AccountingEventType.*;

/**
 * Meta-data of accounting events.
 */
@Entity
@Table(name = "accountingevents")
@Access(AccessType.FIELD)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "AccountingEvents")
public class AccountingEvents extends EventConfig<AccountingEventsMetaData> implements AlowNonOrderUserEvent {

    private static final long serialVersionUID = 1L;
    private boolean allowEvents;

    @XmlElement(name = "AccountingEventsMetaData")
    @OneToOne
    @ForeignKey(name = "fk_accountingevents", inverseName = "fk_accountingeventsmetadata")
    @JoinTable(name = "accountingevents_accountingeventsmetadata", joinColumns = {@JoinColumn(name = "accountingevent_id", unique = false)},
            inverseJoinColumns = {@JoinColumn(name = "metadata_id", unique = false)})
    private AccountingEventsMetaData eventsMetaData = new AccountingEventsMetaData();

    @Enumerated(value = EnumType.STRING)
    private InvoiceSnapShotType invoiceSnapShotType;
    private static List<AccountingEvent.AccountingEventType> applicableInvoiceSnapshotEvents = Arrays.asList(INDIRECT_INVOICE_SIGN_OFF,
            INDIRECT_INVOICE_UNSIGN_OFF, SPLIT_INDIRECT_INVOICE_SIGN_OFF);

    private static List<AccountingEvent.AccountingEventType> applicableTriggerStateEvents = Arrays.asList(DIRECT_INVOICE_SIGN_OFF);

    @Enumerated(value = EnumType.STRING)
    private DocumentState triggerState;

    @Enumerated(value = EnumType.STRING)
    private AccountingEventPublishConfig eventPublishConfig;

    private static List<AccountingEvent.AccountingEventType> applicableEventPublishConfigEvents = Arrays.asList(INDIRECT_INVOICE_SIGN_OFF,
            INDIRECT_INVOICE_UNSIGN_OFF, SPLIT_INDIRECT_INVOICE_SIGN_OFF, DIRECT_INVOICE_SIGN_OFF, DIRECT_CREDIT_NOTE_SIGN_OFF,
            DIRECT_CREDIT_NOTE_SIGN_OFF, DIRECT_INVOICE_SIGN_OFF, INDIRECT_CREDIT_NOTE_UNSIGN_OFF, INDIRECT_CREDIT_NOTE_SIGN_OFF,
            BONDED_INVOICE_SIGN_OFF, BONDED_INVOICE_UNSIGN_OFF);

    @XmlTransient
    @ManyToMany
    @JoinTable(name = "integrationuser_accountingevents", joinColumns = {@JoinColumn(name = "accountingevent_id", unique = false)},
            inverseJoinColumns = {@JoinColumn(name = "integrationuser_id", unique = false)})
    private Set<User> users = new HashSet<>();

    public AccountingEventsMetaData getEventsMetaData() {
        return eventsMetaData;
    }

    @Override
    public void setEventsMetaData(AccountingEventsMetaData eventsMetaData) {
        this.eventsMetaData = eventsMetaData;
    }

    @Override
    public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }

    public InvoiceSnapShotType getInvoiceSnapShotType() {
        return invoiceSnapShotType;
    }

    public void setInvoiceSnapShotType(InvoiceSnapShotType invoiceSnapShotType) {
        this.invoiceSnapShotType = invoiceSnapShotType;
    }

    public boolean isSnapshotTypeEditable() {
        return applicableInvoiceSnapshotEvents.contains(AccountingEvent.AccountingEventType.valueOf(eventsMetaData.getEvent()));
    }

    public DocumentState getTriggerState() {
        return triggerState;
    }

    public void setTriggerState(DocumentState triggerState) {
        this.triggerState = triggerState;
    }

    public boolean isTriggerStateEditable() {
        return applicableTriggerStateEvents.contains(AccountingEvent.AccountingEventType.valueOf(eventsMetaData.getEvent()));
    }

    public boolean isEventPublishConfigEditable() {
        return applicableEventPublishConfigEvents.contains(AccountingEvent.AccountingEventType.valueOf(eventsMetaData.getEvent()));
    }

    public boolean isAllowEvents() {
        return allowEvents;
    }

    public void setAllowEvents(boolean allowEvents) {
        this.allowEvents = allowEvents;
    }

    public AccountingEventPublishConfig getEventPublishConfig() {
        return eventPublishConfig;
    }

    public void setEventPublishConfig(AccountingEventPublishConfig eventPublishConfig) {
        this.eventPublishConfig = eventPublishConfig;
    }
}