PlaceGroupBean.java 10.4 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.io.OutputStream;
import java.util.ArrayList;
import java.util.Calendar;
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.Stateless;

import fi.codecrew.moya.model.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.pdfjet.A4;
import com.pdfjet.CoreFont;
import com.pdfjet.Font;
import com.pdfjet.Image;
import com.pdfjet.ImageType;
import com.pdfjet.PDF;
import com.pdfjet.Page;
import com.pdfjet.TextLine;

import fi.codecrew.moya.enums.apps.MapPermission;
import fi.codecrew.moya.enums.apps.SpecialPermission;
import fi.codecrew.moya.facade.EventUserFacade;
import fi.codecrew.moya.facade.GroupMembershipFacade;
import fi.codecrew.moya.facade.PlaceGroupFacade;
import fi.codecrew.moya.utilities.BarcodeUtils;
import fi.codecrew.moya.utilities.moyamessage.MoyaEventType;

/**
 * Session Bean implementation class PlaceGroupBean
 */
@Stateless
@DeclareRoles({ SpecialPermission.S_USER, MapPermission.S_BUY_PLACES, MapPermission.S_MANAGE_MAPS })
public class PlaceGroupBean implements PlaceGroupBeanLocal {

	private static final Logger logger = LoggerFactory.getLogger(PlaceGroupBean.class);
	private static final int YSTART = 30;
	@EJB
	private EventBeanLocal eventbean;

	@EJB
	private BarcodeBeanLocal barcodeBean;

	@EJB
	private GroupMembershipFacade gmemfacade;
	@EJB
	private LoggingBeanLocal loggingbean;

	@EJB
	private PermissionBeanLocal permbean;
	@EJB
	private LoggingBeanLocal loggerbean;
	@EJB
	private PlaceGroupFacade pgfacade;
	@EJB
	private EventUserFacade eventuserfacade;

	/**
	 * Default constructor.
	 */
	public PlaceGroupBean() {
		// TODO Auto-generated constructor stub
	}

	// @Override
	// public PlaceGroup createPlaceGroup(User creator) {
	// }

	// @Override
	// public GroupMembership createGroupMembership(PlaceGroup pg, Place p) {
	//
	// GroupMembership membership = new
	// GroupMembership(eventbean.getCurrentEvent(), pg, p,
	// gmemfacade.createInviteToken());
	// gmemfacade.create(membership);
	// return membership;
	// }

	@Override
	@RolesAllowed({ SpecialPermission.S_USER, MapPermission.S_MANAGE_MAPS })
	public List<GroupMembership> getMembershipsAndCreations(EventUser user) {
		if (user == null) {
			user = permbean.getCurrentUser();
		} else if (!permbean.isCurrentUser(user) && !permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
			throw new EJBAccessException("No permission to get group memberships!");
		}
		List<GroupMembership> ret = gmemfacade.findMemberOrCreator(user);
		return ret;
	}

	@Override
	@RolesAllowed({ SpecialPermission.S_USER, MapPermission.S_MANAGE_MAPS })
	public List<GroupMembership> getMemberships(EventUser user) {
		if (user == null) {
			user = permbean.getCurrentUser();
		} else if (!permbean.isCurrentUser(user) && !permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
			throw new EJBAccessException("No permission to get group memberships!");
		}
		List<GroupMembership> ret = gmemfacade.findMemberships(user);
		return ret;
	}

	@Override
	@RolesAllowed(MapPermission.S_BUY_PLACES)
	public boolean associateToToken(EventUser user, String token) {
		user = eventuserfacade.reload(user);
		if (!permbean.isCurrentUser(user) && !permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
			throw new EJBAccessException();
		}

		token = token.trim();
		GroupMembership mem = gmemfacade.findByToken(token);
		boolean ret = false;

		if (mem != null && mem.getUser() == null) {

			loggerbean.sendMessage(MoyaEventType.INVITE_ACCEPTED, user, "Moya place accepted by user. ", mem);

			// change token, just in case
			mem.setInviteToken(gmemfacade.createInviteToken());

			mem.setUser(user);
			// gmemfacade.merge(mem);
			ret = true;
		}

		return ret;

	}

	@Override
	@RolesAllowed({ SpecialPermission.S_USER, MapPermission.S_MANAGE_MAPS })
	public void getGroupMembershipPdf(EventUser usr, OutputStream ostream) {
		List<GroupMembership> memberships = getMembershipsAndCreations(usr);


		boolean placecodeFromUser = eventbean.getPropertyBoolean(LanEventPropertyKey.PLACECODE_FROM_USER);

		boolean printOnlyOwn = eventbean.getPropertyBoolean(LanEventPropertyKey.PLACECODE_PRINT_ONLY_OWN);


		try {
			PDF pdf = new PDF(ostream);
			Font font = new Font(pdf, CoreFont.TIMES_ROMAN);
			Font bigfont = new Font(pdf, CoreFont.TIMES_ROMAN);
			bigfont.setSize(15);

			Font titlefont = new Font(pdf, CoreFont.TIMES_ROMAN);
			titlefont.setSize(20);

			Page page = new Page(pdf, A4.PORTRAIT);
			int y = YSTART;

			String titletext = "Lipputositteet";

			if (printOnlyOwn || memberships.size() <= 1) {
				titletext = "Lipputosite";
			}

			TextLine topic = new TextLine(titlefont, titletext);
			topic.setPosition(230, y);
			topic.drawOn(page);

			y += 30;

			for (GroupMembership membership : memberships) {

				if (y > 750) {
					page = new Page(pdf, A4.PORTRAIT);
					y = YSTART;
				}

				if (printOnlyOwn && (membership.getUser() == null || !membership.getUser().equals(usr))) {
					continue;
				}

				//
				// PNGImage jpeg = new
				// PNGImage(BarcodeBean.getBarcode(membership.getInviteToken()));
				// logger.debug("Jpeg: " + jpeg.getWidth() + " h. " +
				// jpeg.getHeight());

				if (placecodeFromUser) {
					if (membership.getUser() != null) {
						Image image = new Image(pdf, barcodeBean.getUserBarcode(membership.getUser()), ImageType.PNG);
						image.scaleBy(0.8);
						image.setPosition(50, y);
						image.drawOn(page);
					} else {
						TextLine nouser = new TextLine(bigfont, "EMPTY PLACE");
						nouser.setPosition(85, y + 10);
						nouser.drawOn(page);
					}
				} else {
					Image image = new Image(pdf, BarcodeUtils.getBarcode(membership.getInviteToken()), ImageType.PNG);
					image.scaleBy(0.8);
					image.setPosition(50, y);
					image.drawOn(page);
				}

				StringBuilder sb = new StringBuilder();
				if (membership.getPlaceReservation().getName() != null)
				{
					sb.append(membership.getPlaceReservation().getName());
					sb.append(" - ");
				}
				sb.append(membership.getPlaceReservation().getProduct().getName());

				TextLine name = new TextLine(bigfont, sb.toString());
				name.setPosition(300, y + 10);
				name.drawOn(page);

				TextLine reserverLabel = new TextLine(font, "Varaaja: ");
				reserverLabel.setPosition(300, y + 30);
				reserverLabel.drawOn(page);

				User creator = membership.getPlaceGroup().getCreator().getUser();
				TextLine reserver = new TextLine(font, new StringBuilder(creator.getWholeName()).append(" (").append(creator.getNick()).append(")").toString());
				reserver.setPosition(310, y + 45);
				reserver.drawOn(page);

				TextLine assoclabel = new TextLine(font, "Yhdistetty käyttäjään: ");
				assoclabel.setPosition(300, y + 65);
				assoclabel.drawOn(page);

				TextLine assoc = new TextLine(font, ((membership.getUser() == null) ? "-----" : new StringBuilder(membership.getUser().getUser().getWholeName()).append(" (").append(membership.getUser().getUser().getNick()).append(")").toString()));
				assoc.setPosition(310, y + 80);
				assoc.drawOn(page);

				y += 130;
			}

			if (y > 750) {
				page = new Page(pdf, A4.PORTRAIT);
				y = YSTART;
			}

			String footertext = "Nämä lipputositteenne tulee olla tulostettuna paperille kun saavutte tapahtumaan.";

			if (printOnlyOwn || memberships.size() <= 1) {
				footertext = "Tämä henkilökohtainen lipputositteesi tulee olla mukana tulostettuna paperille kun saavut tapahtumaan.";
			}

			TextLine footer = new TextLine(font, footertext);
			footer.setPosition(50, y);
			footer.drawOn(page);

			pdf.flush();
		} catch (Exception e) {
			logger.info("Error getting printing group memberships", e);
		}

	}

	@Override
	@RolesAllowed({ SpecialPermission.S_USER, MapPermission.S_MANAGE_MAPS })
	public void releaseAndGenerateToken(GroupMembership gmem) {
	
		if(gmem.getEnteredEvent() != null && !permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
			throw new EJBAccessException("Token already entered to event, Not enough rights to release token.");
		}
		
		gmem = gmemfacade.reload(gmem);
		
		if (!(permbean.getCurrentUser().getId().equals(gmem.getPlaceGroup().getCreator().getId()) || permbean.hasPermission(MapPermission.MANAGE_OTHERS))) {
			loggerbean.sendMessage(MoyaEventType.PLACE_ERROR, permbean.getCurrentUser(), "User tried to release and generate group membership: " + gmem);
			throw new EJBAccessException("Not enough rights to release token");
		}
		gmem.setUser(null);
		gmem.setInviteEmail(null);
		gmem.setInviteName(null);
		gmem.setInviteToken(gmemfacade.createInviteToken());
		logger.info("Place released. {} new token {}", gmem.getInviteToken());
	}

	@Override
	@RolesAllowed({ SpecialPermission.S_USER, MapPermission.S_MANAGE_MAPS })
	public List<PlaceGroup> getPlacegroups(EventUser user) {
		return pgfacade.find(user);
	}

	@Override
	public void markGrouMembershipEntered(GroupMembership membership) {
		membership.setEnteredEvent(Calendar.getInstance());
		membership = gmemfacade.merge(membership);
	}

	@Override
	public void markGrouMembershipNotEntered(GroupMembership membership) {
		membership.setEnteredEvent(null);
		membership = gmemfacade.merge(membership);

	}

	@Override
	public List<GroupMembership> findMembershipPrintlistForUser(EventUser user) {

		// TODO: get from placefacade. Sometimes it's easier to think loops then facadequeries

		boolean printOnlyOwn = eventbean.getPropertyBoolean(LanEventPropertyKey.PLACECODE_PRINT_ONLY_OWN);

		List<GroupMembership> gmems = gmemfacade.findMemberOrCreator(user);


		List<GroupMembership> ret = new ArrayList<>();
		for(GroupMembership gm : gmems) {

			if(gm.getPlaceReservation() != null) {

				// places with no user belongs to creator
				if(gm.getUser() == null || !printOnlyOwn) {
					ret.add(gm);
				} else if(user.equals(gm.getUser())) {
					ret.add(gm);
				}

			}
		}

		return ret;

	}
}