Commit 2d17df61 by Tuukka Kivilahti

lippusydeemit toimii, vielä pitää fixata multibuggagesearch

1 parent 1cc321e8
...@@ -20,6 +20,8 @@ package fi.codecrew.moya.util; ...@@ -20,6 +20,8 @@ package fi.codecrew.moya.util;
import java.io.Serializable; import java.io.Serializable;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetAddress;
...@@ -29,7 +31,7 @@ public class MailMessage implements Serializable { ...@@ -29,7 +31,7 @@ public class MailMessage implements Serializable {
/** /**
* *
*/ */
private static final long serialVersionUID = -4769468394850407107L; private static final long serialVersionUID = -4769468394850407109L;
private static final String DEFAULT_MAIL_CHARSET = "ISO-8859-1"; private static final String DEFAULT_MAIL_CHARSET = "ISO-8859-1";
...@@ -41,6 +43,8 @@ public class MailMessage implements Serializable { ...@@ -41,6 +43,8 @@ public class MailMessage implements Serializable {
private String message; private String message;
private String charset = DEFAULT_MAIL_CHARSET; private String charset = DEFAULT_MAIL_CHARSET;
private List<MailMessageAttachment> attachmentList;
public InternetAddress getTo() throws UnsupportedEncodingException { public InternetAddress getTo() throws UnsupportedEncodingException {
return new InternetAddress(toAddress, toName, getCharset()); return new InternetAddress(toAddress, toName, getCharset());
} }
...@@ -117,6 +121,14 @@ public class MailMessage implements Serializable { ...@@ -117,6 +121,14 @@ public class MailMessage implements Serializable {
return charset; return charset;
} }
public List<MailMessageAttachment> getAttachmentList() {
return attachmentList;
}
public void setAttachmentList(List<MailMessageAttachment> attachmentList) {
this.attachmentList = attachmentList;
}
public void setTo(User user) { public void setTo(User user) {
setToName(user.getWholeName()); setToName(user.getWholeName());
setToAddress(user.getEmail()); setToAddress(user.getEmail());
...@@ -127,4 +139,11 @@ public class MailMessage implements Serializable { ...@@ -127,4 +139,11 @@ public class MailMessage implements Serializable {
public String toString() { public String toString() {
return new StringBuilder("fi.codecrew.moya.util.MailMessage[to=").append(toAddress).append("]").toString(); return new StringBuilder("fi.codecrew.moya.util.MailMessage[to=").append(toAddress).append("]").toString();
} }
public void addAttachment(MailMessageAttachment attachment) {
if(attachmentList == null)
attachmentList = new ArrayList<>();
attachmentList.add(attachment);
}
} }
...@@ -51,7 +51,9 @@ public class BarcodeBean implements BarcodeBeanLocal { ...@@ -51,7 +51,9 @@ public class BarcodeBean implements BarcodeBeanLocal {
private static final String PRINTED_CARD_TEXTCODEPREFIX = "10"; private static final String PRINTED_CARD_TEXTCODEPREFIX = "10";
private static final String PLACE_TEXTCODEPREFIX = "11"; private static final String PLACE_TEXTCODEPREFIX = "11";
private static final String EVENTUSER_TEXTCODEPREFIX = "12"; private static final String EVENTUSER_TEXTCODEPREFIX = "12";
// DO NOT ACCIDENTLY ADD '=' -char to this list
private static final String TEXTCODE_CHARACTER_MAP = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ"; private static final String TEXTCODE_CHARACTER_MAP = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
private static final int TEXTCODE_ROTATE_COUNT = 500; private static final int TEXTCODE_ROTATE_COUNT = 500;
...@@ -105,6 +107,11 @@ public class BarcodeBean implements BarcodeBeanLocal { ...@@ -105,6 +107,11 @@ public class BarcodeBean implements BarcodeBeanLocal {
@Override @Override
public EventUser getUserFromLongTextCode(String textcode) { public EventUser getUserFromLongTextCode(String textcode) {
// check if it is some url
if(textcode.lastIndexOf("=") > 6) {
textcode = textcode.substring(textcode.lastIndexOf("=")+1);
}
return getUserFromTextCode(textcode,38,16); return getUserFromTextCode(textcode,38,16);
} }
...@@ -331,11 +338,16 @@ public class BarcodeBean implements BarcodeBeanLocal { ...@@ -331,11 +338,16 @@ public class BarcodeBean implements BarcodeBeanLocal {
// try if it is our Eticket -code // try if it is our Eticket -code
EventUser user = getUserFromTextCode(barcode); EventUser user = getUserFromTextCode(barcode);
logger.info("Found maybe some nice user {}", user); if(user != null)
return user;
// not eticket, then there is our other eticket, the one sent via email.
user = getUserFromLongTextCode(barcode);
if(user != null) if(user != null)
return user; return user;
} catch (NumberFormatException x) { } catch (NumberFormatException x) {
} }
......
...@@ -20,6 +20,7 @@ package fi.codecrew.moya.beans; ...@@ -20,6 +20,7 @@ package fi.codecrew.moya.beans;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import javax.activation.DataHandler;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty; import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven; import javax.ejb.MessageDriven;
...@@ -27,12 +28,14 @@ import javax.jms.JMSException; ...@@ -27,12 +28,14 @@ import javax.jms.JMSException;
import javax.jms.Message; import javax.jms.Message;
import javax.jms.MessageListener; import javax.jms.MessageListener;
import javax.jms.ObjectMessage; import javax.jms.ObjectMessage;
import javax.mail.MessagingException; import javax.mail.*;
import javax.mail.Session; import javax.mail.internet.MimeBodyPart;
import javax.mail.Transport;
import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType; import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import fi.codecrew.moya.util.MailMessageAttachment;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -75,7 +78,16 @@ public class MailMessageBean implements MessageListener { ...@@ -75,7 +78,16 @@ public class MailMessageBean implements MessageListener {
mailmsg = (MailMessage) ((ObjectMessage) message).getObject(); mailmsg = (MailMessage) ((ObjectMessage) message).getObject();
logger.debug("Got message {}", mailmsg.getToName()); logger.debug("Got message {}", mailmsg.getToName());
if (BortalLocalContextHolder.isInDevelopmentMode()) { // MERGEREQUESTIN TARKASTAJA!
// MERGEREQUESTIN TARKASTAJA!
// MERGEREQUESTIN TARKASTAJA!
// MERGEREQUESTIN TARKASTAJA!
// MERGEREQUESTIN TARKASTAJA!
// MERGEREQUESTIN TARKASTAJA!
// MERGEREQUESTIN TARKASTAJA!
// MERGEREQUESTIN TARKASTAJA!
// Jos unohan tän falsen tähän alle, niin ulise TKffTK:lle kovasti :)
if (false && BortalLocalContextHolder.isInDevelopmentMode()) {
String dmessage = " To: " String dmessage = " To: "
+ mailmsg.getTo() + "\n Subject: " + mailmsg.getTo() + "\n Subject: "
+ mailmsg.getSubject() + "\n Text: " + mailmsg.getSubject() + "\n Text: "
...@@ -85,11 +97,27 @@ public class MailMessageBean implements MessageListener { ...@@ -85,11 +97,27 @@ public class MailMessageBean implements MessageListener {
} else { } else {
MimeMessage msg = new MimeMessage(mailSession); MimeMessage msg = new MimeMessage(mailSession);
MimeMultipart multipart = new MimeMultipart();
MimeBodyPart contentPart = new MimeBodyPart();
contentPart.setText(mailmsg.getMessage(), mailmsg.getCharset());
multipart.addBodyPart(contentPart);
// Add attachments, if any
if(mailmsg.getAttachmentList() != null && mailmsg.getAttachmentList().size() > 0) {
for(MailMessageAttachment attachment : mailmsg.getAttachmentList()) {
MimeBodyPart mimeAttachment = new MimeBodyPart();
mimeAttachment.setFileName(attachment.getName());
mimeAttachment.setDataHandler(new DataHandler(new ByteArrayDataSource(attachment.getData(), attachment.getMimeType())));
multipart.addBodyPart(mimeAttachment);
}
}
msg.setSubject(mailmsg.getSubject()); msg.setSubject(mailmsg.getSubject());
msg.setFrom(mailmsg.getFrom()); msg.setFrom(mailmsg.getFrom());
msg.setRecipient(RecipientType.TO, mailmsg.getTo()); msg.setRecipient(RecipientType.TO, mailmsg.getTo());
msg.setText(mailmsg.getMessage(), mailmsg.getCharset()); msg.setContent(multipart);
Transport.send(msg); Transport.send(msg);
} }
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
package fi.codecrew.moya.beans; package fi.codecrew.moya.beans;
import com.pdfjet.*; import com.pdfjet.*;
import fi.codecrew.moya.enums.apps.MapPermission; import fi.codecrew.moya.enums.apps.MapPermission;
import fi.codecrew.moya.enums.apps.SpecialPermission; import fi.codecrew.moya.enums.apps.SpecialPermission;
...@@ -26,8 +27,12 @@ import fi.codecrew.moya.facade.GroupMembershipFacade; ...@@ -26,8 +27,12 @@ import fi.codecrew.moya.facade.GroupMembershipFacade;
import fi.codecrew.moya.facade.PlaceGroupFacade; import fi.codecrew.moya.facade.PlaceGroupFacade;
import fi.codecrew.moya.model.*; import fi.codecrew.moya.model.*;
import fi.codecrew.moya.util.MailMessage; import fi.codecrew.moya.util.MailMessage;
import fi.codecrew.moya.util.MailMessageAttachment;
import fi.codecrew.moya.utilities.BarcodeUtils; import fi.codecrew.moya.utilities.BarcodeUtils;
import fi.codecrew.moya.utilities.moyamessage.MoyaEventType; 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.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -36,6 +41,8 @@ import javax.annotation.security.RolesAllowed; ...@@ -36,6 +41,8 @@ import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.EJBAccessException; import javax.ejb.EJBAccessException;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -72,6 +79,7 @@ public class TicketBean implements TicketBeanLocal { ...@@ -72,6 +79,7 @@ public class TicketBean implements TicketBeanLocal {
@EJB @EJB
private UtilBean utilBean; private UtilBean utilBean;
/** /**
* Default constructor. * Default constructor.
*/ */
...@@ -112,6 +120,8 @@ public class TicketBean implements TicketBeanLocal { ...@@ -112,6 +120,8 @@ public class TicketBean implements TicketBeanLocal {
@Override @Override
public void sendTicketEmail(EventUser user , String url) { public void sendTicketEmail(EventUser user , String url) {
String token = barcodeBean.getUserLongTextCode(user); String token = barcodeBean.getUserLongTextCode(user);
MailMessage msg = new MailMessage(); MailMessage msg = new MailMessage();
...@@ -120,12 +130,99 @@ public class TicketBean implements TicketBeanLocal { ...@@ -120,12 +130,99 @@ public class TicketBean implements TicketBeanLocal {
String formatUrl = MessageFormat.format(url, token); String formatUrl = MessageFormat.format(url, token);
logger.info("Sending eticket url {}", formatUrl); 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.setMessage(MessageFormat.format(eventbean.getPropertyString(LanEventPropertyKey.ETICKETMAIL_CONTENT), formatUrl, user.getUser().getWholeName()));
msg.setToAddress(user.getEmail()); msg.setToAddress(user.getEmail());
utilBean.sendMail(msg); 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);
}
}
} }
......
...@@ -23,9 +23,11 @@ ...@@ -23,9 +23,11 @@
<p:printer target="eticketpanel"/> <p:printer target="eticketpanel"/>
</p:commandButton> </p:commandButton>
<p:commandButton update=":messages" icon="ui-icon-mail-closed" value="#{i18n['etickets.sendAsMail']}" actionListener="#{eticketView.sendAsMail}" /><br/><br/><br/>
<p:commandButton id="sendeticketbutton" update="sentmessagepanel" icon="ui-icon-mail-closed" value="#{i18n['etickets.sendAsMail']}" actionListener="#{eticketView.sendAsMail}" /><br/>
<p:outputPanel id="sentmessagepanel">
<p:outputLabel rendered="#{eticketView.sent}" for="sendeticketbutton" id="eticketSended" styleClass="success" value="#{i18n['etickets.mailSended']}" /><br /><br/><br/>
</p:outputPanel>
<p:outputPanel id="eticketpanel"> <p:outputPanel id="eticketpanel">
<p:fieldset legend="#{i18n['etickets.eticketcode']}" style="width: 250px; "> <p:fieldset legend="#{i18n['etickets.eticketcode']}" style="width: 250px; ">
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
}); });
</h:outputScript> </h:outputScript>
<p:autoComplete immediate="true" widgetVar="usermultisearch" styleClass="usermultisearch" id="acsb" value="#{infoView.multiSearchUser}" completeMethod="#{infoView.matchMulti}" converter="#{eventUserCodeFinderConverter}" var="usrx" itemLabel="#{usrx.shortUserDescriptor}" itemValue="#{usrx}"> <p:autoComplete widgetVar="usermultisearch" styleClass="usermultisearch" id="acsb" value="#{infoView.multiSearchUser}" completeMethod="#{infoView.matchMulti}" converter="#{eventUserCodeFinderConverter}" var="usrx" itemLabel="#{usrx.shortUserDescriptor}" itemValue="#{usrx}">
<p:ajax event="itemSelect" listener="#{cardlessIncomingView.changeUser}" /> <p:ajax event="itemSelect" listener="#{cardlessIncomingView.changeUser}" />
</p:autoComplete> </p:autoComplete>
<p:watermark for="acsb" value="#{i18n['infoview.multisearch']}" /> <p:watermark for="acsb" value="#{i18n['infoview.multisearch']}" />
......
...@@ -69,7 +69,7 @@ ...@@ -69,7 +69,7 @@
<div class="clearfix"></div> <div class="clearfix"></div>
<div> <div style="margin-left: 10px;">
<ui:insert name="content" /> <ui:insert name="content" />
</div> </div>
......
...@@ -194,9 +194,6 @@ ...@@ -194,9 +194,6 @@
<ui:insert name="title" /> <ui:insert name="title" />
<p:menubar rendered="#{primeMenuView.hasSecondaryMenu}" model="#{primeMenuView.secondaryMenuModel}" /> <p:menubar rendered="#{primeMenuView.hasSecondaryMenu}" model="#{primeMenuView.secondaryMenuModel}" />
<h:form id="messages">
<p:growl id="growl" showDetail="true" widgetVar="messages_growl" />
</h:form>
<ui:insert name="edittab" /> <ui:insert name="edittab" />
...@@ -223,7 +220,14 @@ ...@@ -223,7 +220,14 @@
</p:layout> </p:layout>
<h:form id="messages">
<p:growl id="growl" showDetail="true" sticky="true" widgetVar="messages_growl" />
</h:form>
<h:form> <h:form>
<!-- <p:growl id="growl" showDetail="true" sticky="true" autoUpdate="true" /> -->
<p:confirmDialog global="true" showEffect="fade" hideEffect="explode"> <p:confirmDialog global="true" showEffect="fade" hideEffect="explode">
<p:commandButton value="Yes" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" /> <p:commandButton value="Yes" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
<p:commandButton value="No" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close" /> <p:commandButton value="No" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close" />
......
...@@ -115,6 +115,8 @@ public class EticketView extends GenericCDIView { ...@@ -115,6 +115,8 @@ public class EticketView extends GenericCDIView {
public void sendAsMail() { public void sendAsMail() {
ticketBean.sendTicketEmail(userView.getSelectedUser(), getTicketUrl()); ticketBean.sendTicketEmail(userView.getSelectedUser(), getTicketUrl());
addFaceMessage("etickets.mailSended");
sent = true;
} }
...@@ -141,6 +143,11 @@ public class EticketView extends GenericCDIView { ...@@ -141,6 +143,11 @@ public class EticketView extends GenericCDIView {
return path.toString(); return path.toString();
} }
boolean sent = false;
public boolean isSent() {
return sent;
}
} }
......
...@@ -486,3 +486,4 @@ user.invalidLoginCredentials= ...@@ -486,3 +486,4 @@ user.invalidLoginCredentials=
barcodeReader.readBarcode=Lue viivakoodi barcodeReader.readBarcode=Lue viivakoodi
incomingflow.allGiven=Merkitty {0} lippu(a) annetuksi. incomingflow.allGiven=Merkitty {0} lippu(a) annetuksi.
reader.noReader=Ei valittua lukijaa reader.noReader=Ei valittua lukijaa
etickets.mailSended=Lippu l\u00E4hetetty s\u00E4hk\u00F6postiisi
...@@ -1701,3 +1701,4 @@ submenu.info.cardlessIncoming=Incoming ...@@ -1701,3 +1701,4 @@ submenu.info.cardlessIncoming=Incoming
incomingFlow.count=Count incomingFlow.count=Count
incomingflow.allGiven=Marked {0} tickets given. incomingflow.allGiven=Marked {0} tickets given.
reader.noReader=No selected reader reader.noReader=No selected reader
etickets.mailSended=Ticket has been sended to your email
...@@ -1685,3 +1685,4 @@ submenu.info.cardlessIncoming=Sis\u00E4\u00E4ntulo ...@@ -1685,3 +1685,4 @@ submenu.info.cardlessIncoming=Sis\u00E4\u00E4ntulo
incomingFlow.count=M\u00E4\u00E4r\u00E4 incomingFlow.count=M\u00E4\u00E4r\u00E4
incomingflow.allGiven=Merkitty {0} lippu(a) annetuksi. incomingflow.allGiven=Merkitty {0} lippu(a) annetuksi.
reader.noReader=Ei valittua lukijaa reader.noReader=Ei valittua lukijaa
etickets.mailSended=Lippu l\u00E4hetetty s\u00E4hk\u00F6postiisi
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!