<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://calidusassist.adcservices.apteancloud.com/calidus-assist/OBS/index.php?action=history&amp;feed=atom&amp;title=FS_312116_Service_Cancellation_Changes</id>
	<title>FS 312116 Service Cancellation Changes - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://calidusassist.adcservices.apteancloud.com/calidus-assist/OBS/index.php?action=history&amp;feed=atom&amp;title=FS_312116_Service_Cancellation_Changes"/>
	<link rel="alternate" type="text/html" href="https://calidusassist.adcservices.apteancloud.com/calidus-assist/OBS/index.php?title=FS_312116_Service_Cancellation_Changes&amp;action=history"/>
	<updated>2026-07-01T23:25:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://calidusassist.adcservices.apteancloud.com/calidus-assist/OBS/index.php?title=FS_312116_Service_Cancellation_Changes&amp;diff=1233&amp;oldid=prev</id>
		<title>Anw: v0.1 - Initial Creation</title>
		<link rel="alternate" type="text/html" href="https://calidusassist.adcservices.apteancloud.com/calidus-assist/OBS/index.php?title=FS_312116_Service_Cancellation_Changes&amp;diff=1233&amp;oldid=prev"/>
		<updated>2013-09-19T15:23:04Z</updated>

		<summary type="html">&lt;p&gt;v0.1 - Initial Creation&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;div class=&amp;quot;noprint&amp;quot;&amp;gt;&lt;br /&gt;
{{#vardefine:Client|LANE}}&lt;br /&gt;
{{#vardefine:ClientName|Lanemark}}&lt;br /&gt;
{{#vardefine:System|''CALIDUS'' eSERV}}&lt;br /&gt;
{{#vardefine:Doc_Title|Service Cancellation Changes}}&lt;br /&gt;
{{#vardefine:Version|0.1}}&lt;br /&gt;
{{#vardefine:Date|19th September 2013}}&lt;br /&gt;
{{#vardefine:Reference|312116 309371-13/14}}&lt;br /&gt;
{{#vardefine:Year|2013}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Doc_Title&lt;br /&gt;
|Client={{#var:ClientName}}&lt;br /&gt;
|System={{#var:System}}&lt;br /&gt;
|Title={{#var:Doc_Title}}&lt;br /&gt;
|Reference=FS {{#var:Reference}}&lt;br /&gt;
|Version={{#var:Version}}&lt;br /&gt;
|Date={{#var:Date}}&lt;br /&gt;
|Year={{#var:Year}}&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- TOC --&amp;gt; &lt;br /&gt;
&amp;lt;div class=&amp;quot;noprint&amp;quot;&amp;gt;&lt;br /&gt;
= Functional Overview  =&lt;br /&gt;
== Client Requirement  ==&lt;br /&gt;
Allow cancellation of an entire Service Job, requiring Customer and Engineer signature. Allow cancellation of a single serviceable item - no signature need be captured for this.&lt;br /&gt;
&lt;br /&gt;
== Solution Overview  ==&lt;br /&gt;
A '''Cancel Service''' button will be added to the bottom of the ''Job Details'' tab of the Services screen. If for any reason the user wishes to cancel the service, they can click this button.&lt;br /&gt;
&lt;br /&gt;
This will prompt the user to enter the reason why the service of all serviceable items is being cancelled (through a Picker) - these reasons are fully configurable, and is expected to contain a reason (Risk Assessment Failure).&lt;br /&gt;
&lt;br /&gt;
If the entire job is cancelled in this way, the user will then be prompted to obtain a signature of the customer and for themselves. &lt;br /&gt;
&lt;br /&gt;
If there are multiple serviceable items on this service job, a '''Cancel Item''' button will be added to the bottom of the Info screen. If for any reason the user wishes to cancel the service of the particular item shown, they can click this button. This will prompt the user to enter the reason why the item is being cancelled (through a Picker) - these reasons are fully configurable, and is expected to contain a reason (Risk Assessment Failure).&lt;br /&gt;
&lt;br /&gt;
If a single serviceable item is cancelled in this way, the item will be removed from the serviceable items on the Job and the user will be returned to the Job Details display. &lt;br /&gt;
&lt;br /&gt;
== Scope  ==&lt;br /&gt;
* These changes will be made in the latest version of the {{#var:System}} product only.&lt;br /&gt;
* The changes will be made to the Android eSERV client only. &lt;br /&gt;
* {{Warning}} This change requires that the Multiple Serviceable Items change is complete first - see [[#Appendix_B:_Quote_.26_Document_References|Appendix B]] for references. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- NEW PAGE --&amp;gt; &lt;br /&gt;
&lt;br /&gt;
= Set-up  =&lt;br /&gt;
&lt;br /&gt;
== Pre-requisites  ==&lt;br /&gt;
&lt;br /&gt;
== Menu Structure  ==&lt;br /&gt;
&lt;br /&gt;
== Data  ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- NEW PAGE --&amp;gt; &lt;br /&gt;
= Functional Description  =&lt;br /&gt;
== Database/DAL ==&lt;br /&gt;
The EPOD_SERVICE table will be modified to add the following new fields:&lt;br /&gt;
* EPL_REASON_CODE, nvarchar(20)&lt;br /&gt;
* EPL_STATUS, nvarchar(1)&lt;br /&gt;
* EPL_PHOTO_ID, nvarchar(10), nullable&lt;br /&gt;
&lt;br /&gt;
Existing packages will be modified to allow the creating, editing and selecting of the new fields, including but not limited to:&lt;br /&gt;
*    EPOD_SERVICE_INSERT&lt;br /&gt;
*    EPOD_SERVICE_JOB_SEARCH&lt;br /&gt;
*    EPOD_SERVICE_JOB_SELECT&lt;br /&gt;
*    EPOD_SERVICE_SELECT&lt;br /&gt;
*    EPOD_SERVICE_UPDATE &lt;br /&gt;
&lt;br /&gt;
The existing EPOD_SERVICE/SERVICE_JOB DAL object will be changed to:&lt;br /&gt;
*    Export the new fields in XML requests&lt;br /&gt;
*    Read the new fields&lt;br /&gt;
{{Note}} It is not necessary to add these fields as searchable items. However, if allowing this keeps the packages and DAL objects standard in design, then this can also be done, within the DAL and the packages.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
Changes will be made when processing a JOB_UPDATE message returned from the PDA, as follows:&lt;br /&gt;
* Store EPL_STATUS and EPL_REASON_CODE, if present in the message.&lt;br /&gt;
&lt;br /&gt;
Changes will be made when processing a PHOTO_REQUEST message returned from the PDA, as follows:&lt;br /&gt;
* If the element EPL_PHOTO_TYPE is &amp;quot;S&amp;quot; (Service):&lt;br /&gt;
** Get the EPOD_SERVICE item through the DAL object, using the passed in tag values of EPL_SITE_ID, EPL_JOB_ID, EPL_SERVICE_ID&lt;br /&gt;
** Process the rest of the photo as normal, but tag the EPL_PHOTO_ID of the record above with the generated EPL_PHOTO_ID.&lt;br /&gt;
&lt;br /&gt;
== Admin ==&lt;br /&gt;
{{Note}} Serviceable Items that have been cancelled on a completed job are still to be reported on in the Service Reports produced for the Service Job, showing only the Risk Assessment sheet, with the Job Signatures. This is specified elsewhere.&lt;br /&gt;
&lt;br /&gt;
The Service screen (service_job.aspx) will be modified to display the status of individual Service Items on Grid, not Job. This will be achieved by displaying the translated EPL_STATUS from EPOD_SERVICE, not EPOD_JOB.&lt;br /&gt;
&lt;br /&gt;
{{Note}} The Job screen will show the status of the Service as a whole, by showing the status of the Job record.&lt;br /&gt;
&lt;br /&gt;
The Service Details screen (service_detail.aspx) will be modified to:&lt;br /&gt;
* Display the status of Service Item under the main Service title. The status should be translated as follows:&lt;br /&gt;
** &amp;quot;C&amp;quot; - Complete&lt;br /&gt;
** &amp;quot;X&amp;quot; - Cancelled&lt;br /&gt;
** &amp;quot; &amp;quot; or &amp;quot;P&amp;quot; - Pending&lt;br /&gt;
* Display the Reason Code from the service record and the description from the Reason Codes table if the serviceable item's status is cancelled. This should be displayed under the main Service title, to the right of the status.&lt;br /&gt;
* Add a '''Image''' button, if an image is present on the Service record, floating on the right of the title. When clicked, the screen should display a pop-up window, showing the image associated to the associated service record, with a '''Close''' button, to close the window when viewed.&lt;br /&gt;
&lt;br /&gt;
[[File:FS_311856_1.PNG|border|600px]]&lt;br /&gt;
&amp;lt;br /&amp;gt;New Job Details screen&lt;br /&gt;
&lt;br /&gt;
{{Note}} This sample shows the modification defined under SCR 311856, referenced in [[#Appendix_B:_Quote_.26_Document_References|Appendix B]].&lt;br /&gt;
 &lt;br /&gt;
== Android Client ==&lt;br /&gt;
The EPOD_SERVICE table should be modified to add the following fields:&lt;br /&gt;
* EPL_REASON_CODE, nvarchar(20)&lt;br /&gt;
* EPL_STATUS, nvarchar(1)&lt;br /&gt;
* EPL_PHOTO_ID, nvarchar(10)&lt;br /&gt;
&lt;br /&gt;
{{Note}} As the database structure is changing with this version, the default values must be carefully set and the database creation script modified to ensure that the standing data is re-downloaded from the server after the changes have been made. This is achieved by setting the &amp;quot;last version changed&amp;quot; variable (lngLastVersionDB) in DBConnection to the latest version number. &lt;br /&gt;
&lt;br /&gt;
The method PDA_SERVICE.ToUpdateXElement will be modified to add EPL_STATUS and EPL_REASON_CODE tags after EPL_SERVICE_TYPE.&lt;br /&gt;
&lt;br /&gt;
The resulting XML extraction for a job should then look as follows (for each EPOD_SERVICE record found):&lt;br /&gt;
    &amp;lt;SERVICE&amp;gt;&lt;br /&gt;
      &amp;lt;EPL_SERVICE_ID&amp;gt;&amp;lt;/EPL_SERVICE_ID&amp;gt;&lt;br /&gt;
      &amp;lt;EPL_SERVICE_TYPE&amp;gt;&amp;lt;/EPL_SERVICE_TYPE&amp;gt;&lt;br /&gt;
      &amp;lt;EPL_REASON_CODE&amp;gt;&amp;lt;/EPL_REASON_CODE&amp;gt;&lt;br /&gt;
      &amp;lt;EPL_STATUS&amp;gt;&amp;lt;/EPL_STATUS&amp;gt;&lt;br /&gt;
      &amp;lt;EPL_REASON_CODE&amp;gt;&amp;lt;/EPL_REASON_CODE&amp;gt;&lt;br /&gt;
      &amp;lt;PREWORK&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_PREWORK_INTERIOR&amp;gt;&amp;lt;/EPL_PREWORK_INTERIOR&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_PREWORK_EXTERIOR&amp;gt;&amp;lt;/EPL_PREWORK_EXTERIOR&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_PREWORK_ELECTRIC&amp;gt;&amp;lt;/EPL_PREWORK_ELECTRIC&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_UDF_PREWORK&amp;gt;&amp;lt;/EPL_UDF_PREWORK&amp;gt;&lt;br /&gt;
      &amp;lt;/PREWORK&amp;gt;&lt;br /&gt;
      &amp;lt;POSTWORK&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_POSTWORK_INTERIOR&amp;gt;&amp;lt;/EPL_POSTWORK_INTERIOR&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_POSTWORK_EXTERIOR&amp;gt;&amp;lt;/EPL_POSTWORK_EXTERIOR&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_POSTWORK_ELECTRIC&amp;gt;&amp;lt;/EPL_POSTWORK_ELECTRIC&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_UDF_POSTWORK&amp;gt;&amp;lt;/EPL_UDF_POSTWORK&amp;gt;&lt;br /&gt;
      &amp;lt;/POSTWORK&amp;gt;&lt;br /&gt;
      &amp;lt;INFO&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_UNIT_TYPE&amp;gt;&amp;lt;/EPL_UNIT_TYPE&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_CODE_2&amp;gt;&amp;lt;/EPL_CODE_2&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_CODE_1&amp;gt;&amp;lt;/EPL_CODE_1&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_MILEAGE&amp;gt;&amp;lt;/EPL_MILEAGE&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_CODE_3&amp;gt;&amp;lt;/EPL_CODE_3&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_SPEC_REQUIRED&amp;gt;&amp;lt;/EPL_SPEC_REQUIRED&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_SERVICE_GROUP&amp;gt;&amp;lt;/EPL_SERVICE_GROUP&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_SYSTEM_TYPE&amp;gt;&amp;lt;/EPL_SYSTEM_TYPE&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_UDF_INFO&amp;gt;&amp;lt;/EPL_UDF_INFO&amp;gt;&lt;br /&gt;
      &amp;lt;/INFO&amp;gt;&lt;br /&gt;
      &amp;lt;MC_REF&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_MC_REF_1&amp;gt;&amp;lt;/EPL_MC_REF_1&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_MC_REF_2&amp;gt;&amp;lt;/EPL_MC_REF_2&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_MC_REF_3&amp;gt;&amp;lt;EPL_MC_REF_3&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_MC_REF_4&amp;gt;&amp;lt;/EPL_MC_REF_4&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_MC_REF_NARRATIVE&amp;gt;&amp;lt;/EPL_MC_REF_NARRATIVE&amp;gt;&lt;br /&gt;
      &amp;lt;/MC_REF&amp;gt;&lt;br /&gt;
      &amp;lt;DIAGNOSIS&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_DIAGNOSIS_NARRATIVE&amp;gt;&amp;lt;/EPL_DIAGNOSIS_NARRATIVE&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_CUSTOMER_DAMAGE&amp;gt;&amp;lt;/EPL_CUSTOMER_DAMAGE&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_VNOS&amp;gt;&amp;lt;/EPL_VNOS&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_CHECKBOX_1&amp;gt;&amp;lt;/EPL_CHECKBOX_1&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_CHECKBOX_2&amp;gt;&amp;lt;/EPL_CHECKBOX_2&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_CHECKBOX_3&amp;gt;&amp;lt;/EPL_CHECKBOX_3&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_UDF_DIAGNOSIS&amp;gt;&amp;lt;/EPL_UDF_DIAGNOSIS&amp;gt;&lt;br /&gt;
      &amp;lt;/DIAGNOSIS&amp;gt;&lt;br /&gt;
      &amp;lt;PRODUCT&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_PRODUCT_ID&amp;gt;&amp;lt;/EPL_PRODUCT_ID&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_QUANTITY&amp;gt;&amp;lt;/EPL_QUANTITY&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_DIRECTION&amp;gt;&amp;lt;/EPL_DIRECTION&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_RETURN&amp;gt;&amp;lt;/EPL_RETURN&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_DESCRIPTION&amp;gt;&amp;lt;/EPL_DESCRIPTION&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_VEHICLE_ID&amp;gt;&amp;lt;/EPL_VEHICLE_ID&amp;gt;&lt;br /&gt;
      &amp;lt;/PRODUCT&amp;gt;&lt;br /&gt;
      &amp;lt;ACTIVITY&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_ACTIVITY_CODE&amp;gt;&amp;lt;/EPL_ACTIVITY_CODE&amp;gt;&lt;br /&gt;
        &amp;lt;EPL_QUANTITY&amp;gt;&amp;lt;/EPL_QUANTITY&amp;gt;&lt;br /&gt;
      &amp;lt;/ACTIVITY&amp;gt;&lt;br /&gt;
    &amp;lt;/SERVICE&amp;gt;&lt;br /&gt;
{{Note}} This includes the changes made under references 311577, 311636, 311753, 311801 and 311856. &lt;br /&gt;
&lt;br /&gt;
The PDA_SERVICE DAL object should be modified to add these parameters, and add these fields to all functions.&lt;br /&gt;
&lt;br /&gt;
The PDA_SERVICE DAL method should also be modified to add a Cancel method, receiving a Reason Code parameter. This should:&lt;br /&gt;
* Set EPL_STATUS to &amp;quot;X&amp;quot;&lt;br /&gt;
* Set EPL_REASON_CODE to the Reason Code parameter passed in.&lt;br /&gt;
* Update the record (through this.Update)&lt;br /&gt;
&lt;br /&gt;
The PDA_JOB DAL Cancel method will be modified to loop through any PDA_SERVICE objects in the PDASERVICE collection and call the new Cancel method on these objects, regardless of their current status.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A '''Cancel Service''' button will be added to the bottom of the Job Details tab of the Services screen. If for any reason the user wishes to cancel the service (i.e. the whole job with all Serviceable Items), they can click this button.&lt;br /&gt;
&lt;br /&gt;
This will start the Cancellation form (from Cancellation.js) through a new helper function CancelService. This will call Cancellation with a Job type of &amp;quot;SERVICE_JOB&amp;quot;. The callback function passed to this helper function should simply check whether the service has been cancelled and if so, close the window and call the callback function passed to it from the Job Details screen.&lt;br /&gt;
&lt;br /&gt;
The Cancellation function will be modified to recognise the new Job type and do the following:&lt;br /&gt;
* Change the labels to appropriate text (similar to JOB cancellation) as follows:&lt;br /&gt;
** Cancellation_jobIDHeaderLB = &amp;quot;Cancel Service&amp;quot;&lt;br /&gt;
** Cancellation_jobCancelLB = &amp;quot;Are you sure you wish to cancel service &amp;quot; + EPL_JOB_CODE + &amp;quot; - all items will be cancelled.&amp;quot;&lt;br /&gt;
* On clicking the '''OK''' button, the process should require the user to enter the signatures if configured to do so. The code required to do this can be seen when completing a service normally in SM_Service.js, in the code for the click event of vars.completeBt. On completion of this code (through a callback) the Job should then be cancelled (through PDA_JOB.Cancel), and the callback routine of the Services screen called.&lt;br /&gt;
&lt;br /&gt;
The result of these changes should be as described in the test plan, as seen in [[#Appendix A: TEST PLAN|Appendix A]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If there are multiple serviceable items on this service job, a '''Cancel Item''' button will be added to the bottom of the Info tab on the Services screen, above the existing '''Pre-work Checks''' button. If for any reason the user wishes to cancel the service of the particular item shown, they can click this button. &lt;br /&gt;
&lt;br /&gt;
This will start the Cancellation form (from Cancellation.js) through a new helper function CancelServiceItem. This will call Cancellation with a Job type of &amp;quot;SERVICE_ITEM&amp;quot;. The data item passed to this function should be the current PDA_SERVICE DAL object. The callback function passed to this helper function should simply check whether the service item has been cancelled and if so, refresh the Job and refresh the Service window, moving to the first Serviceable Item in the PDA_SERVICES collection - use the function created for the Multiple Serviceable Items development for this.&lt;br /&gt;
&lt;br /&gt;
{{Note}} If the result of cancelling a Serviceable Item is that there is only one serviceable item left on the job, remove the &amp;quot;Cancel Item&amp;quot; button and any navigation buttons and information from the Services screen.&lt;br /&gt;
&lt;br /&gt;
The Cancellation function will be modified to recognise the new Job type and do the following:&lt;br /&gt;
* Change the labels to appropriate text (similar to JOB cancellation) as follows:&lt;br /&gt;
** Cancellation_jobIDHeaderLB = &amp;quot;Cancel Service Item&amp;quot;&lt;br /&gt;
** Cancellation_jobCancelLB = &amp;quot;Are you sure you wish to cancel service item &amp;quot; + EPL_SERVICE_ID.&lt;br /&gt;
* On clicking the '''OK''' button, the Serviceable Item should then be cancelled (through the new EPOD_SERVICE DAL method Cancel) and the callback routine of the Services screen called. {{Note}} Any image taken against the cancelled Service will be tagged against the service record by the already-existing code (when updating pDataObj.EPL_PHOTO_ID in the click event of vars.btnOK.&lt;br /&gt;
&lt;br /&gt;
The result of these changes should be as described in the test plan, as seen in [[#Appendix A: TEST PLAN|Appendix A]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Note}} The '''Cancel Job''' button on the Job Details screen will not be modified, as this is intended for use when the user is unable to complete the job because of situation not caused by the customer or site (e.g. Road conditions, Breakdown, No Access, etc).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When confirming that a Service has been completed, the validateService function of SM_Service.js will change to ensure that only Serviceable Items with an EPL_SERVICE_ID not &amp;quot;X&amp;quot; are validated against.&lt;br /&gt;
&lt;br /&gt;
Standard processing on a Serviceable item when completing a Job (in the existing function saveService in SM_Services.js) should be to set the EPL_STATUS of any PDA_SERVICE record that is not already Cancelled to &amp;quot;C&amp;quot;, to show that it is complete.&lt;br /&gt;
&lt;br /&gt;
{{Note}} The above simplifies the processing specified within the Multiple Service Items change, and should be referenced there when that is being completed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When processing a Job Update back to the EPOD Server (called in this case when a whole Service Job is Cancelled or Completed), the process must be modified to check for any images associated to Service records.&lt;br /&gt;
&lt;br /&gt;
This means that the existing function ProcessPhotos in Webservices.js to loop through all EPOD_SERVICE records and check for any with a non-blank value of EPL_PHOTO_ID and, if found, call PhotoUploadRequest. The parameters passed to this function will be:&lt;br /&gt;
* SITE = SITE&lt;br /&gt;
* USER = USER&lt;br /&gt;
* PASSWORD = PASSWORD&lt;br /&gt;
* EPL_SITE_ID = PDAJOB.EPL_SITE_ID&lt;br /&gt;
* EPL_JOB_ID = PDAJOB.EPL_JOB_ID&lt;br /&gt;
* EPL_SERVICE_ID = PDASERVICES[x].PDA_SERVICE.EPL_SERVICE_ID&lt;br /&gt;
* EPL_PHOTO_TYPE = &amp;quot;S&amp;quot;&lt;br /&gt;
* All other parameters = ''&lt;br /&gt;
{{Note}} The code for this can be copied almost directly from the containers and products processing in the same function. Also, ensure that all existing calls to this function set the EPL_SERVICE_ID parameter to a zero-length string.&lt;br /&gt;
&lt;br /&gt;
The existing function PhotoUploadRequest must be modified as follows:&lt;br /&gt;
* A new parameter EPL_SERVICE_ID added after EPL_JOB_ID&lt;br /&gt;
* A new tag (EPL_SERVICE_ID) added after EPL_JOB_ID, populated using the passed-in parameter&lt;br /&gt;
&lt;br /&gt;
The new Photo Request XML structure will look as follows:&lt;br /&gt;
 &amp;lt;PHOTO_REQUEST ID=&amp;quot;0&amp;quot; SITE=&amp;quot;SITE&amp;quot; USER=&amp;quot;USER&amp;quot; PASSWORD=&amp;quot;PASSWORD&amp;quot; &lt;br /&gt;
     DEVICE_ID=&amp;quot;DEVICE_ID&amp;quot; GPS_STAMP=&amp;quot;latlon&amp;quot; &lt;br /&gt;
     DEVICE_OS=&amp;quot;osname version&amp;quot; DEVICE_TYPE=&amp;quot;model&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;EPL_SITE_ID&amp;gt;&amp;lt;/EPL_SITE_ID&amp;gt;&lt;br /&gt;
   &amp;lt;EPL_JOB_ID&amp;gt;&amp;lt;/EPL_JOB_ID&amp;gt;&lt;br /&gt;
   &amp;lt;EPL_SERVICE_ID&amp;gt;&amp;lt;/EPL_SERVICE_ID&amp;gt;&lt;br /&gt;
   &amp;lt;EPL_CONTAINER_ID&amp;gt;&amp;lt;/EPL_CONTAINER_ID&amp;gt;&lt;br /&gt;
   &amp;lt;EPL_PRODUCT_CODE&amp;gt;&amp;lt;/EPL_PRODUCT_CODE&amp;gt;&lt;br /&gt;
   &amp;lt;EPL_SEQUENCE&amp;gt;&amp;lt;/EPL_SEQUENCE&amp;gt;&lt;br /&gt;
   &amp;lt;EPL_PHOTO&amp;gt;&amp;lt;/EPL_PHOTO&amp;gt;&lt;br /&gt;
   &amp;lt;EPL_DESCRIPTION&amp;gt;&amp;lt;/EPL_DESCRIPTION&amp;gt;&lt;br /&gt;
   &amp;lt;EPL_PHOTO_TYPE&amp;gt;J|C|P|S&amp;lt;/EPL_PHOTO_TYPE&amp;gt;&lt;br /&gt;
   &amp;lt;EPL_PACKET&amp;gt;/EPL_PACKET&amp;gt; - only if message sent in chunks&lt;br /&gt;
   &amp;lt;EPL_PACKET_TOTAL&amp;gt;10/EPL_PACKET_TOTAL&amp;gt; - only if message sent in chunks&lt;br /&gt;
   &amp;lt;REQUEST_TIME_DATE&amp;gt;YYYY-MM-DDTHH:MM:SS&amp;lt;/REQUEST_TIME_DATE&amp;gt;&lt;br /&gt;
 &amp;lt;/PHOTO_REQUEST&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- NEW PAGE --&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- MEDIA LANDSCAPE YES --&amp;gt; &lt;br /&gt;
= Appendix A: TEST PLAN  =&lt;br /&gt;
{{TestPlan_Header&lt;br /&gt;
|Title={{#var:Doc_Title}}&lt;br /&gt;
|Log={{#var:Reference}}&lt;br /&gt;
|Description=To test cancellation functionality within the Services process.&lt;br /&gt;
|MenuAccess=Services&lt;br /&gt;
|Prerequisites=Ensure there are single- and multiple-item jobs (with at least 3 items) to check.&lt;br /&gt;
|Objective=To test that: single-item jobs can be cancelled, multiple item jobs can be cancelled; individual items can be cancelled from a multiple-item job and; cancelled service jobs and items (and associated status, reasons and images) can be viewed in Admin.&lt;br /&gt;
}}&lt;br /&gt;
{{TestPlan_CycleHeader&lt;br /&gt;
|Cycle={{ #vardefineecho: Cycle | {{ #expr: {{ #var: Cycle }} + 1 }} }}{{ #vardefine: SubCycle | {{ #var: Cycle }} }}&lt;br /&gt;
|Title=PDA&lt;br /&gt;
|Notes=&lt;br /&gt;
}} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Click '''Cancel Job''' on a single-item service job from the ''Job Details'' tab of the Service screen.&lt;br /&gt;
|Result=The Cancellation form should be shown.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Click '''Back'''&lt;br /&gt;
|Result=The ''Job Details'' tab should be shown again&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Click '''Cancel Job''' again. Enter a reason code. Click '''OK'''.&lt;br /&gt;
|Result=The Signature forms should be shown.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Complete the signatures required.&lt;br /&gt;
|Result=The job should be cancelled. You should be returned to the Job List screen and informed of this. The job should be removed from the list.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Click '''Cancel Job''' on a multiple-item service job from the Job Details tab of the Service screen.&lt;br /&gt;
|Result=The Cancellation form should be shown.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Click the '''Image''' button and take an image. Enter a description. Choose a reason, click '''OK''', enter all signatures and confirm.&lt;br /&gt;
|Result=The job should be cancelled. You should be returned to the Job List screen and informed of this. The job should be removed from the list.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Start a multiple-item service job. Click the ''Info'' tab.&lt;br /&gt;
|Result=A '''Cancel Item''' button should be present.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Click the '''Cancel Item''' button.&lt;br /&gt;
|Result=The Cancellation form should be shown.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Click '''Back'''&lt;br /&gt;
|Result=The Info tab should be shown again, on the same item.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Click '''Cancel Item''' again. Choose a reason, click '''OK'''&lt;br /&gt;
|Result=The item should be cancelled. You should be returned to the ''Info'' tab and informed of this. The item should be removed from the service and the count shown as &amp;quot;1 / 2&amp;quot;.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Click '''Next'''. Click '''Cancel Item''' again. Click the '''Image''' button and take an image. Enter a description. Choose a reason, click '''OK'''&lt;br /&gt;
|Result=The item should be cancelled. You should be returned to the ''Info'' tab and informed of this. The item should be removed from the service. The '''Cancel Item''' button should be removed, as well as the navigation buttons and count.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Complete the last Item (originally item 2) normally.&lt;br /&gt;
|Result=The item is completed. You should be returned to the Job List screen and informed of this. The job should be removed from the list.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Check all returned data (in the server-side log)&lt;br /&gt;
|Result=The XML includes the status and reason code tags. Cancelled items have these populated correctly. These are blank for completed items. Any images have been sent back associated to the correct Service ID.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Check the jobs in the database.&lt;br /&gt;
|Result=All have been updated as expected.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_CycleFooter}} &lt;br /&gt;
&lt;br /&gt;
{{TestPlan_CycleHeader&lt;br /&gt;
|Cycle={{ #vardefineecho: Cycle | {{ #expr: {{ #var: Cycle }} + 1 }} }}{{ #vardefine: SubCycle | {{ #var: Cycle }} }}&lt;br /&gt;
|Title=Admin&lt;br /&gt;
|Notes=&lt;br /&gt;
}} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Use the Services screen to find a service job with multiple serviceable items, that has had some items cancelled (plus one with an image)&lt;br /&gt;
|Result=All items are shown on the grid, with the cancelled items showing with that status.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Use the Services screen to find a cancelled service job with multiple serviceable items&lt;br /&gt;
|Result=All items are shown on the grid, with all items showing as cancelled.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Use the Job screen to find a service job with multiple serviceable items, that has had some items cancelled (plus one with an image)&lt;br /&gt;
|Result=One line should show per job, with the status shown as Completed.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Click '''Details'''&lt;br /&gt;
|Result=The Service Details screen should be shown. The Job Details section should show the status as Complete. A Service section should appear for each service item. Cancelled Service items should display the status as Cancelled, with the reason code and description shown. Completed Service items should display the status as Completed, with no reason code displayed.  Any cancelled items with an Image should show an '''Image''' button.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Click '''Image'''&lt;br /&gt;
|Result=The image taken for the cancellation is shown.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Use the Job screen to find a cancelled service job with multiple serviceable items&lt;br /&gt;
|Result=One line should show per job, with the status shown as Completed.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_Test&lt;br /&gt;
|Test={{ #vardefineecho: SubCycle | {{ #expr: {{ #var: SubCycle }} + 0.01 }} }}&lt;br /&gt;
|Action=Click '''Details'''&lt;br /&gt;
|Result=As before, but the each service item's status should be shown as Cancelled.&lt;br /&gt;
|Remarks= |PassFail= }} {{TestPlan_CycleFooter}} &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- MEDIA LANDSCAPE NO --&amp;gt; &lt;br /&gt;
{{Doc_Appendix&lt;br /&gt;
|Appendix=B&lt;br /&gt;
|Estimate=Y&lt;br /&gt;
|Glossary=EPOD&lt;br /&gt;
|Ref1=[http://{{SERVERNAME}}/calidus-assist/EPOD/index.php/UG_291094_EPOD_Admin_User_Guide UG 291094 EPOD Admin User Guide]&lt;br /&gt;
|RefV1=2.0&lt;br /&gt;
|RefDate1=4/4/2012&lt;br /&gt;
|Ref2=[http://{{SERVERNAME}}/calidus-assist/EPOD/index.php/UG_291097_EPOD_Client_User_Guide UG 291097 EPOD Client User Guide]&lt;br /&gt;
|RefV2=3.0&lt;br /&gt;
|RefDate2=23/4/2013&lt;br /&gt;
|Ref3=[[REQ 309371 Lanemark eSERV Requirements]]&lt;br /&gt;
|RefV3=0.4&lt;br /&gt;
|RefDate3=29/08/2013&lt;br /&gt;
|Ref4=[[FS 311856 Multiple Serviceable Items]]&lt;br /&gt;
|RefV4=0.2&lt;br /&gt;
|RefDate4=19/09/2013&lt;br /&gt;
|REQ=0&lt;br /&gt;
|EST=0&lt;br /&gt;
|FS=0.75&lt;br /&gt;
|TS=0.0&lt;br /&gt;
|DEV=3.25&lt;br /&gt;
|ST=0.50&lt;br /&gt;
|IMP=0&lt;br /&gt;
|FOC=Y&lt;br /&gt;
|Client={{#var:Client}}&lt;br /&gt;
|Year={{#var:Year}}&lt;br /&gt;
|FSEST=N&lt;br /&gt;
|Rev1=Julie Taylor&lt;br /&gt;
|Rev1Title=OBS Project Manager&lt;br /&gt;
|Rev2=Jeff Foster&lt;br /&gt;
|Rev2Title=Client Representative&lt;br /&gt;
|Rev3=Alan Thompson&lt;br /&gt;
|Rev3Title=Client Representative&lt;br /&gt;
}}&amp;lt;/div&amp;gt; &lt;br /&gt;
[[Category:{{#var:Client}} FS]]&lt;/div&gt;</summary>
		<author><name>Anw</name></author>
	</entry>
</feed>