Commit e004eb41 by Tuomas Riihimäki

Adding of multiple vip users with same products at once

1 parent 782938d5
......@@ -34,4 +34,6 @@ public interface VipBeanLocal {
VipProductDelivery createDelivery(VipProduct prod, BigDecimal quantity, String notes);
void create(List<Vip> vipList);
}
......@@ -26,10 +26,25 @@ import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import fi.codecrew.moya.enums.apps.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.enums.apps.BillPermission;
import fi.codecrew.moya.enums.apps.CompoPermission;
import fi.codecrew.moya.enums.apps.ContentPermission;
import fi.codecrew.moya.enums.apps.EventPermission;
import fi.codecrew.moya.enums.apps.LecturePermission;
import fi.codecrew.moya.enums.apps.LicensePermission;
import fi.codecrew.moya.enums.apps.MapPermission;
import fi.codecrew.moya.enums.apps.NetworkAssociationPermission;
import fi.codecrew.moya.enums.apps.PmsCodePermission;
import fi.codecrew.moya.enums.apps.PollPermission;
import fi.codecrew.moya.enums.apps.ShopPermission;
import fi.codecrew.moya.enums.apps.SpecialPermission;
import fi.codecrew.moya.enums.apps.TerminalPermission;
import fi.codecrew.moya.enums.apps.TournamentPermission;
import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.enums.apps.VipPermission;
import fi.codecrew.moya.facade.MenuNavigationFacade;
import fi.codecrew.moya.facade.MenuitemFacade;
import fi.codecrew.moya.model.LanEvent;
......@@ -239,7 +254,9 @@ public class MenuBean implements MenuBeanLocal {
MenuNavigation vips = adminuser.addPage(null, null);
vips.setKey("subnavi.vips");
vips.addPage(menuitemfacade.findOrCreate("/vip/viplist"), VipPermission.VIEW);
vips.addPage(menuitemfacade.findOrCreate("/vip/create"), VipPermission.VIEW).setVisible(false);
vips.addPage(menuitemfacade.findOrCreate("/vip/create"), VipPermission.EDIT);
vips.addPage(menuitemfacade.findOrCreate("/vip/multiadd"), VipPermission.EDIT);
vips.addPage(menuitemfacade.findOrCreate("/vip/deliver"), VipPermission.VIEW).setVisible(false);
vips.addPage(menuitemfacade.findOrCreate("/vip/edit"), VipPermission.VIEW).setVisible(false);
MenuNavigation adminAssociation = adminmenu.addPage(null, null);
......
package fi.codecrew.moya.beans;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.enums.apps.VipPermission;
import fi.codecrew.moya.facade.VipFacade;
import fi.codecrew.moya.facade.VipProductDeliveryFacade;
......@@ -9,20 +22,6 @@ import fi.codecrew.moya.model.VipProduct;
import fi.codecrew.moya.model.VipProductDelivery;
import fi.codecrew.moya.utilities.SearchQuery;
import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.utilities.jpa.GenericFacade;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Stateless
@LocalBean
......@@ -58,6 +57,14 @@ public class VipBean implements VipBeanLocal {
@Override
@RolesAllowed({ VipPermission.S_EDIT })
public void create(List<Vip> vipList) {
for (Vip v : vipList) {
create(v);
}
}
@Override
@RolesAllowed({ VipPermission.S_EDIT })
public void create(Vip vip) {
vip.setCreated(new Date());
vip.setCreator(permbean.getCurrentUser());
......@@ -149,4 +156,6 @@ public class VipBean implements VipBeanLocal {
return vpd;
}
}
package fi.codecrew.moya.model;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
......@@ -69,7 +69,7 @@ public class Vip extends GenericEntity {
@JoinColumn(name = HOST_EVENT_USER_ID_COLUMN, referencedColumnName = EventUser.ID_COLUMN, nullable = false)
private EventUser host;
@OneToMany(mappedBy = "vip")
@OneToMany(mappedBy = "vip", cascade = CascadeType.PERSIST)
private List<VipProduct> products = new ArrayList<>();
public String getShortDisplayDescr() {
......
......@@ -54,6 +54,14 @@ public class VipProduct extends GenericEntity {
this.vip = v;
}
public VipProduct(Vip vip, VipProduct prod) {
this.vip = vip;
this.name = prod.name;
this.notes = prod.notes;
this.product = prod.product;
this.quantity = prod.quantity;
}
/**
* Returns name of the product. If @Field product is empty, use @Field name
*
......@@ -74,13 +82,11 @@ public class VipProduct extends GenericEntity {
*
* @return
*/
public boolean isAllDelivered()
{
public boolean isAllDelivered() {
return quantity.compareTo(getDelivered()) <= 0;
}
public BigDecimal getDelivered()
{
public BigDecimal getDelivered() {
BigDecimal delivered = BigDecimal.ZERO;
if (deliveries != null) {
for (VipProductDelivery d : deliveries) {
......
......@@ -12,8 +12,6 @@
<ui:define name="content">
<h:link outcome="/vip/viplist" value="#{i18n['vip.backToList']}" />
<h:form id="vipcreate">
<h:panelGrid columns="2">
<h:outputLabel value="#{i18n['vip.host']}" for="hostselect" />
......
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui">
<h:body>
<ui:composition template="#{sessionHandler.template}">
<f:metadata>
<f:event type="preRenderView" listener="#{vipMultiadd.initMultiadd}" />
</f:metadata>
<ui:define name="content">
<h:form id="vipcreate">
<h:panelGrid columns="2">
<h:outputLabel value="#{i18n['vip.host']}" for="hostselect" />
<p:autoComplete id="hostselect" value="#{vipMultiadd.vip.host}" completeMethod="#{vipView.usersearch}" converter="#{eventUserConverter}" var="usr" itemValue="#{usr}" itemLabel="#{usr.wholeName}" />
<h:outputLabel for="shortdescr" value="#{i18n['vip.shortdescr']}" />
<p:inputTextarea id="shortdescr" cols="50" rows="3" value="#{vipMultiadd.vip.shortdescr}" />
<h:outputLabel for="description" value="#{i18n['vip.description']}" />
<p:inputTextarea id="description" cols="50" rows="6" value="#{vipMultiadd.vip.description}" />
</h:panelGrid>
<br />
<p:commandButton update=":viplist :vipcreate" action="#{vipMultiadd.addEntry()}" value="#{i18n['vip.addEntry']}" />
<br />
</h:form>
<h2>
<h:outputText value="#{i18n['viplist.multiaddUsers']}" />
</h2>
<h:form id="viplist">
<p:dataTable value="#{vipMultiadd.vips}" var="vip">
<p:column headerText="#{i18n['vip.hostsName']}" style="width: 140px;">
<h:outputText id="viphostsname" value="#{vip.host.wholeName}" />
<p:tooltip id="viphostsnamephone" for="viphostsname" value="#{vip.host.phone}" />
</p:column>
<!-- p:column headerText="#{i18n['vip.description']}" filterBy="#{vip.description}" filterMatchMode="contains" -->
<p:column headerText="#{i18n['vip.shortdescr']}" style="width: 170px;">
<h:outputText id="vipdescr" value="#{vip.shortDisplayDescr}" title="#{vip.description}" />
</p:column>
<p:column headerText="#{i18n['vip.description']}">
<h:outputText value="#{vip.description}" />
</p:column>
<p:column>
<p:commandButton update=":viplist :vipcreate" action="#{vipMultiadd.removeEntry()}" value="#{i18n['vip.deleteEntry']}" />
</p:column>
</p:dataTable>
</h:form>
<h2>
<h:outputText value="#{i18n['viplist.multiaddProducts']}" />
</h2>
<h:form>
<p:dataTable editable="true" styleClass="bordertable" id="vipProdList" var="prod" value="#{vipMultiadd.vipProducts}">
<p:column headerText="#{i18n['vipProduct.name']}">
<ui:fragment rendered="#{empty prod.id}">
<p:inputText value="#{prod.name}" />
<br />
<p:selectOneMenu value="#{prod.product}" converter="#{productConverter}">
<f:selectItem itemLabel="---" itemValue="0" />
<f:selectItems value="#{vipView.eventProducts}" var="p" itemLabel="#{p.name}" />
</p:selectOneMenu>
</ui:fragment>
<p:cellEditor rendered="#{not empty prod.id}">
<f:facet name="output">
<h:outputText value="#{prod.productName}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{prod.name}" />
<br />
<p:selectOneMenu value="#{prod.product}" converter="#{productConverter}">
<f:selectItem itemLabel="---" itemValue="0" />
<f:selectItems value="#{vipView.eventProducts}" var="p" itemLabel="#{p.name}" />
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
<p:column style="width: 120px;" headerText="#{i18n['vipProduct.quantity']}">
<h:inputText size="15" rendered="#{empty prod.id}" value="#{prod.quantity}">
<f:convertNumber minFractionDigits="0" maxFractionDigits="3" />
</h:inputText>
<p:cellEditor rendered="#{not empty prod.id}">
<f:facet name="output">
<h:outputText value="#{prod.quantity}">
<f:convertNumber minFractionDigits="0" maxFractionDigits="3" />
</h:outputText>
</f:facet>
<f:facet name="input">
<h:inputText size="15" value="#{prod.quantity}">
<f:convertNumber minFractionDigits="0" maxFractionDigits="3" />
</h:inputText>
</f:facet>
</p:cellEditor>
</p:column>
<p:column style="width: 90px;">
<p:rowEditor rendered="#{not empty prod.id}" />
<p:commandButton action="#{vipMultiadd.addProduct()}" update="vipProdList" value="#{i18n['vipProduct.create']}" rendered="#{empty prod.id}" />
</p:column>
<p:column style="width: 35px;">
<p:commandButton rendered="#{not empty prod.id}" onclick="return confirm('#{i18n['vipProduct.deleteProductConfirm']}')" action="#{vipMultiadd.removeProduct()}" update="vipProdList"
icon="ui-icon-close" />
</p:column>
</p:dataTable>
</h:form>
<h:form>
<p:commandButton value="#{i18n['vipMultiadd.commitAll']}" action="#{vipMultiadd.commitAll}" />
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
......@@ -12,9 +12,6 @@
<ui:define name="content">
<h:link rendered="#{vipListView.canCreate()}" outcome="/vip/create" value="#{i18n['vip.createNew']}" />
<br />
<h:form id="vipform">
<p:dataTable id="vipList" value="#{vipListView.viplist}" widgetVar="viplist" styleClass="moya_datatable4" var="vip" >
<!-- f:facet name="header">
......
package fi.codecrew.moya.web.cdiview.vip;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.faces.model.ListDataModel;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.PermissionBeanLocal;
import fi.codecrew.moya.beans.ProductBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.beans.VipBeanLocal;
import fi.codecrew.moya.enums.apps.VipPermission;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.model.Vip;
import fi.codecrew.moya.model.VipProduct;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
/**
* Created by jkj on 2015-01-11.
*/
@Named
@ConversationScoped
public class VipMultiadd extends GenericCDIView {
/**
*
*/
private static final long serialVersionUID = 1L;
@EJB
private VipBeanLocal vipBean;
private List<Vip> vipList;
private ListDataModel<Vip> vips;
private List<VipProduct> productList;
private ListDataModel<VipProduct> vipProducts;
@EJB
private UserBeanLocal userbean;
@EJB
private PermissionBeanLocal permbean;
@EJB
private ProductBeanLocal productBean;
private Vip vip;
private static final Logger logger = LoggerFactory.getLogger(VipMultiadd.class);
public String commitAll() {
for (Vip v : vipList) {
ArrayList<VipProduct> l = new ArrayList<>();
v.setProducts(l);
for (VipProduct prod : vipProducts) {
if (prod.getProduct() != null || (prod.getName() != null && !prod.getName().trim().isEmpty())) {
l.add(new VipProduct(v, prod));
}
}
}
vipBean.create(vipList);
vipList = null;
initMultiadd();
return "/vip/viplist?faces-redirect=true";
}
public void initMultiadd() {
if (super.requirePermissions(VipPermission.EDIT) && vipList == null) {
setVip(new Vip());
vipList = new ArrayList<>();
vips = new ListDataModel<>(vipList);
productList = new ArrayList<>();
productList.add(new VipProduct());
vipProducts = new ListDataModel<>(productList);
super.beginConversation();
}
}
public void addProduct() {
VipProduct prod = vipProducts.getRowData();
prod.setId(-1);
productList.add(0, new VipProduct());
}
public void removeProduct() {
VipProduct l = vipProducts.getRowData();
logger.info("Removing product {}", l);
productList.remove(l);
}
public String addEntry() {
logger.info("added entry");
vipList.add(getVip());
setVip(new Vip());
return null;
}
public void removeEntry() {
vipList.remove(vips.getRowData());
}
public List<Product> getEventProducts() {
return productBean.getProducts();
}
public ListDataModel<VipProduct> getVipProducts() {
return vipProducts;
}
public void setVipProducts(ListDataModel<VipProduct> vipProducts) {
this.vipProducts = vipProducts;
}
public ListDataModel<Vip> getVips() {
return vips;
}
public void setVips(ListDataModel<Vip> vips) {
this.vips = vips;
}
public Vip getVip() {
return vip;
}
public void setVip(Vip vip) {
this.vip = vip;
}
}
......@@ -1135,6 +1135,9 @@ submenu.useradmin.sendPicture = Send picture
submenu.useradmin.showTakePicture = Show webcam
submenu.useradmin.validateUser = Validate user
submenu.utils.index = Administration tools
submenu.vip.create = Add entry
submenu.vip.multiadd = Add multiple
submenu.vip.viplist = Vip list
submenu.voting.admincompolist = Compos
submenu.voting.compolist = Compos
submenu.voting.create = Create new compo
......@@ -1475,20 +1478,24 @@ viewexpired.title = Login expired. Please login again.
viewlectures.title = Courses and lectures
vip.backToList = Back to VIP list
vip.create = Create
vip.createNew = Create new
vip.delete = Delete
vip.deliver = Deliver
vip.description = Description
vip.edit = Edit
vip.host = Host
vip.hostsName = Host
vip.productDelivered = Delivered
vip.productQuantity = Qty
vip.products = Product
vip.save = Save
vip.shortdescr = Name
vip.addEntry = Add entry
vip.backToList = Back to VIP list
vip.create = Create
vip.createNew = Create new
vip.delete = Delete
vip.deleteEntry = Delete entry
vip.deliver = Deliver
vip.description = Description
vip.edit = Edit
vip.host = Host
vip.hostsName = Host
vip.productDelivered = Delivered
vip.productQuantity = Qty
vip.products = Product
vip.save = Save
vip.shortdescr = Name
vipMultiadd.commitAll = Create entries
vipProduct.create = Create
vipProduct.deliver = Deliver
......@@ -1497,6 +1504,9 @@ vipProduct.delivered = Delivered
vipProduct.name = Product
vipProduct.quantity = Quantity
viplist.multiaddProducts = Added products
viplist.multiaddUsers = Added users
voting.allcompos.curEntries = No. of entries
voting.allcompos.descri = Description
voting.allcompos.description = List of all compos and their information.
......
......@@ -1401,6 +1401,9 @@ submenu.useradmin.sendPicture = Send picture
submenu.useradmin.showTakePicture = Show webcam
submenu.useradmin.validateUser = Validate user
submenu.utils.index = Administration tools
submenu.vip.create = Add entry
submenu.vip.multiadd = Add multiple
submenu.vip.viplist = Vip list
submenu.voting.admincompolist = Compos
submenu.voting.compolist = Compos
submenu.voting.create = Create new compo
......@@ -1747,20 +1750,24 @@ viewexpired.title = Login expired. Please login again.
viewlectures.title = Courses and lectures
vip.backToList = Back to VIP list
vip.create = Create
vip.createNew = Create new
vip.delete = Delete
vip.deliver = Deliver
vip.description = Description
vip.edit = Edit
vip.host = Host
vip.hostsName = Host
vip.productDelivered = Delivered
vip.productQuantity = Qty
vip.products = Product
vip.save = Save
vip.shortdescr = Name
vip.addEntry = Add entry
vip.backToList = Back to VIP list
vip.create = Create
vip.createNew = Create new
vip.delete = Delete
vip.deleteEntry = Delete entry
vip.deliver = Deliver
vip.description = Description
vip.edit = Edit
vip.host = Host
vip.hostsName = Host
vip.productDelivered = Delivered
vip.productQuantity = Qty
vip.products = Product
vip.save = Save
vip.shortdescr = Name
vipMultiadd.commitAll = Create entries
vipProduct.create = Create
vipProduct.deliver = Deliver
......@@ -1769,6 +1776,9 @@ vipProduct.delivered = Delivered
vipProduct.name = Product
vipProduct.quantity = Quantity
viplist.multiaddProducts = Added products
viplist.multiaddUsers = Added users
voting.allcompos.curEntries = No. of entries
voting.allcompos.descri = Description
voting.allcompos.description = List of all compos and their information.
......
......@@ -1388,6 +1388,9 @@ submenu.useradmin.sendPicture = L\u00E4het\u00E4 kuva
submenu.useradmin.showTakePicture = N\u00E4yt\u00E4 webcam
submenu.useradmin.validateUser = Validoi k\u00E4ytt\u00E4j\u00E4
submenu.utils.index = Yll\u00E4pitoty\u00F6kalut
submenu.vip.create = Lis\u00E4\u00E4 uusi
submenu.vip.multiadd = Lis\u00E4\u00E4 useita
submenu.vip.viplist = Vippilista
submenu.voting.admincompolist = Kilpailut
submenu.voting.compolist = Kilpailut
submenu.voting.create = Uusi kilpailu
......@@ -1734,20 +1737,24 @@ viewexpired.title = N\u00E4kym\u00E4 on vanhentunut
viewlectures.title = Kurssit ja luennot
vip.backToList = Takaisin VIP-listaukseen
vip.create = Luo
vip.createNew = Luo uusi
vip.delete = Poista
vip.deliver = Toimita
vip.description = Lis\u00E4tietoja
vip.edit = Muokkaa
vip.host = Is\u00E4nt\u00E4
vip.hostsName = Is\u00E4nt\u00E4
vip.productDelivered = Toimitettu
vip.productQuantity = Lkm
vip.products = Tuote
vip.save = Tallenna
vip.shortdescr = Nimi
vip.addEntry = Lis\u00E4\u00E4 rivi
vip.backToList = Takaisin VIP-listaukseen
vip.create = Luo
vip.createNew = Luo uusi
vip.delete = Poista
vip.deleteEntry = Poista rivi
vip.deliver = Toimita
vip.description = Lis\u00E4tietoja
vip.edit = Muokkaa
vip.host = Is\u00E4nt\u00E4
vip.hostsName = Is\u00E4nt\u00E4
vip.productDelivered = Toimitettu
vip.productQuantity = Lkm
vip.products = Tuote
vip.save = Tallenna
vip.shortdescr = Nimi
vipMultiadd.commitAll = Luo merkinn\u00E4t
vipProduct.create = Lis\u00E4\u00E4
vipProduct.deliver = Toimita
......@@ -1756,6 +1763,9 @@ vipProduct.delivered = Toimitettu
vipProduct.name = Tuote
vipProduct.quantity = Lukum\u00E4\u00E4r\u00E4
viplist.multiaddProducts = Lis\u00E4tyt tuotteet
viplist.multiaddUsers = Lis\u00E4tyt k\u00E4ytt\u00E4j\u00E4t
voting.allcompos.curEntries = Entryja
voting.allcompos.descri = Kuvaus
voting.allcompos.description = Compojen informaatiot.
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!