PlaceView.java 5.7 KB
package fi.codecrew.moya.web.cdiview.map;

import java.math.BigDecimal;
import java.util.Map;

import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
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.AccountEventBeanLocal;
import fi.codecrew.moya.beans.PlaceBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.enums.apps.MapPermission;
import fi.codecrew.moya.exceptions.BortalCatchableException;
import fi.codecrew.moya.model.EventMap;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Place;
import fi.codecrew.moya.model.PlaceGroup;
import fi.codecrew.moya.model.User;
import fi.codecrew.moya.utilities.SearchQuery;
import fi.codecrew.moya.web.annotations.SelectedUser;
import fi.codecrew.moya.web.cdiview.GenericCDIView;

@Named
@ConversationScoped
public class PlaceView extends GenericCDIView {

	/**
	 * 
	 */
	private static final long serialVersionUID = -6975041831787940421L;
	private static final Logger logger = LoggerFactory.getLogger(PlaceView.class);

	private Integer placeId;
	private Place place;

	@EJB
	private transient UserBeanLocal userbean;

	@EJB
	private transient PlaceBeanLocal placebean;

	@Inject
	@SelectedUser
	private EventUser user;

	@Inject
	private EventMap currentMap;

	private String searchuser;
	private transient ListDataModel<User> userlist;
	@EJB
	private transient AccountEventBeanLocal acbean;

	public boolean canEdit() {
		return permbean.hasPermission(MapPermission.MANAGE_MAPS);
	}

	public String buySelectedPlaces() {
		try {
			placebean.buySelectedPlaces(user);
			return "/place/myGroups";
		} catch (BortalCatchableException e) {
			addFaceMessage("mapView.errorWhileBuyingPlaces");
		}
		return null;
	}

	public void placeSelectActionListener(ActionEvent e) {
		super.beginConversation();

		FacesContext context = FacesContext.getCurrentInstance();
		String clientId = e.getComponent().getClientId(context);

		Map<String, String> requestParams = context.getExternalContext().getRequestParameterMap();
		logger.info("Requestmap for clientId {}: {}", clientId, requestParams);
		int x = new Integer(requestParams.get(clientId + ".x")).intValue();
		int y = new Integer(requestParams.get(clientId + ".y")).intValue();
		logger.debug("Clicked position {} {}", x, y);

		place = placebean.findPlace(getCurrentMap(), x, y);
		logger.debug("Clicked place: {}", place);

		//Don't try to calculate stuff is not logged in
		if (permbean.isLoggedIn() && place != null) {

			logger.info("placeinfo User {}, group {}", place.getCurrentUser(), place.getGroup());

			if (place.isReservedFor(user)) {
				logger.info("Place {} was reserved for user. Removing reservation!", place);
				if (!placebean.releasePlace(place)) {
					this.addFaceMessage("mapView.errorWhenReleasingPlace");
				}

			} else if (place.isBuyable() && !place.isTaken()) {

				BigDecimal balance = user.getAccountBalance();
				BigDecimal price = null;

				if (permbean.isCurrentUser(user)) {
					price = placebean.getTotalReservationPrice(place);
				} else {
					price = placebean.getTotalReservationPrice(user, place);
				}
				logger.debug("Balance {}, price {}", balance, price);
				if (price.compareTo(balance) <= 0) {
					logger.debug("Place was free. Marking for user.");
					if (!placebean.reservePlace(place, user)) {
						this.addFaceMessage("mapView.errorWhenReservingPlace");
					}
					
				} else {
					if (balance.compareTo(BigDecimal.ZERO) > 0) {
						addFaceMessage("mapView.notEnoughCreditsToReserve");
					}
					logger.debug("Did not have enought credits to reserve place! required {} , got {}", price, balance);
				}
			}
		}
		logger.debug("Done calling PlaceSelectActionListener");
	}

	public void initView() {
		if (super.requirePermissions(MapPermission.MANAGE_OTHERS)) {
			if (getPlaceId() != null) {
				this.place = placebean.find(getPlaceId());
			}
			beginConversation();
		}

	}

	public String reserveForUser() {

		try {
			EventUser user = userbean.getEventUser(userlist.getRowData());
			if (placebean.reservePlace(place, user)) {
				PlaceGroup newgroup = placebean.buySelectedPlaces(user);
				for (Place p : newgroup.getPlaces()) {
					if (p.equals(place)) {
						place = p;
					}
				}
			}

		} catch (BortalCatchableException e) {
			super.addFaceMessage("Error reserving place for user");
		}

		searchuser = null;
		userlist = null;
		return null;
	}

	public String searchUser() {
		super.beginConversation();
		userlist = new ListDataModel<User>(userbean.getUsers(new SearchQuery(0, 0, null, searchuser, false)).getResults());
		return null;
	}

	public Place getPlace() {
		return place;
	}

	public String releasePlace() {

		if (!placebean.releasePlace(place)) {
			logger.debug("Error releasing place.");
		}
		return null;
	}

	public String removePlaceFromGroup() {

		place = placebean.unbuyPlace(place);
		addFaceMessage("place.unbought", place.getName());

		return null;
	}

	public String save() {
		placebean.mergeChanges(place);
		super.addFaceMessage("place.saved");
		return null;
	}

	public void setSearchuser(String searchuser) {
		this.searchuser = searchuser;
	}

	public String getSearchuser() {
		return searchuser;
	}

	public void setUserlist(ListDataModel<User> userlist) {
		this.userlist = userlist;
	}

	public ListDataModel<User> getUserlist() {
		return userlist;
	}

	public void setCurrentMap(EventMap currentMap) {
		this.currentMap = currentMap;
	}

	public EventMap getCurrentMap() {
		return currentMap;
	}

	public void setPlaceId(Integer placeId) {
		this.placeId = placeId;
	}

	public Integer getPlaceId() {
		return placeId;
	}
}