Loading
Código de amostra para atualizar o mapeamento de tipo de contrato fora de sincronia

Código de amostra para atualizar o mapeamento de tipo de contrato fora de sincronia

Se você excluir, adicionar ou modificar um mapeamento de tipo de registro com um tipo de contato, as alterações serão aplicadas apenas aos novos contratos. Para atualizar os contratos fora de sincronia, o administrador do sistema pode executar um código personalizado.

O administrador do sistema pode usar esse código de amostra para modificar o mapeamento de contrato para contratos existentes. Abra o Developer Console, vá para DebugOpen Execute Anonymous Window, cole o código de amostra e clique em Executar. Para obter mais informações sobre o uso da Classe do Apex, consulte o Guia do desenvolvedor do Apex.

Caso de uso: Tipo de contrato Saúde corresponde aos tipos de registro Cuidados internados e Cuidados ambulatoriais. Há 1.000 registros de contrato que têm esse mapeamento. Você altera o mapeamento do tipo de registro Cuidados internados para o tipo de contrato Receita e dos 1000 registros existentes, há 500 tipos de registro de Cuidados internados apontando para Tipo de contrato Saúde. As linhas de contrato continuarão mostrando o tipo de contrato como Saúde e o tipo de registro como Cuidados de pacientes internados porque o aplicativo Salesforce Contracts não atualiza automaticamente os registros de contrato que têm o tipo de registro Cuidados de pacientes internados com o tipo de contrato Receita. Somente o administrador do sistema pode aplicar as alterações usando um código de amostra. No entanto, quando um novo contrato é criado com um tipo de registro Cuidados de pacientes internados, o tipo de contrato será Receita.

Nota
Nota O campo Tipo de contrato no objeto de contrato por padrão é somente leitura para todos os perfis não administradores. Em um nível de perfil, com base na segurança em nível de campo, os usuários podem atualizar o tipo de contrato fora de sincronia no objeto de contrato manualmente ou usando um Apex code.

O código de amostra captura uma lista de Tipos de contrato. Você pode passar qualquer número de Tipos de contrato e ajustar o mapeamento. Você pode editar a consulta para fazer alterações e capturar contratos com status específicos, como Rascunho, Contrato expirado, Cancelado etc.

public class SyncContractTypes {
   
	// use-case1 : sync contracts when existing RecordType that's associated with contracts is newly mapped to a existing ContractType
	// use-case2 : sync contracts when existing RecordType that's associated with contracts is removed from ContractType object - ContractType, SubType mapping
	// use-case3 : sync contracts when existing RecordType that's associated with contracts is removed from ContractType object - ContractType, SubType mapping  and mapped to existing ContractType, SubType
   
	public static void syncOutOfSyncContractTypes(List<String> contractTypes) {
       
    	Map<String,String> contractTypeSubtypeMap = new Map<String,String>();
    	Map<String,String> subtypeContractTypeMap = new Map<String,String>();
       
    	if(contractTypes != null && !contractTypes.isEmpty()) {
       	// Here we are querying all the contractTypes to support a use-case2
       	// where a SubType is removed from a contractType and mapped to another existing contractType
       	// If customers don't want to update when existing subType is mapped to another existing contractType they can
       	// restrict this by adding a where condition, WHERE MasterLabel IN :contractTypes
        	List<ContractType> contractTypeList = [SELECT MasterLabel,SubTypes FROM ContractType];
           
        	if(contractTypeList!= null && !contractTypeList.isEmpty()) {
            	for( ContractType c : contractTypeList) {
                	contractTypeSubtypeMap.put(c.MasterLabel, c.SubTypes);
                	if(c.subTypes != null) {
                    	for(String s : c.subTypes.split(',')) {
                        	subtypeContractTypeMap.put(s, c.MasterLabel);
                    	}
                	}
            	}
        	}
           
        	for(String ct : contractTypes) {
           
            	String contractType = (contractTypeSubtypeMap.containsKey(ct)) ? ct : '';
               
            	List<String> subTypesList = (contractTypeSubtypeMap.get(ct) != null) ? contractTypeSubtypeMap.get(ct).split(',') : new List<String>();
               
            	// we are applying basic filters here, please modify them accordingly to your use case
            	List<Contract> contracts = [
                	SELECT Id, ContractType, Name, RecordType.Name
                	FROM Contract
                	WHERE (ContractType =: contractType OR RecordType.Name IN :subTypesList)
                        	AND IsAssociatedWithCLM = true
                        	AND (NOT (ContractType =: contractType AND RecordType.Name IN : subTypesList))];
               
            	List<Contract> contractsToUpdate = new List<Contract>();
            	// check if any of the contracts are out of sync and update them
            	for(Contract c : contracts) {
                	String RecordTypeName = c.RecordType.Name;
                	if(subTypesList.contains(RecordTypeName) && c.ContractType != contractType) {
                    	c.ContractType = contractType;
                    	contractsToUpdate.add(c);
                	} else if(!subTypesList.contains(RecordTypeName) ){
                    	// check to see if any other ContractTypes has this RecordType as SubType
                    	c.ContractType = (subtypeContractTypeMap.get(RecordTypeName) != null) ? subtypeContractTypeMap.get(RecordTypeName) : '';
                    	contractsToUpdate.add(c);
                	}
                   
            	}           
            	if(contractsToUpdate != null && !contractsToUpdate.isEmpty()) {
                   
                	Database.SaveResult[] saveResult = Database.Update(contractsToUpdate, false);
                	for (Database.SaveResult sr : saveResult) {
                    	if (sr.isSuccess()) {
                        	// Operation was successful, so get the ID of the record that was processed
                        	System.debug('Successfully updated contract. Contract ID: ' + sr.getId());
                    	}
               	     else {
                        	// Operation failed, so get all errors               
                        	for(Database.Error err : sr.getErrors()) {
                            	System.debug('The following error has occurred.');    	            
                            	System.debug(err.getStatusCode() + ': ' + err.getMessage());
                            	System.debug('Contract fields that affected this error: ' + err.getFields());
                        	}
                   	}
                	}
            	}
        	}
  	}
	}
}
 
Carregando
Salesforce Help | Article