Implementováno schvalování vyúčtování služebních cest.

closes #202
This commit is contained in:
2015-03-17 10:20:59 +01:00
parent ceac59c8d3
commit 9c5679af2c
26 changed files with 396 additions and 26 deletions
@@ -136,7 +136,7 @@ public class Constants {
new ReportMapping(MOD_ADDRESSBOOK, new Report("Adresní karty", "address")),
new ReportMapping(MOD_ADDRESSBOOK, new Report("Adresa", "address", false, true)),
new ReportMapping(MOD_TRIPBILL, new Report("Žádost", "tripRequirement", false, true)),
new ReportMapping(MOD_TRIPBILL, new Report("Vyúčtování", "tripBill", false, true)),
new ReportMapping(MOD_TRIPBILL, new Report("Vyúčtování", "tripBill", false, true, true)),
new ReportMapping(MOD_ORDER, new Report("Objednávka", "order", true, true)),
new ReportMapping(MOD_REQUIREMENTS, new Report("Požadavky", "requirements"))
};
@@ -0,0 +1,9 @@
package info.bukova.isspst.dao;
import info.bukova.isspst.data.TripBillApproval;
/**
* @author Pepa Rokos
*/
public interface TripBillApprovalDao extends BaseDao<TripBillApproval> {
}
@@ -0,0 +1,11 @@
package info.bukova.isspst.dao.jpa;
import info.bukova.isspst.dao.TripBillApprovalDao;
import info.bukova.isspst.data.TripBillApproval;
/**
* @author Pepa Rokos
*/
public class TripBillApprovalDaoJPA extends BaseDaoJPA<TripBillApproval> implements TripBillApprovalDao {
}
@@ -11,6 +11,7 @@ import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@@ -51,6 +52,9 @@ public class TripBill extends BaseData implements EntityWithAttachment {
@LazyCollection(LazyCollectionOption.TRUE)
@IndexedEmbedded
private List<FileMetainfo> attachedFiles;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "APPROVAL_ID")
private TripBillApproval approval;
public TripBill() {
billItems = new ArrayList<TripBillItem>();
@@ -147,4 +151,11 @@ public class TripBill extends BaseData implements EntityWithAttachment {
this.attachedFiles = attachedFiles;
}
public TripBillApproval getApproval() {
return approval;
}
public void setApproval(TripBillApproval approval) {
this.approval = approval;
}
}
@@ -0,0 +1,14 @@
package info.bukova.isspst.data;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
* @author Pepa Rokos
*/
@Entity
@Table(name = "TRIP_BILL_APPROVAL")
public class TripBillApproval extends RequirementBase {
}
@@ -8,10 +8,12 @@ public class Report {
private String jasperFile;
private boolean hasSettings;
private boolean singleRecord;
private boolean hasCondition;
public Report() {
hasSettings = false;
singleRecord = false;
hasCondition = false;
}
/**
@@ -46,6 +48,19 @@ public class Report {
this.singleRecord = singleRecord;
}
/**
*
* @param name
* @param jasperFile
* @param hasSettings
* @param singleRecord
* @param hasCondition
*/
public Report(String name, String jasperFile, boolean hasSettings, boolean singleRecord, boolean hasCondition) {
this(name, jasperFile, hasSettings, singleRecord);
this.hasCondition = hasCondition;
}
public ReportType getType() {
return type;
}
@@ -86,4 +101,11 @@ public class Report {
this.singleRecord = singleRecord;
}
public boolean isHasCondition() {
return hasCondition;
}
public void setHasCondition(boolean hasCondition) {
this.hasCondition = hasCondition;
}
}
@@ -24,14 +24,16 @@ public abstract class AbstractRequirementEvaluator extends AbstractModuleEvaluat
return false;
}
RequirementBase req = (RequirementBase) targetDomainObject;
if (permission.equals(Constants.PERM_EDIT_NEW)) {
return req.getState() == RequirementState.NEW;
}
if (permission.equals(Constants.PERM_DELETE_NEW)) {
return req.getState() == RequirementState.NEW;
if (targetDomainObject instanceof RequirementBase) {
RequirementBase req = (RequirementBase) targetDomainObject;
if (permission.equals(Constants.PERM_EDIT_NEW)) {
return req.getState() == RequirementState.NEW;
}
if (permission.equals(Constants.PERM_DELETE_NEW)) {
return req.getState() == RequirementState.NEW;
}
}
return true;
@@ -296,4 +296,9 @@ public abstract class AbstractService<T extends DataModel> implements Service<T>
}
}
}
@Override
public boolean canPrintRecord(T entity) {
return true;
}
}
@@ -22,5 +22,6 @@ public interface Service<T> {
public List<T> filterList(List<T> sourceList, Filter<T> filter);
public Module getModule();
public List<Report> getReports();
public boolean canPrintRecord(T entity);
}
@@ -75,11 +75,7 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
super.add(entity);
if (canApprove(entity)) {
approve(entity);
} else {
this.sendToApprovers(entity);
}
this.postAdd(entity);
}
private void checkEnable() {
@@ -103,6 +99,14 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
}
}
protected void postAdd(T entity) {
if (canApprove(entity)) {
approve(entity);
} else {
this.sendToApprovers(entity);
}
}
protected void addWorkflow(T entity) {
if (entity.getType() == null) {
return;
@@ -50,6 +50,7 @@ public class TripRequirementServiceImpl extends RequirementBaseServiceImpl<TripR
TripBill newBill = tripBillService.createTripBill(entity);
bill.getBillItems().clear();
bill.getBillItems().addAll(newBill.getBillItems());
bill.setApproval(null);
tripBillService.calculate(bill);
tripBillService.update(bill);
}
@@ -0,0 +1,14 @@
package info.bukova.isspst.services.tripbill;
import info.bukova.isspst.data.TripBill;
import info.bukova.isspst.data.TripBillApproval;
import info.bukova.isspst.services.requirement.RequirementBaseService;
/**
* @author Pepa Rokos
*/
public interface TripBillApprovalService extends RequirementBaseService<TripBillApproval> {
public TripBillApproval createApproval(TripBill bill);
}
@@ -0,0 +1,51 @@
package info.bukova.isspst.services.tripbill;
import info.bukova.isspst.Constants;
import info.bukova.isspst.data.RequirementState;
import info.bukova.isspst.data.TripBill;
import info.bukova.isspst.data.TripBillApproval;
import info.bukova.isspst.services.IsspstException;
import info.bukova.isspst.services.requirement.RequirementBaseServiceImpl;
import info.bukova.isspst.services.requirement.RequirementTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
/**
* @author Pepa Rokos
*/
public class TripBillApprovalServiceImpl extends RequirementBaseServiceImpl<TripBillApproval> implements TripBillApprovalService {
@Autowired
private RequirementTypeService reqTypeService;
@Override
public TripBillApproval createApproval(TripBill bill) {
if (bill.getApproval() != null) {
throw new IsspstException("Approval already exists");
}
TripBillApproval approval = new TripBillApproval();
approval.setCentre(bill.getRequirement().getCentre());
approval.setWorkgroup(bill.getRequirement().getWorkgroup());
approval.setReqDate(new Date());
approval.setType(reqTypeService.getTypeById(Constants.REQTYPE_BUSINESSTRIP));
approval.setState(RequirementState.NEW);
bill.setApproval(approval);
return approval;
}
@Override
@Transactional
@PreAuthorize("hasPermission(this, 'PERM_ADD')")
public void add(TripBillApproval entity) {
entity.setCreated(new Date());
entity.setOwnedBy(getLoggedInUser());
addWorkflow(entity);
dao.add(entity);
postAdd(entity);
}
}
@@ -1,5 +1,6 @@
package info.bukova.isspst.services.tripbill;
import info.bukova.isspst.data.RequirementState;
import info.bukova.isspst.data.SettingsData;
import info.bukova.isspst.data.TripBill;
import info.bukova.isspst.data.TripBillItem;
@@ -220,9 +221,19 @@ public class TripBillServiceImpl extends AbstractOwnedService<TripBill> implemen
tb.setFreeCarfare(entity.isFreeCarfare());
tb.setFreeHousing(entity.isFreeHousing());
tb.setFreeMeals(entity.isFreeMeals());
tb.setApproval(entity.getApproval());
calculate(tb);
super.update(tb);
}
}
@Override
public boolean canPrintRecord(TripBill entity) {
if (entity.getApproval() != null && entity.getApproval().getState() == RequirementState.APPROVED) {
return true;
}
return false;
}
}
@@ -5,9 +5,6 @@ import info.bukova.isspst.reporting.ReportDefinition;
import info.bukova.isspst.reporting.ReportType;
import info.bukova.isspst.services.Service;
import info.bukova.isspst.ui.DocumentViewModel;
import java.util.List;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ExecutionArgParam;
@@ -17,6 +14,8 @@ import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Window;
import java.util.List;
public class ReportDialogVM extends DocumentViewModel
{
@@ -94,4 +93,12 @@ public class ReportDialogVM extends DocumentViewModel
this.reportDefinition = reportDefinition;
}
public boolean isCanPrint() {
if (singleObject != null) {
return reportDefinition.getService().canPrintRecord(singleObject);
}
return true;
}
}
@@ -82,8 +82,8 @@ public class TripRequirementListAll extends RequirementSubpage<TripRequirement>
TripBill tb = tripRequirementService.getTripBill(getDataBean());
tripBillService.loadLazyData(tb);
Map<String, Object> params = new HashMap<String, Object>();
params.put("selected", tb);
Window win = (Window) Executions.createComponents("tripBill.zul", null, params);
params.put("bill", tb);
Window win = (Window) Executions.createComponents("tripBillSummary.zul", null, params);
win.doModal();
}
@@ -79,8 +79,8 @@ public class TripRequirementListCentre extends RequirementSubpage<TripRequiremen
TripBill tb = tripRequirementService.getTripBill(getDataBean());
tripBillService.loadLazyData(tb);
Map<String, Object> params = new HashMap<String, Object>();
params.put("selected", tb);
Window win = (Window) Executions.createComponents("tripBill.zul", null, params);
params.put("bill", tb);
Window win = (Window) Executions.createComponents("tripBillSummary.zul", null, params);
win.doModal();
}
@@ -86,8 +86,8 @@ public class TripRequirementListWorkgroup extends RequirementSubpage<TripRequire
TripBill tb = tripRequirementService.getTripBill(getDataBean());
tripBillService.loadLazyData(tb);
Map<String, Object> params = new HashMap<String, Object>();
params.put("selected", tb);
Window win = (Window) Executions.createComponents("tripBill.zul", null, params);
params.put("bill", tb);
Window win = (Window) Executions.createComponents("tripBillSummary.zul", null, params);
win.doModal();
}
@@ -1,14 +1,22 @@
package info.bukova.isspst.ui.tripbill;
import info.bukova.isspst.StringUtils;
import info.bukova.isspst.data.TripBill;
import info.bukova.isspst.data.TripBillApproval;
import info.bukova.isspst.data.Vehicle;
import info.bukova.isspst.services.settings.GlobalSettingsService;
import info.bukova.isspst.services.tripbill.TripBillApprovalService;
import info.bukova.isspst.services.tripbill.TripBillService;
import info.bukova.isspst.ui.FormWithUpload;
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.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;
import java.util.ArrayList;
import java.util.List;
@@ -20,6 +28,8 @@ public class TripBillForm extends FormWithUpload<TripBill> {
private List<Vehicle> vehicles;
@WireVariable
private GlobalSettingsService settingsService;
@WireVariable
private TripBillApprovalService tripBillApprovalService;
@Init(superclass = true)
public void init() {
@@ -43,9 +53,35 @@ public class TripBillForm extends FormWithUpload<TripBill> {
&& getDataBean().getRequirement().getBillForPassengers()
&& !getDataBean().getOwnedBy().equals(getDataBean().getRequirement().getOwnedBy())) {
return true;
} else if (getDataBean().getApproval() != null) {
return true;
}
return false;
}
@Override
@Command
@NotifyChange("errMessages")
public void save(@BindingParam("window") Window win) {
final Window editWin = win;
if (getDataBean().getApproval() == null && !isBillDisabled()) {
Messagebox.show(StringUtils.localize("TripBillSaveApprove"), StringUtils.localize("TripBillSave"), Messagebox.YES
| Messagebox.NO, Messagebox.QUESTION, new EventListener<Event>() {
@Override
public void onEvent(Event event) throws Exception {
if (((Integer) event.getData()).intValue() == Messagebox.YES) {
TripBillApproval approval = tripBillApprovalService.createApproval(getDataBean());
tripBillApprovalService.add(approval);
TripBillForm.super.save(editWin);
} else {
TripBillForm.super.save(editWin);
}
}
});
} else {
super.save(win);
}
}
}
@@ -0,0 +1,83 @@
package info.bukova.isspst.ui.tripbill;
import info.bukova.isspst.data.TripBill;
import info.bukova.isspst.data.TripBillApproval;
import info.bukova.isspst.services.requirement.TripRequirementService;
import info.bukova.isspst.services.tripbill.TripBillApprovalService;
import info.bukova.isspst.services.tripbill.TripBillService;
import info.bukova.isspst.ui.requirement.RequirementSubpage;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ExecutionArgParam;
import org.zkoss.bind.annotation.GlobalCommand;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Window;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Pepa Rokos
*/
public class TripBillSummaryVM extends RequirementSubpage<TripBillApproval> {
@WireVariable
private TripBillApprovalService tripBillApprovalService;
@WireVariable
private TripBillService tripBillService;
@WireVariable
private TripRequirementService tripRequirementService;
private TripBill bill;
@Init(superclass = true)
public void initBillSummary(@ExecutionArgParam("bill") TripBill bill) {
service = tripBillApprovalService;
if (bill.getApproval() != null) {
setDataBean(bill.getApproval());
}
this.bill = bill;
}
public TripBill getBill() {
return bill;
}
public void setBill(TripBill bill) {
this.bill = bill;
}
public List<TripBill> getBills() {
List<TripBill> bills = new ArrayList<TripBill>();
for (TripBill b : tripRequirementService.getBills(bill.getRequirement())) {
if (b.getId() != bill.getId()) {
tripBillService.loadLazyData(b);
bills.add(b);
}
}
return bills;
}
@Command
public void showBill(@BindingParam("bill") TripBill bill) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("selected", bill);
Window win = (Window) Executions.createComponents("tripBill.zul", null, params);
win.doModal();
}
@Override
@GlobalCommand
@NotifyChange("dataBean")
public void reload() {
setDataBean(tripBillApprovalService.getById(bill.getApproval().getId()));
}
}