StatisticsBean.java 3.48 KB
/*
 * Copyright Codecrew Ry
 * 
 * All rights reserved.
 * 
 * This license applies to any software containing a notice placed by the 
 * copyright holder. Such software is herein referred to as the Software. 
 * This license covers modification, distribution and use of the Software. 
 * 
 * Any distribution and use in source and binary forms, with or without 
 * modification is not permitted without explicit written permission from the 
 * copyright owner. 
 * 
 * A non-exclusive royalty-free right is granted to the copyright owner of the 
 * Software to use, modify and distribute all modifications to the Software in 
 * future versions of the Software. 
 * 
 */
package fi.codecrew.moya.beans;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

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

import fi.codecrew.moya.enums.apps.EventPermission;
import fi.codecrew.moya.facade.GroupMembershipFacade;
import fi.codecrew.moya.facade.PlaceSlotFacade;
import fi.codecrew.moya.facade.PrintedCardFacade;
import fi.codecrew.moya.model.GroupMembership;
import fi.codecrew.moya.model.Product;

/**
 * Session Bean implementation class FoodWaveBean
 */
@Stateless
@DeclareRoles({ EventPermission.S_VIEW_STATISTICS })
public class StatisticsBean implements StatisticsBeanLocal {

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

	@EJB
	GroupMembershipFacade groupMembershipFacade;

	@EJB
	PrintedCardFacade printedCardFacade;

	@EJB
	private PlaceSlotFacade psfacade;

	@EJB
	private ProductBeanLocal prodbean;

	@Override
	@RolesAllowed(EventPermission.S_VIEW_STATISTICS)
	public Long getGroupMembershipsEnteredEvent() {
		return groupMembershipFacade.findGroupMembershipsEnteredCount();
	}

	@Override
	@RolesAllowed(EventPermission.S_VIEW_STATISTICS)
	public Long getCardDeliveredCount() {
		return printedCardFacade.findDeliveredCardCount();
	}

	@Override
	@RolesAllowed(EventPermission.S_VIEW_STATISTICS)
	public Long getGroupMembershipsTotalCount() {
		return groupMembershipFacade.findGroupMembershipsCount();
	}

	@Override
	public Map<Long, Long> getHourlyIncomingStatistics(long startingFromMillis, int hourCount) {
		List<GroupMembership> groupMemberships = groupMembershipFacade.findAllEnteredBetween(startingFromMillis, (startingFromMillis + ((long) hourCount) * 60l * 60l * 1000l));

		HashMap<Long, Long> retMap = new HashMap<>();

		long currentTimestamp = startingFromMillis;
		long hour = (60l * 60l * 1000l);
		long hourEntered = 0;

		for (GroupMembership gm : groupMemberships) {

			// find the hour this one belongs to (sometime we need to skip empty hours)
			while (gm.getEnteredEvent().getTimeInMillis() > currentTimestamp + hour) {

				retMap.put(currentTimestamp, hourEntered);
				hourEntered = 0;

				currentTimestamp += hour;
			}

			hourEntered++;
		}

		return retMap;
	}

	@Override
	public List<ProductSlotcountMover> getUnusedSlots(boolean onlyPaid) {

		List<ProductSlotcountMover> ret = new ArrayList<>();
		for (Product p : prodbean.getProducts()) {
			logger.info("Products for stats {}", p);
			ProductSlotcountMover m = new ProductSlotcountMover(p);
			m.setUnusedSlots(psfacade.findUnusedSlotsCount(p, onlyPaid));
			m.setTotalSlots(psfacade.totalSlotcount(p, onlyPaid));
			if (m.getTotalSlots() > 0 && m.getUnusedSlots() > 0) {
				ret.add(m);
			}
		}
		return ret;
	}
}