--- title: 'Transfero Cards - CaaS Integration' --- Transfero Cards - CaaS Integration === ## Purpose Implement the Cards feature as a new service in the CaaS. ## Motivation As a outside-Brazil company, I would like to offer credit cards to my customers in Brazil in order to enforce my brand and introduce it on their day-by-day. Once I already have an integration with Transfero CaaS to process deposits and withdrawals, it sounds good that I can use the same infrastructure to offer cards for my customers without effort of a new integration. ## Entities In this documentation, we are considering the following entities: >- **User**: The final consumer which holds a card. >- **Merchant**: The establishment which sells a product/service to an User. >- **Mastercard**: The global card manufacturer. >- **SWAP**: Card integrator associated to Mastercard. >- **Transfero** > - **QGX Integration**: Application which centralize all business logic specific for cards flow. > - **CaaS**: Transfero platform. >- **Partner**: Target customer from Transfero. These entities are chained as the following diagram: <figure> <img src="https://i.imgur.com/OvFMN5N.png" alt="Albuquerque, New Mexico"> <figcaption style="text-align:center">Figure 1: Entities chain</figcaption> </figure> ## Cards Flow ### 1. Issue a Card When a **User** (or **Partner**) wants to issue a card, the flow is: >1. **Partner** requests a new card to **Transfero** through the API; >2. ***Transfero*** requests this card to **SWAP**; >3. ***SWAP*** emits the card and send to **User** address; >4. **User** receives the card and ask for **Partner** to activate his card; >5. **Partner** requests **Transfero** to activate this card; >5. **Transfero** requests **SWAP** to activate this card; >6. **SWAP** activates the card; >7. The **User** is able to use the card everywhere. :::info :pencil: **Note** In this flow the Transfero will only pass the requests/responses forward and store all required data. **<span style="color:red"> We need to evaluate if there is any KYC/Compliance issue on this flow.</span>** ::: ### 2. Pay using a card :exclamation::exclamation: Once a **User** holds an activated card, he can pay anything triggering the following flow: >1. **User**1 pass his card in the **Merchant**'s card machine to pay a product. >2. The **Merchant**'s card machine calls **Mastercard**, which calls **SWAP** to approve the *transaction*. >3. **SWAP** identifies that the *transaction* comes from a **Transfero**'s card; >4. **SWAP** checks if **Transfero** has enough balance to process this transaction: > - If yes, **SWAP** calls **Transfero** to approve the *transaction*. > - Else, **SWAP** <span style="color:red">**rejects**</span> the transaction. >5. **Transfero** identifies that the *transaction* comes from a **Partner**A's card; >6. **Transfero** checks if **Partner**A has enough balance to process this transaction: > - If yes, **Transfero** calls **Partner**A to approve the *transaction*. > - Else, **Transfero** <span style="color:red">**rejects**</span> the transaction. >7. **Partner**A identifies that the *transaction* comes from a **User**1's card; >8. **Partner**A checks if **User**1 has enough balance to process this transaction: > - If yes, **Partner**A <span style="color:green">**approves**</span> the transaction. > - Else, **Partner**A <span style="color:red">**rejects**</span> the transaction. >9. The approval (approved or rejected) is sent back through the entire chain until the **Merchant**'s card machine. :::info :exclamation: **Warning** All approval chain must take an average of ***1 second***. If it takes more time than expected, the transaction is rejected automacally by the first stages. ::: ## Proposal The proposal is under **Transfero** scope, which includes two components: **QGX Integration** and **CaaS**. ### Responsibilites Before proposing the changes, let us define the responsibilities of each component: * **QGX Integration** >* Integration with **SWAP** API. >* Implement all logic specific for cards: > * Store all cards informations. > * Cards list for partner. > * Active/Blocked cards. > * Info regarding card holder. >* Store all transcations partitioned by card. >* **Cards Backoffice** for the Support and Operations teams. * **CaaS** >* KYP. >* Partner Balance. >* Fee charging. >* Transaction register at Partner level. >* Partner authorization. >* "Front door" of the solution. ### Proposed Changes We are proposing the following changes: 1. Create a new service in **CaaS** Core: >* **Name** > * `transferocaas-card-service` > >* **Responsibilities**: > * Bypass all card requests from **CaaS** API to **QGX Integration** > * Check and lock partner balance in the [approval flow](#2-Pay-using-a-card-). > * Call partner API in the [approval flow](#2-Pay-using-a-card-). > * Send debit transaction creation request to *transactions queue*. > * Create fee transaction request and send *transactions queue*. > >* **Dependencies**: > * Cosmos DB (openbanking collection): > * Read *Account* document and run *Balance* procedures. > * Service Bus Queue: > *adapter-send-transaction-openbanking; > >* **Services/Apps** > - **QGX Integration** API. > - **Partner** API (in [approval flow](#2-Pay-using-a-card-)); 2. Update **CaaS** model: > * **Entity** - Enum PaymentGroupType >* **Change** - Add new value: `Card` 3. Add the following endpoints in the CaaS API: > **GET** /api/v1/account/{accountId}/card > **GET** /api/v1/account/{accountId}/card/virtual/{cardId} > **GET** /api/v1/account/{accountId}/card/physical/{cardId} > **POST** /api/v2/account/{accountId}/card/physical > **POST** /api/v2/account/{accountId}/card/virtual > **POST** /api/v2/account/{accountId}/card/activate > **POST** /api/v2/account/{accountId}/card/link (?) > **PUT** /api/v1/account/{accountId}/card/{cardId}/block > **PUT** /api/v1/account/{accountId}/card/{cardId}/unblock ### Proposed Flow - CaaS * Consider the following scenario: >1. The **partner** *Wirex* is an active user of **CaaS**. >2. They have following accounts: > - **401** - BRL Account > - **402** - BRZ Account > - **403** - USDT Account >3. They have used the **CaaS** to perform the following actions: > - Process BRL deposits > - Trade between FIAT/Crypto currencies > - Process FIAT and Cryptos withdrawal * For enabling this **Partner** to process cards, we will need: >1. Register this **Partner** in the **QGX Integration**. (*we need more info about the requirements here.*) >2. Create a new Account in the **CaaS** containing: > * **Currency**: BRL > * **PaymentGroupType** (Payout): Card > * Fees > * **Example**: *"404 - BRL | Card Account"* >3. Grant roles to **Partner** be able to access the Cards endpoint in the CaaS API. * After this setup, the Partner will be able to issue and activate cards for their **user**s. * When the **CaaS** receives an approval request for card *transactions* ([approval flow](#2-Pay-using-a-card-)), it will trigger the following flow: >1. Check if the Card account have enough balance; >1. Lock transaction amount from balance; >2. Send approval request for **Partner** registered URL: > * If **partner** returns approved status: > 1. Retrieve the status back; > 2. Send transaction request to queue; > 3. Calculate fee and send fee transaction request to queue. > * If **partner** returns rejected status: > * 1. Retrieve the status back; > * 2. Unlock locked balance. :::info :pencil: **Note** The partner must feed the **Card Account** to process the cards transactions. He can use the **Transfer endpoint** to transfer funds between his main BRL account and the card specific one. ::: ## Project Timeline ```mermaid gantt title A Gantt Diagram section Section A task :a1, 2014-01-01, 30d Another task :after a1 , 20d section Another Task in sec :2014-01-12 , 12d anther task : 24d ``` > Read more about mermaid here: http://mermaid-js.github.io/mermaid/ ## Appendix :::info **Links here!** :::