Commit c00a7b31 by Tuomas Riihimäki

Merge branch 'barcodefix_for_incomingviews' into 'master'

Barcodefix for incomingviews

Viivakoodeilua ja sisääntuloa

See merge request !215
2 parents 893d0fdc 1cc321e8
Showing with 345 additions and 118 deletions
......@@ -58,8 +58,29 @@ public interface ReaderBeanLocal {
List<ReaderEvent> getLastReaderEvents();
/**
* check and brogress barcode that origins from browser
*
* @param code
* @return
*/
ReaderEvent checkCode(String code);
/**
* Check and brogress barcode from some external reader which is only named
* @param readerIdent
* @param code
* @return
*/
ReaderEvent checkCode(String readerIdent, String code);
/**
* Check and progress barcode from some specific reader
*
* @param reader
* @param code
* @return
*/
ReaderEvent checkCode(Reader reader, String code);
List<ReaderEvent> getReaderEvents(Integer readerId, Integer count);
......
......@@ -327,6 +327,15 @@ public class BarcodeBean implements BarcodeBeanLocal {
return user;
}
// try if it is our Eticket -code
EventUser user = getUserFromTextCode(barcode);
logger.info("Found maybe some nice user {}", user);
if(user != null)
return user;
} catch (NumberFormatException x) {
}
......
......@@ -80,6 +80,12 @@ public class ReaderBean implements ReaderBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(ReaderBean.class);
@Override
public ReaderEvent checkCode(String code) {
return checkCode(ReaderType.BARCODE.toString()+":handheld_reader_via_browser", code);
}
@Override
public ReaderEvent checkCode(String readerIdent, String code) {
Reader reader = readerfacade.findOrCreateByIdent(readerIdent);
......
......@@ -28,6 +28,7 @@ import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fi.codecrew.moya.model.ReaderType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -77,8 +78,19 @@ public class ReaderFacade extends IntegerPkGenericFacade<Reader> {
private static synchronized Reader createIdent(ReaderFacade rf, LanEvent ev, String ident) {
Reader ret = rf.findByIdent(ev, ident);
if (ret == null) {
ret = new Reader(ev, ident);
ret.setDescription("Automagically created");
// if there is doubledot (and text before it), check if it is reader type
if(ident.indexOf(':') > 0) {
String typeString = ident.substring(0, ident.indexOf(':'));
try {
ret.setType(ReaderType.valueOf(typeString));
} catch (IllegalArgumentException x) {}
}
rf.create(ret);
logger.info("Created new reader for ident {} reader {}", ident, ev);
}
......
......@@ -68,7 +68,7 @@ public class Reader extends GenericEntity {
@Column(nullable = false, name = "type")
@Enumerated(EnumType.STRING)
private ReaderType type = ReaderType.RFID;
private ReaderType type = ReaderType.BARCODE;
public static final String EVENT_ID_COLUMN = "event_id";
@ManyToOne()
......
/*
* 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.utilities.jsf;
import fi.codecrew.moya.utilities.jpa.ModelInterface;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
/**
* Use this converter if you want to do some database find -magic via string
* @param <T>
*/
public abstract class GenericEntityFinderConverter<T extends ModelInterface> implements Converter {
protected abstract T find(Integer id);
protected abstract T find(String searchString);
public GenericEntityFinderConverter() {
super();
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
T ret = null;
Integer id = null;
if (value != null) {
try {
id = Integer.parseInt(value);
if (id != null && id > 0) {
ret = find(id);
}
} catch (NumberFormatException x) {
// it's not number, it's normal search stuff
ret = find(value);
}
}
return ret;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
String ret = "0";
if (value != null && value instanceof ModelInterface) {
ModelInterface entity = (ModelInterface) value;
if (entity.getId() != null) {
ret = entity.getId().toString();
}
}
return ret;
}
}
......@@ -9,6 +9,7 @@
<f:metadata>
<f:viewParam name="userid" value="#{userView.userid}" />
<f:event type="preRenderView" listener="#{cardlessIncomingView.initView}" />
</f:metadata>
<ui:define name="content">
......@@ -16,12 +17,7 @@
<reader:backendReader selectvalue="#{i18n['barcodeReader.readBarcode']}" selectaction="#{cardlessIncomingView.polledRead}" />
<br /><br />
<h:form>
<p:autoComplete styleClass="usermultisearch" id="acsb" value="#{infoView.multiSearchUser}" completeMethod="#{infoView.matchMulti}" converter="#{eventUserConverter}" var="usrx" itemLabel="#{usrx.shortUserDescriptor}" itemValue="#{usrx}">
<p:ajax event="itemSelect" listener="#{cardlessIncomingView.changeUser}" />
</p:autoComplete>
<p:watermark for="acsb" value="#{i18n['infoview.multisearch']}" />
</h:form>
<infoview:usermultisearch />
<br />
<h1>
......
......@@ -3,10 +3,15 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:foodwave="http://java.sun.com/jsf/composite/cditools/foodwave" xmlns:products="http://java.sun.com/jsf/composite/cditools/products" xmlns:users="http://java.sun.com/jsf/composite/cditools/user"
xmlns:reader="http://java.sun.com/jsf/composite/cditools/reader" xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui">
xmlns:p="http://primefaces.org/ui"
xmlns:infoview="http://java.sun.com/jsf/composite/cditools/infoview"
>
>
<h:body>
<ui:composition template="/resources/templates/#{sessionHandler.infoscreen}/template.xhtml">
<ui:param name="ignorenavigationleft" value="true" />
<f:metadata>
<f:viewParam name="foodwaveid" value="#{foodWaveFoodView.foodwaveid}" />
<f:viewParam name="userid" value="#{flowFoodwaveView.userId}" />
......@@ -18,11 +23,8 @@
<ui:define name="content">
<reader:backendReader selectvalue="#{i18n['barcodeReader.readBarcode']}" selectaction="#{flowFoodwaveView.polledRead}" />
<h:form>
<p:autoComplete id="acsb" value="#{infoView.multiSearchUser}" completeMethod="#{infoView.matchMulti}" converter="#{eventUserConverter}" var="usrx" itemLabel="#{usrx.shortUserDescriptor}" itemValue="#{usrx}">
<p:ajax event="itemSelect" listener="#{flowFoodwaveView.changeUser}" />
</p:autoComplete>
</h:form>
<infoview:usermultisearch />
<br /><br />
<h1>Shop to user: #{userView.selectedUser.user.nick}</h1>
......
......@@ -9,10 +9,13 @@
xmlns:users="http://java.sun.com/jsf/composite/cditools/user"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:reader="http://java.sun.com/jsf/composite/cditools/reader"
xmlns:infoview="http://java.sun.com/jsf/composite/cditools/infoview"
xmlns:p="http://primefaces.org/ui">
<h:body>
<ui:composition
template="/resources/templates/#{sessionHandler.infoscreen}/template.xhtml">
<ui:param name="ignorenavigationleft" value="true" />
<f:metadata>
<f:viewParam name="userid" value="#{flowFoodwaveView.userId}" />
<f:viewParam name="templateid" value="#{foodWaveView.templateId}" />
......@@ -22,11 +25,8 @@
<ui:define name="content">
<reader:backendReader selectvalue="#{i18n['barcodeReader.readBarcode']}" selectaction="#{flowFoodwaveView.polledRead}" />
<h:form>
<p:autoComplete id="acsb" value="#{infoView.multiSearchUser}" completeMethod="#{infoView.matchMulti}" converter="#{eventUserConverter}" var="usrx" itemLabel="#{usrx.shortUserDescriptor}" itemValue="#{usrx}">
<p:ajax event="itemSelect" listener="#{flowFoodwaveView.changeUser}" />
</p:autoComplete>
</h:form>
<infoview:usermultisearch />
<br /><br />
<h1>Shop to user: #{userView.selectedUser.user.nick}</h1>
<br /><br />
......
......@@ -5,7 +5,7 @@
xmlns:tools="http://java.sun.com/jsf/composite/cditools" xmlns:user="http://java.sun.com/jsf/composite/cditools/user" xmlns:infoview="http://java.sun.com/jsf/composite/cditools/infoview">
<h:body>
<ui:composition template="/resources/templates/#{sessionHandler.infoscreen}/template.xhtml">
<ui:param name="ignorenavigationleft" value="true" />
<f:metadata>
<f:viewParam name="userid" value="#{userView.userid}" />
<f:event type="preRenderView" listener="#{incomingView.initPrintCardView}" />
......@@ -14,12 +14,8 @@
<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<reader:backendReader selectvalue="#{i18n['barcodeReader.readBarcode']}" selectaction="#{incomingView.polledRead}" />
<h:form>
<p:autoComplete id="acsb" value="#{infoView.multiSearchUser}" completeMethod="#{infoView.matchMulti}" converter="#{eventUserConverter}" var="usrx" itemLabel="#{usrx.shortUserDescriptor}" itemValue="#{usrx}">
<p:ajax event="itemSelect" listener="#{incomingView.changeUser}" />
</p:autoComplete>
</h:form>
<infoview:usermultisearch />
<h:form id="attachform">
......@@ -314,8 +310,8 @@
<h:outputText value="#{member.placeGroup.creator.firstnames} #{member.placeGroup.creator.lastname} (#{member.placeGroup.creator.nick})" />
</p:column>
<p:column>
<h:commandButton rendered="#{empty member.enteredEvent}" action="#{incomingView.givePlace}" value="#{i18n['incomingflow.giveplace']}" />
<h:commandButton rendered="#{!empty member.enteredEvent}" action="#{incomingView.ungivePlace}" value="#{i18n['incomingflow.ungiveplace']}" />
<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:column>
</p:dataTable>
......
......@@ -14,7 +14,7 @@
<h:body>
<ui:composition
template="/resources/templates/#{sessionHandler.infoscreen}/template.xhtml">
<ui:param name="ignorenavigationleft" value="true" />
<f:metadata>
<f:event type="preRenderView" listener="#{incomingView.initView}" />
</f:metadata>
......
......@@ -8,6 +8,7 @@
>
<h:body>
<ui:composition template="/resources/templates/#{sessionHandler.infoscreen}/template.xhtml">
<ui:param name="ignorenavigationleft" value="true" />
<f:metadata>
<f:viewParam name="userid" value="#{flowShopView.userId}" />
......@@ -16,11 +17,8 @@
<ui:define name="content">
<reader:backendReader selectvalue="#{i18n['barcodeReader.readBarcode']}" selectaction="#{flowShopView.polledRead}" />
<h:form>
<p:autoComplete id="acsb" value="#{infoView.multiSearchUser}" completeMethod="#{infoView.matchMulti}" converter="#{eventUserConverter}" var="usrx" itemLabel="#{usrx.shortUserDescriptor}" itemValue="#{usrx}">
<p:ajax event="itemSelect" listener="#{flowShopView.changeUser}" />
</p:autoComplete>
</h:form>
<infoview:usermultisearch />
<h:form rendered="#{!userView.user.anonymous}">
<h1>Shop to user: #{userView.user.user.nick}</h1>
......
<?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:composite="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui"
xmlns:reader="http://java.sun.com/jsf/composite/cditools/reader"
>
<composite:interface>
</composite:interface>
<composite:implementation>
<h:form>
<h:outputScript>
$(document).ready(function() {
$(".usermultisearch .ui-autocomplete-input").focus();
});
</h:outputScript>
<p:autoComplete immediate="true" widgetVar="usermultisearch" styleClass="usermultisearch" id="acsb" value="#{infoView.multiSearchUser}" completeMethod="#{infoView.matchMulti}" converter="#{eventUserCodeFinderConverter}" var="usrx" itemLabel="#{usrx.shortUserDescriptor}" itemValue="#{usrx}">
<p:ajax event="itemSelect" listener="#{cardlessIncomingView.changeUser}" />
</p:autoComplete>
<p:watermark for="acsb" value="#{i18n['infoview.multisearch']}" />
</h:form>
</composite:implementation>
</html>
\ No newline at end of file
......@@ -20,6 +20,7 @@
<reader:backendReader selectvalue="#{i18n['barcodeReader.readBarcode']}" selectaction="#{incomingView.selectUser}" />
</composite:implementation>
</html>
\ No newline at end of file
......@@ -48,6 +48,8 @@ xmlns:reader="http://java.sun.com/jsf/composite/cditools/reader"
-->
<p:outputLabel rendered="#{empty readerNameContainer.readerId}" value="#{i18n['reader.noReader']}" />
<p:outputLabel rendered="#{!empty readerNameContainer.readerId}" value="#{i18n['reader.autopoll']}" />
<p:inputSwitch rendered="#{!empty readerNameContainer.readerId}" offLabel="#{i18n['off']}" onLabel="#{i18n['on']}" value="#{readerView.pollingMode}" immediate="true" style="width: 81px;">
......
......@@ -58,6 +58,22 @@ public class NavigationHandler implements Serializable {
this.destNavi = pageid;
}
/**
* Reloads current page with custom parameters, parameters must include leading '?'.
*
* This should be used if you want to ie. load current page with "userid=234" -parameter etc.
*
* @param parameter
*/
public void reloadWithParameter(String parameter) {
FacesContext fcont = FacesContext.getCurrentInstance();
HttpServletRequest req = (HttpServletRequest) fcont.getExternalContext().getRequest();
String redirectPath = req.getRequestURI() + parameter;
redirectNavigation(redirectPath);
}
public void redirectToSaved() {
if (destNavi == null || destNavi.isEmpty()) {
HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
......
/*
* 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.web.converter;
import fi.codecrew.moya.beans.ReaderBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.ReaderEvent;
import fi.codecrew.moya.utilities.jsf.GenericEntityFinderConverter;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named
@RequestScoped
public class EventUserCodeFinderConverter extends GenericEntityFinderConverter<EventUser> {
@EJB
private UserBeanLocal userbean;
@EJB
private ReaderBeanLocal readerBean;
@Override
protected EventUser find(Integer id) {
return userbean.findByEventUserId(id);
}
@Override
protected EventUser find(String searchString) {
ReaderEvent event = readerBean.checkCode(searchString);
if(event == null)
return null;
return event.getUser();
}
}
......@@ -22,8 +22,11 @@ import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import fi.codecrew.moya.beans.ReaderBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.ReaderEvent;
import fi.codecrew.moya.utilities.jsf.GenericEntityFinderConverter;
import fi.codecrew.moya.utilities.jsf.GenericIntegerEntityConverter;
@Named
......@@ -33,6 +36,9 @@ public class EventUserConverter extends GenericIntegerEntityConverter<EventUser>
@EJB
private UserBeanLocal userbean;
@EJB
private ReaderBeanLocal readerBean;
@Override
protected EventUser find(Integer id) {
return userbean.findByEventUserId(id);
......
......@@ -73,6 +73,13 @@ public class CardlessIncomingView extends GenericCDIView {
private ListDataModel<GroupMembership> memberlist = null;
public void initView() {
super.beginConversation();
}
public void polledRead() {
ReaderEvent event = readerView.getReaderEvent();
......@@ -155,12 +162,16 @@ public class CardlessIncomingView extends GenericCDIView {
public void giveEverything() {
List<GroupMembership> memberships = placegroupBean.getMembershipsAndCreations(userview.getSelectedUser());
int count = 0;
for(GroupMembership gm : memberships) {
if(gm.getEnteredEvent() == null) {
placegroupBean.markGrouMembershipEntered(gm);
count++;
}
}
addFaceMessage("incomingflow.allGiven",count);
memberlist = null;
}
......
......@@ -102,17 +102,7 @@ public class FlowFoodwaveView extends GenericCDIView {
this.userId = userId;
}
public void changeUser(SelectEvent event) {
if (infoView.getMultiSearchUser() != null) {
flowUserContainer.setUserId(infoView.getMultiSearchUser().getUser().getId());
// TODO: kauneista nää
super.navihandler.redirectNavigation("/MoyaWeb/info/foodwave/foodwaveshop.jsf?userid=" + infoView.getMultiSearchUser().getUser().getId());
}
}
......
......@@ -114,36 +114,13 @@ public class IncomingView extends GenericCDIView {
private boolean autoGivePlaces = true;
/*
* public String getSearchBarcode() { return searchBarcode; }
*
* public void setSearchBarcode(String searchBarcode) { this.searchBarcode =
* searchBarcode; }
*
* public List<String> matchBarcode(String matchWhat) {
* List<GroupMembership> gms =
* placeBean.matchGroupMembershipsByInviteToken(matchWhat);
* ArrayList<String> arl = new ArrayList<>(); for (GroupMembership gm : gms)
* { arl.add(gm.getInviteToken()); }
*
* return arl; }
*/
public void changeUser(SelectEvent event) {
if (infoView.getMultiSearchUser() != null) {
super.navihandler.redirectNavigation("incoming.jsf?userid="
+ infoView.getMultiSearchUser().getUser().getId());
infoView.setMultiSearchUser(null);
}
}
private boolean initialized = false;
public void initPrintCardView() {
memberlist = null;
if (!permbean.hasPermission(UserPermission.MODIFY)
|| namecontainer.getReaderId() == null
|| namecontainer.getReaderId() <= 0) {
if (!permbean.hasPermission(UserPermission.MODIFY)) {
super.navihandler.redirectNavigation("index.jsf");
}
......
......@@ -22,8 +22,10 @@ import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -42,65 +44,74 @@ import fi.codecrew.moya.web.cdiview.user.UserView;
public class InfoView extends GenericCDIView {
private static final long serialVersionUID = 802344850073689859L;
private EventUser multiSearchUser = null;
private static final Logger logger = LoggerFactory.getLogger(InfoView.class);
@Inject
private UserView userview;
@Inject
private ReaderView readerView;
@EJB
private UserBeanLocal userbean;
public void initView() {
super.beginConversation();
}
public String saveUser() {
logger.info("Saving user in incomingView");
userview.saveUser();
@Inject
private UserView userview;
@Inject
private ReaderView readerView;
@EJB
private UserBeanLocal userbean;
private String currentPage;
public void initView() {
super.beginConversation();
}
public String saveUser() {
logger.info("Saving user in incomingView");
userview.saveUser();
return null;
}
public String selectUser() {
ReaderEvent event = readerView.getReaderEvent();
if (event == null)
return null;
}
public String selectUser() {
ReaderEvent event = readerView.getReaderEvent();
if(event == null)
return null;
EventUser user = event.getUser();
if(user == null) {
return null;
}
userview.setUser(user);
return "general";
}
public List<EventUser> matchMulti(String what) {
UserSearchQuery usq = new UserSearchQuery();
usq.setSearch(what);
SearchResult<EventUser> sr = userbean.getThisEventsUsers(usq);
EventUser user = event.getUser();
return sr.getResults();
if (user == null) {
return null;
}
public EventUser getMultiSearchUser() {
return multiSearchUser;
}
userview.setUser(user);
return "general";
}
public List<EventUser> matchMulti(String what) {
UserSearchQuery usq = new UserSearchQuery();
usq.setSearch(what);
public void setMultiSearchUser(EventUser multiSearchUser) {
this.multiSearchUser = multiSearchUser;
SearchResult<EventUser> sr = userbean.getThisEventsUsers(usq);
return sr.getResults();
}
public EventUser getMultiSearchUser() {
return multiSearchUser;
}
public void setMultiSearchUser(EventUser multiSearchUser) {
this.multiSearchUser = multiSearchUser;
if (multiSearchUser != null) {
this.multiSearchUser = null;
super.navihandler.reloadWithParameter("?userid=" + multiSearchUser.getUser().getId());
}
}
}
......@@ -483,3 +483,6 @@ incomingFlow.count=M\u00E4\u00E4r\u00E4
user.birthday=
user.confirmUserToEventAdding=
user.invalidLoginCredentials=
barcodeReader.readBarcode=Lue viivakoodi
incomingflow.allGiven=Merkitty {0} lippu(a) annetuksi.
reader.noReader=Ei valittua lukijaa
......@@ -1699,3 +1699,5 @@ incomingFlow.leftCount=Ungiven
incomingflow.markEverythingGiven=Give ewerything ungiven stuff
submenu.info.cardlessIncoming=Incoming
incomingFlow.count=Count
incomingflow.allGiven=Marked {0} tickets given.
reader.noReader=No selected reader
......@@ -1683,3 +1683,5 @@ user.unauthenticated=
incomingflow.markEverythingGiven=Anna kaikki antamattomat tuotteet
submenu.info.cardlessIncoming=Sis\u00E4\u00E4ntulo
incomingFlow.count=M\u00E4\u00E4r\u00E4
incomingflow.allGiven=Merkitty {0} lippu(a) annetuksi.
reader.noReader=Ei valittua lukijaa
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!