VipBean.java 4.02 KB
package fi.codecrew.moya.beans;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.EJBAccessException;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;

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

import fi.codecrew.moya.enums.apps.VipPermission;
import fi.codecrew.moya.facade.VipFacade;
import fi.codecrew.moya.facade.VipProductDeliveryFacade;
import fi.codecrew.moya.facade.VipProductFacade;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.Vip;
import fi.codecrew.moya.model.VipProduct;
import fi.codecrew.moya.model.VipProductDelivery;
import fi.codecrew.moya.utilities.SearchQuery;
import fi.codecrew.moya.utilities.SearchResult;

@Stateless
@LocalBean
@DeclareRoles({
		VipPermission.S_VIEW,
		VipPermission.S_USAGE,
		VipPermission.S_EDIT
})
public class VipBean implements VipBeanLocal {

	private static final Logger log = LoggerFactory.getLogger(VipBean.class);

	//@EJB
	//private PermissionBeanLocal permissionBean;
	@EJB
	private VipFacade vipFacade;

	@EJB
	private PermissionBeanLocal permbean;

	@EJB
	private EventBeanLocal eventbean;
	@EJB
	private VipProductFacade vipProductFacade;
	@EJB
	private VipProductDeliveryFacade vpdFacade;

	@Override
	@RolesAllowed({ VipPermission.S_VIEW })
	public List<Vip> getAvailableVips() {
		return vipFacade.findForEvent();
	}

	@Override
	@RolesAllowed({ VipPermission.S_EDIT })
	public void create(List<Vip> vipList) {
		for (Vip v : vipList) {
			create(v);
		}
	}

	@Override
	@RolesAllowed({ VipPermission.S_EDIT })
	public void create(Vip vip) {
		vip.setCreated(new Date());
		vip.setCreator(permbean.getCurrentUser());
		vip.setEvent(eventbean.getCurrentEvent());
		if (vip.getHost() == null) {
			vip.setHost(vip.getCreator());
		}
		checkEvent(vip);

		vipFacade.create(vip);

	}

	@Override
	@RolesAllowed({ VipPermission.S_EDIT })
	public void delete(Vip vip) {
		vip = vipFacade.reload(vip);
		checkEvent(vip);
		vipFacade.remove(vip);
	}

	private void checkEvent(Vip vip) {
		if(!eventbean.getCurrentEvent().equals(vip.getEvent())){
			throw new EJBAccessException("VIP entry from wrong event!");
		}
		
	}

	@Override
	@RolesAllowed({ VipPermission.S_VIEW })
	public Vip find(Integer id) {

		Vip ret = vipFacade.find(id);
		checkEvent(ret);
		return ret;
	}

	//	@Override
	//	public SearchResult<Vip> search(SearchQuery sq) {
	//		// TODO Auto-generated method stub
	//		return null;
	//	}

	@Override
	@RolesAllowed({ VipPermission.S_EDIT })
	public Vip createProduct(VipProduct l) {
		Vip vip = vipFacade.reload(l.getVip());
		checkEvent(vip);
		l.setVip(vip);
		if (!vip.getProducts().contains(l))
			vip.getProducts().add(0, l);

		vipProductFacade.create(l);

		return vip;
	}

	@Override
	@RolesAllowed({ VipPermission.S_VIEW })
	public SearchResult<Vip> search(SearchQuery sq) {
		return vipFacade.search(sq);
	}

	@Override
	@RolesAllowed({ VipPermission.S_EDIT })
	public Vip save(Vip vip) {
		Vip ret = vipFacade.merge(vip);
		checkEvent(ret);
		return ret;
	}

	@Override
	@RolesAllowed({ VipPermission.S_EDIT })
	public Vip saveProduct(VipProduct prod) {
		VipProduct ret = vipProductFacade.merge(prod);
		checkEvent(ret.getVip());

		return ret.getVip();
	}

	@Override
	@RolesAllowed({ VipPermission.S_EDIT })
	public Vip deleteProduct(VipProduct l) {
		l = vipProductFacade.reload(l);
		Vip vip = l.getVip();
		checkEvent(vip);
		vip.getProducts().remove(l);
		vipProductFacade.remove(l);
		return vip;
	}

	@Override
	@RolesAllowed({ VipPermission.S_USAGE })
	public VipProductDelivery createDelivery(VipProduct prod, BigDecimal quantity, String notes) {
		prod = vipProductFacade.reload(prod);
		checkEvent(prod.getVip());
		VipProductDelivery vpd = new VipProductDelivery();
		vpd.setVipProduct(prod);

		vpd.setDeliverer(permbean.getCurrentUser());
		vpd.setNotes(notes);
		vpd.setDeliveryTime(new Date());
		vpd.setQuantity(quantity);

		vpdFacade.create(vpd);
		prod.getDeliveries().add(vpd);

		return vpd;
	}


}