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

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

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