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

Padroniza e Internacionaliza #119

Merged
merged 75 commits into from
Jul 22, 2024
Merged
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
97f317d
ajusta filtro
kanzakisuemi Jul 19, 2024
6dac89a
corrige seeds
LaiLestrange Jul 19, 2024
b1921a4
centraliza mensagens
kanzakisuemi Jul 19, 2024
61e333d
padroniza icones
kanzakisuemi Jul 19, 2024
434c6d0
Merge branch 'padroniza-e-internacionaliza' of github.com:TreinaDev/p…
kanzakisuemi Jul 19, 2024
fa4bf55
ajusta layout de dashboard de proprietario
kanzakisuemi Jul 19, 2024
31c01c3
adiciona atributos ao proprietario
kanzakisuemi Jul 19, 2024
17bb728
humaniza proprietário - adiciona nome e foto
kanzakisuemi Jul 19, 2024
88782df
Começa a padronizar a internacionalização dos notices e alerts
LaiLestrange Jul 19, 2024
aaf991d
corrige testes relacionados ao proprietário
kanzakisuemi Jul 19, 2024
8152450
Merge branch 'padroniza-e-internacionaliza' of github.com:TreinaDev/p…
kanzakisuemi Jul 19, 2024
a442557
Merge branch 'main' into padroniza-e-internacionaliza
kanzakisuemi Jul 19, 2024
0fea3a2
adiciona outros atributos a condo
kanzakisuemi Jul 19, 2024
ac1a34c
Centraliza fonte de traduções do I18n
LaiLestrange Jul 20, 2024
01f4dec
separa arquivos de tradução em pastas para melhor navegação
LaiLestrange Jul 20, 2024
571f190
melhora o fluxo de internacionalização
LaiLestrange Jul 20, 2024
99f8553
padroniza o uso de I18n
LaiLestrange Jul 20, 2024
c2ad0ce
Padroniza todos os controllers
LaiLestrange Jul 20, 2024
8dd1603
Padroniza models e começa padronizar as views
LaiLestrange Jul 20, 2024
35c21b8
continua padronização
LaiLestrange Jul 21, 2024
261e75f
Padroniza dashboard de admin
LaiLestrange Jul 21, 2024
21485a1
Padroniza dashboard de morador
LaiLestrange Jul 21, 2024
5d7d2d0
Padroniza dashboard de proprietário
LaiLestrange Jul 21, 2024
364284b
padroniza a sintaxe
LaiLestrange Jul 21, 2024
11d5e74
padroniza testes de request
LaiLestrange Jul 21, 2024
638d66d
ajusta testes
LaiLestrange Jul 21, 2024
49ffbfa
Merge com a main
LaiLestrange Jul 21, 2024
ef5ea7d
começa a refatorar os testes depois do merge
LaiLestrange Jul 21, 2024
65b59b4
corrige testes
LaiLestrange Jul 21, 2024
ae642c9
padroniza i18n.l
LaiLestrange Jul 21, 2024
1389f69
corrige testes
LaiLestrange Jul 21, 2024
a02322b
ajusta readme
LaiLestrange Jul 21, 2024
015a6dd
mend
LaiLestrange Jul 21, 2024
af41ad9
mend
LaiLestrange Jul 21, 2024
6364142
Merge branch 'main' into padroniza-e-internacionaliza
LaiLestrange Jul 21, 2024
d448226
padroniza novos merges
LaiLestrange Jul 21, 2024
f18aea1
corrige nome de teste
LaiLestrange Jul 21, 2024
92ababc
corrige teste
LaiLestrange Jul 21, 2024
0c5cc01
leves mudancas no display de informacoes
kanzakisuemi Jul 21, 2024
c169326
Merge branch 'main' into padroniza-e-internacionaliza
kanzakisuemi Jul 22, 2024
7f5b207
implementa search para unidades
kanzakisuemi Jul 22, 2024
5939e16
ajusta nomes e uma lista
kanzakisuemi Jul 22, 2024
bd9628a
ajusta algumas traducoes
kanzakisuemi Jul 22, 2024
ee2bd64
recebe nome da torre api condominions
kanzakisuemi Jul 22, 2024
a0eac76
refatora alguns testes
kanzakisuemi Jul 22, 2024
a3278ec
ajusta views e traducoes
kanzakisuemi Jul 22, 2024
3d73d5e
diminui icone
kanzakisuemi Jul 22, 2024
1d7ea89
ajusta tamanho de icones
kanzakisuemi Jul 22, 2024
209e575
ajusta tamanho de labels
kanzakisuemi Jul 22, 2024
bb86717
refatora filtro de faturas
kanzakisuemi Jul 22, 2024
85b305f
refatora views
kanzakisuemi Jul 22, 2024
01367f7
ajusta rubocop
LaiLestrange Jul 22, 2024
6014f12
ajusta titulo
kanzakisuemi Jul 22, 2024
521afdd
Merge branch 'padroniza-e-internacionaliza' of github.com:TreinaDev/p…
kanzakisuemi Jul 22, 2024
5b89eda
refatora initializer de unidade
kanzakisuemi Jul 22, 2024
54a6fad
ajusta rubocop
LaiLestrange Jul 22, 2024
bc40ebe
Corrige testes de model e requests.
angelomaia Jul 22, 2024
6d80f21
adiciona nome da torre em views
kanzakisuemi Jul 22, 2024
008c76d
Merge branch 'padroniza-e-internacionaliza' of github.com:TreinaDev/p…
kanzakisuemi Jul 22, 2024
73f0674
adiciona nome da torre a mais views
kanzakisuemi Jul 22, 2024
3685e13
corrige logica da view
kanzakisuemi Jul 22, 2024
b61213f
ajusta testes de bills
LaiLestrange Jul 22, 2024
a46dace
Merge na main
angelomaia Jul 22, 2024
27c18eb
adiciona mensagem descritiva
kanzakisuemi Jul 22, 2024
b8022f5
Merge branch 'padroniza-e-internacionaliza' of github.com:TreinaDev/p…
kanzakisuemi Jul 22, 2024
7e757f2
ajusta testes de property owners
LaiLestrange Jul 22, 2024
683f00f
Corrige data de emissão no teste de request
angelomaia Jul 22, 2024
c56528a
Merge branch 'padroniza-e-internacionaliza' of github.com:TreinaDev/p…
angelomaia Jul 22, 2024
fb1024f
Merge branch 'main' into padroniza-e-internacionaliza
angelomaia Jul 22, 2024
044eea4
ajusta teste
LaiLestrange Jul 22, 2024
900adc7
Corrige testes de certificado de DN
Arthorioscal Jul 22, 2024
e07369d
Merge branch 'padroniza-e-internacionaliza' of https://github.com/Tre…
Arthorioscal Jul 22, 2024
2616b42
cria teste para edicao de conta de proprietario
kanzakisuemi Jul 22, 2024
830aa64
Merge branch 'padroniza-e-internacionaliza' of github.com:TreinaDev/p…
kanzakisuemi Jul 22, 2024
5e665d3
Aumenta o coverage para o controle de emissão de DN
Arthorioscal Jul 22, 2024
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
125 changes: 67 additions & 58 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
![Static Badge](https://img.shields.io/badge/Ruby_on_Rails_7.1.3.1-CC0000?style=for-the-badge&logo=ruby-on-rails&logoColor=white)
![Bootstrap](https://img.shields.io/badge/bootstrap-%238511FA.svg?style=for-the-badge&logo=bootstrap&logoColor=white)

![Static Badge](https://img.shields.io/badge/COBERTURA_DE_TESTES-97%25-blue)
![Static Badge](https://img.shields.io/badge/COBERTURA_DE_TESTES-99%25-blue)
![Static Badge](https://img.shields.io/badge/STATUS-EM_DESENVOLVIMENTO-green)

### Tópicos
Expand Down Expand Up @@ -87,8 +87,8 @@

### Emissão de Certidão Negativa de Débitos

- [ ] **Emissão de Certidão:** Administradores, proprietários e moradores (sem autenticação) podem emitir certidões negativas de débito se não houver faturas vencidas e não pagas.
- [ ] **Validação e Geração:** Certidão é gerada no momento da solicitação com data e hora da emissão.
- [x] **Emissão de Certidão:** Administradores, proprietários e moradores (sem autenticação) podem emitir certidões negativas de débito se não houver faturas vencidas e não pagas.
- [x] **Validação e Geração:** Certidão é gerada no momento da solicitação com data e hora da emissão.


## Gems utilizadas
Expand Down Expand Up @@ -223,12 +223,17 @@ Você pode usar sites como [4Devs](https://www.4devs.com.br/) para gerar número

## 1. Taxas de Áreas Comuns

`GET /api/v1/condos/:id/common_area_fees`
### 1.1 Lista de últimas taxas de área comum cadastradas
📍 `GET /api/v1/condos/:id/common_area_fees`

Recebe como parâmetro `:id` de um condomínio, e retorna uma lista com **a última taxa cadastrada para cada área comum desse condomínio**
Retorna: <br>
Caso o condomínio não possua nenhuma taxa cadastrada: `status: 200, json: []` <br>
Caso o condomínio possua alguma taxa cadastrada: `status: 200, json:`
Recebe como parâmetro `:id` de um condomínio, e retorna uma lista com a última taxa cadastrada para cada área comum desse condomínio

**Retorna:** <br>
Caso o condomínio não possua nenhuma taxa cadastrada:<br>
`status: 200, json: []`

Caso o condomínio possua alguma taxa cadastrada: <br>
`status: 200, json:`
```json
[
{
Expand All @@ -255,17 +260,19 @@ Caso o condomínio possua alguma taxa cadastrada: `status: 200, json:`
]
```

`GET /api/v1/common_area_fees/:id`
### 1.2 Detalhes de uma taxa de área comum
📍 `GET /api/v1/common_area_fees/:id`

Recebe como parâmetro o `:id` de uma taxa cadastrada e retorna os detalhes da taxa de área comum desejada.

Recebe como parâmetro o `:id` de uma taxa cadastrada e retorna **os detalhes da taxa de área comum** desejada.
**Retorna:** <br>
Caso não exista taxa com o id informado: `status: 404`
Caso não exista taxa com o id informado:<br> `status: 404, json:`
```json
{
"errors":"Não encontrado"
}
```
Caso o condomínio possua alguma taxa cadastrada: `status: 200, json:`
Caso o condomínio possua alguma taxa cadastrada:<br> `status: 200, json:`
```json
{
"value_cents":20000,
Expand All @@ -278,7 +285,7 @@ Caso o condomínio possua alguma taxa cadastrada: `status: 200, json:`
## 2. Cobranças Avulsas

### 2.1 Criação de Cobranças Avulsas
`POST /api/v1/single_charges/?params`
📍 `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.

Expand All @@ -290,74 +297,73 @@ Resposta para falha na criação: `status: 422` (:unprocessable_entity)
- se o `charge_type == fine`, a `description` é obrigatória
- a `unit_id` deve pertencer ao `condo_id` (unidade deve ser do condomínio)

Recebe os seguintes parâmetros:
**Recebe os seguintes parâmetros::** <br>
```
{ single_charge: {
description: string,
value_cents: integer,
charge_type: enum (:fine ou :common_area_fee),
issue_date: date,
condo_id: integer,
common_area_id: integer,
unit_id: integer
}
{ single_charge: { description: string,
value_cents: integer,
charge_type: enum (:fine ou :common_area_fee),
issue_date: date,
condo_id: integer,
common_area_id: integer,
unit_id: integer
}
}
```
Resposta para criação com sucesso: `status: 201, body: {message: :message}` (:created)
Resposta para criação com sucesso:<br> `status: 201, body: {message: :message}` (:created)

Exemplo de cobrança avulsa (Multa):
```
{ single_charge: {
description: 'Multa por barulho durante a madrugada',
value_cents: 10000,
charge_type: :fine,
issue_date: 5.days.from_now.to_date,
condo_id: 1,
common_area_id: nil,
unit_id: 1
{ single_charge: { description: 'Multa por barulho durante a madrugada',
value_cents: 10000,
charge_type: :fine,
issue_date: 5.days.from_now.to_date,
condo_id: 1,
common_area_id: nil,
unit_id: 1
}
}
```
Resposta para criação com sucesso: `status: 201, body: {message: :message}` (:created)
Resposta para criação com sucesso:<br> `status: 201, body: {message: :message}` (:created)

Exemplo de cobrança avulsa (Reserva de Área Comum):
```
{ single_charge: {
description: nil,
value_cents: ~deve retornar do endpoint de taxas de áreas comuns~,
charge_type: :common_area_fee,
issue_date: 5.days.from_now.to_date,
condo_id: 1,
common_area_id: 2,
unit_id: 1
}
{ single_charge: { description: nil,
value_cents: ~deve retornar do endpoint de taxas de áreas comuns~,
charge_type: :common_area_fee,
issue_date: 5.days.from_now.to_date,
condo_id: 1,
common_area_id: 2,
unit_id: 1
}
}
```
Resposta para criação com sucesso: `status: 201, body: {message: :message, single_charge_id: :id}` (:created)
Resposta para criação com sucesso:<br> `status: 201, body: {message: :message, single_charge_id: :id}` (:created)

### 2.2
### 2.2 Cancelar uma reserva de área comum

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`
📍 `PATCH /api/v1/single_charges/:id/cancel`

Resposta para cancelamento com sucesso: `status: 201, body: {message: :message}` (:created)
Recebe como parâmetro o `:id` de uma reserva
Resposta para cancelamento com sucesso:<br> `status: 201, body: {message: :message}` (:created)

## 3. Faturas
### 3.1 Detalhes de uma fatura

`GET api/v1/bills/:id`
📍 `GET api/v1/bills/:id`

Recebemos como parâmetro um `:id` de uma fatura e retornamos **todos os detalhes da fatura** desejada.

Recebemos como parâmetro um `id` de uma fatura e retornamos **todos os detalhes da fatura** desejada. <br>
**Retorna:** <br>
Caso não exista taxa com o id informado: `status: 404`:
Caso não exista taxa com o id informado:<br> `status: 404, json:`
```json
{
"errors":"Não encontrado"
}
```

Caso exista taxa com o id informado: `status: 200`:

Caso exista taxa com o id informado: <br> `status: 200, json:`
```json
{
"unit_id": 1,
Expand Down Expand Up @@ -408,12 +414,14 @@ Caso exista taxa com o id informado: `status: 200`:
}
```

`GET api/v1/units/:unit_id/bills`
### 3.2 Lista de faturas por unidade
📍 `GET api/v1/units/:unit_id/bills`

Recebemos como parâmetro um `id` de uma unidade e retornamos **todas as faturas relacionadas a ela.**

Recebemos como parâmetro um `id` de uma fatura e retornamos **todos os detalhes da fatura** desejada. <br>
**Retorna:** <br>

Caso a unidade possua alguma taxa cadastrada: `status: 200`:
Caso a unidade possua alguma fatura cadastrada: `status: 200, json:`
```json
{
"bills": [
Expand Down Expand Up @@ -443,11 +451,9 @@ Caso a unidade não possua nenhuma fatura cadastrada: `status: 200`:
}
```

## 4. Comprovante
## 4. Comprovante de Pagamento

URL: ` /api/v1/receipts`

Método: POST
📍 `POST /api/v1/receipts`

Expõe um endpoint da API para a criação do modelo receipt, válido para o upload de comprovantes.

Expand All @@ -456,6 +462,9 @@ 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.

<br>
<hr>

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

<div align="center">
Expand Down
Binary file added app/assets/images/filter-two-icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions app/controllers/admins/registrations_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def configure_account_update_params
end

def redirect_if_not_logged_in
redirect_to new_admin_session_path, notice: I18n.t('errors.messages.must_be_logged_in') unless admin_signed_in?
redirect_to new_admin_session_path, notice: I18n.t('errors.unauthorized.not_logged_in') unless admin_signed_in?
end

def after_sign_up_path_for(*)
Expand All @@ -74,7 +74,7 @@ def after_update_path_for(*)
end

def redirect_if_not_super_admin
redirect_to root_path, notice: I18n.t('errors.messages.must_be_super_admin') unless current_admin.super_admin?
redirect_to root_path, notice: I18n.t('errors.unauthorized.not_super_admin') unless current_admin.super_admin?
end

# The path used after sign up for inactive accounts.
Expand Down
4 changes: 2 additions & 2 deletions app/controllers/admins_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ def condos_selection_post
params[:condo_ids].each do |condo_id|
admin.associated_condos.create(condo_id:)
end
redirect_to root_path, notice: I18n.t('errors.messages.condo_acess_updated')
redirect_to root_path, notice: I18n.t('success.update.condo_access')
end

private

def check_super_admin
redirect_to root_path, alert: I18n.t('errors.messages.must_be_super_admin') unless current_admin.super_admin
redirect_to root_path, alert: I18n.t('errors.unauthorized.not_super_admin') unless current_admin.super_admin
end
end
2 changes: 1 addition & 1 deletion app/controllers/api/v1/api_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ class Api::V1::ApiController < ActionController::API
private

def record_not_found
render status: :not_found, json: { errors: 'Não encontrado' }
render status: :not_found, json: { errors: I18n.t('errors.messages.not_found') }
end
end
8 changes: 5 additions & 3 deletions app/controllers/api/v1/receipts_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ def create
receipt.file.attach(params[:receipt])

if receipt.save
render_response({ message: I18n.t('receipt_received_success') }, :ok)
render_response({ message: I18n.t('receipts.success.received') }, :ok)
else
render_response({ errors: receipt.errors.full_messages }, :unprocessable_entity)
end
Expand All @@ -16,11 +16,13 @@ def create
private

def validate_file_presence
render_response({ error: I18n.t('no_file_sent') }, :bad_request) if params[:receipt].blank?
render_response({ error: I18n.t('receipts.errors.no_file_sent') }, :bad_request) if params[:receipt].blank?
end

def validate_bill_id_presence
render_response({ error: I18n.t('missing_bill_id') }, :unprocessable_entity) if params[:bill_id].blank?
return if params[:bill_id].present?

render_response({ error: I18n.t('receipts.errors.missing_bill_id') }, :unprocessable_entity)
end

def render_response(body, status)
Expand Down
10 changes: 5 additions & 5 deletions app/controllers/api/v1/single_charges_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ 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
return render json: { message: I18n.t('errors.invalid.charge') }, status: :unprocessable_entity
end

if single_charge.canceled!
render json: { message: I18n.t('single_charge_canceled') }, status: :ok
render json: { message: I18n.t('success.cancel.reservation') }, status: :ok
else
render json: { message: single_charge.errors.full_messages }, status: :unprocessable_entity
end
Expand All @@ -18,15 +18,15 @@ def create
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: I18n.t('invalid_charge') }, status: :unprocessable_entity
render json: { message: I18n.t('errors.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'), single_charge_id: single_charge.id
message: I18n.t('success.create.common_area_charge'), single_charge_id: single_charge.id
}, status: :created
else
render json: { message: single_charge.errors.full_messages }, status: :unprocessable_entity
Expand All @@ -35,7 +35,7 @@ def create_common_area_fee(single_charge)

def create_fine(single_charge)
if single_charge.save
render json: { message: I18n.t('fine-charge-success') }, status: :created
render json: { message: I18n.t('success.create.fine-charge') }, status: :created
else
render json: { message: single_charge.errors.full_messages }, status: :unprocessable_entity
end
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ def admin_authorized?
return true if current_admin&.super_admin? || current_admin_associated
end

redirect_to root_path, notice: I18n.t('errors.messages.must_be_super_admin')
redirect_to root_path, notice: I18n.t('errors.unauthorized.not_super_admin')
end
end
7 changes: 4 additions & 3 deletions app/controllers/base_fees_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,18 @@ def create
@unit_types = UnitType.all(@condo.id)

if @base_fee.save
redirect_to condo_path(@condo.id), notice: I18n.t('success_notice_base_fee')
redirect_to condo_path(@condo.id), notice: I18n.t('success.create.fee')
else
flash.now[:alert] = I18n.t 'fail_notice_base_fee'
flash.now[:alert] = I18n.t('errors.cant_create.fee')
render :new, status: :unprocessable_entity
end
end

def cancel
@base_fee = BaseFee.find(params[:id])
@base_fee.canceled!
redirect_to condo_base_fees_path(@condo.id), notice: "#{@base_fee.name} cancelada com sucesso."
redirect_to condo_base_fees_path(@condo.id),
notice: I18n.t('success.cancel.this_fee', fee: @base_fee.name)
end

private
Expand Down
6 changes: 3 additions & 3 deletions app/controllers/bills_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,23 @@ def show

def accept_payment
@bill.paid!
redirect_to condo_bills_path(@condo.id), notice: I18n.t('views.index.payment_accepted')
redirect_to condo_bills_path(@condo.id), notice: I18n.t('success.payment.accepted')
end

def reject_payment
@bill.pending!
@bill.denied = true
@bill.save
@bill.receipt.destroy
redirect_to condo_bills_path(@condo.id), notice: I18n.t('views.index.payment_rejected')
redirect_to condo_bills_path(@condo.id), notice: I18n.t('success.payment.rejected')
end

private

def bill_belongs_to_condo
return if @bill.condo_id.to_i == @condo.id.to_i

redirect_to condo_bills_path(@condo.id), notice: I18n.t('views.index.no_bills')
redirect_to condo_bills_path(@condo.id), notice: I18n.t('errors.not_found.bills')
end

def set_bill
Expand Down
Loading
Loading