# 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