@@ -0,0 +1,24 @@
|
|||||||
|
package info.bukova.isspst.services.requirement;
|
||||||
|
|
||||||
|
import info.bukova.isspst.services.IsspstException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Pepa Rokos
|
||||||
|
*/
|
||||||
|
public class ApproveException extends IsspstException {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = -3794779381621324848L;
|
||||||
|
|
||||||
|
public ApproveException() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ApproveException(String message) {
|
||||||
|
super(message);
|
||||||
|
this.setReason(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ import info.bukova.isspst.data.RequirementBase;
|
|||||||
import info.bukova.isspst.data.User;
|
import info.bukova.isspst.data.User;
|
||||||
import info.bukova.isspst.services.Service;
|
import info.bukova.isspst.services.Service;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -21,6 +22,7 @@ public interface RequirementBaseService<T extends RequirementBase> extends Servi
|
|||||||
public void loadType(T data);
|
public void loadType(T data);
|
||||||
public void loadWorkflow(T data);
|
public void loadWorkflow(T data);
|
||||||
public void approve(T entity);
|
public void approve(T entity);
|
||||||
|
public void approve(T entity, Date approveDate);
|
||||||
public boolean canApprove(T entity);
|
public boolean canApprove(T entity);
|
||||||
public List<User> getNextApprover(T entity);
|
public List<User> getNextApprover(T entity);
|
||||||
|
|
||||||
|
|||||||
+40
-21
@@ -18,11 +18,6 @@ import info.bukova.isspst.services.LazyLoader;
|
|||||||
import info.bukova.isspst.services.settings.GlobalSettingsService;
|
import info.bukova.isspst.services.settings.GlobalSettingsService;
|
||||||
import info.bukova.isspst.services.users.UserService;
|
import info.bukova.isspst.services.users.UserService;
|
||||||
import info.bukova.isspst.services.workgroups.WorkgroupService;
|
import info.bukova.isspst.services.workgroups.WorkgroupService;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.hibernate.LazyInitializationException;
|
import org.hibernate.LazyInitializationException;
|
||||||
import org.hibernate.Query;
|
import org.hibernate.Query;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -30,6 +25,10 @@ import org.springframework.security.access.prepost.PostFilter;
|
|||||||
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;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Pepa Rokos
|
* @author Pepa Rokos
|
||||||
* @author Franta Přibyl
|
* @author Franta Přibyl
|
||||||
@@ -211,37 +210,45 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void approve(T entity, User user) {
|
protected void approve(T entity, User user, Date approveDate) {
|
||||||
T e = (T) dao.getById(entity.getId());
|
T e = (T) dao.getById(entity.getId());
|
||||||
|
|
||||||
|
if (e.getReqDate().getTime() > approveDate.getTime()) {
|
||||||
|
throw new ApproveException("ErrApproveBeforeRequirement");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.getLastApproveDate() != null && e.getLastApproveDate().getTime() > approveDate.getTime()) {
|
||||||
|
throw new ApproveException("ErrAppreveBeforeLastApprove");
|
||||||
|
}
|
||||||
|
|
||||||
Workflow wf = getNextWorkflow(e);
|
Workflow wf = getNextWorkflow(e);
|
||||||
if (wf == null) {
|
if (wf == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Role role = wf.getRole();
|
Role role = wf.getRole();
|
||||||
AuthItem auth = new AuthItem();
|
AuthItem auth = new AuthItem();
|
||||||
auth.setApprover(user);
|
auth.setApprover(user);
|
||||||
auth.setRole(role);
|
auth.setRole(role);
|
||||||
auth.setAuthDate(new Date());
|
auth.setAuthDate(approveDate);
|
||||||
|
|
||||||
e.getAuthorization().add(auth);
|
e.getAuthorization().add(auth);
|
||||||
|
|
||||||
if (getNextWorkflow(e) == null) {
|
if (getNextWorkflow(e) == null) {
|
||||||
e.setState(RequirementState.APPROVED);
|
e.setState(RequirementState.APPROVED);
|
||||||
} else {
|
} else {
|
||||||
e.setState(RequirementState.PARTIALLY);
|
e.setState(RequirementState.PARTIALLY);
|
||||||
}
|
}
|
||||||
|
|
||||||
super.update(e);
|
super.update(e);
|
||||||
|
|
||||||
if (!autoApprove(e)) {
|
if (!autoApprove(e, approveDate)) {
|
||||||
this.sendToApprovers(e);
|
this.sendToApprovers(e);
|
||||||
|
|
||||||
SettingsData settings = settingsService.getSettings();
|
SettingsData settings = settingsService.getSettings();
|
||||||
MailMessage message = null;
|
MailMessage message = null;
|
||||||
|
|
||||||
if (e.getOwnedBy().getEmail() != null
|
if (e.getOwnedBy().getEmail() != null
|
||||||
&& !e.getOwnedBy().getEmail().isEmpty()
|
&& !e.getOwnedBy().getEmail().isEmpty()
|
||||||
&& e.getOwnedBy().isNotify()) {
|
&& e.getOwnedBy().isNotify()) {
|
||||||
if (e.getState() == RequirementState.APPROVED && settings.getConfReqTemplate() != null) {
|
if (e.getState() == RequirementState.APPROVED && settings.getConfReqTemplate() != null) {
|
||||||
@@ -249,17 +256,21 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
|||||||
} else if (settings.getAuthReqTemplate() != null) {
|
} else if (settings.getAuthReqTemplate() != null) {
|
||||||
message = messageBuilder.buildMessage(settings.getAuthReqTemplate(), e);
|
message = messageBuilder.buildMessage(settings.getAuthReqTemplate(), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message != null) {
|
if (message != null) {
|
||||||
message.setFrom(getLoggedInUser().getEmail());
|
message.setFrom(getLoggedInUser().getEmail());
|
||||||
message.setTo(e.getOwnedBy().getEmail());
|
message.setTo(e.getOwnedBy().getEmail());
|
||||||
mailer.send(message);
|
mailer.send(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
postApprove(e);
|
postApprove(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void approve(T entity, User user) {
|
||||||
|
approve(entity, user, new Date());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
@@ -268,13 +279,21 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
|
|||||||
approve(entity, getLoggedInUser());
|
approve(entity, getLoggedInUser());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
@PreAuthorize("this.canApprove(#entity)")
|
||||||
|
public void approve(T entity, Date approveDate) {
|
||||||
|
approve(entity, getLoggedInUser(), approveDate);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Volá se z metody approve pro automatické schválení dalším schvalovatelem v pořadí. Metoda z báze nedělá nic.
|
* Volá se z metody approve pro automatické schválení dalším schvalovatelem v pořadí. Metoda z báze nedělá nic.
|
||||||
*
|
*
|
||||||
* @param entity Požadavek
|
* @param entity Požadavek
|
||||||
|
* @param approveDate
|
||||||
* @return true pokud se provedlo automatické schválení.
|
* @return true pokud se provedlo automatické schválení.
|
||||||
*/
|
*/
|
||||||
protected boolean autoApprove(T entity) {
|
protected boolean autoApprove(T entity, Date approveDate) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,16 +10,15 @@ import info.bukova.isspst.data.User;
|
|||||||
import info.bukova.isspst.data.Workflow;
|
import info.bukova.isspst.data.Workflow;
|
||||||
import info.bukova.isspst.services.LazyLoader;
|
import info.bukova.isspst.services.LazyLoader;
|
||||||
import info.bukova.isspst.services.invoicing.InvoicingService;
|
import info.bukova.isspst.services.invoicing.InvoicingService;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.hibernate.Hibernate;
|
import org.hibernate.Hibernate;
|
||||||
import org.hibernate.Query;
|
import org.hibernate.Query;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Pepa Rokos
|
* @author Pepa Rokos
|
||||||
* @author Franta Přibyl
|
* @author Franta Přibyl
|
||||||
@@ -48,7 +47,7 @@ public class RequirementServiceImpl extends RequirementBaseServiceImpl<Requireme
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean autoApprove(Requirement entity)
|
protected boolean autoApprove(Requirement entity, Date approveDate)
|
||||||
{
|
{
|
||||||
List<User> approvers = this.getNextApprover(entity);
|
List<User> approvers = this.getNextApprover(entity);
|
||||||
Workflow nextWf = this.getNextWorkflow(entity);
|
Workflow nextWf = this.getNextWorkflow(entity);
|
||||||
@@ -61,7 +60,7 @@ public class RequirementServiceImpl extends RequirementBaseServiceImpl<Requireme
|
|||||||
if ((entity.getSumTotal() != null)
|
if ((entity.getSumTotal() != null)
|
||||||
&& (entity.getSumTotal().compareTo(nextWf.getLimit()) == -1))
|
&& (entity.getSumTotal().compareTo(nextWf.getLimit()) == -1))
|
||||||
{
|
{
|
||||||
approve(entity, approvers.get(0));
|
approve(entity, approvers.get(0), approveDate);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package info.bukova.isspst.ui.main;
|
||||||
|
|
||||||
|
import info.bukova.isspst.StringUtils;
|
||||||
|
import info.bukova.isspst.data.RequirementBase;
|
||||||
|
import info.bukova.isspst.services.requirement.ApproveException;
|
||||||
|
import info.bukova.isspst.services.requirement.RequirementBaseService;
|
||||||
|
import info.bukova.isspst.ui.ListViewModel;
|
||||||
|
import org.zkoss.bind.BindUtils;
|
||||||
|
import org.zkoss.bind.annotation.BindingParam;
|
||||||
|
import org.zkoss.bind.annotation.Command;
|
||||||
|
import org.zkoss.bind.annotation.ExecutionArgParam;
|
||||||
|
import org.zkoss.bind.annotation.Init;
|
||||||
|
import org.zkoss.zul.Messagebox;
|
||||||
|
import org.zkoss.zul.Window;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Pepa Rokos
|
||||||
|
*/
|
||||||
|
public class ApproveDialogVM {
|
||||||
|
|
||||||
|
private RequirementBaseService service;
|
||||||
|
private RequirementBase requirement;
|
||||||
|
private ListViewModel grid;
|
||||||
|
private Date approveDate;
|
||||||
|
|
||||||
|
public Date getApproveDate() {
|
||||||
|
return approveDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setApproveDate(Date approveDate) {
|
||||||
|
this.approveDate = approveDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Init
|
||||||
|
public void init(@ExecutionArgParam("service") RequirementBaseService service,
|
||||||
|
@ExecutionArgParam("requirement") RequirementBase requirement,
|
||||||
|
@ExecutionArgParam("grid") ListViewModel grid) {
|
||||||
|
this.service = service;
|
||||||
|
this.requirement = requirement;
|
||||||
|
this.grid = grid;
|
||||||
|
this.approveDate = new Date();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command
|
||||||
|
public void approve(@BindingParam("window") Window window) {
|
||||||
|
try {
|
||||||
|
service.approve(requirement, approveDate);
|
||||||
|
BindUtils.postNotifyChange(null, null, grid, "dataBean");
|
||||||
|
BindUtils.postNotifyChange(null, null, grid, "canApprove");
|
||||||
|
BindUtils.postGlobalCommand(null, null, "reload", null);
|
||||||
|
window.detach();
|
||||||
|
} catch (ApproveException ex) {
|
||||||
|
Messagebox.show(StringUtils.localize(ex.getReason()), StringUtils.localize("Error"), Messagebox.OK,
|
||||||
|
Messagebox.ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -7,14 +7,17 @@ import info.bukova.isspst.services.users.UserService;
|
|||||||
import info.bukova.isspst.ui.BigDecimalConverter;
|
import info.bukova.isspst.ui.BigDecimalConverter;
|
||||||
import info.bukova.isspst.ui.ListViewModel;
|
import info.bukova.isspst.ui.ListViewModel;
|
||||||
import info.bukova.isspst.ui.renderers.RequirementsItemRenderer;
|
import info.bukova.isspst.ui.renderers.RequirementsItemRenderer;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.zkoss.bind.BindUtils;
|
import org.zkoss.bind.BindUtils;
|
||||||
import org.zkoss.bind.annotation.Command;
|
import org.zkoss.bind.annotation.Command;
|
||||||
import org.zkoss.bind.annotation.Init;
|
import org.zkoss.bind.annotation.Init;
|
||||||
import org.zkoss.bind.annotation.NotifyChange;
|
import org.zkoss.bind.annotation.NotifyChange;
|
||||||
|
import org.zkoss.zk.ui.Executions;
|
||||||
import org.zkoss.zk.ui.select.annotation.WireVariable;
|
import org.zkoss.zk.ui.select.annotation.WireVariable;
|
||||||
|
import org.zkoss.zul.Window;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class RequirementSubpage<T extends RequirementBase> extends ListViewModel<T> {
|
public class RequirementSubpage<T extends RequirementBase> extends ListViewModel<T> {
|
||||||
|
|
||||||
@@ -55,8 +58,12 @@ public class RequirementSubpage<T extends RequirementBase> extends ListViewModel
|
|||||||
@Command
|
@Command
|
||||||
@NotifyChange({"dataBean", "canApprove"})
|
@NotifyChange({"dataBean", "canApprove"})
|
||||||
public void approve() {
|
public void approve() {
|
||||||
this.getReqService().approve(getDataBean());
|
Map<String, Object> params = new HashMap<String, Object>();
|
||||||
BindUtils.postGlobalCommand(null, null, "reload", null);
|
params.put("service", getReqService());
|
||||||
|
params.put("requirement", getDataBean());
|
||||||
|
params.put("grid", this);
|
||||||
|
Window window = (Window) Executions.createComponents("/main/approveDialog.zul", null, params);
|
||||||
|
window.doModal();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -42,6 +42,13 @@ RequirementItemDescription=Poznámka
|
|||||||
|
|
||||||
RequirementInvoicedAmount=Fakturovaná částka:
|
RequirementInvoicedAmount=Fakturovaná částka:
|
||||||
|
|
||||||
|
RequirementApprove=Schválit
|
||||||
|
RequirementApproveDialog=Schválení
|
||||||
|
RequirementApproveDate=Datum schválení:
|
||||||
|
RequirementApproveStatus=Stav schválení:
|
||||||
|
|
||||||
|
ErrAppreveBeforeLastApprove=Datum schválení musí být pozdější než datum posledního schválení!
|
||||||
|
ErrApproveBeforeRequirement=Datum schválení musí být pozdější než datum požadavku!
|
||||||
|
|
||||||
AgendaMyOrders=Aktuální
|
AgendaMyOrders=Aktuální
|
||||||
AgendaOrdersHistory=Ukončené
|
AgendaOrdersHistory=Ukončené
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,29 @@
|
|||||||
|
<?page title="${labels.RequirementApproveDialog}" contentType="text/html;charset=UTF-8"?>
|
||||||
|
|
||||||
|
<zk xmlns="http://www.zkoss.org/2005/zul"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.zkoss.org/2005/zul http://www.zkoss.org/2005/zul/zul.xsd">
|
||||||
|
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
|
||||||
|
|
||||||
|
<window id="approveWin" border="normal" apply="org.zkoss.bind.BindComposer"
|
||||||
|
viewModel="@id('vm') @init('info.bukova.isspst.ui.main.ApproveDialogVM')" width="300px" closable="true">
|
||||||
|
<caption
|
||||||
|
image="/img/approve-032.png"
|
||||||
|
zclass="form-caption"
|
||||||
|
label="${labels.RequirementApproveDialog}" />
|
||||||
|
|
||||||
|
<vbox hflex="1">
|
||||||
|
<hbox>
|
||||||
|
<label value="${labels.RequirementApproveDate}"/>
|
||||||
|
<datebox value="@bind(vm.approveDate)"/>
|
||||||
|
</hbox>
|
||||||
|
<separator bar="true" hflex="1"/>
|
||||||
|
<hbox>
|
||||||
|
<button image="/img/approve-016.png" label="${labels.Confirm}" onClick="@command('approve', window=approveWin)" sclass="nicebutton"/>
|
||||||
|
<button image="~./zul/img/misc/drag-disallow.png" label="${labels.ButtonStorno}" onClick="approveWin.detach()" sclass="nicebutton"/>
|
||||||
|
</hbox>
|
||||||
|
</vbox>
|
||||||
|
|
||||||
|
</window>
|
||||||
|
|
||||||
|
</zk>
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
<?page title="approve status" contentType="text/html;charset=UTF-8"?>
|
<?page title="approve status" contentType="text/html;charset=UTF-8"?>
|
||||||
<zk>
|
<zk xmlns="http://www.zkoss.org/2005/zul"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.zkoss.org/2005/zul http://www.zkoss.org/2005/zul/zul.xsd">
|
||||||
|
|
||||||
<label value="Stav schválení: "/>
|
<label value="${labels.RequirementApproveStatus}"/>
|
||||||
<button label="Schválit"
|
<button label="${labels.RequirementApprove}"
|
||||||
image="/img/approve-016.png"
|
image="/img/approve-016.png"
|
||||||
onClick="@command('approve')"
|
onClick="@command('approve')"
|
||||||
disabled="@load(not vm.canApprove)"
|
disabled="@load(not vm.canApprove)"
|
||||||
|
|||||||
Reference in New Issue
Block a user