@cityssm/worktech-api
Version:
Integrations with the WorkTech (Pearl) work order management system.
150 lines (149 loc) • 5.39 kB
JavaScript
// eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair
/* eslint-disable @cspell/spellchecker */
import { connect } from '@cityssm/mssql-multi-pool';
import { dateToString, dateToTimeString } from '@cityssm/utils-datetime';
import { lockTable } from '../../helpers/lockTable.js';
import { getItemByItemId } from '../items/getItems.js';
import { getLastSystemId, incrementLastSystemId } from '../systemId.js';
import { getWorkOrderByWorkOrderNumber } from './getWorkOrders.js';
/**
* Adds a resource to a work order.
* @param mssqlConfig - SQL Server configuration.
* @param workOrderResource - The work order resource fields.
* @returns - The system id for the new resource record.
*/
export async function addWorkOrderResource(mssqlConfig, workOrderResource) {
/*
* Get Work Order Id
*/
let serviceRequestSystemId = workOrderResource.serviceRequestSystemId;
const workOrder = await getWorkOrderByWorkOrderNumber(mssqlConfig, workOrderResource.workOrderNumber);
if (workOrder === undefined) {
throw new Error(`Work Order not found: ${workOrderResource.workOrderNumber}`);
}
if (serviceRequestSystemId === undefined) {
serviceRequestSystemId = workOrder.serviceRequestSystemId;
}
/*
* Get Item Id
*/
let itemSystemId = workOrderResource.itemSystemId;
const item = await getItemByItemId(mssqlConfig, workOrderResource.itemId);
if (item === undefined) {
throw new Error(`Item not found: ${workOrderResource.itemId}`);
}
if (itemSystemId === undefined) {
itemSystemId = item.itemSystemId;
}
/*
* Calculate dates
*/
const startDate = workOrderResource.startDateTime ?? new Date();
const startDateTimeString = `${dateToString(startDate)} ${dateToTimeString(startDate)}`;
const endDateTimeString = workOrderResource.endDateTime === undefined
? null
: `${dateToString(workOrderResource.endDateTime)} ${dateToTimeString(workOrderResource.endDateTime)}`;
/*
* Calculate base amount
*/
const quantity = workOrderResource.quantity ?? 0;
const unitPrice = workOrderResource.unitPrice ?? item.unitCost;
const baseAmount = workOrderResource.baseAmount ?? quantity * unitPrice;
/*
* Do the transaction
*/
const pool = await connect(mssqlConfig);
const transaction = pool.transaction();
try {
await transaction.begin();
await lockTable(transaction, 'AMSRI');
const lastSystemId = await getLastSystemId(transaction);
if (lastSystemId === undefined) {
throw new Error('Last used system id is unavailable.');
}
const serviceRequestItemSystemId = (Number.parseInt(lastSystemId, 10) + 1).toString();
await transaction
.request()
.input('serviceRequestItemSystemId', serviceRequestItemSystemId)
.input('serviceRequestSystemId', serviceRequestSystemId)
.input('startDateTime', startDateTimeString)
.input('itemSystemId', itemSystemId)
.input('itemId', workOrderResource.itemId)
.input('quantity', quantity)
.input('unitPrice', unitPrice)
.input('baseAmount', baseAmount)
.input('lockUnitPrice', workOrderResource.lockUnitPrice ?? 0)
.input('lockMargin', workOrderResource.lockMargin ?? 0)
.input('workOrderNumber', workOrderResource.workOrderNumber)
.input('workDescription',
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
workOrderResource.workDescription ?? item.itemDescription ?? '')
.input('endDateTime', endDateTimeString)
.input('step', workOrderResource.step ?? '').query(`INSERT INTO AMSRI (
SRISYSID, SRQISYSID,
PPSYSID, PROJ_ID, P_ID, PMD_TASK, WORKSOURCE,
SCHEDDATETIME,
ITMSYSID,
ITEM_ID,
QTY,
UNITPRICE,
AMT,
LOCKEST, LOCMARGIN,
WONOS,
SYSID,
WORKDESC,
ENDDATETIME,
STEP,
ACTV_ID, RPTCODE, DONE,
OVERHEAD_PER, OVERHEAD_AMT,
TAXCODE, MOD_USER,
WOPRIMARY,
DIM1, DIM2, DIM3,
TSISYSID,
LOCKSCHEDDATE, KIT_ID, LOCKKIT,
REASONFORCHANGE,
EXTAX1, EXTAX2, EXPAYABLE,
MULT, QTY2,
ACTAMT,
EXT_ID, ASSIGNTO,
ACTQTY, PROCESSEDQTY,
SRAISYSID, OBJCODE, LOCATION)
VALUES (
,
,
0, '', 0, '', '',
,
,
,
,
,
,
, ,
,
0,
,
,
,
'', '', 0,
0.00, 0.00,
'', '',
0,
0.00, 0.00, 0.00,
0,
0, '', 0,
'',
0.00, 0.00, 0.00,
0.00, 1.00,
0.00,
'', '',
0.00, 0.00,
0, '', '')`);
await incrementLastSystemId(transaction);
await transaction.commit();
return serviceRequestItemSystemId;
}
catch (error) {
await transaction.rollback();
throw error;
}
}