@cityssm/worktech-api
Version:
Integrations with the WorkTech (Pearl) work order management system.
187 lines (162 loc) • 6.94 kB
text/typescript
// eslint-disable-next-line @eslint-community/eslint-comments/disable-enable-pair
/* eslint-disable @cspell/spellchecker */
import { connect, type mssql } from '@cityssm/mssql-multi-pool'
import Debug from 'debug'
import { lockTable } from '../../helpers/lockTable.js'
import { getLastSystemId, incrementLastSystemId } from '../systemId.js'
import type { BigIntString } from '../types.js'
import type { ResourceItem } from './types.js'
const debug = Debug('worktech-api:addResourceItem')
export interface AddResourceItem extends Partial<ResourceItem> {
itemId: string
itemType: string
itemClass: string
unit: string
plate?: string
odometer?: number
}
/**
* Creates a new resource item.
* @param mssqlConfig - SQL Server configuration.
* @param resourceItem - The resource item fields.
* @returns The system id for the new resource item.
*/
export async function addResourceItem(
mssqlConfig: mssql.config,
resourceItem: AddResourceItem
): Promise<BigIntString> {
// eslint-disable-next-line @typescript-eslint/no-magic-numbers
if (resourceItem.itemId.length > 15) {
throw new Error('itemId exceeds 15 characters')
}
const pool = await connect(mssqlConfig)
const transaction = pool.transaction()
try {
debug('Starting transaction')
await transaction.begin()
debug('Lock tables')
await lockTable(transaction, 'WMITM')
debug('Getting last system id')
const lastSystemId = await getLastSystemId(transaction)
if (lastSystemId === undefined) {
throw new Error('Last used system id is unavailable.')
}
const itemSystemId = (
Number.parseInt(lastSystemId, 10) + 1
).toString() as BigIntString
debug(`Adding item ${itemSystemId} (${resourceItem.itemId})`)
await transaction
.request()
.input('itemSystemId', itemSystemId)
.input('itemId', resourceItem.itemId)
.input('itemDescription', resourceItem.itemDescription ?? '')
.input('externalItemId', resourceItem.externalItemId ?? '')
.input('itemClass', resourceItem.itemClass)
.input('itemType', resourceItem.itemType)
.input('itemStatus', resourceItem.itemStatus ?? 'EstOnly')
.input('department', resourceItem.department ?? '')
.input('division', resourceItem.division ?? '')
.input('company', resourceItem.company ?? '')
.input('comments', resourceItem.comments ?? '')
.input('stock', resourceItem.stock ?? 0)
.input('unit', resourceItem.unit)
.input('unitCost', resourceItem.unitCost ?? 0)
.input('quantityOnHand', resourceItem.quantityOnHand ?? 0)
.input('itemBrand', resourceItem.itemBrand)
.input('location', resourceItem.location ?? '')
.input('odometer', resourceItem.odometer ?? 0)
.input('plate', resourceItem.plate ?? '')
.input('serialNumber', resourceItem.serialNumber ?? '')
.input('itemModel', resourceItem.itemModel)
.input(
'itemModelYear',
resourceItem.itemModelYear ?? new Date().getFullYear()
).query(`INSERT INTO WMITM (
ITMSYSID, ITEM_ID, "DESC", RESLIST, EXTITEM_ID,
ITEMCLASS, CLASSITEM, TYPE, STATUS,
DEPT, DIVISION, COMPANY, FLTYPE, COMMENTS,
EXJOB_ID, EXJOBSYSID, EXACTV_ID, EXOBJCODE, EXOCSYSID,
REVJOBSYSID, REVJOB_ID, REVACTV_ID, REVOBJCODE, REVOCSYSID,
VEHSYS, STOCK, UNITS, UNITCOST, UNITS2, UNITS3, UNITS4,
QTYHAND, MINLEVEL, ORDERQTY,
ORDVEND_ID, VEND_ID, VENDSYSID,
IREMPURGE, VREMPURGED, VARIANCE, "VALUE",
VARWARN, VARDOWN, VARUP,
TAXCODE,
PAYGROUP, PGSYSID,
INSTALLVENDOR, DATEINST,
MEAS_UNITS, SHAPE, LENGTH, DIAMETER, HEIGHT, WIDTH,
CAPACITY, TANK, QTYHANDCHECK, TANKUSAGECHOICE, CAPACITYFLAG, BRAND,
DATEIN, CREW, HOURS, HRCOST, INITVAL,
LOCATION, MODEL,
ODOM, RUNHRS, ORGODOM, ORGHOURS, PLATE, SERIAL,
PURCHDATE, PURCHFRM, REPLCOST, REPLYR, RESVAL, REVTD,
TOTCOST, PURCHPRICE, USELIFE, "YEAR", TRADEIN,
ODOMUPDATECHECK, HRMETERUPDATECHECK,
CARDNUMBER,
ADDRESS, ADDRESS2, ADDRESS3, ADDRESS4,
BIRTHD, EMAIL,
PHONE1, PHONE2, PHONE3, PHONEDESC1, PHONEDESC2, PHONEDESC3,
"POSITION",
HRSPERPP, PAYOT, BANKOT,
EBCHOICE, EBPERCENT, EBDOBJCODE, EBDOCSYSID, EBRJOBSYSID, EBRJOB_ID, EBROBJCODE, EBROCSYSID, EBRACTV_ID,
DEFVEH_ID, EBGROUP, STOCKPILE, PROCESSCOST, ROYALTYCOST, ROYALTYTO, HAULER, DAYS2REORDER,
FUELCONRATE, FUELOVERLAST, OILCONRATE, OILOVERLAST,
PAYMETHOD, FIXEDRECRATE, ESTRATE, ESTITEM,
CVOR, PATROL, UNITP, HASODOMETER, CHARGEOUT, DAILYHRS,
REVCAPJOB_ID, REVCAPJOBSYSID, REVCAPACTV_ID, REVCAPOBJCODE, REVCAPOCSYSID, OTCHECKTYPE,
EXTITMSYSID, DEFTC_ID, EMPLSTATUS, EXTARITEM_ID,
EXTRA1, EXTRA2, DATE1, DATE2, DATE3, PIL,
ASSET_ID, ASSETSYSID, EXTRAD1, EXTRAC1, STK_MKUP, ORGPOS_ID,
FEATURE_ID, ACISYSID, SYSTEM, MOD_USER, ROOM_ID, PITEM_ID,
MEASURE1, MEASURE2, MEASURE3, MEASURE4,
EXTRAC2, PORT, DIALS, CELLPHONE, FIR_ID, EXTRA3)
VALUES (
, , , 1, ,
, 0, , ,
, , , NULL, ,
NULL, 0, NULL, '', 0,
0, '', NULL, '', 0,
NULL, , , , NULL, '', '',
, 0.00, 0.00,
NULL, NULL, 0,
0, 0, 0.00, 0.00,
0, 0.00, 0.00,
NULL,
NULL, 0,
NULL, NULL,
'Metres', 'Rectangle', 0.00, 0.00, 0.00, 0.00,
0.00, 0, 0, 'Vehicle ID', 0, ,
NULL, NULL, 0.0, 0.00, 0.00,
, ,
, 0.00, 0.0, 0.0, , ,
NULL, NULL, 0.00, 0, 0.00, 0.00,
0.00, 0.00, 0, , 0.00,
0, 0,
NULL,
NULL, NULL, NULL, NULL,
NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL,
80.00, 0, 0,
0, 0.000, NULL, 0, 0, NULL, NULL, 0, NULL,
NULL, NULL, 0, 0.0000, 0.0000, NULL, 0, 0,
0.00, 0, 0.00, 0,
'Hourly', 0.00, 0.00, 0,
0, '', 0.00, 0, 0, 0.00,
NULL, 0, NULL, NULL, 0, NULL,
0, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, 0, 0.00, 0, 0.00, NULL,
NULL, 0, NULL, '', NULL, NULL,
0.00, 0.00, 0.00, 0.00,
0, 0, 0, NULL, NULL, NULL)`)
debug(`Added item ${itemSystemId} (${resourceItem.itemId})`)
await incrementLastSystemId(transaction)
await transaction.commit()
return itemSystemId
} catch (error) {
await transaction.rollback()
throw error as Error
}
}