O projeto disponibiliza uma API REST desenvolvida em .NET e permite o cadastro de funcionários e geração do contracheque.
Os dados dos funcionários são persistidos em um banco de dados PostgreSQL. A geração do contracheque tem como data de referência o mês anterior ao mês atual e os dados são gerados em tempo de execução.
URLs da aplicação:
- https://paycheck-api-dotnet.herokuapp.com/v1 - URL base da API (Heroku)
- https://hub.docker.com/repository/docker/diltheyaislan/paycheckapi - Docker
- Configurar a string de conexão do banco de dados no arquivo
.\PaycheckAPI\appsettings.jsonna propriedadeDefaultConnection - Excutar o script SQL
employee.sql
No diretório raiz do repositório, executar comando:
dotnet run --project .\PaycheckAPI\PaycheckAPI.csproj
Foram implementados testes unitários para:
-
Serviços de funcionário - Criação e consulta através de um Mock do repositório de funcionários
-
Serviços de contracheque - Geração do contracheque e cálculos dos descontos
Para rodar os testes, executar o comando:
dotnet test
As requisições devem seguir os padrões:
| Método | Descrição |
|---|---|
GET |
Consulta e retorno de dados de um ou mais registros |
POST |
Criação de um novo registro |
PATCH |
Atualização parcial de um registro, sem necessidade de envio do payload completo |
DELETE |
Remoção de um registro |
| Código | Descrição |
|---|---|
200 |
Requisição executada com sucesso (success) |
404 |
Registro não encontrado (not found) |
Recurso para listar, mostrar, criar, alterar e remover funcionários e retornar dados do contracheque.
-
URL
[GET]
/employees -
Resposta de Sucesso
Response 200 (application/json)
[ { "id": "2e1fde7a-3719-49ed-aabc-978938b8b273", "name": "Noah", "lastName": "de Paula", "document": "124578", "department": "IT", "grossWage": 5000, "admissionDate": "2019-11-06", "hasHealthPlan": true, "hasDentalPlan": true, "hasTransportationVouchersDiscount": true } ]Onde:
- id - Identificação em UUID do funcionário
- name - Nome do funcionário
- lastName - Sobrenome do funcionário
- document - Documento do funcionário (RG, CPF)
- departament - Departamento do funcionário
- grossWage - Salário bruto do funcionário
- admissionDate - Data de admissão do funcionário
- hasHealthPlan - Retorna
truese funcionário tem plano de saúde oufalsese não - hasDentalPlan - Retorna
truese funcionário tem plano odontológico oufalsese não - hasTransportationVouchersDiscount - Retorna
truese funcionário tem vale transporte oufalsese não
-
URL
[POST]
/employees -
Requisição
Body (application/json)
{ "name": "Noah", "lastName": "de Paula", "document": "124578", "department": "IT", "grossWage": 5000, "admissionDate": "2019-11-06", "hasHealthPlan": true, "hasDentalPlan": true, "hasTransportationVouchersDiscount": true }Onde:
- name - Nome do funcionário
- lastName - Sobrenome do funcionário
- document - Documento do funcionário (RG, CPF)
- departament - Departamento do funcionário
- grossWage - Salário bruto do funcionário
- admissionDate - Data de admissão do funcionário
- hasHealthPlan - Informa
truese funcionário tem plano de saúde oufalsese não - hasDentalPlan - Informa
truese funcionário tem plano odontológico oufalsese não - hasTransportationVouchersDiscount - Informa
truese funcionário tem vale transporte oufalsese não
-
Resposta de Sucesso
Response 200 (application/json)
{ "id": "2e1fde7a-3719-49ed-aabc-978938b8b273", "name": "Noah", "lastName": "de Paula", "document": "124578", "department": "IT", "grossWage": 5000, "admissionDate": "2019-11-06", "hasHealthPlan": true, "hasDentalPlan": true, "hasTransportationVouchersDiscount": true }
-
URL
[GET]
/employees/{id} -
Parâmetros
idCódigo do funcionário
-
Resposta de Sucesso
Response 200 (application/json)
{ "id": "2e1fde7a-3719-49ed-aabc-978938b8b273", "name": "Noah", "lastName": "de Paula", "document": "124578", "department": "IT", "grossWage": 5000, "admissionDate": "2019-11-06", "hasHealthPlan": true, "hasDentalPlan": true, "hasTransportationVouchersDiscount": true } -
Resposta de Erro
Response 404 (application/json)
{ "message": "Employee not found" }
-
URL
[PATCH]
/employees/{id} -
Parâmetros
idCódigo do funcionário
-
Requisição
Body (application/json) - Não é necessário informar todos os atributos
{ "name": "Noah", "lastName": "de Paula", "document": "124578", "department": "IT", "grossWage": 5000, "admissionDate": "2019-11-06", "hasHealthPlan": true, "hasDentalPlan": true, "hasTransportationVouchersDiscount": true }Onde:
- name - Nome do funcionário
- lastName - Sobrenome do funcionário
- document - Documento do funcionário (RG, CPF)
- departament - Departamento do funcionário
- grossWage - Salário bruto do funcionário
- admissionDate - Data de admissão do funcionário
- hasHealthPlan - Informa
truese funcionário tem plano de saúde oufalsese não - hasDentalPlan - Informa
truese funcionário tem plano odontológico oufalsese não - hasTransportationVouchersDiscount - Informa
truese funcionário tem vale transporte oufalsese não
-
Resposta de Sucesso
Response 200 (application/json)
{ "id": "2e1fde7a-3719-49ed-aabc-978938b8b273", "name": "Noah", "lastName": "de Paula", "document": "124578", "department": "IT", "grossWage": 5000, "admissionDate": "2019-11-06", "hasHealthPlan": true, "hasDentalPlan": true, "hasTransportationVouchersDiscount": true } -
Resposta de Erro
Response 404 (application/json)
{ "message": "Employee not found" }
-
URL
[DELETE]
/employees/{id} -
Parâmetros
idCódigo do funcionário
-
Resposta de Sucesso
Response 200 - No body
-
Resposta de Erro
Response 404 (application/json)
{ "message": "Employee not found" }
-
URL
[GET]
/employees/{id}/paycheck -
Parâmetros
idCódigo do funcionário
-
Resposta de Sucesso
Response 200 (application/json)
{ "referencePeriod": "01/2021", "grossSalary": 7000, "netSalary": 5135.64, "totalDiscounts": -1864.36, "entries": [ { "type": "Remunaration", "amount": 7000, "description": "Salary" }, { "type": "Discount", "amount": 869.36, "description": "IRPF" }, { "type": "Discount", "amount": 560, "description": "FGTS" }, { "type": "Discount", "amount": 10, "description": "Health plan" }, { "type": "Discount", "amount": 5, "description": "Dental plan" }, { "type": "Discount", "amount": 420, "description": "Transportation voucher" } ] }Onde:
- referencePeriod - Período de referência do contracheque (MM/YYYY)
- grossSalary - Valor do salário bruto
- netSalary - Valor do salário líquido
- totalDiscounts - Valor total de descontos
- entries - Lista de lançamentos
- entries.type - Tipo do lançamento
- entries.amount - Valor do lançamento
- entries.description - Descrição do lançamento
-
Resposta de Erro
Response 404 (application/json)
{ "message": "Employee not found" }