# 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):

### 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:

### 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:

### 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:

### 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.