트랜잭션 관리자: Salesforce 승인 통합

  • 릴리스 버전: Australia
  • 업데이트 날짜 2026년 03월 12일
  • 소요 시간: 14분
  • Salesforce 승인을 트랜잭션 관리자에 통합합니다.

    메뉴

    트랜잭션

    Salesforce 설정

    다음 Salesforce Trailheads 모듈 및 설명서를 참조하십시오.
    Salesforce의 승인 프로세스는 조직의 기록 승인 워크플로우를 자동화합니다. 다음을 정의합니다.
    • 승인 단계: 기록에 대한 단계 및 승인자의 시퀀스입니다(예: 승인을 위해 직원의 관리자에게 휴가 요청 보내기).
    • 작업: 승인된 경우 기록 업데이트 또는 거부된 경우 알림 보내기 등 승인 결과에 따른 자동화된 작업입니다.

    이를 통해 승인 프로세스가 간소화되고 일관성이 보장됩니다.

    워크플로우

    1. 설정으로 이동하여 승인 프로세스를 클릭하고 트랜잭션 기록을 선택합니다.
    2. 승인 프로세스 관리에서기회를 선택합니다.
    3. 새 승인 프로세스 생성을 클릭합니다.

      새 승인 프로세스 생성

    4. 승인을 위한 제출 및 승인 이력 추가 옵션이 선택되어 있는지 확인합니다.

      해당하는 경우 항목별 기준 섹션에서 조건을 지정할 수 있습니다.

    5. Automatically assign approvers(승인자 자동 할당)를 선택하고 SysAdmin 역할을 가진 모든 사람에게 설정합니다.

      승인자 자동 할당

    6. 설정으로 이동하고 객체 관리자를 클릭한 다음 트랜잭션을 클릭하여 트랜잭션 기록에 사용자 지정 선택 목록 필드를 생성합니다. 필드가 다중 선택 선택 목록으로 설정되지 않았는지 확인합니다.

      트랜잭션

    7. 선택 목록 필드에 세 가지 값을 지정하여 승인 보류 중, 승인됨 및 거부됨을 구분합니다.

      새 사용자 지정 필드

    8. 트랜잭션 레이아웃에 사용자 지정 필드를 추가합니다.

      레이아웃

      이전 단계를 건너뛴 경우 다음과 같이 트랜잭션 레이아웃에 필드를 추가할 수 있습니다.

      레이아웃

    9. 승인 프로세스로 돌아가서 초기 제출 작업, 새로 추가, 필드 업데이트를 차례로 선택합니다. 필요한 값으로 구성합니다.
    10. 승인 프로세스의 결과에 따라 관련 필드가 업데이트되도록 하려면 승인 작업 및 거부 작업 섹션에 대해 9단계를 반복합니다. 다음 스크린샷은 최종 거부 옵션을 보여줍니다.

      트랜잭션

      필드 업데이트와 함께 이메일 알림을 포함한 경우 승인 프로세스는 다음과 유사해야 합니다.

      승인 프로세스

      최종 승인 프로세스에 필드 업데이트만 있는 경우 다음과 유사해야 합니다.

      승인 프로세스

    11. 활성화를 클릭합니다.

      활성화

    12. CORS에 URL이 포함되어 있는지 확인하려면 설치 검색 창에서 CORS를 검색하거나 설치로 이동하여 보안을 클릭한 다음 CORS를 클릭합니다. 다음 항목이 CORS에 포함되어 있는지 확인합니다.

      보안

    트랜잭션 관리자 설정: 통합

    트랜잭션 관리자를 통해 승인을 위해 기록을 제출하는 데 사용할 이벤트에 대해 두 개의 통합을 생성합니다.

    주:
    Postman에서 이러한 호출을 테스트하려면 엔드포인트는 내 Salesforce URL: <https://logik-1e-dev-ed.develop.my.salesforce.com/>입니다.
    1. Salesforce 기록 ID 수신: UUID를 사용하여 올바른 Salesforce 기록 ID를 가져옵니다. 이 통합은 위의 통합에 대한 사용자 지정 필드를 채우는 데 사용됩니다.
      • 연결: Salesforce
      • 임포트

        추가 경로: /services/data/v62.0/query/?q=SELECT ID, CreatedDate, LGK__TransactionUUID__c FROM LGK__Transaction__c WHERE LGK__TransactionUUID__c = '{{http://txn.id/}}'ORDER BY CreatedDate DESC

      응답 변환:

      {
        "fields": [
          {
            "variableName": "txn.custom.sfRecordID",
            "value": {{#each records}}{{#if @first}}"{{this.Id}}"{{/if}}{{/each}}
          },
          {
            "variableName": "txn.custom.opportunityName",
            "value": {{#each records}}{{#if @first}}"{{this.LGK__OpportunityId__r.Name}}"{{/if}}{{/each}}
          },
          {
            "variableName": "txn.custom.accountName",
            "value": {{#each records}}{{#if @first}}"{{this.LGK__AccountId__r.Name}}"{{/if}}{{/each}}
          }
        ]
      }

      업데이트된 쿼리는 다음을 사용합니다.

      /services/data/v62.0/query/?q=SELECT Id, CreatedDate,LGK__OpportunityId__c,LGK__OpportunityId__r.Name, LGK__AccountId__r.Name, LGK__AccountId__c,LGK__TransactionUUID__c FROM LGK__Transaction__c WHERE LGK__TransactionUUID__c ='{{txn.id}}'ORDER BY CreatedDate DESC

      contextActorId Salesforce의 시스템 관리자 기록 ID를 참조합니다. 설정으로 이동하여 사용자를 클릭한 다음 사용자 페이지의 URL에서 ID를 복사하여 가져올 수 있습니다.

      통합

    2. 승인을 위해 제출합니다.
      • 연결: Salesforce
      • 게시

        추가 경로: /services/data/v62.0/process/approvals

        승인 프로세스

    변환 요청:

    {
      "requests" : [{
      "actionType": "Submit",
      "contextId": "{{txn.custom.sfRecordID}}",
      "nextApproverIds": [],
      "comments":"The line item has a discount percentage of {{txn.custom.overallDealDiscount}}%",
      "contextActorId": "005bm000003SKtJ", -- SF Record ID of user highlighted above
      "processDefinitionNameOrId" : "TM_SF_Approval", --should be the unique name fro process definition detail highlighted above
      "skipEntryCriteria": "true"}]
    }

    변환 템플릿에 다음 값이 올바르게 있는지 확인합니다.

    코드

    트랜잭션 관리자 설정: 이벤트 생성

    Slack 승인 통합은 헤드리스 이벤트 API 호출을 통해 구현됩니다. 이 접근 방식에서는 기록 트리거 플로우에서 이러한 헤드리스 API 호출을 사용하고 Apex 작업을 통해 호출을 수행합니다.

    이벤트 생성

    이전 단계에서 생성된 두 통합은 순서대로 작동하도록 설계되었습니다. 첫 번째 통합은 Salesforce 기록 ID를 수신하고 두 번째 통합은 승인을 위해 제출합니다. 또는 Salesforce ID를 받는 프로세스는 해당 단계에서 필요한 구성을 추가하여 오픈 트랜잭션 작업에서 발생할 수 있습니다.

    승인을 위해 스테이지를 앞으로 또는 수정을 위해 뒤로 이동하는 두 개의 추가 이벤트를 생성합니다. API 설명선 구성에 사용할 해당 변수 이름을 기록해 두어야 합니다.

    전환 스테이지

    거부

    트랜잭션 관리자 설정: 승인을 위한 제출 단추를 레이아웃에 추가

    버튼 이벤트는 다음 JSON 형식을 사용하여 default_draft 레이아웃에 추가할 수 있습니다.

    {
      "type": "button",
      "event": "submitForApproval",
      "label": "Revise",
      "columnOrder": 2,
      "variableName": "revise"
    },

    초안 필드에 사용자 지정 필드를 추가해야 합니다 . [] 섹션; 레이아웃에 포함할 필요는 없습니다.

    {
      "type": "ReadOnlyText",
      "label": "SF Record ID",
      "variableName": "txn.custom.sfRecordID"
    },

    기록 트리거 플로우

    VS Code 환경을 설정하려면 다음 문서에서 VS Code 확장을 설치합니다. 판매 엔지니어링 팀 구성원 설정

    1. Trailheads 승인 프로세스에 이어 트랜잭션의 현재 승인 상태가 있는 객체에 선택 LGK__Transaction__C 목록 기록을 생성하고 프로세스가 승인, 거부 및 승인 보류 중을 기반으로 기록을 업데이트하는지 확인합니다.

      다음 이미지는 승인 프로세스를 만들 때 만든 필드인 기록 Approval_Status__C 트리거 필드를 트리거하는 사용자 지정 필드를 보여줍니다.

      승인 프로세스

      다음 이미지는 플로우가 완료되었을 때의 모습을 보여줍니다.

      워크플로우

    2. 시작 블록에서 편집을 클릭합니다.

      사용자 지정 필드를 기반으로 객체에 LGK__Transaction__C 대해 트리거하여 UUID가 null이 아닌지 확인합니다. 또한 비동기적으로 실행기록이 충족되도록 업데이트될 때만을 클릭해야 합니다.

      트리거 구성

    3. 결정 블록을 추가하고 생성한 사용자 지정 필드가 승인 또는 거부될 때에 대한 결과를 생성합니다.

      결정 블록

    Apex 코드

    이 Apex 클래스는 VS code를 통해 배포되었지만 Salesforce에도 배포할 수 있습니다. 첫 번째 단계는 매니페스트를 사용하여 새 프로젝트를 만드는 것입니다.

    마누

    그런 다음 Apex 클래스(파란색 상자)와 manifest.xml 파일(녹색 상자)을 생성하여 프로젝트 디렉터리의 해당 파일로 이동합니다.

    트랜잭션 관리자

    Apex 코드:

    global with sharing class TransactionManagerFlow {
        global class FlowInput {
            @InvocableVariable(label='Triggering Record' required=true)
            global LGK__Transaction__c triggeringRecord;
        }
        // Handle logic for Rejected status
        @InvocableMethod(label='Logik.io Transaction callout from Salesforce' description='Makes callout to transition Logik.io transaction stage.')
        global static void handleApprovalStatus(FlowInput[] requestInputs) {
            System.debug('Handling Rejected status for Record: ' + requestInputs[0].triggeringRecord.Id);
            LGK__ConfigurationTenant__c customSettings = LGK__ConfigurationTenant__c.getInstance();
            String updatedRuntimeToken = '_gdyi0w0oGu1bNk3PO5exhUGqDFcZQVLIw';
            System.debug(updatedRuntimeToken);
            String endpoint = 'https://se-txn-sandbox.test02.logik.io';
            for (FlowInput eachTxn : requestInputs) {
                // Make the API request to transfer a transaction from 'new' stage to 'rejected' stage
                // (compare with snippet from ApprovalProcessHandler.makeApiCall)
                String uuid = eachTxn.triggeringRecord.LGK__TransactionUUID__c;
                Http http = new Http();
                HttpRequest request = new HttpRequest();
                request.setHeader('Origin', endpoint);
                if (eachTxn.triggeringRecord.Approval_Status__c == 'Rejected') {    
                    request.setEndpoint(endpoint + '/api/t/' + String.valueOf(uuid) + '/events/revise'); // Example endpoint
                    System.debug('Endpoint set for rejection' + request.getEndpoint());
                } else if (eachTxn.triggeringRecord.Approval_Status__c == 'Approved') {
                    request.setEndpoint(endpoint + '/api/t/' + String.valueOf(uuid) + '/events/proceedToApproved'); // Example endpoint
                    System.debug('Endpoint set for approval' + request.getEndpoint());
                }
                request.setMethod('POST');
                request.setHeader('Authorization', 'Bearer ' + updatedRuntimeToken);
                request.setHeader('Content-Type', 'application/json');
                request.setBody('{}');  // Convert to JSON if inputs are needed
                System.debug(request);
                if (!Test.isRunningTest()) {
                    HttpResponse response = http.send(request);
                    if (response.getStatusCode() != 200) {
                        System.debug(LoggingLevel.ERROR, 'Error transitioning transaction: ' + response.getStatusCode());
                        System.debug(LoggingLevel.ERROR, response.getBody());
                    } else {
                        System.debug('Rejected API Call Failed: ' + response.getStatusCode() + ' - ' + response.getBody());
                    }
                } else {
                    eachTxn.triggeringRecord.LGK__TransactionUUID__c = 'testUUID';
                }
            }
        }
    }
    

    XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <Package xmlns="http://soap.sforce.com/2006/04/metadata">
        <types>
            <members>TransactionManagerFlow</members>
            <name>ApexClass</name>
        </types>
        <version>61.0</version>
    </Package>

    다음으로, 배포하려는 조직에 로그인하지 않은 경우 sf org login 웹 명령을 사용하여 로그인하면 login.salesforce.com 로 이동합니다.

    CLI에 권한을 부여한 경우 결과는 다음과 같아야 합니다.

    스크립트

    주:
    CLI를 통해 여러 조직에 로그인한 경우 다음 명령을 사용하여 전환합니다.

    SF 구성 세트 target-org=<username>

    로그인한 다음 명령을 실행합니다.

    SF 프로젝트 배포 시작 --manifest manifest/package.xml

    배포

    결정 블록 뒤에 Apex 작업을 추가하고 플로우가 스크린샷에 표시된 것과 유사한지 확인합니다. (호출 가능한 메서드에서 레이블 매개변수와 일치하는 이름을 찾습니다.)

    마지막으로 플로우를 활성화하고 테스트합니다.

    테스트

    기록 트리거 플로우와 트랜잭션 관리자 Blueprint가 생성되면 이 SOQL 쿼리가 Salesforce에서 승인 프로세스를 디버깅하는 데 유용할 수 있습니다.

    Salesforce 승인 상태 수신(최근 프로세스의 상태 가져오기)

    • 연결: Salesforce
    • 임포트
      • 추가 경로: {_endpoint}/services/data/v61.0/query/? q=SELECT+Id,Status,TargetObjectId+FROM+ProcessInstance+WHERE+TargetObjectId={{sfRecordId}}+ORDER+BY+CreatedDate+DESC
      • SOQL 쿼리
    SELECT Id, Status, TargetObjectId 
    FROM ProcessInstance 
    WHERE TargetObjectId-'006bm000002IUI4AAO' -- This is the sf oppy/transaction object  id
    ORDER BY CreatedDate DESC