cityworks 2.1.5 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/attachments.d.ts +7 -5
- package/dist/case_flags.d.ts +2 -3
- package/dist/error.d.ts +10 -10
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.m.js +1 -1
- package/dist/index.m.js.map +1 -1
- package/dist/index.modern.mjs +1 -1
- package/dist/index.modern.mjs.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/inspection_admin.d.ts +16 -0
- package/dist/report.d.ts +46 -3
- package/dist/request_admin.d.ts +8 -0
- package/dist/workorder_admin.d.ts +16 -0
- package/package.json +5 -5
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/error.ts","../src/general.ts","../src/attachments.ts","../src/activity_link.ts","../src/gis.ts","../src/message_queue.ts","../src/search.ts","../src/query.ts","../src/report.ts","../src/request.ts","../src/inspection.ts","../src/workorder.ts","../src/briefcase.ts","../src/case_data.ts","../src/case_financial.ts","../src/comments.ts","../src/case_workflow.ts","../src/case_people.ts","../src/case_assets.ts","../src/case_flags.ts","../src/case_admin.ts","../src/workorder_admin.ts","../src/inspection_admin.ts","../src/request_admin.ts","../src/workorder_costs.ts","../src/inspection_costs.ts","../src/request_costs.ts","../src/index.ts"],"sourcesContent":["const _ = require('lodash')\n\nexport interface CWErrorMsgs {\n MessageType: number\n Code: number\n Service: string\n Name: string\n DebugDetails: string\n DisplayText: string\n InnerMessage: string|null\n}\n\n/**\n * CWErrorInt interface definition for implementation by CWError\n *\n * `{name: string, code: number, message: string, info?: string}`\n *\n */\nexport interface CWErrorInt {\n name: string\n code: number\n message: string\n error_messages?: Array<CWErrorMsgs>\n info?: string\n}\n\n/**\n * CWError implements a custom error class for this codebase with additional information\n *\n */\nexport class CWError implements CWErrorInt {\n /**\n * Just statically set to \"Cityworks Exception\" for now\n */\n name: string\n /**\n * Number for the thrown error (Efforts were made to make these unique when thrown throughout the codebase)\n */\n code: number\n /**\n * The error message\n */\n message: string\n /**\n * The error message\n */\n error_messages: Array<CWErrorMsgs>\n /**\n * Object stuffed with any other information one wishes to include in the thrown error\n */\n info?: string\n\n /**\n * CWError implements a custom error class for this codebase with additional information\n *\n * @param {number} code - Number for the thrown error (Efforts were made to make these unique when thrown throughout the codebase)\n * @param {string} message - The error message\n * @param {Object} info - Object stuffed with any other information one wishes to include in the thrown error\n * @return {Object} Returns instance of CWError object\n */\n constructor(code:number, message:string, info?:any) {\n this.name = \"Cityworks Exception\"\n this.code = code\n this.message = message\n this.error_messages = []\n // console.log('CWERROR', code, message, info)\n if(typeof(info) !== 'undefined') {\n if(_.has(info, 'ErrorMessages')) {\n _.forEach(info.ErrorMessages, (v) => {\n _.set(v, 'Service', v.Service.replace(/([a-z])([A-Z])/g, '$1 $2'))\n _.set(v, 'Name', v.Name.replace(/([a-z])([A-Z])/g, '$1 $2'))\n this.error_messages.push(v)\n })\n }\n if(_.has(info, 'Message'))\n this.message = _.get(info, 'Message')\n this.info = JSON.stringify(info)\n }\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\n/**\n * A plugin that contains \"general\" methods for a Cityworks install\n */\nexport class General {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Get notifications for currently authenticated user\n *\n * @return {Object} Returns Promise object that represents a collection of available notifications\n */\n notifications() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('General/ActivityNotification/User', {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n\n /**\n * Find out if the current user is watching a particular activity (case, task, null [as a string])\n *\n * @param {string} activityType - which activity type the following ID will be for.\n * @param {number} activityId - activity Case or CaseTask (task instance) ID to check\n * @return {Object} Returns Promise object that represents a boolean indicating the currently authenticated user is watching the provided activity\n */\n amIWatching(activityType, activityId: number) {\n return new Promise((resolve, reject) => {\n let aType = {'null': 0, 'case': 1, 'task': 2}\n if(typeof(aType[activityType])=='undefined') {\n // reject with error\n reject(new CWError(1, \"Activity type provided does not exist.\", {provided: activityType, potential_activities: aType}))\n } else {\n let data = {\"ActivityType\": aType[activityType], \"ActivityId\": activityId}\n this.cw.runRequest('General/ActivityNotification/UserWatching', data).then(r => {\n // console.log(r, 'response')\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Get CwMetatData by Type and CwSid\n *\n * @param {Array<number>} Ids\n * @param {string} TableName - INSPECTION, REQUEST, WORKORDER require View permission on the activities\n * @return {Object} Returns Promise object that represents a\n */\n getActivityMetadataByIds(ids: Array<number>, table: string) {\n return new Promise((resolve, reject) => {\n let tables = [\"INSPECTION\", \"REQUEST\", \"WORKORDER\"]\n if(_.indexOf(tables, table)==-1) {\n reject(new CWError(2, 'TableName provided does not exist or is mispelled.', {'provided': table, 'available':tables}))\n }\n let data = {\n \"Ids\": ids,\n \"TableName\": table\n }\n this.cw.runRequest('General/CwMetaData/ByTableNameSids', data).then(r => {\n console.log(r)\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get recent history for authenticated user\n *\n * @return {Object} Returns Promise object that represents a collection of RecentActivity objects\n */\n getHistory() {\n return new Promise((resolve, reject) => {\n let data = {}\n this.cw.runRequest('Ams/Search/RecentActivity', data).then(r => {\n console.log(r)\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get cost summary for WorkOrder entities\n *\n * @param {Array<number>} ObjectIds\n * @return {Object} Returns Promise object that represents a\n */\n getWOEntityCostSummary(object_ids: Array<number>) {\n return new Promise((resolve, reject) => {\n let data = {\n \"ObjectIds\": object_ids\n }\n this.cw.runRequest('General/CostSummary/WorkOrderEntity', data).then(r => {\n console.log(r)\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get cost summary for WorkOrder entities selected through a search definition\n *\n * @param {number} SearchId - Search Definition Id\n * @return {Object} Returns Promise object that represents a\n */\n searchWOEntityCostSummary(search_id: number) {\n return new Promise((resolve, reject) => {\n let data = {\n \"SearchId\": search_id\n }\n this.cw.runRequest('General/CostSummary/WorkOrderEntitySearch', data).then(r => {\n console.log(r)\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Holidays\n *\n * @param {Date} startDate - Date to search for Holidays, including this date.\n * @param {Date} [endDate] - If not specified, Holidays _on_ startDate are returned. If specified, Holidays on startDate up to, but not including endDate are returned.\n * @return {Object} Returns Promise object that represents a list of the holiday(s) found\n */\n getHolidays(startDate: Date, endDate?: Date) {\n return new Promise((resolve, reject) => {\n let data = {}\n var api_path = 'General/Holidays/All'\n if(typeof(endDate)=='undefined') {\n _.set(data, \"Date\", startDate)\n var api_path = 'General/Holidays/ByDate'\n } else {\n _.set(data, \"StartDate\", startDate)\n _.set(data, \"EndDate\", endDate)\n }\n this.cw.runRequest(api_path, data).then(r => {\n console.log(r)\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Holidays\n *\n * @param {Date} holiday - The holiday's date\n * @param {string} description - The holiday's name/description\n * @return {Object} Returns Promise object that represents a\n */\n addHolidays(holiday: Date, description: string) {\n return new Promise((resolve, reject) => {\n let data = {\n \"Holiday\": holiday,\n \"Description\": description\n }\n this.cw.runRequest('General/Holidays/Add', data).then(r => {\n console.log(r)\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Holidays\n *\n * @param {Array<Date>} holidays - List of datetimes which should have holidays deleted\n * @return {Object} Returns Promise object that represents a\n */\n deleteHolidays(holidays: Array<Date>) {\n return new Promise((resolve, reject) => {\n let data = {\n \"Holidays\": holidays\n }\n this.cw.runRequest('General/Holidays/Delete', data).then(r => {\n console.log(r)\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\nconst fs = require('fs');\n\n\nexport class Attachments {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Storage of object's active activityType\n */\n currentActivityType: string\n\n /**\n * @hidden\n */\n constructor(cw, current_type) {\n this.cw = cw\n this.currentActivityType = current_type;\n }\n\n // Attachments\n\n /**\n * Add attachments (doesn't handle URL or Signature type attachments properly, currently)\n *\n * @category Attachments\n * @param {number} id - The ID of the node to add the attachment to (CA_OBJECT_ID, REQUESTID, WORKORDERSID, WORKORDERID, INSPECTIONID). If WORKORDERID, you _must_ feed in as a string.\n * @param {string} the_file - The loca path of the file to upload to the Cityworks instance\n * @param {number} [task_id] - ID of WorkOrder task, if current activity is a work order and the attachment should be on the task\n * @param {string} [filename] - The filename for the attachment\n * @param {string} [attachment_type] - The filename for the attachment, values: attachment, signature, url\n * @param {string} [comments] - The filename for the attachment\n * @param {string} [label] - The label to apply to the (PLL only)\n * @return {Object} Returns object that represents a boolean for action resolution\n */\n add(node_id: number|string, the_file: string, filename?: string, attachment_type: string = 'attachment', task_id?: number, comments?: string, label?: string) {\n // attachment_type map\n var attachment_type_map = {'attachment': 0, 'signature': 1, 'url': 2}\n return new Promise((resolve, reject) => {\n var data = {}\n if(typeof(filename)!=='undefined') {\n _.set(data, 'Filename', filename)\n }\n if(typeof(comments)!=='undefined') {\n _.set(data, 'Comments', comments)\n }\n if(typeof(label)!=='undefined' && this.currentActivityType=='Case') {\n _.set(data, 'LabelText', label)\n }\n\n var endpoint = ''\n switch(this.currentActivityType) {\n case 'Case':\n endpoint = 'Pll/CaseRelDocs/Add'\n _.set(data, 'CaObjectId', node_id)\n break;\n case 'Inspection':\n endpoint = 'Ams/Attachments/AddInspectionAttachment'\n _.set(data, 'InspectionId', node_id)\n if(typeof(attachment_type)!=='undefined') {\n _.set(data, 'AttachmentType', attachment_type_map[attachment_type])\n }\n break;\n case 'Request':\n _.set(data, 'RequestId', node_id)\n endpoint = 'Ams/Attachments/AddRequestAttachment'\n break;\n case 'WorkOrder':\n if(typeof(node_id)=='string') {\n _.set(data, 'WorkOrderId', node_id)\n } else {\n _.set(data, 'WorkOrderSid', node_id)\n }\n if(typeof(task_id)!=='undefined') {\n _.set(data, 'TaskId', task_id)\n }\n if(typeof(attachment_type)!=='undefined') {\n _.set(data, 'AttachmentType', attachment_type_map[attachment_type])\n }\n endpoint = 'Ams/Attachments/AddWorkOrderAttachment'\n break;\n default:\n reject(new CWError(132, 'Unknown current activity type or activity type not set.', {'provided': this.currentActivityType}))\n }\n this.cw.runRequest(endpoint, data, the_file).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update attachment\n *\n * @category Attachments\n * @param {number} id - The ID of the node to add the attachment to (CA_OBJECT_ID, REQUESTID, WORKORDERSID, WORKORDERID, INSPECTIONID). If WORKORDERID, you _must_ feed in as a string.\n * @param {string} [title] - The filename for the attachment\n * @param {string} [description] - The filename for the attachment\n * @param {string} [label] - The label to apply to the (PLL only)\n * @return {Object} Returns object that represents a boolean for action resolution\n */\n update(attachment_id: number, title?: string, description?: string, label?: string) {\n // attachment_type map\n return new Promise((resolve, reject) => {\n var data = {}\n if(typeof(title)!=='undefined') {\n _.set(data, 'Title', title)\n }\n if(typeof(description)!=='undefined') {\n _.set(data, 'Description', description)\n }\n if(typeof(label)!=='undefined' && this.currentActivityType=='Case') {\n _.set(data, 'LabelText', label)\n }\n \n var endpoint = ''\n switch(this.currentActivityType) {\n case 'Case':\n endpoint = 'Pll/CaseRelDocs/Update'\n _.set(data, 'CaRelDocId', attachment_id)\n break;\n case 'Inspection':\n endpoint = 'Ams/Attachments/UpdateInspectionAttachment'\n _.set(data, 'AttachmentId', attachment_id)\n break;\n case 'Request':\n endpoint = 'Ams/Attachments/UpdateRequestAttachment'\n _.set(data, 'AttachmentId', attachment_id)\n break;\n case 'WorkOrder':\n endpoint = 'Ams/Attachments/UpdateWorkOrderAttachment'\n _.set(data, 'AttachmentId', attachment_id)\n break;\n default:\n reject(new CWError(132, 'Unknown current activity type or activity type not set.', {'provided': this.currentActivityType}))\n }\n this.cw.runRequest(endpoint, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete inspection attachments\n *\n * @category Inspection Attachments\n * @param {Array<number>|number} attachmentIds - An array of attachment IDs or a single attachment ID to delete.\n * @return {Object} Returns object that represents a boolean for action resolution\n */\n delete(attachmentIds: Array<number>|number) {\n return new Promise((resolve, reject) => {\n var data = {}\n var endpoint = ''\n if(typeof(attachmentIds)=='number') {\n attachmentIds = [attachmentIds]\n }\n\n switch(this.currentActivityType) {\n case 'Case':\n _.set(data, 'CaRelDocId', attachmentIds[0])\n endpoint = 'Pll/CaseRelDocs/Delete'\n break;\n case 'Inspection':\n _.set(data, 'AttachmentIds', attachmentIds)\n endpoint = 'Ams/Attachments/DeleteInspectionAttachments'\n break;\n case 'Request':\n _.set(data, 'AttachmentIds', attachmentIds)\n endpoint = 'Ams/Attachments/DeleteRequestAttachments'\n break;\n case 'WorkOrder':\n _.set(data, 'AttachmentIds', attachmentIds)\n endpoint = 'Ams/Attachments/DeleteWorkOrderAttachments'\n break;\n default:\n reject(new CWError(132, 'Unknown current activity type or activity type not set.', {'provided': this.currentActivityType}))\n }\n this.cw.runRequest(endpoint, data).then(r => {\n resolve(r)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get attachment URLs in array\n *\n * @category Attachments\n * @return {Object} Returns array of attachment URLs\n */\n static downloadUrls() {\n return ['Pll/CaseRelDocs/DownloadCaRelDocs', 'Ams/Attachments/DownloadInspectionAttachment', 'Ams/Attachments/DownloadRequestAttachment', 'Ams/Attachments/DownloadWorkOrderAttachment']\n }\n\n /**\n * Download an attachment\n *\n * @category Attachments\n * @param {number} attachmentId - ID of an attachment to download\n * @return {Object} Returns object that represents a file stream\n */\n download(attachmentId: number) {\n return new Promise((resolve, reject) => {\n var data = {}\n var endpoint = ''\n\n switch(this.currentActivityType) {\n case 'Case':\n _.set(data, 'CaRelDocsId', attachmentId)\n endpoint = 'Pll/CaseRelDocs/DownloadCaRelDocs'\n break;\n case 'Inspection':\n _.set(data, 'AttachmentId', attachmentId)\n endpoint = 'Ams/Attachments/DownloadInspectionAttachment'\n break;\n case 'Request':\n _.set(data, 'AttachmentId', attachmentId)\n endpoint = 'Ams/Attachments/DownloadRequestAttachment'\n break;\n case 'WorkOrder':\n _.set(data, 'AttachmentId', attachmentId)\n endpoint = 'Ams/Attachments/DownloadWorkOrderAttachment'\n break;\n default:\n reject(new CWError(132, 'Unknown current activity type or activity type not set.', {'provided': this.currentActivityType}))\n }\n this.cw.runRequest(endpoint, data).then(r => {\n resolve(r)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get attachment by ID (not implemented)\n *\n * @category Attachments\n * @param {number} attachmentId - An attachment ID to get info for\n * @return {Object} Returns object that represents an object that describes the matched inspection attachment\n */\n getById(attachmentId: number) {\n return new Promise((resolve, reject) => {\n var data = {}\n var endpoint = ''\n\n switch(this.currentActivityType) {\n case 'Case':\n // _.set(data, 'CaRelDocId', attachmentId)\n // endpoint = 'Pll/CaseRelDocs/ById'\n reject(new CWError(133, 'Get CaRelDoc by RelDocId not documented or found'))\n break;\n case 'Inspection':\n _.set(data, 'AttachmentId', attachmentId)\n endpoint = 'Ams/Attachments/InspectionAttachmentById'\n break;\n case 'Request':\n _.set(data, 'AttachmentId', attachmentId)\n endpoint = 'Ams/Attachments/RequestAttachmentById'\n break;\n case 'WorkOrder':\n _.set(data, 'AttachmentId', attachmentId)\n endpoint = 'Ams/Attachments/WorkOrderAttachmentById'\n break;\n default:\n reject(new CWError(132, 'Unknown current activity type or activity type not set.', {'provided': this.currentActivityType}))\n }\n this.cw.runRequest(endpoint, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get attachments related to Inspection, WorkOrder, or Request\n *\n * @category Attachments\n * @param {Array<number>|number} ids - An array of IDs or a single ID (inspectionIds, WorkOrderSids, WorkOrderIds, or RequestIds) for which to get attachments. Only one node (Inspection, WorkOrder, Request, or Case) type at a time. Don't mix-and-match WorkOrderIds with WorkOrderSids.\n * @return {Object} Returns Promise that represents a collection of attachments from the matched inspections, service requests, or work orders\n */\n getAttachments(ids: Array<number>|number) {\n return this.getByNodesId(ids)\n }\n\n /**\n * Get Related Documents from Case\n *\n * @category Attachments\n * @param {number} id - An array of CaseIDs or a single CaseID for which to get related documents.\n * @return {Object} Returns Promise that represents a collection of related documents from the matched cases\n */\n getRelatedDocs(id: number) {\n return this.getByNodesId(id)\n }\n \n /**\n * Get attachment by node (Inspection, WorkOrder, Request, or Case) IDs\n *\n * @category Attachments\n * @param {Array<number>|number} ids - An array of IDs or a single ID (inspectionIds, WorkOrderSids, WorkOrderIds, RequestIds, or CaseIds) to get attachments for. Only one node (Inspection, WorkOrder, Request, or Case) type at a time. Don't mix-and-match WorkOrderIds with WorkOrderSids.\n * @return {Object} Returns Promise that represents a collection of attachments from the matched inspections\n */\n getByNodesId(ids: Array<number>|number) {\n return new Promise((resolve, reject) => {\n var data = {}\n var endpoint = ''\n if(typeof(ids)=='number' && this.currentActivityType!='Case') {\n ids = [ids]\n }\n\n switch(this.currentActivityType) {\n case 'Case':\n _.set(data, 'CaObjectId', ids)\n endpoint = 'Pll/CaseRelDocs/ByCaObjectId'\n break;\n case 'Inspection':\n _.set(data, 'InspectionIds', ids)\n endpoint = 'Ams/Attachments/InspectionAttachments'\n break;\n case 'Request':\n _.set(data, 'RequestIds', ids)\n endpoint = 'Ams/Attachments/RequestAttachments'\n break;\n case 'WorkOrder':\n if(typeof(ids[0])=='string') {\n _.set(data, 'WorkOrderIds', ids)\n } else {\n _.set(data, 'WorkOrderSids', ids)\n }\n endpoint = 'Ams/Attachments/WorkOrderAttachments'\n break;\n default:\n reject(new CWError(132, 'Unknown current activity type or activity type not set.', {'provided': this.currentActivityType}))\n }\n this.cw.runRequest(endpoint, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Tags available with which to tag attachments\n *\n * @category Attachments\n * @return {Object} Returns Promise that represents a collection of tags that can be added to attachments\n */\n getTags() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/AttachmentTags/GetAll', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n private syncTags(attachmentId: number, tags: {tagid: number, tagtext: string}[]) {\n return new Promise((resolve, reject) => {\n var data = {}\n switch(this.currentActivityType) {\n case 'Case':\n this.cw.runRequest('Pll/AttachmentActivityTags/SyncTags', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n private async loopSyncTags(attachmentId: number, tags: {tagid: number, tagtext: string}[], callback: Function) {\n this.syncTags(attachmentId, tags).then(r => {\n callback(r)\n })\n }\n\n /**\n * Set Tags on an attachment\n *\n * @category Attachments\n * @return {Object} Returns Promise that represents a collection of tags that can be added to attachments\n */\n setTags(attachmentId: number, tags: {tagid: number, tagtext: string}[], activityType: string) {\n return new Promise((resolve, reject) => {\n this.syncTags(attachmentId, tags).then(r => {\n resolve(r)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Set Tags on an many attachments\n *\n * @category Attachments\n * @param {Array<number>|number} attachmentIds - An array of attachment IDs to add tags to.\n * @param {Array<{tagid: number, tagtext: string}>} tags - An array of tag objects to add to the attachments\n * @param {string} activityType - The type of activity to which the attachments belong\n * @return {Object} Returns Promise that represents a collection of documents which have had their tags set\n */\n setTagsOnMany(attachmentIds: number[], tags: {tagid: number, tagtext: string}[]) {\n return new Promise((resolve, reject) => {\n var returnData:Array<any> = []\n attachmentIds.forEach((attachmentId) => {\n this.loopSyncTags(attachmentId, tags, (r:any) => {\n returnData.push(r)\n })\n })\n resolve(returnData)\n })\n }\n\n /**\n * Get Doc labels for a case template\n *\n * @category Attachments\n * @param {number} busCaseId - The ID of the Business Case to get Document Labels for\n * @return {Object} Returns Promise that represents a collection of tags that can be added to attachments\n */\n getDocLabels(busCaseId: number) {\n return new Promise((resolve, reject) => {\n // check that parent is Case?\n var data = {\"BusCaseId\": busCaseId}\n switch(this.currentActivityType) {\n case 'Case':\n this.cw.runRequest('Pll/BusCaseDocLabel/GetByBusCaseId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n break;\n default:\n resolve([])\n }\n })\n } \n}\n","import { CWError } from './error'\nimport ReversibleMap from 'reversible-map'\n\n/**\n * ActivityLink interface for ActivityLinks\n *\n */\nexport interface ActivityLink {\n linkTypes: ReversibleMap<string, number>\n activityTypes: ReversibleMap<string, number>\n cw: any\n}\n\n/**\n * ActivityLinks implements the activity link functions via using the ActivityLink interface\n *\n */\nexport class ActivityLinks implements ActivityLink {\n /**\n * Activity types to map string to number for internal use. Activity types available are: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n */\n activityTypes: ReversibleMap<string, number>\n /**\n * Link types to map string to number for internal use. Link types available are: \"null\", \"parent\", \"related\"\n */\n linkTypes: ReversibleMap<string, number>\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.activityTypes = new ReversibleMap<string, number>()\n this.linkTypes = new ReversibleMap<string, number>()\n\n this.setActivityTypes();\n this.setLinkTypes();\n }\n\n private setActivityTypes(): void {\n const activityTypeMappings = ['null', 'case', 'inspection', 'request', 'workorder', 'wipcase'];\n\n activityTypeMappings.forEach((type, index) => {\n this.activityTypes.set(type, index);\n })\n }\n\n private setLinkTypes(): void {\n const linkTypeMappings = ['null', 'parent', 'related'];\n\n linkTypeMappings.forEach((type, index) => {\n this.linkTypes.set(type, index);\n });\n }\n\n private validateType(type: string, validTypes: ReversibleMap<string, number>, errorCode: number): void {\n if (!validTypes.has(type)) {\n throw new CWError(errorCode, `Activity type \"${type}\" not found.`, { provided: type, options: validTypes });\n }\n }\n\n private transformLinksData(response: any) {\n return response.Value.map(link => ({\n DestType: this.activityTypes.get(link.DestType),\n SourceType: this.activityTypes.get(link.SourceType),\n LinkType: this.linkTypes.get(link.LinkType),\n ...link,\n }));\n }\n\n private runRequest(path: string, data: any) {\n return this.cw.runRequest(path, data);\n }\n\n /**\n * Create a new activity link between two items.\n *\n * @param {string} source_type - Source type as string. Options: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n * @param {number} source_sid - Source SID (numeric ID) one wishes to remove a link between SID as source and a particular destination\n * @param {string} destination_type - Destination type as string: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n * @param {number} destination_sid - Destination SID (numeric ID) one wishes to remove a link between SID as destination and a particular source\n * @param {string} link_type - The type of link which exists between provided source and destination. Defaults to `related`. Options: \"null\", \"parent\", \"related\"\n * @return {Object} Returns Promise object that represents a\n */\n add(source_type: string, source_sid: number, destination_type: string, destination_sid: number, link_type: string = 'related') {\n return new Promise((resolve, reject) => {\n this.validateType(source_type, this.activityTypes, 1);\n this.validateType(destination_type, this.activityTypes, 2);\n this.validateType(link_type, this.linkTypes, 3);\n\n\n let data = {\n SourceType: this.activityTypes.get(source_type),\n SourceSid: source_sid,\n DestType: this.activityTypes.get(destination_type),\n DestSid: destination_sid,\n LinkType: this.linkTypes.get(link_type)\n }\n let path = 'General/ActivityLink/Add';\n\n this.runRequest(path, data)\n .then((response: any) => resolve(response.Value))\n .catch(reject);\n })\n }\n\n /**\n * Get the links for a particular node type by ID.\n *\n * @param {string} type - Source type as string. Options: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n * @param {Array<number>} sids - Array of numeric (S)IDs you wish to get of the specified type\n * @return {Object} Returns Promise object that represents a collection\n */\n get(type: string, sids: Array<number>) {\n return new Promise((resolve, reject) => {\n this.validateType(type, this.activityTypes, 4);\n\n let data = {\n ActivityType: this.activityTypes.get(type),\n ActivitySids: sids\n };\n // let _this = this\n let path = 'General/ActivityLink/ByActivitySids';\n\n this.runRequest(path, data)\n .then((response: any) => resolve(this.transformLinksData(response)))\n .catch(reject);\n });\n }\n\n /**\n * Clone a current activity link.\n *\n * @param {string} source_type - Source type as string. Options: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n * @param {number} source_sid - Source SID (numeric ID) one wishes to clone a link between SID as source and a particular destination\n * @param {string} destination_type - Destination type as string: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n * @param {number} destination_sid - Destination SID (numeric ID) one wishes to clone a link between SID as destination and a particular source\n * @return {Object} Returns Promise object that represents a\n */\n clone(source_type: string, source_sid: number, destination_type: string, destination_sid: number) {\n return new Promise((resolve, reject) => {\n this.validateType(source_type, this.activityTypes, 5);\n this.validateType(destination_type, this.activityTypes, 6);\n\n let data = {\n SourceActivityType: this.activityTypes.get(source_type),\n SourceActivitySid: source_sid,\n DestinationActivityType: this.activityTypes.get(destination_type),\n DestinationActivitySid: destination_sid\n }\n let path = 'General/ActivityLink/CloneByActivitySid';\n\n this.runRequest(path, data)\n .then((response: any) => resolve(response.Value))\n .catch(reject)\n })\n }\n\n /**\n * Delete an activity link by ID\n *\n * @param {number} activity_link_id - The ID of the activity link one wishes to delete\n * @return {Object} Returns Promise object that represents a\n */\n delete(activity_link_id: number) {\n return new Promise((resolve, reject) => {\n let data = {\n ActivityLinkId: activity_link_id\n }\n let path = 'General/ActivityLink/Delete'\n\n this.runRequest(path, data)\n .then((response: any) => resolve(response))\n .catch(reject(false))\n })\n }\n\n /**\n * Remove a link by specifying everything.\n *\n * @param {string} source_type - Source type as string. Options: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n * @param {number} source_sid - Source SID (numeric ID) one wishes to remove a link between SID as source and a particular destination\n * @param {string} destination_type - Destination type as string: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n * @param {number} destination_sid - Destination SID (numeric ID) one wishes to remove a link between SID as destination and a particular source\n * @param {string} link_type - The type of link which exists between provided source and destination. Defaults to `related`. Options: \"null\", \"parent\", \"related\"\n * @return {Object} Returns Promise object that represents a\n */\n remove(source_type: string, source_sid: number, destination_type: string, destination_sid: number, link_type: string = 'related') {\n return new Promise((resolve, reject) => {\n this.validateType(source_type, this.activityTypes, 8);\n this.validateType(destination_type, this.activityTypes, 9);\n this.validateType(link_type, this.linkTypes, 10);\n\n let data = {\n SourceType: this.activityTypes.get(source_type),\n SourceSid: source_sid,\n DestType: this.activityTypes.get(destination_type),\n DestSid: destination_sid,\n LinkType: this.linkTypes.get(link_type)\n }\n let path = 'General/ActivityLink/Remove';\n\n this.runRequest(path, data)\n .then((response: any) => resolve(response))\n .catch(reject(false))\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class Gis {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Get gis service configuration for user, group, domain, or service id\n *\n * @param {string} [whichType] - domain, group, mapservice, or user\n * @param {number} [whichId] - domain, group, mapservice, or user Id\n * @param {number} [getGisData] - If true, check for feature server JSON data, default is true\n * @param {Array<string>} [context] Filter returned list by specific context, i.e. Office, Field, Mobile, Public, etc. Default is all.\n * @return {Object} Returns Promise object that represents an Object with the desired GIS service definitions\n */\n getConfig(whichType, whichId, getGisData: boolean = true, context: Array<string> = []) {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/Domain'\n whichType = whichType.toLowerCase()\n let data: {DomainId?: any, GroupId?: any, MapServiceId?: any, UserId?: any, GetGisData: boolean, Security: Array<string>}\n switch(whichType) {\n case 'domain':\n data = {DomainId:whichId, GetGisData: getGisData, Security: context}\n break\n case 'group':\n data = {GroupId:whichId, GetGisData: getGisData, Security: context}\n break\n case 'mapservice':\n data = {MapServiceId:whichId, GetGisData: getGisData, Security: context}\n break\n case 'user':\n data = {UserId:whichId, GetGisData: getGisData, Security: context}\n break\n }\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get domain gis services\n *\n * @param {number} domainId - The mobile map cache Id to download\n * @return {Object} Returns Promise object that represents an Object with the domain's default GIS services\n */\n domain(domainId, getGisData: boolean = true) {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/Domain'\n let data = {\n DomainId: domainId\n }\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Download mobile map cache\n *\n * @param {number} cacheId - The mobile map cache Id to download\n * @return {Object} Returns Promise object that represents a streaming download (?)\n */\n downloadMobile(cacheId, getGisData: boolean = true) {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/DownloadMobileMapCache'\n let data = {\n MobileMapCacheId: cacheId\n }\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get initial extent for user\n *\n * @return {Object} Returns Promise object that represents ... (?)\n */\n initialExtent() {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/InitialExtent'\n let data = {};\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get service request gis services\n *\n * @param {number} requestId - The WorkOrder to check against.\n * @param {boolean} getGisData - If true, check for feature server JSON data, default is true.\n * @return {Object} Returns Promise object that represents an Object with the specified request's entit(y|ies)\n */\n request(requestId, getGisData: boolean = true) {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/ServiceRequestConfiguration'\n let data = {\n RequestId: requestId,\n GetGisData: getGisData\n }\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspection gis services\n *\n * @param {number} inspectionId - The WorkOrder to check against.\n * @param {boolean} getGisData - If true, check for feature server JSON data, default is true.\n * @return {Object} Returns Promise object that represents an Object with the specified inspection's entity\n */\n inspection(inspectionId, getGisData: boolean = true) {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/InspectionConfiguration'\n let data = {\n InspectionId: inspectionId,\n GetGisData: getGisData\n }\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get workorder gis services\n *\n * @param {number} workOrderSid - The WorkOrder to check against.\n * @param {boolean} getGisData - If true, check for feature server JSON data, default is true.\n * @return {Object} Returns Promise object that represents an Object with the specified WorkOrder's entit(y|ies)\n */\n workOrder(workOrderSid, getGisData: boolean = true) {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/WorkOrderConfiguration'\n let data = {\n WorkOrderSid: workOrderSid,\n GetGisData: getGisData\n }\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get service request gis services\n *\n * @param {Array<string>} [context] Filter returned list by specific context, i.e. Office, Field, Mobile, Public, etc. Default is all.\n * @param {boolean} [allDomains] services assigned to any domain the user belongs to, default is true\n * @param {boolean} [allGroups] services assigned to any groups the user belongs to regardless of domain, default is true\n * @param {boolean} [getGisData] If true, check for feature server JSON data, default is true\n * @return {Object} Returns Promise object that represents an Object with the user's GIS services\n */\n user(context: Array<string> = [], allDomains: boolean = true, allGroups: boolean = true, getGisData: boolean = true) {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/User'\n let data = {\n AllDomains: allDomains,\n AllGroups: allGroups,\n GetGisData: getGisData,\n Security: context\n }\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Geocode server info by ServerId\n *\n * @param {number} ServiceId\n * @return {Object} Returns Promise object that represents an object describing the provided Geocoder service configuration\n */\n // Gis/GeoCode/GeocodeServer\n\n /**\n * Get currently selected entities from the Cityworks install's session for your user\n * @return {Object} Returns Promise object that represents an Object with the currently-selected entities\n */\n selectedEntities() {\n return new Promise((resolve, reject) => {\n let path = 'General/AppData/SelectedEntities'\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get attributes available for provided entity\n *\n * @param {string} entityType - The entity type to describe\n * @return {Object} Returns Promise object that represents a collection of attribute description objects\n */\n getEntityAttributes(entityType:string) {\n return new Promise((resolve, reject) => {\n let data = {EntityType: entityType}\n let path = 'AMS/Entity/Attributes'\n this.cw.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class MessageQueue {\n /**\n * @hidden\n */\n cw: any\n /**\n * Statuses -\n * Pending: 0,\n * Processing: 1,\n * Complete: 2,\n * Failed: 3\n */\n status: Object = {\n Pending: 0,\n Processing: 1,\n Complete: 2,\n Failed: 3\n }\n /**\n * Hook Types -\n * Unknown: 0,\n * ActivityUpdate: 1,\n * Email: 2,\n * WebHook: 3\n */\n hook_types: Object = {\n Unknown: 0,\n ActivityUpdate: 1,\n Email: 2,\n WebHook: 3\n }\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Process Webhook MessageQueue records by MessageQueueId\n *\n * @param {Array<number>} [ids] - List of MessageQueueId values\n * @param {boolean} [delete_successful] - automatically delete messages that complete with successful execution, default is false\n * @return {Array<>} Returns Promise object that represents a collection of QueueMessages which have been processed\n */\n processMessages(ids: Array<number>, delete_successful: boolean = false) {\n return new Promise((resolve, reject) => {\n let data = { Ids: ids, Delete: delete_successful}\n let path = 'General/WebHookEvent/ProcessMessages'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Messages specified in list of MessageQueueIds\n *\n * @param {Array<number>} ids - List of MessageQueueId values\n * @param {string} status -\n * @param {number} [maxcount] - Maximum number returned. Defaults to 15\n * @return {Array<>} Returns Promise object that represents a collection of QueueMessages which have been processed\n */\n get(ids: Array<number>, status: string, maxcount: number = 15) {\n return new Promise((resolve, reject) => {\n if(typeof(this.status[status])=='undefined') {\n reject(new CWError(1, 'Status provided does not exist or is mispelled.', {'provided': status, 'available':this.status}))\n }\n let data = {\n \"Ids\": ids,\n \"MaxCount\": typeof(maxcount)!='undefined' ? maxcount : 15,\n \"Status\": this.status[status]\n }\n let path = 'General/MessageQueue/ByIds'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Messages specified in list of MessageQueueIds\n *\n * @param {Array<number>} ids - List of MessageQueueId values\n * @param {string} status - automatically delete messages that complete with successful execution, default is false\n * @param {number} [hours_to_keep] - utomatically delete messages that complete with successful execution, default is false\n * @return {Array<>} Returns Promise object that represents a collection of QueueMessages which have been processed\n */\n delete(ids: Array<number>, status: string, hours_to_keep?: number) {\n return new Promise((resolve, reject) => {\n if(typeof(this.status[status])=='undefined') {\n reject(new CWError(2, 'Status provided does not exist or is mispelled.', {'provided': status, 'available':this.status}))\n }\n let data = {\n \"Ids\": ids,\n \"Status\": this.status[status],\n \"HoursToKeep\": hours_to_keep\n }\n let path = 'General/MessageQueue/Delete'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n // PreferencesList<GlobalPreference>\n // Base response type: CoreResponseBase\n // Get a list of message queue preferences\n // This method has no parameters\n preferences() {\n return new Promise((resolve, reject) => {\n let data = {}\n let path = 'General/MessageQueue/Preferences'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n search(parameters, max_results?: number) {\n let data: any\n return new Promise((resolve, reject) => {\n if(typeof(parameters.status)!=='undefined' && typeof(this.status[parameters.status])=='undefined') {\n reject(new CWError(3, 'Status provided does not exist or is mispelled.', {'provided': parameters.status, 'available':this.status}))\n } else if(typeof(parameters.status)!=='undefined' && typeof(this.status[parameters.status])!=='undefined') {\n data.Status = this.status[parameters.status]\n }\n if(typeof(max_results)!=='undefined') {\n data.MaxResults = max_results\n }\n let allowed_params = ['Id', 'HookId', 'HookType', 'Result', 'DateCreatedBegin', 'DateCreatedEnd', 'DateUpdatedBegin', 'DateUpdatedEnd']\n let disallowed_params = ['Status', 'MaxResults']\n _.forEach(parameters, (v, k) => {\n if(_.indexOf(allowed_params,k)!=-1 && _.indexOf(disallowed_params, k)==-1) {\n data[k] = v\n } else if(_.indexOf(disallowed_params, k)==-1) {\n reject(new CWError(4, 'Provided parameter does not exist or is mispelled.', {'provided': k, 'value': v, 'available':_.concat(allowed_params, disallowed_params)}))\n }\n })\n let path = 'General/MessageQueue/Search'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n if(typeof(response.Value)=='undefined') {\n response.Value = []\n }\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update queue message\n *\n * @param {Object} parameters - Provide allowed parameters:\n *\n * {\n * HookId: number,\n * Id: number,\n * Packet: string,\n * Result: string,\n * Status: string, // Available options: Pending, Processing, Complete, Failed\n * HookType: string // Available options: Unknown, ActivityUpdate, Email, WebHook\n * }\n *\n * @return {Object} Returns Promise object that represents an Object with the desired GIS service definitions\n */\n update(parameters: any) {\n let data: any\n return new Promise((resolve, reject) => {\n if(typeof(parameters.status)!=='undefined' && typeof(this.status[parameters.status])=='undefined') {\n reject(new CWError(3, 'Status provided does not exist or is mispelled.', {'provided': parameters.status, 'available':this.status}))\n } else if(typeof(parameters.status)!=='undefined' && typeof(this.status[parameters.status])!=='undefined') {\n data.Status = this.status[parameters.status]\n }\n if(typeof(parameters.hook_types)!=='undefined' && typeof(this.hook_types[parameters.hook_types])=='undefined') {\n reject(new CWError(3, 'Status provided does not exist or is mispelled.', {'provided': parameters.hook_types, 'available':this.hook_types}))\n } else if(typeof(parameters.hook_types)!=='undefined' && typeof(this.hook_types[parameters.hook_types])!=='undefined') {\n data.HookType = this.hook_types[parameters.hook_types]\n }\n let allowed_params = ['Id', 'HookId', 'Packet', 'Result']\n let disallowed_params = ['Status', 'HookType']\n _.forEach(parameters, (v, k) => {\n if(_.indexOf(allowed_params,k)!=-1 && _.indexOf(disallowed_params, k)==-1) {\n data[k] = v\n } else if(_.indexOf(disallowed_params, k)==-1) {\n reject(new CWError(5, 'Provided parameter does not exist or is mispelled.', {'provided': k, 'value': v, 'available':_.concat(allowed_params, disallowed_params)}))\n }\n })\n\n let path = 'General/MessageQueue/Update'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n if(typeof(response.Value)=='undefined') {\n response.Value = []\n }\n resolve(response.Value)\n })\n })\n }\n\n updateMessageStatus(ids: number[], status: string, hours_to_keep?: number) {\n return new Promise((resolve, reject) => {\n if(typeof(this.status[status])=='undefined') {\n reject(new CWError(2, 'Status provided does not exist or is mispelled.', {'provided': status, 'available':this.status}))\n }\n let data = {\n \"Ids\": ids,\n \"Status\": this.status[status],\n \"HoursToKeep\": hours_to_keep\n }\n let path = 'General/MessageQueue/UpdateMessageStatus'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n })\n })\n }\n\n getWebooks(hook_ids) {\n return new Promise((resolve, reject) => {\n let data = {\n \"HookIds\": hook_ids\n }\n let path = 'General/MessageQueue/WebHooks'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class Search {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Search Types: Null, Request, WorkOrder, Inspection, Contract, Permit, GIS, PermitTask, PermitAddress, InspCommon, Case, WorkOrderEntity, StoreTransaction, Requisition, Material, WorkActivity, MaterialLeaf, WoTemplate, Unknown, Employee, MessageQueue, Analytics, TokenState, AssetCalculationResult, Equipment, CustomerAccount, InspTemplate, ProblemLeaf, AssetSplitRecord, PavementInsp, TvInspection, Projects\n */\n searchTypes: Object = {\n \"Null\": 0,\n \"Request\": 1,\n \"WorkOrder\": 2,\n \"Inspection\": 3,\n \"Contract\": 4,\n \"Permit\": 5,\n \"GIS\": 6,\n \"PermitTask\": 7,\n \"PermitAddress\": 8,\n \"InspCommon\": 9,\n \"Case\": 10,\n \"WorkOrderEntity\": 11,\n \"StoreTransaction\": 12,\n \"Requisition\": 13,\n \"Material\": 14,\n \"WorkActivity\": 15,\n \"MaterialLeaf\": 16,\n \"WoTemplate\": 17,\n \"Unknown\": 18,\n \"Employee\": 19,\n \"MessageQueue\": 20,\n \"Analytics\": 21,\n \"TokenState\": 22,\n \"AssetCalculationResult\": 23,\n \"Equipment\": 24,\n \"CustomerAccount\": 25,\n \"InspTemplate\": 26,\n \"ProblemLeaf\": 27,\n \"AssetSplitRecord\": 28,\n \"PavementInsp\": 29,\n \"TvInspection\": 30,\n \"Projects\": 31\n }\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Do a \"quick\" search for an ID or Case Number\n *\n * @category Quick Search\n * @param {string} text - text to search the system for\n * @return {Object} Returns Promise object that represents a collection of the currently authenticated user's notifications\n */\n quick(text: string) {\n return new Promise((resolve, reject) => {\n let data = {\n \"QuickSearchText\": text,\n }\n this.cw.runRequest('General/QuickSearch/QuickSearch', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Execute a saved search\n *\n * @category Search\n * @param {number} searchId - SearchId to execute\n * @param {Object} options - Other options. See: /{subdirectory}/apidocs/#/service-info/Ams/Search\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n execute(searchId: number, options?: {EmployeeSid?: number, ExcludeEmptyXY?: boolean, Extent?: Object, Frequency?: boolean, IdsOnly?: boolean, IncludeSearchOrder?: boolean, MaxResults?: number, ResultFields?: Array<string>, TotalOnly?: boolean}) {\n return new Promise((resolve, reject) => {\n var data = {\n SearchId: searchId\n }\n data = _.merge(data, options)\n this.cw.runRequest('Ams/Search/Execute', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of the saved searches by search type and specific entity types OR employeeSid/domainId. You cannot search for saved searches by both specific entity type AND employeeSid/domainId.\n *\n * @category Search\n * @param {string} searchType - Get the saved searches for a particular type\n * @param {Array<string>} [applyToEntities] - Restrict GIS searches to specified entity types\n * @param {number} [employeeSid] - The employee SID to retrieve the searches as\n * @param {number} [domainId] - The domain ID of the domain to search\n * @return {Object} Returns Promise object that represents a collection of SearchDefinitionName\n */\n getSaved(searchType: string, applyToEntities?: Array<string>, employeeSid?: number, domainId?: number) {\n return new Promise((resolve, reject) => {\n if(!_.has(this.searchTypes, searchType)) {\n reject(new CWError(2, 'SearchType provided does not exist or is mispelled.', {'provided': searchType, 'available':this.searchTypes}))\n } else if(typeof(applyToEntities)!='undefined' && applyToEntities!=null && applyToEntities.length>0 && (typeof(employeeSid)!='undefined' || typeof(domainId)!='undefined')) {\n reject(new CWError(3, 'You cannot specify both applyToEntities AND employeeSid/domainId'))\n }\n var data = {}\n var savedEndpoint = ''\n if(typeof(employeeSid)!='undefined' || typeof(domainId)!='undefined') {\n savedEndpoint = 'SavedByType'\n if(typeof(employeeSid)!='undefined' && employeeSid!=null) {\n _.set(data, 'EmployeeSid', employeeSid)\n }\n if(typeof(domainId)!='undefined' && domainId!=null) {\n _.set(data, 'DomainId', domainId)\n }\n } else {\n if(searchType=='Case') {\n savedEndpoint = 'PllSavedSaved'\n } else {\n savedEndpoint = searchType + 'Saved'\n }\n if(typeof(applyToEntities)!='undefined' && applyToEntities!=null) {\n _.set(data, 'ApplyToEntities', applyToEntities)\n }\n }\n this.cw.runRequest('Ams/Search/'+savedEndpoint, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list display fields for a Search Type\n *\n * @category Search Options\n * @param {string} searchType - Restrict GIS searches to specified entity types\n * @return {Object} Returns Promise object that represents a collection of SearchDisplayFields\n */\n displayFields(searchType: string) {\n return new Promise((resolve, reject) => {\n if(!_.has(this.searchTypes, searchType)) {\n reject(new CWError(1, 'SearchType provided does not exist or is mispelled.', {'provided': searchType, 'available':this.searchTypes}))\n }\n var data = {\n searchType: _.get(this.searchTypes, searchType)\n }\n this.cw.runRequest('Ams/Search/DisplayFields', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list search types\n *\n * @category Search Options\n * @return {Object} Returns Promise object that represents a collection of SearchTypeInfo objects\n */\n types() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Ams/Search/Types', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Enable Service URLs on Saved Searches\n *\n * @category Search Options\n * @param {Array<number>} searchIds - Search IDs to enable eURL on\n * @return {Object} Returns Promise object that represents a dictionary of SearchIds and EURL booleans\n */\n enableServices(searchIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n Enable: true,\n SearchIds: searchIds\n }\n this.cw.runRequest('Ams/Search/UpdateEurl', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Disable Service URLs on Saved Searches\n *\n * @category Search Options\n * @param {Array<number>} searchIds - Search IDs to enable eURL on\n * @return {Object} Returns Promise object that represents a dictionary of SearchIds and EURL booleans\n */\n disableServices(searchIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n Enable: false,\n SearchIds: searchIds\n }\n this.cw.runRequest('Ams/Search/UpdateEurl', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a search definition\n *\n * @category Search Definitions\n * @param {number} searchId - SearchId to get.\n * @param {number} employeeSid - Enforces employee security settings on search definition if provided.\n * @return {Object} Returns Promise object that represents a SearchDefinition object\n */\n getDefinition(searchId: number, employeeSid?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n SearchId: searchId\n }\n if(typeof(employeeSid)!='undefined') {\n _.set(data, 'EmployeeSid', employeeSid)\n }\n this.cw.runRequest('Ams/Search/Definition', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get search definitions\n *\n * @category Search Definitions\n * @param {Array<number>} searchIds - SearchIds to get.\n * @param {number} employeeSid - Enforces employee security settings on search definition if provided.\n * @return {Object} Returns Promise object that represents a collection of SearchDefinition objects\n */\n getDefinitions(searchIds: Array<number>, employeeSid?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n SearchIds: searchIds\n }\n if(typeof(employeeSid)!='undefined') {\n _.set(data, 'EmployeeSid', employeeSid)\n }\n this.cw.runRequest('Ams/Search/Definitions', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get search definition names\n *\n * @category Search Definitions\n * @param {Array<number>} searchIds - SearchIds to get.\n * @return {Object} Returns Promise object that represents a collection of SearchDefinitionNames\n */\n getDefinitionNames(searchIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n SearchIds: searchIds\n }\n this.cw.runRequest('Ams/Search/DefinitionNames', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete search definitions\n *\n * @category Search Definitions\n * @param {Array<number>} searchIds - SearchIds to get.\n * @return {Object} Returns Promise object that represents a list (dictionary) of search IDs and deletion success boolean\n */\n deleteDefinitions(searchIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n SearchIds: searchIds\n }\n this.cw.runRequest('Ams/Search/DeleteDefinitions', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Save a search definition\n *\n * @category Search Definitions\n * @param {string} searchFor - Name of type to search for from searchTypes\n * @param {Object} options - Other options. See: /{subdirectory}/apidocs/#/service-info/Ams/Search\n * @param {number} searchId - SearchId to update. Defaults to \"0\" which is \"Create new saved search\"\n * @return {Object} Returns Promise object that represents a SearchDefinitionName object\n */\n saveDefinition(searchFor: string, options?: Object, searchId: number = 0) {\n return new Promise((resolve, reject) => {\n if(!_.has(this.searchTypes, searchFor)) {\n reject(new CWError(1, 'SearchType provided does not exist or is mispelled.', {'provided': searchFor, 'available':this.searchTypes}))\n }\n var data = {\n SearchFor: _.get(this.searchTypes, searchFor),\n SearchId: searchId\n }\n data = _.merge(data, options)\n this.cw.runRequest('Ams/Search/SaveDefinition', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Convert a search definition to a query\n *\n * @category Search Definitions\n * @param {Array<number>} searchIds - searchIds to convert\n * @param {boolean} saveQuery - Automatically save a query which converts with no errors, default is false\n * @param {boolean} allowMultipleBooleanValues - Use all values for boolean fields even though a boolean should only have one value, default is false and will only use the first boolean value\n * @param {boolean} allowEmptyQuery - Create default filter when no filter is found, default is false\n * @return {Object} Returns Promise object that represents a SearchToQueryResult list\n */\n convertToQuery(searchIds: Array<number>, saveQuery: boolean = false, addEurl: boolean = false, allowMultipleBooleanValues: boolean = false, allowEmptyQuery: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n \"SearchIds\": searchIds,\n \"SaveQuery\": saveQuery,\n \"AddEurl\": addEurl,\n \"AllowMultipleBooleanValues\": allowMultipleBooleanValues,\n \"AllowEmptyQuery\": allowEmptyQuery\n }\n this.cw.runRequest('General/Query/SearchToQuery', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\n\ninterface DynamicVariableMap {\n [key: string]: any\n}\n\ninterface DynamicResponseDefinition {\n [key: string]: any\n}\n\n\nexport class Query {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Build a query using query language syntax or by specifying a saved query ID\n *\n * @category Query\n * @param {number} query - Query to run (specify syntax or queryID)\n * @param {Object} options - Other options. See: /{subdirectory}/apidocs/#/service-info/General/Query\n * @param {number} [domainId] - The domain ID of the domain to search, defaut is authenticated user's current domain\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n build(query: number|string, options: {Page?: number, PageSize?: number, SortDescending?: boolean, SortField?: string, Variables?: DynamicVariableMap} = {}, domainId?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n }\n if(isNaN(+query)) {\n _.set(data, \"QueryValue\", query)\n } else if(!isNaN(+query)) {\n _.set(data, \"QueryId\", query)\n } else {\n // throw error\n }\n data = _.merge(data, options)\n if(typeof(domainId)!=='undefined') {\n _.set(data, \"DomainId\", domainId)\n }\n this.cw.runRequest('General/Query/Builder', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get available query types\n *\n * @category Query\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n getTypes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('General/Query/QueryTypes', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get info about query types\n *\n * @category Query\n * @param {boolean} includeDefaultSchemasInclude - Include schemas (Work Order, Service Request, etc), default is true.\n * @param {boolean} includeGisSchemas - Include gis schemas, ddefault is true.\n * @param {number} [domainId] - The domain ID of the domain to search, defaut is authenticated user's current domain\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n getTypesInfo(includeDefaultSchemasInclude: boolean = true, includeGisSchemas: boolean = true, domainId?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n \"IncludeDefaultSchemasInclude\": includeDefaultSchemasInclude,\n \"IncludeGisSchemas\": includeGisSchemas\n }\n if(typeof(domainId)!=='undefined') {\n _.set(data, \"DomainId\", domainId)\n }\n this.cw.runRequest('General/Query/QueryTypeInformation', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Validate a query string\n *\n * @category Query\n * @param {string} query - The query to validate\n * @param {DynamicVariableMap} variables - Required if the query includes variables\n * @param {number} [domainId] - The domain ID of the domain to search, defaut is authenticated user's current domain\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n validateQuery(query: string, variables: DynamicVariableMap, domainId?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n \"Query\": query,\n \"Variables\": variables\n }\n if(typeof(domainId)!=='undefined') {\n _.set(data, \"DomainId\", domainId)\n }\n this.cw.runRequest('General/Query/ValidateQuery', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n \n /**\n * Validate a query response definition\n *\n * @category Query\n * @param {string} queryType - The query to validate\n * @param {DynamicResponseDefinition} responseDefinition - Required if the query includes variables\n * @param {number} [domainId] - The domain ID of the domain to search, defaut is authenticated user's current domain\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n validateResponseDefinition(queryType: string, responseDefinition: DynamicResponseDefinition, domainId?: number) {\n // TODO: Confirm that the queryType is present in the getTypes() request\n return new Promise((resolve, reject) => {\n var data = {\n \"QueryType\": queryType,\n \"ResponseDefinition\": responseDefinition\n }\n if(typeof(domainId)!=='undefined') {\n _.set(data, \"DomainId\", domainId)\n }\n this.cw.runRequest('General/Query/ValidateResponseDefinition', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get schema for specified query type\n *\n * @category Query\n * @param {string} queryType - Specify Query Type\n * @param {number} [domainId] - The domain ID of the domain to search, defaut is authenticated user's current domain. Used to determine query field configuration for the schema fields.\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n getSchema(queryType: string, domainId?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n \"QueryType\": queryType\n }\n if(typeof(domainId)!=='undefined') {\n _.set(data, \"DomainId\", domainId)\n }\n this.cw.runRequest('General/Query/QuerySchema', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Run a query using query language syntax\n *\n * @category Query\n * @param {number} query - Query syntax string or saved query ID to run. If you want to append addt'l query items to a saved query, add QueryValue in the options\n * @param {Object} options - Other options. See: /{subdirectory}/apidocs/#/service-info/General/Query\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n run(query: string|number, options: {QueryValue?: string, Page?: number, PageSize?: number, ResponseFields?: any, SortDescending?: boolean, SortField?: string, Variables?: DynamicVariableMap} = {}) {\n return new Promise((resolve, reject) => {\n var data = {}\n var api_path: string = 'General/Query/Query';\n if(isNaN(+query)) {\n _.set(data, \"QueryValue\", query)\n if(typeof(options.QueryValue)!=='undefined') {\n _.unset(options, 'QueryValue')\n }\n } else if(!isNaN(+query) || _.isNumber(query)) {\n _.set(data, \"QueryId\", query)\n var api_path = 'General/Query/RunById'\n } else {\n // throw error\n reject(new CWError(501, 'Invalid query type', {'provided': query}))\n }\n data = _.merge(data, options)\n this.cw.runRequest(api_path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of the saved queries the current user can access.\n *\n * @category Query\n * @param {Array<string>} queryTypes - Get the saved queries for a particular type, default is all types\n * @param {boolean} createdOnly - Get only queries created by the current user, default is get all queries current user can access\n * @param {boolean} includeQuery - Restrict GIS searches to specified entity types\n * @param {boolean} [visibleToMobile] - Filter visibility to mobile. Default ignore visibility to mobile.\n * @param {number} [domainId] - The domain ID of the domain to search, defaut is authenticated user's current domain\n * @return {Object} Returns Promise object that represents a collection of SavedQueries\n */\n getSaved(queryTypes: Array<string> = [], createdOnly: boolean = false, includeQuery: boolean = true, visibleToMobile?: boolean, domainId?: number) {\n return new Promise((resolve, reject) => {\n // TODO: Check QueryTypeInformation and compare\n var data = {\n \"CreatedOnly\": createdOnly,\n \"IncludeQuery\": includeQuery\n }\n if(queryTypes.length==1) {\n _.set(data, \"QueryType\", queryTypes.pop())\n } else if(queryTypes.length>1) {\n _.set(data, \"QueryTypes\", queryTypes)\n }\n if(typeof(domainId)!=='undefined') {\n _.set(data, \"DomainId\", domainId)\n }\n this.cw.runRequest('General/Query/SavedQueries', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\nimport { convertToObject } from 'typescript';\n\nexport class Report {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Get the pdf \"print\" report for a specific CW node item\n *\n * @category Reports\n * @param {string} type - The node type (case, workorder, inspection, request)\n * @param {number} node_id - CaseDataGroupId as defined in CaseDataGroup admin.\n * @param {string} fileName - The filename of the report.\n * @return {Object} Returns Promise that represents a file stream of a pdf\n */\n print(type: string, node_id: number|Array<number>, fileName?: string) {\n return new Promise((resolve, reject) => {\n var dl_url: String = ''\n // Check which verson of CW we're connected to\n if(this.cw.v() >= 23) {\n var data = {\n FileName: fileName\n }\n if(!fileName) {\n // If no filename is provided, we need to set the filename to the default for the node_id\n this.cw.inspection.getById(node_id).then((r) => {\n // resolve(r)\n console.log(r)\n if(r) {\n console.log(r)\n process.exit(0)\n } else {\n\n }\n }).catch((e) => {\n console.log(e)\n reject(e)\n })\n }\n process.exit(0)\n switch (type) {\n case 'request':\n dl_url = `Ams/Reports/DownloadSrReport`\n _.set(data, 'RequestId', node_id)\n break\n case 'workorder':\n dl_url = `Ams/Reports/DownloadWoReport`\n _.set(data, 'WorkOrderId', node_id)\n break\n case 'inspection':\n dl_url = `Ams/Reports/DownloadInspReport`\n _.set(data, 'InspectionId', node_id)\n break\n case 'case':\n dl_url = `Pll/BusinessCaseReports/Download`\n _.set(data, 'PermitId', node_id)\n break\n }\n this.cw.runRequest(dl_url, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n } else if(this.cw.v()<23) {\n // Maybe I'll get to this for CR later. But you should really just update to 23.x and run ActiveReports\n } else {\n // Error, we don't know what version of CW we're connected to\n\n }\n })\n }\n\n /**\n * Get the custom pdf report from a CW 15.x instance\n *\n * @category Reports\n * @param {number} report_id - CaseDataGroupId as defined in CaseDataGroup admin.\n * @return {Object} Returns Promise that represents a file stream of a pdf\n */\n get(type: string, node_id: number, fileName: string) {\n return new Promise((resolve, reject) => {\n var dl_url: String = ''\n // Check which verson of CW we're connected to\n if(this.cw.v() >= 23) {\n // Custom reporting endpoints don't exist for AR in 23 right now...\n } else if(this.cw.v() < 23) {\n // This is the only one that runs right now\n \n } else {\n // Error, we don't know what version of CW we're connected to\n }\n })\n }\n}","import { CWError } from './error'\nconst _ = require('lodash')\n\ninterface Coordinates {\n x: number;\n y: number;\n z?: number;\n}\n\nexport class Request {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Request Administration methods\n */\n admin?: any\n\n /**\n * Request Costing methods\n */\n costs: any\n\n /**\n * Request Comments methods\n */\n comment: any\n\n /**\n * Attachments methods\n */\n attachments: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.admin\n this.comment\n this.attachments\n }\n\n /**\n * Create new requests\n *\n * @category Requests\n * @param {Object} sr_data - See /{subdirectory}/apidocs/#/data-type-infodataType=RequestBase on the Cityworks instance\n * @return {Object} Returns Promise that represents an object describing the newly-created request\n */\n create(sr_data: Object) {\n return new Promise((resolve, reject) => {\n if(!_.has(sr_data, 'ProblemSid')) {\n reject(new CWError(2, 'ProblemSid must be provided.', {'provided': sr_data}))\n } else {\n this.cw.runRequest('Ams/ServiceRequest/Create', sr_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Update a request\n *\n * @category Requests\n * @param {object} sr_data - See /{subdirectory}/apidocs/#/data-type-infodataType=RequestBase on the Cityworks instance\n * @return {Object} Returns Promise that represents an object describing the updated request\n */\n update(sr_data: Object) {\n return new Promise((resolve, reject) => {\n if(!_.has(sr_data, 'RequestId')) {\n reject(new CWError(3, 'RequestId must be provided.', {'provided': sr_data}))\n } else {\n this.cw.runRequest('Ams/ServiceRequest/Update', sr_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Move a request's point\n *\n * @category Requests\n * @param {number} requestId\n * @param {number} x\n * @param {number} y\n * @param {Object} projection - Should include at least WKT _or_ WKID attribute. Can also include VcsWKID attribute.\n * @param {number} [z] - Optional Z coordinate\n * @return {Object} Returns Promise that represents an object describing the updated GISPoint\n */\n move(requestId: number, x: number, y: number, projection: {WKID?: string, WKT?: string, VcsWKID?: string}, z?: number) {\n return new Promise((resolve, reject) => {\n if(!_.has(projection, 'WKID') && !_.has(projection, 'WKT')) {\n // Throw error\n reject(new CWError(6, 'You must provide either the WKID or WKT for the x/y coordinates.', {'projection': projection}))\n }\n var base_data = {\n RequestId: requestId,\n X: x,\n Y: y\n };\n if(typeof(z)!='undefined') {\n _.set(base_data, 'Z', z)\n }\n var data = _.merge(base_data, projection);\n this.cw.runRequest('Ams/ServiceRequest/Move', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Change a request's problem code\n *\n * @category Requests\n * @param {number} requestId - The request ID to change\n * @param {number} problemSid - The request's new ProblemSID\n * @return {Object} Returns Promise that represents an object describing the updated request\n */\n changeProblem(requestId: number, problemSid: number) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestId: requestId,\n ProblemSid: problemSid\n }\n this.cw.runRequest('Ams/ServiceRequest/ChangeProblem', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a request by ID\n *\n * @category Requests\n * @param {number} requestId - The ID of the request to retrieve\n * @return {Object} Returns Promise that represents an object describing the request\n */\n getById(requestId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestId: requestId\n }\n this.cw.runRequest('Ams/ServiceRequest/ById', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get requests by array of IDs\n *\n * @category Requests\n * @param {Array<number>} requestIds - The request IDs to retrieve\n * @return {Object} Returns Promise that represents a collection of Objects describing the requests\n */\n getByIds(requestIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds\n }\n this.cw.runRequest('Ams/ServiceRequest/ByIds', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the audit log for a specific request\n *\n * @category Requests\n * @param {number} requestId - A Request ID to get the audit log for\n * @return {Object} Returns Promise that represents a collection of Cityworks Metadata Objects\n */\n getAuditLog(requestId: number) {\n return new Promise((resolve, reject) => {\n var data = {RequestId: requestId}\n this.cw.runRequest('Ams/ServiceRequest/AuditLog', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get custom fields for provided requests\n *\n * @category Requests\n * @param {Array<number>} requestIds - The RequestIds whose custom fields should be returned\n * @return {Object} Returns Promise that represents a collection of custom fields\n */\n getCustomFields(requestIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds,\n }\n this.cw.runRequest('Ams/ServiceRequest/CustomFields', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Change custom field category for provided requests\n *\n * @category Requests\n * @param {Array<number>} requestIds - The RequestIds whose custom fields should be returned\n * @param {number} categoryId - The new custom field grouping/category which should be assigned to the provided requests\n * @return {Object} Returns Promise that represents a collection of requests\n */\n changeCustomFieldCategory(requestIds: Array<number>, categoryId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds,\n CategoryId: categoryId\n }\n this.cw.runRequest('Ams/ServiceRequest/ChangeCustomFieldCategory', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Cancel requests\n *\n * @category Requests\n * @param {Array<number>} requestIds - An array of the IDs to cancel the matched requests\n * @param {string} [cancelReason] - A reason for cancelling the request(s)\n * @param {datetime} [dateCancelled] - The date/time that it should be indicated the request was cancelled\n * @return {Object} Returns object that represents a collection of requests\n */\n cancel(requestIds: Array<number>, cancelReason?: string, dateCancelled?: Date) {\n return new Promise((resolve, reject) => {\n var m = new Date()\n var data: {RequestIds: Array<number>, CancelReason?: string, DateCancelled?: Date} = { RequestIds: requestIds }\n if(typeof(cancelReason)!=='undefined')\n _.set(data, 'CancelReason', cancelReason);\n if(typeof(dateCancelled)!=='undefined')\n _.set(data, 'DateCancelled', dateCancelled);\n this.cw.runRequest('Ams/ServiceRequest/Cancel', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Uncancel requests\n *\n * @category Requests\n * @param {Array<number>} requestIds - An array of the IDs to uncancel the matched requests\n * @return {Object} Returns object that represents a collection of requests\n */\n uncancel(requestIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds\n }\n this.cw.runRequest('Ams/ServiceRequest/Uncancel', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Close requests\n *\n * @category Requests\n * @param {Array<number>} requestIds - An array of the IDs to close the matched requests\n * @return {Object} Returns object that represents a collection of requests\n */\n close(requestIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds\n }\n this.cw.runRequest('Ams/ServiceRequest/Close', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(5, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Reopen closed requests\n *\n * @category Requests\n * @param {Array<number>} requestIds - An array of the IDs to reopen the matched requests\n * @return {Object} Returns object that represents a collection of requests\n */\n reopen(requestIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds\n }\n this.cw.runRequest('Ams/ServiceRequest/ReOpen', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete requests\n *\n * @category Requests\n * @param {Array<number>} requestIds - An array of the IDs to delete the matched requests\n * @return {Object} Returns object that represents a collection of request Ids which have been deleted\n */\n delete(requestIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds\n }\n this.cw.runRequest('Ams/ServiceRequest/Delete', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for requests\n *\n * @category Request Search\n * @param {Object} searchData - The search information to retrieve matched requests, see instance docs: /{subdirectory}/apidocs/#/service-info/Ams/ServiceRequest\n * @return {Object} Returns Promise that represents an Array of the matching request IDs\n */\n search(searchData: Object) {\n return new Promise((resolve, reject) => {\n var data = searchData\n this.cw.runRequest('Ams/ServiceRequest/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the records on the basis of RequestId, only populates RequestId, Description, ProblemCode properties\n *\n * @category Request Object Search\n * @param {string} requestId - ???, see instance docs: /{subdirectory}/apidocs/#/service-info/Ams/ServiceRequest\n * @return {Object} Returns Promise that represents a collection of the matching (limited) request objects\n */\n searchObject(requestId: string) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestId: requestId\n }\n this.cw.runRequest('Ams/ServiceRequest/SearchObject', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Create a search definition. Save the definition by setting SaveDefinition = true and supplying a SearchName.\n *\n * @category Requests\n * @param {Object} searchData - Search data variables. See /{subdirectory}/apidocs/#/service-info/Ams/ServiceRequest\n * @param {number} [searchName] - What to name your search (if it should be saved)\n * @param {number} [sharedWithin] - What group or domain to share the search to.\n * @param {boolean} saveDefinition - Whether or not to save the search definition. Defaults to true when a search name is specified.\n * @param {boolean} enableEurl - Whether or not to enable EURL for the saved search. Defaults to true.\n * @return {Object} Returns Promise that represents a collection of Cityworks Metadata Objects\n */\n createSearchDefinition(searchData: Object, searchName?: string, sharedWithin?: number, saveDefinition: boolean = true, enableEurl: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = searchData\n if(_.isString(searchName)) {\n _.set(data, 'SearchName', searchName)\n _.set(data, 'SaveDefinition', saveDefinition)\n _.set(data, 'EnableEurl', enableEurl)\n // not sure how to handle sharedWithin...\n // _.set(data, 'SharedWithin', sharedWithin)\n }\n this.cw.runRequest('Ams/ServiceRequest/CreateSearchDefinition', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of problem nodes for a domain\n *\n * @category Request Categorization\n * @param {number} domainId - The domain ID for which to retrieve problem nodes.\n * @param {boolean} viewOnly - Return only view only problem nodes. Defaults to false.\n * @param {Object} [displayMode] - Object that should contain two properties if you provide it: DisplayTextMode: string (C = Code, D = Description, CD = Code ~ Description). DisplayTextDelimeter: string, only impacts CD display text mode.\n * @param {boolean} includeCancelled - Return only cancelled problem nodes as well. Defaults to false.\n * @return {Object} Returns Promise that represents a collection of problem node objects.\n */\n getProblemNodes(domainId: number, viewOnly: boolean = false, displayMode?: Object, includeCancelled: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n DomainId: domainId,\n IncludeCancelled: includeCancelled,\n ViewOnly: viewOnly\n }\n if(typeof displayMode != 'undefined' && displayMode !== null && _.has(displayMode, 'DisplayTextMode')) {\n _.set(data, 'DisplayTextMode', _.get(displayMode, 'DisplayTextMode'))\n if(_.get(displayMode, 'DisplayTextMode')=='CD' && _.has(displayMode, 'DisplayTextDelimeter')) {\n _.set(data, 'DisplayTextDelimeter', _.get(displayMode, 'DisplayTextDelimeter'))\n }\n }\n this.cw.runRequest('Ams/ServiceRequest/ProblemNodes', data).then(r => {\n // console.log(_.filter(r, function(o) { return !o.Cancel; }), 'filter');\n // console.log(_.some(r.Value, ['Cancel', true]), 'some');\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of problem codes\n *\n * @category Request Options\n * @param {boolean} forPublicOnly - Return only publicly-available service requests. Defaults to false.\n * @param {boolean} onlyActiveTemplates - Return only active templates. Defaults to true.\n * @return {Object} Returns Promise that represents an Array of problem name objects.\n */\n getProblems(forPublicOnly: boolean = false, onlyActiveTemplates: boolean = true, domainIds?: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n ForPublicOnly: forPublicOnly,\n OnlyActiveTemplates: onlyActiveTemplates\n }\n if(typeof domainIds != 'undefined') {\n _.set(data, 'DomainIds', domainIds)\n }\n this.cw.runRequest('Ams/ServiceRequest/Problems', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of problem codes by keywords\n *\n * @category Request Options\n * @param {string} keywords - Keywords to search for potential problem codes\n * @return {Object} Returns Promise that represents an Array of problem name objects.\n */\n getProblemsByKeywords(keywords: string) {\n return new Promise((resolve, reject) => {\n var data = {\n Keywords: keywords\n }\n this.cw.runRequest('Ams/ServiceRequest/ProblemsByKeywords', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of a problem code's priorities\n *\n * @category Request Options\n * @param {number} problemSid - Return priorities for given problemSid\n * @return {Object} Returns Promise that represents an Array of priorities\n */\n getPriorities(problemSid: number) {\n return new Promise((resolve, reject) => {\n var data = {\n ProblemSids: problemSid,\n }\n this.cw.runRequest('Ams/ServiceRequest/Priorities', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get custom field templates for problem code\n *\n * @category Request Options\n * @param {number} problemSid - The problemSid whose template custom fields should be returned\n * @return {Object} Returns Promise that represents a collection of custom fields\n */\n getCustomFieldTemplate(problemSid: number) {\n return new Promise((resolve, reject) => {\n var data = {\n ProblemSids: problemSid,\n }\n this.cw.runRequest('Ams/ServiceRequest/TemplateCustomFields', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the questions and answer options for a problem code\n *\n * @category Request Options\n * @param {number} problemSid - The problemSid whose Q&A should be returned\n * @return {Object} Returns Promise that represents a collection of questions and answer settings\n */\n getQASettings(problemSid: number) {\n return new Promise((resolve, reject) => {\n var data = {\n ProblemSids: problemSid,\n }\n this.cw.runRequest('Ams/ServiceRequest/QA', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get problem leaf (template) by Sid\n *\n * @category Request Options\n * @param {number} problemSid - Return problem leaf for given problemSid\n * @return {Object} Returns Promise that represents an Object that describes the problem leaf (template)\n */\n getProblemLeaf(problemSid: number) {\n return new Promise((resolve, reject) => {\n var data = {\n ProblemSid: problemSid\n }\n this.cw.runRequest('Ams/ServiceRequest/ProblemLeafBySid', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of default statuses\n *\n * @category Request Options\n * @param {Array<number>} domainIds - List of domains to return default statuses for\n * @return {Object} Returns Promise that represents an Array of statuses.\n */\n getStatuses(domainIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n DomainIds: domainIds\n }\n this.cw.runRequest('Ams/ServiceRequest/DefaultStatus', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of possible Employee values\n *\n * @category Request Options\n * @param {string} listType - Which list (endpoint) to get. Includes only DispatchTo & SubmitTo.\n * @param {number} domainId - Domain to return possible dispatchTo values for\n * @return {Object} Returns Promise that represents an Array of Employee options.\n */\n getEmployeeLists(listType: string, domainId: number) {\n return new Promise((resolve, reject) => {\n // TODO: make a default domain option on the CW object for cases like this.\n var data = {\n DomainId: domainId\n }\n if(!_.includes(['DispatchTo', 'SubmitTo'], listType)) {\n reject(new CWError(2, 'listType must be either SubmitTo or DispatchTo.', {'provided': listType}))\n } else {\n this.cw.runRequest(`Ams/ServiceRequest/${listType}`, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Get a list of possible DispatchTo values\n *\n * @category Request Options\n * @param {number} domainId - Domain to return possible dispatchTo values for\n * @return {Object} Returns Promise that represents an Array of dispatchTo options.\n */\n getDispatchTos(domainId: number) {\n // Fix name for choice of non-pluralized endpoint. Unlike WOs & Inspections...\n return this.getEmployeeLists('DispatchTo', domainId);\n }\n\n /**\n * Get a list of possible SubmitTo values\n *\n * @category Request Options\n * @param {number} domainId - Domain to return possible submitTo values for\n * @return {Object} Returns Promise that represents an Array of submitTo options.\n */\n getSubmitTos(domainId: number) {\n // Fix name for choice of non-pluralized endpoint. Unlike WOs & Inspections...\n return this.getEmployeeLists('SubmitTo', domainId);\n }\n\n /**\n * Get street codes\n *\n * @category Request Options\n * @return {Object} Returns Promise that represents an Array of Street Codes.\n */\n streetCodes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/ServiceRequest/AllStreetCode', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of templates\n *\n * @category Request Templates\n * @param {Array<number>} problemSids - An array list of problemSids to retrieve templates for\n * @param {Date} [minimumDateModified] - ?\n * @param {Date} [maximumDateModified] - ?\n * @return {Object} Returns Promise that represents\n */\n getTemplatesById(problemSids: Array<number>, minimumDateModified?: Date, maximumDateModified?: Date) {\n return new Promise((resolve, reject) => {\n var data = {\n ProblemSids: null\n }\n if(typeof minimumDateModified != 'undefined') {\n _.set(data, 'MinimumDateModified', minimumDateModified)\n }\n if(typeof maximumDateModified != 'undefined') {\n _.set(data, 'MaximumDateModified', maximumDateModified)\n }\n\n this.cw.runRequest('Ams/ServiceRequestTemplate/ByIds', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Create a search definition. Save the definition by setting SaveDefinition = true and supplying a SearchName.\n *\n * @category Request Templates\n * @param {Object} searchData - Search data variables. See /{subdirectory}/apidocs/#/service-info/Ams/ServiceRequestTemplate\n * @param {number} [searchName] - What to name your search (if it should be saved)\n * @param {number} [sharedWithin] - What group or domain to share the search to.\n * @param {boolean} saveDefinition - Whether or not to save the search definition. Defaults to true when a search name is specified.\n * @return {Object} Returns Promise that represents a collection of Cityworks Metadata Objects. See: /{subdirectory}/apidocs/#/data-type-info;dataType=CWMetadata\n */\n createTemplateSearchDefinition(searchData: Object, searchName?: string, sharedWithin?: number, saveDefinition: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = searchData\n if(_.isString(searchName)) {\n _.set(data, 'SearchName', searchName)\n _.set(data, 'SaveDefinition', saveDefinition)\n // not sure how to handle sharedWithin...\n // _.set(data, 'SharedWithin', sharedWithin)\n }\n this.cw.runRequest('Ams/ServiceRequestTemplate/CreateSearchDefinition', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the questions and answers for a(many) request template(s)\n *\n * @category Request Templates\n * @param {Array<number>} problemSids - An array list of problemSids to retrieve templates for\n * @return {Object} Returns Promise that represents a collection of ProblemQAs. See /{subdirectory}/apidocs/#/data-type-info;dataType=ProblemQA\n */\n getTemplateQAs(problemSids: Array<number>, minimumDateModified?: Date, maximumDateModified?: Date) {\n return new Promise((resolve, reject) => {\n var data = {\n ProblemSids: null\n }\n this.cw.runRequest('Ams/ServiceRequestTemplate/QA', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of template id results for a provided search parameters\n *\n * @category Request Templates\n * @param {Object} searchData - Search data variables. See /{subdirectory}/apidocs/#/service-info/Ams/ServiceRequestTemplate\n * @return {Object} Returns Promise that represents a list of template IDs.\n */\n searchTemplates(searchData: Object) {\n return new Promise((resolve, reject) => {\n var data = searchData\n this.cw.runRequest('Ams/ServiceRequestTemplate/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get request templates (problem leaf[s])\n *\n * @category Request Templates\n * @param {Array<number>} [templateIds] - Array of specific template IDs to retrieve\n * @param {number} canCreate - If true, only return templates the user can create, ignored if false or null, default is false\n * @param {boolean} includeInactiveIf - If true, returns inactive templates, default is false\n * @param {Date} [minimumDateModified] - ?\n * @param {Date} [maximumDateModified] - ?\n * @return {Object} Returns Promise that represents a collection of Problem Leafs. See /{subdirectory}/apidocs/#/data-type-info;dataType=ProblemLeaf\n */\n getTemplates(templateIds: Array<number>, canCreate: boolean = false, includeInactiveIf: boolean = false, minimumDateModified?: Date, maximumDateModified?: Date) {\n return new Promise((resolve, reject) => {\n var data = {\n CanCreate: canCreate,\n IncludeInactiveIf: includeInactiveIf\n }\n if(typeof templateIds != 'undefined') {\n _.set(data, 'TemplateIds', templateIds)\n }\n if(typeof minimumDateModified != 'undefined') {\n _.set(data, 'MinimumDateModified', minimumDateModified)\n }\n if(typeof maximumDateModified != 'undefined') {\n _.set(data, 'MaximumDateModified', maximumDateModified)\n }\n this.cw.runRequest('Ams/ServiceRequestTemplate/Templates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get WorkOrder templates that are associated to this request template type\n *\n * @category Request Templates\n * @param {Array<number>} problemSids - An array list of problemSids to retrieve Problem WO templates for\n * @param {boolean} includeInactiveIf - Include inactive WorkOrder templates, default is false\n * @return {Object} Returns Promise that represents a collection of Problem WO Templates. See /{subdirectory}/apidocs/#/data-type-info;dataType=ProblemWOTemplate\n */\n getWOTemplates(problemSids: Array<number>, includeInactive: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n ProblemSids: problemSids,\n IncludeInactive: includeInactive\n }\n this.cw.runRequest('Ams/ServiceRequestTemplate/WorkOrderTemplates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Map Layer Fields\n *\n * @category Requests\n * @param {number} requestId - The request ID to get the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the request map layer fields\n */\n getMLFs(requestId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n ServiceRequestId: requestId\n }\n var path = 'Ams/TemplateMapLayer/ServiceRequestInstanceMapLayersByRequestId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Map Layer Fields\n *\n * @category Requests\n * @param {number} requestId - The service request ID to get the map layer fields for.\n * @param {Coordinates} coordinates - Object with X, Y, and optional Z coordinate specified.\n * @param {number} problemsId - Optional. Problem Leaf (template) ID. If provided, the map layer fields will be updated from the service request template (problem leaf) otherwise, only existing updated.\n * @param {number} domainId - Optional. Domain ID of org\n * @return {Object} Returns Promise that represents an object with all the updated GIS info for the request, including a collection of the updated map layer fields\n */\n updateMLFs(requestId: number, coordinates: Coordinates, problemsId?: number, domainId?: number) {\n return new Promise((resolve, reject) => {\n var data = _.merge({}, coordinates)\n if(_.isNumber(problemsId)) {\n _.set(data, 'ProblemsId', problemsId)\n var path = 'Ams/TemplateMapLayer/UpdateServiceRequestInstanceMapLayers'\n } else\n var path = 'Ams/TemplateMapLayer/UpdateServiceRequestInstanceMapLayersByTemplate'\n\n _.set(data, 'ServiceRequestId', requestId)\n if(_.isNumber(domainId)) {\n _.set(data, 'DomainId', domainId)\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Map Layer Fields\n *\n * @category Requests\n * @param {number} requestId - The request ID to delete the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the deleted map layer fields\n */\n deleteMLFs(requestId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n ServiceRequestId: requestId\n }\n var path = 'Ams/TemplateMapLayer/DeleteServiceRequestInstancesByRequestId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\ninterface Coordinates {\n x: number;\n y: number;\n z?: number;\n}\n\nexport class Inspection {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Inspection Administration methods\n */\n admin?: any\n\n /**\n * Inspection Administration methods\n */\n attachments?: any\n\n /**\n * Inspection Costing methods\n */\n costs: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.admin\n this.attachments\n this.costs\n }\n\n /**\n * Create new inspection\n *\n * @category Inspections\n * @param {Object} insp_data - See /{subdirectory}/apidocs/#/data-type-infodataType=InspectionBase on your Cityworks instance\n * @return {Object} Returns Promise that represents an object describing the newly-created inspection\n */\n create(insp_data: Object) {\n return new Promise((resolve, reject) => {\n if(!_.has(insp_data, 'EntityType') || !_.has(insp_data, 'InspTemplateId')) {\n reject(new CWError(1, 'EntityType and InspTemplateId properties must be provided.', {'provided': insp_data}))\n } else {\n this.cw.runRequest('Ams/Inspection/Create', insp_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Create inspections from an array of entities\n *\n * @category Inspections\n * @param {Object} insp_data - See /{subdirectory}/apidocs/#/data-type-infodataType=InspectionBase on your Cityworks instance\n * @return {Object} Returns Promise that represents a collection of objects describing the newly-created inspections\n */\n createFromEntities(insp_data: Object) {\n return new Promise((resolve, reject) => {\n if(!_.has(insp_data, 'EntityType') || !_.has(insp_data, 'InspTemplateId')) {\n reject(new CWError(1, 'EntityType and InspTemplateId properties must be provided.', {'provided': insp_data}))\n } else {\n this.cw.runRequest('Ams/Inspection/CreateFromEntities', insp_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Create an inspection from a parent inspection (TODO: what parent!?)\n *\n * @category Inspections\n * @param {object} insp_data - See /{subdirectory}/apidocs/#/data-type-infodataType=InspectionBase on your Cityworks instance\n * @return {Object} Returns object that represents an object describing the newly-created inspection\n */\n createFromParent(insp_data: Object) {\n return new Promise((resolve, reject) => {\n // see if it's just InspectionId\n if(!_.has(insp_data, 'EntityType') || !_.has(insp_data, 'InspTemplateId') || !_.has(insp_data, 'InspectionId')) {\n reject(new CWError(1, 'EntityType and InspTemplateId properties must be provided.', {'provided': insp_data}))\n } else {\n this.cw.runRequest('Ams/Inspection/CreateFromParent', insp_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Create an inspection from a service request\n *\n * @category Inspections\n * @param {object} insp_data - See /{subdirectory}/apidocs/#/data-type-infodataType=InspectionBase on your Cityworks instance\n * @return {Object} Returns object that represents an object describing the newly-created inspection\n */\n createFromServiceRequest(insp_data: Object) {\n return new Promise((resolve, reject) => {\n if(!_.has(insp_data, 'EntityType') || !_.has(insp_data, 'InspTemplateId') || !_.has(insp_data, 'RequestId')) {\n reject(new CWError(1, 'EntityType and InspTemplateId properties must be provided.', {'provided': insp_data}))\n } else {\n this.cw.runRequest('Ams/Inspection/CreateFromServiceRequest', insp_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Create an inspection from a WorkOrder\n *\n * @category Inspections\n * @param {object} insp_data - See /{subdirectory}/apidocs/#/data-type-infodataType=InspectionBase on your Cityworks instance\n * @return {Object} Returns object that represents an object describing the newly-created inspection\n */\n createFromWorkOrder(insp_data: Object) {\n return new Promise((resolve, reject) => {\n // Are they both actually required?!?!\n // WorkOrderId\n // WorkOrderSid ...do with only SID first then check\n if(!_.has(insp_data, 'EntityType') || !_.has(insp_data, 'InspTemplateId') || !_.has(insp_data, 'WorkOrderSid')) {\n reject(new CWError(1, 'EntityType and InspTemplateId properties must be provided.', {'provided': insp_data}))\n } else {\n this.cw.runRequest('Ams/Inspection/CreateFromWorkOrder', insp_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Update an inspection\n *\n * @category Inspections\n * @param {object} insp_data - See /{subdirectory}/apidocs/#/data-type-infodataType=InspectionBase on the Cityworks instance\n * @return {Object} Returns Promise that represents an object describing the updated inspection\n */\n update(insp_data: Object) {\n return new Promise((resolve, reject) => {\n return new Promise((resolve, reject) => {\n if(!_.has(insp_data, 'InspectionId')) {\n reject(new CWError(1, 'InspectionId must be provided.', {'provided': insp_data}))\n } else {\n this.cw.runRequest('Ams/Inspection/Update', insp_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n })\n }\n\n /**\n * Get an inspection by ID\n *\n * @category Inspections\n * @param {number} inspectionId - The inspection ID to retrieve\n * @return {Object} Returns Promise that represents an object describing the inspection\n */\n getById(inspectionId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionId: inspectionId\n }\n this.cw.runRequest('Ams/Inspection/ById', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspections by array of IDs\n *\n * @category Inspections\n * @param {Array<number>} inspectionIds - The inspection IDs to retrieve\n * @return {Object} Returns Promise that represents a collection of Objects describing the inspections\n */\n getByIds(inspectionIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionIds: inspectionIds\n }\n this.cw.runRequest('Ams/Inspection/ByIds', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Cancel inspections\n *\n * @category Inspections\n * @param {Array<number>} inspectionIds - An array of the IDs to cancel the matched inspections\n * @param {string} [cancelReason] - A reason for cancelling the inspection(s)\n * @param {datetime} [dateCancelled] - The date/time that it should be indicated the inspection was cancelled\n * @return {Object} Returns object that represents a collection of inspections\n */\n cancel(inspectionIds: Array<number>, cancelReason?: string, dateCancelled?: Date) {\n return new Promise((resolve, reject) => {\n var m = new Date()\n var data: {InspectionIds: Array<number>, CancelReason?: string, DateCancelled?: Date} = { InspectionIds: inspectionIds }\n if(typeof(cancelReason)!=='undefined') {\n data.CancelReason = cancelReason\n }\n if(typeof(dateCancelled)!=='undefined') {\n data.DateCancelled = dateCancelled\n }\n this.cw.runRequest('Ams/Inspection/Cancel', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Uncancel inspections\n *\n * @category Requests\n * @param {Array<number>} inspectionIds - An array of the IDs to uncancel the matched requests\n * @return {Object} Returns object that represents a collection of requests\n */\n uncancel(inspectionIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionIds: inspectionIds\n }\n this.cw.runRequest('Ams/Inspection/Uncancel', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Close inspections\n *\n * @category Inspections\n * @param {Array<number>} inspectionIds - An array of the IDs to close the matched inspections\n * @return {Object} Returns object that represents a collection of inspections\n */\n close(inspectionIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionIds: inspectionIds\n }\n this.cw.runRequest('Ams/Inspection/Close', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Reopen closed inspections\n *\n * @category Inspections\n * @param {Array<number>} inspectionIds - An array of the IDs to reopen the matched inspections\n * @return {Object} Returns object that represents a collection of inspections\n */\n reopen(inspectionIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionIds: inspectionIds\n }\n this.cw.runRequest('Ams/Inspection/Reopen', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete inspections\n *\n * @category Inspections\n * @param {Array<number>} inspectionIds - An array of the IDs to delete the matched inspections\n * @return {Object} Returns object that represents a collection of inspection Ids which have been deleted\n */\n delete(inspectionIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionIds: inspectionIds\n }\n this.cw.runRequest('Ams/Inspection/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for inspections\n *\n * @category Inspection Search\n * @param {Object} searchData - The search information to retrieve matched inspections, see instance docs: /{subdirectory}/apidocs/#/service-info/Ams/Inspection\n * @return {Object} Returns Promise that represents an array of the matching inspection IDs\n */\n search(searchData: Object) {\n return new Promise((resolve, reject) => {\n var data = searchData\n this.cw.runRequest('Ams/Inspection/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the records on the basis of inspectionId, only populates InspectionId, InspTemplateName, and Location properties\n *\n * @category Inspection Object Search\n * @param {string} inspectionId - ???, see instance docs: /{subdirectory}/apidocs/#/service-info/Ams/Inspection\n * @return {Object} Returns Promise that represents a collection of the matching (limited) inspection objects\n */\n searchObject(inspectionId: string) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionId: inspectionId\n }\n this.cw.runRequest('Ams/ServiceRequest/SearchObject', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get list of statuses\n *\n * @category Inspection Options\n * @return {Object} Returns object that represents an array of all possible statuses for an Inspection\n */\n statuses() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/Inspection/Statuses', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspection submit to list\n *\n * @category Inspection Options\n * @param {boolean} [includeInactiveEmployees] - whether to include inactive employees in the return. Defaults to false.\n * @param {boolean} [domainIds] - which domains to include in the return, default to All domains\n * @return {Object} Returns object that represents a collection of all possible employees for an Inspection's SubmitTo\n */\n submitTos(includeInactiveEmployees: boolean = false, domainIds?: Array<number>) {\n return new Promise((resolve, reject) => {\n var data: {IncludeInactiveEmployees?: boolean, DomainIds?: Array<number>} = {}\n if(includeInactiveEmployees) {\n data.IncludeInactiveEmployees = true\n }\n if(typeof(domainIds)!=='undefined') {\n data.DomainIds = domainIds\n }\n this.cw.runRequest('Ams/Inspection/SubmitTos', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n\n /**\n * Add an entity to an existing inspection\n * This method requires an Entity/Asset to be specified. You can either specify the Entity Type and its UID or a WorkOrderEntityBase Object.\n *\n * @category Inspections\n * @param {Object} entity - Either of two attribute combinations are valid: entityType & entityUid OR Entity as a fully-inflated WorkOrderEntity (WorkOrderEntityBase) object.\n * @param {number} inspectionId - An Inspection ID to attach the entity/asset to.\n * @param {boolean} updateXY - Provide a boolean to whether the inspection's X/Y coordinates should be updated. Default is true.\n * @param {Object} facility - Add Facility_Id for the Facility Identifier and Level_id for the Facility Level Identifier. Defaults to empty so that no facility is specified.\n * @return {Object} Returns object that represents an object which describes an Inspection Entity\n */\n connectAsset(entity: {EntityType?: string, EntityUid?: string, Entity?: Object}, inspectionId: number, updateXY: boolean = true, facility: {Facility_Id?: string, Level_Id?: string} = {}) {\n return new Promise((resolve, reject) => {\n var data: {InspectionId: number, EntityType?: string, EntityUid?: string, Entity?: Object, Facility_Id?: string, Level_Id?: string} = {\n InspectionId: inspectionId\n }\n if(_.has(entity, 'EntityType') && _.has(entity, 'EntityUid')) {\n data.EntityType = entity.EntityType\n data.EntityUid = entity.EntityUid\n } else if(_.has(entity, 'Entity')) {\n data.Entity = entity.Entity\n } else {\n // Throw error, no entity/asset provided\n }\n if(_.has(facility, 'Facility_Id')) {\n data.Facility_Id = facility.Facility_Id\n }\n if(_.has(facility, 'Level_Id')) {\n data.Level_Id = facility.Level_Id\n }\n this.cw.runRequest('Ams/Inspection/AddEntity', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n // 4 NotAuthorizedToUpdateInspection\n // 9 InvalidActivityMapLogicXY\n // 21 ErrorUnknownEntityType\n // 30 InvalidField\n // 60 WarningItemNotFound\n // 68 MoveInvalidCityworksWkid\n reject(e)\n })\n })\n }\n\n /**\n * Get the answers for inspections\n *\n * @category Inspections\n * @param {Array<number>} inspections - An Array of one or more Inspection IDs\n * @return {Object} Returns Promise that represents a collection of Inspection Answers\n */\n getAnswers(inspections: Array<number>) {\n return new Promise((resolve, reject) => {\n var data: {InspectionId?: number, InspectionIds?: Array<number>} = {}\n if(inspections.length==0) {\n data.InspectionId = inspections[0]\n } else {\n data.InspectionIds = inspections\n }\n this.cw.runRequest('Ams/Inspection/Answers', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the audit log for a specific Inspection\n *\n * @category Inspections\n * @param {number} inspectionId - An Inspection ID to get the audit log for\n * @return {Object} Returns Promise that represents a collection of Cityworks Metadata Objects\n */\n getAuditLog(inspectionId: number) {\n return new Promise((resolve, reject) => {\n var data = {InspectionId: inspectionId}\n this.cw.runRequest('Ams/Inspection/AuditLog', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Create a search definition. Save the definition by setting SaveDefinition = true and supplying a SearchName.\n *\n * @category Inspections\n * @param {Object} searchData - Search data variables. See /{subdirectory}/apidocs/#/service-info/Ams/Inspection\n * @param {number} [searchName] - What to name your search (if it should be saved)\n * @param {number} [sharedWithin] - What group or domain to share the search to.\n * @param {boolean} saveDefinition - Whether or not to save the search definition. Defaults to true when a search name is specified.\n * @param {boolean} enableEurl - Whether or not to enable EURL for the saved search. Defaults to true.\n * @return {Object} Returns Promise that represents a collection of Cityworks Metadata Objects\n */\n createSearchDefinition(searchData: Object, searchName?: string, sharedWithin?: number, saveDefinition: boolean = true, enableEurl: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = searchData\n if(_.isString(searchName)) {\n _.set(data, 'SearchName', searchName)\n _.set(data, 'SaveDefinition', saveDefinition)\n _.set(data, 'EnableEurl', enableEurl)\n // not sure how to handle sharedWithin...\n // _.set(data, 'SharedWithin', sharedWithin)\n }\n this.cw.runRequest('Ams/Inspection/CreateSearchDefinition', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get cycle from\n *\n * @category Inspection Options\n * @return {Object} Returns Promise that represents ... I have no idea what this endpoint does\n */\n getCycleFrom() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/Inspection/CycleFrom', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get cycle intervals\n *\n * @category Inspection Options\n * @return {Object} Returns Promise that represents a Dictionary of the cycle intervals available\n */\n getCycleIntervals() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/Inspection/CycleIntervals', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get cycle types\n *\n * @category Inspection Options\n * @return {Object} Returns Promise that represents a Dictionary of the cycle types available\n */\n getCycleTypes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/Inspection/CycleTypes', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get districts\n *\n * @category Inspection Options\n * @return {Object} Returns Promise that represents an Array of the districts\n */\n getDistricts() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/Inspection/Districts', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Inspection Employee lists. Abstraction done here, though only one employee list field, AFAIK.\n *\n * @category Inspection Options\n * @param {string} listType - Which list (endpoint) to get. Includes only SubmitTos.\n * @param {boolean} includeInactiveEmployees - Whether to include inactive employees in the returned list. Defaults to false.\n * @param {Array<number>} [domainIds] - Filter to certain domains within the Cityworks instance.\n * @return {Object} Returns Promise that represents a collection of employees. See: /{subdirectory}/apidocs/#/data-type-info;dataType=EmployeeNameId\n */\n getEmployeeLists(listType: string, includeInactiveEmployees: boolean = false, domainIds?: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n IncludeInactiveEmployees: includeInactiveEmployees\n }\n if(typeof(domainIds)!='undefined' && domainIds!=null) {\n _.set(data, 'DomainIds', domainIds)\n }\n if(listType!='SubmitTos') {\n reject(new CWError(2, 'listType must be \"SubmitTos\".', {'provided': listType}))\n } else {\n this.cw.runRequest(`Ams/Inspection/${listType}`, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Get SubmitTo list\n *\n * @category WorkOrder Options\n * @param {boolean} includeInactiveEmployees - Whether to include inactive employees in the returned list. Defaults to false.\n * @param {Array<number>} [domainIds] - Filter to certain domains within the Cityworks instance.\n * @return {Object} Returns Promise that represents a collection of employees. See: /{subdirectory}/apidocs/#/data-type-info;dataType=EmployeeNameId\n */\n getSubmitTos(includeInactiveEmployees: boolean = false, domainIds?: Array<number>) {\n return this.getEmployeeLists('SubmitTos', includeInactiveEmployees, domainIds);\n }\n\n /**\n * Move inspection by InspectionId. Must provide well known id (WKID) or well known text (WKT)\n *\n * @category Inspections\n * @param {number} inspectionId - The ID of the inspection that should be moved\n * @param {number} x - The X coordinate for the move\n * @param {number} y - The Y coordinate for the move\n * @param {Object} projection - Should include at least WKT _or_ WKID attribute. Can also include VcsWKID attribute.\n * @param {number} [z] - the optional Z coordinate for the move\n * @return {Object} Returns Promise that represents an object describing the updated GISPoint\n */\n move(inspectionId: number, x: number, y: number, projection: {WKID?: string, WKT?: string, VcsWKID?: string}, z?: number) {\n return new Promise((resolve, reject) => {\n if(!_.has(projection, 'WKID') && !_.has(projection, 'WKT')) {\n // Throw error\n reject(new CWError(3, 'You must provide either the WKID or WKT for the x/y coordinates.', {'projection': projection}))\n }\n var data_init = {\n InspectionId: inspectionId,\n X: x,\n Y: y\n }\n if(typeof z != 'undefined') {\n _.set(data_init, 'Z', z)\n }\n var data = _.merge(data_init, projection);\n this.cw.runRequest('Ams/Inspection/Move', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /////\n // INSPECTION TEMPLATES\n /////\n\n /**\n * Get inspection templates\n *\n * @category Inspection Templates\n * @param {Array<string>} [entityTypes] - The Entity Type(s) to return potential inspections for\n * @param {boolean} [canCreate] - If true, only return templates the user can create, ignored if false or null, default is true\n * @param {Object} [options] - An object which can include: [IncludeInactive]: boolean, MaximumDateModified: Date, MinimumDateModified: Date, TemplateIds: Array<number>\n * @return {Object} Returns Promise that represents a collection of all Inspections matching the provided parameters\n */\n getTemplates(entityTypes?: Array<string>, canCreate?: boolean, options?: {IncludeInactive?: boolean, MaximumDateModified?: Date, MinimumDateModified?: Date, TemplateIds?: Array<number>}) {\n return new Promise((resolve, reject) => {\n var data: {EntityTypes?: Array<string>, CanCreate?: boolean, IncludeInactive?: boolean, MaximumDateModified?: Date, MinimumDateModified?: Date, TemplateIds?: Array<number>} = {}\n if(typeof(entityTypes)!=='undefined') {\n data.EntityTypes = entityTypes\n }\n data.CanCreate = typeof(canCreate)!=='undefined' ? canCreate : true\n if(typeof(options)==='object') {\n _.forIn(options, (v, k) => {\n data[k] = v\n })\n }\n this.cw.runRequest('Ams/InspectionTemplate/Templates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of templates by IDs\n *\n * @category Inspection Templates\n * @param {Array<number>} inspectionIds - An array of the IDs to retrieve the matched inspections\n * @param {Object} [options] - An object which can include: [IncludeInactive]: boolean, MaximumDateModified: Date, MinimumDateModified: Date, TemplateIds: Array<number>\n * @return {Object} Returns object that represents an object describing the inspection\n */\n getTemplatesByIds(inspTemplateIds: Array<number>, options?: {MaximumDateModified?: Date, MinimumDateModified?: Date}) {\n return new Promise((resolve, reject) => {\n var data = {\n InspTemplateIds: inspTemplateIds\n }\n if(typeof(options)==='object') {\n _.forIn(options, (v, k) => {\n data[k] = v\n })\n }\n this.cw.runRequest('Ams/InspectionTemplate/ByIds', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get entity types for inspection template(s)\n *\n * @category Inspection Templates\n * @param {Array<number>} inspTemplateIds - An array of the IDs to reopen the matched inspections\n * @return {Object} Returns object that represents an array of Entity Types\n */\n getTemplateEntityTypes(inspTemplateIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspTemplateIds: inspTemplateIds\n }\n this.cw.runRequest('Ams/InspectionTemplate/EntityTypes', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the questions and answers for inspection template(s)\n *\n * @category Inspection Templates\n * @param {Array<number>} inspTemplateIds - An array of the IDs to reopen the matched inspections\n * @return {Object} Returns object that represents an array which contains a list of InspQuestionPanel for the template\n */\n getQA(inspTemplateIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspTemplateIds: inspTemplateIds\n }\n this.cw.runRequest('Ams/InspectionTemplate/QA', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspection template question conditions\n *\n * @category Inspection Templates\n * @param {Array<number>} inspTemplateIds - An array of template IDs to get the matched inspection template Question conditions for\n * @return {Object} Returns object that represents an array which contains a dictionary of InspQuestion IDs to configs\n */\n getQConditions(inspTemplateIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspTemplateIds: inspTemplateIds\n }\n this.cw.runRequest('Ams/InspectionTemplate/QuestionConditions', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Map Layer Fields\n *\n * @category Inspections\n * @param {number} requestId - The inspection ID to get the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the inspections\n */\n getMLFs(requestId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n ServiceRequestId: requestId\n }\n var path = 'Ams/TemplateMapLayer/ServiceRequestInstanceMapLayersByRequestId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Map Layer Fields\n *\n * @category Inspections\n * @param {string|number} inspectionId - The inspection ID to get the map layer fields for.\n * @param {Coordinates} coordinates - Object with X, Y, and optional Z coordinate specified.\n * @param {number} inspTemplateId - Optional. Inspection's template ID. If provided, the map layer fields will be updated from the inspection template otherwise, only existing updated.\n * @param {number} domainId - Optional. Domain ID of org\n * @return {Object} Returns Promise that represents a ...\n */\n updateMLFs(inspectionId: number, coordinates: Coordinates, inspTemplateId?: number, domainId?: number) { // |number\n return new Promise((resolve, reject) => {\n var data = _.merge({}, coordinates)\n if(_.isNumber(inspTemplateId)) {\n _.set(data, 'InspTemplateId', inspTemplateId)\n var path = 'Ams/TemplateMapLayer/UpdateInspectionInstanceMapLayers';\n } else\n var path = 'Ams/TemplateMapLayer/UpdateInspectionInstanceMapLayersByTemplate'\n _.set(data, 'InspectionId', inspectionId)\n if(_.isNumber(domainId)) {\n _.set(data, 'DomainId', domainId)\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Map Layer Fields\n *\n * @category Inspections\n * @param {number} inspectionId - The inspection ID to delete the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the workorders\n */\n deleteMLFs(inspectionId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionId: inspectionId\n }\n var path = 'Ams/TemplateMapLayer/DeleteInspectionInstancesByInspectionId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\ninterface Coordinates {\n x: number;\n y: number;\n z?: number;\n}\n\nexport class WorkOrder {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * WorkOrder Administration methods\n */\n admin: any\n\n /**\n * WorkOrder Costing methods\n */\n costs: any\n\n /**\n * WorkOrder Comments methods\n */\n comment: any\n\n /**\n * WorkOrder Comments methods\n */\n attachments: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.admin\n this.comment\n this.attachments\n }\n\n /**\n * Create new workorders, including linkin to Requests & Inspections (optionally)\n *\n * @category WorkOrders\n * @param {Object} wo_data - See /{subdirectory}/apidocs/#/data-type-infodataType=WorkOrder on the Cityworks instance\n * @param {Array<number>} [inspectionIds] - The inspection IDs which the workorder should be linked to.\n * @param {Array<number>} [requestIds] - The inspection IDs which the workorder should be linked to.\n * @return {Object} Returns Promise that represents an object describing the newly-created workorder\n */\n create(wo_data: Object, inspectionIds?: Array<number>, requestIds?: Array<number>) {\n return new Promise((resolve, reject) => {\n if(!_.has(wo_data, 'WOTemplateId') || !_.has(wo_data, 'EntityType')) {\n reject(new CWError(2, 'WOTemplateId & EntityType must be provided.', {'provided': wo_data}))\n } else {\n var data = wo_data;\n if(typeof inspectionIds != 'undefined' && inspectionIds != null && !_.has(data, 'InspectionIds')) {\n _.set(data, 'InspectionIds', inspectionIds);\n }\n if(typeof requestIds != 'undefined' && requestIds != null && !_.has(data, 'RequestIds')) {\n _.set(data, 'RequestIds', requestIds);\n }\n this.cw.runRequest('Ams/WorkOrder/Create', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Create new workorder linked to parent workorder\n *\n * @category WorkOrders\n * @param {Object} wo_data - See /{subdirectory}/apidocs/#/data-type-infodataType=WorkOrder on the Cityworks instance\n * @param {string|number} workOrderSId - The workorder S/ID which the entities should be added to. # for SID, string for ID.\n * @return {Object} Returns Promise that represents an object describing the newly-created workorder\n */\n createFromParent(wo_data: Object, workOrderSId: string|number, s: boolean = true) {\n return new Promise((resolve, reject) => {\n if(!_.has(wo_data, 'WOTemplateId') || !_.has(wo_data, 'EntityType')) {\n reject(new CWError(2, 'WOTemplateId & EntityType must be provided.', {'provided': wo_data}))\n } else {\n var data = wo_data;\n if(_.isString(workOrderSId)) {\n _.set(data, 'WorkOrderId', workOrderSId)\n } else {\n _.set(data, 'WorkOrderSid', workOrderSId)\n }\n this.cw.runRequest('Ams/WorkOrder/Create', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Update a WorkOrder\n *\n * @category WorkOrders\n * @param {object} wo_data - See /{subdirectory}/apidocs/#/data-type-infodataType=WorkOrder on the Cityworks instance\n * @return {Object} Returns Promise that represents an object describing the updated workorder\n */\n update(wo_data: Object) {\n return new Promise((resolve, reject) => {\n if(!_.has(wo_data, 'WorkOrderSid') && !_.has(wo_data, 'WorkOrderId')) {\n reject(new CWError(3, 'WorkOrderId or WorkOrderSid must be provided.', {'provided': wo_data}))\n } else {\n this.cw.runRequest('Ams/WorkOrder/Update', wo_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Combine WorkOrders\n *\n * @category WorkOrders\n * @param {Array<string>} fromWorkOrderIds - The workorder IDs which should be combined.\n * @param {string} toWorkOrderId - The WorkOrder ID for the single WorkOrder that should contain the info/entities from the other WorkOrders\n * @param {boolean} cancelCombinedWorkOrders - If the WorkOrders combined into the single should then be canceled, default is true.\n * @return {Object} Returns object that represents a collection of WorkOrders\n */\n combine(fromWorkOrderIds: Array<string>, toWorkOrderId: string, cancelCombinedWorkOrders: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = {\n CancelCombinedWorkOrders: cancelCombinedWorkOrders,\n ToWorkOrderId: toWorkOrderId,\n FromWorkOrderIds: fromWorkOrderIds\n }\n this.cw.runRequest('Ams/WorkOrder/Combine', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n\n /**\n * Move a workorder's point\n *\n * @category WorkOrders\n * @param {string} workOrderId\n * @param {number} x\n * @param {number} y\n * @param {Object} projection - Should include WKT or WKID attribute. Can also include VcsWKID attribute.\n * @param {number} [z] - Optional Z coordinate\n * @return {Object} Returns Promise that represents an object describing the updated workorder\n */\n move(workOrderId: string, x: number, y: number, projection: Object, z?: number) {\n return new Promise((resolve, reject) => {\n if(!_.has(projection, 'WKID') && !_.has(projection, 'WKT')) {\n // Throw error\n reject(new CWError(6, 'You must provide either the WKID or WKT for the x/y coordinates.', {'projection': projection}))\n }\n var base_data = {\n WorkOrderId: workOrderId,\n X: x,\n Y: y\n };\n if(typeof(z)!='undefined') {\n _.set(base_data, 'z', z)\n }\n var data = _.merge(base_data, projection);\n this.cw.runRequest('Ams/WorkOrder/Move', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n });\n }\n\n /**\n * Get a workorder by S/ID\n *\n * @category WorkOrders\n * @param {string|number} workOrderSId - The S/ID of the workorder to retrieve. # for SID, string for ID.\n * @param {boolean} s - Whether first argument is an SID (true) or an ID (false). Defaults to true.\n * @return {Object} Returns Promise that represents an object describing the workorder\n */\n getById(workOrderSId: string|number, s: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = {}\n if(_.isString(workOrderSId)) {\n _.set(data, 'WorkOrderId', workOrderSId)\n var path = 'Ams/WorkOrder/ById';\n } else {\n _.set(data, 'WorkOrderSid', workOrderSId)\n var path = 'Ams/WorkOrder/BySid';\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get workorders by an array of S/IDs\n *\n * @category WorkOrders\n * @param {Array<string|number>} workOrderSIds - The workorder S/IDs to retrieve. If providing WorkOrderID, should be all strings, else provide all numbers for WorkOrderSID\n * @return {Object} Returns Promise that represents a collection of Objects describing the workorders\n */\n getByIds(workOrderSIds: Array<string|number>) {\n return new Promise((resolve, reject) => {\n var data = {}\n if(workOrderSIds.length==0) {\n // throw error\n reject(new CWError(101, 'No workorder S/IDs were provided.', {'workorderSId': workOrderSIds}))\n } else {\n var path = 'Ams/WorkOrder/ByIds';\n if(_.isString(workOrderSIds[0])) {\n _.set(data, 'WorkOrderIds', workOrderSIds)\n path = 'Ams/WorkOrder/ByIds';\n } else if(_.isNumber(workOrderSIds[0])) {\n _.set(data, 'WorkOrderSids', workOrderSIds)\n path = 'Ams/WorkOrder/BySids';\n } else {\n // throw error - was not number or string\n reject(new CWError(9, 'No workorder S/IDs were provided.', {'workorderSId': workOrderSIds}))\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Get instructions by an array of workorders S/IDs\n *\n * @category WorkOrders\n * @param {Array<string|number>} workOrderSIds - The workorder S/IDs to retrieve. If providing WorkOrderID, should be all strings, else provide all numbers for WorkOrderSID\n * @return {Object} Returns Promise that represents an array of String, String describing the workorder instructions\n */\n getInstructions(workOrderSIds: Array<string|number>) {\n return new Promise((resolve, reject) => {\n var data = {}\n if(workOrderSIds.length==0) {\n // throw error\n reject(new CWError(102, 'No workorder S/IDs were provided.', {'workorderSId': workOrderSIds}))\n } else {\n var path = 'Ams/WorkOrder/ByIds';\n if(_.isString(workOrderSIds[0])) {\n _.set(data, 'WorkOrderIds', workOrderSIds)\n path = 'Ams/WorkOrder/InstructionsByWorkOrderIds';\n } else if(_.isNumber(workOrderSIds[0])) {\n _.set(data, 'WorkOrderSids', workOrderSIds)\n path = 'Ams/WorkOrder/InstructionsByWorkOrderSids';\n } else {\n // throw error - was not number or string\n reject(new CWError(9, 'No workorder S/IDs were provided.', {'workorderSId': workOrderSIds}))\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Get the audit log for a specific workorder\n *\n * @category WorkOrders\n * @param {number} workOrderSId - A WorkOrder S/ID to get the audit log for. SID is default.\n * @return {Object} Returns Promise that represents a collection of Cityworks Metadata Objects\n */\n getAuditLog(workOrderSId: number) {\n return new Promise((resolve, reject) => {\n var data = {}\n if(_.isString(workOrderSId)) {\n _.set(data, 'WorkOrderId', workOrderSId)\n } else if(_.isNumber(workOrderSId)) {\n _.set(data, 'WorkOrderSid', workOrderSId)\n } else {\n // throw error - was not number or string\n reject(new CWError(9, 'Workorder S/IDs was not provided.', {'workorderSId': workOrderSId}))\n }\n this.cw.runRequest('Ams/WorkOrder/AuditLog', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get custom field values for the workorder S/IDs\n *\n * @category WorkOrders\n * @param {Array<string|number>} workOrderSIds - The workorder S/IDs to retrieve. #s for SID, strings for ID.\n * @return {Object} Returns Promise that represents a collection of Objects describing the workorders\n */\n getCustomFieldValues(workOrderSIds: Array<string|number>) {\n return new Promise((resolve, reject) => {\n var data = {}\n var path = 'Ams/WorkOrder/CustomFields';\n if(_.isString(workOrderSIds[0])) {\n _.set(data, 'WorkOrderIds', workOrderSIds)\n var path = 'Ams/WorkOrder/CustomFields';\n } else if(_.isNumber(workOrderSIds[0])) {\n _.set(data, 'WorkOrderSids', workOrderSIds)\n var path = 'Ams/WorkOrder/CustomFieldsByWorkOrderSids';\n } else {\n // throw error - was not number or string\n reject(new CWError(9, 'No workorder S/IDs were provided.', {'workorderSIds': workOrderSIds}))\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get entities on an existing WorkOrder\n *\n * @category WorkOrders\n * @param {Array<string|number>} workOrderSIds - The workorder S/IDs which the entities should be added to. # for SID, string for ID.\n * @param {boolean} getGisData - Query gis to populate Entity.Attributes with current gis data. Defaults to true.\n * @return {Object} Returns object that represents a list of entities removed.\n */\n getEntities(workOrderSIds: Array<string|number>, getGisData: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = {\n GetGisData: getGisData\n }\n if(workOrderSIds.length==0) {\n // throw error\n reject(new CWError(11, 'No workorder S/IDs were provided.', {'workorderSId': workOrderSIds}))\n } else {\n if(_.isString(workOrderSIds[0])) {\n _.set(data, 'WorkOrderIds', workOrderSIds)\n } else if(_.isNumber(workOrderSIds[0])) {\n _.set(data, 'WorkOrderSids', workOrderSIds)\n } else {\n reject(new CWError(12, 'No workorder S/IDs were provided.', {'workorderSId': workOrderSIds}))\n }\n }\n this.cw.runRequest('Ams/WorkOrder/Entities', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add entities to an existing WorkOrder\n *\n * @category WorkOrders\n * @param {string|number} workOrderSId - The workorder S/ID which the entities should be added to. # for SID, string for ID.\n * @param {Object} entityInfo - Entity info object including: (req) EntityType: {string}, (req) EntityUids: {Array<string>}, Facility_Id: {string}, Level_Id: {string}\n * @param {boolean} updateXY - Update WorkOrder xy after adding entit(y|ies), default is true.\n * @return {Object} Returns object that represents a list of entities removed.\n */\n addEntities(workOrderSId: string|number, entityInfo: Object, updateXY: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = {\n UpdateXY: updateXY\n }\n if(_.isString(workOrderSId)) {\n _.set(data, 'WorkOrderId', workOrderSId)\n } else {\n _.set(data, 'WorkOrderSid', workOrderSId)\n }\n if(_.has(entityInfo, 'Facility_Id'))\n _.set(data, 'Facility_Id', _.get(entityInfo, 'Facility_Id'))\n if(_.has(entityInfo, 'Level_Id'))\n _.set(data, 'Level_Id', _.get(entityInfo, 'Level_Id'))\n if(_.has(entityInfo, 'EntityUids') && _.has(entityInfo, 'EntityType')) {\n _.set(data, 'EntityUids', _.get(entityInfo, 'EntityUids'))\n _.set(data, 'EntityType', _.get(entityInfo, 'EntityType'))\n } else {\n reject(new CWError(7, 'No entity info was provided.', {'workorderSId': workOrderSId,'entityInfo': entityInfo}))\n }\n\n this.cw.runRequest('Ams/WorkOrder/AddEntities', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update a WorkOrder entity\n *\n * @category WorkOrders\n * @param {string|number} workOrderSId - The workorder S/ID which the entities should be added to. # for SID, string for ID.\n * @param {Object} entityInfo - Entity info object including: (req) EntityType: {string}, (req) EntityUid: {string}, Facility_Id: {string}, Level_Id: {string}\n * @param {boolean} workComplete - Update WorkOrder completeness, default is true.\n * @return {Object} Returns object that represents a list of entities removed.\n */\n updateEntity(workOrderSId: string|number, entityInfo: Object, workComplete: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkComplete: workComplete\n }\n if(_.isString(workOrderSId)) {\n _.set(data, 'WorkOrderId', workOrderSId)\n } else {\n _.set(data, 'WorkOrderSid', workOrderSId)\n }\n if(_.has(entityInfo, 'Facility_Id'))\n _.set(data, 'Facility_Id', _.get(entityInfo, 'Facility_Id'))\n if(_.has(entityInfo, 'Level_Id'))\n _.set(data, 'Level_Id', _.get(entityInfo, 'Level_Id'))\n if(_.has(entityInfo, 'EntityUids') && _.has(entityInfo, 'EntityType')) {\n _.set(data, 'EntityUid', _.get(entityInfo, 'EntityUid'))\n _.set(data, 'EntityType', _.get(entityInfo, 'EntityType'))\n } else {\n reject(new CWError(7, 'No entity info was provided.', {'workorderSId': workOrderSId,'entityInfo': entityInfo}))\n }\n\n this.cw.runRequest('Ams/WorkOrder/UpdateEntity', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Remove entities from a WorkOrder. Provide WorkOrderId and either ObjectIds or EntityType and EntityUids\n *\n * @category WorkOrders\n * @param {number} workOrderSId - The workorder S/ID which the entities should be removed from. # for SID, string for ID.\n * @param {Object} entityInfo - Remove entities by WorkOrderEntity.ObjectId (not gis objectId).\n * @param {boolean} updateXY - Update WorkOrder xy after removing entities, default is true.\n * @return {Object} Returns object that represents a list of entities removed.\n */\n removeEntities(workOrderSId: string|number, entityInfo: Object, updateXY: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = {\n UpdateXY: updateXY\n }\n if(_.isString(workOrderSId)) {\n _.set(data, 'WorkOrderId', workOrderSId)\n } else {\n _.set(data, 'WorkOrderSid', workOrderSId)\n }\n if(_.has(entityInfo, 'ObjectIds')) {\n _.set(data, 'ObjectIds', _.get(entityInfo, 'ObjectIds'))\n } else if(_.has(entityInfo, 'EntityUids') && _.has(entityInfo, 'EntityType')) {\n _.set(data, 'EntityUids', _.get(entityInfo, 'EntityUids'))\n _.set(data, 'EntityType', _.get(entityInfo, 'EntityType'))\n } else {\n reject(new CWError(8, 'No entity info was provided.', {'workorderSId': workOrderSId,'entityInfo': entityInfo}))\n }\n\n this.cw.runRequest('Ams/WorkOrder/RemoveEntities', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Cancel workorders\n *\n * @category WorkOrders\n * @param {Array<number>} workOrderIds - An array of the IDs to cancel the matched workorders\n * @param {string} [cancelReason] - A reason for cancelling the workorder(s)\n * @param {datetime} [dateCancelled] - The date/time that it should be indicated the workorder was cancelled\n * @return {Object} Returns object that represents a collection of workorders\n */\n cancel(workOrderIds: Array<number>, cancelReason?: string, dateCancelled?: Date) {\n return new Promise((resolve, reject) => {\n var m = new Date()\n var data: {WorkOrderIds: Array<number>, CancelReason?: string, DateCancelled?: Date} = { WorkOrderIds: workOrderIds }\n if(typeof(cancelReason)!=='undefined')\n _.set(data, 'CancelReason', cancelReason);\n if(typeof(dateCancelled)!=='undefined')\n _.set(data, 'DateCancelled', dateCancelled);\n this.cw.runRequest('Ams/WorkOrder/Cancel', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Uncancel workorders\n *\n * @category WorkOrders\n * @param {Array<number>} workOrderIds - An array of the IDs to uncancel the matched workorders\n * @return {Object} Returns object that represents a collection of workorders\n */\n uncancel(workOrderIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderIds: workOrderIds\n }\n this.cw.runRequest('Ams/WorkOrder/Uncancel', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Close WorkOrders\n *\n * @category WorkOrders\n * @param {Array<number>} workOrderIds - An array of the IDs to close the matched WorkOrders\n * @return {Object} Returns object that represents a collection of WorkOrders\n */\n close(workOrderIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderIds: workOrderIds\n }\n this.cw.runRequest('Ams/WorkOrder/Close', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(5, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Reopen closed WorkOrders\n *\n * @category WorkOrders\n * @param {Array<number>} workOrderIds - An array of the IDs to reopen the matched WorkOrders\n * @return {Object} Returns object that represents a collection of WorkOrders\n */\n reopen(workOrderIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderIds: workOrderIds\n }\n this.cw.runRequest('Ams/WorkOrder/ReOpen', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete WorkOrders\n *\n * @category WorkOrders\n * @param {Array<number>} workOrderIds - An array of the IDs to delete the matched WorkOrders\n * @return {Object} Returns object that represents a collection of WorkOrder Ids which have been deleted\n */\n delete(workOrderIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderIds: workOrderIds\n }\n this.cw.runRequest('Ams/WorkOrder/Delete', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get WorkOrderS/IDs connected to provided entities\n *\n * @category WorkOrder Search\n * @param {string} entityType - The entity type to find connected WorkOrders\n * @param {Array<string>} entityUIDs - The list of entities to search for connected WorkOrders\n * @param {boolean} s - Get WorkOrderSids. Defaults to true. When false, returned list is WorkOrderIds\n * @param {Object} [search] - Any additional search properties of the WorkOrder (open/closed, etc)\n * @return {Object} Returns Promise that represents an array of WorkOrderS/IDs\n */\n getWOsByEntities(entityType: string, entityUids: Array<string>, search?: Array<string|number>, s: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = {}\n if(typeof(search)!='undefined') {\n _.merge(data, search)\n }\n if(!_.has(data, 'EntityType')) {\n _.set(data, 'EntityType', entityType)\n }\n if(!_.has(data, 'EntityUids')) {\n _.set(data, 'EntityUids', entityUids)\n }\n var path = 'Ams/WorkOrder/SearchForSids'\n if(!s) {\n path = 'Ams/WorkOrder/Search'\n }\n this.cw.runRequest(path, data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get WorkOrderSid and description for provided WorkOrderId\n *\n * @category WorkOrder Search\n * @param {string} workOrderId - The WorkOrderId for which to get the WorkOrderSid and description\n * @return {Object} Returns Promise that represents an object with WorkOrderS/IDs & Description\n */\n getSearchList(workOrderId: string) {\n return new Promise((resolve, reject) => {\n var data = {}\n _.set(data, 'WorkOrderId', workOrderId)\n this.cw.runRequest('Ams/WorkOrder/SearchObject', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get WorkOrder Employee lists\n *\n * @category WorkOrder Options\n * @param {string} listType - Which list (endpoint) to get. Includes Supervisors & SubmitTos.\n * @param {boolean} includeInactiveEmployees - Whether to include inactive employees in the returned list. Defaults to false.\n * @param {Array<number>} [domainIds] - Filter to certain domains within the Cityworks instance.\n * @return {Object} Returns Promise that represents a collection of employees. See: /{subdirectory}/apidocs/#/data-type-info;dataType=EmployeeNameId\n */\n getEmployeeLists(listType: string, includeInactiveEmployees: boolean = false, domainIds?: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n IncludeInactiveEmployees: includeInactiveEmployees\n }\n if(typeof(domainIds)!='undefined' && domainIds!=null) {\n _.set(data, 'DomainIds', domainIds)\n }\n if(!_.includes(['Supervisors', 'SubmitTos'], listType)) {\n reject(new CWError(2, 'listType must be either SubmitTos or Supervisors.', {'provided': listType}))\n } else {\n this.cw.runRequest(`Ams/WorkOrder/${listType}`, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Get SubmitTo list\n *\n * @category WorkOrder Options\n * @param {boolean} includeInactiveEmployees - Whether to include inactive employees in the returned list. Defaults to false.\n * @param {Array<number>} [domainIds] - Filter to certain domains within the Cityworks instance.\n * @return {Object} Returns Promise that represents a collection of employees. See: /{subdirectory}/apidocs/#/data-type-info;dataType=EmployeeNameId\n */\n getSubmitTos(includeInactiveEmployees: boolean = false, domainIds?: Array<number>) {\n return this.getEmployeeLists('SubmitTos', includeInactiveEmployees, domainIds);\n }\n\n /**\n * Get Supervisors list\n *\n * @category WorkOrder Options\n * @param {boolean} includeInactiveEmployees - Whether to include inactive employees in the returned list. Defaults to false.\n * @param {Array<number>} [domainIds] - Filter to certain domains within the Cityworks instance.\n * @return {Object} Returns Promise that represents a collection of employees. See: /{subdirectory}/apidocs/#/data-type-info;dataType=EmployeeNameId\n */\n getSupervisors(includeInactiveEmployees: boolean = false, domainIds?: Array<number>) {\n return this.getEmployeeLists('Supervisors', includeInactiveEmployees, domainIds);\n }\n\n /**\n * Get Status Options\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents a collection of codes. See: /{subdirectory}/apidocs/#/data-type-info;dataType=CodeDesc\n */\n getStatuses() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/Statuses', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Categories\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents an array of configured workorder category code descriptions\n */\n getCategories() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/Categories', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Priorities\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents an array of configured workorder priorities\n */\n getPriorities() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/Priorities', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Cycle From\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents an array of string/string Cycle From options for workorders\n */\n getCycleFrom() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/CycleFrom', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Cycle Intervals\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents an array of string/string Cycle Interval options for workorders\n */\n getCycleIntervals() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/CycleIntervals', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Cycle Types\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents an array of string/string Cycle Type options for workorders\n */\n getCycleTypes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/CycleTypes', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get WorkOrder Stages\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents an array of string/string Stage options for WorkOrders\n */\n getStages() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/Stages', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Expense Types\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents an array of string/string Expense Type options for workorders\n */\n getExpenseTypes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/ExpenseTypes', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Map Layer Fields\n *\n * @category WorkOrders\n * @param {string} workOrderSId - The workorder S/ID to get the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the workorders\n */\n getMLFs(workOrderSId: string) { // |number\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderId: workOrderSId\n }\n var path = 'Ams/TemplateMapLayer/WorkOrderInstanceMapLayersByWorkOrderId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Map Layer Fields\n *\n * @category WorkOrders\n * @param {string|number} workOrderSId - The workorder S/ID to get the map layer fields for.\n * @param {Coords} coordinates - Object with X, Y, and optional Z coordinate specified.\n * @param {number} woTemplateId - Optional. Work Order's Template ID. If provided, the map layer fields will be updated from the work order template otherwise, only existing updated.\n * @param {number} domainId - Optional. Domain ID of org\n * @return {Object} Returns Promise that represents an object with all the updated GIS info for the workorder, including a collection of the updated map layer fields\n */\n updateMLFs(workOrderSId: string|number, coordinates: Coordinates, woTemplateId?: number, domainId?: number) {\n // TODO: make an optional attrs array and accept the others\n // TODO: make it toggle to not/use ByTemplate\n return new Promise((resolve, reject) => {\n var data = _.merge({}, coordinates)\n if(_.isNumber(woTemplateId)) {\n var path = 'Ams/TemplateMapLayer/UpdateWorkOrderInstanceMapLayersByTemplate'\n _.set(data, 'WoTemplateId', woTemplateId)\n } else\n var path = 'Ams/TemplateMapLayer/UpdateWorkOrderInstanceMapLayersByWorkOrderId'\n\n if(_.isString(workOrderSId)) {\n _.set(data, 'WorkOrderId', workOrderSId)\n } else if(_.isNumber(workOrderSId)) {\n _.set(data, 'WorkOrderSid', workOrderSId)\n } else {\n // throw error - was not number or string\n reject(new CWError(9, 'No workorder S/ID was provided.', {'workorderSId': workOrderSId}))\n }\n if(_.isNumber(domainId)) {\n _.set(data, 'DomainId', domainId)\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Map Layer Fields\n *\n * @category WorkOrders\n * @param {string} workOrderSId - The workorder S/ID to delete the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the workorders\n */\n deleteMLFs(workOrderSId: string) { // |number\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderId: workOrderSId\n }\n var path = 'Ams/TemplateMapLayer/DeleteWorkOrderInstancesByWorkOrderId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\nconst querystring = require('querystring')\nconst fs = require('fs')\nimport * as https from 'https'\n\nimport { CaseData } from './case_data'\nimport { CaseFinancial } from './case_financial'\nimport { CaseWorkflow} from './case_workflow'\nimport { CaseAdmin } from './case_admin'\nimport { Comments } from './comments'\nimport { CaseAssets } from './case_assets'\nimport { CaseFlags } from './case_flags'\n\nexport interface Briefcase {\n TempTableName: string\n AnonymousFlag: string\n RegisteredFlag: string\n CreatedByLoginId: string\n TableName: string\n ModifiedByLoginId: number\n AcceptedByLoginId: number\n EnteredByLoginid: number\n WorkOrderId: string\n WorkOrderDesc: string\n WorkOrderStatus: string\n ServiceRequestId: number\n ServiceRequestDesc: string\n ServiceRequestStatus: string\n CloneCaseRelation: any|null\n PendingFlag: any|null\n CaseGroup: any|null\n ParentCaObjectId: number|null\n AmountDue: number|null\n GetViewColumns: Array<string>\n CaObjectId: number\n OrgId: number\n CaseTypeId: number\n CaseType: string\n CaseTypeDesc: string\n BusCaseDesc: string|null\n SubTypeId: number|null\n SubType: string|null\n SubTypeDesc: string|null\n CreatedBy: number\n DateAccepted: Date|null\n DateCreated: Date\n DateEntered: Date\n DateExpiration: Date|null\n DateIssued: Date|null\n DateModified: Date|null\n EnteredBy: number\n ExpiredFlag: string|null\n IssuedBy: number|null\n IssuedFlag: string|null\n ModifiedBy: number|null\n SubTypeDefaultText: string|null\n CaseNumber: string\n CaseStatusId: number\n CaseStatus: string\n ProjectSid: number|null\n ProjectId: string|null\n ProjectCode: string|null\n ProjectDesc: string|null\n PriorityLevel: string|null\n StatusCode: string\n CaseName: string\n AcceptedBy: number\n BLicenseFlag: string|null\n BusinessName: string|null\n BusCaseId: number|null\n BusinessOrgType: string|null\n BusinessCategory: string|null\n StateTaxId: string|null\n FedTaxId: string|null\n Location: string|null\n PACaseFlag: string|null\n ActiveFlag: string|null\n CX: number|null\n CY: number|null\n CZ: number|null\n AssignedTo: number|null\n AssignedToLoginId: string|null\n AssignedToFirstName: string|null\n AssignedToLastName: string|null\n Facility_Id: string|number|null\n Level_Id: string|number|null\n}\n\nexport class Briefcase {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n current_case: number = 0\n\n /**\n * Data Detail methods\n */\n data?: any\n /**\n * Asset (Address) methods\n */\n asset?: any\n /**\n * Flag methods\n */\n flag?: any\n /**\n * Asset (Address) methods\n */\n attachments?: any\n /**\n * Workflow & task methods\n */\n workflow?: any\n /**\n * Payment, Receipt, & Fee methods\n */\n financial?: any\n /**\n * Commenting methods\n */\n comment?: any\n /**\n * Payment, Receipt, & Fee methods\n */\n people?: any\n /**\n * PLL Administration methods\n */\n admin?: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n // What is this?\n // Pll/CustomColumnsDetail/GetListForAdd\n\n /**\n * Get Required items for case by case template id (BusCaseId)\n *\n * @category Cases\n * @param {number} busCaseId - The case tmeplate ID (BusCaseId)\n * @return {Object} Returns Promise that represents a collection of objects describing the requirements of the case template\n */\n getRequirements(busCaseId: number): Promise<Briefcase> {\n return new Promise((resolve, reject) => {\n var data = {\n BusCaseId: busCaseId\n }\n this.cw.runRequest('Pll/CaseReqItems/GetByBusCaseId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n \n /**\n * Create new case\n *\n * @category Cases\n * @param {number} caseTypeId - The case Type ID\n * @param {number} subTypeId - The case subType ID\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/data-type-info;dataType=CaObjectItemBase\n * @return {Object} Returns Promise that represents an object describing the newly-created case\n */\n create(caseTypeId: number, subTypeId: number, options?: Object): Promise<Briefcase> {\n return new Promise((resolve, reject) => {\n var data_init = {\n CaseTypeId: caseTypeId,\n SubTypeId: subTypeId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/Case/Create', data).then(r => {\n this.current_case = r.Value.CaObjectId\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Create a child case\n *\n * @category Cases\n * @param {number} busCaseId - The case Type ID\n * @param {number} parentCaObjectId - The case subType ID\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/data-type-info;dataType=CaObjectItemBase\n * @return {Object} Returns Promise that represents an object describing the newly-created case\n */\n createChild(busCaseId: number, parentCaObjectId: number, options?: Object): Promise<Briefcase> {\n return new Promise((resolve, reject) => {\n var data_init = {\n BusCaseId: busCaseId,\n ParentCaObjectId: parentCaObjectId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/Case/CreateChild', data).then(r => {\n this.current_case = r.Value.CaObjectId\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Create a case from a Service Request\n *\n * @category Cases\n * @param {number} caseTypeId - The case Type ID\n * @param {number} subTypeId - The case subType ID\n * @param {number} requestId - The service request ID\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/data-type-info;dataType=CaObjectItemBase\n * @return {Object} Returns Promise that represents an object describing the newly-created case\n */\n createFromRequest(caseTypeId: number, subTypeId: number, requestId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n CaseTypeId: caseTypeId,\n SubTypeId: subTypeId,\n ServiceRequestId: requestId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/CaseObject/CreateCaseFromServiceRequest', data).then(r => {\n this.current_case = r.Value.CaObjectId\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update a case\n *\n * @category Cases\n * @param {number} caObjectId - The case Object ID to update\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/data-type-info;dataType=CaObjectItemBase\n * @return {Object} Returns Promise that represents an object describing the updated case\n */\n update(caObjectId: number, options?: Object): Promise<Briefcase> {\n return new Promise((resolve, reject) => {\n var data_init = {\n CaObjectId: caObjectId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/CaseObject/Update', data).then(r => {\n this.current_case = r.Value.CaObjectId\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get case by ID\n *\n * @category Cases\n * @param {number} caObjectId - The case Object ID to get\n * @return {Object} Returns Promise that represents an object describing the case\n */\n getById(caObjectId: number): Promise<Briefcase> {\n return new Promise((resolve, reject) => {\n this.getByIds([caObjectId]).then(r => {\n resolve(r[0])\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get cases by IDs\n *\n * @category Cases\n * @param {Array<number>} caObjectIds - The case Object IDs to get\n * @return {Object} Returns Promise that represents a collection of objects describing the cases\n */\n getByIds(caObjectIds: Array<number>): Promise<Array<Briefcase>> {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectIds: caObjectIds\n }\n this.cw.runRequest('Pll/CaseObject/ByIds', data).then(r => {\n if(r.Value.length == 1) {\n this.current_case = r.Value[0]\n }\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Cases. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Cases\n * @param {Object} filters - The parameter(s) to search by\n * @return {Object} Returns Promise that represents an Array of case Object IDs\n */\n search(filters: Object): Promise<Array<number>> {\n return new Promise((resolve, reject) => {\n var data = filters\n this.cw.runRequest('Pll/CaseObject/Search', data).then(r => {\n if(r.Value.length == 1) {\n this.current_case = r.Value[0].CaObjectId\n }\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Move a Case point\n *\n * @category Cases\n * @param {string} caObjectId\n * @param {number} x\n * @param {number} y\n * @param {Object} projection - Should include at least WKT _or_ WKID attribute. Can also include VcsWKID attribute.\n * @param {number} [z] - Optional Z coordinate\n * @return {Object} Returns Promise that represents an object describing the updated GISPoint\n */\n move(caObjectId: number, x: number, y: number, projection: {WKID?: string, WKT?: string, VcsWKID?: string}, z?: number) {\n return new Promise((resolve, reject) => {\n if(!_.has(projection, 'WKID') && !_.has(projection, 'WKT')) {\n // Throw error\n reject(new CWError(1, 'You must provide either the WKID or WKT for the x/y coordinates.', {'projection': projection}))\n }\n var data_init = {\n CaObjectId: caObjectId,\n X: x,\n Y: y\n };\n if(typeof(z)!='undefined') {\n _.set(data_init, 'Z', z)\n }\n var data = _.merge(data_init, projection);\n this.cw.runRequest('Pll/CaseObject/Move', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete case\n *\n * @category Cases\n * @param {number} caObjectId - The case Object ID\n * @return {Object} Returns Promise that represents an object describing the deleted case\n */\n delete(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseObject/DeleteCase', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Map Layer Fields\n *\n * @category Cases\n * @param {number} caObjectId - The case object ID to get the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the case object map layer fields\n */\n getMLFs(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n var path = 'Ams/TemplateMapLayer/CaseInstanceMapLayersByCaObjectId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Map Layer Fields\n *\n * @category Cases\n * @param {number} caObjectId - The case object ID to get the map layer fields for.\n * @param {number} x\n * @param {number} y\n * @param {number} domainId - The domain ID for the case in question\n * @param {number} [z] - Optional Z coordinate\n * @return {Object} Returns Promise that represents a collection of Objects describing the case object map layer fields\n */\n updateMLFs(caObjectId: number, x?: number, y?: number, domainId?: number, z?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n var path = 'Ams/TemplateMapLayer/UpdateCaseInstanceMapLayers';\n \n if(_.isNumber(x)) {\n _.set(data, 'X', x)\n }\n if(_.isNumber(y)) {\n _.set(data, 'Y', y)\n }\n if(_.isNumber(z)) {\n _.set(data, 'Z', z)\n }\n if(_.isNumber(domainId)) {\n _.set(data, 'DomainId', domainId)\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Map Layer Fields\n *\n * @category Cases\n * @param {number} caObjectId - The case object ID to delete the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the case object map layer fields deleted\n */\n deleteMLFs(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n var path = 'Ams/TemplateMapLayer/DeleteCaseInstanceMapLayersByCaObjectId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Reports available for Case\n *\n * @category Cases\n * @param {number} caObjectId - The case object ID to get the report (print template) list for\n * @return {Object} Returns Promise that represents a collection of Objects describing the reports (print templates) available for this case\n */\n getPrintTemplates(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n var path = 'Pll/BusinessCaseReports/ByCaObjectId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Print Case\n *\n * @category Cases\n * @param {number} caObjectId - The case object ID to delete the map layer fields for.\n * @param {string} fileName - the filename of the report from the getPrintTemplates method, but w/out the extension\n * @return {Object} Returns Promise that represents a collection of Objects describing the case object map layer fields deleted\n */\n print(caObjectId: number, fileName: string, callback: any) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n FileName: fileName\n }\n var path = 'Pll/BusinessCaseReports/Download'\n var options = this.cw.getRequestOptions(path, 'GET')\n console.log(options)\n\n var file_extension = `pdf`\n console.log(__dirname + fileName + '.' + file_extension)\n const file = fs.createWriteStream(__dirname.replace('/dist', '/downloads') + '/' + fileName + '.' + file_extension)\n\n var request_url = 'https://'+options.hostname + options.path + '?data=' + JSON.stringify(data) + '&Token=' + this.cw.getToken()\n // TODO: test the Filename to make sure it's in the File list from getPrintTemplates (or let the API just error?)\n https.get(request_url, {timeout: 10000000}, (res) => {\n res.on('data', (d) => {\n file.write(d);\n });\n \n res.on('end', () => {\n file.close(callback('Success'))\n })\n }).on('error', (e) => {\n file.close(callback('Failure'));\n console.error(e);\n });\n })\n }\n\n /**\n * Get the configured zip codes for the install\n *\n * @category Cases\n * @return {Object} Returns Promise that represents a collection of zip codes configured for the install\n */\n getZips() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Pll/Zip/GetAll', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the configured states for the install\n *\n * @category Cases\n * @return {Object} Returns Promise that represents a collection of states configured for the install\n */\n getStates() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Pll/State/GetList', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the configured countries for the install\n *\n * @category Cases\n * @return {Object} Returns Promise that represents a collection of countries configured for the install\n */\n getCountries() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Pll/Country/GetAll', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n // importCase(caseTypeId: number, subTypeId: number, caseName: string, location: string, x: number, y:number, appData: object, comment: string, expiration: string, assetIds: object) {\n // return new Promise(resolve => {\n // const _this = this;\n // let case_data = {CaseName:caseName, Location:location, DateExpiration: expiration, X:x,Y:y}\n // this.create(caseTypeId, subTypeId, case_data).then((response: any) => {\n // if(response) {\n // if(typeof(response.CaObjectId)!='undefined') {\n // var CaObjectId = response.CaObjectId\n // if(typeof(comment) != 'undefined') {\n // _this.comments.add(CaObjectId, comment)\n // }\n // if(assetIds) {\n // _this.assets!.attach(CaObjectId, true, assetIds)\n // }\n // if(appData) {\n // _this.data!.getGroupsByCaseId(response.CaObjectId).then(response_one => {\n // // loop through all groups\n // let data_details_items = []\n // _this.data!.caseDataGroupIterator(appData, response_one, data_details_items).then(di => {\n // _this.data!.caseDataDetailIterator(appData, di).then(resp => {\n // resolve(response)\n // })\n // })\n // })\n // } else {\n // resolve(response)\n // }\n // } else {\n // console.log('Error creating case: '+ JSON.stringify(case_data))\n // process.exit(0)\n // }\n // } else {\n // resolve(false)\n // }\n // })\n // })\n // }\n\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\nimport ReversibleMap from 'reversible-map'\n\nexport class CaseData {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Add Case Data Group\n *\n * @category Data Groups\n * @param {number} caObjectId - The Case Object to attach the data group to.\n * @param {number} caseDataGroupId - CaseDataGroupId as defined in CaseDataGroup admin.\n * @param {string} groupCode - The Group Code.\n * @param {Object} [options] - Options for CaseDataGroup including GroupDesc, GroupSum, and SumFlag\n * @return {Object} Returns Promise that represents an object describing CaDataGroupItemBase.\n */\n addGroup(caObjectId: number, caseDataGroupId: number, groupCode: string, options?: {GroupDesc?: string, GroupSum?: number, SumFlag?: string}) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n CaseDataGroupId: caseDataGroupId,\n GroupCode: groupCode\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseDataGroup/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Default Case Data Groups\n *\n * @category Data Groups\n * @param {number} caObjectId - The Case Object to attach the data group to.\n * @param {number} busCaseId - The business case ID\n * @return {Object} Returns Promise that represents a collection of the default CaDataGroupItemBases.\n */\n addDefaultGroups(caObjectId: number, busCaseId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n BusCaseId: busCaseId\n }\n this.cw.runRequest('Pll/CaseDataGroup/AddDefault', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds a data detail entry to the case data group specified by the CaDataGroupId. The CaDataGroupId is associated to a case.\n *\n * @category Data Groups\n * @param {number} caseDataDetailId - The Data Detail template ID\n * @param {number} caDataGroupId - The Case Instance Data Group ID\n * @param {string} columnSequence - The column sequence\n * @param {string} detailCode - The detail Code\n * @param {number} detailSequence - The detail order number\n * @param {Object} [options] - Other options for CaseDataDetail. See WIPAdd here: /{subdirectory}/apidocs/#/service-info/Pll/CaseDataDetail\n * @return {Object} Returns Promise that represents an object describing CaDataDetailItemBase.\n */\n wipAddDetail(caseDataDetailId: number, caDataGroupId: number, columnSequence: string, detailCode: string, detailSequence: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n CaseDataDetailId: caseDataDetailId,\n CaDataGroupId: caDataGroupId,\n ColumnSequence: columnSequence,\n DetailCode: detailCode,\n DetailSequence: detailSequence\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/CaseDataGroup/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get groups by CaObjectId\n *\n * @category Data Groups\n * @param {number} caseId - The Case Object to get the attached data groups.\n * @return {Object} Returns Promise that represents a collection of the CaDataGroupItemBases.\n */\n getGroupsByCaseId(caseId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caseId\n }\n this.cw.runRequest('Pll/CaseDataGroup/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Case Data Groups by Case Object ID.\n *\n * @category Data Groups\n * @param {number} caObjectId - The Case Object to attach the data group to.\n * @return {Object} Returns Promise that represents a number that is the CaObjectId (?)\n */\n deleteGroupsByCaseId(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseDataGroup/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Data Groups. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Data Groups\n * @param {Object} filters - The parameters to search by. (CaDataGroupId, CaseDataGroupId, GroupCode, GroupDesc, GroupSum, SumFlag)\n * @return {Object} Returns Promise that represents a number that is the CaObjectId (?)\n */\n searchForGroups(filters?: Object): Promise<Array<any>> {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaDataGroupId', 'CaseDataGroupId', 'GroupCode', 'GroupDesc', 'GroupSum', 'SumFlag']).length==0) {\n reject(new CWError(2, 'At least one of the attributes (CaDataGroupId, CaseDataGroupId, GroupCode, GroupDesc, GroupSum, SumFlag) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseDataGroup/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Case Data Groups by Case ObjectId\n *\n * @category Data Groups\n * @param {string} entityType - The entity type to check\n * @param {string} entityUid - The specific entityUID to check\n * @param {Object} options - The other options for checkGIS. Either CaObjectId or CaseDataGroupId is required.\n * @return {Object} Returns Promise that represents a collection of the default CaDataGroupItemBases.\n */\n checkGIS(entityType: string, entityUid: string, options: {CaObjectId?:number, CaseDataGroupId?: number, CaseDataDetailId?: number}) {\n return new Promise((resolve, reject) => {\n var data = {\n EntityType: entityType,\n EntityUid: entityUid\n }\n if(_.has(options, 'CaObjectId')) {\n _.set(data, 'CaObjectId', _.get(options, 'CaObjectId'))\n } else if(_.has(options, 'CaseDataGroupId')) {\n _.set(data, 'CaseDataGroupId', _.get(options, 'CaseDataGroupId'))\n } else {\n reject(new CWError(1, 'Either CaObjectId or CaseDataGroupId is required.', {'provided': options}))\n }\n if(_.has(options, 'CaseDataDetailId')) {\n _.set(data, 'CaseDataDetailId', _.get(options, 'CaseDataDetailId'))\n }\n this.cw.runRequest('Pll/CaseDataGroup/CheckGISChanges', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update data groups on a case based on asset value mappings.\n *\n * @category Data Groups\n * @param {number} caObjectId - The case to update\n * @param {string} entityType - The entity type to check\n * @param {string} entityUid - The specific entityUID to check\n * @param {number} [caDataGroupId] - The specific data group ID to limit updates to\n * @return {Object} Returns Promise that represents a collection of the default CaDataGroupItemBases.\n */\n updateGroupsFromAsset(caObjectId: number, entityType: string, entityUid: string, caDataGroupId?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n EntityType: entityType,\n EntityUid: entityUid\n }\n if(typeof(caDataGroupId)!='undefined') {\n _.set(data, 'CaDataGroupId', caDataGroupId)\n }\n this.cw.runRequest('Pll/CaseDataGroup/UpdateFromAsset', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Attach Case Data Detail\n *\n * @category Data Details\n * @param {number} caDataGroupId - The Case Data Group ID to attach the data detail to.\n * @param {number} caseDataDetailId - caseDataDetailId to attach.\n * @param {Object} [options] - Options\n * @return {Object} Returns Promise that represents an object describing CaDataGroupItemBase.\n */\n addDetail(caDataGroupId: number, caseDataDetailId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n CaDataGroupId: caDataGroupId,\n CaseDataDetailId: caseDataDetailId\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseDataDetail/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Case Data Detail\n *\n * @category Data Details\n * @param {number} caDataDetailId - The Case Data Group ID to attach the data detail to.\n * @param {Object} [options] - Options\n * @return {Object} Returns Promise that represents an object describing CaDataGroupItemBase.\n */\n updateDetail(caDataDetailId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n CaDataDetailId: caDataDetailId\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseDataDetail/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Lock Case Data Detail\n *\n * @category Data Details\n * @param {number} caDataDetailId - The Case Data Detail ID to lock\n * @return {Object} Returns Promise which represents an object describing the CaDataDetailItem.\n */\n lockDetail(caDataDetailId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaDataDetailId: caDataDetailId,\n Lock: true\n }\n this.cw.runRequest('Pll/CaseDataDetail/UpdateLock', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Unlock Case Data Detail\n *\n * @category Data Details\n * @param {number} caDataDetailId - The Case Data Group ID to unlock\n * @return {Object} Returns Promise which represents an object describing the CaDataDetailItem.\n */\n unlockDetail(caDataDetailId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaDataDetailId: caDataDetailId,\n Lock: false\n }\n this.cw.runRequest('Pll/CaseDataDetail/UpdateLock', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Data Details. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Data Details\n * @param {Object} filters - The parameters to search by. (CaDataGroupId, CaseDataGroupId, GroupCode, GroupDesc, GroupSum, SumFlag)\n * @return {Object} Returns Promise that represents an object describing CaDataDetailItemBase.\n */\n searchForDetails(filters?: Object): Promise<Array<any>> {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaDataDetailId', 'CaDataGroupId', 'CalcRateFlag', 'CaseDataDetailId', 'CommentFlag', 'DateFlag', 'DetailCode', 'DetailDesc', 'ListValuesFlag', 'NumberFlag', 'TextFlag', 'ValueFlag', 'YesNoFlag']).length==0) {\n reject(new CWError(2, 'At least one of the attributes (CaDataDetailId, CaDataGroupId, CalcRateFlag, CaseDataDetailId, CommentFlag, DateFlag, DetailCode, DetailDesc, ListValuesFlag, NumberFlag, TextFlag, ValueFlag, YesNoFlag) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseDataDetail/SearchObject', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds a list of possible values to the data detail entry specified by the CaDataDetailId.\n *\n * @category Data List Values\n * @param {number} caDataDetailId - The Case Object to attach the data group to.\n * @param {string} listValue - The Group Code.\n * @return {Object} Returns Promise that represents an object describing CaDataListValuesItemBase.\n */\n addListValue(caDataDetailId: number, listValue: string) {\n return new Promise((resolve, reject) => {\n var data = {\n CaDataDetailId: caDataDetailId,\n ListValue: listValue\n }\n this.cw.runRequest('Pll/CaseDataListValues/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete by Id (Ca Data List Id)\n *\n * @category Data List Values\n * @param {number} CaDataListId - The Case Data List ID\n * @return {Object} Returns Promise that represents an object describing CaDataListValuesItemBase.\n */\n deleteListValue(caDataDetailId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaDataDetailId: caDataDetailId\n }\n this.cw.runRequest('Pll/CaseDataListValues/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for List Value IDs. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Data List Values\n * @param {Object} filters - The parameters to search by. (CaDataDetailId, CaDataListId, ListValue)\n * @return {Object} Returns Promise that represents an Array of resulting CaDataListIds\n */\n searchForListValueIds(filters?: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaDataDetailId', 'CaDataListId', 'ListValue']).length==0) {\n reject(new CWError(3, 'At least one of the attributes (CaDataDetailId, CaDataListId, ListValue) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseDataGroup/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for List Value Objects. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Data List Values\n * @param {Object} filters - The parameters to search by. (CaDataDetailId, CaDataListId, ListValue, CaDataGroupId)\n * @return {Object} Returns Promise that represents a collection of resulting CaDataListValuesItemBase objects\n */\n searchForListValueObjects(filters?: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaDataDetailId', 'CaDataListId', 'ListValue', 'CaDataGroupId']).length==0) {\n reject(new CWError(4, 'At least one of the attributes (CaDataDetailId, CaDataListId, ListValue, CaDataGroupId) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseDataGroup/SearchObject', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Set a data detail item's value without needing to find the type\n * \n * @category Data Details\n * @param dataDetailId - The data detail item's ID\n * @param {any} value - the value to set the data detail item to\n * @param {number} rate - the rate to set the data detail item to\n * @param {number} quantity - the quantitye to set the data detail item to\n * @returns Promise that represents\n */\n updateDetailItemValue(dataDetailId: number, value: any, rate?: number, quantity?: number) {\n return new Promise((resolve, reject) => {\n this.searchForDetails({CaDataDetailId: dataDetailId}).then(r => {\n if(r.length==0) {\n reject(new CWError(1, 'No data detail found with CaDataDetailId '+dataDetailId))\n }\n var detail = r[0]\n var data = {}\n if(!_.isUndefined(quantity)) {\n _.set(data, 'Quantity', quantity)\n }\n if(!_.isUndefined(rate)) {\n _.set(data, 'Rate', rate)\n }\n if(detail.NumberFlag=='Y') {\n _.set(data, 'NumberValue', value)\n } else if(detail.TextFlag=='Y') {\n _.set(data, 'TextValue', value)\n } else if(detail.DateFlag=='Y') {\n _.set(data, 'DateValue', value)\n } else if(detail.DateCountFlag=='Y') {\n if(!_.isArray(value)) {\n value = [value]\n }\n var dateCountValue = JSON.stringify({'dateCount': value.length, 'value': value})\n _.set(data, 'DateCountValue', dateCountValue)\n } else if(detail.YesNoFlag=='Y') {\n if(value=='Y' || value=='Yes') value = 'Y'\n if(value=='N' || value=='No') value = 'N'\n _.set(data, 'YesNoValue', value)\n } else if(detail.CommentFlag=='Y') {\n _.set(data, 'CommentValue', value)\n } else if(detail.CurrencyFlag=='Y') {\n _.set(data, 'CurrencyValue', value)\n } else if(detail.ListValuesFlag=='Y') {\n _.set(data, 'ListValue', value)\n } else if(detail.Q1Q2Q3Flag=='Y') {\n _.set(data, 'Quantity', value[0])\n _.set(data, 'Q2Value', value[1])\n _.set(data, 'Q3Value', value[2])\n if(!_.isUndefined(rate)) {\n _.set(data, 'Value', value[0] * value[1] * value[2] * _.get(data, 'Rate'))\n } else {\n _.set(data, 'Value', value[0] * value[1] * value[2])\n }\n } else if(detail.ValueFlag=='Y') {\n _.set(data, 'Value', value)\n }\n this.updateDetail(dataDetailId, data).then(r => {\n resolve(r)\n }).catch(e => {\n reject(e)\n })\n }).catch(e => {\n reject(e)\n })\n })\n } \n\n /**\n * Get the Case Data Details for a Case by Case ID\n *\n * @category Data Details\n * @param {number} caseId - The case ID to get the details for\n * @return {Object} Returns Promise that represents a collection of Case Data Detail Items\n */\n getAllDataDetails(caseId: number): Promise<Array<any>> {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caseId\n }\n this.cw.runRequest('Pll/CaseDataGroup/GetItemsForXml', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n \n /**\n * Set Case Data Detail Items for a Case by GroupCode.ItemCode syntax reference\n *\n * @category Data Details\n * @param {number} caseId - The case ID to get the details for\n * @param {Object} items - The parameters to search by. (DataGroup/Item string, Value) (e.g. {code: 'GroupCode.ItemCode', value: 'Value goes here'})\n * @return {Object} Returns Promise that represents a collection\n */\n setCaseData(caseId: number, items: Array<{code: string, value: any, rate?: number, quantity?: number}>) {\n return new Promise((resolve, reject) => {\n let _this = this\n let detail_items_to_set = items\n _this.getAllDataDetails(caseId).then(r => {\n let case_detail_items = r\n _.forEach(detail_items_to_set, function (item) {\n let item_parts = item.code.split('.')\n let item_value = item.value\n let item_rate = item.rate\n let item_quantity = item.quantity\n let caDataDetailId: number = 0\n let check_for_item = new Promise((resolve, reject) => {\n _.forEach(case_detail_items, function (detail, index) {\n if(item_parts.length>1 && detail.GroupCode==item_parts[0] && detail.DetailCode==item_parts[1]) {\n caDataDetailId = detail.CaDataDetailId\n resolve(caDataDetailId)\n } else if(item_parts.length==1 && detail.DetailCode==item_parts[0]) {\n caDataDetailId = detail.CaDataDetailId\n resolve(caDataDetailId)\n } else if(index === case_detail_items.length -1) resolve(0)\n })\n })\n check_for_item.then(r_two => {\n const caDataDetailIdNum = r_two as number;\n if(caDataDetailIdNum > 0) {\n _this.updateDetailItemValue(caDataDetailIdNum, item_value, item_rate, item_quantity).then(r_three => {\n // console.log(r_three)\n resolve(r_three)\n }).catch(e => {\n reject(e)\n })\n } else {\n reject(new CWError(2, 'The matching data detail item was not found for '+item.code))\n }\n });\n })\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Set Case Data Detail Item for a Case by GroupCode.ItemCode syntax reference\n * This is a convenience method that allows you to set a single detail item without needing to find the type. Reference it within {instance}.briefcase.data.setCaseDataItem.\n *\n * @category Data Details\n * @param {number} caseId - The Case ID to set the detail for\n * @param {string} detailGroupAndItemCode - The parameters to search (e.g. 'GroupCode.ItemCode')\n * @param {any} value - The value to set the specified detail to\n * @return {Object} Returns Promise\n */\n setCaseDataItem(caseId: number, detailGroupAndItemCode: string, value: any, rate?: number, quantity?: number) {\n return new Promise((resolve, reject) => {\n this.setCaseData(caseId, [{'code': detailGroupAndItemCode, 'value': value, 'rate': rate, 'quantity': quantity}]).then(r => {\n resolve(r)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class CaseFinancial {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw: Object) {\n this.cw = cw\n }\n\n /**\n * Adds a fee to the case specified by the CaObectId.\n *\n * @category Case Fees\n * @param {number} caObjectId - The Case Object ID for the case to which to add the fee\n * @param {number} feeSetupId - The fee setup id for the fee to add to the case.\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/service-info/Pll/CaseFees for more options. (Checkboxes -- Autorecalculate -- are Y/N strings)\n * @return {Object} Returns Promise that represents an object describing the newly-added fee. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaFeesItemBase\n */\n addFee(caObjectId: number, feeSetupId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var init_data = {\n CaObjectId: caObjectId,\n FeeSetupId: feeSetupId\n }\n var data = _.merge(init_data, options);\n this.cw.runRequest('Pll/CaseFees/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Case Fee Payment. Adds a payment to the case fee specified by caObjectId.\n *\n * @category Case Payments\n * @param {number} caObjectId - The Case Object ID for the case to which to add the fee\n * @param {Object} options - See /{subdirectory}/apidocs/#/service-info/Pll/CasePayment for more options, including required fields.\n * @return {Object} Returns Promise that represents an object describing the newly-added payment. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaPaymentItemBase\n */\n addPayment(caObjectId: number, options: Object) {\n return new Promise((resolve, reject) => {\n var init_data = {\n CaObjectId: caObjectId\n }\n var data = _.merge(init_data, options);\n this.cw.runRequest('Pll/CasePayment/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Make a Payment. Adds a payment to the case fee(s) specified.\n *\n * @category Case Payments\n * @param {Array<Array<string>>} payments - The Case Object ID for the case to which to add the fee\n * @param {Array<number>} caseFees - Fees this payment should be applied to. Array of CaFeeIds values.\n * @param {stringName:string,AddressLine1?:string,AddressLine2?:string,AddressLine3?:string,CityName?:string,CommentText?:string,Email?:string,FaxNumber?:string,PhoneHome?:string,PhoneMobile?:string,PhoneWork?:string,PhoneWorkExt?:string,StateCode?:string,WebSiteUrl?:string,ZipCode?:string,CountryCode?:string} payerInfo - Payer info for the payment being made.\n * @return {Object} Returns Promise that represents an object describing the newly-added payment.\n */\n makePayment(payments: Array<Array<string>>, caseFees: Array<number>, payerInfo?: {\n stringName:string,\n AddressLine1?:string,\n AddressLine2?:string,\n AddressLine3?:string,\n CityName?:string,\n CommentText?:string,\n Email?:string,\n FaxNumber?:string,\n PhoneHome?:string,\n PhoneMobile?:string,\n PhoneWork?:string,\n PhoneWorkExt?:string,\n StateCode?:string,\n WebSiteUrl?:string,\n ZipCode?:string,\n CountryCode?:string\n }) {\n return new Promise((resolve, reject) => {\n var data: { CaFeeIds: number[], TenderTypes: Array<Array<string>> } = {\n CaFeeIds: caseFees,\n TenderTypes: []\n }\n if(payerInfo) {\n _.set(data, 'CaPayer', payerInfo)\n }\n _.forEach(payments, payment => {\n if(payment.length!=5) {\n reject(new CWError(301, `Payment must contain 5 elements: Payment Tender Type, Amount, Comment, Date Received, Reference String - ${JSON.stringify(payment)}`))\n }\n // Check that item 2 is a number\n else if(isNaN(parseFloat(payment[1]))) {\n reject(new CWError(302, `Payment Tender amount, second item in array (${payment[1]}), must be a curreny number provided as a string.`))\n }\n //Check that item 3 is a datetime\n else if(!_.isDate(Date.parse(payment[3]))) {\n reject(new CWError(303, `Payment Tender date, fourth item in array (${payment[3]}), must be a datetime provided as a string.`))\n } else {\n data.TenderTypes.push(payment)\n }\n })\n\n this.cw.runRequest('Pll/CasePayment/MakePayment', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n\n /**\n * Add Case Payment Refund. Refunds a payment on the case payment specified by caPaymentId.\n *\n * @category Case Payment Refunds\n * @param {number} caPaymentId - The Case Payment ID for the case payment which to refund\n * @param {number} refundAmount - The amount to refund\n * @param {string} comment - A comment to append to the refund\n * @return {Object} Returns Promise that represents an object describing the newly-added payment refund. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaPaymentRefundItemBase\n */\n addRefund(caPaymentId: number, refundAmount: number, comment: string) {\n return new Promise((resolve, reject) => {\n var data = {\n CaPaymentId: caPaymentId,\n RefundAmount: refundAmount,\n Comments: comment\n }\n this.cw.runRequest('Pll/CasePaymentRefund/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Case Deposit Payment. Adds a payment to the case deposit specified by CaDepositId.\n *\n * @category Case Payments\n * @param {number} caDepositId - The Case Deposit ID for the case deposit to which to add the fee\n * @param {Object} options - See /{subdirectory}/apidocs/#/service-info/Pll/CasePayment for more options, including required fields.\n * @return {Object} Returns Promise that represents an object describing the newly-added payment. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaPaymentItemBase\n */\n addDepositPayment(caDepositId: number, options: Object) {\n return new Promise((resolve, reject) => {\n var init_data = {\n CaDepositId: caDepositId\n }\n var data = _.merge(init_data, options);\n this.cw.runRequest('Pll/CasePayment/AddDeposit', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds a deposit to the case specified by the CaObectId.\n *\n * @category Case Deposits\n * @param {number} caObjectId - The Case Object ID for the case to which to add the fee\n * @param {number} depositId - The deposit setup id for the deposit to add to the case.\n * @param {number} [amount] - The amount of the deposit (optional)\n * @param {string} [comment] - Comment text to add to the deposit (optional)\n * @return {Object} Returns Promise that represents an object describing the newly-added deposit. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaDepositItemBase\n */\n addDeposit(caObjectId: number, depositId: number, amount?: number, comment?: string) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n DepositId: depositId\n }\n if(typeof(amount)!='undefined') {\n _.set(data, 'Amount', amount)\n }\n if(typeof(comment)!='undefined') {\n _.set(data, 'CommentText', comment)\n }\n this.cw.runRequest('CaseDeposit/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds an instrument to the case specified by the CaObectId.\n *\n * @category Case Instruments\n * @param {number} caObjectId - The Case Object ID for the case to which to add the instrument\n * @param {number} instTypeId - The instrument type id for the instrument being added to the case.\n * @param {number} amount - The amount of the instrument\n * @param {Date} dateExpire - The datetime for the instrument to expire.\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/service-info/Pll/CaseInstrument for more options.\n * @return {Object} Returns Promise that represents an object describing the newly-added instrument. See /{subdirectory}/apidocs/#/service-info/Pll/CaseInstrument\n */\n addInstrument(caObjectId: number, instTypeId: number, amount: number, dateExpire: Date, options?: Object) {\n return new Promise((resolve, reject) => {\n var init_data = {\n CaObjectId: caObjectId,\n InstTypeId: instTypeId,\n Amount: amount,\n DateExpire: dateExpire\n }\n var data = _.merge(init_data, options);\n this.cw.runRequest('Pll/CaseInstrument/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Updates a fee specified by the CaFeeId.\n *\n * @category Case Fees\n * @param {number} caFeeId - The Fee ID for the specific instance of the fee you wish to update\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/service-info/Pll/CaseFees for more options. (Checkboxes -- Autorecalculate -- are Y/N strings)\n * @return {Object} Returns Promise that represents an object describing the updated fee. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaFeesItemBase\n */\n updateFee(caFeeId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var init_data = {\n CaFeeId: caFeeId\n }\n var data = _.merge(init_data, options);\n this.cw.runRequest('Pll/CaseFees/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Void a refund.\n *\n * @category Case Refund Payment\n * @param {number} caPaymentRefundId - The Refund ID for the specific refund to void\n * @param {String} voided - A string. No clue.\n * @return {Object} Returns Promise that represents an object describing the voided refund. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaPaymentRefundItemBase\n */\n voidRefund(caPaymentRefundId: number, voided: string) {\n return new Promise((resolve, reject) => {\n var data = {\n CaPaymentRefundId: caPaymentRefundId,\n Voided: voided\n }\n this.cw.runRequest('Pll/CasePaymentRefund/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds Default Case Fees. Adds fees to the case specified by the CaObectId and BusCaseId.\n *\n * @category Case Fees\n * @param {number} caObjectId - The Case Object ID for the case to which to add the default fees\n * @param {number} busCaseId - The business case ID whose default fees should be added to the case\n * @return {Object} Returns Promise that represents a collection of Fee Items. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaFeesItemBase\n */\n addDefaultFees(caObjectId: number, busCaseId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n BusCaseId: busCaseId\n }\n this.cw.runRequest('Pll/CaseFees/AddDefault', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds Default Case Deposits. Adds deposits to the case specified by the CaObectId and BusCaseId.\n *\n * @category Case Deposits\n * @param {number} caObjectId - The Case Object ID for the case to which to add the default deposits\n * @param {number} busCaseId - The business case ID whose default deposits should be added to the case\n * @return {Object} Returns Promise that represents a collection of Deposit Items. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaDepositItemBase\n */\n addDefaultDeposits(caObjectId: number, busCaseId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n BusCaseId: busCaseId\n }\n this.cw.runRequest('Pll/CaseDeposit/AddDefault', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Gets the fees from the case specified by the CaObectId.\n *\n * @category Case Fees\n * @param {number} caObjectId - The Case Object ID for the case to which to get the fees\n * @return {Object} Returns Promise that represents a collection of Case Fees.\n */\n getFees(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n WhereClause: `\"CA_FEES_VW.CA_OBJECT_ID=${caObjectId}\"}`\n }\n this.cw.runRequest('Pll/CaseFees/GetList', data).then(r => {\n var fees = new Array()\n _.forEach(r.Value, (fee) => {\n var limited_fee = {\n CaFeeId: fee.CaFeeId,\n CaObjectId: fee.CaObjectId,\n Amount: fee.Amount,\n AmountDue: fee.AmountDue,\n Factor: fee.Factor,\n Sum: fee.Sum,\n Value: fee.Value,\n FeeCode: fee.FeeCode,\n FeeDesc: fee.FeeDesc,\n Quantity: fee.Quantity,\n Rate: fee.Rate,\n WaiveFee: fee.WaiveFee,\n CreatedByLoginId: fee.CreatedByLoginId,\n ModifiedByLoginId: fee.ModifiedByLoginId,\n GroupCode: fee.GroupCode,\n DetailCode: fee.DetailCode,\n TotalFeeAmount: fee.TotalFeeAmount,\n TotalPaymentAmount: fee.TotalPaymentAmount,\n TotalDueAmount: fee.TotalDueAmount,\n TotalCreditAmount: fee.TotalCreditAmount,\n CreditAmount: fee.CreditAmount,\n GrandSumFlag: fee.GrandSumFlag,\n FeeTypeCode: fee.FeeTypeCode,\n Location: fee.Location,\n AutoRecalculate: fee.AutoRecalculate,\n CommentText: fee.CommentText,\n CreatedBy: fee.CreatedBy,\n CustFeeSeq: fee.CustFeeSeq,\n DateCreated: fee.DateCreated,\n DateModified: fee.DateModified,\n FeeSetupId: fee.FeeSetupId,\n RecalcCreateDate: fee.RecalcCreateDate,\n LockOnPayment: fee.LockOnPayment,\n FeeTypeId: fee.FeeTypeId,\n Invoiced: fee.Invoiced,\n ModifiedBy: fee.ModifiedBy,\n PaymentAmount: fee.PaymentAmount\n }\n fees.push(limited_fee)\n })\n resolve(fees)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Case Deposit by Case ObjectId.\n *\n * @category Case Deposits\n * @param {number} caObjectId - The Case Object ID for the case to which to get the deposits\n * @return {Object} Returns Promise that represents a collection of Case Deposits.\n */\n getDeposits(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseDeposit/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Case Payments by Case ObjectId\n *\n * @category Case Payments\n * @param {number} caObjectId - The Case Object ID for the case to which to get the payments\n * @return {Object} Returns Promise that represents a collection of Case Payments.\n */\n getPayments(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CasePayment/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Gets the instruments from the case specified by the CaObectId.\n *\n * @category Case Instruments\n * @param {number} caObjectId - The Case Object ID for the case to which to get the fees\n * @return {Object} Returns Promise that represents a collection of Case Instruments.\n */\n getInstruments(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseInstrument/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete the fee specified by the caFeeId.\n *\n * @category Case Fees\n * @param {number} caFeeId - The Case Fee ID which should be deleted\n * @return {Object} Returns Promise that represents a Case Fee object.\n */\n deleteFee(caFeeId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaFeeId: caFeeId\n }\n this.cw.runRequest('Pll/CaseFees/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Case Fees by Case ObjectId. Delete from the system all Fees linked to a specific Case as specified by the Case Id parameter (CaObjectId).\n *\n * @category Case Fees\n * @param {number} caObjectId - The Case Object ID whose fees should be deleted\n * @return {Object} Returns Promise that represents a number (?)\n */\n deleteFeesByCaseId(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseFees/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete a Case Payment by Id. Delete a specific case payment by CaPaymentId.\n *\n * @category Case Payments\n * @param {number} caPaymentId - The Case Payment ID which should be deleted\n * @return {Object} Returns Promise that represents a Case Payment object.\n */\n deletePayment(caFeeId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaFeeId: caFeeId\n }\n this.cw.runRequest('Pll/CasePayment/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Case Payment Refund. Removes a refund on a payment.\n *\n * @category Case Payment Refunds\n * @param {number} caPaymentRefundId - The Case Payment ID for the case payment which to refund\n * @return {Object} Returns Promise that represents an object describing the deleted payment refund. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaPaymentRefundItemBase\n */\n deleteRefund(caPaymentRefundId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaPaymentRefundId: caPaymentRefundId\n }\n this.cw.runRequest('Pll/CasePaymentRefund/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Case Payments by Case ObjectId. Delete from the system all payments associated to a specific case as specified by the case id (CaObjectId)\n *\n * @category Case Payments\n * @param {number} caObjectId - The Case Object ID whose payments should be deleted\n * @return {Object} Returns Promise that represents a number (?)\n */\n deletePaymentsByCaseId(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CasePayment/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete the fee specified by the caFeeId.\n *\n * @category Case Deposits\n * @param {number} caDepositId - The Case Deposit ID which should be deleted\n * @return {Object} Returns Promise that represents a collection of Case Deposits.\n */\n deleteDeposit(caDepositId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaDepositId: caDepositId\n }\n this.cw.runRequest('Pll/CaseDeposit/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Case Fees by Case ObjectId. Delete from the system all Fees linked to a specific Case as specified by the Case Id parameter (CaObjectId).\n *\n * @category Case Deposits\n * @param {number} caObjectId - The Case Object ID whose fees should be deleted\n * @return {Object} Returns Promise that represents a number (?)\n */\n deleteDepositsByCaseId(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseDeposit/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete the instrument specified by the caInstrumentId.\n *\n * @category Case Instruments\n * @param {number} caInstrumentId - The Case Instrument ID which should be deleted\n * @return {Object} Returns Promise that represents a Case Instrument.\n */\n deleteInstrument(caInstrumentId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaInstrumentId: caInstrumentId\n }\n this.cw.runRequest('Pll/CaseInstrument/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Case Instruments by Case ObjectId. Delete from the system all Instruments linked to a specific Case as specified by the Case Id parameter (CaObjectId).\n *\n * @category Case Instruments\n * @param {number} caObjectId - The Case Object ID whose instruments should be deleted\n * @return {Object} Returns Promise that represents a number (?)\n */\n deleteInstrumentsByCaseId(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseInstrument/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Fees. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Case Fees\n * @param {Object} filters - The parameter(s) to search by\n * @return {Object} Returns Promise that represents an Array of case fee IDs\n */\n searchFees(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaFeeId', 'CaObjectId', 'FeeCode', 'FeeDesc']).length==0) {\n reject(new CWError(4, 'At least one of the attributes (CaFeeId, CaObjectId, FeeCode, FeeDesc) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseFees/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Payments. Include one or more of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Case Payments\n * @param {Object} filters - The filters to search for matched Case Payments\n * @return {Object} Returns Promise that represents an Array of case payment IDs\n */\n searchPayments(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaPaymentId', 'CommentText', 'FeeAmount', 'FeeCode', 'FeeDesc', 'PaymentAccount', 'PaymentAmount', 'TenderType']).length==0) {\n reject(new CWError(5, 'At least one of the attributes (CaPaymentId, CommentText, FeeAmount, FeeCode, FeeDesc, PaymentAccount, PaymentAmount, TenderType) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CasePayment/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Payment Refunds. Include one or more of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Case Payment Refunds\n * @param {Object} filters - The filters to search for matched Case Payments.\n * @return {Object} Returns Promise that represents an Array of case payment refund IDs\n */\n searchRefunds(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaPaymentId', 'CaPaymentRefundId', 'Comments', 'RefundAmount']).length==0) {\n reject(new CWError(6, 'At least one of the attributes (CaPaymentId, CaPaymentRefundId, Comments, RefundAmount) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CasePayment/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /* Escrow */\n /**\n * Get the Escrow Fees for a specific case template (BusCaseId).\n *\n * @category Case Escrow\n * @param {number} busCaseId - The business case ID whose default fees should be added to the case\n * @return {Object} Returns Promise that represents a collection of Fee Items. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaFeesItemBase\n */\n getEscrowFees(busCaseId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n BusCaseId: busCaseId\n }\n this.cw.runRequest('Pll/EscrowFees/GetByBusCaseId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add an Escrow Payment. Adds a payment to the case.\n *\n * @category Case Escrow\n * @param {number} escrowPaymentItems - The escrow payment items to add to the case (See: /{subdirectory}/apidocs/#/data-type-info;dataType=EscrowPaymentItem)\n * @return {Object} Returns Promise that represents a collection of Escrow Paymnent Items that were added.\n */\n addEscrowPayment(escrowPaymentItems: Array<Object>) {\n return new Promise((resolve, reject) => {\n var data = {\n EscrowPayments: escrowPaymentItems\n }\n this.cw.runRequest('Pll/EscrowPayment/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n // \n /**\n * Search for Escrow Payments\n *\n * @category Case Escrow\n * @param {number} caObectId - The business case ID whose default fees should be added to the case\n * @return {Object} Returns Promise that represents a collection of Fee Items. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaFeesItemBase\n */\n // searchEscrowPayments(whereClause: Array<FilterCondition>, limit, offset, sortDir, sortField) {\n // return new Promise((resolve, reject) => {\n // var data = {\n // CaObjectId: busCaseId\n // }\n // this.cw.runRequest('Pll/EscrowPayment/GetList', data).then(r => {\n // resolve(r.Value)\n // }).catch(e => {\n // reject(e)\n // })\n // })\n // }\n\n /**\n * Get the Escrow Fees for a specific case template (BusCaseId).\n *\n * @category Case Escrow\n * @param {number} busCaseId - The business case ID whose default fees should be added to the case\n * @return {Object} Returns Promise that represents a collection of Fee Items. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaFeesItemBase\n */\n updateEscrowPayment(busCaseId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n BusCaseId: busCaseId\n }\n this.cw.runRequest('Pll/EscrowPayment/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n /* End Escrow */\n\n /**\n * Search for Case Deposits. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Case Deposits\n * @param {Object} filters - The parameters to search by.\n * @return {Object} Returns Promise that represents an Array of case fee IDs\n */\n searchDeposits(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaDepositId', 'CaObjectId', 'DepositCode', 'DepositDesc']).length==0) {\n reject(new CWError(1, 'At least one of the arguments (CaDepositId, CaObjectId, DepositCode, DepositDesc) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseDeposit/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get All Fee Templates\n *\n * @category Case Fees\n * @return {Object} Returns Promise that represents an object describing the newly-added fee. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaFeesItemBase\n */\n getAllFeeTemplates() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/FeeSetup/All', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Fees. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Case Fees\n * @param {Object} filters - The parameters to search by\n * @return {Object} Returns Promise that represents an Array of case fee IDs\n */\n searchFeeTemplates(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['FeeSetupId', 'FeeTypeId', 'FeeCode', 'FeeDesc', 'AccountCode']).length==0) {\n reject(new CWError(7, 'At least one of the arguments (FeeSetupId, FeeTypeId, FeeCode, FeeDesc, AccountCode) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/FeeSetup/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Instruments. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Case Instruments\n * @param {Object} filters - The parameters to search by (AddressLine1, Amount, CaInstrumentId, CityName, CommentText, Company, ContactEmail, ContactName, ContactPhone, CountryCode, InstTypeId, SerialNumber, StateCode, ZipCode)\n * @return {Object} Returns Promise that represents an Array of case instrument IDs\n */\n searchCaseInstruments(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['AddressLine1', 'Amount', 'CaInstrumentId', 'CityName', 'CommentText', 'Company', 'ContactEmail', 'ContactName', 'ContactPhone', 'CountryCode', 'InstTypeId', 'SerialNumber', 'StateCode', 'ZipCode']).length==0) {\n reject(new CWError(9, 'At least one of the arguments (AddressLine1, Amount, CaInstrumentId, CityName, CommentText, Company, ContactEmail, ContactName, ContactPhone, CountryCode, InstTypeId, SerialNumber, StateCode, ZipCode) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseInstrument/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the Defined Instruments\n *\n * @category Instruments\n * @param {Object} options - the options to filter the instruments returned by\n * @return {Object} Returns Promise that represents an Array of CaInstrumentItem\n */\n getInstrumentList(options: Object) {\n return new Promise((resolve, reject) => {\n var data = options\n this.cw.runRequest('Pll/CaseInstrument/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds a release to a case instrument specified by the caInstrumentId. Must provide either amountReleased OR percentReleased\n *\n * @category Case Instrument Releases\n * @param {number} caInstrumentId - The Case Instrument ID to which to add the instrument release\n * @param {number} releasedBy - UserID to attach to the release.\n * @param {Date} dateReleased - The date of the release\n * @param {number} [amountReleased] - The amount to be released\n * @param {number} [percentReleased] - OR the percent to be released\n * @param {string} [comment] - Comment to attach to the release\n * @return {Object} Returns Promise that represents an object describing the newly-added instrument release. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaInstReleasesItemBase\n */\n addCaseInstrumentRelease(caInstrumentId: number, releasedBy: number, dateReleased: Date, amountReleased?: number, percentReleased?: number, comment?: string) {\n return new Promise((resolve, reject) => {\n var data = {\n CaInstrumentId: caInstrumentId,\n DateReleased: dateReleased,\n ReleasedBy: releasedBy\n }\n if((typeof(percentReleased)!='undefined' || percentReleased!=null) && (typeof(amountReleased)!='undefined' || amountReleased!=null)) {\n reject(new CWError(2, 'Either amountReleased or percentReleased must be specified.'))\n } else if(typeof(percentReleased)!='undefined' && percentReleased!=null) {\n _.set(data, 'PercentReleased', percentReleased)\n } else if(typeof(amountReleased)!='undefined' && amountReleased!=null) {\n _.set(data, 'AmountReleased', amountReleased)\n }\n if(typeof(comment)!='undefined') {\n _.set(data, 'CommentText', comment)\n }\n this.cw.runRequest('Pll/CaseInstReleases/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Deletes a release specified by the caInstReleasesId.\n *\n * @category Case Instrument Releases\n * @param {number} caInstReleasesId - The Case Instrument Release ID to delete\n * @return {Object} Returns Promise that represents an object describing the deleted instrument release. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaInstReleasesItemBase\n */\n deleteCaseInstrumentRelease(caInstReleasesId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaInstReleasesId: caInstReleasesId\n }\n this.cw.runRequest('Pll/CaseInstReleases/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Instrument Releases. Include one or more of the search fields. A logical 'and' operation is applied for muliple search fields.\n *\n * @category Case Instrument Releases\n * @param {Object} filters - Specify at least one of the following: AmountReleased, CaInstReleasesId, CaInstrumentId, CommentText, PercentReleased, ReleasedBy\n * @return {Object} Returns Promise that represents an Array of Case Instruments resulting from the search\n */\n searchCaseInstrumentReleases(filters: Object) {\n return new Promise((resolve, reject) => {\n var data = filters\n if(_.intersectionBy(_.keysIn(filters), ['AmountReleased', 'CaInstReleasesId', 'CaInstrumentId', 'CommentText', 'PercentReleased', 'ReleasedBy']).length==0) {\n reject(new CWError(3, 'At least one of the attributes (AmountReleased, CaInstReleasesId, CaInstrumentId, CommentText, PercentReleased, ReleasedBy) must be defined.'))\n }\n this.cw.runRequest('Pll/CaseInstReleases/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get All Fees\n *\n * @category Fees\n * @return {Object} Returns Promise that represents a collection of FeeSetups. See /{subdirectory}/apidocs/#/data-type-info;dataType=FeeSetupItemBase\n */\n fees() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Pll/FeeSetup/All', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Fees. Include one or more of the search fields. A logical 'and' operation is applied for muliple search fields.\n *\n * @category Fees\n * @param {Object} filters - Specify at least one.\n * @return {Object} Returns Promise that represents a collection of FeeSetups. See /{subdirectory}/apidocs/#/data-type-info;dataType=FeeSetupItemBase\n */\n searchAvailableFees(filters: {AccountCode?: string, FeeCode?: string, FeeDesc?: string, FeeSetupId?: number, FeeTypeId?: number}) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['AccountCode', 'FeeCode', 'FeeDesc', 'FeeSetupId', 'FeeTypeId']).length==0) {\n reject(new CWError(8, 'At least one of the attributes (AccountCode, FeeCode, FeeDesc, FeeSetupId, FeeTypeId) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/FeeSetup/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all tender types configured\n *\n * @category Tender Types\n * @return {Object} Returns Promise that represents a collection of tender type objects. See /{subdirectory}/apidocs/#/data-type-info;dataType=TenderTypeItem\n */\n getTenderTypes() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/TenderType/All', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds a tender type configuration\n *\n * @category Tender Types\n * @param {Object} options - See /{subdirectory}/apidocs/#/service-info/Pll/TenderType\n * @return {Object} Returns Promise that represents an object describing the newly-added tender type. See /{subdirectory}/apidocs/#/data-type-info;dataType=TenderTypeItem\n */\n addTenderType(options: Object) {\n return new Promise((resolve, reject) => {\n var data = options\n this.cw.runRequest('Pll/TenderType/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update a tender type configuration\n *\n * @category Tender Types\n * @param {number} tenderTypeId - ID of the tender type to update\n * @param {Object} options - See /{subdirectory}/apidocs/#/service-info/Pll/TenderType\n * @return {Object} Returns Promise that represents an object describing the newly-added tender type. See /{subdirectory}/apidocs/#/data-type-info;dataType=TenderTypeItem\n */\n updateTenderType(tenderTypeId: number, options: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n TenderTypeId: tenderTypeId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/TenderType/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n}\n","import { CWError } from './error'\nimport ReversibleMap from 'reversible-map'\nconst _ = require('lodash')\n\n\n/**\n * A plugin that contains \"comments\" methods\n */\nexport class Comments {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Storage of all potential activity types which comments can be attached to: Unknown, Request, WorkOrder, CaTask, CaObject, CaCorrection, Project, Contract\n */\n activityTypes: ReversibleMap<string, number>\n\n /**\n * Storage of object's active activityType\n */\n currentActivityType: string\n\n /**\n * @hidden\n */\n constructor(cw: any, activityType: string) {\n this.cw = cw\n this.activityTypes = new ReversibleMap<string, number>()\n this.activityTypes.set(\"Unknown\", 0)\n this.activityTypes.set(\"Request\", 1)\n this.activityTypes.set(\"WorkOrder\", 2)\n this.activityTypes.set(\"CaTask\", 3)\n this.activityTypes.set(\"CaObject\", 4)\n this.activityTypes.set(\"CaCorrection\", 5)\n this.activityTypes.set(\"Project\", 6)\n this.activityTypes.set(\"Contract\", 7)\n\n if(!this.activityTypes.has(activityType)) {\n throw new CWError(1, 'Comment activity type not found.', {'provided': activityType, 'options':this.activityTypes})\n }\n this.currentActivityType = activityType\n }\n\n /**\n * Add a comment - for adding a comment to an object when the object is already known. Always call comment.add from request, case, workorder, or inspection.\n * \n * @param {number} sid - The SID of the activity to which the comment should be attached\n * @param {string} comment - The text for the comment\n * @return {Object} Returns a Promise which represents a CommentRecord object\n */\n add(sid: number, comment: string) {\n return new Promise((resolve, reject) => {\n var data = {\n ActivityType: this.activityTypes.get(this.currentActivityType),\n ActivitySid: sid,\n Comments: comment\n }\n this.cw.runRequest('Ams/Comment/Add', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update a comment\n *\n * @param {number} id - The ID of the comment which should be updated\n * @param {string} comment - The new text for the updated comment\n * @return {Object} Returns a Promise which represents a CommentRecord object\n */\n update(id: number, comment: string) {\n return new Promise((resolve, reject) => {\n var data = {\n ActivityType: this.activityTypes.get(this.currentActivityType),\n CommentId: id,\n Comments: comment\n }\n this.cw.runRequest('Ams/Comment/Update', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get comments for activity items\n *\n * @param {Array<number>} sids - The options SIDs to get comments for.\n * @return {Object} Returns Promise object that represents a collection of available comments\n */\n get(sids: Array<number>) {\n return new Promise((resolve, reject) => {\n if(typeof(sids)!='undefined' && sids !=null) {\n var data = {\n ActivitySids: sids,\n ActivityType: this.activityTypes.get(this.currentActivityType),\n }\n this.cw.runRequest('Ams/Comment/ByActivitySids', data).then((response: any) => {\n if(sids.length==1) {\n resolve(response.Value[sids[0]])\n } else {\n resolve(response.Value)\n }\n })\n }\n })\n }\n\n /**\n * Get pre-defined comments for activityTypes\n *\n * @param {number} problemSid - The ProblemSid if currentActivityType is (Service) Request\n * @param {string} [category] - Only applies to WorkOrder and ServiceRequest category comments.\n * @return {Object} Returns Promise object that represents a collection of available comment templates.\n */\n getPredefined(problemSid: number = 0, category?: string) {\n return new Promise((resolve, reject) => {\n var data = {}\n _.set(data, 'ProblemSid', problemSid)\n if(typeof(category)!='undefined' && (this.currentActivityType=='Request' || this.currentActivityType=='WorkOrder')) {\n _.set(data, 'Category', category)\n }\n _.set(data, 'ActivityType', this.activityTypes.get(this.currentActivityType))\n this.cw.runRequest('Ams/Comment/PredefinedComments', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n // /**\n // * Get pre-set comments for activityTypes\n // *\n // * @param {Array<string>} [activityTypes] - Provide a list of activity types. Defaults to current activity type.\n // * @param {Array<string>} [categories] - Only applies to WorkOrder and ServiceRequest category comments.\n // * @return {Object} Returns Promise object that represents a collection of available comment templates.\n // */\n // getForActivityList(activityTypes?: Array<string>, categories?: Array<string>) {\n // return new Promise((resolve, reject) => {\n // var data = {}\n // if(typeof(activityTypes)!='undefined') {\n // // TODO: iterate through it and output numeric types\n // _.set(data, 'ActivityTypes', activityTypes)\n // } else {\n // _.set(data, 'ActivityTypes', [this.activityTypes.get(this.currentActivityType)])\n // }\n // if(typeof(categories)!='undefined') {\n // _.set(data, 'Categories', categories)\n // }\n // console.log(data, 'data')\n // this.cw.runRequest('Ams/Comment/ByActivityTypes', data).then((response: any) => {\n // resolve(response.Value)\n // }).catch(e => {\n // reject(e)\n // })\n // })\n // }\n\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\nimport { Comments } from './comments'\n\nexport class CaseWorkflow {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Task sub-methods\n */\n task: Object\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.task = {\n comment: new Comments(cw, 'CaTask')\n }\n }\n\n /**\n * Adds a task to the case specified by the CaObectId.\n *\n * @category Tasks\n * @param {number} caObjectId - The Case Object to attach the task to\n * @param {number} taskId - The task ID to add to the case workflow\n * @param {number} startPoint - The start point in the workflow for the task\n * @param {number} endPoint - The end point in the workflow for the task\n * @param {Object} [options] - Options for the Task. See /{subdirectory}/apidocs/#/service-info/Pll/CaseTask\n * @return {Object} Returns Promise that represents an object describing CaTaskItemBase.\n */\n addTask(caObjectId: number, taskId: number, startPoint: number, endPoint: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n TaskId: taskId,\n StartPoint: startPoint,\n EndPoint: endPoint\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseTask/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Task Result\n *\n * @category Task Results\n * @param {number} caObjectId - The Case Object to attach the task to\n * @param {number} caTaskId - The Case task ID to add the result to\n * @param {number} resultCode - The result Code\n * @param {number} resultID - The result ID\n * @param {number} resultSetID - The result set ID\n * @param {Object} [options] - Options for the Task. See /{subdirectory}/apidocs/#/service-info/Pll/CaseTaskResults\n * @return {Object} Returns Promise that represents an object describing CaTaskResultsItem.\n */\n addTaskResult(caObjectId: number, caTaskId: number, resultCode: number, resultID: number, resultSetID: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n CaTaskId: caTaskId,\n ResultCode: resultCode,\n ResultID: resultID,\n ResultSetID: resultSetID\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseTaskResults/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Task Comment\n *\n * @category Comments\n * @param {number} caTaskId - The Case task ID of the task to add the comment to\n * @param {string} comment - The comment text\n * @return {Object} Returns Promise that represents an object describing CaTaskCommentsItemBase.\n */\n addTaskComment(caTaskId: number, comment: string) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskId: caTaskId,\n CommentText: comment\n }\n this.cw.runRequest('Pll/CaseTaskComments/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get tasks by CaObjectId\n *\n * @category Tasks\n * @param {number} caObjectId - The Case Object to get the attached tasks\n * @param {boolean} checkRelatedItems - Wherther to check related items. Defaults to false.\n * @return {Object} Returns Promise that represents a collection of the CaTaskItemBases.\n */\n getTasksByCaseId(caObjectId: number, checkRelatedItems: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n CheckRelatedItems: checkRelatedItems\n }\n this.cw.runRequest('Pll/CaseTask/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get tasks by TaskIds\n *\n * @category Tasks\n * @param {Array<number>} caTaskIds - The IDs of the tasks to retrieve\n * @param {boolean} checkRelatedItems - Wherther to check related items. Defaults to false.\n * @return {Object} Returns Promise that represents a collection of the CaTaskItemBases.\n */\n getTasksById(caTaskIds: Array<number>, checkRelatedItems: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskIds: caTaskIds,\n CheckRelatedItems: checkRelatedItems\n }\n this.cw.runRequest('Pll/CaseTask/ByIds', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get CaTaskResultsItem by CaTaskIds\n *\n * @category Task Results\n * @param {Array<number>} caTaskIds - The IDs of the tasks for which to retrieve results\n * @return {Object} Returns Promise that represents a collection of CaTaskResultsItems.\n */\n getResultsByTaskId(caTaskIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskIds: caTaskIds\n }\n this.cw.runRequest('Pll/CaseTaskResults/ByCaTaskIds', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for CaseTaskComments by CaTaskId\n *\n * @category Comments\n * @param {number} caTaskId - The task ID for which to retrieve attached comments\n * @return {Object} Returns Promise that represents a collection of CommentRecords.\n */\n getCommentsForTask(caTaskId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n caTaskId: caTaskId\n }\n this.cw.runRequest('Pll/CaseTaskComments/ByCaTaskId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for CaseTaskComments by CaTaskId\n *\n * @category Comments\n * @param {Array<number>} caTaskIds - The task IDs for which to retrieve attached comments\n * @return {Object} Returns Promise that represents a collection of CaTaskCommentsItemBase.\n */\n getCommentsForTasks(caTaskIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n caTaskIds: caTaskIds\n }\n this.cw.runRequest('Pll/CaseTaskComments/ByCaTaskIds', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Updates a task\n *\n * @category Tasks\n * @param {number} caTaskId - The Case Object to attach the task to\n * @param {Object} [options] - Options for Task. See /{subdirectory}/apidocs/#/service-info/Pll/CaseTask\n * @return {Object} Returns Promise that represents an object describing CaTaskItemBase.\n */\n updateTask(caTaskId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskId: caTaskId\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseTask/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Task Comment\n *\n * @category Comments\n * @param {number} caTaskCommentId - The Case task ID of the task to add the comment to\n * @param {string} comment - The comment text\n * @param {number} commentId - Probably unnecessary?\n * @return {Object} Returns Promise that represents an object describing CaTaskCommentsItemBase.\n */\n updateTaskComment(caTaskCommentId: number, comment: string, commentId?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskCommentId: caTaskCommentId,\n CommentText: comment\n }\n if(typeof(commentId)!='undefined') {\n _.set(data, 'CommentId', commentId)\n }\n this.cw.runRequest('Pll/CaseTaskComments/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Updates a task\n *\n * @category Tasks\n * @param {number} caTaskId - The Case Object to attach the task to\n * @param {string} resultCode - The result code to set for the specified Task\n * @param {Object} [options] - Options for Task. Specify either or both TaskCompletedBy & TaskCompleteDate. See /{subdirectory}/apidocs/#/service-info/Pll/CaseTask\n * @return {Object} Returns Promise that represents an object describing CaTaskItemBase.\n */\n setTaskResult(caTaskId: number, resultCode: string, options?: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskId: caTaskId,\n ResultCode: resultCode\n }\n if(_.intersectionBy(_.keysIn(options), ['TaskCompleteDate', 'TaskCompletedBy']).length==0) {\n reject(new CWError(2, 'At least one of the attributes (TaskCompletedBy, TaskCompleteDate) must be defined.'))\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseTask/SetResult', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Deletes a task by TaskID\n *\n * @category Tasks\n * @param {number} caTaskId - The caTaskId for the task which should be deleted\n * @return {Object} Returns Promise that represents an object describing CaTaskItemBase.\n */\n deleteTask(caTaskId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskId: caTaskId\n }\n this.cw.runRequest('Pll/CaseTask/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Deletes a task by TaskID\n *\n * @category Tasks\n * @param {number} caTaskId - The caTaskId for the task which should be deleted\n * @return {Object} Returns Promise that represents the number of the CaObjectID\n */\n deleteTasksOnCase(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseTask/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Deletes tasks by TaskID\n *\n * @category Comments\n * @param {Array<number>} caTaskCommentIds - The comments to delete\n * @return {Object} Returns Promise that represents a dictionary of comment IDs.\n */\n deleteTaskComments(caTaskCommentIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskCommentIds: caTaskCommentIds\n }\n this.cw.runRequest('Pll/CaseTaskComments/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Tasks. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Tasks\n * @param {Object} filters - The parameters to search by. (ResponsibleUserId, TaskAvailable, TaskComplete, TaskType)\n * @return {Object} Returns Promise that represents a collection of resulting CaTaskIDs\n */\n searchForTasks(filters?: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['ResponsibleUserId', 'TaskAvailable', 'TaskComplete', 'TaskType']).length==0) {\n reject(new CWError(1, 'At least one of the attributes (ResponsibleUserId, TaskAvailable, TaskComplete, TaskType) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseTask/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for CaseTaskResults Objects. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Task Results\n * @param {Object} filters - The parameters to search by. See: /{subdirectory}/apidocs/#/service-info/Pll/CaseTaskResults\n * @return {Object} Returns Promise that represents a collection of resulting CaTaskResultsItem\n */\n searchForTaskResults(filters?: Object) {\n return new Promise((resolve, reject) => {\n var data = filters\n this.cw.runRequest('Pll/CaseTaskResults/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds a task to the case specified by the CaObectId.\n *\n * @category Task Attachments\n * @param {number} caTaskId - The Task ID to attach the document to\n * @param {number} caObjectId - The Case Object ID\n * @param {string} docName - The file name as it should display in the system\n * @param {string} locationType - The location of the file...leave blank\n * @param {any} file - The binary string for the file\n * @return {Object} Returns Promise that represents an object describing added Attachment\n */\n addTaskAttachment(caTaskId: number, caObjectId: number, docName: number, file: any, locationType?: string) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n CaTaskId: caTaskId,\n DocName: docName\n }\n if(typeof(locationType)!='undefined') {\n _.set(data, 'LocationType', locationType)\n }\n this.cw.runRequest('Pll/CaseRelDocs/AddTaskRelDoc', data, file).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Gets each Document Attached to the specified Task\n *\n * @category Task Attachments\n * @param {number} caTaskId - The Task ID to attach the document to\n * @return {Object} Returns Promise that represents a collection of objects describing each Attachment on the provided task\n */\n getTaskAttachments(caTaskId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskId: caTaskId\n }\n this.cw.runRequest('Pll/CaseRelDocs/ByCaTaskId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Deletes a task attachment by caRelDocId (Related Case Document ID). Same as RelDocs delete for case.\n *\n * @category Task Attachments\n * @param {number} caRelDocId - The caRelDocId for the related document which should be deleted\n * @return {Object} Returns Promise that represents the an object describing the deleted document.\n */\n deleteTaskAttachment(caRelDocId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaRelDocId: caRelDocId\n }\n this.cw.runRequest('PLL/CaseRelDocs/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n\n\n\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class CasePeople {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw: Object) {\n this.cw = cw\n }\n\n /**\n * Add a people record to a case\n *\n * @category Case People\n * @param {number} caObjectId - The Case Object ID for the case to which to add the person\n * @param {number} name - The name of the person to add to the case.\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/service-info/Pll/CasePeople for more options.\n * @return {Object} Returns Promise that represents an object describing the newly-added person. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaPeopleItemBase\n */\n add(caObjectId: number, name: string, options?: Object) {\n return new Promise((resolve, reject) => {\n var init_data = {\n CaObjectId: caObjectId,\n Name: name\n }\n var data = _.merge(init_data, options);\n this.cw.runRequest('Pll/CaseFees/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all the people roles available\n *\n * @category Case People\n * @return {Object} Returns Promise that represents an collection of configured People Roles\n */\n getRoles() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Pll/PeopleRole/All', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get people records attached to a specific case\n *\n * @category Case People\n * @param {number} caObjectId - The Case Object ID for the case to which to add the person\n * @return {Object} Returns Promise that represents an object describing the newly-added person. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaPeopleItemBase\n */\n get(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n }\n this.cw.runRequest('Pll/CasePeople/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete specific people records\n *\n * @category Case People\n * @param {number} caPeopleId - The Case Object ID for the case to which to add the person\n * @return {Object} Returns Promise that represents the result of the delete operation.\n */\n delete(caPeopleId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaPeopleId: caPeopleId,\n }\n this.cw.runRequest('Pll/CasePeople/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete all people records attached to a specific case\n *\n * @category Case People\n * @param {number} caObjectId - The Case Object ID for the case to which to add the person\n * @return {Object} Returns Promise that represents the result of the delete operation.\n */\n deleteAll(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n }\n this.cw.runRequest('Pll/CasePeople/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for people records\n *\n * @category Case People\n * @param {number} searchOptions - Where you specify search options that assume a logical 'and' operation\n * @param {boolean} idsOnly - If you only wants the IDs of the people records that match the search criteria, set this to true. Otherwise, set it to false.\n * @return {Object} Returns Promise that represents an array of people record IDs that match the search criteria.\n */\n search(searchOptions: {\n AddressLine1: string\n AddressLine2: string\n CaObjectId: number\n CaPeopleId: number\n CityName: string\n CountryCode: string\n CountryName: string\n Email: string\n Name: string\n PhoneHome: string\n PhoneMobile: string\n PhoneWork: string\n RoleCode: string\n RoleDesc: string\n RoleId: number\n StateCode: string\n StateName: string\n ZipCode: string\n }, idsOnly: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = searchOptions\n var runUrl: string = 'Pll/CasePeople/SearchObject'\n if(idsOnly) {\n runUrl = 'Pll/CasePeople/Search'\n }\n this.cw.runRequest(runUrl, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\n\nconst _ = require('lodash')\n\nexport class CaseAssets {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Attach asset to case\n *\n * @category Case Assets\n * @param {number} caObjectId - The Case Object to attach the asset to.\n * @param {boolean} updateXY - Whether or not to update the Case's X/Y values when attaching the asset. Defaults to true.\n * @param {Object} [options] - Options for CaseDataGroup including Address, AddressId, AssetId, AssetObjectId, AssetType, CityName, CrossStreet, DateExpired, ExpiredFlag, Facility_Id, FeatureAssetId, FeatureClass, FeatureObjectId, LegacyId, Level_Id, LndObjectId, Location, MasterFlag, ObjectId, StateCode, StreetDirection, StreetFraction, StreetName, StreetNumber, StreetPostDir, StreetType, Suite, TileNo, UpdateCaseData, XCoord, YCoord, ZCoord, and ZipCode\n * @return {Object} Returns Promise that represents an object describing CaAddress.\n * // {\"AddressId\":OBJECTID,\"AssetId\":\"GUID\",\"AssetType\":\"ASSET_NAME\",\"CaObjectId\":CA_OBJECTID,\"FeatureAssetId\":\"GUID\",\"FeatureClass\":\"ASSET_NAME\",\"FeatureObjectId\":OBJECTID,\"Location\":\"Address string\",\"ObjectId\":\"OBJECTID\",\"XCoord\":,\"YCoord\":,\"UpdateCaseData\":false}\n */\n attach(caObjectId: number, updateXY: boolean = true, options?: {Address?: string, AddressId?: number, AssetId?: string, AssetObjectId?: number, AssetType?: string, CityName?: string, CrossStreet?: string, DateExpired?: string, ExpiredFlag?: string, Facility_Id?: string, FeatureAssetId?: string, FeatureClass?: string, FeatureObjectId?: number, LegacyId?: string, Level_Id?: string, LndObjectId?: number, Location?: string, MasterFlag?: string, ObjectId?: string, StateCode?: string, StreetDirection?: string, StreetFraction?: string, StreetName?: string, StreetNumber?: number, StreetPostDir?: string, StreetType?: string, Suite?: string, TileNo?: string, UpdateCaseData?: boolean, XCoord?: number, YCoord?: number, ZCoord?: number, ZipCode?: string}) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n UpdateXY: updateXY\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseAddress/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Detach specific asset from case\n *\n * @category Case Assets\n * @param {number} caObjectId - The Case Object to attach the data group to.\n * @param {boolean} updateXY - Whether or not to update the Case's X/Y values when detaching the assets. Defaults to true.\n * @return {Object} Returns Promise that represents a collection of the default CaDataGroupItemBases.\n */\n detach(caAddressId: number, updateXY: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = {\n CaAddressId: caAddressId,\n UpdateXY: updateXY\n }\n this.cw.runRequest('Pll/CaseAddress/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Detach all assets from case\n *\n * @category Case Assets\n * @param {number} caObjectId - The Case Object to detach the assets from.\n * @param {boolean} updateXY - Whether or not to update the Case's X/Y values when detaching the asset(s). Defaults to false.\n * @return {Object} Returns Promise that represents a collection of detached CaAddressIds.\n */\n detachAll(caObjectId: number, updateXY: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n UpdateXY: updateXY\n }\n this.cw.runRequest('Pll/CaseAddress/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get assets attached to a specific case\n *\n * @category Case Assets\n * @param {number} caObjectId - The Case Object from which to get attached assets\n * @return {Object} Returns Promise that represents a collection of the default CaAddresses.\n */\n getForCase(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseAddress/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n\n /**\n * Search for Case Assets. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Case Assets\n * @param {Object} filters - The parameters to search by. (AssetType, CaAddressId, CaObjectId, CityName, ExpiredFlag, StateCode, StateName, StreetName, StreetNumber, Suite, ZipCode)\n * @return {Object} Returns Promise that represents an Array of resulting CaAddresses\n */\n search(filters?: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['AssetType', 'CaAddressId', 'CaObjectId', 'CityName', 'ExpiredFlag', 'StateCode', 'StateName', 'StreetName', 'StreetNumber', 'Suite', 'ZipCode']).length==0) {\n reject(new CWError(3, 'At least one of the attributes (AssetType, CaAddressId, CaObjectId, CityName, ExpiredFlag, StateCode, StateName, StreetName, StreetNumber, Suite, ZipCode) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseAddress/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\n\nconst _ = require('lodash')\n\nexport class CaseFlags {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Add flag to case\n *\n * @category Case Flags\n * @param {number} caObjectId - The Case Object to add the flag to.\n * @param {number} flagId - The flag ID\n * @param {string} severity - The severity of the flag\n * @param {number} appliedBy - Which userID is applying the flag\n * @param {DateTime} DateApplied - The date that the flag should be applied\n * @param {Object} [options] - Options for CaseFlags includes Notes, DisciplineId, CompletedBy, DateCompleted\n * @return {Object} Returns Promise that represents an object describing CaFlag.\n */\n add(caObjectId: number, flagId: number, severity: string, appliedBy: number, DateApplied: Date, options?: {Notes?: string, DisciplineId?: number, CompletedBy?: number, DateCompleted?: Date}) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n FlagId: flagId,\n Severity: severity,\n AppliedBy: appliedBy,\n DateApplied: DateApplied\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseFlags/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete specific flag from case\n *\n * @category Case Flags\n * @param {number} caObjectId - The Case Object to attach the data group to.\n * @param {boolean} updateXY - Whether or not to update the Case's X/Y values when detaching the flags. Defaults to true.\n * @return {Object} Returns Promise that represents the CaFlag that has been deleted.\n */\n delete(caFlagId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaFlagId: caFlagId\n }\n this.cw.runRequest('Pll/CaseFlags/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete all flags from case\n *\n * @category Case Flags\n * @param {number} caObjectId - The Case Object to detach the flags from.\n * @return {Object} Returns Promise that represents the number of flags deleted from the case provided.\n */\n deleteAll(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseFlags/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get flags attached to a specific case\n *\n * @category Case Flags\n * @param {number} caObjectId - The Case Object from which to get attached flags\n * @return {Object} Returns Promise that represents a collection of the default CaFlags.\n */\n getForCase(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseFlags/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n\n /**\n * Search for Case Flags. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Case Flags\n * @param {Object} filters - The parameters to search by. (CaFlagId, Flag, FlagDesc)\n * @return {Object} Returns Promise that represents an Array of resulting Flags\n */\n search(filters?: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaFlagId', 'Flag', 'FlagDesc']).length==0) {\n reject(new CWError(3, 'At least one of the attributes (CaFlagId, Flag, FlagDesc) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseFlags/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class CaseAdmin {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Add Business Case Template\n *\n * @category Case Templates\n * @param {Object} data - The Business Case Template options.\n * @return {Object} Returns Promise that represents an object describing the created case template. See: /{subdirectory}/apidocs/#/data-type-info;dataType=BusinessCaseItem\n */\n addBusinessCaseTemplate(data: Object) {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Pll/BusinessCase/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Business Case Template\n *\n * @category Case Templates\n * @param {number} busCaseId - The Business Case ID to update\n * @param {Object} data - The Business Case Template options.\n * @return {Object} Returns Promise that represents an object describing the updated case template. See: /{subdirectory}/apidocs/#/data-type-info;dataType=BusinessCaseItem\n */\n updateBusinessCaseTemplate(busCaseId: number, options: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n BusCaseId: busCaseId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/BusinessCase/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Business Case Templates\n *\n * @category Case Templates\n * @return {Object} Returns Promise that represents a collection of Business Case Templates\n */\n getBusinessCaseTemplates() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/BusinessCase/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Case Type\n *\n * @category Types & SubTypes\n * @param {string} caseTypeName - The case type name\n * @param {string} caseTypeDesciption - The case type description\n * @param {Object} options - The other options for the Case Type\n * @return {Object} Returns Promise that represents an object describing the added case type\n */\n addCaseType(caseTypeName: string, caseTypeDesciption: string, options: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n CaseType: caseTypeName,\n CaseTypeDesciption: caseTypeDesciption\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/CaseType/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Case Type\n *\n * @category Types & SubTypes\n * @param {number} caseTypeId - The case Type ID\n * @param {Object} options - The other options for the Case Type\n * @return {Object} Returns Promise that represents an object describing the updated case type\n */\n updateCaseType(caseTypeId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n CaseTypeId: caseTypeId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/CaseType/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Case Types\n *\n * @category Types & SubTypes\n * @return {Object} Returns Promise that represents a collection of CaseTypeItems\n */\n getCaseTypes() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/CaseType/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for CaseTypes. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Types & SubTypes\n * @param {Object} filters - The parameter(s) to search by (CaseType, CaseTypeDesc, CaseTypeId)\n * @return {Object} Returns Promise that represents an Array of CaseTypeIDs\n */\n searchCaseTypeIDs(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaseType', 'CaseTypeDesc', 'CaseTypeId']).length==0) {\n reject(new CWError(2, 'At least one of the attributes (CaFeeId, CaObjectId, FeeCode, FeeDesc) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseType/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for CaseTypes. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Types & SubTypes\n * @param {Object} filters - The parameter(s) to search by (CaseType, CaseTypeDesc, CaseTypeId)\n * @return {Object} Returns Promise that represents a collection of CaseTypeItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=CaseTypeItem\n */\n searchCaseTypeObjects(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaseType', 'CaseTypeDesc', 'CaseTypeId']).length==0) {\n reject(new CWError(3, 'At least one of the attributes (CaseType, CaseTypeDesc, CaseTypeId) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseType/SearchObject', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add SubType\n *\n * @category Types & SubTypes\n * @param {string} subTypeName - The SubTypeId\n * @param {string} subTypeDescription - The SubTypeId\n * @param {Object} options - Other SubType options.\n * @return {Object} Returns Promise that represents an object describing the added SubTypeItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=SubTypeItem\n */\n addSubtype(subTypeName: string, subTypeDescription: string, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n SubType: subTypeName,\n SubTypeDesc: subTypeDescription\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/SubType/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update SubType\n *\n * @category Types & SubTypes\n * @param {number} subTypeId - The SubTypeId\n * @param {Object} options - The case Object ID\n * @return {Object} Returns Promise that represents an object describing the updated SubTypeItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=SubTypeItem\n */\n updateSubtype(subTypeId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n SubTypeId: subTypeId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/SubType/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get SubTypes\n *\n * @category Types & SubTypes\n * @return {Object} Returns Promise that represents a collection of SubTypeItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=SubTypeItem\n */\n getSubtypes() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/SubType/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Fees\n *\n * @category Fees\n * @return {Object} Returns Promise that represents an object describing the added DepartmentItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=DepartmentItem\n */\n getFees() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/FeeSetup/All', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Fees. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @param {Object} filters - The parameter(s) to search by (AccountCode, FeeCode, FeeDesc, FeeSetupId, FeeTypeId).\n * @return {Object} Returns Promise that represents an Array of FeeSetupIDs\n */\n searchFees(filters: {AccountCode?: string, FeeCode?: string, FeeDesc?: string, FeeSetupId?: number, FeeTypeId?: number}) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['AccountCode', 'FeeCode', 'FeeDesc', 'FeeSetupId', 'FeeTypeId']).length==0) {\n reject(new CWError(4, 'At least one of the attributes (AccountCode, FeeCode, FeeDesc, FeeSetupId, FeeTypeId) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/FeeSetup/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Expirations\n *\n * @category Expirations\n * @return {Object} Returns Promise that represents a collection of ExpirationTypeItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=ExpirationTypeItem\n */\n getExpirations() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/ExpirationType/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add an Expiration type\n *\n * @category Expirations\n * @param {Object} options - Must specify OrgId and ExpirationDescType attributes. See: /{subdirectory}/apidocs/#/service-info/Pll/ExpirationType\n * @return {Object} Returns Promise that represents an object describing the newly-added ExpirationTypeItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=ExpirationTypeItem\n */\n addExpiration(options?: Object) {\n return new Promise((resolve, reject) => {\n if(!_.has(options, 'OrgId') || !_.has(options, 'ExpirationTypeDesc')) {\n reject(new CWError(5, 'OrgId and ExpirationTypeDesc must both be defined.'))\n }\n var data = options\n this.cw.runRequest('Pll/ExpirationType/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Deposits\n *\n * @category Deposits\n * @return {Object} Returns Promise that represents a collection of DepositItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=DepositItemBase\n */\n getDeposits() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/Deposit/All', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search Deposits. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @param {Object} filters - The parameter(s) to search by (AccountCode, DepositCode, DepositDesc, DepositId, DepositTypeId).\n * @return {Object} Returns Promise that represents an Array of FeeSetupIDs\n */\n searchDeposits(filters: {AccountCode?: string, DepositCode?: string, DepositDesc?: string, DepositId?: number, DepositTypeId?: number}) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['AccountCode', 'DepositCode', 'DepositDesc', 'DepositId', 'DepositTypeId']).length==0) {\n reject(new CWError(4, 'At least one of the attributes (AccountCode, DepositCode, DepositDesc, DepositId, DepositTypeId) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/Deposit/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Disciplines\n *\n * @category Disciplines\n * @return {Object} Returns Promise that represents a collection of DisciplineItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=DisciplineItem\n */\n getDisciplines() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/Discipline/All', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Department\n *\n * @category Departments & Divisions\n * @param {string} departmentCode - The SubTypeId\n * @param {string} departmentName - The SubTypeId\n * @param {Object} options - Other SubType options.\n * @return {Object} Returns Promise that represents an object describing the added DepartmentItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=DepartmentItem\n */\n addDepartment(departmentCode: string, departmentName: string, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n DepartmentCode: departmentCode,\n DepartmentName: departmentName\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/Department/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Departments\n *\n * @category Departments & Divisions\n * @return {Object} Returns Promise that represents a collection of SubTypeItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=DepartmentItem\n */\n getDepartments() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/Department/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Division\n *\n * @category Departments & Divisions\n * @return {Object} Returns Promise that represents an object describing the newly-added DivisionItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=DivisionItem\n */\n addDivision(departmentId: number, divisionName: string, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n DepartmentId: departmentId,\n DivisionName: divisionName\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/Division/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Divisions\n *\n * @category Departments & Divisions\n * @return {Object} Returns Promise that represents a collection of DivisionItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=DivisionItem\n */\n getDivisions() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/Division/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Inspection Time Block\n *\n * @category Inspections\n * @param {string} labelText - Label for the time block\n * @param {string} startTime - Start time in 24 hour format (HH:mm)\n * @param {string} endTime - End time in 24 hour format (HH:mm)\n * @param {Object} inspTimeBlocksDetails - See: /{subdirectory}/apidocs/#/data-type-info;dataType=InspTimeBlocksDetailItem\n * @return {Object} Returns Promise that represents an object describing the newly-added InspectionTimeBlocksItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=InspectionTimeBlocksItem\n */\n addInspectionTimeBlock(labelText: string, startTime: string, endTime: string, inspTimeBlocksDetails?: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n LabelText: labelText,\n StartTime: startTime,\n EndTime: endTime\n }\n if(typeof(inspTimeBlocksDetails)!='undefined') {\n _.set(data, 'InspTimeBlocksDetails', inspTimeBlocksDetails)\n }\n this.cw.runRequest('Pll/InspectionTimeBlock/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Inspection Time Blocks\n *\n * @category Inspections\n * @return {Object} Returns Promise that represents a collection of InspectionTimeBlocksItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=InspectionTimeBlocksItem\n */\n getInspectionTimeBlocks() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/InspectionTimeBlock/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all NotificationCases\n *\n * @category Notifications\n * @return {Object} Returns Promise that represents a collection of NotificationCaseItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=NotificationCaseItem\n */\n getNotificationCases() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/NotificationCase/GetNotificationCaseList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Notification Types\n *\n * @category Notifications\n * @return {Object} Returns Promise that represents a collection of NotificationCaseItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=NotificationTypeItem\n */\n getNotificationTypes() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/NotificationType/GetNotificationTypeList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Numbering Group\n *\n * @category NumberingGroups\n * @param {number} options - attributes or update\n * @return {Object} Returns Promise that represents an object describing the newly-added NumberingGroupItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=NumberingGroupItem\n */\n addNumberingGroup(options: Object) {\n return new Promise((resolve, reject) => {\n var data = options\n this.cw.runRequest('Pll/NumberingGroup/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Numbering Group\n *\n * @category NumberingGroups\n * @param {number} numberingGroupId - ID of NumberGroup to update\n * @param {number} options - updates attributes\n * @return {Object} Returns Promise that represents an object describing the newly-added HolidaysItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=NumberingGroupItem\n */\n updateNumberingGroup(numberingGroupId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n NumberingGroupId: numberingGroupId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/NumberingGroup/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Numbering Groups\n *\n * @category NumberingGroups\n * @return {Object} Returns Promise that represents a collection of NumberingGroupItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=NumberingGroupItem\n */\n getNumberingGroups() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/NumberingGroup/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Person\n *\n * @category People\n * @param {string} name - Name of person\n * @param {Object} options - attributes for new person\n * @return {Object} Returns Promise that represents an object describing the newly-added NumberingGroupItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=NumberingGroupItem\n */\n addPerson(name: string, options: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n Name: name\n }\n var data = _.merge(options, data_init)\n this.cw.runRequest('Pll/People/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all People\n *\n * @category People\n * @return {Object} Returns Promise that represents a collection of PeopleItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=PeopleItem\n */\n getPeople() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/People/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add People Role\n *\n * @category People\n * @param {string} name - Name of person\n * @param {Object} options - attributes for new person. See: /{subdirectory}/apidocs/#/service-info/Pll/PeopleRole\n * @return {Object} Returns Promise that represents an object describing the newly-added PeopleRoleItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=PeopleRoleItem\n */\n addPeopleRole(roleCode: string, options: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n RoleCode: roleCode\n }\n var data = _.merge(options, data_init)\n this.cw.runRequest('Pll/People/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all PeopleRoles\n *\n * @category People\n * @return {Object} Returns Promise that represents a collection of PeopleRoleItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=PeopleRoleItem\n */\n getPeopleRoles() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/PeopleRole/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add TaskResultDetail\n *\n * @category TaskResults\n * @param {Object} options - attributes for new TaskResultDetail. See: /{subdirectory}/apidocs/#/service-info/Pll/TaskResultDetail\n * @return {Object} Returns Promise that represents an object describing the newly-added TaskResultDetailItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=TaskResultDetailItem\n */\n addTaskResultDetail(options: Object) {\n return new Promise((resolve, reject) => {\n var data = options\n this.cw.runRequest('Pll/TaskResultDetail/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update TaskResultDetail\n *\n * @category TaskResults\n * @param {string} resultDetailId - Result Detail ID\n * @param {Object} options - attributes for new person. See: /{subdirectory}/apidocs/#/service-info/Pll/TaskResultDetail\n * @return {Object} Returns Promise that represents an object describing the newly-added TaskResultDetailItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=TaskResultDetailItem\n */\n updateTaskResultDetail(resultDetailId: number, options: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n ResultDetailId: resultDetailId\n }\n var data = _.merge(options, data_init)\n this.cw.runRequest('Pll/TaskResultDetail/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all TaskResultDetails\n *\n * @category TaskResults\n * @return {Object} Returns Promise that represents a collection of PeopleRoleItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=PeopleRoleItem\n */\n getTaskResultDetails() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/TaskResultDetail/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add TaskResultFeeInsert\n *\n * @category TaskResults\n * @param {Object} options - attributes for new TaskResultFeeInsert. See: /{subdirectory}/apidocs/#/service-info/Pll/TaskResultFeeInsert\n * @return {Object} Returns Promise that represents an object describing the newly-added TaskResultFeeInsertItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=TaskResultFeeInsertItem\n */\n addTaskResultFeeInsert(options: Object) {\n return new Promise((resolve, reject) => {\n var data = options\n this.cw.runRequest('Pll/TaskResultFeeInsert/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete TaskResultFeeInsert\n *\n * @category TaskResults\n * @param {number} taskResultFeeInsertId - ID for TaskResultFeeInsert to be deleted.\n * @return {Object} Returns Promise that represents the ID Number of the deleted TaskResultFeeInsertItem.\n */\n deleteTaskResultFeeInsert(taskResultFeeInsertId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n TaskResultFeeInsertId: taskResultFeeInsertId\n }\n this.cw.runRequest('Pll/TaskResultFeeInsert/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete TaskResultFeeInsert(s) by Task ID\n *\n * @category TaskResults\n * @param {number} taskId - ID for Task parent of TaskResultFeeInsert(s) to be deleted.\n * @return {Object} Returns Promise that represents the ID Number of the Task parent of the deleted TaskResultFeeInsertItem(s).\n */\n deleteTaskResultFeeInsertByTaskId(taskId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n TaskId: taskId\n }\n this.cw.runRequest('Pll/TaskResultFeeInsert/DeleteByTaskId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update TaskResultFeeInsert\n *\n * @category TaskResults\n * @param {number} taskResultFeeInsertId - ID for TaskResultFeeInsert to be updated.\n * @param {number} taskId - Updated TaskID\n * @param {number} taskResultId - Updated TaskResultId\n * @param {number} [feeSetupId] - Fee setup ID update for TaskResultFeeInsert\n * @return {Object} Returns Promise that represents the ID Number of the updated TaskResultFeeInsertItem.\n */\n updateTaskResultFeeInsert(taskResultFeeInsertId: number, taskId: number, taskResultId: number, feeSetupId?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n TaskResultFeeInsertId: taskResultFeeInsertId,\n TaskId: taskId,\n TaskResultId: taskResultId\n }\n if(typeof(feeSetupId)!='undefined') {\n _.set(data, 'FeeSetupId', feeSetupId)\n }\n this.cw.runRequest('Pll/TaskResultFeeInsert/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n\n /**\n * Get all TaskResultFeeInsert\n *\n * @category TaskResults\n * @return {Object} Returns Promise that represents a collection of TaskResultFeeInsertItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=TaskResultFeeInsertItem\n */\n getTaskResultFeeInsert() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/TaskResultFeeInsert/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class WorkOrderAdmin {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Get entity groups\n *\n * @category WorkOrders Admin\n * @return {Object} Returns Promise that represents a collection of all entity groups\n */\n getEntityGroups() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Ams/Entity/Groups', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get entity types\n *\n * @category WorkOrders Admin\n * @return {Object} Returns Promise that represents a collection of all GIS WorkOrder entity types\n */\n getEntityTypes(entityGroups:Array<string>) {\n return new Promise((resolve, reject) => {\n var data = {EntityGroups: entityGroups}\n this.cw.runRequest('Ams/Designer/WOTemplates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get WorkOrder templates\n *\n * @category WorkOrders Admin\n * @return {Object} Returns Promise that represents a collection of all WorkOrder templates\n */\n getTemplates(entityType:string, includeComments:boolean=true, includeInstructions:boolean=true) {\n return new Promise((resolve, reject) => {\n var data = {EntityType: entityType, IncludeComments: includeComments, IncludeInstructions: includeInstructions}\n this.cw.runRequest('Ams/Designer/WOTemplates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update WorkOrder template\n *\n * @category WorkOrders Admin\n * @param {Object} wOTemplate - Obect that describes the WorkOrder Template\n * @return {Object} Returns Promise that represents a collection of all\n */\n updateTemplate(wOTemplate:Object) {\n let valid_fields = [\"AcctNum\", \"AutoCreateTask\", \"Cancel\", \"Comments\", \"CopyCustomFieldVal\", \"CycleFrom\", \"CycleIncludeWeekends\", \"CycleIntervalNum\", \"CycleIntervalUnit\", \"CycleType\", \"DaysToComplete\", \"DefaultProject\", \"DefaultProjectSid\", \"Description\", \"Effort\", \"ExpenseType\", \"Instructions\", \"IsReactive\", \"MaintScore\", \"NumDaysBefore\", \"Priority\", \"RequireAssetOnClose\", \"Shop\", \"Stage\", \"SubmitToEmployeeSid\", \"SupervisorEmployeeSid\", \"UnitsAccompDesc\", \"UnitsAccompDescLock\", \"WOCategory\", \"WOCustFieldCatId\", \"WOPrintTmpt\", \"WOTemplateId\", \"WorkMonth\"]\n return new Promise((resolve, reject) => {\n var data = wOTemplate\n this.cw.runRequest('Ams/Designer/WOTemplates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get template group rights for provided WorkOrder Templates\n *\n * @category WorkOrders Admin\n * @param {Array<number>} wOTemplateIds - Array one or more WorkOrder Template IDs\n * @return {Object} Returns Promise that represents a collection of all\n */\n getTemplateGroupRights(wOTemplateIds:Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateIds: wOTemplateIds}\n this.cw.runRequest('Ams/Designer/WOTemplates', data).then(r => { // TODO: Update this URL\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get template activity services for provided WorkOrder Templates\n *\n * @category WorkOrders Admin\n * @param {Array<number>} wOTemplateIds - Array one or more WorkOrder Template IDs\n * @return {Object} Returns Promise that represents a collection of all\n */\n getTemplateActivity(wOTemplateIds:Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateIds: wOTemplateIds}\n this.cw.runRequest('Ams/Designer/WOTemplateActivityService', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get fields which will be updated when provided WorkOrder Template instance closes\n *\n * @category WorkOrders Admin\n * @param {Array<number>} wOTemplateIds - Array one or more WorkOrder Template IDs\n * @return {Object} Returns Promise that represents a collection of all\n */\n getUpdateFields(wOTemplateIds:Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateIds: wOTemplateIds}\n this.cw.runRequest('Ams/Designer/WOTemplateUpdateFields', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get equipment\n *\n * @category WorkOrders Admin\n * @param {Array<number>} wOTemplateIds - WorkOrder Template ID\n * @return {Object} Returns Promise that represents a collection of all\n */\n getTemplateEquipment(wOTemplateId:number) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateId: wOTemplateId}\n this.cw.runRequest('Ams/Designer/WOTemplateEquipment', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get labor\n *\n * @category WorkOrders Admin\n * @param {Array<number>} wOTemplateIds - WorkOrder Template ID\n * @return {Object} Returns Promise that represents a collection of all\n */\n getTemplateLabor(wOTemplateId:number) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateId: wOTemplateId}\n this.cw.runRequest('Ams/Designer/WOTemplateLabor', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get material\n *\n * @category WorkOrders Admin\n * @param {number} wOTemplateId - WorkOrder Template ID\n * @return {Object} Returns Promise that represents a collection of all\n */\n getTemplateMaterial(wOTemplateId:number) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateId: wOTemplateId}\n this.cw.runRequest('Ams/Designer/WOTemplateMaterial', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get map layer fields configured for provided WorkOrder template\n *\n * @category WorkOrders Admin\n * @param {number} wOTemplateId - WorkOrder Template ID\n * @return {Object} Returns Promise that represents a collection of all\n */\n getTemplateMapLayerFields(wOTemplateId:number) {\n return new Promise((resolve, reject) => {\n var data = {WorkOrderTemplateId: wOTemplateId}\n this.cw.runRequest('Ams/Designer/WorkOrderTemplateMapLayerFields', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get tasks configured for provided WorkOrder template\n *\n * @category WorkOrders Admin\n * @param {number} wOTemplateId - WorkOrder Template ID\n * @return {Object} Returns Promise that represents a collection of all tasks on WorkOrder template\n */\n getTemplateTasks(wOTemplateId:number) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateId: wOTemplateId}\n this.cw.runRequest('Ams/Tasks/ByWorkOrderTemplate', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspections connected to provided WorkOrder template\n *\n * @category WorkOrders Admin\n * @param {number} wOTemplateId - WorkOrder Template ID\n * @return {Object} Returns Promise that represents a collection of all tasks on WorkOrder template\n */\n getRelatedInspectionTemplates(wOTemplateId:number) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateId: wOTemplateId}\n this.cw.runRequest('Ams/Designer/WOTemplateInspections', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class InspectionAdmin {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Get inspection templates\n *\n * @category Inspection Templates\n * @param {Array<string>} [entityTypes] - The Entity Type(s) to return potential inspections for\n * @param {boolean} [canCreate] - If true, only return templates the user can create, ignored if false or null, default is true\n * @param {Object} [options] - An object which can include: [IncludeInactive]: boolean, MaximumDateModified: Date, MinimumDateModified: Date, TemplateIds: Array<number>\n * @return {Object} Returns Promise that represents a collection of all Inspections matching the provided parameters\n */\n getTemplates(entityTypes?: Array<string>, canCreate?: boolean, options?: {IncludeInactive?: boolean, MaximumDateModified?: Date, MinimumDateModified?: Date, TemplateIds?: Array<number>}) {\n return new Promise((resolve, reject) => {\n var data: {EntityTypes?: Array<string>, CanCreate?: boolean, IncludeInactive?: boolean, MaximumDateModified?: Date, MinimumDateModified?: Date, TemplateIds?: Array<number>} = {}\n if(typeof(entityTypes)!=='undefined') {\n data.EntityTypes = entityTypes\n }\n data.CanCreate = typeof(canCreate)!=='undefined' ? canCreate : true\n if(typeof(options)==='object') {\n _.forIn(options, (v, k) => {\n data[k] = v\n })\n }\n this.cw.runRequest('Ams/InspectionTemplate/Templates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class RequestAdmin {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Get service request templates\n *\n * @category Requests Admin\n * @param {Object} searchData - search data\n * @return {Object} Returns Promise that represents a collection of all Service Request Templates\n */\n getTemplates(searchData: Object) {\n return new Promise((resolve, reject) => {\n var data = searchData\n this.cw.runRequest('Ams/ServiceRequestTemplate/Templates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n}\n","import { CWError } from './error'\nimport ReversibleMap from 'reversible-map'\nconst _ = require('lodash')\n\nexport class WorkOrderCosts {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Storage of object's active activityType\n */\n currentActivityType: string\n\n /**\n * @hidden\n */\n constructor(cw:any) {\n this.cw = cw\n this.currentActivityType = \"WorkOrder\"\n }\n\n /**\n * Get Cost Codes\n *\n * @category Labor Costs\n * @param {Array<number>} employeeSids - A list of Employee IDs for which to get the job codes.\n * @param {boolean} commonOnly - Set to true to get the Cost Codes that are common to ALL employees in the list, otherwise get all job codes that apply to at least one employee in the list.\n * @return {Object} Returns Promise that represents an object describing\n */\n getCodes(employeeSids: Object, commonOnly: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n EmployeeSids: employeeSids,\n CommonCodesOnly: commonOnly\n }\n this.cw.runRequest('Ams/LaborCost/CostCodes', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Job Codes\n *\n * @category Labor Costs\n * @return {Object} Returns Promise that represents an object describing\n */\n getJobCodes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/LaborCost/JobCodes').then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add WorkOrder Labor Costs\n *\n * @category WorkOrder Costs\n * @param {number} workOrderSid - Array of inspection labor costings\n * @param {number} hours - Number of hours to add\n * @param {Object} options - options for the work order\n * @return {Object} Returns Promise that represents an object describing\n */\n addLabor(workOrderSid: number, hours: number, options: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderSid: workOrderSid,\n Hours: hours\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n // TODO: ensure each object has Hours & InspectionId\n this.cw.runRequest('Ams/LaborCost/AddWorkOrderCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Labor Costs for WorkOrder(s)\n *\n * @category WorkOrder Costs\n * @param {Array<number>} workOrderSids - Array of request Ids to get costs for\n * @param {boolean} estimated - Whether to get estimates or actuals (defaults to false -- get actuals)\n * @return {Object} Returns Promise that represents an object describing\n */\n getLabor(workOrderSids: Array<number>, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n Estimated: estimated,\n WorkOrderSids: workOrderSids\n }\n this.cw.runRequest('Ams/LaborCost/WorkOrderCostsByWorkOrder', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete WorkOrder Labor Costs\n *\n * @category WorkOrder Costs\n * @param {Array<number>} laborCostIds - List of labor cost IDs to delete\n * @param {boolean} estimated - Whether to delete estimates or actuals (defaults to false -- delete actuals)\n * @return {Object} Returns Promise that represents an object describing\n */\n deleteLabor(laborCostIds: Array<number>, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n LaborCostIds: laborCostIds,\n Estimated: estimated\n }\n this.cw.runRequest('Ams/LaborCost/DeleteWorkOrderCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add WorkOrder Equipment Costs\n *\n * @category WorkOrder Costs\n * @param {Object} workOrderSid - the work order to add the equipment costs to\n * @param {Object} options - additional options\n * @return {Object} Returns Promise that represents an object describing\n */\n addEquipment(workOrderSid: number, options: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderSid: workOrderSid\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n // TODO: ensure each object has Hours & InspectionId\n this.cw.runRequest('Ams/EquipmentCost/AddWorkOrderCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Equipment Costs for WorkOrder(s)\n *\n * @category WorkOrder Costs\n * @param {number} workOrderSid - the work order to add the equipment costs to\n * @param {boolean} estimated - true to get estimated costs. defaults to false\n * @return {Object} Returns Promise that represents an object describing\n */\n // WorkOrderCostsByWorkOrderList<EquipmentCost>\n getEquipment(workOrderSid: number, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderSid: workOrderSid,\n Estimated: estimated\n }\n // TODO: ensure each object has Hours & InspectionId\n this.cw.runRequest('Ams/EquipmentCost/WorkOrderCostsByWorkOrder', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete WorkOrder Equipment Costs\n *\n * @category WorkOrder Costs\n * @param {Object} \n * @return {Object} Returns Promise that represents an object describing\n */\n deleteEquipment(equipmentCostIds: Array<number>, estimated: boolean = false) { // \"WorkOrderId\", \"WorkOrderSid\", \"Estimated\", \"MaterialSids\", \"Units\", \"AcctNum\", \"Source\", \"TransDate\", \"ContractorSids\", \"ContractorMaterialId\", \"ContractorMaterialDescription\", \"ContractorMaterialCost\", \"TaskIds\", \"Entities\", \"CombineIssuesByMaterialSid\"\n return new Promise((resolve, reject) => {\n var data = {\n EquipmentCostIds: equipmentCostIds,\n Estimated: estimated\n }\n this.cw.runRequest('Ams/EquipmentCost/DeleteWorkOrderCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add WorkOrder Material Costs\n *\n * @category WorkOrder Costs\n * @param {number} workOrderSid - Work Order SID number to add the material to\n * @param {number} units - Decimal units for material \n * @param {Object} options - Additional work order options\n * @param {boolean} combineIssuesByMaterialSid - Combine issues with the same MaterialSid into a single commit, default is true\n * @return {Object} Returns Promise that represents a collection describing the work order material costs\n */\n addMaterial(workOrderSid: number, units: number, options: Object, combineIssuesByMaterialSid: boolean = true) { // \"WorkOrderId\", \"WorkOrderSid\", \"Estimated\", \"MaterialSids\", \"Units\", \"AcctNum\", \"Source\", \"TransDate\", \"ContractorSids\", \"ContractorMaterialId\", \"ContractorMaterialDescription\", \"ContractorMaterialCost\", \"TaskIds\", \"Entities\", \"CombineIssuesByMaterialSid\"\n return new Promise((resolve, reject) => {\n var data = {\n Units: units,\n WorkOrderSid: workOrderSid,\n CombineIssuesByMaterialSid: combineIssuesByMaterialSid\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Ams/MaterialCost/AddWorkOrderCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Material Costs for WorkOrder(s)\n *\n * @category WorkOrder Costs\n * @param {number} workOrderSid - the work order to add the equipment costs to\n * @param {boolean} estimated - true to get estimated costs. defaults to false and gets actuals.\n * @return {Object} Returns Promise that represents an object describing\n */\n getMaterial(workOrderSid: number, estimated: boolean = false) { // \"WorkOrderId\", \"WorkOrderSid\", \"Estimated\", \"MaterialSids\", \"Units\", \"AcctNum\", \"Source\", \"TransDate\", \"ContractorSids\", \"ContractorMaterialId\", \"ContractorMaterialDescription\", \"ContractorMaterialCost\", \"TaskIds\", \"Entities\", \"CombineIssuesByMaterialSid\"\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderSid: workOrderSid,\n Estimated: estimated\n }\n this.cw.runRequest('Ams/MaterialCost/AddWorkOrderCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete WorkOrder Material Costs\n *\n * @category WorkOrder Costs\n * @param {Array<number>} materialCostIds - list of material cost IDs to delete\n * @param {boolean} estimated - true to delete the estimated costs. defaults to false and deletes actuals.\n * @return {Object} Returns Promise that represents an object describing\n */\n deleteMaterial(materialCostIds: number, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n MaterialCostIds: materialCostIds,\n Estimated: estimated\n }\n this.cw.runRequest('Ams/MaterialCost/DeleteWorkOrderCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n}\n","import { CWError } from './error'\nimport ReversibleMap from 'reversible-map'\nconst _ = require('lodash')\n\nexport class InspectionCosts {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Storage of object's active activityType\n */\n currentActivityType: string\n\n /**\n * @hidden\n */\n constructor(cw:any) {\n this.cw = cw\n this.currentActivityType = \"Inspection\"\n }\n\n /**\n * Get Cost Codes\n *\n * @category Labor Costs\n * @param {Array<number>} employeeSids - A list of Employee IDs for which to get the job codes.\n * @param {boolean} commonOnly - Set to true to get the Cost Codes that are common to ALL employees in the list, otherwise get all job codes that apply to at least one employee in the list.\n * @return {Object} Returns Promise that represents an object describing\n */\n getCodes(employeeSids: Object, commonOnly: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n EmployeeSids: employeeSids,\n CommonCodesOnly: commonOnly\n }\n this.cw.runRequest('Ams/LaborCost/CostCodes', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Job Codes\n *\n * @category Labor Costs\n * @return {Object} Returns Promise that represents an object describing\n */\n getJobCodes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/LaborCost/JobCodes').then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Inspection Labor Costs\n *\n * @category Inspection Costs\n * @param {number} inspectionId - Inspection ID to add labor costs to\n * @param {number} hours - The hours to add to the inspection\n * @param {Object} options - Additional settings for hours setting\n * @param {boolean} estimated - Boolean, get estimated or real costs, defaults to false (get real by default)\n * @return {Object} Returns Promise that represents an object describing\n */\n addLabor(inspectionId: number, hours: number, options?: object, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n Estimated: estimated,\n InspectionIds: inspectionId,\n Hours: hours\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Ams/LaborCost/AddInspectionCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Labor Costs for a specific list of Inspections\n *\n * @category Inspection Costs\n * @param {Array<int>} inspectionIds - An array of inspection IDs to get associated costs for.\n * @param {boolean} estimated - Boolean, get estimated or real costs, defaults to false (get real by default)\n * @return {Object} Returns Promise that represents an object describing\n */\n getLabor(inspectionIds: Array<number>, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n Estimated: estimated,\n InspectionIds: inspectionIds\n }\n this.cw.runRequest('Ams/LaborCost/InspectionCostsByInspection', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Inspection Labor Costs\n *\n * @category Inspection Costs\n * @param {Array<int>} laborCostIds - An array of inspection labor cost IDs to delete\n * @param {boolean} estimated - Boolean, delete estimated or real costs, defaults to false (delete real by default)\n * @return {Object} Returns Promise that represents an object describing\n */\n deleteLabor(laborCostIds: Array<number>, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n Estimated: estimated,\n reqLaborCostIds: laborCostIds\n }\n this.cw.runRequest('Ams/LaborCost/DeleteInspectionCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Inspection Equipment Costs\n *\n * @category Inspection Costs\n * @param {Object} inspectionId - the inspection to add the equipment costs to\n * @param {Object} options - additional options\n * @return {Object} Returns Promise that represents an object describing\n */\n addEquipment(inspectionId: number, options: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionId: inspectionId\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n // TODO: ensure each object has Hours & InspectionId\n this.cw.runRequest('Ams/EquipmentCost/AddInspectionCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n \n /**\n * Get Equipment Costs for Inspection(s)\n *\n * @category Inspection Costs\n * @param {Array<number>} inspectionIds - the inspection to get the equipment costs for.\n * @param {Object} estimated - get estimated equipment costs. Defaults to false.\n * @return {Object} Returns Promise that represents an object describing\n */\n getEquipment(inspectionIds: number, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionIds: inspectionIds,\n Estimated: estimated\n }\n this.cw.runRequest('Ams/EquipmentCost/InspectionCostsByInspection', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Inspection Equipment Costs\n *\n * @category Inspection Costs\n * @param {Array<number>} equipmentCostIds - the equipment cost IDs to delete.\n * @param {Object} estimated - delete estimated equipment costs. Defaults to false.\n * @return {Object} Returns Promise that represents an object describing\n */\n deleteEquipment(equipmentCostIds: Array<number>, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n EquipmentCostIds: equipmentCostIds,\n Estimated: estimated\n }\n this.cw.runRequest('Ams/EquipmentCost/DeleteInspectionCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nimport ReversibleMap from 'reversible-map'\nconst _ = require('lodash')\n\nexport class RequestCosts {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Storage of object's active activityType\n */\n currentActivityType: string\n\n /**\n * @hidden\n */\n constructor(cw:any) {\n this.cw = cw\n this.currentActivityType = \"Request\"\n }\n\n /**\n * Get Cost Codes\n *\n * @category Labor Costs\n * @param {Array<number>} employeeSids - A list of Employee IDs for which to get the job codes.\n * @param {boolean} commonOnly - Set to true to get the Cost Codes that are common to ALL employees in the list, otherwise get all job codes that apply to at least one employee in the list.\n * @return {Object} Returns Promise that represents an object describing\n */\n getCodes(employeeSids: Object, commonOnly: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n EmployeeSids: employeeSids,\n CommonCodesOnly: commonOnly\n }\n this.cw.runRequest('Ams/LaborCost/CostCodes', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Job Codes\n *\n * @category Labor Costs\n * @return {Object} Returns Promise that represents an object describing\n */\n getJobCodes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/LaborCost/JobCodes').then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Request Labor Costs\n *\n * @category Request Costs\n * @param {Object} requestCosts - Array of inspection labor costings\n * @return {Object} Returns Promise that represents an object describing\n */\n addLabor(requestCosts: Array<Object>) {\n return new Promise((resolve, reject) => {\n var data = requestCosts\n // TODO: ensure each object has Hours & InspectionId\n this.cw.runRequest('Ams/LaborCost/AddRequestCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Labor Costs for Request(s)\n *\n * @category Request Costs\n * @param {Array<number>} requestIds - Array of request Ids to get costs for\n * @return {Object} Returns Promise that represents an object describing\n */\n getLabor(requestIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds\n }\n this.cw.runRequest('Ams/LaborCost/RequestCostsByRequest', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Request Labor Costs\n *\n * @category Request Costs\n * @param {Array<number>} laborCostIds - Array of request labor cost Ids to delete\n * @return {Object} Returns Promise that represents an object describing\n */\n deleteLabor(laborCostIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n LaborCostIds: laborCostIds\n }\n this.cw.runRequest('Ams/LaborCost/DeleteRequestCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n}\n","import { CWError } from './error'\nimport { General } from './general'\nimport { Attachments } from './attachments'\nimport { ActivityLinks } from './activity_link'\nimport { Gis } from './gis'\nimport { MessageQueue } from './message_queue'\nimport { Search } from './search'\nimport { Query } from './query'\nimport { Report } from './report'\nimport { Request } from './request'\nimport { Inspection } from './inspection'\nimport { WorkOrder } from './workorder'\nimport { Briefcase } from './briefcase'\nimport { CaseData } from './case_data'\nimport { CaseFinancial } from './case_financial'\nimport { CaseWorkflow} from './case_workflow'\nimport { CasePeople } from './case_people'\nimport { CaseAssets } from './case_assets'\nimport { CaseFlags } from './case_flags'\nimport { CaseAdmin } from './case_admin'\nimport { Comments } from './comments'\nimport { WorkOrderAdmin } from './workorder_admin'\nimport { InspectionAdmin } from './inspection_admin'\nimport { RequestAdmin } from './request_admin'\nimport { WorkOrderCosts } from './workorder_costs'\nimport { InspectionCosts } from './inspection_costs'\nimport { RequestCosts } from './request_costs'\n\nconst https = require('https')\nconst querystring = require('querystring')\nconst _ = require('lodash')\nconst FormData = require('form-data')\nconst fs = require('fs')\nconst path = require('path')\n// const mimetypes = require('mime-types')\nconst axios = require('axios')\n\ninterface postData {\n data?: string\n token?: string\n file?: any\n}\n\ninterface Citywork {\n}\n\n/**\n * Core class Cityworks with most of the authentication and install capabilities functions\n */\nclass Cityworks implements Citywork {\n /**\n * The domain of the cityworks install. Defaults to Cityworks Online\n */\n private base_url: string\n /**\n * Stores the currently in use authentication token\n */\n private Token?: string\n /**\n * Stores the login username\n */\n private login?: string\n /**\n * Holds the login password\n */\n private password?: string\n /**\n * Holds the GIS Token for GIS-based Authentication (Portal)\n */\n private gisToken?: string\n /**\n * Holds the GIS Token URL for GIS-based Authentication (Portal)\n */\n private gisTokenUrl?: string\n /**\n * Stores settings including path (defaults to \"cityworks\"), secure (defaults to true), expires (defaults to null - does not expire), default_domain\n */\n private settings: {\n path: string,\n secure: boolean,\n expires: any,\n default_domain?: any,\n version: number\n }\n error?: any\n\n private extensions: Object\n private features: Object\n private potential_loads: Array<string>\n\n /**\n * Contructor for a new cityworks instance's object, allows one to optionally configure the domain and other settings right from the get-go\n * @param {string} [base_url] - The base url of your Cityworks instance\n * @param {object} [settings] - The settings for your Cityworks site. Full list: {path: (defaults to \"cityworks\"), secure: defaults to true, expires: defaults to NULL, does not expire, default_domain: defaults to NULL, uses default user domain, version: defaults to 23, for 15.x set to 15}\n * @param {array} [load] - allows user to choose which modules to load and make available. Full availability array: ['general', 'activity_link', 'message_queue', 'gis', 'workorder', 'inspection', 'request', 'case']\n */\n constructor(base_url?: string, settings?: Object, load?: Array<string>) {\n this.base_url = 'cityworksonline'\n this.extensions = {\"UnknownExtension\": 0, \"CwAnalytics\": 1, \"WebHooks\": 2, \"PLLPublicApp\": 3, \"ActivityUpdate\": 4, \"SingleSignOn\": 5}\n this.features = {\"UnknownFeature\": 0, \"ViewInspections\": 1, \"EditInspections\": 2, \"ViewServiceRequest\": 3, \"EditServiceRequest\": 4, \"ViewWorkOrder\": 5, \"EditWorkOrder\": 6, \"EquipmentCheckOut\": 7, \"OfficeField\": 8, \"Respond\": 9, \"Eurl\": 10, \"PaverInterface\": 11, \"Contracts\": 12, \"Storeroom\": 13, \"PLL\": 14, \"Cw4XL\": 15, \"TableEditor\": 16, \"CCTVInterface\": 17, \"MobileAndroid\": 18, \"MobileiOS\": 19, \"PerformanceBudgeting\": 20, \"Insights\": 21, \"RespondCase\": 22, \"RespondInspection\": 23, \"RespondServiceRequest\": 24, \"RespondTaskManager\": 25, \"RespondWorkOrder\": 26, \"Workload\": 27, \"OpX\": 28, \"TrimbleUnityMobile\": 29, \"TrimbleVegetationManager\": 30}\n this.settings = {\n path: 'cityworks',\n secure: true,\n expires: null,\n default_domain: null,\n version: 23\n }\n this.potential_loads = ['general', 'activity_link', 'message_queue', 'gis', 'search', 'request', 'report', 'case', 'case_financial']\n if(typeof(base_url)!='undefined') {\n this.configure(base_url, settings, load)\n }\n }\n\n /**\n * Configure a new cityworks instance's domain and other settings\n *\n * @param {string} [base_url] - The first color, in hexadecimal format.\n * @param {object} [settings] - The second color, in hexadecimal format.\n * @param {array} [load] - allows user to choose which modules to load and make available. Full availability array: ['general', 'activity_link', 'message_queue', 'gis', 'search', 'workorder', 'inspection', 'request', 'report', 'case']\n * @return {boolean} Returns true if successful, otherwise, throws error\n */\n configure(base_url?: string, settings?: Object, load?: Array<string>) {\n if(typeof base_url !== 'undefined') { this.base_url = base_url } else { this.base_url = 'cityworksonline' }\n this.settings = {\n path: 'cityworks',\n secure: true,\n expires: null,\n default_domain: null,\n version: 23\n }\n\n if(typeof(settings)!='undefined') {\n _.forEach(settings, (v,k) => {\n if(typeof(this.settings[k])!='undefined') {this.settings[k] = v}\n })\n }\n }\n\n /**\n * Send a request to the Cityworks API\n *\n * If one ever needs to access or call an unimplemented API endpoint of a Cityworks install, one can call this method directly with the path and data payload:\n *\n * `cityworks.runRequest(service_path, post_data)`\n *\n * @param {string} service_path - The path to the particular endpoint\n * @param {any} post_data - The data object to be sent to the Cityworks API\n * @param {string} post_file - The path of the file to send to the Cityworks API\n * @return {Object} Returns Promise object that represents the json object returned from the Cityworks API\n */\n runRequest(service_path: string, post_data?: any, post_file?: string) {\n return new Promise((resolve, reject) => {\n let pd = {} as postData\n var file_name = ''\n var file_type = ''\n\n if(typeof(post_data) !== 'undefined') {\n pd.data = JSON.stringify(post_data)\n }\n\n if(this.settings.version<23 && typeof(this.Token) !== 'undefined' && this.Token != '' && service_path!='General/Authentication/CityworksOnlineAuthenticate' && service_path!='General/Authentication/Authenticate') {\n pd.token = this.Token\n }\n\n let obj: {\n Status: number,\n Message: string\n }\n\n let options = {\n hostname: this.base_url,\n port: 443,\n path: '/' + this.settings.path + '/services/' + service_path,\n method: 'GET',\n headers: {},\n timeout: 10000000\n }\n if(this.settings.secure==false) {\n options.port = 80\n }\n if(this.settings.version>=23 && typeof(this.Token) !== 'undefined' && this.Token != '' && service_path!='General/Authentication/CityworksOnlineAuthenticate' && service_path!='General/Authentication/Authenticate') {\n _.set(options, 'headers.Authorization', 'cityworks ' + this.Token)\n if(!_.isEmpty(pd)) {\n _.set(options, 'method', 'POST')\n }\n }\n\n if(typeof(post_file)!=='undefined') {\n // file_name = path.basename(post_file)\n // file_type = mimetypes.lookup(path.extname(post_file))\n var cw_url = 'https://'\n if(options.port==80) {\n cw_url = 'http://'\n }\n cw_url += options.hostname+options.path\n if(this.settings.version<23 && typeof(this.Token) !== 'undefined' && this.Token != '' && service_path!='General/Authentication/CityworksOnlineAuthenticate' && service_path!='General/Authentication/Authenticate') {\n cw_url += '?token='+this.Token\n }\n axios.postForm(cw_url, {\n data: JSON.stringify(post_data),\n file: fs.createReadStream(post_file)\n }, {\n headers: options.headers\n }).then((r) => {\n resolve(r.data)\n })\n } else if(_.startsWith(service_path, 'Pll/BusinessCaseReports/Download') || _.startsWith(service_path, 'Ams/Reports/Download')) {\n /* ActiveReport downloading thanks to @ksfff5 */\n https.get(options, resp => {\n // Create an empty buffer for pdf data\n // String would apply encoding to the raw data\n var data: Buffer = Buffer.concat([])\n\n // Grab the chunks of pdf and store in buffer\n // The readable event may trigger multiple times before the full pdf is read, so chunk it\n resp.on('readable', () => {\n const chunk: Buffer = resp.read()\n if(!(chunk == null)) {\n data = Buffer.concat([data, chunk])\n }\n })\n\n // Done, resolve PDF\n resp.on('end', () => {\n resolve(data)\n })\n })\n /* End pf ActiveReport downloading thanks to @ksfff5 */\n } else {\n // if(service_path=='Pll/CaseFlags/DeleteByCaObjectId') {\n // console.log(options)\n // console.log(pd)\n // process.exit(0)\n // }\n // TODO: check if still necessary\n if(service_path=='Pll/CaseRelDocs/ByCaObjectId' && !_.isEmpty(pd)){\n _.set(options, 'path', options.path + '?' + querystring.stringify(pd))\n } else {\n _.set(options, 'headers.Content-Type', 'application/x-www-form-urlencoded')\n if(!_.isEmpty(pd)){\n _.set(options, 'headers.Content-Length', Buffer.byteLength(querystring.stringify(pd)))\n }\n }\n let request = https.request(options, (response) => {\n let str=''\n response.on('error',function(e){\n console.log(e, 'Caught on error')\n reject(new CWError(13, \"Unknown error.\", e))\n })\n\n response.on('data',function(chunk){\n str+=chunk\n })\n\n response.on('end',function(){\n if(_.indexOf(Attachments.downloadUrls, service_path)!=-1) {\n \n } else {\n try {\n var test_str = JSON.stringify(str) + \"[test string]\"\n if(test_str.match(/\\<h2\\>Object\\ moved\\ to/)==null) {\n var obj=JSON.parse(str)\n if(typeof(obj)=='undefined') {\n // failed\n reject(new CWError(10, 'No response received from Cityworks API.'))\n } else if(typeof(obj)!='undefined') { // && typeof(obj.Value)!='undefined'\n switch(obj.Status) {\n case 1:\n reject(new CWError(1, 'Error', obj))\n break;\n case 2:\n reject(new CWError(2, 'Unauthorized', obj))\n break;\n case 3:\n reject(new CWError(3, 'InvalidCredentials', obj))\n break;\n case 0:\n default:\n if(typeof(obj)!='undefined' && typeof(obj.Value)=='undefined' && obj.Status==0) {\n resolve(true);\n } else {\n resolve(obj);\n }\n break;\n }\n } else {\n reject(new CWError(4, \"Unknown error.\", {options: options, postedData: pd, api_returned_string: obj}))\n }\n } else {\n reject(new CWError(5, \"Error parsing JSON. Cityworks returned HTML.\", {response: str}))\n }\n } catch (e) {\n if (e instanceof SyntaxError) {\n // console.log('try/catch error on JSON', e)\n reject(new CWError(6, \"Error parsing JSON.\", e))\n } else {\n console.log('try/catch error on JSON - but not an instance of SyntaxError')\n reject(new CWError(7, \"Error parsing JSON.\", e))\n }\n }\n }\n })\n })\n request.write(querystring.stringify(pd))\n request.end() \n }\n })\n }\n\n /**\n * Authenticate with the Cityworks API and store an access token for use. Stores the token on cityworks.Token.\n * @param {string} login - User's login name\n * @param {password} password - User's password\n * @return {Object} Returns Promise object that represents a boolean which tells you the login succeeded (true) or failed (false).\n */\n authenticate(login: string, password: string) {\n return new Promise((resolve, reject) => {\n let data = {LoginName:login, Password:password}\n let path = 'General/Authentication/Authenticate'\n if(this.base_url == 'cityworksonline') {\n path = 'General/Authentication/CityworksOnlineAuthenticate'\n }\n this.runRequest(path, data).then((response: any) => {\n if(response.Status>0) {\n // failed\n reject(new CWError(100, response.Message))\n } else if(typeof(response.Value)!='undefined' && typeof(response.Value.Token)!='undefined') {\n this.login = login\n this.password = password\n this.Token = response.Value.Token\n resolve(true)\n } else {\n // failed\n reject(new CWError(11, 'Unknown Error'))\n }\n }).catch(error => {\n reject(error);\n })\n })\n }\n\n /**\n * Current version\n * @return {number} Returns a number that is the currently configured version of the Cityworks platform. Defaults to \"23\".\n */\n v() {\n return this.settings.version\n }\n\n /**\n * Authenticate a username with a GIS Token\n * @param {login} - Gis user name, should match a Cityworks employee login name\n * @param {string} gisToken - Gis Oauth2 access token\n * @param {string} gisTokenUrl - Base url to GIS server (not the '/generateToken' endpoint)\n * @param {number} [expires] - Authenticate to Cityworks for a specified number of milliseconds, defaults to 2 weeks\n */\n authenticateWithGISToken(login: string, gisToken: string, gisTokenUrl: string, expires?: number) {\n this.login = login\n this.gisToken = gisToken\n this.gisTokenUrl = gisTokenUrl\n if(typeof(expires)!='undefined') {\n expires = 1209600000\n }\n\n return new Promise((resolve, reject) => {\n let path = 'General/Authentication/AuthenticateGisToken'\n let data = { LoginName:this.login, GisToken: this.gisToken, GisTokenUrl: this.gisTokenUrl, Expires: expires}\n\n this.runRequest(path, data).then((response: any) => {\n if((typeof(response.Status)!='undefined' && response.Status>0)) {\n // failed\n // TODO: CWError here.\n } else if(typeof(response.Value)!='undefined' && typeof(response.Value.Token)!='undefined') {\n this.Token = response.Value.Token\n resolve(true)\n } else {\n // failed\n resolve(false)\n }\n }).catch(error => {\n throw error\n })\n })\n }\n\n /**\n * Validate provided token\n * @param {string} token - User's login name\n * @param {boolean} [set] - Set a valid token as the cityworks instance's active token\n * @return {Object} Returns Promise object that represents a boolean which apprises one of the token's validity and that is was set (true) or throws an error if was not valid (and not set).\n */\n validateToken(token:string, set?:boolean) {\n return new Promise((resolve, reject) => {\n if(typeof(set)=='undefined') {\n let set = false\n }\n let data = { Token: token }\n let path = 'General/Authentication/Validate'\n this.runRequest(path, data).then((response: any) => {\n if(response.Status>0) {\n // failed\n resolve(false)\n } else {\n if(set) {\n this.Token = token\n }\n resolve(response.Value)\n }\n }).catch(error => {\n throw error\n })\n })\n }\n\n /**\n * Set a token you've retrieved from your storage system as the active token for the cityworks instance. Note that this doesn't check the token for validity.\n * @param {token} token - The token string to set as the active token.\n * @return {boolean} Returns a boolean which apprises one that the token was set (true) or not set (false).\n */\n setToken(token) {\n if(token!='' && token!=null) {\n this.Token = token\n return true\n } else {\n return false\n }\n }\n\n /**\n * Get currently set, valid token\n * @param {token} token - The token string to set as the active token.\n * @return {string} Returns a string which is the currently-set token or the boolean false value if no (valid) token set\n */\n getToken() {\n if(this.Token=='' || this.Token==null) {\n return false\n } else {\n return this.Token\n }\n }\n\n /**\n * Revoke all current user's tokens or only tokens created before a particular date and time.\n * @param {number} [revokeBefore] - Datetime as an Epoch integer (number), if you wish to revoke only tokens created before a particular datetime\n * @return {Object} Returns Promise object that represents a boolean which apprises one of the revocation outcome's success (true) or failure (false)\n */\n revokeToken(revokeBefore?:number) {\n return new Promise((resolve, reject) => {\n let data = { RevokeDate: revokeBefore }\n let path = 'General/Token/RevokeUser'\n this.runRequest(path, data).then((response: any) => {\n if((typeof(response.Status)!='undefined' && response.Status>0)) {\n // failed\n resolve(false)\n } else {\n resolve(true)\n }\n }).catch(error => {\n throw error\n })\n })\n }\n\n // App data\n\n /**\n * Get the localization settings for current Cityworks install\n * @return {Object} Returns Promise object that represents an Object which contains all the localization settings for the current Cityworks install\n */\n getLocalizationSettings() {\n return new Promise((resolve, reject) => {\n let path = 'General/Localization/LocalizationSettings'\n this.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Get the system timezone options for current Cityworks install\n * @return {Object} Returns Promise object that represents an Object which contains all the timezone settings for the currentCityworks install\n */\n getTimezoneOptions() {\n return new Promise((resolve, reject) => {\n let path = 'General/Localization/TimeZones'\n this.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Get the current install's location information\n * @return {Object} Returns Promise object that represents an Object which contains the location information\n */\n getCurrentLocation() {\n return new Promise((resolve, reject) => {\n let path = 'General/AppData/CurrentLocation'\n this.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n // Licensing Checks\n /**\n * Check if a particular license is available to the currently-authenticated user\n * @param {string} area - Area of access\n * @param {string} service - Service to access\n * @return {boolean} Returns Promise object that represents a boolean which informs access is granted (true) or denied (false)\n */\n licensedApiCheck(area: string, service: string) {\n return new Promise((resolve, reject) => {\n let data = {\n \"Area\": area,\n \"Service\": service\n }\n let path = 'General/AppData/SelectedEntities'\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Check if a current Cityworks install is licensed to use a particular extension\n *\n * Possible extensions currently include: \"UnknownExtension\", \"CwAnalytics\", \"WebHooks\", \"PLLPublicApp\", \"ActivityUpdate\", \"SingleSignOn\"\n *\n * @param {string} extension - Extension name\n * @return {boolean} Returns Promise object that represents a boolean which informs extension is licensed (true) or not (false)\n */\n licensedExtensionCheck(extension: string) {\n return new Promise((resolve, reject) => {\n if(typeof(this.extensions[extension])=='undefined') {\n reject(new CWError(4, 'Extension provided does not exist or is mispelled.', {'provided': extension, 'available': this.extensions}))\n }\n let data = {\n \"Extension\": this.extensions[extension]\n }\n let path = 'General/Authorization/LicensedExtensionCheck'\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Check a whole list to see if current Cityworks install is licensed to use extensions\n *\n * Possible extensions currently include: \"UnknownExtension\", \"CwAnalytics\", \"WebHooks\", \"PLLPublicApp\", \"ActivityUpdate\", \"SingleSignOn\"\n *\n * @param {Array<string>} extension - Extension names\n * @return {Object} Returns Promise object that represents a boolean which informs extension is licensed (true) or not (false)\n */\n licensedExtensionsCheck(extensions: Array<string>) {\n return new Promise((resolve, reject) => {\n var data: { Extensions: Array<number> } = {\n Extensions: []\n }\n _.forEach(extensions, (v) => {\n if(typeof(this.extensions[v])=='undefined') {\n reject(new CWError(5, 'Extension provided does not exist or is mispelled.', {'provided': v, 'available': this.extensions}))\n } else {\n data.Extensions.push(this.extensions[v])\n }\n })\n let path = 'General/Authorization/LicensedExtensionsCheck'\n this.runRequest(path, data).then((response: any) => {\n let rez: Object = {}\n // reverse boolean to numeric dictionary to a boolean to string dictionary\n let inv_extensions = _.invert(this.extensions)\n _.forEach(response, (ext_num, bool) => {\n if(typeof(inv_extensions[ext_num])=='undefined') {\n reject(new CWError(6, 'Extension index provided does not exist or isn\\'t configured properly.', {'provided_num_returned': ext_num, 'available': this.extensions}))\n } else {\n // Put string name of extension in rezponse object and set boolean on it.\n rez[inv_extensions[ext_num]] = bool\n }\n })\n resolve(rez)\n })\n })\n }\n\n /**\n * Check if current user is licensed to use a feature:\n *\n * \"UnknownFeature\", \"ViewInspections\", \"EditInspections\", \"ViewServiceRequest\", \"EditServiceRequest\", \"ViewWorkOrder\", \"EditWorkOrder\", \"EquipmentCheckOut\", \"OfficeField\", \"Respond\", \"Eurl\", \"PaverInterface\", \"Contracts\", \"Storeroom\", \"PLL\", \"Cw4XL\", \"TableEditor\", \"CCTVInterface\", \"MobileAndroid\", \"MobileiOS\", \"PerformanceBudgeting\", \"Insights\", \"RespondCase\", \"RespondInspection\", \"RespondServiceRequest\", \"RespondTaskManager\", \"RespondWorkOrder\", \"Workload\", \"OpX\", \"TrimbleUnityMobile\", \"TrimbleVegetationManager\"\n *\n * @param {string} [feature] - Feature to check to see if ciurrently authenticated user can utilize\n * @return {Object} Returns Promise object that represents a boolean which communicates license state as licensed (true) or not (false)\n */\n licensedFeatureCheck(feature: string) {\n return new Promise((resolve, reject) => {\n if(typeof(this.features[feature])=='undefined') {\n reject(new CWError(7, 'Feature provided does not exist or is mispelled.', {'provided': feature, 'available': this.features}))\n }\n let data = {\n \"Feature\": this.features[feature]\n }\n let path = 'General/Authorization/LicensedFeatureCheck'\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Check if current user is licensed to use features:\n *\n * \"UnknownFeature\", \"ViewInspections\", \"EditInspections\", \"ViewServiceRequest\", \"EditServiceRequest\", \"ViewWorkOrder\", \"EditWorkOrder\", \"EquipmentCheckOut\", \"OfficeField\", \"Respond\", \"Eurl\", \"PaverInterface\", \"Contracts\", \"Storeroom\", \"PLL\", \"Cw4XL\", \"TableEditor\", \"CCTVInterface\", \"MobileAndroid\", \"MobileiOS\", \"PerformanceBudgeting\", \"Insights\", \"RespondCase\", \"RespondInspection\", \"RespondServiceRequest\", \"RespondTaskManager\", \"RespondWorkOrder\", \"Workload\", \"OpX\", \"TrimbleUnityMobile\", \"TrimbleVegetationManager\"\n *\n * @param {Array<string>} [feature] - Features to check to see if currently authenticated user can utilize\n * @return {Object} Returns Promise object that represents a boolean which communicates license state as licensed (true) or not (false)\n */\n licensedFeaturesCheck(features: Array<string>) {\n return new Promise((resolve, reject) => {\n var data: { Features: Array<number> } = {\n Features: []\n }\n _.forEach(features, (v: string) => {\n if(typeof(this.features[v])=='undefined') {\n reject(new CWError(8, 'Feature provided does not exist or is mispelled.', {'provided': v, 'available': this.features}))\n } else {\n data.Features.push(this.features[v])\n }\n })\n let path = 'General/Authorization/LicensedFeaturesCheck'\n this.runRequest(path, data).then((response: any) => {\n let rez: Object = {}\n // reverse boolean to numeric dictionary to a boolean to string dictionary\n let inv_features = _.invert(this.features)\n _.forEach(response.Value, (feat_num, bool) => {\n if(typeof(inv_features[feat_num])=='undefined') {\n reject(new CWError(9, 'Feature index provided does not exist or isn\\'t configured properly.', {'provided': feat_num, 'available': inv_features}))\n } else {\n // Put string name of extension in rezponse object and set boolean on it.\n rez[inv_features[feat_num]] = bool\n }\n })\n resolve(rez)\n })\n })\n }\n\n // LicensedServicesCheck\n // Check if current user is licensed to use services\n // List req ServicesList of 'Area/Service', i.e. ['AMS/Inspection','AMS/WorkOrder','PLL/Case']\n /**\n * Check if current user is licensed to use services. List req ServicesList of 'Area/Service', i.e.:\n *\n * ['AMS/Inspection','AMS/WorkOrder','PLL/Case']\n *\n * @param {Array<string>} [services] - Services to check to see if currently authenticated user can utilize\n * @return {Object} Returns Promise object that represents a boolean which communicates license state as licensed (true) or not (false)\n */\n licensedServicesCheck(services: Array<string>) {\n return new Promise((resolve, reject) => {\n let path = 'General/Authorization/LicensedServicesCheck'\n var data: { Services: Array<string> } = {\n Services: services\n }\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Get a list of CityworksOnline sites for this user\n *\n * @param {string} [login] - Login Name to use when checking. Defaults to previously-stored login name.\n * @param {string} [password] - Password to use when checking. Defaults to previously-stored password.\n * @return {Object} Returns Promise object that represents an array of cityworks online sites available to this user.\n */\n cityworksOnlineSites(login?: string, password?: string) {\n return new Promise((resolve, reject) => {\n let path = 'General/Authentication/CityworksOnlineSites'\n var data = {\n LoginName: (typeof(login)!='undefined') ? login: this.login,\n Password: (typeof(password)!='undefined') ? password : this.password\n }\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Get a list of Domains (not tld, but organizations) in the currently-connected Cityworks install\n *\n * @return {Object} Returns Promise object that represents a collection of the configured domains.\n */\n domains() {\n return new Promise((resolve, reject) => {\n let path = 'General/Authentication/Domains'\n var data = {}\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Get a list of Domains (not tld, but organizations) in the currently-connected Cityworks install\n *\n * @param {string} [login] - Optional login name to get user information for. Defaults to currently-set user name used for login.\n * @return {Object} Returns Promise object that represents an Object with the user information\n */\n user(login?: string) {\n return new Promise((resolve, reject) => {\n let path = 'General/Authentication/User'\n let data = { LoginName: (typeof(login)!='undefined') ? login: this.login }\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Get the software version number of the currently-connected Cityworks install\n *\n * @return {Object} Returns Promise object that represents a string of the version number\n */\n version() {\n return new Promise((resolve, reject) => {\n let path = 'General/Authentication/Version'\n var data = {}\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n}\n\nconst cw = new Cityworks()\n\nconst general = new General(cw)\nconst activity_link = new ActivityLinks(cw)\nconst message_queue = new MessageQueue(cw)\nconst search = new Search(cw)\nconst query = new Query(cw)\nconst report = new Report(cw)\nconst gis = new Gis(cw)\nconst request = new Request(cw)\nconst inspection = new Inspection(cw)\nconst workorder = new WorkOrder(cw)\nconst briefcase = new Briefcase(cw)\n\nbriefcase.data = new CaseData(cw)\nbriefcase.financial = new CaseFinancial(cw)\nbriefcase.workflow = new CaseWorkflow(cw)\nbriefcase.admin = new CaseAdmin(cw)\nbriefcase.people = new CasePeople(cw)\nbriefcase.comment = new Comments(cw, 'CaObject')\nbriefcase.asset = new CaseAssets(cw)\nbriefcase.flag = new CaseFlags(cw)\nbriefcase.attachments = new Attachments(cw, 'Case')\n\nworkorder.admin = new WorkOrderAdmin(cw)\nworkorder.costs = new WorkOrderCosts(cw)\nworkorder.comment = new Comments(cw, 'WorkOrder')\nworkorder.attachments = new Attachments(cw, 'WorkOrder')\n\ninspection.admin = new InspectionAdmin(cw)\ninspection.costs = new InspectionCosts(cw)\ninspection.attachments = new Attachments(cw, 'Inspection')\n\nrequest.admin = new RequestAdmin(cw)\nrequest.costs = new RequestCosts(cw)\nrequest.comment = new Comments(cw, 'Request')\nrequest.attachments = new Attachments(cw, 'Request')\n\nexport { cw as Cityworks, general, activity_link, message_queue, search, query, gis, request, inspection, workorder, briefcase, report }"],"names":["_","require","CWError","code","message","info","_this","name","this","error_messages","has","forEach","ErrorMessages","v","set","Service","replace","Name","push","get","JSON","stringify","General","cw","_proto","prototype","notifications","Promise","resolve","reject","runRequest","then","response","Value","e","amIWatching","activityType","activityId","_this2","aType","null","case","task","provided","potential_activities","ActivityType","ActivityId","r","getActivityMetadataByIds","ids","table","_this3","tables","indexOf","available","Ids","TableName","console","log","getHistory","_this4","getWOEntityCostSummary","object_ids","_this5","ObjectIds","searchWOEntityCostSummary","search_id","_this6","SearchId","getHolidays","startDate","endDate","_this7","data","api_path","addHolidays","holiday","description","_this8","Holiday","Description","deleteHolidays","holidays","_this9","Holidays","Attachments","current_type","currentActivityType","add","node_id","the_file","filename","attachment_type","task_id","comments","label","attachment_type_map","attachment","signature","url","endpoint","update","attachment_id","title","attachmentIds","downloadUrls","download","attachmentId","getById","getAttachments","getByNodesId","getRelatedDocs","id","getTags","syncTags","tags","loopSyncTags","callback","setTags","_this0","setTagsOnMany","_this1","returnData","getDocLabels","busCaseId","_this10","BusCaseId","ActivityLinks","activityTypes","linkTypes","ReversibleMap","setActivityTypes","setLinkTypes","type","index","validateType","validTypes","errorCode","options","transformLinksData","map","link","_extends","DestType","SourceType","LinkType","path","source_type","source_sid","destination_type","destination_sid","link_type","SourceSid","DestSid","sids","ActivitySids","clone","SourceActivityType","SourceActivitySid","DestinationActivityType","DestinationActivitySid","activity_link_id","ActivityLinkId","remove","Gis","getConfig","whichType","whichId","getGisData","context","toLowerCase","domain","domainId","downloadMobile","cacheId","initialExtent","request","requestId","inspection","inspectionId","workOrder","workOrderSid","user","allDomains","allGroups","selectedEntities","getEntityAttributes","entityType","EntityType","MessageQueue","status","Pending","Processing","Complete","Failed","hook_types","Unknown","ActivityUpdate","Email","WebHook","processMessages","delete_successful","Delete","maxcount","MaxCount","Status","hours_to_keep","HoursToKeep","preferences","search","parameters","max_results","MaxResults","allowed_params","disallowed_params","k","value","concat","HookType","updateMessageStatus","getWebooks","hook_ids","HookIds","Search","searchTypes","Null","Request","WorkOrder","Inspection","Contract","Permit","GIS","PermitTask","PermitAddress","InspCommon","Case","WorkOrderEntity","StoreTransaction","Requisition","Material","WorkActivity","MaterialLeaf","WoTemplate","Employee","Analytics","TokenState","AssetCalculationResult","Equipment","CustomerAccount","InspTemplate","ProblemLeaf","AssetSplitRecord","PavementInsp","TvInspection","Projects","quick","text","QuickSearchText","execute","searchId","merge","getSaved","searchType","applyToEntities","employeeSid","length","savedEndpoint","displayFields","types","enableServices","searchIds","Enable","SearchIds","disableServices","getDefinition","getDefinitions","getDefinitionNames","deleteDefinitions","saveDefinition","searchFor","SearchFor","convertToQuery","saveQuery","addEurl","allowMultipleBooleanValues","allowEmptyQuery","_this11","SaveQuery","AddEurl","AllowMultipleBooleanValues","AllowEmptyQuery","Query","build","query","isNaN","getTypes","getTypesInfo","includeDefaultSchemasInclude","includeGisSchemas","IncludeDefaultSchemasInclude","IncludeGisSchemas","validateQuery","variables","Variables","validateResponseDefinition","queryType","responseDefinition","QueryType","ResponseDefinition","getSchema","run","QueryValue","unset","isNumber","queryTypes","createdOnly","includeQuery","visibleToMobile","CreatedOnly","IncludeQuery","pop","Report","print","fileName","dl_url","FileName","process","exit","admin","costs","comment","attachments","create","sr_data","move","x","y","projection","z","base_data","RequestId","X","Y","changeProblem","problemSid","ProblemSid","getByIds","requestIds","RequestIds","getAuditLog","getCustomFields","changeCustomFieldCategory","categoryId","CategoryId","cancel","cancelReason","dateCancelled","uncancel","close","Message","reopen","_this12","searchData","_this13","searchObject","_this14","createSearchDefinition","searchName","sharedWithin","enableEurl","_this15","isString","getProblemNodes","viewOnly","displayMode","includeCancelled","_this16","DomainId","IncludeCancelled","ViewOnly","getProblems","forPublicOnly","onlyActiveTemplates","domainIds","_this17","ForPublicOnly","OnlyActiveTemplates","getProblemsByKeywords","keywords","_this18","Keywords","getPriorities","_this19","ProblemSids","getCustomFieldTemplate","_this20","getQASettings","_this21","getProblemLeaf","_this22","getStatuses","_this23","DomainIds","getEmployeeLists","listType","_this24","includes","getDispatchTos","getSubmitTos","streetCodes","_this25","getTemplatesById","problemSids","minimumDateModified","maximumDateModified","_this26","createTemplateSearchDefinition","_this27","getTemplateQAs","_this28","searchTemplates","_this29","getTemplates","templateIds","canCreate","includeInactiveIf","_this30","CanCreate","IncludeInactiveIf","getWOTemplates","includeInactive","_this31","IncludeInactive","getMLFs","_this32","ServiceRequestId","updateMLFs","coordinates","problemsId","_this33","deleteMLFs","_this34","insp_data","createFromEntities","createFromParent","createFromServiceRequest","createFromWorkOrder","InspectionId","inspectionIds","InspectionIds","CancelReason","DateCancelled","statuses","submitTos","includeInactiveEmployees","IncludeInactiveEmployees","connectAsset","entity","updateXY","facility","EntityUid","Entity","Facility_Id","Level_Id","getAnswers","inspections","getCycleFrom","getCycleIntervals","getCycleTypes","getDistricts","data_init","entityTypes","EntityTypes","forIn","getTemplatesByIds","inspTemplateIds","InspTemplateIds","getTemplateEntityTypes","getQA","getQConditions","inspTemplateId","wo_data","workOrderSId","s","combine","fromWorkOrderIds","toWorkOrderId","cancelCombinedWorkOrders","CancelCombinedWorkOrders","ToWorkOrderId","FromWorkOrderIds","workOrderId","WorkOrderId","workOrderSIds","workorderSId","getInstructions","getCustomFieldValues","workorderSIds","getEntities","GetGisData","addEntities","entityInfo","UpdateXY","updateEntity","workComplete","WorkComplete","removeEntities","workOrderIds","WorkOrderIds","getWOsByEntities","entityUids","getSearchList","getSupervisors","getCategories","getStages","getExpenseTypes","woTemplateId","fs","Briefcase","current_case","asset","flag","workflow","financial","people","getRequirements","caseTypeId","subTypeId","CaseTypeId","SubTypeId","CaObjectId","createChild","parentCaObjectId","ParentCaObjectId","createFromRequest","caObjectId","caObjectIds","CaObjectIds","filters","getPrintTemplates","getRequestOptions","__dirname","file","createWriteStream","request_url","hostname","getToken","https","timeout","res","on","d","write","error","getZips","getStates","getCountries","CaseData","addGroup","caseDataGroupId","groupCode","CaseDataGroupId","GroupCode","addDefaultGroups","wipAddDetail","caseDataDetailId","caDataGroupId","columnSequence","detailCode","detailSequence","CaseDataDetailId","CaDataGroupId","ColumnSequence","DetailCode","DetailSequence","getGroupsByCaseId","caseId","deleteGroupsByCaseId","searchForGroups","intersectionBy","keysIn","checkGIS","entityUid","updateGroupsFromAsset","addDetail","updateDetail","caDataDetailId","CaDataDetailId","lockDetail","Lock","unlockDetail","searchForDetails","addListValue","listValue","ListValue","deleteListValue","searchForListValueIds","searchForListValueObjects","updateDetailItemValue","dataDetailId","rate","quantity","detail","isUndefined","NumberFlag","TextFlag","DateFlag","DateCountFlag","isArray","dateCountValue","dateCount","YesNoFlag","CommentFlag","CurrencyFlag","ListValuesFlag","Q1Q2Q3Flag","ValueFlag","getAllDataDetails","setCaseData","items","detail_items_to_set","case_detail_items","item","item_parts","split","item_value","item_rate","item_quantity","check_for_item","r_two","r_three","setCaseDataItem","detailGroupAndItemCode","CaseFinancial","addFee","feeSetupId","FeeSetupId","addPayment","makePayment","payments","caseFees","payerInfo","CaFeeIds","TenderTypes","payment","parseFloat","isDate","Date","parse","addRefund","caPaymentId","refundAmount","CaPaymentId","RefundAmount","Comments","addDepositPayment","caDepositId","CaDepositId","addDeposit","depositId","amount","DepositId","addInstrument","instTypeId","dateExpire","InstTypeId","Amount","DateExpire","updateFee","caFeeId","CaFeeId","voidRefund","caPaymentRefundId","voided","CaPaymentRefundId","Voided","addDefaultFees","addDefaultDeposits","getFees","WhereClause","fees","Array","fee","AmountDue","Factor","Sum","FeeCode","FeeDesc","Quantity","Rate","WaiveFee","CreatedByLoginId","ModifiedByLoginId","TotalFeeAmount","TotalPaymentAmount","TotalDueAmount","TotalCreditAmount","CreditAmount","GrandSumFlag","FeeTypeCode","Location","AutoRecalculate","CommentText","CreatedBy","CustFeeSeq","DateCreated","DateModified","RecalcCreateDate","LockOnPayment","FeeTypeId","Invoiced","ModifiedBy","PaymentAmount","getDeposits","getPayments","getInstruments","deleteFee","deleteFeesByCaseId","deletePayment","deleteRefund","deletePaymentsByCaseId","deleteDeposit","deleteDepositsByCaseId","deleteInstrument","caInstrumentId","CaInstrumentId","deleteInstrumentsByCaseId","searchFees","searchPayments","searchRefunds","getEscrowFees","addEscrowPayment","escrowPaymentItems","EscrowPayments","updateEscrowPayment","searchDeposits","getAllFeeTemplates","searchFeeTemplates","searchCaseInstruments","getInstrumentList","addCaseInstrumentRelease","releasedBy","dateReleased","amountReleased","percentReleased","DateReleased","ReleasedBy","deleteCaseInstrumentRelease","caInstReleasesId","_this35","CaInstReleasesId","searchCaseInstrumentReleases","_this36","_this37","searchAvailableFees","_this38","getTenderTypes","_this39","addTenderType","_this40","updateTenderType","tenderTypeId","_this41","TenderTypeId","sid","ActivitySid","CommentId","getPredefined","category","CaseWorkflow","addTask","taskId","startPoint","endPoint","TaskId","StartPoint","EndPoint","addTaskResult","caTaskId","resultCode","resultID","resultSetID","CaTaskId","ResultCode","ResultID","ResultSetID","addTaskComment","getTasksByCaseId","checkRelatedItems","CheckRelatedItems","getTasksById","caTaskIds","CaTaskIds","getResultsByTaskId","getCommentsForTask","getCommentsForTasks","updateTask","updateTaskComment","caTaskCommentId","commentId","CaTaskCommentId","setTaskResult","deleteTask","deleteTasksOnCase","deleteTaskComments","caTaskCommentIds","CaTaskCommentIds","searchForTasks","searchForTaskResults","addTaskAttachment","docName","locationType","DocName","getTaskAttachments","deleteTaskAttachment","caRelDocId","CaRelDocId","CasePeople","getRoles","caPeopleId","CaPeopleId","deleteAll","searchOptions","idsOnly","runUrl","CaseAssets","attach","detach","caAddressId","CaAddressId","detachAll","getForCase","CaseFlags","flagId","severity","appliedBy","DateApplied","FlagId","Severity","AppliedBy","caFlagId","CaFlagId","CaseAdmin","addBusinessCaseTemplate","updateBusinessCaseTemplate","getBusinessCaseTemplates","addCaseType","caseTypeName","caseTypeDesciption","CaseType","CaseTypeDesciption","updateCaseType","getCaseTypes","searchCaseTypeIDs","searchCaseTypeObjects","addSubtype","subTypeName","subTypeDescription","SubType","SubTypeDesc","updateSubtype","getSubtypes","getExpirations","addExpiration","getDisciplines","addDepartment","departmentCode","departmentName","DepartmentCode","DepartmentName","getDepartments","addDivision","departmentId","divisionName","DepartmentId","DivisionName","getDivisions","addInspectionTimeBlock","labelText","startTime","endTime","inspTimeBlocksDetails","LabelText","StartTime","EndTime","getInspectionTimeBlocks","getNotificationCases","getNotificationTypes","addNumberingGroup","updateNumberingGroup","numberingGroupId","NumberingGroupId","getNumberingGroups","addPerson","getPeople","addPeopleRole","roleCode","RoleCode","getPeopleRoles","addTaskResultDetail","updateTaskResultDetail","resultDetailId","ResultDetailId","getTaskResultDetails","addTaskResultFeeInsert","deleteTaskResultFeeInsert","taskResultFeeInsertId","TaskResultFeeInsertId","deleteTaskResultFeeInsertByTaskId","updateTaskResultFeeInsert","taskResultId","TaskResultId","getTaskResultFeeInsert","WorkOrderAdmin","getEntityGroups","getEntityTypes","entityGroups","EntityGroups","includeComments","includeInstructions","IncludeComments","IncludeInstructions","updateTemplate","wOTemplate","getTemplateGroupRights","wOTemplateIds","WOTemplateIds","getTemplateActivity","getUpdateFields","getTemplateEquipment","wOTemplateId","WOTemplateId","getTemplateLabor","getTemplateMaterial","getTemplateMapLayerFields","WorkOrderTemplateId","getTemplateTasks","getRelatedInspectionTemplates","InspectionAdmin","RequestAdmin","WorkOrderCosts","getCodes","employeeSids","commonOnly","EmployeeSids","CommonCodesOnly","getJobCodes","addLabor","hours","WorkOrderSid","Hours","getLabor","workOrderSids","estimated","Estimated","WorkOrderSids","deleteLabor","laborCostIds","LaborCostIds","addEquipment","getEquipment","deleteEquipment","equipmentCostIds","EquipmentCostIds","addMaterial","units","combineIssuesByMaterialSid","Units","CombineIssuesByMaterialSid","getMaterial","deleteMaterial","materialCostIds","MaterialCostIds","InspectionCosts","reqLaborCostIds","RequestCosts","requestCosts","querystring","axios","Cityworks","base_url","settings","load","Token","login","password","gisToken","gisTokenUrl","extensions","features","potential_loads","UnknownExtension","CwAnalytics","WebHooks","PLLPublicApp","SingleSignOn","UnknownFeature","ViewInspections","EditInspections","ViewServiceRequest","EditServiceRequest","ViewWorkOrder","EditWorkOrder","EquipmentCheckOut","OfficeField","Respond","Eurl","PaverInterface","Contracts","Storeroom","PLL","Cw4XL","TableEditor","CCTVInterface","MobileAndroid","MobileiOS","PerformanceBudgeting","Insights","RespondCase","RespondInspection","RespondServiceRequest","RespondTaskManager","RespondWorkOrder","Workload","OpX","TrimbleUnityMobile","TrimbleVegetationManager","secure","expires","default_domain","version","configure","service_path","post_data","post_file","pd","token","port","method","headers","isEmpty","cw_url","postForm","createReadStream","startsWith","resp","Buffer","chunk","read","byteLength","str","match","obj","postedData","api_returned_string","SyntaxError","end","authenticate","LoginName","Password","authenticateWithGISToken","GisToken","GisTokenUrl","Expires","validateToken","setToken","revokeToken","revokeBefore","RevokeDate","getLocalizationSettings","getTimezoneOptions","getCurrentLocation","licensedApiCheck","area","service","Area","licensedExtensionCheck","extension","Extension","licensedExtensionsCheck","Extensions","rez","inv_extensions","invert","ext_num","bool","provided_num_returned","licensedFeatureCheck","feature","Feature","licensedFeaturesCheck","Features","inv_features","feat_num","licensedServicesCheck","services","Services","cityworksOnlineSites","domains","general","activity_link","message_queue","report","gis","workorder","briefcase"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/error.ts","../src/general.ts","../src/attachments.ts","../src/activity_link.ts","../src/gis.ts","../src/message_queue.ts","../src/search.ts","../src/query.ts","../src/report.ts","../src/request.ts","../src/inspection.ts","../src/workorder.ts","../src/briefcase.ts","../src/case_data.ts","../src/case_financial.ts","../src/comments.ts","../src/case_workflow.ts","../src/case_people.ts","../src/case_assets.ts","../src/case_flags.ts","../src/case_admin.ts","../src/workorder_admin.ts","../src/inspection_admin.ts","../src/request_admin.ts","../src/workorder_costs.ts","../src/inspection_costs.ts","../src/request_costs.ts","../src/index.ts"],"sourcesContent":["const _ = require('lodash')\n\nexport interface CWErrorMsgs {\n MessageType: number\n Code: number\n Service: string\n Name: string\n DebugDetails: string\n DisplayText: string\n InnerMessage: string|null\n}\n\n/**\n * CWErrorInt interface definition for implementation by CWError\n *\n * `{name: string, code: number, message: string, info?: string}`\n *\n */\nexport interface CWErrorInt {\n Name: string\n Code: number\n Message: string\n Error_messages?: Array<CWErrorMsgs>\n Info?: string\n}\n\n/**\n * CWError implements a custom error class for this codebase with additional information\n *\n */\nexport class CWError implements CWErrorInt {\n /**\n * Just statically set to \"Cityworks Exception\" for now\n */\n Name: string\n /**\n * Number for the thrown error (Efforts were made to make these unique when thrown throughout the codebase)\n */\n Code: number\n /**\n * The error message\n */\n Message: string\n /**\n * The error message\n */\n Error_messages: Array<CWErrorMsgs>\n /**\n * Object stuffed with any other information one wishes to include in the thrown error\n */\n Info?: string\n\n /**\n * CWError implements a custom error class for this codebase with additional information\n *\n * @param {number} code - Number for the thrown error (Efforts were made to make these unique when thrown throughout the codebase)\n * @param {string} message - The error message\n * @param {Object} info - Object stuffed with any other information one wishes to include in the thrown error\n * @return {Object} Returns instance of CWError object\n */\n constructor(code:number, message:string, info?:any) {\n this.Name = \"Cityworks Exception\"\n this.Code = code\n this.Message = message\n this.Error_messages = []\n // console.log('CWERROR', code, message, info)\n if(typeof(info) !== 'undefined') {\n if(_.has(info, 'ErrorMessages')) {\n _.forEach(info.ErrorMessages, (v) => {\n _.set(v, 'Service', v.Service.replace(/([a-z])([A-Z])/g, '$1 $2'))\n _.set(v, 'Name', v.Name.replace(/([a-z])([A-Z])/g, '$1 $2'))\n this.Error_messages.push(v)\n })\n }\n if(_.has(info, 'Message'))\n this.Message = _.get(info, 'Message')\n this.Info = JSON.stringify(info)\n }\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\n/**\n * A plugin that contains \"general\" methods for a Cityworks install\n */\nexport class General {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Get notifications for currently authenticated user\n *\n * @return {Object} Returns Promise object that represents a collection of available notifications\n */\n notifications() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('General/ActivityNotification/User', {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n\n /**\n * Find out if the current user is watching a particular activity (case, task, null [as a string])\n *\n * @param {string} activityType - which activity type the following ID will be for.\n * @param {number} activityId - activity Case or CaseTask (task instance) ID to check\n * @return {Object} Returns Promise object that represents a boolean indicating the currently authenticated user is watching the provided activity\n */\n amIWatching(activityType, activityId: number) {\n return new Promise((resolve, reject) => {\n let aType = {'null': 0, 'case': 1, 'task': 2}\n if(typeof(aType[activityType])=='undefined') {\n // reject with error\n reject(new CWError(1, \"Activity type provided does not exist.\", {provided: activityType, potential_activities: aType}))\n } else {\n let data = {\"ActivityType\": aType[activityType], \"ActivityId\": activityId}\n this.cw.runRequest('General/ActivityNotification/UserWatching', data).then(r => {\n // console.log(r, 'response')\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Get CwMetatData by Type and CwSid\n *\n * @param {Array<number>} Ids\n * @param {string} TableName - INSPECTION, REQUEST, WORKORDER require View permission on the activities\n * @return {Object} Returns Promise object that represents a\n */\n getActivityMetadataByIds(ids: Array<number>, table: string) {\n return new Promise((resolve, reject) => {\n let tables = [\"INSPECTION\", \"REQUEST\", \"WORKORDER\"]\n if(_.indexOf(tables, table)==-1) {\n reject(new CWError(2, 'TableName provided does not exist or is mispelled.', {'provided': table, 'available':tables}))\n }\n let data = {\n \"Ids\": ids,\n \"TableName\": table\n }\n this.cw.runRequest('General/CwMetaData/ByTableNameSids', data).then(r => {\n console.log(r)\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get recent history for authenticated user\n *\n * @return {Object} Returns Promise object that represents a collection of RecentActivity objects\n */\n getHistory() {\n return new Promise((resolve, reject) => {\n let data = {}\n this.cw.runRequest('Ams/Search/RecentActivity', data).then(r => {\n console.log(r)\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get cost summary for WorkOrder entities\n *\n * @param {Array<number>} ObjectIds\n * @return {Object} Returns Promise object that represents a\n */\n getWOEntityCostSummary(object_ids: Array<number>) {\n return new Promise((resolve, reject) => {\n let data = {\n \"ObjectIds\": object_ids\n }\n this.cw.runRequest('General/CostSummary/WorkOrderEntity', data).then(r => {\n console.log(r)\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get cost summary for WorkOrder entities selected through a search definition\n *\n * @param {number} SearchId - Search Definition Id\n * @return {Object} Returns Promise object that represents a\n */\n searchWOEntityCostSummary(search_id: number) {\n return new Promise((resolve, reject) => {\n let data = {\n \"SearchId\": search_id\n }\n this.cw.runRequest('General/CostSummary/WorkOrderEntitySearch', data).then(r => {\n console.log(r)\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Holidays\n *\n * @param {Date} startDate - Date to search for Holidays, including this date.\n * @param {Date} [endDate] - If not specified, Holidays _on_ startDate are returned. If specified, Holidays on startDate up to, but not including endDate are returned.\n * @return {Object} Returns Promise object that represents a list of the holiday(s) found\n */\n getHolidays(startDate: Date, endDate?: Date) {\n return new Promise((resolve, reject) => {\n let data = {}\n var api_path = 'General/Holidays/All'\n if(typeof(endDate)=='undefined') {\n _.set(data, \"Date\", startDate)\n var api_path = 'General/Holidays/ByDate'\n } else {\n _.set(data, \"StartDate\", startDate)\n _.set(data, \"EndDate\", endDate)\n }\n this.cw.runRequest(api_path, data).then(r => {\n console.log(r)\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Holidays\n *\n * @param {Date} holiday - The holiday's date\n * @param {string} description - The holiday's name/description\n * @return {Object} Returns Promise object that represents a\n */\n addHolidays(holiday: Date, description: string) {\n return new Promise((resolve, reject) => {\n let data = {\n \"Holiday\": holiday,\n \"Description\": description\n }\n this.cw.runRequest('General/Holidays/Add', data).then(r => {\n console.log(r)\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Holidays\n *\n * @param {Array<Date>} holidays - List of datetimes which should have holidays deleted\n * @return {Object} Returns Promise object that represents a\n */\n deleteHolidays(holidays: Array<Date>) {\n return new Promise((resolve, reject) => {\n let data = {\n \"Holidays\": holidays\n }\n this.cw.runRequest('General/Holidays/Delete', data).then(r => {\n console.log(r)\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\nconst fs = require('fs');\n\n\nexport class Attachments {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Storage of object's active activityType\n */\n currentActivityType: string\n\n /**\n * @hidden\n */\n constructor(cw, current_type) {\n this.cw = cw\n this.currentActivityType = current_type;\n }\n\n // Attachments\n\n /**\n * Add attachments (doesn't handle URL or Signature type attachments properly, currently)\n *\n * @category Attachments\n * @param {number} id - The ID of the node to add the attachment to (CA_OBJECT_ID, REQUESTID, WORKORDERSID, WORKORDERID, INSPECTIONID). If WORKORDERID, you _must_ feed in as a string.\n * @param {string} the_file - The loca path of the file to upload to the Cityworks instance\n * @param {number} [task_id] - ID of WorkOrder task, if current activity is a work order and the attachment should be on the task\n * @param {string} [filename] - The filename for the attachment\n * @param {string} [attachment_type] - The filename for the attachment, values: attachment, signature, url\n * @param {string} [comments] - The filename for the attachment\n * @param {string} [label] - The label to apply to the (PLL only)\n * @return {Object} Returns object that represents a boolean for action resolution\n */\n add(node_id: number|string, the_file: string, filename?: string, attachment_type: string = 'attachment', task_id?: number, comments?: string, label?: string) {\n // attachment_type map\n var attachment_type_map = {'attachment': 0, 'signature': 1, 'url': 2}\n return new Promise((resolve, reject) => {\n var data = {}\n if(typeof(filename)!=='undefined') {\n _.set(data, 'Filename', filename)\n }\n if(typeof(comments)!=='undefined') {\n _.set(data, 'Comments', comments)\n }\n if(typeof(label)!=='undefined' && this.currentActivityType=='Case') {\n _.set(data, 'LabelText', label)\n }\n\n var endpoint = ''\n switch(this.currentActivityType) {\n case 'Case':\n endpoint = 'Pll/CaseRelDocs/Add'\n _.set(data, 'CaObjectId', node_id)\n break;\n case 'Inspection':\n endpoint = 'Ams/Attachments/AddInspectionAttachment'\n _.set(data, 'InspectionId', node_id)\n if(typeof(attachment_type)!=='undefined') {\n _.set(data, 'AttachmentType', attachment_type_map[attachment_type])\n }\n break;\n case 'Request':\n _.set(data, 'RequestId', node_id)\n endpoint = 'Ams/Attachments/AddRequestAttachment'\n break;\n case 'WorkOrder':\n if(typeof(node_id)=='string') {\n _.set(data, 'WorkOrderId', node_id)\n } else {\n _.set(data, 'WorkOrderSid', node_id)\n }\n if(typeof(task_id)!=='undefined') {\n _.set(data, 'TaskId', task_id)\n }\n if(typeof(attachment_type)!=='undefined') {\n _.set(data, 'AttachmentType', attachment_type_map[attachment_type])\n }\n endpoint = 'Ams/Attachments/AddWorkOrderAttachment'\n break;\n default:\n reject(new CWError(132, 'Unknown current activity type or activity type not set.', {'provided': this.currentActivityType}))\n }\n this.cw.runRequest(endpoint, data, the_file).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update attachment\n *\n * @category Attachments\n * @param {number} id - The ID of the node to add the attachment to (CA_OBJECT_ID, REQUESTID, WORKORDERSID, WORKORDERID, INSPECTIONID). If WORKORDERID, you _must_ feed in as a string.\n * @param {string} [title] - The filename for the attachment\n * @param {string} [description] - The filename for the attachment\n * @param {string} [label] - The label to apply to the (PLL only)\n * @return {Object} Returns object that represents a boolean for action resolution\n */\n update(attachment_id: number, title?: string, description?: string, label?: string) {\n // attachment_type map\n return new Promise((resolve, reject) => {\n var data = {}\n if(typeof(title)!=='undefined') {\n _.set(data, 'Title', title)\n }\n if(typeof(description)!=='undefined') {\n _.set(data, 'Description', description)\n }\n if(typeof(label)!=='undefined' && this.currentActivityType=='Case') {\n _.set(data, 'LabelText', label)\n }\n \n var endpoint = ''\n switch(this.currentActivityType) {\n case 'Case':\n endpoint = 'Pll/CaseRelDocs/Update'\n _.set(data, 'CaRelDocId', attachment_id)\n break;\n case 'Inspection':\n endpoint = 'Ams/Attachments/UpdateInspectionAttachment'\n _.set(data, 'AttachmentId', attachment_id)\n break;\n case 'Request':\n endpoint = 'Ams/Attachments/UpdateRequestAttachment'\n _.set(data, 'AttachmentId', attachment_id)\n break;\n case 'WorkOrder':\n endpoint = 'Ams/Attachments/UpdateWorkOrderAttachment'\n _.set(data, 'AttachmentId', attachment_id)\n break;\n default:\n reject(new CWError(132, 'Unknown current activity type or activity type not set.', {'provided': this.currentActivityType}))\n }\n this.cw.runRequest(endpoint, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete inspection attachments\n *\n * @category Inspection Attachments\n * @param {Array<number>|number} attachmentIds - An array of attachment IDs or a single attachment ID to delete.\n * @return {Object} Returns object that represents a boolean for action resolution\n */\n delete(attachmentIds: Array<number>|number) {\n return new Promise((resolve, reject) => {\n var data = {}\n var endpoint = ''\n if(typeof(attachmentIds)=='number') {\n attachmentIds = [attachmentIds]\n }\n\n switch(this.currentActivityType) {\n case 'Case':\n _.set(data, 'CaRelDocId', attachmentIds[0])\n endpoint = 'Pll/CaseRelDocs/Delete'\n break;\n case 'Inspection':\n _.set(data, 'AttachmentIds', attachmentIds)\n endpoint = 'Ams/Attachments/DeleteInspectionAttachments'\n break;\n case 'Request':\n _.set(data, 'AttachmentIds', attachmentIds)\n endpoint = 'Ams/Attachments/DeleteRequestAttachments'\n break;\n case 'WorkOrder':\n _.set(data, 'AttachmentIds', attachmentIds)\n endpoint = 'Ams/Attachments/DeleteWorkOrderAttachments'\n break;\n default:\n reject(new CWError(132, 'Unknown current activity type or activity type not set.', {'provided': this.currentActivityType}))\n }\n this.cw.runRequest(endpoint, data).then(r => {\n resolve(r)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * @hidden\n */\n static downloadUrls() {\n return {'case': 'Pll/CaseRelDocs/DownloadCaRelDocs', 'inspection': 'Ams/Attachments/DownloadInspectionAttachment', 'request': 'Ams/Attachments/DownloadRequestAttachment', 'workorder': 'Ams/Attachments/DownloadWorkOrderAttachment'}\n }\n\n /**\n * Download an attachment\n *\n * @category Attachments\n * @param {number} attachmentId - ID of an attachment to download\n * @return {Object} Returns object that represents a file stream\n */\n download(attachmentId: number) {\n return new Promise((resolve, reject) => {\n var data = {}\n var endpoint = ''\n\n switch(this.currentActivityType) {\n case 'Case':\n _.set(data, 'CaRelDocsId', attachmentId)\n endpoint = Attachments.downloadUrls()['case']\n break;\n case 'Inspection':\n _.set(data, 'AttachmentId', attachmentId)\n endpoint = Attachments.downloadUrls()['inspection']\n break;\n case 'Request':\n _.set(data, 'AttachmentId', attachmentId)\n endpoint = Attachments.downloadUrls()['request']\n break;\n case 'WorkOrder':\n _.set(data, 'AttachmentId', attachmentId)\n endpoint = Attachments.downloadUrls()['workorder']\n break;\n default:\n reject(new CWError(132, 'Unknown current activity type or activity type not set.', {'provided': this.currentActivityType}))\n }\n this.cw.runRequest(endpoint, data).then(r => {\n resolve(r)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get attachment by ID (not implemented)\n *\n * @category Attachments\n * @param {number} attachmentId - An attachment ID to get info for\n * @return {Object} Returns object that represents an object that describes the matched inspection attachment\n */\n getById(attachmentId: number) {\n return new Promise((resolve, reject) => {\n var data = {}\n var endpoint = ''\n\n switch(this.currentActivityType) {\n case 'Case':\n // _.set(data, 'CaRelDocId', attachmentId)\n // endpoint = 'Pll/CaseRelDocs/ById'\n reject(new CWError(133, 'Get CaRelDoc by RelDocId not documented or found'))\n break;\n case 'Inspection':\n _.set(data, 'AttachmentId', attachmentId)\n endpoint = 'Ams/Attachments/InspectionAttachmentById'\n break;\n case 'Request':\n _.set(data, 'AttachmentId', attachmentId)\n endpoint = 'Ams/Attachments/RequestAttachmentById'\n break;\n case 'WorkOrder':\n _.set(data, 'AttachmentId', attachmentId)\n endpoint = 'Ams/Attachments/WorkOrderAttachmentById'\n break;\n default:\n reject(new CWError(132, 'Unknown current activity type or activity type not set.', {'provided': this.currentActivityType}))\n }\n this.cw.runRequest(endpoint, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get attachments related to Inspection, WorkOrder, or Request\n *\n * @category Attachments\n * @param {Array<number>|number} ids - An array of IDs or a single ID (inspectionIds, WorkOrderSids, WorkOrderIds, or RequestIds) for which to get attachments. Only one node (Inspection, WorkOrder, Request, or Case) type at a time. Don't mix-and-match WorkOrderIds with WorkOrderSids.\n * @return {Object} Returns Promise that represents a collection of attachments from the matched inspections, service requests, or work orders\n */\n getAttachments(ids: Array<number>|number) {\n return this.getByNodesId(ids)\n }\n\n /**\n * Get Related Documents from Case\n *\n * @category Attachments\n * @param {number} id - An array of CaseIDs or a single CaseID for which to get related documents.\n * @return {Object} Returns Promise that represents a collection of related documents from the matched cases\n */\n getRelatedDocs(id: number) {\n return this.getByNodesId(id)\n }\n \n /**\n * Get attachment by node (Inspection, WorkOrder, Request, or Case) IDs\n *\n * @category Attachments\n * @param {Array<number>|number} ids - An array of IDs or a single ID (inspectionIds, WorkOrderSids, WorkOrderIds, RequestIds, or CaseIds) to get attachments for. Only one node (Inspection, WorkOrder, Request, or Case) type at a time. Don't mix-and-match WorkOrderIds with WorkOrderSids.\n * @return {Object} Returns Promise that represents a collection of attachments from the matched inspections\n */\n getByNodesId(ids: Array<number>|number) {\n return new Promise((resolve, reject) => {\n var data = {}\n var endpoint = ''\n if(typeof(ids)=='number' && this.currentActivityType!='Case') {\n ids = [ids]\n }\n\n switch(this.currentActivityType) {\n case 'Case':\n _.set(data, 'CaObjectId', ids)\n endpoint = 'Pll/CaseRelDocs/ByCaObjectId'\n break;\n case 'Inspection':\n _.set(data, 'InspectionIds', ids)\n endpoint = 'Ams/Attachments/InspectionAttachments'\n break;\n case 'Request':\n _.set(data, 'RequestIds', ids)\n endpoint = 'Ams/Attachments/RequestAttachments'\n break;\n case 'WorkOrder':\n if(typeof(ids[0])=='string') {\n _.set(data, 'WorkOrderIds', ids)\n } else {\n _.set(data, 'WorkOrderSids', ids)\n }\n endpoint = 'Ams/Attachments/WorkOrderAttachments'\n break;\n default:\n reject(new CWError(132, 'Unknown current activity type or activity type not set.', {'provided': this.currentActivityType}))\n }\n this.cw.runRequest(endpoint, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Tags available with which to tag attachments\n *\n * @category Attachments\n * @return {Object} Returns Promise that represents a collection of tags that can be added to attachments\n */\n getTags() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/AttachmentTags/GetAll', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n private syncTags(attachmentId: number, tags: {tagid: number, tagtext: string}[]) {\n return new Promise((resolve, reject) => {\n var data = {}\n switch(this.currentActivityType) {\n case 'Case':\n this.cw.runRequest('Pll/AttachmentActivityTags/SyncTags', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n private async loopSyncTags(attachmentId: number, tags: {tagid: number, tagtext: string}[], callback: Function) {\n this.syncTags(attachmentId, tags).then(r => {\n callback(r)\n })\n }\n\n /**\n * Set Tags on an attachment\n *\n * @category Attachments\n * @return {Object} Returns Promise that represents a collection of tags that can be added to attachments\n */\n setTags(attachmentId: number, tags: {tagid: number, tagtext: string}[], activityType: string) {\n return new Promise((resolve, reject) => {\n this.syncTags(attachmentId, tags).then(r => {\n resolve(r)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Set Tags on an many attachments\n *\n * @category Attachments\n * @param {Array<number>|number} attachmentIds - An array of attachment IDs to add tags to.\n * @param {Array<{tagid: number, tagtext: string}>} tags - An array of tag objects to add to the attachments\n * @param {string} activityType - The type of activity to which the attachments belong\n * @return {Object} Returns Promise that represents a collection of documents which have had their tags set\n */\n setTagsOnMany(attachmentIds: number[], tags: {tagid: number, tagtext: string}[]) {\n return new Promise((resolve, reject) => {\n var returnData:Array<any> = []\n attachmentIds.forEach((attachmentId) => {\n this.loopSyncTags(attachmentId, tags, (r:any) => {\n returnData.push(r)\n })\n })\n resolve(returnData)\n })\n }\n\n /**\n * Get Doc labels for a case template\n *\n * @category Attachments\n * @param {number} busCaseId - The ID of the Business Case to get Document Labels for\n * @return {Object} Returns Promise that represents a collection of tags that can be added to attachments\n */\n getDocLabels(busCaseId: number) {\n return new Promise((resolve, reject) => {\n // check that parent is Case?\n var data = {\"BusCaseId\": busCaseId}\n switch(this.currentActivityType) {\n case 'Case':\n this.cw.runRequest('Pll/BusCaseDocLabel/GetByBusCaseId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n break;\n default:\n resolve([])\n }\n })\n } \n}\n","import { CWError } from './error'\nimport ReversibleMap from 'reversible-map'\n\n/**\n * ActivityLink interface for ActivityLinks\n *\n */\nexport interface ActivityLink {\n linkTypes: ReversibleMap<string, number>\n activityTypes: ReversibleMap<string, number>\n cw: any\n}\n\n/**\n * ActivityLinks implements the activity link functions via using the ActivityLink interface\n *\n */\nexport class ActivityLinks implements ActivityLink {\n /**\n * Activity types to map string to number for internal use. Activity types available are: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n */\n activityTypes: ReversibleMap<string, number>\n /**\n * Link types to map string to number for internal use. Link types available are: \"null\", \"parent\", \"related\"\n */\n linkTypes: ReversibleMap<string, number>\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.activityTypes = new ReversibleMap<string, number>()\n this.linkTypes = new ReversibleMap<string, number>()\n\n this.setActivityTypes();\n this.setLinkTypes();\n }\n\n private setActivityTypes(): void {\n const activityTypeMappings = ['null', 'case', 'inspection', 'request', 'workorder', 'wipcase'];\n\n activityTypeMappings.forEach((type, index) => {\n this.activityTypes.set(type, index);\n })\n }\n\n private setLinkTypes(): void {\n const linkTypeMappings = ['null', 'parent', 'related'];\n\n linkTypeMappings.forEach((type, index) => {\n this.linkTypes.set(type, index);\n });\n }\n\n private validateType(type: string, validTypes: ReversibleMap<string, number>, errorCode: number): void {\n if (!validTypes.has(type)) {\n throw new CWError(errorCode, `Activity type \"${type}\" not found.`, { provided: type, options: validTypes });\n }\n }\n\n private transformLinksData(response: any) {\n return response.Value.map(link => ({\n DestType: this.activityTypes.get(link.DestType),\n SourceType: this.activityTypes.get(link.SourceType),\n LinkType: this.linkTypes.get(link.LinkType),\n ...link,\n }));\n }\n\n private runRequest(path: string, data: any) {\n return this.cw.runRequest(path, data);\n }\n\n /**\n * Create a new activity link between two items.\n *\n * @param {string} source_type - Source type as string. Options: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n * @param {number} source_sid - Source SID (numeric ID) one wishes to remove a link between SID as source and a particular destination\n * @param {string} destination_type - Destination type as string: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n * @param {number} destination_sid - Destination SID (numeric ID) one wishes to remove a link between SID as destination and a particular source\n * @param {string} link_type - The type of link which exists between provided source and destination. Defaults to `related`. Options: \"null\", \"parent\", \"related\"\n * @return {Object} Returns Promise object that represents a\n */\n add(source_type: string, source_sid: number, destination_type: string, destination_sid: number, link_type: string = 'related') {\n return new Promise((resolve, reject) => {\n this.validateType(source_type, this.activityTypes, 1);\n this.validateType(destination_type, this.activityTypes, 2);\n this.validateType(link_type, this.linkTypes, 3);\n\n\n let data = {\n SourceType: this.activityTypes.get(source_type),\n SourceSid: source_sid,\n DestType: this.activityTypes.get(destination_type),\n DestSid: destination_sid,\n LinkType: this.linkTypes.get(link_type)\n }\n let path = 'General/ActivityLink/Add';\n\n this.runRequest(path, data)\n .then((response: any) => resolve(response.Value))\n .catch(reject);\n })\n }\n\n /**\n * Get the links for a particular node type by ID.\n *\n * @param {string} type - Source type as string. Options: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n * @param {Array<number>} sids - Array of numeric (S)IDs you wish to get of the specified type\n * @return {Object} Returns Promise object that represents a collection\n */\n get(type: string, sids: Array<number>) {\n return new Promise((resolve, reject) => {\n this.validateType(type, this.activityTypes, 4);\n\n let data = {\n ActivityType: this.activityTypes.get(type),\n ActivitySids: sids\n };\n // let _this = this\n let path = 'General/ActivityLink/ByActivitySids';\n\n this.runRequest(path, data)\n .then((response: any) => resolve(this.transformLinksData(response)))\n .catch(reject);\n });\n }\n\n /**\n * Clone a current activity link.\n *\n * @param {string} source_type - Source type as string. Options: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n * @param {number} source_sid - Source SID (numeric ID) one wishes to clone a link between SID as source and a particular destination\n * @param {string} destination_type - Destination type as string: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n * @param {number} destination_sid - Destination SID (numeric ID) one wishes to clone a link between SID as destination and a particular source\n * @return {Object} Returns Promise object that represents a\n */\n clone(source_type: string, source_sid: number, destination_type: string, destination_sid: number) {\n return new Promise((resolve, reject) => {\n this.validateType(source_type, this.activityTypes, 5);\n this.validateType(destination_type, this.activityTypes, 6);\n\n let data = {\n SourceActivityType: this.activityTypes.get(source_type),\n SourceActivitySid: source_sid,\n DestinationActivityType: this.activityTypes.get(destination_type),\n DestinationActivitySid: destination_sid\n }\n let path = 'General/ActivityLink/CloneByActivitySid';\n\n this.runRequest(path, data)\n .then((response: any) => resolve(response.Value))\n .catch(reject)\n })\n }\n\n /**\n * Delete an activity link by ID\n *\n * @param {number} activity_link_id - The ID of the activity link one wishes to delete\n * @return {Object} Returns Promise object that represents a\n */\n delete(activity_link_id: number) {\n return new Promise((resolve, reject) => {\n let data = {\n ActivityLinkId: activity_link_id\n }\n let path = 'General/ActivityLink/Delete'\n\n this.runRequest(path, data)\n .then((response: any) => resolve(response))\n .catch(reject(false))\n })\n }\n\n /**\n * Remove a link by specifying everything.\n *\n * @param {string} source_type - Source type as string. Options: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n * @param {number} source_sid - Source SID (numeric ID) one wishes to remove a link between SID as source and a particular destination\n * @param {string} destination_type - Destination type as string: \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n * @param {number} destination_sid - Destination SID (numeric ID) one wishes to remove a link between SID as destination and a particular source\n * @param {string} link_type - The type of link which exists between provided source and destination. Defaults to `related`. Options: \"null\", \"parent\", \"related\"\n * @return {Object} Returns Promise object that represents a\n */\n remove(source_type: string, source_sid: number, destination_type: string, destination_sid: number, link_type: string = 'related') {\n return new Promise((resolve, reject) => {\n this.validateType(source_type, this.activityTypes, 8);\n this.validateType(destination_type, this.activityTypes, 9);\n this.validateType(link_type, this.linkTypes, 10);\n\n let data = {\n SourceType: this.activityTypes.get(source_type),\n SourceSid: source_sid,\n DestType: this.activityTypes.get(destination_type),\n DestSid: destination_sid,\n LinkType: this.linkTypes.get(link_type)\n }\n let path = 'General/ActivityLink/Remove';\n\n this.runRequest(path, data)\n .then((response: any) => resolve(response))\n .catch(reject(false))\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class Gis {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Get gis service configuration for user, group, domain, or service id\n *\n * @param {string} [whichType] - domain, group, mapservice, or user\n * @param {number} [whichId] - domain, group, mapservice, or user Id\n * @param {number} [getGisData] - If true, check for feature server JSON data, default is true\n * @param {Array<string>} [context] Filter returned list by specific context, i.e. Office, Field, Mobile, Public, etc. Default is all.\n * @return {Object} Returns Promise object that represents an Object with the desired GIS service definitions\n */\n getConfig(whichType, whichId, getGisData: boolean = true, context: Array<string> = []) {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/Domain'\n whichType = whichType.toLowerCase()\n let data: {DomainId?: any, GroupId?: any, MapServiceId?: any, UserId?: any, GetGisData: boolean, Security: Array<string>}\n switch(whichType) {\n case 'domain':\n data = {DomainId:whichId, GetGisData: getGisData, Security: context}\n break\n case 'group':\n data = {GroupId:whichId, GetGisData: getGisData, Security: context}\n break\n case 'mapservice':\n data = {MapServiceId:whichId, GetGisData: getGisData, Security: context}\n break\n case 'user':\n data = {UserId:whichId, GetGisData: getGisData, Security: context}\n break\n }\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get domain gis services\n *\n * @param {number} domainId - The mobile map cache Id to download\n * @return {Object} Returns Promise object that represents an Object with the domain's default GIS services\n */\n domain(domainId, getGisData: boolean = true) {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/Domain'\n let data = {\n DomainId: domainId\n }\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Download mobile map cache\n *\n * @param {number} cacheId - The mobile map cache Id to download\n * @return {Object} Returns Promise object that represents a streaming download (?)\n */\n downloadMobile(cacheId, getGisData: boolean = true) {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/DownloadMobileMapCache'\n let data = {\n MobileMapCacheId: cacheId\n }\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get initial extent for user\n *\n * @return {Object} Returns Promise object that represents ... (?)\n */\n initialExtent() {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/InitialExtent'\n let data = {};\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get service request gis services\n *\n * @param {number} requestId - The WorkOrder to check against.\n * @param {boolean} getGisData - If true, check for feature server JSON data, default is true.\n * @return {Object} Returns Promise object that represents an Object with the specified request's entit(y|ies)\n */\n request(requestId, getGisData: boolean = true) {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/ServiceRequestConfiguration'\n let data = {\n RequestId: requestId,\n GetGisData: getGisData\n }\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspection gis services\n *\n * @param {number} inspectionId - The WorkOrder to check against.\n * @param {boolean} getGisData - If true, check for feature server JSON data, default is true.\n * @return {Object} Returns Promise object that represents an Object with the specified inspection's entity\n */\n inspection(inspectionId, getGisData: boolean = true) {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/InspectionConfiguration'\n let data = {\n InspectionId: inspectionId,\n GetGisData: getGisData\n }\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get workorder gis services\n *\n * @param {number} workOrderSid - The WorkOrder to check against.\n * @param {boolean} getGisData - If true, check for feature server JSON data, default is true.\n * @return {Object} Returns Promise object that represents an Object with the specified WorkOrder's entit(y|ies)\n */\n workOrder(workOrderSid, getGisData: boolean = true) {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/WorkOrderConfiguration'\n let data = {\n WorkOrderSid: workOrderSid,\n GetGisData: getGisData\n }\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get service request gis services\n *\n * @param {Array<string>} [context] Filter returned list by specific context, i.e. Office, Field, Mobile, Public, etc. Default is all.\n * @param {boolean} [allDomains] services assigned to any domain the user belongs to, default is true\n * @param {boolean} [allGroups] services assigned to any groups the user belongs to regardless of domain, default is true\n * @param {boolean} [getGisData] If true, check for feature server JSON data, default is true\n * @return {Object} Returns Promise object that represents an Object with the user's GIS services\n */\n user(context: Array<string> = [], allDomains: boolean = true, allGroups: boolean = true, getGisData: boolean = true) {\n return new Promise((resolve, reject) => {\n let path = 'Gis/MapService/User'\n let data = {\n AllDomains: allDomains,\n AllGroups: allGroups,\n GetGisData: getGisData,\n Security: context\n }\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Geocode server info by ServerId\n *\n * @param {number} ServiceId\n * @return {Object} Returns Promise object that represents an object describing the provided Geocoder service configuration\n */\n // Gis/GeoCode/GeocodeServer\n\n /**\n * Get currently selected entities from the Cityworks install's session for your user\n * @return {Object} Returns Promise object that represents an Object with the currently-selected entities\n */\n selectedEntities() {\n return new Promise((resolve, reject) => {\n let path = 'General/AppData/SelectedEntities'\n this.cw.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get attributes available for provided entity\n *\n * @param {string} entityType - The entity type to describe\n * @return {Object} Returns Promise object that represents a collection of attribute description objects\n */\n getEntityAttributes(entityType:string) {\n return new Promise((resolve, reject) => {\n let data = {EntityType: entityType}\n let path = 'AMS/Entity/Attributes'\n this.cw.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class MessageQueue {\n /**\n * @hidden\n */\n cw: any\n /**\n * Statuses -\n * Pending: 0,\n * Processing: 1,\n * Complete: 2,\n * Failed: 3\n */\n status: Object = {\n Pending: 0,\n Processing: 1,\n Complete: 2,\n Failed: 3\n }\n /**\n * Hook Types -\n * Unknown: 0,\n * ActivityUpdate: 1,\n * Email: 2,\n * WebHook: 3\n */\n hook_types: Object = {\n Unknown: 0,\n ActivityUpdate: 1,\n Email: 2,\n WebHook: 3\n }\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Process Webhook MessageQueue records by MessageQueueId\n *\n * @param {Array<number>} [ids] - List of MessageQueueId values\n * @param {boolean} [delete_successful] - automatically delete messages that complete with successful execution, default is false\n * @return {Array<>} Returns Promise object that represents a collection of QueueMessages which have been processed\n */\n processMessages(ids: Array<number>, delete_successful: boolean = false) {\n return new Promise((resolve, reject) => {\n let data = { Ids: ids, Delete: delete_successful}\n let path = 'General/WebHookEvent/ProcessMessages'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Messages specified in list of MessageQueueIds\n *\n * @param {Array<number>} ids - List of MessageQueueId values\n * @param {string} status -\n * @param {number} [maxcount] - Maximum number returned. Defaults to 15\n * @return {Array<>} Returns Promise object that represents a collection of QueueMessages which have been processed\n */\n get(ids: Array<number>, status: string, maxcount: number = 15) {\n return new Promise((resolve, reject) => {\n if(typeof(this.status[status])=='undefined') {\n reject(new CWError(1, 'Status provided does not exist or is mispelled.', {'provided': status, 'available':this.status}))\n }\n let data = {\n \"Ids\": ids,\n \"MaxCount\": typeof(maxcount)!='undefined' ? maxcount : 15,\n \"Status\": this.status[status]\n }\n let path = 'General/MessageQueue/ByIds'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Messages specified in list of MessageQueueIds\n *\n * @param {Array<number>} ids - List of MessageQueueId values\n * @param {string} status - automatically delete messages that complete with successful execution, default is false\n * @param {number} [hours_to_keep] - utomatically delete messages that complete with successful execution, default is false\n * @return {Array<>} Returns Promise object that represents a collection of QueueMessages which have been processed\n */\n delete(ids: Array<number>, status: string, hours_to_keep?: number) {\n return new Promise((resolve, reject) => {\n if(typeof(this.status[status])=='undefined') {\n reject(new CWError(2, 'Status provided does not exist or is mispelled.', {'provided': status, 'available':this.status}))\n }\n let data = {\n \"Ids\": ids,\n \"Status\": this.status[status],\n \"HoursToKeep\": hours_to_keep\n }\n let path = 'General/MessageQueue/Delete'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n // PreferencesList<GlobalPreference>\n // Base response type: CoreResponseBase\n // Get a list of message queue preferences\n // This method has no parameters\n preferences() {\n return new Promise((resolve, reject) => {\n let data = {}\n let path = 'General/MessageQueue/Preferences'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n search(parameters, max_results?: number) {\n let data: any\n return new Promise((resolve, reject) => {\n if(typeof(parameters.status)!=='undefined' && typeof(this.status[parameters.status])=='undefined') {\n reject(new CWError(3, 'Status provided does not exist or is mispelled.', {'provided': parameters.status, 'available':this.status}))\n } else if(typeof(parameters.status)!=='undefined' && typeof(this.status[parameters.status])!=='undefined') {\n data.Status = this.status[parameters.status]\n }\n if(typeof(max_results)!=='undefined') {\n data.MaxResults = max_results\n }\n let allowed_params = ['Id', 'HookId', 'HookType', 'Result', 'DateCreatedBegin', 'DateCreatedEnd', 'DateUpdatedBegin', 'DateUpdatedEnd']\n let disallowed_params = ['Status', 'MaxResults']\n _.forEach(parameters, (v, k) => {\n if(_.indexOf(allowed_params,k)!=-1 && _.indexOf(disallowed_params, k)==-1) {\n data[k] = v\n } else if(_.indexOf(disallowed_params, k)==-1) {\n reject(new CWError(4, 'Provided parameter does not exist or is mispelled.', {'provided': k, 'value': v, 'available':_.concat(allowed_params, disallowed_params)}))\n }\n })\n let path = 'General/MessageQueue/Search'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n if(typeof(response.Value)=='undefined') {\n response.Value = []\n }\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update queue message\n *\n * @param {Object} parameters - Provide allowed parameters:\n *\n * {\n * HookId: number,\n * Id: number,\n * Packet: string,\n * Result: string,\n * Status: string, // Available options: Pending, Processing, Complete, Failed\n * HookType: string // Available options: Unknown, ActivityUpdate, Email, WebHook\n * }\n *\n * @return {Object} Returns Promise object that represents an Object with the desired GIS service definitions\n */\n update(parameters: any) {\n let data: any\n return new Promise((resolve, reject) => {\n if(typeof(parameters.status)!=='undefined' && typeof(this.status[parameters.status])=='undefined') {\n reject(new CWError(3, 'Status provided does not exist or is mispelled.', {'provided': parameters.status, 'available':this.status}))\n } else if(typeof(parameters.status)!=='undefined' && typeof(this.status[parameters.status])!=='undefined') {\n data.Status = this.status[parameters.status]\n }\n if(typeof(parameters.hook_types)!=='undefined' && typeof(this.hook_types[parameters.hook_types])=='undefined') {\n reject(new CWError(3, 'Status provided does not exist or is mispelled.', {'provided': parameters.hook_types, 'available':this.hook_types}))\n } else if(typeof(parameters.hook_types)!=='undefined' && typeof(this.hook_types[parameters.hook_types])!=='undefined') {\n data.HookType = this.hook_types[parameters.hook_types]\n }\n let allowed_params = ['Id', 'HookId', 'Packet', 'Result']\n let disallowed_params = ['Status', 'HookType']\n _.forEach(parameters, (v, k) => {\n if(_.indexOf(allowed_params,k)!=-1 && _.indexOf(disallowed_params, k)==-1) {\n data[k] = v\n } else if(_.indexOf(disallowed_params, k)==-1) {\n reject(new CWError(5, 'Provided parameter does not exist or is mispelled.', {'provided': k, 'value': v, 'available':_.concat(allowed_params, disallowed_params)}))\n }\n })\n\n let path = 'General/MessageQueue/Update'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n if(typeof(response.Value)=='undefined') {\n response.Value = []\n }\n resolve(response.Value)\n })\n })\n }\n\n updateMessageStatus(ids: number[], status: string, hours_to_keep?: number) {\n return new Promise((resolve, reject) => {\n if(typeof(this.status[status])=='undefined') {\n reject(new CWError(2, 'Status provided does not exist or is mispelled.', {'provided': status, 'available':this.status}))\n }\n let data = {\n \"Ids\": ids,\n \"Status\": this.status[status],\n \"HoursToKeep\": hours_to_keep\n }\n let path = 'General/MessageQueue/UpdateMessageStatus'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n })\n })\n }\n\n getWebooks(hook_ids) {\n return new Promise((resolve, reject) => {\n let data = {\n \"HookIds\": hook_ids\n }\n let path = 'General/MessageQueue/WebHooks'\n this.cw.runRequest(path, data).then((response: any) => {\n // TODO\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class Search {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Search Types: Null, Request, WorkOrder, Inspection, Contract, Permit, GIS, PermitTask, PermitAddress, InspCommon, Case, WorkOrderEntity, StoreTransaction, Requisition, Material, WorkActivity, MaterialLeaf, WoTemplate, Unknown, Employee, MessageQueue, Analytics, TokenState, AssetCalculationResult, Equipment, CustomerAccount, InspTemplate, ProblemLeaf, AssetSplitRecord, PavementInsp, TvInspection, Projects\n */\n searchTypes: Object = {\n \"Null\": 0,\n \"Request\": 1,\n \"WorkOrder\": 2,\n \"Inspection\": 3,\n \"Contract\": 4,\n \"Permit\": 5,\n \"GIS\": 6,\n \"PermitTask\": 7,\n \"PermitAddress\": 8,\n \"InspCommon\": 9,\n \"Case\": 10,\n \"WorkOrderEntity\": 11,\n \"StoreTransaction\": 12,\n \"Requisition\": 13,\n \"Material\": 14,\n \"WorkActivity\": 15,\n \"MaterialLeaf\": 16,\n \"WoTemplate\": 17,\n \"Unknown\": 18,\n \"Employee\": 19,\n \"MessageQueue\": 20,\n \"Analytics\": 21,\n \"TokenState\": 22,\n \"AssetCalculationResult\": 23,\n \"Equipment\": 24,\n \"CustomerAccount\": 25,\n \"InspTemplate\": 26,\n \"ProblemLeaf\": 27,\n \"AssetSplitRecord\": 28,\n \"PavementInsp\": 29,\n \"TvInspection\": 30,\n \"Projects\": 31\n }\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Do a \"quick\" search for an ID or Case Number\n *\n * @category Quick Search\n * @param {string} text - text to search the system for\n * @return {Object} Returns Promise object that represents a collection of the currently authenticated user's notifications\n */\n quick(text: string) {\n return new Promise((resolve, reject) => {\n let data = {\n \"QuickSearchText\": text,\n }\n this.cw.runRequest('General/QuickSearch/QuickSearch', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Execute a saved search\n *\n * @category Search\n * @param {number} searchId - SearchId to execute\n * @param {Object} options - Other options. See: /{subdirectory}/apidocs/#/service-info/Ams/Search\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n execute(searchId: number, options?: {EmployeeSid?: number, ExcludeEmptyXY?: boolean, Extent?: Object, Frequency?: boolean, IdsOnly?: boolean, IncludeSearchOrder?: boolean, MaxResults?: number, ResultFields?: Array<string>, TotalOnly?: boolean}) {\n return new Promise((resolve, reject) => {\n var data = {\n SearchId: searchId\n }\n data = _.merge(data, options)\n this.cw.runRequest('Ams/Search/Execute', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of the saved searches by search type and specific entity types OR employeeSid/domainId. You cannot search for saved searches by both specific entity type AND employeeSid/domainId.\n *\n * @category Search\n * @param {string} searchType - Get the saved searches for a particular type\n * @param {Array<string>} [applyToEntities] - Restrict GIS searches to specified entity types\n * @param {number} [employeeSid] - The employee SID to retrieve the searches as\n * @param {number} [domainId] - The domain ID of the domain to search\n * @return {Object} Returns Promise object that represents a collection of SearchDefinitionName\n */\n getSaved(searchType: string, applyToEntities?: Array<string>, employeeSid?: number, domainId?: number) {\n return new Promise((resolve, reject) => {\n if(!_.has(this.searchTypes, searchType)) {\n reject(new CWError(2, 'SearchType provided does not exist or is mispelled.', {'provided': searchType, 'available':this.searchTypes}))\n } else if(typeof(applyToEntities)!='undefined' && applyToEntities!=null && applyToEntities.length>0 && (typeof(employeeSid)!='undefined' || typeof(domainId)!='undefined')) {\n reject(new CWError(3, 'You cannot specify both applyToEntities AND employeeSid/domainId'))\n }\n var data = {}\n var savedEndpoint = ''\n if(typeof(employeeSid)!='undefined' || typeof(domainId)!='undefined') {\n savedEndpoint = 'SavedByType'\n if(typeof(employeeSid)!='undefined' && employeeSid!=null) {\n _.set(data, 'EmployeeSid', employeeSid)\n }\n if(typeof(domainId)!='undefined' && domainId!=null) {\n _.set(data, 'DomainId', domainId)\n }\n } else {\n if(searchType=='Case') {\n savedEndpoint = 'PllSavedSaved'\n } else {\n savedEndpoint = searchType + 'Saved'\n }\n if(typeof(applyToEntities)!='undefined' && applyToEntities!=null) {\n _.set(data, 'ApplyToEntities', applyToEntities)\n }\n }\n this.cw.runRequest('Ams/Search/'+savedEndpoint, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list display fields for a Search Type\n *\n * @category Search Options\n * @param {string} searchType - Restrict GIS searches to specified entity types\n * @return {Object} Returns Promise object that represents a collection of SearchDisplayFields\n */\n displayFields(searchType: string) {\n return new Promise((resolve, reject) => {\n if(!_.has(this.searchTypes, searchType)) {\n reject(new CWError(1, 'SearchType provided does not exist or is mispelled.', {'provided': searchType, 'available':this.searchTypes}))\n }\n var data = {\n searchType: _.get(this.searchTypes, searchType)\n }\n this.cw.runRequest('Ams/Search/DisplayFields', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list search types\n *\n * @category Search Options\n * @return {Object} Returns Promise object that represents a collection of SearchTypeInfo objects\n */\n types() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Ams/Search/Types', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Enable Service URLs on Saved Searches\n *\n * @category Search Options\n * @param {Array<number>} searchIds - Search IDs to enable eURL on\n * @return {Object} Returns Promise object that represents a dictionary of SearchIds and EURL booleans\n */\n enableServices(searchIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n Enable: true,\n SearchIds: searchIds\n }\n this.cw.runRequest('Ams/Search/UpdateEurl', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Disable Service URLs on Saved Searches\n *\n * @category Search Options\n * @param {Array<number>} searchIds - Search IDs to enable eURL on\n * @return {Object} Returns Promise object that represents a dictionary of SearchIds and EURL booleans\n */\n disableServices(searchIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n Enable: false,\n SearchIds: searchIds\n }\n this.cw.runRequest('Ams/Search/UpdateEurl', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a search definition\n *\n * @category Search Definitions\n * @param {number} searchId - SearchId to get.\n * @param {number} employeeSid - Enforces employee security settings on search definition if provided.\n * @return {Object} Returns Promise object that represents a SearchDefinition object\n */\n getDefinition(searchId: number, employeeSid?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n SearchId: searchId\n }\n if(typeof(employeeSid)!='undefined') {\n _.set(data, 'EmployeeSid', employeeSid)\n }\n this.cw.runRequest('Ams/Search/Definition', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get search definitions\n *\n * @category Search Definitions\n * @param {Array<number>} searchIds - SearchIds to get.\n * @param {number} employeeSid - Enforces employee security settings on search definition if provided.\n * @return {Object} Returns Promise object that represents a collection of SearchDefinition objects\n */\n getDefinitions(searchIds: Array<number>, employeeSid?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n SearchIds: searchIds\n }\n if(typeof(employeeSid)!='undefined') {\n _.set(data, 'EmployeeSid', employeeSid)\n }\n this.cw.runRequest('Ams/Search/Definitions', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get search definition names\n *\n * @category Search Definitions\n * @param {Array<number>} searchIds - SearchIds to get.\n * @return {Object} Returns Promise object that represents a collection of SearchDefinitionNames\n */\n getDefinitionNames(searchIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n SearchIds: searchIds\n }\n this.cw.runRequest('Ams/Search/DefinitionNames', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete search definitions\n *\n * @category Search Definitions\n * @param {Array<number>} searchIds - SearchIds to get.\n * @return {Object} Returns Promise object that represents a list (dictionary) of search IDs and deletion success boolean\n */\n deleteDefinitions(searchIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n SearchIds: searchIds\n }\n this.cw.runRequest('Ams/Search/DeleteDefinitions', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Save a search definition\n *\n * @category Search Definitions\n * @param {string} searchFor - Name of type to search for from searchTypes\n * @param {Object} options - Other options. See: /{subdirectory}/apidocs/#/service-info/Ams/Search\n * @param {number} searchId - SearchId to update. Defaults to \"0\" which is \"Create new saved search\"\n * @return {Object} Returns Promise object that represents a SearchDefinitionName object\n */\n saveDefinition(searchFor: string, options?: Object, searchId: number = 0) {\n return new Promise((resolve, reject) => {\n if(!_.has(this.searchTypes, searchFor)) {\n reject(new CWError(1, 'SearchType provided does not exist or is mispelled.', {'provided': searchFor, 'available':this.searchTypes}))\n }\n var data = {\n SearchFor: _.get(this.searchTypes, searchFor),\n SearchId: searchId\n }\n data = _.merge(data, options)\n this.cw.runRequest('Ams/Search/SaveDefinition', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Convert a search definition to a query\n *\n * @category Search Definitions\n * @param {Array<number>} searchIds - searchIds to convert\n * @param {boolean} saveQuery - Automatically save a query which converts with no errors, default is false\n * @param {boolean} allowMultipleBooleanValues - Use all values for boolean fields even though a boolean should only have one value, default is false and will only use the first boolean value\n * @param {boolean} allowEmptyQuery - Create default filter when no filter is found, default is false\n * @return {Object} Returns Promise object that represents a SearchToQueryResult list\n */\n convertToQuery(searchIds: Array<number>, saveQuery: boolean = false, addEurl: boolean = false, allowMultipleBooleanValues: boolean = false, allowEmptyQuery: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n \"SearchIds\": searchIds,\n \"SaveQuery\": saveQuery,\n \"AddEurl\": addEurl,\n \"AllowMultipleBooleanValues\": allowMultipleBooleanValues,\n \"AllowEmptyQuery\": allowEmptyQuery\n }\n this.cw.runRequest('General/Query/SearchToQuery', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\n\ninterface DynamicVariableMap {\n [key: string]: any\n}\n\ninterface DynamicResponseDefinition {\n [key: string]: any\n}\n\n\nexport class Query {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Build a query using query language syntax or by specifying a saved query ID\n *\n * @category Query\n * @param {number} query - Query to run (specify syntax or queryID)\n * @param {Object} options - Other options. See: /{subdirectory}/apidocs/#/service-info/General/Query\n * @param {number} [domainId] - The domain ID of the domain to search, defaut is authenticated user's current domain\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n build(query: number|string, options: {Page?: number, PageSize?: number, SortDescending?: boolean, SortField?: string, Variables?: DynamicVariableMap} = {}, domainId?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n }\n if(isNaN(+query)) {\n _.set(data, \"QueryValue\", query)\n } else if(!isNaN(+query)) {\n _.set(data, \"QueryId\", query)\n } else {\n // throw error\n }\n data = _.merge(data, options)\n if(typeof(domainId)!=='undefined') {\n _.set(data, \"DomainId\", domainId)\n }\n this.cw.runRequest('General/Query/Builder', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get available query types\n *\n * @category Query\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n getTypes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('General/Query/QueryTypes', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get info about query types\n *\n * @category Query\n * @param {boolean} includeDefaultSchemasInclude - Include schemas (Work Order, Service Request, etc), default is true.\n * @param {boolean} includeGisSchemas - Include gis schemas, ddefault is true.\n * @param {number} [domainId] - The domain ID of the domain to search, defaut is authenticated user's current domain\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n getTypesInfo(includeDefaultSchemasInclude: boolean = true, includeGisSchemas: boolean = true, domainId?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n \"IncludeDefaultSchemasInclude\": includeDefaultSchemasInclude,\n \"IncludeGisSchemas\": includeGisSchemas\n }\n if(typeof(domainId)!=='undefined') {\n _.set(data, \"DomainId\", domainId)\n }\n this.cw.runRequest('General/Query/QueryTypeInformation', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Validate a query string\n *\n * @category Query\n * @param {string} query - The query to validate\n * @param {DynamicVariableMap} variables - Required if the query includes variables\n * @param {number} [domainId] - The domain ID of the domain to search, defaut is authenticated user's current domain\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n validateQuery(query: string, variables: DynamicVariableMap, domainId?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n \"Query\": query,\n \"Variables\": variables\n }\n if(typeof(domainId)!=='undefined') {\n _.set(data, \"DomainId\", domainId)\n }\n this.cw.runRequest('General/Query/ValidateQuery', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n \n /**\n * Validate a query response definition\n *\n * @category Query\n * @param {string} queryType - The query to validate\n * @param {DynamicResponseDefinition} responseDefinition - Required if the query includes variables\n * @param {number} [domainId] - The domain ID of the domain to search, defaut is authenticated user's current domain\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n validateResponseDefinition(queryType: string, responseDefinition: DynamicResponseDefinition, domainId?: number) {\n // TODO: Confirm that the queryType is present in the getTypes() request\n return new Promise((resolve, reject) => {\n var data = {\n \"QueryType\": queryType,\n \"ResponseDefinition\": responseDefinition\n }\n if(typeof(domainId)!=='undefined') {\n _.set(data, \"DomainId\", domainId)\n }\n this.cw.runRequest('General/Query/ValidateResponseDefinition', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get schema for specified query type\n *\n * @category Query\n * @param {string} queryType - Specify Query Type\n * @param {number} [domainId] - The domain ID of the domain to search, defaut is authenticated user's current domain. Used to determine query field configuration for the schema fields.\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n getSchema(queryType: string, domainId?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n \"QueryType\": queryType\n }\n if(typeof(domainId)!=='undefined') {\n _.set(data, \"DomainId\", domainId)\n }\n this.cw.runRequest('General/Query/QuerySchema', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Run a query using query language syntax\n *\n * @category Query\n * @param {number} query - Query syntax string or saved query ID to run. If you want to append addt'l query items to a saved query, add QueryValue in the options\n * @param {Object} options - Other options. See: /{subdirectory}/apidocs/#/service-info/General/Query\n * @return {Object} Returns Promise object that represents a list of Objects\n */\n run(query: string|number, options: {QueryValue?: string, Page?: number, PageSize?: number, ResponseFields?: any, SortDescending?: boolean, SortField?: string, Variables?: DynamicVariableMap} = {}) {\n return new Promise((resolve, reject) => {\n var data = {}\n var api_path: string = 'General/Query/Query';\n if(isNaN(+query)) {\n _.set(data, \"QueryValue\", query)\n if(typeof(options.QueryValue)!=='undefined') {\n _.unset(options, 'QueryValue')\n }\n } else if(!isNaN(+query) || _.isNumber(query)) {\n _.set(data, \"QueryId\", query)\n var api_path = 'General/Query/RunById'\n } else {\n // throw error\n reject(new CWError(501, 'Invalid query type', {'provided': query}))\n }\n data = _.merge(data, options)\n this.cw.runRequest(api_path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of the saved queries the current user can access.\n *\n * @category Query\n * @param {Array<string>} queryTypes - Get the saved queries for a particular type, default is all types\n * @param {boolean} createdOnly - Get only queries created by the current user, default is get all queries current user can access\n * @param {boolean} includeQuery - Restrict GIS searches to specified entity types\n * @param {boolean} [visibleToMobile] - Filter visibility to mobile. Default ignore visibility to mobile.\n * @param {number} [domainId] - The domain ID of the domain to search, defaut is authenticated user's current domain\n * @return {Object} Returns Promise object that represents a collection of SavedQueries\n */\n getSaved(queryTypes: Array<string> = [], createdOnly: boolean = false, includeQuery: boolean = true, visibleToMobile?: boolean, domainId?: number) {\n return new Promise((resolve, reject) => {\n // TODO: Check QueryTypeInformation and compare\n var data = {\n \"CreatedOnly\": createdOnly,\n \"IncludeQuery\": includeQuery\n }\n if(queryTypes.length==1) {\n _.set(data, \"QueryType\", queryTypes.pop())\n } else if(queryTypes.length>1) {\n _.set(data, \"QueryTypes\", queryTypes)\n }\n if(typeof(domainId)!=='undefined') {\n _.set(data, \"DomainId\", domainId)\n }\n this.cw.runRequest('General/Query/SavedQueries', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\nimport { convertToObject } from 'typescript';\n\nexport class Report {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n request: any\n \n /**\n * @hidden\n */\n inspection: any\n\n /**\n * @hidden\n */\n workorder: any\n\n /**\n * @hidden\n */\n briefcase: any\n\n /**\n * @hidden\n */\n static downloadUrls() {\n return {'request': 'Ams/Reports/DownloadSrReport', 'workorder': 'Ams/Reports/DownloadWoReport', 'inspection': 'Ams/Reports/DownloadInspReport', 'case': 'Pll/BusinessCaseReports/Download'}\n }\n\n /**\n * @hidden\n */\n constructor(cw, inspection: any, workorder: any, request: any, briefcase: any) {\n this.cw = cw\n this.inspection = inspection\n this.workorder = workorder\n this.request = request\n this.briefcase = briefcase\n }\n\n /**\n * Get the pdf \"print\" report for a specific CW node item\n *\n * @category Reports\n * @param {string} type - The node type (case, workorder, inspection, request)\n * @param {number} node_id - CaseDataGroupId as defined in CaseDataGroup admin.\n * @param {string} filename - The filename of the report.\n * @return {Object} Returns Promise that represents a file stream of a pdf\n */\n print(type: string, node_id: number, filename?: string) {\n return new Promise((resolve, reject) => {\n if(type!=='case' && type!=='workorder' && type!=='inspection' && type!=='request') {\n reject(new CWError(405, 'Invalid type provided. Must be case, workorder, inspection, or request.'))\n return\n }\n if(typeof(node_id)==='undefined' || node_id===null || isNaN(node_id) || node_id<=0) {\n reject(new CWError(406, 'Invalid node_id provided. Must be a number greater than 0.'))\n return\n }\n var dl_url: String = ''\n var output_name = _.capitalize(type) + '_' + node_id\n // Check which verson of CW we're connected to\n if(this.cw.v() >= 23) {\n this.resolveFileName(type, node_id, filename).then((resolvedInfo: {fn: string, desc: string, cn?: string}) => {\n var data = {\n FileName: resolvedInfo.fn\n }\n if(!_.isUndefined(resolvedInfo.cn)) {\n output_name = resolvedInfo.cn ?? output_name\n }\n output_name += (resolvedInfo.desc && resolvedInfo.desc.length>0 ? '_' + _.startCase(resolvedInfo.desc).replaceAll(' ', '_') : '') + '.pdf'\n switch (type) {\n case 'request':\n dl_url = Report.downloadUrls()['request']\n _.set(data, 'RequestId', node_id)\n break\n case 'workorder':\n dl_url = Report.downloadUrls()['workorder']\n _.set(data, 'WorkOrderId', node_id)\n break\n case 'inspection':\n dl_url = Report.downloadUrls()['inspection']\n _.set(data, 'InspectionId', node_id)\n break\n case 'case':\n dl_url = Report.downloadUrls()['case']\n _.set(data, 'PermitId', node_id)\n break\n }\n // console.log('Downloading from', dl_url, 'with data', data)\n this.cw.runRequest(dl_url, data).then(file_contents => {\n // console.log('file_contents', file_contents)\n try {\n var json = JSON.parse(file_contents)\n reject(json)\n } catch (e) {\n // It's actually a PDF! Let's proceed.\n resolve({file: file_contents, name: output_name})\n }\n }).catch(e => {\n // console.log('Error', e)\n reject(e)\n })\n }).catch((e) => {\n reject(e)\n })\n } else if(this.cw.v()<23) {\n // Maybe I'll get to this for CR later. But you should really just update to 23.x and run ActiveReports\n console.log('CR print not implemented yet')\n } else {\n // Error, we don't know what version of CW we're connected to\n console.log('No clue what version of CW we are connected to')\n }\n })\n }\n\n /**\n * Get the custom pdf report from a CW 15.x instance\n *\n * @category Reports\n * @param {number} report_id - CaseDataGroupId as defined in CaseDataGroup admin.\n * @return {Object} Returns Promise that represents a file stream of a pdf\n */\n get(type: string, node_id: number, fileName: string) {\n return new Promise((resolve, reject) => {\n var dl_url: String = ''\n // Check which verson of CW we're connected to\n if(this.cw.v() >= 23) {\n // Custom reporting endpoints don't exist for AR in 23 right now...\n } else if(this.cw.v() < 23) {\n // This is the only one that runs right now\n \n } else {\n // Error, we don't know what version of CW we're connected to\n }\n })\n }\n\n /**\n * @hidden\n * Check on the filename for each\n *\n * @category Reports\n * @param {string} type - The node type (case, workorder, inspection, request)\n * @param {number} node_id - CaseDataGroupId as defined in CaseDataGroup admin.\n * @param {string | undefined} filename - The filename of the report.\n * @param {Object<[key: string]: any> | undefined} options - Additional options for the report.\n * @return {Object} Returns Promise that represents a file stream of a pdf\n */\n resolveFileName(type: string, node_id: number, filename?: string | undefined, options?: { [key: string]: any }): Promise<{fn: string, desc: string, cn?: string}> {\n return new Promise<{fn: string, desc: string, cn?: string}>((resolve, reject) => {\n if(typeof(filename)==='undefined' || filename===null || filename==='') {\n // If no filename is provided, we need to set the filename to the default for the node_id\n switch (type) {\n case 'request':\n this.request.getById(node_id).then((r) => {\n this.request.admin.getTemplateById(r.ProblemSid).then((template) => {\n if(typeof(template.SRPrintTmpt)==='undefined' || template.SRPrintTmpt===null || template.SRPrintTmpt==='') {\n reject(new CWError(404, 'No print template defined for this service request'))\n return\n } else {\n resolve({fn: template.SRPrintTmpt, desc: template.Description})\n }\n }).catch((e) => {\n console.log('Template error', e)\n reject(e)\n })\n }).catch((e) => {\n console.log('Inspection error', e)\n reject(e)\n })\n break\n case 'workorder':\n this.workorder.getById(node_id).then((r) => {\n this.workorder.admin.getTemplateById(r.WOTemplateId).then((template) => {\n if(typeof(template.WOPrintTmpt)==='undefined' || template.WOPrintTmpt===null || template.WOPrintTmpt==='') {\n reject(new CWError(404, 'No print template defined for this work order'))\n return\n } else {\n resolve({fn: template.WOPrintTmpt, desc: template.Description})\n }\n }).catch((e) => {\n console.log('Template error', e)\n reject(e)\n })\n }).catch((e) => {\n console.log('Work Order error', e)\n reject(e)\n })\n break\n case 'inspection':\n this.inspection.getById(node_id).then((r) => {\n this.inspection.admin.getTemplateById(r.InspTemplateId).then((template) => {\n // default to first if no print template named\n if(typeof(template.PrintTemplate)==='undefined' || template.PrintTemplate===null || template.PrintTemplate==='') {\n reject(new CWError(404, 'No print template defined for this inspection type.'))\n return\n } else {\n resolve({fn: template.PrintTemplate, desc: template.Description})\n }\n }).catch((e) => {\n console.log('Template error', e)\n reject(e)\n })\n }).catch((e) => {\n reject(e)\n })\n break\n case 'case':\n this.briefcase.getById(node_id).then((r) => {\n if(!_.isUndefined(r.CaseNumber) && r.CaseNumber!==null && r.CaseNumber.length>0) {\n // include case number in output name\n var cn = r.CaseNumber;\n }\n this.briefcase.getPrintTemplates(node_id).then((r) => {\n // default to first if no print template named\n if(r===null ||typeof(r)==='undefined' || typeof(r[0].ReportName)==='undefined' || r[0].ReportName===null || r[0].ReportName==='') {\n reject(new CWError(404, 'No print template defined for this case'));\n return;\n } else {\n resolve({fn: r[0].FileName.replace('.rpt', ''), desc: r[0].ReportName, cn: cn});\n }\n }).catch((e) => {\n reject(e);\n });\n }).catch((e) => {\n reject(e);\n });\n break\n }\n } else {\n // We should really move this up to above. But for now, if a filename is provided, just use it.\n resolve({fn: filename, desc: ''})\n }\n })\n }\n}","import { CWError } from './error'\nconst _ = require('lodash')\n\ninterface Coordinates {\n x: number;\n y: number;\n z?: number;\n}\n\nexport class Request {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Request Administration methods\n */\n admin?: any\n\n /**\n * Request Costing methods\n */\n costs: any\n\n /**\n * Request Comments methods\n */\n comment: any\n\n /**\n * Attachments methods\n */\n attachments: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.admin\n this.comment\n this.attachments\n }\n\n /**\n * Create new requests\n *\n * @category Requests\n * @param {Object} sr_data - See /{subdirectory}/apidocs/#/data-type-infodataType=RequestBase on the Cityworks instance\n * @return {Object} Returns Promise that represents an object describing the newly-created request\n */\n create(sr_data: Object) {\n return new Promise((resolve, reject) => {\n if(!_.has(sr_data, 'ProblemSid')) {\n reject(new CWError(2, 'ProblemSid must be provided.', {'provided': sr_data}))\n } else {\n this.cw.runRequest('Ams/ServiceRequest/Create', sr_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Update a request\n *\n * @category Requests\n * @param {object} sr_data - See /{subdirectory}/apidocs/#/data-type-infodataType=RequestBase on the Cityworks instance\n * @return {Object} Returns Promise that represents an object describing the updated request\n */\n update(sr_data: Object) {\n return new Promise((resolve, reject) => {\n if(!_.has(sr_data, 'RequestId')) {\n reject(new CWError(3, 'RequestId must be provided.', {'provided': sr_data}))\n } else {\n this.cw.runRequest('Ams/ServiceRequest/Update', sr_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Move a request's point\n *\n * @category Requests\n * @param {number} requestId\n * @param {number} x\n * @param {number} y\n * @param {Object} projection - Should include at least WKT _or_ WKID attribute. Can also include VcsWKID attribute.\n * @param {number} [z] - Optional Z coordinate\n * @return {Object} Returns Promise that represents an object describing the updated GISPoint\n */\n move(requestId: number, x: number, y: number, projection: {WKID?: string, WKT?: string, VcsWKID?: string}, z?: number) {\n return new Promise((resolve, reject) => {\n if(!_.has(projection, 'WKID') && !_.has(projection, 'WKT')) {\n // Throw error\n reject(new CWError(6, 'You must provide either the WKID or WKT for the x/y coordinates.', {'projection': projection}))\n }\n var base_data = {\n RequestId: requestId,\n X: x,\n Y: y\n };\n if(typeof(z)!='undefined') {\n _.set(base_data, 'Z', z)\n }\n var data = _.merge(base_data, projection);\n this.cw.runRequest('Ams/ServiceRequest/Move', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Change a request's problem code\n *\n * @category Requests\n * @param {number} requestId - The request ID to change\n * @param {number} problemSid - The request's new ProblemSID\n * @return {Object} Returns Promise that represents an object describing the updated request\n */\n changeProblem(requestId: number, problemSid: number) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestId: requestId,\n ProblemSid: problemSid\n }\n this.cw.runRequest('Ams/ServiceRequest/ChangeProblem', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a request by ID\n *\n * @category Requests\n * @param {number} requestId - The ID of the request to retrieve\n * @return {Object} Returns Promise that represents an object describing the request\n */\n getById(requestId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestId: requestId\n }\n this.cw.runRequest('Ams/ServiceRequest/ById', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get requests by array of IDs\n *\n * @category Requests\n * @param {Array<number>} requestIds - The request IDs to retrieve\n * @return {Object} Returns Promise that represents a collection of Objects describing the requests\n */\n getByIds(requestIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds\n }\n this.cw.runRequest('Ams/ServiceRequest/ByIds', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the audit log for a specific request\n *\n * @category Requests\n * @param {number} requestId - A Request ID to get the audit log for\n * @return {Object} Returns Promise that represents a collection of Cityworks Metadata Objects\n */\n getAuditLog(requestId: number) {\n return new Promise((resolve, reject) => {\n var data = {RequestId: requestId}\n this.cw.runRequest('Ams/ServiceRequest/AuditLog', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get custom fields for provided requests\n *\n * @category Requests\n * @param {Array<number>} requestIds - The RequestIds whose custom fields should be returned\n * @return {Object} Returns Promise that represents a collection of custom fields\n */\n getCustomFields(requestIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds,\n }\n this.cw.runRequest('Ams/ServiceRequest/CustomFields', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Change custom field category for provided requests\n *\n * @category Requests\n * @param {Array<number>} requestIds - The RequestIds whose custom fields should be returned\n * @param {number} categoryId - The new custom field grouping/category which should be assigned to the provided requests\n * @return {Object} Returns Promise that represents a collection of requests\n */\n changeCustomFieldCategory(requestIds: Array<number>, categoryId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds,\n CategoryId: categoryId\n }\n this.cw.runRequest('Ams/ServiceRequest/ChangeCustomFieldCategory', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Cancel requests\n *\n * @category Requests\n * @param {Array<number>} requestIds - An array of the IDs to cancel the matched requests\n * @param {string} [cancelReason] - A reason for cancelling the request(s)\n * @param {datetime} [dateCancelled] - The date/time that it should be indicated the request was cancelled\n * @return {Object} Returns object that represents a collection of requests\n */\n cancel(requestIds: Array<number>, cancelReason?: string, dateCancelled?: Date) {\n return new Promise((resolve, reject) => {\n var m = new Date()\n var data: {RequestIds: Array<number>, CancelReason?: string, DateCancelled?: Date} = { RequestIds: requestIds }\n if(typeof(cancelReason)!=='undefined')\n _.set(data, 'CancelReason', cancelReason);\n if(typeof(dateCancelled)!=='undefined')\n _.set(data, 'DateCancelled', dateCancelled);\n this.cw.runRequest('Ams/ServiceRequest/Cancel', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Uncancel requests\n *\n * @category Requests\n * @param {Array<number>} requestIds - An array of the IDs to uncancel the matched requests\n * @return {Object} Returns object that represents a collection of requests\n */\n uncancel(requestIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds\n }\n this.cw.runRequest('Ams/ServiceRequest/Uncancel', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Close requests\n *\n * @category Requests\n * @param {Array<number>} requestIds - An array of the IDs to close the matched requests\n * @return {Object} Returns object that represents a collection of requests\n */\n close(requestIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds\n }\n this.cw.runRequest('Ams/ServiceRequest/Close', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(5, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Reopen closed requests\n *\n * @category Requests\n * @param {Array<number>} requestIds - An array of the IDs to reopen the matched requests\n * @return {Object} Returns object that represents a collection of requests\n */\n reopen(requestIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds\n }\n this.cw.runRequest('Ams/ServiceRequest/ReOpen', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete requests\n *\n * @category Requests\n * @param {Array<number>} requestIds - An array of the IDs to delete the matched requests\n * @return {Object} Returns object that represents a collection of request Ids which have been deleted\n */\n delete(requestIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds\n }\n this.cw.runRequest('Ams/ServiceRequest/Delete', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for requests\n *\n * @category Request Search\n * @param {Object} searchData - The search information to retrieve matched requests, see instance docs: /{subdirectory}/apidocs/#/service-info/Ams/ServiceRequest\n * @return {Object} Returns Promise that represents an Array of the matching request IDs\n */\n search(searchData: Object) {\n return new Promise((resolve, reject) => {\n var data = searchData\n this.cw.runRequest('Ams/ServiceRequest/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the records on the basis of RequestId, only populates RequestId, Description, ProblemCode properties\n *\n * @category Request Object Search\n * @param {string} requestId - ???, see instance docs: /{subdirectory}/apidocs/#/service-info/Ams/ServiceRequest\n * @return {Object} Returns Promise that represents a collection of the matching (limited) request objects\n */\n searchObject(requestId: string) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestId: requestId\n }\n this.cw.runRequest('Ams/ServiceRequest/SearchObject', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Create a search definition. Save the definition by setting SaveDefinition = true and supplying a SearchName.\n *\n * @category Requests\n * @param {Object} searchData - Search data variables. See /{subdirectory}/apidocs/#/service-info/Ams/ServiceRequest\n * @param {number} [searchName] - What to name your search (if it should be saved)\n * @param {number} [sharedWithin] - What group or domain to share the search to.\n * @param {boolean} saveDefinition - Whether or not to save the search definition. Defaults to true when a search name is specified.\n * @param {boolean} enableEurl - Whether or not to enable EURL for the saved search. Defaults to true.\n * @return {Object} Returns Promise that represents a collection of Cityworks Metadata Objects\n */\n createSearchDefinition(searchData: Object, searchName?: string, sharedWithin?: number, saveDefinition: boolean = true, enableEurl: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = searchData\n if(_.isString(searchName)) {\n _.set(data, 'SearchName', searchName)\n _.set(data, 'SaveDefinition', saveDefinition)\n _.set(data, 'EnableEurl', enableEurl)\n // not sure how to handle sharedWithin...\n // _.set(data, 'SharedWithin', sharedWithin)\n }\n this.cw.runRequest('Ams/ServiceRequest/CreateSearchDefinition', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of problem nodes for a domain\n *\n * @category Request Categorization\n * @param {number} domainId - The domain ID for which to retrieve problem nodes.\n * @param {boolean} viewOnly - Return only view only problem nodes. Defaults to false.\n * @param {Object} [displayMode] - Object that should contain two properties if you provide it: DisplayTextMode: string (C = Code, D = Description, CD = Code ~ Description). DisplayTextDelimeter: string, only impacts CD display text mode.\n * @param {boolean} includeCancelled - Return only cancelled problem nodes as well. Defaults to false.\n * @return {Object} Returns Promise that represents a collection of problem node objects.\n */\n getProblemNodes(domainId: number, viewOnly: boolean = false, displayMode?: Object, includeCancelled: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n DomainId: domainId,\n IncludeCancelled: includeCancelled,\n ViewOnly: viewOnly\n }\n if(typeof displayMode != 'undefined' && displayMode !== null && _.has(displayMode, 'DisplayTextMode')) {\n _.set(data, 'DisplayTextMode', _.get(displayMode, 'DisplayTextMode'))\n if(_.get(displayMode, 'DisplayTextMode')=='CD' && _.has(displayMode, 'DisplayTextDelimeter')) {\n _.set(data, 'DisplayTextDelimeter', _.get(displayMode, 'DisplayTextDelimeter'))\n }\n }\n this.cw.runRequest('Ams/ServiceRequest/ProblemNodes', data).then(r => {\n // console.log(_.filter(r, function(o) { return !o.Cancel; }), 'filter');\n // console.log(_.some(r.Value, ['Cancel', true]), 'some');\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of problem codes\n *\n * @category Request Options\n * @param {boolean} forPublicOnly - Return only publicly-available service requests. Defaults to false.\n * @param {boolean} onlyActiveTemplates - Return only active templates. Defaults to true.\n * @return {Object} Returns Promise that represents an Array of problem name objects.\n */\n getProblems(forPublicOnly: boolean = false, onlyActiveTemplates: boolean = true, domainIds?: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n ForPublicOnly: forPublicOnly,\n OnlyActiveTemplates: onlyActiveTemplates\n }\n if(typeof domainIds != 'undefined') {\n _.set(data, 'DomainIds', domainIds)\n }\n this.cw.runRequest('Ams/ServiceRequest/Problems', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of problem codes by keywords\n *\n * @category Request Options\n * @param {string} keywords - Keywords to search for potential problem codes\n * @return {Object} Returns Promise that represents an Array of problem name objects.\n */\n getProblemsByKeywords(keywords: string) {\n return new Promise((resolve, reject) => {\n var data = {\n Keywords: keywords\n }\n this.cw.runRequest('Ams/ServiceRequest/ProblemsByKeywords', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of a problem code's priorities\n *\n * @category Request Options\n * @param {number} problemSid - Return priorities for given problemSid\n * @return {Object} Returns Promise that represents an Array of priorities\n */\n getPriorities(problemSid: number) {\n return new Promise((resolve, reject) => {\n var data = {\n ProblemSids: problemSid,\n }\n this.cw.runRequest('Ams/ServiceRequest/Priorities', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get custom field templates for problem code\n *\n * @category Request Options\n * @param {number} problemSid - The problemSid whose template custom fields should be returned\n * @return {Object} Returns Promise that represents a collection of custom fields\n */\n getCustomFieldTemplate(problemSid: number) {\n return new Promise((resolve, reject) => {\n var data = {\n ProblemSids: problemSid,\n }\n this.cw.runRequest('Ams/ServiceRequest/TemplateCustomFields', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the questions and answer options for a problem code\n *\n * @category Request Options\n * @param {number} problemSid - The problemSid whose Q&A should be returned\n * @return {Object} Returns Promise that represents a collection of questions and answer settings\n */\n getQASettings(problemSid: number) {\n return new Promise((resolve, reject) => {\n var data = {\n ProblemSids: problemSid,\n }\n this.cw.runRequest('Ams/ServiceRequest/QA', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get problem leaf (template) by Sid\n *\n * @category Request Options\n * @param {number} problemSid - Return problem leaf for given problemSid\n * @return {Object} Returns Promise that represents an Object that describes the problem leaf (template)\n */\n getProblemLeaf(problemSid: number) {\n return new Promise((resolve, reject) => {\n var data = {\n ProblemSid: problemSid\n }\n this.cw.runRequest('Ams/ServiceRequest/ProblemLeafBySid', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of default statuses\n *\n * @category Request Options\n * @param {Array<number>} domainIds - List of domains to return default statuses for\n * @return {Object} Returns Promise that represents an Array of statuses.\n */\n getStatuses(domainIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n DomainIds: domainIds\n }\n this.cw.runRequest('Ams/ServiceRequest/DefaultStatus', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of possible Employee values\n *\n * @category Request Options\n * @param {string} listType - Which list (endpoint) to get. Includes only DispatchTo & SubmitTo.\n * @param {number} domainId - Domain to return possible dispatchTo values for\n * @return {Object} Returns Promise that represents an Array of Employee options.\n */\n getEmployeeLists(listType: string, domainId: number) {\n return new Promise((resolve, reject) => {\n // TODO: make a default domain option on the CW object for cases like this.\n var data = {\n DomainId: domainId\n }\n if(!_.includes(['DispatchTo', 'SubmitTo'], listType)) {\n reject(new CWError(2, 'listType must be either SubmitTo or DispatchTo.', {'provided': listType}))\n } else {\n this.cw.runRequest(`Ams/ServiceRequest/${listType}`, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Get a list of possible DispatchTo values\n *\n * @category Request Options\n * @param {number} domainId - Domain to return possible dispatchTo values for\n * @return {Object} Returns Promise that represents an Array of dispatchTo options.\n */\n getDispatchTos(domainId: number) {\n // Fix name for choice of non-pluralized endpoint. Unlike WOs & Inspections...\n return this.getEmployeeLists('DispatchTo', domainId);\n }\n\n /**\n * Get a list of possible SubmitTo values\n *\n * @category Request Options\n * @param {number} domainId - Domain to return possible submitTo values for\n * @return {Object} Returns Promise that represents an Array of submitTo options.\n */\n getSubmitTos(domainId: number) {\n // Fix name for choice of non-pluralized endpoint. Unlike WOs & Inspections...\n return this.getEmployeeLists('SubmitTo', domainId);\n }\n\n /**\n * Get street codes\n *\n * @category Request Options\n * @return {Object} Returns Promise that represents an Array of Street Codes.\n */\n streetCodes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/ServiceRequest/AllStreetCode', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of templates\n *\n * @category Request Templates\n * @param {Array<number>} problemSids - An array list of problemSids to retrieve templates for\n * @param {Date} [minimumDateModified] - ?\n * @param {Date} [maximumDateModified] - ?\n * @return {Object} Returns Promise that represents\n */\n getTemplatesById(problemSids: Array<number>, minimumDateModified?: Date, maximumDateModified?: Date) {\n return new Promise((resolve, reject) => {\n var data = {\n ProblemSids: null\n }\n if(typeof minimumDateModified != 'undefined') {\n _.set(data, 'MinimumDateModified', minimumDateModified)\n }\n if(typeof maximumDateModified != 'undefined') {\n _.set(data, 'MaximumDateModified', maximumDateModified)\n }\n\n this.cw.runRequest('Ams/ServiceRequestTemplate/ByIds', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Create a search definition. Save the definition by setting SaveDefinition = true and supplying a SearchName.\n *\n * @category Request Templates\n * @param {Object} searchData - Search data variables. See /{subdirectory}/apidocs/#/service-info/Ams/ServiceRequestTemplate\n * @param {number} [searchName] - What to name your search (if it should be saved)\n * @param {number} [sharedWithin] - What group or domain to share the search to.\n * @param {boolean} saveDefinition - Whether or not to save the search definition. Defaults to true when a search name is specified.\n * @return {Object} Returns Promise that represents a collection of Cityworks Metadata Objects. See: /{subdirectory}/apidocs/#/data-type-info;dataType=CWMetadata\n */\n createTemplateSearchDefinition(searchData: Object, searchName?: string, sharedWithin?: number, saveDefinition: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = searchData\n if(_.isString(searchName)) {\n _.set(data, 'SearchName', searchName)\n _.set(data, 'SaveDefinition', saveDefinition)\n // not sure how to handle sharedWithin...\n // _.set(data, 'SharedWithin', sharedWithin)\n }\n this.cw.runRequest('Ams/ServiceRequestTemplate/CreateSearchDefinition', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the questions and answers for a(many) request template(s)\n *\n * @category Request Templates\n * @param {Array<number>} problemSids - An array list of problemSids to retrieve templates for\n * @return {Object} Returns Promise that represents a collection of ProblemQAs. See /{subdirectory}/apidocs/#/data-type-info;dataType=ProblemQA\n */\n getTemplateQAs(problemSids: Array<number>, minimumDateModified?: Date, maximumDateModified?: Date) {\n return new Promise((resolve, reject) => {\n var data = {\n ProblemSids: null\n }\n this.cw.runRequest('Ams/ServiceRequestTemplate/QA', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of template id results for a provided search parameters\n *\n * @category Request Templates\n * @param {Object} searchData - Search data variables. See /{subdirectory}/apidocs/#/service-info/Ams/ServiceRequestTemplate\n * @return {Object} Returns Promise that represents a list of template IDs.\n */\n searchTemplates(searchData: Object) {\n return new Promise((resolve, reject) => {\n var data = searchData\n this.cw.runRequest('Ams/ServiceRequestTemplate/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get request templates (problem leaf[s])\n *\n * @category Request Templates\n * @param {Array<number>} [templateIds] - Array of specific template IDs to retrieve\n * @param {number} canCreate - If true, only return templates the user can create, ignored if false or null, default is false\n * @param {boolean} includeInactiveIf - If true, returns inactive templates, default is false\n * @param {Date} [minimumDateModified] - ?\n * @param {Date} [maximumDateModified] - ?\n * @return {Object} Returns Promise that represents a collection of Problem Leafs. See /{subdirectory}/apidocs/#/data-type-info;dataType=ProblemLeaf\n */\n getTemplates(templateIds: Array<number>, canCreate: boolean = false, includeInactiveIf: boolean = false, minimumDateModified?: Date, maximumDateModified?: Date) {\n return new Promise((resolve, reject) => {\n var data = {\n CanCreate: canCreate,\n IncludeInactiveIf: includeInactiveIf\n }\n if(typeof templateIds != 'undefined') {\n _.set(data, 'TemplateIds', templateIds)\n }\n if(typeof minimumDateModified != 'undefined') {\n _.set(data, 'MinimumDateModified', minimumDateModified)\n }\n if(typeof maximumDateModified != 'undefined') {\n _.set(data, 'MaximumDateModified', maximumDateModified)\n }\n this.cw.runRequest('Ams/ServiceRequestTemplate/Templates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get WorkOrder templates that are associated to this request template type\n *\n * @category Request Templates\n * @param {Array<number>} problemSids - An array list of problemSids to retrieve Problem WO templates for\n * @param {boolean} includeInactiveIf - Include inactive WorkOrder templates, default is false\n * @return {Object} Returns Promise that represents a collection of Problem WO Templates. See /{subdirectory}/apidocs/#/data-type-info;dataType=ProblemWOTemplate\n */\n getWOTemplates(problemSids: Array<number>, includeInactive: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n ProblemSids: problemSids,\n IncludeInactive: includeInactive\n }\n this.cw.runRequest('Ams/ServiceRequestTemplate/WorkOrderTemplates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Map Layer Fields\n *\n * @category Requests\n * @param {number} requestId - The request ID to get the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the request map layer fields\n */\n getMLFs(requestId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n ServiceRequestId: requestId\n }\n var path = 'Ams/TemplateMapLayer/ServiceRequestInstanceMapLayersByRequestId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Map Layer Fields\n *\n * @category Requests\n * @param {number} requestId - The service request ID to get the map layer fields for.\n * @param {Coordinates} coordinates - Object with X, Y, and optional Z coordinate specified.\n * @param {number} problemsId - Optional. Problem Leaf (template) ID. If provided, the map layer fields will be updated from the service request template (problem leaf) otherwise, only existing updated.\n * @param {number} domainId - Optional. Domain ID of org\n * @return {Object} Returns Promise that represents an object with all the updated GIS info for the request, including a collection of the updated map layer fields\n */\n updateMLFs(requestId: number, coordinates: Coordinates, problemsId?: number, domainId?: number) {\n return new Promise((resolve, reject) => {\n var data = _.merge({}, coordinates)\n if(_.isNumber(problemsId)) {\n _.set(data, 'ProblemsId', problemsId)\n var path = 'Ams/TemplateMapLayer/UpdateServiceRequestInstanceMapLayers'\n } else\n var path = 'Ams/TemplateMapLayer/UpdateServiceRequestInstanceMapLayersByTemplate'\n\n _.set(data, 'ServiceRequestId', requestId)\n if(_.isNumber(domainId)) {\n _.set(data, 'DomainId', domainId)\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Map Layer Fields\n *\n * @category Requests\n * @param {number} requestId - The request ID to delete the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the deleted map layer fields\n */\n deleteMLFs(requestId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n ServiceRequestId: requestId\n }\n var path = 'Ams/TemplateMapLayer/DeleteServiceRequestInstancesByRequestId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\ninterface Coordinates {\n x: number;\n y: number;\n z?: number;\n}\n\nexport class Inspection {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Inspection Administration methods\n */\n admin?: any\n\n /**\n * Inspection Administration methods\n */\n attachments?: any\n\n /**\n * Inspection Costing methods\n */\n costs: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.admin\n this.attachments\n this.costs\n }\n\n /**\n * Create new inspection\n *\n * @category Inspections\n * @param {Object} insp_data - See /{subdirectory}/apidocs/#/data-type-infodataType=InspectionBase on your Cityworks instance\n * @return {Object} Returns Promise that represents an object describing the newly-created inspection\n */\n create(insp_data: Object) {\n return new Promise((resolve, reject) => {\n if(!_.has(insp_data, 'EntityType') || !_.has(insp_data, 'InspTemplateId')) {\n reject(new CWError(1, 'EntityType and InspTemplateId properties must be provided.', {'provided': insp_data}))\n } else {\n this.cw.runRequest('Ams/Inspection/Create', insp_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Create inspections from an array of entities\n *\n * @category Inspections\n * @param {Object} insp_data - See /{subdirectory}/apidocs/#/data-type-infodataType=InspectionBase on your Cityworks instance\n * @return {Object} Returns Promise that represents a collection of objects describing the newly-created inspections\n */\n createFromEntities(insp_data: Object) {\n return new Promise((resolve, reject) => {\n if(!_.has(insp_data, 'EntityType') || !_.has(insp_data, 'InspTemplateId')) {\n reject(new CWError(1, 'EntityType and InspTemplateId properties must be provided.', {'provided': insp_data}))\n } else {\n this.cw.runRequest('Ams/Inspection/CreateFromEntities', insp_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Create an inspection from a parent inspection (TODO: what parent!?)\n *\n * @category Inspections\n * @param {object} insp_data - See /{subdirectory}/apidocs/#/data-type-infodataType=InspectionBase on your Cityworks instance\n * @return {Object} Returns object that represents an object describing the newly-created inspection\n */\n createFromParent(insp_data: Object) {\n return new Promise((resolve, reject) => {\n // see if it's just InspectionId\n if(!_.has(insp_data, 'EntityType') || !_.has(insp_data, 'InspTemplateId') || !_.has(insp_data, 'InspectionId')) {\n reject(new CWError(1, 'EntityType and InspTemplateId properties must be provided.', {'provided': insp_data}))\n } else {\n this.cw.runRequest('Ams/Inspection/CreateFromParent', insp_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Create an inspection from a service request\n *\n * @category Inspections\n * @param {object} insp_data - See /{subdirectory}/apidocs/#/data-type-infodataType=InspectionBase on your Cityworks instance\n * @return {Object} Returns object that represents an object describing the newly-created inspection\n */\n createFromServiceRequest(insp_data: Object) {\n return new Promise((resolve, reject) => {\n if(!_.has(insp_data, 'EntityType') || !_.has(insp_data, 'InspTemplateId') || !_.has(insp_data, 'RequestId')) {\n reject(new CWError(1, 'EntityType and InspTemplateId properties must be provided.', {'provided': insp_data}))\n } else {\n this.cw.runRequest('Ams/Inspection/CreateFromServiceRequest', insp_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Create an inspection from a WorkOrder\n *\n * @category Inspections\n * @param {object} insp_data - See /{subdirectory}/apidocs/#/data-type-infodataType=InspectionBase on your Cityworks instance\n * @return {Object} Returns object that represents an object describing the newly-created inspection\n */\n createFromWorkOrder(insp_data: Object) {\n return new Promise((resolve, reject) => {\n // Are they both actually required?!?!\n // WorkOrderId\n // WorkOrderSid ...do with only SID first then check\n if(!_.has(insp_data, 'EntityType') || !_.has(insp_data, 'InspTemplateId') || !_.has(insp_data, 'WorkOrderSid')) {\n reject(new CWError(1, 'EntityType and InspTemplateId properties must be provided.', {'provided': insp_data}))\n } else {\n this.cw.runRequest('Ams/Inspection/CreateFromWorkOrder', insp_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Update an inspection\n *\n * @category Inspections\n * @param {object} insp_data - See /{subdirectory}/apidocs/#/data-type-infodataType=InspectionBase on the Cityworks instance\n * @return {Object} Returns Promise that represents an object describing the updated inspection\n */\n update(insp_data: Object) {\n return new Promise((resolve, reject) => {\n return new Promise((resolve, reject) => {\n if(!_.has(insp_data, 'InspectionId')) {\n reject(new CWError(1, 'InspectionId must be provided.', {'provided': insp_data}))\n } else {\n this.cw.runRequest('Ams/Inspection/Update', insp_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n })\n }\n\n /**\n * Get an inspection by ID\n *\n * @category Inspections\n * @param {number} inspectionId - The inspection ID to retrieve\n * @return {Object} Returns Promise that represents an object describing the inspection\n */\n getById(inspectionId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionId: inspectionId\n }\n this.cw.runRequest('Ams/Inspection/ById', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspections by array of IDs\n *\n * @category Inspections\n * @param {Array<number>} inspectionIds - The inspection IDs to retrieve\n * @return {Object} Returns Promise that represents a collection of Objects describing the inspections\n */\n getByIds(inspectionIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionIds: inspectionIds\n }\n this.cw.runRequest('Ams/Inspection/ByIds', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Cancel inspections\n *\n * @category Inspections\n * @param {Array<number>} inspectionIds - An array of the IDs to cancel the matched inspections\n * @param {string} [cancelReason] - A reason for cancelling the inspection(s)\n * @param {datetime} [dateCancelled] - The date/time that it should be indicated the inspection was cancelled\n * @return {Object} Returns object that represents a collection of inspections\n */\n cancel(inspectionIds: Array<number>, cancelReason?: string, dateCancelled?: Date) {\n return new Promise((resolve, reject) => {\n var m = new Date()\n var data: {InspectionIds: Array<number>, CancelReason?: string, DateCancelled?: Date} = { InspectionIds: inspectionIds }\n if(typeof(cancelReason)!=='undefined') {\n data.CancelReason = cancelReason\n }\n if(typeof(dateCancelled)!=='undefined') {\n data.DateCancelled = dateCancelled\n }\n this.cw.runRequest('Ams/Inspection/Cancel', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Uncancel inspections\n *\n * @category Requests\n * @param {Array<number>} inspectionIds - An array of the IDs to uncancel the matched requests\n * @return {Object} Returns object that represents a collection of requests\n */\n uncancel(inspectionIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionIds: inspectionIds\n }\n this.cw.runRequest('Ams/Inspection/Uncancel', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Close inspections\n *\n * @category Inspections\n * @param {Array<number>} inspectionIds - An array of the IDs to close the matched inspections\n * @return {Object} Returns object that represents a collection of inspections\n */\n close(inspectionIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionIds: inspectionIds\n }\n this.cw.runRequest('Ams/Inspection/Close', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Reopen closed inspections\n *\n * @category Inspections\n * @param {Array<number>} inspectionIds - An array of the IDs to reopen the matched inspections\n * @return {Object} Returns object that represents a collection of inspections\n */\n reopen(inspectionIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionIds: inspectionIds\n }\n this.cw.runRequest('Ams/Inspection/Reopen', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete inspections\n *\n * @category Inspections\n * @param {Array<number>} inspectionIds - An array of the IDs to delete the matched inspections\n * @return {Object} Returns object that represents a collection of inspection Ids which have been deleted\n */\n delete(inspectionIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionIds: inspectionIds\n }\n this.cw.runRequest('Ams/Inspection/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for inspections\n *\n * @category Inspection Search\n * @param {Object} searchData - The search information to retrieve matched inspections, see instance docs: /{subdirectory}/apidocs/#/service-info/Ams/Inspection\n * @return {Object} Returns Promise that represents an array of the matching inspection IDs\n */\n search(searchData: Object) {\n return new Promise((resolve, reject) => {\n var data = searchData\n this.cw.runRequest('Ams/Inspection/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the records on the basis of inspectionId, only populates InspectionId, InspTemplateName, and Location properties\n *\n * @category Inspection Object Search\n * @param {string} inspectionId - ???, see instance docs: /{subdirectory}/apidocs/#/service-info/Ams/Inspection\n * @return {Object} Returns Promise that represents a collection of the matching (limited) inspection objects\n */\n searchObject(inspectionId: string) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionId: inspectionId\n }\n this.cw.runRequest('Ams/ServiceRequest/SearchObject', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get list of statuses\n *\n * @category Inspection Options\n * @return {Object} Returns object that represents an array of all possible statuses for an Inspection\n */\n statuses() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/Inspection/Statuses', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspection submit to list\n *\n * @category Inspection Options\n * @param {boolean} [includeInactiveEmployees] - whether to include inactive employees in the return. Defaults to false.\n * @param {boolean} [domainIds] - which domains to include in the return, default to All domains\n * @return {Object} Returns object that represents a collection of all possible employees for an Inspection's SubmitTo\n */\n submitTos(includeInactiveEmployees: boolean = false, domainIds?: Array<number>) {\n return new Promise((resolve, reject) => {\n var data: {IncludeInactiveEmployees?: boolean, DomainIds?: Array<number>} = {}\n if(includeInactiveEmployees) {\n data.IncludeInactiveEmployees = true\n }\n if(typeof(domainIds)!=='undefined') {\n data.DomainIds = domainIds\n }\n this.cw.runRequest('Ams/Inspection/SubmitTos', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n\n /**\n * Add an entity to an existing inspection\n * This method requires an Entity/Asset to be specified. You can either specify the Entity Type and its UID or a WorkOrderEntityBase Object.\n *\n * @category Inspections\n * @param {Object} entity - Either of two attribute combinations are valid: entityType & entityUid OR Entity as a fully-inflated WorkOrderEntity (WorkOrderEntityBase) object.\n * @param {number} inspectionId - An Inspection ID to attach the entity/asset to.\n * @param {boolean} updateXY - Provide a boolean to whether the inspection's X/Y coordinates should be updated. Default is true.\n * @param {Object} facility - Add Facility_Id for the Facility Identifier and Level_id for the Facility Level Identifier. Defaults to empty so that no facility is specified.\n * @return {Object} Returns object that represents an object which describes an Inspection Entity\n */\n connectAsset(entity: {EntityType?: string, EntityUid?: string, Entity?: Object}, inspectionId: number, updateXY: boolean = true, facility: {Facility_Id?: string, Level_Id?: string} = {}) {\n return new Promise((resolve, reject) => {\n var data: {InspectionId: number, EntityType?: string, EntityUid?: string, Entity?: Object, Facility_Id?: string, Level_Id?: string} = {\n InspectionId: inspectionId\n }\n if(_.has(entity, 'EntityType') && _.has(entity, 'EntityUid')) {\n data.EntityType = entity.EntityType\n data.EntityUid = entity.EntityUid\n } else if(_.has(entity, 'Entity')) {\n data.Entity = entity.Entity\n } else {\n // Throw error, no entity/asset provided\n }\n if(_.has(facility, 'Facility_Id')) {\n data.Facility_Id = facility.Facility_Id\n }\n if(_.has(facility, 'Level_Id')) {\n data.Level_Id = facility.Level_Id\n }\n this.cw.runRequest('Ams/Inspection/AddEntity', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n // 4 NotAuthorizedToUpdateInspection\n // 9 InvalidActivityMapLogicXY\n // 21 ErrorUnknownEntityType\n // 30 InvalidField\n // 60 WarningItemNotFound\n // 68 MoveInvalidCityworksWkid\n reject(e)\n })\n })\n }\n\n /**\n * Get the answers for inspections\n *\n * @category Inspections\n * @param {Array<number>} inspections - An Array of one or more Inspection IDs\n * @return {Object} Returns Promise that represents a collection of Inspection Answers\n */\n getAnswers(inspections: Array<number>) {\n return new Promise((resolve, reject) => {\n var data: {InspectionId?: number, InspectionIds?: Array<number>} = {}\n if(inspections.length==0) {\n data.InspectionId = inspections[0]\n } else {\n data.InspectionIds = inspections\n }\n this.cw.runRequest('Ams/Inspection/Answers', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the audit log for a specific Inspection\n *\n * @category Inspections\n * @param {number} inspectionId - An Inspection ID to get the audit log for\n * @return {Object} Returns Promise that represents a collection of Cityworks Metadata Objects\n */\n getAuditLog(inspectionId: number) {\n return new Promise((resolve, reject) => {\n var data = {InspectionId: inspectionId}\n this.cw.runRequest('Ams/Inspection/AuditLog', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Create a search definition. Save the definition by setting SaveDefinition = true and supplying a SearchName.\n *\n * @category Inspections\n * @param {Object} searchData - Search data variables. See /{subdirectory}/apidocs/#/service-info/Ams/Inspection\n * @param {number} [searchName] - What to name your search (if it should be saved)\n * @param {number} [sharedWithin] - What group or domain to share the search to.\n * @param {boolean} saveDefinition - Whether or not to save the search definition. Defaults to true when a search name is specified.\n * @param {boolean} enableEurl - Whether or not to enable EURL for the saved search. Defaults to true.\n * @return {Object} Returns Promise that represents a collection of Cityworks Metadata Objects\n */\n createSearchDefinition(searchData: Object, searchName?: string, sharedWithin?: number, saveDefinition: boolean = true, enableEurl: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = searchData\n if(_.isString(searchName)) {\n _.set(data, 'SearchName', searchName)\n _.set(data, 'SaveDefinition', saveDefinition)\n _.set(data, 'EnableEurl', enableEurl)\n // not sure how to handle sharedWithin...\n // _.set(data, 'SharedWithin', sharedWithin)\n }\n this.cw.runRequest('Ams/Inspection/CreateSearchDefinition', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get cycle from\n *\n * @category Inspection Options\n * @return {Object} Returns Promise that represents ... I have no idea what this endpoint does\n */\n getCycleFrom() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/Inspection/CycleFrom', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get cycle intervals\n *\n * @category Inspection Options\n * @return {Object} Returns Promise that represents a Dictionary of the cycle intervals available\n */\n getCycleIntervals() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/Inspection/CycleIntervals', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get cycle types\n *\n * @category Inspection Options\n * @return {Object} Returns Promise that represents a Dictionary of the cycle types available\n */\n getCycleTypes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/Inspection/CycleTypes', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get districts\n *\n * @category Inspection Options\n * @return {Object} Returns Promise that represents an Array of the districts\n */\n getDistricts() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/Inspection/Districts', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Inspection Employee lists. Abstraction done here, though only one employee list field, AFAIK.\n *\n * @category Inspection Options\n * @param {string} listType - Which list (endpoint) to get. Includes only SubmitTos.\n * @param {boolean} includeInactiveEmployees - Whether to include inactive employees in the returned list. Defaults to false.\n * @param {Array<number>} [domainIds] - Filter to certain domains within the Cityworks instance.\n * @return {Object} Returns Promise that represents a collection of employees. See: /{subdirectory}/apidocs/#/data-type-info;dataType=EmployeeNameId\n */\n getEmployeeLists(listType: string, includeInactiveEmployees: boolean = false, domainIds?: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n IncludeInactiveEmployees: includeInactiveEmployees\n }\n if(typeof(domainIds)!='undefined' && domainIds!=null) {\n _.set(data, 'DomainIds', domainIds)\n }\n if(listType!='SubmitTos') {\n reject(new CWError(2, 'listType must be \"SubmitTos\".', {'provided': listType}))\n } else {\n this.cw.runRequest(`Ams/Inspection/${listType}`, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Get SubmitTo list\n *\n * @category WorkOrder Options\n * @param {boolean} includeInactiveEmployees - Whether to include inactive employees in the returned list. Defaults to false.\n * @param {Array<number>} [domainIds] - Filter to certain domains within the Cityworks instance.\n * @return {Object} Returns Promise that represents a collection of employees. See: /{subdirectory}/apidocs/#/data-type-info;dataType=EmployeeNameId\n */\n getSubmitTos(includeInactiveEmployees: boolean = false, domainIds?: Array<number>) {\n return this.getEmployeeLists('SubmitTos', includeInactiveEmployees, domainIds);\n }\n\n /**\n * Move inspection by InspectionId. Must provide well known id (WKID) or well known text (WKT)\n *\n * @category Inspections\n * @param {number} inspectionId - The ID of the inspection that should be moved\n * @param {number} x - The X coordinate for the move\n * @param {number} y - The Y coordinate for the move\n * @param {Object} projection - Should include at least WKT _or_ WKID attribute. Can also include VcsWKID attribute.\n * @param {number} [z] - the optional Z coordinate for the move\n * @return {Object} Returns Promise that represents an object describing the updated GISPoint\n */\n move(inspectionId: number, x: number, y: number, projection: {WKID?: string, WKT?: string, VcsWKID?: string}, z?: number) {\n return new Promise((resolve, reject) => {\n if(!_.has(projection, 'WKID') && !_.has(projection, 'WKT')) {\n // Throw error\n reject(new CWError(3, 'You must provide either the WKID or WKT for the x/y coordinates.', {'projection': projection}))\n }\n var data_init = {\n InspectionId: inspectionId,\n X: x,\n Y: y\n }\n if(typeof z != 'undefined') {\n _.set(data_init, 'Z', z)\n }\n var data = _.merge(data_init, projection);\n this.cw.runRequest('Ams/Inspection/Move', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /////\n // INSPECTION TEMPLATES\n /////\n\n /**\n * Get inspection templates\n *\n * @category Inspection Templates\n * @param {Array<string>} [entityTypes] - The Entity Type(s) to return potential inspections for\n * @param {boolean} [canCreate] - If true, only return templates the user can create, ignored if false or null, default is true\n * @param {Object} [options] - An object which can include: [IncludeInactive]: boolean, MaximumDateModified: Date, MinimumDateModified: Date, TemplateIds: Array<number>\n * @return {Object} Returns Promise that represents a collection of all Inspections matching the provided parameters\n */\n getTemplates(entityTypes?: Array<string>, canCreate?: boolean, options?: {IncludeInactive?: boolean, MaximumDateModified?: Date, MinimumDateModified?: Date, TemplateIds?: Array<number>}) {\n return new Promise((resolve, reject) => {\n var data: {EntityTypes?: Array<string>, CanCreate?: boolean, IncludeInactive?: boolean, MaximumDateModified?: Date, MinimumDateModified?: Date, TemplateIds?: Array<number>} = {}\n if(typeof(entityTypes)!=='undefined') {\n data.EntityTypes = entityTypes\n }\n data.CanCreate = typeof(canCreate)!=='undefined' ? canCreate : true\n if(typeof(options)==='object') {\n _.forIn(options, (v, k) => {\n data[k] = v\n })\n }\n this.cw.runRequest('Ams/InspectionTemplate/Templates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get a list of templates by IDs\n *\n * @category Inspection Templates\n * @param {Array<number>} inspectionIds - An array of the IDs to retrieve the matched inspections\n * @param {Object} [options] - An object which can include: [IncludeInactive]: boolean, MaximumDateModified: Date, MinimumDateModified: Date, TemplateIds: Array<number>\n * @return {Object} Returns object that represents an object describing the inspection\n */\n getTemplatesByIds(inspTemplateIds: Array<number>, options?: {MaximumDateModified?: Date, MinimumDateModified?: Date}) {\n return new Promise((resolve, reject) => {\n var data = {\n InspTemplateIds: inspTemplateIds\n }\n if(typeof(options)==='object') {\n _.forIn(options, (v, k) => {\n data[k] = v\n })\n }\n this.cw.runRequest('Ams/InspectionTemplate/ByIds', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get entity types for inspection template(s)\n *\n * @category Inspection Templates\n * @param {Array<number>} inspTemplateIds - An array of the IDs to reopen the matched inspections\n * @return {Object} Returns object that represents an array of Entity Types\n */\n getTemplateEntityTypes(inspTemplateIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspTemplateIds: inspTemplateIds\n }\n this.cw.runRequest('Ams/InspectionTemplate/EntityTypes', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the questions and answers for inspection template(s)\n *\n * @category Inspection Templates\n * @param {Array<number>} inspTemplateIds - An array of the IDs to reopen the matched inspections\n * @return {Object} Returns object that represents an array which contains a list of InspQuestionPanel for the template\n */\n getQA(inspTemplateIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspTemplateIds: inspTemplateIds\n }\n this.cw.runRequest('Ams/InspectionTemplate/QA', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspection template question conditions\n *\n * @category Inspection Templates\n * @param {Array<number>} inspTemplateIds - An array of template IDs to get the matched inspection template Question conditions for\n * @return {Object} Returns object that represents an array which contains a dictionary of InspQuestion IDs to configs\n */\n getQConditions(inspTemplateIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspTemplateIds: inspTemplateIds\n }\n this.cw.runRequest('Ams/InspectionTemplate/QuestionConditions', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Map Layer Fields\n *\n * @category Inspections\n * @param {number} requestId - The inspection ID to get the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the inspections\n */\n getMLFs(requestId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n ServiceRequestId: requestId\n }\n var path = 'Ams/TemplateMapLayer/ServiceRequestInstanceMapLayersByRequestId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Map Layer Fields\n *\n * @category Inspections\n * @param {string|number} inspectionId - The inspection ID to get the map layer fields for.\n * @param {Coordinates} coordinates - Object with X, Y, and optional Z coordinate specified.\n * @param {number} inspTemplateId - Optional. Inspection's template ID. If provided, the map layer fields will be updated from the inspection template otherwise, only existing updated.\n * @param {number} domainId - Optional. Domain ID of org\n * @return {Object} Returns Promise that represents a ...\n */\n updateMLFs(inspectionId: number, coordinates: Coordinates, inspTemplateId?: number, domainId?: number) { // |number\n return new Promise((resolve, reject) => {\n var data = _.merge({}, coordinates)\n if(_.isNumber(inspTemplateId)) {\n _.set(data, 'InspTemplateId', inspTemplateId)\n var path = 'Ams/TemplateMapLayer/UpdateInspectionInstanceMapLayers';\n } else\n var path = 'Ams/TemplateMapLayer/UpdateInspectionInstanceMapLayersByTemplate'\n _.set(data, 'InspectionId', inspectionId)\n if(_.isNumber(domainId)) {\n _.set(data, 'DomainId', domainId)\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Map Layer Fields\n *\n * @category Inspections\n * @param {number} inspectionId - The inspection ID to delete the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the workorders\n */\n deleteMLFs(inspectionId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionId: inspectionId\n }\n var path = 'Ams/TemplateMapLayer/DeleteInspectionInstancesByInspectionId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\ninterface Coordinates {\n x: number;\n y: number;\n z?: number;\n}\n\nexport class WorkOrder {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * WorkOrder Administration methods\n */\n admin: any\n\n /**\n * WorkOrder Costing methods\n */\n costs: any\n\n /**\n * WorkOrder Comments methods\n */\n comment: any\n\n /**\n * WorkOrder Comments methods\n */\n attachments: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.admin\n this.comment\n this.attachments\n }\n\n /**\n * Create new workorders, including linkin to Requests & Inspections (optionally)\n *\n * @category WorkOrders\n * @param {Object} wo_data - See /{subdirectory}/apidocs/#/data-type-infodataType=WorkOrder on the Cityworks instance\n * @param {Array<number>} [inspectionIds] - The inspection IDs which the workorder should be linked to.\n * @param {Array<number>} [requestIds] - The inspection IDs which the workorder should be linked to.\n * @return {Object} Returns Promise that represents an object describing the newly-created workorder\n */\n create(wo_data: Object, inspectionIds?: Array<number>, requestIds?: Array<number>) {\n return new Promise((resolve, reject) => {\n if(!_.has(wo_data, 'WOTemplateId') || !_.has(wo_data, 'EntityType')) {\n reject(new CWError(2, 'WOTemplateId & EntityType must be provided.', {'provided': wo_data}))\n } else {\n var data = wo_data;\n if(typeof inspectionIds != 'undefined' && inspectionIds != null && !_.has(data, 'InspectionIds')) {\n _.set(data, 'InspectionIds', inspectionIds);\n }\n if(typeof requestIds != 'undefined' && requestIds != null && !_.has(data, 'RequestIds')) {\n _.set(data, 'RequestIds', requestIds);\n }\n this.cw.runRequest('Ams/WorkOrder/Create', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Create new workorder linked to parent workorder\n *\n * @category WorkOrders\n * @param {Object} wo_data - See /{subdirectory}/apidocs/#/data-type-infodataType=WorkOrder on the Cityworks instance\n * @param {string|number} workOrderSId - The workorder S/ID which the entities should be added to. # for SID, string for ID.\n * @return {Object} Returns Promise that represents an object describing the newly-created workorder\n */\n createFromParent(wo_data: Object, workOrderSId: string|number, s: boolean = true) {\n return new Promise((resolve, reject) => {\n if(!_.has(wo_data, 'WOTemplateId') || !_.has(wo_data, 'EntityType')) {\n reject(new CWError(2, 'WOTemplateId & EntityType must be provided.', {'provided': wo_data}))\n } else {\n var data = wo_data;\n if(_.isString(workOrderSId)) {\n _.set(data, 'WorkOrderId', workOrderSId)\n } else {\n _.set(data, 'WorkOrderSid', workOrderSId)\n }\n this.cw.runRequest('Ams/WorkOrder/Create', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Update a WorkOrder\n *\n * @category WorkOrders\n * @param {object} wo_data - See /{subdirectory}/apidocs/#/data-type-infodataType=WorkOrder on the Cityworks instance\n * @return {Object} Returns Promise that represents an object describing the updated workorder\n */\n update(wo_data: Object) {\n return new Promise((resolve, reject) => {\n if(!_.has(wo_data, 'WorkOrderSid') && !_.has(wo_data, 'WorkOrderId')) {\n reject(new CWError(3, 'WorkOrderId or WorkOrderSid must be provided.', {'provided': wo_data}))\n } else {\n this.cw.runRequest('Ams/WorkOrder/Update', wo_data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Combine WorkOrders\n *\n * @category WorkOrders\n * @param {Array<string>} fromWorkOrderIds - The workorder IDs which should be combined.\n * @param {string} toWorkOrderId - The WorkOrder ID for the single WorkOrder that should contain the info/entities from the other WorkOrders\n * @param {boolean} cancelCombinedWorkOrders - If the WorkOrders combined into the single should then be canceled, default is true.\n * @return {Object} Returns object that represents a collection of WorkOrders\n */\n combine(fromWorkOrderIds: Array<string>, toWorkOrderId: string, cancelCombinedWorkOrders: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = {\n CancelCombinedWorkOrders: cancelCombinedWorkOrders,\n ToWorkOrderId: toWorkOrderId,\n FromWorkOrderIds: fromWorkOrderIds\n }\n this.cw.runRequest('Ams/WorkOrder/Combine', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n\n /**\n * Move a workorder's point\n *\n * @category WorkOrders\n * @param {string} workOrderId\n * @param {number} x\n * @param {number} y\n * @param {Object} projection - Should include WKT or WKID attribute. Can also include VcsWKID attribute.\n * @param {number} [z] - Optional Z coordinate\n * @return {Object} Returns Promise that represents an object describing the updated workorder\n */\n move(workOrderId: string, x: number, y: number, projection: Object, z?: number) {\n return new Promise((resolve, reject) => {\n if(!_.has(projection, 'WKID') && !_.has(projection, 'WKT')) {\n // Throw error\n reject(new CWError(6, 'You must provide either the WKID or WKT for the x/y coordinates.', {'projection': projection}))\n }\n var base_data = {\n WorkOrderId: workOrderId,\n X: x,\n Y: y\n };\n if(typeof(z)!='undefined') {\n _.set(base_data, 'z', z)\n }\n var data = _.merge(base_data, projection);\n this.cw.runRequest('Ams/WorkOrder/Move', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n });\n }\n\n /**\n * Get a workorder by S/ID\n *\n * @category WorkOrders\n * @param {string|number} workOrderSId - The S/ID of the workorder to retrieve. # for SID, string for ID.\n * @param {boolean} s - Whether first argument is an SID (true) or an ID (false). Defaults to true.\n * @return {Object} Returns Promise that represents an object describing the workorder\n */\n getById(workOrderSId: string|number, s: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = {}\n if(_.isString(workOrderSId)) {\n _.set(data, 'WorkOrderId', workOrderSId)\n var path = 'Ams/WorkOrder/ById';\n } else {\n _.set(data, 'WorkOrderSid', workOrderSId)\n var path = 'Ams/WorkOrder/BySid';\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get workorders by an array of S/IDs\n *\n * @category WorkOrders\n * @param {Array<string|number>} workOrderSIds - The workorder S/IDs to retrieve. If providing WorkOrderID, should be all strings, else provide all numbers for WorkOrderSID\n * @return {Object} Returns Promise that represents a collection of Objects describing the workorders\n */\n getByIds(workOrderSIds: Array<string|number>) {\n return new Promise((resolve, reject) => {\n var data = {}\n if(workOrderSIds.length==0) {\n // throw error\n reject(new CWError(101, 'No workorder S/IDs were provided.', {'workorderSId': workOrderSIds}))\n } else {\n var path = 'Ams/WorkOrder/ByIds';\n if(_.isString(workOrderSIds[0])) {\n _.set(data, 'WorkOrderIds', workOrderSIds)\n path = 'Ams/WorkOrder/ByIds';\n } else if(_.isNumber(workOrderSIds[0])) {\n _.set(data, 'WorkOrderSids', workOrderSIds)\n path = 'Ams/WorkOrder/BySids';\n } else {\n // throw error - was not number or string\n reject(new CWError(9, 'No workorder S/IDs were provided.', {'workorderSId': workOrderSIds}))\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Get instructions by an array of workorders S/IDs\n *\n * @category WorkOrders\n * @param {Array<string|number>} workOrderSIds - The workorder S/IDs to retrieve. If providing WorkOrderID, should be all strings, else provide all numbers for WorkOrderSID\n * @return {Object} Returns Promise that represents an array of String, String describing the workorder instructions\n */\n getInstructions(workOrderSIds: Array<string|number>) {\n return new Promise((resolve, reject) => {\n var data = {}\n if(workOrderSIds.length==0) {\n // throw error\n reject(new CWError(102, 'No workorder S/IDs were provided.', {'workorderSId': workOrderSIds}))\n } else {\n var path = 'Ams/WorkOrder/ByIds';\n if(_.isString(workOrderSIds[0])) {\n _.set(data, 'WorkOrderIds', workOrderSIds)\n path = 'Ams/WorkOrder/InstructionsByWorkOrderIds';\n } else if(_.isNumber(workOrderSIds[0])) {\n _.set(data, 'WorkOrderSids', workOrderSIds)\n path = 'Ams/WorkOrder/InstructionsByWorkOrderSids';\n } else {\n // throw error - was not number or string\n reject(new CWError(9, 'No workorder S/IDs were provided.', {'workorderSId': workOrderSIds}))\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Get the audit log for a specific workorder\n *\n * @category WorkOrders\n * @param {number} workOrderSId - A WorkOrder S/ID to get the audit log for. SID is default.\n * @return {Object} Returns Promise that represents a collection of Cityworks Metadata Objects\n */\n getAuditLog(workOrderSId: number) {\n return new Promise((resolve, reject) => {\n var data = {}\n if(_.isString(workOrderSId)) {\n _.set(data, 'WorkOrderId', workOrderSId)\n } else if(_.isNumber(workOrderSId)) {\n _.set(data, 'WorkOrderSid', workOrderSId)\n } else {\n // throw error - was not number or string\n reject(new CWError(9, 'Workorder S/IDs was not provided.', {'workorderSId': workOrderSId}))\n }\n this.cw.runRequest('Ams/WorkOrder/AuditLog', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get custom field values for the workorder S/IDs\n *\n * @category WorkOrders\n * @param {Array<string|number>} workOrderSIds - The workorder S/IDs to retrieve. #s for SID, strings for ID.\n * @return {Object} Returns Promise that represents a collection of Objects describing the workorders\n */\n getCustomFieldValues(workOrderSIds: Array<string|number>) {\n return new Promise((resolve, reject) => {\n var data = {}\n var path = 'Ams/WorkOrder/CustomFields';\n if(_.isString(workOrderSIds[0])) {\n _.set(data, 'WorkOrderIds', workOrderSIds)\n var path = 'Ams/WorkOrder/CustomFields';\n } else if(_.isNumber(workOrderSIds[0])) {\n _.set(data, 'WorkOrderSids', workOrderSIds)\n var path = 'Ams/WorkOrder/CustomFieldsByWorkOrderSids';\n } else {\n // throw error - was not number or string\n reject(new CWError(9, 'No workorder S/IDs were provided.', {'workorderSIds': workOrderSIds}))\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get entities on an existing WorkOrder\n *\n * @category WorkOrders\n * @param {Array<string|number>} workOrderSIds - The workorder S/IDs which the entities should be added to. # for SID, string for ID.\n * @param {boolean} getGisData - Query gis to populate Entity.Attributes with current gis data. Defaults to true.\n * @return {Object} Returns object that represents a list of entities removed.\n */\n getEntities(workOrderSIds: Array<string|number>, getGisData: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = {\n GetGisData: getGisData\n }\n if(workOrderSIds.length==0) {\n // throw error\n reject(new CWError(11, 'No workorder S/IDs were provided.', {'workorderSId': workOrderSIds}))\n } else {\n if(_.isString(workOrderSIds[0])) {\n _.set(data, 'WorkOrderIds', workOrderSIds)\n } else if(_.isNumber(workOrderSIds[0])) {\n _.set(data, 'WorkOrderSids', workOrderSIds)\n } else {\n reject(new CWError(12, 'No workorder S/IDs were provided.', {'workorderSId': workOrderSIds}))\n }\n }\n this.cw.runRequest('Ams/WorkOrder/Entities', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add entities to an existing WorkOrder\n *\n * @category WorkOrders\n * @param {string|number} workOrderSId - The workorder S/ID which the entities should be added to. # for SID, string for ID.\n * @param {Object} entityInfo - Entity info object including: (req) EntityType: {string}, (req) EntityUids: {Array<string>}, Facility_Id: {string}, Level_Id: {string}\n * @param {boolean} updateXY - Update WorkOrder xy after adding entit(y|ies), default is true.\n * @return {Object} Returns object that represents a list of entities removed.\n */\n addEntities(workOrderSId: string|number, entityInfo: Object, updateXY: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = {\n UpdateXY: updateXY\n }\n if(_.isString(workOrderSId)) {\n _.set(data, 'WorkOrderId', workOrderSId)\n } else {\n _.set(data, 'WorkOrderSid', workOrderSId)\n }\n if(_.has(entityInfo, 'Facility_Id'))\n _.set(data, 'Facility_Id', _.get(entityInfo, 'Facility_Id'))\n if(_.has(entityInfo, 'Level_Id'))\n _.set(data, 'Level_Id', _.get(entityInfo, 'Level_Id'))\n if(_.has(entityInfo, 'EntityUids') && _.has(entityInfo, 'EntityType')) {\n _.set(data, 'EntityUids', _.get(entityInfo, 'EntityUids'))\n _.set(data, 'EntityType', _.get(entityInfo, 'EntityType'))\n } else {\n reject(new CWError(7, 'No entity info was provided.', {'workorderSId': workOrderSId,'entityInfo': entityInfo}))\n }\n\n this.cw.runRequest('Ams/WorkOrder/AddEntities', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update a WorkOrder entity\n *\n * @category WorkOrders\n * @param {string|number} workOrderSId - The workorder S/ID which the entities should be added to. # for SID, string for ID.\n * @param {Object} entityInfo - Entity info object including: (req) EntityType: {string}, (req) EntityUid: {string}, Facility_Id: {string}, Level_Id: {string}\n * @param {boolean} workComplete - Update WorkOrder completeness, default is true.\n * @return {Object} Returns object that represents a list of entities removed.\n */\n updateEntity(workOrderSId: string|number, entityInfo: Object, workComplete: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkComplete: workComplete\n }\n if(_.isString(workOrderSId)) {\n _.set(data, 'WorkOrderId', workOrderSId)\n } else {\n _.set(data, 'WorkOrderSid', workOrderSId)\n }\n if(_.has(entityInfo, 'Facility_Id'))\n _.set(data, 'Facility_Id', _.get(entityInfo, 'Facility_Id'))\n if(_.has(entityInfo, 'Level_Id'))\n _.set(data, 'Level_Id', _.get(entityInfo, 'Level_Id'))\n if(_.has(entityInfo, 'EntityUids') && _.has(entityInfo, 'EntityType')) {\n _.set(data, 'EntityUid', _.get(entityInfo, 'EntityUid'))\n _.set(data, 'EntityType', _.get(entityInfo, 'EntityType'))\n } else {\n reject(new CWError(7, 'No entity info was provided.', {'workorderSId': workOrderSId,'entityInfo': entityInfo}))\n }\n\n this.cw.runRequest('Ams/WorkOrder/UpdateEntity', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Remove entities from a WorkOrder. Provide WorkOrderId and either ObjectIds or EntityType and EntityUids\n *\n * @category WorkOrders\n * @param {number} workOrderSId - The workorder S/ID which the entities should be removed from. # for SID, string for ID.\n * @param {Object} entityInfo - Remove entities by WorkOrderEntity.ObjectId (not gis objectId).\n * @param {boolean} updateXY - Update WorkOrder xy after removing entities, default is true.\n * @return {Object} Returns object that represents a list of entities removed.\n */\n removeEntities(workOrderSId: string|number, entityInfo: Object, updateXY: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = {\n UpdateXY: updateXY\n }\n if(_.isString(workOrderSId)) {\n _.set(data, 'WorkOrderId', workOrderSId)\n } else {\n _.set(data, 'WorkOrderSid', workOrderSId)\n }\n if(_.has(entityInfo, 'ObjectIds')) {\n _.set(data, 'ObjectIds', _.get(entityInfo, 'ObjectIds'))\n } else if(_.has(entityInfo, 'EntityUids') && _.has(entityInfo, 'EntityType')) {\n _.set(data, 'EntityUids', _.get(entityInfo, 'EntityUids'))\n _.set(data, 'EntityType', _.get(entityInfo, 'EntityType'))\n } else {\n reject(new CWError(8, 'No entity info was provided.', {'workorderSId': workOrderSId,'entityInfo': entityInfo}))\n }\n\n this.cw.runRequest('Ams/WorkOrder/RemoveEntities', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Cancel workorders\n *\n * @category WorkOrders\n * @param {Array<number>} workOrderIds - An array of the IDs to cancel the matched workorders\n * @param {string} [cancelReason] - A reason for cancelling the workorder(s)\n * @param {datetime} [dateCancelled] - The date/time that it should be indicated the workorder was cancelled\n * @return {Object} Returns object that represents a collection of workorders\n */\n cancel(workOrderIds: Array<number>, cancelReason?: string, dateCancelled?: Date) {\n return new Promise((resolve, reject) => {\n var m = new Date()\n var data: {WorkOrderIds: Array<number>, CancelReason?: string, DateCancelled?: Date} = { WorkOrderIds: workOrderIds }\n if(typeof(cancelReason)!=='undefined')\n _.set(data, 'CancelReason', cancelReason);\n if(typeof(dateCancelled)!=='undefined')\n _.set(data, 'DateCancelled', dateCancelled);\n this.cw.runRequest('Ams/WorkOrder/Cancel', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Uncancel workorders\n *\n * @category WorkOrders\n * @param {Array<number>} workOrderIds - An array of the IDs to uncancel the matched workorders\n * @return {Object} Returns object that represents a collection of workorders\n */\n uncancel(workOrderIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderIds: workOrderIds\n }\n this.cw.runRequest('Ams/WorkOrder/Uncancel', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Close WorkOrders\n *\n * @category WorkOrders\n * @param {Array<number>} workOrderIds - An array of the IDs to close the matched WorkOrders\n * @return {Object} Returns object that represents a collection of WorkOrders\n */\n close(workOrderIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderIds: workOrderIds\n }\n this.cw.runRequest('Ams/WorkOrder/Close', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(5, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Reopen closed WorkOrders\n *\n * @category WorkOrders\n * @param {Array<number>} workOrderIds - An array of the IDs to reopen the matched WorkOrders\n * @return {Object} Returns object that represents a collection of WorkOrders\n */\n reopen(workOrderIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderIds: workOrderIds\n }\n this.cw.runRequest('Ams/WorkOrder/ReOpen', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete WorkOrders\n *\n * @category WorkOrders\n * @param {Array<number>} workOrderIds - An array of the IDs to delete the matched WorkOrders\n * @return {Object} Returns object that represents a collection of WorkOrder Ids which have been deleted\n */\n delete(workOrderIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderIds: workOrderIds\n }\n this.cw.runRequest('Ams/WorkOrder/Delete', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get WorkOrderS/IDs connected to provided entities\n *\n * @category WorkOrder Search\n * @param {string} entityType - The entity type to find connected WorkOrders\n * @param {Array<string>} entityUIDs - The list of entities to search for connected WorkOrders\n * @param {boolean} s - Get WorkOrderSids. Defaults to true. When false, returned list is WorkOrderIds\n * @param {Object} [search] - Any additional search properties of the WorkOrder (open/closed, etc)\n * @return {Object} Returns Promise that represents an array of WorkOrderS/IDs\n */\n getWOsByEntities(entityType: string, entityUids: Array<string>, search?: Array<string|number>, s: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = {}\n if(typeof(search)!='undefined') {\n _.merge(data, search)\n }\n if(!_.has(data, 'EntityType')) {\n _.set(data, 'EntityType', entityType)\n }\n if(!_.has(data, 'EntityUids')) {\n _.set(data, 'EntityUids', entityUids)\n }\n var path = 'Ams/WorkOrder/SearchForSids'\n if(!s) {\n path = 'Ams/WorkOrder/Search'\n }\n this.cw.runRequest(path, data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get WorkOrderSid and description for provided WorkOrderId\n *\n * @category WorkOrder Search\n * @param {string} workOrderId - The WorkOrderId for which to get the WorkOrderSid and description\n * @return {Object} Returns Promise that represents an object with WorkOrderS/IDs & Description\n */\n getSearchList(workOrderId: string) {\n return new Promise((resolve, reject) => {\n var data = {}\n _.set(data, 'WorkOrderId', workOrderId)\n this.cw.runRequest('Ams/WorkOrder/SearchObject', data).then(r => {\n if(r.Status>0) {\n reject(new CWError(4, r.Message, {'response': r}))\n } else {\n resolve(r.Value)\n }\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get WorkOrder Employee lists\n *\n * @category WorkOrder Options\n * @param {string} listType - Which list (endpoint) to get. Includes Supervisors & SubmitTos.\n * @param {boolean} includeInactiveEmployees - Whether to include inactive employees in the returned list. Defaults to false.\n * @param {Array<number>} [domainIds] - Filter to certain domains within the Cityworks instance.\n * @return {Object} Returns Promise that represents a collection of employees. See: /{subdirectory}/apidocs/#/data-type-info;dataType=EmployeeNameId\n */\n getEmployeeLists(listType: string, includeInactiveEmployees: boolean = false, domainIds?: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n IncludeInactiveEmployees: includeInactiveEmployees\n }\n if(typeof(domainIds)!='undefined' && domainIds!=null) {\n _.set(data, 'DomainIds', domainIds)\n }\n if(!_.includes(['Supervisors', 'SubmitTos'], listType)) {\n reject(new CWError(2, 'listType must be either SubmitTos or Supervisors.', {'provided': listType}))\n } else {\n this.cw.runRequest(`Ams/WorkOrder/${listType}`, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n }\n })\n }\n\n /**\n * Get SubmitTo list\n *\n * @category WorkOrder Options\n * @param {boolean} includeInactiveEmployees - Whether to include inactive employees in the returned list. Defaults to false.\n * @param {Array<number>} [domainIds] - Filter to certain domains within the Cityworks instance.\n * @return {Object} Returns Promise that represents a collection of employees. See: /{subdirectory}/apidocs/#/data-type-info;dataType=EmployeeNameId\n */\n getSubmitTos(includeInactiveEmployees: boolean = false, domainIds?: Array<number>) {\n return this.getEmployeeLists('SubmitTos', includeInactiveEmployees, domainIds);\n }\n\n /**\n * Get Supervisors list\n *\n * @category WorkOrder Options\n * @param {boolean} includeInactiveEmployees - Whether to include inactive employees in the returned list. Defaults to false.\n * @param {Array<number>} [domainIds] - Filter to certain domains within the Cityworks instance.\n * @return {Object} Returns Promise that represents a collection of employees. See: /{subdirectory}/apidocs/#/data-type-info;dataType=EmployeeNameId\n */\n getSupervisors(includeInactiveEmployees: boolean = false, domainIds?: Array<number>) {\n return this.getEmployeeLists('Supervisors', includeInactiveEmployees, domainIds);\n }\n\n /**\n * Get Status Options\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents a collection of codes. See: /{subdirectory}/apidocs/#/data-type-info;dataType=CodeDesc\n */\n getStatuses() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/Statuses', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Categories\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents an array of configured workorder category code descriptions\n */\n getCategories() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/Categories', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Priorities\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents an array of configured workorder priorities\n */\n getPriorities() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/Priorities', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Cycle From\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents an array of string/string Cycle From options for workorders\n */\n getCycleFrom() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/CycleFrom', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Cycle Intervals\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents an array of string/string Cycle Interval options for workorders\n */\n getCycleIntervals() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/CycleIntervals', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Cycle Types\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents an array of string/string Cycle Type options for workorders\n */\n getCycleTypes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/CycleTypes', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get WorkOrder Stages\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents an array of string/string Stage options for WorkOrders\n */\n getStages() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/Stages', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Expense Types\n *\n * @category WorkOrder Options\n * @return {Object} Returns Promise that represents an array of string/string Expense Type options for workorders\n */\n getExpenseTypes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/WorkOrder/ExpenseTypes', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Map Layer Fields\n *\n * @category WorkOrders\n * @param {string} workOrderSId - The workorder S/ID to get the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the workorders\n */\n getMLFs(workOrderSId: string) { // |number\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderId: workOrderSId\n }\n var path = 'Ams/TemplateMapLayer/WorkOrderInstanceMapLayersByWorkOrderId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Map Layer Fields\n *\n * @category WorkOrders\n * @param {string|number} workOrderSId - The workorder S/ID to get the map layer fields for.\n * @param {Coords} coordinates - Object with X, Y, and optional Z coordinate specified.\n * @param {number} woTemplateId - Optional. Work Order's Template ID. If provided, the map layer fields will be updated from the work order template otherwise, only existing updated.\n * @param {number} domainId - Optional. Domain ID of org\n * @return {Object} Returns Promise that represents an object with all the updated GIS info for the workorder, including a collection of the updated map layer fields\n */\n updateMLFs(workOrderSId: string|number, coordinates: Coordinates, woTemplateId?: number, domainId?: number) {\n // TODO: make an optional attrs array and accept the others\n // TODO: make it toggle to not/use ByTemplate\n return new Promise((resolve, reject) => {\n var data = _.merge({}, coordinates)\n if(_.isNumber(woTemplateId)) {\n var path = 'Ams/TemplateMapLayer/UpdateWorkOrderInstanceMapLayersByTemplate'\n _.set(data, 'WoTemplateId', woTemplateId)\n } else\n var path = 'Ams/TemplateMapLayer/UpdateWorkOrderInstanceMapLayersByWorkOrderId'\n\n if(_.isString(workOrderSId)) {\n _.set(data, 'WorkOrderId', workOrderSId)\n } else if(_.isNumber(workOrderSId)) {\n _.set(data, 'WorkOrderSid', workOrderSId)\n } else {\n // throw error - was not number or string\n reject(new CWError(9, 'No workorder S/ID was provided.', {'workorderSId': workOrderSId}))\n }\n if(_.isNumber(domainId)) {\n _.set(data, 'DomainId', domainId)\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Map Layer Fields\n *\n * @category WorkOrders\n * @param {string} workOrderSId - The workorder S/ID to delete the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the workorders\n */\n deleteMLFs(workOrderSId: string) { // |number\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderId: workOrderSId\n }\n var path = 'Ams/TemplateMapLayer/DeleteWorkOrderInstancesByWorkOrderId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\nconst querystring = require('querystring')\nconst fs = require('fs')\nimport * as https from 'https'\n\nimport { CaseData } from './case_data'\nimport { CaseFinancial } from './case_financial'\nimport { CaseWorkflow} from './case_workflow'\nimport { CaseAdmin } from './case_admin'\nimport { Comments } from './comments'\nimport { CaseAssets } from './case_assets'\nimport { CaseFlags } from './case_flags'\n\nexport interface Briefcase {\n TempTableName: string\n AnonymousFlag: string\n RegisteredFlag: string\n CreatedByLoginId: string\n TableName: string\n ModifiedByLoginId: number\n AcceptedByLoginId: number\n EnteredByLoginid: number\n WorkOrderId: string\n WorkOrderDesc: string\n WorkOrderStatus: string\n ServiceRequestId: number\n ServiceRequestDesc: string\n ServiceRequestStatus: string\n CloneCaseRelation: any|null\n PendingFlag: any|null\n CaseGroup: any|null\n ParentCaObjectId: number|null\n AmountDue: number|null\n GetViewColumns: Array<string>\n CaObjectId: number\n OrgId: number\n CaseTypeId: number\n CaseType: string\n CaseTypeDesc: string\n BusCaseDesc: string|null\n SubTypeId: number|null\n SubType: string|null\n SubTypeDesc: string|null\n CreatedBy: number\n DateAccepted: Date|null\n DateCreated: Date\n DateEntered: Date\n DateExpiration: Date|null\n DateIssued: Date|null\n DateModified: Date|null\n EnteredBy: number\n ExpiredFlag: string|null\n IssuedBy: number|null\n IssuedFlag: string|null\n ModifiedBy: number|null\n SubTypeDefaultText: string|null\n CaseNumber: string\n CaseStatusId: number\n CaseStatus: string\n ProjectSid: number|null\n ProjectId: string|null\n ProjectCode: string|null\n ProjectDesc: string|null\n PriorityLevel: string|null\n StatusCode: string\n CaseName: string\n AcceptedBy: number\n BLicenseFlag: string|null\n BusinessName: string|null\n BusCaseId: number|null\n BusinessOrgType: string|null\n BusinessCategory: string|null\n StateTaxId: string|null\n FedTaxId: string|null\n Location: string|null\n PACaseFlag: string|null\n ActiveFlag: string|null\n CX: number|null\n CY: number|null\n CZ: number|null\n AssignedTo: number|null\n AssignedToLoginId: string|null\n AssignedToFirstName: string|null\n AssignedToLastName: string|null\n Facility_Id: string|number|null\n Level_Id: string|number|null\n}\n\nexport class Briefcase {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n current_case: number = 0\n\n /**\n * Data Detail methods\n */\n data?: any\n /**\n * Asset (Address) methods\n */\n asset?: any\n /**\n * Flag methods\n */\n flag?: any\n /**\n * Asset (Address) methods\n */\n attachments?: any\n /**\n * Workflow & task methods\n */\n workflow?: any\n /**\n * Payment, Receipt, & Fee methods\n */\n financial?: any\n /**\n * Commenting methods\n */\n comment?: any\n /**\n * Payment, Receipt, & Fee methods\n */\n people?: any\n /**\n * PLL Administration methods\n */\n admin?: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n // What is this?\n // Pll/CustomColumnsDetail/GetListForAdd\n\n /**\n * Get Required items for case by case template id (BusCaseId)\n *\n * @category Cases\n * @param {number} busCaseId - The case tmeplate ID (BusCaseId)\n * @return {Object} Returns Promise that represents a collection of objects describing the requirements of the case template\n */\n getRequirements(busCaseId: number): Promise<Briefcase> {\n return new Promise((resolve, reject) => {\n var data = {\n BusCaseId: busCaseId\n }\n this.cw.runRequest('Pll/CaseReqItems/GetByBusCaseId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n \n /**\n * Create new case\n *\n * @category Cases\n * @param {number} caseTypeId - The case Type ID\n * @param {number} subTypeId - The case subType ID\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/data-type-info;dataType=CaObjectItemBase\n * @return {Object} Returns Promise that represents an object describing the newly-created case\n */\n create(caseTypeId: number, subTypeId: number, options?: Object): Promise<Briefcase> {\n return new Promise((resolve, reject) => {\n var data_init = {\n CaseTypeId: caseTypeId,\n SubTypeId: subTypeId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/Case/Create', data).then(r => {\n this.current_case = r.Value.CaObjectId\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Create a child case\n *\n * @category Cases\n * @param {number} busCaseId - The case Type ID\n * @param {number} parentCaObjectId - The case subType ID\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/data-type-info;dataType=CaObjectItemBase\n * @return {Object} Returns Promise that represents an object describing the newly-created case\n */\n createChild(busCaseId: number, parentCaObjectId: number, options?: Object): Promise<Briefcase> {\n return new Promise((resolve, reject) => {\n var data_init = {\n BusCaseId: busCaseId,\n ParentCaObjectId: parentCaObjectId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/Case/CreateChild', data).then(r => {\n this.current_case = r.Value.CaObjectId\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Create a case from a Service Request\n *\n * @category Cases\n * @param {number} caseTypeId - The case Type ID\n * @param {number} subTypeId - The case subType ID\n * @param {number} requestId - The service request ID\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/data-type-info;dataType=CaObjectItemBase\n * @return {Object} Returns Promise that represents an object describing the newly-created case\n */\n createFromRequest(caseTypeId: number, subTypeId: number, requestId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n CaseTypeId: caseTypeId,\n SubTypeId: subTypeId,\n ServiceRequestId: requestId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/CaseObject/CreateCaseFromServiceRequest', data).then(r => {\n this.current_case = r.Value.CaObjectId\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update a case\n *\n * @category Cases\n * @param {number} caObjectId - The case Object ID to update\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/data-type-info;dataType=CaObjectItemBase\n * @return {Object} Returns Promise that represents an object describing the updated case\n */\n update(caObjectId: number, options?: Object): Promise<Briefcase> {\n return new Promise((resolve, reject) => {\n var data_init = {\n CaObjectId: caObjectId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/CaseObject/Update', data).then(r => {\n this.current_case = r.Value.CaObjectId\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get case by ID\n *\n * @category Cases\n * @param {number} caObjectId - The case Object ID to get\n * @return {Object} Returns Promise that represents an object describing the case\n */\n getById(caObjectId: number): Promise<Briefcase> {\n return new Promise((resolve, reject) => {\n this.getByIds([caObjectId]).then(r => {\n resolve(r[0])\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get cases by IDs\n *\n * @category Cases\n * @param {Array<number>} caObjectIds - The case Object IDs to get\n * @return {Object} Returns Promise that represents a collection of objects describing the cases\n */\n getByIds(caObjectIds: Array<number>): Promise<Array<Briefcase>> {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectIds: caObjectIds\n }\n this.cw.runRequest('Pll/CaseObject/ByIds', data).then(r => {\n if(r.Value.length == 1) {\n this.current_case = r.Value[0]\n }\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Cases. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Cases\n * @param {Object} filters - The parameter(s) to search by\n * @return {Object} Returns Promise that represents an Array of case Object IDs\n */\n search(filters: Object): Promise<Array<number>> {\n return new Promise((resolve, reject) => {\n var data = filters\n this.cw.runRequest('Pll/CaseObject/Search', data).then(r => {\n if(r.Value.length == 1) {\n this.current_case = r.Value[0].CaObjectId\n }\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Move a Case point\n *\n * @category Cases\n * @param {string} caObjectId\n * @param {number} x\n * @param {number} y\n * @param {Object} projection - Should include at least WKT _or_ WKID attribute. Can also include VcsWKID attribute.\n * @param {number} [z] - Optional Z coordinate\n * @return {Object} Returns Promise that represents an object describing the updated GISPoint\n */\n move(caObjectId: number, x: number, y: number, projection: {WKID?: string, WKT?: string, VcsWKID?: string}, z?: number) {\n return new Promise((resolve, reject) => {\n if(!_.has(projection, 'WKID') && !_.has(projection, 'WKT')) {\n // Throw error\n reject(new CWError(1, 'You must provide either the WKID or WKT for the x/y coordinates.', {'projection': projection}))\n }\n var data_init = {\n CaObjectId: caObjectId,\n X: x,\n Y: y\n };\n if(typeof(z)!='undefined') {\n _.set(data_init, 'Z', z)\n }\n var data = _.merge(data_init, projection);\n this.cw.runRequest('Pll/CaseObject/Move', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete case\n *\n * @category Cases\n * @param {number} caObjectId - The case Object ID\n * @return {Object} Returns Promise that represents an object describing the deleted case\n */\n delete(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseObject/DeleteCase', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Map Layer Fields\n *\n * @category Cases\n * @param {number} caObjectId - The case object ID to get the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the case object map layer fields\n */\n getMLFs(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n var path = 'Ams/TemplateMapLayer/CaseInstanceMapLayersByCaObjectId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Map Layer Fields\n *\n * @category Cases\n * @param {number} caObjectId - The case object ID to get the map layer fields for.\n * @param {number} x\n * @param {number} y\n * @param {number} domainId - The domain ID for the case in question\n * @param {number} [z] - Optional Z coordinate\n * @return {Object} Returns Promise that represents a collection of Objects describing the case object map layer fields\n */\n updateMLFs(caObjectId: number, x?: number, y?: number, domainId?: number, z?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n var path = 'Ams/TemplateMapLayer/UpdateCaseInstanceMapLayers';\n \n if(_.isNumber(x)) {\n _.set(data, 'X', x)\n }\n if(_.isNumber(y)) {\n _.set(data, 'Y', y)\n }\n if(_.isNumber(z)) {\n _.set(data, 'Z', z)\n }\n if(_.isNumber(domainId)) {\n _.set(data, 'DomainId', domainId)\n }\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Map Layer Fields\n *\n * @category Cases\n * @param {number} caObjectId - The case object ID to delete the map layer fields for.\n * @return {Object} Returns Promise that represents a collection of Objects describing the case object map layer fields deleted\n */\n deleteMLFs(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n var path = 'Ams/TemplateMapLayer/DeleteCaseInstanceMapLayersByCaObjectId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Reports available for Case\n *\n * @category Cases\n * @param {number} caObjectId - The case object ID to get the report (print template) list for\n * @return {Object} Returns Promise that represents a collection of Objects describing the reports (print templates) available for this case\n */\n getPrintTemplates(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n var path = 'Pll/BusinessCaseReports/ByCaObjectId';\n this.cw.runRequest(path, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Print Case\n *\n * @category Cases\n * @param {number} caObjectId - The case object ID to delete the map layer fields for.\n * @param {string} fileName - the filename of the report from the getPrintTemplates method, but w/out the extension\n * @return {Object} Returns Promise that represents a collection of Objects describing the case object map layer fields deleted\n */\n print(caObjectId: number, fileName: string, callback: any) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n FileName: fileName\n }\n var path = 'Pll/BusinessCaseReports/Download'\n var options = this.cw.getRequestOptions(path, 'GET')\n console.log(options)\n\n var file_extension = `pdf`\n console.log(__dirname + fileName + '.' + file_extension)\n const file = fs.createWriteStream(__dirname.replace('/dist', '/downloads') + '/' + fileName + '.' + file_extension)\n\n var request_url = 'https://'+options.hostname + options.path + '?data=' + JSON.stringify(data) + '&Token=' + this.cw.getToken()\n // TODO: test the Filename to make sure it's in the File list from getPrintTemplates (or let the API just error?)\n https.get(request_url, {timeout: 10000000}, (res) => {\n res.on('data', (d) => {\n file.write(d);\n });\n \n res.on('end', () => {\n file.close(callback('Success'))\n })\n }).on('error', (e) => {\n file.close(callback('Failure'));\n console.error(e);\n });\n })\n }\n\n /**\n * Get the configured zip codes for the install\n *\n * @category Cases\n * @return {Object} Returns Promise that represents a collection of zip codes configured for the install\n */\n getZips() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Pll/Zip/GetAll', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the configured states for the install\n *\n * @category Cases\n * @return {Object} Returns Promise that represents a collection of states configured for the install\n */\n getStates() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Pll/State/GetList', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the configured countries for the install\n *\n * @category Cases\n * @return {Object} Returns Promise that represents a collection of countries configured for the install\n */\n getCountries() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Pll/Country/GetAll', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n // importCase(caseTypeId: number, subTypeId: number, caseName: string, location: string, x: number, y:number, appData: object, comment: string, expiration: string, assetIds: object) {\n // return new Promise(resolve => {\n // const _this = this;\n // let case_data = {CaseName:caseName, Location:location, DateExpiration: expiration, X:x,Y:y}\n // this.create(caseTypeId, subTypeId, case_data).then((response: any) => {\n // if(response) {\n // if(typeof(response.CaObjectId)!='undefined') {\n // var CaObjectId = response.CaObjectId\n // if(typeof(comment) != 'undefined') {\n // _this.comments.add(CaObjectId, comment)\n // }\n // if(assetIds) {\n // _this.assets!.attach(CaObjectId, true, assetIds)\n // }\n // if(appData) {\n // _this.data!.getGroupsByCaseId(response.CaObjectId).then(response_one => {\n // // loop through all groups\n // let data_details_items = []\n // _this.data!.caseDataGroupIterator(appData, response_one, data_details_items).then(di => {\n // _this.data!.caseDataDetailIterator(appData, di).then(resp => {\n // resolve(response)\n // })\n // })\n // })\n // } else {\n // resolve(response)\n // }\n // } else {\n // console.log('Error creating case: '+ JSON.stringify(case_data))\n // process.exit(0)\n // }\n // } else {\n // resolve(false)\n // }\n // })\n // })\n // }\n\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\nimport ReversibleMap from 'reversible-map'\n\nexport class CaseData {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Add Case Data Group\n *\n * @category Data Groups\n * @param {number} caObjectId - The Case Object to attach the data group to.\n * @param {number} caseDataGroupId - CaseDataGroupId as defined in CaseDataGroup admin.\n * @param {string} groupCode - The Group Code.\n * @param {Object} [options] - Options for CaseDataGroup including GroupDesc, GroupSum, and SumFlag\n * @return {Object} Returns Promise that represents an object describing CaDataGroupItemBase.\n */\n addGroup(caObjectId: number, caseDataGroupId: number, groupCode: string, options?: {GroupDesc?: string, GroupSum?: number, SumFlag?: string}) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n CaseDataGroupId: caseDataGroupId,\n GroupCode: groupCode\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseDataGroup/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Default Case Data Groups\n *\n * @category Data Groups\n * @param {number} caObjectId - The Case Object to attach the data group to.\n * @param {number} busCaseId - The business case ID\n * @return {Object} Returns Promise that represents a collection of the default CaDataGroupItemBases.\n */\n addDefaultGroups(caObjectId: number, busCaseId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n BusCaseId: busCaseId\n }\n this.cw.runRequest('Pll/CaseDataGroup/AddDefault', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds a data detail entry to the case data group specified by the CaDataGroupId. The CaDataGroupId is associated to a case.\n *\n * @category Data Groups\n * @param {number} caseDataDetailId - The Data Detail template ID\n * @param {number} caDataGroupId - The Case Instance Data Group ID\n * @param {string} columnSequence - The column sequence\n * @param {string} detailCode - The detail Code\n * @param {number} detailSequence - The detail order number\n * @param {Object} [options] - Other options for CaseDataDetail. See WIPAdd here: /{subdirectory}/apidocs/#/service-info/Pll/CaseDataDetail\n * @return {Object} Returns Promise that represents an object describing CaDataDetailItemBase.\n */\n wipAddDetail(caseDataDetailId: number, caDataGroupId: number, columnSequence: string, detailCode: string, detailSequence: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n CaseDataDetailId: caseDataDetailId,\n CaDataGroupId: caDataGroupId,\n ColumnSequence: columnSequence,\n DetailCode: detailCode,\n DetailSequence: detailSequence\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/CaseDataGroup/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get groups by CaObjectId\n *\n * @category Data Groups\n * @param {number} caseId - The Case Object to get the attached data groups.\n * @return {Object} Returns Promise that represents a collection of the CaDataGroupItemBases.\n */\n getGroupsByCaseId(caseId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caseId\n }\n this.cw.runRequest('Pll/CaseDataGroup/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Case Data Groups by Case Object ID.\n *\n * @category Data Groups\n * @param {number} caObjectId - The Case Object to attach the data group to.\n * @return {Object} Returns Promise that represents a number that is the CaObjectId (?)\n */\n deleteGroupsByCaseId(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseDataGroup/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Data Groups. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Data Groups\n * @param {Object} filters - The parameters to search by. (CaDataGroupId, CaseDataGroupId, GroupCode, GroupDesc, GroupSum, SumFlag)\n * @return {Object} Returns Promise that represents a number that is the CaObjectId (?)\n */\n searchForGroups(filters?: Object): Promise<Array<any>> {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaDataGroupId', 'CaseDataGroupId', 'GroupCode', 'GroupDesc', 'GroupSum', 'SumFlag']).length==0) {\n reject(new CWError(2, 'At least one of the attributes (CaDataGroupId, CaseDataGroupId, GroupCode, GroupDesc, GroupSum, SumFlag) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseDataGroup/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Case Data Groups by Case ObjectId\n *\n * @category Data Groups\n * @param {string} entityType - The entity type to check\n * @param {string} entityUid - The specific entityUID to check\n * @param {Object} options - The other options for checkGIS. Either CaObjectId or CaseDataGroupId is required.\n * @return {Object} Returns Promise that represents a collection of the default CaDataGroupItemBases.\n */\n checkGIS(entityType: string, entityUid: string, options: {CaObjectId?:number, CaseDataGroupId?: number, CaseDataDetailId?: number}) {\n return new Promise((resolve, reject) => {\n var data = {\n EntityType: entityType,\n EntityUid: entityUid\n }\n if(_.has(options, 'CaObjectId')) {\n _.set(data, 'CaObjectId', _.get(options, 'CaObjectId'))\n } else if(_.has(options, 'CaseDataGroupId')) {\n _.set(data, 'CaseDataGroupId', _.get(options, 'CaseDataGroupId'))\n } else {\n reject(new CWError(1, 'Either CaObjectId or CaseDataGroupId is required.', {'provided': options}))\n }\n if(_.has(options, 'CaseDataDetailId')) {\n _.set(data, 'CaseDataDetailId', _.get(options, 'CaseDataDetailId'))\n }\n this.cw.runRequest('Pll/CaseDataGroup/CheckGISChanges', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update data groups on a case based on asset value mappings.\n *\n * @category Data Groups\n * @param {number} caObjectId - The case to update\n * @param {string} entityType - The entity type to check\n * @param {string} entityUid - The specific entityUID to check\n * @param {number} [caDataGroupId] - The specific data group ID to limit updates to\n * @return {Object} Returns Promise that represents a collection of the default CaDataGroupItemBases.\n */\n updateGroupsFromAsset(caObjectId: number, entityType: string, entityUid: string, caDataGroupId?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n EntityType: entityType,\n EntityUid: entityUid\n }\n if(typeof(caDataGroupId)!='undefined') {\n _.set(data, 'CaDataGroupId', caDataGroupId)\n }\n this.cw.runRequest('Pll/CaseDataGroup/UpdateFromAsset', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Attach Case Data Detail\n *\n * @category Data Details\n * @param {number} caDataGroupId - The Case Data Group ID to attach the data detail to.\n * @param {number} caseDataDetailId - caseDataDetailId to attach.\n * @param {Object} [options] - Options\n * @return {Object} Returns Promise that represents an object describing CaDataGroupItemBase.\n */\n addDetail(caDataGroupId: number, caseDataDetailId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n CaDataGroupId: caDataGroupId,\n CaseDataDetailId: caseDataDetailId\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseDataDetail/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Case Data Detail\n *\n * @category Data Details\n * @param {number} caDataDetailId - The Case Data Group ID to attach the data detail to.\n * @param {Object} [options] - Options\n * @return {Object} Returns Promise that represents an object describing CaDataGroupItemBase.\n */\n updateDetail(caDataDetailId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n CaDataDetailId: caDataDetailId\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseDataDetail/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Lock Case Data Detail\n *\n * @category Data Details\n * @param {number} caDataDetailId - The Case Data Detail ID to lock\n * @return {Object} Returns Promise which represents an object describing the CaDataDetailItem.\n */\n lockDetail(caDataDetailId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaDataDetailId: caDataDetailId,\n Lock: true\n }\n this.cw.runRequest('Pll/CaseDataDetail/UpdateLock', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Unlock Case Data Detail\n *\n * @category Data Details\n * @param {number} caDataDetailId - The Case Data Group ID to unlock\n * @return {Object} Returns Promise which represents an object describing the CaDataDetailItem.\n */\n unlockDetail(caDataDetailId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaDataDetailId: caDataDetailId,\n Lock: false\n }\n this.cw.runRequest('Pll/CaseDataDetail/UpdateLock', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Data Details. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Data Details\n * @param {Object} filters - The parameters to search by. (CaDataGroupId, CaseDataGroupId, GroupCode, GroupDesc, GroupSum, SumFlag)\n * @return {Object} Returns Promise that represents an object describing CaDataDetailItemBase.\n */\n searchForDetails(filters?: Object): Promise<Array<any>> {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaDataDetailId', 'CaDataGroupId', 'CalcRateFlag', 'CaseDataDetailId', 'CommentFlag', 'DateFlag', 'DetailCode', 'DetailDesc', 'ListValuesFlag', 'NumberFlag', 'TextFlag', 'ValueFlag', 'YesNoFlag']).length==0) {\n reject(new CWError(2, 'At least one of the attributes (CaDataDetailId, CaDataGroupId, CalcRateFlag, CaseDataDetailId, CommentFlag, DateFlag, DetailCode, DetailDesc, ListValuesFlag, NumberFlag, TextFlag, ValueFlag, YesNoFlag) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseDataDetail/SearchObject', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds a list of possible values to the data detail entry specified by the CaDataDetailId.\n *\n * @category Data List Values\n * @param {number} caDataDetailId - The Case Object to attach the data group to.\n * @param {string} listValue - The Group Code.\n * @return {Object} Returns Promise that represents an object describing CaDataListValuesItemBase.\n */\n addListValue(caDataDetailId: number, listValue: string) {\n return new Promise((resolve, reject) => {\n var data = {\n CaDataDetailId: caDataDetailId,\n ListValue: listValue\n }\n this.cw.runRequest('Pll/CaseDataListValues/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete by Id (Ca Data List Id)\n *\n * @category Data List Values\n * @param {number} CaDataListId - The Case Data List ID\n * @return {Object} Returns Promise that represents an object describing CaDataListValuesItemBase.\n */\n deleteListValue(caDataDetailId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaDataDetailId: caDataDetailId\n }\n this.cw.runRequest('Pll/CaseDataListValues/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for List Value IDs. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Data List Values\n * @param {Object} filters - The parameters to search by. (CaDataDetailId, CaDataListId, ListValue)\n * @return {Object} Returns Promise that represents an Array of resulting CaDataListIds\n */\n searchForListValueIds(filters?: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaDataDetailId', 'CaDataListId', 'ListValue']).length==0) {\n reject(new CWError(3, 'At least one of the attributes (CaDataDetailId, CaDataListId, ListValue) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseDataGroup/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for List Value Objects. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Data List Values\n * @param {Object} filters - The parameters to search by. (CaDataDetailId, CaDataListId, ListValue, CaDataGroupId)\n * @return {Object} Returns Promise that represents a collection of resulting CaDataListValuesItemBase objects\n */\n searchForListValueObjects(filters?: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaDataDetailId', 'CaDataListId', 'ListValue', 'CaDataGroupId']).length==0) {\n reject(new CWError(4, 'At least one of the attributes (CaDataDetailId, CaDataListId, ListValue, CaDataGroupId) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseDataGroup/SearchObject', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Set a data detail item's value without needing to find the type\n * \n * @category Data Details\n * @param dataDetailId - The data detail item's ID\n * @param {any} value - the value to set the data detail item to\n * @param {number} rate - the rate to set the data detail item to\n * @param {number} quantity - the quantitye to set the data detail item to\n * @returns Promise that represents\n */\n updateDetailItemValue(dataDetailId: number, value: any, rate?: number, quantity?: number) {\n return new Promise((resolve, reject) => {\n this.searchForDetails({CaDataDetailId: dataDetailId}).then(r => {\n if(r.length==0) {\n reject(new CWError(1, 'No data detail found with CaDataDetailId '+dataDetailId))\n }\n var detail = r[0]\n var data = {}\n if(!_.isUndefined(quantity)) {\n _.set(data, 'Quantity', quantity)\n }\n if(!_.isUndefined(rate)) {\n _.set(data, 'Rate', rate)\n }\n if(detail.NumberFlag=='Y') {\n _.set(data, 'NumberValue', value)\n } else if(detail.TextFlag=='Y') {\n _.set(data, 'TextValue', value)\n } else if(detail.DateFlag=='Y') {\n _.set(data, 'DateValue', value)\n } else if(detail.DateCountFlag=='Y') {\n if(!_.isArray(value)) {\n value = [value]\n }\n var dateCountValue = JSON.stringify({'dateCount': value.length, 'value': value})\n _.set(data, 'DateCountValue', dateCountValue)\n } else if(detail.YesNoFlag=='Y') {\n if(value=='Y' || value=='Yes') value = 'Y'\n if(value=='N' || value=='No') value = 'N'\n _.set(data, 'YesNoValue', value)\n } else if(detail.CommentFlag=='Y') {\n _.set(data, 'CommentValue', value)\n } else if(detail.CurrencyFlag=='Y') {\n _.set(data, 'CurrencyValue', value)\n } else if(detail.ListValuesFlag=='Y') {\n _.set(data, 'ListValue', value)\n } else if(detail.Q1Q2Q3Flag=='Y') {\n _.set(data, 'Quantity', value[0])\n _.set(data, 'Q2Value', value[1])\n _.set(data, 'Q3Value', value[2])\n if(!_.isUndefined(rate)) {\n _.set(data, 'Value', value[0] * value[1] * value[2] * _.get(data, 'Rate'))\n } else {\n _.set(data, 'Value', value[0] * value[1] * value[2])\n }\n } else if(detail.ValueFlag=='Y') {\n _.set(data, 'Value', value)\n }\n this.updateDetail(dataDetailId, data).then(r => {\n resolve(r)\n }).catch(e => {\n reject(e)\n })\n }).catch(e => {\n reject(e)\n })\n })\n } \n\n /**\n * Get the Case Data Details for a Case by Case ID\n *\n * @category Data Details\n * @param {number} caseId - The case ID to get the details for\n * @return {Object} Returns Promise that represents a collection of Case Data Detail Items\n */\n getAllDataDetails(caseId: number): Promise<Array<any>> {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caseId\n }\n this.cw.runRequest('Pll/CaseDataGroup/GetItemsForXml', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n \n /**\n * Set Case Data Detail Items for a Case by GroupCode.ItemCode syntax reference\n *\n * @category Data Details\n * @param {number} caseId - The case ID to get the details for\n * @param {Object} items - The parameters to search by. (DataGroup/Item string, Value) (e.g. {code: 'GroupCode.ItemCode', value: 'Value goes here'})\n * @return {Object} Returns Promise that represents a collection\n */\n setCaseData(caseId: number, items: Array<{code: string, value: any, rate?: number, quantity?: number}>) {\n return new Promise((resolve, reject) => {\n let _this = this\n let detail_items_to_set = items\n _this.getAllDataDetails(caseId).then(r => {\n let case_detail_items = r\n _.forEach(detail_items_to_set, function (item) {\n let item_parts = item.code.split('.')\n let item_value = item.value\n let item_rate = item.rate\n let item_quantity = item.quantity\n let caDataDetailId: number = 0\n let check_for_item = new Promise((resolve, reject) => {\n _.forEach(case_detail_items, function (detail, index) {\n if(item_parts.length>1 && detail.GroupCode==item_parts[0] && detail.DetailCode==item_parts[1]) {\n caDataDetailId = detail.CaDataDetailId\n resolve(caDataDetailId)\n } else if(item_parts.length==1 && detail.DetailCode==item_parts[0]) {\n caDataDetailId = detail.CaDataDetailId\n resolve(caDataDetailId)\n } else if(index === case_detail_items.length -1) resolve(0)\n })\n })\n check_for_item.then(r_two => {\n const caDataDetailIdNum = r_two as number;\n if(caDataDetailIdNum > 0) {\n _this.updateDetailItemValue(caDataDetailIdNum, item_value, item_rate, item_quantity).then(r_three => {\n // console.log(r_three)\n resolve(r_three)\n }).catch(e => {\n reject(e)\n })\n } else {\n reject(new CWError(2, 'The matching data detail item was not found for '+item.code))\n }\n });\n })\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Set Case Data Detail Item for a Case by GroupCode.ItemCode syntax reference\n * This is a convenience method that allows you to set a single detail item without needing to find the type. Reference it within {instance}.briefcase.data.setCaseDataItem.\n *\n * @category Data Details\n * @param {number} caseId - The Case ID to set the detail for\n * @param {string} detailGroupAndItemCode - The parameters to search (e.g. 'GroupCode.ItemCode')\n * @param {any} value - The value to set the specified detail to\n * @return {Object} Returns Promise\n */\n setCaseDataItem(caseId: number, detailGroupAndItemCode: string, value: any, rate?: number, quantity?: number) {\n return new Promise((resolve, reject) => {\n this.setCaseData(caseId, [{'code': detailGroupAndItemCode, 'value': value, 'rate': rate, 'quantity': quantity}]).then(r => {\n resolve(r)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class CaseFinancial {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw: Object) {\n this.cw = cw\n }\n\n /**\n * Adds a fee to the case specified by the CaObectId.\n *\n * @category Case Fees\n * @param {number} caObjectId - The Case Object ID for the case to which to add the fee\n * @param {number} feeSetupId - The fee setup id for the fee to add to the case.\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/service-info/Pll/CaseFees for more options. (Checkboxes -- Autorecalculate -- are Y/N strings)\n * @return {Object} Returns Promise that represents an object describing the newly-added fee. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaFeesItemBase\n */\n addFee(caObjectId: number, feeSetupId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var init_data = {\n CaObjectId: caObjectId,\n FeeSetupId: feeSetupId\n }\n var data = _.merge(init_data, options);\n this.cw.runRequest('Pll/CaseFees/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Case Fee Payment. Adds a payment to the case fee specified by caObjectId.\n *\n * @category Case Payments\n * @param {number} caObjectId - The Case Object ID for the case to which to add the fee\n * @param {Object} options - See /{subdirectory}/apidocs/#/service-info/Pll/CasePayment for more options, including required fields.\n * @return {Object} Returns Promise that represents an object describing the newly-added payment. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaPaymentItemBase\n */\n addPayment(caObjectId: number, options: Object) {\n return new Promise((resolve, reject) => {\n var init_data = {\n CaObjectId: caObjectId\n }\n var data = _.merge(init_data, options);\n this.cw.runRequest('Pll/CasePayment/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Make a Payment. Adds a payment to the case fee(s) specified.\n *\n * @category Case Payments\n * @param {Array<Array<string>>} payments - The Case Object ID for the case to which to add the fee\n * @param {Array<number>} caseFees - Fees this payment should be applied to. Array of CaFeeIds values.\n * @param {stringName:string,AddressLine1?:string,AddressLine2?:string,AddressLine3?:string,CityName?:string,CommentText?:string,Email?:string,FaxNumber?:string,PhoneHome?:string,PhoneMobile?:string,PhoneWork?:string,PhoneWorkExt?:string,StateCode?:string,WebSiteUrl?:string,ZipCode?:string,CountryCode?:string} payerInfo - Payer info for the payment being made.\n * @return {Object} Returns Promise that represents an object describing the newly-added payment.\n */\n makePayment(payments: Array<Array<string>>, caseFees: Array<number>, payerInfo?: {\n stringName:string,\n AddressLine1?:string,\n AddressLine2?:string,\n AddressLine3?:string,\n CityName?:string,\n CommentText?:string,\n Email?:string,\n FaxNumber?:string,\n PhoneHome?:string,\n PhoneMobile?:string,\n PhoneWork?:string,\n PhoneWorkExt?:string,\n StateCode?:string,\n WebSiteUrl?:string,\n ZipCode?:string,\n CountryCode?:string\n }) {\n return new Promise((resolve, reject) => {\n var data: { CaFeeIds: number[], TenderTypes: Array<Array<string>> } = {\n CaFeeIds: caseFees,\n TenderTypes: []\n }\n if(payerInfo) {\n _.set(data, 'CaPayer', payerInfo)\n }\n _.forEach(payments, payment => {\n if(payment.length!=5) {\n reject(new CWError(301, `Payment must contain 5 elements: Payment Tender Type, Amount, Comment, Date Received, Reference String - ${JSON.stringify(payment)}`))\n }\n // Check that item 2 is a number\n else if(isNaN(parseFloat(payment[1]))) {\n reject(new CWError(302, `Payment Tender amount, second item in array (${payment[1]}), must be a curreny number provided as a string.`))\n }\n //Check that item 3 is a datetime\n else if(!_.isDate(Date.parse(payment[3]))) {\n reject(new CWError(303, `Payment Tender date, fourth item in array (${payment[3]}), must be a datetime provided as a string.`))\n } else {\n data.TenderTypes.push(payment)\n }\n })\n\n this.cw.runRequest('Pll/CasePayment/MakePayment', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n\n /**\n * Add Case Payment Refund. Refunds a payment on the case payment specified by caPaymentId.\n *\n * @category Case Payment Refunds\n * @param {number} caPaymentId - The Case Payment ID for the case payment which to refund\n * @param {number} refundAmount - The amount to refund\n * @param {string} comment - A comment to append to the refund\n * @return {Object} Returns Promise that represents an object describing the newly-added payment refund. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaPaymentRefundItemBase\n */\n addRefund(caPaymentId: number, refundAmount: number, comment: string) {\n return new Promise((resolve, reject) => {\n var data = {\n CaPaymentId: caPaymentId,\n RefundAmount: refundAmount,\n Comments: comment\n }\n this.cw.runRequest('Pll/CasePaymentRefund/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Case Deposit Payment. Adds a payment to the case deposit specified by CaDepositId.\n *\n * @category Case Payments\n * @param {number} caDepositId - The Case Deposit ID for the case deposit to which to add the fee\n * @param {Object} options - See /{subdirectory}/apidocs/#/service-info/Pll/CasePayment for more options, including required fields.\n * @return {Object} Returns Promise that represents an object describing the newly-added payment. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaPaymentItemBase\n */\n addDepositPayment(caDepositId: number, options: Object) {\n return new Promise((resolve, reject) => {\n var init_data = {\n CaDepositId: caDepositId\n }\n var data = _.merge(init_data, options);\n this.cw.runRequest('Pll/CasePayment/AddDeposit', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds a deposit to the case specified by the CaObectId.\n *\n * @category Case Deposits\n * @param {number} caObjectId - The Case Object ID for the case to which to add the fee\n * @param {number} depositId - The deposit setup id for the deposit to add to the case.\n * @param {number} [amount] - The amount of the deposit (optional)\n * @param {string} [comment] - Comment text to add to the deposit (optional)\n * @return {Object} Returns Promise that represents an object describing the newly-added deposit. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaDepositItemBase\n */\n addDeposit(caObjectId: number, depositId: number, amount?: number, comment?: string) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n DepositId: depositId\n }\n if(typeof(amount)!='undefined') {\n _.set(data, 'Amount', amount)\n }\n if(typeof(comment)!='undefined') {\n _.set(data, 'CommentText', comment)\n }\n this.cw.runRequest('CaseDeposit/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds an instrument to the case specified by the CaObectId.\n *\n * @category Case Instruments\n * @param {number} caObjectId - The Case Object ID for the case to which to add the instrument\n * @param {number} instTypeId - The instrument type id for the instrument being added to the case.\n * @param {number} amount - The amount of the instrument\n * @param {Date} dateExpire - The datetime for the instrument to expire.\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/service-info/Pll/CaseInstrument for more options.\n * @return {Object} Returns Promise that represents an object describing the newly-added instrument. See /{subdirectory}/apidocs/#/service-info/Pll/CaseInstrument\n */\n addInstrument(caObjectId: number, instTypeId: number, amount: number, dateExpire: Date, options?: Object) {\n return new Promise((resolve, reject) => {\n var init_data = {\n CaObjectId: caObjectId,\n InstTypeId: instTypeId,\n Amount: amount,\n DateExpire: dateExpire\n }\n var data = _.merge(init_data, options);\n this.cw.runRequest('Pll/CaseInstrument/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Updates a fee specified by the CaFeeId.\n *\n * @category Case Fees\n * @param {number} caFeeId - The Fee ID for the specific instance of the fee you wish to update\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/service-info/Pll/CaseFees for more options. (Checkboxes -- Autorecalculate -- are Y/N strings)\n * @return {Object} Returns Promise that represents an object describing the updated fee. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaFeesItemBase\n */\n updateFee(caFeeId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var init_data = {\n CaFeeId: caFeeId\n }\n var data = _.merge(init_data, options);\n this.cw.runRequest('Pll/CaseFees/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Void a refund.\n *\n * @category Case Refund Payment\n * @param {number} caPaymentRefundId - The Refund ID for the specific refund to void\n * @param {String} voided - A string. No clue.\n * @return {Object} Returns Promise that represents an object describing the voided refund. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaPaymentRefundItemBase\n */\n voidRefund(caPaymentRefundId: number, voided: string) {\n return new Promise((resolve, reject) => {\n var data = {\n CaPaymentRefundId: caPaymentRefundId,\n Voided: voided\n }\n this.cw.runRequest('Pll/CasePaymentRefund/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds Default Case Fees. Adds fees to the case specified by the CaObectId and BusCaseId.\n *\n * @category Case Fees\n * @param {number} caObjectId - The Case Object ID for the case to which to add the default fees\n * @param {number} busCaseId - The business case ID whose default fees should be added to the case\n * @return {Object} Returns Promise that represents a collection of Fee Items. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaFeesItemBase\n */\n addDefaultFees(caObjectId: number, busCaseId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n BusCaseId: busCaseId\n }\n this.cw.runRequest('Pll/CaseFees/AddDefault', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds Default Case Deposits. Adds deposits to the case specified by the CaObectId and BusCaseId.\n *\n * @category Case Deposits\n * @param {number} caObjectId - The Case Object ID for the case to which to add the default deposits\n * @param {number} busCaseId - The business case ID whose default deposits should be added to the case\n * @return {Object} Returns Promise that represents a collection of Deposit Items. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaDepositItemBase\n */\n addDefaultDeposits(caObjectId: number, busCaseId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n BusCaseId: busCaseId\n }\n this.cw.runRequest('Pll/CaseDeposit/AddDefault', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Gets the fees from the case specified by the CaObectId.\n *\n * @category Case Fees\n * @param {number} caObjectId - The Case Object ID for the case to which to get the fees\n * @return {Object} Returns Promise that represents a collection of Case Fees.\n */\n getFees(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n WhereClause: `\"CA_FEES_VW.CA_OBJECT_ID=${caObjectId}\"}`\n }\n this.cw.runRequest('Pll/CaseFees/GetList', data).then(r => {\n var fees = new Array()\n _.forEach(r.Value, (fee) => {\n var limited_fee = {\n CaFeeId: fee.CaFeeId,\n CaObjectId: fee.CaObjectId,\n Amount: fee.Amount,\n AmountDue: fee.AmountDue,\n Factor: fee.Factor,\n Sum: fee.Sum,\n Value: fee.Value,\n FeeCode: fee.FeeCode,\n FeeDesc: fee.FeeDesc,\n Quantity: fee.Quantity,\n Rate: fee.Rate,\n WaiveFee: fee.WaiveFee,\n CreatedByLoginId: fee.CreatedByLoginId,\n ModifiedByLoginId: fee.ModifiedByLoginId,\n GroupCode: fee.GroupCode,\n DetailCode: fee.DetailCode,\n TotalFeeAmount: fee.TotalFeeAmount,\n TotalPaymentAmount: fee.TotalPaymentAmount,\n TotalDueAmount: fee.TotalDueAmount,\n TotalCreditAmount: fee.TotalCreditAmount,\n CreditAmount: fee.CreditAmount,\n GrandSumFlag: fee.GrandSumFlag,\n FeeTypeCode: fee.FeeTypeCode,\n Location: fee.Location,\n AutoRecalculate: fee.AutoRecalculate,\n CommentText: fee.CommentText,\n CreatedBy: fee.CreatedBy,\n CustFeeSeq: fee.CustFeeSeq,\n DateCreated: fee.DateCreated,\n DateModified: fee.DateModified,\n FeeSetupId: fee.FeeSetupId,\n RecalcCreateDate: fee.RecalcCreateDate,\n LockOnPayment: fee.LockOnPayment,\n FeeTypeId: fee.FeeTypeId,\n Invoiced: fee.Invoiced,\n ModifiedBy: fee.ModifiedBy,\n PaymentAmount: fee.PaymentAmount\n }\n fees.push(limited_fee)\n })\n resolve(fees)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Case Deposit by Case ObjectId.\n *\n * @category Case Deposits\n * @param {number} caObjectId - The Case Object ID for the case to which to get the deposits\n * @return {Object} Returns Promise that represents a collection of Case Deposits.\n */\n getDeposits(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseDeposit/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Case Payments by Case ObjectId\n *\n * @category Case Payments\n * @param {number} caObjectId - The Case Object ID for the case to which to get the payments\n * @return {Object} Returns Promise that represents a collection of Case Payments.\n */\n getPayments(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CasePayment/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Gets the instruments from the case specified by the CaObectId.\n *\n * @category Case Instruments\n * @param {number} caObjectId - The Case Object ID for the case to which to get the fees\n * @return {Object} Returns Promise that represents a collection of Case Instruments.\n */\n getInstruments(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseInstrument/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete the fee specified by the caFeeId.\n *\n * @category Case Fees\n * @param {number} caFeeId - The Case Fee ID which should be deleted\n * @return {Object} Returns Promise that represents a Case Fee object.\n */\n deleteFee(caFeeId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaFeeId: caFeeId\n }\n this.cw.runRequest('Pll/CaseFees/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Case Fees by Case ObjectId. Delete from the system all Fees linked to a specific Case as specified by the Case Id parameter (CaObjectId).\n *\n * @category Case Fees\n * @param {number} caObjectId - The Case Object ID whose fees should be deleted\n * @return {Object} Returns Promise that represents a number (?)\n */\n deleteFeesByCaseId(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseFees/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete a Case Payment by Id. Delete a specific case payment by CaPaymentId.\n *\n * @category Case Payments\n * @param {number} caPaymentId - The Case Payment ID which should be deleted\n * @return {Object} Returns Promise that represents a Case Payment object.\n */\n deletePayment(caFeeId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaFeeId: caFeeId\n }\n this.cw.runRequest('Pll/CasePayment/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Case Payment Refund. Removes a refund on a payment.\n *\n * @category Case Payment Refunds\n * @param {number} caPaymentRefundId - The Case Payment ID for the case payment which to refund\n * @return {Object} Returns Promise that represents an object describing the deleted payment refund. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaPaymentRefundItemBase\n */\n deleteRefund(caPaymentRefundId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaPaymentRefundId: caPaymentRefundId\n }\n this.cw.runRequest('Pll/CasePaymentRefund/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Case Payments by Case ObjectId. Delete from the system all payments associated to a specific case as specified by the case id (CaObjectId)\n *\n * @category Case Payments\n * @param {number} caObjectId - The Case Object ID whose payments should be deleted\n * @return {Object} Returns Promise that represents a number (?)\n */\n deletePaymentsByCaseId(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CasePayment/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete the fee specified by the caFeeId.\n *\n * @category Case Deposits\n * @param {number} caDepositId - The Case Deposit ID which should be deleted\n * @return {Object} Returns Promise that represents a collection of Case Deposits.\n */\n deleteDeposit(caDepositId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaDepositId: caDepositId\n }\n this.cw.runRequest('Pll/CaseDeposit/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Case Fees by Case ObjectId. Delete from the system all Fees linked to a specific Case as specified by the Case Id parameter (CaObjectId).\n *\n * @category Case Deposits\n * @param {number} caObjectId - The Case Object ID whose fees should be deleted\n * @return {Object} Returns Promise that represents a number (?)\n */\n deleteDepositsByCaseId(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseDeposit/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete the instrument specified by the caInstrumentId.\n *\n * @category Case Instruments\n * @param {number} caInstrumentId - The Case Instrument ID which should be deleted\n * @return {Object} Returns Promise that represents a Case Instrument.\n */\n deleteInstrument(caInstrumentId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaInstrumentId: caInstrumentId\n }\n this.cw.runRequest('Pll/CaseInstrument/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Case Instruments by Case ObjectId. Delete from the system all Instruments linked to a specific Case as specified by the Case Id parameter (CaObjectId).\n *\n * @category Case Instruments\n * @param {number} caObjectId - The Case Object ID whose instruments should be deleted\n * @return {Object} Returns Promise that represents a number (?)\n */\n deleteInstrumentsByCaseId(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseInstrument/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Fees. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Case Fees\n * @param {Object} filters - The parameter(s) to search by\n * @return {Object} Returns Promise that represents an Array of case fee IDs\n */\n searchFees(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaFeeId', 'CaObjectId', 'FeeCode', 'FeeDesc']).length==0) {\n reject(new CWError(4, 'At least one of the attributes (CaFeeId, CaObjectId, FeeCode, FeeDesc) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseFees/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Payments. Include one or more of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Case Payments\n * @param {Object} filters - The filters to search for matched Case Payments\n * @return {Object} Returns Promise that represents an Array of case payment IDs\n */\n searchPayments(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaPaymentId', 'CommentText', 'FeeAmount', 'FeeCode', 'FeeDesc', 'PaymentAccount', 'PaymentAmount', 'TenderType']).length==0) {\n reject(new CWError(5, 'At least one of the attributes (CaPaymentId, CommentText, FeeAmount, FeeCode, FeeDesc, PaymentAccount, PaymentAmount, TenderType) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CasePayment/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Payment Refunds. Include one or more of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Case Payment Refunds\n * @param {Object} filters - The filters to search for matched Case Payments.\n * @return {Object} Returns Promise that represents an Array of case payment refund IDs\n */\n searchRefunds(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaPaymentId', 'CaPaymentRefundId', 'Comments', 'RefundAmount']).length==0) {\n reject(new CWError(6, 'At least one of the attributes (CaPaymentId, CaPaymentRefundId, Comments, RefundAmount) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CasePayment/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /* Escrow */\n /**\n * Get the Escrow Fees for a specific case template (BusCaseId).\n *\n * @category Case Escrow\n * @param {number} busCaseId - The business case ID whose default fees should be added to the case\n * @return {Object} Returns Promise that represents a collection of Fee Items. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaFeesItemBase\n */\n getEscrowFees(busCaseId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n BusCaseId: busCaseId\n }\n this.cw.runRequest('Pll/EscrowFees/GetByBusCaseId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add an Escrow Payment. Adds a payment to the case.\n *\n * @category Case Escrow\n * @param {number} escrowPaymentItems - The escrow payment items to add to the case (See: /{subdirectory}/apidocs/#/data-type-info;dataType=EscrowPaymentItem)\n * @return {Object} Returns Promise that represents a collection of Escrow Paymnent Items that were added.\n */\n addEscrowPayment(escrowPaymentItems: Array<Object>) {\n return new Promise((resolve, reject) => {\n var data = {\n EscrowPayments: escrowPaymentItems\n }\n this.cw.runRequest('Pll/EscrowPayment/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n // \n /**\n * Search for Escrow Payments\n *\n * @category Case Escrow\n * @param {number} caObectId - The business case ID whose default fees should be added to the case\n * @return {Object} Returns Promise that represents a collection of Fee Items. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaFeesItemBase\n */\n // searchEscrowPayments(whereClause: Array<FilterCondition>, limit, offset, sortDir, sortField) {\n // return new Promise((resolve, reject) => {\n // var data = {\n // CaObjectId: busCaseId\n // }\n // this.cw.runRequest('Pll/EscrowPayment/GetList', data).then(r => {\n // resolve(r.Value)\n // }).catch(e => {\n // reject(e)\n // })\n // })\n // }\n\n /**\n * Get the Escrow Fees for a specific case template (BusCaseId).\n *\n * @category Case Escrow\n * @param {number} busCaseId - The business case ID whose default fees should be added to the case\n * @return {Object} Returns Promise that represents a collection of Fee Items. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaFeesItemBase\n */\n updateEscrowPayment(busCaseId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n BusCaseId: busCaseId\n }\n this.cw.runRequest('Pll/EscrowPayment/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n /* End Escrow */\n\n /**\n * Search for Case Deposits. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Case Deposits\n * @param {Object} filters - The parameters to search by.\n * @return {Object} Returns Promise that represents an Array of case fee IDs\n */\n searchDeposits(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaDepositId', 'CaObjectId', 'DepositCode', 'DepositDesc']).length==0) {\n reject(new CWError(1, 'At least one of the arguments (CaDepositId, CaObjectId, DepositCode, DepositDesc) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseDeposit/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get All Fee Templates\n *\n * @category Case Fees\n * @return {Object} Returns Promise that represents an object describing the newly-added fee. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaFeesItemBase\n */\n getAllFeeTemplates() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/FeeSetup/All', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Fees. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Case Fees\n * @param {Object} filters - The parameters to search by\n * @return {Object} Returns Promise that represents an Array of case fee IDs\n */\n searchFeeTemplates(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['FeeSetupId', 'FeeTypeId', 'FeeCode', 'FeeDesc', 'AccountCode']).length==0) {\n reject(new CWError(7, 'At least one of the arguments (FeeSetupId, FeeTypeId, FeeCode, FeeDesc, AccountCode) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/FeeSetup/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Instruments. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Case Instruments\n * @param {Object} filters - The parameters to search by (AddressLine1, Amount, CaInstrumentId, CityName, CommentText, Company, ContactEmail, ContactName, ContactPhone, CountryCode, InstTypeId, SerialNumber, StateCode, ZipCode)\n * @return {Object} Returns Promise that represents an Array of case instrument IDs\n */\n searchCaseInstruments(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['AddressLine1', 'Amount', 'CaInstrumentId', 'CityName', 'CommentText', 'Company', 'ContactEmail', 'ContactName', 'ContactPhone', 'CountryCode', 'InstTypeId', 'SerialNumber', 'StateCode', 'ZipCode']).length==0) {\n reject(new CWError(9, 'At least one of the arguments (AddressLine1, Amount, CaInstrumentId, CityName, CommentText, Company, ContactEmail, ContactName, ContactPhone, CountryCode, InstTypeId, SerialNumber, StateCode, ZipCode) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseInstrument/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get the Defined Instruments\n *\n * @category Instruments\n * @param {Object} options - the options to filter the instruments returned by\n * @return {Object} Returns Promise that represents an Array of CaInstrumentItem\n */\n getInstrumentList(options: Object) {\n return new Promise((resolve, reject) => {\n var data = options\n this.cw.runRequest('Pll/CaseInstrument/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds a release to a case instrument specified by the caInstrumentId. Must provide either amountReleased OR percentReleased\n *\n * @category Case Instrument Releases\n * @param {number} caInstrumentId - The Case Instrument ID to which to add the instrument release\n * @param {number} releasedBy - UserID to attach to the release.\n * @param {Date} dateReleased - The date of the release\n * @param {number} [amountReleased] - The amount to be released\n * @param {number} [percentReleased] - OR the percent to be released\n * @param {string} [comment] - Comment to attach to the release\n * @return {Object} Returns Promise that represents an object describing the newly-added instrument release. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaInstReleasesItemBase\n */\n addCaseInstrumentRelease(caInstrumentId: number, releasedBy: number, dateReleased: Date, amountReleased?: number, percentReleased?: number, comment?: string) {\n return new Promise((resolve, reject) => {\n var data = {\n CaInstrumentId: caInstrumentId,\n DateReleased: dateReleased,\n ReleasedBy: releasedBy\n }\n if((typeof(percentReleased)!='undefined' || percentReleased!=null) && (typeof(amountReleased)!='undefined' || amountReleased!=null)) {\n reject(new CWError(2, 'Either amountReleased or percentReleased must be specified.'))\n } else if(typeof(percentReleased)!='undefined' && percentReleased!=null) {\n _.set(data, 'PercentReleased', percentReleased)\n } else if(typeof(amountReleased)!='undefined' && amountReleased!=null) {\n _.set(data, 'AmountReleased', amountReleased)\n }\n if(typeof(comment)!='undefined') {\n _.set(data, 'CommentText', comment)\n }\n this.cw.runRequest('Pll/CaseInstReleases/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Deletes a release specified by the caInstReleasesId.\n *\n * @category Case Instrument Releases\n * @param {number} caInstReleasesId - The Case Instrument Release ID to delete\n * @return {Object} Returns Promise that represents an object describing the deleted instrument release. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaInstReleasesItemBase\n */\n deleteCaseInstrumentRelease(caInstReleasesId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaInstReleasesId: caInstReleasesId\n }\n this.cw.runRequest('Pll/CaseInstReleases/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Instrument Releases. Include one or more of the search fields. A logical 'and' operation is applied for muliple search fields.\n *\n * @category Case Instrument Releases\n * @param {Object} filters - Specify at least one of the following: AmountReleased, CaInstReleasesId, CaInstrumentId, CommentText, PercentReleased, ReleasedBy\n * @return {Object} Returns Promise that represents an Array of Case Instruments resulting from the search\n */\n searchCaseInstrumentReleases(filters: Object) {\n return new Promise((resolve, reject) => {\n var data = filters\n if(_.intersectionBy(_.keysIn(filters), ['AmountReleased', 'CaInstReleasesId', 'CaInstrumentId', 'CommentText', 'PercentReleased', 'ReleasedBy']).length==0) {\n reject(new CWError(3, 'At least one of the attributes (AmountReleased, CaInstReleasesId, CaInstrumentId, CommentText, PercentReleased, ReleasedBy) must be defined.'))\n }\n this.cw.runRequest('Pll/CaseInstReleases/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get All Fees\n *\n * @category Fees\n * @return {Object} Returns Promise that represents a collection of FeeSetups. See /{subdirectory}/apidocs/#/data-type-info;dataType=FeeSetupItemBase\n */\n fees() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Pll/FeeSetup/All', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Fees. Include one or more of the search fields. A logical 'and' operation is applied for muliple search fields.\n *\n * @category Fees\n * @param {Object} filters - Specify at least one.\n * @return {Object} Returns Promise that represents a collection of FeeSetups. See /{subdirectory}/apidocs/#/data-type-info;dataType=FeeSetupItemBase\n */\n searchAvailableFees(filters: {AccountCode?: string, FeeCode?: string, FeeDesc?: string, FeeSetupId?: number, FeeTypeId?: number}) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['AccountCode', 'FeeCode', 'FeeDesc', 'FeeSetupId', 'FeeTypeId']).length==0) {\n reject(new CWError(8, 'At least one of the attributes (AccountCode, FeeCode, FeeDesc, FeeSetupId, FeeTypeId) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/FeeSetup/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all tender types configured\n *\n * @category Tender Types\n * @return {Object} Returns Promise that represents a collection of tender type objects. See /{subdirectory}/apidocs/#/data-type-info;dataType=TenderTypeItem\n */\n getTenderTypes() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/TenderType/All', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds a tender type configuration\n *\n * @category Tender Types\n * @param {Object} options - See /{subdirectory}/apidocs/#/service-info/Pll/TenderType\n * @return {Object} Returns Promise that represents an object describing the newly-added tender type. See /{subdirectory}/apidocs/#/data-type-info;dataType=TenderTypeItem\n */\n addTenderType(options: Object) {\n return new Promise((resolve, reject) => {\n var data = options\n this.cw.runRequest('Pll/TenderType/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update a tender type configuration\n *\n * @category Tender Types\n * @param {number} tenderTypeId - ID of the tender type to update\n * @param {Object} options - See /{subdirectory}/apidocs/#/service-info/Pll/TenderType\n * @return {Object} Returns Promise that represents an object describing the newly-added tender type. See /{subdirectory}/apidocs/#/data-type-info;dataType=TenderTypeItem\n */\n updateTenderType(tenderTypeId: number, options: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n TenderTypeId: tenderTypeId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/TenderType/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n}\n","import { CWError } from './error'\nimport ReversibleMap from 'reversible-map'\nconst _ = require('lodash')\n\n\n/**\n * A plugin that contains \"comments\" methods\n */\nexport class Comments {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Storage of all potential activity types which comments can be attached to: Unknown, Request, WorkOrder, CaTask, CaObject, CaCorrection, Project, Contract\n */\n activityTypes: ReversibleMap<string, number>\n\n /**\n * Storage of object's active activityType\n */\n currentActivityType: string\n\n /**\n * @hidden\n */\n constructor(cw: any, activityType: string) {\n this.cw = cw\n this.activityTypes = new ReversibleMap<string, number>()\n this.activityTypes.set(\"Unknown\", 0)\n this.activityTypes.set(\"Request\", 1)\n this.activityTypes.set(\"WorkOrder\", 2)\n this.activityTypes.set(\"CaTask\", 3)\n this.activityTypes.set(\"CaObject\", 4)\n this.activityTypes.set(\"CaCorrection\", 5)\n this.activityTypes.set(\"Project\", 6)\n this.activityTypes.set(\"Contract\", 7)\n\n if(!this.activityTypes.has(activityType)) {\n throw new CWError(1, 'Comment activity type not found.', {'provided': activityType, 'options':this.activityTypes})\n }\n this.currentActivityType = activityType\n }\n\n /**\n * Add a comment - for adding a comment to an object when the object is already known. Always call comment.add from request, case, workorder, or inspection.\n * \n * @param {number} sid - The SID of the activity to which the comment should be attached\n * @param {string} comment - The text for the comment\n * @return {Object} Returns a Promise which represents a CommentRecord object\n */\n add(sid: number, comment: string) {\n return new Promise((resolve, reject) => {\n var data = {\n ActivityType: this.activityTypes.get(this.currentActivityType),\n ActivitySid: sid,\n Comments: comment\n }\n this.cw.runRequest('Ams/Comment/Add', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update a comment\n *\n * @param {number} id - The ID of the comment which should be updated\n * @param {string} comment - The new text for the updated comment\n * @return {Object} Returns a Promise which represents a CommentRecord object\n */\n update(id: number, comment: string) {\n return new Promise((resolve, reject) => {\n var data = {\n ActivityType: this.activityTypes.get(this.currentActivityType),\n CommentId: id,\n Comments: comment\n }\n this.cw.runRequest('Ams/Comment/Update', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get comments for activity items\n *\n * @param {Array<number>} sids - The options SIDs to get comments for.\n * @return {Object} Returns Promise object that represents a collection of available comments\n */\n get(sids: Array<number>) {\n return new Promise((resolve, reject) => {\n if(typeof(sids)!='undefined' && sids !=null) {\n var data = {\n ActivitySids: sids,\n ActivityType: this.activityTypes.get(this.currentActivityType),\n }\n this.cw.runRequest('Ams/Comment/ByActivitySids', data).then((response: any) => {\n if(sids.length==1) {\n resolve(response.Value[sids[0]])\n } else {\n resolve(response.Value)\n }\n })\n }\n })\n }\n\n /**\n * Get pre-defined comments for activityTypes\n *\n * @param {number} problemSid - The ProblemSid if currentActivityType is (Service) Request\n * @param {string} [category] - Only applies to WorkOrder and ServiceRequest category comments.\n * @return {Object} Returns Promise object that represents a collection of available comment templates.\n */\n getPredefined(problemSid: number = 0, category?: string) {\n return new Promise((resolve, reject) => {\n var data = {}\n _.set(data, 'ProblemSid', problemSid)\n if(typeof(category)!='undefined' && (this.currentActivityType=='Request' || this.currentActivityType=='WorkOrder')) {\n _.set(data, 'Category', category)\n }\n _.set(data, 'ActivityType', this.activityTypes.get(this.currentActivityType))\n this.cw.runRequest('Ams/Comment/PredefinedComments', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n // /**\n // * Get pre-set comments for activityTypes\n // *\n // * @param {Array<string>} [activityTypes] - Provide a list of activity types. Defaults to current activity type.\n // * @param {Array<string>} [categories] - Only applies to WorkOrder and ServiceRequest category comments.\n // * @return {Object} Returns Promise object that represents a collection of available comment templates.\n // */\n // getForActivityList(activityTypes?: Array<string>, categories?: Array<string>) {\n // return new Promise((resolve, reject) => {\n // var data = {}\n // if(typeof(activityTypes)!='undefined') {\n // // TODO: iterate through it and output numeric types\n // _.set(data, 'ActivityTypes', activityTypes)\n // } else {\n // _.set(data, 'ActivityTypes', [this.activityTypes.get(this.currentActivityType)])\n // }\n // if(typeof(categories)!='undefined') {\n // _.set(data, 'Categories', categories)\n // }\n // console.log(data, 'data')\n // this.cw.runRequest('Ams/Comment/ByActivityTypes', data).then((response: any) => {\n // resolve(response.Value)\n // }).catch(e => {\n // reject(e)\n // })\n // })\n // }\n\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\nimport { Comments } from './comments'\n\nexport class CaseWorkflow {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Task sub-methods\n */\n task: Object\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.task = {\n comment: new Comments(cw, 'CaTask')\n }\n }\n\n /**\n * Adds a task to the case specified by the CaObectId.\n *\n * @category Tasks\n * @param {number} caObjectId - The Case Object to attach the task to\n * @param {number} taskId - The task ID to add to the case workflow\n * @param {number} startPoint - The start point in the workflow for the task\n * @param {number} endPoint - The end point in the workflow for the task\n * @param {Object} [options] - Options for the Task. See /{subdirectory}/apidocs/#/service-info/Pll/CaseTask\n * @return {Object} Returns Promise that represents an object describing CaTaskItemBase.\n */\n addTask(caObjectId: number, taskId: number, startPoint: number, endPoint: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n TaskId: taskId,\n StartPoint: startPoint,\n EndPoint: endPoint\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseTask/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Task Result\n *\n * @category Task Results\n * @param {number} caObjectId - The Case Object to attach the task to\n * @param {number} caTaskId - The Case task ID to add the result to\n * @param {number} resultCode - The result Code\n * @param {number} resultID - The result ID\n * @param {number} resultSetID - The result set ID\n * @param {Object} [options] - Options for the Task. See /{subdirectory}/apidocs/#/service-info/Pll/CaseTaskResults\n * @return {Object} Returns Promise that represents an object describing CaTaskResultsItem.\n */\n addTaskResult(caObjectId: number, caTaskId: number, resultCode: number, resultID: number, resultSetID: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n CaTaskId: caTaskId,\n ResultCode: resultCode,\n ResultID: resultID,\n ResultSetID: resultSetID\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseTaskResults/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Task Comment\n *\n * @category Comments\n * @param {number} caTaskId - The Case task ID of the task to add the comment to\n * @param {string} comment - The comment text\n * @return {Object} Returns Promise that represents an object describing CaTaskCommentsItemBase.\n */\n addTaskComment(caTaskId: number, comment: string) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskId: caTaskId,\n CommentText: comment\n }\n this.cw.runRequest('Pll/CaseTaskComments/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get tasks by CaObjectId\n *\n * @category Tasks\n * @param {number} caObjectId - The Case Object to get the attached tasks\n * @param {boolean} checkRelatedItems - Wherther to check related items. Defaults to false.\n * @return {Object} Returns Promise that represents a collection of the CaTaskItemBases.\n */\n getTasksByCaseId(caObjectId: number, checkRelatedItems: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n CheckRelatedItems: checkRelatedItems\n }\n this.cw.runRequest('Pll/CaseTask/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get tasks by TaskIds\n *\n * @category Tasks\n * @param {Array<number>} caTaskIds - The IDs of the tasks to retrieve\n * @param {boolean} checkRelatedItems - Wherther to check related items. Defaults to false.\n * @return {Object} Returns Promise that represents a collection of the CaTaskItemBases.\n */\n getTasksById(caTaskIds: Array<number>, checkRelatedItems: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskIds: caTaskIds,\n CheckRelatedItems: checkRelatedItems\n }\n this.cw.runRequest('Pll/CaseTask/ByIds', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get CaTaskResultsItem by CaTaskIds\n *\n * @category Task Results\n * @param {Array<number>} caTaskIds - The IDs of the tasks for which to retrieve results\n * @return {Object} Returns Promise that represents a collection of CaTaskResultsItems.\n */\n getResultsByTaskId(caTaskIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskIds: caTaskIds\n }\n this.cw.runRequest('Pll/CaseTaskResults/ByCaTaskIds', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for CaseTaskComments by CaTaskId\n *\n * @category Comments\n * @param {number} caTaskId - The task ID for which to retrieve attached comments\n * @return {Object} Returns Promise that represents a collection of CommentRecords.\n */\n getCommentsForTask(caTaskId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n caTaskId: caTaskId\n }\n this.cw.runRequest('Pll/CaseTaskComments/ByCaTaskId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for CaseTaskComments by CaTaskId\n *\n * @category Comments\n * @param {Array<number>} caTaskIds - The task IDs for which to retrieve attached comments\n * @return {Object} Returns Promise that represents a collection of CaTaskCommentsItemBase.\n */\n getCommentsForTasks(caTaskIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n caTaskIds: caTaskIds\n }\n this.cw.runRequest('Pll/CaseTaskComments/ByCaTaskIds', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Updates a task\n *\n * @category Tasks\n * @param {number} caTaskId - The Case Object to attach the task to\n * @param {Object} [options] - Options for Task. See /{subdirectory}/apidocs/#/service-info/Pll/CaseTask\n * @return {Object} Returns Promise that represents an object describing CaTaskItemBase.\n */\n updateTask(caTaskId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskId: caTaskId\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseTask/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Task Comment\n *\n * @category Comments\n * @param {number} caTaskCommentId - The Case task ID of the task to add the comment to\n * @param {string} comment - The comment text\n * @param {number} commentId - Probably unnecessary?\n * @return {Object} Returns Promise that represents an object describing CaTaskCommentsItemBase.\n */\n updateTaskComment(caTaskCommentId: number, comment: string, commentId?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskCommentId: caTaskCommentId,\n CommentText: comment\n }\n if(typeof(commentId)!='undefined') {\n _.set(data, 'CommentId', commentId)\n }\n this.cw.runRequest('Pll/CaseTaskComments/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Updates a task\n *\n * @category Tasks\n * @param {number} caTaskId - The Case Object to attach the task to\n * @param {string} resultCode - The result code to set for the specified Task\n * @param {Object} [options] - Options for Task. Specify either or both TaskCompletedBy & TaskCompleteDate. See /{subdirectory}/apidocs/#/service-info/Pll/CaseTask\n * @return {Object} Returns Promise that represents an object describing CaTaskItemBase.\n */\n setTaskResult(caTaskId: number, resultCode: string, options?: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskId: caTaskId,\n ResultCode: resultCode\n }\n if(_.intersectionBy(_.keysIn(options), ['TaskCompleteDate', 'TaskCompletedBy']).length==0) {\n reject(new CWError(2, 'At least one of the attributes (TaskCompletedBy, TaskCompleteDate) must be defined.'))\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseTask/SetResult', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Deletes a task by TaskID\n *\n * @category Tasks\n * @param {number} caTaskId - The caTaskId for the task which should be deleted\n * @return {Object} Returns Promise that represents an object describing CaTaskItemBase.\n */\n deleteTask(caTaskId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskId: caTaskId\n }\n this.cw.runRequest('Pll/CaseTask/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Deletes a task by TaskID\n *\n * @category Tasks\n * @param {number} caTaskId - The caTaskId for the task which should be deleted\n * @return {Object} Returns Promise that represents the number of the CaObjectID\n */\n deleteTasksOnCase(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseTask/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Deletes tasks by TaskID\n *\n * @category Comments\n * @param {Array<number>} caTaskCommentIds - The comments to delete\n * @return {Object} Returns Promise that represents a dictionary of comment IDs.\n */\n deleteTaskComments(caTaskCommentIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskCommentIds: caTaskCommentIds\n }\n this.cw.runRequest('Pll/CaseTaskComments/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Case Tasks. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Tasks\n * @param {Object} filters - The parameters to search by. (ResponsibleUserId, TaskAvailable, TaskComplete, TaskType)\n * @return {Object} Returns Promise that represents a collection of resulting CaTaskIDs\n */\n searchForTasks(filters?: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['ResponsibleUserId', 'TaskAvailable', 'TaskComplete', 'TaskType']).length==0) {\n reject(new CWError(1, 'At least one of the attributes (ResponsibleUserId, TaskAvailable, TaskComplete, TaskType) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseTask/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for CaseTaskResults Objects. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Task Results\n * @param {Object} filters - The parameters to search by. See: /{subdirectory}/apidocs/#/service-info/Pll/CaseTaskResults\n * @return {Object} Returns Promise that represents a collection of resulting CaTaskResultsItem\n */\n searchForTaskResults(filters?: Object) {\n return new Promise((resolve, reject) => {\n var data = filters\n this.cw.runRequest('Pll/CaseTaskResults/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Adds a task to the case specified by the CaObectId.\n *\n * @category Task Attachments\n * @param {number} caTaskId - The Task ID to attach the document to\n * @param {number} caObjectId - The Case Object ID\n * @param {string} docName - The file name as it should display in the system\n * @param {string} locationType - The location of the file...leave blank\n * @param {any} file - The binary string for the file\n * @return {Object} Returns Promise that represents an object describing added Attachment\n */\n addTaskAttachment(caTaskId: number, caObjectId: number, docName: number, file: any, locationType?: string) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n CaTaskId: caTaskId,\n DocName: docName\n }\n if(typeof(locationType)!='undefined') {\n _.set(data, 'LocationType', locationType)\n }\n this.cw.runRequest('Pll/CaseRelDocs/AddTaskRelDoc', data, file).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Gets each Document Attached to the specified Task\n *\n * @category Task Attachments\n * @param {number} caTaskId - The Task ID to attach the document to\n * @return {Object} Returns Promise that represents a collection of objects describing each Attachment on the provided task\n */\n getTaskAttachments(caTaskId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaTaskId: caTaskId\n }\n this.cw.runRequest('Pll/CaseRelDocs/ByCaTaskId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Deletes a task attachment by caRelDocId (Related Case Document ID). Same as RelDocs delete for case.\n *\n * @category Task Attachments\n * @param {number} caRelDocId - The caRelDocId for the related document which should be deleted\n * @return {Object} Returns Promise that represents the an object describing the deleted document.\n */\n deleteTaskAttachment(caRelDocId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaRelDocId: caRelDocId\n }\n this.cw.runRequest('PLL/CaseRelDocs/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n\n\n\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class CasePeople {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw: Object) {\n this.cw = cw\n }\n\n /**\n * Add a people record to a case\n *\n * @category Case People\n * @param {number} caObjectId - The Case Object ID for the case to which to add the person\n * @param {number} name - The name of the person to add to the case.\n * @param {Object} [options] - See /{subdirectory}/apidocs/#/service-info/Pll/CasePeople for more options.\n * @return {Object} Returns Promise that represents an object describing the newly-added person. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaPeopleItemBase\n */\n add(caObjectId: number, name: string, options?: Object) {\n return new Promise((resolve, reject) => {\n var init_data = {\n CaObjectId: caObjectId,\n Name: name\n }\n var data = _.merge(init_data, options);\n this.cw.runRequest('Pll/CaseFees/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all the people roles available\n *\n * @category Case People\n * @return {Object} Returns Promise that represents an collection of configured People Roles\n */\n getRoles() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Pll/PeopleRole/All', {}).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get people records attached to a specific case\n *\n * @category Case People\n * @param {number} caObjectId - The Case Object ID for the case to which to add the person\n * @return {Object} Returns Promise that represents an object describing the newly-added person. See /{subdirectory}/apidocs/#/data-type-info;dataType=CaPeopleItemBase\n */\n get(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n }\n this.cw.runRequest('Pll/CasePeople/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete specific people records\n *\n * @category Case People\n * @param {number} caPeopleId - The Case Object ID for the case to which to add the person\n * @return {Object} Returns Promise that represents the result of the delete operation.\n */\n delete(caPeopleId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaPeopleId: caPeopleId,\n }\n this.cw.runRequest('Pll/CasePeople/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete all people records attached to a specific case\n *\n * @category Case People\n * @param {number} caObjectId - The Case Object ID for the case to which to add the person\n * @return {Object} Returns Promise that represents the result of the delete operation.\n */\n deleteAll(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n }\n this.cw.runRequest('Pll/CasePeople/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for people records\n *\n * @category Case People\n * @param {number} searchOptions - Where you specify search options that assume a logical 'and' operation\n * @param {boolean} idsOnly - If you only wants the IDs of the people records that match the search criteria, set this to true. Otherwise, set it to false.\n * @return {Object} Returns Promise that represents an array of people record IDs that match the search criteria.\n */\n search(searchOptions: {\n AddressLine1: string\n AddressLine2: string\n CaObjectId: number\n CaPeopleId: number\n CityName: string\n CountryCode: string\n CountryName: string\n Email: string\n Name: string\n PhoneHome: string\n PhoneMobile: string\n PhoneWork: string\n RoleCode: string\n RoleDesc: string\n RoleId: number\n StateCode: string\n StateName: string\n ZipCode: string\n }, idsOnly: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = searchOptions\n var runUrl: string = 'Pll/CasePeople/SearchObject'\n if(idsOnly) {\n runUrl = 'Pll/CasePeople/Search'\n }\n this.cw.runRequest(runUrl, data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\n\nconst _ = require('lodash')\n\nexport class CaseAssets {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Attach asset to case\n *\n * @category Case Assets\n * @param {number} caObjectId - The Case Object to attach the asset to.\n * @param {boolean} updateXY - Whether or not to update the Case's X/Y values when attaching the asset. Defaults to true.\n * @param {Object} [options] - Options for CaseDataGroup including Address, AddressId, AssetId, AssetObjectId, AssetType, CityName, CrossStreet, DateExpired, ExpiredFlag, Facility_Id, FeatureAssetId, FeatureClass, FeatureObjectId, LegacyId, Level_Id, LndObjectId, Location, MasterFlag, ObjectId, StateCode, StreetDirection, StreetFraction, StreetName, StreetNumber, StreetPostDir, StreetType, Suite, TileNo, UpdateCaseData, XCoord, YCoord, ZCoord, and ZipCode\n * @return {Object} Returns Promise that represents an object describing CaAddress.\n * // {\"AddressId\":OBJECTID,\"AssetId\":\"GUID\",\"AssetType\":\"ASSET_NAME\",\"CaObjectId\":CA_OBJECTID,\"FeatureAssetId\":\"GUID\",\"FeatureClass\":\"ASSET_NAME\",\"FeatureObjectId\":OBJECTID,\"Location\":\"Address string\",\"ObjectId\":\"OBJECTID\",\"XCoord\":,\"YCoord\":,\"UpdateCaseData\":false}\n */\n attach(caObjectId: number, updateXY: boolean = true, options?: {Address?: string, AddressId?: number, AssetId?: string, AssetObjectId?: number, AssetType?: string, CityName?: string, CrossStreet?: string, DateExpired?: string, ExpiredFlag?: string, Facility_Id?: string, FeatureAssetId?: string, FeatureClass?: string, FeatureObjectId?: number, LegacyId?: string, Level_Id?: string, LndObjectId?: number, Location?: string, MasterFlag?: string, ObjectId?: string, StateCode?: string, StreetDirection?: string, StreetFraction?: string, StreetName?: string, StreetNumber?: number, StreetPostDir?: string, StreetType?: string, Suite?: string, TileNo?: string, UpdateCaseData?: boolean, XCoord?: number, YCoord?: number, ZCoord?: number, ZipCode?: string}) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n UpdateXY: updateXY\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseAddress/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Detach specific asset from case\n *\n * @category Case Assets\n * @param {number} caObjectId - The Case Object to attach the data group to.\n * @param {boolean} updateXY - Whether or not to update the Case's X/Y values when detaching the assets. Defaults to true.\n * @return {Object} Returns Promise that represents a collection of the default CaDataGroupItemBases.\n */\n detach(caAddressId: number, updateXY: boolean = true) {\n return new Promise((resolve, reject) => {\n var data = {\n CaAddressId: caAddressId,\n UpdateXY: updateXY\n }\n this.cw.runRequest('Pll/CaseAddress/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Detach all assets from case\n *\n * @category Case Assets\n * @param {number} caObjectId - The Case Object to detach the assets from.\n * @param {boolean} updateXY - Whether or not to update the Case's X/Y values when detaching the asset(s). Defaults to false.\n * @return {Object} Returns Promise that represents a collection of detached CaAddressIds.\n */\n detachAll(caObjectId: number, updateXY: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n UpdateXY: updateXY\n }\n this.cw.runRequest('Pll/CaseAddress/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get assets attached to a specific case\n *\n * @category Case Assets\n * @param {number} caObjectId - The Case Object from which to get attached assets\n * @return {Object} Returns Promise that represents a collection of the default CaAddresses.\n */\n getForCase(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseAddress/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n\n /**\n * Search for Case Assets. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Case Assets\n * @param {Object} filters - The parameters to search by. (AssetType, CaAddressId, CaObjectId, CityName, ExpiredFlag, StateCode, StateName, StreetName, StreetNumber, Suite, ZipCode)\n * @return {Object} Returns Promise that represents an Array of resulting CaAddresses\n */\n search(filters?: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['AssetType', 'CaAddressId', 'CaObjectId', 'CityName', 'ExpiredFlag', 'StateCode', 'StateName', 'StreetName', 'StreetNumber', 'Suite', 'ZipCode']).length==0) {\n reject(new CWError(3, 'At least one of the attributes (AssetType, CaAddressId, CaObjectId, CityName, ExpiredFlag, StateCode, StateName, StreetName, StreetNumber, Suite, ZipCode) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseAddress/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\n\nconst _ = require('lodash')\n\nexport class CaseFlags {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Add flag to case\n *\n * @category Case Flags\n * @param {number} caObjectId - The Case Object to add the flag to.\n * @param {number} flagId - The flag ID\n * @param {string} severity - The severity of the flag\n * @param {number} appliedBy - Which userID is applying the flag\n * @param {DateTime} DateApplied - The date that the flag should be applied\n * @param {Object} [options] - Options for CaseFlags includes Notes, DisciplineId, CompletedBy, DateCompleted\n * @return {Object} Returns Promise that represents an object describing CaFlag.\n */\n add(caObjectId: number, flagId: number, severity: string, appliedBy: number, DateApplied: Date, options?: {Notes?: string, DisciplineId?: number, CompletedBy?: number, DateCompleted?: Date}) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId,\n FlagId: flagId,\n Severity: severity,\n AppliedBy: appliedBy,\n DateApplied: DateApplied\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Pll/CaseFlags/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete specific flag from case\n *\n * @category Case Flags\n * @param {number} caFlagId - The CaFlagId (case flag instance ID) that should be deleted\n * @return {Object} Returns Promise that represents the CaFlag that has been deleted.\n */\n delete(caFlagId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaFlagId: caFlagId\n }\n this.cw.runRequest('Pll/CaseFlags/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete all flags from case\n *\n * @category Case Flags\n * @param {number} caObjectId - The Case Object to delete the flags from.\n * @return {Object} Returns Promise that represents the number of flags deleted from the case provided.\n */\n deleteAll(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseFlags/DeleteByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get flags attached to a specific case\n *\n * @category Case Flags\n * @param {number} caObjectId - The Case Object from which to get attached flags\n * @return {Object} Returns Promise that represents a collection of the default CaFlags.\n */\n getForCase(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseFlags/ByCaObjectId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n\n /**\n * Search for Case Flags. Include one or more of the search fields. A logical 'and' operation is applied to muliple search fields\n *\n * @category Case Flags\n * @param {Object} filters - The parameters to search by. (CaFlagId, Flag, FlagDesc)\n * @return {Object} Returns Promise that represents an Array of resulting Flags\n */\n search(filters?: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaFlagId', 'Flag', 'FlagDesc']).length==0) {\n reject(new CWError(3, 'At least one of the attributes (CaFlagId, Flag, FlagDesc) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseFlags/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class CaseAdmin {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Add Business Case Template\n *\n * @category Case Templates\n * @param {Object} data - The Business Case Template options.\n * @return {Object} Returns Promise that represents an object describing the created case template. See: /{subdirectory}/apidocs/#/data-type-info;dataType=BusinessCaseItem\n */\n addBusinessCaseTemplate(data: Object) {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Pll/BusinessCase/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Business Case Template\n *\n * @category Case Templates\n * @param {number} busCaseId - The Business Case ID to update\n * @param {Object} data - The Business Case Template options.\n * @return {Object} Returns Promise that represents an object describing the updated case template. See: /{subdirectory}/apidocs/#/data-type-info;dataType=BusinessCaseItem\n */\n updateBusinessCaseTemplate(busCaseId: number, options: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n BusCaseId: busCaseId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/BusinessCase/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Business Case Templates\n *\n * @category Case Templates\n * @return {Object} Returns Promise that represents a collection of Business Case Templates\n */\n getBusinessCaseTemplates() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/BusinessCase/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Case Type\n *\n * @category Types & SubTypes\n * @param {string} caseTypeName - The case type name\n * @param {string} caseTypeDesciption - The case type description\n * @param {Object} options - The other options for the Case Type\n * @return {Object} Returns Promise that represents an object describing the added case type\n */\n addCaseType(caseTypeName: string, caseTypeDesciption: string, options: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n CaseType: caseTypeName,\n CaseTypeDesciption: caseTypeDesciption\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/CaseType/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Case Type\n *\n * @category Types & SubTypes\n * @param {number} caseTypeId - The case Type ID\n * @param {Object} options - The other options for the Case Type\n * @return {Object} Returns Promise that represents an object describing the updated case type\n */\n updateCaseType(caseTypeId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n CaseTypeId: caseTypeId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/CaseType/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Case Types\n *\n * @category Types & SubTypes\n * @return {Object} Returns Promise that represents a collection of CaseTypeItems\n */\n getCaseTypes() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/CaseType/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for CaseTypes. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Types & SubTypes\n * @param {Object} filters - The parameter(s) to search by (CaseType, CaseTypeDesc, CaseTypeId)\n * @return {Object} Returns Promise that represents an Array of CaseTypeIDs\n */\n searchCaseTypeIDs(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaseType', 'CaseTypeDesc', 'CaseTypeId']).length==0) {\n reject(new CWError(2, 'At least one of the attributes (CaFeeId, CaObjectId, FeeCode, FeeDesc) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseType/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for CaseTypes. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @category Types & SubTypes\n * @param {Object} filters - The parameter(s) to search by (CaseType, CaseTypeDesc, CaseTypeId)\n * @return {Object} Returns Promise that represents a collection of CaseTypeItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=CaseTypeItem\n */\n searchCaseTypeObjects(filters: Object) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['CaseType', 'CaseTypeDesc', 'CaseTypeId']).length==0) {\n reject(new CWError(3, 'At least one of the attributes (CaseType, CaseTypeDesc, CaseTypeId) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/CaseType/SearchObject', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add SubType\n *\n * @category Types & SubTypes\n * @param {string} subTypeName - The SubTypeId\n * @param {string} subTypeDescription - The SubTypeId\n * @param {Object} options - Other SubType options.\n * @return {Object} Returns Promise that represents an object describing the added SubTypeItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=SubTypeItem\n */\n addSubtype(subTypeName: string, subTypeDescription: string, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n SubType: subTypeName,\n SubTypeDesc: subTypeDescription\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/SubType/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update SubType\n *\n * @category Types & SubTypes\n * @param {number} subTypeId - The SubTypeId\n * @param {Object} options - The case Object ID\n * @return {Object} Returns Promise that represents an object describing the updated SubTypeItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=SubTypeItem\n */\n updateSubtype(subTypeId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n SubTypeId: subTypeId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/SubType/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get SubTypes\n *\n * @category Types & SubTypes\n * @return {Object} Returns Promise that represents a collection of SubTypeItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=SubTypeItem\n */\n getSubtypes() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/SubType/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Fees\n *\n * @category Fees\n * @return {Object} Returns Promise that represents an object describing the added DepartmentItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=DepartmentItem\n */\n getFees() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/FeeSetup/All', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search for Fees. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @param {Object} filters - The parameter(s) to search by (AccountCode, FeeCode, FeeDesc, FeeSetupId, FeeTypeId).\n * @return {Object} Returns Promise that represents an Array of FeeSetupIDs\n */\n searchFees(filters: {AccountCode?: string, FeeCode?: string, FeeDesc?: string, FeeSetupId?: number, FeeTypeId?: number}) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['AccountCode', 'FeeCode', 'FeeDesc', 'FeeSetupId', 'FeeTypeId']).length==0) {\n reject(new CWError(4, 'At least one of the attributes (AccountCode, FeeCode, FeeDesc, FeeSetupId, FeeTypeId) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/FeeSetup/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Expirations\n *\n * @category Expirations\n * @return {Object} Returns Promise that represents a collection of ExpirationTypeItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=ExpirationTypeItem\n */\n getExpirations() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/ExpirationType/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add an Expiration type\n *\n * @category Expirations\n * @param {Object} options - Must specify OrgId and ExpirationDescType attributes. See: /{subdirectory}/apidocs/#/service-info/Pll/ExpirationType\n * @return {Object} Returns Promise that represents an object describing the newly-added ExpirationTypeItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=ExpirationTypeItem\n */\n addExpiration(options?: Object) {\n return new Promise((resolve, reject) => {\n if(!_.has(options, 'OrgId') || !_.has(options, 'ExpirationTypeDesc')) {\n reject(new CWError(5, 'OrgId and ExpirationTypeDesc must both be defined.'))\n }\n var data = options\n this.cw.runRequest('Pll/ExpirationType/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Deposits\n *\n * @category Deposits\n * @return {Object} Returns Promise that represents a collection of DepositItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=DepositItemBase\n */\n getDeposits() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/Deposit/All', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Search Deposits. Include at least one of the search fields. A logical 'and' operation is applied for multiple search fields.\n *\n * @param {Object} filters - The parameter(s) to search by (AccountCode, DepositCode, DepositDesc, DepositId, DepositTypeId).\n * @return {Object} Returns Promise that represents an Array of FeeSetupIDs\n */\n searchDeposits(filters: {AccountCode?: string, DepositCode?: string, DepositDesc?: string, DepositId?: number, DepositTypeId?: number}) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(_.keysIn(filters), ['AccountCode', 'DepositCode', 'DepositDesc', 'DepositId', 'DepositTypeId']).length==0) {\n reject(new CWError(4, 'At least one of the attributes (AccountCode, DepositCode, DepositDesc, DepositId, DepositTypeId) must be defined.'))\n }\n var data = filters\n this.cw.runRequest('Pll/Deposit/Search', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Disciplines\n *\n * @category Disciplines\n * @return {Object} Returns Promise that represents a collection of DisciplineItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=DisciplineItem\n */\n getDisciplines() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/Discipline/All', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Department\n *\n * @category Departments & Divisions\n * @param {string} departmentCode - The SubTypeId\n * @param {string} departmentName - The SubTypeId\n * @param {Object} options - Other SubType options.\n * @return {Object} Returns Promise that represents an object describing the added DepartmentItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=DepartmentItem\n */\n addDepartment(departmentCode: string, departmentName: string, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n DepartmentCode: departmentCode,\n DepartmentName: departmentName\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/Department/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Departments\n *\n * @category Departments & Divisions\n * @return {Object} Returns Promise that represents a collection of SubTypeItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=DepartmentItem\n */\n getDepartments() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/Department/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Division\n *\n * @category Departments & Divisions\n * @return {Object} Returns Promise that represents an object describing the newly-added DivisionItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=DivisionItem\n */\n addDivision(departmentId: number, divisionName: string, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n DepartmentId: departmentId,\n DivisionName: divisionName\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/Division/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Divisions\n *\n * @category Departments & Divisions\n * @return {Object} Returns Promise that represents a collection of DivisionItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=DivisionItem\n */\n getDivisions() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/Division/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Inspection Time Block\n *\n * @category Inspections\n * @param {string} labelText - Label for the time block\n * @param {string} startTime - Start time in 24 hour format (HH:mm)\n * @param {string} endTime - End time in 24 hour format (HH:mm)\n * @param {Object} inspTimeBlocksDetails - See: /{subdirectory}/apidocs/#/data-type-info;dataType=InspTimeBlocksDetailItem\n * @return {Object} Returns Promise that represents an object describing the newly-added InspectionTimeBlocksItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=InspectionTimeBlocksItem\n */\n addInspectionTimeBlock(labelText: string, startTime: string, endTime: string, inspTimeBlocksDetails?: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n LabelText: labelText,\n StartTime: startTime,\n EndTime: endTime\n }\n if(typeof(inspTimeBlocksDetails)!='undefined') {\n _.set(data, 'InspTimeBlocksDetails', inspTimeBlocksDetails)\n }\n this.cw.runRequest('Pll/InspectionTimeBlock/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Inspection Time Blocks\n *\n * @category Inspections\n * @return {Object} Returns Promise that represents a collection of InspectionTimeBlocksItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=InspectionTimeBlocksItem\n */\n getInspectionTimeBlocks() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/InspectionTimeBlock/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all NotificationCases\n *\n * @category Notifications\n * @return {Object} Returns Promise that represents a collection of NotificationCaseItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=NotificationCaseItem\n */\n getNotificationCases() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/NotificationCase/GetNotificationCaseList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Notification Types\n *\n * @category Notifications\n * @return {Object} Returns Promise that represents a collection of NotificationCaseItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=NotificationTypeItem\n */\n getNotificationTypes() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/NotificationType/GetNotificationTypeList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Numbering Group\n *\n * @category NumberingGroups\n * @param {number} options - attributes or update\n * @return {Object} Returns Promise that represents an object describing the newly-added NumberingGroupItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=NumberingGroupItem\n */\n addNumberingGroup(options: Object) {\n return new Promise((resolve, reject) => {\n var data = options\n this.cw.runRequest('Pll/NumberingGroup/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update Numbering Group\n *\n * @category NumberingGroups\n * @param {number} numberingGroupId - ID of NumberGroup to update\n * @param {number} options - updates attributes\n * @return {Object} Returns Promise that represents an object describing the newly-added HolidaysItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=NumberingGroupItem\n */\n updateNumberingGroup(numberingGroupId: number, options?: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n NumberingGroupId: numberingGroupId\n }\n var data = _.merge(data_init, options)\n this.cw.runRequest('Pll/NumberingGroup/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Numbering Groups\n *\n * @category NumberingGroups\n * @return {Object} Returns Promise that represents a collection of NumberingGroupItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=NumberingGroupItem\n */\n getNumberingGroups() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/NumberingGroup/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Person\n *\n * @category People\n * @param {string} name - Name of person\n * @param {Object} options - attributes for new person\n * @return {Object} Returns Promise that represents an object describing the newly-added NumberingGroupItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=NumberingGroupItem\n */\n addPerson(name: string, options: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n Name: name\n }\n var data = _.merge(options, data_init)\n this.cw.runRequest('Pll/People/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all People\n *\n * @category People\n * @return {Object} Returns Promise that represents a collection of PeopleItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=PeopleItem\n */\n getPeople() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/People/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add People Role\n *\n * @category People\n * @param {string} name - Name of person\n * @param {Object} options - attributes for new person. See: /{subdirectory}/apidocs/#/service-info/Pll/PeopleRole\n * @return {Object} Returns Promise that represents an object describing the newly-added PeopleRoleItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=PeopleRoleItem\n */\n addPeopleRole(roleCode: string, options: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n RoleCode: roleCode\n }\n var data = _.merge(options, data_init)\n this.cw.runRequest('Pll/People/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all PeopleRoles\n *\n * @category People\n * @return {Object} Returns Promise that represents a collection of PeopleRoleItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=PeopleRoleItem\n */\n getPeopleRoles() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/PeopleRole/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add TaskResultDetail\n *\n * @category TaskResults\n * @param {Object} options - attributes for new TaskResultDetail. See: /{subdirectory}/apidocs/#/service-info/Pll/TaskResultDetail\n * @return {Object} Returns Promise that represents an object describing the newly-added TaskResultDetailItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=TaskResultDetailItem\n */\n addTaskResultDetail(options: Object) {\n return new Promise((resolve, reject) => {\n var data = options\n this.cw.runRequest('Pll/TaskResultDetail/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update TaskResultDetail\n *\n * @category TaskResults\n * @param {string} resultDetailId - Result Detail ID\n * @param {Object} options - attributes for new person. See: /{subdirectory}/apidocs/#/service-info/Pll/TaskResultDetail\n * @return {Object} Returns Promise that represents an object describing the newly-added TaskResultDetailItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=TaskResultDetailItem\n */\n updateTaskResultDetail(resultDetailId: number, options: Object) {\n return new Promise((resolve, reject) => {\n var data_init = {\n ResultDetailId: resultDetailId\n }\n var data = _.merge(options, data_init)\n this.cw.runRequest('Pll/TaskResultDetail/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all TaskResultDetails\n *\n * @category TaskResults\n * @return {Object} Returns Promise that represents a collection of PeopleRoleItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=PeopleRoleItem\n */\n getTaskResultDetails() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/TaskResultDetail/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add TaskResultFeeInsert\n *\n * @category TaskResults\n * @param {Object} options - attributes for new TaskResultFeeInsert. See: /{subdirectory}/apidocs/#/service-info/Pll/TaskResultFeeInsert\n * @return {Object} Returns Promise that represents an object describing the newly-added TaskResultFeeInsertItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=TaskResultFeeInsertItem\n */\n addTaskResultFeeInsert(options: Object) {\n return new Promise((resolve, reject) => {\n var data = options\n this.cw.runRequest('Pll/TaskResultFeeInsert/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete TaskResultFeeInsert\n *\n * @category TaskResults\n * @param {number} taskResultFeeInsertId - ID for TaskResultFeeInsert to be deleted.\n * @return {Object} Returns Promise that represents the ID Number of the deleted TaskResultFeeInsertItem.\n */\n deleteTaskResultFeeInsert(taskResultFeeInsertId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n TaskResultFeeInsertId: taskResultFeeInsertId\n }\n this.cw.runRequest('Pll/TaskResultFeeInsert/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete TaskResultFeeInsert(s) by Task ID\n *\n * @category TaskResults\n * @param {number} taskId - ID for Task parent of TaskResultFeeInsert(s) to be deleted.\n * @return {Object} Returns Promise that represents the ID Number of the Task parent of the deleted TaskResultFeeInsertItem(s).\n */\n deleteTaskResultFeeInsertByTaskId(taskId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n TaskId: taskId\n }\n this.cw.runRequest('Pll/TaskResultFeeInsert/DeleteByTaskId', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update TaskResultFeeInsert\n *\n * @category TaskResults\n * @param {number} taskResultFeeInsertId - ID for TaskResultFeeInsert to be updated.\n * @param {number} taskId - Updated TaskID\n * @param {number} taskResultId - Updated TaskResultId\n * @param {number} [feeSetupId] - Fee setup ID update for TaskResultFeeInsert\n * @return {Object} Returns Promise that represents the ID Number of the updated TaskResultFeeInsertItem.\n */\n updateTaskResultFeeInsert(taskResultFeeInsertId: number, taskId: number, taskResultId: number, feeSetupId?: number) {\n return new Promise((resolve, reject) => {\n var data = {\n TaskResultFeeInsertId: taskResultFeeInsertId,\n TaskId: taskId,\n TaskResultId: taskResultId\n }\n if(typeof(feeSetupId)!='undefined') {\n _.set(data, 'FeeSetupId', feeSetupId)\n }\n this.cw.runRequest('Pll/TaskResultFeeInsert/Update', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n\n /**\n * Get all TaskResultFeeInsert\n *\n * @category TaskResults\n * @return {Object} Returns Promise that represents a collection of TaskResultFeeInsertItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=TaskResultFeeInsertItem\n */\n getTaskResultFeeInsert() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/TaskResultFeeInsert/GetList', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class WorkOrderAdmin {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Get entity groups\n *\n * @category WorkOrders Admin\n * @return {Object} Returns Promise that represents a collection of all entity groups\n */\n getEntityGroups() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Ams/Entity/Groups', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get entity types\n *\n * @category WorkOrders Admin\n * @return {Object} Returns Promise that represents a collection of all GIS WorkOrder entity types\n */\n getEntityTypes(entityGroups:Array<string>) {\n return new Promise((resolve, reject) => {\n var data = {EntityGroups: entityGroups}\n this.cw.runRequest('Ams/Designer/WOTemplates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get WorkOrder templates\n *\n * @category WorkOrders Admin\n * @return {Object} Returns Promise that represents a collection of all WorkOrder templates\n */\n getTemplates(entityType:string, includeComments:boolean=true, includeInstructions:boolean=true) {\n return new Promise((resolve, reject) => {\n var data = {EntityType: entityType, IncludeComments: includeComments, IncludeInstructions: includeInstructions}\n this.cw.runRequest('Ams/Designer/WOTemplates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get work order template by ID\n *\n * @category WorkOrders Admin\n * @param {number} [templateId] - The ID of the template to retrieve\n * @return {Object} Returns Promise that represents the WorkOrder template matching the provided ID\n */\n getTemplateById(templateId: number): Promise<any> {\n return new Promise((resolve, reject) => {\n this.getTemplatesByIds([templateId]).then((r: Array<any>) => {\n resolve(r[0])\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get work order templates by IDs\n *\n * @category WorkOrders Admin\n * @param {Array<number>} [templateIds] - The Entity Type(s) to return potential work orders for\n * @return {Object} Returns Promise that represents a collection of all WorkOrder templates matching the provided IDs\n */\n getTemplatesByIds(templateIds: Array<number>): Promise<Array<any>> {\n return new Promise((resolve, reject) => {\n var data: {WOTemplateIds?: Array<number>} = {}\n if (_.isArray(templateIds) && templateIds.length > 0) {\n data.WOTemplateIds = templateIds\n }\n this.cw.runRequest('Ams/WorkOrderTemplate/byIds', data).then((r: any) => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Update WorkOrder template\n *\n * @category WorkOrders Admin\n * @param {Object} wOTemplate - Obect that describes the WorkOrder Template\n * @return {Object} Returns Promise that represents a collection of all\n */\n updateTemplate(wOTemplate:Object) {\n let valid_fields = [\"AcctNum\", \"AutoCreateTask\", \"Cancel\", \"Comments\", \"CopyCustomFieldVal\", \"CycleFrom\", \"CycleIncludeWeekends\", \"CycleIntervalNum\", \"CycleIntervalUnit\", \"CycleType\", \"DaysToComplete\", \"DefaultProject\", \"DefaultProjectSid\", \"Description\", \"Effort\", \"ExpenseType\", \"Instructions\", \"IsReactive\", \"MaintScore\", \"NumDaysBefore\", \"Priority\", \"RequireAssetOnClose\", \"Shop\", \"Stage\", \"SubmitToEmployeeSid\", \"SupervisorEmployeeSid\", \"UnitsAccompDesc\", \"UnitsAccompDescLock\", \"WOCategory\", \"WOCustFieldCatId\", \"WOPrintTmpt\", \"WOTemplateId\", \"WorkMonth\"]\n return new Promise((resolve, reject) => {\n var data = wOTemplate\n this.cw.runRequest('Ams/Designer/WOTemplates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get template group rights for provided WorkOrder Templates\n *\n * @category WorkOrders Admin\n * @param {Array<number>} wOTemplateIds - Array one or more WorkOrder Template IDs\n * @return {Object} Returns Promise that represents a collection of all\n */\n getTemplateGroupRights(wOTemplateIds:Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateIds: wOTemplateIds}\n this.cw.runRequest('Ams/Designer/WOTemplates', data).then(r => { // TODO: Update this URL\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get template activity services for provided WorkOrder Templates\n *\n * @category WorkOrders Admin\n * @param {Array<number>} wOTemplateIds - Array one or more WorkOrder Template IDs\n * @return {Object} Returns Promise that represents a collection of all\n */\n getTemplateActivity(wOTemplateIds:Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateIds: wOTemplateIds}\n this.cw.runRequest('Ams/Designer/WOTemplateActivityService', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get fields which will be updated when provided WorkOrder Template instance closes\n *\n * @category WorkOrders Admin\n * @param {Array<number>} wOTemplateIds - Array one or more WorkOrder Template IDs\n * @return {Object} Returns Promise that represents a collection of all\n */\n getUpdateFields(wOTemplateIds:Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateIds: wOTemplateIds}\n this.cw.runRequest('Ams/Designer/WOTemplateUpdateFields', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get equipment\n *\n * @category WorkOrders Admin\n * @param {Array<number>} wOTemplateIds - WorkOrder Template ID\n * @return {Object} Returns Promise that represents a collection of all\n */\n getTemplateEquipment(wOTemplateId:number) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateId: wOTemplateId}\n this.cw.runRequest('Ams/Designer/WOTemplateEquipment', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get labor\n *\n * @category WorkOrders Admin\n * @param {Array<number>} wOTemplateIds - WorkOrder Template ID\n * @return {Object} Returns Promise that represents a collection of all\n */\n getTemplateLabor(wOTemplateId:number) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateId: wOTemplateId}\n this.cw.runRequest('Ams/Designer/WOTemplateLabor', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get material\n *\n * @category WorkOrders Admin\n * @param {number} wOTemplateId - WorkOrder Template ID\n * @return {Object} Returns Promise that represents a collection of all\n */\n getTemplateMaterial(wOTemplateId:number) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateId: wOTemplateId}\n this.cw.runRequest('Ams/Designer/WOTemplateMaterial', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get map layer fields configured for provided WorkOrder template\n *\n * @category WorkOrders Admin\n * @param {number} wOTemplateId - WorkOrder Template ID\n * @return {Object} Returns Promise that represents a collection of all\n */\n getTemplateMapLayerFields(wOTemplateId:number) {\n return new Promise((resolve, reject) => {\n var data = {WorkOrderTemplateId: wOTemplateId}\n this.cw.runRequest('Ams/Designer/WorkOrderTemplateMapLayerFields', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get tasks configured for provided WorkOrder template\n *\n * @category WorkOrders Admin\n * @param {number} wOTemplateId - WorkOrder Template ID\n * @return {Object} Returns Promise that represents a collection of all tasks on WorkOrder template\n */\n getTemplateTasks(wOTemplateId:number) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateId: wOTemplateId}\n this.cw.runRequest('Ams/Tasks/ByWorkOrderTemplate', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspections connected to provided WorkOrder template\n *\n * @category WorkOrders Admin\n * @param {number} wOTemplateId - WorkOrder Template ID\n * @return {Object} Returns Promise that represents a collection of all tasks on WorkOrder template\n */\n getRelatedInspectionTemplates(wOTemplateId:number) {\n return new Promise((resolve, reject) => {\n var data = {WOTemplateId: wOTemplateId}\n this.cw.runRequest('Ams/Designer/WOTemplateInspections', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class InspectionAdmin {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Get inspection templates\n *\n * @category Inspection Templates\n * @param {Array<string>} [entityTypes] - The Entity Type(s) to return potential inspections for\n * @param {boolean} [canCreate] - If true, only return templates the user can create, ignored if false or null, default is true\n * @param {Object} [options] - An object which can include: [IncludeInactive]: boolean, MaximumDateModified: Date, MinimumDateModified: Date, TemplateIds: Array<number>\n * @return {Object} Returns Promise that represents a collection of all Inspections matching the provided parameters\n */\n getTemplates(entityTypes?: Array<string>, canCreate?: boolean, options?: {IncludeInactive?: boolean, MaximumDateModified?: Date, MinimumDateModified?: Date, TemplateIds?: Array<number>}) {\n return new Promise((resolve, reject) => {\n var data: {EntityTypes?: Array<string>, CanCreate?: boolean, IncludeInactive?: boolean, MaximumDateModified?: Date, MinimumDateModified?: Date, TemplateIds?: Array<number>} = {}\n if(typeof(entityTypes)!=='undefined') {\n data.EntityTypes = entityTypes\n }\n data.CanCreate = typeof(canCreate)!=='undefined' ? canCreate : true\n if(typeof(options)==='object') {\n _.forIn(options, (v, k) => {\n data[k] = v\n })\n }\n this.cw.runRequest('Ams/InspectionTemplate/Templates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspection template by ID\n *\n * @category Inspection Templates\n * @param {number} [templateId] - The ID of the template to retrieve\n * @return {Object} Returns Promise that represents the Inspection template matching the provided ID\n */\n getTemplateById(templateId: number): Promise<any> {\n return new Promise((resolve, reject) => {\n this.getTemplatesByIds([templateId]).then((r: Array<any>) => {\n resolve(r[0])\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspection templates by IDs\n *\n * @category Inspection Templates\n * @param {Array<number>} [templateIds] - The Entity Type(s) to return potential inspections for\n * @return {Object} Returns Promise that represents a collection of all Inspection templates matching the provided IDs\n */\n getTemplatesByIds(templateIds: Array<number>): Promise<Array<any>> {\n return new Promise((resolve, reject) => {\n var data: {InspTemplateIds?: Array<number>} = {}\n if (_.isArray(templateIds) && templateIds.length > 0) {\n data.InspTemplateIds = templateIds\n }\n this.cw.runRequest('Ams/InspectionTemplate/byIds', data).then((r: any) => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nconst _ = require('lodash')\n\nexport class RequestAdmin {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n }\n\n /**\n * Get service request templates\n *\n * @category Requests Admin\n * @param {Object} searchData - search data\n * @return {Object} Returns Promise that represents a collection of all Service Request Templates\n */\n getTemplates(searchData: Object) {\n return new Promise((resolve, reject) => {\n var data = searchData\n this.cw.runRequest('Ams/ServiceRequestTemplate/Templates', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get request template by ID\n *\n * @category Request Templates\n * @param {number} [templateId] - The ID of the template to retrieve\n * @return {Object} Returns Promise that represents the Request template matching the provided ID\n */\n getTemplateById(templateId: number): Promise<any> {\n return new Promise((resolve, reject) => {\n var data = {ProblemSid: templateId}\n this.cw.runRequest('Ams/ServiceRequest/problemLeafBySid', data).then((r: any) => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nimport ReversibleMap from 'reversible-map'\nconst _ = require('lodash')\n\nexport class WorkOrderCosts {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Storage of object's active activityType\n */\n currentActivityType: string\n\n /**\n * @hidden\n */\n constructor(cw:any) {\n this.cw = cw\n this.currentActivityType = \"WorkOrder\"\n }\n\n /**\n * Get Cost Codes\n *\n * @category Labor Costs\n * @param {Array<number>} employeeSids - A list of Employee IDs for which to get the job codes.\n * @param {boolean} commonOnly - Set to true to get the Cost Codes that are common to ALL employees in the list, otherwise get all job codes that apply to at least one employee in the list.\n * @return {Object} Returns Promise that represents an object describing\n */\n getCodes(employeeSids: Object, commonOnly: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n EmployeeSids: employeeSids,\n CommonCodesOnly: commonOnly\n }\n this.cw.runRequest('Ams/LaborCost/CostCodes', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Job Codes\n *\n * @category Labor Costs\n * @return {Object} Returns Promise that represents an object describing\n */\n getJobCodes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/LaborCost/JobCodes').then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add WorkOrder Labor Costs\n *\n * @category WorkOrder Costs\n * @param {number} workOrderSid - Array of inspection labor costings\n * @param {number} hours - Number of hours to add\n * @param {Object} options - options for the work order\n * @return {Object} Returns Promise that represents an object describing\n */\n addLabor(workOrderSid: number, hours: number, options: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderSid: workOrderSid,\n Hours: hours\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n // TODO: ensure each object has Hours & InspectionId\n this.cw.runRequest('Ams/LaborCost/AddWorkOrderCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Labor Costs for WorkOrder(s)\n *\n * @category WorkOrder Costs\n * @param {Array<number>} workOrderSids - Array of request Ids to get costs for\n * @param {boolean} estimated - Whether to get estimates or actuals (defaults to false -- get actuals)\n * @return {Object} Returns Promise that represents an object describing\n */\n getLabor(workOrderSids: Array<number>, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n Estimated: estimated,\n WorkOrderSids: workOrderSids\n }\n this.cw.runRequest('Ams/LaborCost/WorkOrderCostsByWorkOrder', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete WorkOrder Labor Costs\n *\n * @category WorkOrder Costs\n * @param {Array<number>} laborCostIds - List of labor cost IDs to delete\n * @param {boolean} estimated - Whether to delete estimates or actuals (defaults to false -- delete actuals)\n * @return {Object} Returns Promise that represents an object describing\n */\n deleteLabor(laborCostIds: Array<number>, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n LaborCostIds: laborCostIds,\n Estimated: estimated\n }\n this.cw.runRequest('Ams/LaborCost/DeleteWorkOrderCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add WorkOrder Equipment Costs\n *\n * @category WorkOrder Costs\n * @param {Object} workOrderSid - the work order to add the equipment costs to\n * @param {Object} options - additional options\n * @return {Object} Returns Promise that represents an object describing\n */\n addEquipment(workOrderSid: number, options: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderSid: workOrderSid\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n // TODO: ensure each object has Hours & InspectionId\n this.cw.runRequest('Ams/EquipmentCost/AddWorkOrderCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Equipment Costs for WorkOrder(s)\n *\n * @category WorkOrder Costs\n * @param {number} workOrderSid - the work order to add the equipment costs to\n * @param {boolean} estimated - true to get estimated costs. defaults to false\n * @return {Object} Returns Promise that represents an object describing\n */\n // WorkOrderCostsByWorkOrderList<EquipmentCost>\n getEquipment(workOrderSid: number, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderSid: workOrderSid,\n Estimated: estimated\n }\n // TODO: ensure each object has Hours & InspectionId\n this.cw.runRequest('Ams/EquipmentCost/WorkOrderCostsByWorkOrder', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete WorkOrder Equipment Costs\n *\n * @category WorkOrder Costs\n * @param {Object} \n * @return {Object} Returns Promise that represents an object describing\n */\n deleteEquipment(equipmentCostIds: Array<number>, estimated: boolean = false) { // \"WorkOrderId\", \"WorkOrderSid\", \"Estimated\", \"MaterialSids\", \"Units\", \"AcctNum\", \"Source\", \"TransDate\", \"ContractorSids\", \"ContractorMaterialId\", \"ContractorMaterialDescription\", \"ContractorMaterialCost\", \"TaskIds\", \"Entities\", \"CombineIssuesByMaterialSid\"\n return new Promise((resolve, reject) => {\n var data = {\n EquipmentCostIds: equipmentCostIds,\n Estimated: estimated\n }\n this.cw.runRequest('Ams/EquipmentCost/DeleteWorkOrderCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add WorkOrder Material Costs\n *\n * @category WorkOrder Costs\n * @param {number} workOrderSid - Work Order SID number to add the material to\n * @param {number} units - Decimal units for material \n * @param {Object} options - Additional work order options\n * @param {boolean} combineIssuesByMaterialSid - Combine issues with the same MaterialSid into a single commit, default is true\n * @return {Object} Returns Promise that represents a collection describing the work order material costs\n */\n addMaterial(workOrderSid: number, units: number, options: Object, combineIssuesByMaterialSid: boolean = true) { // \"WorkOrderId\", \"WorkOrderSid\", \"Estimated\", \"MaterialSids\", \"Units\", \"AcctNum\", \"Source\", \"TransDate\", \"ContractorSids\", \"ContractorMaterialId\", \"ContractorMaterialDescription\", \"ContractorMaterialCost\", \"TaskIds\", \"Entities\", \"CombineIssuesByMaterialSid\"\n return new Promise((resolve, reject) => {\n var data = {\n Units: units,\n WorkOrderSid: workOrderSid,\n CombineIssuesByMaterialSid: combineIssuesByMaterialSid\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Ams/MaterialCost/AddWorkOrderCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Material Costs for WorkOrder(s)\n *\n * @category WorkOrder Costs\n * @param {number} workOrderSid - the work order to add the equipment costs to\n * @param {boolean} estimated - true to get estimated costs. defaults to false and gets actuals.\n * @return {Object} Returns Promise that represents an object describing\n */\n getMaterial(workOrderSid: number, estimated: boolean = false) { // \"WorkOrderId\", \"WorkOrderSid\", \"Estimated\", \"MaterialSids\", \"Units\", \"AcctNum\", \"Source\", \"TransDate\", \"ContractorSids\", \"ContractorMaterialId\", \"ContractorMaterialDescription\", \"ContractorMaterialCost\", \"TaskIds\", \"Entities\", \"CombineIssuesByMaterialSid\"\n return new Promise((resolve, reject) => {\n var data = {\n WorkOrderSid: workOrderSid,\n Estimated: estimated\n }\n this.cw.runRequest('Ams/MaterialCost/AddWorkOrderCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete WorkOrder Material Costs\n *\n * @category WorkOrder Costs\n * @param {Array<number>} materialCostIds - list of material cost IDs to delete\n * @param {boolean} estimated - true to delete the estimated costs. defaults to false and deletes actuals.\n * @return {Object} Returns Promise that represents an object describing\n */\n deleteMaterial(materialCostIds: number, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n MaterialCostIds: materialCostIds,\n Estimated: estimated\n }\n this.cw.runRequest('Ams/MaterialCost/DeleteWorkOrderCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n}\n","import { CWError } from './error'\nimport ReversibleMap from 'reversible-map'\nconst _ = require('lodash')\n\nexport class InspectionCosts {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Storage of object's active activityType\n */\n currentActivityType: string\n\n /**\n * @hidden\n */\n constructor(cw:any) {\n this.cw = cw\n this.currentActivityType = \"Inspection\"\n }\n\n /**\n * Get Cost Codes\n *\n * @category Labor Costs\n * @param {Array<number>} employeeSids - A list of Employee IDs for which to get the job codes.\n * @param {boolean} commonOnly - Set to true to get the Cost Codes that are common to ALL employees in the list, otherwise get all job codes that apply to at least one employee in the list.\n * @return {Object} Returns Promise that represents an object describing\n */\n getCodes(employeeSids: Object, commonOnly: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n EmployeeSids: employeeSids,\n CommonCodesOnly: commonOnly\n }\n this.cw.runRequest('Ams/LaborCost/CostCodes', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Job Codes\n *\n * @category Labor Costs\n * @return {Object} Returns Promise that represents an object describing\n */\n getJobCodes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/LaborCost/JobCodes').then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Inspection Labor Costs\n *\n * @category Inspection Costs\n * @param {number} inspectionId - Inspection ID to add labor costs to\n * @param {number} hours - The hours to add to the inspection\n * @param {Object} options - Additional settings for hours setting\n * @param {boolean} estimated - Boolean, get estimated or real costs, defaults to false (get real by default)\n * @return {Object} Returns Promise that represents an object describing\n */\n addLabor(inspectionId: number, hours: number, options?: object, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n Estimated: estimated,\n InspectionIds: inspectionId,\n Hours: hours\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n this.cw.runRequest('Ams/LaborCost/AddInspectionCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Labor Costs for a specific list of Inspections\n *\n * @category Inspection Costs\n * @param {Array<int>} inspectionIds - An array of inspection IDs to get associated costs for.\n * @param {boolean} estimated - Boolean, get estimated or real costs, defaults to false (get real by default)\n * @return {Object} Returns Promise that represents an object describing\n */\n getLabor(inspectionIds: Array<number>, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n Estimated: estimated,\n InspectionIds: inspectionIds\n }\n this.cw.runRequest('Ams/LaborCost/InspectionCostsByInspection', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Inspection Labor Costs\n *\n * @category Inspection Costs\n * @param {Array<int>} laborCostIds - An array of inspection labor cost IDs to delete\n * @param {boolean} estimated - Boolean, delete estimated or real costs, defaults to false (delete real by default)\n * @return {Object} Returns Promise that represents an object describing\n */\n deleteLabor(laborCostIds: Array<number>, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n Estimated: estimated,\n reqLaborCostIds: laborCostIds\n }\n this.cw.runRequest('Ams/LaborCost/DeleteInspectionCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Inspection Equipment Costs\n *\n * @category Inspection Costs\n * @param {Object} inspectionId - the inspection to add the equipment costs to\n * @param {Object} options - additional options\n * @return {Object} Returns Promise that represents an object describing\n */\n addEquipment(inspectionId: number, options: Object) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionId: inspectionId\n }\n if(typeof(options)!='undefined') {\n data = _.merge(data, options)\n }\n // TODO: ensure each object has Hours & InspectionId\n this.cw.runRequest('Ams/EquipmentCost/AddInspectionCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n \n /**\n * Get Equipment Costs for Inspection(s)\n *\n * @category Inspection Costs\n * @param {Array<number>} inspectionIds - the inspection to get the equipment costs for.\n * @param {Object} estimated - get estimated equipment costs. Defaults to false.\n * @return {Object} Returns Promise that represents an object describing\n */\n getEquipment(inspectionIds: number, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionIds: inspectionIds,\n Estimated: estimated\n }\n this.cw.runRequest('Ams/EquipmentCost/InspectionCostsByInspection', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Inspection Equipment Costs\n *\n * @category Inspection Costs\n * @param {Array<number>} equipmentCostIds - the equipment cost IDs to delete.\n * @param {Object} estimated - delete estimated equipment costs. Defaults to false.\n * @return {Object} Returns Promise that represents an object describing\n */\n deleteEquipment(equipmentCostIds: Array<number>, estimated: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n EquipmentCostIds: equipmentCostIds,\n Estimated: estimated\n }\n this.cw.runRequest('Ams/EquipmentCost/DeleteInspectionCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n}\n","import { CWError } from './error'\nimport ReversibleMap from 'reversible-map'\nconst _ = require('lodash')\n\nexport class RequestCosts {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Storage of object's active activityType\n */\n currentActivityType: string\n\n /**\n * @hidden\n */\n constructor(cw:any) {\n this.cw = cw\n this.currentActivityType = \"Request\"\n }\n\n /**\n * Get Cost Codes\n *\n * @category Labor Costs\n * @param {Array<number>} employeeSids - A list of Employee IDs for which to get the job codes.\n * @param {boolean} commonOnly - Set to true to get the Cost Codes that are common to ALL employees in the list, otherwise get all job codes that apply to at least one employee in the list.\n * @return {Object} Returns Promise that represents an object describing\n */\n getCodes(employeeSids: Object, commonOnly: boolean = false) {\n return new Promise((resolve, reject) => {\n var data = {\n EmployeeSids: employeeSids,\n CommonCodesOnly: commonOnly\n }\n this.cw.runRequest('Ams/LaborCost/CostCodes', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Job Codes\n *\n * @category Labor Costs\n * @return {Object} Returns Promise that represents an object describing\n */\n getJobCodes() {\n return new Promise((resolve, reject) => {\n this.cw.runRequest('Ams/LaborCost/JobCodes').then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Add Request Labor Costs\n *\n * @category Request Costs\n * @param {Object} requestCosts - Array of inspection labor costings\n * @return {Object} Returns Promise that represents an object describing\n */\n addLabor(requestCosts: Array<Object>) {\n return new Promise((resolve, reject) => {\n var data = requestCosts\n // TODO: ensure each object has Hours & InspectionId\n this.cw.runRequest('Ams/LaborCost/AddRequestCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get Labor Costs for Request(s)\n *\n * @category Request Costs\n * @param {Array<number>} requestIds - Array of request Ids to get costs for\n * @return {Object} Returns Promise that represents an object describing\n */\n getLabor(requestIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestIds: requestIds\n }\n this.cw.runRequest('Ams/LaborCost/RequestCostsByRequest', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Request Labor Costs\n *\n * @category Request Costs\n * @param {Array<number>} laborCostIds - Array of request labor cost Ids to delete\n * @return {Object} Returns Promise that represents an object describing\n */\n deleteLabor(laborCostIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n LaborCostIds: laborCostIds\n }\n this.cw.runRequest('Ams/LaborCost/DeleteRequestCosts', data).then((response: any) => {\n resolve(response.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n}\n","import { CWError } from './error'\nimport { General } from './general'\nimport { Attachments } from './attachments'\nimport { ActivityLinks } from './activity_link'\nimport { Gis } from './gis'\nimport { MessageQueue } from './message_queue'\nimport { Search } from './search'\nimport { Query } from './query'\nimport { Report } from './report'\nimport { Request } from './request'\nimport { Inspection } from './inspection'\nimport { WorkOrder } from './workorder'\nimport { Briefcase } from './briefcase'\nimport { CaseData } from './case_data'\nimport { CaseFinancial } from './case_financial'\nimport { CaseWorkflow} from './case_workflow'\nimport { CasePeople } from './case_people'\nimport { CaseAssets } from './case_assets'\nimport { CaseFlags } from './case_flags'\nimport { CaseAdmin } from './case_admin'\nimport { Comments } from './comments'\nimport { WorkOrderAdmin } from './workorder_admin'\nimport { InspectionAdmin } from './inspection_admin'\nimport { RequestAdmin } from './request_admin'\nimport { WorkOrderCosts } from './workorder_costs'\nimport { InspectionCosts } from './inspection_costs'\nimport { RequestCosts } from './request_costs'\n\nconst https = require('https')\nconst querystring = require('querystring')\nconst _ = require('lodash')\nconst FormData = require('form-data')\nconst fs = require('fs')\nconst path = require('path')\n// const mimetypes = require('mime-types')\nconst axios = require('axios')\n\ninterface postData {\n data?: string\n token?: string\n file?: any\n}\n\ninterface Citywork {\n}\n\n/**\n * Core class Cityworks with most of the authentication and install capabilities functions\n */\nclass Cityworks implements Citywork {\n /**\n * The domain of the cityworks install. Defaults to Cityworks Online\n */\n private base_url: string\n /**\n * Stores the currently in use authentication token\n */\n private Token?: string\n /**\n * Stores the login username\n */\n private login?: string\n /**\n * Holds the login password\n */\n private password?: string\n /**\n * Holds the GIS Token for GIS-based Authentication (Portal)\n */\n private gisToken?: string\n /**\n * Holds the GIS Token URL for GIS-based Authentication (Portal)\n */\n private gisTokenUrl?: string\n /**\n * Stores settings including path (defaults to \"cityworks\"), secure (defaults to true), expires (defaults to null - does not expire), default_domain\n */\n private settings: {\n path: string,\n secure: boolean,\n expires: any,\n default_domain?: any,\n version: number\n }\n error?: any\n\n private extensions: Object\n private features: Object\n private potential_loads: Array<string>\n\n /**\n * Contructor for a new cityworks instance's object, allows one to optionally configure the domain and other settings right from the get-go\n * @param {string} [base_url] - The base url of your Cityworks instance\n * @param {object} [settings] - The settings for your Cityworks site. Full list: {path: (defaults to \"cityworks\"), secure: defaults to true, expires: defaults to NULL, does not expire, default_domain: defaults to NULL, uses default user domain, version: defaults to 23, for 15.x set to 15}\n * @param {array} [load] - allows user to choose which modules to load and make available. Full availability array: ['general', 'activity_link', 'message_queue', 'gis', 'workorder', 'inspection', 'request', 'case']\n */\n constructor(base_url?: string, settings?: Object, load?: Array<string>) {\n this.base_url = 'cityworksonline'\n this.extensions = {\"UnknownExtension\": 0, \"CwAnalytics\": 1, \"WebHooks\": 2, \"PLLPublicApp\": 3, \"ActivityUpdate\": 4, \"SingleSignOn\": 5}\n this.features = {\"UnknownFeature\": 0, \"ViewInspections\": 1, \"EditInspections\": 2, \"ViewServiceRequest\": 3, \"EditServiceRequest\": 4, \"ViewWorkOrder\": 5, \"EditWorkOrder\": 6, \"EquipmentCheckOut\": 7, \"OfficeField\": 8, \"Respond\": 9, \"Eurl\": 10, \"PaverInterface\": 11, \"Contracts\": 12, \"Storeroom\": 13, \"PLL\": 14, \"Cw4XL\": 15, \"TableEditor\": 16, \"CCTVInterface\": 17, \"MobileAndroid\": 18, \"MobileiOS\": 19, \"PerformanceBudgeting\": 20, \"Insights\": 21, \"RespondCase\": 22, \"RespondInspection\": 23, \"RespondServiceRequest\": 24, \"RespondTaskManager\": 25, \"RespondWorkOrder\": 26, \"Workload\": 27, \"OpX\": 28, \"TrimbleUnityMobile\": 29, \"TrimbleVegetationManager\": 30}\n this.settings = {\n path: 'cityworks',\n secure: true,\n expires: null,\n default_domain: null,\n version: 23\n }\n this.potential_loads = ['general', 'activity_link', 'message_queue', 'gis', 'search', 'request', 'report', 'case', 'case_financial']\n if(typeof(base_url)!='undefined') {\n this.configure(base_url, settings, load)\n }\n }\n\n /**\n * Configure a new cityworks instance's domain and other settings\n *\n * @param {string} [base_url] - The first color, in hexadecimal format.\n * @param {object} [settings] - The second color, in hexadecimal format.\n * @param {array} [load] - allows user to choose which modules to load and make available. Full availability array: ['general', 'activity_link', 'message_queue', 'gis', 'search', 'workorder', 'inspection', 'request', 'report', 'case']\n * @return {boolean} Returns true if successful, otherwise, throws error\n */\n configure(base_url?: string, settings?: Object, load?: Array<string>) {\n if(typeof base_url !== 'undefined') { this.base_url = base_url } else { this.base_url = 'cityworksonline' }\n this.settings = {\n path: 'cityworks',\n secure: true,\n expires: null,\n default_domain: null,\n version: 23\n }\n\n if(typeof(settings)!='undefined') {\n _.forEach(settings, (v,k) => {\n if(typeof(this.settings[k])!='undefined') {this.settings[k] = v}\n })\n }\n }\n\n /**\n * Send a request to the Cityworks API\n *\n * If one ever needs to access or call an unimplemented API endpoint of a Cityworks install, one can call this method directly with the path and data payload:\n *\n * `cityworks.runRequest(service_path, post_data)`\n *\n * @param {string} service_path - The path to the particular endpoint\n * @param {any} post_data - The data object to be sent to the Cityworks API\n * @param {string} post_file - The path of the file to send to the Cityworks API\n * @return {Object} Returns Promise object that represents the json object returned from the Cityworks API\n */\n runRequest(service_path: string, post_data?: any, post_file?: string) {\n return new Promise((resolve, reject) => {\n let pd = {} as postData\n var file_name = ''\n var file_type = ''\n\n if(typeof(post_data) !== 'undefined') {\n pd.data = JSON.stringify(post_data)\n }\n\n if(this.settings.version<23 && typeof(this.Token) !== 'undefined' && this.Token != '' && service_path!='General/Authentication/CityworksOnlineAuthenticate' && service_path!='General/Authentication/Authenticate') {\n pd.token = this.Token\n }\n\n let obj: {\n Status: number,\n Message: string\n }\n\n let options = {\n hostname: this.base_url,\n port: 443,\n path: '/' + this.settings.path + '/services/' + service_path,\n method: 'GET',\n headers: {},\n timeout: 10000000\n }\n if(this.settings.secure==false) {\n options.port = 80\n }\n if(this.settings.version>=23 && typeof(this.Token) !== 'undefined' && this.Token != '' && service_path!='General/Authentication/CityworksOnlineAuthenticate' && service_path!='General/Authentication/Authenticate') {\n _.set(options, 'headers.Authorization', 'cityworks ' + this.Token)\n if(!_.isEmpty(pd)) {\n _.set(options, 'method', 'POST')\n }\n }\n\n if(typeof(post_file)!=='undefined') {\n // file_name = path.basename(post_file)\n // file_type = mimetypes.lookup(path.extname(post_file))\n var cw_url = 'https://'\n if(options.port==80) {\n cw_url = 'http://'\n }\n cw_url += options.hostname+options.path\n if(this.settings.version<23 && typeof(this.Token) !== 'undefined' && this.Token != '' && service_path!='General/Authentication/CityworksOnlineAuthenticate' && service_path!='General/Authentication/Authenticate') {\n cw_url += '?token='+this.Token\n }\n axios.postForm(cw_url, {\n data: JSON.stringify(post_data),\n file: fs.createReadStream(post_file)\n }, {\n headers: options.headers\n }).then((r) => {\n resolve(r.data)\n })\n } else {\n // if(service_path=='Pll/CaseFlags/DeleteByCaObjectId') {\n // console.log(options)\n // console.log(pd)\n // process.exit(0)\n // }\n // TODO: check if still necessary\n if(service_path=='Pll/CaseRelDocs/ByCaObjectId' && !_.isEmpty(pd)){\n _.set(options, 'path', options.path + '?' + querystring.stringify(pd))\n } else {\n _.set(options, 'headers.Content-Type', 'application/x-www-form-urlencoded')\n if(!_.isEmpty(pd)){\n _.set(options, 'headers.Content-Length', Buffer.byteLength(querystring.stringify(pd)))\n }\n }\n let request = https.request(options, (response) => {\n let str=''\n response.on('error',function(e){\n console.log(e, 'Caught on error')\n reject(new CWError(13, \"Unknown error.\", e))\n })\n\n response.on('data',function(chunk){\n str+=chunk\n })\n\n response.on('end',function(){\n if(!_.isUndefined(_.findKey(Attachments.downloadUrls(), function(o) { return o === service_path })) || !_.isUndefined(_.findKey(Report.downloadUrls(), function(o) { return o === service_path }))) {\n // This is an attachment or report download call\n if(_.findKey(Report.downloadUrls(), function(o) { return o === service_path })==='case' && response.statusCode==500) {\n reject(new CWError(13, 'Could not find report template for specified case or other server error occurred.'))\n } else {\n resolve(str);\n }\n } else {\n try {\n var test_str = JSON.stringify(str) + \"[test string]\"\n if(test_str.match(/\\<h2\\>Object\\ moved\\ to/)==null) {\n var obj=JSON.parse(str)\n if(typeof(obj)=='undefined') {\n // failed\n reject(new CWError(10, 'No response received from Cityworks API.'))\n } else if(typeof(obj)!='undefined') { // && typeof(obj.Value)!='undefined'\n switch(obj.Status) {\n case 1:\n reject(new CWError(1, 'Error', obj))\n break;\n case 2:\n reject(new CWError(2, 'Unauthorized', obj))\n break;\n case 3:\n reject(new CWError(3, 'InvalidCredentials', obj))\n break;\n case 0:\n default:\n if(typeof(obj)!='undefined' && typeof(obj.Value)=='undefined' && obj.Status==0) {\n resolve(true);\n } else {\n resolve(obj);\n }\n break;\n }\n } else {\n reject(new CWError(4, \"Unknown error.\", {options: options, postedData: pd, api_returned_string: obj}))\n }\n } else {\n reject(new CWError(5, \"Error parsing JSON. Cityworks returned HTML.\", {response: str}))\n }\n } catch (e) {\n if (e instanceof SyntaxError) {\n // console.log('try/catch error on JSON', e)\n reject(new CWError(6, \"Error parsing JSON.\", e))\n } else {\n console.log('try/catch error on JSON - but not an instance of SyntaxError')\n reject(new CWError(7, \"Error parsing JSON.\", e))\n }\n }\n }\n })\n })\n request.write(querystring.stringify(pd))\n request.end() \n }\n })\n }\n\n /**\n * Authenticate with the Cityworks API and store an access token for use. Stores the token on cityworks.Token.\n * @param {string} login - User's login name\n * @param {password} password - User's password\n * @return {Object} Returns Promise object that represents a boolean which tells you the login succeeded (true) or failed (false).\n */\n authenticate(login: string, password: string) {\n return new Promise((resolve, reject) => {\n let data = {LoginName:login, Password:password}\n let path = 'General/Authentication/Authenticate'\n if(this.base_url == 'cityworksonline') {\n path = 'General/Authentication/CityworksOnlineAuthenticate'\n }\n this.runRequest(path, data).then((response: any) => {\n if(response.Status>0) {\n // failed\n reject(new CWError(100, response.Message))\n } else if(typeof(response.Value)!='undefined' && typeof(response.Value.Token)!='undefined') {\n this.login = login\n this.password = password\n this.Token = response.Value.Token\n resolve(true)\n } else {\n // failed\n reject(new CWError(11, 'Unknown Error'))\n }\n }).catch(error => {\n reject(error);\n })\n })\n }\n\n /**\n * Current version\n * @return {number} Returns a number that is the currently configured version of the Cityworks platform. Defaults to \"23\".\n */\n v() {\n return this.settings.version\n }\n\n /**\n * Authenticate a username with a GIS Token\n * @param {login} - Gis user name, should match a Cityworks employee login name\n * @param {string} gisToken - Gis Oauth2 access token\n * @param {string} gisTokenUrl - Base url to GIS server (not the '/generateToken' endpoint)\n * @param {number} [expires] - Authenticate to Cityworks for a specified number of milliseconds, defaults to 2 weeks\n */\n authenticateWithGISToken(login: string, gisToken: string, gisTokenUrl: string, expires?: number) {\n this.login = login\n this.gisToken = gisToken\n this.gisTokenUrl = gisTokenUrl\n if(typeof(expires)!='undefined') {\n expires = 1209600000\n }\n\n return new Promise((resolve, reject) => {\n let path = 'General/Authentication/AuthenticateGisToken'\n let data = { LoginName:this.login, GisToken: this.gisToken, GisTokenUrl: this.gisTokenUrl, Expires: expires}\n\n this.runRequest(path, data).then((response: any) => {\n if((typeof(response.Status)!='undefined' && response.Status>0)) {\n // failed\n // TODO: CWError here.\n } else if(typeof(response.Value)!='undefined' && typeof(response.Value.Token)!='undefined') {\n this.Token = response.Value.Token\n resolve(true)\n } else {\n // failed\n resolve(false)\n }\n }).catch(error => {\n throw error\n })\n })\n }\n\n /**\n * Validate provided token\n * @param {string} token - User's login name\n * @param {boolean} [set] - Set a valid token as the cityworks instance's active token\n * @return {Object} Returns Promise object that represents a boolean which apprises one of the token's validity and that is was set (true) or throws an error if was not valid (and not set).\n */\n validateToken(token:string, set?:boolean) {\n return new Promise((resolve, reject) => {\n if(typeof(set)=='undefined') {\n let set = false\n }\n let data = { Token: token }\n let path = 'General/Authentication/Validate'\n this.runRequest(path, data).then((response: any) => {\n if(response.Status>0) {\n // failed\n resolve(false)\n } else {\n if(set) {\n this.Token = token\n }\n resolve(response.Value)\n }\n }).catch(error => {\n throw error\n })\n })\n }\n\n /**\n * Set a token you've retrieved from your storage system as the active token for the cityworks instance. Note that this doesn't check the token for validity.\n * @param {token} token - The token string to set as the active token.\n * @return {boolean} Returns a boolean which apprises one that the token was set (true) or not set (false).\n */\n setToken(token) {\n if(token!='' && token!=null) {\n this.Token = token\n return true\n } else {\n return false\n }\n }\n\n /**\n * Get currently set, valid token\n * @param {token} token - The token string to set as the active token.\n * @return {string} Returns a string which is the currently-set token or the boolean false value if no (valid) token set\n */\n getToken() {\n if(this.Token=='' || this.Token==null) {\n return false\n } else {\n return this.Token\n }\n }\n\n /**\n * Revoke all current user's tokens or only tokens created before a particular date and time.\n * @param {number} [revokeBefore] - Datetime as an Epoch integer (number), if you wish to revoke only tokens created before a particular datetime\n * @return {Object} Returns Promise object that represents a boolean which apprises one of the revocation outcome's success (true) or failure (false)\n */\n revokeToken(revokeBefore?:number) {\n return new Promise((resolve, reject) => {\n let data = { RevokeDate: revokeBefore }\n let path = 'General/Token/RevokeUser'\n this.runRequest(path, data).then((response: any) => {\n if((typeof(response.Status)!='undefined' && response.Status>0)) {\n // failed\n resolve(false)\n } else {\n resolve(true)\n }\n }).catch(error => {\n throw error\n })\n })\n }\n\n // App data\n\n /**\n * Get the localization settings for current Cityworks install\n * @return {Object} Returns Promise object that represents an Object which contains all the localization settings for the current Cityworks install\n */\n getLocalizationSettings() {\n return new Promise((resolve, reject) => {\n let path = 'General/Localization/LocalizationSettings'\n this.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Get the system timezone options for current Cityworks install\n * @return {Object} Returns Promise object that represents an Object which contains all the timezone settings for the currentCityworks install\n */\n getTimezoneOptions() {\n return new Promise((resolve, reject) => {\n let path = 'General/Localization/TimeZones'\n this.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Get the current install's location information\n * @return {Object} Returns Promise object that represents an Object which contains the location information\n */\n getCurrentLocation() {\n return new Promise((resolve, reject) => {\n let path = 'General/AppData/CurrentLocation'\n this.runRequest(path, {}).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n // Licensing Checks\n /**\n * Check if a particular license is available to the currently-authenticated user\n * @param {string} area - Area of access\n * @param {string} service - Service to access\n * @return {boolean} Returns Promise object that represents a boolean which informs access is granted (true) or denied (false)\n */\n licensedApiCheck(area: string, service: string) {\n return new Promise((resolve, reject) => {\n let data = {\n \"Area\": area,\n \"Service\": service\n }\n let path = 'General/AppData/SelectedEntities'\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Check if a current Cityworks install is licensed to use a particular extension\n *\n * Possible extensions currently include: \"UnknownExtension\", \"CwAnalytics\", \"WebHooks\", \"PLLPublicApp\", \"ActivityUpdate\", \"SingleSignOn\"\n *\n * @param {string} extension - Extension name\n * @return {boolean} Returns Promise object that represents a boolean which informs extension is licensed (true) or not (false)\n */\n licensedExtensionCheck(extension: string) {\n return new Promise((resolve, reject) => {\n if(typeof(this.extensions[extension])=='undefined') {\n reject(new CWError(4, 'Extension provided does not exist or is mispelled.', {'provided': extension, 'available': this.extensions}))\n }\n let data = {\n \"Extension\": this.extensions[extension]\n }\n let path = 'General/Authorization/LicensedExtensionCheck'\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Check a whole list to see if current Cityworks install is licensed to use extensions\n *\n * Possible extensions currently include: \"UnknownExtension\", \"CwAnalytics\", \"WebHooks\", \"PLLPublicApp\", \"ActivityUpdate\", \"SingleSignOn\"\n *\n * @param {Array<string>} extension - Extension names\n * @return {Object} Returns Promise object that represents a boolean which informs extension is licensed (true) or not (false)\n */\n licensedExtensionsCheck(extensions: Array<string>) {\n return new Promise((resolve, reject) => {\n var data: { Extensions: Array<number> } = {\n Extensions: []\n }\n _.forEach(extensions, (v) => {\n if(typeof(this.extensions[v])=='undefined') {\n reject(new CWError(5, 'Extension provided does not exist or is mispelled.', {'provided': v, 'available': this.extensions}))\n } else {\n data.Extensions.push(this.extensions[v])\n }\n })\n let path = 'General/Authorization/LicensedExtensionsCheck'\n this.runRequest(path, data).then((response: any) => {\n let rez: Object = {}\n // reverse boolean to numeric dictionary to a boolean to string dictionary\n let inv_extensions = _.invert(this.extensions)\n _.forEach(response, (ext_num, bool) => {\n if(typeof(inv_extensions[ext_num])=='undefined') {\n reject(new CWError(6, 'Extension index provided does not exist or isn\\'t configured properly.', {'provided_num_returned': ext_num, 'available': this.extensions}))\n } else {\n // Put string name of extension in rezponse object and set boolean on it.\n rez[inv_extensions[ext_num]] = bool\n }\n })\n resolve(rez)\n })\n })\n }\n\n /**\n * Check if current user is licensed to use a feature:\n *\n * \"UnknownFeature\", \"ViewInspections\", \"EditInspections\", \"ViewServiceRequest\", \"EditServiceRequest\", \"ViewWorkOrder\", \"EditWorkOrder\", \"EquipmentCheckOut\", \"OfficeField\", \"Respond\", \"Eurl\", \"PaverInterface\", \"Contracts\", \"Storeroom\", \"PLL\", \"Cw4XL\", \"TableEditor\", \"CCTVInterface\", \"MobileAndroid\", \"MobileiOS\", \"PerformanceBudgeting\", \"Insights\", \"RespondCase\", \"RespondInspection\", \"RespondServiceRequest\", \"RespondTaskManager\", \"RespondWorkOrder\", \"Workload\", \"OpX\", \"TrimbleUnityMobile\", \"TrimbleVegetationManager\"\n *\n * @param {string} [feature] - Feature to check to see if ciurrently authenticated user can utilize\n * @return {Object} Returns Promise object that represents a boolean which communicates license state as licensed (true) or not (false)\n */\n licensedFeatureCheck(feature: string) {\n return new Promise((resolve, reject) => {\n if(typeof(this.features[feature])=='undefined') {\n reject(new CWError(7, 'Feature provided does not exist or is mispelled.', {'provided': feature, 'available': this.features}))\n }\n let data = {\n \"Feature\": this.features[feature]\n }\n let path = 'General/Authorization/LicensedFeatureCheck'\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Check if current user is licensed to use features:\n *\n * \"UnknownFeature\", \"ViewInspections\", \"EditInspections\", \"ViewServiceRequest\", \"EditServiceRequest\", \"ViewWorkOrder\", \"EditWorkOrder\", \"EquipmentCheckOut\", \"OfficeField\", \"Respond\", \"Eurl\", \"PaverInterface\", \"Contracts\", \"Storeroom\", \"PLL\", \"Cw4XL\", \"TableEditor\", \"CCTVInterface\", \"MobileAndroid\", \"MobileiOS\", \"PerformanceBudgeting\", \"Insights\", \"RespondCase\", \"RespondInspection\", \"RespondServiceRequest\", \"RespondTaskManager\", \"RespondWorkOrder\", \"Workload\", \"OpX\", \"TrimbleUnityMobile\", \"TrimbleVegetationManager\"\n *\n * @param {Array<string>} [feature] - Features to check to see if currently authenticated user can utilize\n * @return {Object} Returns Promise object that represents a boolean which communicates license state as licensed (true) or not (false)\n */\n licensedFeaturesCheck(features: Array<string>) {\n return new Promise((resolve, reject) => {\n var data: { Features: Array<number> } = {\n Features: []\n }\n _.forEach(features, (v: string) => {\n if(typeof(this.features[v])=='undefined') {\n reject(new CWError(8, 'Feature provided does not exist or is mispelled.', {'provided': v, 'available': this.features}))\n } else {\n data.Features.push(this.features[v])\n }\n })\n let path = 'General/Authorization/LicensedFeaturesCheck'\n this.runRequest(path, data).then((response: any) => {\n let rez: Object = {}\n // reverse boolean to numeric dictionary to a boolean to string dictionary\n let inv_features = _.invert(this.features)\n _.forEach(response.Value, (feat_num, bool) => {\n if(typeof(inv_features[feat_num])=='undefined') {\n reject(new CWError(9, 'Feature index provided does not exist or isn\\'t configured properly.', {'provided': feat_num, 'available': inv_features}))\n } else {\n // Put string name of extension in rezponse object and set boolean on it.\n rez[inv_features[feat_num]] = bool\n }\n })\n resolve(rez)\n })\n })\n }\n\n // LicensedServicesCheck\n // Check if current user is licensed to use services\n // List req ServicesList of 'Area/Service', i.e. ['AMS/Inspection','AMS/WorkOrder','PLL/Case']\n /**\n * Check if current user is licensed to use services. List req ServicesList of 'Area/Service', i.e.:\n *\n * ['AMS/Inspection','AMS/WorkOrder','PLL/Case']\n *\n * @param {Array<string>} [services] - Services to check to see if currently authenticated user can utilize\n * @return {Object} Returns Promise object that represents a boolean which communicates license state as licensed (true) or not (false)\n */\n licensedServicesCheck(services: Array<string>) {\n return new Promise((resolve, reject) => {\n let path = 'General/Authorization/LicensedServicesCheck'\n var data: { Services: Array<string> } = {\n Services: services\n }\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Get a list of CityworksOnline sites for this user\n *\n * @param {string} [login] - Login Name to use when checking. Defaults to previously-stored login name.\n * @param {string} [password] - Password to use when checking. Defaults to previously-stored password.\n * @return {Object} Returns Promise object that represents an array of cityworks online sites available to this user.\n */\n cityworksOnlineSites(login?: string, password?: string) {\n return new Promise((resolve, reject) => {\n let path = 'General/Authentication/CityworksOnlineSites'\n var data = {\n LoginName: (typeof(login)!='undefined') ? login: this.login,\n Password: (typeof(password)!='undefined') ? password : this.password\n }\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Get a list of Domains (not tld, but organizations) in the currently-connected Cityworks install\n *\n * @return {Object} Returns Promise object that represents a collection of the configured domains.\n */\n domains() {\n return new Promise((resolve, reject) => {\n let path = 'General/Authentication/Domains'\n var data = {}\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Get a list of Domains (not tld, but organizations) in the currently-connected Cityworks install\n *\n * @param {string} [login] - Optional login name to get user information for. Defaults to currently-set user name used for login.\n * @return {Object} Returns Promise object that represents an Object with the user information\n */\n user(login?: string) {\n return new Promise((resolve, reject) => {\n let path = 'General/Authentication/User'\n let data = { LoginName: (typeof(login)!='undefined') ? login: this.login }\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Get the software version number of the currently-connected Cityworks install\n *\n * @return {Object} Returns Promise object that represents a string of the version number\n */\n version() {\n return new Promise((resolve, reject) => {\n let path = 'General/Authentication/Version'\n var data = {}\n this.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n}\n\nconst cw = new Cityworks()\n\nconst general = new General(cw)\nconst activity_link = new ActivityLinks(cw)\nconst message_queue = new MessageQueue(cw)\nconst search = new Search(cw)\nconst query = new Query(cw)\nconst gis = new Gis(cw)\nconst request = new Request(cw)\nconst inspection = new Inspection(cw)\nconst workorder = new WorkOrder(cw)\nconst briefcase = new Briefcase(cw)\n\nbriefcase.data = new CaseData(cw)\nbriefcase.financial = new CaseFinancial(cw)\nbriefcase.workflow = new CaseWorkflow(cw)\nbriefcase.admin = new CaseAdmin(cw)\nbriefcase.people = new CasePeople(cw)\nbriefcase.comment = new Comments(cw, 'CaObject')\nbriefcase.asset = new CaseAssets(cw)\nbriefcase.flag = new CaseFlags(cw)\nbriefcase.attachments = new Attachments(cw, 'Case')\n\nworkorder.admin = new WorkOrderAdmin(cw)\nworkorder.costs = new WorkOrderCosts(cw)\nworkorder.comment = new Comments(cw, 'WorkOrder')\nworkorder.attachments = new Attachments(cw, 'WorkOrder')\n\ninspection.admin = new InspectionAdmin(cw)\ninspection.costs = new InspectionCosts(cw)\ninspection.attachments = new Attachments(cw, 'Inspection')\n\nrequest.admin = new RequestAdmin(cw)\nrequest.costs = new RequestCosts(cw)\nrequest.comment = new Comments(cw, 'Request')\nrequest.attachments = new Attachments(cw, 'Request')\n\nconst report = new Report(cw, inspection, workorder, request, briefcase)\n\nexport { cw as Cityworks, general, activity_link, message_queue, search, query, gis, request, inspection, workorder, briefcase, report }"],"names":["_","require","CWError","code","message","info","_this","Name","this","Code","Message","Error_messages","Info","has","forEach","ErrorMessages","v","set","Service","replace","push","get","JSON","stringify","General","cw","_proto","prototype","notifications","Promise","resolve","reject","runRequest","then","response","Value","e","amIWatching","activityType","activityId","_this2","aType","null","case","task","provided","potential_activities","ActivityType","ActivityId","r","getActivityMetadataByIds","ids","table","_this3","tables","indexOf","available","Ids","TableName","console","log","getHistory","_this4","getWOEntityCostSummary","object_ids","_this5","ObjectIds","searchWOEntityCostSummary","search_id","_this6","SearchId","getHolidays","startDate","endDate","_this7","data","api_path","addHolidays","holiday","description","_this8","Holiday","Description","deleteHolidays","holidays","_this9","Holidays","Attachments","current_type","currentActivityType","add","node_id","the_file","filename","attachment_type","task_id","comments","label","attachment_type_map","attachment","signature","url","endpoint","update","attachment_id","title","attachmentIds","downloadUrls","inspection","request","workorder","download","attachmentId","getById","getAttachments","getByNodesId","getRelatedDocs","id","getTags","syncTags","tags","loopSyncTags","callback","setTags","_this0","setTagsOnMany","_this1","returnData","getDocLabels","busCaseId","_this10","BusCaseId","ActivityLinks","activityTypes","linkTypes","ReversibleMap","setActivityTypes","setLinkTypes","type","index","validateType","validTypes","errorCode","options","transformLinksData","map","link","_extends","DestType","SourceType","LinkType","path","source_type","source_sid","destination_type","destination_sid","link_type","SourceSid","DestSid","sids","ActivitySids","clone","SourceActivityType","SourceActivitySid","DestinationActivityType","DestinationActivitySid","activity_link_id","ActivityLinkId","remove","Gis","getConfig","whichType","whichId","getGisData","context","toLowerCase","domain","domainId","downloadMobile","cacheId","initialExtent","requestId","inspectionId","workOrder","workOrderSid","user","allDomains","allGroups","selectedEntities","getEntityAttributes","entityType","EntityType","MessageQueue","status","Pending","Processing","Complete","Failed","hook_types","Unknown","ActivityUpdate","Email","WebHook","processMessages","delete_successful","Delete","maxcount","MaxCount","Status","hours_to_keep","HoursToKeep","preferences","search","parameters","max_results","MaxResults","allowed_params","disallowed_params","k","value","concat","HookType","updateMessageStatus","getWebooks","hook_ids","HookIds","Search","searchTypes","Null","Request","WorkOrder","Inspection","Contract","Permit","GIS","PermitTask","PermitAddress","InspCommon","Case","WorkOrderEntity","StoreTransaction","Requisition","Material","WorkActivity","MaterialLeaf","WoTemplate","Employee","Analytics","TokenState","AssetCalculationResult","Equipment","CustomerAccount","InspTemplate","ProblemLeaf","AssetSplitRecord","PavementInsp","TvInspection","Projects","quick","text","QuickSearchText","execute","searchId","merge","getSaved","searchType","applyToEntities","employeeSid","length","savedEndpoint","displayFields","types","enableServices","searchIds","Enable","SearchIds","disableServices","getDefinition","getDefinitions","getDefinitionNames","deleteDefinitions","saveDefinition","searchFor","SearchFor","convertToQuery","saveQuery","addEurl","allowMultipleBooleanValues","allowEmptyQuery","_this11","SaveQuery","AddEurl","AllowMultipleBooleanValues","AllowEmptyQuery","Query","build","query","isNaN","getTypes","getTypesInfo","includeDefaultSchemasInclude","includeGisSchemas","IncludeDefaultSchemasInclude","IncludeGisSchemas","validateQuery","variables","Variables","validateResponseDefinition","queryType","responseDefinition","QueryType","ResponseDefinition","getSchema","run","QueryValue","unset","isNumber","queryTypes","createdOnly","includeQuery","visibleToMobile","CreatedOnly","IncludeQuery","pop","Report","briefcase","print","dl_url","output_name","capitalize","resolveFileName","resolvedInfo","_resolvedInfo$cn","FileName","fn","isUndefined","cn","desc","startCase","replaceAll","file_contents","json","parse","file","name","fileName","admin","getTemplateById","ProblemSid","template","SRPrintTmpt","WOTemplateId","WOPrintTmpt","InspTemplateId","PrintTemplate","CaseNumber","getPrintTemplates","ReportName","costs","comment","attachments","create","sr_data","move","x","y","projection","z","base_data","RequestId","X","Y","changeProblem","problemSid","getByIds","requestIds","RequestIds","getAuditLog","getCustomFields","changeCustomFieldCategory","categoryId","CategoryId","cancel","cancelReason","dateCancelled","uncancel","close","reopen","_this12","searchData","_this13","searchObject","_this14","createSearchDefinition","searchName","sharedWithin","enableEurl","_this15","isString","getProblemNodes","viewOnly","displayMode","includeCancelled","_this16","DomainId","IncludeCancelled","ViewOnly","getProblems","forPublicOnly","onlyActiveTemplates","domainIds","_this17","ForPublicOnly","OnlyActiveTemplates","getProblemsByKeywords","keywords","_this18","Keywords","getPriorities","_this19","ProblemSids","getCustomFieldTemplate","_this20","getQASettings","_this21","getProblemLeaf","_this22","getStatuses","_this23","DomainIds","getEmployeeLists","listType","_this24","includes","getDispatchTos","getSubmitTos","streetCodes","_this25","getTemplatesById","problemSids","minimumDateModified","maximumDateModified","_this26","createTemplateSearchDefinition","_this27","getTemplateQAs","_this28","searchTemplates","_this29","getTemplates","templateIds","canCreate","includeInactiveIf","_this30","CanCreate","IncludeInactiveIf","getWOTemplates","includeInactive","_this31","IncludeInactive","getMLFs","_this32","ServiceRequestId","updateMLFs","coordinates","problemsId","_this33","deleteMLFs","_this34","insp_data","createFromEntities","createFromParent","createFromServiceRequest","createFromWorkOrder","InspectionId","inspectionIds","InspectionIds","CancelReason","DateCancelled","statuses","submitTos","includeInactiveEmployees","IncludeInactiveEmployees","connectAsset","entity","updateXY","facility","EntityUid","Entity","Facility_Id","Level_Id","getAnswers","inspections","getCycleFrom","getCycleIntervals","getCycleTypes","getDistricts","data_init","entityTypes","EntityTypes","forIn","getTemplatesByIds","inspTemplateIds","InspTemplateIds","getTemplateEntityTypes","getQA","getQConditions","inspTemplateId","wo_data","workOrderSId","s","combine","fromWorkOrderIds","toWorkOrderId","cancelCombinedWorkOrders","CancelCombinedWorkOrders","ToWorkOrderId","FromWorkOrderIds","workOrderId","WorkOrderId","workOrderSIds","workorderSId","getInstructions","getCustomFieldValues","workorderSIds","getEntities","GetGisData","addEntities","entityInfo","UpdateXY","updateEntity","workComplete","WorkComplete","removeEntities","workOrderIds","WorkOrderIds","getWOsByEntities","entityUids","getSearchList","getSupervisors","getCategories","getStages","getExpenseTypes","woTemplateId","fs","Briefcase","current_case","asset","flag","workflow","financial","people","getRequirements","caseTypeId","subTypeId","CaseTypeId","SubTypeId","CaObjectId","createChild","parentCaObjectId","ParentCaObjectId","createFromRequest","caObjectId","caObjectIds","CaObjectIds","filters","getRequestOptions","__dirname","createWriteStream","request_url","hostname","getToken","https","timeout","res","on","d","write","error","getZips","getStates","getCountries","CaseData","addGroup","caseDataGroupId","groupCode","CaseDataGroupId","GroupCode","addDefaultGroups","wipAddDetail","caseDataDetailId","caDataGroupId","columnSequence","detailCode","detailSequence","CaseDataDetailId","CaDataGroupId","ColumnSequence","DetailCode","DetailSequence","getGroupsByCaseId","caseId","deleteGroupsByCaseId","searchForGroups","intersectionBy","keysIn","checkGIS","entityUid","updateGroupsFromAsset","addDetail","updateDetail","caDataDetailId","CaDataDetailId","lockDetail","Lock","unlockDetail","searchForDetails","addListValue","listValue","ListValue","deleteListValue","searchForListValueIds","searchForListValueObjects","updateDetailItemValue","dataDetailId","rate","quantity","detail","NumberFlag","TextFlag","DateFlag","DateCountFlag","isArray","dateCountValue","dateCount","YesNoFlag","CommentFlag","CurrencyFlag","ListValuesFlag","Q1Q2Q3Flag","ValueFlag","getAllDataDetails","setCaseData","items","detail_items_to_set","case_detail_items","item","item_parts","split","item_value","item_rate","item_quantity","check_for_item","r_two","r_three","setCaseDataItem","detailGroupAndItemCode","CaseFinancial","addFee","feeSetupId","FeeSetupId","addPayment","makePayment","payments","caseFees","payerInfo","CaFeeIds","TenderTypes","payment","parseFloat","isDate","Date","addRefund","caPaymentId","refundAmount","CaPaymentId","RefundAmount","Comments","addDepositPayment","caDepositId","CaDepositId","addDeposit","depositId","amount","DepositId","addInstrument","instTypeId","dateExpire","InstTypeId","Amount","DateExpire","updateFee","caFeeId","CaFeeId","voidRefund","caPaymentRefundId","voided","CaPaymentRefundId","Voided","addDefaultFees","addDefaultDeposits","getFees","WhereClause","fees","Array","fee","AmountDue","Factor","Sum","FeeCode","FeeDesc","Quantity","Rate","WaiveFee","CreatedByLoginId","ModifiedByLoginId","TotalFeeAmount","TotalPaymentAmount","TotalDueAmount","TotalCreditAmount","CreditAmount","GrandSumFlag","FeeTypeCode","Location","AutoRecalculate","CommentText","CreatedBy","CustFeeSeq","DateCreated","DateModified","RecalcCreateDate","LockOnPayment","FeeTypeId","Invoiced","ModifiedBy","PaymentAmount","getDeposits","getPayments","getInstruments","deleteFee","deleteFeesByCaseId","deletePayment","deleteRefund","deletePaymentsByCaseId","deleteDeposit","deleteDepositsByCaseId","deleteInstrument","caInstrumentId","CaInstrumentId","deleteInstrumentsByCaseId","searchFees","searchPayments","searchRefunds","getEscrowFees","addEscrowPayment","escrowPaymentItems","EscrowPayments","updateEscrowPayment","searchDeposits","getAllFeeTemplates","searchFeeTemplates","searchCaseInstruments","getInstrumentList","addCaseInstrumentRelease","releasedBy","dateReleased","amountReleased","percentReleased","DateReleased","ReleasedBy","deleteCaseInstrumentRelease","caInstReleasesId","_this35","CaInstReleasesId","searchCaseInstrumentReleases","_this36","_this37","searchAvailableFees","_this38","getTenderTypes","_this39","addTenderType","_this40","updateTenderType","tenderTypeId","_this41","TenderTypeId","sid","ActivitySid","CommentId","getPredefined","category","CaseWorkflow","addTask","taskId","startPoint","endPoint","TaskId","StartPoint","EndPoint","addTaskResult","caTaskId","resultCode","resultID","resultSetID","CaTaskId","ResultCode","ResultID","ResultSetID","addTaskComment","getTasksByCaseId","checkRelatedItems","CheckRelatedItems","getTasksById","caTaskIds","CaTaskIds","getResultsByTaskId","getCommentsForTask","getCommentsForTasks","updateTask","updateTaskComment","caTaskCommentId","commentId","CaTaskCommentId","setTaskResult","deleteTask","deleteTasksOnCase","deleteTaskComments","caTaskCommentIds","CaTaskCommentIds","searchForTasks","searchForTaskResults","addTaskAttachment","docName","locationType","DocName","getTaskAttachments","deleteTaskAttachment","caRelDocId","CaRelDocId","CasePeople","getRoles","caPeopleId","CaPeopleId","deleteAll","searchOptions","idsOnly","runUrl","CaseAssets","attach","detach","caAddressId","CaAddressId","detachAll","getForCase","CaseFlags","flagId","severity","appliedBy","DateApplied","FlagId","Severity","AppliedBy","caFlagId","CaFlagId","CaseAdmin","addBusinessCaseTemplate","updateBusinessCaseTemplate","getBusinessCaseTemplates","addCaseType","caseTypeName","caseTypeDesciption","CaseType","CaseTypeDesciption","updateCaseType","getCaseTypes","searchCaseTypeIDs","searchCaseTypeObjects","addSubtype","subTypeName","subTypeDescription","SubType","SubTypeDesc","updateSubtype","getSubtypes","getExpirations","addExpiration","getDisciplines","addDepartment","departmentCode","departmentName","DepartmentCode","DepartmentName","getDepartments","addDivision","departmentId","divisionName","DepartmentId","DivisionName","getDivisions","addInspectionTimeBlock","labelText","startTime","endTime","inspTimeBlocksDetails","LabelText","StartTime","EndTime","getInspectionTimeBlocks","getNotificationCases","getNotificationTypes","addNumberingGroup","updateNumberingGroup","numberingGroupId","NumberingGroupId","getNumberingGroups","addPerson","getPeople","addPeopleRole","roleCode","RoleCode","getPeopleRoles","addTaskResultDetail","updateTaskResultDetail","resultDetailId","ResultDetailId","getTaskResultDetails","addTaskResultFeeInsert","deleteTaskResultFeeInsert","taskResultFeeInsertId","TaskResultFeeInsertId","deleteTaskResultFeeInsertByTaskId","updateTaskResultFeeInsert","taskResultId","TaskResultId","getTaskResultFeeInsert","WorkOrderAdmin","getEntityGroups","getEntityTypes","entityGroups","EntityGroups","includeComments","includeInstructions","IncludeComments","IncludeInstructions","templateId","WOTemplateIds","updateTemplate","wOTemplate","getTemplateGroupRights","wOTemplateIds","getTemplateActivity","getUpdateFields","getTemplateEquipment","wOTemplateId","getTemplateLabor","getTemplateMaterial","getTemplateMapLayerFields","WorkOrderTemplateId","getTemplateTasks","getRelatedInspectionTemplates","InspectionAdmin","RequestAdmin","WorkOrderCosts","getCodes","employeeSids","commonOnly","EmployeeSids","CommonCodesOnly","getJobCodes","addLabor","hours","WorkOrderSid","Hours","getLabor","workOrderSids","estimated","Estimated","WorkOrderSids","deleteLabor","laborCostIds","LaborCostIds","addEquipment","getEquipment","deleteEquipment","equipmentCostIds","EquipmentCostIds","addMaterial","units","combineIssuesByMaterialSid","Units","CombineIssuesByMaterialSid","getMaterial","deleteMaterial","materialCostIds","MaterialCostIds","InspectionCosts","reqLaborCostIds","RequestCosts","requestCosts","querystring","axios","Cityworks","base_url","settings","load","Token","login","password","gisToken","gisTokenUrl","extensions","features","potential_loads","UnknownExtension","CwAnalytics","WebHooks","PLLPublicApp","SingleSignOn","UnknownFeature","ViewInspections","EditInspections","ViewServiceRequest","EditServiceRequest","ViewWorkOrder","EditWorkOrder","EquipmentCheckOut","OfficeField","Respond","Eurl","PaverInterface","Contracts","Storeroom","PLL","Cw4XL","TableEditor","CCTVInterface","MobileAndroid","MobileiOS","PerformanceBudgeting","Insights","RespondCase","RespondInspection","RespondServiceRequest","RespondTaskManager","RespondWorkOrder","Workload","OpX","TrimbleUnityMobile","TrimbleVegetationManager","secure","expires","default_domain","version","configure","service_path","post_data","post_file","pd","token","port","method","headers","isEmpty","cw_url","postForm","createReadStream","Buffer","byteLength","str","chunk","findKey","o","match","obj","postedData","api_returned_string","SyntaxError","statusCode","end","authenticate","LoginName","Password","authenticateWithGISToken","GisToken","GisTokenUrl","Expires","validateToken","setToken","revokeToken","revokeBefore","RevokeDate","getLocalizationSettings","getTimezoneOptions","getCurrentLocation","licensedApiCheck","area","service","Area","licensedExtensionCheck","extension","Extension","licensedExtensionsCheck","Extensions","rez","inv_extensions","invert","ext_num","bool","provided_num_returned","licensedFeatureCheck","feature","Feature","licensedFeaturesCheck","Features","inv_features","feat_num","licensedServicesCheck","services","Services","cityworksOnlineSites","domains","general","activity_link","message_queue","gis","report"],"mappings":"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"}
|