Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Endpoint de cancelamento de reserva de área comum #112

Merged
merged 6 commits into from
Jul 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 17 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ Você pode usar sites como [4Devs](https://www.4devs.com.br/) para gerar número

# APIs

### 1. Taxas de Áreas Comuns
## 1. Taxas de Áreas Comuns

`GET /api/v1/condos/:id/common_area_fees`

Expand Down Expand Up @@ -272,14 +272,13 @@ Caso o condomínio possua alguma taxa cadastrada: `status: 200, json:`
}
```

### 2. Cobranças Avulsas
## 2. Cobranças Avulsas

### 2.1 Criação de Cobranças Avulsas
`POST /api/v1/single_charges/?params`

Expõe uma API endpoint de criação de model `single_charge`, válido para criação de Multas e Reservas de Áreas Comuns.

Resposta para criação com sucesso: `status: 201` (:created)

Resposta para falha na criação: `status: 422` (:unprocessable_entity)

- São obrigatórios: `unit_id`, `condo_id`, `value_cents`, `issue_date`, `charge_type`
Expand All @@ -301,6 +300,7 @@ Recebe os seguintes parâmetros:
}
}
```
Resposta para criação com sucesso: `status: 201, body: {message: :message}` (:created)

Exemplo de cobrança avulsa (Multa):
```
Expand All @@ -315,6 +315,7 @@ Exemplo de cobrança avulsa (Multa):
}
}
```
Resposta para criação com sucesso: `status: 201, body: {message: :message}` (:created)

Exemplo de cobrança avulsa (Reserva de Área Comum):
```
Expand All @@ -329,8 +330,17 @@ Exemplo de cobrança avulsa (Reserva de Área Comum):
}
}
```
Resposta para criação com sucesso: `status: 201, body: {message: :message, single_charge_id: :id}` (:created)

### 2.2

Expõe uma API endpoint de cancelamento do status do model `single_charge` para Reservas de Áreas Comuns.

`PATCH /api/v1/single_charges/:id/cancel`

Resposta para cancelamento com sucesso: `status: 201, body: {message: :message}` (:created)

### 3. Faturas
## 3. Faturas

`GET api/v1/bills/:id`

Expand Down Expand Up @@ -395,7 +405,7 @@ Caso a unidade não possua nenhuma fatura cadastrada: `status: 200`:
}
```

### 3. Comprovante
## 4. Comprovante

URL: ` /api/v1/receipts`

Expand All @@ -408,7 +418,7 @@ Parâmetros do Corpo da Requisição
- `receipt`: Arquivo anexado do comprovante. Obrigatório. ( Deve ser um arquivo em formato PDF, JPEG ou PNG )
- `bill_id`: Id da fatura associada ao comprovante. Obrigatório.

## Desenvolvedores 🧑🏽‍💻🧑🏻‍💻🧑‍💻
# Desenvolvedores 🧑🏽‍💻🧑🏻‍💻🧑‍💻

<div align="center">
<table>
Expand Down
23 changes: 21 additions & 2 deletions app/controllers/api/v1/single_charges_controller.rb
Original file line number Diff line number Diff line change
@@ -1,18 +1,33 @@
class Api::V1::SingleChargesController < Api::V1::ApiController
def cancel
single_charge = SingleCharge.find(params[:id])
if check_charge_type(single_charge)
return render json: { message: I18n.t('invalid_charge') }, status: :unprocessable_entity
end

if single_charge.canceled!
render json: { message: I18n.t('single_charge_canceled') }, status: :ok
else
render json: { message: single_charge.errors.full_messages }, status: :unprocessable_entity
end
end

def create
single_charge = SingleCharge.new(single_charge_params)

return create_fine(single_charge) if single_charge.fine?
return create_common_area_fee(single_charge) if single_charge.common_area_fee?

render json: { message: 'Tipo de Cobrança inválido' }, status: :unprocessable_entity
render json: { message: I18n.t('invalid_charge') }, status: :unprocessable_entity
end

private

def create_common_area_fee(single_charge)
if single_charge.save
render json: { message: I18n.t('common-area-fee-charge-success') }, status: :created
render json: {
message: I18n.t('common-area-fee-charge-success'), single_charge_id: single_charge.id
}, status: :created
else
render json: { message: single_charge.errors.full_messages }, status: :unprocessable_entity
end
Expand All @@ -26,6 +41,10 @@ def create_fine(single_charge)
end
end

def check_charge_type(single_charge)
single_charge.charge_type != 'common_area_fee'
end

def single_charge_params
params.require(:single_charge).permit(:description, :value_cents, :common_area_id, :unit_id, :charge_type,
:issue_date, :condo_id)
Expand Down
2 changes: 2 additions & 0 deletions config/locales/single_charge.pt-BR.yml
mbellucio marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ pt-BR:
success_notice_single_charge: 'Cobrança Avulsa cadastrada com sucesso!'
fail_notice_single_charge: 'Não foi possível cadastrar a cobrança avulsa.'
not_authorized_notice_single_charge: 'Você não pode criar uma cobrança avulsa para uma unidade que não é sua.'
single_charge_canceled: 'Reserva cancelada com sucesso!'
invalid_charge: 'Tipo de Cobrança inválido.'
activerecord:
models:
single_charge:
Expand Down
4 changes: 3 additions & 1 deletion config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@
resources :common_area_fees, only: [:index]
end
resources :common_area_fees, only: [:show]
resources :single_charges, only: [:create]
resources :single_charges, only: [:create] do
patch 'cancel', on: :member
end
resources :receipts, only: [:create]
resources :bills, only: [:show]
resources :units, only: [] do
Expand Down
2 changes: 1 addition & 1 deletion db/seeds.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
gian_lucca = PropertyOwner.new(
email: 'gian@email.com',
password: 'gian123',
document_number: '077.9797.020-08'
document_number: '077.497.020-08'
)
gian_lucca.save(validate: false)

Expand Down
66 changes: 66 additions & 0 deletions spec/requests/apis/single_charge_api_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@

post api_v1_single_charges_path, params: single_charge_params

data = response.parsed_body
expect(response.status).to eq 201
expect(data['single_charge_id']).to eq 1
expect(response.body).to include 'Cobrança de Taxa de área comum criada com sucesso.'
expect(SingleCharge.count).to eq 1
expect(I18n.t("single_charge.#{SingleCharge.last.charge_type}")).to eq 'Taxa de Área Comum'
Expand Down Expand Up @@ -241,4 +243,68 @@
expect(response.body).to include 'Tipo de Cobrança inválido'
end
end

context 'PATCH /api/v1/condos/:id/single_charges/:id' do
it 'recebe um cancelamento de reserva de area comum com sucesso' do
condos = []
condos << Condo.new(id: 1, name: 'Condo Test', city: 'City Test')
unit_types = []
unit_types << UnitType.new(id: 1, description: 'Apartamento 1 quarto', metreage: 100, fraction: 1.0,
unit_ids: [1])
units = []
units << Unit.new(id: 1, area: 100, floor: 1, number: '11', unit_type_id: 1, condo_id: 1,
condo_name: 'Prédio lindo', tenant_id: 1, owner_id: 1, description: 'Com varanda')
common_areas = []
common_areas << CommonArea.new(id: 1, name: 'Academia',
description: 'Uma academia raíz com ventilador apenas para os marombas',
max_occupancy: 20, rules: 'Não pode ser frango', condo_id: 1)
allow(Condo).to receive(:all).and_return(condos)
allow(Condo).to receive(:find).and_return(condos.first)
allow(UnitType).to receive(:all).and_return(unit_types)
allow(Unit).to receive(:all).and_return(units)
allow(Unit).to receive(:find).and_return(units.first)
allow(CommonArea).to receive(:all).and_return(common_areas)
allow(CommonArea).to receive(:find).and_return(common_areas.first)
single_charge = create(:single_charge, id: 1, condo_id: condos.first.id, unit_id: units.first.id,
common_area_id: common_areas.first.id, charge_type: :common_area_fee)

patch cancel_api_v1_single_charge_path(single_charge.id)

data = response.parsed_body
expect(response.status).to eq 200
expect(data['message']).to include('Reserva cancelada com sucesso')
expect(SingleCharge.find(single_charge.id).canceled?).to eq true
end

it 'recebe um pedido de cancelamento e falha se o tipo nao for taxa de area comum' do
condos = []
condos << Condo.new(id: 1, name: 'Condo Test', city: 'City Test')
unit_types = []
unit_types << UnitType.new(id: 1, description: 'Apartamento 1 quarto', metreage: 100, fraction: 1.0,
unit_ids: [1])
units = []
units << Unit.new(id: 1, area: 100, floor: 1, number: '11', unit_type_id: 1, condo_id: 1,
condo_name: 'Prédio lindo', tenant_id: 1, owner_id: 1, description: 'Com varanda')
common_areas = []
common_areas << CommonArea.new(id: 1, name: 'Academia',
description: 'Uma academia raíz com ventilador apenas para os marombas',
max_occupancy: 20, rules: 'Não pode ser frango', condo_id: 1)
allow(Condo).to receive(:all).and_return(condos)
allow(Condo).to receive(:find).and_return(condos.first)
allow(UnitType).to receive(:all).and_return(unit_types)
allow(Unit).to receive(:all).and_return(units)
allow(Unit).to receive(:find).and_return(units.first)
allow(CommonArea).to receive(:all).and_return(common_areas)
allow(CommonArea).to receive(:find).and_return(common_areas.first)
single_charge = create(:single_charge, id: 1, condo_id: condos.first.id, unit_id: units.first.id,
common_area_id: common_areas.first.id, charge_type: :fine)

patch cancel_api_v1_single_charge_path(single_charge.id)

data = response.parsed_body
expect(response.status).to eq 422
expect(data['message']).to include('Tipo de Cobrança inválido')
expect(SingleCharge.find(single_charge.id).canceled?).to eq false
end
end
end
Loading