Document toolboxDocument toolbox

(2022.1) Tracking Service Features within PCR-360

Overview

With all of the various Service Features that augment the details of an individual Service, tracking these features can prove a challenge for many organizations. PCR does not recommend tracking these features as Services themselves within PCR-360 because this potentially complicates the appearance of the Services when on a Bill, and it is not intuitive to associate two different Services together. Due to the flexibility of PCR-360, your organization has a variety of possible options. Which option is selected will be dependent on Organizational needs.

For information on tracking other types of non-traditional Services, please review our article on Tracking non-traditional Services.

Here are some items to consider:

  • Will the Service Features be Billable?
  • Will the Service Features appear on the Bill?

Depending on Organizational needs, there are three recommended practices for tracking Service Features within PCR-360.

MethodBillingEasy TrackingVisibility on the BillSimple Setup
Using Charges(tick)(error)(tick)(tick)
Using UDFs(error)(tick)(error)(tick)
Hybrid Charges-UDFs(tick)(tick)(tick)(error)

To help illustrate the usage of tracking these Service Features, we will be using the example of Voicemail.

Understanding the available tools

Charges

No matter what method your Organization does for tracking Service Features, if there are plans to Bill, some form of Charge Catalogs will be needed to manage the Charges

It is strongly encouraged to create new Charge Catalogs to represent the Service Feature fees so that they can be changed and updated independently from other Services to ensure clean billing. 

Note: To show an item on a Bill, it must be Active and Assigned to an Owner. Services will not appear on a Bill until they have been activated and assigned to an Owner, and as such, any Service Features on the Service will also not appear.

UDFs

Through User-Defined Fields, your Organization can set up any number of fields desired for the Service Features.

Example Service Features:

  1. Automatic Callback
  2. Automatic Redial
  3. Call Forwarding
  4. Caller ID
  5. Call Waiting
  6. Three-Way Calling
  7. Voicemail

When creating these UDFs to represent a feature, PCR recommends using the Checkbox field type to indicate if the feature is present on the Service.  These UDFs can be associated with one or more different Services Catalogs, so Users do not need to create separate UDFs for Voicemail for a Business Line and a Cellular Phone.

Examples

Using Charges

Tracking Service Features may seem like the ideal solution for tracking the Billing of Service Features. They are easy to apply to a Service, will display on the Bill so the Users are aware of everything they are paying for, and can be seen on a Service's Charges Tab to see what is presently active on the Service.

It takes additional lookups to see what types of Service Features might be available for any given Service Catalog or if specific Locations might restrict the use of a Service Feature. This requires Customer Service Representatives and Customers who might desire these features to have access to an alternate way to identify what is available.  This also makes it less intuitive to identify what might feature might be currently on a Service since a User might not consider looking at the list of Charges on a Service to look for the presence of a feature.  If multiple different Charges are already on a Service, it could make locating a specific item difficult from within PCR-360.

Additionally, if your Organization is not Billing for a Service Feature, these features would be tracked as a Charge on the Service for $0.00 for each Billing Cycle, which may seem strange to a Customer when reviewing their Bill.

PCR recommends this process for when your Organization begins exploring the option of Billing for Service Features, as this is not an ideal solution for tracking these features.

Service Feature - Charge Example

Using UDFs

When using UDFs to track a Service Feature, the feature can be directly requested within (2022.1) CustomerCenter and makes identifying the presence of the feature quickly accessible from internal application records.  However, this will not cause the feature to appear on the Bill, which may make the User of the Service confused when they review their Bill. When not Billing for a Service Feature, using UDFs is the recommended method for tracking Service Features. UDFs make it very clear internally what is available and what is presently active for the Service via the UDF Tab.

Service Feature - UDF Example

Using  Charges and UDFs

When using both Charges and UDFs to track Service Features, your Organization can get the best of both other methods, with only adding a little extra complexity to ensure the status of the Charges is synchronized with the UDF fields. Through a combination of Custom Events and Escalations, your Organization can set up an internal process that when a Service Feature is added or removed from a Service, the Charge will be directly added or stopped on the Service.  Unfortunately, this method does not allow using the Charge on a Service Order where the tech performed the work.  Whether a User is Billed for a Service Feature or not, this is the recommended method to track Service Features; it clearly lays out the Charges to the User.  

Sample Custom Event: Scheduled Maintenance

This example illustrates how your organization can have a custom event that uses custom User-Defined Fields to meet your organizational needs.

Scheduled Maintenance required for Equipment is a key component in using PCR-360 for Facilities Management.  Users can set up a Custom Event that will assist in scheduling regular maintenance for Equipment by automatically creating Incidents for that Equipment to be maintained. In order to create this automated behavior first there need to be three User Defined Fields (UDFs) set to track needed maintenance.


To set up the UDFs first navigate to Admin > User Defined Fields > User Defined Fields. Create the UDFs needed by following these steps:

  1. Create a Maintenance Period Type UDF
    1. Create a new UDF by clicking the 'Add' button.
    2. In the 'UDF Identifier' field set the value to "MAINTENANCE_PERIOD_TYPE".
    3. Add a 'Label' of "Maintenance Period".
    4. Set the 'Field Type' to "Dropdown".
    5. The header should look like this example:
    6. In the 'UDF Associations' click the 'Add' button to open the 'Add New Field Association' form.
      1.  Set the 'Association Table' dropdown to "Eqp Catalog"
      2. Click the 'Save New' button.
      3. Close the 'Manage Field Association' form.
    7. Click the 'Save New' button to save the UDF.
    8. When the form refreshes select the 'Dropdown Options' tab.
      1. Click the 'Add' button and add three new options:
        1. Add a 'Value' and 'Code' of "Years".
        2. Add a 'Value' and 'Code' of "Months".
        3. Add a 'Value' and 'Code' of "Days".
        4. When done the options should look like this:
    9. Close the 'Manage Field Association' form.


  2. Create a Maintenance Period Quantity UDF
    1. Create a new UDF by clicking the 'Add' button.
    2. In the 'UDF Identifier' field set the value to "MAINTENANCE_PERIOD_QTY".
    3. Add a 'Label' of "Maintenance Period Quantity".
    4. Set the 'Field Type' to "Number".
    5. The header should look like this example:
    6. In the 'UDF Associations' click the 'Add' button to open the 'Add New Field Association' form.
      1.  Set the 'Association Table' dropdown to "Eqp Catalog"
      2. Click the 'Save New' button.
      3. Close the 'Manage Field Association' form.
    7. Click the 'Save New' button to save the UDF.


  3. Create a Maintenance Date UDF
    1. Create a new UDF by clicking the 'Add' button.
    2. In the 'UDF Identifier' field set the value to "MAINTENANCE_DATE.
    3. Add a 'Label' of "Maintenance Date".
    4. Set the 'Field Type' to "Date".
    5. The header should look like this example:
    6. In the 'UDF Associations' click the 'Add' button to open the 'Add New Field Association' form.
      1.  Set the 'Association Table' dropdown to "Equipment"
      2. Select an 'Equipment Catalog' to limit the UDF to the type that should set for the regular maintenance.
      3. Click the 'Save New' button.
      4. Close the 'Manage Field Association' form.
    7. Click the 'Save New' button to save the UDF.


Once all of three of the UDFs have been created the next step is to add a Custom Event. To add the Custom Event follow these steps:

  1. Navigate to Admin > Custom Logic > Events.
  2. Click the 'Add' button to start a new Event.
  3. Set the 'Identifier' field to "Scheduled Maintenance".
  4. In the 'Logic' tab enter the logic  from the "Schedule Maintenance" expand below:
  5.  Basic Scheduled Maintenance Example
    <?php
    
    $eqp = $this->query(<<<SQL
        SELECT E.*,
           MAINT_DATE.VALUE as MAINTENANCE_DATE,
           MAINT_PERIOD_TYPE.VALUE as MAINTENANCE_PERIOD_TYPE,
           MAINT_PERIOD_QTY.VALUE as MAINTENANCE_PERIOD_QTY
           
        FROM EQUIPMENT E
        INNER JOIN EQP_CATALOG EC 
            ON EC.RECID = E.EQP_CATALOG_RECID
            
        INNER JOIN V_UDF MAINT_DATE 
            ON E.RECID = MAINT_DATE.VALUE_TABLE_RECID AND MAINT_DATE.VALUE_TABLE_NAME = 'EQUIPMENT' AND MAINT_DATE.IDENTIFIER = 'MAINTENANCE_DATE'
            
        INNER JOIN V_UDF MAINT_PERIOD_TYPE 
            ON EC.RECID = MAINT_PERIOD_TYPE.VALUE_TABLE_RECID AND MAINT_PERIOD_TYPE.VALUE_TABLE_NAME = 'EQP_CATALOG' AND MAINT_PERIOD_TYPE.IDENTIFIER = 'MAINTENANCE_PERIOD_TYPE'
    
        INNER JOIN V_UDF MAINT_PERIOD_QTY 
            ON EC.RECID = MAINT_PERIOD_QTY.VALUE_TABLE_RECID AND MAINT_PERIOD_QTY.VALUE_TABLE_NAME = 'EQP_CATALOG' AND MAINT_PERIOD_QTY.IDENTIFIER = 'MAINTENANCE_PERIOD_QTY'
    
        WHERE MAINT_DATE.VALUE = CURRENT_DATE 
        ;
    SQL
    );
    
    
    foreach($eqp as $equipment){
    
        $incident = [
            "type" => "IN",
            "csr" => "1",
            "owner" => $equipment["OWNER_CONTACTS_RECID"] ? $equipment["OWNER_CONTACTS_RECID"] : $equipment["OWNER_DEPT_HIERARCHY_RECID"],
            "owner_type" => $equipment["OWNER_CONTACTS_RECID"] ? "contact" : "department",
            "description" => "Scheduled Maintenance",
            "prob_code" => 3,
            "equipment" => $equipment["RECID"]
        ];
    
        $result = $this->call("saveServiceDesk", $incident);
    
        $maintenanceDate = new DateTime($equipment["MAINTENANCE_DATE"]);
        $intervalType = substr($equipment["MAINTENANCE_PERIOD_TYPE"], 0, 1);
        $interval = new DateInterval("P{$equipment["MAINTENANCE_PERIOD_QTY"]}{$intervalType}");
        $maintenanceDate->add($interval);
    
        $result = $this->call("saveEquipment", [
            "type" => "UDFS",
            "equipment_recid" => $equipment["RECID"],
            "udf_MAINTENANCE_DATE" => $maintenanceDate->format("Y-m-d")
        ]);
    
    }
  6.  Multiple Time frame Example

    The following example uses 10 separate UDFs to control the Custom Event and allows setting multiple different maintenance periods for the same piece of Equipment.

    <?php
    /*
     * Custom Events
     * Basic Instructions: https://confluence.pcr.com/x/WA2BAQ
     * Since adapted for multiple timeframes on the same catalog
     */
    
    $eqp = $this->query(<<<SQL
        SELECT E.*,
           MAINTENANCE_DATE_ANNUAL.VALUE as MAINTENANCE_DATE_ANNUAL,
           MAINTENANCE_DATE_SEMIANNUAL.VALUE as MAINTENANCE_DATE_SEMIANNUAL,
           MAINTENANCE_DATE_QUARTERLY.VALUE as MAINTENANCE_DATE_QUARTERLY,
           MAINTENANCE_DATE_MONTHLY.VALUE as MAINTENANCE_DATE_MONTHLY,
           MAINTENANCE_DATE_WEEKLY.VALUE as MAINTENANCE_DATE_WEEKLY,
           
           MAINTENANCE_DATE_ANNUAL.DESCRIPTION as MAINTENANCE_DATE_ANNUAL_DESC,
           MAINTENANCE_DATE_SEMIANNUAL.DESCRIPTION as MAINTENANCE_DATE_SEMIANNUAL_DESC,
           MAINTENANCE_DATE_QUARTERLY.DESCRIPTION as MAINTENANCE_DATE_QUARTERLY_DESC,
           MAINTENANCE_DATE_MONTHLY.DESCRIPTION as MAINTENANCE_DATE_MONTHLY_DESC,
           MAINTENANCE_DATE_WEEKLY.DESCRIPTION as MAINTENANCE_DATE_WEEKLY_DESC,
           
           COALESCE(MAINTENANCE_PERIOD_QTY_ANNUAL.VALUE,1) as MAINTENANCE_PERIOD_QTY_ANNUAL,
           COALESCE(MAINTENANCE_PERIOD_QTY_SEMIANNUAL.VALUE,1) as MAINTENANCE_PERIOD_QTY_SEMIANNUAL,
           COALESCE(MAINTENANCE_PERIOD_QTY_QUARTERLY.VALUE,1) as MAINTENANCE_PERIOD_QTY_QUARTERLY,
           COALESCE(MAINTENANCE_PERIOD_QTY_MONTHLY.VALUE,1) as MAINTENANCE_PERIOD_QTY_MONTHLY,
           COALESCE(MAINTENANCE_PERIOD_QTY_WEEKLY.VALUE,1) as MAINTENANCE_PERIOD_QTY_WEEKLY
           
        FROM EQUIPMENT E
        INNER JOIN EQP_CATALOG EC 
            ON EC.RECID = E.EQP_CATALOG_RECID
            
        LEFT JOIN V_UDF MAINTENANCE_DATE_ANNUAL 
            ON E.RECID = MAINTENANCE_DATE_ANNUAL.VALUE_TABLE_RECID 
            AND MAINTENANCE_DATE_ANNUAL.VALUE_TABLE_NAME = 'EQUIPMENT' AND MAINTENANCE_DATE_ANNUAL.IDENTIFIER = 'MAINTENANCE_DATE_ANNUAL'
        LEFT JOIN V_UDF MAINTENANCE_DATE_SEMIANNUAL 
            ON E.RECID = MAINTENANCE_DATE_SEMIANNUAL.VALUE_TABLE_RECID 
            AND MAINTENANCE_DATE_SEMIANNUAL.VALUE_TABLE_NAME = 'EQUIPMENT' AND MAINTENANCE_DATE_SEMIANNUAL.IDENTIFIER = 'MAINTENANCE_DATE_SEMIANNUAL'
        LEFT JOIN V_UDF MAINTENANCE_DATE_QUARTERLY 
            ON E.RECID = MAINTENANCE_DATE_QUARTERLY.VALUE_TABLE_RECID 
            AND MAINTENANCE_DATE_QUARTERLY.VALUE_TABLE_NAME = 'EQUIPMENT' AND MAINTENANCE_DATE_QUARTERLY.IDENTIFIER = 'MAINTENANCE_DATE_QUARTERLY'
        LEFT JOIN V_UDF MAINTENANCE_DATE_MONTHLY 
            ON E.RECID = MAINTENANCE_DATE_MONTHLY.VALUE_TABLE_RECID 
            AND MAINTENANCE_DATE_MONTHLY.VALUE_TABLE_NAME = 'EQUIPMENT' AND MAINTENANCE_DATE_MONTHLY.IDENTIFIER = 'MAINTENANCE_DATE_MONTHLY'
        LEFT JOIN V_UDF MAINTENANCE_DATE_WEEKLY 
            ON E.RECID = MAINTENANCE_DATE_WEEKLY.VALUE_TABLE_RECID 
            AND MAINTENANCE_DATE_WEEKLY.VALUE_TABLE_NAME = 'EQUIPMENT' AND MAINTENANCE_DATE_WEEKLY.IDENTIFIER = 'MAINTENANCE_DATE_WEEKLY'
    
        LEFT JOIN V_UDF MAINTENANCE_PERIOD_QTY_ANNUAL 
            ON EC.RECID = MAINTENANCE_PERIOD_QTY_ANNUAL.VALUE_TABLE_RECID 
            AND MAINTENANCE_PERIOD_QTY_ANNUAL.VALUE_TABLE_NAME = 'EQP_CATALOG' AND MAINTENANCE_PERIOD_QTY_ANNUAL.IDENTIFIER = 'MAINTENANCE_PERIOD_QTY_ANNUAL'
        LEFT JOIN V_UDF MAINTENANCE_PERIOD_QTY_SEMIANNUAL 
            ON EC.RECID = MAINTENANCE_PERIOD_QTY_SEMIANNUAL.VALUE_TABLE_RECID 
            AND MAINTENANCE_PERIOD_QTY_SEMIANNUAL.VALUE_TABLE_NAME = 'EQP_CATALOG' AND MAINTENANCE_PERIOD_QTY_SEMIANNUAL.IDENTIFIER = 'MAINTENANCE_PERIOD_QTY_SEMIANNUAL'
        LEFT JOIN V_UDF MAINTENANCE_PERIOD_QTY_QUARTERLY 
            ON EC.RECID = MAINTENANCE_PERIOD_QTY_QUARTERLY.VALUE_TABLE_RECID 
            AND MAINTENANCE_PERIOD_QTY_QUARTERLY.VALUE_TABLE_NAME = 'EQP_CATALOG' AND MAINTENANCE_PERIOD_QTY_QUARTERLY.IDENTIFIER = 'MAINTENANCE_PERIOD_QTY_QUARTERLY'
        LEFT JOIN V_UDF MAINTENANCE_PERIOD_QTY_MONTHLY 
            ON EC.RECID = MAINTENANCE_PERIOD_QTY_MONTHLY.VALUE_TABLE_RECID 
            AND MAINTENANCE_PERIOD_QTY_MONTHLY.VALUE_TABLE_NAME = 'EQP_CATALOG' AND MAINTENANCE_PERIOD_QTY_MONTHLY.IDENTIFIER = 'MAINTENANCE_PERIOD_QTY_MONTHLY'
        LEFT JOIN V_UDF MAINTENANCE_PERIOD_QTY_WEEKLY 
            ON EC.RECID = MAINTENANCE_PERIOD_QTY_WEEKLY.VALUE_TABLE_RECID 
            AND MAINTENANCE_PERIOD_QTY_WEEKLY.VALUE_TABLE_NAME = 'EQP_CATALOG' AND MAINTENANCE_PERIOD_QTY_WEEKLY.IDENTIFIER = 'MAINTENANCE_PERIOD_QTY_WEEKLY'
    
        WHERE 
    
        (MAINTENANCE_DATE_ANNUAL.VALUE IS NOT NULL
        OR MAINTENANCE_DATE_SEMIANNUAL.VALUE IS NOT NULL
        OR MAINTENANCE_DATE_QUARTERLY.VALUE IS NOT NULL
        OR MAINTENANCE_DATE_MONTHLY.VALUE IS NOT NULL
        OR MAINTENANCE_DATE_WEEKLY.VALUE IS NOT NULL)
        AND
        (MAINTENANCE_DATE_ANNUAL.VALUE = CURRENT_DATE
        OR MAINTENANCE_DATE_SEMIANNUAL.VALUE = CURRENT_DATE
        OR MAINTENANCE_DATE_QUARTERLY.VALUE = CURRENT_DATE
        OR MAINTENANCE_DATE_MONTHLY.VALUE = CURRENT_DATE
        OR MAINTENANCE_DATE_WEEKLY.VALUE = CURRENT_DATE)
        ;
    SQL
    );
    
    $dateTypes = [
        'ANNUAL'     => 'P1Y',
        'SEMIANNUAL' => 'P6M',
        'QUARTERLY'  => 'P3M',
        'MONTHLY'    => 'P1M',
        'WEEKLY'     => 'P1W'
    ];
    $now = new DateTime();
    $now->setTime(0,0);
    
    foreach($eqp as $equipment){
    
        $incident = [
            'type' => 'IN',
            'csr' => '1',
            'owner' => $equipment['OWNER_CONTACTS_RECID'] ? $equipment['OWNER_CONTACTS_RECID'] : $equipment['OWNER_DEPT_HIERARCHY_RECID'],
            'owner_type' => $equipment['OWNER_CONTACTS_RECID'] ? 'contact' : 'department',
            'description' => 'Scheduled Maintenance',
            'prob_code' => 3,
            'equipment' => $equipment['RECID']
        ];
    
        foreach($dateTypes as $dateType => $dateInterval){
            $maintenanceDate = new DateTime($equipment["MAINTENANCE_DATE_{$dateType}"]);
    
            if($maintenanceDate == $now) {
                $incident['description'] = $equipment["MAINTENANCE_DATE_{$dateType}_DESC"];
    
                $result = $this->call('saveServiceDesk', $incident);
                $interval = new DateInterval($dateInterval);
    
                for($qty = 1; $qty <= $equipment["MAINTENANCE_PERIOD_QTY_{$dateType}"]; $qty++){
                    $maintenanceDate->add($interval);
                }
    
                $result = $this->call('saveEquipment', [
                    'type' => 'UDFS',
                    'equipment_recid' => $equipment['RECID'],
                    "udf_MAINTENANCE_DATE_{$dateType}" => $maintenanceDate->format('Y-m-d')
                ]);
            }
        }
    }
  7. Click the 'Save New' button.


    Now that initial data set up is finished, simply find the Equipment Catalog from step 1 and enter information into the two UDFs setup in steps 1 and 2, Maintenance Period and Maintenance Period Quantity respectively. The Quantity should represent how many periods should pass before triggering the event. For example, to set a maintenance period every 3 months, set the Quantity to "3". Next, open the Equipment record and set the Maintenance Period Date UDF to the next Maintenance Date.

    The Custom Event will now automatically run in the background. When the Custom Event runs, a new Incident for each Equipment with a Maintenance Date that matches the current date will be created and then the Maintenance Date will be set to the next interval period. These Incidents can then be worked normally to accomplish the regularly scheduled maintenance tasks.





How to Create an Escalation

Build an Escalation

To build an Escalation that will use a Notification:

  1. Go to Admin > Escalations/Notifications > Escalations.
  2. Click the Add button to open the Escalation builder form:
    Add New Escalation form example
  3. In the Escalation form, fill in the Required fields:
  4. Escalation Name: Give the Escalation a meaningful name.
  5. "Workflow Assigned & Manager Follow-up".
  6. Start Event: Select a System, User-Defined, or SNMP Event that will begin the Escalation.
  7. Must match the Event for the Notification we'll use: "ServiceDesk Item Workflow Assigned".
  8. Add an Abort Event:
  9. From the Abort Events list, check "'"
  10. Sequences: On the Sequences tab, add at least 1 Sequence:
  11. Click the Add button on the grid's toolbar
  12. Fill in required fields:
  13. Sequence #: Any positive integer used to set the order of Sequence execution.
  14. Type: The type of action taken by the Sequence. (described here)
  15. Time To Wait: A time duration (e.g "1h 20m", "1h", "20m", "1", "1.5") that determines how long the Sequence waits to be executed on its turn.
  16. Depending on the Type you select, other Required and optional fields will appear.
  17. Click the Save New button.
  18. Continue adding Sequences by making changes in the form and clicking the smaller Save New button, or close the form.
  19. Close the form.

Packages for applying Service Features

Your Organization can set up a Package to apply specific Service/Equipment options for Users to request from within CustomerCenter. Packages use Service Desk Classifications (SDCs) to automatically add Services, Equipment, and Charges when the User submits a request for the Package. Packages can be used to easily make User requests for specific setups, such as a New Phone Line, Voice Mail, and Call Forwarding into a singular Item from within CustomerCenter for them to request.