---
# System prepended metadata

title: Contas Pool - Implementação

---

# Contas Pool - Implementação
[TOC]

## Objetivo
Permitir que uma conta bancária permita o recebimento de depósito de N parceiros.

## Adapter BS2
### Fluxo Atual
- Hoje temos uma relação 1:1 das contas monitoradas com as contas do CaaS. Cada parceiro possui uma conta de uso exclusivo dele, onde toda movimentação ocorrida nela é associada a esse parceiro.

    ![Bs2 Current](https://i.imgur.com/xubewfZ.png)


- Os webhooks, responsáveis por permitir identificação instantânea das movimentações, estão configurados para chegar no adapter já identificados com o AccountId do CaaS.
- Todos os fluxos (pay-in e pay-out) foram estruturados pensando nessa relação 1:1.

### Fluxo Proposto
- No contexto do Adapter BS2, a relação mudará para ser 1:1 com as contas bancárias do BS2. Ou seja, cada conta bancária possuirá um documento do tipo *Account* no banco de dados.

    ![Bs2 Proposal](https://i.imgur.com/Jz0FOGr.png)
    :::info
    :bangbang: **IMPORTANTE** 
    
    É essencial ressaltar que esse conceito de *conta compartilhada* só é possível no fluxo de **Pix QRCode**. Para parceiros que efetuam depósitos diretamente via chave Pix e/ou TED é necessários que estes possuam uma conta exclusiva, seguindo os moldes do *fluxo atual*.
    :::
- A relação entre ***BankAccount : CaaSAccount*** será definida no contexto dos serviços core do CaaS. A única relação presente no contexto do adapter será para as contas que possuirem exclusividade em alguma conta.
- No lado do CaaS, os componentes usarão o ***referenceId*** para identificar de qual parceiro veio aquele depósito.


### Orientações
- Essa implementação requer uma parada do Adapter BS2, pois inclui alterações de contexto e responsabilidades, logo o deploy deve ser planejado com antecedência com os parceiros conectados.
- Recriar os documentos de *Account* na nova conta do Cosmos DB. Após iniciada a operação do novo fluxo, migramos os dados para o novo modelo.
- O fluxo de *statement account* também será afetado.

### Alterações de modelo
#### Account
```json=1
{
    ...
    "accountId": "10895990", //previously caasAccountId, i.e. "173"    
    "enabled": true,
    ...
    // new optional property <<caasId>>. 
    //If set, the bank account will be exclusive for this partner account.
    // In other words, every transaction will automatically be associated to the caasId.
    "caasId": "158", 
    // new optional property <<statementAccountId>>. 
    //If set, all transactions will be migrated to this statement account
    "statementAccountId": "158",
    ...
    "bankAccount": "10895990", //bank and token information should keep the same.
    "bankBranch": "0001",
    "bankCode": "218",
    "bankName": "Bs2",    
    ...
    "uniqueKey": "Account_10895990", //the uniqueId must change to bank account.
    "partition": "Account",
    "id": "10895990",
    "type": "Account"
    ...
    // all other props should keep the same.
}
```
#### Transaction
```json=1
{
    ...
    "endToEndId": "E00416968202208011524FlrzU29C9e1",
    "amount": 20,
    ...
    "accountId": "10895990", //previously caasAccountId, i.e. "173",
    ...
    // new optional property <<caasId>>. 
    //If set, it means that the account is set exclusivelly to a partner    
    "caasId": "158",   
    ...
    "createdAt": "2022-08-01T15:24:51.2151269Z",
    "migrated": "2022-08-01T15:24:51.6059816Z",
    ...
    // new property <<isStatementExclusive>>
    // it indicates if the transaction is exclusive for statement account.
    "isStatementExclusive": true,
    // new property <<statementMigratedAt>>
    // it indicates if the transaction has been migrated to statement account.
    "statementMigratedAt": "2022-08-01T15:24:51.6059816Z"
    ...
    "referenceId": "220801243022854719ED6DD038",    
    "uniqueKey": "E00416968202208011524FlrzU29C9e1",
    //the partition must change to bank account context
    "partition": "Transaction_10895990",
    "id": "d369bb5c-2588-4d82-a0fd-b6fb725fca66",
    "type": "Transaction"    
}
```
#### Payment
```json=1
{
    ...
    "caasId": "173", //new property
    "accountId": "10895990", //previously caasAccountId, i.e. "173"
    ...    
    //the partition must change to bank account context
    "partition": "Payment_10895990",
    //the uniqueId must keep being the caas paymentId.
    "id": "e9a2ac25-aac0-459a-bea8-fb8446c520a6", 
    "uniqueKey": "e9a2ac25-aac0-459a-bea8-fb8446c520a6",    
    "type": "Payment"    
}
```

### Fluxo detalhado
#### Geração de QRCode Dinâmico
1. Parceiro faz um request para o CaaS
2. CaaS chama o Banking Service, passando o accountId e amount.
3. Banking Service chama o adapter do BS2, passando o **bankAccount** e amount.
4. Adapter BS2 gera um QrCode para a conta pretendida.
5. CaaS retorna QrCode para o parceiro.

#### Identificação de depósito (Pix Pay-In)
1. QR Code é pago pelo usuário
2. Recebemos webhook de identificação na rota */pix/ProcessWebhook/{bankAccountNumber}*.
    2.1. Um polling será executado a cada 10min para identificar os depositos os quais não recebemos o webhook. 
4. Inserir documento de transaction no banco de dados
5. Migrar transação para o CaaS.
6. TransactionProcessor pega essa transação, identifica o DepositOrder pelo referenceId e segue o fluxo de criação de transações
#### Identificação de depósito (TED)
1. Rodar polling somente para contas *exclusivas*.
2. Inserir documento de transaction no banco de dados
3. Migrar transação para o CaaS.
#### Processamento de pagamentos (Pay-out)
1. PaymentGroup é criado pelo parceiro
2. PaymentProcessor adiciona informações de bankAccount e caasAccountId no pagamento enviado.
3. AdapterBs2 recebe e processa esse pagamento.
4. Adapter notifica o CaaS o status final desse pagamento
#### Contas de statement
1. A cada 30min, será executado em sequência as rotinas
    1.1. Polling de transações de extrato
    1.2. Migração das transações de extrato para o CaaS
3. **Polling de transações de extrato**
    2.1 Polling no endpoint de extrato para pegar todas as transações não identificadas no fluxo anterior
    2.2. Criar transações no banco de dados com a flag **isStatementExclusive** ativa.
5. **Migração das transações de extrato para o CaaS**
    3.1 Para cada conta bancária, migrar todas as transações que estejam com **statementMigratedAt** nulo.

### Tarefas
- 

## Adapter Genial
## Banking Service
## Transaction Processor
## Payment Processor