BJB_RingCentralRestResource

 avatar
unknown
apex
a year ago
6.5 kB
12
Indexable
@RestResource(UrlMapping='/getRecords')
global without sharing class BJB_RingCentralRestResource {

    private static final String RECEPTION = 'Reception';
    private static final String INTAKE = 'Intake';

    private static final String MATTER_OBJECT = 'Matter';
    private static final String ACCOUNT_OBJECT = 'Account';
    private static final String INTAKE_OBJECT = 'Intake';


    @HttpGet
    global static List<BJB_RingCentralRestResource.RecordWrapper> getRecords() {

        Map<String, String> params = RestContext.request.params;
        List<BJB_RingCentralRestResource.RecordWrapper> result = new List<BJB_RingCentralRestResource.RecordWrapper>();

        String inputNumber = params.get('number');
        Set<String> formattedNumbers = formatNumber(inputNumber);

        List<litify_pm__Matter__c> matters = getMatters(formattedNumbers);
        for (litify_pm__Matter__c matter : matters) {
            result.add(new BJB_RingCentralRestResource.RecordWrapper(MATTER_OBJECT, matter));
        }

        if(result.isEmpty()) {
            List<litify_pm__Intake__c> intakes = getIntakes(formattedNumbers);
            for (litify_pm__Intake__c intake : intakes) {
                result.add(new BJB_RingCentralRestResource.RecordWrapper(INTAKE_OBJECT, intake));
            }
        }

        if(result.isEmpty()) {
            List<Account> accounts = getParties(formattedNumbers);
            for (Account acc : accounts) {
                result.add(new BJB_RingCentralRestResource.RecordWrapper(ACCOUNT_OBJECT, acc));
            }
        }

        if(result.isEmpty() && isMarketing(inputNumber)) {
            result.add(new BJB_RingCentralRestResource.RecordWrapper(ACCOUNT_OBJECT, new Account()));
        }

        createCallLog(result, inputNumber);

        if(result.isEmpty()) {
            return null;
        }

        return result;
    }

    private static Boolean isMarketing (String inputNumber) {
        return inputNumber.startsWith('888') || inputNumber.startsWith('800') || inputNumber.startsWith('877');
    }

    private static Set<String> formatNumber(String inputNumber) {
        String inputFormattedNumber = inputNumber.replaceAll('(\\d{3})(\\d{3})(\\d{4})', '($1) $2-$3');
        String inputFormattedNumberWithHyphen = inputNumber.replaceAll('(\\d{3})(\\d{3})(\\d{4})', '$1-$2-$3');
        String inputFormattedNumberWithDots = inputNumber.replaceAll('(\\d{3})(\\d{3})(\\d{4})', '$1.$2.$3');

        Set<String> numbers = new Set<String>{
                '%' + inputNumber + '%',
                '%' + inputFormattedNumberWithDots + '%',
                '%' + inputFormattedNumberWithHyphen + '%',
                '%' + inputFormattedNumber + '%'};
        return numbers;
    }

    private static List<Account> getParties(Set<String> numbers) {
        return [
                SELECT Id
                FROM Account
                WHERE litify_pm__Phone_Mobile__c LIKE :numbers
                    OR litify_pm__Phone_Home__c LIKE :numbers
                    OR AVSFQB__Phone__c LIKE :numbers
                    OR dm_Phone_Other_2__c LIKE :numbers
                    OR dm_Phone_Other_3__c LIKE :numbers
                    OR dm_Phone_Other_4__c LIKE :numbers
                    OR dm_Phone_Other_5__c LIKE :numbers
                    OR Emergency_Contact_Phone__c LIKE :numbers
                    OR Fax LIKE :numbers
                    OR litify_pm__Phone_Other__c LIKE :numbers
                    OR litify_pm__Phone_Work__c LIKE :numbers
                    OR Phone_Number_Comments__c LIKE :numbers
                    OR PIP_Arb_Contact_Phone__c LIKE :numbers
                    OR Preferred_Phone_Number__c LIKE :numbers
                    OR Phone LIKE :numbers
        ];
    }

    private static List<litify_pm__Matter__c> getMatters(Set<String> numbers) {
        return [
                SELECT Id, Owner_Name__c, Case_Type_Name__c, litify_pm__Incident_date__c, Salesforce_18_digit_ID__c
                FROM litify_pm__Matter__c
                WHERE  Client_Phone__c LIKE :numbers
                    OR Client_Phone_Mobile__c LIKE :numbers
                    OR Mobile_Phone_Unformatted__c LIKE  :numbers
        ];
    }

    private static List<litify_pm__Intake__c> getIntakes(Set<String> numbers) {
        return [
                SELECT Id
                FROM litify_pm__Intake__c
                WHERE litify_pm__Status__c != 'Converted'
                    AND (litify_pm__Phone__c LIKE :numbers
                        OR litify_pm__Client__r.Phone LIKE :numbers
                        OR Mobile_Phone_Unformatted__c LIKE :numbers)
        ];
    }

    private static void createCallLog(List<BJB_RingCentralRestResource.RecordWrapper> callInfo, String inputNumber) {
        Call_Log__c log = new Call_Log__c();
        BJB_RingCentralRestResource.RecordWrapper info = new BJB_RingCentralRestResource.RecordWrapper();
        if(callInfo.isEmpty()) {
            log.Was_the_number_identified__c = false;
            log.Phone_Number__c = inputNumber;
            log.Route__c = INTAKE;
        } else {
            info = callInfo[0];
            log.Was_the_number_identified__c = true;
            log.Phone_Number__c = inputNumber;
            log.Route__c = info.objectType == MATTER_OBJECT || info.objectType == ACCOUNT_OBJECT? RECEPTION : INTAKE;
            log.Related_Record_Id__c = info?.recordId;
        }
        insert log;
    }

    global class RecordWrapper {
        public String objectType;
        public Id recordId;
        public String caseType;
        public Date incidentDate;
        public String salesforce18DigitId;
        public String ownerName;

        global RecordWrapper() {

        }

        global RecordWrapper(String objectType, SObject record) {
            this.objectType = objectType;
            this.recordId = (Id)record.get('Id');
            if(objectType.equals(MATTER_OBJECT)) {
                this.caseType = (String) record?.get('Case_Type_Name__c');
                this.incidentDate = Date.valueOf(record?.get('litify_pm__Incident_date__c'));
                this.salesforce18DigitId = (String) record?.get('Salesforce_18_digit_ID__c');
                this.ownerName = (String) record?.get('Owner_Name__c');
            }
        }
    }
}
Editor is loading...
Leave a Comment