---
# System prepended metadata

title: Group savings and loans

---




# Group savings and loans


### Terms and conditions 
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/601820c0a6293624286f6c2a)

**To check:**
De onde vem a informação? é static ou tem de se fazer um pedido à API?
--> *ALINE* In USSD there are no T&C. To confirm with market if those are needed here. If so, I believe they can be static, but Burcu to confirm
 

### Help
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/60337de5c7763f1716d0897d)

**To check:**
De onde vem a informação? é static ou tem de se fazer um pedido à API?
--> *ALINE* In USSD there are no Help/FAQ. To confirm with market if those are needed here. If so, I believe they can be static, but Burcu to confirm

### Groups list 
[Zeplin](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/6018248e1489310548db0120)

**Backend API name (TBD)** - View groups list API operation

**G2 API STATUS (SearchMyGroups)** - A funcionar mas faltam alguns campos

**To check:** 
- O que é o Opt-Out?
--> *ALINE* We don't need opt-out for this feature as in USSD users cannot opt-out
- A API do G2 está a devolver a lista muito básica. Não tem as informações necessárias para popular a lista. 
  
**Request**: 
```
{
    msidn: string, 
    pin: string
}
```
**Response**: 
```
{
    id: string,   
    name: string,
    members: number,    
    userRole: UserRole,
    currentBalance: number,
    targetBalance?: number,
    image?: url 
}
```

### Group details
#### As a leader
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/6018263dee5eb42d08ddc5e2)

**Backend API name (TBD)** - Get group details

**G2 API STATUS (QueryGroupBalance)** - balance do grupo (OK)
**G2 API STATUS (QueryGroupTransactions)** - statements do grupo (OK)
**G2 API STATUS (QueryGroupInfo)** - API disabled mas que devia devolver a info do grupo (NOT OK) -  a confirmar com Garima

**Assumptions:**
- Pode ver a listagem de membros
- Operações: Save money, pay merchant, cashout
- Opções do grupo: editar a foto, editar targetBalance e set target quando não há target balance atualmente

**To check**
- A API do G2 está muito básica. Não tem as informações necessárias (imagem, descricao, role, o criador etc...) --> *ALINE* Image and Target don't exist in USSD, they are just available for app users
- A API do G2 não parece ter em conta o target balance
- Quem tem direito a fazer **Exit group**? --> *ALINE* No one can leave a group using the app. They should call an SP operator or contact the group leader to remove him

**Response**: 
```
{ 
    id: string,  
    name: string,
    creator: string,
    members: number, 
    description: string,
    userRole: UserRole,
    currentBalance: number,
    targetBalance?: number,
    image?: url,
    operations: {
        date: string, 
        type: TypeOfOperationEnum, 
        status: OperationStatusEnum,
        amount: number,
    }[] // To check: vamos ser nós a agrupar as operações ou o backend?
}
```

#### As an approver
**Backend API name (TBD)** - Get group details

[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/6018263d11f3a32d0b42248d)

**Assumptions:**
- Não pode ver a listagem de membros --> *ALINE* If there is an API to allow approvers to see the full list of members, that would be ideal. If there isn't, then ok, only leaders will have that capability
- Operações: Send money, pay merchant
- Exit group ? --> *ALINE* Users cannot exit a group using the app

**Response**:
```
{ 
    id: string,  
    name: string,
    creator: string,
    members: number, 
    description: string,
    userRole: UserRoleEnum,
    currentBalance: number,
    targetBalance?: number,
    image?: url,
    operations: 
    {
        date: string, 
        type: TypeOfOperationEnum, 
        status: OperationStatusEnum,
        amount: number,
    }[] // TODO: vamos ser nós a agrupar as operações ou o backend?
}
```

#### As a member
**Backend API name (TBD)** - Get group details

[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/60191e2224761228ef61d6c1)

**Assumptions:**
- Operações: Save money, pay merchant


**Response**:
```
{ 
    id: string,  
    name: string,
    creator: string,
    members: number, 
    description: string,
    userRole: UserRoleEnum,
    currentBalance: number,
    targetBalance?: number,
    image?: url,
    operations: 
    {
        date: string, 
        type: TypeOfOperationEnum, 
        status: OperationStatusEnum,
        amount: number,
    }[] // TODO: vamos ser nós a agrupar as operações ou o backend?
}
```
### Edit group - as a leader
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/6019123fce376229d1a226f2)

**Backend API name (TBD)** - Edit group

**G2 API STATUS** - Não existe API do lado do G2 que suporte isto pois parecem nem suportar upload de fotos nem o set/edit do target balance.

**Assumptions:**
- Pode editar ou fazer o set do target balance
- Pode editar a foto - [Zeplin](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/60191240bea647a29f733ae3)

**To check:**
- G2 não dispõe de target balance information (onde ficam guardados estes dados?) --> *ALINE* Yes, picture and target are only available for app users

**Request**: 
```
{ 
    id: string,  
    targetBalance: number,
}
```


### List group members 
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/60191244fa074a01c3ff9ec3)

**Backend API name (TBD)** - Get group members

**G2 API STATUS (ListGroupMembers)** - falta devolver o nome dos users, se não vamos ter de fazer um pedido para cada user.

**To check:**
- G2 devolve apenas msisdn e o role. Para cada user no grupo é necessário fazer um pedido de know your customer --> *ALINE* As a shortcut, could we use the contact list name if there is a match?
- Paginação? Temos infinite scroll? --> *ALINE* A group can have up to 1000 participants
- Search dos utilizadores é feito localmente ou através requests on type? --> *ALINE* Locally. Search by MSISDN and name

**Response**: 
```
{ 
    msisdn: string,  
    username: string,
    userRole: UserRoleEnum,
}
```

### Add members to group
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/6019124e79f88d418ddc303d)

**Backend API name (TBD)** - Add member to group

**G2 API STATUS (AddGroupMember)** - OK
>Validar se as restrições de numeros de approvers e leaders está a ser tida em conta neste tipo de operações bem como o user role que as está a executar.

**Assumptions:**
- Ter em conta as restrições de máximos e minimos de roles suportadas pelo grupo
- Precisa de aprovação
- --> *ALINE* Only leaders can initiate this operation

**Request**: 
```
{ 
    groupId: string,
    msisdn: string,  
    userRoleId: UserRoleId, // usar o role id em vez de role name
}
```

### Change group member role
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/60191248bfe178087f9c96cb)

**Backend API name (TBD)** - Change role of a group member

**G2 API STATUS (ChangeGroupMemberRoles)** - API com um footprint estranho pois tem uma listagem de roles a remover e uma listagem de roles a adicionar. Validar esta API!

**Assumptions:**
- Ter em conta as restrições de máximos e minimos de roles suportadas pelo grupo
- Precisa de aprovação
- --> *ALINE* Only leaders can initiate this operation
- 
**Request**:
```
{ 
    msisdn: string,
    groupId: string,  
    userRoleId: UserRoleID, // nas edições é preciso enviar role id em vez do role name
}
```

### Remove group member
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/60191248bfe178087f9c96cb)

**Backend API name (TBD)** - Remove group member

**G2 API STATUS (RemoveGroupMember)** - OK

**Assumptions:**
- Ter em conta as restrições de máximos e minimos de roles suportadas pelo grupo
- Precisa de aprovação
- --> *ALINE* Only leaders can initiate this operation

**Request**:
```
{ 
    msisdn: string,
    groupId: string,  
}
```


### Save money
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/6019165c1bb23c24cede77f1)

**Backend API name (TBD)** - Save money

**G2 API STATUS (SendMoneyToGroup)** - OK

**Assumptions:**
- Get current balance (SDK?) Traz a currency
- Default transaction values
  
**To check:**
- Como sabemos as fees que vão ser aplicadas? [Zeplin](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/6019165cf3a4159a7fc28ed0) --> *ALINE* I have a list of fees but they may be outdated. Shouldn't the info come from G2?

**Request**:
```
{ 
    amount: number,
    groupId: string,
    currency: string // SDK?
}
```

### Pay merchant
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/6019165c1bb23c24cede77f1)

**Backend API name (TBD)** - Pay merchant

**G2 API STATUS (RequestGroupPayMerchantVoucher)** - NOT OK. À espera de confirmação da Garima.

**Assumptions:**
- Get do balance atual do grupo
- Default transaction values
- Precisa de aprovação
  
**To check:**
- Vai ter aprovação? --> *ALINE* Anyone can initiate a pay merchant request but it needs to be approved by 2 approvers before the initiator receives an SMS with the voucher 

**Request**:
```
{ 
    amount: number,
    groupId: string,
}
```


### Cashout - leader only
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/60191f957135fcbd153578d4)

**Backend API name (TBD)** - cashout

**G2 API STATUS (GroupToMemberTransfer)** - NOT OK. À espera de confirmação da Garima.

**Assumptions:**
- Enviar dinheiro para mim proprio ou para outro member (get dos membros do grupo)
- Get do balance atual do grupo
- Default transaction values
- Precisa de aprovação
  

**Request**:
```
{ 
    amount: number,
    groupId: string,
}
```

### Notifications
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/601924d809d3c42a2d8d1d63)

**Backend API name (TBD)** - notifications list

**Assumptions:**
- Notification counter
- Notificações globais para todos os grupos

**To check:**
- Vamos ter um endpoint só para ir buscar o counter de notifications? --> *ALINE* No counter, just a circle for unread notifications
- Onde vão ficar guardadas as operações de approve que vão ter de ser mostradas aos approvers? 

**Response**:
```
{ 
    counter: number, 
    list:[
        {
            id: string, 
            title: string,
            description: string,
            timestamp: string,
            amount?: number, 
            status: NoticationStatusEnum //read or unread,
            operation: APPROVE_CASHOUT | APPROVE_PAY_MERCHANT | APPROVE_ROLE_CHANGE | APPROVE_REMOVE_USER | SAVE_MONEY | INVITATIONS // alguns destes tipos de operação vão despultar onClick na row que depois permitirá ir aprovar ou rejeitar a operação (i.e. APPROVE_XXX) type OperationEnum
            operationId: string,
        }
    ]
}
```

### Delete notification
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/601924d809d3c42a2d8d1d63)

**Backend API name (TBD)** - delete notification


**Request**:
```
{ 
    id: string
}
```

### Group invitation
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/601924d934184d02c307540a)

**Backend API name (TBD)** - group invitation accept

**Assumptions:**
- Buscar info do grupo
- Buscar a data de expiração
- Role que o user vai ter

**To check:**
- O que acontece quando rejeitamos uma invitation? --> *ALINE* User is sent back to the GSL homescreen
- Tem de passar pelos approvers primeiro antes da pessoa receber o convite? --> *ALINE* Yes

**Response**:
```
{ 
    group: ...,
    expiryDate: number, 
    userRole: UserRoleEnum
}
```

**Request**:
```
{ 
    msisdn: string, 
    groupId: string
}
```

### Operation details and approve/reject
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/601926c3ee6a584f80002a6c)
[Zeplin link](https://app.zeplin.io/project/5e721967b64f570177436f96/screen/60337dd7073dbe15b6af842e)

**Backend API name (TBD)** - operation details
**Backend API name (TBD)** - operation approve/reject

**Assumptions:**
- Buscar os dados da operation id (vão existir campos em comum entre todas as operações de modo a conseguirmos re-utilizar a UI e endpoints)

**To check:**
- O que acontece com as aprovações dos pay merchant? Segue a mesma UI do cashout? -->*ALINE* Yes

**Response**:
```
{ 
    groupName: string, 
    to: {username: string, msisdn: string},
    from: {username: string, msisdn: string},
    operation: OperationEnum,
    expireDate: string, 
    role?: UserRoleEnum, 
    amount?: number, 
    groupBalance?: number, 
    fees?: number, 
    operationStatus: APPROVED | REJECTED | PENDING;

}
```
**G2 API STATUS (ConfirmGroupMembership)** - OK
>Validar outras API do G2 que necessitem de ter aprovação previamente antes de serem executadas

**Request to approve/reject operation**:
```
{ 
    accept: boolean
}
```
