diff --git a/packages/v1/administrativo/schemas/t_servico_tipo_schema.py b/packages/v1/administrativo/schemas/t_servico_tipo_schema.py index 474a401..a866e38 100644 --- a/packages/v1/administrativo/schemas/t_servico_tipo_schema.py +++ b/packages/v1/administrativo/schemas/t_servico_tipo_schema.py @@ -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) # ----------------------------------------------------