development
parent
7f73f41f90
commit
f7b87329ef
|
|
@ -0,0 +1,3 @@
|
||||||
|
import type { RequestHandler } from "express";
|
||||||
|
export declare const handler: RequestHandler;
|
||||||
|
export default handler;
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
import * as configFunctions from "../../helpers/functions.config.js";
|
||||||
|
import { getWorkOrder } from "../../helpers/lotOccupancyDB/getWorkOrder.js";
|
||||||
|
export const handler = (request, response) => {
|
||||||
|
const workOrder = getWorkOrder(request.params.workOrderId);
|
||||||
|
if (!workOrder) {
|
||||||
|
return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") + "/workOrders/?error=workOrderIdNotFound");
|
||||||
|
}
|
||||||
|
response.render("workOrder-view", {
|
||||||
|
headTitle: "Work Order #" + workOrder.workOrderNumber,
|
||||||
|
workOrder
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export default handler;
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
import type {
|
||||||
|
RequestHandler
|
||||||
|
} from "express";
|
||||||
|
|
||||||
|
import * as configFunctions from "../../helpers/functions.config.js";
|
||||||
|
|
||||||
|
import {
|
||||||
|
getWorkOrder
|
||||||
|
} from "../../helpers/lotOccupancyDB/getWorkOrder.js";
|
||||||
|
|
||||||
|
|
||||||
|
export const handler: RequestHandler = (request, response) => {
|
||||||
|
|
||||||
|
const workOrder = getWorkOrder(request.params.workOrderId);
|
||||||
|
|
||||||
|
if (!workOrder) {
|
||||||
|
return response.redirect(configFunctions.getProperty("reverseProxy.urlPrefix") + "/workOrders/?error=workOrderIdNotFound");
|
||||||
|
}
|
||||||
|
|
||||||
|
response.render("workOrder-view", {
|
||||||
|
headTitle: "Work Order #" + workOrder.workOrderNumber,
|
||||||
|
workOrder
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export default handler;
|
||||||
|
|
@ -6,5 +6,5 @@ interface GetFeeCategoriesFilters {
|
||||||
interface GetFeeCategoriesOptions {
|
interface GetFeeCategoriesOptions {
|
||||||
includeFees?: boolean;
|
includeFees?: boolean;
|
||||||
}
|
}
|
||||||
export declare const getFeeCategories: (filters?: GetFeeCategoriesFilters, options?: GetFeeCategoriesOptions) => recordTypes.FeeCategory[];
|
export declare const getFeeCategories: (filters: GetFeeCategoriesFilters, options: GetFeeCategoriesOptions) => recordTypes.FeeCategory[];
|
||||||
export default getFeeCategories;
|
export default getFeeCategories;
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
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";
|
||||||
export const getFeeCategories = (filters, options) => {
|
export const getFeeCategories = (filters, options) => {
|
||||||
|
const updateOrderNumbers = !(filters.lotTypeId || filters.occupancyTypeId) && options.includeFees;
|
||||||
const database = sqlite(databasePath, {
|
const database = sqlite(databasePath, {
|
||||||
readonly: true
|
readonly: !updateOrderNumbers
|
||||||
});
|
});
|
||||||
let sql = "select feeCategoryId, feeCategory" +
|
let sql = "select feeCategoryId, feeCategory, orderNumber" +
|
||||||
" from FeeCategories" +
|
" from FeeCategories" +
|
||||||
" where recordDelete_timeMillis is null";
|
" where recordDelete_timeMillis is null";
|
||||||
let sqlParameters = [];
|
let sqlParameters = [];
|
||||||
|
|
@ -26,14 +27,23 @@ export const getFeeCategories = (filters, options) => {
|
||||||
" order by orderNumber, feeCategory")
|
" order by orderNumber, feeCategory")
|
||||||
.all(sqlParameters);
|
.all(sqlParameters);
|
||||||
if (options.includeFees) {
|
if (options.includeFees) {
|
||||||
|
let expectedFeeCategoryOrderNumber = -1;
|
||||||
for (const feeCategory of feeCategories) {
|
for (const feeCategory of feeCategories) {
|
||||||
|
expectedFeeCategoryOrderNumber += 1;
|
||||||
|
if (feeCategory.orderNumber !== expectedFeeCategoryOrderNumber) {
|
||||||
|
database.prepare("update FeeCategories" +
|
||||||
|
" set orderNumber = ?" +
|
||||||
|
" where feeCategoryId = ?")
|
||||||
|
.run(expectedFeeCategoryOrderNumber, feeCategory.feeCategoryId);
|
||||||
|
feeCategory.orderNumber = expectedFeeCategoryOrderNumber;
|
||||||
|
}
|
||||||
sql = "select f.feeId, f.feeName, f.feeDescription," +
|
sql = "select f.feeId, f.feeName, f.feeDescription," +
|
||||||
" f.occupancyTypeId, o.occupancyType," +
|
" f.occupancyTypeId, o.occupancyType," +
|
||||||
" f.lotTypeId, l.lotType," +
|
" f.lotTypeId, l.lotType," +
|
||||||
" ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," +
|
" ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," +
|
||||||
" f.taxAmount, f.taxPercentage," +
|
" f.taxAmount, f.taxPercentage," +
|
||||||
" f.includeQuantity, f.quantityUnit," +
|
" f.includeQuantity, f.quantityUnit," +
|
||||||
" f.isRequired" +
|
" f.isRequired, f.orderNumber" +
|
||||||
" from Fees f" +
|
" from Fees f" +
|
||||||
" left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" +
|
" left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" +
|
||||||
" left join LotTypes l on f.lotTypeId = l.lotTypeId" +
|
" left join LotTypes l on f.lotTypeId = l.lotTypeId" +
|
||||||
|
|
@ -52,6 +62,19 @@ export const getFeeCategories = (filters, options) => {
|
||||||
feeCategory.fees = database.prepare(sql +
|
feeCategory.fees = database.prepare(sql +
|
||||||
" order by f.orderNumber, f.feeName")
|
" order by f.orderNumber, f.feeName")
|
||||||
.all(sqlParameters);
|
.all(sqlParameters);
|
||||||
|
if (updateOrderNumbers) {
|
||||||
|
let expectedFeeOrderNumber = -1;
|
||||||
|
for (const fee of feeCategory.fees) {
|
||||||
|
expectedFeeOrderNumber += 1;
|
||||||
|
if (fee.orderNumber !== expectedFeeOrderNumber) {
|
||||||
|
database.prepare("update Fees" +
|
||||||
|
" set orderNumber = ?" +
|
||||||
|
" where feeId = ?")
|
||||||
|
.run(expectedFeeOrderNumber, fee.feeId);
|
||||||
|
fee.orderNumber = expectedFeeOrderNumber;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
database.close();
|
database.close();
|
||||||
|
|
|
||||||
|
|
@ -17,13 +17,15 @@ interface GetFeeCategoriesOptions {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export const getFeeCategories = (filters ? : GetFeeCategoriesFilters, options ? : GetFeeCategoriesOptions): recordTypes.FeeCategory[] => {
|
export const getFeeCategories = (filters: GetFeeCategoriesFilters, options: GetFeeCategoriesOptions): recordTypes.FeeCategory[] => {
|
||||||
|
|
||||||
|
const updateOrderNumbers = !(filters.lotTypeId || filters.occupancyTypeId) && options.includeFees;
|
||||||
|
|
||||||
const database = sqlite(databasePath, {
|
const database = sqlite(databasePath, {
|
||||||
readonly: true
|
readonly: !updateOrderNumbers
|
||||||
});
|
});
|
||||||
|
|
||||||
let sql = "select feeCategoryId, feeCategory" +
|
let sql = "select feeCategoryId, feeCategory, orderNumber" +
|
||||||
" from FeeCategories" +
|
" from FeeCategories" +
|
||||||
" where recordDelete_timeMillis is null";
|
" where recordDelete_timeMillis is null";
|
||||||
|
|
||||||
|
|
@ -52,22 +54,35 @@ export const getFeeCategories = (filters ? : GetFeeCategoriesFilters, options ?
|
||||||
.all(sqlParameters);
|
.all(sqlParameters);
|
||||||
|
|
||||||
if (options.includeFees) {
|
if (options.includeFees) {
|
||||||
|
|
||||||
|
let expectedFeeCategoryOrderNumber = -1;
|
||||||
|
|
||||||
for (const feeCategory of feeCategories) {
|
for (const feeCategory of feeCategories) {
|
||||||
|
|
||||||
|
expectedFeeCategoryOrderNumber += 1;
|
||||||
|
|
||||||
|
if (feeCategory.orderNumber !== expectedFeeCategoryOrderNumber) {
|
||||||
|
database.prepare("update FeeCategories" +
|
||||||
|
" set orderNumber = ?" +
|
||||||
|
" where feeCategoryId = ?")
|
||||||
|
.run(expectedFeeCategoryOrderNumber, feeCategory.feeCategoryId);
|
||||||
|
|
||||||
|
feeCategory.orderNumber = expectedFeeCategoryOrderNumber;
|
||||||
|
}
|
||||||
|
|
||||||
sql = "select f.feeId, f.feeName, f.feeDescription," +
|
sql = "select f.feeId, f.feeName, f.feeDescription," +
|
||||||
" f.occupancyTypeId, o.occupancyType," +
|
" f.occupancyTypeId, o.occupancyType," +
|
||||||
" f.lotTypeId, l.lotType," +
|
" f.lotTypeId, l.lotType," +
|
||||||
" ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," +
|
" ifnull(f.feeAmount, 0) as feeAmount, f.feeFunction," +
|
||||||
" f.taxAmount, f.taxPercentage," +
|
" f.taxAmount, f.taxPercentage," +
|
||||||
" f.includeQuantity, f.quantityUnit," +
|
" f.includeQuantity, f.quantityUnit," +
|
||||||
" f.isRequired" +
|
" f.isRequired, f.orderNumber" +
|
||||||
" from Fees f" +
|
" from Fees f" +
|
||||||
" left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" +
|
" left join OccupancyTypes o on f.occupancyTypeId = o.occupancyTypeId" +
|
||||||
" left join LotTypes l on f.lotTypeId = l.lotTypeId" +
|
" left join LotTypes l on f.lotTypeId = l.lotTypeId" +
|
||||||
" where f.recordDelete_timeMillis is null" +
|
" where f.recordDelete_timeMillis is null" +
|
||||||
" and f.feeCategoryId = ?";
|
" and f.feeCategoryId = ?";
|
||||||
|
|
||||||
sqlParameters = [];
|
sqlParameters = [];
|
||||||
|
|
||||||
sqlParameters.push(feeCategory.feeCategoryId);
|
sqlParameters.push(feeCategory.feeCategoryId);
|
||||||
|
|
@ -87,6 +102,26 @@ export const getFeeCategories = (filters ? : GetFeeCategoriesFilters, options ?
|
||||||
feeCategory.fees = database.prepare(sql +
|
feeCategory.fees = database.prepare(sql +
|
||||||
" order by f.orderNumber, f.feeName")
|
" order by f.orderNumber, f.feeName")
|
||||||
.all(sqlParameters);
|
.all(sqlParameters);
|
||||||
|
|
||||||
|
if (updateOrderNumbers) {
|
||||||
|
|
||||||
|
let expectedFeeOrderNumber = -1;
|
||||||
|
|
||||||
|
for (const fee of feeCategory.fees) {
|
||||||
|
|
||||||
|
expectedFeeOrderNumber += 1;
|
||||||
|
|
||||||
|
if (fee.orderNumber !== expectedFeeOrderNumber) {
|
||||||
|
|
||||||
|
database.prepare("update Fees" +
|
||||||
|
" set orderNumber = ?" +
|
||||||
|
" where feeId = ?")
|
||||||
|
.run(expectedFeeOrderNumber, fee.feeId);
|
||||||
|
|
||||||
|
fee.orderNumber = expectedFeeOrderNumber;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
export declare const moveFeeCategoryDown: (feeCategoryId: number | string) => boolean;
|
||||||
|
export default moveFeeCategoryDown;
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
import sqlite from "better-sqlite3";
|
||||||
|
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||||
|
export const moveFeeCategoryDown = (feeCategoryId) => {
|
||||||
|
const database = sqlite(databasePath);
|
||||||
|
const currentOrderNumber = database.prepare("select orderNumber" +
|
||||||
|
" from FeeCategories" +
|
||||||
|
" where feeCategoryId = ?")
|
||||||
|
.get(feeCategoryId)
|
||||||
|
.orderNumber;
|
||||||
|
database
|
||||||
|
.prepare("update FeeCategories" +
|
||||||
|
" set orderNumber = orderNumber - 1" +
|
||||||
|
" where recordDelete_timeMillis is null" +
|
||||||
|
" and orderNumber = ? + 1")
|
||||||
|
.run(currentOrderNumber);
|
||||||
|
const result = database
|
||||||
|
.prepare("update FeeCategories" +
|
||||||
|
" set orderNumber = ? + 1" +
|
||||||
|
" where feeCategoryId = ?")
|
||||||
|
.run(currentOrderNumber, feeCategoryId);
|
||||||
|
database.close();
|
||||||
|
return result.changes > 0;
|
||||||
|
};
|
||||||
|
export default moveFeeCategoryDown;
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
import sqlite from "better-sqlite3";
|
||||||
|
|
||||||
|
import {
|
||||||
|
lotOccupancyDB as databasePath
|
||||||
|
} from "../../data/databasePaths.js";
|
||||||
|
|
||||||
|
|
||||||
|
export const moveFeeCategoryDown =
|
||||||
|
(feeCategoryId: number | string): boolean => {
|
||||||
|
|
||||||
|
const database = sqlite(databasePath);
|
||||||
|
|
||||||
|
const currentOrderNumber: number = database.prepare("select orderNumber" +
|
||||||
|
" from FeeCategories" +
|
||||||
|
" where feeCategoryId = ?")
|
||||||
|
.get(feeCategoryId)
|
||||||
|
.orderNumber;
|
||||||
|
|
||||||
|
database
|
||||||
|
.prepare("update FeeCategories" +
|
||||||
|
" set orderNumber = orderNumber - 1" +
|
||||||
|
" where recordDelete_timeMillis is null" +
|
||||||
|
" and orderNumber = ? + 1")
|
||||||
|
.run(currentOrderNumber);
|
||||||
|
|
||||||
|
const result = database
|
||||||
|
.prepare("update FeeCategories" +
|
||||||
|
" set orderNumber = ? + 1" +
|
||||||
|
" where feeCategoryId = ?")
|
||||||
|
.run(currentOrderNumber, feeCategoryId);
|
||||||
|
|
||||||
|
database.close();
|
||||||
|
|
||||||
|
return result.changes > 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export default moveFeeCategoryDown;
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
export declare const moveFeeCategoryUp: (feeCategoryId: number | string) => boolean;
|
||||||
|
export default moveFeeCategoryUp;
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
import sqlite from "better-sqlite3";
|
||||||
|
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||||
|
export const moveFeeCategoryUp = (feeCategoryId) => {
|
||||||
|
const database = sqlite(databasePath);
|
||||||
|
const currentOrderNumber = database.prepare("select orderNumber" +
|
||||||
|
" from FeeCategories" +
|
||||||
|
" where feeCategoryId = ?")
|
||||||
|
.get(feeCategoryId)
|
||||||
|
.orderNumber;
|
||||||
|
if (currentOrderNumber <= 0) {
|
||||||
|
database.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
database
|
||||||
|
.prepare("update FeeCategories" +
|
||||||
|
" set orderNumber = orderNumber + 1" +
|
||||||
|
" where recordDelete_timeMillis is null" +
|
||||||
|
" and orderNumber = ? - 1")
|
||||||
|
.run(currentOrderNumber);
|
||||||
|
const result = database
|
||||||
|
.prepare("update FeeCategories" +
|
||||||
|
" set orderNumber = ? - 1" +
|
||||||
|
" where feeCategoryId = ?")
|
||||||
|
.run(currentOrderNumber, feeCategoryId);
|
||||||
|
database.close();
|
||||||
|
return result.changes > 0;
|
||||||
|
};
|
||||||
|
export default moveFeeCategoryUp;
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
import sqlite from "better-sqlite3";
|
||||||
|
|
||||||
|
import {
|
||||||
|
lotOccupancyDB as databasePath
|
||||||
|
} from "../../data/databasePaths.js";
|
||||||
|
|
||||||
|
|
||||||
|
export const moveFeeCategoryUp =
|
||||||
|
(feeCategoryId: number | string): boolean => {
|
||||||
|
|
||||||
|
const database = sqlite(databasePath);
|
||||||
|
|
||||||
|
const currentOrderNumber: number = database.prepare("select orderNumber" +
|
||||||
|
" from FeeCategories" +
|
||||||
|
" where feeCategoryId = ?")
|
||||||
|
.get(feeCategoryId)
|
||||||
|
.orderNumber;
|
||||||
|
|
||||||
|
if (currentOrderNumber <= 0) {
|
||||||
|
database.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
database
|
||||||
|
.prepare("update FeeCategories" +
|
||||||
|
" set orderNumber = orderNumber + 1" +
|
||||||
|
" where recordDelete_timeMillis is null" +
|
||||||
|
" and orderNumber = ? - 1")
|
||||||
|
.run(currentOrderNumber);
|
||||||
|
|
||||||
|
const result = database
|
||||||
|
.prepare("update FeeCategories" +
|
||||||
|
" set orderNumber = ? - 1" +
|
||||||
|
" where feeCategoryId = ?")
|
||||||
|
.run(currentOrderNumber, feeCategoryId);
|
||||||
|
|
||||||
|
database.close();
|
||||||
|
|
||||||
|
return result.changes > 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export default moveFeeCategoryUp;
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
export declare const moveFeeDown: (feeId: number | string) => boolean;
|
||||||
|
export default moveFeeDown;
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
import sqlite from "better-sqlite3";
|
||||||
|
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||||
|
export const moveFeeDown = (feeId) => {
|
||||||
|
const database = sqlite(databasePath);
|
||||||
|
const currentOrderNumber = database.prepare("select orderNumber" +
|
||||||
|
" from Fees" +
|
||||||
|
" where feeId = ?")
|
||||||
|
.get(feeId)
|
||||||
|
.orderNumber;
|
||||||
|
database
|
||||||
|
.prepare("update Fees" +
|
||||||
|
" set orderNumber = orderNumber - 1" +
|
||||||
|
" where recordDelete_timeMillis is null" +
|
||||||
|
" and orderNumber = ? + 1")
|
||||||
|
.run(currentOrderNumber);
|
||||||
|
const result = database
|
||||||
|
.prepare("update Fees" +
|
||||||
|
" set orderNumber = ? + 1" +
|
||||||
|
" where feeId = ?")
|
||||||
|
.run(currentOrderNumber, feeId);
|
||||||
|
database.close();
|
||||||
|
return result.changes > 0;
|
||||||
|
};
|
||||||
|
export default moveFeeDown;
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
import sqlite from "better-sqlite3";
|
||||||
|
|
||||||
|
import {
|
||||||
|
lotOccupancyDB as databasePath
|
||||||
|
} from "../../data/databasePaths.js";
|
||||||
|
|
||||||
|
|
||||||
|
export const moveFeeDown =
|
||||||
|
(feeId: number | string): boolean => {
|
||||||
|
|
||||||
|
const database = sqlite(databasePath);
|
||||||
|
|
||||||
|
const currentOrderNumber: number = database.prepare("select orderNumber" +
|
||||||
|
" from Fees" +
|
||||||
|
" where feeId = ?")
|
||||||
|
.get(feeId)
|
||||||
|
.orderNumber;
|
||||||
|
|
||||||
|
database
|
||||||
|
.prepare("update Fees" +
|
||||||
|
" set orderNumber = orderNumber - 1" +
|
||||||
|
" where recordDelete_timeMillis is null" +
|
||||||
|
" and orderNumber = ? + 1")
|
||||||
|
.run(currentOrderNumber);
|
||||||
|
|
||||||
|
const result = database
|
||||||
|
.prepare("update Fees" +
|
||||||
|
" set orderNumber = ? + 1" +
|
||||||
|
" where feeId = ?")
|
||||||
|
.run(currentOrderNumber, feeId);
|
||||||
|
|
||||||
|
database.close();
|
||||||
|
|
||||||
|
return result.changes > 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export default moveFeeDown;
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
export declare const moveFeeUp: (feeId: number | string) => boolean;
|
||||||
|
export default moveFeeUp;
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
import sqlite from "better-sqlite3";
|
||||||
|
import { lotOccupancyDB as databasePath } from "../../data/databasePaths.js";
|
||||||
|
export const moveFeeUp = (feeId) => {
|
||||||
|
const database = sqlite(databasePath);
|
||||||
|
const currentOrderNumber = database.prepare("select orderNumber" +
|
||||||
|
" from Fees" +
|
||||||
|
" where feeId = ?")
|
||||||
|
.get(feeId)
|
||||||
|
.orderNumber;
|
||||||
|
if (currentOrderNumber <= 0) {
|
||||||
|
database.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
database
|
||||||
|
.prepare("update Fees" +
|
||||||
|
" set orderNumber = orderNumber + 1" +
|
||||||
|
" where recordDelete_timeMillis is null" +
|
||||||
|
" and orderNumber = ? - 1")
|
||||||
|
.run(currentOrderNumber);
|
||||||
|
const result = database
|
||||||
|
.prepare("update Fees" +
|
||||||
|
" set orderNumber = ? - 1" +
|
||||||
|
" where feeId = ?")
|
||||||
|
.run(currentOrderNumber, feeId);
|
||||||
|
database.close();
|
||||||
|
return result.changes > 0;
|
||||||
|
};
|
||||||
|
export default moveFeeUp;
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
import sqlite from "better-sqlite3";
|
||||||
|
|
||||||
|
import {
|
||||||
|
lotOccupancyDB as databasePath
|
||||||
|
} from "../../data/databasePaths.js";
|
||||||
|
|
||||||
|
|
||||||
|
export const moveFeeUp =
|
||||||
|
(feeId: number | string): boolean => {
|
||||||
|
|
||||||
|
const database = sqlite(databasePath);
|
||||||
|
|
||||||
|
const currentOrderNumber: number = database.prepare("select orderNumber" +
|
||||||
|
" from Fees" +
|
||||||
|
" where feeId = ?")
|
||||||
|
.get(feeId)
|
||||||
|
.orderNumber;
|
||||||
|
|
||||||
|
if (currentOrderNumber <= 0) {
|
||||||
|
database.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
database
|
||||||
|
.prepare("update Fees" +
|
||||||
|
" set orderNumber = orderNumber + 1" +
|
||||||
|
" where recordDelete_timeMillis is null" +
|
||||||
|
" and orderNumber = ? - 1")
|
||||||
|
.run(currentOrderNumber);
|
||||||
|
|
||||||
|
const result = database
|
||||||
|
.prepare("update Fees" +
|
||||||
|
" set orderNumber = ? - 1" +
|
||||||
|
" where feeId = ?")
|
||||||
|
.run(currentOrderNumber, feeId);
|
||||||
|
|
||||||
|
database.close();
|
||||||
|
|
||||||
|
return result.changes > 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export default moveFeeUp;
|
||||||
|
|
@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
const urlPrefix = document.querySelector("main").dataset.urlPrefix;
|
||||||
const feeCategoriesContainerElement = document.querySelector("#container--feeCategories");
|
const feeCategoriesContainerElement = document.querySelector("#container--feeCategories");
|
||||||
let feeCategories = exports.feeCategories;
|
let feeCategories = exports.feeCategories;
|
||||||
|
delete exports.feeCategories;
|
||||||
const renderFeeCategories = () => {
|
const renderFeeCategories = () => {
|
||||||
if (feeCategories.length === 0) {
|
if (feeCategories.length === 0) {
|
||||||
feeCategoriesContainerElement.innerHTML = "<div class=\"message is-warning\">" +
|
feeCategoriesContainerElement.innerHTML = "<div class=\"message is-warning\">" +
|
||||||
|
|
@ -55,13 +56,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const panelElement = document.createElement("div");
|
const panelElement = document.createElement("div");
|
||||||
panelElement.className = "panel";
|
panelElement.className = "panel";
|
||||||
for (const fee of feeCategory.fees) {
|
for (const fee of feeCategory.fees) {
|
||||||
const panelBlockElement = document.createElement("a");
|
const panelBlockElement = document.createElement("div");
|
||||||
panelBlockElement.className = "panel-block is-block container--fee";
|
panelBlockElement.className = "panel-block is-block container--fee";
|
||||||
panelBlockElement.dataset.feeId = fee.feeId.toString();
|
panelBlockElement.dataset.feeId = fee.feeId.toString();
|
||||||
panelBlockElement.innerHTML = "<div class=\"columns\">" +
|
panelBlockElement.innerHTML = "<div class=\"columns\">" +
|
||||||
("<div class=\"column is-half\">" +
|
("<div class=\"column is-half\">" +
|
||||||
"<p>" +
|
"<p>" +
|
||||||
"<strong>" + cityssm.escapeHTML(fee.feeName) + "</strong><br />" +
|
"<a class=\"has-text-weight-bold\" href=\"#\">" + cityssm.escapeHTML(fee.feeName) + "</a><br />" +
|
||||||
"<small>" + cityssm.escapeHTML(fee.feeDescription).replace(/\n/g, "<br />") + "</small>" +
|
"<small>" + cityssm.escapeHTML(fee.feeDescription).replace(/\n/g, "<br />") + "</small>" +
|
||||||
"</p>" +
|
"</p>" +
|
||||||
"<p class=\"tags\">" +
|
"<p class=\"tags\">" +
|
||||||
|
|
@ -98,7 +99,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
"") +
|
"") +
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</div>";
|
"</div>";
|
||||||
panelBlockElement.addEventListener("click", openEditFee);
|
panelBlockElement.querySelector("a").addEventListener("click", openEditFee);
|
||||||
panelElement.append(panelBlockElement);
|
panelElement.append(panelBlockElement);
|
||||||
}
|
}
|
||||||
feeCategoryContainerElement.append(panelElement);
|
feeCategoryContainerElement.append(panelElement);
|
||||||
|
|
@ -311,8 +312,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
};
|
};
|
||||||
const openEditFee = (clickEvent) => {
|
const openEditFee = (clickEvent) => {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
const feeId = Number.parseInt(clickEvent.currentTarget.dataset.feeId, 10);
|
const feeContainerElement = clickEvent.currentTarget.closest(".container--fee");
|
||||||
const feeCategoryId = Number.parseInt(clickEvent.currentTarget.closest(".container--feeCategory").dataset.feeCategoryId);
|
const feeId = Number.parseInt(feeContainerElement.dataset.feeId, 10);
|
||||||
|
const feeCategoryId = Number.parseInt(feeContainerElement.closest(".container--feeCategory").dataset.feeCategoryId);
|
||||||
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
||||||
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ declare const bulmaJS: BulmaJS;
|
||||||
const feeCategoriesContainerElement = document.querySelector("#container--feeCategories") as HTMLElement;
|
const feeCategoriesContainerElement = document.querySelector("#container--feeCategories") as HTMLElement;
|
||||||
|
|
||||||
let feeCategories: recordTypes.FeeCategory[] = exports.feeCategories;
|
let feeCategories: recordTypes.FeeCategory[] = exports.feeCategories;
|
||||||
|
delete exports.feeCategories;
|
||||||
|
|
||||||
const renderFeeCategories = () => {
|
const renderFeeCategories = () => {
|
||||||
|
|
||||||
|
|
@ -85,14 +86,14 @@ declare const bulmaJS: BulmaJS;
|
||||||
|
|
||||||
for (const fee of feeCategory.fees) {
|
for (const fee of feeCategory.fees) {
|
||||||
|
|
||||||
const panelBlockElement = document.createElement("a");
|
const panelBlockElement = document.createElement("div");
|
||||||
panelBlockElement.className = "panel-block is-block container--fee";
|
panelBlockElement.className = "panel-block is-block container--fee";
|
||||||
panelBlockElement.dataset.feeId = fee.feeId.toString();
|
panelBlockElement.dataset.feeId = fee.feeId.toString();
|
||||||
|
|
||||||
panelBlockElement.innerHTML = "<div class=\"columns\">" +
|
panelBlockElement.innerHTML = "<div class=\"columns\">" +
|
||||||
("<div class=\"column is-half\">" +
|
("<div class=\"column is-half\">" +
|
||||||
"<p>" +
|
"<p>" +
|
||||||
"<strong>" + cityssm.escapeHTML(fee.feeName) + "</strong><br />" +
|
"<a class=\"has-text-weight-bold\" href=\"#\">" + cityssm.escapeHTML(fee.feeName) + "</a><br />" +
|
||||||
"<small>" + cityssm.escapeHTML(fee.feeDescription).replace(/\n/g, "<br />") + "</small>" +
|
"<small>" + cityssm.escapeHTML(fee.feeDescription).replace(/\n/g, "<br />") + "</small>" +
|
||||||
"</p>" +
|
"</p>" +
|
||||||
"<p class=\"tags\">" +
|
"<p class=\"tags\">" +
|
||||||
|
|
@ -130,7 +131,7 @@ declare const bulmaJS: BulmaJS;
|
||||||
"</div>") +
|
"</div>") +
|
||||||
"</div>";
|
"</div>";
|
||||||
|
|
||||||
panelBlockElement.addEventListener("click", openEditFee);
|
panelBlockElement.querySelector("a").addEventListener("click", openEditFee);
|
||||||
|
|
||||||
panelElement.append(panelBlockElement);
|
panelElement.append(panelBlockElement);
|
||||||
}
|
}
|
||||||
|
|
@ -435,8 +436,10 @@ declare const bulmaJS: BulmaJS;
|
||||||
const openEditFee = (clickEvent: Event) => {
|
const openEditFee = (clickEvent: Event) => {
|
||||||
clickEvent.preventDefault();
|
clickEvent.preventDefault();
|
||||||
|
|
||||||
const feeId = Number.parseInt((clickEvent.currentTarget as HTMLElement).dataset.feeId, 10);
|
const feeContainerElement = (clickEvent.currentTarget as HTMLElement).closest(".container--fee") as HTMLElement;
|
||||||
const feeCategoryId = Number.parseInt(((clickEvent.currentTarget as HTMLElement).closest(".container--feeCategory") as HTMLElement).dataset.feeCategoryId);
|
|
||||||
|
const feeId = Number.parseInt(feeContainerElement.dataset.feeId, 10);
|
||||||
|
const feeCategoryId = Number.parseInt((feeContainerElement.closest(".container--feeCategory") as HTMLElement).dataset.feeCategoryId);
|
||||||
|
|
||||||
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
const feeCategory = feeCategories.find((currentFeeCategory) => {
|
||||||
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
return currentFeeCategory.feeCategoryId === feeCategoryId;
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -1,7 +1,9 @@
|
||||||
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";
|
import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js";
|
||||||
|
import handler_view from "../handlers/workOrders-get/view.js";
|
||||||
export const router = Router();
|
export const router = Router();
|
||||||
router.get("/", handler_search);
|
router.get("/", handler_search);
|
||||||
router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
|
router.post("/doSearchWorkOrders", handler_doSearchWorkOrders);
|
||||||
|
router.get("/:workOrderId", handler_view);
|
||||||
export default router;
|
export default router;
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ 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";
|
import handler_doSearchWorkOrders from "../handlers/workOrders-post/doSearchWorkOrders.js";
|
||||||
|
|
||||||
|
import handler_view from "../handlers/workOrders-get/view.js";
|
||||||
|
|
||||||
|
|
||||||
export const router = Router();
|
export const router = Router();
|
||||||
|
|
@ -20,4 +21,9 @@ router.post("/doSearchWorkOrders",
|
||||||
handler_doSearchWorkOrders);
|
handler_doSearchWorkOrders);
|
||||||
|
|
||||||
|
|
||||||
|
router.get("/:workOrderId",
|
||||||
|
handler_view);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
|
|
@ -101,6 +101,7 @@ export interface FeeCategory extends Record {
|
||||||
feeCategoryId?: number;
|
feeCategoryId?: number;
|
||||||
feeCategory?: string;
|
feeCategory?: string;
|
||||||
fees?: Fee[];
|
fees?: Fee[];
|
||||||
|
orderNumber?: number;
|
||||||
}
|
}
|
||||||
export interface Fee extends Record {
|
export interface Fee extends Record {
|
||||||
feeId?: number;
|
feeId?: number;
|
||||||
|
|
@ -119,6 +120,7 @@ export interface Fee extends Record {
|
||||||
taxAmount?: number;
|
taxAmount?: number;
|
||||||
taxPercentage?: number;
|
taxPercentage?: number;
|
||||||
isRequired?: boolean;
|
isRequired?: boolean;
|
||||||
|
orderNumber?: number;
|
||||||
}
|
}
|
||||||
export interface LotOccupancyFee extends Fee, Record {
|
export interface LotOccupancyFee extends Fee, Record {
|
||||||
lotOccupancyId?: number;
|
lotOccupancyId?: number;
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,7 @@ export interface FeeCategory extends Record {
|
||||||
feeCategoryId ? : number;
|
feeCategoryId ? : number;
|
||||||
feeCategory ? : string;
|
feeCategory ? : string;
|
||||||
fees ? : Fee[];
|
fees ? : Fee[];
|
||||||
|
orderNumber ? : number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -171,6 +172,8 @@ export interface Fee extends Record {
|
||||||
taxPercentage ? : number;
|
taxPercentage ? : number;
|
||||||
|
|
||||||
isRequired ? : boolean;
|
isRequired ? : boolean;
|
||||||
|
|
||||||
|
orderNumber ? : number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
<%- include('_header'); -%>
|
||||||
|
|
||||||
|
<div class="columns is-variable is-4-mobile is-4-tablet is-block-print" id="is-site-layout">
|
||||||
|
|
||||||
|
<div class="column is-block-print">
|
||||||
|
<nav class="breadcrumb">
|
||||||
|
<ul>
|
||||||
|
<li><a href="<%= urlPrefix %>/dashboard">Home</a></li>
|
||||||
|
<li>
|
||||||
|
<a href="<%= urlPrefix %>/workOrders">
|
||||||
|
<span class="icon is-small"><i class="fas fa-hard-hat" aria-hidden="true"></i></span>
|
||||||
|
<span>Work Orders</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="is-active">
|
||||||
|
<a href="#" aria-current="page">
|
||||||
|
Work Order #<%= workOrder.workOrderNumber || "(No Number)" %>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<h1 class="title is-1">
|
||||||
|
Work Order #<%= workOrder.workOrderNumber || "(No Number)" %>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<% if (user.userProperties.canUpdate) { %>
|
||||||
|
<div class="fixed-container is-fixed-bottom-right mx-4 my-4 has-text-right is-hidden-print">
|
||||||
|
<a class="button is-circle is-primary has-tooltip-left" data-tooltip="Update Work Order" href="<%= urlPrefix %>/workOrders/<%= workOrder.workOrderId %>/edit">
|
||||||
|
<i class="fas fa-pencil-alt" aria-hidden="true"></i>
|
||||||
|
<span class="sr-only">Update Work Order</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<% } %>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%- include('_footerA'); -%>
|
||||||
|
|
||||||
|
<%- include('_footerB'); -%>
|
||||||
Loading…
Reference in New Issue