Task.java

package com.tradecloud.domain.autoemail;

import com.tradecloud.common.base.PersistenceBase;
import com.tradecloud.domain.common.DataPeriodType;
import com.tradecloud.domain.common.DurationType;
import com.tradecloud.domain.costing.clean.CostingSummary;
import com.tradecloud.domain.dms.DocumentType;
import com.tradecloud.domain.export.ExportParty;
import com.tradecloud.domain.helper.ReportFormat;
import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import com.tradecloud.domain.party.ServiceProvider;
import com.tradecloud.domain.party.ServiceProviderType;
import org.hibernate.annotations.ForeignKey;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.*;
import java.io.File;
import java.util.*;

@Access(AccessType.FIELD)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Task")
@Entity
@Table(name = "autoemailtask")
public class Task extends PersistenceBase implements Comparable<Task> {

    private static final long serialVersionUID = 1L;

    @NotNull(message = "Name is required")
    private String name;

    @NotNull(message = "Event type is required")
    @Enumerated(value = EnumType.STRING)
    private EmailEventType emailTaskEventType;

    private int intervalNumber = 1;

    @Enumerated(value = EnumType.STRING)
    private DurationType intervalUnit = DurationType.HOURS;

    @Enumerated(value = EnumType.STRING)
    private Report report;

    @Enumerated(value = EnumType.STRING)
    private ReportFormat reportFormat;

    @ElementCollection
    @CollectionTable(name = "autoemailtask_add_reports", joinColumns = @JoinColumn(name = "autoemailtask_id"))
    @Column(name = "additionalReportFormat")
    @Enumerated(EnumType.STRING)
    private List<ReportFormat> additionalReportFormats=new ArrayList<>();

    private boolean perBuyer;

    private boolean includeEventTriggeringUser;

    private transient String dmsReportName;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "autoemailtask_autoemailgroup",
            joinColumns = {@JoinColumn(name = "autoemailtask_id")},
            inverseJoinColumns = {@JoinColumn(name = "autoemailgroup_id")})
    @ForeignKey(name = "fk_autoemailgroup_autoemailtask",
            inverseName = "fk_autoemailtask_autoemailgroup")
    private Set<Group> groups = new HashSet<>();

    private String emailSubject;

    private String emailBody;

    @ManyToOne
    @ForeignKey(name = "fk_organisationalunit")
    private OrganisationalUnit organisationalUnit;

    @ManyToOne
    private ExportParty exportParty;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(nullable = true)
    protected Date lastSuccessfullyExecuted;

    @ManyToOne(fetch = FetchType.EAGER)
    @ForeignKey(name = "fk_serviceProvider")
    @XmlAttribute(required = true)
    @XmlIDREF
    private ServiceProvider serviceProvider;

    @Enumerated(value = EnumType.STRING)
    private ServiceProviderType serviceProviderType;

    @XmlAttribute
    private Boolean active = Boolean.TRUE;

    @Enumerated(value = EnumType.STRING)
    private DataPeriodType dataPeriodType;

    @OneToMany(fetch = FetchType.LAZY)
    private Set<DocumentType> dmsDocumentTypes=new HashSet<>();

    private int dataPeriod = 1;

    //temporary keep costing for reuse.Reduce costing loading.
    private transient CostingSummary costingSummary;
    private transient File[] filesToSend;

    private int startAt;

    public Set<String> getEmailAddresses() {
        Set<String> emailAddresses = new HashSet<>();
        for (Group group : groups) {
            emailAddresses.addAll(group.getEmailAddresses());
        }
        return emailAddresses;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public EmailEventType getEmailTaskEventType() {
        return emailTaskEventType;
    }

    public EmailEventType getEventType() {
        return emailTaskEventType;
    }

    public void setEmailTaskEventType(EmailEventType emailTaskEventType) {
        this.emailTaskEventType = emailTaskEventType;
    }

    public Report getReport() {
        return report;
    }

    public void setReport(Report report) {
        this.report = report;
    }

    public ReportFormat getReportFormat() {
        return reportFormat;
    }

    public void setReportFormat(ReportFormat reportFormat) {
        this.reportFormat = reportFormat;
    }

    public Set<Group> getGroups() {
        return groups;
    }

    public void setGroups(Set<Group> groups) {
        this.groups = groups;
    }

    public int getIntervalNumber() {
        return intervalNumber;
    }

    public void setIntervalNumber(int intervalNumber) {
        this.intervalNumber = intervalNumber;
    }

    public DurationType getIntervalUnit() {
        return intervalUnit;
    }

    public void setIntervalUnit(DurationType intervalUnit) {
        this.intervalUnit = intervalUnit;
    }

    public Date getLastSuccessfullyExecuted() {
        return lastSuccessfullyExecuted;
    }

    public void setLastSuccessfullyExecuted(Date lastSuccessfullyExecuted) {
        this.lastSuccessfullyExecuted = lastSuccessfullyExecuted;
    }

    public boolean isPerBuyer() {
        return perBuyer;
    }

    public void setPerBuyer(boolean perBuyer) {
        this.perBuyer = perBuyer;
    }

    @Override
    public int compareTo(Task o) {
        return getName().compareToIgnoreCase(o.getName());
    }

    public String getEmailBody() {
        return emailBody;
    }

    public void setEmailBody(String emailBody) {
        this.emailBody = emailBody;
    }

    public String getEmailSubject() {
        return emailSubject;
    }

    public void setEmailSubject(String emailSubject) {
        this.emailSubject = emailSubject;
    }

    public boolean isIncludeEventTriggeringUser() {
        return includeEventTriggeringUser;
    }

    public void setIncludeEventTriggeringUser(boolean includeEventTriggeringUser) {
        this.includeEventTriggeringUser = includeEventTriggeringUser;
    }

    @Override
    public Boolean getActive() {
        return active;
    }

    public void setActive(Boolean active) {
        this.active = active;
    }

    public CostingSummary getCostingSummary() {
        return costingSummary;
    }

    public void setCostingSummary(CostingSummary costingSummary) {
        this.costingSummary = costingSummary;
    }

    public ServiceProvider getServiceProvider() {
        return serviceProvider;
    }

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

    public ServiceProviderType getServiceProviderType() {
        return serviceProviderType;
    }

    public void setServiceProviderType(ServiceProviderType serviceProviderType) {
        this.serviceProviderType = serviceProviderType;
    }

    public DataPeriodType getDataPeriodType() {
        return dataPeriodType;
    }

    public void setDataPeriodType(DataPeriodType dataPeriodType) {
        this.dataPeriodType = dataPeriodType;
    }

    public int getDataPeriod() {
        return dataPeriod;
    }

    public void setDataPeriod(int dataPeriod) {
        this.dataPeriod = dataPeriod;
    }

    public OrganisationalUnit getOrganisationalUnit() {
        return organisationalUnit;
    }

    public void setOrganisationalUnit(OrganisationalUnit organisationalUnit) {
        this.organisationalUnit = organisationalUnit;
    }

    public File[] getFilesToSend() {
        return filesToSend;
    }

    public void setFilesToSend(File[] filesToSend) {
        this.filesToSend = filesToSend;
    }

    public ExportParty getExportParty() {
        return exportParty;
    }

    public void setExportParty(ExportParty exportParty) {
        this.exportParty = exportParty;
    }

    public List<ReportFormat> getAdditionalReportFormats() {
        return additionalReportFormats;
    }

    public void setAdditionalReportFormats(List<ReportFormat> additionalReportFormats) {
        this.additionalReportFormats = additionalReportFormats;
    }

    public List<ReportFormat> getAdditionalReportFormats2() {
        return additionalReportFormats != null ? new ArrayList<>(additionalReportFormats) : null;
    }

    public void setAdditionalReportFormats2(List<ReportFormat> additionalReportFormats) {
        this.additionalReportFormats = additionalReportFormats;
    }

    public Set<DocumentType> getDmsDocumentTypes() {
        return dmsDocumentTypes;
    }

    public void setDmsDocumentTypes(Set<DocumentType> dmsDocumentTypes) {
        this.dmsDocumentTypes = dmsDocumentTypes;
    }

    public int getStartAt() {
        return startAt;
    }

    public void setStartAt(int startAt) {
        this.startAt = startAt;
    }

    public String getDmsReportName() {
        return dmsReportName;
    }

    public void setDmsReportName(String dmsReportName) {
        this.dmsReportName = dmsReportName;
    }
}