Commit 00dd00b6 by Tuomas Riihimäki

Merge branch 'deliverable-products' into 'master'

Deliverable products

See merge request !384
2 parents dbdee32e 622299db
......@@ -86,6 +86,10 @@ public interface ProductBeanLocal {
AccountEvent markDelivered(AccountEvent e, Calendar c);
AccountEvent markUndelivered(AccountEvent e);
List<AccountEvent> getDeliverableAccountEvents(EventUser user );
List<Product> getPlaceProducts();
ProductOption findOptionById(Integer id);
......
......@@ -112,7 +112,7 @@ public class BillPBean {
logger.debug("Creating Bill prepaidInstant product {}, {}", prod.getName(), bl.getQuantity());
AccountEvent ac2 = productPBean.createAccountEvent(prod, null,bl.getQuantity(), user, bill.getSentDate(), bl.getFoodwave());
AccountEvent ac2 = productPBean.createAccountEvent(prod, null,bl.getQuantity(), user, bill.getSentDate(), bl.getName() ,bl.getFoodwave());
logger.info("Created ac from product. {}, userproducts {}", ac2, user.getAccountEvents().size());
ac2.setSeller(permbean.getCurrentUser());
......
......@@ -22,10 +22,7 @@ import java.security.Principal;
import javax.annotation.Resource;
import javax.annotation.security.DeclareRoles;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.ejb.*;
import javax.resource.spi.IllegalStateException;
import fi.codecrew.moya.enums.apps.*;
......
......@@ -474,7 +474,7 @@ public class ProductBean implements ProductBeanLocal {
public AccountEvent createAccountEvent(Product product, BigDecimal overriddenUnitPrice, BigDecimal quantity, EventUser user) {
user = eventUserFacade.reload(user);
AccountEvent ret = productPBean.createAccountEvent(product, overriddenUnitPrice, quantity, user, new Date(), null);
AccountEvent ret = productPBean.createAccountEvent(product, overriddenUnitPrice, quantity, user, new Date(), null, null);
cardTemplateBean.checkPrintedCard(user);
return ret;
}
......@@ -547,73 +547,54 @@ public class ProductBean implements ProductBeanLocal {
return accounteventfacade.findProvidedRoles(eventBean.getCurrentEvent(), u);
}
// /**
// * Create accountevents for the products in the parameter shopMap
// */
// @Override
// @RolesAllowed(ShopPermission.S_SHOP_PRODUCTS)
// public void shopCash(EventUser shoppingUser, Map<Product, BigDecimal>
// shopMap, boolean buyInstant) {
// logger.debug("Shoping cash. buyinstant {}", buyInstant);
// EventUser seller = permbean.getCurrentUser();
// shoppingUser = userbean.findByEventUserId(shoppingUser.getId());
//
// BigDecimal tot = BigDecimal.ZERO;
//
// for (Entry<Product, BigDecimal> prodentry : shopMap.entrySet()) {
//
// // Create account event for the product.
// AccountEvent ac = new AccountEvent(shoppingUser, prodentry.getKey(),
// prodentry.getKey().getPrice(), prodentry.getValue(),
// Calendar.getInstance());
// ac.setSeller(seller);
// accounteventfacade.create(ac);
//
// if (buyInstant &&
// prodentry.getKey().getPrice().compareTo(BigDecimal.ZERO) > 0) {
// tot =
// tot.add(prodentry.getValue().multiply(prodentry.getKey().getPrice()));
// }
//
// if
// (prodentry.getKey().getProductFlags().contains(ProductFlag.RESERVE_PLACE_WHEN_BOUGHT)
// ||
// prodentry.getKey().getProductFlags().contains(ProductFlag.CREATE_NEW_PLACE_WHEN_BOUGHT))
// {
// logger.debug("Prepaidplace");
//
// placebean.lockPlaceProduct(shoppingUser, prodentry.getKey(),
// BigDecimal.ONE);
//
// }
//
// }
//
// logger.debug("ShopCash price {}", tot);
// if (buyInstant && tot.compareTo(BigDecimal.ZERO) > 0) {
// logger.debug("Creating buy instant product!");
// Product creditProd = findCreditProduct();
// AccountEvent ac = new AccountEvent(shoppingUser, creditProd,
// creditProd.getPrice(), tot, Calendar.getInstance());
// accounteventfacade.create(ac);
// }
//
// userbean.mergeEventUserChanges(shoppingUser);
//
// }
@Override
public List<AccountEvent> getDeliverableAccountEvents(EventUser user ) {
List<AccountEvent> retlist = new ArrayList<>();
for(AccountEvent ae : accounteventfacade.getAccountEvents(user)) {
if(!ae.getProduct().isDeliverableProduct()) {
continue;
}
// places are there already, so don't add them second time
if(ae.getProduct().getPlaces() != null && !ae.getProduct().getPlaces().isEmpty()) {
continue;
}
// foods are handled from different view, remove them from here
if(ae.getProduct().getFoodWaveTemplates() != null && !ae.getProduct().getFoodWaveTemplates().isEmpty()) {
continue;
}
retlist.add(ae);
}
return retlist;
}
@Override
public AccountEvent markDelivered(AccountEvent e, Calendar c) {
e = accounteventfacade.reload(e);
if (e.getDelivered() != null)
{
throw new EJBException("AccountEvent " + e + " already marked paid!");
throw new EJBException("AccountEvent " + e + " already marked delivered!");
}
e.setDelivered(c);
return e;
}
@Override
public AccountEvent markUndelivered(AccountEvent e) {
e = accounteventfacade.reload(e);
e.setDelivered(null);
return e;
}
@Override
public List<Product> getPlaceProducts() {
......
......@@ -75,8 +75,11 @@ public class ProductPBean {
}
public AccountEvent createAccountEvent(Product product, BigDecimal quantity, EventUser user, Date date) {
return this.createAccountEvent(product, null, quantity, user, date, null, null);
}
return this.createAccountEvent(product, null, quantity, user, date, null);
public AccountEvent createAccountEvent(Product product, BigDecimal quantity, EventUser user, Date date, String description) {
return this.createAccountEvent(product, null, quantity, user, date, description, null);
}
/**
......@@ -95,7 +98,7 @@ public class ProductPBean {
* AccountEvent creation time
* @return The created AccountEvent entity
*/
public AccountEvent createAccountEvent(Product product, BigDecimal overriddenUnitPrice, BigDecimal quantity, EventUser user, Date date, FoodWave foodwave) {
public AccountEvent createAccountEvent(Product product, BigDecimal overriddenUnitPrice, BigDecimal quantity, EventUser user, Date date, String description, FoodWave foodwave) {
if (!accounteventfacade.isAttached(product)) {
product = productFacade.reload(product);
......@@ -125,6 +128,18 @@ public class ProductPBean {
AccountEvent ret = new AccountEvent(user, product, unitPrice, quantity, Calendar.getInstance());
// If product name is edited, move it into the description
if(description != null && !description.isEmpty() && !product.getName().equals(description)) {
String aeDescription = description;
// Remove product name from option descriptions
aeDescription = aeDescription.replaceFirst("^" + product.getName() + ",?", "").trim();
ret.setDescription(aeDescription);
}
// ret.setDelivered(Calendar.getInstance());
ret.setSeller(permbean.getCurrentUser());
......
......@@ -186,7 +186,7 @@ public class ReaderBean implements ReaderBeanLocal {
if (reader.isAutoproduct()) {
EventUser eu = userbean.getEventUser(card.getUser().getUser(), false);
if (eu != null) {
AccountEvent createAc = productPBean.createAccountEvent(reader.getAutomaticProduct(), reader.getAutomaticProductCount(), eu, new Date());
AccountEvent createAc = productPBean.createAccountEvent(reader.getAutomaticProduct(), reader.getAutomaticProductCount(), eu, new Date(), "Created automatically");
readerfacade.flush();
logger.info("Creating new accountevent from autoproduct {}", createAc);
event.setNotes("Created automatic account event from reader. " + createAc);
......
......@@ -74,9 +74,6 @@ public class AccountEvent extends GenericEntity {
@Temporal(TemporalType.TIMESTAMP)
private Calendar delivered;
@Column(name = "delivered_count", nullable = false, precision = 24, scale = 4)
private BigDecimal deliveredCount = new BigDecimal(0);
/**
* If this AccountEvent is a product in foodwace, this field is a reference
* to that foodwave.
......@@ -239,14 +236,6 @@ public class AccountEvent extends GenericEntity {
this.description = description;
}
public BigDecimal getDeliveredCount() {
return deliveredCount;
}
public void setDeliveredCount(BigDecimal deliveredCount) {
this.deliveredCount = deliveredCount;
}
public boolean isEventDelivered() {
return (delivered != null);
}
......
......@@ -422,6 +422,10 @@ public class Product extends GenericEntity {
return getProductFlags().contains(ProductFlag.USERSHOP_AUTOPRODUCT);
}
public boolean isDeliverableProduct() {
return !(isUsershopAutoproduct() || getProductFlags().contains(ProductFlag.PREPAID_CREDIT));
}
public Role getShopRequiredRole() {
return shopRequiredRole;
}
......
......@@ -57,9 +57,19 @@
</p:dataTable>
</p:fieldset>
<br /><br /><br />
<p:commandButton value="#{i18n['incomingflow.markEverythingGiven']}" update="membershipForm" disabled="#{cardlessIncomingView.allGiven}" actionListener="#{cardlessIncomingView.giveEverything}" />
<br /><br /><br />
<br /><br />
<br />
<p:commandButton value="#{i18n['incomingflow.markEverythingGiven']}" update="membershipForm accounteventlistform" disabled="#{cardlessIncomingView.allGiven}" actionListener="#{cardlessIncomingView.giveEverything}" />
<br />
<p:fragment id="ungivenFragment" >
<span style="color: red; font-size: larger; font-weight: bolder;">
<h:outputText rendered="#{cardlessIncomingView.ungivenAccountevents}" value="#{i18n['incomingflow.ungivenProducts']}" />
</span>
</p:fragment>
<br />
<br />
<h:outputText rendered="#{empty cardlessIncomingView.groupMemberships}" value="#{i18n['placegroupview.noMemberships']}" />
<p:fieldset id="groupMembershipList" rendered="#{!empty cardlessIncomingView.groupMemberships}" legend="#{i18n['incomingflow.groupmemberships']}" toggleable="true" collapsed="#{fieldsetView.isCollapsed(component.id)}">
<p:ajax event="toggle" listener="#{fieldsetView.handleToggle}" />
......@@ -101,6 +111,40 @@
</p:fieldset>
</h:form>
<br /><br /><br />
<h:form id="accounteventlistform">
<p:fieldset legend="#{i18n['incomingflow.deliverableProducts']}" toggleable="true" collapsed="#{fieldsetView.isCollapsed(component.id)}" >
<p:ajax event="toggle" listener="#{fieldsetView.handleToggle}" />
<p:dataTable value="#{cardlessIncomingView.deliverableAccountevents}" var="prod" rowStyleClass="#{prod.delivered != null ? 'greenBackground':''}">
<p:column>
<f:facet name="header">
<h:outputText value="#{i18n['placegroupview.productName']}" />
</f:facet>
<h:outputText value="#{prod.product.name}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="#{i18n['placegroupview.accountEventDescription']}" />
</f:facet>
<h:outputText value="#{prod.description}" />
</p:column>
<p:column>
<p:commandButton update=":accounteventlistform :membershipForm:ungivenFragment" rendered="#{empty prod.delivered}" actionListener="#{cardlessIncomingView.giveAccountEvent}" value="#{i18n['incomingflow.giveAccountEvent']}" />
<p:commandButton update=":accounteventlistform :membershipForm:ungivenFragment" rendered="#{!empty prod.delivered}" actionListener="#{cardlessIncomingView.ungiveAccountEvent}" value="#{i18n['incomingflow.ungiveAccountEvent']}" />
</p:column>
</p:dataTable>
</p:fieldset>
</h:form>
<br />
<br />
<br />
</ui:define>
......
......@@ -30,7 +30,7 @@
<h1>#{i18n['incomingView.attachDialogTitle']}</h1>
<!-- napin painaminen aiheuttaa aina NullPOinterExceptionin, mutta tekee siitä huolimatta tarvittavat asiat -->
<!-- tarjoan oluen sille ketä ratkasee ton exceptionin -TKjne -->
<p:commandButton styleClass="attachbuttonidclass" value="#{i18n['incomingView.attach']}" actionListener="#{incomingView.attachCodeToCard}" update=":cardcodeform :placelistform :imgCropperForm :cardsetform:" onerror="location.reload(true);" />
<p:commandButton styleClass="attachbuttonidclass" value="#{i18n['incomingView.attach']}" actionListener="#{incomingView.attachCodeToCard}" update=":cardcodeform :placelistform :accounteventlistform :imgCropperForm :cardsetform:" onerror="location.reload(true);" />
<p:commandButton value="#{i18n['incomingView.cancel']}" actionListener="#{incomingView.hideAttachDialog}" update=":attachform:attachBarcode" />
</div>
</h:panelGroup>
......@@ -275,13 +275,14 @@
</h:form>
<br /><br />
<h:outputText rendered="#{empty incomingView.groupMemberships}" value="#{i18n['placegroupview.noMemberships']}" />
<h:form rendered="#{!empty incomingView.groupMemberships}" id="placelistform">
<p:fieldset legend="#{i18n['incomingflow.groupmemberships']}" toggleable="true" collapsed="#{fieldsetView.isCollapsed(component.id)}">
<p:ajax event="toggle" listener="#{fieldsetView.handleToggle}" />
<p:dataTable value="#{incomingView.groupMemberships}" var="member" rowStyleClass="#{member.enteredEvent != null ? 'success':''}">
<p:dataTable value="#{incomingView.groupMemberships}" var="member" rowStyleClass="#{member.enteredEvent != null ? 'greenBackground':''}">
<p:column>
<f:facet name="header">
......@@ -320,6 +321,45 @@
<br />
<br />
<br />
<h:outputText rendered="#{empty incomingView.deliverableAccountevents}" value="#{i18n['placegroupview.noProductsToDeliver']}" />
<h:form rendered="#{!empty incomingView.deliverableAccountevents}" id="accounteventlistform">
<p:fieldset legend="#{i18n['incomingflow.deliverableProducts']}" toggleable="true" collapsed="#{fieldsetView.isCollapsed(component.id)}" id="accountEventList">
<p:ajax event="toggle" listener="#{fieldsetView.handleToggle}" />
<p:dataTable value="#{incomingView.deliverableAccountevents}" var="prod" rowStyleClass="#{prod.delivered != null ? 'greenBackground':''}">
<p:column>
<f:facet name="header">
<h:outputText value="#{i18n['placegroupview.productName']}" />
</f:facet>
<h:outputText value="#{prod.product.name}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="#{i18n['placegroupview.accountEventDescription']}" />
</f:facet>
<h:outputText value="#{prod.description}" />
</p:column>
<p:column>
<p:commandButton update=":accounteventlistform" rendered="#{empty prod.delivered}" actionListener="#{incomingView.giveAccountEvent}" value="#{i18n['incomingflow.giveAccountEvent']}" />
<p:commandButton update=":accounteventlistform" rendered="#{!empty prod.delivered}" actionListener="#{incomingView.ungiveAccountEvent}" value="#{i18n['incomingflow.ungiveAccountEvent']}" />
</p:column>
</p:dataTable>
</p:fieldset>
</h:form>
<br />
<br />
<br />
<h:form id="cardcodeform">
<p:fieldset legend="#{i18n['incomingflow.cardCodes']}" toggleable="true" collapsed="#{fieldsetView.isCollapsed(component.id)}">
<p:ajax event="toggle" listener="#{fieldsetView.handleToggle}" />
......
......@@ -19,7 +19,6 @@ import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import fi.codecrew.moya.rest.ArrayListWrapper;
import fi.codecrew.moya.rest.SimpleCodelistRoot;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -281,7 +280,6 @@ public class PlacemapRestViewV1 {
ArrayList<PlaceCodePojo> ret = makePlaceCodePojos(map.getPlaces());
return Response.ok(new ArrayListWrapper<>(ret)).build();
}
private ArrayList<PlaceCodePojo> makePlaceCodePojos(List<Place> places) {
......
/*
* Copyright Codecrew Ry
*
* All rights reserved.
*
* This license applies to any software containing a notice placed by the
* copyright holder. Such software is herein referred to as the Software.
* This license covers modification, distribution and use of the Software.
*
* Any distribution and use in source and binary forms, with or without
* modification is not permitted without explicit written permission from the
* copyright owner.
*
* A non-exclusive royalty-free right is granted to the copyright owner of the
* Software to use, modify and distribute all modifications to the Software in
* future versions of the Software.
*
*/
package fi.codecrew.moya.servlet;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.ejb.EJB;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.sshd.SshServer;
import org.apache.sshd.common.Factory;
import org.apache.sshd.server.Command;
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.PermissionBeanLocal;
import fi.codecrew.moya.clientutils.BortalLocalContextHolder;
import fi.codecrew.moya.cmdline.Hello;
import fi.codecrew.moya.model.LanEvent;
/**
* Servlet implementation class SshServlet
*/
@WebServlet(urlPatterns = "/ssh", loadOnStartup = 10)
public class SshServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(SshServlet.class);
private Map<Integer, SshServer> servers = new HashMap<Integer, SshServer>();
// Timeout 30 min
private static final String TIMEOUT = Integer.toString(1000 * 60 * 30);
@EJB
private EventBeanLocal eventbean;
@EJB
private PermissionBeanLocal permBean;
/**
* @see HttpServlet#HttpServlet()
*/
public SshServlet() {
super();
// TODO Auto-generated constructor stub
}
private class SshShellFactor implements Factory<Command> {
private BortalLocalContextHolder context;
public SshShellFactor(BortalLocalContextHolder instance) {
context = instance;
}
@Override
public Command create() {
logger.info("creating new bortal command");
BortalCommand bc = new BortalCommand(context);
bc
.addCommandlineCommand("hello", new Hello(permBean))
.addCommandlineCommand("hallo", new Hello(permBean));
return bc;
}
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
}
private SshServer initSsh(Integer id) {
logger.info("Initializing ssh servlet");
SshServer sshd = SshServer.setUpDefaultServer();
sshd.setPort(8022);
sshd.getProperties().put(SshServer.IDLE_TIMEOUT, TIMEOUT);
sshd.setShellFactory(new SshShellFactor(BortalLocalContextHolder.getInstance()));
BortalPasswordAuthenticator pswdAuth = new BortalPasswordAuthenticator(BortalLocalContextHolder.getInstance());
sshd.setPasswordAuthenticator(pswdAuth);
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser"));
try {
sshd.start();
return sshd;
} catch (IOException e) {
logger.warn("sshd start failed! ", e);
}
return null;
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
logger.info("Destroying ssh servlet");
for (Entry<Integer, SshServer> entry : servers.entrySet())
{
try {
entry.getValue().stop();
} catch (InterruptedException e) {
logger.warn("Error stopping ssh", e);
}
}
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
LanEvent event = eventbean.getCurrentEvent();
if (!servers.containsKey(event.getId())) {
SshServer ssh = initSsh(event.getId());
if (ssh != null) {
servers.put(event.getId(), ssh);
}
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
......@@ -19,12 +19,7 @@
package fi.codecrew.moya.web.cdiview.shop;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.*;
import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
......@@ -34,6 +29,7 @@ import javax.faces.model.ListDataModel;
import javax.inject.Inject;
import javax.inject.Named;
import fi.codecrew.moya.model.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -42,14 +38,6 @@ import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.ProductBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.enums.apps.ShopPermission;
import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.LanEventProperty;
import fi.codecrew.moya.model.LanEventPropertyKey;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.model.ProductFlag;
import fi.codecrew.moya.model.ReaderEvent;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.cdiview.reader.ReaderView;
import fi.codecrew.moya.web.cdiview.user.UserView;
......@@ -400,11 +388,15 @@ public class ProductShopView extends GenericCDIView {
for (ProductShopItem shopitem : shoppingcart) {
if (shopitem.getCount().compareTo(BigDecimal.ZERO) > 0) {
// retuser = productBean.createAccountEvent(shopitem.getProduct(), shopitem.getCount(), shopitem.getOverriddenUnitPrice(), userView.getSelectedUser()).getUser();
BigDecimal overriddenPrice = (shopitem.isOverrideUnitPrice()) ? shopitem.getOverriddenUnitPrice() : null;
retuser = productBean.createAccountEvent(shopitem.getProduct(), overriddenPrice, shopitem.getCount(), userView.getSelectedUser()).getUser();
AccountEvent ae = productBean.createAccountEvent(shopitem.getProduct(), overriddenPrice, shopitem.getCount(), userView.getSelectedUser());
// buying from shop means that product is delivered already
ae = productBean.markDelivered(ae, Calendar.getInstance());
retuser = ae.getUser();
}
}
......
......@@ -23,10 +23,7 @@ import fi.codecrew.moya.beans.PlaceGroupBeanLocal;
import fi.codecrew.moya.beans.ProductBeanLocal;
import fi.codecrew.moya.beans.TicketBeanLocal;
import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.GroupMembership;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.model.ReaderEvent;
import fi.codecrew.moya.model.*;
import fi.codecrew.moya.utilities.I18n;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.cdiview.reader.ReaderView;
......@@ -44,6 +41,7 @@ import javax.faces.model.ListDataModel;
import javax.inject.Inject;
import javax.inject.Named;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
@Named
......@@ -79,6 +77,8 @@ public class CardlessIncomingView extends GenericCDIView {
private ListDataModel<GroupMembership> memberlist = null;
private ListDataModel<AccountEvent> deliverableAccountevents = null;
public void initView() {
if (super.requirePermissions(UserPermission.MODIFY)) {
......@@ -182,11 +182,61 @@ public class CardlessIncomingView extends GenericCDIView {
addFaceMessage("incomingflow.allGiven",count);
memberlist = null;
deliverableAccountevents = null;
}
public boolean isAllGiven() {
List<GroupMembership> memberships = ticketBean.findMembershipPrintlistForUser(userview.getSelectedUser());
for(GroupMembership gm : memberships) {
if(gm.getEnteredEvent() != null) {
return false;
}
}
return true;
}
public boolean isUngivenAccountevents() {
List<AccountEvent> accountEvents = productBean.getDeliverableAccountEvents(userview.getSelectedUser());
for(AccountEvent ae : accountEvents) {
if(!ae.isEventDelivered()) {
return true;
}
}
return false;
}
public ListDataModel<AccountEvent> getDeliverableAccountevents() {
deliverableAccountevents = new ListDataModel<>(productBean.getDeliverableAccountEvents(userview.getSelectedUser()));
return deliverableAccountevents;
}
public String giveAccountEvent() {
AccountEvent row = deliverableAccountevents.getRowData();
if (row != null) {
try {
productBean.markDelivered(row, Calendar.getInstance());
} catch (RuntimeException x) { }
deliverableAccountevents = null;
}
return null;
}
public String ungiveAccountEvent() {
AccountEvent row = deliverableAccountevents.getRowData();
if (row != null) {
productBean.markUndelivered(row);
deliverableAccountevents = null;
}
return null;
}
}
......@@ -40,6 +40,8 @@ import javax.inject.Inject;
import javax.inject.Named;
import javax.json.JsonObject;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
@Named
@ConversationScoped
......@@ -84,6 +86,9 @@ public class IncomingView extends GenericCDIView {
private PlaceGroupBeanLocal placegroupBean;
@EJB
private ProductBeanLocal productBean;
@EJB
private CardTemplateBeanLocal cardTemplateBean;
@EJB
......@@ -92,6 +97,7 @@ public class IncomingView extends GenericCDIView {
// private String searchBarcode = "";
private ListDataModel<GroupMembership> memberlist = null;
private ListDataModel<AccountEvent> deliverableAccountevents = null;
private ListDataModel<CardCode> cardCodes;
public void initView() {
......@@ -111,6 +117,7 @@ public class IncomingView extends GenericCDIView {
public void initPrintCardView() {
memberlist = null;
deliverableAccountevents = null;
if (!super.requirePermissions(UserPermission.MODIFY)) {
super.navihandler.redirectNavigation("index.jsf");
......@@ -216,6 +223,7 @@ public class IncomingView extends GenericCDIView {
EventUser user = event.getUser();
memberlist = null;
deliverableAccountevents = null;
if (user == null) {
logger.debug("got no user from barcode");
......@@ -282,6 +290,33 @@ public class IncomingView extends GenericCDIView {
return memberlist;
}
public ListDataModel<AccountEvent> getDeliverableAccountevents() {
deliverableAccountevents = new ListDataModel<>(productBean.getDeliverableAccountEvents(userview.getSelectedUser()));
return deliverableAccountevents;
}
public String giveAccountEvent() {
AccountEvent row = deliverableAccountevents.getRowData();
if (row != null) {
try {
productBean.markDelivered(row, Calendar.getInstance());
} catch (RuntimeException x) { }
deliverableAccountevents = null;
}
return null;
}
public String ungiveAccountEvent() {
AccountEvent row = deliverableAccountevents.getRowData();
if (row != null) {
productBean.markUndelivered(row);
deliverableAccountevents = null;
}
return null;
}
public ListDataModel<CardCode> getCardCodes() {
if (userview.getPrintedCard() == null)
......
......@@ -302,7 +302,7 @@ public class ProductShopItem implements Serializable {
if(option == null)
continue;
if(retString.length() == 0) {
if(retString.length() > 0) {
retString.append(", ");
}
retString.append(option.getName());
......
......@@ -384,7 +384,7 @@ incomingflow.giveplace = Mark given
incomingflow.groupmemberships = Computer places and tickets
incomingflow.invalidbarcode.message = Nothing found with the barcode, you can now add it to the user
incomingflow.invalidbarcode.title = Invalid code
incomingflow.markEverythingGiven = Give all ungiven items
incomingflow.markEverythingGiven=Give all ungiven tickets
incomingflow.multisearch = Multisearch
incomingflow.placesummary = Place summary
incomingflow.printedCard = Card
......@@ -1613,3 +1613,10 @@ bortalApplication.map.MOVE_PLACES =Selfservice place moving
bill.list.header =Orders
placemove.noMovablePlaces =No movable places
deliver=Toimita
placegroupview.noProductsToDeliver=No deliverable products
placegroupview.productName=Product name
incomingflow.giveAccountEvent=Mark given
incomingflow.ungiveAccountEvent=Mark not given
incomingflow.deliverableProducts=Products to deliver
placegroupview.accountEventDescription=Description
incomingflow.ungivenProducts=User has ungiven deliverable products
......@@ -597,7 +597,7 @@ incomingflow.giveplace = Mark given
incomingflow.groupmemberships = Computer places and tickets
incomingflow.invalidbarcode.message = Nothing found with the barcode, you can now add it to the user
incomingflow.invalidbarcode.title = Invalid code
incomingflow.markEverythingGiven = Give all ungiven items
incomingflow.markEverythingGiven=Give all ungiven tickets
incomingflow.multisearch = Multisearch
incomingflow.placesummary = Place summary
incomingflow.printedCard = Card
......@@ -1894,3 +1894,10 @@ bortalApplication.map.MOVE_PLACES = Selfservice place moving
bill.list.header = Orders
placemove.noMovablePlaces = No movable places
deliver=Deliver
placegroupview.noProductsToDeliver=No deliverable products
placegroupview.productName=Product name
incomingflow.giveAccountEvent=Mark given
incomingflow.ungiveAccountEvent=Mark not given
incomingflow.deliverableProducts=Products to deliver
placegroupview.accountEventDescription=Description
incomingflow.ungivenProducts=User has ungiven deliverable products
......@@ -598,7 +598,7 @@ incomingflow.giveplace = Merkitse annetuksi
incomingflow.groupmemberships = Konepaikat sek\u00E4 liput
incomingflow.invalidbarcode.message = Piipatulla koodilla ei l\u00F6ytynyt mit\u00E4\u00E4n, voit lis\u00E4t\u00E4 koodin k\u00E4ytt\u00E4j\u00E4\u00E4n
incomingflow.invalidbarcode.title = Virheellinen koodi
incomingflow.markEverythingGiven = Anna kaikki antamattomat tuotteet
incomingflow.markEverythingGiven=Anna kaikki antamattomat liput
incomingflow.multisearch = Monihaku
incomingflow.placesummary = Paikkayhteenveto
incomingflow.printedCard = Kortti
......@@ -1881,3 +1881,10 @@ bortalApplication.map.MOVE_PLACES = Paikkojen
bill.list.header = Tilaukset
placemove.noMovablePlaces = Ei siirrett\u00E4vi\u00E4 paikkoja
deliver=Toimita
placegroupview.noProductsToDeliver=Ei toimitettavia tuotteita
placegroupview.productName=Tuotteen nimi
incomingflow.giveAccountEvent=Merkitse annetuksi
incomingflow.ungiveAccountEvent=Ei olekkaan annettu
incomingflow.deliverableProducts=Toimitettavat tuotteet
placegroupview.accountEventDescription=Kuvaus
incomingflow.ungivenProducts=K\u00E4ytt\u00E4j\u00E4ll\u00E4 on toimittamattomia tuotteita
......@@ -78,6 +78,11 @@
<repositories>
<repository>
<id>prime-repo</id>
<name>PrimeFaces Maven Repository</name>
<url>https://repository.primefaces.org</url>
</repository>
<repository>
<id>iudex</id>
<url>http://iudex.fi/maven/</url>
</repository>
......@@ -86,11 +91,8 @@
<name>jvnet-nexus-releases</name>
<url>https://maven.java.net/content/repositories/releases/</url>
</repository>
<repository>
<id>prime-repo</id>
<name>PrimeFaces Maven Repository</name>
<url>http://repository.primefaces.org</url>
</repository>
<!--
-->
<repository>
<id>apache.snapshots</id>
<url>http://repository.apache.org/snapshots/</url>
......@@ -99,5 +101,7 @@
<id>clojars.org</id>
<url>http://clojars.org/repo</url>
</repository>
</repositories>
</project>
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!