diff --git a/libreplan-business/src/main/java/org/libreplan/business/templates/daos/EmailTemplateDAO.java b/libreplan-business/src/main/java/org/libreplan/business/templates/daos/EmailTemplateDAO.java new file mode 100644 index 000000000..16e38f657 --- /dev/null +++ b/libreplan-business/src/main/java/org/libreplan/business/templates/daos/EmailTemplateDAO.java @@ -0,0 +1,42 @@ +package org.libreplan.business.templates.daos; + +import org.libreplan.business.common.daos.GenericDAOHibernate; +import org.libreplan.business.templates.entities.EmailTemplate; +import org.springframework.stereotype.Repository; + +/** + * Created by + * @author Vova Perebykivskiy + * on 24.09.15. + */ +@Repository +public class EmailTemplateDAO extends GenericDAOHibernate implements IEmailTemplateDAO{ + + @Override + public String initializeContent() { + for ( int i = 0; i < list(EmailTemplate.class ).size(); i++) + if ( list(EmailTemplate.class).get(i).getType() == 1 && list(EmailTemplate.class).get(i).getLanguage() == 3) return list(EmailTemplate.class).get(i).getContent(); + return " "; + } + + @Override + public String getContentBySelectedLanguage(int languageOrdinal, int emailTemplateTypeOrdinal) { + for (int i = 0; i < list(EmailTemplate.class).size(); i++) + if (list(EmailTemplate.class).get(i).getLanguage() == languageOrdinal && + // emailTemplateTypeOrdinal + 1, because first value is 0 + list(EmailTemplate.class).get(i).getType() == emailTemplateTypeOrdinal + 1) + return list(EmailTemplate.class).get(i).getContent(); + return ""; + } + + @Override + public String getContentBySelectedTemplate(int emailTemplateTypeOrdinal, int languageOrdinal) { + for (int i = 0; i < list(EmailTemplate.class).size(); i++) + // emailTemplateTypeOrdinal + 1, because first value is 0 + if ( list(EmailTemplate.class).get(i).getType() == emailTemplateTypeOrdinal + 1 && + list(EmailTemplate.class).get(i).getLanguage() == languageOrdinal ) + return list(EmailTemplate.class).get(i).getContent(); + return ""; + } + +} diff --git a/libreplan-business/src/main/java/org/libreplan/business/templates/daos/IEmailTemplateDAO.java b/libreplan-business/src/main/java/org/libreplan/business/templates/daos/IEmailTemplateDAO.java new file mode 100644 index 000000000..2201ed5f6 --- /dev/null +++ b/libreplan-business/src/main/java/org/libreplan/business/templates/daos/IEmailTemplateDAO.java @@ -0,0 +1,20 @@ +package org.libreplan.business.templates.daos; + +import org.libreplan.business.common.daos.IGenericDAO; +import org.libreplan.business.templates.entities.EmailTemplate; + +import java.util.List; + +/** + * DAO interface for the EmailTemplate entity. + * + * Created by + * @author Vova Perebykivskiy + * on 29.09.15. + */ +public interface IEmailTemplateDAO extends IGenericDAO{ + + String initializeContent(); + String getContentBySelectedLanguage(int languageOrdinal, int emailTemplateTypeOrdinal); + String getContentBySelectedTemplate(int emailTemplateTypeOrdinal, int languageOrdinal); +} diff --git a/libreplan-business/src/main/java/org/libreplan/business/templates/entities/EmailTemplate.java b/libreplan-business/src/main/java/org/libreplan/business/templates/entities/EmailTemplate.java new file mode 100644 index 000000000..6a92f1981 --- /dev/null +++ b/libreplan-business/src/main/java/org/libreplan/business/templates/entities/EmailTemplate.java @@ -0,0 +1,38 @@ +package org.libreplan.business.templates.entities; + +import org.libreplan.business.common.BaseEntity; + +/** + * Created by + * @author Vova Perebykivskiy + * on 29.09.15. + */ +public class EmailTemplate extends BaseEntity { + + private Integer type; + + private Integer language; + + private String content; + + public int getType() { + return type; + } + public void setType(Integer type) { + this.type = type; + } + + public Integer getLanguage() { + return language; + } + public void setLanguage(Integer language) { + this.language = language; + } + + public String getContent() { + return content; + } + public void setContent(String content) { + this.content = content; + } +} diff --git a/libreplan-business/src/main/java/org/libreplan/business/templates/entities/EmailTemplateEnum.java b/libreplan-business/src/main/java/org/libreplan/business/templates/entities/EmailTemplateEnum.java new file mode 100644 index 000000000..2a555c6a4 --- /dev/null +++ b/libreplan-business/src/main/java/org/libreplan/business/templates/entities/EmailTemplateEnum.java @@ -0,0 +1,29 @@ +package org.libreplan.business.templates.entities; + +import static org.libreplan.business.i18n.I18nHelper._; + +/** + * Available E-mail templates + * + * Created by + * @author Vova Perebykivskiy + * on 28.09.15. + * + * TEMPLATE_N(_("Template N")) - for i18n + * TEMPLATE_A("Template A") - for general use (no internationalizing) + */ +public enum EmailTemplateEnum { + + TEMPLATE_TASK_ASSIGNED_TO_RESOURCE(_("Task assigned to resource")), + TEMPLATE_TEMPLATE_1("Test template"); + + private final String templateType; + + EmailTemplateEnum(String templateType) { + this.templateType = templateType; + } + + public String getTemplateType() { + return templateType; + } +} diff --git a/libreplan-business/src/main/java/org/libreplan/business/users/bootstrap/PredefinedProfiles.java b/libreplan-business/src/main/java/org/libreplan/business/users/bootstrap/PredefinedProfiles.java index b7c0f7fee..fbeb451a4 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/users/bootstrap/PredefinedProfiles.java +++ b/libreplan-business/src/main/java/org/libreplan/business/users/bootstrap/PredefinedProfiles.java @@ -18,47 +18,6 @@ */ package org.libreplan.business.users.bootstrap; -import static org.libreplan.business.users.entities.UserRole.ROLE_CALENDARS; -import static org.libreplan.business.users.entities.UserRole.ROLE_CALENDAR_EXCEPTION_DAYS; -import static org.libreplan.business.users.entities.UserRole.ROLE_COMPANIES; -import static org.libreplan.business.users.entities.UserRole.ROLE_COST_CATEGORIES; -import static org.libreplan.business.users.entities.UserRole.ROLE_CREATE_PROJECTS; -import static org.libreplan.business.users.entities.UserRole.ROLE_CRITERIA; -import static org.libreplan.business.users.entities.UserRole.ROLE_EDIT_ALL_PROJECTS; -import static org.libreplan.business.users.entities.UserRole.ROLE_ESTIMATED_PLANNED_HOURS_PER_TASK_REPORT; -import static org.libreplan.business.users.entities.UserRole.ROLE_EXPENSES; -import static org.libreplan.business.users.entities.UserRole.ROLE_HOURS_TYPES; -import static org.libreplan.business.users.entities.UserRole.ROLE_HOURS_WORKED_PER_RESOURCE_REPORT; -import static org.libreplan.business.users.entities.UserRole.ROLE_JOB_SCHEDULING; -import static org.libreplan.business.users.entities.UserRole.ROLE_LABELS; -import static org.libreplan.business.users.entities.UserRole.ROLE_MACHINES; -import static org.libreplan.business.users.entities.UserRole.ROLE_MAIN_SETTINGS; -import static org.libreplan.business.users.entities.UserRole.ROLE_MATERIALS; -import static org.libreplan.business.users.entities.UserRole.ROLE_MATERIALS_NEED_AT_DATE_REPORT; -import static org.libreplan.business.users.entities.UserRole.ROLE_MATERIAL_UNITS; -import static org.libreplan.business.users.entities.UserRole.ROLE_PLANNING; -import static org.libreplan.business.users.entities.UserRole.ROLE_PROFILES; -import static org.libreplan.business.users.entities.UserRole.ROLE_PROGRESS_TYPES; -import static org.libreplan.business.users.entities.UserRole.ROLE_PROJECT_COSTS_REPORT; -import static org.libreplan.business.users.entities.UserRole.ROLE_PROJECT_STATUS_REPORT; -import static org.libreplan.business.users.entities.UserRole.ROLE_QUALITY_FORMS; -import static org.libreplan.business.users.entities.UserRole.ROLE_READ_ALL_PROJECTS; -import static org.libreplan.business.users.entities.UserRole.ROLE_RECEIVED_FROM_CUSTOMERS; -import static org.libreplan.business.users.entities.UserRole.ROLE_RECEIVED_FROM_SUBCONTRACTORS; -import static org.libreplan.business.users.entities.UserRole.ROLE_SEND_TO_CUSTOMERS; -import static org.libreplan.business.users.entities.UserRole.ROLE_SEND_TO_SUBCONTRACTORS; -import static org.libreplan.business.users.entities.UserRole.ROLE_TASK_SCHEDULING_STATUS_IN_PROJECT_REPORT; -import static org.libreplan.business.users.entities.UserRole.ROLE_TEMPLATES; -import static org.libreplan.business.users.entities.UserRole.ROLE_TIMESHEETS; -import static org.libreplan.business.users.entities.UserRole.ROLE_TIMESHEETS_TEMPLATES; -import static org.libreplan.business.users.entities.UserRole.ROLE_TIMESHEET_LINES_LIST; -import static org.libreplan.business.users.entities.UserRole.ROLE_TOTAL_WORKED_HOURS_BY_RESOURCE_IN_A_MONTH_REPORT; -import static org.libreplan.business.users.entities.UserRole.ROLE_USER_ACCOUNTS; -import static org.libreplan.business.users.entities.UserRole.ROLE_VIRTUAL_WORKERS; -import static org.libreplan.business.users.entities.UserRole.ROLE_WORKERS; -import static org.libreplan.business.users.entities.UserRole.ROLE_WORK_AND_PROGRESS_PER_PROJECT_REPORT; -import static org.libreplan.business.users.entities.UserRole.ROLE_WORK_AND_PROGRESS_PER_TASK_REPORT; - import java.util.Arrays; import java.util.HashSet; import java.util.Set; @@ -66,16 +25,18 @@ import java.util.Set; import org.libreplan.business.users.entities.Profile; import org.libreplan.business.users.entities.UserRole; +import static org.libreplan.business.users.entities.UserRole.*; /** * Defines the default {@link org.libreplan.business.users.entities.Profile * Profiles} * * @author Manuel Rego Casasnovas + * @author Vova Perebykivskiy */ public enum PredefinedProfiles { SYSTEMS_ADMINISTRATOR("Systems Administrator", ROLE_MAIN_SETTINGS, - ROLE_USER_ACCOUNTS, ROLE_PROFILES, ROLE_JOB_SCHEDULING), + ROLE_USER_ACCOUNTS, ROLE_PROFILES, ROLE_JOB_SCHEDULING, ROLE_EDIT_EMAIL_TEMPLATES), PROJECT_MANAGER("Project Manager", ROLE_READ_ALL_PROJECTS, ROLE_EDIT_ALL_PROJECTS, ROLE_CREATE_PROJECTS, ROLE_PLANNING, diff --git a/libreplan-business/src/main/java/org/libreplan/business/users/entities/UserRole.java b/libreplan-business/src/main/java/org/libreplan/business/users/entities/UserRole.java index 9010c7b8f..20af4b612 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/users/entities/UserRole.java +++ b/libreplan-business/src/main/java/org/libreplan/business/users/entities/UserRole.java @@ -28,21 +28,26 @@ import static org.libreplan.business.i18n.I18nHelper._; * * @author Fernando Bellas Permuy * @author Manuel Rego Casasnovas + * @author Vova Perebykivskiy */ public enum UserRole { // Access to all pages ROLE_SUPERUSER(_("Superuser")), + // Web services roles ROLE_WS_READER(_("Web service reader")), ROLE_WS_WRITER(_("Web service writer")), ROLE_WS_SUBCONTRACTING(_("Web service subcontractor operations")), + // Project operations roles ROLE_READ_ALL_PROJECTS(_("Read all projects")), ROLE_EDIT_ALL_PROJECTS(_("Edit all projects")), ROLE_CREATE_PROJECTS(_("Create projects")), + // Special role for bound users ROLE_BOUND_USER(_("Bound user")), + // Page roles ROLE_PLANNING(_("Planning")), ROLE_TEMPLATES(_("Templates")), @@ -81,7 +86,9 @@ public enum UserRole { ROLE_PROJECT_COSTS_REPORT(_("Project Costs Report")), ROLE_TASK_SCHEDULING_STATUS_IN_PROJECT_REPORT(_("Task Scheduling Status In Project Report")), ROLE_MATERIALS_NEED_AT_DATE_REPORT(_("Materials Needed At Date Report")), - ROLE_PROJECT_STATUS_REPORT(_("Project Status Report")); + ROLE_PROJECT_STATUS_REPORT(_("Project Status Report")), + + ROLE_EDIT_EMAIL_TEMPLATES(_("Edit E-mail Templates")); private final String displayName; diff --git a/libreplan-business/src/main/resources/org/libreplan/business/templates/entities/Templates.hbm.xml b/libreplan-business/src/main/resources/org/libreplan/business/templates/entities/Templates.hbm.xml index 16025d827..6546dbda0 100644 --- a/libreplan-business/src/main/resources/org/libreplan/business/templates/entities/Templates.hbm.xml +++ b/libreplan-business/src/main/resources/org/libreplan/business/templates/entities/Templates.hbm.xml @@ -91,4 +91,14 @@ + + + + 100 + + + + + + diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/templates/EmailTemplateController.java b/libreplan-webapp/src/main/java/org/libreplan/web/templates/EmailTemplateController.java new file mode 100644 index 000000000..6539f1678 --- /dev/null +++ b/libreplan-webapp/src/main/java/org/libreplan/web/templates/EmailTemplateController.java @@ -0,0 +1,150 @@ +package org.libreplan.web.templates; + +import org.libreplan.business.common.exceptions.ValidationException; +import org.libreplan.business.settings.entities.Language; + +import org.libreplan.business.templates.daos.EmailTemplateDAO; + +import org.libreplan.business.templates.entities.EmailTemplateEnum; +import org.libreplan.web.common.IMessagesForUser; +import org.libreplan.web.common.Level; +import org.libreplan.web.common.MessagesForUser; +import org.zkoss.zk.ui.Component; + + +import org.zkoss.zk.ui.Executions; +import org.zkoss.zk.ui.util.GenericForwardComposer; + +import org.zkoss.zul.Listitem; +import org.zkoss.zul.ListitemRenderer; +import org.zkoss.zul.Textbox; + +import java.util.*; + +import static org.libreplan.web.I18nHelper._; + +/** + * Created by + * @author Vova Perebykivskiy + * on 25.09.15. + */ +public class EmailTemplateController extends GenericForwardComposer{ + + private IEmailTemplateModel emailTemplateModel; + + private EmailTemplateDAO emailTemplateDAO; + + + private IMessagesForUser messages; + + private Component messagesContainer; + + private Textbox contentsTextbox; + + + public static ListitemRenderer languagesRenderer = new ListitemRenderer() { + @Override + public void render(org.zkoss.zul.Listitem item, Object data) + throws Exception { + Language language = (Language) data; + String displayName = language.getDisplayName(); + if (language.equals(Language.BROWSER_LANGUAGE)) { + displayName = _(language.getDisplayName()); + } + item.setLabel(displayName); + } + }; + + @Override + public void doAfterCompose(Component comp) throws Exception { + super.doAfterCompose(comp); + comp.setVariable("emailTemplateController", this, true); + messages = new MessagesForUser(messagesContainer); + contentsTextbox.setValue(getInitialContentData()); + } + + public boolean save(){ + try { + setSelectedContent(); + emailTemplateModel.confirmSave(); + messages.clearMessages(); + messages.showMessage(Level.INFO, _("E-mail template saved")); + return true; + } catch (ValidationException e) { + messages.showInvalidValues(e); + } + return false; + } + + public void cancel() throws InterruptedException { + Executions.getCurrent().sendRedirect("../planner/index.zul"); + } + + public Language getSelectedLanguage() { + return emailTemplateModel.getLanguage(); + } + public void setSelectedLanguage(Language language){ + emailTemplateModel.setLanguage(language); + + getContentDataBySelectedLanguage(); + } + + public static ListitemRenderer getLanguagesRenderer() { + return languagesRenderer; + } + public List getLanguages() { + List languages = Arrays.asList(Language.values()); + Collections.sort(languages, new Comparator() { + @Override + public int compare(Language o1, Language o2) { + if (o1.equals(Language.BROWSER_LANGUAGE)) { + return -1; + } + if (o2.equals(Language.BROWSER_LANGUAGE)) { + return 1; + } + return o1.getDisplayName().compareTo(o2.getDisplayName()); + } + }); + return languages; + } + + + public EmailTemplateEnum getSelectedEmailTemplateEnum() { + return emailTemplateModel.getEmailTemplateEnum(); + } + public void setSelectedEmailTemplateEnum(EmailTemplateEnum emailTemplateEnum){ + emailTemplateModel.setEmailTemplateEnum(emailTemplateEnum); + + getContentDataBySelectedTemplate(); + } + + public ListitemRenderer getEmailTemplateEnumRenderer() { + return new ListitemRenderer() { + @Override + public void render(Listitem item, Object data) throws Exception { + EmailTemplateEnum template = (EmailTemplateEnum) data; + item.setLabel(_(template.getTemplateType())); + item.setValue(template); + } + }; + } + public List getEmailTemplateEnum() { + return Arrays.asList(EmailTemplateEnum.values()); + } + + + public void setSelectedContent(){ + emailTemplateModel.setContent(contentsTextbox.getValue()); + } + public String getInitialContentData(){ + return emailTemplateModel.initializeContent(); + } + + private void getContentDataBySelectedLanguage(){ + contentsTextbox.setValue(emailTemplateModel.getContentBySelectedLanguage(getSelectedLanguage().ordinal(), getSelectedEmailTemplateEnum().ordinal())); + } + private void getContentDataBySelectedTemplate(){ + contentsTextbox.setValue( emailTemplateModel.getContentBySelectedTemplate( getSelectedEmailTemplateEnum().ordinal(), getSelectedLanguage().ordinal() ) ); + } +} diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/templates/EmailTemplateModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/templates/EmailTemplateModel.java new file mode 100644 index 000000000..701c77186 --- /dev/null +++ b/libreplan-webapp/src/main/java/org/libreplan/web/templates/EmailTemplateModel.java @@ -0,0 +1,90 @@ +package org.libreplan.web.templates; + +import org.libreplan.business.settings.entities.Language; +import org.libreplan.business.templates.daos.IEmailTemplateDAO; +import org.libreplan.business.templates.entities.EmailTemplate; +import org.libreplan.business.templates.entities.EmailTemplateEnum; +import org.libreplan.web.common.concurrentdetection.OnConcurrentModification; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * Created by + * @author Vova Perebykivskiy + * on 25.09.15. + */ +@Service +@Scope(BeanDefinition.SCOPE_PROTOTYPE) +@OnConcurrentModification(goToPage = "/templates/email_templates.zul") +public class EmailTemplateModel implements IEmailTemplateModel { + + @Autowired + private IEmailTemplateDAO emailTemplateDAO; + + private Language language = Language.ENGLISH_LANGUAGE; + + private EmailTemplateEnum emailTemplateEnum = EmailTemplateEnum.TEMPLATE_TASK_ASSIGNED_TO_RESOURCE; + + private String content; + + private EmailTemplate emailTemplate; + + @Override + @Transactional + public void confirmSave(){ + emailTemplate = new EmailTemplate(); + + // + 1 because first ordinal = 0 + emailTemplate.setType(emailTemplateEnum.ordinal() + 1); + emailTemplate.setLanguage(language.ordinal()); + emailTemplate.setContent(content); + + emailTemplateDAO.save(emailTemplate); + } + + @Override + public Language getLanguage() { + return language; + } + @Override + public void setLanguage(Language language){ this.language = language; } + + @Override + public EmailTemplateEnum getEmailTemplateEnum() { + return emailTemplateEnum; + } + @Override + public void setEmailTemplateEnum(EmailTemplateEnum emailTemplateEnum) { + this.emailTemplateEnum = emailTemplateEnum; + } + + @Override + public String getContent() { + return content; + } + @Override + public void setContent(String content) { + this.content = content; + } + @Override + @Transactional + public String initializeContent() { + return emailTemplateDAO.initializeContent(); + } + + @Override + @Transactional + public String getContentBySelectedLanguage(int languageOrdinal, int emailTemplateTypeOrdinal) { + return emailTemplateDAO.getContentBySelectedLanguage(languageOrdinal, emailTemplateTypeOrdinal); + } + @Override + @Transactional + public String getContentBySelectedTemplate(int emailTemplateTypeOrdinal, int languageOrdinal) { + return emailTemplateDAO.getContentBySelectedTemplate(emailTemplateTypeOrdinal, languageOrdinal); + } +} + + diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/templates/IEmailTemplateModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/templates/IEmailTemplateModel.java new file mode 100644 index 000000000..521a9172d --- /dev/null +++ b/libreplan-webapp/src/main/java/org/libreplan/web/templates/IEmailTemplateModel.java @@ -0,0 +1,29 @@ +package org.libreplan.web.templates; + +import org.libreplan.business.common.exceptions.ValidationException; +import org.libreplan.business.settings.entities.Language; +import org.libreplan.business.templates.entities.EmailTemplateEnum; + +/** + * Model E-mail Templates + * + * Created by + * @author Vova Perebykivskiy + * on 28.09.15. + */ +public interface IEmailTemplateModel { + + void confirmSave() throws ValidationException; + + Language getLanguage(); + void setLanguage(Language language); + + EmailTemplateEnum getEmailTemplateEnum(); + void setEmailTemplateEnum(EmailTemplateEnum emailTemplateEnum); + + String getContent(); + void setContent(String content); + String initializeContent(); + String getContentBySelectedLanguage(int languageOrdinal, int emailTemplateTypeOrdinal); + String getContentBySelectedTemplate(int emailTemplateTypeOrdinal, int languageOrdinal); +}