work order search

deepsource-autofix-76c6eb20
Dan Gowans 2022-08-29 16:10:58 -04:00
parent 679e1e7a55
commit 9af03a05e6
32 changed files with 865 additions and 146 deletions

View File

@ -1,16 +1,20 @@
import type { RequestHandler } from "express"; import type {
RequestHandler
} from "express";
import { addLot } from "../../helpers/lotOccupancyDB/addLot.js"; import {
addLot
} from "../../helpers/lotOccupancyDB/addLot.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const lotId = addLot(request.body, request.session); const lotId = addLot(request.body, request.session);
response.json({ response.json({
success: true, success: true,
lotId lotId
}); });
}; };

View File

@ -1,19 +1,23 @@
import type { RequestHandler } from "express"; import type {
RequestHandler
} from "express";
import { getLots } from "../../helpers/lotOccupancyDB/getLots.js"; import {
getLots
} from "../../helpers/lotOccupancyDB/getLots.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const result = getLots(request.body, { const result = getLots(request.body, {
limit: request.body.limit, limit: request.body.limit,
offset: request.body.offset offset: request.body.offset
}); });
response.json({ response.json({
count: result.count, count: result.count,
lots: result.lots lots: result.lots
}); });
}; };

View File

@ -1,16 +1,20 @@
import type { RequestHandler } from "express"; import type {
RequestHandler
} from "express";
import { updateLot } from "../../helpers/lotOccupancyDB/updateLot.js"; import {
updateLot
} from "../../helpers/lotOccupancyDB/updateLot.js";
export const handler: RequestHandler = async (request, response) => { export const handler: RequestHandler = async (request, response) => {
const success = updateLot(request.body, request.session); const success = updateLot(request.body, request.session);
response.json({ response.json({
success, success,
lotId: request.body.lotId lotId: request.body.lotId
}); });
}; };

View File

@ -1,6 +1,9 @@
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
export const handler = (request, response) => { export const handler = (request, response) => {
const workOrderTypes = getWorkOrderTypes();
response.render("workOrder-search", { response.render("workOrder-search", {
headTitle: "Work Order Search" headTitle: "Work Order Search",
workOrderTypes
}); });
}; };
export default handler; export default handler;

View File

@ -2,11 +2,16 @@ import type {
RequestHandler RequestHandler
} from "express"; } from "express";
import { getWorkOrderTypes } from "../../helpers/functions.cache.js";
export const handler: RequestHandler = (request, response) => { export const handler: RequestHandler = (request, response) => {
const workOrderTypes = getWorkOrderTypes();
response.render("workOrder-search", { response.render("workOrder-search", {
headTitle: "Work Order Search" headTitle: "Work Order Search",
workOrderTypes
}); });
}; };

View File

@ -0,0 +1,3 @@
import type { RequestHandler } from "express";
export declare const handler: RequestHandler;
export default handler;

View File

@ -0,0 +1,12 @@
import { getWorkOrders } from "../../helpers/lotOccupancyDB/getWorkOrders.js";
export const handler = async (request, response) => {
const result = getWorkOrders(request.body, {
limit: request.body.limit,
offset: request.body.offset
});
response.json({
count: result.count,
workOrders: result.workOrders
});
};
export default handler;

View File

@ -0,0 +1,24 @@
import type {
RequestHandler
} from "express";
import {
getWorkOrders
} from "../../helpers/lotOccupancyDB/getWorkOrders.js";
export const handler: RequestHandler = async (request, response) => {
const result = getWorkOrders(request.body, {
limit: request.body.limit,
offset: request.body.offset
});
response.json({
count: result.count,
workOrders: result.workOrders
});
};
export default handler;

View File

@ -1,5 +1,8 @@
import sqlite from "better-sqlite3"; import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
import {
lotOccupancyDB as databasePath
} from "../../data/databasePaths.js";
import type * as recordTypes from "../../types/recordTypes"; import type * as recordTypes from "../../types/recordTypes";
@ -20,40 +23,40 @@ interface AddMapForm {
export const addMap = export const addMap =
(mapForm: AddMapForm, requestSession: recordTypes.PartialSession): number => { (mapForm: AddMapForm, requestSession: recordTypes.PartialSession): number => {
const database = sqlite(databasePath); const database = sqlite(databasePath);
const rightNowMillis = Date.now(); const rightNowMillis = Date.now();
const result = database const result = database
.prepare("insert into Maps (" + .prepare("insert into Maps (" +
"mapName, mapDescription," + "mapName, mapDescription," +
" mapSVG, mapLatitude, mapLongitude," + " mapSVG, mapLatitude, mapLongitude," +
" mapAddress1, mapAddress2, mapCity, mapProvince, mapPostalCode, mapPhoneNumber," + " mapAddress1, mapAddress2, mapCity, mapProvince, mapPostalCode, mapPhoneNumber," +
" recordCreate_userName, recordCreate_timeMillis," + " recordCreate_userName, recordCreate_timeMillis," +
" recordUpdate_userName, recordUpdate_timeMillis)" + " recordUpdate_userName, recordUpdate_timeMillis)" +
" values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") " values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
.run(mapForm.mapName, .run(mapForm.mapName,
mapForm.mapDescription, mapForm.mapDescription,
mapForm.mapSVG, mapForm.mapSVG,
(mapForm.mapLatitude === "" ? undefined : mapForm.mapLatitude), (mapForm.mapLatitude === "" ? undefined : mapForm.mapLatitude),
(mapForm.mapLongitude === "" ? undefined : mapForm.mapLongitude), (mapForm.mapLongitude === "" ? undefined : mapForm.mapLongitude),
mapForm.mapAddress1, mapForm.mapAddress1,
mapForm.mapAddress2, mapForm.mapAddress2,
mapForm.mapCity, mapForm.mapCity,
mapForm.mapProvince, mapForm.mapProvince,
mapForm.mapPostalCode, mapForm.mapPostalCode,
mapForm.mapPhoneNumber, mapForm.mapPhoneNumber,
requestSession.user.userName, requestSession.user.userName,
rightNowMillis, rightNowMillis,
requestSession.user.userName, requestSession.user.userName,
rightNowMillis); rightNowMillis);
database.close(); database.close();
return result.lastInsertRowid as number; return result.lastInsertRowid as number;
}; };
export default addMap; export default addMap;

View File

@ -0,0 +1,10 @@
import type * as recordTypes from "../../types/recordTypes";
interface AddWorkOrderForm {
workOrderTypeId: number | string;
workOrderNumber: string;
workOrderDescription: string;
workOrderOpenDateString?: string;
workOrderCloseDateString?: string;
}
export declare const addWorkOrder: (workOrderForm: AddWorkOrderForm, requestSession: recordTypes.PartialSession) => number;
export default addWorkOrder;

View File

@ -0,0 +1,18 @@
import { dateStringToInteger, dateToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js";
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
export const addWorkOrder = (workOrderForm, requestSession) => {
const database = sqlite(databasePath);
const rightNow = new Date();
const result = database
.prepare("insert into WorkOrders (" +
"workOrderTypeId, workOrderNumber, workOrderDescription," +
" workOrderOpenDate, workOrderCloseDate," +
" recordCreate_userName, recordCreate_timeMillis," +
" recordUpdate_userName, recordUpdate_timeMillis)" +
" values (?, ?, ?, ?, ?, ?, ?, ?, ?)")
.run(workOrderForm.workOrderTypeId, workOrderForm.workOrderNumber, workOrderForm.workOrderDescription, (workOrderForm.workOrderOpenDateString ? dateStringToInteger(workOrderForm.workOrderOpenDateString) : dateToInteger(rightNow)), (workOrderForm.workOrderCloseDateString ? dateStringToInteger(workOrderForm.workOrderCloseDateString) : undefined), requestSession.user.userName, rightNow.getTime(), requestSession.user.userName, rightNow.getTime());
database.close();
return result.lastInsertRowid;
};
export default addWorkOrder;

View File

@ -0,0 +1,50 @@
import { dateStringToInteger, dateToInteger } from "@cityssm/expressjs-server-js/dateTimeFns.js";
import sqlite from "better-sqlite3";
import {
lotOccupancyDB as databasePath
} from "../../data/databasePaths.js";
import type * as recordTypes from "../../types/recordTypes";
interface AddWorkOrderForm {
workOrderTypeId: number | string;
workOrderNumber: string;
workOrderDescription: string;
workOrderOpenDateString?: string;
workOrderCloseDateString?: string;
}
export const addWorkOrder =
(workOrderForm: AddWorkOrderForm, requestSession: recordTypes.PartialSession): number => {
const database = sqlite(databasePath);
const rightNow = new Date();
const result = database
.prepare("insert into WorkOrders (" +
"workOrderTypeId, workOrderNumber, workOrderDescription," +
" workOrderOpenDate, workOrderCloseDate," +
" recordCreate_userName, recordCreate_timeMillis," +
" recordUpdate_userName, recordUpdate_timeMillis)" +
" values (?, ?, ?, ?, ?, ?, ?, ?, ?)")
.run(workOrderForm.workOrderTypeId,
workOrderForm.workOrderNumber,
workOrderForm.workOrderDescription,
(workOrderForm.workOrderOpenDateString ? dateStringToInteger(workOrderForm.workOrderOpenDateString) : dateToInteger(rightNow)),
(workOrderForm.workOrderCloseDateString ? dateStringToInteger(workOrderForm.workOrderCloseDateString) : undefined),
requestSession.user.userName,
rightNow.getTime(),
requestSession.user.userName,
rightNow.getTime());
database.close();
return result.lastInsertRowid as number;
};
export default addWorkOrder;

View File

@ -0,0 +1,7 @@
import type * as recordTypes from "../../types/recordTypes";
interface AddWorkOrderLotForm {
workOrderId: number | string;
lotId: number | string;
}
export declare const addWorkOrderLot: (workOrderLotForm: AddWorkOrderLotForm, requestSession: recordTypes.PartialSession) => boolean;
export default addWorkOrderLot;

View File

@ -0,0 +1,16 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
export const addWorkOrderLot = (workOrderLotForm, requestSession) => {
const database = sqlite(databasePath);
const rightNowMillis = Date.now();
const result = database
.prepare("insert into WorkOrderLots (" +
"workOrderId, lotId," +
" recordCreate_userName, recordCreate_timeMillis," +
" recordUpdate_userName, recordUpdate_timeMillis)" +
" values (?, ?, ?, ?, ?, ?)")
.run(workOrderLotForm.workOrderId, workOrderLotForm.lotId, requestSession.user.userName, rightNowMillis, requestSession.user.userName, rightNowMillis);
database.close();
return result.changes > 0;
};
export default addWorkOrderLot;

View File

@ -0,0 +1,42 @@
import sqlite from "better-sqlite3";
import {
lotOccupancyDB as databasePath
} from "../../data/databasePaths.js";
import type * as recordTypes from "../../types/recordTypes";
interface AddWorkOrderLotForm {
workOrderId: number | string;
lotId: number | string;
}
export const addWorkOrderLot =
(workOrderLotForm: AddWorkOrderLotForm, requestSession: recordTypes.PartialSession): boolean => {
const database = sqlite(databasePath);
const rightNowMillis = Date.now();
const result = database
.prepare("insert into WorkOrderLots (" +
"workOrderId, lotId," +
" recordCreate_userName, recordCreate_timeMillis," +
" recordUpdate_userName, recordUpdate_timeMillis)" +
" values (?, ?, ?, ?, ?, ?)")
.run(workOrderLotForm.workOrderId,
workOrderLotForm.lotId,
requestSession.user.userName,
rightNowMillis,
requestSession.user.userName,
rightNowMillis);
database.close();
return result.changes > 0;
};
export default addWorkOrderLot;

View File

@ -0,0 +1,13 @@
import type * as recordTypes from "../../types/recordTypes";
interface GetWorkOrdersFilters {
workOrderTypeId?: number | string;
}
interface GetWorkOrdersOptions {
limit: number;
offset: number;
}
export declare const getWorkOrders: (filters?: GetWorkOrdersFilters, options?: GetWorkOrdersOptions) => {
count: number;
workOrders: recordTypes.WorkOrder[];
};
export default getWorkOrders;

View File

@ -0,0 +1,43 @@
import sqlite from "better-sqlite3";
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
import { dateIntegerToString } from "@cityssm/expressjs-server-js/dateTimeFns.js";
export const getWorkOrders = (filters, options) => {
const database = sqlite(databasePath, {
readonly: true
});
database.function("userFn_dateIntegerToString", dateIntegerToString);
let sqlWhereClause = " where w.recordDelete_timeMillis is null";
const sqlParameters = [];
if (filters.workOrderTypeId) {
sqlWhereClause += " and w.workOrderTypeId = ?";
sqlParameters.push(filters.workOrderTypeId);
}
const count = database.prepare("select count(*) as recordCount" +
" from WorkOrders w" +
sqlWhereClause)
.get(sqlParameters)
.recordCount;
let workOrders = [];
if (count > 0) {
workOrders = database
.prepare("select w.workOrderId," +
" w.workOrderTypeId, t.workOrderType," +
" w.workOrderNumber, w.workOrderDescription," +
" w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," +
" w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString" +
" from WorkOrders w" +
" left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" +
sqlWhereClause +
" order by w.workOrderOpenDate desc, w.workOrderNumber" +
(options ?
" limit " + options.limit + " offset " + options.offset :
""))
.all(sqlParameters);
}
database.close();
return {
count,
workOrders
};
};
export default getWorkOrders;

View File

@ -0,0 +1,78 @@
import sqlite from "better-sqlite3";
import {
lotOccupancyDB as databasePath
} from "../../data/databasePaths.js";
import {
dateIntegerToString
} from "@cityssm/expressjs-server-js/dateTimeFns.js";
import type * as recordTypes from "../../types/recordTypes";
interface GetWorkOrdersFilters {
workOrderTypeId ? : number | string;
}
interface GetWorkOrdersOptions {
limit: number;
offset: number;
}
export const getWorkOrders = (filters ? : GetWorkOrdersFilters, options ? : GetWorkOrdersOptions): {
count: number;
workOrders: recordTypes.WorkOrder[];
} => {
const database = sqlite(databasePath, {
readonly: true
});
database.function("userFn_dateIntegerToString", dateIntegerToString);
let sqlWhereClause = " where w.recordDelete_timeMillis is null";
const sqlParameters = [];
if (filters.workOrderTypeId) {
sqlWhereClause += " and w.workOrderTypeId = ?";
sqlParameters.push(filters.workOrderTypeId);
}
const count: number = database.prepare("select count(*) as recordCount" +
" from WorkOrders w" +
sqlWhereClause)
.get(sqlParameters)
.recordCount;
let workOrders: recordTypes.WorkOrder[] = [];
if (count > 0) {
workOrders = database
.prepare("select w.workOrderId," +
" w.workOrderTypeId, t.workOrderType," +
" w.workOrderNumber, w.workOrderDescription," +
" w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString," +
" w.workOrderCloseDate, userFn_dateIntegerToString(w.workOrderCloseDate) as workOrderCloseDateString" +
" from WorkOrders w" +
" left join WorkOrderTypes t on w.workOrderTypeId = t.workOrderTypeId" +
sqlWhereClause +
" order by w.workOrderOpenDate desc, w.workOrderNumber" +
(options ?
" limit " + options.limit + " offset " + options.offset :
""))
.all(sqlParameters);
}
database.close();
return {
count,
workOrders
};
};
export default getWorkOrders;

104
package-lock.json generated
View File

@ -59,7 +59,7 @@
"bulma": "^0.9.4", "bulma": "^0.9.4",
"cypress": "^10.6.0", "cypress": "^10.6.0",
"cypress-axe": "^1.0.0", "cypress-axe": "^1.0.0",
"eslint": "^8.22.0", "eslint": "^8.23.0",
"eslint-plugin-import": "^2.26.0", "eslint-plugin-import": "^2.26.0",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^6.0.1", "eslint-plugin-promise": "^6.0.1",
@ -705,14 +705,14 @@
} }
}, },
"node_modules/@eslint/eslintrc": { "node_modules/@eslint/eslintrc": {
"version": "1.3.0", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz",
"integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"ajv": "^6.12.4", "ajv": "^6.12.4",
"debug": "^4.3.2", "debug": "^4.3.2",
"espree": "^9.3.2", "espree": "^9.4.0",
"globals": "^13.15.0", "globals": "^13.15.0",
"ignore": "^5.2.0", "ignore": "^5.2.0",
"import-fresh": "^3.2.1", "import-fresh": "^3.2.1",
@ -722,6 +722,9 @@
}, },
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
} }
}, },
"node_modules/@fortawesome/fontawesome-free": { "node_modules/@fortawesome/fontawesome-free": {
@ -757,6 +760,19 @@
"url": "https://github.com/sponsors/nzakas" "url": "https://github.com/sponsors/nzakas"
} }
}, },
"node_modules/@humanwhocodes/module-importer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"dev": true,
"engines": {
"node": ">=12.22"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/nzakas"
}
},
"node_modules/@humanwhocodes/object-schema": { "node_modules/@humanwhocodes/object-schema": {
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
@ -3697,14 +3713,15 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "8.22.0", "version": "8.23.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz",
"integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint/eslintrc": "^1.3.0", "@eslint/eslintrc": "^1.3.1",
"@humanwhocodes/config-array": "^0.10.4", "@humanwhocodes/config-array": "^0.10.4",
"@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/gitignore-to-minimatch": "^1.0.2",
"@humanwhocodes/module-importer": "^1.0.1",
"ajv": "^6.10.0", "ajv": "^6.10.0",
"chalk": "^4.0.0", "chalk": "^4.0.0",
"cross-spawn": "^7.0.2", "cross-spawn": "^7.0.2",
@ -3714,7 +3731,7 @@
"eslint-scope": "^7.1.1", "eslint-scope": "^7.1.1",
"eslint-utils": "^3.0.0", "eslint-utils": "^3.0.0",
"eslint-visitor-keys": "^3.3.0", "eslint-visitor-keys": "^3.3.0",
"espree": "^9.3.3", "espree": "^9.4.0",
"esquery": "^1.4.0", "esquery": "^1.4.0",
"esutils": "^2.0.2", "esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3", "fast-deep-equal": "^3.1.3",
@ -3739,8 +3756,7 @@
"regexpp": "^3.2.0", "regexpp": "^3.2.0",
"strip-ansi": "^6.0.1", "strip-ansi": "^6.0.1",
"strip-json-comments": "^3.1.0", "strip-json-comments": "^3.1.0",
"text-table": "^0.2.0", "text-table": "^0.2.0"
"v8-compile-cache": "^2.0.3"
}, },
"bin": { "bin": {
"eslint": "bin/eslint.js" "eslint": "bin/eslint.js"
@ -4140,9 +4156,9 @@
} }
}, },
"node_modules/espree": { "node_modules/espree": {
"version": "9.3.3", "version": "9.4.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
"integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"acorn": "^8.8.0", "acorn": "^8.8.0",
@ -5779,9 +5795,9 @@
} }
}, },
"node_modules/globals": { "node_modules/globals": {
"version": "13.16.0", "version": "13.17.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
"integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==", "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"type-fest": "^0.20.2" "type-fest": "^0.20.2"
@ -11302,12 +11318,6 @@
"uuid": "dist/bin/uuid" "uuid": "dist/bin/uuid"
} }
}, },
"node_modules/v8-compile-cache": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
"node_modules/v8flags": { "node_modules/v8flags": {
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
@ -12419,14 +12429,14 @@
} }
}, },
"@eslint/eslintrc": { "@eslint/eslintrc": {
"version": "1.3.0", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz",
"integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"ajv": "^6.12.4", "ajv": "^6.12.4",
"debug": "^4.3.2", "debug": "^4.3.2",
"espree": "^9.3.2", "espree": "^9.4.0",
"globals": "^13.15.0", "globals": "^13.15.0",
"ignore": "^5.2.0", "ignore": "^5.2.0",
"import-fresh": "^3.2.1", "import-fresh": "^3.2.1",
@ -12457,6 +12467,12 @@
"integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==",
"dev": true "dev": true
}, },
"@humanwhocodes/module-importer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"dev": true
},
"@humanwhocodes/object-schema": { "@humanwhocodes/object-schema": {
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
@ -14757,14 +14773,15 @@
"dev": true "dev": true
}, },
"eslint": { "eslint": {
"version": "8.22.0", "version": "8.23.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz",
"integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@eslint/eslintrc": "^1.3.0", "@eslint/eslintrc": "^1.3.1",
"@humanwhocodes/config-array": "^0.10.4", "@humanwhocodes/config-array": "^0.10.4",
"@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "@humanwhocodes/gitignore-to-minimatch": "^1.0.2",
"@humanwhocodes/module-importer": "^1.0.1",
"ajv": "^6.10.0", "ajv": "^6.10.0",
"chalk": "^4.0.0", "chalk": "^4.0.0",
"cross-spawn": "^7.0.2", "cross-spawn": "^7.0.2",
@ -14774,7 +14791,7 @@
"eslint-scope": "^7.1.1", "eslint-scope": "^7.1.1",
"eslint-utils": "^3.0.0", "eslint-utils": "^3.0.0",
"eslint-visitor-keys": "^3.3.0", "eslint-visitor-keys": "^3.3.0",
"espree": "^9.3.3", "espree": "^9.4.0",
"esquery": "^1.4.0", "esquery": "^1.4.0",
"esutils": "^2.0.2", "esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3", "fast-deep-equal": "^3.1.3",
@ -14799,8 +14816,7 @@
"regexpp": "^3.2.0", "regexpp": "^3.2.0",
"strip-ansi": "^6.0.1", "strip-ansi": "^6.0.1",
"strip-json-comments": "^3.1.0", "strip-json-comments": "^3.1.0",
"text-table": "^0.2.0", "text-table": "^0.2.0"
"v8-compile-cache": "^2.0.3"
}, },
"dependencies": { "dependencies": {
"eslint-scope": { "eslint-scope": {
@ -15089,9 +15105,9 @@
"dev": true "dev": true
}, },
"espree": { "espree": {
"version": "9.3.3", "version": "9.4.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
"integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
"dev": true, "dev": true,
"requires": { "requires": {
"acorn": "^8.8.0", "acorn": "^8.8.0",
@ -16405,9 +16421,9 @@
} }
}, },
"globals": { "globals": {
"version": "13.16.0", "version": "13.17.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.16.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
"integrity": "sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==", "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
"dev": true, "dev": true,
"requires": { "requires": {
"type-fest": "^0.20.2" "type-fest": "^0.20.2"
@ -20657,12 +20673,6 @@
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"dev": true "dev": true
}, },
"v8-compile-cache": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
"integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
"v8flags": { "v8flags": {
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",

View File

@ -83,7 +83,7 @@
"bulma": "^0.9.4", "bulma": "^0.9.4",
"cypress": "^10.6.0", "cypress": "^10.6.0",
"cypress-axe": "^1.0.0", "cypress-axe": "^1.0.0",
"eslint": "^8.22.0", "eslint": "^8.23.0",
"eslint-plugin-import": "^2.26.0", "eslint-plugin-import": "^2.26.0",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^6.0.1", "eslint-plugin-promise": "^6.0.1",

View File

@ -0,0 +1 @@
export {};

View File

@ -0,0 +1,107 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
(() => {
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const searchFilterFormElement = document.querySelector("#form--searchFilters");
const searchResultsContainerElement = document.querySelector("#container--searchResults");
const limit = Number.parseInt(document.querySelector("#searchFilter--limit").value, 10);
const offsetElement = document.querySelector("#searchFilter--offset");
const getWorkOrders = () => {
const offset = Number.parseInt(offsetElement.value, 10);
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
"Loading Work Orders..." +
"</div>";
cityssm.postJSON(urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement, (responseJSON) => {
if (responseJSON.workOrders.length === 0) {
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
"<p class=\"message-body\">There are no work orders that meet the search criteria.</p>" +
"</div>";
return;
}
const resultsTbodyElement = document.createElement("tbody");
for (const workOrder of responseJSON.workOrders) {
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
("<td>" +
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/workOrders/" + workOrder.workOrderId + "\">" +
cityssm.escapeHTML(workOrder.workOrderNumber) +
"</a>" +
"</td>") +
("<td>" +
cityssm.escapeHTML(workOrder.workOrderType) +
"</td>") +
"<td>" + cityssm.escapeHTML(workOrder.workOrderDescription) + "</td>" +
("<td>" +
workOrder.workOrderOpenDateString +
"</td>") +
("<td>" +
(workOrder.workOrderCloseDate ? workOrder.workOrderCloseDateString : "<span class=\"has-text-grey\">(No Close Date)</span>") +
"</td>") +
"</tr>");
}
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" +
"<thead><tr>" +
"<th>Work Order Number</th>" +
"<th>Work Order Type</th>" +
"<th>Work Order Description</th>" +
"<th>Open Date</th>" +
"<th>Close Date</th>" +
"</tr></thead>" +
"<table>" +
"<div class=\"level\">" +
("<div class=\"level-left\">" +
"<div class=\"level-item has-text-weight-bold\">" +
"Displaying " + (offset + 1).toString() +
" to " + Math.min(responseJSON.count, limit + offset) +
" of " + responseJSON.count +
"</div>" +
"</div>") +
("<div class=\"level-right\">" +
(offset > 0 ?
"<div class=\"level-item\">" +
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" +
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" +
"</button>" +
"</div>" :
"") +
(limit + offset < responseJSON.count ?
"<div class=\"level-item\">" +
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" +
"<span>Next</span>" +
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" +
"</button>" +
"</div>" :
"") +
"</div>") +
"</div>";
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
if (offset > 0) {
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetWorkOrders);
}
if (limit + offset < responseJSON.count) {
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetWorkOrders);
}
});
};
const resetOffsetAndGetWorkOrders = () => {
offsetElement.value = "0";
getWorkOrders();
};
const previousAndGetWorkOrders = () => {
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
getWorkOrders();
};
const nextAndGetWorkOrders = () => {
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
getWorkOrders();
};
const filterElements = searchFilterFormElement.querySelectorAll("input, select");
for (const filterElement of filterElements) {
filterElement.addEventListener("change", resetOffsetAndGetWorkOrders);
}
searchFilterFormElement.addEventListener("submit", (formEvent) => {
formEvent.preventDefault();
resetOffsetAndGetWorkOrders();
});
getWorkOrders();
})();

View File

@ -0,0 +1,146 @@
/* eslint-disable unicorn/prefer-module */
import type * as recordTypes from "../types/recordTypes";
import type {
cityssmGlobal
} from "@cityssm/bulma-webapp-js/src/types";
declare const cityssm: cityssmGlobal;
(() => {
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
const searchFilterFormElement = document.querySelector("#form--searchFilters") as HTMLFormElement;
const searchResultsContainerElement = document.querySelector("#container--searchResults") as HTMLElement;
const limit = Number.parseInt((document.querySelector("#searchFilter--limit") as HTMLInputElement).value, 10);
const offsetElement = document.querySelector("#searchFilter--offset") as HTMLInputElement;
const getWorkOrders = () => {
const offset = Number.parseInt(offsetElement.value, 10);
searchResultsContainerElement.innerHTML = "<div class=\"has-text-grey has-text-centered\">" +
"<i class=\"fas fa-5x fa-circle-notch fa-spin\" aria-hidden=\"true\"></i><br />" +
"Loading Work Orders..." +
"</div>";
cityssm.postJSON(urlPrefix + "/workOrders/doSearchWorkOrders", searchFilterFormElement,
(responseJSON: {
count: number;
workOrders: recordTypes.WorkOrder[];
}) => {
if (responseJSON.workOrders.length === 0) {
searchResultsContainerElement.innerHTML = "<div class=\"message is-info\">" +
"<p class=\"message-body\">There are no work orders that meet the search criteria.</p>" +
"</div>";
return;
}
const resultsTbodyElement = document.createElement("tbody");
for (const workOrder of responseJSON.workOrders) {
resultsTbodyElement.insertAdjacentHTML("beforeend", "<tr>" +
("<td>" +
"<a class=\"has-text-weight-bold\" href=\"" + urlPrefix + "/workOrders/" + workOrder.workOrderId + "\">" +
cityssm.escapeHTML(workOrder.workOrderNumber) +
"</a>" +
"</td>") +
("<td>" +
cityssm.escapeHTML(workOrder.workOrderType) +
"</td>") +
"<td>" + cityssm.escapeHTML(workOrder.workOrderDescription) + "</td>" +
("<td>" +
workOrder.workOrderOpenDateString +
"</td>") +
("<td>" +
(workOrder.workOrderCloseDate ? workOrder.workOrderCloseDateString : "<span class=\"has-text-grey\">(No Close Date)</span>") +
"</td>") +
"</tr>");
}
searchResultsContainerElement.innerHTML = "<table class=\"table is-fullwidth is-striped is-hoverable\">" +
"<thead><tr>" +
"<th>Work Order Number</th>" +
"<th>Work Order Type</th>" +
"<th>Work Order Description</th>" +
"<th>Open Date</th>" +
"<th>Close Date</th>" +
"</tr></thead>" +
"<table>" +
"<div class=\"level\">" +
("<div class=\"level-left\">" +
"<div class=\"level-item has-text-weight-bold\">" +
"Displaying " + (offset + 1).toString() +
" to " + Math.min(responseJSON.count, limit + offset) +
" of " + responseJSON.count +
"</div>" +
"</div>") +
("<div class=\"level-right\">" +
(offset > 0 ?
"<div class=\"level-item\">" +
"<button class=\"button is-rounded is-link is-outlined\" data-page=\"previous\" type=\"button\" title=\"Previous\">" +
"<i class=\"fas fa-arrow-left\" aria-hidden=\"true\"></i>" +
"</button>" +
"</div>" :
"") +
(limit + offset < responseJSON.count ?
"<div class=\"level-item\">" +
"<button class=\"button is-rounded is-link\" data-page=\"next\" type=\"button\" title=\"Next\">" +
"<span>Next</span>" +
"<span class=\"icon\"><i class=\"fas fa-arrow-right\" aria-hidden=\"true\"></i></span>" +
"</button>" +
"</div>" :
"") +
"</div>") +
"</div>";
searchResultsContainerElement.querySelector("table").append(resultsTbodyElement);
if (offset > 0) {
searchResultsContainerElement.querySelector("button[data-page='previous']").addEventListener("click", previousAndGetWorkOrders);
}
if (limit + offset < responseJSON.count) {
searchResultsContainerElement.querySelector("button[data-page='next']").addEventListener("click", nextAndGetWorkOrders);
}
});
};
const resetOffsetAndGetWorkOrders = () => {
offsetElement.value = "0";
getWorkOrders();
}
const previousAndGetWorkOrders = () => {
offsetElement.value = Math.max(Number.parseInt(offsetElement.value, 10) - limit, 0).toString();
getWorkOrders();
};
const nextAndGetWorkOrders = () => {
offsetElement.value = (Number.parseInt(offsetElement.value, 10) + limit).toString();
getWorkOrders();
};
const filterElements = searchFilterFormElement.querySelectorAll("input, select") as NodeListOf < HTMLInputElement | HTMLSelectElement > ;
for (const filterElement of filterElements) {
filterElement.addEventListener("change", resetOffsetAndGetWorkOrders);
}
searchFilterFormElement.addEventListener("submit", (formEvent) => {
formEvent.preventDefault();
resetOffsetAndGetWorkOrders();
});
getWorkOrders();
})();

View File

@ -0,0 +1 @@
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=document.querySelector("main").dataset.urlPrefix,t=document.querySelector("#form--searchFilters"),r=document.querySelector("#container--searchResults"),s=Number.parseInt(document.querySelector("#searchFilter--limit").value,10),a=document.querySelector("#searchFilter--offset"),i=()=>{const i=Number.parseInt(a.value,10);r.innerHTML='<div class="has-text-grey has-text-centered"><i class="fas fa-5x fa-circle-notch fa-spin" aria-hidden="true"></i><br />Loading Work Orders...</div>',cityssm.postJSON(e+"/workOrders/doSearchWorkOrders",t,t=>{if(0===t.workOrders.length)return void(r.innerHTML='<div class="message is-info"><p class="message-body">There are no work orders that meet the search criteria.</p></div>');const a=document.createElement("tbody");for(const r of t.workOrders)a.insertAdjacentHTML("beforeend",'<tr><td><a class="has-text-weight-bold" href="'+e+"/workOrders/"+r.workOrderId+'">'+cityssm.escapeHTML(r.workOrderNumber)+"</a></td><td>"+cityssm.escapeHTML(r.workOrderType)+"</td><td>"+cityssm.escapeHTML(r.workOrderDescription)+"</td><td>"+r.workOrderOpenDateString+"</td><td>"+(r.workOrderCloseDate?r.workOrderCloseDateString:'<span class="has-text-grey">(No Close Date)</span>')+"</td></tr>");r.innerHTML='<table class="table is-fullwidth is-striped is-hoverable"><thead><tr><th>Work Order Number</th><th>Work Order Type</th><th>Work Order Description</th><th>Open Date</th><th>Close Date</th></tr></thead><table><div class="level"><div class="level-left"><div class="level-item has-text-weight-bold">Displaying '+(i+1).toString()+" to "+Math.min(t.count,s+i)+" of "+t.count+'</div></div><div class="level-right">'+(i>0?'<div class="level-item"><button class="button is-rounded is-link is-outlined" data-page="previous" type="button" title="Previous"><i class="fas fa-arrow-left" aria-hidden="true"></i></button></div>':"")+(s+i<t.count?'<div class="level-item"><button class="button is-rounded is-link" data-page="next" type="button" title="Next"><span>Next</span><span class="icon"><i class="fas fa-arrow-right" aria-hidden="true"></i></span></button></div>':"")+"</div></div>",r.querySelector("table").append(a),i>0&&r.querySelector("button[data-page='previous']").addEventListener("click",d),s+i<t.count&&r.querySelector("button[data-page='next']").addEventListener("click",n)})},o=()=>{a.value="0",i()},d=()=>{a.value=Math.max(Number.parseInt(a.value,10)-s,0).toString(),i()},n=()=>{a.value=(Number.parseInt(a.value,10)+s).toString(),i()},l=t.querySelectorAll("input, select");for(const e of l)e.addEventListener("change",o);t.addEventListener("submit",e=>{e.preventDefault(),o()}),i()})();

View File

@ -1,5 +1,7 @@
import { Router } from "express"; import { Router } from "express";
import handler_search from "../handlers/workOrders-get/search.js"; import handler_search from "../handlers/workOrders-get/search.js";
import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js";
export const router = Router(); export const router = Router();
router.get("/", handler_search); router.get("/", handler_search);
router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
export default router; export default router;

View File

@ -1,9 +1,13 @@
import { Router } from "express"; import {
Router
} from "express";
import * as permissionHandlers from "../handlers/permissions.js"; import * as permissionHandlers from "../handlers/permissions.js";
import * as configFunctions from "../helpers/functions.config.js"; import * as configFunctions from "../helpers/functions.config.js";
import handler_search from "../handlers/workOrders-get/search.js"; import handler_search from "../handlers/workOrders-get/search.js";
import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js";
export const router = Router(); export const router = Router();
@ -12,5 +16,8 @@ export const router = Router();
router.get("/", router.get("/",
handler_search); handler_search);
router.post("/doSearchWorkOrders",
handler_doSearchWorkOrders);
export default router; export default router;

View File

@ -16,6 +16,8 @@ import { getLots } from "../helpers/lotOccupancyDB/getLots.js";
import { getLotOccupancies } from "../helpers/lotOccupancyDB/getLotOccupancies.js"; import { getLotOccupancies } from "../helpers/lotOccupancyDB/getLotOccupancies.js";
import { addLotOccupancyFee } from "../helpers/lotOccupancyDB/addLotOccupancyFee.js"; import { addLotOccupancyFee } from "../helpers/lotOccupancyDB/addLotOccupancyFee.js";
import { addLotOccupancyTransaction } from "../helpers/lotOccupancyDB/addLotOccupancyTransaction.js"; import { addLotOccupancyTransaction } from "../helpers/lotOccupancyDB/addLotOccupancyTransaction.js";
import { addWorkOrder } from "../helpers/lotOccupancyDB/addWorkOrder.js";
import { addWorkOrderLot } from "../helpers/lotOccupancyDB/addWorkOrderLot.js";
const user = { const user = {
user: { user: {
userName: "import.unix", userName: "import.unix",
@ -207,25 +209,26 @@ function importFromMasterCSV() {
lotLongitude: "" lotLongitude: ""
}, user); }, user);
} }
let preneedOccupancyStartDateString;
if (masterRow.CM_PRENEED_ORDER) { if (masterRow.CM_PRENEED_ORDER) {
let occupancyStartDateString = formatDateString(masterRow.CM_PURCHASE_YR, masterRow.CM_PURCHASE_MON, masterRow.CM_PURCHASE_DAY); preneedOccupancyStartDateString = formatDateString(masterRow.CM_PURCHASE_YR, masterRow.CM_PURCHASE_MON, masterRow.CM_PURCHASE_DAY);
let occupancyEndDateString = ""; let occupancyEndDateString = "";
if (masterRow.CM_INTERMENT_YR !== "" && masterRow.CM_INTERMENT_YR !== "0") { if (masterRow.CM_INTERMENT_YR !== "" && masterRow.CM_INTERMENT_YR !== "0") {
occupancyEndDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY); occupancyEndDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY);
} }
if (occupancyStartDateString === "0000-00-00" && occupancyEndDateString !== "") { if (preneedOccupancyStartDateString === "0000-00-00" && occupancyEndDateString !== "") {
occupancyStartDateString = occupancyEndDateString; preneedOccupancyStartDateString = occupancyEndDateString;
} }
if (occupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") { if (preneedOccupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") {
occupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY); preneedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY);
} }
if (occupancyStartDateString === "" || occupancyStartDateString === "0000-00-00") { if (preneedOccupancyStartDateString === "" || preneedOccupancyStartDateString === "0000-00-00") {
occupancyStartDateString = "0001-01-01"; preneedOccupancyStartDateString = "0001-01-01";
} }
const lotOccupancyId = addLotOccupancy({ const lotOccupancyId = addLotOccupancy({
occupancyTypeId: preneedOccupancyType.occupancyTypeId, occupancyTypeId: preneedOccupancyType.occupancyTypeId,
lotId, lotId,
occupancyStartDateString, occupancyStartDateString: preneedOccupancyStartDateString,
occupancyEndDateString, occupancyEndDateString,
occupancyTypeFieldIds: "" occupancyTypeFieldIds: ""
}, user); }, user);
@ -244,7 +247,7 @@ function importFromMasterCSV() {
if (masterRow.CM_REMARK1 !== "") { if (masterRow.CM_REMARK1 !== "") {
addLotOccupancyComment({ addLotOccupancyComment({
lotOccupancyId, lotOccupancyId,
lotOccupancyCommentDateString: occupancyStartDateString, lotOccupancyCommentDateString: preneedOccupancyStartDateString,
lotOccupancyCommentTimeString: "00:00", lotOccupancyCommentTimeString: "00:00",
lotOccupancyComment: masterRow.CM_REMARK1 lotOccupancyComment: masterRow.CM_REMARK1
}, user); }, user);
@ -252,7 +255,7 @@ function importFromMasterCSV() {
if (masterRow.CM_REMARK2 !== "") { if (masterRow.CM_REMARK2 !== "") {
addLotOccupancyComment({ addLotOccupancyComment({
lotOccupancyId, lotOccupancyId,
lotOccupancyCommentDateString: occupancyStartDateString, lotOccupancyCommentDateString: preneedOccupancyStartDateString,
lotOccupancyCommentTimeString: "00:00", lotOccupancyCommentTimeString: "00:00",
lotOccupancyComment: masterRow.CM_REMARK2 lotOccupancyComment: masterRow.CM_REMARK2
}, user); }, user);
@ -261,19 +264,20 @@ function importFromMasterCSV() {
updateLotStatus(lotId, reservedLotStatus.lotStatusId, user); updateLotStatus(lotId, reservedLotStatus.lotStatusId, user);
} }
} }
let deceasedOccupancyStartDateString;
if (masterRow.CM_DECEASED_NAME) { if (masterRow.CM_DECEASED_NAME) {
let occupancyStartDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY); deceasedOccupancyStartDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY);
const occupancyEndDateString = ""; const occupancyEndDateString = "";
if (occupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") { if (deceasedOccupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") {
occupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY); deceasedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY);
} }
if (occupancyStartDateString === "" || occupancyStartDateString === "0000-00-00") { if (deceasedOccupancyStartDateString === "" || deceasedOccupancyStartDateString === "0000-00-00") {
occupancyStartDateString = "0001-01-01"; deceasedOccupancyStartDateString = "0001-01-01";
} }
const lotOccupancyId = addLotOccupancy({ const lotOccupancyId = addLotOccupancy({
occupancyTypeId: lotId ? deceasedOccupancyType.occupancyTypeId : cremationOccupancyType.occupancyTypeId, occupancyTypeId: lotId ? deceasedOccupancyType.occupancyTypeId : cremationOccupancyType.occupancyTypeId,
lotId, lotId,
occupancyStartDateString, occupancyStartDateString: deceasedOccupancyStartDateString,
occupancyEndDateString, occupancyEndDateString,
occupancyTypeFieldIds: "" occupancyTypeFieldIds: ""
}, user); }, user);
@ -361,7 +365,7 @@ function importFromMasterCSV() {
if (masterRow.CM_REMARK1 !== "") { if (masterRow.CM_REMARK1 !== "") {
addLotOccupancyComment({ addLotOccupancyComment({
lotOccupancyId, lotOccupancyId,
lotOccupancyCommentDateString: occupancyStartDateString, lotOccupancyCommentDateString: deceasedOccupancyStartDateString,
lotOccupancyCommentTimeString: "00:00", lotOccupancyCommentTimeString: "00:00",
lotOccupancyComment: masterRow.CM_REMARK1 lotOccupancyComment: masterRow.CM_REMARK1
}, user); }, user);
@ -369,13 +373,27 @@ function importFromMasterCSV() {
if (masterRow.CM_REMARK2 !== "") { if (masterRow.CM_REMARK2 !== "") {
addLotOccupancyComment({ addLotOccupancyComment({
lotOccupancyId, lotOccupancyId,
lotOccupancyCommentDateString: occupancyStartDateString, lotOccupancyCommentDateString: deceasedOccupancyStartDateString,
lotOccupancyCommentTimeString: "00:00", lotOccupancyCommentTimeString: "00:00",
lotOccupancyComment: masterRow.CM_REMARK2 lotOccupancyComment: masterRow.CM_REMARK2
}, user); }, user);
} }
updateLotStatus(lotId, takenLotStatus.lotStatusId, user); updateLotStatus(lotId, takenLotStatus.lotStatusId, user);
} }
if (masterRow.CM_WORK_ORDER) {
const workOrderId = addWorkOrder({
workOrderNumber: masterRow.CM_WORK_ORDER,
workOrderTypeId: 1,
workOrderDescription: "",
workOrderOpenDateString: deceasedOccupancyStartDateString || preneedOccupancyStartDateString
}, user);
if (lotId) {
addWorkOrderLot({
workOrderId,
lotId
}, user);
}
}
} }
} }
catch (error) { catch (error) {

View File

@ -4,6 +4,7 @@ import fs from "node:fs";
import papa from "papaparse"; import papa from "papaparse";
import sqlite from "better-sqlite3"; import sqlite from "better-sqlite3";
import { import {
lotOccupancyDB as databasePath lotOccupancyDB as databasePath
} from "../data/databasePaths.js"; } from "../data/databasePaths.js";
@ -60,6 +61,14 @@ import {
addLotOccupancyTransaction addLotOccupancyTransaction
} from "../helpers/lotOccupancyDB/addLotOccupancyTransaction.js"; } from "../helpers/lotOccupancyDB/addLotOccupancyTransaction.js";
import {
addWorkOrder
} from "../helpers/lotOccupancyDB/addWorkOrder.js";
import {
addWorkOrderLot
} from "../helpers/lotOccupancyDB/addWorkOrderLot.js";
import type * as recordTypes from "../types/recordTypes"; import type * as recordTypes from "../types/recordTypes";
@ -229,7 +238,8 @@ const cemeteryToMapName = {
"PG": "Pine Grove", "PG": "Pine Grove",
"UG": "New Greenwood - Urn Garden", "UG": "New Greenwood - Urn Garden",
"WK": "West Korah" "WK": "West Korah"
} };
const mapCache: Map < string, recordTypes.Map > = new Map(); const mapCache: Map < string, recordTypes.Map > = new Map();
@ -434,9 +444,11 @@ function importFromMasterCSV() {
}, user); }, user);
} }
let preneedOccupancyStartDateString: string;
if (masterRow.CM_PRENEED_ORDER) { if (masterRow.CM_PRENEED_ORDER) {
let occupancyStartDateString = formatDateString(masterRow.CM_PURCHASE_YR, preneedOccupancyStartDateString = formatDateString(masterRow.CM_PURCHASE_YR,
masterRow.CM_PURCHASE_MON, masterRow.CM_PURCHASE_MON,
masterRow.CM_PURCHASE_DAY); masterRow.CM_PURCHASE_DAY);
@ -449,25 +461,25 @@ function importFromMasterCSV() {
} }
// if purchase date unavailable // if purchase date unavailable
if (occupancyStartDateString === "0000-00-00" && occupancyEndDateString !== "") { if (preneedOccupancyStartDateString === "0000-00-00" && occupancyEndDateString !== "") {
occupancyStartDateString = occupancyEndDateString; preneedOccupancyStartDateString = occupancyEndDateString;
} }
// if end date unavailable // if end date unavailable
if (occupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") { if (preneedOccupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") {
occupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, preneedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR,
masterRow.CM_DEATH_MON, masterRow.CM_DEATH_MON,
masterRow.CM_DEATH_DAY); masterRow.CM_DEATH_DAY);
} }
if (occupancyStartDateString === "" || occupancyStartDateString === "0000-00-00") { if (preneedOccupancyStartDateString === "" || preneedOccupancyStartDateString === "0000-00-00") {
occupancyStartDateString = "0001-01-01"; preneedOccupancyStartDateString = "0001-01-01";
} }
const lotOccupancyId = addLotOccupancy({ const lotOccupancyId = addLotOccupancy({
occupancyTypeId: preneedOccupancyType.occupancyTypeId, occupancyTypeId: preneedOccupancyType.occupancyTypeId,
lotId, lotId,
occupancyStartDateString, occupancyStartDateString: preneedOccupancyStartDateString,
occupancyEndDateString, occupancyEndDateString,
occupancyTypeFieldIds: "" occupancyTypeFieldIds: ""
}, user); }, user);
@ -489,7 +501,7 @@ function importFromMasterCSV() {
if (masterRow.CM_REMARK1 !== "") { if (masterRow.CM_REMARK1 !== "") {
addLotOccupancyComment({ addLotOccupancyComment({
lotOccupancyId, lotOccupancyId,
lotOccupancyCommentDateString: occupancyStartDateString, lotOccupancyCommentDateString: preneedOccupancyStartDateString,
lotOccupancyCommentTimeString: "00:00", lotOccupancyCommentTimeString: "00:00",
lotOccupancyComment: masterRow.CM_REMARK1 lotOccupancyComment: masterRow.CM_REMARK1
}, user); }, user);
@ -498,7 +510,7 @@ function importFromMasterCSV() {
if (masterRow.CM_REMARK2 !== "") { if (masterRow.CM_REMARK2 !== "") {
addLotOccupancyComment({ addLotOccupancyComment({
lotOccupancyId, lotOccupancyId,
lotOccupancyCommentDateString: occupancyStartDateString, lotOccupancyCommentDateString: preneedOccupancyStartDateString,
lotOccupancyCommentTimeString: "00:00", lotOccupancyCommentTimeString: "00:00",
lotOccupancyComment: masterRow.CM_REMARK2 lotOccupancyComment: masterRow.CM_REMARK2
}, user); }, user);
@ -509,29 +521,31 @@ function importFromMasterCSV() {
} }
} }
let deceasedOccupancyStartDateString: string;
if (masterRow.CM_DECEASED_NAME) { if (masterRow.CM_DECEASED_NAME) {
let occupancyStartDateString = formatDateString(masterRow.CM_INTERMENT_YR, deceasedOccupancyStartDateString = formatDateString(masterRow.CM_INTERMENT_YR,
masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_MON,
masterRow.CM_INTERMENT_DAY); masterRow.CM_INTERMENT_DAY);
const occupancyEndDateString = ""; const occupancyEndDateString = "";
// if interment date unavailable // if interment date unavailable
if (occupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") { if (deceasedOccupancyStartDateString === "0000-00-00" && masterRow.CM_DEATH_YR !== "" && masterRow.CM_DEATH_YR !== "0") {
occupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, deceasedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR,
masterRow.CM_DEATH_MON, masterRow.CM_DEATH_MON,
masterRow.CM_DEATH_DAY); masterRow.CM_DEATH_DAY);
} }
if (occupancyStartDateString === "" || occupancyStartDateString === "0000-00-00") { if (deceasedOccupancyStartDateString === "" || deceasedOccupancyStartDateString === "0000-00-00") {
occupancyStartDateString = "0001-01-01"; deceasedOccupancyStartDateString = "0001-01-01";
} }
const lotOccupancyId = addLotOccupancy({ const lotOccupancyId = addLotOccupancy({
occupancyTypeId: lotId ? deceasedOccupancyType.occupancyTypeId : cremationOccupancyType.occupancyTypeId, occupancyTypeId: lotId ? deceasedOccupancyType.occupancyTypeId : cremationOccupancyType.occupancyTypeId,
lotId, lotId,
occupancyStartDateString, occupancyStartDateString: deceasedOccupancyStartDateString,
occupancyEndDateString, occupancyEndDateString,
occupancyTypeFieldIds: "" occupancyTypeFieldIds: ""
}, user); }, user);
@ -644,7 +658,7 @@ function importFromMasterCSV() {
if (masterRow.CM_REMARK1 !== "") { if (masterRow.CM_REMARK1 !== "") {
addLotOccupancyComment({ addLotOccupancyComment({
lotOccupancyId, lotOccupancyId,
lotOccupancyCommentDateString: occupancyStartDateString, lotOccupancyCommentDateString: deceasedOccupancyStartDateString,
lotOccupancyCommentTimeString: "00:00", lotOccupancyCommentTimeString: "00:00",
lotOccupancyComment: masterRow.CM_REMARK1 lotOccupancyComment: masterRow.CM_REMARK1
}, user); }, user);
@ -653,7 +667,7 @@ function importFromMasterCSV() {
if (masterRow.CM_REMARK2 !== "") { if (masterRow.CM_REMARK2 !== "") {
addLotOccupancyComment({ addLotOccupancyComment({
lotOccupancyId, lotOccupancyId,
lotOccupancyCommentDateString: occupancyStartDateString, lotOccupancyCommentDateString: deceasedOccupancyStartDateString,
lotOccupancyCommentTimeString: "00:00", lotOccupancyCommentTimeString: "00:00",
lotOccupancyComment: masterRow.CM_REMARK2 lotOccupancyComment: masterRow.CM_REMARK2
}, user); }, user);
@ -661,6 +675,23 @@ function importFromMasterCSV() {
updateLotStatus(lotId, takenLotStatus.lotStatusId, user); updateLotStatus(lotId, takenLotStatus.lotStatusId, user);
} }
if (masterRow.CM_WORK_ORDER) {
const workOrderId = addWorkOrder({
workOrderNumber: masterRow.CM_WORK_ORDER,
workOrderTypeId: 1,
workOrderDescription: "",
workOrderOpenDateString: deceasedOccupancyStartDateString || preneedOccupancyStartDateString
}, user);
if (lotId) {
addWorkOrderLot({
workOrderId,
lotId
}, user);
}
}
} }
} catch (error) { } catch (error) {
console.error(error) console.error(error)

View File

@ -190,6 +190,18 @@ export interface WorkOrderType extends Record {
workOrderType?: string; workOrderType?: string;
orderNumber?: number; orderNumber?: number;
} }
export interface WorkOrder extends Record {
workOrderId?: number;
workOrderTypeId?: number;
workOrderType?: string;
workOrderNumber?: string;
workOrderDescription?: string;
workOrderOpenDate?: number;
workOrderOpenDateString?: string;
workOrderCloseDate?: number;
workOrderCloseDateString?: string;
workOrderLots?: Lot[];
}
export interface User { export interface User {
userName: string; userName: string;
userProperties?: UserProperties; userProperties?: UserProperties;

View File

@ -1,2 +1 @@
"use strict"; export {};
Object.defineProperty(exports, "__esModule", { value: true });

View File

@ -265,7 +265,7 @@ export interface LotOccupancy extends Record {
/* /*
* WORK ORDER TYPES * WORK ORDERS
*/ */
@ -276,6 +276,25 @@ export interface WorkOrderType extends Record {
} }
export interface WorkOrder extends Record {
workOrderId?: number;
workOrderTypeId?: number;
workOrderType?: string;
workOrderNumber?: string;
workOrderDescription?: string;
workOrderOpenDate?: number;
workOrderOpenDateString?: string;
workOrderCloseDate?: number;
workOrderCloseDateString?: string;
workOrderLots?: Lot[];
}
/* /*
* USER TYPES * USER TYPES
*/ */

View File

@ -25,7 +25,34 @@
</div> </div>
<% } %> <% } %>
<div class="box">
<form id="form--searchFilters">
<input id="searchFilter--limit" name="limit" type="hidden" value="100" />
<input id="searchFilter--offset" name="offset" type="hidden" value="0" />
<div class="field">
<label class="label" for="searchFilter--workOrderTypeId">Work Order Type</label>
<div class="control has-icons-left">
<div class="select is-fullwidth">
<select id="searchFilter--workOrderTypeId" name="workOrderTypeId">
<option value="">(All Work Order Types Types)</option>
<% for (const workOrderType of workOrderTypes) { %>
<option value="<%= workOrderType.workOrderTypeId %>"><%= workOrderType.workOrderType || "(No Name)" %></option>
<% } %>
</select>
</div>
<span class="icon is-small is-left">
<i class="fas fa-search" aria-hidden="true"></i>
</span>
</div>
</div>
</form>
</div>
<div id="container--searchResults"></div> <div id="container--searchResults"></div>
<%- include('_footerA'); -%> <%- include('_footerA'); -%>
<script src="<%= urlPrefix %>/javascripts/workOrderSearch.min.js"></script>
<%- include('_footerB'); -%> <%- include('_footerB'); -%>