Traducir siglas de país a palabras con Apex

Este artículo también está disponible en: English (Inglés)

Frecuentemente, tenemos que trabajar con acrónimos o siglas para referirnos a países o provincias en nuestros campos. Lo cual puede estar bien para tus usuarios en sus tareas diarias. Sin embargo, usar siglas, por ejemplo, en los reportes para clientes no es tan «molón».

En este artículo vamos a ver cómo crear una función pública que nos ayude a traducir «ES» a «Spain», «España» o «Spagne» donde lo necesitemos.

Resumidamente, esto es lo que haremos:

  1. Crear un «custom setting» en Salesforce

2. Poblar el custom setting con los valores ISO correspondientes.

3. Crear un método para obtener la «traducción».

4. Crear un método para obtener el código de teléfono del país (esto es un bonus)

Crear un «custom setting» en Salesforce

Puedes hacer esto a través de APEX, pero est mucho más rápido hacerlo a través de la UI (Interfaz de Usuario).

  1. Navega hacia: Setup > Schema Settings
  2. Activa la opción «Manage List Custom Settings Type». Necesitamos activar esta opción para poder crear un «Custom Setting» de tipo lista.

3. Navega hacia : Setup > Custom Settings y pincha «New»

4. Crea lo siguientes campos: Los nombres pueden ser los que tú quieras, pero considera que deben ser auto-explicativos.

  1. Country Name Spanish – Text (100)
  2. Country Name French – Text (100)
  3. Country Name English – Text (100)
  4. ISO2 – Text (5)
  5. ISO3 – Text (5)
  6. Telephone Code – Text(5)

5. Una nota sobre esto. los Custom Settings de tipo lista tienen un campo «Name» que debe ser informado. No necesitas crear este campo. SF lo crea automáticamente.

2. Poblar los valores ISO

Para descarfar un CSV completo o en JSON con los códigos ISO de país, puedes dirigirte a este Repositorio Github  y  clicar sobreConversor del CSV a otros formatos

  1. Lo normal es que estés desarrollando en un entorno Sandbox, así que no necesitas rellenar todos estos registros ahora mismo. Crea solo algunos para poder testear.
  2. Cuando despliegues a Producción, tendrás que crear todos los registros del Custom Setting. Lo cual puedes hacer vía:
    1. Spoon / Kettle (recomendado). Puedes ver cómo utilizar este software para importar, transformar y exportar data en Salesforce (entre otros) en este artículo de Carlos Meseguer.
    2. Importar un JSON vía la ventana anónima de APEX (no recomendado) Para esta alternativa, deberías usar formato JSON para los datos de entrada. Lo que implica:
      1. Subir el JSON como un recurso estático en Salesforce
      2. En tu ventana anónima de APEX, crear una inner class que puedas utilizar para deserealizar tu JSON.
      3. Una vez deserializado, crea los registros para el Custo Setting como una operación DML habitual a través de APEX
    3. Data Import Wizard. Al fin y al cabo, los Custom Settings son objetos de Salesforces como todos los demás y puedes interactuar con ellos igual que con los Contactos. Deberías poder localizar tu nuevo Custom Setting como un objeto en la lista de Custom Objects del Setup. Mira esta imagen:
Usando Data Wizard para subir los registros

¡Cuidado! : Sin importar la vía que utilices, en tus datos de entrada (JSON, Excel…) necesitas tener una columna llamada «Name» y poblarla con un nombre que obedezca el patrón «XX-ISO». Donde XX es el acrónimo del país. Así es como se deberían ver tus datos antes de subirlos.

Así es como se deberían ver tus datos antes de subirlos.

Crear el método para obtener la «traducción».

Una vez creado y poblado nuestro Custom Setting, el resto es bastante fácil. Ten en cuenta que los Custom Settings cuentan con sus propios métodos, que son los que vamos a utilizar.

public with sharing class getCountryDetails {

// Nuestro método recibe el acrónimo de país y el idioma en el que queremos el resultado. 

    public static String getCountryNamePerLanguage(String acronym, String languageAcronym){

// Envolvemos en un bloque try...catch para evitar excepciones de null pointer y capturar las no coincidencias. 
    try{

//Construimos el campo "Name" para poder localizar el dataSet. Recuerda que el nombre de nuestro Custom Setting sigue el patrón "XX-ISO"

        sonn_countryISO__c dataSetForCountry= sonn_countryISO__c.getValues(acronym+'-ISO');
      
// Maneja el resultado devuelto en función del idioma solicitado. 
       switch on languageAcronym {
           when 'ES' {
               return dataSetForCountry.sonn_nombre__c;
           }
           when 'EN' {
               return dataSetForCountry.sonn_name__c;
           }
           when 'FR' {
               return dataSetForCountry.sonn_nom__c; 
           }
           when else {
               return dataSetForCountry.sonn_name__c;
           }
       }
    } catch (Exception error){

// También puedes devolver un null. Pero recuerda que debes controlar ese resultado después de llamar a esta función desde donde lo hayas hecho. En este caso, si no encuentra traducción, simplemente devuelve el acrónimo. 

        return acronym;
    }
     
  }

}

Crear un método para obtener el código de teléfono del país (bonus)

Como ya teníamos esta información en nuestro JSON, ¿por qué no? Esto es lo mismo que antes, pero incluso más sencillo.

   public static String getPhoneCode (String acronym){
        try{
                sonn_countryISO__c dataSetForCountry= sonn_countryISO__c.getValues(acronym+'-ISO');
    return dataSetForCountry.phone_code__c;
        } catch (Exception error) {
            return ''; 
        }

    }

Y por las dudas, no olvidéis escribir el test. Aquí os dejo un test para ambos métodos, incluyendo algo de Test Data.

@isTest
public with sharing class getCountryDetailsTest {
    @isTest
    public static void getCountryEN(){
        String acronym = 'AS';

        String countryName = getCountryDetails.getCountryNamePerLanguage(acronym, 'EN');

        System.AssertEquals('Saint Barthélemy', countryName, 'check country');
    }
    @isTest
        public static void getCountryES(){
        String acronym = 'AS';

        String countryName = getCountryDetails.getCountryNamePerLanguage(acronym, 'ES');

        System.AssertEquals('San Bartolomé', countryName, 'check country');
    }
    @isTest
        public static void getCountryFR(){
        String acronym = 'AS';

        String countryName = getCountryDetails.getCountryNamePerLanguage(acronym, 'FR');

        System.AssertEquals('Saint-Barthélemy', countryName, 'check country');
    }
    @isTest
    public static void getOtherLang(){
        String acronym = 'EH';

        String countryName = getCountryDetails.getCountryNamePerLanguage(acronym, 'NL');

        System.AssertEquals('Western Sahara', countryName, 'check country');
    }
    @isTest
    public static void getPhoneCodeTest(){
        String acronym = 'AS';
        String code = getCountryDetails.getPhoneCode(acronym);
        System.AssertEquals('590', code, 'check phone');
    }

// En este punto, deberías añadir también un test de fallo, para comprobar que el comportamiento es el deseado cuando el input es incorrecto o es null. 

@TestSetup
static void makeData(){
List<sonn_countryISO__c> countries = new List<sonn_countryISO__c>();

sonn_countryISO__c newCT2 = new  sonn_countryISO__c();
newCT2.Name = 'EH-ISO';
newCT2.sonn_nombre__c =  'Sahara Occidental';
newCT2.sonn_name__c =  'Western Sahara';
newCT2.sonn_nom__c=  'Sahara Occidental';
newCT2.iso2__c =  'EH';
newCT2.iso3__c =   'ESH';
newCT2.phone_code__c =  '';
countries.add(newCT2);

sonn_countryISO__c newCT1 = new  sonn_countryISO__c();
newCT1.Name ='AS-ISO';
newCT1.sonn_nombre__c =  'San Bartolomé';
newCT1.sonn_name__c =  'Saint Barthélemy';
newCT1.sonn_nom__c=  'Saint-Barthélemy';
newCT1.iso2__c =  'BL';
newCT1.iso3__c =   'BLM';
newCT1.phone_code__c =  '590';
countries.add(newCT1);

insert countries; 
}

}

Peace and Code!

Nadine

Añade tu respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *