cityworks 0.0.21 → 0.0.22
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/README.md +73 -0
- package/dist/case_workflow.d.ts +154 -0
- 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.js +1 -1
- package/dist/index.modern.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/case_workflow.ts +377 -0
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/error.ts","../src/general.ts","../src/activity_link.ts","../src/gis.ts","../src/message_queue.ts","../src/search.ts","../src/request_admin.ts","../src/request.ts","../src/inspection_admin.ts","../src/inspection.ts","../src/workorder_admin.ts","../src/workorder.ts","../src/case_data.ts","../src/case_financial.ts","../src/case_workflow.ts","../src/case_admin.ts","../src/case.ts","../src/cityworks.ts"],"sourcesContent":["interface CWErrorInt {\n name: string\n code: number\n message: string\n info?: string\n}\n\n/**\n * CWError implements a custom error class for this codebase with additional information\n *\n * `{name: string, code:number, info: object}`\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 * 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?:object) {\n this.name = \"Cityworks Exception\"\n this.code = code\n this.message = message\n if(typeof(info) !== 'undefined') {\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 })\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(new CWError(2, \"Unknown error.\"))\n })\n }\n })\n }\n\n /**\n * Do a \"quick\" search for any string (an ID is best)\n *\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 quickSearch(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 * 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 cost summary for work order 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 work order 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","import { CWError } from './error'\nimport ReversibleMap from 'reversible-map'\nconst _ = require('lodash')\n\ninterface ActivityLink {\n linkTypes: ReversibleMap<string, number>\n activityTypes: ReversibleMap<string, number>\n cw: any\n}\n\n/**\n * ActivityLinks implements the activity link functions\n *\n */\nexport class ActivityLinks implements ActivityLink {\n /**\n * Activity types to map string to number for internal use. Activity types available are:\n *\n * \"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:\n *\n * \"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.activityTypes.set(\"null\", 0)\n this.activityTypes.set(\"case\", 1)\n this.activityTypes.set(\"inspection\", 2)\n this.activityTypes.set(\"request\", 3)\n this.activityTypes.set(\"workorder\", 4)\n this.activityTypes.set(\"wipcase\", 5)\n\n this.linkTypes = new ReversibleMap<string, number>()\n this.linkTypes.set(\"null\", 0)\n this.linkTypes.set(\"parent\", 1)\n this.linkTypes.set(\"related\", 2)\n }\n\n /**\n * Create a new activity link between two items.\n *\n * @param {string} source_type - Source type as string. Options:\n *\n * \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n *\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\n *\n * \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n *\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:\n *\n * \"null\", \"parent\", \"related\"\n *\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 if(!this.activityTypes.has(source_type)) {\n reject(new CWError(1, 'Source type not found.', {'provided': source_type, 'options':this.activityTypes}))\n }\n if(!this.activityTypes.has(destination_type)) {\n reject(new CWError(2, 'Destination type not found.', {'provided': destination_type, 'options':this.activityTypes}))\n }\n if(!this.linkTypes.has(link_type)) {\n reject(new CWError(3, 'Link type not found.', {'provided': link_type, 'options':this.linkTypes}))\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 this.cw.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\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:\n *\n * \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n *\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 if(!this.activityTypes.has(type)) {\n reject(new CWError(4, 'Activity type not found.', {'provided': type, 'options':this.activityTypes}))\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 this.cw.runRequest(path, data).then((response: any) => {\n let return_data = new Array()\n _.forEach(response.Value, (link, key) => {\n link.DestType = _this.activityTypes.get(link.DestType)\n link.SourceType = _this.activityTypes.get(link.SourceType)\n link.LinkType = _this.linkTypes.get(link.LinkType)\n return_data.push(link)\n })\n resolve(return_data)\n })\n })\n }\n\n /**\n * Clone a current activity link.\n *\n * @param {string} source_type - Source type as string. Options:\n *\n * \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n *\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\n *\n * \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n *\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 if(!this.activityTypes.has(source_type)) {\n reject(new CWError(1, 'Source type not found.', {'provided': source_type, 'options':this.activityTypes}))\n }\n if(!this.activityTypes.has(destination_type)) {\n reject(new CWError(1, 'Destination type not found.', {'provided': destination_type, 'options':this.activityTypes}))\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 this.cw.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\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 this.cw.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Remove a link by specifying everything.\n *\n * @param {string} source_type - Source type as string. Options:\n *\n * \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n *\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\n *\n * \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n *\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:\n *\n * \"null\", \"parent\", \"related\"\n *\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 if(!this.activityTypes.has(source_type)) {\n reject(new CWError(1, 'Source type not found.', {'provided': source_type, 'options':this.activityTypes}))\n }\n if(!this.activityTypes.has(destination_type)) {\n reject(new CWError(1, 'Destination type not found.', {'provided': destination_type, 'options':this.activityTypes}))\n }\n if(!this.linkTypes.has(link_type)) {\n reject(new CWError(1, 'Link type not found.', {'provided': link_type, 'options':this.linkTypes}))\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 this.cw.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\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 });\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 });\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 });\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 });\n });\n }\n\n /**\n * Get service request gis services\n *\n * @param {number} requestId - The work order 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 });\n });\n }\n\n /**\n * Get inspection gis services\n *\n * @param {number} inspectionId - The work order 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 });\n });\n }\n\n /**\n * Get workorder gis services\n *\n * @param {number} workOrderSid - The work order 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 work order'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 });\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 });\n });\n }\n\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 });\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","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 /**\n * Hook Types -\n * Unknown: 0,\n * ActivityUpdate: 1,\n * Email: 2,\n * WebHook: 3\n */\n hook_types: Object\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.status = {\n Pending: 0,\n Processing: 1,\n Complete: 2,\n Failed: 3\n }\n this.hook_types = {\n Unknown: 0,\n ActivityUpdate: 1,\n Email: 2,\n WebHook: 3\n }\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 })\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 })\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 })\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 })\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 })\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 * @hidden\n */\n constructor(cw) {\n this.cw = cw\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","import { CWError } from './error'\nconst _ = require('lodash')\nimport { RequestAdmin } from './request_admin'\n\nexport class Request {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Request Administration methods\n */\n admin?: Object\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.admin = new RequestAdmin(cw)\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 * Add a comment to a request\n *\n * @category Requests\n * @param {number} requestId - The ID of the request to retrieve\n * @param {string} comment - The comment text to add\n * @return {Object} Returns Promise that represents an object describing the comment added\n */\n comment(requestId: number, comment: string) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestId: requestId,\n Comments: comment\n }\n this.cw.runRequest('Ams/ServiceRequest/AddComments', 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 work order 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 work order 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","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","import { CWError } from './error'\nconst _ = require('lodash')\nimport { InspectionAdmin } from './inspection_admin'\n\nexport class Inspection {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Inspection Administration methods\n */\n admin?: Object\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.admin = new InspectionAdmin(cw)\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 work order\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 possible employees for an Inspection's SubmitTo\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 // Attachments\n\n // AddInspectionAttachment InspAttachment\n // Add an inspection attachment\n // Request Parameters\n // Int32 AttachmentType V15_4\n // String Comments\n // String Filename\n // Int32 req InspectionId\n // Ams/Attachments/AddInspectionAttachment?data={\n // \"Comments\": null,\n // \"Filename\": null,\n // \"InspectionId\": null,\n // \"AttachmentType\": null\n // }\n\n /**\n * Delete inspection attachments\n *\n * @category Inspection Attachments\n * @param {Array<number>} attachmentIds - An array of inspection attachment IDs to delete\n * @return {Object} Returns object that represents a boolean for action resolution\n */\n deleteAttachments(attachmentIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n AttachmentIds: attachmentIds\n }\n this.cw.runRequest('Ams/Attachments/DeleteInspectionAttachments', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Download an inspection attachment\n *\n * @category Inspection Attachments\n * @param {number} attachmentId - ID of an inspection attachment to download\n * @return {Object} Returns object that represents a file stream\n */\n downloadAttachment(attachmentId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n AttachmentId: attachmentId\n }\n this.cw.runRequest('Ams/Attachments/DownloadInspectionAttachment', data).then(r => {\n // TODO, pass file through // resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspection attachment by ID\n *\n * @category Inspection 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 getAttachmentById(attachmentId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n AttachmentId: attachmentId\n }\n this.cw.runRequest('Ams/Attachments/InspectionAttachmentById', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspection attachment by ID\n *\n * @category Inspection Attachments\n * @param {Array<number>} inspectionIds - An array of inspection IDs to get attachments for\n * @return {Object} Returns object that represents a collection of attachments from the matched inspections\n */\n getAttachments(inspectionIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionIds: inspectionIds\n }\n this.cw.runRequest('Ams/Attachments/InspectionAttachments', 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","import { CWError } from './error'\nconst _ = require('lodash')\nimport { WorkOrderAdmin } from './workorder_admin'\n\nexport class WorkOrder {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * WorkOrder Administration methods\n */\n admin?: Object\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.admin = new WorkOrderAdmin(cw)\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 work order ID for the single work order that should contain the info/entities from the other work orders\n * @param {boolean} cancelCombinedWorkOrders - If the work orders 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(10, '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(10, '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 WorkOrder\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 /**\n * Add a comment to a workorder\n *\n * @category WorkOrders\n * @param {number} workOrderSId - The S/ID of the workorder to retrieve. SID is default.\n * @param {string} comment - The comment text to add.\n * @return {Object} Returns Promise that represents an object describing the comment added\n */\n comment(workOrderSId: string|number, comment: string) {\n return new Promise((resolve, reject) => {\n var data = {\n Comments: comment\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, 'Workorder S/IDs was not provided.', {'workorderSId': workOrderSId}))\n }\n this.cw.runRequest('Ams/WorkOrder/AddComments', 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 work order 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 work order. 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 work order 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 work orders\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 work order (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","import { CWError } from './error'\nconst _ = require('lodash')\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","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 * 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 CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseFees/ByCaObjectId', data).then(r => {\n resolve(r.Value)\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(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(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(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 /**\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(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(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(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(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(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'\nconst _ = require('lodash')\n\nexport class CaseWorkflow {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\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(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(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(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(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 Holiday\n *\n * @category Holidays\n * @return {Object} Returns Promise that represents an object describing the newly-added DivisionItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=HolidaysItem\n */\n addHoliday(holidayDate: Date, holidayDesc: string, halfDayFlag?: string) {\n return new Promise((resolve, reject) => {\n var data = {\n HolidayDate: holidayDate,\n HolidayDesc: holidayDesc\n }\n if(typeof(halfDayFlag)!='undefined') {\n _.set(data, 'HalfDayFlag', halfDayFlag)\n }\n this.cw.runRequest('Pll/Holiday/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Holiday\n *\n * @category Holidays\n * @param {number} holidayId - ID of Holiday to delete\n * @return {Object} Returns Promise that represents an object describing the newly-added HolidaysItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=HolidaysItem\n */\n deleteHoliday(holidayId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n HolidayId: holidayId\n }\n this.cw.runRequest('Pll/Holiday/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Holidays\n *\n * @category Holidays\n * @return {Object} Returns Promise that represents a collection of HolidaysItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=HolidaysItem\n */\n getHolidays() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/Holiday/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\nimport { CaseData } from './case_data'\nimport { CaseFinancial } from './case_financial'\nimport { CaseWorkflow} from './case_workflow'\nimport { CaseAdmin } from './case_admin'\n\nexport class Case {\n /**\n * @hidden\n */\n cw: any\n\n\n /**\n * Data Detail methods\n */\n data?: Object\n /**\n * Workflow & task methods\n */\n workflow?: Object\n /**\n * Payment, Receipt, & Fee methods\n */\n financial?: Object\n /**\n * PLL Administration methods\n */\n admin?: Object\n\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.data = new CaseData(cw)\n this.workflow = new CaseWorkflow(cw)\n this.financial = new CaseFinancial(cw)\n this.admin = new CaseAdmin(cw)\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) {\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 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) {\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 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 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) {\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 resolve(r.Value)\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 ID to update\n * @return {Object} Returns Promise that represents a collection of objects describing the cases\n */\n getByIds(caObjectIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectIds: caObjectIds\n }\n this.cw.runRequest('Pll/CaseObject/ByIds', data).then(r => {\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) {\n return new Promise((resolve, reject) => {\n var data = filters\n this.cw.runRequest('Pll/CaseObject/Search', data).then(r => {\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","import { CWError } from './error'\nimport { General } from './general'\nimport { ActivityLinks } from './activity_link'\nimport { Gis } from './gis'\nimport { MessageQueue } from './message_queue'\nimport { Search } from './search'\nimport { Request } from './request'\nimport { Inspection } from './inspection'\nimport { WorkOrder } from './workorder'\n\nimport { Case } from './case'\n\nconst https = require('https')\nconst querystring = require('querystring')\nconst _ = require('lodash')\n\ninterface postData {\n data?: string\n token?: string\n}\n\n/**\n * Core interface Citywork which defines the access vars for many of the functions and the connection settings\n */\ninterface Citywork {\n base_url: any\n settings: Object\n login?: string\n password?: string\n Token?: string\n gisToken?: string\n gisTokenUrl?: string\n\n default_domain?: any\n\n general?: Object\n activity_link?: Object\n message_queue?: Object\n gis?: Object\n // case?: Object\n inspection?: Object\n workorder?: Object\n request?: Object\n\n case?: Object\n\n extensions: Object\n features: Object\n}\n\n/**\n * Core class Cityworks with most of the authentication and install capabilities functions\n */\nmodule.exports = class Cityworks implements Citywork {\n /**\n * The domain of the cityworks install. Defaults to Cityworks Online\n */\n base_url: string\n /**\n * Stores the currently in use authentication token\n */\n Token?: string\n /**\n * Stores the login username\n */\n login?: string\n /**\n * Holds the login password\n */\n password?: string\n /**\n * Holds the GIS Token for GIS-based Authentication (Portal)\n */\n gisToken?: string\n /**\n * Holds the GIS Token URL for GIS-based Authentication (Portal)\n */\n 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 settings: {\n path: string,\n secure: boolean,\n expires: any,\n default_domain?: any\n }\n error?: Object\n general?: Object\n activity_link?: Object\n message_queue?: Object\n gis?: Object\n search?: Object\n request?: Object\n inspection?: Object\n workorder?: Object\n\n case?: Object\n\n extensions: Object\n features: Object\n 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 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', '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 }\n this.potential_loads = ['general', 'activity_link', 'message_queue', 'gis', 'search', 'request', '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', '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 }\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 if(typeof(load)=='undefined') {\n this.general = new General(this)\n this.activity_link = new ActivityLinks(this)\n this.message_queue = new MessageQueue(this)\n this.request = new Request(this)\n this.inspection = new Inspection(this)\n this.workorder = new WorkOrder(this)\n this.case = new Case(this)\n } else {\n let _this = this\n _.forEach(this.potential_loads, function(v) {\n switch(v) {\n case 'general':\n _this.general = new General(_this)\n break\n case 'activity_link':\n _this.activity_link = new ActivityLinks(_this)\n break\n case 'message_queue':\n _this.message_queue = new MessageQueue(_this)\n break\n case 'gis':\n _this.gis = new Gis(_this)\n break\n case 'search':\n _this.search = new Search(_this)\n break\n case 'request':\n _this.request = new Request(_this)\n break\n case 'case':\n _this.case = new Case(_this)\n break\n case 'inspection':\n _this.inspection = new Inspection(_this)\n break\n case 'workorder':\n _this.workorder = new WorkOrder(_this)\n break\n }\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(path, data)`\n *\n * @param {string} path - The path to the particular endpoint\n * @param {Object} data - The data object to be sent to the Cityworks API\n * @return {Object} Returns Promise object that represents the json object returned from the Cityworks API\n */\n runRequest(path, data) {\n return new Promise((resolve, reject) => {\n let pd = {} as postData\n pd.data = JSON.stringify(data)\n\n if(typeof(this.Token) !== 'undefined' && this.Token != '' && path!='General/Authentication/CityworksOnlineAuthenticate' && path!='General/Authentication/Authenticate') {\n pd.token = this.Token\n }\n let obj: {\n Status: number,\n Message: string\n }\n let options = {\n hostname: this.base_url,\n port: 443,\n path: '/' + this.settings.path + '/services/' + path,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Content-Length': Buffer.byteLength(querystring.stringify(pd))\n },\n timeout: 10000000\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 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(path=='General/ActivityNotification/UserWatching') {\n // console.log(str, options, pd, obj)\n // }\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') { // && typeof(response.Value.Token)!='undefined') {\n // console.log(str, options, pd, obj)\n resolve(obj)\n } else {\n reject(new CWError(3, \"Unknown error.\", {options: options, postedData: pd, api_returned_string: obj}))\n }\n } else {\n reject(new CWError(1, \"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')\n reject(new CWError(1, \"Error parsing JSON.\", {error: e}))\n } else {\n console.log('try/catch error on JSON')\n reject(new CWError(1, \"Error parsing JSON.\"))\n }\n }\n })\n })\n request.write(querystring.stringify(pd))\n request.end()\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(10, 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 * 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\n\n // export default new Cityworks() as cityworks\n"],"names":["CWError","code","message","info","name","this","JSON","stringify","_","require","General","cw","notifications","Promise","resolve","reject","_this","runRequest","then","response","Value","amIWatching","activityType","activityId","aType","null","case","task","provided","potential_activities","_this2","ActivityType","ActivityId","r","e","quickSearch","text","_this3","QuickSearchText","getActivityMetadataByIds","ids","table","tables","indexOf","available","_this4","Ids","TableName","console","log","getWOEntityCostSummary","object_ids","_this5","ObjectIds","searchWOEntityCostSummary","search_id","_this6","SearchId","ActivityLinks","activityTypes","linkTypes","ReversibleMap","set","add","source_type","source_sid","destination_type","destination_sid","link_type","has","options","data","SourceType","get","SourceSid","DestType","DestSid","LinkType","type","sids","ActivitySids","return_data","Array","forEach","link","key","push","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","_this7","user","allDomains","allGroups","_this8","selectedEntities","_this9","MessageQueue","status","hook_types","Pending","Processing","Complete","Failed","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","v","k","value","concat","update","HookType","updateMessageStatus","getWebooks","hook_ids","HookIds","Search","RequestAdmin","Request","admin","create","sr_data","move","x","y","projection","z","base_data","RequestId","X","Y","merge","changeProblem","problemSid","ProblemSid","getById","getByIds","requestIds","RequestIds","getAuditLog","getCustomFields","changeCustomFieldCategory","categoryId","CategoryId","comment","_this10","Comments","cancel","cancelReason","dateCancelled","_this11","uncancel","_this12","close","_this13","Message","reopen","_this14","_this15","searchData","_this16","searchObject","_this17","createSearchDefinition","searchName","sharedWithin","saveDefinition","enableEurl","isString","_this18","getProblemNodes","viewOnly","displayMode","includeCancelled","DomainId","IncludeCancelled","ViewOnly","_this19","getProblems","forPublicOnly","onlyActiveTemplates","domainIds","ForPublicOnly","OnlyActiveTemplates","_this20","getProblemsByKeywords","keywords","_this21","Keywords","getPriorities","_this22","ProblemSids","getCustomFieldTemplate","_this23","getQASettings","_this24","getProblemLeaf","_this25","getStatuses","_this26","DomainIds","getEmployeeLists","listType","includes","_this27","getDispatchTos","getSubmitTos","streetCodes","_this28","getTemplatesById","problemSids","minimumDateModified","maximumDateModified","_this29","createTemplateSearchDefinition","_this30","getTemplateQAs","_this31","searchTemplates","_this32","getTemplates","templateIds","canCreate","includeInactiveIf","CanCreate","IncludeInactiveIf","_this33","getWOTemplates","includeInactive","_this34","IncludeInactive","InspectionAdmin","Inspection","insp_data","createFromEntities","createFromParent","createFromServiceRequest","createFromWorkOrder","InspectionId","inspectionIds","InspectionIds","CancelReason","DateCancelled","statuses","submitTos","includeInactiveEmployees","IncludeInactiveEmployees","connectAsset","entity","updateXY","facility","EntityType","EntityUid","Entity","Facility_Id","Level_Id","getAnswers","inspections","length","getCycleFrom","getCycleIntervals","getCycleTypes","getDistricts","data_init","entityTypes","EntityTypes","forIn","getTemplatesByIds","inspTemplateIds","InspTemplateIds","getTemplateEntityTypes","getQA","getQConditions","deleteAttachments","attachmentIds","AttachmentIds","downloadAttachment","attachmentId","AttachmentId","getAttachmentById","_this35","getAttachments","_this36","WorkOrderAdmin","WorkOrder","wo_data","workOrderSId","s","combine","fromWorkOrderIds","toWorkOrderId","cancelCombinedWorkOrders","CancelCombinedWorkOrders","ToWorkOrderId","FromWorkOrderIds","workOrderId","WorkOrderId","path","workOrderSIds","workorderSId","isNumber","getInstructions","getCustomFieldValues","workorderSIds","getEntities","GetGisData","addEntities","entityInfo","UpdateXY","updateEntity","workComplete","WorkComplete","removeEntities","workOrderIds","WorkOrderIds","getWOsByEntities","entityType","entityUids","getSearchList","getSupervisors","getCategories","getStages","getExpenseTypes","CaseData","CaseFinancial","addFee","caObjectId","feeSetupId","CaObjectId","FeeSetupId","addPayment","addRefund","caPaymentId","refundAmount","CaPaymentId","RefundAmount","addDepositPayment","caDepositId","CaDepositId","addDeposit","depositId","amount","DepositId","addInstrument","instTypeId","dateExpire","InstTypeId","Amount","DateExpire","updateFee","caFeeId","CaFeeId","voidRefund","caPaymentRefundId","voided","CaPaymentRefundId","Voided","addDefaultFees","busCaseId","BusCaseId","addDefaultDeposits","getFees","getDeposits","getPayments","getInstruments","deleteFee","deleteFeesByCaseId","deletePayment","deleteRefund","deletePaymentsByCaseId","deleteDeposit","deleteDepositsByCaseId","deleteInstrument","caInstrumentId","CaInstrumentId","deleteInstrumentsByCaseId","searchFees","filters","intersectionBy","searchPayments","searchRefunds","searchDeposits","getAllFeeTemplates","searchFeeTemplates","searchCaseInstruments","getInstrumentList","addCaseInstrumentRelease","releasedBy","dateReleased","amountReleased","percentReleased","DateReleased","ReleasedBy","deleteCaseInstrumentRelease","caInstReleasesId","CaInstReleasesId","searchCaseInstrumentReleases","fees","searchAvailableFees","getTenderTypes","_this37","addTenderType","_this38","updateTenderType","tenderTypeId","TenderTypeId","_this39","CaseWorkflow","CaseAdmin","addBusinessCaseTemplate","updateBusinessCaseTemplate","getBusinessCaseTemplates","addCaseType","caseTypeName","caseTypeDesciption","CaseType","CaseTypeDesciption","updateCaseType","caseTypeId","CaseTypeId","getCaseTypes","searchCaseTypeIDs","searchCaseTypeObjects","addSubtype","subTypeName","subTypeDescription","SubType","SubTypeDesc","updateSubtype","subTypeId","SubTypeId","getSubtypes","getExpirations","addExpiration","getDisciplines","addDepartment","departmentCode","departmentName","DepartmentCode","DepartmentName","getDepartments","addDivision","departmentId","divisionName","DepartmentId","DivisionName","getDivisions","addHoliday","holidayDate","holidayDesc","halfDayFlag","HolidayDate","HolidayDesc","deleteHoliday","holidayId","HolidayId","getHolidays","addInspectionTimeBlock","labelText","startTime","endTime","inspTimeBlocksDetails","LabelText","StartTime","EndTime","getInspectionTimeBlocks","getNotificationCases","getNotificationTypes","addNumberingGroup","updateNumberingGroup","numberingGroupId","NumberingGroupId","getNumberingGroups","addPerson","Name","getPeople","addPeopleRole","roleCode","RoleCode","getPeopleRoles","addTaskResultDetail","updateTaskResultDetail","resultDetailId","ResultDetailId","getTaskResultDetails","addTaskResultFeeInsert","_this40","deleteTaskResultFeeInsert","taskResultFeeInsertId","_this41","TaskResultFeeInsertId","deleteTaskResultFeeInsertByTaskId","taskId","_this42","TaskId","updateTaskResultFeeInsert","taskResultId","TaskResultId","_this43","getTaskResultFeeInsert","_this44","Case","workflow","financial","createChild","parentCaObjectId","ParentCaObjectId","createFromRequest","ServiceRequestId","caObjectIds","CaObjectIds","https","querystring","module","exports","base_url","settings","load","Token","login","password","gisToken","gisTokenUrl","error","general","activity_link","message_queue","gis","workorder","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","configure","pd","token","hostname","port","method","headers","Buffer","byteLength","timeout","str","on","chunk","match","obj","parse","postedData","api_returned_string","SyntaxError","write","end","authenticate","LoginName","Password","authenticateWithGISToken","GisToken","GisTokenUrl","Expires","validateToken","setToken","getToken","revokeToken","revokeBefore","RevokeDate","getLocalizationSettings","getTimezoneOptions","getCurrentLocation","licensedApiCheck","area","service","Area","Service","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","version"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/error.ts","../src/general.ts","../src/activity_link.ts","../src/gis.ts","../src/message_queue.ts","../src/search.ts","../src/request_admin.ts","../src/request.ts","../src/inspection_admin.ts","../src/inspection.ts","../src/workorder_admin.ts","../src/workorder.ts","../src/case_data.ts","../src/case_financial.ts","../src/case_workflow.ts","../src/case_admin.ts","../src/case.ts","../src/cityworks.ts"],"sourcesContent":["interface CWErrorInt {\n name: string\n code: number\n message: string\n info?: string\n}\n\n/**\n * CWError implements a custom error class for this codebase with additional information\n *\n * `{name: string, code:number, info: object}`\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 * 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?:object) {\n this.name = \"Cityworks Exception\"\n this.code = code\n this.message = message\n if(typeof(info) !== 'undefined') {\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 })\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(new CWError(2, \"Unknown error.\"))\n })\n }\n })\n }\n\n /**\n * Do a \"quick\" search for any string (an ID is best)\n *\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 quickSearch(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 * 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 cost summary for work order 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 work order 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","import { CWError } from './error'\nimport ReversibleMap from 'reversible-map'\nconst _ = require('lodash')\n\ninterface ActivityLink {\n linkTypes: ReversibleMap<string, number>\n activityTypes: ReversibleMap<string, number>\n cw: any\n}\n\n/**\n * ActivityLinks implements the activity link functions\n *\n */\nexport class ActivityLinks implements ActivityLink {\n /**\n * Activity types to map string to number for internal use. Activity types available are:\n *\n * \"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:\n *\n * \"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.activityTypes.set(\"null\", 0)\n this.activityTypes.set(\"case\", 1)\n this.activityTypes.set(\"inspection\", 2)\n this.activityTypes.set(\"request\", 3)\n this.activityTypes.set(\"workorder\", 4)\n this.activityTypes.set(\"wipcase\", 5)\n\n this.linkTypes = new ReversibleMap<string, number>()\n this.linkTypes.set(\"null\", 0)\n this.linkTypes.set(\"parent\", 1)\n this.linkTypes.set(\"related\", 2)\n }\n\n /**\n * Create a new activity link between two items.\n *\n * @param {string} source_type - Source type as string. Options:\n *\n * \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n *\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\n *\n * \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n *\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:\n *\n * \"null\", \"parent\", \"related\"\n *\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 if(!this.activityTypes.has(source_type)) {\n reject(new CWError(1, 'Source type not found.', {'provided': source_type, 'options':this.activityTypes}))\n }\n if(!this.activityTypes.has(destination_type)) {\n reject(new CWError(2, 'Destination type not found.', {'provided': destination_type, 'options':this.activityTypes}))\n }\n if(!this.linkTypes.has(link_type)) {\n reject(new CWError(3, 'Link type not found.', {'provided': link_type, 'options':this.linkTypes}))\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 this.cw.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\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:\n *\n * \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n *\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 if(!this.activityTypes.has(type)) {\n reject(new CWError(4, 'Activity type not found.', {'provided': type, 'options':this.activityTypes}))\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 this.cw.runRequest(path, data).then((response: any) => {\n let return_data = new Array()\n _.forEach(response.Value, (link, key) => {\n link.DestType = _this.activityTypes.get(link.DestType)\n link.SourceType = _this.activityTypes.get(link.SourceType)\n link.LinkType = _this.linkTypes.get(link.LinkType)\n return_data.push(link)\n })\n resolve(return_data)\n })\n })\n }\n\n /**\n * Clone a current activity link.\n *\n * @param {string} source_type - Source type as string. Options:\n *\n * \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n *\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\n *\n * \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n *\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 if(!this.activityTypes.has(source_type)) {\n reject(new CWError(1, 'Source type not found.', {'provided': source_type, 'options':this.activityTypes}))\n }\n if(!this.activityTypes.has(destination_type)) {\n reject(new CWError(1, 'Destination type not found.', {'provided': destination_type, 'options':this.activityTypes}))\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 this.cw.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\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 this.cw.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\n })\n }\n\n /**\n * Remove a link by specifying everything.\n *\n * @param {string} source_type - Source type as string. Options:\n *\n * \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n *\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\n *\n * \"null\", \"case\", \"inspection\", \"request\", \"workorder\", \"wipcase\"\n *\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:\n *\n * \"null\", \"parent\", \"related\"\n *\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 if(!this.activityTypes.has(source_type)) {\n reject(new CWError(1, 'Source type not found.', {'provided': source_type, 'options':this.activityTypes}))\n }\n if(!this.activityTypes.has(destination_type)) {\n reject(new CWError(1, 'Destination type not found.', {'provided': destination_type, 'options':this.activityTypes}))\n }\n if(!this.linkTypes.has(link_type)) {\n reject(new CWError(1, 'Link type not found.', {'provided': link_type, 'options':this.linkTypes}))\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 this.cw.runRequest(path, data).then((response: any) => {\n resolve(response.Value)\n })\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 });\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 });\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 });\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 });\n });\n }\n\n /**\n * Get service request gis services\n *\n * @param {number} requestId - The work order 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 });\n });\n }\n\n /**\n * Get inspection gis services\n *\n * @param {number} inspectionId - The work order 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 });\n });\n }\n\n /**\n * Get workorder gis services\n *\n * @param {number} workOrderSid - The work order 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 work order'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 });\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 });\n });\n }\n\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 });\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","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 /**\n * Hook Types -\n * Unknown: 0,\n * ActivityUpdate: 1,\n * Email: 2,\n * WebHook: 3\n */\n hook_types: Object\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.status = {\n Pending: 0,\n Processing: 1,\n Complete: 2,\n Failed: 3\n }\n this.hook_types = {\n Unknown: 0,\n ActivityUpdate: 1,\n Email: 2,\n WebHook: 3\n }\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 })\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 })\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 })\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 })\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 })\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 * @hidden\n */\n constructor(cw) {\n this.cw = cw\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","import { CWError } from './error'\nconst _ = require('lodash')\nimport { RequestAdmin } from './request_admin'\n\nexport class Request {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Request Administration methods\n */\n admin?: Object\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.admin = new RequestAdmin(cw)\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 * Add a comment to a request\n *\n * @category Requests\n * @param {number} requestId - The ID of the request to retrieve\n * @param {string} comment - The comment text to add\n * @return {Object} Returns Promise that represents an object describing the comment added\n */\n comment(requestId: number, comment: string) {\n return new Promise((resolve, reject) => {\n var data = {\n RequestId: requestId,\n Comments: comment\n }\n this.cw.runRequest('Ams/ServiceRequest/AddComments', 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 work order 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 work order 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","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","import { CWError } from './error'\nconst _ = require('lodash')\nimport { InspectionAdmin } from './inspection_admin'\n\nexport class Inspection {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * Inspection Administration methods\n */\n admin?: Object\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.admin = new InspectionAdmin(cw)\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 work order\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 possible employees for an Inspection's SubmitTo\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 // Attachments\n\n // AddInspectionAttachment InspAttachment\n // Add an inspection attachment\n // Request Parameters\n // Int32 AttachmentType V15_4\n // String Comments\n // String Filename\n // Int32 req InspectionId\n // Ams/Attachments/AddInspectionAttachment?data={\n // \"Comments\": null,\n // \"Filename\": null,\n // \"InspectionId\": null,\n // \"AttachmentType\": null\n // }\n\n /**\n * Delete inspection attachments\n *\n * @category Inspection Attachments\n * @param {Array<number>} attachmentIds - An array of inspection attachment IDs to delete\n * @return {Object} Returns object that represents a boolean for action resolution\n */\n deleteAttachments(attachmentIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n AttachmentIds: attachmentIds\n }\n this.cw.runRequest('Ams/Attachments/DeleteInspectionAttachments', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Download an inspection attachment\n *\n * @category Inspection Attachments\n * @param {number} attachmentId - ID of an inspection attachment to download\n * @return {Object} Returns object that represents a file stream\n */\n downloadAttachment(attachmentId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n AttachmentId: attachmentId\n }\n this.cw.runRequest('Ams/Attachments/DownloadInspectionAttachment', data).then(r => {\n // TODO, pass file through // resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspection attachment by ID\n *\n * @category Inspection 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 getAttachmentById(attachmentId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n AttachmentId: attachmentId\n }\n this.cw.runRequest('Ams/Attachments/InspectionAttachmentById', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get inspection attachment by ID\n *\n * @category Inspection Attachments\n * @param {Array<number>} inspectionIds - An array of inspection IDs to get attachments for\n * @return {Object} Returns object that represents a collection of attachments from the matched inspections\n */\n getAttachments(inspectionIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n InspectionIds: inspectionIds\n }\n this.cw.runRequest('Ams/Attachments/InspectionAttachments', 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","import { CWError } from './error'\nconst _ = require('lodash')\nimport { WorkOrderAdmin } from './workorder_admin'\n\nexport class WorkOrder {\n /**\n * @hidden\n */\n cw: any\n\n /**\n * WorkOrder Administration methods\n */\n admin?: Object\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.admin = new WorkOrderAdmin(cw)\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 work order ID for the single work order that should contain the info/entities from the other work orders\n * @param {boolean} cancelCombinedWorkOrders - If the work orders 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(10, '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(10, '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 WorkOrder\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 /**\n * Add a comment to a workorder\n *\n * @category WorkOrders\n * @param {number} workOrderSId - The S/ID of the workorder to retrieve. SID is default.\n * @param {string} comment - The comment text to add.\n * @return {Object} Returns Promise that represents an object describing the comment added\n */\n comment(workOrderSId: string|number, comment: string) {\n return new Promise((resolve, reject) => {\n var data = {\n Comments: comment\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, 'Workorder S/IDs was not provided.', {'workorderSId': workOrderSId}))\n }\n this.cw.runRequest('Ams/WorkOrder/AddComments', 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 work order 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 work order. 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 work order 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 work orders\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 work order (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","import { CWError } from './error'\nconst _ = require('lodash')\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","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 * 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 CaObjectId: caObjectId\n }\n this.cw.runRequest('Pll/CaseFees/ByCaObjectId', data).then(r => {\n resolve(r.Value)\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(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(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(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 /**\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(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(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(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(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(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'\nconst _ = require('lodash')\n\nexport class CaseWorkflow {\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 * Add Default Case Data Groups\n *\n * @category Data Groups\n * @param {number} caObjectId - The Case Object to get the attached data groups.\n * @return {Object} Returns Promise that represents a collection of the CaDataGroupItemBases.\n */\n getGroupsByCaseId(caObjectId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectId: caObjectId\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) {\n return new Promise((resolve, reject) => {\n if(_.intersectionBy(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 Group 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 * 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(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)\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(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/SearchObject', 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(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(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(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(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 Holiday\n *\n * @category Holidays\n * @return {Object} Returns Promise that represents an object describing the newly-added DivisionItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=HolidaysItem\n */\n addHoliday(holidayDate: Date, holidayDesc: string, halfDayFlag?: string) {\n return new Promise((resolve, reject) => {\n var data = {\n HolidayDate: holidayDate,\n HolidayDesc: holidayDesc\n }\n if(typeof(halfDayFlag)!='undefined') {\n _.set(data, 'HalfDayFlag', halfDayFlag)\n }\n this.cw.runRequest('Pll/Holiday/Add', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Delete Holiday\n *\n * @category Holidays\n * @param {number} holidayId - ID of Holiday to delete\n * @return {Object} Returns Promise that represents an object describing the newly-added HolidaysItem. See: /{subdirectory}/apidocs/#/data-type-info;dataType=HolidaysItem\n */\n deleteHoliday(holidayId: number) {\n return new Promise((resolve, reject) => {\n var data = {\n HolidayId: holidayId\n }\n this.cw.runRequest('Pll/Holiday/Delete', data).then(r => {\n resolve(r.Value)\n }).catch(e => {\n reject(e)\n })\n })\n }\n\n /**\n * Get all Holidays\n *\n * @category Holidays\n * @return {Object} Returns Promise that represents a collection of HolidaysItems. See: /{subdirectory}/apidocs/#/data-type-info;dataType=HolidaysItem\n */\n getHolidays() {\n return new Promise((resolve, reject) => {\n var data = {}\n this.cw.runRequest('Pll/Holiday/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\nimport { CaseData } from './case_data'\nimport { CaseFinancial } from './case_financial'\nimport { CaseWorkflow} from './case_workflow'\nimport { CaseAdmin } from './case_admin'\n\nexport class Case {\n /**\n * @hidden\n */\n cw: any\n\n\n /**\n * Data Detail methods\n */\n data?: Object\n /**\n * Workflow & task methods\n */\n workflow?: Object\n /**\n * Payment, Receipt, & Fee methods\n */\n financial?: Object\n /**\n * PLL Administration methods\n */\n admin?: Object\n\n\n /**\n * @hidden\n */\n constructor(cw) {\n this.cw = cw\n this.data = new CaseData(cw)\n this.workflow = new CaseWorkflow(cw)\n this.financial = new CaseFinancial(cw)\n this.admin = new CaseAdmin(cw)\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) {\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 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) {\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 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 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) {\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 resolve(r.Value)\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 ID to update\n * @return {Object} Returns Promise that represents a collection of objects describing the cases\n */\n getByIds(caObjectIds: Array<number>) {\n return new Promise((resolve, reject) => {\n var data = {\n CaObjectIds: caObjectIds\n }\n this.cw.runRequest('Pll/CaseObject/ByIds', data).then(r => {\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) {\n return new Promise((resolve, reject) => {\n var data = filters\n this.cw.runRequest('Pll/CaseObject/Search', data).then(r => {\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","import { CWError } from './error'\nimport { General } from './general'\nimport { ActivityLinks } from './activity_link'\nimport { Gis } from './gis'\nimport { MessageQueue } from './message_queue'\nimport { Search } from './search'\nimport { Request } from './request'\nimport { Inspection } from './inspection'\nimport { WorkOrder } from './workorder'\n\nimport { Case } from './case'\n\nconst https = require('https')\nconst querystring = require('querystring')\nconst _ = require('lodash')\n\ninterface postData {\n data?: string\n token?: string\n}\n\n/**\n * Core interface Citywork which defines the access vars for many of the functions and the connection settings\n */\ninterface Citywork {\n base_url: any\n settings: Object\n login?: string\n password?: string\n Token?: string\n gisToken?: string\n gisTokenUrl?: string\n\n default_domain?: any\n\n general?: Object\n activity_link?: Object\n message_queue?: Object\n gis?: Object\n // case?: Object\n inspection?: Object\n workorder?: Object\n request?: Object\n\n case?: Object\n\n extensions: Object\n features: Object\n}\n\n/**\n * Core class Cityworks with most of the authentication and install capabilities functions\n */\nmodule.exports = class Cityworks implements Citywork {\n /**\n * The domain of the cityworks install. Defaults to Cityworks Online\n */\n base_url: string\n /**\n * Stores the currently in use authentication token\n */\n Token?: string\n /**\n * Stores the login username\n */\n login?: string\n /**\n * Holds the login password\n */\n password?: string\n /**\n * Holds the GIS Token for GIS-based Authentication (Portal)\n */\n gisToken?: string\n /**\n * Holds the GIS Token URL for GIS-based Authentication (Portal)\n */\n 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 settings: {\n path: string,\n secure: boolean,\n expires: any,\n default_domain?: any\n }\n error?: Object\n general?: Object\n activity_link?: Object\n message_queue?: Object\n gis?: Object\n search?: Object\n request?: Object\n inspection?: Object\n workorder?: Object\n\n case?: Object\n\n extensions: Object\n features: Object\n 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 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', '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 }\n this.potential_loads = ['general', 'activity_link', 'message_queue', 'gis', 'search', 'request', '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', '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 }\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 if(typeof(load)=='undefined') {\n this.general = new General(this)\n this.activity_link = new ActivityLinks(this)\n this.message_queue = new MessageQueue(this)\n this.request = new Request(this)\n this.inspection = new Inspection(this)\n this.workorder = new WorkOrder(this)\n this.case = new Case(this)\n } else {\n let _this = this\n _.forEach(this.potential_loads, function(v) {\n switch(v) {\n case 'general':\n _this.general = new General(_this)\n break\n case 'activity_link':\n _this.activity_link = new ActivityLinks(_this)\n break\n case 'message_queue':\n _this.message_queue = new MessageQueue(_this)\n break\n case 'gis':\n _this.gis = new Gis(_this)\n break\n case 'search':\n _this.search = new Search(_this)\n break\n case 'request':\n _this.request = new Request(_this)\n break\n case 'case':\n _this.case = new Case(_this)\n break\n case 'inspection':\n _this.inspection = new Inspection(_this)\n break\n case 'workorder':\n _this.workorder = new WorkOrder(_this)\n break\n }\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(path, data)`\n *\n * @param {string} path - The path to the particular endpoint\n * @param {Object} data - The data object to be sent to the Cityworks API\n * @return {Object} Returns Promise object that represents the json object returned from the Cityworks API\n */\n runRequest(path, data) {\n return new Promise((resolve, reject) => {\n let pd = {} as postData\n pd.data = JSON.stringify(data)\n\n if(typeof(this.Token) !== 'undefined' && this.Token != '' && path!='General/Authentication/CityworksOnlineAuthenticate' && path!='General/Authentication/Authenticate') {\n pd.token = this.Token\n }\n let obj: {\n Status: number,\n Message: string\n }\n let options = {\n hostname: this.base_url,\n port: 443,\n path: '/' + this.settings.path + '/services/' + path,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Content-Length': Buffer.byteLength(querystring.stringify(pd))\n },\n timeout: 10000000\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 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(path=='General/ActivityNotification/UserWatching') {\n // console.log(str, options, pd, obj)\n // }\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') { // && typeof(response.Value.Token)!='undefined') {\n // console.log(str, options, pd, obj)\n resolve(obj)\n } else {\n reject(new CWError(3, \"Unknown error.\", {options: options, postedData: pd, api_returned_string: obj}))\n }\n } else {\n reject(new CWError(1, \"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')\n reject(new CWError(1, \"Error parsing JSON.\", {error: e}))\n } else {\n console.log('try/catch error on JSON')\n reject(new CWError(1, \"Error parsing JSON.\"))\n }\n }\n })\n })\n request.write(querystring.stringify(pd))\n request.end()\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(10, 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 * 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\n\n // export default new Cityworks() as cityworks\n"],"names":["CWError","code","message","info","name","this","JSON","stringify","_","require","General","cw","notifications","Promise","resolve","reject","_this","runRequest","then","response","Value","amIWatching","activityType","activityId","aType","null","case","task","provided","potential_activities","_this2","ActivityType","ActivityId","r","e","quickSearch","text","_this3","QuickSearchText","getActivityMetadataByIds","ids","table","tables","indexOf","available","_this4","Ids","TableName","console","log","getWOEntityCostSummary","object_ids","_this5","ObjectIds","searchWOEntityCostSummary","search_id","_this6","SearchId","ActivityLinks","activityTypes","linkTypes","ReversibleMap","set","add","source_type","source_sid","destination_type","destination_sid","link_type","has","options","data","SourceType","get","SourceSid","DestType","DestSid","LinkType","type","sids","ActivitySids","return_data","Array","forEach","link","key","push","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","_this7","user","allDomains","allGroups","_this8","selectedEntities","_this9","MessageQueue","status","hook_types","Pending","Processing","Complete","Failed","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","v","k","value","concat","update","HookType","updateMessageStatus","getWebooks","hook_ids","HookIds","Search","RequestAdmin","Request","admin","create","sr_data","move","x","y","projection","z","base_data","RequestId","X","Y","merge","changeProblem","problemSid","ProblemSid","getById","getByIds","requestIds","RequestIds","getAuditLog","getCustomFields","changeCustomFieldCategory","categoryId","CategoryId","comment","_this10","Comments","cancel","cancelReason","dateCancelled","_this11","uncancel","_this12","close","_this13","Message","reopen","_this14","_this15","searchData","_this16","searchObject","_this17","createSearchDefinition","searchName","sharedWithin","saveDefinition","enableEurl","isString","_this18","getProblemNodes","viewOnly","displayMode","includeCancelled","DomainId","IncludeCancelled","ViewOnly","_this19","getProblems","forPublicOnly","onlyActiveTemplates","domainIds","ForPublicOnly","OnlyActiveTemplates","_this20","getProblemsByKeywords","keywords","_this21","Keywords","getPriorities","_this22","ProblemSids","getCustomFieldTemplate","_this23","getQASettings","_this24","getProblemLeaf","_this25","getStatuses","_this26","DomainIds","getEmployeeLists","listType","includes","_this27","getDispatchTos","getSubmitTos","streetCodes","_this28","getTemplatesById","problemSids","minimumDateModified","maximumDateModified","_this29","createTemplateSearchDefinition","_this30","getTemplateQAs","_this31","searchTemplates","_this32","getTemplates","templateIds","canCreate","includeInactiveIf","CanCreate","IncludeInactiveIf","_this33","getWOTemplates","includeInactive","_this34","IncludeInactive","InspectionAdmin","Inspection","insp_data","createFromEntities","createFromParent","createFromServiceRequest","createFromWorkOrder","InspectionId","inspectionIds","InspectionIds","CancelReason","DateCancelled","statuses","submitTos","includeInactiveEmployees","IncludeInactiveEmployees","connectAsset","entity","updateXY","facility","EntityType","EntityUid","Entity","Facility_Id","Level_Id","getAnswers","inspections","length","getCycleFrom","getCycleIntervals","getCycleTypes","getDistricts","data_init","entityTypes","EntityTypes","forIn","getTemplatesByIds","inspTemplateIds","InspTemplateIds","getTemplateEntityTypes","getQA","getQConditions","deleteAttachments","attachmentIds","AttachmentIds","downloadAttachment","attachmentId","AttachmentId","getAttachmentById","_this35","getAttachments","_this36","WorkOrderAdmin","WorkOrder","wo_data","workOrderSId","s","combine","fromWorkOrderIds","toWorkOrderId","cancelCombinedWorkOrders","CancelCombinedWorkOrders","ToWorkOrderId","FromWorkOrderIds","workOrderId","WorkOrderId","path","workOrderSIds","workorderSId","isNumber","getInstructions","getCustomFieldValues","workorderSIds","getEntities","GetGisData","addEntities","entityInfo","UpdateXY","updateEntity","workComplete","WorkComplete","removeEntities","workOrderIds","WorkOrderIds","getWOsByEntities","entityType","entityUids","getSearchList","getSupervisors","getCategories","getStages","getExpenseTypes","CaseData","CaseFinancial","addFee","caObjectId","feeSetupId","CaObjectId","FeeSetupId","addPayment","addRefund","caPaymentId","refundAmount","CaPaymentId","RefundAmount","addDepositPayment","caDepositId","CaDepositId","addDeposit","depositId","amount","DepositId","addInstrument","instTypeId","dateExpire","InstTypeId","Amount","DateExpire","updateFee","caFeeId","CaFeeId","voidRefund","caPaymentRefundId","voided","CaPaymentRefundId","Voided","addDefaultFees","busCaseId","BusCaseId","addDefaultDeposits","getFees","getDeposits","getPayments","getInstruments","deleteFee","deleteFeesByCaseId","deletePayment","deleteRefund","deletePaymentsByCaseId","deleteDeposit","deleteDepositsByCaseId","deleteInstrument","caInstrumentId","CaInstrumentId","deleteInstrumentsByCaseId","searchFees","filters","intersectionBy","searchPayments","searchRefunds","searchDeposits","getAllFeeTemplates","searchFeeTemplates","searchCaseInstruments","getInstrumentList","addCaseInstrumentRelease","releasedBy","dateReleased","amountReleased","percentReleased","DateReleased","ReleasedBy","deleteCaseInstrumentRelease","caInstReleasesId","CaInstReleasesId","searchCaseInstrumentReleases","fees","searchAvailableFees","getTenderTypes","_this37","addTenderType","_this38","updateTenderType","tenderTypeId","TenderTypeId","_this39","CaseWorkflow","addGroup","caseDataGroupId","groupCode","CaseDataGroupId","GroupCode","addDefaultGroups","wipAddDetail","caseDataDetailId","caDataGroupId","columnSequence","detailCode","detailSequence","CaseDataDetailId","CaDataGroupId","ColumnSequence","DetailCode","DetailSequence","getGroupsByCaseId","deleteGroupsByCaseId","searchForGroups","checkGIS","entityUid","updateGroupsFromAsset","addDetail","updateDetail","caDataDetailId","CaDataDetailId","lockDetail","Lock","unlockDetail","addListValue","listValue","ListValue","deleteListValue","searchForListValueIds","searchForListValueObjects","CaseAdmin","addBusinessCaseTemplate","updateBusinessCaseTemplate","getBusinessCaseTemplates","addCaseType","caseTypeName","caseTypeDesciption","CaseType","CaseTypeDesciption","updateCaseType","caseTypeId","CaseTypeId","getCaseTypes","searchCaseTypeIDs","searchCaseTypeObjects","addSubtype","subTypeName","subTypeDescription","SubType","SubTypeDesc","updateSubtype","subTypeId","SubTypeId","getSubtypes","getExpirations","addExpiration","getDisciplines","addDepartment","departmentCode","departmentName","DepartmentCode","DepartmentName","getDepartments","addDivision","departmentId","divisionName","DepartmentId","DivisionName","getDivisions","addHoliday","holidayDate","holidayDesc","halfDayFlag","HolidayDate","HolidayDesc","deleteHoliday","holidayId","HolidayId","getHolidays","addInspectionTimeBlock","labelText","startTime","endTime","inspTimeBlocksDetails","LabelText","StartTime","EndTime","getInspectionTimeBlocks","getNotificationCases","getNotificationTypes","addNumberingGroup","updateNumberingGroup","numberingGroupId","NumberingGroupId","getNumberingGroups","addPerson","Name","getPeople","addPeopleRole","roleCode","RoleCode","getPeopleRoles","addTaskResultDetail","updateTaskResultDetail","resultDetailId","ResultDetailId","getTaskResultDetails","addTaskResultFeeInsert","_this40","deleteTaskResultFeeInsert","taskResultFeeInsertId","_this41","TaskResultFeeInsertId","deleteTaskResultFeeInsertByTaskId","taskId","_this42","TaskId","updateTaskResultFeeInsert","taskResultId","TaskResultId","_this43","getTaskResultFeeInsert","_this44","Case","workflow","financial","createChild","parentCaObjectId","ParentCaObjectId","createFromRequest","ServiceRequestId","caObjectIds","CaObjectIds","https","querystring","module","exports","base_url","settings","load","Token","login","password","gisToken","gisTokenUrl","error","general","activity_link","message_queue","gis","workorder","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","configure","pd","token","hostname","port","method","headers","Buffer","byteLength","timeout","str","on","chunk","match","obj","parse","postedData","api_returned_string","SyntaxError","write","end","authenticate","LoginName","Password","authenticateWithGISToken","GisToken","GisTokenUrl","Expires","validateToken","setToken","getToken","revokeToken","revokeBefore","RevokeDate","getLocalizationSettings","getTimezoneOptions","getCurrentLocation","licensedApiCheck","area","service","Area","Service","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","version"],"mappings":"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"}
|