Přidána agenda pro zadávání fakturace k požadavkům. Chybí filtrování.

refs #164
This commit is contained in:
2014-10-26 22:16:14 +01:00
parent f1ca2d11c8
commit b2d141e52b
33 changed files with 735 additions and 26 deletions
@@ -7,10 +7,11 @@ import info.bukova.isspst.data.Role;
import info.bukova.isspst.reporting.Report;
import info.bukova.isspst.reporting.ReportMapping;
import info.bukova.isspst.services.addressbook.AdbService;
import info.bukova.isspst.services.approved.ApprovedService;
import info.bukova.isspst.services.approved.OrderService;
import info.bukova.isspst.services.buildings.BuildingService;
import info.bukova.isspst.services.invoicing.InvoicingService;
import info.bukova.isspst.services.munits.MUnitService;
import info.bukova.isspst.services.orders.ApprovedService;
import info.bukova.isspst.services.orders.OrderService;
import info.bukova.isspst.services.reqsubjects.MaterialService;
import info.bukova.isspst.services.reqsubjects.ServiceItemService;
import info.bukova.isspst.services.requirement.RequirementService;
@@ -71,6 +72,7 @@ public class Constants {
public final static String MOD_TRIPBILL = "TRIPBILL";
public final static String MOD_APPROVED = "APPROVED";
public final static String MOD_ORDER = "ORDER";
public final static String MOD_INVOICING = "INVOICING";
public final static Module MODULES[] = {
new Module(MOD_USERS, "Uživatelé", UserService.class),
new Module(MOD_PERMISSIONS, "Práva", RoleService.class),
@@ -85,7 +87,8 @@ public class Constants {
new Module(MOD_WORKFLOW, "Procesy schválení", RequirementTypeService.class),
new Module(MOD_TRIPBILL, "Cestovní příkazy", TripBillService.class),
new Module(MOD_APPROVED, "Schválené položky požadavků", ApprovedService.class),
new Module(MOD_ORDER, "Objednávky", OrderService.class) };
new Module(MOD_ORDER, "Objednávky", OrderService.class),
new Module(MOD_INVOICING, "Fakturace požadavků", InvoicingService.class) };
public final static String PERM_APPROVE = "PERM_APPROVE";
public final static String PERM_SHOW_WORKGROUP_REQ = "PERM_SHOW_WORKGROUP_REQ";
@@ -0,0 +1,7 @@
package info.bukova.isspst.dao;
import info.bukova.isspst.data.Invoicing;
public interface InvoicingDao extends BaseDao<Invoicing> {
}
@@ -0,0 +1,9 @@
package info.bukova.isspst.dao.jpa;
import info.bukova.isspst.dao.InvoicingDao;
import info.bukova.isspst.data.Invoicing;
public class InvoicingDaoJPA extends BaseDaoJPA<Invoicing> implements InvoicingDao {
}
@@ -0,0 +1,58 @@
package info.bukova.isspst.data;
import java.math.BigDecimal;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
@Entity
@Table(name = "INVOICING")
public class Invoicing extends BaseData {
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "REQUIREMENT_ID")
private Requirement requirement;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.TRUE)
@JoinColumn(name = "INVOICING_ID")
private List<InvoicingItem> items;
@Column(name = "TOTAL_INVOICED", precision = 15, scale = 4)
private BigDecimal totalInvoiced;
public Requirement getRequirement() {
return requirement;
}
public void setRequirement(Requirement requirement) {
this.requirement = requirement;
}
public List<InvoicingItem> getItems() {
return items;
}
public void setItems(List<InvoicingItem> items) {
this.items = items;
}
public BigDecimal getTotalInvoiced() {
return totalInvoiced;
}
public void setTotalInvoiced(BigDecimal totalInvoiced) {
this.totalInvoiced = totalInvoiced;
}
}
@@ -0,0 +1,87 @@
package info.bukova.isspst.data;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "INVOICING_ITEM")
public class InvoicingItem {
@Id
@Column(name = "ID")
@GeneratedValue
private int id;
@Column(name = "INVOICE_DATE")
private Date invoiceDate;
@Column(name = "INVOICE_NUMBER")
private String invoiceNumber;
@Column(name = "AMOUNT", precision = 15, scale = 4)
private BigDecimal amount;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getInvoiceDate() {
return invoiceDate;
}
public void setInvoiceDate(Date invoiceDate) {
this.invoiceDate = invoiceDate;
}
public String getInvoiceNumber() {
return invoiceNumber;
}
public void setInvoiceNumber(String invoiceNumber) {
this.invoiceNumber = invoiceNumber;
}
public BigDecimal getAmount() {
return amount;
}
public void setAmount(BigDecimal amount) {
this.amount = amount;
}
@Override
public boolean equals(Object obj)
{
if (obj != null)
{
if (obj instanceof InvoicingItem)
{
InvoicingItem item = (InvoicingItem)obj;
int thisId = this.getId();
int itemId = item.getId();
boolean equalsId = (thisId == itemId);
if (equalsId && (thisId == 0))
{
return super.equals(obj);
}
return equalsId;
}
}
return false;
}
}
@@ -0,0 +1,19 @@
package info.bukova.isspst.services.invoicing;
import java.math.BigDecimal;
import info.bukova.isspst.data.Invoicing;
import info.bukova.isspst.data.Workgroup;
import info.bukova.isspst.services.Service;
public interface InvoicingService extends Service<Invoicing> {
public BigDecimal totalInvoicedForWorkgroup(Workgroup workgroup);
public void loadReqItems(Invoicing invoicing);
public void loadItems(Invoicing invoicing);
public void calculate(Invoicing invoicing);
}
@@ -0,0 +1,52 @@
package info.bukova.isspst.services.invoicing;
import info.bukova.isspst.data.Invoicing;
import info.bukova.isspst.data.InvoicingItem;
import info.bukova.isspst.data.Workgroup;
import info.bukova.isspst.services.AbstractOwnedService;
import info.bukova.isspst.services.LazyLoader;
import java.math.BigDecimal;
import org.hibernate.Hibernate;
import org.springframework.transaction.annotation.Transactional;
public class InvoicingServiceImpl extends AbstractOwnedService<Invoicing> implements
InvoicingService {
@Override
public BigDecimal totalInvoicedForWorkgroup(Workgroup workgroup) {
// TODO Auto-generated method stub
return null;
}
@Override
@Transactional
@LazyLoader("form")
public void loadReqItems(Invoicing invoicing) {
Invoicing inv = getById(invoicing.getId());
Hibernate.initialize(inv.getRequirement().getItems());
invoicing.getRequirement().setItems(inv.getRequirement().getItems());
}
@Override
@Transactional
@LazyLoader({"form", "grid"})
public void loadItems(Invoicing invoicing) {
Invoicing inv = getById(invoicing.getId());
Hibernate.initialize(inv.getItems());
invoicing.setItems(inv.getItems());
}
@Override
public void calculate(Invoicing invoicing) {
BigDecimal total = BigDecimal.ZERO;
for (InvoicingItem item : invoicing.getItems()) {
total = total.add(item.getAmount());
}
invoicing.setTotalInvoiced(total);
}
}
@@ -1,4 +1,4 @@
package info.bukova.isspst.services.approved;
package info.bukova.isspst.services.orders;
import info.bukova.isspst.data.JoinedItem;
import info.bukova.isspst.services.Service;
@@ -1,4 +1,4 @@
package info.bukova.isspst.services.approved;
package info.bukova.isspst.services.orders;
import info.bukova.isspst.data.JoinedItem;
import info.bukova.isspst.data.RequirementItem;
@@ -1,4 +1,4 @@
package info.bukova.isspst.services.approved;
package info.bukova.isspst.services.orders;
import info.bukova.isspst.data.JoinedItem;
import info.bukova.isspst.data.Order;
@@ -1,4 +1,4 @@
package info.bukova.isspst.services.approved;
package info.bukova.isspst.services.orders;
import info.bukova.isspst.dao.RequirementItemDao;
import info.bukova.isspst.data.AddressEmb;
@@ -6,6 +6,14 @@ import info.bukova.isspst.services.Service;
import java.util.List;
/**
* @author Pepa Rokos
* @author Franta Přibyl
*
* Základní rozhraní všech požadavků.
*
* @param <T> Třída požadavku.
*/
public interface RequirementBaseService<T extends RequirementBase> extends Service<T>
{
@@ -30,6 +30,14 @@ import org.springframework.security.access.prepost.PostFilter;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
/**
* @author Pepa Rokos
* @author Franta Přibyl
*
* Abstraktní bázová třída všech požadavků
*
* @param <T> Třída požadavku
*/
public abstract class RequirementBaseServiceImpl<T extends RequirementBase> extends
AbstractOwnedService<T> implements RequirementBaseService<T> {
@@ -249,6 +257,8 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
}
}
}
postApprove(e);
}
@Override
@@ -257,10 +267,25 @@ public abstract class RequirementBaseServiceImpl<T extends RequirementBase> exte
public void approve(T entity) {
approve(entity, getLoggedInUser());
}
/**
* 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
* @return true pokud se provedlo automatické schválení.
*/
protected boolean autoApprove(T entity) {
return false;
}
/**
* Činnost prováděná po schválení požadavku (i dílčím schválení).
*
* @param entity Požadavek
*/
protected void postApprove(T entity) {
}
@Override
@Transactional
@@ -6,6 +6,13 @@ import info.bukova.isspst.data.RequirementItem;
import java.math.BigDecimal;
import java.util.List;
/**
* @author Pepa Rokos
* @author Franta Přibyl
*
* Základní rozhraní požadavků na služby a materiál.
*
*/
public interface RequirementService extends RequirementBaseService<Requirement>
{
public void loadGroups(Requirement req);
@@ -1,6 +1,7 @@
package info.bukova.isspst.services.requirement;
import info.bukova.isspst.Constants;
import info.bukova.isspst.data.Invoicing;
import info.bukova.isspst.data.Requirement;
import info.bukova.isspst.data.RequirementItem;
import info.bukova.isspst.data.RequirementState;
@@ -8,7 +9,7 @@ import info.bukova.isspst.data.RequirementSubject;
import info.bukova.isspst.data.User;
import info.bukova.isspst.data.Workflow;
import info.bukova.isspst.services.LazyLoader;
import info.bukova.isspst.services.approved.OrderService;
import info.bukova.isspst.services.invoicing.InvoicingService;
import java.math.BigDecimal;
import java.util.Date;
@@ -18,13 +19,20 @@ import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
/**
* @author Pepa Rokos
* @author Franta Přibyl
*
* Bázová třída požadavků na materiál a služby.
*
*/
public class RequirementServiceImpl extends RequirementBaseServiceImpl<Requirement> implements RequirementService, RequirementBaseService<Requirement>
{
@Autowired
private RequirementTypeService reqTypeService;
@Autowired
private OrderService orderService;
private InvoicingService invoicingService;
@Override
protected Requirement createEntity()
@@ -64,7 +72,7 @@ public class RequirementServiceImpl extends RequirementBaseServiceImpl<Requireme
if (entity.getWorkgroup() != null && entity.getWorkgroup().getLimit() != null && entity.getWorkgroup().getLimit().compareTo(BigDecimal.ZERO) != 0)
{
BigDecimal total = orderService.totalOrderedForWorkgroup(entity.getWorkgroup());
BigDecimal total = null;//orderService.totalOrderedForWorkgroup(entity.getWorkgroup());
if (total == null)
{
@@ -222,4 +230,13 @@ public class RequirementServiceImpl extends RequirementBaseServiceImpl<Requireme
return sumTotal;
}
@Override
protected void postApprove(Requirement entity) {
if (entity.getState() == RequirementState.APPROVED) {
Invoicing inv = new Invoicing();
inv.setRequirement(entity);
invoicingService.add(inv);
}
}
}
@@ -13,7 +13,6 @@ import java.util.Date;
import org.hibernate.LazyInitializationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
public class TripRequirementServiceImpl extends RequirementBaseServiceImpl<TripRequirement>
@@ -54,11 +53,7 @@ public class TripRequirementServiceImpl extends RequirementBaseServiceImpl<TripR
}
@Override
@Transactional
@PreAuthorize("this.canApprove(#entity)")
public void approve(TripRequirement entity) {
super.approve(entity);
protected void postApprove(TripRequirement entity) {
if (entity.getState() == RequirementState.APPROVED) {
TripBill bill = tripBillService.createTripBill(entity);
tripBillService.add(bill);
@@ -380,4 +380,9 @@ public class ListViewModel<T extends DataModel> extends DocumentViewModel
{
return this.isRecordSelected();
}
public boolean isAbleToAdd()
{
return true;
}
}
@@ -3,7 +3,7 @@ package info.bukova.isspst.ui.dashboard;
import info.bukova.isspst.data.Role;
import info.bukova.isspst.data.User;
import info.bukova.isspst.data.Workgroup;
import info.bukova.isspst.services.approved.OrderService;
import info.bukova.isspst.services.orders.OrderService;
import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.services.workgroups.WorkgroupService;
import info.bukova.isspst.ui.DocumentViewModel;
@@ -5,8 +5,8 @@ import info.bukova.isspst.data.Order;
import info.bukova.isspst.data.User;
import info.bukova.isspst.data.Workgroup;
import info.bukova.isspst.filters.JoinedItemFilter;
import info.bukova.isspst.services.approved.ApprovedService;
import info.bukova.isspst.services.approved.OrderService;
import info.bukova.isspst.services.orders.ApprovedService;
import info.bukova.isspst.services.orders.OrderService;
import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.services.workgroups.WorkgroupService;
import info.bukova.isspst.ui.BigDecimalConverter;
@@ -0,0 +1,79 @@
package info.bukova.isspst.ui.main.invoicing;
import info.bukova.isspst.data.Invoicing;
import info.bukova.isspst.data.InvoicingItem;
import info.bukova.isspst.services.invoicing.InvoicingService;
import info.bukova.isspst.ui.FormViewModel;
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.select.annotation.WireVariable;
public class InvoicingForm extends FormViewModel<Invoicing> {
private InvoicingItem selectedItem;
private int selectedIndex;
@WireVariable
private InvoicingService invoicingService;
@Init(superclass = true)
public void init() {
}
private void selectItem(InvoicingItem item) {
if (item != null) {
selectedItem = item;
selectedIndex = getDataBean().getItems().indexOf(item);
} else {
selectedItem = null;
selectedIndex = -1;
}
}
@Command
@NotifyChange({"dataBean", "selectedItem", "selectedIndex"})
public void addItem() {
InvoicingItem item = new InvoicingItem();
getDataBean().getItems().add(item);
selectItem(item);
}
@Command
@NotifyChange({"dataBean", "selectedItem", "selectedIndex"})
public void removeItem(@BindingParam("item") InvoicingItem item) {
getDataBean().getItems().remove(item);
selectItem(null);
}
@Command
@NotifyChange({"selectedItem", "selectedIndex"})
public void onFocus(@BindingParam("item") InvoicingItem item) {
selectItem(item);
}
@Command
@NotifyChange("dataBean")
public void calculate() {
invoicingService.calculate(getDataBean());
}
public InvoicingItem getSelectedItem() {
return selectedItem;
}
public void setSelectedItem(InvoicingItem selectedItem) {
this.selectedItem = selectedItem;
}
public int getSelectedIndex() {
return selectedIndex;
}
public void setSelectedIndex(int selectedIndex) {
this.selectedIndex = selectedIndex;
}
}
@@ -0,0 +1,33 @@
package info.bukova.isspst.ui.main.invoicing;
import info.bukova.isspst.data.Invoicing;
import info.bukova.isspst.services.invoicing.InvoicingService;
import info.bukova.isspst.ui.ListViewModel;
import org.zkoss.bind.annotation.Init;
import org.zkoss.zk.ui.select.annotation.WireVariable;
public class InvoicingList extends ListViewModel<Invoicing> {
@WireVariable
private InvoicingService invoicingService;
@Init(superclass = true)
public void initInvoicing() {
service = invoicingService;
dataClass = Invoicing.class;
formZul = "invoicingForm.zul";
//dataFilter = new BuildingFilter(getFilterTemplate());
}
@Override
public boolean isAbleToAdd() {
return false;
}
@Override
public boolean isAbleToDelete() {
return false;
}
}
@@ -5,7 +5,7 @@ import info.bukova.isspst.data.AddressEmb;
import info.bukova.isspst.data.Order;
import info.bukova.isspst.data.OrderItem;
import info.bukova.isspst.services.addressbook.AdbService;
import info.bukova.isspst.services.approved.OrderService;
import info.bukova.isspst.services.orders.OrderService;
import info.bukova.isspst.services.settings.GlobalSettingsService;
import info.bukova.isspst.ui.FormViewModel;
import info.bukova.isspst.validators.OrderFormValidator;
@@ -9,7 +9,7 @@ import info.bukova.isspst.data.SettingsData;
import info.bukova.isspst.data.User;
import info.bukova.isspst.filters.OrderFilter;
import info.bukova.isspst.services.addressbook.AdbService;
import info.bukova.isspst.services.approved.OrderService;
import info.bukova.isspst.services.orders.OrderService;
import info.bukova.isspst.services.settings.GlobalSettingsService;
import info.bukova.isspst.services.users.UserService;
import info.bukova.isspst.ui.ListViewModel;