Commit 6dda4622 by Tuukka Kivilahti

melkein valmis

1 parent 9cb48f04
......@@ -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);
......
......@@ -488,7 +488,7 @@ public class BootstrapBean implements BootstrapBeanLocal {
this.executeUpdates(revId, upIdx);
} else if (upIdx < revId) {
throw new RuntimeException("Sanity check failed! DB is newer than the codebase!");
throw new RuntimeException("Sanity check failed! DB is newer than the codebase!, should be: "+ revId);
}
} else {
// DB is up to date by default! We need to mark the current version
......
......@@ -547,60 +547,28 @@ 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;
}
// TODO: pizzas also removed
retlist.add(ae);
}
return retlist;
}
@Override
public AccountEvent markDelivered(AccountEvent e, Calendar c) {
......@@ -614,6 +582,16 @@ public class ProductBean implements ProductBeanLocal {
return e;
}
@Override
public AccountEvent markUndelivered(AccountEvent e) {
e = accounteventfacade.reload(e);
e.setDelivered(null);
return e;
}
@Override
public List<Product> getPlaceProducts() {
......
......@@ -58,7 +58,7 @@
</p:fieldset>
<br /><br /><br />
<p:commandButton value="#{i18n['incomingflow.markEverythingGiven']}" update="membershipForm" disabled="#{cardlessIncomingView.allGiven}" actionListener="#{cardlessIncomingView.giveEverything}" />
<p:commandButton value="#{i18n['incomingflow.markEverythingGiven']}" update="membershipForm accounteventlistform" disabled="#{cardlessIncomingView.allGiven}" actionListener="#{cardlessIncomingView.giveEverything}" />
<br /><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)}">
......@@ -101,6 +101,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" rendered="#{empty prod.delivered}" actionListener="#{cardlessIncomingView.giveAccountEvent}" value="#{i18n['incomingflow.giveAccountEvent']}" />
<p:commandButton update=":accounteventlistform" 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">
......@@ -321,43 +322,32 @@
<br />
<br />
<h:outputText rendered="#{empty incomingView.}" 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)}">
<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.groupMemberships}" var="member" rowStyleClass="#{member.enteredEvent != null ? 'success':''}">
<p:dataTable value="#{incomingView.deliverableAccountevents}" var="prod" rowStyleClass="#{prod.delivered != null ? 'greenBackground':''}">
<p:column>
<f:facet name="header">
<h:outputText value="#{i18n['placegroupview.reservationName']}" />
<h:outputText value="#{i18n['placegroupview.productName']}" />
</f:facet>
<h:outputText value="#{member.placeReservation.name}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="#{i18n['placegroupview.reservationProduct']}" />
</f:facet>
<h:outputText value="#{member.placeReservation.product.name}" />
<h:outputText value="#{prod.product.name}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="#{i18n['placegroupview.token']}" />
</f:facet>
<h:outputText rendered="#{empty member.user}" value="#{member.inviteToken}" />
<h:outputText rendered="#{!empty member.user}" value="#{member.user.firstnames} #{member.user.lastname} (#{member.user.nick})" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="#{i18n['placegroupview.groupCreator']}" />
<h:outputText value="#{i18n['placegroupview.accountEventDescription']}" />
</f:facet>
<h:outputText value="#{member.placeGroup.creator.firstnames} #{member.placeGroup.creator.lastname} (#{member.placeGroup.creator.nick})" />
<h:outputText value="#{prod.description}" />
</p:column>
<p:column>
<p:commandButton update=":placelistform" rendered="#{empty member.enteredEvent}" actionListener="#{incomingView.givePlace}" value="#{i18n['incomingflow.giveplace']}" />
<p:commandButton update=":placelistform" rendered="#{!empty member.enteredEvent}" actionListener="#{incomingView.ungivePlace}" value="#{i18n['incomingflow.ungiveplace']}" />
<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>
......@@ -368,6 +358,8 @@
<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}" />
......
......@@ -18,8 +18,6 @@ import javax.ws.rs.core.MediaType;
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;
......@@ -280,7 +278,9 @@ public class PlacemapRestViewV1 {
ArrayList<PlaceCodePojo> ret = makePlaceCodePojos(map.getPlaces());
return Response.ok(new ArrayListWrapper<>(ret)).build();
// muutokset tähän filuun tulee poistaa ennen committia
return null;
//return Response.ok(new ArrayListWrapper<>(ret)).build();
}
......
/*
* 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
}
}
......@@ -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)) {
......@@ -179,14 +179,49 @@ public class CardlessIncomingView extends GenericCDIView {
}
}
for(AccountEvent ae : productBean.getDeliverableAccountEvents(userview.getSelectedUser())) {
if(!ae.isEventDelivered()) {
productBean.markDelivered(ae,Calendar.getInstance());
}
}
addFaceMessage("incomingflow.allGiven",count);
memberlist = null;
deliverableAccountevents = null;
}
public boolean isAllGiven() {
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,7 @@ 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
......@@ -85,6 +86,9 @@ public class IncomingView extends GenericCDIView {
private PlaceGroupBeanLocal placegroupBean;
@EJB
private ProductBeanLocal productBean;
@EJB
private CardTemplateBeanLocal cardTemplateBean;
@EJB
......@@ -287,25 +291,30 @@ public class IncomingView extends GenericCDIView {
}
public ListDataModel<AccountEvent> getDeliverableAccountevents() {
List<AccountEvent> accountEvents = new ArrayList<>();
deliverableAccountevents = new ListDataModel<>(productBean.getDeliverableAccountEvents(userview.getSelectedUser()));
return deliverableAccountevents;
}
for(AccountEvent ae : userview.getSelectedUser().getAccountEvents()) {
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;
}
public String giveAccountEvent() {
AccountEvent row = deliverableAccountevents.getRowData();
if (row != null) {
try {
productBean.markDelivered(row, Calendar.getInstance());
} catch (RuntimeException x) { }
accountEvents.add(ae);
deliverableAccountevents = null;
}
return null;
}
deliverableAccountevents = new ListDataModel<AccountEvent>(accountEvents);
return deliverableAccountevents;
public String ungiveAccountEvent() {
AccountEvent row = deliverableAccountevents.getRowData();
if (row != null) {
productBean.markUndelivered(row);
deliverableAccountevents = null;
}
return null;
}
public ListDataModel<CardCode> getCardCodes() {
......
......@@ -1613,3 +1613,9 @@ 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
......@@ -1894,3 +1894,9 @@ 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
......@@ -1881,3 +1881,9 @@ 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
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!