# Conciliação Transaction + Payout
## Fluxo de funcionamento (Parceiro CaaS)
- Hoje, para uma **Account** associada a um parceiro, o processo de pay-out é representado pelo documento de **PaymentGroup**.
- Um **PaymentGroup** é um conjunto de **Payments**. Porém, a maioria dos parceiros criam **PaymentGroups** com apenas um único **Payment** associado.
- Cada payment possui dois possíveis estados finais: <span style="color:green">**Completed**</span> e <span style="color:red">**ProcessedWithError**</span> .
- Quando um **Payment** atinge o status de <span style="color:green">**Completed**</span>, é criado uma **Transaction** de débito na **Account** do parceiro.
- Nessa transação de débito, temos duas formas de identificar a qual pagamento ele está associado:
- Através da propriedade **Links**, procurando pelo objeto que possui `DocumentType == 5`.

- Através da propriedade **TransactionBankId**, que é constituída de uma string formada da seguinte forma: *"Debit Transaction from paymentId: {paymentId}, paymentGroupId: {paymentGroupId} and externalId: {externalId}"*

- No lado do Payment, temos uma propriedade que armazena o id da Transaction associada a ele: `Payments[0].TransactionId`

## Fluxo de funcionamento - Statement Account
- O conceito de **StatementAccount** no CaaS propõe persistir, sem nenhum tratamento, todas as transações de uma conta bancária.
- Para isso, é acessado o endpoint de extrato nas APIs dos bancos que estamos integrados.
- No geral, a transação persistida é armazenada contendo os seguintes identificadores principais:
- **Id**: Identificador único gerado pelo CaaS
- **TransactionBankId**: Identificador no extrato da instituição
- **Description**: Descrição da transação no extrato
- **Amount**: Valor da transação
- **Counterpart**: Dados do usuário que recebeu/realizou a transação
- **Timestamp**: Horário da trasnsação

:::info
:exclamation: **IMPORTANTE**
Hoje **NÃO HÁ** uma maneira direta de conciliar uma **Transaction** de statement com uma **Transaction** da conta do parceiro.
A alternatira é fazer uma tentativa de conciliação indireta por:
- Timestamp
- Amount
- Counterpart
- Description (para alguns poucos casos).
:::
## Propostas de melhorias
### Conciliação de transações PIX
Toda transação PIX possui um identificador único, denominado **EndToEndId**, que possui 32 caracteres e geralmente é iniciado por "**E**" *(ex.: E710278662022102118010882257046P)*.
Com isso, podemos realizar mudanças para persistir esse **EndToEndId** nos documentos de **Payment** e **Transaction**, permitindo assim um match direto entre as entidades, tanto de *StatementAccount* quanto de *PartnerAccount*.
Em termos de implementação a idéia é:
- Incluir EndToEndId de Payments via Pix na propriedade **TransactionHash** do documento de **Payment**.
- Incluir EndToEndId nas Transactions originadas de transações via Pix, na propriedade **TransactionHash** do documento de **Transaction**.
- Implementar lógica nos adapter para recuperar o EndToEnd das transações criados a partir do endpoint de extrato (fluxo de *StatementAccount*)
- **Necessário analisar viabilidade em cada adapter em específico**
- [x] BS2 :+1:
- [ ] Genial (Legacy)
- [ ] Genial
### Conciliação de transações TED
Como esse tipo de transação carece de um idenficador único, não é possível implementar uma forma de conciliação direta.
Para isso, será necessário continuar realizando a forma indireta de tentativa de conciliação detalhada acima.