CalendarEventsEditorFields.java

package sk.iway.iwcm.components.calendar.jpa;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import lombok.Getter;
import lombok.Setter;
import sk.iway.iwcm.Identity;
import sk.iway.iwcm.SendMail;
import sk.iway.iwcm.common.CloudToolsForCore;
import sk.iway.iwcm.i18n.Prop;
import sk.iway.iwcm.system.datatable.BaseEditorFields;
import sk.iway.iwcm.system.datatable.DataTableColumnType;
import sk.iway.iwcm.system.datatable.ProcessItemAction;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumn;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnEditor;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnEditorAttr;
import sk.iway.iwcm.users.UserDetails;
import sk.iway.iwcm.users.UserGroupDetails;
import sk.iway.iwcm.users.UserGroupsDB;
import sk.iway.iwcm.users.UsersDB;

@Getter
@Setter
public class CalendarEventsEditorFields extends BaseEditorFields implements Serializable {

    public CalendarEventsEditorFields(){
        //constructor
    }

    @DataTableColumn(
        inputType = DataTableColumnType.TEXT,
        title="calendar.creator",
        sortAfter = "typeId",
        hiddenEditor = true
    )
    private String creator;

    @DataTableColumn(
        inputType = DataTableColumnType.TEXT,
        title="calendar.stav",
        hiddenEditor = true
    )
    private String condition;

    @DataTableColumn(
        inputType = DataTableColumnType.CHECKBOX,
        title="calendar_edit.notify_emails",
        tab = "notification",
        sortAfter = "notifyHoursBefore",
        hidden = true,
        editor = {
        @DataTableColumnEditor(attr = {
            @DataTableColumnEditorAttr(key = "unselectedValue", value = "") }) })
    private Integer[] notifyEmailsUserGroups;

    public void fromCalendarEventsEntity(CalendarEventsEntity originalEntity, HttpServletRequest request, Prop prop) {

        if(originalEntity.getId() == null || originalEntity.getId() == -1) {
            originalEntity.setDateFrom(new Date());
            originalEntity.setDateTo(new Date());
            originalEntity.setNotifyIntrotext(prop.getText("calendar_edit.notify_introtext_default"));

            Identity loggedUser = UsersDB.getCurrentUser(request);
            originalEntity.setNotifySender(loggedUser.getEmail());
            originalEntity.setCreatorId(loggedUser.getUserId());
        } else {
            int approve = originalEntity.getApprove();
            String approveText = "";
            if(approve == -1)
                approveText = prop.getText("calendar.cakana_na_schvalenie");
            else if(approve == 0)
                approveText = prop.getText("calendar.neschvalena");
            else if(approve == 1)
                approveText = prop.getText("calendar.schvalena");
            setCondition(approveText);

            UserDetails creatorUser = UsersDB.getUser(originalEntity.getCreatorId());
            setCreator(creatorUser.getFullName());
        }

        if(originalEntity.getNotifyEmails() != null && !originalEntity.getNotifyEmails().isEmpty()) {
            UserGroupsDB ugdb = UserGroupsDB.getInstance();
            List<UserGroupDetails> userGroups = ugdb.getUserGroups();

            String[] userGroupsNames =  originalEntity.getNotifyEmails().split(",");

            List<Integer> selectedUsergroupIds = new ArrayList<>();
            for(UserGroupDetails userGroup : userGroups)
                for(String groupname : userGroupsNames)
                    if(groupname.equals(userGroup.getUserGroupName())) {
                        selectedUsergroupIds.add(userGroup.getUserGroupId());
                        break;
                    }
            notifyEmailsUserGroups = selectedUsergroupIds.toArray(new Integer[0]);
        }

        originalEntity.setEditorFields(this);
    }

    public void toCalendarEventsEntity(CalendarEventsEntity originalEntity, CalendarTypesRepository ctr, Prop prop, CalendarEventsRepository cer, HttpServletRequest request, ProcessItemAction action) {

        StringBuilder notifySendertext = new StringBuilder();
        UserGroupsDB ugdb = UserGroupsDB.getInstance();
        for(Integer userGroupId : notifyEmailsUserGroups) {
            if(userGroupId != null) {
                String userGroupName = ugdb.getUserGroupName(userGroupId);
                notifySendertext.append(userGroupName).append(",");
            }
        }
        originalEntity.setNotifyEmails(notifySendertext.toString());

        //Set domainId - if create
        if(action == ProcessItemAction.CREATE) originalEntity.setDomainId(CloudToolsForCore.getDomainId());

        boolean newEntity = false;
        boolean changedType = false;

        //Check if entity is new
        if(originalEntity.getId() == null || originalEntity.getId() == -1) newEntity = true;

        //Check if type was changed
        CalendarEventsEntity fromDB = null;
        if (originalEntity.getId()!=null) fromDB = cer.findFirstByIdAndDomainId(originalEntity.getId(), CloudToolsForCore.getDomainId()).orElse(null);
        if(fromDB != null && fromDB.getTypeId().equals(originalEntity.getTypeId())==false) changedType = true;

        if(newEntity || changedType) {
            //Get selected calendar type
            CalendarTypesEntity cte = ctr.findFirstByIdAndDomainId(Long.valueOf(originalEntity.getTypeId()), CloudToolsForCore.getDomainId()).orElse(null);
            Integer approverId = cte.getApproverId();
            UserDetails loggedUser = UsersDB.getUser(originalEntity.getCreatorId());

            if(approverId == null || approverId == -1) {
                //Approver is not set, approve this event
                originalEntity.setApprove(1);
            } else if(approverId == loggedUser.getUserId()) {
                //Approver and creator are same person, approve event
                originalEntity.setApprove(1);
            } else {
                //Approver and creator are NOT same person, wait for approve
                originalEntity.setApprove(-1);

                sendMailToApprover(originalEntity, approverId, loggedUser, prop, request);
            }
        }

        if(newEntity) originalEntity.setSuggest(false);
    }

    private void sendMailToApprover(CalendarEventsEntity originalEntity, Integer approverId, UserDetails creator, Prop prop, HttpServletRequest request) {
        //UserDetails approver = UsersDB.getUser(approverId);

        String eventDate = "";
        if(originalEntity.getDateFrom() != null)
            eventDate = "" + originalEntity.getDateFrom();
        if(originalEntity.getDateTo() != null)
            eventDate +=  " - " + originalEntity.getDateTo();
        if(originalEntity.getTimeRange() != null)
            eventDate += " o " + originalEntity.getTimeRange();

        StringBuilder emailClientData=new StringBuilder();
        emailClientData.append("<html><head>");
        emailClientData.append("<style>");
        emailClientData.append("body{");
        emailClientData.append("font-family: Arial;");
        emailClientData.append("font-size: 11pt;");
        emailClientData.append('}');
        emailClientData.append("</style></head><body>");
        emailClientData.append(prop.getText("calendar.vytvoril_akciu", creator.getFullName(), originalEntity.getTitle(), eventDate));
        emailClientData.append("</body></html>");
        SendMail.send(creator.getFullName(), creator.getEmailAddress(), creator.getEmail(), prop.getText("calendar.na_schvalenie"), emailClientData.toString(), request);
    }
}