Agenda na definici procesu schválení požadavků.

closes #102
multitenant
Josef Rokos 11 years ago
parent d711736132
commit 1e3a669344

@ -3,11 +3,13 @@ package info.bukova.isspst;
import java.util.List;
import info.bukova.isspst.data.Permission;
import info.bukova.isspst.data.RequirementType;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.data.User;
import info.bukova.isspst.reporting.Report;
import info.bukova.isspst.reporting.ReportMapping;
import info.bukova.isspst.reporting.ReportType;
import info.bukova.isspst.services.requirements.RequirementTypeService;
import info.bukova.isspst.services.users.PermissionService;
import info.bukova.isspst.services.users.RoleService;
import info.bukova.isspst.services.users.UserService;
@ -26,6 +28,7 @@ public class AppInitListener implements ServletContextListener {
private RoleService roleService;
private UserService userService;
private PermissionService permService;
private RequirementTypeService reqTypeService;
@Override
public void contextDestroyed(ServletContextEvent arg0) {
@ -41,12 +44,14 @@ public class AppInitListener implements ServletContextListener {
roleService = ctx.getBean(RoleService.class);
userService = ctx.getBean(UserService.class);
permService = ctx.getBean(PermissionService.class);
reqTypeService = ctx.getBean(RequirementTypeService.class);
userService.grantAdmin();
checkRoles();
checkUsers();
checkPermissions();
checkAllAdminRights();
checkReqTypes();
userService.removeAccess();
loadModuleReports();
@ -141,4 +146,13 @@ public class AppInitListener implements ServletContextListener {
}
}
private void checkReqTypes() {
List<RequirementType> types = reqTypeService.getAll();
for (RequirementType type : Constants.REQTYPES) {
if (!types.contains(type)) {
reqTypeService.add(type);
}
}
}
}

@ -2,6 +2,7 @@ package info.bukova.isspst;
import info.bukova.isspst.data.Permission;
import info.bukova.isspst.data.PermissionType;
import info.bukova.isspst.data.RequirementType;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.reporting.Report;
import info.bukova.isspst.reporting.ReportMapping;
@ -9,6 +10,7 @@ import info.bukova.isspst.services.addressbook.AdbService;
import info.bukova.isspst.services.buildings.BuildingService;
import info.bukova.isspst.services.munits.MUnitService;
import info.bukova.isspst.services.material.MaterialService;
import info.bukova.isspst.services.requirements.RequirementTypeService;
import info.bukova.isspst.services.users.RoleService;
import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.services.workgroups.WorkgroupService;
@ -57,6 +59,7 @@ public class Constants {
public final static String MOD_MATERIAL = "MATERIAL";
public final static String MOD_WORKGROUPS = "WORKGROUPS";
public final static String MOD_REQUIREMENTS = "REQUIREMENTS";
public final static String MOD_WORKFLOW = "WORKFLOW";
public final static Module MODULES[] = {
new Module(MOD_USERS, "Uživatelé", UserService.class),
new Module(MOD_PERMISSIONS, "Práva", RoleService.class),
@ -65,13 +68,11 @@ public class Constants {
new Module(MOD_MUNITS, "Měrné jednotky", MUnitService.class),
new Module(MOD_MATERIAL, "Materiál", MaterialService.class),
new Module(MOD_WORKGROUPS, "Pracovní skupiny", WorkgroupService.class),
new Module(MOD_REQUIREMENTS, "Požadavky", null)
new Module(MOD_REQUIREMENTS, "Požadavky", null),
new Module(MOD_WORKFLOW, "Procesy schválení", RequirementTypeService.class)
};
public final static String PERM_APPROVE_WORKGROUP = "PERM_APPROVE_WORKGROUP";
public final static String PERM_APPROVE_CENTRE = "PERM_APPROVE_CENTRE";
public final static String PERM_APPROVE_LIMIT = "PERM_APPROVE_LIMIT";
public final static String PERM_APPROVE_FINAL = "PERM_APPROVE_FINAL";
public final static String PERM_APPROVE = "PERM_APPROVE";
public final static String PERM_SHOW_WORKGROUP_REQ = "PERM_SHOW_WORKGROUP_REQ";
public final static String PERM_SHOW_CENTRE_REQ = "PERM_SHOW_CENTRE_REQ";
public final static String PERM_SHOW_ALL_REQ = "PERM_SHOW_ALL_REQ";
@ -80,10 +81,7 @@ public class Constants {
new Permission(PERM_SHOW_WORKGROUP_REQ, "Zobrazení požadavků komise", MOD_REQUIREMENTS, PermissionType.WORKGROUP),
new Permission(PERM_SHOW_CENTRE_REQ, "Zobrazení požadavků střediska", MOD_REQUIREMENTS, PermissionType.CENTRE),
new Permission(PERM_SHOW_ALL_REQ, "Zobrazení všech požadavků", MOD_REQUIREMENTS, PermissionType.GLOBAL),
new Permission(PERM_APPROVE_WORKGROUP, "Schválení v komisi", MOD_REQUIREMENTS, PermissionType.WORKGROUP),
new Permission(PERM_APPROVE_CENTRE, "Schválení ve středisku", MOD_REQUIREMENTS, PermissionType.CENTRE),
new Permission(PERM_APPROVE_LIMIT, "Schválení nadlimitních", MOD_REQUIREMENTS, PermissionType.GLOBAL),
new Permission(PERM_APPROVE_FINAL, "Konečné schválení", MOD_REQUIREMENTS, PermissionType.CENTRE),
new Permission(PERM_APPROVE, "Schválení", MOD_REQUIREMENTS, PermissionType.WORKGROUP),
};
public final static String DYNAMIC_REPORT_NAME = "Tabulková sestava";
@ -91,4 +89,11 @@ public class Constants {
new ReportMapping(MOD_ADDRESSBOOK, new Report("Adresní karty", "address")),
new ReportMapping(MOD_ADDRESSBOOK, new Report("Adresna", "address", false, true))
};
public final static String REQTYPE_ORDER = "ORDER";
public final static String REQTYPE_BUSINESSTRIP = "BUSINESSTRIP";
public final static RequirementType REQTYPES[] = {
new RequirementType(REQTYPE_ORDER, "Objednávky materiálu a služeb"),
new RequirementType(REQTYPE_BUSINESSTRIP, "Služební cesty")
};
}

@ -0,0 +1,7 @@
package info.bukova.isspst.dao;
import info.bukova.isspst.data.RequirementType;
public interface RequirementTypeDao extends BaseDao<RequirementType> {
}

@ -0,0 +1,8 @@
package info.bukova.isspst.dao.jpa;
import info.bukova.isspst.dao.RequirementTypeDao;
import info.bukova.isspst.data.RequirementType;
public class RequirementTypeDaoJPA extends BaseDaoJPA<RequirementType> implements RequirementTypeDao {
}

@ -0,0 +1,71 @@
package info.bukova.isspst.data;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
@Entity
@Table(name = "REQUIREMENTTYPE")
public class RequirementType extends BaseData {
@Column(name = "TYPE")
private String type;
@Column(name = "DESCRIPTION")
private String description;
@OneToMany(cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
@OrderBy("WORDER")
private List<Workflow> workflow;
public RequirementType() {
workflow = new ArrayList<Workflow>();
}
public RequirementType(String type, String description) {
this();
this.type = type;
this.description = description;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public List<Workflow> getWorkflow() {
return workflow;
}
public void setWorkflow(List<Workflow> workflow) {
this.workflow = workflow;
}
public boolean equals(Object o) {
if (o instanceof RequirementType && ((RequirementType)o).getType().equals(this.type)) {
return true;
}
return false;
}
}

@ -0,0 +1,59 @@
package info.bukova.isspst.data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
@Entity
@Table(name = "WORKFLOW")
public class Workflow extends BaseData {
@Column(name = "CENTRE")
private Boolean centre;
@ManyToOne
@LazyCollection(LazyCollectionOption.FALSE)
@JoinColumn(name = "ROLE_ID")
private Role role;
@Column(name = "WORDER")
private Integer wOrder;
public Boolean getCentre() {
return centre;
}
public void setCentre(Boolean centre) {
this.centre = centre;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
public boolean equals(Object o) {
if (o instanceof Workflow
&& ((Workflow)o).getCentre().equals(centre)
&& ((Workflow)o).getRole().equals(role)) {
return true;
}
return false;
}
public Integer getOrder() {
return wOrder;
}
public void setOrder(Integer order) {
this.wOrder = order;
}
}

@ -0,0 +1,8 @@
package info.bukova.isspst.services.requirements;
import info.bukova.isspst.data.RequirementType;
import info.bukova.isspst.services.Service;
public interface RequirementTypeService extends Service<RequirementType> {
}

@ -0,0 +1,8 @@
package info.bukova.isspst.services.requirements;
import info.bukova.isspst.data.RequirementType;
import info.bukova.isspst.services.AbstractOwnedService;
public class RequirementTypeServiceImpl extends AbstractOwnedService<RequirementType> implements RequirementTypeService {
}

@ -2,6 +2,7 @@ package info.bukova.isspst.services.users;
import java.util.List;
import info.bukova.isspst.data.Permission;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.services.Service;
@ -10,5 +11,7 @@ public interface RoleService extends Service<Role> {
public Role getRoleByAuthority(String authority);
public List<Role> getWorkgroupRoles();
public List<Role> getCentreRoles();
public List<Role> getRolesWithPermission(Permission perm, boolean centre);
public List<Role> getRolesWithPermission(String authority, boolean centre);
}

@ -1,14 +1,22 @@
package info.bukova.isspst.services.users;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.hibernate.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import info.bukova.isspst.data.Permission;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.services.AbstractService;
public class RoleServiceImpl extends AbstractService<Role> implements RoleService {
@Autowired
private PermissionService permService;
@Override
@Transactional
public Role getRoleByAuthority(String authority) {
@ -27,4 +35,28 @@ public class RoleServiceImpl extends AbstractService<Role> implements RoleServic
return this.execQuery("from Role where centre = true");
}
@SuppressWarnings("unchecked")
@Override
@Transactional
public List<Role> getRolesWithPermission(Permission perm, boolean centre) {
String wgClausule;
if (centre) {
wgClausule = "centre";
} else {
wgClausule = "workgroup";
}
Set<Permission> perms = new HashSet<Permission>();
perms.add(perm);
Query q = dao.getQuery("select r from Role r join r.permissions p where r." + wgClausule + " = true and p in (:perms)");
q.setParameterList("perms", perms);
return q.list();
}
@Override
@Transactional
public List<Role> getRolesWithPermission(String authority, boolean centre) {
Permission p = permService.selectSingle("from Permission where authority = '" + authority + "'");
return getRolesWithPermission(p, centre);
}
}

@ -0,0 +1,203 @@
package info.bukova.isspst.ui.requirements;
import info.bukova.isspst.Constants;
import info.bukova.isspst.data.RequirementType;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.data.Workflow;
import info.bukova.isspst.services.requirements.RequirementTypeService;
import info.bukova.isspst.services.users.RoleService;
import java.util.ArrayList;
import java.util.List;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.event.DropEvent;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Listitem;
public class RequirementTypesVM {
@WireVariable
private RequirementTypeService reqTypeService;
@WireVariable
private RoleService roleService;
private List<RequirementType> reqTypes;
private List<Role> centreRoles;
private List<Role> workgroupRoles;
private RequirementType selected;
@Init
public void init() {
reqTypes = reqTypeService.getAll();
initRoles();
}
private void initRoles() {
centreRoles = new ArrayList<Role>(roleService.getRolesWithPermission(Constants.PERM_APPROVE, true));
workgroupRoles = new ArrayList<Role>(roleService.getRolesWithPermission(Constants.PERM_APPROVE, false));
}
@Command
@NotifyChange({"selected", "centreRoles", "workgroupRoles"})
public void addRoleWg(@BindingParam("event") DropEvent event) {
Role r;
try {
r = ((Listitem)event.getDragged()).getValue();
} catch (ClassCastException e) {
return;
}
addRole(r, false);
}
@Command
@NotifyChange({"selected", "centreRoles", "workgroupRoles"})
public void addRoleCentre(@BindingParam("event") DropEvent event) {
Role r;
try {
r = ((Listitem)event.getDragged()).getValue();
} catch (ClassCastException e) {
return;
}
addRole(r, true);
}
private void addRole(Role r, boolean centre) {
Workflow w = new Workflow();
w.setRole(r);
w.setCentre(centre);
w.setOrder(selected.getWorkflow().size());
if (!selected.getWorkflow().contains(w)) {
selected.getWorkflow().add(w);
}
if (centre) {
centreRoles.remove(r);
} else {
workgroupRoles.remove(r);
}
reqTypeService.update(selected);
}
@Command
@NotifyChange({"selected", "centreRoles", "workgroupRoles"})
public void removeRoleWg(@BindingParam("event") DropEvent event) {
removeWorkflow((Workflow) ((Listitem)event.getDragged()).getValue());
}
@Command
@NotifyChange({"selected", "centreRoles", "workgroupRoles"})
public void removeRoleCentre(@BindingParam("event") DropEvent event) {
removeWorkflow((Workflow) ((Listitem)event.getDragged()).getValue());
}
private void removeWorkflow(Workflow w) {
selected.getWorkflow().remove(w);
if (w.getCentre()) {
centreRoles.add(w.getRole());
} else {
workgroupRoles.add(w.getRole());
}
resetOrder();
reqTypeService.update(selected);
}
@Command
@NotifyChange({"selected", "centreRoles", "workgroupRoles"})
public void reorderWg(@BindingParam("event") DropEvent event) {
reorder(event, false);
}
@Command
@NotifyChange({"selected", "centreRoles", "workgroupRoles"})
public void reorderCentre(@BindingParam("event") DropEvent event) {
reorder(event, true);
}
private void reorder(DropEvent event, boolean centre) {
Workflow w;
try {
w = ((Listitem)event.getDragged()).getValue();
} catch (ClassCastException e) {
if (centre) {
addRoleCentre(event);
} else {
addRoleWg(event);
}
return;
}
Workflow target = ((Listitem)event.getTarget()).getValue();
List<Workflow> wf = selected.getWorkflow();
int dragIndex = wf.indexOf(w);
int dropIndex = wf.indexOf(target);
if (dragIndex > dropIndex) {
wf.remove(w);
wf.add(dropIndex, w);
} else {
for (int i = dragIndex; i < dropIndex; i++) {
wf.add(i, wf.get(i + 1));
}
wf.remove(w);
wf.remove(dropIndex);
wf.add(dropIndex, w);
}
w.setOrder(wf.indexOf(w));
resetOrder();
reqTypeService.update(selected);
}
private void resetOrder() {
for (int i = 0; i < selected.getWorkflow().size(); i++) {
selected.getWorkflow().get(i).setOrder(i);
}
}
public List<RequirementType> getReqTypes() {
return reqTypes;
}
public List<Role> getCentreRoles() {
return centreRoles;
}
public List<Role> getWorkgroupRoles() {
return workgroupRoles;
}
public RequirementType getSelected() {
return selected;
}
@NotifyChange({"selected", "workgroupRoles", "centreRoles"})
public void setSelected(RequirementType selected) {
if (selected == null) {
return;
}
initRoles();
for (Workflow w : selected.getWorkflow()) {
if (w.getCentre()) {
centreRoles.remove(w.getRole());
} else {
workgroupRoles.remove(w.getRole());
}
}
this.selected = selected;
}
}

@ -16,6 +16,8 @@
<mapping class="info.bukova.isspst.data.Workgroup"></mapping>
<mapping class="info.bukova.isspst.data.Member"></mapping>
<mapping class="info.bukova.isspst.data.JobMapping"></mapping>
<mapping class="info.bukova.isspst.data.Workflow"></mapping>
<mapping class="info.bukova.isspst.data.RequirementType"></mapping>
</session-factory>
</hibernate-configuration>

@ -38,6 +38,8 @@ AgendaRights=Práva
RightsFormTitle=Práva
RightsGridRole=Role
RightsGridModules=Práva modulů
WorkgroupFunction=Funkce v komisích
CentreFunction=Funkce ve střediscích
AgendaSuppliers=Dodavatelé
SuppliersFormTitle=Dodavatel
@ -90,6 +92,15 @@ MaterialFormTitle=Materiál
AgendaWorkgroups=Střediska / komise
WorkgroupFormTitle=Pracvní skupina
AgendaWorkflow=Procesy schválení
RequirementType=Typ požadavku:
AvailableRoles=Dostupné role
WorkgroupRoles=Role komisí
CentreRoles=Role středisek
Workflow=Proces schválení
WorkgroupWorkflow=Schválení v komisi
CentreWorkflow=Schválení ve středisku
CentresForRequirements=Střediska, pro která lze vkládat požadavky
WorkgroupMembership=Členství v komisích
LogedInUser=Přihlášený uživatel:

@ -128,6 +128,10 @@
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="reqTypeDao" class="info.bukova.isspst.dao.jpa.RequirementTypeDaoJPA">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- Business logic -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
@ -190,4 +194,9 @@
<property name="validator" ref="validator"/>
</bean>
<bean id="reqTypeService" class="info.bukova.isspst.services.requirements.RequirementTypeServiceImpl">
<property name="dao" ref="reqTypeDao"/>
<property name="validator" ref="validator"/>
</bean>
</beans>

@ -5,8 +5,8 @@
<caption zclass="form-caption" label="${labels.AgendaRights}" />
<label value="@load(vm.dataBean.description)" style="font-weight: bold;"/>
<hbox>
<checkbox label="Práva pracovních skupin" checked="@bind(vm.dataBean.workgroup)"/>
<checkbox label="Práva středisek" checked="@bind(vm.dataBean.centre)"/>
<checkbox label="${labels.WorkgroupFunction}" checked="@bind(vm.dataBean.workgroup)"/>
<checkbox label="${labels.CentreFunction}" checked="@bind(vm.dataBean.centre)"/>
</hbox>
<vbox children="@load(vm.modules)" width="730px">

@ -37,6 +37,7 @@
</tabpanel>
<tabpanel>
<menubar orient="vertical">
<menuitem label="${labels.AgendaWorkflow}" href="/settings/workflow" disabled="${not sec:isAllGranted('PERM_EDIT_WORKFLOW')}"/>
<menuitem label="Limity částek"/>
<menuitem label="E-maily" />
</menubar>

@ -0,0 +1,10 @@
<?page title="${labels.AgendaWorkflow}" contentType="text/html;charset=UTF-8"?>
<zk>
<zscript>
String gridZul = "workflow.zul";
</zscript>
<include src="/app/template.zhtml"/>
</zk>

@ -0,0 +1,73 @@
<?page title="${labels.AgendaWorkflow}" contentType="text/html;charset=UTF-8"?>
<zk>
<window border="normal" apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('info.bukova.isspst.ui.requirements.RequirementTypesVM')">
<caption zclass="form-caption" label="${labels.AgendaWorkflow}" />
<vbox>
<hbox>
<label value="${labels.RequirementType}"/>
<combobox model="@load(vm.reqTypes)" readonly="true" width="300px" selectedItem="@bind(vm.selected)">
<template name="model">
<comboitem label="@load(each.description)"/>
</template>
</combobox>
</hbox>
<hbox>
<div hflex="1">
<groupbox mold="3d" hflex="1">
<caption label="${labels.AvailableRoles}"/>
<vbox>
<listbox id="allWgRoles" model="@load(vm.workgroupRoles)" droppable="workgroup"
onDrop="@command('removeRoleWg', event=event)">
<listhead>
<listheader label="${labels.WorkgroupRoles}"/>
</listhead>
<template name="model">
<listitem label="@load(each.description)" draggable="workgroup" droppable="workgroup"
onDrop="@command('removeRoleCentre', event=event)"/>
</template>
</listbox>
<listbox id="allCentreRoles" model="@load(vm.centreRoles)" droppable="centre"
onDrop="@command('removeRoleCentre', event=event)">
<listhead>
<listheader label="${labels.CentreRoles }"/>
</listhead>
<template name="model">
<listitem label="@load(each.description)" draggable="centre" droppable="centre"
onDrop="@command('removeRoleCentre', event=event)"/>
</template>
</listbox>
</vbox>
</groupbox>
</div>
<div hflex="1">
<groupbox mold="3d" visible="@load(not empty vm.selected)">
<caption label="${labels.Workflow}"/>
<vbox>
<listbox id="wgWorkflow" model="@load(vm.selected.workflow)" droppable="workgroup"
onDrop="@command('addRoleWg', event=event)">
<listhead>
<listheader label="${labels.WorkgroupWorkflow}"/>
</listhead>
<template name="model">
<listitem label="@load(each.role.description)" visible="@load(not each.centre)"
onDrop="@command('reorderWg', event=event)" draggable="workgroup" droppable="workgroup"/>
</template>
</listbox>
<listbox id="centreWorkflow" model="@load(vm.selected.workflow)" droppable="centre"
onDrop="@command('addRoleCentre', event=event)">
<listhead>
<listheader label="${labels.CentreWorkflow}"/>
</listhead>
<template name="model">
<listitem label="@load(each.role.description)" visible="@load(each.centre)"
onDrop="@command('reorderCentre', event=event)" draggable="centre" droppable="centre"/>
</template>
</listbox>
</vbox>
</groupbox>
</div>
</hbox>
</vbox>
</window>
</zk>
Loading…
Cancel
Save