/******************************************************************************* * Copyright 2014 Miami-Dade County * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package org.sharegov.cirm.utils; import static org.sharegov.cirm.utils.GenUtils.containsWhiteSpace; import static org.sharegov.cirm.OWL.individual; import static org.sharegov.cirm.OWL.objectProperty; import static org.sharegov.cirm.OWL.dataProperty; import static org.sharegov.cirm.OWL.getEntityLabel; import static org.sharegov.cirm.utils.ServiceRequestReportUtil.getAddressPropertyValue; import static org.sharegov.cirm.utils.ServiceRequestReportUtil.getAllServiceAnswers; import static org.sharegov.cirm.utils.ServiceRequestReportUtil.blankField; import static org.sharegov.cirm.utils.ServiceRequestReportUtil.emptyField; import static org.sharegov.cirm.utils.ServiceRequestReportUtil.legacyPrefix; import static org.sharegov.cirm.utils.ServiceRequestReportUtil.formatDate; import static org.sharegov.cirm.utils.ServiceRequestReportUtil.getCity; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.semanticweb.owlapi.model.OWLAnnotation; import org.semanticweb.owlapi.model.OWLIndividual; import org.semanticweb.owlapi.model.OWLLiteral; import org.semanticweb.owlapi.model.OWLNamedIndividual; import org.semanticweb.owlapi.model.OWLObjectProperty; import org.sharegov.cirm.rest.LegacyEmulator; import org.sharegov.cirm.rest.UserService; import org.sharegov.cirm.BOntology; import org.sharegov.cirm.OWL; import org.sharegov.cirm.StartUp; import mjson.Json; import com.itextpdf.text.Anchor; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Chapter; import com.itextpdf.text.Chunk; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Element; import com.itextpdf.text.Font; import com.itextpdf.text.Image; import com.itextpdf.text.PageSize; import com.itextpdf.text.Paragraph; import com.itextpdf.text.Phrase; import com.itextpdf.text.Rectangle; import com.itextpdf.text.Section; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfPageEventHelper; import com.itextpdf.text.pdf.PdfWriter; import com.itextpdf.text.pdf.draw.LineSeparator; public class PDFViewReport { public static boolean DBG = true; private static final Font boldFont = new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD); private static final Font normalFont = new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL); private static final Font bigBoldFont = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD); private static final Font bigNormalFont = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL); private static final String genericErrorMsg = "Sorry, an error occured while generating the PDF report. " + "An automated email was sent to the Admin with all the required information."; String title = "Service Request Summary Report"; String time; private final UserService userService; public PDFViewReport() { userService = new UserService(); } public void setTime(String time) { this.time = time; } public String getTime() { return time; } public void setTitle(String title) { this.title = title; } public String getTitle() { return title; } class TableHeader extends PdfPageEventHelper { public void onEndPage(PdfWriter writer, Document d) { float cellHeight = d.topMargin(); Rectangle page = d.getPageSize(); PdfPTable head = new PdfPTable(1); head.setTotalWidth(page.getWidth()); PdfPCell c = new PdfPCell(new Phrase(getTitle(), bigBoldFont)); c.setHorizontalAlignment(Element.ALIGN_CENTER); c.setFixedHeight(cellHeight); c.setBorder(PdfPCell.NO_BORDER); head.addCell(c); float temp = page.getHeight() - cellHeight + head.getTotalHeight(); head.writeSelectedRows(0, -1, 0, temp, writer.getDirectContent()); head = new PdfPTable(1); head.setTotalWidth(page.getWidth()); c = new PdfPCell(new Phrase(getTime(), bigNormalFont)); c.setHorizontalAlignment(Element.ALIGN_CENTER); c.setFixedHeight(cellHeight); c.setBorder(PdfPCell.NO_BORDER); head.addCell(c); //table header requires absolute positioning head.writeSelectedRows(0, -1, 0, temp-15, writer.getDirectContent()); } } private void addCell(PdfPTable table, String name, int align, Font font, BaseColor color) { PdfPCell cell = new PdfPCell(new Phrase(name, font)); cell.setHorizontalAlignment(align); cell.setBorder(Rectangle.NO_BORDER); if(color != null) cell.setBackgroundColor(color); table.addCell(cell); } private void addCell(PdfPCell cell, PdfPTable table, String name, int align, Font font, BaseColor color) { cell = new PdfPCell(new Phrase(name, font)); cell.setHorizontalAlignment(align); cell.setBorder(Rectangle.NO_BORDER); if(color != null) cell.setBackgroundColor(color); table.addCell(cell); } private BaseColor addColor(Integer i) { if(i == null) return null; if(i%2 == 0) return BaseColor.LIGHT_GRAY; else return BaseColor.WHITE; } private void addTopTable(Section subCatPart, Json data) throws DocumentException { PdfPTable table = new PdfPTable(4); table.setWidthPercentage(100); int[] widths = {12, 55, 15, 20}; table.setWidths(widths); PdfPCell cell = null; OWLNamedIndividual typeInd = individual(legacyPrefix+data.at("type").asString()); addCell(cell, table, "Type:", Element.ALIGN_RIGHT, boldFont, null); addCell(cell, table, getEntityLabel(typeInd), Element.ALIGN_LEFT, normalFont, null); addCell(cell, table, "SR #:", Element.ALIGN_RIGHT, boldFont, null); if(data.at("properties").has("hasCaseNumber")) addCell(cell, table, data.at("properties").at("hasCaseNumber").asString(), Element.ALIGN_LEFT, normalFont, null); else addCell(cell, table, GenUtils.makeCaseNumber(data.at("boid").asLong()), Element.ALIGN_LEFT, normalFont, null); //02-20-2014 - Syed add providedby to report addCell(cell, table, "Area:", Element.ALIGN_RIGHT, boldFont, null); addCell(cell, table, getArea(typeInd), Element.ALIGN_LEFT, normalFont, null); addCell(cell, table, "Priority:", Element.ALIGN_RIGHT, boldFont, null); addCell(cell, table, data.at("properties").at("hasPriority").at("label").asString(), Element.ALIGN_LEFT, normalFont, null); addCell(cell, table, "Group:", Element.ALIGN_RIGHT, boldFont, null); addCell(cell, table, getGroup(typeInd), Element.ALIGN_LEFT, normalFont, null); addCell(cell, table, "Status:", Element.ALIGN_RIGHT, boldFont, null); addCell(cell, table, getEntityLabel(individual(data.at("properties"), "hasStatus")), Element.ALIGN_LEFT, normalFont, null); addCell(cell, table, "Jurisdiction:", Element.ALIGN_RIGHT, boldFont, null); OWLLiteral jurisdiction = dataProperty(typeInd, legacyPrefix+"hasJurisdictionDescription"); addCell(cell, table, jurisdiction != null ? jurisdiction.getLiteral() : emptyField, Element.ALIGN_LEFT, normalFont, null); addCell(cell, table, "Status Date:", Element.ALIGN_RIGHT, boldFont, null); String modifiedDate = data.at("properties").has("hasDateLastModified") ? data.at("properties").at("hasDateLastModified").asString() : ""; addCell(cell, table, formatDate(modifiedDate, true, false), Element.ALIGN_LEFT, normalFont, null); addCell(cell, table, "Input By:", Element.ALIGN_RIGHT, boldFont, null); String inputBy = data.at("properties").has("isCreatedBy") ? data.at("properties").at("isCreatedBy").asString() : emptyField; addCell(cell, table, inputBy, Element.ALIGN_LEFT, normalFont, null); addCell(cell, table, "Created Date:", Element.ALIGN_RIGHT, boldFont, null); String createdDate = data.at("properties").has("hasDateCreated") ? data.at("properties").at("hasDateCreated").asString() : ""; addCell(cell, table, formatDate(createdDate, true, false), Element.ALIGN_LEFT, normalFont, null); addCell(cell, table, "CC Groups:", Element.ALIGN_RIGHT, boldFont, null); addCell(cell, table, blankField, Element.ALIGN_LEFT, normalFont, null); addCell(cell, table, "Created By:", Element.ALIGN_RIGHT, boldFont, null); addCell(cell, table, getEmployeeName(inputBy), Element.ALIGN_LEFT, normalFont, null); addCell(cell, table, "Location:", Element.ALIGN_RIGHT, boldFont, null); addCell(cell, table, data.at("properties").has("atAddress") ? buildAddress(data.at("properties").at("atAddress")) : blankField, Element.ALIGN_LEFT, normalFont, null); addCell(cell, table, "Method Received:", Element.ALIGN_RIGHT, boldFont, null); addCell(cell, table, data.at("properties").at("hasIntakeMethod").at("label").asString(), Element.ALIGN_LEFT, normalFont, null); subCatPart.add(table); subCatPart.add(new Chunk(new LineSeparator())); } private String getGroup(OWLNamedIndividual srType) { String result = blankField; OWLNamedIndividual providedBy = OWL.objectProperty(srType, "legacy:providedBy"); System.out.println(srType + " providedBy " + providedBy); if(providedBy != null) { OWLLiteral s = OWL.dataProperty(providedBy, "Name"); if(s != null) result = s.getLiteral(); } return result; } //In the PDF report for each //SR add the Department the SR is //associated with where it now says Area, //and the division, where it says Group. private String getArea(OWLNamedIndividual srType) { String result = blankField; OWLNamedIndividual providedBy = OWL.objectProperty(srType, "legacy:providedBy"); if(providedBy != null ) { OWLNamedIndividual parent = OWL.objectProperty(providedBy, "hasParentAgency"); if(parent != null) { OWLLiteral s = OWL.dataProperty(parent, "Name"); if(s != null) result = s.getLiteral(); } } return result; } private String getEmployeeName(String ceKey) { if(ceKey == null || ceKey.isEmpty() || ceKey.equals(blankField)) return blankField; if (ceKey.contains("@")||ceKey.contains(";")) return ceKey; //Lookup in Bluebook, ENET, Onto String userFullName = userService.getFullName(ceKey); return (userFullName == null || userFullName.isEmpty())? ceKey : userFullName; } private String buildAddress(Json address) { StringBuilder addr = new StringBuilder(); if(address.has("fullAddress")) addr.append(address.at("fullAddress").asString()); if(address.has("Street_Unit_Number")) addr.append(", #").append(address.at("Street_Unit_Number").asString()); if(address.has("Street_Address_City")) addr.append(", ").append(getCity(address).trim()); if(address.has("Street_Address_State")) addr.append(", ").append( getAddressPropertyValue(address, "Street_Address_State", "USPS_Abbreviation")); if(address.has("Zip_Code")) addr.append(" - ").append(address.at("Zip_Code").asString()); return addr.toString(); } private void addDescription(Section subCatPart, Json data) throws DocumentException { PdfPTable table = new PdfPTable(2); table.setWidthPercentage(100); int[] widths = {15, 85}; table.setWidths(widths); PdfPCell cell = null; addCell(cell, table, "Description:", Element.ALIGN_LEFT, bigBoldFont, null); if(data.at("properties").has("hasDetails")) addCell(cell, table, data.at("properties").at("hasDetails").asString(), Element.ALIGN_LEFT, normalFont, null); subCatPart.add(table); subCatPart.add(new Chunk(new LineSeparator())); } private void addQuestions(Section subCatPart, Json data) throws DocumentException, UnsupportedEncodingException { PdfPTable table = new PdfPTable(2); table.setWidthPercentage(100); int[] widths = {65, 35}; table.setWidths(widths); PdfPCell cell = null; addCell(cell, table, "SR Questions", Element.ALIGN_LEFT, bigBoldFont, null); addCell(cell, table, "Answers", Element.ALIGN_LEFT, bigBoldFont, null); subCatPart.add(table); //subCatPart.add(Chunk.NEWLINE); //subCatPart.add(new Chunk(new LineSeparator())); table = new PdfPTable(2); table.setWidthPercentage(100); table.setWidths(widths); OWLNamedIndividual typeInd = individual(legacyPrefix+data.at("type").asString()); List<Json> allServiceAnswers = new ArrayList<Json>(); LegacyEmulator.getAllServiceFields(typeInd, allServiceAnswers, true); List<Json> saList = getAllServiceAnswers(data); for(int k = 0; k < allServiceAnswers.size(); k++) { Json serviceAnswer = allServiceAnswers.get(k); BaseColor color = addColor(k); int counter = 0; addCell(cell, table, serviceAnswer.at("hasServiceField").at("label").asString(), Element.ALIGN_LEFT, normalFont, color); for (Json sa : saList) { if(sa.at("hasServiceField").at("iri").asString(). equals(serviceAnswer.at("hasServiceField").at("iri").asString())) { OWLIndividual qtn = individual(sa.at("hasServiceField").at("iri").asString()); OWLObjectProperty cvl = objectProperty(legacyPrefix+"hasChoiceValueList"); if(sa.has("hasAnswerValue")) { if(sa.at("hasAnswerValue").at("literal").isArray()) { List<Json> literalList = sa.at("hasAnswerValue").at("literal").asJsonList(); for(int i=0; i<literalList.size(); i++) { String eachAns = literalList.get(i).asString(); addCell(cell, table, eachAns, Element.ALIGN_LEFT, normalFont, color); if(i != literalList.size()-1) addCell(cell, table, blankField, Element.ALIGN_LEFT, normalFont, color); } } else { String ans = sa.at("hasAnswerValue").at("literal").asString(); if(serviceAnswer.at("hasDataType").asString().equals("NUMBER")) ans = Long.toString(new BigDecimal(ans).longValue()); if(serviceAnswer.at("hasDataType").asString().equals("DATE")) ans = formatDate(ans, false, false); addCell(cell, table, ans, Element.ALIGN_LEFT, normalFont, color); } } else if(sa.has("hasAnswerObject")) { if(sa.at("hasAnswerObject").isArray()) { List<Json> answerObjectList = sa.at("hasAnswerObject").asJsonList(); for(int i=0; i<answerObjectList.size(); i++) { Json eachAnswerObject = answerObjectList.get(i); //OWL.objectProperties(qtn, cvl.getIRI().toString()); if(!OWL.collectObjectProperties(qtn, cvl).isEmpty() && !containsWhiteSpace(eachAnswerObject.at("iri").asString())) { addCell(cell, table, getEntityLabel(individual(eachAnswerObject.at("iri").asString())), Element.ALIGN_LEFT, normalFont, color); if(i != answerObjectList.size()-1) addCell(cell, table, blankField, Element.ALIGN_LEFT, normalFont, color); } } } else { String ans = sa.at("hasAnswerObject").at("iri").asString(); if(!OWL.collectObjectProperties(qtn, cvl).isEmpty() && !containsWhiteSpace(ans)) { addCell(cell, table, getEntityLabel(individual(ans)), Element.ALIGN_LEFT, normalFont, color); } else addCell(cell, table, ans, Element.ALIGN_LEFT, normalFont, color); } } ++counter; } else continue; } if(counter == 0) addCell(cell, table, emptyField, Element.ALIGN_LEFT, normalFont, color); } subCatPart.add(table); subCatPart.add(new Chunk(new LineSeparator())); } private void addActors(Section subCatPart, Json data) throws DocumentException { if(data.at("properties").has("hasServiceCaseActor")) { int iActorHeaderColumns = 5; int iActorColumns = 6; PdfPTable table = new PdfPTable(iActorHeaderColumns); table.setWidthPercentage(100); int[] headerWidths = {15, 15, 25, 18, 22}; int[] widths = {15, 15, 25, 18, 5, 17}; table.setWidths(headerWidths); PdfPCell cell = null; addCell(cell, table, "Customer", Element.ALIGN_LEFT, bigBoldFont, null); addCell(cell, table, "Name", Element.ALIGN_LEFT, bigBoldFont, null); addCell(cell, table, "Address", Element.ALIGN_LEFT, bigBoldFont, null); addCell(cell, table, "e-Mail", Element.ALIGN_LEFT, bigBoldFont, null); addCell(cell, table, "Contact No", Element.ALIGN_LEFT, bigBoldFont, null); subCatPart.add(table); //subCatPart.add(Chunk.NEWLINE); //subCatPart.add(new Chunk(new LineSeparator())); table = new PdfPTable(iActorColumns); table.setWidthPercentage(100); table.setWidths(widths); if(!data.at("properties").at("hasServiceCaseActor").isArray()) { data.at("properties").set("hasServiceCaseActor", Json.array().add(data.at("properties").at("hasServiceCaseActor"))); } for(int k=0; k < data.at("properties").at("hasServiceCaseActor").asJsonList().size(); k++) { Json actor = data.at("properties").at("hasServiceCaseActor").at(k); BaseColor color = addColor(k); OWLNamedIndividual act = individual(actor, "hasServiceActor"); String actorType = getEntityLabel(act); StringBuilder actorName = new StringBuilder(); if(actor.has("Name")) actorName.append(actor.at("Name").asString()); if(actor.has("LastName")) { if(actorName.toString().isEmpty()) actorName.append(actor.at("LastName").asString()); else actorName.append(" ").append(actor.at("LastName").asString()); } if(actorName.toString().isEmpty()) actorName.append(blankField); StringBuilder actorAddr = new StringBuilder(); if(actor.has("atAddress")) { Json addr = actor.at("atAddress"); if(addr.has("fullAddress")) actorAddr.append(addr.at("fullAddress").asString()); if(addr.has("Street_Unit_Number")) actorAddr.append(", #").append(addr.at("Street_Unit_Number").asString()); if(addr.has("Street_Address_City")) { OWLNamedIndividual cityInd = individual(addr, "Street_Address_City"); OWLLiteral city = dataProperty(cityInd, "Name"); if(city == null) city = dataProperty(cityInd, "Alias"); if(city != null) actorAddr.append(", ").append(city.getLiteral()); } if(addr.has("fullAddress") && addr.has("Street_Address_State")) { OWLNamedIndividual stateInd = individual(addr, "Street_Address_State"); OWLLiteral state = dataProperty(stateInd, "USPS_Abbreviation"); if(state != null) actorAddr.append(", ").append(state.getLiteral()); } if(addr.has("Zip_Code")) actorAddr.append(" - ").append(addr.at("Zip_Code").asString()); } else actorAddr.append(blankField); String eMail = actor.has("hasEmailAddress") ? actor.at("hasEmailAddress").isObject() ? actor.at("hasEmailAddress").at("iri").asString().split(":")[1] : actor.at("hasEmailAddress").asString().split(":")[1] : blankField; addCell(cell, table, actorType, Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, actorName.toString(), Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, actorAddr.toString(), Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, eMail, Element.ALIGN_LEFT, normalFont, color); boolean isFirstContactNo = true; String actorHmPh = actor.has("HomePhoneNumber") ? actor.at("HomePhoneNumber").asString() : null; String actorCellNo = actor.has("CellPhoneNumber") ? actor.at("CellPhoneNumber").asString() : null; String actorBizNo = actor.has("BusinessPhoneNumber") ? actor.at("BusinessPhoneNumber").asString() : null; String actorFaxNo = actor.has("FaxNumber") ? actor.at("FaxNumber").asString() : null; String actorOtherNo = actor.has("OtherPhoneNumber") ? actor.at("OtherPhoneNumber").asString() : null; if(actorHmPh != null) isFirstContactNo = addActorsContactNumbers( table, cell, actorHmPh, "Home ", iActorColumns, color, isFirstContactNo); if(actorCellNo != null) isFirstContactNo = addActorsContactNumbers( table, cell, actorCellNo, "Cell ", iActorColumns, color, isFirstContactNo); if(actorBizNo != null) isFirstContactNo = addActorsContactNumbers( table, cell, actorBizNo, "Biz ", iActorColumns, color, isFirstContactNo); if(actorFaxNo != null) isFirstContactNo = addActorsContactNumbers( table, cell, actorFaxNo, "Fax ", iActorColumns, color, isFirstContactNo); if(actorOtherNo != null) isFirstContactNo = addActorsContactNumbers( table, cell, actorOtherNo, "Other ", iActorColumns, color, isFirstContactNo); if(actorHmPh == null && actorCellNo == null && actorBizNo == null && actorFaxNo == null && actorOtherNo == null) { addCell(cell, table, blankField, Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, blankField, Element.ALIGN_LEFT, normalFont, color); } } subCatPart.add(table); subCatPart.add(new Chunk(new LineSeparator())); } } private boolean addActorsContactNumbers(PdfPTable table, PdfPCell cell, String contactNumber, String contactNoType, int iActorColumns, BaseColor color, boolean isFirstContactNo) { String[] contactNumberList = contactNumber.split(","); if(contactNumberList.length == 1) { if(isFirstContactNo) { addCell(cell, table, contactNoType, Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, contactNumberList[0], Element.ALIGN_LEFT, normalFont, color); isFirstContactNo = false; } else { for(int j = 1; j < iActorColumns-1; j++) addCell(cell, table, blankField, Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, contactNoType, Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, contactNumberList[0], Element.ALIGN_LEFT, normalFont, color); } } else if(contactNumberList.length > 1) { for(int i=0; i<contactNumberList.length; i++) { if(i == 0 && isFirstContactNo) { addCell(cell, table, contactNoType, Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, contactNumberList[i], Element.ALIGN_LEFT, normalFont, color); isFirstContactNo = false; } else { for(int j = 1; j < iActorColumns-1; j++) addCell(cell, table, blankField, Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, contactNoType, Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, contactNumberList[i], Element.ALIGN_LEFT, normalFont, color); } } } return isFirstContactNo; } private void addActivities(Section subCatPart, Json data) throws DocumentException { if(data.at("properties").has("hasServiceActivity")) { if(!data.at("properties").at("hasServiceActivity").isArray()) { data.at("properties").set("hasServiceActivity", Json.array().add(data.at("properties").at("hasServiceActivity"))); } Json filteredActivities = Json.array(); //Do not add any StatusChangeActivity Activities to the report for(Json act : data.at("properties").at("hasServiceActivity").asJsonList()) { OWLNamedIndividual actInd = individual(act, "hasActivity"); if(!actInd.getIRI().getFragment().equals("StatusChangeActivity")) filteredActivities.add(act); } if(filteredActivities.asJsonList().size() > 0) { //PdfPTable table = new PdfPTable(7); PdfPTable table = new PdfPTable(6); table.setWidthPercentage(100); //int[] widths = {17, 13, 12, 12, 13, 13, 20}; int[] widths = {25, 20, 13, 12, 13, 17}; table.setWidths(widths); PdfPCell cell = null; addCell(cell, table, "Activity", Element.ALIGN_LEFT, bigBoldFont, null); addCell(cell, table, "Assigned To", Element.ALIGN_LEFT, bigBoldFont, null); addCell(cell, table, "Created Date", Element.ALIGN_LEFT, bigBoldFont, null); addCell(cell, table, "Due Date", Element.ALIGN_LEFT, bigBoldFont, null); addCell(cell, table, "Completed Date", Element.ALIGN_LEFT, bigBoldFont, null); addCell(cell, table, "Outcome", Element.ALIGN_LEFT, bigBoldFont, null); //addCell(cell, table, "Details", Element.ALIGN_LEFT, bigBoldFont); subCatPart.add(table); //subCatPart.add(Chunk.NEWLINE); //subCatPart.add(new Chunk(new LineSeparator())); //table = new PdfPTable(7); //table = new PdfPTable(6); //table.setWidthPercentage(100); //table.setWidths(widths); //Store all outcome iris(key), labels(value). //Because in case of duplicate outcomes all outcome values (except the first) will be a string and not object Map<String, String> outcomeMap = new HashMap<String, String>(10); //for (int k = 0; k < data.at("properties").at("hasServiceActivity").asJsonList().size(); k++) for(int k = 0; k < filteredActivities.asJsonList().size(); k++) { Json activity = filteredActivities.at(k); BaseColor color = addColor(k); OWLIndividual act = individual(activity, "hasActivity"); OWLLiteral typeLabel = null; for (OWLAnnotation ann : OWL.annotations(act.asOWLNamedIndividual())) { if(ann.getProperty().isLabel()) typeLabel = (OWLLiteral)ann.getValue(); } String activityType = typeLabel == null ? "" : typeLabel.getLiteral(); String assignedTo = activity.has("isAssignedTo") ? activity.at("isAssignedTo").asString() : blankField; String createdDate = activity.has("hasDateCreated") ? activity.at("hasDateCreated").asString() : blankField; String dueDate = activity.has("hasDueDate") ? activity.at("hasDueDate").asString() : blankField; String completedDate = activity.has("hasCompletedTimestamp") ? activity.at("hasCompletedTimestamp").asString() : blankField; String details = activity.has("hasDetails") ? activity.at("hasDetails").asString() : blankField; StringBuilder outcome = new StringBuilder(""); if(activity.has("hasOutcome")) { if(activity.at("hasOutcome").isObject()) { if(!outcomeMap.containsKey(activity.at("hasOutcome").at("iri").asString())) { outcomeMap.put( activity.at("hasOutcome").at("iri").asString(), activity.at("hasOutcome").at("label").asString() ); outcome.append(activity.at("hasOutcome").at("label").asString()); } } else if(activity.at("hasOutcome").isString()) { if(outcomeMap.containsKey(activity.at("hasOutcome").asString())) outcome.append(outcomeMap.get(activity.at("hasOutcome").asString())); else outcome.append(OWL.fullIri(activity.at("hasOutcome").asString()).getFragment()); } } //table = new PdfPTable(7); table = new PdfPTable(6); table.setWidthPercentage(100); table.setWidths(widths); addCell(cell, table, activityType, Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, getEmployeeName(assignedTo), Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, formatDate(createdDate, false, false), Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, formatDate(dueDate, false, false), Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, formatDate(completedDate, true, false), Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, outcome.toString(), Element.ALIGN_LEFT, normalFont, color); subCatPart.add(table); if(!details.equals(blankField)) { table = new PdfPTable(2); table.setWidthPercentage(100); int[] detailsWitdh = {10, 90}; table.setWidths(detailsWitdh); addCell(cell, table, "Details: ", Element.ALIGN_LEFT, normalFont, color); addCell(cell, table, details, Element.ALIGN_LEFT, normalFont, color); subCatPart.add(table); } } //subCatPart.add(table); subCatPart.add(new Chunk(new LineSeparator())); } } } private void addContent(Document d, Json data) { Anchor anchor = new Anchor(); Chapter catPart = new Chapter(new Paragraph(anchor), 1); catPart.setNumberDepth(0); Paragraph subPara = new Paragraph(); //new Paragraph("SubCategory 1", subFont); Section subCatPart = catPart.addSection(subPara); subCatPart.setNumberDepth(0); try{ addTopTable(subCatPart, data); addDescription(subCatPart, data); addQuestions(subCatPart, data); addActors(subCatPart, data); addActivities(subCatPart, data); d.add(catPart); } catch(Exception e) { e.printStackTrace(); throw new RuntimeException("Problem during addContend for BO: " + data.toString(), e); } } public void generateReport(OutputStream out, List<Long> boids) { if (DBG) System.out.println("Start: PDFgenerateReport: for nrOfBoids: " + boids.size()); Document doc = null; try { Date date = new Date(); setTime(formatDate(date, true, false)); doc = new Document(PageSize.A4); doc.setMargins(9, 9, doc.topMargin(), doc.bottomMargin()); PdfWriter writer = PdfWriter.getInstance(doc, out); writer.setPageEvent(new TableHeader()); doc.open(); //addMetaData(doc); LegacyEmulator le = new LegacyEmulator(); int i = 1; for(Long boid : boids) { ThreadLocalStopwatch.getWatch().time("PDFViewReport loading " + i + " of " + boids.size()); Json data = le.findServiceCaseOntology(boid).toJSON(); addContent(doc, data); i++; } } catch (DocumentException e) { e.printStackTrace(); throw new RuntimeException(e); } finally { doc.close(); } if (DBG) System.out.println("Done: PDFgenerateReport: for nrOfBoids: " + boids.size()); } /** * Generates the HET Rebate letter based on the given input parameters * @param out : OutputStream to which the letter is written to * @param applicant : ServiceCaseActor of type Applicant * @param hasCaseNumber : Service Request's Case Number * @param isEnglish : A Flag denoting the language of the letter */ public void generateHETRebateLetter(OutputStream out, Json applicant, String hasCaseNumber, boolean isEnglish) { if(DBG) System.out.println("Start : generateHETRebateLetter"); Document doc = null; try { doc = new Document(PageSize.A4); doc.setMargins(9, 9, doc.topMargin(), doc.bottomMargin()); PdfWriter writer = PdfWriter.getInstance(doc, out); doc.open(); addWASDContent(doc, applicant, hasCaseNumber, isEnglish); } catch(Exception e) { e.printStackTrace(); throw new RuntimeException(e); } finally { doc.close(); if(DBG) System.out.println("End : generateHETRebateLetter"); } } private Section addSection(Chapter chapter) { Section section = chapter.addSection(new Paragraph()); section.setNumberDepth(0); return section; } private void addWASDContent(Document d, Json applicant, String hasCaseNumber, boolean isEnglish) { //Anchor anchor = new Anchor(); try{ Chapter chapter = new Chapter(new Paragraph(), 1); chapter.setNumberDepth(0); //addWASDHeader(chapter); addWASDBody(chapter, applicant, hasCaseNumber, isEnglish); d.add(chapter); } catch(Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } public String spanishHETRebateLetterPart1() { return "Gracias por su inter�s en participar en el Programa " + "para el Uso Eficiente del Agua del Departamento de " + "Aguas y Alcantarillodas de Miami-Dade. Hemos recibido " + "su aplicaci�n para el proyecto de Reembolso y est� siendo " + "procesada, usted debe recibir su reembolso en los pr�ximos 60 dias."; } public String spanishHETRebateLetterPart2() { return "Si necesita informaci�n adicional, favor de ponerse en contacto " + "con la oficina del programa para el Uso Eficiente del Agua al" + "(786) 552-8974 o por correo electr�nico en " + "waterconservation@miamidad.gov"; } public String englishHETRebateLetterPart1() { return "We have received your application regarding the " + "Water-Use Efficiency Program High-Efficiency Toilet (HET) " + "Rebate Project. Your application is currently being " + "processed and you should receive your rebate within 60 days. "; } public String englishHETRebateLetterPart2() { return "For additional information, please contact the " + "Water-Use Efficiency Program at (786) 552-8974 " + "or via email at waterconservation@miamidade.gov"; } private void addWASDBody(Chapter chapter, Json applicant, String hasCaseNumber, boolean isEnglish) throws DocumentException { addSection(chapter).add(new Phrase(" ")); addSection(chapter).add(new Phrase(" ")); addSection(chapter).add(new Phrase(" ")); addSection(chapter).add(new Phrase(" ")); addSection(chapter).add(new Phrase(" ")); addSection(chapter).add(new Phrase(" ")); addSection(chapter).add(new Phrase(" ")); Json address = applicant.at("atAddress"); // Json address = data.at("properties").at("atAddress"); addSection(chapter).add(new Phrase(" ")); addSection(chapter).add(new Phrase(formatDate(new Date(), false, false))); addSection(chapter).add(new Phrase(" ")); StringBuilder name = new StringBuilder(""); name.append(applicant.at("Name").asString()) .append(" ") .append(applicant.at("LastName").asString()); addSection(chapter).add(new Phrase(name.toString())); /* for(Json sa : data.at("properties").at("hasServiceAnswer").asJsonList()) { if(OWL.fullIri(sa.at("hasServiceField").at("iri").asString()) .getFragment().equals("WASDHET_WSCQ7") && sa.has("hasAnswerValue")) { StringBuilder name = new StringBuilder(); if(sa.at("hasAnswerValue").at("literal").isArray()) { for(Json literal : sa.at("hasAnswerValue").at("literal").asJsonList()) name.append(literal.asString()).append(" , "); name.deleteCharAt(name.lastIndexOf(",")); } else name.append(sa.at("hasAnswerValue").at("literal").asString()); addSection(chapter).add(new Phrase(name.toString())); } } */ StringBuilder addr = new StringBuilder(); if(address.has("fullAddress")) addr.append(address.at("fullAddress").asString()); if(address.has("Street_Unit_Number") && !address.at("Street_Unit_Number").asString().isEmpty()) addr.append(", #").append(address.at("Street_Unit_Number").asString()); addSection(chapter).add(new Phrase(addr.toString())); addr = new StringBuilder(); if(address.has("Street_Address_City")) addr.append(getCity(address).trim()); if(address.has("Street_Address_State")) addr.append(", ").append( getAddressPropertyValue(address, "Street_Address_State", "USPS_Abbreviation")); if(address.has("Zip_Code") && !address.at("Zip_Code").asString().isEmpty()) addr.append(" - ").append(address.at("Zip_Code").asString()); addSection(chapter).add(new Phrase(addr.toString())); addSection(chapter).add(new Phrase(" ")); addSection(chapter).add(new Phrase(" ")); if(isEnglish) { addSection(chapter).add(new Phrase(englishHETRebateLetterPart1())); addSection(chapter).add(new Phrase(" ")); addSection(chapter).add(new Phrase(englishHETRebateLetterPart2())); } else { addSection(chapter).add(new Phrase(spanishHETRebateLetterPart1())); addSection(chapter).add(new Phrase(" ")); addSection(chapter).add(new Phrase(spanishHETRebateLetterPart2())); } addSection(chapter).add(new Phrase(" ")); addSection(chapter).add(new Phrase(" ")); addSection(chapter).add(new Phrase(" ")); addSection(chapter).add(new Phrase("HET REBATE PROCESS # :"+hasCaseNumber)); //chapter.add(new Chunk(new LineSeparator())); } private void addWASDHeader(Chapter chapter) throws DocumentException { try { String img = StartUp.getConfig().at("workingDir").asString() + "/src/html/images/md-logo.png"; Image logo = Image.getInstance(img); logo.scalePercent(67); PdfPTable table = new PdfPTable(2); table.setWidthPercentage(100); int[] widths = {50, 50}; table.setWidths(widths); //table.addCell(logo); //This exactly fits the image to the size of the cell. PdfPCell cell = new PdfPCell(logo); cell.setBorder(Rectangle.NO_BORDER); table.addCell(cell); String str1 = "Miami-Dade Water and Sewer Department"; String str2 = "P.O.Box 33016 . 3071 SW 38 Ave"; String str3 = "Miami, Florida 33146"; String str4 = "T: 786-552-8974"; String str5 = "www.miamidade.gov"; PdfPTable wasdTable = new PdfPTable(1); addCell(wasdTable, str1, Element.ALIGN_RIGHT, boldFont, null); addCell(wasdTable, str2, Element.ALIGN_RIGHT, normalFont, null); addCell(wasdTable, str3, Element.ALIGN_RIGHT, normalFont, null); addCell(wasdTable, str4, Element.ALIGN_RIGHT, normalFont, null); addCell(wasdTable, str5, Element.ALIGN_RIGHT, boldFont, null); cell = new PdfPCell(wasdTable); cell.setBorder(Rectangle.NO_BORDER); table.addCell(cell); addSection(chapter).add(table); } catch(Exception e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); } } private Json getServiceCase(String caseNumber) { LegacyEmulator le = new LegacyEmulator(); Long boid = null; if(caseNumber.contains("-")) { Json queryData = Json.object() .set("legacy:hasCaseNumber", caseNumber) .set("type","legacy:ServiceCase"); boid = le.lookupServiceCaseId(queryData); if(boid == -1) throw new RuntimeException("No Service Request present with Case Number : "+caseNumber); } else { boid = new Long(caseNumber); } BOntology bo = le.findServiceCaseOntology(boid); if(bo == null) throw new RuntimeException("No Service Request present with Case Number :"+caseNumber); else return bo.toJSON(); } public void errorReport(OutputStream out) { if (DBG) System.out.println("Start: PDF errorReport"); try { Date date = new Date(); setTime(formatDate(date, true, false)); Document doc = new Document(PageSize.A4); doc.setMargins(9, 9, doc.topMargin(), doc.bottomMargin()); PdfWriter writer = PdfWriter.getInstance(doc, out); TableHeader th = new TableHeader(); writer.setPageEvent(th); doc.open(); Chapter chapter = new Chapter(new Paragraph(), 1); chapter.setNumberDepth(0); addSection(chapter).add(new Phrase(" ")); addSection(chapter).add(new Phrase(" ")); addSection(chapter).add(new Phrase(genericErrorMsg)); doc.add(chapter); doc.close(); } catch (DocumentException e) { e.printStackTrace(); throw new RuntimeException(e); } if (DBG) System.out.println("Done: PDF errorReport"); } /* public static void main(String args[]) { try { PDFViewReport pvr = new PDFViewReport(); pvr.setTitle("Service Request Summary Report"); Date date = new Date(); // pvr.setTime(pvr.formatDate(date, true)); OutputStream os = new FileOutputStream("C:/phaniTest.pdf"); Document d = new Document(PageSize.A4); d.setMargins(9, 9, d.topMargin(), d.bottomMargin()); PdfWriter writer = PdfWriter.getInstance(d, os); TableHeader th = pvr.new TableHeader(); writer.setPageEvent(th); d.open(); // Long boid = (long) 1927; // pvr.addContent(d, boid); pvr.addWASDContent(d, pvr.getServiceCase("13-10005150"), "13-10005151", true); //5164546 d.close(); } catch(Exception e) { e.printStackTrace(); } finally { System.out.println("************** Execution Complete **************"); } } */ }