[MVPTN-106] feat(GET): Criado endpointo que retorna todos os itens de emolumentos de um emolumento a partir do emolumento_id e adicionado endpoint que retorna item de emolumento a partir do emolumento_id e faixa de valor informados

This commit is contained in:
Kenio 2025-10-16 10:26:31 -03:00
parent 7d7aaf24b8
commit 348cc3169d
10 changed files with 492 additions and 0 deletions

View file

@ -0,0 +1,44 @@
from abstracts.action import BaseAction
# O Schema precisa ser adaptado para GEmolumentoItem, talvez recebendo um ID de Emolumento
# ou um ID do próprio Item, dependendo da necessidade de listagem.
# Vamos sugerir um Schema específico para a listagem (Index) que pode receber um Emolumento ID
# para listar todos os seus itens, mantendo o padrão do arquivo original que usava um 'SistemaIdSchema'.
# Para simplificar, vamos assumir um schema de filtro ou um schema base para Index.
# Sugerimos a criação de:
# from packages.v1.administrativo.schemas.g_emolumento_item_schema import GEmolumentoItemIndexSchema
# (ou GEmolumentoItemEmolumentoIdSchema se for o padrão da aplicação)
from packages.v1.administrativo.schemas.g_emolumento_item_schema import GEmolumentoItemEmolumentoIdSchema
# O repositório IndexRepository deve ser substituído pelo GEmolumentoItemIndexRepository.
from packages.v1.administrativo.repositories.g_emolumento_item.g_emolumento_item_index_repository import IndexRepository
class IndexAction(BaseAction):
"""
Serviço responsável por encapsular a lógica de negócio para a operação
de listagem de todos os registros na tabela G_EMOLUMENTO_ITEM,
utilizando a DDL fornecida.
"""
# Mantendo o padrão de nome de método do arquivo original
def execute(self, emolumento_item_schema: GEmolumentoItemEmolumentoIdSchema):
"""
Executa a operação de listagem de G_EMOLUMENTO_ITEM no banco de dados.
Args:
emolumento_item_schema: Esquema com parâmetros de filtro/listagem
(por exemplo, ID do Emolumento pai, se a listagem for
filtrada por ele, ou parâmetros de paginação).
Returns:
A lista de todos os registros de G_EMOLUMENTO_ITEM que satisfazem o filtro.
"""
# Instanciamento do repositório
# O nome do repositório foi adaptado com o prefixo 'GEmolumentoItem'
index_repository = IndexRepository()
# Execução do repositório
# O nome do parâmetro foi adaptado para 'emolumento_item_schema'
response = index_repository.execute(emolumento_item_schema)
# Retorno da informação
return response

View file

@ -0,0 +1,44 @@
from abstracts.action import BaseAction
# O Schema precisa ser adaptado para GEmolumentoItem, talvez recebendo um ID de Emolumento
# ou um ID do próprio Item, dependendo da necessidade de listagem.
# Vamos sugerir um Schema específico para a listagem (Index) que pode receber um Emolumento ID
# para listar todos os seus itens, mantendo o padrão do arquivo original que usava um 'SistemaIdSchema'.
# Para simplificar, vamos assumir um schema de filtro ou um schema base para Index.
# Sugerimos a criação de:
# from packages.v1.administrativo.schemas.g_emolumento_item_schema import GEmolumentoItemIndexSchema
# (ou GEmolumentoItemEmolumentoIdSchema se for o padrão da aplicação)
from packages.v1.administrativo.schemas.g_emolumento_item_schema import GEmolumentoItemValorSchema
# O repositório ValorRepository deve ser substituído pelo GEmolumentoItemValorRepository.
from packages.v1.administrativo.repositories.g_emolumento_item.g_emolumento_item_valor_repository import ValorRepository
class ValorAction(BaseAction):
"""
Serviço responsável por encapsular a lógica de negócio para a operação
de listagem de todos os registros na tabela G_EMOLUMENTO_ITEM,
utilizando a DDL fornecida.
"""
# Mantendo o padrão de nome de método do arquivo original
def execute(self, emolumento_item_schema: GEmolumentoItemValorSchema):
"""
Executa a operação de listagem de G_EMOLUMENTO_ITEM no banco de dados.
Args:
emolumento_item_schema: Esquema com parâmetros de filtro/listagem
(por exemplo, ID do Emolumento pai, se a listagem for
filtrada por ele, ou parâmetros de paginação).
Returns:
A lista de todos os registros de G_EMOLUMENTO_ITEM que satisfazem o filtro.
"""
# Instanciamento do repositório
# O nome do repositório foi adaptado com o prefixo 'GEmolumentoItem'
index_repository = ValorRepository()
# Execução do repositório
# O nome do parâmetro foi adaptado para 'emolumento_item_schema'
response = index_repository.execute(emolumento_item_schema)
# Retorno da informação
return response

View file

@ -0,0 +1,53 @@
from actions.dynamic_import.dynamic_import import DynamicImport
# O Schema precisa ser adaptado para GEmolumentoItem.
# Assumindo o padrão de nomenclatura anterior:
from packages.v1.administrativo.schemas.g_emolumento_item_schema import (
GEmolumentoItemEmolumentoIdSchema,
GEmolumentoItemValorSchema
)
class GEmolumentoItemController:
def __init__(self):
# Action responsável por carregar as services de acordo com o estado
self.dynamic_import = DynamicImport()
# Define o pacote que deve ser carregado
self.dynamic_import.set_package("administrativo")
# Define a tabela que o pacote pertence (adaptado para g_emolumento_item)
self.dynamic_import.set_table("g_emolumento_item")
pass
# Lista todos os registros de item de emolumento por Emolumento ID
def index(self, emolumento_item_schema: GEmolumentoItemEmolumentoIdSchema):
# Importação da classe desejada (adaptado o nome da service)
indexService = self.dynamic_import.service("g_emolumento_item_index_service", "IndexService")
# Instância da classe service
self.indexService = indexService()
# Lista todos os registros de item de emolumento
# O nome do parâmetro foi adaptado para 'emolumento_item_schema'
return {
'message': 'Registros de item de emolumento localizados com sucesso',
'data': self.indexService.execute(emolumento_item_schema)
}
# Lista todos os registros de item de emolumento por Emolumento ID e faixa de valor
def get_by_valor(self, emolumento_item_schema: GEmolumentoItemValorSchema):
# Importação da classe desejada (adaptado o nome da service)
valorService = self.dynamic_import.service("g_emolumento_item_get_by_valor_service", "ValorService")
# Instância da classe service
self.valorService = valorService()
# Lista todos os registros de item de emolumento
# O nome do parâmetro foi adaptado para 'emolumento_item_schema'
return {
'message': 'Registros de item de emolumento localizados com sucesso',
'data': self.valorService.execute(emolumento_item_schema)
}

View file

@ -0,0 +1,50 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from actions.jwt.get_current_user import get_current_user
# Importações adaptadas para G_EMOLUMENTO_ITEM
from packages.v1.administrativo.controllers.g_emolumento_item_controller import GEmolumentoItemController
from packages.v1.administrativo.schemas.g_emolumento_item_schema import (
GEmolumentoItemEmolumentoIdSchema,
GEmolumentoItemValorSchema
)
# Inicializa o roteador para as rotas do item de emolumento
# Poderia ser renomeado para 'router_item' ou similar se houver chance de conflito de namespace
router = APIRouter()
# Instanciamento do controller desejado
g_emolumento_item_controller = GEmolumentoItemController()
# Localiza registros de item de emolumento pelo emolumento_id e faixa de valores
@router.get('/faixa/{emolumento_id}/{valor}',
status_code=status.HTTP_200_OK,
summary='Busca registros de item de emolumento em específico, possivelmente filtrando pelo ID do sistema/pai',
response_description='Busca registros de item de emolumento em específico')
async def get_by_valor(emolumento_id : int, valor : float, current_user: dict = Depends(get_current_user)):
# Cria o schema com os dados recebidos (adaptado para GEmolumentoItem)
emolumento_item_schema = GEmolumentoItemValorSchema(emolumento_id=emolumento_id, valor=valor)
# Busca os registros de item de emolumento (adaptado para o novo controller)
response = g_emolumento_item_controller.get_by_valor(emolumento_item_schema)
# Retorna os dados localizados
return response
# Localiza registros de item de emolumento pelo emolumento_id
@router.get('/{emolumento_id}',
status_code=status.HTTP_200_OK,
summary='Busca registros de item de emolumento em específico, possivelmente filtrando pelo ID do sistema/pai',
response_description='Busca registros de item de emolumento em específico')
async def index(emolumento_id : int, current_user: dict = Depends(get_current_user)):
# Cria o schema com os dados recebidos (adaptado para GEmolumentoItem)
emolumento_item_schema = GEmolumentoItemEmolumentoIdSchema(emolumento_id=emolumento_id)
# Busca os registros de item de emolumento (adaptado para o novo controller)
response = g_emolumento_item_controller.index(emolumento_item_schema)
# Retorna os dados localizados
return response

View file

@ -0,0 +1,68 @@
from abstracts.repository import BaseRepository
# Adaptação do Schema para GEmolumentoItem. Assumindo o uso de um Schema de ID de Sistema
# ou, mais tipicamente para itens, um Schema de ID do Emolumento pai (EMOLUMENTO_ID).
# Para manter a similaridade do original, vamos usar um 'SistemaIdSchema' adaptado,
# mas o SQL será ajustado para o campo EMOLUMENTO_ID.
from packages.v1.administrativo.schemas.g_emolumento_item_schema import GEmolumentoItemEmolumentoIdSchema
class IndexRepository(BaseRepository):
"""
Repositório para a operação de listagem de todos os registros
na tabela G_EMOLUMENTO_ITEM, possivelmente filtrados por EMOLUMENTO_ID.
"""
# Mantendo o padrão de nome de método do arquivo original
def execute(self, emolumento_item_schema: GEmolumentoItemEmolumentoIdSchema):
"""
Executa a consulta SQL para buscar todos os registros de G_EMOLUMENTO_ITEM,
incluindo todos os campos da DDL fornecida.
Returns:
Uma lista de dicionários contendo os dados dos registros.
"""
# Montagem do SQL com TODOS os campos da DDL fornecida
sql = """ SELECT VALOR_EMOLUMENTO,
EMOLUMENTO_ITEM_ID,
EMOLUMENTO_ID,
VALOR_INICIO,
VALOR_FIM,
VALOR_TAXA_JUDICIARIA,
EMOLUMENTO_PERIODO_ID,
CODIGO,
PAGINA_EXTRA,
VALOR_PAGINA_EXTRA,
VALOR_OUTRA_TAXA1,
CODIGO_SELO,
VALOR_FUNDO_RI,
CODIGO_TABELA,
SELO_GRUPO_ID,
CODIGO_KM,
EMOLUMENTO_ACRESCE,
TAXA_ACRESCE,
FUNCIVIL_ACRESCE,
VALOR_FRACAO,
VALOR_POR_EXCEDENTE_EMOL,
VALOR_POR_EXCEDENTE_TJ,
VALOR_POR_EXCEDENTE_FUNDO,
VALOR_LIMITE_EXCEDENTE_EMOL,
VALOR_LIMITE_EXCEDENTE_TJ,
VALOR_LIMITE_EXCEDENTE_FUNDO,
FUNDO_SELO,
DISTRIBUICAO,
VRCEXT
FROM G_EMOLUMENTO_ITEM
WHERE EMOLUMENTO_ID = :emolumento_id
ORDER BY EMOLUMENTO_ITEM_ID """
# Preenchimento de parâmetros.
# Adaptando o nome do parâmetro para refletir a coluna da DDL (EMOLUMENTO_ID).
# Assumimos que o campo 'emolumento_id' do schema está sendo usado para passar este valor.
params = {
"emolumento_id": emolumento_item_schema.emolumento_id
}
# Execução do sql
response = self.fetch_all(sql, params)
# Retorna os dados localizados
return response

View file

@ -0,0 +1,76 @@
from abstracts.repository import BaseRepository
# Adaptação do Schema para GEmolumentoItem. Assumindo o uso de um Schema de ID de Sistema
# ou, mais tipicamente para itens, um Schema de ID do Emolumento pai (EMOLUMENTO_ID).
# Para manter a similaridade do original, vamos usar um 'SistemaIdSchema' adaptado,
# mas o SQL será ajustado para o campo EMOLUMENTO_ID.
from packages.v1.administrativo.schemas.g_emolumento_item_schema import GEmolumentoItemValorSchema
class ValorRepository(BaseRepository):
"""
Repositório para a operação de listagem de todos os registros
na tabela G_EMOLUMENTO_ITEM, possivelmente filtrados por EMOLUMENTO_ID.
"""
# Mantendo o padrão de nome de método do arquivo original
def execute(self, emolumento_item_schema: GEmolumentoItemValorSchema):
"""
Executa a consulta SQL para buscar todos os registros de G_EMOLUMENTO_ITEM,
incluindo todos os campos da DDL fornecida.
Returns:
Uma lista de dicionários contendo os dados dos registros.
"""
# Montagem do SQL com TODOS os campos da DDL fornecida
sql = """ SELECT VALOR_EMOLUMENTO,
EMOLUMENTO_ITEM_ID,
EMOLUMENTO_ID,
VALOR_INICIO,
VALOR_FIM,
VALOR_TAXA_JUDICIARIA,
EMOLUMENTO_PERIODO_ID,
CODIGO,
PAGINA_EXTRA,
VALOR_PAGINA_EXTRA,
VALOR_OUTRA_TAXA1,
CODIGO_SELO,
VALOR_FUNDO_RI,
CODIGO_TABELA,
SELO_GRUPO_ID,
CODIGO_KM,
EMOLUMENTO_ACRESCE,
TAXA_ACRESCE,
FUNCIVIL_ACRESCE,
VALOR_FRACAO,
VALOR_POR_EXCEDENTE_EMOL,
VALOR_POR_EXCEDENTE_TJ,
VALOR_POR_EXCEDENTE_FUNDO,
VALOR_LIMITE_EXCEDENTE_EMOL,
VALOR_LIMITE_EXCEDENTE_TJ,
VALOR_LIMITE_EXCEDENTE_FUNDO,
FUNDO_SELO,
DISTRIBUICAO,
VRCEXT
FROM G_EMOLUMENTO_ITEM
WHERE
EMOLUMENTO_ID = :emolumento_id
AND :valor BETWEEN VALOR_INICIO AND VALOR_FIM
AND EMOLUMENTO_PERIODO_ID = (
SELECT MAX(EI2.EMOLUMENTO_PERIODO_ID)
FROM G_EMOLUMENTO_ITEM EI2
WHERE EI2.EMOLUMENTO_ID = :emolumento_id
)
ORDER BY EMOLUMENTO_ITEM_ID; """
# Preenchimento de parâmetros.
# Adaptando o nome do parâmetro para refletir a coluna da DDL (EMOLUMENTO_ID).
# Assumimos que o campo 'emolumento_id' do schema está sendo usado para passar este valor.
params = {
"emolumento_id": emolumento_item_schema.emolumento_id,
"valor": emolumento_item_schema.valor
}
# Execução do sql
response = self.fetch_all(sql, params)
# Retorna os dados localizados
return response

View file

@ -0,0 +1,75 @@
from pydantic import BaseModel, field_validator, model_validator
from fastapi import HTTPException, status
from typing import Optional, ClassVar, Dict
from decimal import Decimal
# Assumindo que a classe Text está disponível no caminho 'actions.validations.text'
from actions.validations.text import Text
# ----------------------------------------------------
# Schema base para G_EMOLUMENTO_ITEM
# ----------------------------------------------------
class GEmolumentoItemSchema(BaseModel):
# Colunas NUMERIC(14,3) devem ser mapeadas para Decimal para precisão
valor_emolumento: Optional[Decimal] = None
# Coluna NUMERIC(10,2) PK
emolumento_item_id: Optional[int] = None
# Colunas NUMERIC(10,2) FK ou comuns
emolumento_id: Optional[int] = None
emolumento_periodo_id: Optional[int] = None
codigo: Optional[int] = None
pagina_extra: Optional[int] = None
selo_grupo_id: Optional[int] = None
vrc_ext: Optional[int] = None # VRCEXT NUMERIC(10,2)
# Colunas NUMERIC(14,3)
valor_inicio: Optional[Decimal] = None
valor_fim: Optional[Decimal] = None
valor_taxa_judiciaria: Optional[Decimal] = None
valor_pagina_extra: Optional[Decimal] = None
valor_outra_taxa1: Optional[Decimal] = None
valor_fundo_ri: Optional[Decimal] = None
emolumento_acresce: Optional[Decimal] = None
taxa_acresce: Optional[Decimal] = None
funcivil_acresce: Optional[Decimal] = None
valor_fracao: Optional[Decimal] = None
valor_por_excedente_emol: Optional[Decimal] = None
valor_por_excedente_tj: Optional[Decimal] = None
valor_por_excedente_fundo: Optional[Decimal] = None
valor_limite_excedente_emol: Optional[Decimal] = None
valor_limite_excedente_tj: Optional[Decimal] = None
valor_limite_excedente_fundo: Optional[Decimal] = None
fundo_selo: Optional[Decimal] = None
distribuicao: Optional[Decimal] = None
# Colunas VARCHAR
codigo_selo: Optional[str] = None # VARCHAR(30)
codigo_tabela: Optional[str] = None # VARCHAR(30)
codigo_km: Optional[str] = None # VARCHAR(30)
# Sanitiza campos de texto (apenas os VARCHARs da DDL)
@field_validator(
'codigo_selo', 'codigo_tabela', 'codigo_km'
)
def sanitize_fields(cls, v):
if isinstance(v, str) and v:
return Text.sanitize_input(v)
return v
# ----------------------------------------------------
# Schema para localizar um registro pelo emolumento_id (GET)
# ----------------------------------------------------
class GEmolumentoItemEmolumentoIdSchema(BaseModel):
emolumento_id: int
# ----------------------------------------------------
# Schema para localizar um registro pelo emolumento_id e valor (GET)
# ----------------------------------------------------
class GEmolumentoItemValorSchema(BaseModel):
emolumento_id: int
valor: float

View file

@ -0,0 +1,38 @@
from fastapi import HTTPException, status
# Adaptação do Schema
from packages.v1.administrativo.schemas.g_emolumento_item_schema import GEmolumentoItemValorSchema
# Importação da Action ajustada para o novo prefixo
from packages.v1.administrativo.actions.g_emolumento_item.g_emolumento_item_valor_action import ValorAction
# O nome da classe deve ser adaptado com o prefixo 'GEmolumentoItem' para manter o padrão
# de classes da aplicação no Controller, Repository, etc.
class ValorService:
"""
Serviço responsável por encapsular a lógica de negócio para a operação
de listagem de registros na tabela G_EMOLUMENTO_ITEM.
"""
# Mantendo o padrão de nome de método do arquivo original
def execute(self, emolumento_item_schema: GEmolumentoItemValorSchema):
"""
Executa a operação de busca de todos os registros de G_EMOLUMENTO_ITEM no banco de dados.
Returns:
A lista de registros encontrados.
"""
# Instanciamento da ação (com o prefixo adaptado)
valor_action = ValorAction()
# Executa a busca de todas as ações (adaptando o nome do parâmetro)
data = valor_action.execute(emolumento_item_schema)
# Verifica se foram localizados registros
if not data:
# Retorna uma exceção (adaptando a mensagem)
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail='Não foi possível localizar os registros de G_EMOLUMENTO_ITEM'
)
# Retorna as informações localizadas
return data

View file

@ -0,0 +1,38 @@
from fastapi import HTTPException, status
# Adaptação do Schema
from packages.v1.administrativo.schemas.g_emolumento_item_schema import GEmolumentoItemEmolumentoIdSchema
# Importação da Action ajustada para o novo prefixo
from packages.v1.administrativo.actions.g_emolumento_item.g_emolumento_item_index_action import IndexAction
# O nome da classe deve ser adaptado com o prefixo 'GEmolumentoItem' para manter o padrão
# de classes da aplicação no Controller, Repository, etc.
class IndexService:
"""
Serviço responsável por encapsular a lógica de negócio para a operação
de listagem de registros na tabela G_EMOLUMENTO_ITEM.
"""
# Mantendo o padrão de nome de método do arquivo original
def execute(self, emolumento_item_schema: GEmolumentoItemEmolumentoIdSchema):
"""
Executa a operação de busca de todos os registros de G_EMOLUMENTO_ITEM no banco de dados.
Returns:
A lista de registros encontrados.
"""
# Instanciamento da ação (com o prefixo adaptado)
index_action = IndexAction()
# Executa a busca de todas as ações (adaptando o nome do parâmetro)
data = index_action.execute(emolumento_item_schema)
# Verifica se foram localizados registros
if not data:
# Retorna uma exceção (adaptando a mensagem)
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail='Não foi possível localizar os registros de G_EMOLUMENTO_ITEM'
)
# Retorna as informações localizadas
return data

View file

@ -25,6 +25,7 @@ from packages.v1.administrativo.endpoints import g_marcacao_tipo_endpoint
from packages.v1.administrativo.endpoints import t_servico_etiqueta_endpoint
from packages.v1.administrativo.endpoints import g_uf_endpoint
from packages.v1.administrativo.endpoints import g_emolumento_endpoint
from packages.v1.administrativo.endpoints import g_emolumento_item_endpoint
# Cria uma instância do APIRouter que vai agregar todas as rotas da API
api_router = APIRouter()
@ -146,4 +147,9 @@ api_router.include_router(
# Inclui as rotas de g_emolumento
api_router.include_router(
g_emolumento_endpoint.router, prefix="/administrativo/g_emolumento", tags=["Emolumentos"]
)
# Inclui as rotas de g_emolumento_item
api_router.include_router(
g_emolumento_item_endpoint.router, prefix="/administrativo/g_emolumento_item", tags=["Emolumento Item"]
)