diff --git a/handlers/print-get/pdf.js b/handlers/print-get/pdf.js index 72e63c79..4024c765 100644 --- a/handlers/print-get/pdf.js +++ b/handlers/print-get/pdf.js @@ -1,6 +1,7 @@ import path from "path"; import * as ejs from "ejs"; import * as configFunctions from "../../helpers/functions.config.js"; +import * as dateTimeFunctions from "@cityssm/expressjs-server-js/dateTimeFns.js"; import { getReportData, getPdfPrintConfig } from "../../helpers/functions.print.js"; import convertHTMLToPDF from "pdf-puppeteer"; import camelcase from "camelcase"; @@ -14,10 +15,12 @@ export const handler = async (request, response, next) => { const reportData = getReportData(printConfig, request.query); const reportPath = path.join("views", "print", "pdf", printName + ".ejs"); const pdfCallbackFunction = (pdf) => { - response.setHeader("Content-Disposition", "attachment;" + " filename=" + camelcase(printConfig.title) + ".pdf"); + response.setHeader("Content-Disposition", "inline;" + " filename=" + camelcase(printConfig.title) + ".pdf"); response.setHeader("Content-Type", "application/pdf"); response.send(pdf); }; + reportData.configFunctions = configFunctions; + reportData.dateTimeFunctions = dateTimeFunctions; await ejs.renderFile(reportPath, reportData, {}, async (ejsError, ejsData) => { if (ejsError) { return next(ejsError); diff --git a/handlers/print-get/pdf.ts b/handlers/print-get/pdf.ts index dd8b301c..a9b2d690 100644 --- a/handlers/print-get/pdf.ts +++ b/handlers/print-get/pdf.ts @@ -4,6 +4,8 @@ import path from "path"; import * as ejs from "ejs"; import * as configFunctions from "../../helpers/functions.config.js"; +import * as dateTimeFunctions from "@cityssm/expressjs-server-js/dateTimeFns.js"; + import { getReportData, getPdfPrintConfig } from "../../helpers/functions.print.js"; import convertHTMLToPDF from "pdf-puppeteer"; @@ -28,7 +30,7 @@ export const handler: RequestHandler = async (request, response, next) => { const pdfCallbackFunction = (pdf: Buffer) => { response.setHeader( "Content-Disposition", - "attachment;" + " filename=" + camelcase(printConfig.title) + ".pdf" + "inline;" + " filename=" + camelcase(printConfig.title) + ".pdf" ); response.setHeader("Content-Type", "application/pdf"); @@ -36,6 +38,9 @@ export const handler: RequestHandler = async (request, response, next) => { response.send(pdf); }; + reportData.configFunctions = configFunctions; + reportData.dateTimeFunctions = dateTimeFunctions; + await ejs.renderFile(reportPath, reportData, {}, async (ejsError, ejsData) => { if (ejsError) { return next(ejsError); diff --git a/helpers/functions.config.d.ts b/helpers/functions.config.d.ts index be7d2f0c..d2efc417 100644 --- a/helpers/functions.config.d.ts +++ b/helpers/functions.config.d.ts @@ -38,5 +38,6 @@ export declare function getProperty(propertyName: "settings.workOrders.workOrder export declare function getProperty(propertyName: "settings.workOrders.workOrderMilestoneDateRecentBeforeDays"): number; export declare function getProperty(propertyName: "settings.workOrders.workOrderMilestoneDateRecentAfterDays"): number; export declare function getProperty(propertyName: "settings.workOrders.calendarEmailAddress"): string; +export declare function getProperty(propertyName: "settings.workOrders.prints"): string[]; export declare function getProperty(propertyName: "settings.adminCleanup.recordDeleteAgeDays"): number; export declare const keepAliveMillis: number; diff --git a/helpers/functions.config.js b/helpers/functions.config.js index c3a8169d..1dd1d142 100644 --- a/helpers/functions.config.js +++ b/helpers/functions.config.js @@ -37,6 +37,7 @@ configFallbackValues.set("settings.workOrders.workOrderNumberLength", 6); configFallbackValues.set("settings.workOrders.workOrderMilestoneDateRecentBeforeDays", 5); configFallbackValues.set("settings.workOrders.workOrderMilestoneDateRecentAfterDays", 60); configFallbackValues.set("settings.workOrders.calendarEmailAddress", "no-reply@127.0.0.1"); +configFallbackValues.set("settings.workOrders.prints", ["pdf/workOrder"]); configFallbackValues.set("settings.adminCleanup.recordDeleteAgeDays", 60); export function getProperty(propertyName) { const propertyNameSplit = propertyName.split("."); diff --git a/helpers/functions.config.ts b/helpers/functions.config.ts index a39200b6..c00fa76c 100644 --- a/helpers/functions.config.ts +++ b/helpers/functions.config.ts @@ -56,6 +56,7 @@ configFallbackValues.set("settings.workOrders.workOrderNumberLength", 6); configFallbackValues.set("settings.workOrders.workOrderMilestoneDateRecentBeforeDays", 5); configFallbackValues.set("settings.workOrders.workOrderMilestoneDateRecentAfterDays", 60); configFallbackValues.set("settings.workOrders.calendarEmailAddress", "no-reply@127.0.0.1"); +configFallbackValues.set("settings.workOrders.prints", ["pdf/workOrder"]); configFallbackValues.set("settings.adminCleanup.recordDeleteAgeDays", 60); @@ -129,6 +130,7 @@ export function getProperty( ): number; export function getProperty(propertyName: "settings.workOrders.calendarEmailAddress"): string; +export function getProperty(propertyName: "settings.workOrders.prints"): string[]; export function getProperty(propertyName: "settings.adminCleanup.recordDeleteAgeDays"): number; diff --git a/helpers/functions.print.js b/helpers/functions.print.js index ef026e2c..0bfda04f 100644 --- a/helpers/functions.print.js +++ b/helpers/functions.print.js @@ -1,6 +1,7 @@ import * as configFunctions from "./functions.config.js"; import { getLot } from "./lotOccupancyDB/getLot.js"; import { getLotOccupancy } from "./lotOccupancyDB/getLotOccupancy.js"; +import { getWorkOrder } from "./lotOccupancyDB/getWorkOrder.js"; const screenPrintConfigs = { lotOccupancy: { title: configFunctions.getProperty("aliases.lot") + @@ -14,6 +15,10 @@ export const getScreenPrintConfig = (printName) => { return screenPrintConfigs[printName]; }; const pdfPrintConfigs = { + "workOrder": { + title: "Work Order Field Sheet", + params: ["workOrderId"] + }, "ssm.cemetery.burialPermit": { title: "Burial Permit", params: ["lotOccupancyId"] @@ -43,5 +48,13 @@ export const getReportData = (printConfig, requestQuery) => { reportData.lot = getLot(reportData.lotOccupancy.lotId); } } + if (printConfig.params.includes("workOrderId") && + typeof requestQuery.workOrderId === "string") { + reportData.workOrder = getWorkOrder(requestQuery.workOrderId, { + includeLotsAndLotOccupancies: true, + includeComments: true, + includeMilestones: true + }); + } return reportData; }; diff --git a/helpers/functions.print.ts b/helpers/functions.print.ts index 4f45612b..6d14fffc 100644 --- a/helpers/functions.print.ts +++ b/helpers/functions.print.ts @@ -2,6 +2,7 @@ import * as configFunctions from "./functions.config.js"; import { getLot } from "./lotOccupancyDB/getLot.js"; import { getLotOccupancy } from "./lotOccupancyDB/getLotOccupancy.js"; +import { getWorkOrder } from "./lotOccupancyDB/getWorkOrder.js"; import type * as recordTypes from "../types/recordTypes"; @@ -26,6 +27,12 @@ export const getScreenPrintConfig = (printName: string): PrintConfig => { }; const pdfPrintConfigs: { [printName: string]: PrintConfig } = { + "workOrder": { + title: "Work Order Field Sheet", + params: ["workOrderId"] + }, + + // Occupancy "ssm.cemetery.burialPermit": { title: "Burial Permit", params: ["lotOccupancyId"] @@ -70,5 +77,16 @@ export const getReportData = ( } } + if ( + printConfig.params.includes("workOrderId") && + typeof requestQuery.workOrderId === "string" + ) { + reportData.workOrder = getWorkOrder(requestQuery.workOrderId, { + includeLotsAndLotOccupancies: true, + includeComments: true, + includeMilestones: true + }); + } + return reportData; }; diff --git a/helpers/lotOccupancyDB/getWorkOrder.js b/helpers/lotOccupancyDB/getWorkOrder.js index 26f37829..601966f8 100644 --- a/helpers/lotOccupancyDB/getWorkOrder.js +++ b/helpers/lotOccupancyDB/getWorkOrder.js @@ -10,7 +10,7 @@ const baseSQL = "select w.workOrderId," + " w.workOrderNumber, w.workOrderDescription," + " w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," + " w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString," + - " w.recordUpdate_timeMillis" + + " w.recordCreate_timeMillis, w.recordUpdate_timeMillis" + " from WorkOrders w" + " left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" + " where w.recordDelete_timeMillis is null"; diff --git a/helpers/lotOccupancyDB/getWorkOrder.ts b/helpers/lotOccupancyDB/getWorkOrder.ts index 285d6513..93ff7df4 100644 --- a/helpers/lotOccupancyDB/getWorkOrder.ts +++ b/helpers/lotOccupancyDB/getWorkOrder.ts @@ -26,7 +26,7 @@ const baseSQL = " w.workOrderNumber, w.workOrderDescription," + " w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," + " w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString," + - " w.recordUpdate_timeMillis" + + " w.recordCreate_timeMillis, w.recordUpdate_timeMillis" + " from WorkOrders w" + " left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" + " where w.recordDelete_timeMillis is null"; diff --git a/views/print/pdf/ssm.cemetery.burialPermit.ejs b/views/print/pdf/ssm.cemetery.burialPermit.ejs index 3588624e..bbf98173 100644 --- a/views/print/pdf/ssm.cemetery.burialPermit.ejs +++ b/views/print/pdf/ssm.cemetery.burialPermit.ejs @@ -1,6 +1,8 @@
- +
+ Work Order #<%= workOrder.workOrderNumber %>+ |
+
+
+ <% if (workOrder.workOrderCloseDate) { %>
+ CLOSED + <% } %> + <%= workOrder.workOrderType %> + + |
+
|
+
+
+ Description |
+
+
+ Open Date
+ Close Date |
+
| <%= configFunctions.getProperty("aliases.lot") %> | +<%= configFunctions.getProperty("aliases.map") %> | +<%= configFunctions.getProperty("aliases.lot") %> Type | +Status | +
|---|---|---|---|
| <%= lot.lotName %> | +<%= lot.mapName %> | +<%= lot.lotType %> | +<%= lot.lotStatus %> | +
| <%= configFunctions.getProperty("aliases.occupancy") %> Type | +<%= configFunctions.getProperty("aliases.lot") %> | +Start Date | +End Date | +<%= configFunctions.getProperty("aliases.occupants") %> | +
|---|---|---|---|---|
| <%= occupancy.occupancyType %> | +<%= occupancy.lotName %> | +<%= occupancy.occupancyStartDateString %> | +<%= occupancy.occupancyStartEndString %> | +
+ <% for (const occupant of occupancy.lotOccupancyOccupants) { %>
+ <%= occupant.occupantName %> + <% } %> + |
+
| + | Milestone Description | +Due Date | +
|---|---|---|
| + <% if (milestone.workOrderMilestoneCompletionDate) { %> + + <% } else { %> + + <% } %> + | +
+ <% if (milestone.workOrderMilestoneTypeId) { %>
+ <%= milestone.workOrderMilestoneType %> + <% } %> + <%= milestone.workOrderMilestoneDescription %> + |
+ + <%= milestone.workOrderMilestoneDateString %> + <% if (milestone.workOrderMilestoneTime) { %> + <%= milestone.workOrderMilestoneTimeString %> + <% } %> + | +
+ <%
+ const recordCreateDate = new Date(workOrder.recordCreate_timeMillis);
+ const currentDate = new Date();
+ %>
+ Work order created <%= dateTimeFunctions.dateToString(recordCreateDate) %> at <%= dateTimeFunctions.dateToTimeString(recordCreateDate) %>.
+ Printed <%= dateTimeFunctions.dateToString(currentDate) %> at <%= dateTimeFunctions.dateToTimeString(currentDate) %>.
+ workOrderId = <%= workOrder.workOrderId %>
+