# Minhas finanças

### Requisitos

* Java 8+
* Utilizar Maven ou Gradle
* Seguir os padrões REST
* Banco de dados H2
* Descrever as instruções para rodar o projeto no README.md
* Utilizar Git
* Utilizar **Springboot** versão 2.1.0

### Avaliação

* Clean Code
* Implementação da especificação
* README.md bem escrito
* Commits bem escritos

**Importante, nessa ordem:**

* Criar testes automatizados (teste unitário e teste de integração)
* Fazer uso de bibliotecas auxiliares
* CircleCI ou TravisCI
* Documentar a API com Swagger

### Especificação

Criar uma **API** Rest que ira gerenciar as finanças dos seus usuários. A **API** deve conter **endpoints** para:

* Criar um usuário
* Visualizar todos os usuários
* Ver detalhes de um usuário
* Criar um lançamento financeiro
* Buscar todos os lançamentos de um determinado usuário
* Buscar um determinado lançamento pelo usuário e pelo id
* Criar entidades para um usuário
* Visualizar entidades de um usuário
* Criar contas para um usuário
* Visualizar todas as contas de um usuário
* Visualizar uma determinada conta de um usuário
* Visualizar todos os lançamento de uma determinada conta de um determinado usuário
* Baixar uma determinada conta de um determinado usuário
* Estornar uma determina conta de um determinado usuário

### Endpoints

#### Usuários

## Criar usuário

<mark style="color:green;">`POST`</mark> `http://localhost:8080/financas/usuario`

#### Request Body

| Name | Type   | Description                                                                                                                                                               |
| ---- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|      | object | <p><br><code>{</code> <br>  <code>"nome": "Exemplo",</code><br>  <code>"email": "<exemplo@exemplo.com>",</code><br>  <code>"status": "ATIVO"</code><br><code>}</code></p> |

{% tabs %}
{% tab title="201 " %}

```javascript
{
    "id": "1",
    "nome": "Usuário exemplo",
    "email": "exemplo@exemplo.com",
    "status": "ATIVO",
    "created_at": "2018-11-01 11:59"
}
```

{% endtab %}

{% tab title="400 " %}

```javascript
{
    "status": 400,
    "message": "Não foi possível processar esta operação"
}
```

{% endtab %}
{% endtabs %}

## Buscar todos os usuários

<mark style="color:blue;">`GET`</mark> `http://localhost:8080/financas/usuario`

{% tabs %}
{% tab title="200 " %}

```
[
    {
        "id": "1",
        "nome": "Usuário exemplo",
        "email": "exemplo@exemplo.com",
        "status": "ATIVO",
        "created_at": "2018-11-01 11:59"
    },
    {
        "id": "2",
        "nome": "Usuário 02",
        "email": "usu_92@exemplo.com",
        "status": "ATIVO",
        "created_at": "2018-11-01 11:59"
    }
]

```

{% endtab %}
{% endtabs %}

## Buscar usuário por id

<mark style="color:blue;">`GET`</mark> `http://localhost:8080/financas/usuario/:id`

{% tabs %}
{% tab title="200 " %}

```
{
    "id": "1",
    "nome": "Usuário exemplo",
    "email": "exemplo@exemplo.com",
    saldo: {
        total: 15365.00
        receber: 3200.00
        pagar: 4000.00
    },
    "status": "ATIVO"
}
```

{% endtab %}

{% tab title="404 " %}

```
{
    "status": 404,
    "message": "Usuário não encontrado"
}
```

{% endtab %}
{% endtabs %}

### Lançamento Financeiro

Um lançamento financeiro pode ser:

* A Pagar
* A Receber

## Criar um lançamento financeiro

<mark style="color:green;">`POST`</mark> `http://localhost:8080/financas/usuario/:id/entidade/:id/lancamento`

#### Request Body

| Name | Type   | Description                                                                                                                                                                                                                |
| ---- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|      | object | <p><br><code>{</code><br>   <code>"descricao": "Lanchonete",</code><br>   <code>"observacao": "Esqueci o cartão",</code><br>   <code>"valor": 16.50,</code><br><br>   <code>"tipo": "RECEBER"</code><br><code>}</code></p> |

{% tabs %}
{% tab title="201 " %}

```
{
   "usuario_id": 1,
   "id": 1,
   "descricao": "Lanchonete",
   "observacao": "Esqueci o cartão",
   "valor": 16.50,
   "tipo": "RECEBER",
   "baixa": null,
   "status": "ABERTO",
   "created_at": '2018-11-01 11:59'
}
```

{% endtab %}
{% endtabs %}

## Buscar todos os lançamentos de um usuário

<mark style="color:blue;">`GET`</mark> `http://localhost:8080/financas/usuario/:id/lancamento`

{% tabs %}
{% tab title="200 " %}

```
```

{% endtab %}
{% endtabs %}

## Buscar um lançamento por id

<mark style="color:blue;">`GET`</mark> `http://localhost:8080/financas/usuario/:id/lancamento/:id`

{% tabs %}
{% tab title="200 " %}

```
```

{% endtab %}

{% tab title="404 " %}

```
{
    "status": 404,
    "message": "Usuário não encontrado"
}
```

{% endtab %}
{% endtabs %}

### Entidade

Uma entidade pode ser do tipo:

* Cliente
* Fornecedor

## Criar uma entidade

<mark style="color:green;">`POST`</mark> `http://localhost:8080/financas/usuario/:id/entidade`

#### Path Parameters

| Name | Type   | Description                                                                                                                 |
| ---- | ------ | --------------------------------------------------------------------------------------------------------------------------- |
|      | object | <p><code>{</code><br>   <code>"nome": "Advocacia S.A",</code><br>   <code>"tipo": "FORNECEDOR"</code><br><code>}</code></p> |

{% tabs %}
{% tab title="201 " %}

```
{
    "id": 1,
    "nome": "Advocacia S.A",
    "usuario_id": 1,
    "status": "ATIVO",
    "tipo": "FORNECEDOR",
    "created_at": "2018-11-07 12:05"
}
```

{% endtab %}
{% endtabs %}

## Buscar todas as entidades de um usuário

<mark style="color:blue;">`GET`</mark> `http://localhost:8080/financas/usuario/:id/entidade`

{% tabs %}
{% tab title="200 " %}

```
```

{% endtab %}

{% tab title="400 " %}

```
{
    "status": 404,
    "message": "Entidade não encontrada"
}
```

{% endtab %}
{% endtabs %}

## Buscar entidade por id

<mark style="color:blue;">`GET`</mark> `http://localhost:8080/financas/usuario/:id/entidade:id`

{% tabs %}
{% tab title="200 " %}

```
```

{% endtab %}
{% endtabs %}

### Conta

## Criar uma conta

<mark style="color:green;">`POST`</mark> `http://localhost:8080/financas/usuario/:id/conta`

#### Request Body

| Name | Type   | Description                                   |
| ---- | ------ | --------------------------------------------- |
|      | string | <p>{<br>   "nome": "Banco do Brasil"<br>}</p> |

{% tabs %}
{% tab title="201 " %}

```
{
    "id": 1,
    "saldo": 0.00,
    "status": "ATIVO",
    "created_at": "2018-11-01 11:50"
}

```

{% endtab %}
{% endtabs %}

## Buscar todos os lançamento de uma conta

<mark style="color:blue;">`GET`</mark> `http://localhost::8080/financas/usuario/:id/conta/:id/lancamentos`

#### Path Parameters

| Name | Type   | Description |
| ---- | ------ | ----------- |
|      | string |             |

{% tabs %}
{% tab title="200 " %}

```
```

{% endtab %}
{% endtabs %}

## Buscar todas as contas de um usuário

<mark style="color:blue;">`GET`</mark> `http://localhost:8080/financas/usuario/:id/conta`

{% tabs %}
{% tab title="200 " %}

```
```

{% endtab %}
{% endtabs %}

## Buscar conta por id

<mark style="color:blue;">`GET`</mark> `http://localhost:8080/financas/usuario/:id/conta/:id`

{% tabs %}
{% tab title="200 " %}

```
{
    "status": 404,
    "message": "Conta não encontrada"
}
```

{% endtab %}
{% endtabs %}

## Baixar um lançamento

<mark style="color:green;">`POST`</mark> `http://localhost:8080/financas/usuario/:id/conta/:idconta/:idlancamento?do=baixar`

#### Path Parameters

| Name | Type   | Description |
| ---- | ------ | ----------- |
| do   | string | Baixar      |

{% tabs %}
{% tab title="200 " %}

```
{
    "status": 200,
    "message: ("Lançamento {} com sucesso", pago, baixado)
}
```

{% endtab %}

{% tab title="404 " %}

```
{
    "status": 404,
    "message": "Lançamento não encontrado"
}
```

{% endtab %}
{% endtabs %}

## Estornar um lançamento

<mark style="color:green;">`POST`</mark> `http://localhost:8080/financas/usuario/:id/conta/:idconta/:idlancamento?do=estornar`

#### Path Parameters

| Name | Type   | Description |
| ---- | ------ | ----------- |
|      | string |             |

{% tabs %}
{% tab title="200 " %}

```
{
    "status": 200,
    "message: ("Lançamento {} com sucesso", pago, baixado)
}
```

{% endtab %}

{% tab title="302 " %}

```
{
    "status": 404,
    "message": "Lançamento não encontrado"
}
```

{% endtab %}
{% endtabs %}
