[MVPTN-106] feat(Schema): Ajustado Schema para que apenas o campo descrição seja obrigatório

This commit is contained in:
Kenio 2025-10-20 09:13:58 -03:00
parent a61ea6d33d
commit 87d720629f

View file

@ -70,115 +70,66 @@ class TServicoTipoDescricaoSchema(BaseModel):
# ----------------------------------------------------
class TServicoTipoSaveSchema(BaseModel):
servico_tipo_id: Optional[int] = None
descricao: str
valor: float # Numeric(14,3) - Considerado obrigatório para criação
tipo_item: str # Varchar(1)
requer_autorizacao: str # Varchar(1)
requer_biometria: str # Varchar(1)
tipo_pessoa: str # Varchar(1)
tb_reconhecimentotipo_id: Optional[int] = None # Opcional por ser FK e poder ser nulo
tipo_permissao_cpf: str # Varchar(1)
requer_abonador: str # Varchar(1)
requer_representante: str # Varchar(1)
situacao: str # Varchar(1)
requer_cpf: str # Varchar(1)
servico_padrao: str # Varchar(1)
maximo_pessoa: int # Numeric(10,2)
alterar_valor: str # Varchar(1)
servico_caixa_id: Optional[int] = None # Opcional por ser FK e poder ser nulo
lancar_taxa: str # Varchar(1)
lancar_fundesp: str # Varchar(1)
liberar_desconto: str # Varchar(1)
fundesp_automatica: str # Varchar(1)
lancar_valor_documento: str # Varchar(1)
valor_fixo: str # Varchar(1)
emolumento_id: Optional[int] = None # Opcional por ser FK e poder ser nulo
ato_praticado: str # Varchar(1)
selar: str # Varchar(1)
frenteverso: str # Varchar(1)
pagina_acrescida: str # Varchar(1)
emolumento_obrigatorio: Decimal # Numeric(10,2)
apresentante_selo: str # Varchar(1)
renovacao_cartao: str # Varchar(1)
etiqueta_unica: str # Varchar(1)
transferencia_veiculo: str # Varchar(1)
usar_a4: str # Varchar(1)
averbacao: str # Varchar(1)
descricao: str # Obrigatório
valor: Optional[float] = None # Numeric(14,3)
tipo_item: Optional[str] = None # Varchar(1)
requer_autorizacao: Optional[str] = None
requer_biometria: Optional[str] = None
tipo_pessoa: Optional[str] = None
tb_reconhecimentotipo_id: Optional[int] = None
tipo_permissao_cpf: Optional[str] = None
requer_abonador: Optional[str] = None
requer_representante: Optional[str] = None
situacao: Optional[str] = None
requer_cpf: Optional[str] = None
servico_padrao: Optional[str] = None
maximo_pessoa: Optional[int] = None
alterar_valor: Optional[str] = None
servico_caixa_id: Optional[int] = None
lancar_taxa: Optional[str] = None
lancar_fundesp: Optional[str] = None
liberar_desconto: Optional[str] = None
fundesp_automatica: Optional[str] = None
lancar_valor_documento: Optional[str] = None
valor_fixo: Optional[str] = None
emolumento_id: Optional[int] = None
ato_praticado: Optional[str] = None
selar: Optional[str] = None
frenteverso: Optional[str] = None
pagina_acrescida: Optional[str] = None
emolumento_obrigatorio: Optional[Decimal] = None
apresentante_selo: Optional[str] = None
renovacao_cartao: Optional[str] = None
etiqueta_unica: Optional[str] = None
transferencia_veiculo: Optional[str] = None
usar_a4: Optional[str] = None
averbacao: Optional[str] = None
# Campos que devem ser sanitizados (strings)
# Sanitização dos campos string (para prevenir XSS e entradas inválidas)
@field_validator(
'descricao', 'tipo_item', 'requer_autorizacao', 'requer_biometria',
'tipo_pessoa', 'tipo_permissao_cpf', 'requer_abonador', 'requer_representante',
'situacao', 'requer_cpf', 'servico_padrao', 'alterar_valor', 'lancar_taxa',
'lancar_fundesp', 'liberar_desconto', 'fundesp_automatica',
'lancar_valor_documento', 'valor_fixo', 'ato_praticado', 'selar',
'frenteverso', 'pagina_acrescida', 'apresentante_selo', 'renovacao_cartao',
'descricao', 'tipo_item', 'requer_autorizacao', 'requer_biometria',
'tipo_pessoa', 'tipo_permissao_cpf', 'requer_abonador', 'requer_representante',
'situacao', 'requer_cpf', 'servico_padrao', 'alterar_valor', 'lancar_taxa',
'lancar_fundesp', 'liberar_desconto', 'fundesp_automatica',
'lancar_valor_documento', 'valor_fixo', 'ato_praticado', 'selar',
'frenteverso', 'pagina_acrescida', 'apresentante_selo', 'renovacao_cartao',
'etiqueta_unica', 'transferencia_veiculo', 'usar_a4', 'averbacao'
)
def sanitize_fields(cls, v):
if isinstance(v, str) and v:
return Text.sanitize_input(v)
return v
# Verifica se os campos obrigatórios foram enviados (baseado no TServicoTipoSaveSchema original e na lógica da DDL)
# Validação de obrigatoriedade apenas para o campo 'descricao'
@model_validator(mode='after')
def validate_all_fields(self):
errors = []
# Consideraremos 'descricao', 'valor', 'situacao' e todos os VARCHAR(1) como obrigatórios,
# seguindo o padrão do TCensecSaveSchema e campos que fazem sentido como requeridos em um POST.
required_fields = {
'descricao': 'A descrição é obrigatória.',
'valor': 'O valor é obrigatório.',
'tipo_item': 'O Tipo do Item é obrigatório.',
'requer_autorizacao': 'O Requer Autorização é obrigatório.',
'requer_biometria': 'O Requer Biometria é obrigatório.',
'tipo_pessoa': 'O Tipo Pessoa é obrigatório.',
'tipo_permissao_cpf': 'O Tipo Permissão CPF é obrigatório.',
'requer_abonador': 'O Requer Abonador é obrigatório.',
'requer_representante': 'O Requer Representante é obrigatório.',
'situacao': 'A situação é obrigatória.',
'requer_cpf': 'O Requer CPF é obrigatório.',
'servico_padrao': 'O Serviço Padrão é obrigatório.',
'maximo_pessoa': 'O Máximo Pessoa é obrigatório.',
'alterar_valor': 'O Alterar Valor é obrigatório.',
'lancar_taxa': 'O Lançar Taxa é obrigatório.',
'lancar_fundesp': 'O Lançar FUNDESP é obrigatório.',
'liberar_desconto': 'O Liberar Desconto é obrigatório.',
'fundesp_automatica': 'O FUNDESP Automática é obrigatório.',
'lancar_valor_documento': 'O Lançar Valor Documento é obrigatório.',
'valor_fixo': 'O Valor Fixo é obrigatório.',
'ato_praticado': 'O Ato Praticado é obrigatório.',
'selar': 'O Selar é obrigatório.',
'frenteverso': 'O FrenteVerso é obrigatório.',
'pagina_acrescida': 'A Página Acrescida é obrigatória.',
'emolumento_obrigatorio': 'O Emolumento Obrigatório é obrigatório.',
'apresentante_selo': 'O Apresentante Selo é obrigatório.',
'renovacao_cartao': 'A Renovação Cartão é obrigatória.',
'etiqueta_unica': 'A Etiqueta Única é obrigatória.',
'transferencia_veiculo': 'A Transferência Veículo é obrigatória.',
'usar_a4': 'O Usar A4 é obrigatório.',
'averbacao': 'A Averbação é obrigatória.',
}
for field_name, message in required_fields.items():
field_value = getattr(self, field_name, None)
if field_value is None:
errors.append({'input': field_name, 'message': message})
elif isinstance(field_value, str) and len(field_value.strip()) == 0:
errors.append({'input': field_name, 'message': message})
if errors:
def validate_required_fields(self):
if not self.descricao or not self.descricao.strip():
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail=errors
detail=[{'input': 'descricao', 'message': 'A descrição é obrigatória.'}]
)
return self
# ----------------------------------------------------
# Schema para atualizar SERVICO (PUT)
# ----------------------------------------------------