차량 및 자산 대출을 위한 스테이지 관리 Apex 클래스 만들기
단계 전환에 대한 비즈니스 로직을 저장하는 Apex 클래스를 만듭니다. 신청서 상품이 접수 단계에서 제출됨 단계로 이동할 때 트리거되는 자동 실행 플로에는 Apex 클래스를 호출하는 단계가 포함됩니다. 신청서 상품 레코드의 단계 필드가 업데이트되면, Apex는 관련된 신청서 레코드의 단계 필드 값과 신청서 상품 레코드의 신청자 표시 상태 및 파트너 표시 상태 필드 값을 업데이트합니다. Apex 클래스는 신청서 상품, 관련 신청서 양식 및 관련 당사자 프로필 레코드에 대한 참가자 레코드를 생성하여 다른 사용자의 가시성을 관리합니다.
필수 Edition
| 지원 제품: Enterprise, Unlimited, Developer Edition |
| 필요한 사용자 권한 | |
|---|---|
| Apex 클래스 생성 방법: | 시스템 관리자 프로필 |
-
Apex 파일을 만듭니다.
- 설정에서 빠른 찾기 상자에 Apex Classes(Apex 클래스)를 입력한 다음, Apex Classes(Apex 클래스)를 선택합니다.
- New(새로 만들기)를 클릭합니다.
-
제공된 Apex 클래스를 입력합니다.
public class CDSCacheHelper { public static Map<String, String> PARTICIPANT_ROLE_NAME_TO_ID = new Map<String, String>(); public static Map<String, String> PARTICIPANT_GROUP_NAME_TO_ID = new Map<String, String>(); public static void loadCDSData() { if (!(PARTICIPANT_ROLE_NAME_TO_ID.isEmpty() || PARTICIPANT_GROUP_NAME_TO_ID.isEmpty())) { return; } // Caching participant roles List<Participantrole> paticipantRoles = [SELECT ID, DeveloperName FROM ParticipantRole WHERE IsActive = true]; for (Participantrole role: paticipantRoles) { PARTICIPANT_ROLE_NAME_TO_ID.put(role.DeveloperName, role.ID); } // Caching participant groups List<Group> groups = [SELECT ID, DeveloperName FROM Group WHERE Type = 'Participant']; for (Group groupData: groups) { PARTICIPANT_GROUP_NAME_TO_ID.put(groupData.DeveloperName, groupData.ID); } } } - 변경 사항을 저장합니다.
-
Apex 파일을 만듭니다.
- 설정에서 빠른 찾기 상자에 Apex Classes(Apex 클래스)를 입력한 다음, Apex Classes(Apex 클래스)를 선택합니다.
- New(새로 만들기)를 클릭합니다.
-
제공된 Apex 클래스를 입력합니다.
public with sharing class AutomotiveLendingCDSUtil { // Enum Field names private static final String DM_APP_FORM_PRODUCT_STAGE_FIELD_NAME = 'ApplicationFormProductStage'; private static final String DM_APP_FORM_STAGE_FIELD_NAME = 'ApplicationFormStage'; private static final String DM_APPLICANT_STATUS_FIELD_NAME = 'ApplicantVisibleStatus'; private static final String DM_PARTNER_STATUS_FIELD_NAME = 'PartnerVisibleStatus'; // Decision Matrix Names private static final String DM_AFP_STAGE_TO_AF_STAGE = 'AFPStage_To_AFStage'; private static final String DM_AFP_Stage_To_AVS_PVS = 'AFPStage_To_AVS_PVS'; //private static final String DM_AFP_Stage_To_AVS_PVS = 'AFPStage_To_AVS_PVS_TEMP'; private static final String DM_AUTO_LOAN_CDS = 'Automotive_Lending_CDS_Config'; // Decision Matrix input and output fields private static final String DM_UW_ACCESS_FIELD_NAME = 'Underwriter_Access'; private static final String DM_APPLICANT_AGENT_ACCESS_FIELD_NAME = 'Applicant_Agent_Access'; private static final String DM_APPLICANT_DEALER_ACCESS_FIELD_NAME = 'Dealer_Access'; // CDS Enabled Entity names private static final String APPLICATION_FORM = 'ApplicationForm'; private static final String APPLICATION_FORM_PRODUCT = 'ApplicationFormProduct'; private static final String PARTY_PROFILE = 'PartyProfile'; // Participant group names private static final String UNDERWRITER_PARTICIPANT_GROUP_NAME = 'Underwriter_Group'; private static final String AGENT_PARTICIPANT_GROUP_NAME = 'Agent_Group'; // CDS user permision set //private static final String AUTOLENDING_UW_PERMISSION_SET_NAME = 'VehicleandAssetLendingUWUser'; private static final String AUTOLENDING_PARTNER_PERMISSION_SET_NAME = 'VehicleAndAssetLendingPartnerUser'; //private static final String AUTOLENDING_AGENT_PERMISSION_SET_NAME = 'VehAndAssetLendingForAgentsUser'; private static final String AUTOLENDING_CUSTOMER_PERMISSION_SET_NAME = 'VehicleAndAssetLendingCustomerUser'; /** * Automotive_Lending_CDS_Config * AFPStage_To_AVS_PVS * AFPStage_To_AFStage * * Applicant_Agent_Access=ApplicationFormRead,ApplicationFormProductRead,PartyProfileRead, * Dealer_Access=ApplicationFormRead,ApplicationFormProductRead,PartyProfileRead, * Underwriter_Access=ApplicationFormRW,ApplicationFormProductRW, */ static { CDSCacheHelper.loadCDSData(); } @InvocableMethod(label = 'Automotive Lending CDS' description = 'Creates the CDS records on ApplicationForm/ApplicationFormProduct/PartyProfile based on the configuration.') public static List <Result> execute(List <ID> ids) { List <Result> results = new List <Result> (); Result result = new Result(); try { Id applicationFormProductId = ids.get(0); ApplicationFormProduct appFormProduct = [SELECT Id, Stage, ApplicantVisibleStatus, ApplicationFormId FROM ApplicationFormProduct WHERE Id =: applicationFormProductId]; updateApplicantAndPartnerVisibleStatus(appFormProduct); updateApplicationFormStage(appFormProduct); Invocable.Action.Result cdsDmResult = invokeDecisionMatrix(DM_AUTO_LOAN_CDS, appFormProduct.Stage); String applicantAgentRole = getOutputVal(cdsDmResult, DM_APPLICANT_AGENT_ACCESS_FIELD_NAME); String underwriterRole = getOutputVal(cdsDmResult, DM_UW_ACCESS_FIELD_NAME); String dealerRole = getOutputVal(cdsDmResult, DM_APPLICANT_DEALER_ACCESS_FIELD_NAME); String[] applicantAgentRoles = applicantAgentRole.split(','); String[] underwriterRoles = underwriterRole.split(','); String[] dealerRoles = dealerRole.split(','); Set <Id> partyProfileIds = new Set < Id > (); List <Applicant> applicants = [SELECT Id, Email, ApplicationFormId, PartyProfileId FROM Applicant WHERE ApplicationFormId =: appFormProduct.ApplicationFormId]; // Extending/Modifying sharing Customer users for (Applicant applicant: applicants) { if (applicant.PartyProfileId != null) { partyProfileIds.add(applicant.PartyProfileId); } // If no users where email matches applicant email, continue List<User> users = [SELECT Id FROM USER WHERE Email =: applicant.Email]; //005Z6000000ETSUIA4 if (users.size() == 0) { continue; } User user = users.get(0); // If customer user does not have CDS permission, continue if (!hasValidCDSUserPermission(user.Id, AUTOLENDING_CUSTOMER_PERMISSION_SET_NAME)) { continue; } for (String cdsRole: applicantAgentRoles) { if (cdsRole.startsWith(APPLICATION_FORM_PRODUCT)) { handleApplicationFormProductParticipants(user.Id, appFormProduct, cdsRole); } else if (cdsRole.startsWith(APPLICATION_FORM)) { handleApplicationFormParticipants(user.Id, appFormProduct, cdsRole); } else if (cdsRole.startsWith(PARTY_PROFILE)) { handlePartyProfileParticipants(user.Id, applicant.PartyProfileId, cdsRole); } } } // Updating / Creating Participant Records for Underwrite groups handleCDSUpdatesForGroups(UNDERWRITER_PARTICIPANT_GROUP_NAME, underwriterRoles, partyProfileIds, appFormProduct); // Updating / Creating Participant Records for Agent groups handleCDSUpdatesForGroups(AGENT_PARTICIPANT_GROUP_NAME, applicantAgentRoles, partyProfileIds, appFormProduct); // Updating / Creating Participant Records Dealer/Partners handleCDSUpdatesForDealers(dealerRoles, partyProfileIds, appFormProduct, AUTOLENDING_PARTNER_PERMISSION_SET_NAME); result.isSuccess = true; result.message = 'Stage configuration executed successfully.'; } catch (Exception ex) { result.isSuccess = false; result.message = ex.getMessage(); System.debug(ex); } results.add(result); return results; } public static boolean hasValidCDSUserPermission(Id userId, String permissionSetName) { // If user does not have CDS permission, continue List<PermissionSetAssignment> permissionSetAssignments = [SELECT AssigneeId, PermissionSet.Name FROM PermissionSetAssignment WHERE AssigneeId =: userId AND PermissionSet.Name =: permissionSetName ]; return (permissionSetAssignments.size() > 0); } public static void handleCDSUpdatesForGroups(String groupName, String[] roles, Set < Id > partyProfileIds, ApplicationFormProduct appFormProduct) { String groupId = CDSCacheHelper.PARTICIPANT_GROUP_NAME_TO_ID.get(groupName); for (String cdsRole: roles) { if (cdsRole.startsWith(APPLICATION_FORM_PRODUCT)) { handleApplicationFormProductParticipants(groupId, appFormProduct, cdsRole); } else if (cdsRole.startsWith(APPLICATION_FORM)) { handleApplicationFormParticipants(groupId, appFormProduct, cdsRole); } else if (cdsRole.startsWith(PARTY_PROFILE)) { for (Id partyProfileId: partyProfileIds) { handlePartyProfileParticipants(groupId, partyProfileId, cdsRole); } } } } public static void updateApplicantAndPartnerVisibleStatus(ApplicationFormProduct appFormProduct) { Invocable.Action.Result result = invokeDecisionMatrix(DM_AFP_Stage_To_AVS_PVS, appFormProduct.Stage); String applicantVisibleStatus = getOutputVal(result, DM_APPLICANT_STATUS_FIELD_NAME); String partnerVisibleStatus = getOutputVal(result, DM_PARTNER_STATUS_FIELD_NAME); appFormProduct.ApplicantVisibleStatus = applicantVisibleStatus; appFormProduct.PartnerVisibleStatus = partnerVisibleStatus; upsert appFormProduct; } public static void updateApplicationFormStage(ApplicationFormProduct appFormProduct) { Invocable.Action.Result result = invokeDecisionMatrix(DM_AFP_STAGE_TO_AF_STAGE, appFormProduct.Stage); String applicationFormStage = getOutputVal(result, DM_APP_FORM_STAGE_FIELD_NAME); ApplicationForm applicationForm = new ApplicationForm(); applicationForm.Id = appFormProduct.ApplicationFormId; applicationForm.Stage = applicationFormStage; upsert applicationForm; } public static void handleCDSUpdatesForDealers(String[] dealerRoles, Set < Id > partyProfileIds, ApplicationFormProduct appFormProduct, String requiredPermSet) { List <ApplicationFormSellerItem> sellerItems = [SELECT Id, SellerId FROM ApplicationFormSellerItem WHERE ApplicationFormProductId =: appFormProduct.Id]; //Return if there are no seller items if (sellerItems.size() == 0) { system.debug('No seller items found'); return; } else { ApplicationFormSellerItem sellerItem = sellerItems.get(0); List<User> users = [SELECT Id FROM USER WHERE AccountId =: sellerItem.SellerId]; // Return if Account on the dealer is not a valid user if (users.size() == 0) { system.debug('No users items found'); return; } Id dealerUserId = users.get(0).Id; if (!hasValidCDSUserPermission(dealerUserId, requiredPermSet)) { return; } ///////// for (String cdsRole: dealerRoles) { if (cdsRole.startsWith(APPLICATION_FORM_PRODUCT)) { handleApplicationFormProductParticipants(dealerUserId, appFormProduct, cdsRole); } else if (cdsRole.startsWith(APPLICATION_FORM)) { handleApplicationFormParticipants(dealerUserId, appFormProduct, cdsRole); } else if (cdsRole.startsWith(PARTY_PROFILE)) { for (Id partyProfileId: partyProfileIds) { handlePartyProfileParticipants(dealerUserId, partyProfileId, cdsRole); } } } } } public static void handleApplicationFormParticipants(Id userOrGroupId, ApplicationFormProduct appFormProduct, String roleName) { List<ApplicationFormParticipant> appFormParticipants = [SELECT Id, ParticipantRoleId FROM ApplicationFormParticipant WHERE ParticipantId =: userOrGroupId AND ApplicationFormId=:appFormProduct.ApplicationFormId]; String roleId = CDSCacheHelper.PARTICIPANT_ROLE_NAME_TO_ID.get(roleName); if (appFormParticipants.size() == 0) { ApplicationFormParticipant participant = new ApplicationFormParticipant(ApplicationFormId = appFormProduct.ApplicationFormId, IsActive = true, ParticipantRoleId = roleId, ParticipantId=userOrGroupId); insert participant; } else { ApplicationFormParticipant participant = appFormParticipants.get(0); participant.IsActive = true; participant.ParticipantRoleId = roleId; upsert participant; } } public static void handleApplicationFormProductParticipants(Id userOrGroupId, ApplicationFormProduct appFormProduct, String roleName) { List<AppFormProductParticipant> participants = [SELECT Id, ParticipantRoleId FROM AppFormProductParticipant WHERE ParticipantId =: userOrGroupId AND ApplicationFormProductId=:appFormProduct.Id]; String roleId = CDSCacheHelper.PARTICIPANT_ROLE_NAME_TO_ID.get(roleName); if (participants.size() == 0) { AppFormProductParticipant participant = new AppFormProductParticipant(ApplicationFormProductId = appFormProduct.Id, IsActive = true, ParticipantRoleId = roleId, ParticipantId=userOrGroupId); insert participant; } else { AppFormProductParticipant participant = participants.get(0); participant.IsActive = true; participant.ParticipantRoleId = roleId; upsert participant; } } public static void handlePartyProfileParticipants(Id userOrGroupId, String partyProfileId, String roleName) { List<PartyProfileParticipant> participants = [SELECT Id, ParticipantRoleId FROM PartyProfileParticipant WHERE ParticipantId =: userOrGroupId AND PartyProfileId=:partyProfileId]; String roleId = CDSCacheHelper.PARTICIPANT_ROLE_NAME_TO_ID.get(roleName); if (participants.size() == 0) { PartyProfileParticipant participant = new PartyProfileParticipant(PartyProfileId = partyProfileId, IsActive = true, ParticipantRoleId = roleId, ParticipantId=userOrGroupId); insert participant; } else { PartyProfileParticipant participant = participants.get(0); participant.IsActive = true; participant.ParticipantRoleId = roleId; upsert participant; } } public static Invocable.Action.Result invokeDecisionMatrix(String decisionMatrixName, String appFormProductStageVal) { // Create an Invocable.Action Invocable.Action action = Invocable.Action.createCustomAction('runDecisionMatrix', decisionMatrixName); action.setInvocationParameter(DM_APP_FORM_PRODUCT_STAGE_FIELD_NAME, appFormProductStageVal); List < Invocable.Action.Result > results = action.invoke(); return results.get(0); } public static String getOutputVal(Invocable.Action.Result result, String outputFieldName) { return (String) result.getOutputParameters().get(outputFieldName); } public class Result { @InvocableVariable(label = 'Message' description = 'Resulted output of the action.' required = true) public String message; @InvocableVariable(label = 'Status' description = 'Resulted status of the action.' required = true) public boolean isSuccess; } } - 변경 사항을 저장합니다.
이 기사를 통해 문제를 해결했습니까?
개선을 위한 의견을 보내주세요.

