Manual de Integração -
PROMO Filas de Mensagens v7.2
Índice
Sobre o manual
Finalidade e âmbito
O objetivo deste manual é treinar o usuário que deseja integrar seu aplicativo de vendas com os serviços que o Promo expõe e sua integração por meio de filas de mensagens.
É fornecida uma descrição detalhada das mensagens que lhe devem ser enviadas e como interpretar as mensagens de resposta que dará a um pedido.
Introdução
CONSIDERAÇÕES NO USO DE FILAS DE MENSAGENS
Atualmente as aplicações estão disponíveis na nuvem (SAS) e isso trouxe novos paradigmas de arquitetura de soluções. Uma delas é desacoplar esses aplicativos em pequenos componentes ou blocos independentes que podem ser mais fáceis de desenvolver, implementar e manter no futuro. Obviamente, tal arquitetura requer um mecanismo de comunicação confiável e seguro entre os blocos mencionados e, acima de tudo, um mecanismo mais flexível do que a comunicação inter processos tradicional com as limitações que eles impõem.
A utilização de filas de mensagens oferece-nos uma alternativa válida para implementar a referida comunicação, e mesmo a coordenação dos referidos componentes. Consideremos que a fila de mensagens é um árbitro que quebra o conhecimento ou a dependência direta entre as partes, pois está localizada no meio, sendo a única coisa que os consumidores e produtores de mensagens conhecem e dependem. Com isso, o código de comunicação é menor em cada componente e a comunicação segue um padrão padrão como Publisher-subscriber, ou Listener DP, que é uma solução comprovada e adotada na indústria de software.
Outra vantagem do uso de filas é que elas permitem que a comunicação assíncrona seja implementada, pois, como mencionamos anteriormente, produtores e consumidores não interagem entre si, mas sim por meio da fila, de modo que as mensagens podem ser enviadas para a fila independentemente de se há alguém disponível para ouvi-los ou que possa processá-los naquele exato momento. Da mesma forma, um consumidor pode pegar ou receber mensagens da fila em seu próprio tempo e poder de processamento. Dessa forma, nenhum componente depende diretamente do outro, melhorando o fluxo de dados.
Do que foi dito até agora, pode-se deduzir que a arquitetura é flexível no que diz respeito à sua escalabilidade, pois de acordo com a carga de trabalho, os nós da própria fila podem ser dimensionados, os produtores podem crescer em número e os consumidores no mesma forma, com a qual permite que a capacidade do sistema cresça de forma quase transparente.
Uma grande vantagem a referir é que sendo a fila que gere os dados, existe uma maior tolerância a falhas, pois se algum componente não estiver disponível é a mesma fila que efetua a persistência dos dados e ela própria pode ser implementado em um esquema de alta disponibilidade, melhorando ainda mais a tolerância a erros.
CONSIDERAÇÕES ESPECÍFICAS PARA A PROMOÇÃO
Promo incorporou o uso das filas mencionadas como padrão.
Na imagem a seguir, você pode ver um diagrama de arquitetura simples:
Do diagrama pode-se deduzir que Promo é um produtor da informação que gere (ex: Elementos de Fidelidade), ao mesmo tempo que é um consumidor da informação fornecida por sistemas externos (ex: Catálogo de Marcas).
Desta forma, obtêm-se todas as vantagens mencionadas na primeira parte do documento, onde a interdependência entre sistemas é eliminada, e também o balanceamento de carga e escalabilidade são feitos de forma transparente, já que tanto o Promo quanto o sistema externo podem crescer independentemente um do outro. Ao mesmo tempo, a comunicação entre ambos os sistemas é gerenciada pelo servidor de filas, homogeneizando-o e eliminando a relação direta e, portanto, a possibilidade de falhas por não encontrar um componente disponível, ou por não responder no tempo estipulado.
O que é RabbitMQ?
RabbitMQ é um software de enfileiramento de mensagens chamado corretor de mensagens ou gerenciador de filas. Simplificando, é um software onde as filas podem ser definidas, os aplicativos podem se conectar a essas filas e colocar/ler mensagens nelas.
Como funciona?
A arquitetura básica de uma fila de mensagens é simples. Existem aplicações clientes, chamadas de produtores, que criam mensagens e as entregam ao broker (a fila de mensagens). Outros aplicativos, chamados consumidores, conectam-se à fila e assinam as mensagens a serem processadas. Uma mensagem pode incluir qualquer tipo de informação.
Um software pode ser produtor, consumidor ou produtor e consumidor de mensagens simultaneamente. As mensagens colocadas na fila são armazenadas até serem recuperadas e processadas pelo consumidor.
Requisitos
No desenvolvimento deste manual assume-se que você possui um servidor RabbitMQ instalado, disponível e configurado.
Para mais informações, acesse https://www.rabbitmq.com/
variável RabbitMq.date.UTC
Através da variável .date.UTC rabbitmq , todas as mensagens que são retornadas para qualquer uma das consultas via Rest disponíveis no Promo, são reportadas com o formato de localidade configurado no servidor; que por padrão é GMT
Filas de mensagens afetadas :
- Promoções: rabbitMQ. promoção .endpointName
- Histórico de itens de fidelidade: rabbitMQ. cardhistory .endpointName
- Histórico de cupons: rabbitMQ. cupomHistory .endpointName
- Estado limite: rabbitMQ. limitstatus .endpointName
- Status do mecanismo e do console: rabbitMQ. enginestatus .endpointName
Nota
Leve em consideração a configuração descrita em Informações de configuração
Promoção como consumidor
Promo possui funcionalidade de consumidor de fila RabbitMQ com a finalidade de receber informações sobre catálogos de sistemas externos (produtores).
Contexto
Os parâmetros de configuração que ativam e definem esta funcionalidade encontram-se em Administração→Informações de configuração. (Palavra-chave RabbitMQ na pesquisa).
Assim que o Promo receber as informações da fila correspondente do Rabbit, elas serão transferidas para o monitor de Importação e serão processadas pela tarefa agendada denominada "Importador de Entidade".
Para suportar esta funcionalidade, as seguintes entradas devem ser configuradas no menu Administração , na seção Informações de configuração :
dica | Tipo de dados | Descrição |
---|---|---|
rabbitMQ.enabled | boleano | Propriedade que indica se o RabbitMQ está ativado (verdadeiro ou falso). Se definido como TRUE Promo se conectará ao servidor RabbitMQ e o ouvirá. Se for definido como falso, ele se desconectará dele. |
RabbitMQ.endpointName | alfanumérico | Nome da fila RabbitMQ da qual as mensagens serão consumidas |
RabbitMQ.uri | alfanumérico | URI completo da conexão RabbitMQ ( amqp://<user>:<password>@<host>:<port>/<vhost> ) vhost: Opcional se definido no servidor RabbitMQ Este parâmetro contém e exclui os outros marcados com * |
RabbitMQ.nome de usuário* | alfanumérico | Usuário para acessar o RabbitMQ |
RabbitMQ.senha* | alfanumérico | Senha para acessar o RabbitMQ |
RabbitMQ.host* | alfanumérico | Endereço (host) do servidor RabbitMQ |
RabbitMQ.virtualHost* | alfanumérico | Host Virtual para RabbitMQ |
RabbitMQ.port* | Numérico | Porta do servidor RabbitMQ |
Conforme a tabela anterior teremos 2 formas exclusivas de configurar, ou seja, ou é utilizado o parâmetro URI ou seus componentes são utilizados separadamente.
Teremos então por exemplo:
1) Usando URIs:
rabbitMQ.enabled : (verdadeiro ou falso)
rabbitMQ.uri :amqp://<usuário>:<senha>@<host>:<porta>/<vhost( Opcional) >
rabbitMQ.endpointName :<queueName>
2) Usando os parâmetros separadamente:
rabbitMQ.enabled :(verdadeiro ou falso)
RabbitMQ.username :<usuário>
RabbitMQ.senha: <senha>
RabbitMQ.host :<host>
RabbitMQ.virtualHost :<vhost>
rabbitMQ.port :<porta>
rabbitMQ.endpointName :<queueName>
A figura a seguir mostra a tela de Configuração:
Consumer por Empresa
A Promo suporta apenas um consumidor por empresa.
Uma vez configuradas as propriedades da fila, o sistema tentará se conectar ao servidor RabbitMQ, caso não obtenha sucesso na conexão, o sistema tentará novamente quando o job de importação "JobService" for executado (antes de fazer a chamada de importação ) .
Formato de mensagem de fila (catálogos)
O formato da mensagem a ser recebida das filas segue o seguinte padrão geral (JSON):
{ "companyId": "<companyId>", "catálogo": "<nome do catálogo>", "parâmetros": [], "Unid": [{ "operação": "eu", "<nome do campo>": "<nome>", "<fieldCode>": "<code>" }, { "operação": "U", "<nome do campo>": "<nome>", "<fieldCode>": "<code>" }, { "operação": "D", "<nome do campo>": "<nome>", "<fieldCode>": "<code>" }, { "operação": "eu", "<nome do campo>": "<nome>", "<fieldCode>": "<code>" } ] }
Onde:
Propriedade | Tipo de dados | Descrição |
ID da empresa | alfanumérico | Código da companhia |
Catálogo | alfanumérico | Código que identifica o catálogo (VER TIPOS VÁLIDOS) |
parâmetros | JSON | Opcional. Dados auxiliares para definir quais serão usados para importar o catálogo |
Unid | matriz json | São os itens a importar do catálogo |
cirurgia | alfabética | Operação a realizar no registro ( I , U , D ) "I" indica que o registro deve ser inserido "U" indica que o registro precisa ser atualizado "D" indica que o registro deve ser excluído "UI" indica que o registro será inserido se não existir ou atualizado se existir |
<fieldName> | alfanumérico | campos específicos do catálogo a importar |
TIPOS DE CATÁLOGOS VÁLIDOS:
Catálogo | Descrição |
---|---|
catalogCard | Catálogo de elementos de fidelidade |
catálogoMarca | Catálogo de marcas |
catálogoCategoria | Catálogo de categorias |
catálogocanal | Catálogo de Canais |
catalogCreditCampaignCode | Catálogo de Campanhas de Crédito |
catálogoCliente | Catálogo de Clientes |
catálogoCustomerType | Catálogo de tipos de Clientes |
catalogIdType | Catálogo de Tipos de Identificadores |
departamentodecatálogo | Catálogo de Departamentos |
catalogEventTransaction | catálogo de eventos |
catalogEventTransactionType | Catálogo de tipo de evento |
catálogoEstenderGarantia | Catálogo de extensão de garantia |
catálogoFamília | Catálogo de família de produtos |
formato de catálogo | Catálogo de formatos |
catalogInfoFinancial | Catálogo de Informações Financeiras |
catalogItem | Catálogo de produtos |
catalogItemEstoque | Catálogo de Estoque de Produtos |
catálogoPagamentoBanco | Catálogo de pagamentos bancários |
catalogPaymentCode | Catálogo de códigos de pagamento bancário |
catalogPaymentPrefix | Catálogo de Prefixos Bancários |
catalogPaymentType | Catálogo de Tipos de Pagamento |
catalogProfileCode | Catálogo de códigos de perfil do cliente |
catalogStoreChain | Catálogo da cadeia de valor |
catálogoLoja | Catálogo da loja |
catálogoSubcategoria | catálogo de subcategorias |
catálogoSubZona | catálogo de subzona |
catálogofornecedor | catálogo de fornecedores |
catalogZone | catálogo de zonas |
catálogo<CodeFieldDynamic> | Catálogo dinâmico o nome do mesmo é formado com o Catálogo String concatenado com o código do campo dinâmico gerado no console |
Exemplos de carregamento de Catálogos
O exemplo a seguir mostra a inserção de 2 registros de elementos de fidelidade.
{ "companyId": "napse", "catálogo": "cartão de catálogo", "parâmetros": [], "Unid": [ { "operação": "eu", "código": "1234000000000", "tipo": "1234", "validFrom": "2019-06-01", "validTo": "2029-06-20", "cvv": "987", "ID do cliente": 12134, "quantia": 300.000 }, { "operação": "eu", "código": "1234000000001", "tipo": "1234", "validFrom": "2019-06-01", "validTo": "2029-06-22", "cvv": "879", "ID do cliente": 2222, "quantia": 60000 }, ] }
Nas versões superiores a 6.5.14 e 7.0, é incorporada a possibilidade de fazer atualizações no campo cvv. Neste caso, o referido campo é registado como atualização no detalhe dos movimentos dos elementos de fidelização.
O exemplo a seguir mostra a inserção de 2 registros de marca registrada:
{ "companyId": "napse", "catálogo": "catálogoMarca", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "coca", "nome": "Empresa Coca-Cola" }, { "operação": "eu", "código": "pepsi", "nome": "Pepsi" } ] }
Aqui está um exemplo de inserção de um registro de categoria:
{ "companyId": "napse", "catálogo": "catálogoCategoria", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "linha branca", "nome": "Linha Branca", "familyCode":"Eleger" } ] }
{ "companyId": "napse", "catálogo": "catalogChannel", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "web", "nome": "Web" } ,{ "operação": "eu", "código": "POS", "nome": "PONTO DE VENDA" } ] }
{ "companyId": "napse", "catalog": "catalogCreditCampaignCode", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "campg1", "nome": "Campânia 1" } ] }
{ "companyId": "napse", "catálogo": "catálogoCliente", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "abc29789456", "nome": "José Luís", "lastName": "Martinez", "email":"[email protected]", "tipo de identificação":"ID", "identificador":"29789456" } ] }
{ "companyId": "napse", "catálogo": "catálogoCustomerType", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "vip", "nome": "CLIENTE VIP" } ] }
{ "companyId": "napse", "catálogo": "catalogIdType", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "ID", "nome": "DOCUMENTO DE IDENTIDADE NACIONAL" } ] }
{ "companyId": "napse", "catálogo": "departamento de catálogo", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "elec", "nome": "Eletrônica" } ] }
{ "companyId": "napse", "catálogo": "catálogoEventTransação", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "blFriday", "nome": "Sexta-feira negra" } ] }
{ "companyId": "napse", "catálogo": "catalogEventTransactionType", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "bf2019", "nome": "Sexta-feira Negra 2019" } ] }
{ "companyId": "napse", "catalog": "catalogExtendWarranty", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "sonyArg", "categoria": "linha branca", "creditProduct": "40%", "perfilClientes": "vip", "loja": "ponto", "skuWarranty": "WAUKH78EX6A144617", "anos de garantia": "2 anos", "initData": , "data final": , "endPrice": 13999 }] }
{ "companyId": "napse", "catálogo": "catálogoFamília", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "coco", "nome": "Cozinha" } ] }
{ "companyId": "napse", "catálogo": "formatocatálogo", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "escavar", "nome": "Digital" } ] }
{ "companyId": "napse", "catalog": "catalogInfoFinancial", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "ônibus", "name": "Ônibus Financeiro" } ] }
{ "companyId": "napse", "catalog": "catalogItem", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "997551470-7", "nome": "Disco sdd 256", "preço unitário": 5000, "level1": "partida1", "nível2": "família1", "nível3": "categoria1", "level4": "subcategoria1", "fornecedor": "tecno", "marca": "WesternDigital", "detalhe": "Western Digital 512gb", "detail2": "WesternDigital 512gb sdd", "<CodeFieldDynamic>":"<valor>" }] }
Catalogo de Ítem con campos Dinámicos
O catálogo de itens suporta a inserção de campos dinâmicos, eles devem ser enviados como mais um atributo, colocando o código do campo entre aspas: e seu valor entre aspas
Exemplo de CatalogItem com dois campos dinâmicos, por exemplo se houver dois campos dinâmicos com o código de sublinhado e outra cor, o exemplo seria o seguinte
Produtos com campos dinâmicos
{ "companyId": "napse", "catalog": "catalogItem", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "997551470-7", "nome": "Disco sdd 256", "preço unitário": 5000, "level1": "partida1", "nível2": "família1", "nível3": "categoria1", "level4": "subcategoria1", "fornecedor": "tecno", "marca": "WesternDigital", "detalhe": "Western Digital 512gb", "detail2": "WesternDigital 512gb sdd", "sublinha":"meuSublinha", "cor azul" }] }
{ "companyId": "napse", "catalog": "catalogPaymentBank", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "crédito18", "name": "18x sem juros" }] }
{ "companyId": "napse", "catalog": "catalogPaymentCode", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "pagamentoCode1", "nome": "código de pagamento 1" }] }
{ "companyId": "napse", "catalog": "catalogPaymentPrefix", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "perfix1", "nome": "perfix1" }] }
{ "companyId": "napse", "catalog": "catalogPaymentType", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "cartão", "nome": "cartão de crédito" }] }
{ "companyId": "napse", "catálogo": "catálogoProfileCode", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "abc1", "nome": "clientes abc1" }] }
{ "companyId": "napse", "catalog": "catalogPaymentType", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "cartão", "nome": "cartão de crédito" }] }
{ "companyId": "napse", "catálogo": "catalogStoreChain", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "cadeia1", "nome": "cadeia1" }] }
{ "companyId": "napse", "catalog": "catalogStore", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "ponto", "name": "ponto bs como loja" }] }
{ "companyId": "napse", "catálogo": "catálogoSubCategoria", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "pequenoElec", "nome": "Pequenos Eletrodomésticos", "categoryCode": "ELECT" }] }
Catalogo de Subcategoria
O atributo categoryCode do catálogo Subcategorias é o código da categoria
{ "companyId": "napse", "catálogo": "catálogoSubZona", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "conurbe", "nome": "conurbano bsas" }] }
{ "companyId": "napse", "catálogo": "catálogoFornecedor", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "sony", "nome": "corporação sony" }] }
{ "companyId": "napse", "catálogo": "zona de catálogo", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "bsnorte", "nome": "zona norte bsas" }] }
{ "companyId": "napse", "catálogo": "catálogo<Dinâmico>", "parâmetros": [], "Unid": [{ "operação": "eu", "código": "código", "nome nome" }] }
Catalogos Dinamicos
Catálogos Associados a Campos Dinâmicos
A definição dos chamados campos dinâmicos permite que sejam associados a um catálogo. Este catálogo também pode ser gerenciado por meio de filas.
Exemplo de carregamento de um catálogo DINÂMICO.
Passos
Acesse o menu Administração na opção Atributo do Elemento, ali será criado o campo dinâmico que deverá ser definido como o tipo AUTOCOMPLETE BY CATALOG.
- Uma vez criado o novo atributo, desde o RabbitMQ Producer, será possível enviar os dados associados ao novo catálogo
- Para acessar o resultado da importação, você deverá visualizar a opção Monitor de Importação no menu SUPORTE.
4. Em Administração, Importação de Catálogo, você pode ver os dados inseridos.
5. Na promoção você pode selecionar os dados inseridos.
6. Para que o mecanismo avalie a promoção, o atributo criado na etapa deve ser distribuído ( Esta distribuição requer que o mecanismo seja reiniciado ).
7. Distribua o mapa com a promoção para poder avaliá-la.
Exclusão de atributos nos catálogos PROMO
A partir desta versão, Promo permite deletar alguns atributos de determinados catálogos simplesmente enviando o id do referido atributo que é enviado a ele no Json, utilizando o processo de fila RabbitMQ.
Não é necessário enviar id e descrição. Enviando apenas o código, a exclusão pode ser realizada.
Os catálogos que atendem a esse critério são:
catálogos dinâmicos,
"CatalogAdditionalField00", "CatalogAdditionalField01", "CatalogAdditionalField02", "CatalogAdditionalField03", "CatalogAdditionalField04", "CatalogAdditionalField05", "CatalogAdditionalField06", "CatalogAdditionalField07", "CatalogAdditionalField
d08", "Catálogo CampoAdicional09" , "CampoAdicionalCatalog10"
, "CampoAdicionalCatalogo11",
" CatalogAdditionalField12 ", "CatalogAdditionalField13", "CatalogAdditionalField14", "CatalogAdditionalField15",
"CatalogAdditionalField16", "CatalogAdditionalField17", "CatalogAdditionalField18", "CatalogAdditionalField19",
"CatalogBrand", "CatalogChannel", "CatalogCreditCampaignCode",
"CatalogCurrencyCode", "CatalogCustomerType", "CatalogDepartment", "CatalogEventTransaction",
"CatalogEventTransactionType", "CatalogFamily", "CatalogFormat",
"CatalogPaymentBank", "CatalogPaymentCode", "CatalogPaymentPrefix", "CatalogItem", "CatalogSubCategory",
"CatalogPaymentType", "CatalogPocket", "CatalogProductBarcode", "CatalogProductCode", "CatalogCusto " sea ",
"CatalogProfileCode", "CatalogStoreChain", "CatalogStore", "CatalogSubZone", "CatalogSupplier", "CatalogZone", "CatalogGender", "CatalogIdType", " CatalogContractPriceList", "CatalogCountry", "CatalogCategory"
,
Dos itens acima, estes não suportam repetição de registro:
"CatalogGender", "CatalogIdType", "CatalogContractPriceList", "CatalogCountry",
"CatalogCustomerType", "CatalogItem", "CatalogCustomer"
E estes não são nomes de código, mas ainda atenderão ao requisito porque sua chave primária inclui apenas companyId e code
"CatalogItem", "CatalogCustomer", "CatalogSubCategory"
"CatalogCategory"
Estes catálogos não foram afetados:
"Card", "CatalogCity" ,"CatalogState", "CatalogInfoFinancial", "CatalogItemStock" (apesar de possuir uma chave primária companyId-code, não possui um campo de nome), "CatalogExtendWarranty" (o mesmo acima), "CatalogRedeemBenefit"
Processo
Para isso, a fila do catálogo deve ser criada no RabbitMq e podem ocorrer as seguintes situações:
- Em qualquer catálogo que tenha o formato Código, Nome, um registro pode ser excluído enviando o código e o nome (ambos os campos corresponderão para exclusão).
No console você vê:
A mensagem é enviada:
O Job de importação da entidade deve ser executado e o registro deletado no console.
2. Em qualquer catálogo que tenha o formato Código, Nome, um registro pode ser excluído enviando apenas o código.
Na consola:
Após executar o trabalho de importação de entidade, o primeiro registro de código de canal encontrado terá sido deletado.
2. Em qualquer catálogo que tenha o formato Código, Nome, um registro pode ser excluído enviando apenas o código, mas ter registros duplicados excluirá apenas um.
Na consola:
{ "companyId": "napse", "catálogo": "catalogChannel", "parâmetros": [], "Unid": [ { "código": "canal2", "nome": "nome2", "operação": "D" } ] }
No console será observado que o registro não foi mais encontrado:
Promoção como Produtor
Promo permite o envio de informações via filas do RabbitMQ (função de produtor). Por padrão, essas informações são enviadas a cada 30 minutos (processo em segundo plano) para o servidor de filas.
Configuração do Produtor
Para suportar esta funcionalidade, as seguintes entradas devem ser configuradas no menu Administração , no submenu Informações de configuração :
dica | Tipo de dados | Descrição |
---|---|---|
RabbitMQ.produtor.enabled | boleano | Propriedade que indica se o RabbitMQ está habilitado para postagem de dados (verdadeiro ou falso) |
RabbitMQ. promoção. endpointName | alfanumérico | Nome da fila RabbitMQ para postagem de promoções, que se encarregará de receber as mensagens para posterior processamento pelo Consumidor |
RabbitMQ. limitstatus. endpointName | alfanumérico | Nome da fila do RabbitMQ para postagem do status limite, que se encarregará de receber as mensagens para posterior processamento pelo Consumidor |
RabbitMQ.enginestatus.endpointName | alfanumérico | Nome da fila RabbitMQ para postagem do status do mecanismo e do console. |
RabbitMQ. produtor. uri | alfanumérico | URI de conexão RabbitMQ completo para postagem de dados (amqp://<user>:<password>@<host>:<port>/<vhost>) vhost: Opcional se definido no servidor RabbitMQ |
RabbitMQ. produtor. nome de usuário | alfanumérico | Usuário para acessar o RabbitMQ para postagem de dados |
RabbitMQ. produtor. senha | alfanumérico | Senha para acessar o RabbitMQ para postagem de dados |
RabbitMQ. produtor. hospedar | alfanumérico | Endereço (host) do servidor RabbitMQ para postagem de dados |
RabbitMQ. produtor. virtualHost | alfanumérico | Virtual Host para RabbitMQ para postagem de dados |
RabbitMQ. produtor. porta | Numérico | Porta do servidor RabbitMQ para postagem de dados |
RabbitMQ.promotionsCache.endpointName | alfanumérico | Nome da fila do RabbitMQ que receberá as mensagens referentes ao Cache de Promoções. (Ver Cache de Promoções) |
Novamente a configuração via URI é exclusiva da configuração por parâmetros separados. Assim teremos duas configurações:
Configuração via URI:
RabbitMQ. produtor. ativado : (verdadeiro ou falso)
RabbitMQ. produtor. uri :amqp://<usuário>:<senha>@<host>:<porta>/<vhost( Opcional) >
RabbitMQ. promoção. endpointName :<nombreCola para postar promoções>
rabbitMQ.limitstatus.endpointName : <nombreQueue para postagem de status de limite>
rabbitMQ.cardhistory.endpointName: < Nome da fila RabbitMQ para postagem de dados CardHistory >
rabbitMQ.enginestatus.endpointName : <nome da fila para postar status do mecanismo e console>
Segundo ou configuração por parâmetros:
RabbitMQ. produtor. habilitado :(verdadeiro ou falso)
RabbitMQ. produtor. nome de usuário : <nome de usuário>
RabbitMQ. produtor. senha: <senha>
RabbitMQ. produtor. host : <host>
RabbitMQ. produtor. virtualHost :<vhost>
RabbitMQ. produtor. porta :<porta>
RabbitMQ. promoção. endpointName :<nombreCola para postar promoções>
rabbitMQ.limitstatus.endpointName : <nombreQueue para postagem de status de limite>
rabbitMQ.cardhistory.endpointName: <nome da fila de postagens do CardHistory>
rabbitMQ.enginestatus.endpointName : <nome da fila para postar status do mecanismo e console>
RabbitMQ – Histórico de itens de fidelidade
A fila de mensagens disponível para envio do histórico de elementos de fidelidade:
- RabbitMQ. cardhistory.endpointName >> Nome da fila RabbitMQ para postagem de dados do histórico do elemento de fidelidade.
Exemplo do Json que é enviado:
{ "_id": "603d02251082e8369081744b", "quantia": "0", "quantiaAnterior": "0", "cartão": { "código": "9900000000000000", "estado": "ATIVADO", "tipo": "987" }, "cardAction": "ATIVAÇÃO", "companyId": "napse", "createdAt": "2021-03-01T15:03:01Z", "códigocliente": nulo, "data": "2021-03-01T15:03:01Z", "motivo": nulo, "razãoNome": nulo, "storeCode": nulo, "terminalCode": null }
Detalhe dos campos:
Campo | Descrição | ||||||
eu ia | Id do registro de limite no Mongo. | ||||||
quantia | Valor atual associado ao elemento de fidelidade | ||||||
montanteAnterior | Valor anterior do elemento de fidelidade | ||||||
cartões {} | Dados associados ao elemento relatado
| ||||||
cardAction | Ação associada ao movimento do elemento de fidelidade. | ||||||
ID da empresa | Empresa de onde é enviado o movimento do elemento de fidelização. | ||||||
criado em | Data de criação do elemento de fidelidade. | ||||||
Código do Consumidor | Cliente associado ao elemento de fidelização. | ||||||
data | Data do movimento em que o elemento fidelidade é informado. | ||||||
razão | Código do motivo associado ao movimento que é informado do elemento fidelização . | ||||||
razãoNome | Nome do motivo associado ao movimento que é reportado para o elemento fidelidade . | ||||||
storeCode | Código da loja associada ao movimento que reporta o artigo de fidelização . | ||||||
TerminalCode | Código do terminal associado ao movimento que é informado do elemento de fidelização . |
RabbitMQ – Histórico de cupons
A fila de mensagens disponível para envio do histórico de cupons:
- RabbitMQ. cupomhistory.endpointName >> Nome da fila RabbitMQ para postagem de dados do histórico de cupons.
Exemplo do Json que é enviado:
{ "companyId": "napse", "tipo": "cupom", "parâmetros": [], "Unid": [ { "código de barras": "101pse0016475", "códigocliente": "12345678", "tipo": "cal", "nome": "calculado", "descrição": "Descrição", "data-hora": "2022-08-23T12:51:24", "loja": "SVC", "terminal": "ADM", "validFrom": "06/08/2022", "validTo": "08/07/2032", "estado": "CONSUMIDO", "ação": "RESGATE", "transactionId": "SVC_CPN_20220823125124", "couponHistoryId": "6304f77c22854949b038fc19" } ] }
Detalhe dos campos:
Campo | Descrição | |
---|---|---|
ID da empresa | Corda | Código da companhia |
tipo | Corda | Tipo de registro para enviar para uma determinada fila |
parâmetros | variedade | (opcional) Parâmetros opcionais |
Unid | variedade | Payload com dados de cupom |
código de barras | Corda | Código de barras gerado para o cupom (dependendo do seu tipo) |
Código do Consumidor | Corda | (opcional) Mongo Id do cliente indicado |
tipo | Corda | Código do tipo de cupom |
inhame | Corda | Nome do tipo de cupom |
descrição | Corda | (opcional) Descrição do tipo de cupom |
data hora | data | Data de registro (formato padrão "locale" ou "UTC" de acordo com a configuração) |
loja | Corda | código da loja |
terminal | Corda | código do terminal |
válido de | data | Data de início da validade (formato "dd/MM/aaaa") |
valido para | data | Fim da data de validade (formato "dd/MM/aaaa") |
status | Corda | status do cupom |
Ação | Corda | Ação realizada com o cupom |
ID da transação | Corda | (opcional) Mongo Id do trx relacionado |
cupomHistoryId | Corda | id mongo |
RabbitMQ – Estado dos limites
A fila de mensagens disponível para envio do status dos limites é:
- rabbitMQ.limitstatus.endpointName >> Nome da fila RabbitMQ para postagem de dados do tipo LimitStatus (ela relatará movimentos de todos os tipos de limites)
Exemplo do Json que é enviado:
{ "_id": "603a36021082e83690816fe0", "promotionId": "603a2fa81082e83690816f81", "benefitId": "603a2fce1082e83690816f88", "códigopromoção": nulo, "promotionName": "limite geral", "limitId": "603a2fca1082e83690816f87", "escopo": "VAREJISTA", "período": "INDEFINIDO", "maxValue": 10,0, "Identificação do Cliente": "-", "storeId": "-", "númeroDias": 0, "nextReset": "2021-02-27T03:00:00Z", "lastReset": "2021-02-27T03:00:00Z", "companyId": "napse", "limitTypeCode": "benefiedProductCount", "descrição": null, "lastUpdate": "2021-02-27T12:07:30Z", "ativo": verdadeiro, "valoratual": 1,0 }
Detalhe dos campos:
Campo | Descrição |
eu ia | Id do registro de limite no Mongo. |
ID da promoção | Id da promoção no Mongo. |
id de benefício | Id de lucro em Mongo. |
Código de promoção | Código de promoção. |
nome da promoção | Nome da promoção. |
id limite | Id do limite em Mongo. |
escopo | Tipo de limite a postar (CLIENTE, LOJA, VAREJISTA ). |
período | Período a ser contabilizado. |
Valor máximo | Valor máximo que o limite definido na promoção pode atingir. |
Identificação do Cliente | Cliente associado ao limite. |
storeId | Id da loja onde foi feita a movimentação do limite. |
númeroDias | Número de dias definido para o período a ser contado. |
nextReset | Próxima redefinição de limite. |
lastReset | Última redefinição feita ao limite. |
limitTypeCode | Código do tipo de limite (benefitAmount, BenefitedProductCount, BenefitApplicationCount). |
descrição | descrição inserida no limite. |
última atualização | Última atualização do limite (do console para promoções com limite definido). |
ativar | Indica se o limite está ativo (verdadeiro) ou consumido (falso). |
valor atual | Valor atual do limite. |
RabbitMQ – Status do mecanismo e do console
A fila de mensagens disponível para enviar o status do mecanismo e do console é:
- rabbitMQ.enginestatus.endpointName >> Nome da fila RabbitMQ para postagem do status do mecanismo e do console.
Aclaración
- O Json da engine só será enviado quando houver mudança de estado.
- O Json do console será enviado quando ele estiver ativo e operando (a cada execução do processo).
Contexto
O Job por padrão será executado a cada 5 minutos, podendo modificar o tempo de execução em Administração -> Tarefas agendadas .
Configurando o arquivo promoplus.properties
Para identificar o console, os seguintes parâmetros devem ser configurados: promo.general.id e promo.general.name . Caso esses parâmetros estejam vazios ou não definidos, o ip será utilizado nos processos em ambos os parâmetros .
IMPORTANTE
Os valores inseridos em promo.general.id e promo.general.name não devem corresponder aos parâmetros id e name configurados no motor Promo.
Exemplo do Json que é enviado do RabbitMQ
{ "ID do motor": "5", "nome do mecanismo": "CONSOLE_5", "processDate": "16/03/2021 11:33", "startDate": "2021-03-12T03:00:00Z", "endDate": "2021-04-20T02:59:00Z", "keyMap": "napso", "mapaVersão": "2", "lojas": "napse", "statusMQ": "ONLINE", "timestamp": "16/03/2021 11:35" "isConsole":"falso" }
O RabbitMQ Json conterá o seguinte formato:
Campo | exemplos | Tipo de dados | Detalhe |
---|---|---|---|
ID do motor | "1" | alfanumérico | Identificador do motor ou console. |
engineName | "MOTOR1" | alfanumérico | Nome do mecanismo ou console. |
data de processo | "16/03/2021 11:33" | alfanumérico | Data e hora do ping do mecanismo ou console. Formato: "dd/MM/aaaa HH:mm" |
data de início | "2021-03-12T03:00:00Z" | alfanumérico | Data efetiva do mapa, dados relatados para o caso do motor, se aplicável. Para console vazio. Formato: "aaaa-MM-dd'T'HH:mm:ssXX" |
data final | "2021-04-12T03:00:00Z" | alfanumérico | Data de fim de validade do mapa, dados informados para o caso do motor. Para console vazio. Formato: "aaaa-MM-dd'T'HH:mm:ssXX" |
mapa de teclas | "cochilo" | alfanumérico | Identificador, dados que são informados para o caso do motor. Para console vazio. |
mapVersion | "2" | alfanumérico | Versão do mapa, para console vazio. |
lojas | "cochilo" | alfanumérico | Armazena apenas para motor, para console vazio. |
status MQ | "ON-LINE" | alfanumérico | Status do motor ou console. Valores possíveis: ONLINE , OFFLINE |
carimbo de data/hora | "16/03/2021 11:35" | alfanumérico | Enviar data e hora |
isConsole | falso | alfanumérico | Identifica se a fonte é console. Se for falso, indica que é um motor |
Mensagens: Cache de Promoções
Quando o processo que avalia e gera o cache Promo Promotions é executado, uma série de mensagens são geradas para a fila Rabbit com o seguinte formato geral.
Cada início de lote receberá uma primeira mensagem do estilo:
{ "código da promoção": "0", "promotionName": "inicializar promoCache número de lote 1596140494623", "SKU": "0", "img": nulo }
Então cada promoção associada ao produto terá o seguinte formato:
{ "promotionCode": "p003", "promotionName" : "Promo03", "SKU": "2734", "img": “http://myserverPromo:8080/assets/images/promonavidad.jpg” }
RabbitMQ- Detalhe da Transação
A fila de mensagens disponível para receber os detalhes das transações conforme elas são registradas no sistema é:
rabbitMQ.transaction.endopintName >> Nome da fila RabbitMQ para postagem de dados de transação.
O Json do console será enviado quando ele estiver ativo e operando (a cada execução do processo).
A configuração do Rabbit será feita conforme indicado em: Configuração
Toda vez que uma transação é feita, ela é detalhada no console:
e a resposta Rabbit tail tem um formato, como no exemplo:
{ "companyId" : "farma", "transactionId": "farme_0079_6_20210217112812", "transactionType": "VENDA", "off-line": falso, "originalTransactionId": "", "terminalCode": "6", "storeCode": "0079", "zoneCode": "", "subZoneCode": "", "storeChainCode": "003", "storeTerminal": "farme_0079_6", "canalCode": "", "mapaVersão" : 958, "engineVersion": "7.0.0-FP1", "mensagemId": "0001", "iData": 20210217, "iHour": 11, "iTime": 112812, "transactionDate": "2021-02-17T14:28:12Z", "processDate": "2022-06-22T19:22:13Z", "cabeçalhoExtraFields": { "processado" : falso, "headerExtension": { }, "formatCode": "", "tenderGroupCode": "", "Código da moeda": "", "externalReferenceId": "farme_0079_6_20210217112812", "_id": "60478417939d591f28df2a73" }, "total de benefícios": 1.292, "subtotal": 4,23, "total": 2,9380000000000006, "promoções": [ { "promoId": "60398ad1cff31c19a864f0b8", "promoNome": null, "campingName": null, "código promocional": null, "benefícios": [ { "benefitNro" : "60398ad1cff31c19a864f0b6", "benefitType": "CalculatedCouponApplicationBenefit", "hasLimit": falso, "quantidade": 0,0, "valor": 1.292, "valueWithTaxes": 1.292, "tipoPromo" : "DV", "reqdig" : "NÃO", "rqdevpremio" : "NÃO", "lpcobro" : "PVP", "coleção": "NÃO", "promo_fin_date": "2021/12/31", "adjus_pvp_pc": "NÃO", "couponId" : "tqa006" } ], "desconto": 1.292 } ], "eventos" : [], "clientes" : [ { "cartão": "0", "sequência": 1, "valoresAsMap": { }, "id": "1000938173", pontos: 0,0, "PONTOS": 0, "creditCampaignCode": nulo, "hasLimitsError": falso, "nome": "arturo guevara", "raffleData": null, "MONTANTE RESTANTE": 1, "tipo": "c", "redeemPointsPriceFactor": 0,0, "tipo de identificador": "c", "lastName": "arturo guevara", "MONTANTE": 2, "segmento" : [], "quantia" : 0,0, "saldo1": 0,0, "profileCode": nulo, "benefícios limitados": "", "email" : "[email protected]", "identificador": "1000938173", "externalId": "1000938173", "valor restante": 0,0, "saldo2": 0,0 } ], "pagamentos": [ { "plano" : "-", "sequência": 1, "id" : "efe", "valoresAsMap": { }, "equilíbrio" : falso, "prefixo": "-", "payCreditCampaign" : "-", "tipo": "efe", "MONTANTE": 0, "banco" : "-", "quantia" : 3,98, "prefixGroup": [], "prefixGroupStr": "-", "parcelas" : "-", "quantia do item" : 0,0, "externalId": "efe", "bolso" : "-" } ], "cupom": [ { "tipo": "tqa006", "QTD": 1, "quantidade": 0,0, "sequência": 1, "valoresAsMap": { }, "id": "0016150041992", "MONTANTE": 0, "quantia" : 1.292, "externalId": "0016150041992", "participantes": [ { "promoId": "60398ad1cff31c19a864f0b8", "promoNome": null, "campingName": null, "quantidade": "0,0", "magnitude": nulo, "xpreço": null } ] } ], "cartões de fidelidade" : [], "Unid" : [ { "magnitude" : 0,0, "fornecedorFinancial": nulo, "fornecedorItemAmount": 0,0, "priceResponseFields": { "código": "0000132311", "xpreço": "4.2300", "quantidade": "1,0000", "preço unitário": "4,2300", "magnitude": "0,0000", "seq": "1", "priceLastUpdate": "-", "priceListId": nulo, "descontável": "verdadeiro", "originalDiscountable": "verdadeiro", "desconto manual": "falso" }, "MAGNITUDE" : 2, "priceListId": nulo, "level2": "34", "unitXPriceOriginal": 4,23, "quantidade": 1,0, "unitCostPrice": 0,0, "sequência": 1, "valoresAsMap": { }, "impostos" : 0,0, "código": "0000132311", "marca": "5491", "applyCatalogRedeem": falso, "level4": "623", "fornecedorItem": null, "preço unitário": 4,23, "descontável": "verdadeiro", "calCouponVal" : 0,0, "priceListLastUpdate": null, "baixa rotatividade": falso, "level3": "299", "descontínuo" : falso, "xpreço": 4,23, "redeemOption": null, "QTD": 1, "fornecedorFinancialAmount": 0,0, "originalDiscountable": "verdadeiro", "PRICE_WITH_TAXES": 3, "preçoComTaxas": 4,23, "level1": "5", "xpriceOriginal": 4,23, "fornecedor": "-", "XPREÇO": 0, "produtochave": falso, "externalId": nulo, "desconto manual": falso, "benefitApplies": [ { "tipo": nulo, "hasLimit": falso, "quantidade": 0,0, "benefitNro": "60398ad1cff31c19a864f0b6", "transactionComboParticipants": [], "dados adicionais": { "tipoPromo" : "DV", "reqdig" : "NÃO", "rqdevpremio" : "NÃO", "lpcobro" : "PVP", "coleção": "NÃO", "promo_fin_date": "2021/12/31", "adjus_pvp_pc": "NÃO", "couponId" : "tqa006" }, "promotionName": "TPV3-Cupom impresso de resgate não nomeado se calculado cod 0000132311 comprova consumo total (tqa006)", "benefitType": "CalculatedCouponApplicationBenefit", "transactionBenefitApplies": [ { "magnitude" : 0,0, "valor": 1.292, "valueWithTaxes": 1.292, "xpreço": 4,23, "seq": 1, "quantidade": 1,0, pontos: 0,0, "mínimo aplicado": "" } ], "promotionNro": "60398ad1cff31c19a864f0b8", "promotionCode": "3377" } ], "participantes": [ { "promoId" : "60398ad1cff31c19a864f0b8", "promoName": nulo, "campaingName": nulo, "quantidade": "1,0", "magnitude": "0,0", "xpreço": "4,23" } ] } ], "totalItemsSold": 1,0 }
RabbitMQ- Enviando Movimentos de Elementos de Lealdade
Quando uma transação que envolve a criação e/ou movimentação de um elemento de fidelidade é processada no Promo, a notícia deve ser enviada via RabbitMQ para a fila configurada para esse fim.
O arquivo a ser enviado será Json:
Loyalty Item Movements
{ "_id":"5e3c7196bec9884af49e5401", "quantia": 321,0, "valor anterior": 1085,0, cartão:{ "código":"880000000007", "status":"ATIVADO", "tipo":"tarfd" }, "códigocliente":"6666", "cardAction":"AMOUNT_UPDATE", "companyId":"napse", "createdAt":"2020-02-06T20:05:42Z", "data":"2020-02-06T20:05:31Z", "motivo":"PQS", "storeCode":"Napse", "terminalCode":"34" }
card.type contém o código do tipo de elemento, reason contém o código do motivo
valores possíveis para card.status:
ATIVADO,
DESATIVADO,
CANCELADO.
BLOQUEADO,
EXPIRADO
possíveis valores de cardAction:
ACTIVATION,//Ativação
INACTIVATION,//Inativação
ASSIGN_CUSTOMER,//Associar Cliente
REMOVE_CUSTOMER,//Remover um Cliente
CANCEL,//Cancelamento
QUERY,//Consulta
CHARGE,//Cobrança Inicial
RECHARGE,//Recarregar
AMOUNT_UPDATE,//Modificação Saldo SALE
,//Venda
CONSUME,//Resgate ou consumo de pontos
PARTIAL_REDEMPTION,//Resgate parcial
TOTAL_REDEMPTION,//Resgate total
TRANSFER,//Transferência
ROLLBACK,//Transferência
EXPIRED,//Expiração//ARE_51_2016
EXTENDED_POINTS, // Extensão de validade //18P_62_FID_RE_051
ASSIGN_CONTRACT
Os dados expostos são: (definição sujeita a validação técnica)
cabeçalho :
_eu ia | Identificador em Mongo do item de fidelidade que está sendo reportado | 59a99439caec3625e84476f8 |
quantia | Saldo acumulado do elemento de fidelização que é reportado | 254 |
código | Número de identificação do elemento de fidelização que é comunicado | 2220000000001 |
criada | Data de criação do elemento de fidelidade relatado | 2017-09-01T17:09:13Z |
status | Indica o status do item de fidelidade que está sendo relatado | HABILITADO |
ID da transação | Identificador no Mongo da transação de criação do item de fidelidade do relatório . | BLC_201709011409677 |
tipo | Tipo de elemento de fidelidade sendo relatado | 2 |
válido de | Início da validade do elemento de fidelidade informado | 2017-09-01T03:00:00Z |
valido para | Fim da validade do elemento de fidelidade informado | 2018-09-01T03:00:00Z |
Identificação do Cliente | ID do cliente ao qual pertence o item de fidelidade relatado | 8575 |
Detalhe do movimento: Este bloco será repetido quantas vezes o elemento tiver movimentos.
quantia | Valor que será adicionado ou subtraído com base no que for indicado no campo " cardAction " | 254 |
cardAction | Ação realizada no elemento (criação, cancelamento, adição, subtração ou substituição de saldo) | AMOUNT_UPDATE |
data | Data em que o movimento foi feito. | 2017-09-01T17:09:44Z |
Importante
Especifique no campo cardAction quais são os possíveis valores que podem ser apresentados dependendo se o valor do elemento de fidelidade é adicionado, subtraído ou pisado.
Gerenciamento de erros
Caso haja registros de postagens no servidor RabbitMQ com ERRO, será exibido um banner no cabeçalho da Promo, indicando a ocorrência em geral.
- Banner com detalhes do incidente.
- Para saber o detalhe do incidente, pressione Ver mais detalhes . - Lista de processos de exportação com falha.
- No campo Descrição: pode ser visualizada a causa do erro
- Uma vez corrigido o erro que causa falha no envio de mensagens ao servidor RabbitMQ, deve-se pressionar o botão Reprocessar - Se o processamento das falhas relacionadas à postagem de dados via RabbitMQ for bem-sucedido, a grade deverá ficar sem registros para Reprocessamento.