PCR-360 Wiki

MS Teams - Add Service

PHP
/**
 * Identifier: msTeamsAddService
 * Check for INACTIVE services with the same Contact Owner
 *  OR Check the AUDIT for previously used Services
 *  OR Grab an available number - oldest available (only pick 578 numbers)
 *
 * Make sure the Serv Catalog is "Phones / Voice Service > Phone Service"
 * Set the Service Host to "MS Teams"
 * Set the Billable flag to false
 * Set a Contact Owner based on the primary User ID from MS Teams "user_id"
 */

/** @var array $request; */

$response = [];
$serviceCatalog = "Phones/Voice Services > Phone Service";

$scatalog = $this->query(<<<SQL
        SELECT SCAT.RECID, SC.REPORT_911
        FROM SERV_CATALOG_TEXTPATH SCAT
        INNER JOIN SERV_CATALOG SC
        ON SC.RECID = SCAT.RECID
        WHERE SCAT.PATH = :serviceCatalog
    SQL,
    [':serviceCatalog' => $serviceCatalog]
);

$teamsSH = 8; //MS Teams
$servStatus = 373; // Active

$contact = $this->query(<<<SQL
        SELECT RECID
        FROM CONTACTS
        WHERE CUSTOMER_NUMBER = :customerNumber
    SQL,
    [':customerNumber' => $request['user_id']]
);

if ($scatalog) {
    if ($contact) {
        $servicesAudit = $availableService = null;

        $inactiveServices = $this->query(<<<SQL
            SELECT S.RECID, SERVICE_ID, SERVICE_ID_FMT
            FROM SERVICES S
            INNER JOIN LISTS S_STATUS ON S_STATUS.RECID = S.SERVICE_STATUS_LISTS_RECID
            WHERE S_STATUS.CODE = 'INACTIVE'
            AND S.SERVICE_ID LIKE '225578%'
            AND S.OWNER_CONTACTS_RECID = {$contact[0]['RECID']}
            ORDER BY S.STATUS_DATE ASC
            LIMIT 1
        SQL);

        if (empty($inactiveServices)) {
            $date = new DateTime();
            $p1m = new DateInterval("P1M");
            $p4m = new DateInterval("P4M");

            $auditTables = [
                'AUDITS',
                'AUDITS_' . $date->sub($p4m)->format('ym'),
                'AUDITS_' . $date->sub($p1m)->format('ym'),
                'AUDITS_' . $date->sub($p1m)->format('ym'),
            ];

            foreach ($auditTables as $auditTable) {
                $servicesAudit = $this->query(<<<SQL
                    SELECT S.RECID, SERVICE_ID, SERVICE_ID_FMT
                    FROM {$auditTable} A
                    INNER JOIN SERVICES S ON A.PRIMARY_KEY = S.RECID AND A.TABLE_NAME = 'SERVICES'
                    INNER JOIN LISTS S_STATUS ON S_STATUS.RECID = S.SERVICE_STATUS_LISTS_RECID
                    WHERE S_STATUS.CODE = 'AVAILABLE'
                    AND S.SERVICE_ID LIKE '225578%'
                    AND CAST(JSON_EXTRACT(A.FROM_DATA, '$.OWNER_CONTACTS_RECID') AS UNSIGNED) = {$contact[0]['RECID']}
                    ORDER BY S.STATUS_DATE ASC
                    LIMIT 1
                SQL);

                if (!empty($servicesAudit)) break;
            }

            if (empty($servicesAudit)) {
                $availableService = $this->query(<<<SQL
                    SELECT S.RECID, SERVICE_ID, SERVICE_ID_FMT
                    FROM SERVICES S
                    INNER JOIN LISTS S_STATUS ON S_STATUS.RECID = S.SERVICE_STATUS_LISTS_RECID
                    WHERE S_STATUS.CODE = 'AVAILABLE'
                    AND S.SERVICE_ID LIKE '225578%'
                    ORDER BY S.STATUS_DATE ASC
                    LIMIT 1
                SQL);
            }
        }

        // if available is not null then it did not find the other options
        $service = $availableService ?? $servicesAudit ?? $inactiveServices;

        if ($service) {

            $udf = $this->query(<<<SQL
                SELECT L.RECID
                FROM LISTS L
                INNER JOIN LIST_TYPES LT ON L.LIST_TYPES_RECID = LT.RECID
                WHERE LT.TYPE = 'UDF_TEAMS_FEATURES'
                AND (L.CODE = 'PPN' OR L.CODE = 'PRIMARY_PHONE_NUMBER')
            SQL);

            $result = $this->call(
                'saveService',
                [
                    'recid' => $service[0]['RECID'],
                    'serv_catalog' => $scatalog[0]['RECID'],
                    'status' => $servStatus,
                    'service_host' => $teamsSH,
                    'owner_type' => 'contact',
                    'owner' => $contact[0]['RECID'],
                    'remarks' => 'Activated by MS Teams API',
                    'billable' => 0,
                    'directory' => 0,
                    'report_911' => $scatalog[0]['REPORT_911'],
                    'udf-TEAMS_FEATURES' => $udf[0]['RECID']
                ]
            );
            if ($result['status'] === 'success') {
                $response['status'] = 'success';
                $response['service_id'] = $service[0]['SERVICE_ID'];
                $response['msteams_type'] = 'Primary Phone Number';
                $response['user_id'] = $request['user_id'];
            } else {
                $response['status'] = 'error';
                $response['message'] = "Failed to Update Service [{$service[0]['SERVICE_ID_FMT']}]: {$result['message']}";
            }
        } else {
            $response['status'] = 'error';
            $response['message'] = 'Cannot find Available Service with Service ID like: (225) 578-';
        }
    } else {
        $response['status'] = 'error';
        $response['message'] = 'Cannot find Contact Owner with Customer Number: ' . $request['user_id'];
    }
} else {
    $response['status'] = 'error';
    $response['message'] = "Cannot find correct Service Catalog: ${serviceCatalog}";
}