TicketBean.java 6.36 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 com.pdfjet.*;
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.model.*;
import fi.codecrew.moya.util.MailMessage;
import fi.codecrew.moya.util.MailMessageAttachment;
import fi.codecrew.moya.utilities.BarcodeUtils;
import fi.codecrew.moya.utilities.moyamessage.MoyaEventType;
import net.glxn.qrgen.*;
import net.glxn.qrgen.QRCode;
import net.glxn.qrgen.image.ImageType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.EJBAccessException;
import javax.ejb.Stateless;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

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

	private static final Logger logger = LoggerFactory.getLogger(TicketBean.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 PlaceGroupFacade pgfacade;
	@EJB
	private EventUserFacade eventuserfacade;
	@EJB
	private UtilBean utilBean;


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


	@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;

	}

	@Override
	public void sendTicketEmail(EventUser user , String url) {



		String token = barcodeBean.getUserLongTextCode(user);

		MailMessage msg = new MailMessage();
		msg.setSubject(eventbean.getPropertyString(LanEventPropertyKey.ETICKETMAIL_SUBJECT));

		String formatUrl = MessageFormat.format(url, token);
		logger.info("Sending eticket url {}", formatUrl);

//		ByteArrayOutputStream codeStream = QRCode.from(formatUrl).to(ImageType.PNG).withCharset("UTF-8").withSize(250, 250).stream();

		MailMessageAttachment attachment = new MailMessageAttachment("eticket.pdf", getTicketPdf(user, formatUrl), "application/pdf");

		msg.addAttachment(attachment);

		msg.setMessage(MessageFormat.format(eventbean.getPropertyString(LanEventPropertyKey.ETICKETMAIL_CONTENT), formatUrl, user.getUser().getWholeName()));
		msg.setToAddress(user.getEmail());
		utilBean.sendMail(msg);
	}


	private byte[] getTicketPdf(EventUser user, String codetext) {

		PDF pdf = null;
		try {
			ByteArrayOutputStream ostream = new ByteArrayOutputStream();
			pdf = new PDF(ostream);

			Font smallfont = new Font(pdf, CoreFont.HELVETICA);
			smallfont.setSize(10);

			Font font = new Font(pdf, CoreFont.HELVETICA);
			font.setSize(15);

			Font titlefont = new Font(pdf, CoreFont.HELVETICA);
			titlefont.setSize(25);
			TextLine textLine = null;


			//  new float[]{420.0F, 595.0F};
			Page page = new Page(pdf, A5.PORTRAIT);


			// topic
			textLine = new TextLine(titlefont, eventbean.getCurrentEvent().getName());
			textLine.setPosition(210-(textLine.getWidth()/2), 30);
			textLine.setColor(0x333333);
			textLine.drawOn(page);

			// eventuser info
			textLine = new TextLine(font, user.getWholeName() +" ("+user.getLogin()+")");
			textLine.setPosition(210-(textLine.getWidth()/2), 50);
			textLine.setColor(0x333333);
			textLine.drawOn(page);



			// QRCode
			// you can add also something like:
			QRCode code = QRCode.from(codetext).to(ImageType.PNG).withSize(300, 300);

			ByteArrayInputStream istream = new ByteArrayInputStream(code.stream().toByteArray());
			Image image = new Image(pdf, istream, com.pdfjet.ImageType.PNG);
			image.setPosition(60, 50);
			image.drawOn(page);

			// Text under code //
			textLine = new TextLine(smallfont, "Show this ticket on event door,");
			textLine.setPosition(210-(textLine.getWidth()/2),330);
			textLine.setColor(0x333333);
			textLine.drawOn(page);

			textLine = new TextLine(smallfont, "or you can transfer it to phone by scanning it with mobile phone.");
			textLine.setPosition(210-(textLine.getWidth()/2),340);
			textLine.setColor(0x333333);
			textLine.drawOn(page);



			// placecodes
			int y = 370;
			for(GroupMembership gm : findMembershipPrintlistForUser(user)) {
				String rowInfo = gm.getPlaceReservation().getProduct().getName() + ": "+ gm.getPlaceReservation().getName();
				textLine = new TextLine(font, rowInfo);
				textLine.setPosition(210-(textLine.getWidth()/2),y);
				textLine.setColor(0x333333);
				textLine.drawOn(page);
				y+=17;
			}


			pdf.flush();

			return ostream.toByteArray();
		} catch (Exception e) {
			// ^ kuka prkl implementoi jutukkeen joka sanoo heittävänsä "Exceptionin", ton pitäis olla laitonta
			throw new RuntimeException(e);
		}

	}


}