# Planejamento integração com IG (importação de dados e registro de transações) ## Objetivos - Importar dados da collection **capturehardwares** para popular a tabela de **terminals** no **term-api e cardprocessor**. - Importar dados da collection **companies** para popular as tabelas de **merchants** e **isos** no **term-api e cardprocessor**. - Processar as transações de **compra** (confirmadas) do **cardprocessor** no **IG**. - Processar os estornos do **cardprocessor** (confirmados) no **IG**. ## Alterações necessárias no IG ### Alterações em capturehardwares do IG - Adicionar o valor **hash** no campo **software_provider**: https://github.com/hashlab/infinity-gauntlet/blob/d2f75bd6798e3349dc578660ad3344c3652d6c4b/src/application/core/models/capture-hardware.js#L19 - Adicionar o valor **d195** no campo **terminal_model**: https://github.com/hashlab/infinity-gauntlet/blob/d2f75bd6798e3349dc578660ad3344c3652d6c4b/src/application/core/models/capture-hardware.js#L41 ### Alterações em affiliations do IG - Permitir o valor **hash** no campo **internal_provider**: - https://github.com/hashlab/infinity-gauntlet/blob/d2f75bd6798e3349dc578660ad3344c3652d6c4b/src/application/core/services/company.js#L1506 - https://github.com/hashlab/infinity-gauntlet/blob/d2f75bd6798e3349dc578660ad3344c3652d6c4b/src/application/core/services/company.js#L1821 ### Implementar interfaces para operar no IG - https://github.com/hashlab/infinity-gauntlet/blob/master/src/application/core/interfaces/acquirer.js - https://github.com/hashlab/infinity-gauntlet/blob/master/src/application/core/interfaces/capture-software.js - https://github.com/hashlab/infinity-gauntlet/blob/master/src/application/core/interfaces/subacquirer.js Implementar da maneira mais **dummy** possível, uma vez que a transação passa pela **hash** agora. ## Fluxo de importação de dados do IG O plano inicial é fazer o processo mais simples possível, que seria um cronjob executando a cada x minutos (acredito que inicialmente a cada 10min), esse job pegaria os dados do MongoDB e faria o sync com os bancos do termapi e cardprocessor. ### Carregando o hardware Pegar todos os capturehardwares que tenham os campos **provider** e **software_provider** igual a **hash**, além disso usar o campo **updated_at** para limitar o número de resultados (ex: pegar todos os hardwares que foram alterados de x horas pra cá). Na imagem abaixo temos os dados de uma entrada recente em capturehardwares (ignore o software_provider igual a celer): ![](https://i.imgur.com/VCeZC7D.png) ### Carregando o affiliation Carregar o affiliation com base nos campos **provider** e **company_id** do hardware e verificar se o campo **internal_provider** é igual a **hash**. Na imagem abaixo temos os dados de uma entrada em affiliations: ![](https://i.imgur.com/KohEtzG.png) ### Carregando company (merchant) Carregar a company com base no campo **company_id** do hardware. Na imagem abaixo temos os dados de uma entrada em companies: ![](https://i.imgur.com/41IbPsx.png) ### Carregando company primária (iso) Carregar a company com base no campo **parent_id** do merchant. Na imagem abaixo temos os dados de uma entrada em companies: ![](https://i.imgur.com/e9YIU11.png) ### Criação dos dados no termapi e cardprocessor Com todo o contexto em mãos (**terminal**, **merchant** e **iso**) devem ser criadas (ou atualizadas) as entradas nas tabelas **terminals**, **merchants** e **isos**. O plano inicial é que esse processo de importação seja executado de forma periódica (cronjob do kubernetes), como todas as entradas no IG tem o campo updated_at, podemos usar um filtro e pegar apenas as mudanças recentes para não impactar o MongoDB. ## Injetar transações no IG Vamos criar um webhook **/cardprocessor_webhook** no IG de forma semelhante com o que foi feito na integração com **Celer/Pagseguro**. Esse endpoint deve ser **privado para uso da hash** isso vai evitar a necessidade de **autenticação/autorização/verificação dos dados enviados**. Os payload enviado no POST já vai estar no formato esperado pelo IG, o endpoint do webhook vai pegar esse payload e injetar na fila do rabbitmq usando o **TransactionService.queueRegister()**. - https://github.com/hashlab/infinity-gauntlet/blob/d2f75bd6798e3349dc578660ad3344c3652d6c4b/src/application/core/services/webhooks/pags-webhook/index.js#L19 - https://github.com/hashlab/infinity-gauntlet/blob/d2f75bd6798e3349dc578660ad3344c3652d6c4b/src/application/core/services/webhooks/pags-webhook/register-transaction.js#L57 ### Alterações no IG - Disponibilizar o endpoint **/cardprocessor_webhook** para receber as transações. ### Alterações no cardprocessor - Criar uma tabela de webhooks onde os mesmos serão registrados. - Criar um registro na tabela de webhooks sempre que ocorrer uma confirmação de compra ou estorno. - Após o registro na tabela, realizar a request enviando a informação para o IG. - Se a resposta tiver o status_code 200 ou 201, atualizar o registro de webhook com o status de sucesso. Em caso de um status_code diferente registrar o status como falha. - Em caso de erro, registrar que ocorreu uma falha e a uma nova tentantiva será realizada quando o sistema de manutenção de transações pendentes rodar.