Při změně stavu požadavku se odešle e-mail dalšímu schvalovateli v
pořadí, případně uživateli, který zadal požadavek. closes #114
This commit is contained in:
@@ -11,12 +11,18 @@ import org.slf4j.LoggerFactory;
|
|||||||
public class EntityMessageBuilder implements MessageBuilder {
|
public class EntityMessageBuilder implements MessageBuilder {
|
||||||
|
|
||||||
private final static Logger logger = LoggerFactory.getLogger(EntityMessageBuilder.class);
|
private final static Logger logger = LoggerFactory.getLogger(EntityMessageBuilder.class);
|
||||||
|
private boolean html;
|
||||||
|
|
||||||
|
public void setHtml(boolean html) {
|
||||||
|
this.html = html;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MailMessage buildMessage(MailMessage template, Object data) {
|
public MailMessage buildMessage(MailMessage template, Object data) {
|
||||||
MailMessage msg = new MailMessage(template);
|
MailMessage msg = new MailMessage(template);
|
||||||
msg.setSubject(replacaProperties(msg.getSubject(), data));
|
msg.setSubject(replacaProperties(msg.getSubject(), data));
|
||||||
msg.setText(replacaProperties(msg.getText(), data));
|
msg.setText(replacaProperties(msg.getText(), data));
|
||||||
|
msg.setHtml(html);
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,23 +5,58 @@ import info.bukova.isspst.data.JobMapping;
|
|||||||
import info.bukova.isspst.data.RequirementBase;
|
import info.bukova.isspst.data.RequirementBase;
|
||||||
import info.bukova.isspst.data.RequirementState;
|
import info.bukova.isspst.data.RequirementState;
|
||||||
import info.bukova.isspst.data.Role;
|
import info.bukova.isspst.data.Role;
|
||||||
|
import info.bukova.isspst.data.SettingsData;
|
||||||
import info.bukova.isspst.data.User;
|
import info.bukova.isspst.data.User;
|
||||||
import info.bukova.isspst.data.Workflow;
|
import info.bukova.isspst.data.Workflow;
|
||||||
import info.bukova.isspst.data.Workgroup;
|
import info.bukova.isspst.data.Workgroup;
|
||||||
|
import info.bukova.isspst.mail.MailMessage;
|
||||||
|
import info.bukova.isspst.mail.Mailer;
|
||||||
|
import info.bukova.isspst.mail.MessageBuilder;
|
||||||
import info.bukova.isspst.services.AbstractOwnedService;
|
import info.bukova.isspst.services.AbstractOwnedService;
|
||||||
import info.bukova.isspst.services.LazyLoader;
|
import info.bukova.isspst.services.LazyLoader;
|
||||||
|
import info.bukova.isspst.services.settings.GlobalSettingsService;
|
||||||
|
import info.bukova.isspst.services.users.UserService;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.hibernate.LazyInitializationException;
|
import org.hibernate.LazyInitializationException;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
public abstract class RequirementBaseServiceImpl<T extends RequirementBase> extends
|
public abstract class RequirementBaseServiceImpl<T extends RequirementBase> extends
|
||||||
AbstractOwnedService<T> implements RequirementBaseService<T> {
|
AbstractOwnedService<T> implements RequirementBaseService<T> {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private Mailer mailer;
|
||||||
|
@Autowired
|
||||||
|
private MessageBuilder messageBuilder;
|
||||||
|
@Autowired
|
||||||
|
private GlobalSettingsService settingsService;
|
||||||
|
@Autowired
|
||||||
|
private UserService userService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void add(T entity) {
|
||||||
|
super.add(entity);
|
||||||
|
|
||||||
|
this.sendToApprovers(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendToApprovers(T entity) {
|
||||||
|
SettingsData settings = settingsService.getSettings();
|
||||||
|
List<User> approvers = this.getNextApprover(entity);
|
||||||
|
if (approvers != null && !approvers.isEmpty()) {
|
||||||
|
MailMessage message = messageBuilder.buildMessage(settings.getNewReqTemplate(), entity);
|
||||||
|
message.setTo(userService.getEmailsForSend(approvers));
|
||||||
|
|
||||||
|
mailer.send(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected void addWorkflow(T entity) {
|
protected void addWorkflow(T entity) {
|
||||||
if (entity.getType() == null) {
|
if (entity.getType() == null) {
|
||||||
return;
|
return;
|
||||||
@@ -153,6 +188,23 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
|||||||
entity.getAuthorization().add(auth);
|
entity.getAuthorization().add(auth);
|
||||||
|
|
||||||
this.update(e);
|
this.update(e);
|
||||||
|
|
||||||
|
this.sendToApprovers(e);
|
||||||
|
|
||||||
|
SettingsData settings = settingsService.getSettings();
|
||||||
|
MailMessage message = null;
|
||||||
|
|
||||||
|
if (e.getOwnedBy().getEmail() != null
|
||||||
|
&& !e.getOwnedBy().getEmail().isEmpty()
|
||||||
|
&& e.getOwnedBy().isNotify()) {
|
||||||
|
if (e.getState() == RequirementState.APPROVED) {
|
||||||
|
message = messageBuilder.buildMessage(settings.getConfReqTemplate(), e);
|
||||||
|
} else {
|
||||||
|
message = messageBuilder.buildMessage(settings.getAuthReqTemplate(), e);
|
||||||
|
}
|
||||||
|
message.setTo(e.getOwnedBy().getEmail());
|
||||||
|
mailer.send(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -19,5 +19,5 @@ public interface UserService extends UserDetailsService, Service<User> {
|
|||||||
public void grantAdmin();
|
public void grantAdmin();
|
||||||
public void removeAccess();
|
public void removeAccess();
|
||||||
public void loadAuthorities(User user);
|
public void loadAuthorities(User user);
|
||||||
|
public String[] getEmailsForSend(List<User> users);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,12 @@
|
|||||||
package info.bukova.isspst.services.users;
|
package info.bukova.isspst.services.users;
|
||||||
|
|
||||||
|
import info.bukova.isspst.Constants;
|
||||||
|
import info.bukova.isspst.data.Role;
|
||||||
|
import info.bukova.isspst.data.User;
|
||||||
|
import info.bukova.isspst.services.AbstractService;
|
||||||
|
//import info.bukova.isspst.services.LazyLoader;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -15,12 +22,6 @@ import org.springframework.security.core.userdetails.UserDetails;
|
|||||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import info.bukova.isspst.Constants;
|
|
||||||
import info.bukova.isspst.data.Role;
|
|
||||||
import info.bukova.isspst.data.User;
|
|
||||||
import info.bukova.isspst.services.AbstractService;
|
|
||||||
//import info.bukova.isspst.services.LazyLoader;
|
|
||||||
|
|
||||||
public class UserServiceImpl extends AbstractService<User> implements UserService {
|
public class UserServiceImpl extends AbstractService<User> implements UserService {
|
||||||
|
|
||||||
private PasswordEncoder encoder;
|
private PasswordEncoder encoder;
|
||||||
@@ -152,5 +153,20 @@ public class UserServiceImpl extends AbstractService<User> implements UserServic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] getEmailsForSend(List<User> users) {
|
||||||
|
List<String> emails = new ArrayList<String>();
|
||||||
|
for (User u : users) {
|
||||||
|
if (u.getEmail() != null && !u.getEmail().isEmpty() && u.isNotify()) {
|
||||||
|
emails.add(u.getEmail());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] ret = new String[emails.size()];
|
||||||
|
ret = emails.toArray(ret);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,9 @@
|
|||||||
<property name="from" value="${mail.from}"/>
|
<property name="from" value="${mail.from}"/>
|
||||||
</bean>
|
</bean>
|
||||||
|
|
||||||
<bean id="messageBuilder" class="info.bukova.isspst.mail.EntityMessageBuilder"/>
|
<bean id="messageBuilder" class="info.bukova.isspst.mail.EntityMessageBuilder">
|
||||||
|
<property name="html" value="true"/>
|
||||||
|
</bean>
|
||||||
|
|
||||||
<!-- <bean id="mailer" class="info.bukova.rsfaktura.services.mail.ThreadMailer"> -->
|
<!-- <bean id="mailer" class="info.bukova.rsfaktura.services.mail.ThreadMailer"> -->
|
||||||
<!-- <constructor-arg ref="attachementMailer"/> -->
|
<!-- <constructor-arg ref="attachementMailer"/> -->
|
||||||
|
|||||||
@@ -4,12 +4,13 @@
|
|||||||
<window
|
<window
|
||||||
border="normal"
|
border="normal"
|
||||||
apply="org.zkoss.bind.BindComposer"
|
apply="org.zkoss.bind.BindComposer"
|
||||||
viewModel="@id('vm') @init('info.bukova.isspst.ui.requirement.TripRequirementList')">
|
viewModel="@id('vm') @init('info.bukova.isspst.ui.requirement.TripRequirementList')"
|
||||||
|
vflex="1">
|
||||||
<caption
|
<caption
|
||||||
zclass="form-caption"
|
zclass="form-caption"
|
||||||
label="${labels.AgendaActRequirements}" />
|
label="${labels.AgendaActRequirements}" />
|
||||||
|
|
||||||
<tabbox>
|
<tabbox vflex="1">
|
||||||
<tabs>
|
<tabs>
|
||||||
<tab label="${labels.RequirementsGridMy}"/>
|
<tab label="${labels.RequirementsGridMy}"/>
|
||||||
<tab label="${labels.RequirementsGridMyCentres}" disabled="@load(not vm.showCentre)"/>
|
<tab label="${labels.RequirementsGridMyCentres}" disabled="@load(not vm.showCentre)"/>
|
||||||
@@ -24,7 +25,8 @@
|
|||||||
model="@load(vm.dataList)"
|
model="@load(vm.dataList)"
|
||||||
selectedItem="@bind(vm.dataBean)"
|
selectedItem="@bind(vm.dataBean)"
|
||||||
onAfterRender="@command('afterRender')"
|
onAfterRender="@command('afterRender')"
|
||||||
selectedIndex="@bind(vm.selIndex)">
|
selectedIndex="@bind(vm.selIndex)"
|
||||||
|
vflex="1">
|
||||||
<listhead menupopup="auto" sizable="true">
|
<listhead menupopup="auto" sizable="true">
|
||||||
<listheader
|
<listheader
|
||||||
label="${labels.RequirementsGridNumberSerie}"
|
label="${labels.RequirementsGridNumberSerie}"
|
||||||
@@ -140,16 +142,18 @@
|
|||||||
</tabpanel>
|
</tabpanel>
|
||||||
|
|
||||||
<tabpanel apply="org.zkoss.bind.BindComposer"
|
<tabpanel apply="org.zkoss.bind.BindComposer"
|
||||||
viewModel="@id('vmSub') @init('info.bukova.isspst.ui.requirement.TripRequirementListCentre')">
|
viewModel="@id('vmSub') @init('info.bukova.isspst.ui.requirement.TripRequirementListCentre')"
|
||||||
|
vflex="1">
|
||||||
<include src="/requirements/toolbar.zul"/>
|
<include src="/requirements/toolbar.zul"/>
|
||||||
|
|
||||||
<hbox width="100%">
|
<hbox vflex="1">
|
||||||
<listbox
|
<listbox
|
||||||
model="@load(vmSub.dataList)"
|
model="@load(vmSub.dataList)"
|
||||||
selectedItem="@bind(vmSub.dataBean)"
|
selectedItem="@bind(vmSub.dataBean)"
|
||||||
hflex="7"
|
hflex="7"
|
||||||
onAfterRender="@command('afterRender')"
|
onAfterRender="@command('afterRender')"
|
||||||
selectedIndex="@bind(vmSub.selIndex)">
|
selectedIndex="@bind(vmSub.selIndex)"
|
||||||
|
vflex="1">
|
||||||
<listhead menupopup="auto">
|
<listhead menupopup="auto">
|
||||||
<listheader
|
<listheader
|
||||||
label="${labels.RequirementsGridNumberSerie}"
|
label="${labels.RequirementsGridNumberSerie}"
|
||||||
@@ -291,15 +295,17 @@
|
|||||||
</tabpanel>
|
</tabpanel>
|
||||||
|
|
||||||
<tabpanel apply="org.zkoss.bind.BindComposer"
|
<tabpanel apply="org.zkoss.bind.BindComposer"
|
||||||
viewModel="@id('vmSub') @init('info.bukova.isspst.ui.requirement.TripRequirementListWorkgroup')">
|
viewModel="@id('vmSub') @init('info.bukova.isspst.ui.requirement.TripRequirementListWorkgroup')"
|
||||||
|
vflex="1">
|
||||||
<include src="/requirements/toolbar.zul"/>
|
<include src="/requirements/toolbar.zul"/>
|
||||||
<hbox width="100%">
|
<hbox vflex="1">
|
||||||
<listbox
|
<listbox
|
||||||
model="@load(vmSub.dataList)"
|
model="@load(vmSub.dataList)"
|
||||||
selectedItem="@bind(vmSub.dataBean)"
|
selectedItem="@bind(vmSub.dataBean)"
|
||||||
hflex="7"
|
hflex="7"
|
||||||
onAfterRender="@command('afterRender')"
|
onAfterRender="@command('afterRender')"
|
||||||
selectedIndex="@bind(vmSub.selIndex)">
|
selectedIndex="@bind(vmSub.selIndex)"
|
||||||
|
vflex="1">
|
||||||
<listhead menupopup="auto">
|
<listhead menupopup="auto">
|
||||||
<listheader
|
<listheader
|
||||||
label="${labels.RequirementsGridNumberSerie}"
|
label="${labels.RequirementsGridNumberSerie}"
|
||||||
@@ -462,16 +468,17 @@
|
|||||||
</hbox>
|
</hbox>
|
||||||
</tabpanel>
|
</tabpanel>
|
||||||
|
|
||||||
<tabpanel apply="org.zkoss.bind.BindComposer"
|
<tabpanel vflex="1" apply="org.zkoss.bind.BindComposer"
|
||||||
viewModel="@id('vmSub') @init('info.bukova.isspst.ui.requirement.TripRequirementListAll')">
|
viewModel="@id('vmSub') @init('info.bukova.isspst.ui.requirement.TripRequirementListAll')">
|
||||||
<include src="/requirements/toolbar.zul"/>
|
<include src="/requirements/toolbar.zul"/>
|
||||||
<hbox width="100%">
|
<hbox vflex="1">
|
||||||
<listbox
|
<listbox
|
||||||
model="@load(vmSub.dataList)"
|
model="@load(vmSub.dataList)"
|
||||||
selectedItem="@bind(vmSub.dataBean)"
|
selectedItem="@bind(vmSub.dataBean)"
|
||||||
hflex="7"
|
hflex="7"
|
||||||
onAfterRender="@command('afterRender')"
|
onAfterRender="@command('afterRender')"
|
||||||
selectedIndex="@bind(vmSub.selIndex)">
|
selectedIndex="@bind(vmSub.selIndex)"
|
||||||
|
vflex="1">
|
||||||
<listhead menupopup="auto">
|
<listhead menupopup="auto">
|
||||||
<listheader
|
<listheader
|
||||||
label="${labels.RequirementsGridNumberSerie}"
|
label="${labels.RequirementsGridNumberSerie}"
|
||||||
|
|||||||
Reference in New Issue
Block a user