Compare commits

..

37 commits

Author SHA1 Message Date
Keven
2ce6843178 Merge branch 'main' of https://git.oriustecnologia.com/OriusTecnologia/saas_api 2025-12-26 15:51:33 -03:00
Keven
1e34ce9e9a feat(OnlyOffice): Ajustes diversos no editor de texto 2025-12-26 15:51:31 -03:00
d2954b6691 Debug 2025-12-23 11:46:37 -03:00
70b7757b5a Debug 2025-12-23 11:35:32 -03:00
ee4e4e77cd Debug 2025-12-23 11:27:27 -03:00
Keven
6ccf74e687 fix(0933): Ajuste do dockerfile 2025-12-23 09:33:31 -03:00
Keven
bd8f433846 fix(0929): Ajuste do dockerfile 2025-12-23 09:29:51 -03:00
Keven
007c0fb6a5 fix(0920): Ajuste do dockerfile 2025-12-23 09:20:56 -03:00
Keven
26f94c66ae fix(0919): Ajuste do dockerfile 2025-12-23 09:19:39 -03:00
Keven
a62ffde0de fix(requirements): Ajuste do freeze 2025-12-23 09:10:26 -03:00
Keven
a6c88e5056 feat(Certidao): Adiciona recursos para manipular certidões 2025-12-22 18:03:46 -03:00
Keven
433d889060 feat(ServiceFactory): Criação de importação de classes de forma dinâmica mais otimizada 2025-12-17 09:56:19 -03:00
Keven
2223db9d75 feat(TAto): Implementação inicial da listagem dos dados 2025-12-17 09:38:14 -03:00
Keven
9b784f8d1a feat(): Ajustes nos detalhes do pedido de Balcão 2025-12-16 15:06:47 -03:00
Keven
25d904b0bb 1610 2025-12-09 16:10:46 -03:00
Keven
c9c0741ecc deploy(Dockerfile): Ajusta o dockerfile para deploy 2025-12-09 09:46:37 -03:00
Keven
910f08b0a6 deploy(Dockerfile): Ajusta o dockerfile para deploy 2025-12-09 09:43:21 -03:00
Keven
8d444c968e deploy(Dockerfile): Ajusta o dockerfile para deploy 2025-12-09 09:40:36 -03:00
Keven
ea1c830010 fix(TServicoPEdido): Ajustes diversos 2025-12-08 17:40:56 -03:00
Keven
3b1654bf2c fix(Ruff): Ajuste automático do código 2025-12-08 16:35:00 -03:00
Keven
09948e158c feat(Env): Ajusta a conexão do firebird para variavel de ambiente - 15:40 2025-12-08 15:40:40 -03:00
Keven
5d5e8eb755 feat(Env): Ajusta a conexão do firebird para variavel de ambiente - 15:36 2025-12-08 15:36:59 -03:00
Keven
c7cfb05b4d feat(Env): Ajusta a conexão do firebird para variavel de ambiente 2025-12-08 15:30:23 -03:00
Keven
9970c3700f feat(Env): Ajusta a conexão do firebird para variavel de ambiente 2025-12-08 15:23:34 -03:00
Keven
e62cb2ab5c fix(Config): Ajusta o caminho do condig 2025-12-08 14:47:32 -03:00
Keven
698aa5633f fix(Config): Ajusta o caminho do condig 2025-12-08 14:46:26 -03:00
Keven
f539ac266c fix(Config): Ajusta o caminho do condig 2025-12-08 14:33:46 -03:00
Keven
32f18d1f33 fix(Config): Ajusta o caminho do condig 2025-12-08 14:26:58 -03:00
Keven
83f14cd442 12:56 2025-12-08 12:56:47 -03:00
Keven
b5505d1162 12:50 2025-12-08 12:51:01 -03:00
Keven
6bb4c10eb0 deploy(Dockerfile): Ajusta o dockerfile para produção 2025-12-08 12:47:53 -03:00
Keven
205a20b3ce deploy(Dockerfile): Ajusta o dockerfile para produção 2025-12-08 12:37:27 -03:00
Keven
6673e778af deploy(Dockerfile): Ajusta o dockerfile para produção 2025-12-08 12:10:01 -03:00
Keven
ffdda4f022 fix(Deploy): Ajustes diversos para deploy 2025-12-08 12:03:56 -03:00
Keven
c315185cd5 docs(Readme): Adiciona configurações de servidor em produção 2025-12-08 10:51:08 -03:00
Keven
8258ee97c3 Merge branch 'release(MVP/Sprint11)' 2025-12-08 10:44:44 -03:00
Keven
98a2087136 Merge remote-tracking branch 'origin/DSAAS-18' into release(DSAAS) 2025-12-08 10:41:52 -03:00
120 changed files with 1667 additions and 377 deletions

View file

@ -1,13 +1,9 @@
# Usa a imagem oficial do Python
FROM python:3.12-slim
# Define diretório de trabalho no container
WORKDIR /app
# Copia o arquivo de dependências
COPY requirements.txt .
# Instala dependências no sistema e no Python
RUN apt-get update && apt-get install -y \
gcc libffi-dev libssl-dev python3-dev firebird-dev \
&& pip install --upgrade pip \
@ -16,11 +12,13 @@ RUN apt-get update && apt-get install -y \
&& apt-get autoremove -y \
&& rm -rf /var/lib/apt/lists/*
# Copia o restante do projeto para o container
# ===============================
# CRIA DIRETÓRIOS NECESSÁRIOS
# ===============================
RUN mkdir -p storage/temp
COPY . .
# Expõe a porta padrão do Uvicorn/FastAPI
EXPOSE 8000
# Comando para iniciar o servidor
CMD ["sh", "-c", "uvicorn main:app --host 0.0.0.0 --port 8000"]
CMD ["gunicorn", "main:app", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:8000"]

219
README.md
View file

@ -1,12 +1,12 @@
# Configuração do Projeto Python
Este guia descreve o passo a passo para configurar o ambiente de desenvolvimento de um projeto Python, incluindo a preparação do ambiente virtual, instalação de dependências e configuração do banco de dados.
Este guia descreve o passo a passo para configurar o ambiente de desenvolvimento e produção de um projeto Python, incluindo ambiente virtual, dependências, banco de dados, e ajuste de desempenho com múltiplos núcleos.
---
## 1. Clonar o Projeto
Primeiro, clone o repositório do projeto a partir do Git:
Clone o repositório do projeto a partir do Git:
```bash
git clone https://git.oriustecnologia.com/OriusTecnologia/saas_api.git
@ -16,7 +16,7 @@ git clone https://git.oriustecnologia.com/OriusTecnologia/saas_api.git
## 2. Criar o Ambiente Virtual
O uso de um **ambiente virtual** garante que as bibliotecas instaladas para este projeto não afetem o Python global da sua máquina.
Crie um **ambiente virtual** isolado para o projeto:
```bash
python -m venv venv
@ -26,14 +26,13 @@ python -m venv venv
## 3. Ativar o Ambiente Virtual
Ative o ambiente virtual antes de instalar as dependências ou executar a aplicação.
Ative o ambiente virtual antes de instalar as dependências:
```bash
venv\Scripts\activate
```
> **Observação:**
> Em sistemas Unix (Linux/Mac), o comando pode ser:
> **Em sistemas Linux/Mac:**
>
> ```bash
> source venv/bin/activate
@ -43,9 +42,11 @@ venv\Scripts\activate
## 4. Instalar Dependências do Sistema
A biblioteca de criptografia utilizada no projeto requer uma extensão da Microsoft para ser instalada.
Baixe e instale o **Microsoft C++ Build Tools** através do link abaixo:
O projeto depende de compiladores nativos para algumas bibliotecas Python.
### Windows
Baixe e instale o **Microsoft C++ Build Tools**:
[https://visualstudio.microsoft.com/pt-br/visual-cpp-build-tools/](https://visualstudio.microsoft.com/pt-br/visual-cpp-build-tools/)
Durante a instalação, selecione o pacote:
@ -54,6 +55,15 @@ Durante a instalação, selecione o pacote:
Desktop Development With C++
```
### Linux
Execute no terminal:
```bash
sudo apt update
sudo apt install -y build-essential libpq-dev
```
---
## 5. Instalar as Bibliotecas do Projeto
@ -66,21 +76,21 @@ pip install -r requirements.txt
---
## 6. Configurar o Banco de Dados
## 6. Configurar o Banco de Dados (Firebird)
O projeto utiliza um banco **Firebird**.
Edite o arquivo de configuração localizado em:
O projeto utiliza o banco **Firebird**.
Edite o arquivo de configuração em:
```
api/config/database/firebird.json
```
Exemplo do conteúdo padrão:
Exemplo:
```json
{
"host": "localhost",
"name": "D:/Orius/Base/CAIAPONIA.FDB",
"name": "/data/base/CAIAPONIA.FDB",
"port": 3050,
"user": "SYSDBA",
"password": "",
@ -93,50 +103,179 @@ Exemplo do conteúdo padrão:
}
```
### Ajustes Necessários:
**Campos principais:**
* **host**: Endereço do servidor do banco de dados.
* **name**: Caminho completo do arquivo `.FDB`.
* **port**: Porta do Firebird (padrão: `3050`).
* **user**: Usuário do banco de dados.
* **password**: Senha do usuário configurado.
| Campo | Descrição |
| ------------------- | ---------------------------------- |
| `host` | Endereço do servidor Firebird |
| `name` | Caminho completo do arquivo `.FDB` |
| `port` | Porta padrão `3050` |
| `user` | Usuário do banco |
| `password` | Senha do usuário |
| `charset` | Codificação (UTF8 recomendado) |
| `pool.size` | Número de conexões fixas |
| `pool.max_overflow` | Conexões extras sob demanda |
---
## 7. Iniciar a Aplicação
## 7. Modo Desenvolvimento
Com o ambiente virtual **ativado**, execute o comando abaixo para iniciar a aplicação:
Para ambiente local, execute:
```bash
uvicorn main:app --reload
```
> **Dica:**
> O parâmetro `--reload` reinicia automaticamente a aplicação sempre que houver alterações no código.
> O parâmetro `--reload` reinicia automaticamente a aplicação ao detectar alterações no código.
---
Acesse:
## 8. Testando a Aplicação
Após iniciar a aplicação, abra o navegador e acesse o seguinte endereço:
```http
```
http://localhost:8000/docs
```
Você deverá visualizar a interface do **Swagger**, onde estarão listados todos os endpoints disponíveis da API.
---
> **Observação:**
> O Swagger permite testar os endpoints diretamente pelo navegador, sem necessidade de ferramentas externas como Postman ou Insomnia.
## 8. Modo Produção
A execução em produção varia conforme o sistema operacional.
---
## Resumo dos Comandos
### **Windows (modo produção simulado)**
| Etapa | Comando |
| ----------------------- | ------------------------------------------------------------------------------- |
| Clonar o projeto | `git clone https://git.oriustecnologia.com/OriusTecnologia/saas_api.git` |
| Criar ambiente virtual | `python -m venv venv` |
| Ativar ambiente virtual | `venv\Scripts\activate` *(Windows)*<br>`source venv/bin/activate` *(Linux/Mac)* |
| Instalar dependências | `pip install -r requirements.txt` |
| Iniciar a aplicação | `uvicorn main:app --reload` |
O **Gunicorn** não é compatível com Windows, pois depende do módulo `fcntl` exclusivo de sistemas Unix.
Portanto, em ambiente Windows, recomenda-se usar o **Uvicorn** diretamente com múltiplos *workers*:
```bash
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
```
> O parâmetro `--workers` define quantos processos simultâneos serão utilizados.
> Idealmente, use `(número_de_CPUs * 2) + 1`.
#### Alternativa compatível (Windows)
Instale e use o **Hypercorn**, uma alternativa semelhante ao Gunicorn:
```bash
pip install hypercorn
hypercorn main:app --workers 4 --bind 0.0.0.0:8000
```
---
### **Linux (modo produção real)**
Em ambientes Linux (ou Docker), utilize o **Gunicorn** com o **Uvicorn Worker** para obter o máximo desempenho.
#### Instalar Gunicorn (caso ainda não instalado)
```bash
pip install gunicorn uvicorn
```
#### Executar com múltiplos núcleos
```bash
gunicorn main:app \
-k uvicorn.workers.UvicornWorker \
--workers 4 \
--bind 0.0.0.0:8000 \
--timeout 120 \
--log-level info
```
#### Parâmetros principais
| Parâmetro | Função |
| ---------------------------------- | ---------------------------------------- |
| `-k uvicorn.workers.UvicornWorker` | Usa o Uvicorn como worker ASGI |
| `--workers 4` | Define o número de núcleos usados |
| `--bind 0.0.0.0:8000` | Expõe a aplicação em todas as interfaces |
| `--timeout 120` | Tempo limite de resposta (em segundos) |
| `--log-level info` | Define o nível de logs |
#### Dica de cálculo de workers
```
(número_de_CPUs * 2) + 1
```
Exemplo: servidor com 2 CPUs → `--workers 5`
---
### **Execução em segundo plano (Linux)**
Para rodar a aplicação continuamente:
```bash
nohup gunicorn main:app -k uvicorn.workers.UvicornWorker --workers 4 --bind 0.0.0.0:8000 &
```
Verifique se está rodando:
```bash
ps aux | grep gunicorn
```
---
## 9. Logs e Monitoramento
É possível direcionar os logs de acesso e erro para arquivos dedicados:
```bash
gunicorn main:app \
-k uvicorn.workers.UvicornWorker \
--workers 4 \
--bind 0.0.0.0:8000 \
--access-logfile logs/access.log \
--error-logfile logs/error.log
```
---
## 10. Estrutura Recomendada de Deploy
```
/app
├── main.py
├── api/
├── packages/
├── requirements.txt
├── logs/
│ ├── access.log
│ └── error.log
└── systemd/
└── saas_api.service
```
---
## 11. Resumo dos Comandos
| Etapa | Comando |
| --------------------------- | ------------------------------------------------------------------------------------ |
| Clonar projeto | `git clone https://git.oriustecnologia.com/OriusTecnologia/saas_api.git` |
| Criar venv | `python -m venv venv` |
| Ativar venv | `venv\Scripts\activate` *(Windows)*<br>`source venv/bin/activate` *(Linux/Mac)* |
| Instalar dependências | `pip install -r requirements.txt` |
| Rodar em desenvolvimento | `uvicorn main:app --reload` |
| Rodar em produção (Windows) | `uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4` |
| Rodar em produção (Linux) | `gunicorn main:app -k uvicorn.workers.UvicornWorker --workers 4 --bind 0.0.0.0:8000` |
| Alternativa (Windows) | `hypercorn main:app --workers 4 --bind 0.0.0.0:8000` |
---
## 12. Recomendações Finais
* Em **Windows**, use Uvicorn ou Hypercorn apenas para testes e ambientes locais.
* Para **produção real**, use **Linux** com Gunicorn + Uvicorn Worker, idealmente em container **Docker**.
* Monitore o consumo de CPU/RAM e ajuste o número de *workers* conforme o ambiente.
* Automatize o serviço em produção via **systemd** (ex: `/etc/systemd/system/saas_api.service`) para iniciar junto com o servidor.
---
uvicorn main:app --host 0.0.0.0 --port 8000 --reload

View file

@ -1,4 +1,4 @@
from abc import ABC, abstractmethod
from abc import abstractmethod
class BaseAction:

View file

@ -11,10 +11,10 @@ class Config:
base_dir = Path(__file__).resolve().parent
# Caminho absoluto para o config.json (subindo dois níveis e entrando em config/)
config_path = base_dir.parent.parent / 'config' / name
config_path = base_dir.parent.parent / "config" / name
# Carrega o JSON como objeto acessível por ponto
with open(config_path, 'r') as f:
with open(config_path, "r") as f:
config = json.load(f, object_hook=lambda d: SimpleNamespace(**d))
return config
return config

31
actions/data/microtime.py Normal file
View file

@ -0,0 +1,31 @@
import time
class Microtime:
"""
Utilitário para manipulação de tempo com alta precisão (microssegundos).
"""
@staticmethod
def get() -> float:
"""
Retorna o timestamp Unix atual com precisão de microssegundos.
Equivalente ao microtime(true) do PHP.
"""
return time.time()
@staticmethod
def as_int() -> int:
"""
Retorna o tempo atual puramente em microssegundos (Inteiro).
Útil para gerar IDs únicos ou ordenação precisa.
"""
# Pega em nanosegundos e converte para microssegundos
return time.time_ns() // 1000
@staticmethod
def diff(start_time: float) -> float:
"""
Calcula a diferença (duração) em segundos com precisão.
"""
return time.time() - start_time

111
actions/data/text.py Normal file
View file

@ -0,0 +1,111 @@
# Importa a biblioteca nativa 'zlib' usada para compressão/descompressão de dados binários.
import zlib
# Importa a função 'rtf_to_text' da biblioteca 'striprtf',
# responsável por converter documentos RTF em texto plano legível.
from striprtf.striprtf import rtf_to_text
# Define uma classe utilitária chamada 'Text', contendo apenas métodos estáticos.
# Essa abordagem permite o uso direto sem necessidade de instanciar a classe.
class Text:
@staticmethod
def decompress(vf_string):
"""
Descomprime e decodifica texto de origem WPTools/Firebird.
Finalidade:
Converter o conteúdo de campos BLOB ou strings compactadas (como no Delphi)
em texto legível, detectando automaticamente se o conteúdo está:
- Compactado com zlib
- Codificado em ISO-8859-1 (padrão ANSI)
- Representado como bytes puros
"""
# Verifica se o valor recebido é nulo, vazio ou None.
if not vf_string:
return ""
# Caso seja um objeto tipo stream (ex: campo BLOB do Firebird)
if hasattr(vf_string, "read"):
vf_string = vf_string.read()
# Garante que o valor trabalhado é uma sequência de bytes
if isinstance(vf_string, str):
vf_bytes = vf_string.encode("latin1", errors="ignore")
else:
vf_bytes = vf_string
# Detecta assinatura zlib (0x78 0x9C ou 0x78 0xDA)
is_zlib = (
len(vf_bytes) > 2 and vf_bytes[0] == 0x78 and vf_bytes[1] in (0x9C, 0xDA)
)
# Se for zlib, tenta descompactar
if is_zlib:
try:
return zlib.decompress(vf_bytes).decode("iso-8859-1", errors="ignore")
except Exception:
pass
# Caso não seja zlib, trata como texto puro
try:
return vf_bytes.decode("iso-8859-1", errors="ignore")
except Exception:
return str(vf_string)
@staticmethod
def compress(text, *, encoding: str = "iso-8859-1"):
"""
Comprime texto/dados com zlib SEM Base64.
Parâmetros:
text: str | bytes | stream (com .read())
encoding: encoding usado quando 'text' for str (padrão: ISO-8859-1)
Retorno:
- bytes comprimidos (zlib)
Observações:
- Ideal para armazenamento direto em BLOB (Firebird, PostgreSQL, etc.)
- Evita overhead e custo do Base64
- Totalmente compatível com 'decompress'
"""
if text is None or text == "":
return b""
# Se for stream (ex.: BLOB do Firebird)
if hasattr(text, "read"):
raw = text.read()
else:
raw = text
# Garante bytes
if isinstance(raw, str):
raw_bytes = raw.encode(encoding, errors="ignore")
else:
raw_bytes = bytes(raw)
# Comprime com zlib e retorna bytes
return zlib.compress(raw_bytes)
@staticmethod
def to_text(raw_text: str) -> str:
"""
Converte o conteúdo RTF em texto simples e retorna como string.
Finalidade:
- Detectar automaticamente se o conteúdo está em formato RTF.
- Converter para texto plano usando a função 'rtf_to_text'.
- Retornar uma string limpa e pronta para uso.
"""
if not raw_text:
return ""
# Detecta cabeçalho RTF
if raw_text.strip().startswith("{\\rtf"):
try:
return rtf_to_text(raw_text).strip()
except Exception:
return raw_text
return raw_text.strip()

View file

@ -0,0 +1,64 @@
import importlib
import re
from functools import lru_cache
from typing import Type, TypeVar, Optional
from actions.config.config import Config
from actions.env.env_config_loader import EnvConfigLoader
# Genérico para garantir que o retorno respeite o Protocolo
T = TypeVar("T")
class ServiceFactory:
def __init__(self, package: str, table: str):
# Instancia o loader com o prefixo correto
env = EnvConfigLoader(".env")
# Ex: "packages.v1"
self.base_root = "packages.v1"
self.package = package
self.table = table
# Carrega config apenas uma vez
self.app_config = Config.get("app.json")
# Define a UF da aplicação
self.current_state = env.ORIUS_CLIENT_STATE
@lru_cache(maxsize=32)
def make(self, class_name: str, interface: Type[T]) -> T:
"""
Instancia um serviço dinamicamente com comportamento de Autoload.
"""
# 1. Converte CamelCase para snake_case (Autoload style)
# Ex: TAtoIndexService -> t_ato_index_service
module_name = re.sub(r"(?<!^)(?=[A-Z])", "_", class_name).lower()
# 2. Monta o caminho completo
# Ex: packages.v1.servicos.balcao.services.t_ato.SP.t_ato_index_service
import_path = (
f"{self.base_root}.{self.package}.services."
f"{self.table}.{self.current_state}.{module_name}"
)
try:
# 3. Importação Dinâmica
module = importlib.import_module(import_path)
# 4. Pega a classe do módulo
clazz = getattr(module, class_name)
# 5. Retorna a INSTÂNCIA da classe (já com () )
# Se seus serviços precisam de argumentos no __init__, altere aqui.
return clazz()
except ImportError as e:
raise ImportError(
f"FATAL: Não foi possível carregar o serviço '{class_name}' para o estado '{self.current_state}'.\nCaminho tentado: {import_path}\nErro: {e}"
)
except AttributeError:
raise AttributeError(
f"FATAL: O arquivo '{module_name}.py' existe, mas a classe '{class_name}' não foi encontrada dentro dele."
)

36
actions/env/env_config_loader.py vendored Normal file
View file

@ -0,0 +1,36 @@
from dotenv import dotenv_values, load_dotenv
import os
class EnvConfigLoader:
"""
Classe para carregar todas as variáveis de ambiente (.env)
e permitir acesso via atributo (settings.VAR).
"""
def __init__(self, env_file: str = ".env"):
# Garante que o .env será carregado no ambiente do sistema
load_dotenv(env_file)
# Lê todas as variáveis (do arquivo + sistema)
self._values = {
**dotenv_values(env_file), # Conteúdo do .env
**os.environ, # Variáveis já existentes no ambiente
}
def __getattr__(self, name: str):
"""Permite acessar como settings.VAR"""
# Normaliza o nome para maiúsculo
key = name.upper()
if key in self._values:
return self._values[key]
raise AttributeError(f"A variável '{name}' não existe no .env")
def __repr__(self):
"""Exibe todas as variáveis carregadas"""
return f"<Settings {self._values}>"
def all(self) -> dict:
"""Retorna todas as variáveis como dicionário"""
return dict(self._values)

View file

@ -5,32 +5,30 @@ from pytz import timezone
from abstracts.action import BaseAction
from actions.config.config import Config
class CreateToken(BaseAction):
def __init__(self):
# Busca as configurações da aplicação
self.config = Config.get('app.json')
self.config = Config.get("app.json")
# Cria o timedelta com base na config
self.access_token_expire = timedelta(
minutes=self.config.jwt.expire.minute,
hours=self.config.jwt.expire.hours,
days=self.config.jwt.expire.days
days=self.config.jwt.expire.days,
)
def execute(self, tipo_token: str, data : str) -> str:
sp = timezone('America/Sao_Paulo')
def execute(self, tipo_token: str, data: str) -> str:
sp = timezone("America/Sao_Paulo")
agora = datetime.now(tz=sp)
expira = agora + self.access_token_expire
# Define os dados do token
payload = {
'type' : tipo_token,
'exp' : expira,
'iat' : agora,
'data' : str(data)
}
payload = {"type": tipo_token, "exp": expira, "iat": agora, "data": str(data)}
# Retorna os dados codificados
return jwt.encode(payload, self.config.jwt.token, algorithm=self.config.jwt.algorithm)
return jwt.encode(
payload, self.config.jwt.token, algorithm=self.config.jwt.algorithm
)

View file

@ -1,4 +1,4 @@
from fastapi import Depends, HTTPException, status, Request
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from actions.jwt.verify_token import VerifyToken # A classe que criamos anteriormente

View file

@ -1,6 +1,4 @@
from datetime import datetime
from jose import jwt, JWTError, ExpiredSignatureError
from pytz import timezone
from actions.config.config import Config

View file

@ -1,5 +1,4 @@
from typing import Any, Optional
from fastapi import Depends, Request, HTTPException, status
from fastapi import Request, HTTPException, status
def get_session_user(request: Request) -> dict:

View file

@ -1,5 +1,4 @@
# handlers.py
import json
import traceback
from fastapi import Request
@ -13,74 +12,58 @@ from actions.log.log import Log
def register_exception_handlers(app):
def __init__ (self):
def __init__(self):
log = Log()
@app.exception_handler(BusinessRuleException)
async def business_rule_exception_handler(request: Request, exc: BusinessRuleException):
async def business_rule_exception_handler(
request: Request, exc: BusinessRuleException
):
response = {"status": "422", "error": "Regra de negócio", "detail": exc.message}
response = {
"status": "422",
"error": "Regra de negócio",
"detail": exc.message
}
# Salva o log em disco
Log.register(response, 'storage/temp/business_rule_exception_handler.json')
Log.register(response, "storage/temp/business_rule_exception_handler.json")
return JSONResponse(
status_code=422,
content=response
)
return JSONResponse(status_code=422, content=response)
@app.exception_handler(StarletteHTTPException)
async def http_exception_handler(request: Request, exc: StarletteHTTPException):
response = {
"status": exc.status_code,
"error": "HTTP Error",
"detail": exc.detail
}
"status": exc.status_code,
"error": "HTTP Error",
"detail": exc.detail,
}
# Salva o log em disco
Log.register(response, 'storage/temp/http_exception_handler.json')
Log.register(response, "storage/temp/http_exception_handler.json")
return JSONResponse(
status_code=exc.status_code,
content=response
)
return JSONResponse(status_code=exc.status_code, content=response)
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
async def validation_exception_handler(
request: Request, exc: RequestValidationError
):
response = {
"status": 400,
"error": "Erro de validação",
"detail": exc.errors()
}
response = {"status": 400, "error": "Erro de validação", "detail": exc.errors()}
# Salva o log em disco
Log.register(response, 'storage/temp/validation_exception_handler.json')
Log.register(response, "storage/temp/validation_exception_handler.json")
return JSONResponse(
status_code=400,
content=response
)
return JSONResponse(status_code=400, content=response)
@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):
response = {
"status": 500,
"error": "Erro Interno do Servidor",
"type": type(exc).__name__,
"message": str(exc),
"trace": traceback.format_exc()
}
"status": 500,
"error": "Erro Interno do Servidor",
"type": type(exc).__name__,
"message": str(exc),
"trace": traceback.format_exc(),
}
# Salva o log em disco
Log.register(response, 'storage/temp/validation_exception_handler.json')
Log.register(response, "storage/temp/validation_exception_handler.json")
return JSONResponse(
status_code=500,
content=response
)
return JSONResponse(status_code=500, content=response)

View file

@ -0,0 +1,13 @@
{
"host": "localhost",
"name": "/database/BASE.FDB",
"port": 3050,
"user": "SYSDBA",
"password": "302b3c",
"charset": "UTF8",
"pool" : {
"pre_ping" : true,
"size" : 5,
"max_overflow" :10
}
}

View file

@ -1,8 +1,7 @@
from typing import Optional
from sqlalchemy import create_engine
from sqlalchemy.engine import Engine
from actions.config.config import Config
from actions.env.env_config_loader import EnvConfigLoader
class Firebird:
@ -10,28 +9,29 @@ class Firebird:
@classmethod
def get_engine(cls) -> Engine:
# Obtem as configurações do arquivo JSON
database = Config.get('database/firebird.json')
# Instancia o loader com o prefixo correto
env_database = EnvConfigLoader(".env")
# Cria a engine apenas uma vez
if cls._engine is None:
# DSN para o SQLAlchemy usando firebird-driver
dsn = (
f"firebird+firebird://{database.user}:"
f"{database.password}@"
f"{database.host}:"
f"{database.port}/"
f"{database.name}"
f"firebird+firebird://{env_database.ORIUS_API_FDB_USER}:"
f"{env_database.ORIUS_API_FDB_PASSWORD}@"
f"{env_database.ORIUS_API_FDB_HOST}:"
f"{env_database.ORIUS_API_FDB_PORT}/"
f"{env_database.ORIUS_API_FDB_NAME}"
)
# Criação da engine SQLAlchemy
cls._engine = create_engine(
dsn,
connect_args={"charset": database.charset},
pool_pre_ping=bool(database.pool.pre_ping),
pool_size=database.pool.size,
max_overflow=database.pool.max_overflow,
connect_args={"charset": env_database.ORIUS_API_FDB_CHARSET},
pool_pre_ping=bool(env_database.ORIUS_API_FDB_POOL_PRE_PING),
pool_size=int(env_database.ORIUS_API_FDB_POOL_SIZE),
max_overflow=int(env_database.ORIUS_API_FDB_POOL_MAX_OVERFLOW),
)
return cls._engine

17
env.bat Normal file
View file

@ -0,0 +1,17 @@
@echo off
echo === Registrando variáveis de ambiente ORIUS_API ===
setx ORIUS_API_FDB_HOST "localhost"
setx ORIUS_API_FDB_NAME "S:\Bases\SANTARITA.FDB"
setx ORIUS_API_FDB_PORT "3050"
setx ORIUS_API_FDB_USER "SYSDBA"
setx ORIUS_API_FDB_PASSWORD "302b3c"
setx ORIUS_API_FDB_CHARSET "UTF8"
setx ORIUS_API_FDB_POOL_PRE_PING "true"
setx ORIUS_API_FDB_POOL_SIZE "5"
setx ORIUS_API_FDB_POOL_MAX_OVERFLOW "10"
echo.
echo Variáveis ORIUS_API registradas com sucesso!
echo Reinicie o terminal ou o computador para aplicar as alterações.
pause

View file

@ -0,0 +1,10 @@
from typing import Protocol, Any, runtime_checkable
@runtime_checkable
class ServiceProtocolsInterface(Protocol):
"""
Contrato que garante que todo serviço tenha um método execute.
"""
def execute(self, schema: Any) -> Any: ...

13
main.py
View file

@ -16,8 +16,7 @@ from pathlib import Path
# Importa o middleware de CORS
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import Response
from starlette.middleware.base import BaseHTTPMiddleware
from fastapi.staticfiles import StaticFiles
# Importa o roteador principal da API versão 1
from packages.v1.api import api_router
@ -34,9 +33,9 @@ if platform.system() == "Windows":
FB_DIR = r"C:\Program Files\Firebird\Firebird_4_0"
os.add_dll_directory(FB_DIR)
driver_config.fb_client_library.value = (
r"C:\Program Files\Firebird\Firebird_4_0\fbclient.dll"
)
driver_config.fb_client_library.value = (
r"C:\Program Files\Firebird\Firebird_4_0\fbclient.dll"
)
config = Config.get("app.json")
@ -49,7 +48,7 @@ register_exception_handlers(app)
# Adiciona o middleware de CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"], # Domínio do frontend
allow_origins=["*"], # Domínio do frontend
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
@ -64,6 +63,8 @@ app.add_middleware(
max_age=60 * 60 * 8,
)
app.mount(path="/temp", app=StaticFiles(directory="./storage/temp"), name="temp")
@app.on_event("startup")
async def on_startup():

View file

@ -1,7 +1,5 @@
from packages.v1.administrativo.repositories.c_caixa_item.c_caixa_item_index import \
Index
from packages.v1.administrativo.schemas.c_caixa_item_schema import \
CaixaItemSearchSchema
from abstracts.action import BaseAction

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.c_caixa_servico_schema import (
CCaixaServicoSchema,
CCaixaServicoSaveSchema,
CCaixaServicoUpdateSchema,
CCaixaServicoIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.g_cidade_schema import (
GCidadeSchema,
GCidadeSaveSchema,
GCidadeUpdateSchema,
GCidadeIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.g_emolumento_schema import (
GEmolumentoIndexSchema,
GEmolumentoSaveSchema,
GEmolumentoSistemaIdSchema,
GEmolumentoUpdateSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.g_marcacao_tipo_schema import (
GMarcacaoTipoSchema,
GMarcacaoTipoSaveSchema,
GMarcacaoTipoUpdateSchema,
GMarcacaoTipoIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.g_medida_tipo_schema import (
GMedidaTipoSchema,
GMedidaTipoSaveSchema,
GMedidaTipoUpdateSchema,
GMedidaTipoIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.g_tb_bairro_schema import (
GTbBairroSchema,
GTbBairroSaveSchema,
GTbBairroUpdateSchema,
GTbBairroIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.g_tb_documentotipo_schema import (
GTbDocumentoTipoSchema,
GTbDocumentoTipoSaveSchema,
GTbDocumentoTipoUpdateSchema,
GTbDocumentoTipoIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.g_tb_estadocivil_schema import (
GTbEstadoCivilSchema,
GTbEstadoCivilSaveSchema,
GTbEstadoCivilUpdateSchema,
GTbEstadoCivilIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.g_tb_profissao_schema import (
GTbProfissaoSchema,
GTbProfissaoSaveSchema,
GTbProfissaoUpdateSchema,
GTbProfissaoIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.g_tb_regimebens_schema import (
GTbRegimebensSchema,
GTbRegimebensSaveSchema,
GTbRegimebensUpdateSchema,
GTbRegimebensIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.g_tb_regimecomunhao_schema import (
GTbRegimecomunhaoSchema,
GTbRegimecomunhaoSaveSchema,
GTbRegimecomunhaoUpdateSchema,
GTbRegimecomunhaoIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.g_tb_tipologradouro_schema import (
GTbTipoLogradouroSchema,
GTbTipoLogradouroSaveSchema,
GTbTipoLogradouroUpdateSchema,
GTbTipoLogradouroIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import (
GTbTxmodelogrupoSchema,
GTbTxmodelogrupoSaveSchema,
GTbTxmodelogrupoUpdateSchema,
GTbTxmodelogrupoIdSchema,

View file

@ -1,7 +1,4 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.g_uf_schema import (
GUfSchema
)
class GUfController:

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.t_ato_partetipo_schema import (
TAtoParteTipoIndexSchema,
TAtoParteTipoSaveSchema,
TAtoParteTipoUpdateSchema,
TAtoParteTipoIdSchema

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.t_censec_schema import (
TCensecSchema,
TCensecSaveSchema,
TCensecUpdateSchema,
TCensecIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.t_censec_naturezalitigio_schema import (
TCensecNaturezalitigioSchema,
TCensecNaturezalitigioSaveSchema,
TCensecNaturezalitigioUpdateSchema,
TCensecNaturezalitigioIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.t_censec_qualidade_schema import (
TCensecQualidadeSchema,
TCensecQualidadeSaveSchema,
TCensecQualidadeUpdateSchema,
TCensecQualidadeIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.t_minuta_schema import (
TMinutaSchema,
TMinutaSaveSchema,
TMinutaUpdateSchema,
TMinutaIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.t_servico_etiqueta_schema import (
TServicoEtiquetaSchema,
TServicoEtiquetaSaveSchema,
TServicoEtiquetaUpdateSchema,
TServicoEtiquetaIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.t_tb_andamentoservico_schema import (
TTbAndamentoservicoSchema,
TTbAndamentoservicoSaveSchema,
TTbAndamentoservicoUpdateSchema,
TTbAndamentoservicoIdSchema,

View file

@ -1,6 +1,5 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.administrativo.schemas.t_tb_reconhecimentotipo_schema import (
TTbReconhecimentotipoSchema,
TTbReconhecimentotipoSaveSchema,
TTbReconhecimentotipoUpdateSchema,
TTbReconhecimentotipoIdSchema,

View file

@ -1,9 +1,8 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.c_caixa_item_controller import CCaixaItemController
from packages.v1.administrativo.schemas.c_caixa_item_schema import CaixaItemSchema, CaixaItemSearchSchema
from packages.v1.administrativo.schemas.c_caixa_item_schema import CaixaItemSchema
# Inicializar o roteaodr para as rotas de produtos
router = APIRouter()

View file

@ -1,6 +1,5 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.c_caixa_servico_controller import CCaixaServicoController
from packages.v1.administrativo.schemas.c_caixa_servico_schema import (

View file

@ -7,7 +7,6 @@ from packages.v1.administrativo.controllers.g_calculo_controller import (
from packages.v1.administrativo.schemas.g_calculo_schema import (
GCalculoRapidoSchema,
GCalculoServico,
ResponseGCalculoRapidoSchema,
)
# ----------------------------------------------------

View file

@ -1,10 +1,8 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.g_cidade_controller import GCidadeController
from packages.v1.administrativo.schemas.g_cidade_schema import (
GCidadeSchema,
GCidadeSaveSchema,
GCidadeUpdateSchema,
GCidadeIdSchema,

View file

@ -6,7 +6,6 @@ from packages.v1.administrativo.controllers.g_emolumento_controller import (
GEmolumentoController,
)
from packages.v1.administrativo.schemas.g_emolumento_schema import (
GEmolumentoIndexSchema,
GEmolumentoSaveSchema,
GEmolumentoSistemaIdSchema,
GEmolumentoUpdateSchema,
@ -36,9 +35,6 @@ async def index(
current_user: dict = Depends(get_current_user),
url_params=Depends(get_url_params),
):
print(url_params)
"""
Retorna todos os registros da tabela G_EMOLUMENTO.
"""

View file

@ -1,6 +1,5 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.g_marcacao_tipo_controller import GMarcacaoTipoController
from packages.v1.administrativo.schemas.g_marcacao_tipo_schema import (

View file

@ -1,6 +1,5 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.g_medida_tipo_controller import GMedidaTipoController
from packages.v1.administrativo.schemas.g_medida_tipo_schema import (

View file

@ -1,6 +1,5 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.g_natureza_controller import GNaturezaController
from packages.v1.administrativo.schemas.g_natureza_schema import (

View file

@ -1,6 +1,5 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.g_tb_bairro_controller import GTbBairroController
from packages.v1.administrativo.schemas.g_tb_bairro_schema import (

View file

@ -1,6 +1,5 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.g_tb_documentotipo_controller import GTbDocumentoTipoController
from packages.v1.administrativo.schemas.g_tb_documentotipo_schema import (

View file

@ -1,6 +1,5 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.g_tb_estadocivil_controller import GTbEstadoCivilController
from packages.v1.administrativo.schemas.g_tb_estadocivil_schema import (

View file

@ -1,10 +1,8 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.g_tb_profissao_controller import GTbProfissaoController
from packages.v1.administrativo.schemas.g_tb_profissao_schema import (
GTbProfissaoSchema,
GTbProfissaoSaveSchema,
GTbProfissaoUpdateSchema,
GTbProfissaoIdSchema,

View file

@ -1,6 +1,5 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.g_tb_regimebens_controller import GTbRegimebensController
from packages.v1.administrativo.schemas.g_tb_regimebens_schema import (

View file

@ -1,10 +1,8 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.g_tb_regimecomunhao_controller import GTbRegimecomunhaoController
from packages.v1.administrativo.schemas.g_tb_regimecomunhao_schema import (
GTbRegimecomunhaoSchema,
GTbRegimecomunhaoSaveSchema,
GTbRegimecomunhaoUpdateSchema,
GTbRegimecomunhaoDescricaoSchema,

View file

@ -1,6 +1,5 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.g_tb_tipologradouro_controller import GTbTipologradouroController
from packages.v1.administrativo.schemas.g_tb_tipologradouro_schema import (

View file

@ -1,8 +1,6 @@
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import (
GTbTxmodelogrupoSchema,
GTbTxmodelogrupoSaveSchema,
GTbTxmodelogrupoUpdateSchema,
GTbTxmodelogrupoDescricaoSchema,

View file

@ -1,9 +1,7 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.g_uf_controller import GUfController
from packages.v1.administrativo.schemas.g_uf_schema import GUfSchema
# Inicializa o roteador para as rotas do tipo de reconhecimento
router = APIRouter()

View file

@ -1,6 +1,5 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.t_censec_controller import TCensecController
from packages.v1.administrativo.schemas.t_censec_schema import (

View file

@ -1,6 +1,5 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.t_censec_naturezalitigio_controller import TCensecNaturezalitigioController
from packages.v1.administrativo.schemas.t_censec_naturezalitigio_schema import (

View file

@ -1,14 +1,12 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.t_censec_qualidade_controller import TCensecQualidadeController
from packages.v1.administrativo.schemas.t_censec_qualidade_schema import (
TCensecQualidadeSchema,
TCensecQualidadeSaveSchema,
TCensecQualidadeUpdateSchema,
TCensecQualidadeIdSchema,
TCensecQualidadeDescricaoSchema
TCensecQualidadeIdSchema
)
# Inicializa o roteador para as rotas do tipo de reconhecimento

View file

@ -3,7 +3,6 @@ from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.t_censec_tipoato_controller import TCensecTipoAtoController
from packages.v1.administrativo.schemas.t_censec_tipoato_schema import (
TCensecTipoAtoIndexSchema,
TCensecTipoAtoSaveSchema,
TCensecTipoAtoUpdateSchema,
TCensecTipoAtoIdSchema

View file

@ -1,5 +1,4 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.t_imovel_controller import TImovelController

View file

@ -1,5 +1,4 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.t_imovel_unidade_controller import TImovelUnidadeController

View file

@ -1,14 +1,11 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.t_minuta_controller import TMinutaController
from packages.v1.administrativo.schemas.t_minuta_schema import (
TMinutaSchema,
TMinutaSaveSchema,
TMinutaUpdateSchema,
TMinutaIdSchema,
TMinutaDescricaoSchema
TMinutaIdSchema
)
# Inicializa o roteador para as rotas do tipo de reconhecimento

View file

@ -1,6 +1,5 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.t_servico_etiqueta_controller import TServicoEtiquetaController
from packages.v1.administrativo.schemas.t_servico_etiqueta_schema import (

View file

@ -1,6 +1,5 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.t_tb_andamentoservico_controller import TTbAndamentoservicoController
from packages.v1.administrativo.schemas.t_tb_andamentoservico_schema import (

View file

@ -1,6 +1,5 @@
# Importação de bibliotecas
from typing import Optional
from fastapi import APIRouter, Body, Depends, status
from fastapi import APIRouter, Depends, status
from actions.jwt.get_current_user import get_current_user
from packages.v1.administrativo.controllers.t_tb_reconhecimentotipo_controller import TTbReconhecimentotipoController
from packages.v1.administrativo.schemas.t_tb_reconhecimentotipo_schema import (

View file

@ -1,4 +1,3 @@
from packages.v1.administrativo.schemas.c_caixa_item_schema import CaixaItemSearchSchema
from abstracts.repository import BaseRepository

View file

@ -1,8 +1,6 @@
from typing import List
from abstracts.repository import BaseRepository
from packages.v1.administrativo.schemas.t_biometria_pessoa_schema import (
TBiometriaPessoaIndexSchema,
TBiometriaPessoaResponseSchema,
)

View file

@ -25,8 +25,6 @@ class TImovelIndexRepository(BaseRepository):
params = {"tipoClasse": t_imovel_index_schema.tipo_classe}
print(params)
# Execução do sql
response = self.fetch_all(sql, params)

View file

@ -1,6 +1,5 @@
from abstracts.repository import BaseRepository
from fastapi import HTTPException, status
from datetime import datetime
from packages.v1.administrativo.schemas.t_pessoa_representante_schema import (
TPessoaRepresentanteUpdateSchema,

View file

@ -1,4 +1,4 @@
from datetime import date, datetime
from datetime import date
from decimal import Decimal
from typing import Optional
from pydantic import BaseModel

View file

@ -1,7 +1,6 @@
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

View file

@ -1,7 +1,6 @@
from pydantic import BaseModel, field_validator, model_validator
from fastapi import HTTPException, status
from typing import Optional
from decimal import Decimal
# Funções para sanitização de entradas (evitar XSS, SQLi etc.)
from actions.validations.text import Text

View file

@ -1,9 +1,7 @@
from pydantic import BaseModel, field_validator, model_validator
from fastapi import HTTPException, status
from pydantic import BaseModel
from typing import Optional
# Funções para sanitização de entradas (evitar XSS, SQLi etc.)
from actions.validations.text import Text
# ----------------------------------------------------
# Schema base

View file

@ -1,4 +1,4 @@
from pydantic import BaseModel, EmailStr, constr, field_validator, model_validator
from pydantic import BaseModel, EmailStr, field_validator, model_validator
from fastapi import HTTPException, status
from typing import Optional
from datetime import datetime

View file

@ -1,7 +1,7 @@
from datetime import datetime
from decimal import Decimal
from pydantic import BaseModel
from typing import Optional, List
from typing import Optional
# ----------------------------------------------------

View file

@ -1,10 +1,7 @@
from pydantic import BaseModel, field_validator, model_validator
from fastapi import HTTPException, status
from pydantic import BaseModel
from typing import Optional
from datetime import datetime
# Função de sanitização
from actions.validations.text import Text
# ----------------------------------------------------
# Schema base para TImovelUnidade

View file

@ -1,11 +1,9 @@
from pydantic import BaseModel, field_validator, model_validator
from pydantic import BaseModel, model_validator
from fastapi import HTTPException, status
from typing import Optional
from decimal import Decimal
# Funções para sanitização de entradas (evitar XSS, SQLi etc.)
# Assumindo que a classe Text está disponível no caminho 'actions.validations.text'
from actions.validations.text import Text
# ----------------------------------------------------
# Schema base

View file

@ -1,5 +1,4 @@
from packages.v1.administrativo.actions.c_caixa_item.c_caixa_item_index_action import IndexAction
from packages.v1.administrativo.schemas.c_caixa_item_schema import CaixaItemSearchSchema
class IndexService:

View file

@ -1,4 +1,3 @@
from fastapi import HTTPException, status
from packages.v1.administrativo.schemas.c_caixa_servico_schema import CCaixaServicoSistemaIdSchema
from packages.v1.administrativo.actions.c_caixa_servico.c_caixa_servico_get_by_sistema_id_action import ShowSistemaIdAction

View file

@ -1,5 +1,4 @@
from fastapi import HTTPException, status
from packages.v1.administrativo.schemas.c_caixa_servico_schema import CCaixaServicoSchema
from packages.v1.administrativo.actions.c_caixa_servico.c_caixa_servico_index_action import IndexAction
class IndexService:

View file

@ -60,8 +60,6 @@ class GCalculoServicoService:
def execute(self, data: GCalculoServico):
print(data)
# Busca os parâmetros da aplicação
periodo_id = float(
self._config_service.execute(

View file

@ -1,5 +1,4 @@
from fastapi import HTTPException, status
from packages.v1.administrativo.schemas.g_tb_regimecomunhao_schema import GTbRegimecomunhaoSchema
from packages.v1.administrativo.actions.g_tb_regimecomunhao.g_tb_regimecomunhao_index_action import IndexAction
class IndexService:

View file

@ -1,5 +1,4 @@
from fastapi import HTTPException, status
from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoSchema
from packages.v1.administrativo.actions.g_tb_txmodelogrupo.g_tb_txmodelogrupo_index_action import IndexAction

View file

@ -2,7 +2,6 @@ from fastapi import HTTPException, status
from packages.v1.administrativo.controllers.g_usuario_controller import (
GUsuarioIndexSchema,
)
from packages.v1.administrativo.schemas.g_usuario_schema import GUsuarioSchema
from packages.v1.administrativo.actions.g_usuario.g_usuario_index_action import (
IndexAction,
)

View file

@ -4,11 +4,9 @@ from packages.v1.administrativo.actions.t_imovel_unidade.t_imovel_unidade_save_a
)
from packages.v1.administrativo.schemas.t_imovel_unidade_schema import (
TImovelUnidadeSaveSchema,
TImovelUnidadeSchema,
)
from packages.v1.sequencia.schemas.g_sequencia import GSequenciaSchema
from packages.v1.sequencia.services.g_sequencia.generate_service import GenerateService
from fastapi import HTTPException, status
class TImovelUnidadeSaveService:

View file

@ -48,6 +48,7 @@ from packages.v1.administrativo.endpoints import t_pessoa_endpoint
from packages.v1.administrativo.endpoints import t_pessoa_representante_endpoint
from packages.v1.administrativo.endpoints import g_calculo_endpoint
from packages.v1.servicos.balcao.endpoints import (
t_ato_endpoint,
t_pessoa_cartao_endpoint,
t_servico_itempedido_endpoint,
t_servico_pedido_endpoint,
@ -350,14 +351,14 @@ api_router.include_router(
# Inclui as rotas de g_emolumento periodo
api_router.include_router(
t_servico_pedido_endpoint.router,
prefix="/servicos/balcao/t_servico_pedido",
prefix="/servicos/pedidos/t_servico_pedido",
tags=["Pedido"],
)
# Inclui as rotas de g_emolumento periodo
api_router.include_router(
t_servico_itempedido_endpoint.router,
prefix="/servicos/balcao/t_servico_itempedido",
prefix="/servicos/pedidos/t_servico_itempedido",
tags=["Itens do Pedido"],
)
@ -365,10 +366,17 @@ api_router.include_router(
# Inclui as rotas de g_emolumento periodo
api_router.include_router(
t_pessoa_cartao_endpoint.router,
prefix="/servicos/balcao/t_pessoa_cartao",
prefix="/servicos/pedidos/t_pessoa_cartao",
tags=["Pessoa Cartao"],
)
# Inclui as rotas de g_emolumento periodo
api_router.include_router(
t_ato_endpoint.router,
prefix="/servicos/atos/t_ato",
tags=["Atos"],
)
# Inclui as rotas de g_emolumento periodo
api_router.include_router(
t_biometria_pessoa_endpoint.router,

View file

@ -5,7 +5,6 @@ from packages.v1.parametros.schemas.g_config_schema import (
GConfigNomeSchema,
GConfigResponseSchema,
)
from packages.v1.sequencia.repositories.g_sequencia.get import Get
from abstracts.action import BaseAction

View file

@ -0,0 +1,27 @@
from packages.v1.servicos.balcao.repositories.t_ato.t_ato_index_repository import (
TAtoIndexRepository,
)
from packages.v1.servicos.balcao.schemas.t_ato_schema import TAtoIndexSchema
class TAtoIndexAction:
"""
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_tb_regimebens.
"""
def execute(self, t_ato_index_schema: TAtoIndexSchema):
"""
Executa a operação de listagem no banco de dados.
Returns:
A lista de todos os registros.
"""
# Instanciamento do repositório
t_ato_index_repository = TAtoIndexRepository()
# Execução do repositório
response = t_ato_index_repository.execute(t_ato_index_schema)
# Retorno da informação
return response

View file

@ -0,0 +1,27 @@
from packages.v1.servicos.balcao.repositories.t_ato.t_ato_show_repository import (
TAtoShowRepository,
)
from packages.v1.servicos.balcao.schemas.t_ato_schema import TAtoIdSchema
class TAtoShowAction:
"""
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_tb_regimebens.
"""
def execute(self, data: TAtoIdSchema):
"""
Executa a operação de listagem no banco de dados.
Returns:
A lista de todos os registros.
"""
# Instanciamento do repositório
show_repository = TAtoShowRepository()
# Execução do repositório
response = show_repository.execute(data)
# Retorno da informação
return response

View file

@ -0,0 +1,40 @@
from abstracts.action import BaseAction
from packages.v1.servicos.balcao.repositories.t_servico_itempedido.t_servico_itempedido_certidao_save_repository import (
TServicoItemPedidoCertidaoSaveRepository,
)
from packages.v1.servicos.balcao.schemas.t_servico_itempedido_schema import (
TServicoItemPedidoCertidaoSaveSchema,
)
class TServicoItemPedidoCertidaSaveAction(BaseAction):
"""
Serviço responsável por encapsular a lógica de negócio para a operação
de salvamento de um novo registro na tabela T_SERVICO_ITEMPEDIDO.
"""
def execute(self, data: TServicoItemPedidoCertidaoSaveSchema):
"""
Executa a operação de salvamento.
Args:
t_servico_itempedido_schema (TServicoItemPedidoSchema):
O esquema com os dados a serem persistidos.
Returns:
O resultado da operação de salvamento.
"""
# ----------------------------------------------------
# Instanciamento do repositório
# ----------------------------------------------------
save_repository = TServicoItemPedidoCertidaoSaveRepository()
# ----------------------------------------------------
# Execução do repositório
# ----------------------------------------------------
response = save_repository.execute(data)
# ----------------------------------------------------
# Retorno da informação
# ----------------------------------------------------
return response

View file

@ -0,0 +1,68 @@
import os
from docx import Document
from fastapi import HTTPException, status
from abstracts.action import BaseAction
from packages.v1.servicos.balcao.schemas.t_servico_itempedido_schema import (
TServicoItemPedidoCreateCertidaoSchema,
)
from actions.data.text import Text
from actions.data.microtime import Microtime
class TServicoItemPedidoCreateCertidaoAction(BaseAction):
"""
Serviço responsável por gerar o arquivo físico da certidão (.rtf)
a partir do texto descomprimido e validar sua integridade.
Retorna um dicionário (JSON) indicando sucesso ou falha.
"""
def execute(self, data: TServicoItemPedidoCreateCertidaoSchema):
texto = None
# Verifica se existe conteudo a ser escrito
if data.certidao_texto:
# 1. Decodifica o texto
texto = Text.decompress(data.certidao_texto)
# 2. Configuração do caminho e nome
diretorio = "./storage/temp/"
name = f"{data.servico_itempedido_id}_{Microtime.as_int()}.rtf"
# Define a variável caminho_completo
caminho_completo = os.path.join(diretorio, name)
# 3. Garante que a pasta existe
os.makedirs(diretorio, exist_ok=True)
if texto:
# 4. Escreve o texto em disco
with open(caminho_completo, "wb") as f:
f.write(texto.encode("utf-8"))
else:
# 1. Instancia o objeto (cria a estrutura XML em memória)
document = Document()
# 2. Salva o arquivo fisicamente
document.save(caminho_completo)
# 5. VALIDAÇÃO: Verifica se o arquivo existe e se tem conteúdo
if not os.path.exists(caminho_completo):
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Falha crítica: O arquivo não foi encontrado em {caminho_completo}",
)
if os.path.getsize(caminho_completo) == 0:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Falha crítica: O arquivo foi criado, mas está vazio (0 bytes).",
)
# RETORNO DE SUCESSO
return name

View file

@ -1,9 +1,9 @@
from packages.v1.servicos.balcao.controllers.t_servico_itempedido_controller import (
TServicoItemPedidoSaveSituacaoSchema,
)
from packages.v1.servicos.balcao.repositories.t_servico_itempedido.t_servico_itempedido_save_situacao_repository import (
TServicoItemPedidoSaveSituacaoRepository,
)
from packages.v1.servicos.balcao.schemas.t_servico_itempedido_schema import (
TServicoItemPedidoSaveSituacaoSchema,
)
class TServicoItemPedidoSaveSituacaoAction:

View file

@ -0,0 +1,31 @@
from actions.dynamic_import.service_factory import ServiceFactory
from interfaces.service_protocols import ServiceProtocolsInterface
from packages.v1.servicos.balcao.schemas.t_ato_schema import TAtoIdSchema
class TAtoController:
def __init__(self):
# Configura o escopo deste controller
self.factory = ServiceFactory(package="servicos.balcao", table="t_ato")
def index(self, schema):
# Instânciamento da classe
service = self.factory.make("TAtoIndexService", ServiceProtocolsInterface)
# O VS Code sabe que .execute() existe por causa do IService!
result = service.execute(schema)
return {"message": "Sucesso", "data": result}
def show(self, data: TAtoIdSchema):
# Instânciamento da classe
service = self.factory.make("TAtoShowService", ServiceProtocolsInterface)
# O VS Code sabe que .execute() existe por causa do IService!
result = service.execute(data)
return {"message": "Sucesso", "data": result}

View file

@ -1,12 +1,15 @@
from actions.dynamic_import.dynamic_import import DynamicImport
from packages.v1.servicos.balcao.schemas.t_servico_itempedido_schema import (
TServicoItemIndexSchema,
TServicoItemPedidoCertidaoSaveSchema,
TServicoItemPedidoSaveSchema,
TServicoItemPedidoSaveSituacaoSchema,
TServicoItemPedidoSituacaoSchema,
TServicoItemPedidoUpdateSchema,
TServicoItemPedidoIdSchema,
)
from packages.v1.servicos.balcao.services.t_servico_itempedido.go.t_servico_itempedido_cancelar_service import (
TServicoItemPedidoCancelarService,
)
class TServicoItemPedidoController:
@ -59,6 +62,61 @@ class TServicoItemPedidoController:
"data": self.show_service.execute(t_servico_itempedido_id_schema),
}
# ----------------------------------------------------
# Busca um registro específico de T_SERVICO_ITEMPEDIDO pelo ID
# ----------------------------------------------------
def certidao_show(self, t_servico_itempedido_id_schema: TServicoItemPedidoIdSchema):
# Importação da classe desejada
show_service = self.dynamic_import.service(
"t_servico_itempedido_certidao_show_service",
"TServicoItemPedidoCertidaoShowService",
)
# Instância da classe service
self.show_service = show_service()
# Execução da busca
return {
"message": "Registro de T_SERVICO_ITEMPEDIDO localizado com sucesso.",
"data": self.show_service.execute(t_servico_itempedido_id_schema),
}
# ----------------------------------------------------
# Busca um registro específico de T_SERVICO_ITEMPEDIDO pelo ID
# ----------------------------------------------------
def certidao_edit(self, t_servico_itempedido_id_schema: TServicoItemPedidoIdSchema):
# Importação da classe desejada
edit_service = self.dynamic_import.service(
"t_servico_itempedido_certidao_edit_service",
"TServicoItemPedidoCertidaoEditService",
)
# Instância da classe service
self.show_service = edit_service()
# Execução da busca
return {
"message": "Registro de T_SERVICO_ITEMPEDIDO localizado com sucesso.",
"data": self.show_service.execute(t_servico_itempedido_id_schema),
}
# ----------------------------------------------------
# Busca um registro específico de T_SERVICO_ITEMPEDIDO pelo ID
# ----------------------------------------------------
def certidao_save(self, data: TServicoItemPedidoCertidaoSaveSchema):
# Importação da classe desejada
save_service = self.dynamic_import.service(
"t_servico_itempedido_certidao_save_service",
"TServicoItemPedidoCertidaoSaveService",
)
# Instância da classe service
self.save_service = save_service()
# Execução da busca
return self.save_service.execute(data)
# ----------------------------------------------------
# Cadastra um novo registro em T_SERVICO_ITEMPEDIDO
# ----------------------------------------------------
@ -84,8 +142,7 @@ class TServicoItemPedidoController:
# Importação da classe desejada
cancelar_service = self.dynamic_import.service(
"t_servico_itempedido_cancelar_service",
"TServicoItemPedidoCancelarService",
"t_servico_itempedido_cancelar_service", "TServicoItemPedidoCancelarService"
)
# Instância da classe service

View file

@ -5,9 +5,6 @@ from packages.v1.servicos.balcao.schemas.t_servico_pedido_schema import (
TServicoPedidoUpdateSchema,
TServicoPedidoIdSchema,
)
from packages.v1.servicos.balcao.services.t_servico_pedido.go.t_servico_pedido_cancelar_service import (
TServicoPedidoCancelarService,
)
class TServicoPedidoController:

View file

@ -0,0 +1,54 @@
# Importação de bibliotecas
from fastapi import APIRouter, Depends, status
from actions.data.get_url_params import get_url_params
from actions.jwt.get_current_user import get_current_user
from packages.v1.servicos.balcao.controllers.t_ato_controller import TAtoController
from packages.v1.servicos.balcao.schemas.t_ato_schema import (
TAtoIdSchema,
TAtoIndexSchema,
)
# ----------------------------------------------------
# Inicializa o roteador para as rotas da tabela T_ATO
# ----------------------------------------------------
router = APIRouter()
# Instanciamento do controller
t_ato_controller = TAtoController()
# ----------------------------------------------------
# Lista todos os registros de T_ATO
# ----------------------------------------------------
@router.get(
"/",
status_code=status.HTTP_200_OK,
summary="Lista todos os registros de T_ATO cadastrados",
response_description="Lista todos os registros de T_ATO cadastrados",
)
async def index(
current_user: dict = Depends(get_current_user), url_params=Depends(get_url_params)
):
# Busca todos os usuários cadastrados
response = t_ato_controller.index(TAtoIndexSchema(**url_params))
# Retorna os dados localizados
return response
# ----------------------------------------------------
# Lista um registro especifico
# ----------------------------------------------------
@router.get(
"/{ato_id}",
status_code=status.HTTP_200_OK,
summary="Lista um registro em especifico",
response_description="Lista um registro em especifico",
)
async def show(ato_id: int, current_user: dict = Depends(get_current_user)):
"""
Retorna um registro específico de G_GRAMATICA com base no ID informado.
"""
response = t_ato_controller.show(TAtoIdSchema(ato_id=ato_id))
return response

View file

@ -1,5 +1,5 @@
# Importação de bibliotecas
from fastapi import APIRouter, Depends, status
from fastapi import APIRouter, Depends, status, Request
from actions.data.dict_to_namespace import dict_to_namespace
from actions.jwt.get_current_user import get_current_user
from packages.v1.servicos.balcao.controllers.t_servico_itempedido_controller import (
@ -7,6 +7,7 @@ from packages.v1.servicos.balcao.controllers.t_servico_itempedido_controller imp
)
from packages.v1.servicos.balcao.schemas.t_servico_itempedido_schema import (
TServicoItemIndexSchema,
TServicoItemPedidoCertidaoSaveSchema,
TServicoItemPedidoSaveSchema,
TServicoItemPedidoSituacaoSchema,
TServicoItemPedidoUpdateSchema,
@ -64,6 +65,54 @@ async def show(
return response
# ----------------------------------------------------
# Busca um registro específico de T_SERVICO_ITEMPEDIDO pelo ID
# ----------------------------------------------------
@router.get(
"/{servico_itempedido_id}/certidao/exibir",
status_code=status.HTTP_200_OK,
summary="Busca o texto da certidao",
response_description="Busca o texto da certidao",
)
async def certidao_show(
servico_itempedido_id: int, current_user: dict = Depends(get_current_user)
):
"""
Retorna um registro específico de T_SERVICO_ITEMPEDIDO com base no ID informado.
"""
t_servico_itempedido_id_schema = TServicoItemPedidoIdSchema(
servico_itempedido_id=servico_itempedido_id
)
response = t_servico_itempedido_controller.certidao_show(
t_servico_itempedido_id_schema
)
return response
# ----------------------------------------------------
# Gera o arquivo em disco para Manipulação
# ----------------------------------------------------
@router.get(
"/{servico_itempedido_id}/certidao/editar",
status_code=status.HTTP_200_OK,
summary="Gera o arquivo em disco da certidão",
response_description="Gera o arquivo em disco da certidão",
)
async def certidao_edit(
servico_itempedido_id: int, current_user: dict = Depends(get_current_user)
):
"""
Retorna um registro específico de T_SERVICO_ITEMPEDIDO com base no ID informado.
"""
t_servico_itempedido_id_schema = TServicoItemPedidoIdSchema(
servico_itempedido_id=servico_itempedido_id
)
response = t_servico_itempedido_controller.certidao_edit(
t_servico_itempedido_id_schema
)
return response
# ----------------------------------------------------
# Cadastra um novo registro em T_SERVICO_ITEMPEDIDO
# ----------------------------------------------------
@ -162,6 +211,30 @@ async def ativar(
return response
# ----------------------------------------------------
# Gera o arquivo em disco para Manipulação
# ----------------------------------------------------
@router.post(
"/{servico_itempedido_id}/certidao/salvar",
status_code=status.HTTP_200_OK,
summary="Atualiza o texto da certidão",
response_description="Atualiza o texto da certidão",
)
async def certidao_save(servico_itempedido_id: int, request: Request):
# Obtem os dados enviados
data = await request.json()
response = t_servico_itempedido_controller.certidao_save(
TServicoItemPedidoCertidaoSaveSchema(
servico_itempedido_id=servico_itempedido_id, data=data
)
)
# return response
return response
# ----------------------------------------------------
# Exclui um registro de T_SERVICO_ITEMPEDIDO
# ----------------------------------------------------

Some files were not shown because too many files have changed in this diff Show more