ReaderView.java 8.57 KB
package fi.codecrew.moya.web.cdiview.reader;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.faces.model.ListDataModel;
import javax.inject.Inject;
import javax.inject.Named;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.codecrew.moya.beans.BarcodeBeanLocal;
import fi.codecrew.moya.beans.ProductBeanLocal;
import fi.codecrew.moya.beans.ReaderBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.enums.apps.ShopPermission;
import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.model.EventUser;
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.ReaderType;
import fi.codecrew.moya.model.Role;
import fi.codecrew.moya.model.User;
import fi.codecrew.moya.utilities.SearchQuery;
import fi.codecrew.moya.utilities.SearchQuery.QuerySortOrder;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.cdiview.shop.UserCardWrapper;
import fi.codecrew.moya.web.cdiview.user.UserView;

@Named
@ConversationScoped
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;

	@Inject
	private ReaderNameContainer namecontainer;

	@EJB
	private transient ReaderBeanLocal readerbean;

	private ReaderEvent event;

	@EJB
	private transient UserBeanLocal userbean;

	@EJB
	private transient BarcodeBeanLocal barcodebean;

	private UserCardWrapper neighborUser;

	private static final Logger logger = LoggerFactory.getLogger(ReaderView.class);

	private Integer readerid;
	@EJB
	private ProductBeanLocal shopBean;

	@Inject
	private UserView userview;

	public void initEditReader() {
		if (super.requirePermissions(ShopPermission.SHOP_TO_OTHERS) && reader == null) {
			reader = 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);
	}

	public boolean isShopToOthers()
	{
		return super.hasPermission(ShopPermission.SHOP_TO_OTHERS);
	}

	public void initCreateReader()
	{
		if (super.requirePermissions(ShopPermission.SHOP_TO_OTHERS) && reader == null)
		{
			reader = new Reader();
			super.beginConversation();
		}
	}

	public String createReader()
	{
		readerbean.createReader(reader);
		namecontainer.setReaderId(reader.getId());
		return "/shop/showReaderEvents";
	}

	public void initUserassocView() {
		if (super.requirePermissions(UserPermission.CREATE_NEW) && event == null) {
			event = readerbean.getEvent(eventid);
			if (event.getPrintedCard() == null) {
				User neigUser = readerbean.findTagFromAnyEvent(event.getValue());
				setNeighborUser(new UserCardWrapper(neigUser, userbean));
			}
			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);
		super.addFaceMessage("usercard.associated");
		logger.info("re {}", re.getPrintedCard());
		userview.setUser(re.getPrintedCard().getUser());
		return "/useradmin/edit";
	}

	public String searchforuser()
	{
		if (usersearch == null || usersearch.length() < 2) {
			super.addFaceMessage("user.tooShortSearch");
		} else {
			userlist = UserCardWrapper.initWrapper(userbean.getUsers(new SearchQuery(0, 20, null, usersearch, QuerySortOrder.DESCENDING)).getResults(), userbean);
		}

		return null;
	}

	public void initReaderList() {
		if (super.requirePermissions(ShopPermission.SHOP_TO_OTHERS)) {

		}
	}

	public List<Product> getAutoProducts() {

		List<Product> ret = new ArrayList<Product>();
		ret.add(Product.EMPTY_PRODUCT);
		ret.addAll(shopBean.getProducts());
		return ret;

	}

	public ReaderType[] getReadertypes()
	{
		return ReaderType.values();
	}

	public ListDataModel<ReaderEvent> getReaderEvents()
	{
		readerEventList = new ListDataModel<ReaderEvent>(readerbean.getReaderEvents(namecontainer.getReaderId()));

		return readerEventList;
	}

	public String saveReader()
	{
		reader = readerbean.saveReader(reader);
		return null;
	}

	public ReaderNameContainer getNamecontainer() {
		return namecontainer;
	}

	public void setNamecontainer(ReaderNameContainer namecontainer) {
		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;
	}

	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;
	}

	public void setReaderid(Integer readerid) {
		this.readerid = readerid;
	}

	public String setReaderToId(Integer readerid) {
		this.readerid = readerid;
		this.namecontainer.setReaderId(readerid);
		reader = 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;
	}

	public void setUserview(UserView userview) {
		this.userview = userview;
	}

	public ReaderType[] getReaderTypes()
	{
		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 (readerEventList == null)
			return null;

		if (readerEventList.isRowAvailable()) {
			return readerEventList.getRowData();
		}

		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() {
		lastReadEvent = readerbean.getLastReaderEvent(namecontainer.getReaderId());
	}

	public EventUser getUser() {
		PrintedCard card = getPrintedCard();

		if (card != null) {
			return card.getUser();
		}

		return userbean.getUserByBarcode(getBarcode());
	}

	public void clearBarcode() {
		this.barcode = null;
	}

	public String saveUser() {
		userview.saveUser();

		return null;
	}

	public boolean isNewBarcodes() {

		if (!pollingMode)
			return false;

		return (!readerbean.getLastReaderEvent(namecontainer.getReaderId()).equals(lastReadEvent));
	}

}