2.1 - Objetivo
Entrada
{ "first": false, "items": [ { "codFilial": "1", "codigousur": 1, "nome": "SUPERVISOR 1", "tipoVenda": "R", "tipoPessoa": "F", "cpfCnpj": "68881428504", "areaAtuacao": "FARMACÊUTICO", "codigoSupervisor": 2, "nomeSupervisor": "SUPERVISOR 2", "status": "NORMAL", "dtCadastroSupervisor": "1900-01-01T00:00:00", "dtCadastroRca": "2004-06-08T00:00:00", "dtAlteracao": "2020-01-20T17:22:19" }, { "codFilial": "1", "codigousur": 1252, "nome": "VENDEDOR 1252", "tipoVenda": "R", "tipoPessoa": "J", "cpfCnpj": "05869591000151", "areaAtuacao": "FARMACÊUTICO", "codigoSupervisor": 2, "nomeSupervisor": "SUPERVISOR 2", "status": "NORMAL", "dtCadastroSupervisor": "1900-01-01T00:00:00", "dtCadastroRca": "2011-03-29T00:00:00", "dtAlteracao": "1900-01-01T00:00:00" } ], "hasNext": true }
Saída
{ "items" : [ { "codigoSupervisor" : 2, "cpf" : "68881428504", "idRetaguarda" : "RCA-1", "nome" : "SUPERVISOR 1", "tipoPessoa" : "A_DEFINIR", "idProprietario" : "{{MASTER_ID_PROPRIETARIO}}", "idInquilino" : "{{ID_INQUILINO}}", "idRetaguardaPerfil" : 2 }, { "codigoSupervisor" : 2, "cpf" : "05869591000151", "idRetaguarda" : "RCA-1252", "nome" : "VENDEDOR 1252", "tipoPessoa" : "A_DEFINIR", "idProprietario" : "{{MASTER_ID_PROPRIETARIO}}", "idInquilino" : "{{ID_INQUILINO}}", "idRetaguardaPerfil" : 2 } ], "idExterno" : [ "pdvsync-usuario-rca-1-2020-01-20T17:22:19", "pdvsync-usuario-rca-1252-1900-01-01T00:00:00" ], "_attr_access" : "items" }
2.2 - Transformação
2.2.1 - Transformação para aplicar funções da Biblioteca do Jolt na criação de novos elementos [modify-overwrite-beta]
O objetivo desta transformação é adicionar novos elementos no Json de Saída a partir do valor de outros campos do Json de Entrada.
Como neste exemplo os novos elementos devem ser adicionados em todos os itens do array "items", deve-se navegar no Json de Entrada até a posição onde estão os campos que terão seu valor replicados para os novos elementos do Json de Saída.
Para percorrer o array será utilizada a anotação "*" (asterisco) que permite referenciar o seu conteúdo de forma dinâmica, algo similar a um for/loop.
Nível para referenciar o campo com o valor a ser replicado através do "@":
Criar o Spec de transformação para incorporar a anotação "*" (asterisco), que funciona como um for/loop, observando o nível onde estão os campos com os valores que serão replicados no Json de Entrada para os novos elementos do Json de Saída.
Neste exemplo temos a aplicação de funções da Biblioteca do Jolt:.
- =toString - convertendo o valor de um campo que existe em campos do Json de Entrada
- =concat - concatenando texto fixo com valores que existem em campos no Json de Entrada
Neste exemplo temos a utilização da anotação "@" (arroba), que permite Referencia o valor de um campo ou objeto contido no JSON de entrada, e deverá receber a indicação de qual nível do Json de Entrada será referenciado o campo, bem como o campo que será referenciado.
[ { "operation": "modify-overwrite-beta", "spec": { "items": { "*": { "matricula_s": "=toString(@(1,codigousur))", "id_retarguada": "=concat('RCA-', @(1,codigousur))", "idExterno": "=concat('pdvsync-usuario-rca-', @(1,codigousur),'-', @(1,dtAlteracao))" } } } } ]
A função concat pode receber várias concatenações porque aceita um número indefinido de parâmetros (varargs)
Entrada
{ "first": false, "items": [ { "codFilial": "1", "codigousur": 1, "nome": "SUPERVISOR 1", "tipoVenda": "R", "tipoPessoa": "F", "cpfCnpj": "68881428504", "areaAtuacao": "FARMACÊUTICO", "codigoSupervisor": 2, "nomeSupervisor": "SUPERVISOR 2", "status": "NORMAL", "dtCadastroSupervisor": "1900-01-01T00:00:00", "dtCadastroRca": "2004-06-08T00:00:00", "dtAlteracao": "2020-01-20T17:22:19" }, { "codFilial": "1", "codigousur": 1252, "nome": "VENDEDOR 1252", "tipoVenda": "R", "tipoPessoa": "J", "cpfCnpj": "05869591000151", "areaAtuacao": "FARMACÊUTICO", "codigoSupervisor": 2, "nomeSupervisor": "SUPERVISOR 2", "status": "NORMAL", "dtCadastroSupervisor": "1900-01-01T00:00:00", "dtCadastroRca": "2011-03-29T00:00:00", "dtAlteracao": "1900-01-01T00:00:00" } ], "hasNext": true }
Transformação
[ { "operation": "modify-overwrite-beta", "spec": { "items": { "*": { "idRetaguarda": "=concat('RCA-', @(1,codigousur))", "idExterno": "=concat('pdvsync-usuario-rca-', @(1,codigousur),'-', @(1,dtAlteracao))" } } } } ]
Saída
{ "first" : false, "items" : [ { "codFilial" : "1", "codigousur" : 1, "nome" : "SUPERVISOR 1", "tipoVenda" : "R", "tipoPessoa" : "F", "cpfCnpj" : "68881428504", "areaAtuacao" : "FARMACÊUTICO", "codigoSupervisor" : 2, "nomeSupervisor" : "SUPERVISOR 2", "status" : "NORMAL", "dtCadastroSupervisor" : "1900-01-01T00:00:00", "dtCadastroRca" : "2004-06-08T00:00:00", "dtAlteracao" : "2020-01-20T17:22:19", "idRetaguarda" : "RCA-1", "idExterno" : "pdvsync-usuario-rca-1-2020-01-20T17:22:19" }, { "codFilial" : "1", "codigousur" : 1252, "nome" : "VENDEDOR 1252", "tipoVenda" : "R", "tipoPessoa" : "J", "cpfCnpj" : "05869591000151", "areaAtuacao" : "FARMACÊUTICO", "codigoSupervisor" : 2, "nomeSupervisor" : "SUPERVISOR 2", "status" : "NORMAL", "dtCadastroSupervisor" : "1900-01-01T00:00:00", "dtCadastroRca" : "2011-03-29T00:00:00", "dtAlteracao" : "1900-01-01T00:00:00", "idRetaguarda" : "RCA-1252", "idExterno" : "pdvsync-usuario-rca-1252-1900-01-01T00:00:00" } ], "hasNext" : true }
2.2.2 - Transformação sem alterar os valores dos elementos do Json, somente a estrutura [shift]
Como nesta transformação é alterar parte da estrutura do JSON, renomeando alguns campos sem alterar seus valores, além criar um novo campo condicional tipo IF/ELSE.
Para identificar por quantos níveis será a navegação no Json de Entrada até os campos que serão renomeados, deve-se analisar a estrutura do Json de Entrada.
Para percorrer o array será utilizada a anotação "*" (asterisco) que permite referenciar o seu conteúdo de forma dinâmica, algo similar a um for/loop.
Criar o Spec de transformação para incorporar a anotação "*" (asterisco), que funciona como um for/loop, observando o nível onde está colocado cada array na estrutura do Json de Entrada.
Neste exemplo temos a aplicação de uma condicional similar a um IF/ELSE
Seguir a especificação definida pelo JOLT
"tipoPessoa": { "F": { "#FISICA": "items[&3].tipoPessoa" }, "J": { "#JURIDICA": "items[&3].tipoPessoa" }, "*": { "#A_DEFINIR": "items[&3].tipoPessoa" } }
Onde:
- "tipoPessoa" = nome do campo do Json de Entrada
- "F" e "J" = Valores da condição que serão comparados com o valor do campo do Json de Entrada
- "*" (asterisco) = qualquer valor diferente dos testados ("F" e "J") entrará nesta condição
- "#FISICA", "#JURIDICA" e "#A_DEFINIR" = valores que serão atribuídos ao campo no Json de Saída mediante o resultado da condição. É OBRIGATÓRIO colocar o caractere # (hashtag) antes do texto que será atribuído ao novo campo do Json de Saída. Sem o caractere # o Jolt não realiza a transformação IE/ELSE.
No exemplo abaixo, o campo "tipoPessoa" será gravado no mesmo nível dos demais campos no Json de Saída, porém teve a sua referência alterada de &1 para &3
No exemplo abaixo a posição do campo "idExterno" no Json de Saída já está sendo designada para o nó raiz, por não ter sido mapeada a referência "items[&1]" como nos demais campos.
Conforme mencionado no item anterior, é um pré-requisito do WSH que o Json contenha um array com os valores que serão gravados no campo PCINTEGRACAOCORE.IDINTERNO (para mais informações sobre o Jolt x WSH acessar Utilização dos dados transformados pelo WSH)
[ { "operation": "shift", "spec": { "items": { "*": { "codigoSupervisor": "items[&1].codigoSupervisor", "cpfCnpj": "items[&1].cpf", "idRetaguarda": "items[&1].idRetaguarda", "idExterno": "idExterno", "nome": "items[&1].nome", "tipoPessoa": { "F": { "#FISICA": "items[&3].tipoPessoa" }, "J": { "#JURIDICA": "items[&3].tipoPessoa" }, "*": { "#A_DEFINIR": "items[&3].tipoPessoa" } } } } } } ]
Entrada
{ "first" : false, "items" : [ { "codFilial" : "1", "codigousur" : 1, "nome" : "SUPERVISOR 1", "tipoVenda" : "R", "tipoPessoa" : "F", "cpfCnpj" : "68881428504", "areaAtuacao" : "FARMACÊUTICO", "codigoSupervisor" : 2, "nomeSupervisor" : "SUPERVISOR 2", "status" : "NORMAL", "dtCadastroSupervisor" : "1900-01-01T00:00:00", "dtCadastroRca" : "2004-06-08T00:00:00", "dtAlteracao" : "2020-01-20T17:22:19", "idRetaguarda" : "RCA-1", "idExterno" : "pdvsync-usuario-rca-1-2020-01-20T17:22:19" }, { "codFilial" : "1", "codigousur" : 1252, "nome" : "VENDEDOR 1252", "tipoVenda" : "R", "tipoPessoa" : "J", "cpfCnpj" : "05869591000151", "areaAtuacao" : "FARMACÊUTICO", "codigoSupervisor" : 2, "nomeSupervisor" : "SUPERVISOR 2", "status" : "NORMAL", "dtCadastroSupervisor" : "1900-01-01T00:00:00", "dtCadastroRca" : "2011-03-29T00:00:00", "dtAlteracao" : "1900-01-01T00:00:00", "idRetaguarda" : "RCA-1252", "idExterno" : "pdvsync-usuario-rca-1252-1900-01-01T00:00:00" } ], "hasNext" : true }
Transformação
[ { "operation": "shift", "spec": { "items": { "*": { "codigoSupervisor": "items[&1].codigoSupervisor", "cpfCnpj": "items[&1].cpf", "idRetaguarda": "items[&1].idRetaguarda", "idExterno": "idExterno", "nome": "items[&1].nome", "tipoPessoa": { "F": { "#FISICA": "items[&3].tipoPessoa" }, "J": { "#JURIDICA": "items[&3].tipoPessoa" }, "*": { "#A_DEFINIR": "items[&3].tipoPessoa" } } } } } } ]
Saída
{ "items" : [ { "codigoSupervisor" : 2, "cpf" : "68881428504", "idRetaguarda" : "RCA-1", "nome" : "SUPERVISOR 1", "tipoPessoa" : "FISICA" }, { "codigoSupervisor" : 2, "cpf" : "05869591000151", "idRetaguarda" : "RCA-1252", "nome" : "VENDEDOR 1252", "tipoPessoa" : "JURIDICA" } ], "idExterno" : [ "pdvsync-usuario-rca-1-2020-01-20T17:22:19", "pdvsync-usuario-rca-1252-1900-01-01T00:00:00" ] }
2.2.3 - Transformação para adicionar novos elemento com valore default no json [default]
O objetivo desta transformação é adicionar alguns campos que receberão variáveis de ambiente requeridas por uma API externa (uma atividade muito comum nos layouts de integração do WSH) e um elemento obrigatório para que o WSH consiga ler o conteúdo do JSON e gravá-lo na tabela PCINTEGRACAOCORE para posterior transmissão por API.
O nome deste elemento é "_attr_access", e nele deve ser atribuído o nome da lista que o WSH vai percorrer para pegar as chaves que deverão ser gravadas no campo PCINTEGRACAOCORE.IDEXTERNO, no banco de dados, junto com os dados transformados para cada idExterno a serem gravados no campo PCINTEGRACAODADOS.DADOSTRANSFORMADOS.
(Para mais informações sobre o Jolt x WSH acessar Utilização dos dados transformados pelo WSH)
Procurar no Json de Entrada pelos arrays que existem na estrutura do Json, para identificar quantos níveis existirão no Spec de transformação até atingir o elemento que desejamos alterar o seu valor.
O objetivo deste exemplo é converter o valor de dois campos de numérico para string, e a Biblioteca o Jolt oferece a função toString.
Estrutura esperada do Json:
O Spec de transformação é bem simples, porque o elemento será adicionado no no nó raiz.
Neste exemplo temos a aplicação de variáveis de ambiente ("{{ID_INQUILINO}}" e "{{MASTER_ID_PROPRIETARIO}}")
[ { "operation": "default", "spec": { "_attr_access": "items", "items[]": { "*": { "idInquilino": "{{ID_INQUILINO}}", "idProprietario": "{{MASTER_ID_PROPRIETARIO}}", "idRetaguardaPerfil": 2 } } } } ]
Entrada
{ "items": [ { "codigoSupervisor": 2, "cpf": "68881428504", "idRetaguarda": "RCA-1", "nome": "SUPERVISOR 1", "tipoPessoa": "FISICA" }, { "codigoSupervisor": 2, "cpf": "05869591000151", "idRetaguarda": "RCA-1252", "nome": "VENDEDOR 1252", "tipoPessoa": "JURIDICA" } ], "idExterno": [ "pdvsync-usuario-rca-1-2020-01-20T17:22:19", "pdvsync-usuario-rca-1252-1900-01-01T00:00:00" ] }
Transformação
[ { "operation": "default", "spec": { "_attr_access": "items", "items[]": { "*": { "idInquilino": "{{ID_INQUILINO}}", "idProprietario": "{{MASTER_ID_PROPRIETARIO}}", "idRetaguardaPerfil": 2 } } } } ]
Saída
{ "items" : [ { "codigoSupervisor" : 2, "cpf" : "68881428504", "idRetaguarda" : "RCA-1", "nome" : "SUPERVISOR 1", "tipoPessoa" : "FISICA", "idInquilino" : "{{ID_INQUILINO}}", "idProprietario" : "{{MASTER_ID_PROPRIETARIO}}", "idRetaguardaPerfil" : 2 }, { "codigoSupervisor" : 2, "cpf" : "05869591000151", "idRetaguarda" : "RCA-1252", "nome" : "VENDEDOR 1252", "tipoPessoa" : "JURIDICA", "idInquilino" : "{{ID_INQUILINO}}", "idProprietario" : "{{MASTER_ID_PROPRIETARIO}}", "idRetaguardaPerfil" : 2 } ], "idExterno" : [ "pdvsync-usuario-rca-1-2020-01-20T17:22:19", "pdvsync-usuario-rca-1252-1900-01-01T00:00:00" ], "_attr_access" : "items" }
2.2.4 - Spec de transformação completo
Transformação
[ { "operation": "modify-overwrite-beta", "spec": { "items": { "*": { "idRetaguarda": "=concat('RCA-', @(1,codigousur))", "idExterno": "=concat('pdvsync-usuario-rca-', @(1,codigousur),'-', @(1,dtAlteracao))" } } } }, { "operation": "shift", "spec": { "items": { "*": { "codigoSupervisor": "items[&1].codigoSupervisor", "cpfCnpj": "items[&1].cpf", "idRetaguarda": "items[&1].idRetaguarda", "idExterno": "idExterno", "nome": "items[&1].nome", "tipoPessoa": { "F": { "#FISICA": "items[&3].tipoPessoa" }, "J": { "#JURIDICA": "items[&3].tipoPessoa" }, "*": { "#A_DEFINIR": "items[&3].tipoPessoa" } } } } } }, { "operation": "default", "spec": { "_attr_access": "items", "items[]": { "*": { "idInquilino": "{{ID_INQUILINO}}", "idProprietario": "{{MASTER_ID_PROPRIETARIO}}", "idRetaguardaPerfil": 2 } } } } ]