show funeral details on work order view

pull/11/head
Dan Gowans 2025-04-28 13:08:31 -04:00
parent 556a6a71b6
commit afa0286a2a
3 changed files with 96 additions and 63 deletions

View File

@ -1,4 +1,4 @@
import { dateIntegerToString, dateStringToInteger, timeIntegerToString } from '@cityssm/utils-datetime'; import { dateIntegerToString, dateStringToInteger, timeIntegerToPeriodString, timeIntegerToString } from '@cityssm/utils-datetime';
import sqlite from 'better-sqlite3'; import sqlite from 'better-sqlite3';
import { getConfigProperty } from '../helpers/config.helpers.js'; import { getConfigProperty } from '../helpers/config.helpers.js';
import { sunriseDB } from '../helpers/database.helpers.js'; import { sunriseDB } from '../helpers/database.helpers.js';
@ -11,6 +11,7 @@ export default async function getContracts(filters, options, connectedDatabase)
const database = connectedDatabase ?? sqlite(sunriseDB); const database = connectedDatabase ?? sqlite(sunriseDB);
database.function('userFn_dateIntegerToString', dateIntegerToString); database.function('userFn_dateIntegerToString', dateIntegerToString);
database.function('userFn_timeIntegerToString', timeIntegerToString); database.function('userFn_timeIntegerToString', timeIntegerToString);
database.function('userFn_timeIntegerToPeriodString', timeIntegerToPeriodString);
const { sqlParameters, sqlWhereClause } = buildWhereClause(filters); const { sqlParameters, sqlWhereClause } = buildWhereClause(filters);
let count = typeof options.limit === 'string' let count = typeof options.limit === 'string'
? Number.parseInt(options.limit, 10) ? Number.parseInt(options.limit, 10)
@ -40,7 +41,10 @@ export default async function getContracts(filters, options, connectedDatabase)
o.funeralHomeId, o.funeralDirectorName, f.funeralHomeName, o.funeralHomeId, o.funeralDirectorName, f.funeralHomeName,
o.funeralDate, userFn_dateIntegerToString(o.funeralDate) as funeralDateString, o.funeralDate, userFn_dateIntegerToString(o.funeralDate) as funeralDateString,
o.funeralTime, userFn_timeIntegerToString(o.funeralTime) as funeralTimeString, o.funeralTime,
userFn_timeIntegerToString(o.funeralTime) as funeralTimeString,
userFn_timeIntegerToPeriodString(o.funeralTime) as funeralTimePeriodString,
o.directionOfArrival,
o.committalTypeId, c.committalType o.committalTypeId, c.committalType
from Contracts o from Contracts o
left join ContractTypes t on o.contractTypeId = t.contractTypeId left join ContractTypes t on o.contractTypeId = t.contractTypeId

View File

@ -2,6 +2,7 @@ import {
type DateString, type DateString,
dateIntegerToString, dateIntegerToString,
dateStringToInteger, dateStringToInteger,
timeIntegerToPeriodString,
timeIntegerToString timeIntegerToString
} from '@cityssm/utils-datetime' } from '@cityssm/utils-datetime'
import sqlite from 'better-sqlite3' import sqlite from 'better-sqlite3'
@ -60,6 +61,8 @@ export default async function getContracts(
database.function('userFn_dateIntegerToString', dateIntegerToString) database.function('userFn_dateIntegerToString', dateIntegerToString)
database.function('userFn_timeIntegerToString', timeIntegerToString) database.function('userFn_timeIntegerToString', timeIntegerToString)
database.function(
'userFn_timeIntegerToPeriodString', timeIntegerToPeriodString)
const { sqlParameters, sqlWhereClause } = buildWhereClause(filters) const { sqlParameters, sqlWhereClause } = buildWhereClause(filters)
@ -101,7 +104,10 @@ export default async function getContracts(
o.funeralHomeId, o.funeralDirectorName, f.funeralHomeName, o.funeralHomeId, o.funeralDirectorName, f.funeralHomeName,
o.funeralDate, userFn_dateIntegerToString(o.funeralDate) as funeralDateString, o.funeralDate, userFn_dateIntegerToString(o.funeralDate) as funeralDateString,
o.funeralTime, userFn_timeIntegerToString(o.funeralTime) as funeralTimeString, o.funeralTime,
userFn_timeIntegerToString(o.funeralTime) as funeralTimeString,
userFn_timeIntegerToPeriodString(o.funeralTime) as funeralTimePeriodString,
o.directionOfArrival,
o.committalTypeId, c.committalType o.committalTypeId, c.committalType
from Contracts o from Contracts o
left join ContractTypes t on o.contractTypeId = t.contractTypeId left join ContractTypes t on o.contractTypeId = t.contractTypeId

View File

@ -140,7 +140,7 @@
</div> </div>
<div class="panel"> <div class="panel">
<h2 class="panel-heading">Related Burial Sites</h2> <h2 class="panel-heading">Related Contracts</h2>
<div class="panel-block is-block"> <div class="panel-block is-block">
<% <%
const tabToSelect = (workOrder.workOrderContracts.length > 0 || workOrder.workOrderBurialSites.length === 0 ? "contracts" : "burialSites"); const tabToSelect = (workOrder.workOrderContracts.length > 0 || workOrder.workOrderBurialSites.length === 0 ? "contracts" : "burialSites");
@ -312,76 +312,99 @@
</div> </div>
<% } %> <% } %>
</div> </div>
<% if (workOrder.workOrderMilestones.length > 0) { %>
<div class="column is-4-desktop"> <div class="column is-4-desktop">
<% if (workOrder.workOrderContracts.length > 0) { %>
<div class="panel"> <div class="panel">
<div class="panel-heading"> <h2 class="panel-heading">Contract Milestones</h2>
<div class="level is-mobile"> <% let hasContractMilestones = false; %>
<div class="level-left"> <% for (const contract of workOrder.workOrderContracts) { %>
<div class="level-item"> <% if (contract.funeralDate !== null && contract.funeralDate >= workOrder.workOrderOpenDate && (workOrder.workOrderCloseDate === null || workOrderCloseDate >= contract.funeralDate)) { %>
<h2 class="title is-5 has-text-white has-text-weight-bold">Milestones</h2> <% hasContractMilestones = true; %>
</div> <div class="panel-block is-block">
<strong>Funeral</strong><br />
<%= contract.funeralDateString %>
<% if (contract.funeralTime !== null && contract.funeralTime !== 0) { %>
<%= contract.funeralTimePeriodString %>
<% } %><br />
<%= contract.funeralHomeName %><br />
</div> </div>
<div class="level-right"> <% } %>
<div class="level-item"> <% } %>
<div class="dropdown is-right has-text-weight-normal"> <% if (!hasContractMilestones) { %>
<div class="dropdown-trigger"> <div class="panel-block is-block">
<button class="button is-small has-tooltip-left" type="button" data-tooltip="Milestone Options" aria-label="Options"> <p class="has-text-grey">No relevant contract milestones available.</p>
<i class="fas fa-ellipsis-v" aria-hidden="true"></i> </div>
</button> <% } %>
</div> </div>
<div class="dropdown-menu"> <% } %>
<div class="dropdown-content"> <div class="panel">
<a class="dropdown-item" href="<%= urlPrefix %>/api/<%= user.userProperties.apiKey %>/milestoneICS/?workOrderId=<%= workOrder.workOrderId %>"> <div class="panel-heading">
<span class="icon is-small"><i class="fas fa-calendar" aria-hidden="true"></i></span> <div class="level is-mobile">
<span>Download iCalendar</span> <div class="level-left">
</a> <div class="level-item">
<a class="dropdown-item" href="<%= urlPrefix %>/reports/workOrderMilestones-byWorkOrderId/?workOrderId=<%= workOrder.workOrderId %>" target="_blank" download> <h2 class="title is-5 has-text-white has-text-weight-bold">Milestones</h2>
<span class="icon is-small"><i class="fas fa-download" aria-hidden="true"></i></span> </div>
<span>Export as CSV</span> </div>
</a> <div class="level-right">
</div> <div class="level-item">
<div class="dropdown is-right has-text-weight-normal">
<div class="dropdown-trigger">
<button class="button is-small has-tooltip-left" type="button" data-tooltip="Milestone Options" aria-label="Options">
<i class="fas fa-ellipsis-v" aria-hidden="true"></i>
</button>
</div>
<div class="dropdown-menu">
<div class="dropdown-content">
<a class="dropdown-item" href="<%= urlPrefix %>/api/<%= user.userProperties.apiKey %>/milestoneICS/?workOrderId=<%= workOrder.workOrderId %>">
<span class="icon is-small"><i class="fas fa-calendar" aria-hidden="true"></i></span>
<span>Download iCalendar</span>
</a>
<a class="dropdown-item" href="<%= urlPrefix %>/reports/workOrderMilestones-byWorkOrderId/?workOrderId=<%= workOrder.workOrderId %>" target="_blank" download>
<span class="icon is-small"><i class="fas fa-download" aria-hidden="true"></i></span>
<span>Export as CSV</span>
</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<% for (const milestone of workOrder.workOrderMilestones) { %> </div>
<div class="panel-block is-block"> <% for (const milestone of workOrder.workOrderMilestones) { %>
<div class="columns is-mobile"> <div class="panel-block is-block">
<div class="column is-narrow"> <div class="columns is-mobile">
<% if (milestone.workOrderMilestoneCompletionDate) { %> <div class="column is-narrow">
<span class="icon is-small" data-tooltip="Completed <%= milestone.workOrderMilestoneCompletionDateString %>"> <% if (milestone.workOrderMilestoneCompletionDate) { %>
<i class="fas fa-check" aria-label="Completed <%= milestone.workOrderMilestoneCompletionDateString %>"></i> <span class="icon is-small" data-tooltip="Completed <%= milestone.workOrderMilestoneCompletionDateString %>">
</span> <i class="fas fa-check" aria-label="Completed <%= milestone.workOrderMilestoneCompletionDateString %>"></i>
<% } else { %> </span>
<span class="icon is-small"> <% } else { %>
<i class="far fa-square has-text-grey" aria-label="Incomplete"></i> <span class="icon is-small">
</span> <i class="far fa-square has-text-grey" aria-label="Incomplete"></i>
<% } %> </span>
</div> <% } %>
<div class="column"> </div>
<% if (milestone.workOrderMilestoneTypeId) { %> <div class="column">
<strong><%= milestone.workOrderMilestoneType %></strong><br /> <% if (milestone.workOrderMilestoneTypeId) { %>
<% } %> <strong><%= milestone.workOrderMilestoneType %></strong><br />
<% if (milestone.workOrderMilestoneDate === 0) { %> <% } %>
<span class="has-text-grey">(No Set Date)</span> <% if (milestone.workOrderMilestoneDate === 0) { %>
<% } else { %> <span class="has-text-grey">(No Set Date)</span>
<%= milestone.workOrderMilestoneDateString %> <% } else { %>
<% } %> <%= milestone.workOrderMilestoneDateString %>
<% if (milestone.workOrderMilestoneTime !== 0) { %> <% } %>
<%= milestone.workOrderMilestoneTimePeriodString %> <% if (milestone.workOrderMilestoneTime !== 0) { %>
<% } %> <%= milestone.workOrderMilestoneTimePeriodString %>
<br /> <% } %>
<span class="is-size-7"><%= milestone.workOrderMilestoneDescription %></span> <br />
</div> <span class="is-size-7"><%= milestone.workOrderMilestoneDescription %></span>
</div> </div>
</div> </div>
<% } %> </div>
</div> <% } %>
</div> </div>
<% } %> </div>
</div> </div>
<%- include('_footerA'); -%> <%- include('_footerA'); -%>