AccountEventBean.java 4.42 KB
package fi.insomnia.bortal.beans;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.ejb.Stateless;

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

import fi.insomnia.bortal.enums.apps.ShopPermission;
import fi.insomnia.bortal.enums.apps.SpecialPermission;
import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.facade.AccountEventFacade;
import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.Product;
import fi.insomnia.bortal.model.ProductFlag;
import fi.insomnia.bortal.model.Role;

/**
 * Session Bean implementation class AccountEventBean
 */
@Stateless
@DeclareRoles({ UserPermission.S_VIEW_ACCOUNTEVENTS, SpecialPermission.S_USER })
public class AccountEventBean implements AccountEventBeanLocal {

	@EJB
	private AccountEventFacade accountfacade;

	@EJB
	private UserBeanLocal userbean;
	@EJB
	private LoggingBeanLocal loggingbean;
	@EJB
	private EventBeanLocal eventBean;
	@EJB
	private ProductBeanLocal prodbean;
	@EJB
	private PlaceBean placebean;
	@EJB
	private PermissionBeanLocal permbean;

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

	public AccountEventBean() {
		super();
	}

	@Override
	@RolesAllowed(UserPermission.S_MODIFY_ACCOUNTEVENTS)
	public AccountEvent merge(AccountEvent account) {
		return accountfacade.merge(account);
	}

	@Override
	@RolesAllowed(UserPermission.S_MODIFY_ACCOUNTEVENTS)
	public EventUser delete(AccountEvent account) {

		AccountEvent acco = accountfacade.reload(account);
		EventUser ret = acco.getUser();
		loggingbean.logMessage(SecurityLogType.accountEvent, permbean.getCurrentUser(), "Deleting AccountEvent '", acco.getProduct().getName(), "' count: '", acco.getQuantity().toString(), "' unitprice: '", acco.getUnitPrice().toString(), "' accouser: '", acco.getUser().getUser().getLogin(), "'");
		acco.getProduct().getAccountEvents().remove(acco);
		acco.getUser().getAccountEvents().remove(acco);
		if (acco.getBill() != null) {
			acco.getBill().setAccountEvent(null);
		}

		accountfacade.remove(acco);
		return ret;
	}

	@Override
	public AccountEvent find(Integer id) {
		return accountfacade.find(id);
	}

	@Override
	public List<Role> getRolesFromAccountEvents(EventUser u) {
		return accountfacade.findProvidedRoles(eventBean.getCurrentEvent(), u);
	}

	/**
	 * Create accountevents for the products in the parameter shopMap
	 */
	@Override
	@RolesAllowed(ShopPermission.S_SHOP_PRODUCTS)
	public void shopCash(EventUser shoppingUser, Map<Product, BigDecimal> shopMap, boolean buyInstant) {
		logger.debug("Shoping cash. buyinstant {}", buyInstant);
		EventUser seller = permbean.getCurrentUser();
		shoppingUser = userbean.findByEventUserId(shoppingUser.getId());

		BigDecimal tot = BigDecimal.ZERO;

		for (Entry<Product, BigDecimal> prodentry : shopMap.entrySet()) {

			// Create account event for the product.
			AccountEvent ac = new AccountEvent(shoppingUser, prodentry.getKey(), prodentry.getKey().getPrice(), prodentry.getValue(), Calendar.getInstance());
			ac.setSeller(seller);
			accountfacade.create(ac);

			if (buyInstant && prodentry.getKey().getPrice().compareTo(BigDecimal.ZERO) > 0) {
				tot = tot.add(prodentry.getValue().multiply(prodentry.getKey().getPrice()));
			}

			if (prodentry.getKey().getProductFlags().contains(ProductFlag.RESERVE_PLACE_WHEN_BOUGHT) || prodentry.getKey().getProductFlags().contains(ProductFlag.CREATE_NEW_PLACE_WHEN_BOUGHT)) {
				logger.debug("Prepaidplace");

				placebean.lockPlaceProduct(shoppingUser, prodentry.getKey(), BigDecimal.ONE);

			}

		}

		logger.debug("ShopCash price {}", tot);
		if (buyInstant && tot.compareTo(BigDecimal.ZERO) > 0) {
			logger.debug("Creating buy instant product!");
			Product creditProd = prodbean.findCreditProduct();
			AccountEvent ac = new AccountEvent(shoppingUser, creditProd, creditProd.getPrice(), tot, Calendar.getInstance());
			accountfacade.create(ac);
		}

		userbean.mergeEventUserChanges(shoppingUser);

	}

	@Override
	public AccountEvent markDelivered(AccountEvent e, Calendar c) {
		e = accountfacade.reload(e);
		if (e.getDelivered() != null)
		{
			throw new EJBException("AccountEvent " + e + " already marked paid!");
		}
		e.setDelivered(c);

		return e;
	}

}