Commit 24f2ee08 by Tuomas Riihimäki

Merge branch 'barcodefuckup' into 'master'

Barcodefuckup

Viivakoodipuolen refaktorointi, ny kaikki menee kannan kautta, ja ReaderEventteihin mapataan kaikki mahollinen -> ei tartte käsin vieweissä tehä mappauslogiikkaa 👍  Closes #43
2 parents 033e23cc 8170e8b0
Showing with 680 additions and 762 deletions
......@@ -15,6 +15,7 @@ import fi.codecrew.moya.facade.PrintedCardFacade;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Place;
import fi.codecrew.moya.model.PrintedCard;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.utilities.BarcodeUtils;
/**
......@@ -39,6 +40,10 @@ public class BarcodeBean implements BarcodeBeanLocal {
@EJB
UserBeanLocal userBean;
@EJB
ProductBeanLocal productBean;
/**
* Default constructor.
......@@ -181,7 +186,7 @@ public class BarcodeBean implements BarcodeBeanLocal {
} catch (NumberFormatException x) {
}
return printedCardFacade.findByBarcode(barcode);
return printedCardFacade.findByCode(barcode);
}
public EventUser getUser(String barcode) {
......@@ -212,4 +217,17 @@ public class BarcodeBean implements BarcodeBeanLocal {
return null;
}
@Override
public Product getProduct(String barcode) {
return productBean.findByBarcode(barcode);
}
@Override
public Place getPlaceFromBarcode(String barcode) {
//throw new UnsupportedOperationException();
return null;
// TODO: tarttee hakea se paikkakoodi, ja sen avulla paikka. Toivon että se on ny tämä eikä placecodehäsmäkkä, mikä se oikeasti on. Vittu lisää refactorointia
}
}
......@@ -40,6 +40,19 @@ public class BootstrapBean implements BootstrapBeanLocal {
"ALTER TABLE org_roles ADD ldap_role boolean not null default false",
"ALTER TABLE org_roles ADD ldap_weight integer NOT NULL default 100"
});
// barcodefuckup
dbUpdates.add(new String[] {
"DROP TABLE card_barcode",
"ALTER TABLE printed_cards DROP COLUMN barcode;",
"ALTER TABLE printed_cards DROP COLUMN rfid_uid;",
"ALTER TABLE reader_events ADD COLUMN event_users_id integer REFERENCES event_users(id) DEFAULT null;",
"ALTER TABLE reader_events ADD COLUMN places_id integer REFERENCES places(id) DEFAULT null;",
"ALTER TABLE reader_events ADD COLUMN products_id integer REFERENCES products(id) DEFAULT null;",
"ALTER TABLE reader_events ADD COLUMN type text NOT NULL DEFAULT 'UNKNOWN';",
"ALTER TABLE reader_events DROP COLUMN gamepoint;",
"ALTER TABLE reader_events ALTER COLUMN type DROP DEFAULT;",
});
}
@EJB
......
......@@ -13,15 +13,20 @@ import javax.ejb.Stateless;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.facade.CardCodeFacade;
import fi.codecrew.moya.facade.PrintedCardFacade;
import fi.codecrew.moya.facade.ReaderEventFacade;
import fi.codecrew.moya.facade.ReaderFacade;
import fi.codecrew.moya.model.AccountEvent;
import fi.codecrew.moya.model.CardCode;
import fi.codecrew.moya.model.CardTemplate;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Place;
import fi.codecrew.moya.model.PrintedCard;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.model.Reader;
import fi.codecrew.moya.model.ReaderEvent;
import fi.codecrew.moya.model.ReaderEventType;
import fi.codecrew.moya.model.ReaderType;
import fi.codecrew.moya.model.User;
......@@ -33,8 +38,12 @@ public class ReaderBean implements ReaderBeanLocal {
@EJB
private ReaderFacade readerfacade;
@EJB
private PrintedCardFacade cardfacade;
@EJB
private CardTemplateBeanLocal cardtemplatebean;
@EJB
......@@ -47,152 +56,133 @@ public class ReaderBean implements ReaderBeanLocal {
private CardTemplateBean cardTemplateBean;
@EJB
private ProductPBean productPBean;
@EJB
private CardCodeFacade cardCodeFacade;
@EJB
private BarcodeBeanLocal barcodeBean;
private static final Logger logger = LoggerFactory.getLogger(ReaderBean.class);
@Override
public ReaderEvent checkTag(String readerIdent, String tag) {
public ReaderEvent checkCode(String readerIdent, String code) {
Reader reader = readerfacade.findOrCreateByIdent(readerIdent);
return checkCode(reader, code);
}
@Override
/**
* check reader code, and add it to the database
*/
public ReaderEvent checkCode(Reader reader, String code) {
logger.info("got code from reader {}", code);
tag = tag.replace("\"\b", "");
code = code.replace("\"\b", "");
if (reader.getType() == ReaderType.RFID) {
if (Pattern.matches("^.*000000$", tag))
if (Pattern.matches("^.*000000$", code))
{
tag = tag.replace("000000", "");
code = code.replace("000000", "");
}
StringBuilder sb = new StringBuilder(tag);
StringBuilder sb = new StringBuilder(code);
while (sb.length() < 16)
{
sb.insert(0, "0");
}
tag = sb.toString();
code = sb.toString();
}
PrintedCard card = cardfacade.findByRfid(tag);
logger.info("reader {}, card {}", reader, card);
// RfidEvent revent = reventcontainer.foundTag(reader, tag);
ReaderEvent event = new ReaderEvent(new Date(), reader, code);
// first, check if dublicate, there is 30s timeout for dublicates, afther that it's ok to create dublicate
// that's bcause accident dublicates are bad, but otherwise it's probably bcause user want's to read it again
List<ReaderEvent> lastevents = readerEventFacade.findLastEvents(reader, 1);
ReaderEvent ret = null;
if (!lastevents.isEmpty() && !reader.isAutoproduct())
{
ReaderEvent lastevent = lastevents.get(0);
if (card == null)
{
if (lastevent.getPrintedCard() == null && tag.equals(lastevent.getValue()))
{
ret = lastevent;
}
} else if (card.equals(lastevent.getPrintedCard())) {
ret = lastevent;
if(lastevent.getValue() == event.getValue() && (lastevent.getUpdatetime().getTime() + 60000l) > event.getTime().getTime()) {
lastevent = readerEventFacade.reload(lastevent);
lastevent = readerEventFacade.merge(lastevent);
return lastevent; // todo: update lastevent bfore return
}
}
if (ret == null)
{
ret = createReaderEvent(reader, card);
logger.debug("Got reader autoproduct {} with count {}", reader.getAutomaticProduct(), reader.getAutomaticProductCount());
logger.debug("ret {}, card, {} autoproduct {}", new Object[] { ret, card, reader.isAutoproduct() });
if (ret != null && card != null && reader.isAutoproduct()) {
EventUser eu = userbean.getEventUser(card.getUser().getUser());
AccountEvent createAc = productPBean.createAccountEvent(reader.getAutomaticProduct(), reader.getAutomaticProductCount(), eu, Calendar.getInstance());
readerfacade.flush();
logger.info("Creating new accountevent from autoproduct {}", createAc);
ret.setNotes("Created automatic account event from reader. " + createAc);
// find stuff with barcode and set type
// IF we find 2 stuff with same barcode, it's just bad luck and things may be little random.
EventUser user = barcodeBean.getUser(code);
if(user != null) {
event.setType(ReaderEventType.USER);
event.setUser(user);
}
PrintedCard card = barcodeBean.getPrintedCard(code);
if(card != null) {
event.setType(ReaderEventType.CARD);
event.setPrintedCard(card);
if(card.getUser() != null) {
event.setUser(card.getUser());
}
} else {
ret.setUpdatetime(new Date());
}
if (card == null)
{
ret.setValue(tag);
Product product = barcodeBean.getProduct(code);
if(product != null) {
event.setType(ReaderEventType.PRODUCT);
event.setProduct(product);
}
return ret;
}
//
// @Override
// public ReaderEvent assocTagToPlacecode(String tag, String readerIdent,
// String placecode) throws BortalCatchableException,
// PermissionDeniedException {
//
// GroupMembership gm = gmfacade.findByToken(placecode);
// if (gm == null) {
// throw new BortalCatchableException("Token" + placecode + " not found!",
// "readerbean.tokenNotFound");
// }
// if (gm.getUser() == null) {
// throw new BortalCatchableException("Token " + placecode +
// "found but not assoc to user!",
// "readerbean.userNotAssociateToMembership");
// }
//
// PrintedCard card = cardtemplatebean.setRfidUid(tag, gm.getUser());
//
// Reader reader = readerfacade.findOrCreateByIdent(readerIdent);
//
// return createReaderEvent(reader, card);
//
// }
private ReaderEvent createReaderEvent(Reader reader, PrintedCard card) {
ReaderEvent ret = new ReaderEvent(Calendar.getInstance(), card, reader);
Integer gamepoints = reader.getGamepoints();
if (gamepoints > 0 && card != null) {
int awardedCount = 0;
for (ReaderEvent oldRe : reader.getEvents()) {
if (oldRe.getGamePoint() > 0)
{
++awardedCount;
// User has been already awarded points from this reader.
// Not awarding again...
if (oldRe.getPrintedCard().equals(card)) {
gamepoints = 0;
break;
}
}
}
// if points can be awarded only limited times...
if (reader.getMaxEvents() > 0 && reader.getMaxEvents() > awardedCount) {
gamepoints = 0;
}
Place place = barcodeBean.getPlaceFromBarcode(code);
if(place != null) {
event.setType(ReaderEventType.PLACE);
event.setPlace(place);
}
event.setUpdatetime(new Date());
// reader is in autoproduct-mode, create dat product
if (reader.isAutoproduct()) {
EventUser eu = userbean.getEventUser(card.getUser().getUser());
AccountEvent createAc = productPBean.createAccountEvent(reader.getAutomaticProduct(), reader.getAutomaticProductCount(), eu, Calendar.getInstance());
readerfacade.flush();
logger.info("Creating new accountevent from autoproduct {}", createAc);
event.setNotes("Created automatic account event from reader. " + createAc);
ret.setGamePoint(gamepoints);
reader.getEvents().add(ret);
if (card != null)
{
card.getReaderEvents().add(ret);
}
event = readerEventFacade.create(event);
return event;
return ret;
}
@Override
public ReaderEvent assocTagToCard(String tag, String readerIdent, PrintedCard card) {
Reader reader = readerfacade.findOrCreateByIdent(readerIdent);
public ReaderEvent assocCodeToCard(ReaderEvent readerEvent, PrintedCard card) {
CardCode code = new CardCode(card, readerEvent.getReader().getType(), readerEvent.getValue());
code = cardCodeFacade.create(code);
card = cardfacade.reload(card);
card.setRfidUid(tag);
// card = cardtemplatebean.setRfidUid(tag, card);
return createReaderEvent(reader, card);
return readerEvent;
}
@Override
......@@ -207,6 +197,8 @@ public class ReaderBean implements ReaderBeanLocal {
@Override
public List<ReaderEvent> getReaderEvents(Integer readerId, Integer count) {
logger.info("Getting events for reader {}", readerId);
Reader reader = readerfacade.find(readerId);
return readerEventFacade.findLastEvents(reader, count);
}
......@@ -235,7 +227,7 @@ public class ReaderBean implements ReaderBeanLocal {
@Override
public User findTagFromAnyEvent(String value) {
PrintedCard card = cardfacade.findLatestByRfidFromAny(value);
PrintedCard card = cardfacade.findLatestByCodeFromAny(value);
User ret = null;
if (card != null && card.getUser() != null) {
ret = card.getUser().getUser();
......@@ -244,6 +236,9 @@ public class ReaderBean implements ReaderBeanLocal {
return ret;
}
// ok, let's comment this out, so I can see where this is used
/*
@Override
public ReaderEvent createCard(ReaderEvent event, EventUser user) {
ReaderEvent ret = null;
......@@ -268,6 +263,7 @@ public class ReaderBean implements ReaderBeanLocal {
}
return ret;
}
*/
@Override
public Reader getReader(Integer readerid) {
......
......@@ -3,14 +3,14 @@ package fi.codecrew.moya.facade;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import fi.codecrew.moya.model.CardBarcode;
import fi.codecrew.moya.model.CardCode;
@Stateless
@LocalBean
public class CardBarcodeFacade extends IntegerPkGenericFacade<CardBarcode> {
public class CardCodeFacade extends IntegerPkGenericFacade<CardCode> {
public CardBarcodeFacade() {
super(CardBarcode.class);
public CardCodeFacade() {
super(CardCode.class);
}
}
......@@ -3,7 +3,6 @@ package fi.codecrew.moya.facade;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import javax.ejb.EJB;
......@@ -14,9 +13,12 @@ import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.enums.CardState;
import fi.codecrew.moya.model.CardCode;
import fi.codecrew.moya.model.CardCode_;
import fi.codecrew.moya.model.CardTemplate_;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.LanEvent;
......@@ -35,31 +37,19 @@ public class PrintedCardFacade extends IntegerPkGenericFacade<PrintedCard> {
@EJB
private EventBeanLocal eventbean;
public PrintedCard findByRfid(String uid) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<PrintedCard> cq = cb.createQuery(PrintedCard.class);
Root<PrintedCard> root = cq.from(PrintedCard.class);
cq.where(
cb.or(
cb.equal(root.get(PrintedCard_.barcode), uid),
cb.equal(root.get(PrintedCard_.rfidUid), uid)),
cb.equal(root.get(PrintedCard_.event), eventbean.getCurrentEvent()));
return getSingleNullableResult(getEm().createQuery(cq));
}
public PrintedCard findByBarcode(String barcode) {
public PrintedCard findByCode(String code) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<PrintedCard> cq = cb.createQuery(PrintedCard.class);
Root<PrintedCard> root = cq.from(PrintedCard.class);
CriteriaQuery<CardCode> cq = cb.createQuery(CardCode.class);
Root<CardCode> root = cq.from(CardCode.class);
cq.where(cb.equal(root.get(PrintedCard_.barcode), barcode),
cb.equal(root.get(PrintedCard_.event), eventbean.getCurrentEvent()));
cq.where(cb.equal(root.get(CardCode_.code), code),
cb.equal(root.get(CardCode_.event), eventbean.getCurrentEvent()));
return getSingleNullableResult(getEm().createQuery(cq));
CardCode cardcode = getSingleNullableResult(getEm().createQuery(cq));
return (cardcode == null)?null : cardcode.getPrintedCard();
}
public List<PrintedCard> findAllEnabled(LanEvent currentEvent) {
......@@ -85,14 +75,16 @@ public class PrintedCardFacade extends IntegerPkGenericFacade<PrintedCard> {
}
public PrintedCard findLatestByRfidFromAny(String uid) {
public PrintedCard findLatestByCodeFromAny(String code) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<PrintedCard> cq = cb.createQuery(PrintedCard.class);
Root<PrintedCard> root = cq.from(PrintedCard.class);
cq.where(cb.equal(root.get(PrintedCard_.rfidUid), uid));
cq.orderBy(cb.desc(root.get(PrintedCard_.printTime)));
Root<CardCode> root = cq.from(CardCode.class);
cq.select(root.get(CardCode_.printedCard));
cq.where(cb.equal(root.get(CardCode_.code), code));
cq.orderBy(cb.desc(root.get(CardCode_.printedCard).get(PrintedCard_.printTime)));
TypedQuery<PrintedCard> q = getEm().createQuery(cq);
q.setMaxResults(1);
......
......@@ -8,6 +8,7 @@ import javax.ejb.Local;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Place;
import fi.codecrew.moya.model.PrintedCard;
import fi.codecrew.moya.model.Product;
@Local
public interface BarcodeBeanLocal {
......@@ -20,5 +21,8 @@ public interface BarcodeBeanLocal {
public String getPlaceHexcode(Place place);
public Place getPlaceFromHexcode(String hexcode);
public String checkVrAuthCode(String code);
public Product getProduct(String barcode);
public Place getPlaceFromBarcode(String barcode);
}
......@@ -9,6 +9,7 @@ import fi.codecrew.moya.enums.CardState;
import fi.codecrew.moya.model.CardTemplate;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.PrintedCard;
import fi.codecrew.moya.model.ReaderEvent;
import fi.codecrew.moya.utilities.jsf.EntityFinderBean;
@Local
......
......@@ -17,7 +17,7 @@ public interface ReaderBeanLocal {
// ReaderEvent assocTagToPlacecode(String tag, String readerIdent, String
// placecode) throws BortalCatchableException, PermissionDeniedException;
ReaderEvent assocTagToCard(String tag, String readerIdent, PrintedCard card);
ReaderEvent assocCodeToCard(ReaderEvent readerEvent, PrintedCard card);
List<Reader> getReaders();
......@@ -27,7 +27,8 @@ public interface ReaderBeanLocal {
User findTagFromAnyEvent(String value);
ReaderEvent createCard(ReaderEvent event, EventUser user);
// lets comment this out, so I can see where this is going
// ReaderEvent createCard(ReaderEvent event, EventUser user);
Reader getReader(Integer readerid);
......@@ -39,7 +40,9 @@ public interface ReaderBeanLocal {
List<ReaderEvent> getLastReaderEvents();
ReaderEvent checkTag(String readerIdent, String tag);
ReaderEvent checkCode(String readerIdent, String code);
ReaderEvent checkCode(Reader reader, String code);
List<ReaderEvent> getReaderEvents(Integer readerId, Integer count);
......
......@@ -15,7 +15,7 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=1
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
......@@ -90,7 +90,7 @@ org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.jdt.core.formatter.indentation.size=8
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
......@@ -283,7 +283,7 @@ org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.jdt.core.formatter.tabulation.char=space
org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
......
cleanup_settings_version=2
eclipse.preferences.version=1
formatter_profile=_InsomniaConventions
formatter_profile=_Insomnia
formatter_settings_version=12
......@@ -9,14 +9,59 @@ import org.eclipse.persistence.annotations.OptimisticLocking;
import org.eclipse.persistence.annotations.OptimisticLockingType;
@Entity
@Table(name = "card_barcode")
@Table(name = "card_code")
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class CardBarcode extends GenericEntity {
private static final long serialVersionUID = 4771609802672223277L;
public class CardCode extends GenericEntity {
private static final long serialVersionUID = 307145499023412008L;
private ReaderType type;
private String code;
public static final String EVENT_ID_COLUMN = "event_id";
@ManyToOne
@JoinColumn(name = EVENT_ID_COLUMN, nullable = false)
private LanEvent event;
@ManyToOne()
@JoinColumn(name = "printed_cards_id")
private PrintedCard printedCard;
public CardCode(PrintedCard card, ReaderType type, String code) {
this.printedCard = card;
this.type = type;
this.code = code;
}
public CardCode() {
}
public ReaderType getType() {
return type;
}
public void setType(ReaderType type) {
this.type = type;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public LanEvent getEvent() {
return event;
}
public void setEvent(LanEvent event) {
this.event = event;
}
public PrintedCard getPrintedCard() {
return printedCard;
......@@ -25,4 +70,7 @@ public class CardBarcode extends GenericEntity {
public void setPrintedCard(PrintedCard printedCard) {
this.printedCard = printedCard;
}
}
......@@ -51,19 +51,19 @@ public class PrintedCard extends GenericEntity {
@Temporal(TemporalType.TIMESTAMP)
private Calendar printTime;
@Column(name = "barcode")
private String barcode;
@Column(name = "card_enabled", nullable = false)
private boolean enabled = true;
@Column(name = "rfid_uid")
private String rfidUid;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "printedCard")
private List<ReaderEvent> readerEvents = new ArrayList<ReaderEvent>();
@OneToMany(cascade = CascadeType.ALL, mappedBy = "printedCard")
private List<CardCode> cardCodes = new ArrayList<CardCode>();
@Column(name = "print_count", nullable = false)
@Column(name = "print_count", nullable = false)
private int printCount = 0;
@JoinColumn(name = "current_location_id", referencedColumnName = "id")
......@@ -112,13 +112,6 @@ public class PrintedCard extends GenericEntity {
this.printTime = printTime;
}
public String getBarcode() {
return barcode;
}
public void setBarcode(String barcode) {
this.barcode = barcode;
}
public boolean getEnabled() {
return enabled;
......@@ -128,14 +121,6 @@ public class PrintedCard extends GenericEntity {
this.enabled = cardEnabled;
}
public String getRfidUid() {
return rfidUid;
}
public void setRfidUid(String rfidUid) {
this.rfidUid = rfidUid;
}
public List<ReaderEvent> getReaderEvents() {
return readerEvents;
}
......@@ -152,6 +137,17 @@ public class PrintedCard extends GenericEntity {
this.currentLocation = currentLocation;
}
public List<CardCode> getCardCodes() {
return cardCodes;
}
public void setCardCodes(List<CardCode> cardCodes) {
this.cardCodes = cardCodes;
}
public EventUser getUser() {
return user;
}
......@@ -175,34 +171,7 @@ public class PrintedCard extends GenericEntity {
public int getPrintCount() {
return printCount;
}
public static final Comparator<PrintedCard> GAMEPOINT_COMPARATOR = new Comparator<PrintedCard>() {
@Override
public int compare(PrintedCard o1, PrintedCard o2) {
int ret = o2.getGamepoints().compareTo(o1.getGamepoints());
if (ret == 0 && o1.getUser().getUser().getNick() != null && o2.getUser().getUser().getNick() != null)
{
ret = o1.getUser().getUser().getNick().compareTo(o2.getUser().getUser().getNick());
}
return ret;
}
};
@Transient
private Integer gamepoints = null;
public Integer getGamepoints() {
if (gamepoints == null) {
Integer ret = 0;
for (ReaderEvent re : this.getReaderEvents()) {
ret += re.getGamePoint();
}
gamepoints = ret;
}
return gamepoints;
}
public CardState getCardState() {
return cardState;
......@@ -212,21 +181,4 @@ public class PrintedCard extends GenericEntity {
this.cardState = cardState;
}
@Transient
private transient ListDataModel<ReaderEvent> revents;
public ListDataModel<ReaderEvent> getGameCards() {
if (revents == null) {
List<ReaderEvent> ev = this.getReaderEvents();
ArrayList<ReaderEvent> ret = new ArrayList<ReaderEvent>();
for (ReaderEvent e : ev) {
if (e.getGamePoint() > 0) {
ret.add(e);
}
}
revents = new ListDataModel<ReaderEvent>(ret);
}
return revents;
}
}
package fi.codecrew.moya.model;
import java.beans.Transient;
import java.util.Calendar;
import java.util.Date;
......@@ -23,121 +24,180 @@ import org.eclipse.persistence.annotations.OptimisticLockingType;
@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)
public class ReaderEvent extends GenericEntity {
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L;
@Column(name = "event_time", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date time;
@Column(name = "event_time", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date time;
@Column(name = "event_updated")
@Temporal(TemporalType.TIMESTAMP)
private Date updatetime;
@Column(name = "value")
private String value;
@Lob
@Column(name = "notes")
private String notes;
@Column(nullable = false)
private Integer gamePoint = 0;
@JoinColumn(name = "printed_cards_id", referencedColumnName = "id", nullable = true, updatable = false)
@ManyToOne(optional = false)
private PrintedCard printedCard;
@JoinColumn(name = "readers_id", referencedColumnName = "id", nullable = false, updatable = false)
@ManyToOne(optional = false)
private Reader reader;
public ReaderEvent(Calendar eventTime, PrintedCard card, Reader reader) {
this.time = eventTime.getTime();
this.printedCard = card;
this.reader = reader;
}
public ReaderEvent() {
super();
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
public Date getTime() {
return time;
}
public void setTime(Date eventTime) {
this.time = eventTime;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public PrintedCard getPrintedCard() {
return printedCard;
}
public void setPrintedCard(PrintedCard printedCardsId) {
this.printedCard = printedCardsId;
}
public Reader getReader() {
return reader;
}
public void setReader(Reader readersId) {
this.reader = readersId;
}
public void setGamePoint(Integer gamePoint) {
this.gamePoint = gamePoint;
}
public Integer getGamePoint() {
return gamePoint;
}
public Date getUpdatetime() {
return updatetime;
}
public void setUpdatetime(Date updatetime) {
this.updatetime = updatetime;
}
public String getSeenSince() {
Date comptime = updatetime;
if (comptime == null)
{
comptime = time;
}
long diffSec = (new Date().getTime() - comptime.getTime()) / 1000;
long secs = diffSec % 60;
long diffMin = diffSec / 60;
long mins = diffMin % 60;
long hours = diffMin / 60;
StringBuilder ret = new StringBuilder();
if (hours > 0) {
ret.append(hours).append(" h ");
}
if (hours > 0 || mins > 0) {
ret.append(mins).append(" min ");
}
ret.append(secs).append(" sec");
return ret.toString();
}
@Column(name = "event_updated")
@Temporal(TemporalType.TIMESTAMP)
private Date updatetime;
@Column(name = "value")
private String value;
@Lob
@Column(name = "notes")
private String notes;
@JoinColumn(name = "printed_cards_id", referencedColumnName = "id", nullable = true, updatable = false)
@ManyToOne(optional = false)
private PrintedCard printedCard;
@JoinColumn(name = "readers_id", referencedColumnName = "id", nullable = false, updatable = false)
@ManyToOne(optional = false)
private Reader reader;
@JoinColumn(name = "event_users_id", referencedColumnName = "id", nullable = true, updatable = false)
@ManyToOne(optional = false)
private EventUser user;
@JoinColumn(name = "places_id", referencedColumnName = "id", nullable = true, updatable = false)
@ManyToOne(optional = false)
private Place place;
@JoinColumn(name = "products_id", referencedColumnName = "id", nullable = true, updatable = false)
@ManyToOne(optional = false)
private Product product;
private ReaderEventType type;
public ReaderEvent(Date eventTime, Reader reader, String value) {
this(eventTime, reader, value, null, null, null, null, ReaderEventType.UNKNOWN);
}
public ReaderEvent(Date eventTime, Reader reader, String value, ReaderEventType type) {
this(eventTime, reader, value, null, null, null, null, type);
}
public ReaderEvent(Date eventTime, Reader reader, String value, PrintedCard card, EventUser user, Place place, Product product, ReaderEventType type) {
this.time = eventTime;
this.reader = reader;
this.value = value;
this.user = user;
this.printedCard = card;
this.user = user;
this.place = place;
this.product = product;
if (type == null)
type = ReaderEventType.UNKNOWN;
this.type = type;
}
public ReaderEvent() {
super();
}
public EventUser getUser() {
return user;
}
public void setUser(EventUser user) {
this.user = user;
}
public Place getPlace() {
return place;
}
public void setPlace(Place place) {
this.place = place;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public ReaderEventType getType() {
return type;
}
public void setType(ReaderEventType type) {
this.type = type;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
public Date getTime() {
return time;
}
public void setTime(Date eventTime) {
this.time = eventTime;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public PrintedCard getPrintedCard() {
return printedCard;
}
public void setPrintedCard(PrintedCard printedCardsId) {
this.printedCard = printedCardsId;
}
public Reader getReader() {
return reader;
}
public void setReader(Reader readersId) {
this.reader = readersId;
}
public Date getUpdatetime() {
if (updatetime == null)
return time;
return updatetime;
}
public void setUpdatetime(Date updatetime) {
this.updatetime = updatetime;
}
@Transient
public String getSeenSince() {
return "" + ((getUpdatetime().getTime() / 1000) / 60) +" min." ;
}
}
package fi.codecrew.moya.model;
public enum ReaderEventType {
USER,
PLACE,
CARD,
PRODUCT,
UNKNOWN
}
......@@ -66,6 +66,7 @@ public class JpegReader {
return null;
}
public void checkAdobeMarker(File file) throws IOException, ImageReadException {
JpegImageParser parser = new JpegImageParser();
ByteSource byteSource = new ByteSourceFile(file);
......
......@@ -30,19 +30,13 @@
<br />
<br />
<reader:barcode_and_rfid selectvalue="#{i18n['barcodeReader.readBarcode']}" selectaction="#{incomingView.selectUser}" />
<reader:codefield selectvalue="#{i18n['barcodeReader.readBarcode']}" selectaction="#{incomingView.selectUser}" />
<reader:backendReader selectvalue="#{i18n['barcodeReader.readBarcode']}" selectaction="#{incomingView.selectUser}" />
</ui:define>
<ui:define name="sidebar">
<reader:readerlisttiles />
<br />
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
......@@ -12,12 +12,7 @@
</f:metadata>
<ui:define name="content">
<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<h:form>
<p:poll interval="1" listener="#{incomingView.polledRead}" onerror="location.reload();" />
</h:form>
<h:form>
<h1>#{i18n['incomingflow.userdetails']} (RFID-lukija: #{incomingView.readerId})</h1><h:commandButton action="#{incomingView.changeReader}" value="#{i18n['incomingflow.changereader']}" />
</h:form>
<h1>#{i18n['incomingflow.userdetails']} </h1>
<h:panelGrid id="cropper" columns="3">
<h:panelGroup>
<user:edit id="usereditor" commitaction="#{incomingView.saveUser()}" commitvalue="#{i18n['user.save']}" camAlwaysOn="true" />
......
......@@ -2,6 +2,7 @@
<!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:login="http://java.sun.com/jsf/composite/cditools/login" xmlns:tools="http://java.sun.com/jsf/composite/cditools"
xmlns:p="http://primefaces.org/ui"
xmlns:reader="http://java.sun.com/jsf/composite/cditools/reader"
>
......@@ -14,27 +15,45 @@ xmlns:reader="http://java.sun.com/jsf/composite/cditools/reader"
<composite:attribute name="linkoutcome" required="false" />
<composite:attribute name="showAssociateToUser" required="false" />
<composite:attribute name="showEditReader" required="false" />
</composite:interface>
<composite:implementation>
<h:form id="reader_autopoll" rendered="#{readerView.pollingMode}">
<p:poll interval="1" listener="#{cc.attrs.selectaction}" onerror="location.reload();" />
</h:form>
<h:form rendered="#{empty readerNameContainer.readerId}">
<h:dataTable border="1" id="reader" value="#{readerListDataView.readers}" var="rr">
<h:column>
<p:dataTable border="1" id="reader" value="#{readerListDataView.readers}" var="rr">
<p:column>
<f:facet name="header">
<h:outputText value="#{i18n['reader.name']}" />
</f:facet>
<h:outputText value="#{rr.identification}" />
</h:column>
<h:column>
<h:commandButton action="#{readerListDataView.selectReader}" value="#{i18n['reader.select']}" />
</h:column>
</h:dataTable>
</p:column>
<p:column>
<p:commandButton actionListener="#{readerListDataView.selectReader}" value="#{i18n['reader.select']}" update="@all" />
</p:column>
<p:column rendered="#{cc.attrs.showEditReader}" >
<h:link outcome="/shop/editReader" value="#{i18n['reader.edit']}">
<f:param value="#{rr.id}" name="readerId" />
</h:link>
</p:column>
</p:dataTable>
</h:form>
<h:form>
<p:outputLabel value="#{i18n['reader.autopoll']}" /><p:selectBooleanButton offLabel="#{i18n['off']}" onLabel="#{i18n['on']}" value="#{readerView.pollingMode}" immediate="true" update="reader_autopoll" />
</h:form>
<reader:readerevents rendered="#{!empty readerNameContainer.readerId}" showAssociateToUser="#{cc.attrs.showAssociateToUser}" selectvalue="#{cc.attrs.selectvalue}" selectaction="#{cc.attrs.selectaction}" linkvalue="#{cc.attrs.linkvalue}" linkoutcome="#{cc.attrs.linkoutcome}" />
</composite:implementation>
......
<?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:login="http://java.sun.com/jsf/composite/cditools/login"
xmlns:tools="http://java.sun.com/jsf/composite/cditools"
xmlns:reader="http://java.sun.com/jsf/composite/cditools/reader"
>
<composite:interface>
<composite:attribute name="selectvalue" required="false" />
<composite:attribute name="selectaction" method-signature="java.lang.String action()" required="false" />
<composite:attribute name="linkvalue" required="false" />
<composite:attribute name="linkoutcome" required="false" />
</composite:interface>
<composite:implementation>
<reader:barcode selectvalue="#{cc.attrs.selectvalue}" selectaction="#{cc.attrs.selectaction}" /> <br />
<reader:rfid selectvalue="#{cc.attrs.selectvalue}" selectaction="#{cc.attrs.selectaction}" linkvalue="#{cc.attrs.linkvalue}" linkoutcome="#{cc.attrs.linkoutcome}" /> <br />
</composite:implementation>
</html>
\ No newline at end of file
<?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:login="http://java.sun.com/jsf/composite/cditools/login"
xmlns:tools="http://java.sun.com/jsf/composite/cditools"
xmlns:reader="http://java.sun.com/jsf/composite/cditools/reader"
>
<composite:interface>
<composite:attribute name="selectvalue" required="false" />
<composite:attribute name="selectaction" method-signature="java.lang.String action()" required="false" />
<composite:attribute name="linkvalue" required="false" />
<composite:attribute name="linkoutcome" required="false" />
</composite:interface>
<composite:implementation>
todo: kato tapahtuman conffeista kumpi käytössä: <br />
<reader:barcode selectvalue="#{cc.attrs.selectvalue}" selectaction="#{cc.attrs.selectaction}" /> <br />
<reader:rfid selectvalue="#{cc.attrs.selectvalue}" selectaction="#{cc.attrs.selectaction}" linkvalue="#{cc.attrs.linkvalue}" linkoutcome="#{cc.attrs.linkoutcome}" /> <br />
</composite:implementation>
</html>
\ No newline at end of file
<?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:login="http://java.sun.com/jsf/composite/cditools/login" xmlns:tools="http://java.sun.com/jsf/composite/cditools">
<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:login="http://java.sun.com/jsf/composite/cditools/login" xmlns:tools="http://java.sun.com/jsf/composite/cditools"
xmlns:p="http://primefaces.org/ui">
<composite:interface>
<composite:attribute name="selectvalue" required="false" />
......@@ -10,11 +12,9 @@
<composite:implementation>
<h:form>
<h:outputLabel value="#{i18n['shop.barcode']}" />
<h:inputText id="barcode" value="#{readerView.barcode}" />
<h:commandButton action="#{cc.attrs.selectaction}" value="#{cc.attrs.selectvalue}" />
<p:outputLabel value="#{i18n['code.inputfield']}" />
<p:inputText id="code" value="#{readerView.userInsertCode}" />
<p:commandButton action="#{cc.attrs.selectaction}" value="#{cc.attrs.selectvalue}" update="@all" />
</h:form>
</composite:implementation>
......
......@@ -16,44 +16,42 @@
<composite:implementation>
<h:form>
<p:poll interval="3" onerror="location.reload();" />
<h:dataTable border="1" id="event" value="#{readerView.readerEvents}" var="event">
<h:column>
<p:poll interval="3" onerror="location.reload();" update="eventlist" />
<p:commandLink actionListener="#{readerView.changeReader}" value="#{i18n['incomingflow.changereader']}" update="@all" />
<p:dataTable border="1" id="eventlist" value="#{readerView.readerEvents}" var="event">
<f:facet name="header">
<p:outputLabel value="#{readerView.currentReader.identification}" />
</f:facet>
<p:column>
<f:facet name="header">
<h:outputText value="${i18n['readerevent.tagname']}" />
</f:facet>
<h:outputText rendered="#{!empty event.printedCard}" id="cardtag" value="#{event.printedCard.rfidUid}" />
<h:outputText rendered="#{empty event.printedCard}" id="newtag" value="#{event.value}" />
</h:column>
</p:column>
<h:column>
<p:column>
<f:facet name="header">
<h:outputText value="${i18n['reader.user']}" />
</f:facet>
<h:outputText rendered="#{!empty event.printedCard}" value="#{event.printedCard.user.wholeName} (#{event.printedCard.user.nick})" />
</h:column>
<h:outputText rendered="#{!empty event.user}" value="#{event.user.wholeName} (#{event.user.nick})" />
</p:column>
<h:column>
<p:column>
<f:facet name="header">
<h:outputText value="${i18n['readerevent.seenSince']}" />
</f:facet>
<h:outputText value="#{event.seenSince}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="${i18n['gamepoints']}" />
</f:facet>
<h:outputText value="#{event.gamePoint}" />
</h:column>
<h:column>
<h:link rendered="#{!empty event.printedCard and !empty cc.attrs.linkoutcome}" outcome="#{cc.attrs.linkoutcome}" value="#{cc.attrs.linkvalue}">
<f:param name="userid" value="#{event.printedCard.user.user.id}" />
</p:column>
<p:column>
<h:link rendered="#{!empty event.user and !empty cc.attrs.linkoutcome}" outcome="#{cc.attrs.linkoutcome}" value="#{cc.attrs.linkvalue}">
<f:param name="userid" value="#{event.user.user.id}" />
</h:link>
<h:commandLink rendered="#{!empty cc.attrs.selectaction}" action="#{cc.attrs.selectaction}" value="#{cc.attrs.selectvalue}" />
<p:commandLink rendered="#{!empty cc.attrs.selectaction}" actionListener="#{cc.attrs.selectaction}" value="#{cc.attrs.selectvalue}" update="@all" />
<!--
<h:link rendered="#{empty event.printedCard and !empty cc.attrs.showAssociateToUser}" outcome="/shop/assocToUser" value="#{i18n['readerevent.associateToUser']}">
<f:param name="eventid" value="#{event.id}" />
</h:link>
......@@ -66,10 +64,10 @@
<h:link rendered="#{empty event.printedCard}" outcome="/shop/assocToUser" value="#{i18n['readerevent.associateToUser']}">
<f:param name="eventid" value="#{event.id}" />
</h:link>
</h:column>
</h:link> -->
</p:column>
</h:dataTable>
</p:dataTable>
</h:form>
......
......@@ -36,7 +36,7 @@
<h:panelGroup>
<reader:barcode selectaction="#{productShopView.readBarcode}" selectvalue="#{i18n['shop.readBarcode']}" />
<reader:codefield selectaction="#{productShopView.readCode}" selectvalue="#{i18n['shop.readBarcode']}" />
<br />
<p:dataTable id="prods" value="#{productShopView.boughtItems}" var="prods">
......
......@@ -15,24 +15,24 @@
<h:form id="editform">
<h:panelGrid columns="3">
<h:outputLabel for="type" value="#{i18n['reader.type']}:" />
<h:selectOneMenu id="type" value="#{readerView.reader.type}">
<h:selectOneMenu id="type" value="#{readerView.editReader.type}">
<f:selectItems value="#{readerView.readertypes}"/>
</h:selectOneMenu>
<h:message for="type"/>
<h:outputLabel for="identification" value="#{i18n['reader.identification']}:" />
<h:outputText id="identification" value="#{readerView.reader.identification}" />
<h:outputText id="identification" value="#{readerView.editReader.identification}" />
<h:message for="identification" />
<h:outputLabel for="automaticProduct" value="#{i18n['reader.automaticProduct']}:" />
<h:selectOneMenu converter="#{productConverter}" id="automaticProduct" value="#{readerView.reader.automaticProduct}" >
<h:selectOneMenu converter="#{productConverter}" id="automaticProduct" value="#{readerView.editReader.automaticProduct}" >
<f:selectItems value="#{readerView.autoProducts}" var="prod" itemLabel="#{prod.name}"/>
</h:selectOneMenu>
<h:message for="automaticProduct" />
<h:outputLabel for="automaticProductCount" value="#{i18n['reader.automaticProductCount']}:" />
<h:inputText id="automaticProductCount" value="#{readerView.reader.automaticProductCount}" >
<h:inputText id="automaticProductCount" value="#{readerView.editReader.automaticProductCount}" >
<f:convertNumber minFractionDigits="0" maxFractionDigits="2" />
</h:inputText>
<h:message for="automaticProductCount" />
......
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:tools="http://java.sun.com/jsf/composite/tools"
xmlns:f="http://java.sun.com/jsf/core"
>
<h:head>
<title></title>
</h:head>
<h:body>
<ui:composition template="#{sessionHandler.template}">
<ui:define name="metadata">
<f:metadata>
<f:viewParam name="reader" value="#{rfidView.reader}" />
<f:viewParam name="tag" value="#{rfidView.tag}" />
<f:viewParam name="hash" value="#{rfidView.hash}" />
<f:event type="preRenderView" listener="#{rfidView.readTag}" />
</f:metadata>
</ui:define>
<ui:define name="content">
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
......@@ -8,14 +8,9 @@
>
<h:body>
<ui:composition template="#{sessionHandler.template}">
<f:metadata>
<f:viewParam name="readerId" value="#{readerNameContainer.readerId}" />
<f:event type="preRenderView" listener="#{readerView.initReaderList}" />
</f:metadata>
<ui:define name="content">
<reader:readerevents rendered="#{!empty readerNameContainer.readerId}" />
<reader:readerlist rendered="#{empty readerNameContainer.readerId}" />
<reader:backendReader showEditReader="true" />
</ui:define>
</ui:composition>
</h:body>
......
......@@ -63,7 +63,7 @@
</h:form>
<h3>RFID</h3>
<reader:barcode_rfid selectvalue="#{i18n['readerevent.associateToUser']}" selectaction="#{userView.attachBarcodeToCard()}" />
<reader:backendReader selectvalue="#{i18n['readerevent.associateToUser']}" selectaction="#{userView.attachCodeToCard}" />
</ui:fragment>
......
......@@ -109,6 +109,8 @@ card.massprint.title = Print all
cardTemplate.emptyCardTemplate = ----
code.inputfield = Sy\u00F6t\u00E4 viivakoodi
error.contact = If this happens again, contact Info with the following code:
error.error = You have encountered an error.
......
......@@ -215,6 +215,8 @@ checkout.return.errorMessage = Error confirming the successfull return message
checkout.return.successDelayed = Delayed payment successfull. Payment will be confirmed at a later time, usually within a hour.
checkout.return.successMessage = Payment confirmed. Your products have been paid.
code.inputfield = Give readercode
compo.edit = Edit compo
compo.saveVotes = Save votes
compo.savesort = Save order
......@@ -1153,7 +1155,7 @@ user.accountBalance = Account balance
user.accountEventHeader = Account events
user.accountevents = Account events
user.address = Address
user.age = Age
user.age = Age
user.bank = Bank
user.bankaccount = Bank number
user.birthday = Birthday
......
......@@ -217,6 +217,8 @@ checkout.return.errorMessage = Virhe maksun onnistuneen maksun vahvistuksessa.
checkout.return.successDelayed = Viiv\u00E4stetty maksu onnistunut. Maksu vahvistet\u00E4\u00E4n my\u00F6hemp\u00E4n\u00E4 ajankohtana, yleens\u00E4 noin tunnin sis\u00E4ll\u00E4.
checkout.return.successMessage = Maksu vahvistettu. Tuotteet on maksettu. Voit siirty\u00E4 eteenp\u00E4in tilauksessasi.
code.inputfield = Sy\u00F6t\u00E4 viivakoodi
compo.edit = Muokkaa compoa
compo.saveVotes = Tallenna \u00E4\u00E4net
compo.savesort = Tallenna j\u00E4rjestys
......@@ -1138,7 +1140,7 @@ user.accountBalance = Tilin saldo
user.accountEventHeader = Tilitapahtumat
user.accountevents = Tilitapahtumat
user.address = Osoite
user.age = Ik
user.age = Ik\u00E4
user.bank = Pankki
user.bankaccount = Pankkitili
user.birthday = Syntym\u00E4aika
......
......@@ -63,6 +63,14 @@ public class ReaderRestView {
return new ReaderEventRestRoot(ReaderEventRestPojo.parse(events));
}
@GET
@Path("/createevent/{reader}/{code}/{hash}")
public Response createReaderEvent(@PathParam("reader") String readerName, @PathParam("code") String readerCode, @PathParam("hash") String hash ) {
readerbean.checkCode(readerName, readerCode);
return Response.ok().build();
}
@GET
@Path("/LastEventusers")
......@@ -76,46 +84,46 @@ public class ReaderRestView {
// public void createRfidEvent(@PathParam("reader") String reader, @PathParam("tagId") String tagId) {
//
// }
// TBD: WTF! - Tarttis varmaan käydä ajatuksella läpi.. - Tuomari 2014-02-28
@GET
@Path("/EventRole/{reader}/{tagId}/{roleid}")
public Response eventRole(@PathParam("reader") String reader, @PathParam("tagId") String tag, @PathParam("roleid") Integer roleId) {
ReaderEvent ret = readerbean.checkTag(reader, tag);
ResponseBuilder builder = null;
if (roleId == null || roleId.equals(0))
{
builder = Response.status(Status.BAD_REQUEST);
builder.entity("role ID is required!");
builder.type(MediaType.TEXT_PLAIN);
}
if (builder == null)
{
if (ret == null || ret.getPrintedCard() == null) {
builder = Response.status(Status.NOT_ACCEPTABLE);
builder.entity("No card found for uid.");
builder.type(MediaType.TEXT_PLAIN);
} else {
EventUser user = ret.getPrintedCard().getUser();
boolean found = userbean.isUserInRole(user, roleId);
if (found) {
builder = Response.status(Status.OK);
} else {
builder = Response.status(Status.FORBIDDEN);
}
builder.entity(new UserPermissionRestPojo(new EventUserRestPojo(user), found));
}
}
return builder.build();
}
@GET
@Path("/EventCard/{reader}/{cardid}")
public void eventCard(@PathParam("reader") String reader, @PathParam("cardid") String cardId) {
}
//
// // TBD: WTF! - Tarttis varmaan käydä ajatuksella läpi.. - Tuomari 2014-02-28
// @GET
// @Path("/EventRole/{reader}/{tagId}/{roleid}")
// public Response eventRole(@PathParam("reader") String reader, @PathParam("tagId") String tag, @PathParam("roleid") Integer roleId) {
// ReaderEvent ret = readerbean.checkTag(reader, tag);
// ResponseBuilder builder = null;
// if (roleId == null || roleId.equals(0))
// {
// builder = Response.status(Status.BAD_REQUEST);
// builder.entity("role ID is required!");
// builder.type(MediaType.TEXT_PLAIN);
//
// }
// if (builder == null)
// {
// if (ret == null || ret.getPrintedCard() == null) {
// builder = Response.status(Status.NOT_ACCEPTABLE);
// builder.entity("No card found for uid.");
// builder.type(MediaType.TEXT_PLAIN);
// } else {
// EventUser user = ret.getPrintedCard().getUser();
// boolean found = userbean.isUserInRole(user, roleId);
// if (found) {
// builder = Response.status(Status.OK);
// } else {
// builder = Response.status(Status.FORBIDDEN);
// }
// builder.entity(new UserPermissionRestPojo(new EventUserRestPojo(user), found));
//
// }
// }
//
// return builder.build();
// }
//
// @GET
// @Path("/EventCard/{reader}/{cardid}")
// public void eventCard(@PathParam("reader") String reader, @PathParam("cardid") String cardId) {
//
// }
}
......@@ -53,5 +53,6 @@ public class ReaderListDataView extends GenericCDIView {
return null;
}
}
......@@ -38,18 +38,13 @@ public class ReaderView extends GenericCDIView {
private static final long serialVersionUID = 802344850073689859L;
private Integer eventid;
private String placecode;
private String usersearch;
private String barcode;
private Reader reader;
private boolean pollingMode = false;
private ReaderEvent lastReadEvent = null;
private transient ListDataModel<UserCardWrapper> userlist;
private ListDataModel<ReaderEvent> readerEventList;
private Reader editReader = null;
@Inject
private ReaderNameContainer namecontainer;
......@@ -57,15 +52,13 @@ public class ReaderView extends GenericCDIView {
@EJB
private transient ReaderBeanLocal readerbean;
private ReaderEvent event;
@EJB
private transient UserBeanLocal userbean;
@EJB
private transient BarcodeBeanLocal barcodebean;
private UserCardWrapper neighborUser;
// private UserCardWrapper neighborUser;
private static final Logger logger = LoggerFactory.getLogger(ReaderView.class);
......@@ -76,21 +69,14 @@ public class ReaderView extends GenericCDIView {
@Inject
private UserView userview;
public void initEditReader() {
if (super.requirePermissions(ShopPermission.SHOP_TO_OTHERS) && reader == null) {
reader = readerbean.getReader(readerid);
if (super.requirePermissions(ShopPermission.SHOP_TO_OTHERS) && editReader == null) {
editReader = readerbean.getReader(readerid);
super.beginConversation();
}
}
public String createCardForUser() {
UserCardWrapper usr = userlist.getRowData();
logger.info("Creating card for user {} from event {}", usr, event);
ReaderEvent card = readerbean.createCard(event, usr.getUser());
// super.addFaceMessage("Created card for user with id: " +
// card.getPrintedCard());
return null;
}
public List<Role> getUserRoles(EventUser user) {
return userbean.findUsersRoles(user);
......@@ -103,20 +89,20 @@ public class ReaderView extends GenericCDIView {
public void initCreateReader()
{
if (super.requirePermissions(ShopPermission.SHOP_TO_OTHERS) && reader == null)
if (super.requirePermissions(ShopPermission.SHOP_TO_OTHERS) && editReader == null)
{
reader = new Reader();
editReader = new Reader();
super.beginConversation();
}
}
public String createReader()
{
readerbean.createReader(reader);
namecontainer.setReaderId(reader.getId());
readerbean.createReader(editReader);
namecontainer.setReaderId(editReader.getId());
return "/shop/showReaderEvents";
}
/*
public void initUserassocView() {
if (super.requirePermissions(UserPermission.CREATE_NEW) && event == null) {
event = readerbean.getEvent(eventid);
......@@ -126,25 +112,28 @@ public class ReaderView extends GenericCDIView {
}
super.beginConversation();
}
}
}*/
public boolean isReaderSelected() {
return this.readerid != null;
}
/*
public String assocToCard()
{
UserCardWrapper user = userlist.getRowData();
PrintedCard card = user.getPrintedCards().getRowData();
ReaderEvent re = readerbean.assocTagToCard(event.getValue(), event.getReader().getIdentification(), card);
ReaderEvent re = readerbean.assocTagToCard(event, card);
super.addFaceMessage("usercard.associated");
logger.info("re {}", re.getPrintedCard());
userview.setUser(re.getPrintedCard().getUser());
return "/useradmin/edit";
}
public String searchforuser()
}
public String searchforuser()
{
if (usersearch == null || usersearch.length() < 2) {
super.addFaceMessage("user.tooShortSearch");
......@@ -154,13 +143,11 @@ public class ReaderView extends GenericCDIView {
return null;
}
*/
public void initReaderList() {
if (super.requirePermissions(ShopPermission.SHOP_TO_OTHERS)) {
}
}
public List<Product> getAutoProducts() {
List<Product> ret = new ArrayList<Product>();
......@@ -184,7 +171,7 @@ public class ReaderView extends GenericCDIView {
public String saveReader()
{
reader = readerbean.saveReader(reader);
editReader = readerbean.saveReader(editReader);
return null;
}
......@@ -196,37 +183,7 @@ public class ReaderView extends GenericCDIView {
this.namecontainer = namecontainer;
}
public Integer getEventid() {
return eventid;
}
public void setEventid(Integer eventid) {
this.eventid = eventid;
}
public ReaderEvent getEvent() {
return event;
}
public void setEvent(ReaderEvent event) {
this.event = event;
}
public String getPlacecode() {
return placecode;
}
public void setPlacecode(String placecode) {
this.placecode = placecode;
}
public String getUsersearch() {
return usersearch;
}
public void setUsersearch(String usersearch) {
this.usersearch = usersearch;
}
public ListDataModel<UserCardWrapper> getUserlist() {
return userlist;
......@@ -235,14 +192,14 @@ public class ReaderView extends GenericCDIView {
public void setUserlist(ListDataModel<UserCardWrapper> userlist) {
this.userlist = userlist;
}
/*
public UserCardWrapper getNeighborUser() {
return neighborUser;
}
public void setNeighborUser(UserCardWrapper neighborUser) {
this.neighborUser = neighborUser;
}
}*/
public Integer getReaderid() {
return readerid;
......@@ -255,18 +212,10 @@ public class ReaderView extends GenericCDIView {
public String setReaderToId(Integer readerid) {
this.readerid = readerid;
this.namecontainer.setReaderId(readerid);
reader = readerbean.getReader(readerid);
editReader = readerbean.getReader(readerid);
return "/admin/info/index";
}
public Reader getReader() {
return reader;
}
public void setReader(Reader reader) {
this.reader = reader;
}
public UserView getUserview() {
return userview;
}
......@@ -280,29 +229,15 @@ public class ReaderView extends GenericCDIView {
return ReaderType.values();
}
public String getBarcode() {
if (pollingMode) {
ReaderEvent event = readerbean.getLastReaderEvent(namecontainer.getReaderId());
if (!event.equals(lastReadEvent)) {
return event.getValue();
}
}
if (readerEventList != null && readerEventList.isRowAvailable()) {
if (readerEventList.getRowData().getReader().getType() == ReaderType.BARCODE || readerEventList.getRowData().getReader().getType() == ReaderType.RFID) {
return readerEventList.getRowData().getValue();
}
}
return barcode;
}
public void setBarcode(String barcode) {
this.barcode = barcode;
}
public ReaderEvent getReaderEvent() {
if(pollingMode && isNewCodes()) {
pollingCodeHandled();
return readerbean.getLastReaderEvent(namecontainer.getReaderId());
}
if (readerEventList == null)
return null;
......@@ -313,61 +248,74 @@ public class ReaderView extends GenericCDIView {
return null;
}
/**
* If last barcode or rfid was associated to user, get it
*
* @return
*/
public PrintedCard getPrintedCard() {
PrintedCard card = barcodebean.getPrintedCard(getBarcode());
if (card == null && readerEventList != null && readerEventList.isRowAvailable()) {
card = readerEventList.getRowData().getPrintedCard();
}
return card;
}
public void initializeForPolling() {
// on polling mode, we do not use list, we use database and remember last readerEvent
this.pollingMode = true;
this.barcode = null;
lastReadEvent = readerbean.getLastReaderEvent(namecontainer.getReaderId());
}
public void pollingBarcodeHandled() {
public void pollingCodeHandled() {
lastReadEvent = readerbean.getLastReaderEvent(namecontainer.getReaderId());
}
public EventUser getUser() {
PrintedCard card = getPrintedCard();
public String saveUser() {
userview.saveUser();
if (card != null) {
return card.getUser();
}
return null;
}
public boolean isNewCodes() {
if (!pollingMode)
return false;
return userbean.getUserByBarcode(getBarcode());
return (!readerbean.getLastReaderEvent(namecontainer.getReaderId()).equals(lastReadEvent));
}
public void clearBarcode() {
this.barcode = null;
public String getUserInsertCode() {
return "";
}
public String saveUser() {
userview.saveUser();
public void setUserInsertCode(String userInsertCode) {
readerbean.checkCode(readerbean.getReader(readerid), userInsertCode);
}
return null;
public boolean isPollingMode() {
return pollingMode;
}
public boolean isNewBarcodes() {
if (!pollingMode)
return false;
public void setPollingMode(boolean pollingMode) {
if(!this.pollingMode && pollingMode) {
this.initializeForPolling();
}
this.pollingMode = pollingMode;
}
public void changeReader() {
namecontainer.setReaderId(null);
}
public Reader getCurrentReader() {
return readerbean.getReader(namecontainer.getReaderId());
}
return (!readerbean.getLastReaderEvent(namecontainer.getReaderId()).equals(lastReadEvent));
public Reader getEditReader() {
return editReader;
}
public void setEditReader(Reader editReader) {
this.editReader = editReader;
}
}
......@@ -25,8 +25,8 @@ import fi.codecrew.moya.model.Bill;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.LanEventProperty;
import fi.codecrew.moya.model.LanEventPropertyKey;
import fi.codecrew.moya.model.PrintedCard;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.model.ReaderEvent;
import fi.codecrew.moya.web.annotations.SelectedUser;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.cdiview.reader.ReaderView;
......@@ -425,24 +425,24 @@ public class ProductShopView extends GenericCDIView {
this.hasLimits = hasLimits;
}
public String readBarcode() {
public String readCode() {
PrintedCard card = readerView.getPrintedCard();
if (readerView.getBarcode() == null || readerView.getBarcode().trim().isEmpty()) {
ReaderEvent event = readerView.getReaderEvent();
if(event == null) {
return null;
}
if (card != null) {
if (card.getUser() != null) {
userView.setUser(card.getUser());
this.user = card.getUser();
if (event.getPrintedCard() != null) {
if (event.getPrintedCard().getUser() != null) {
userView.setUser(event.getPrintedCard().getUser());
this.user = event.getPrintedCard().getUser();
initShopView();
return null;
}
}
Product product = productBean.findByBarcode(readerView.getBarcode());
Product product = event.getProduct();
this.blip = false;
// find product index, set index and add one
......@@ -461,7 +461,7 @@ public class ProductShopView extends GenericCDIView {
}
n++;
}
readerView.clearBarcode();
logger.debug("barcode read");
return "success";
}
......
package fi.codecrew.moya.web.cdiview.shop;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.ReaderBeanLocal;
import fi.codecrew.moya.model.ReaderEvent;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
@Named
@RequestScoped
public class RfidView extends GenericCDIView {
/**
*
*/
private static final long serialVersionUID = -4013368780039067464L;
private String reader;
private String tag;
private String hash;
@EJB
private transient ReaderBeanLocal readerbean;
private static final Logger logger = LoggerFactory.getLogger(RfidView.class);
public void readTag() {
ReaderEvent revent = readerbean.checkTag(reader, tag);
logger.debug("at view Got readerevent from bean: {}", revent);
}
public String getReader() {
return reader;
}
public void setReader(String reader) {
this.reader = reader;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
public String getHash() {
return hash;
}
public void setHash(String hash) {
this.hash = hash;
}
}
......@@ -34,6 +34,7 @@ import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.model.CardTemplate;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.PrintedCard;
import fi.codecrew.moya.model.ReaderEvent;
import fi.codecrew.moya.model.Role;
import fi.codecrew.moya.model.User;
import fi.codecrew.moya.model.UserImage;
......@@ -347,30 +348,26 @@ public class UserView extends GenericCDIView {
*
* @return
*/
public String attachBarcodeToCard() {
PrintedCard card = readerView.getPrintedCard();
public String attachCodeToCard() {
return attachCodeToCard(readerView.getReaderEvent());
}
public String attachCodeToCard(ReaderEvent event ) {
if(event == null)
return null;
// already attached
if (card != null) {
if (event.getPrintedCard() != null) {
super.addFaceMessage("usercard.alreadyassociated");
return null;
}
// still there, we can get real card and update it's barcodes
card = cardBean.checkPrintedCard(user);
if (readerView.getBarcode() != null && !readerView.getBarcode().isEmpty()) {
card.setBarcode(readerView.getBarcode());
card.setCardState(CardState.PRINTED);
//super.addFaceMessage("usercard.associated");
MessageHelper.info("usercard.associated");
logger.debug("barcode {} to card {} ", readerView.getBarcode(), card.getUser().getNick());
cardBean.saveCard(card);
} else if (readerView.getReaderEvent() != null) {
readerbean.assocTagToCard(readerView.getReaderEvent().getValue(), readerView.getReaderEvent().getReader().getIdentification(), card);
}
PrintedCard card = cardBean.checkPrintedCard(user);
readerbean.assocCodeToCard(event , card);
return null;
}
......
......@@ -24,6 +24,7 @@ import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.GroupMembership;
import fi.codecrew.moya.model.PrintedCard;
import fi.codecrew.moya.model.ReaderEvent;
import fi.codecrew.moya.util.UserSearchQuery;
import fi.codecrew.moya.utilities.SearchResult;
import fi.codecrew.moya.web.annotations.SelectedUser;
......@@ -130,7 +131,7 @@ public class IncomingView extends GenericCDIView {
if (!initialized) {
logger.debug("INITIALIZING!!!!");
initializePoller();
//initializePoller();
initialized = true;
super.beginConversation();
}
......@@ -146,9 +147,7 @@ public class IncomingView extends GenericCDIView {
return null;
}
public void initializePoller() {
readerView.initializeForPolling();
}
public String changeToIncomingView() {
//super.navihandler.redirectNavigation("printCard.jsf?userid="+user.getUser().getId());
......@@ -157,13 +156,14 @@ public class IncomingView extends GenericCDIView {
public void polledRead() {
if (!readerView.isNewBarcodes()) {
ReaderEvent event = readerView.getReaderEvent();
if(event == null)
return;
}
logger.debug(":Barcode:");
logger.debug(":got.code:");
EventUser user = readerView.getUser();
EventUser user = event.getUser();
if (user != null) {
if (!user.equals(userview.getUser())) {
logger.info("found user {}, redirecting", user.getNick());
......@@ -177,16 +177,17 @@ public class IncomingView extends GenericCDIView {
// still there, it must be "clean" barcode
if (userview.getUser() != null) {
userview.attachBarcodeToCard();
userview.attachCodeToCard(event);
}
}
readerView.pollingBarcodeHandled();
}
public String selectUser() {
EventUser user = readerView.getUser();
ReaderEvent event = readerView.getReaderEvent();
EventUser user = event.getUser();
memberlist = null;
if (user == null) {
......@@ -250,10 +251,6 @@ public class IncomingView extends GenericCDIView {
}
public void changeReader() {
namecontainer.setReaderId(null);
super.navihandler.redirectNavigation("index.jsf");
}
......
......@@ -8,6 +8,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.ReaderEvent;
import fi.codecrew.moya.web.annotations.SelectedUser;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.cdiview.reader.ReaderView;
......@@ -41,7 +42,13 @@ public class InfoView extends GenericCDIView {
}
public String selectUser() {
EventUser user = readerView.getUser();
ReaderEvent event = readerView.getReaderEvent();
if(event == null)
return null;
EventUser user = event.getUser();
if(user == null) {
return null;
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!