tabela de configurações gerais

This commit is contained in:
ka-lucas 2025-05-07 08:54:44 -03:00
parent 1bff849684
commit 57e0047cc0
10 changed files with 627 additions and 0 deletions

3
app.py
View File

@ -27,6 +27,7 @@ from routes.time_schedules import time_schedule_bp
from routes.holiday import holiday_bp
from routes.company import company_bp
from routes.record import record_bp
from routes.settings_gerais import settings_gerais_bp
import logging
from dotenv import load_dotenv
from werkzeug.exceptions import BadRequest
@ -132,6 +133,8 @@ def create_app():
app.register_blueprint(record_bp)
app.register_blueprint(holiday_bp)
app.register_blueprint(company_bp)
app.register_blueprint(settings_gerais_bp)
# Testa a conexão com o banco de dados
with app.app_context():

View File

@ -0,0 +1,97 @@
tags:
- Settings Gerais
summary: Cria uma nova configuração geral
description: >
Essa rota permite criar uma configuração geral associada a uma instância de serviço.
parameters:
- in: body
name: body
description: Dados para a criação de uma nova configuração.
required: true
schema:
type: object
properties:
tolerancia_entrada:
type: integer
description: Tolerância de entrada em minutos
example: 10
tolerancia_saida:
type: integer
description: Tolerância de saída em minutos
example: 5
limite_diario_he:
type: integer
description: Limite diário de horas extras em minutos
example: 120
limite_mensal_he:
type: integer
description: Limite mensal de horas extras em minutos
example: 2400
limite_banco_horas_positivo:
type: integer
description: Limite positivo do banco de horas
example: 800
limite_banco_horas_negativo:
type: integer
description: Limite negativo do banco de horas
example: -400
validacao_reconhecimento_facial:
type: string
description: Habilita ou não a validação facial
example: "True"
registro_remoto:
type: string
description: Permite ou não o registro remoto
example: "True"
ajuste_colaborador:
type: string
description: Permite ou não o ajuste pelo colaborador
example: "False"
dias_aprovacao_automatica:
type: integer
description: Número de dias para aprovação automática
example: 3
service_instance_id:
type: integer
description: ID da instância de serviço associada
example: 4
responses:
201:
description: Configuração criada com sucesso
content:
application/json:
schema:
type: object
properties:
message:
type: string
settings_id:
type: integer
examples:
application/json:
message: "Configuração criada com sucesso"
settings_id: 1
400:
description: Requisição inválida (dados incorretos ou ausentes)
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
application/json:
error: "Campos obrigatórios ausentes ou inválidos."
401:
description: Token inválido ou ausente
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
application/json:
error: "Token inválido ou ausente"

View File

@ -0,0 +1,48 @@
tags:
- Settings Gerais
summary: Remove uma configuração geral
description: >
Essa rota permite deletar uma configuração geral específica pelo seu ID.
parameters:
- in: path
name: settings_id
required: true
description: ID da configuração geral que será removida
type: integer
responses:
200:
description: Configuração removida com sucesso
content:
application/json:
schema:
type: object
properties:
message:
type: string
examples:
application/json:
message: "Configuração deletada com sucesso"
401:
description: Token inválido ou ausente
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
application/json:
error: "Token inválido ou ausente"
404:
description: Configuração não encontrada
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
application/json:
error: "Configuração não encontrada"

View File

@ -0,0 +1,81 @@
tags:
- Settings Gerais
summary: Busca os detalhes de uma configuração geral
description: >
Essa rota permite obter os dados de uma configuração geral específica a partir do seu ID.
parameters:
- in: path
name: settings_id
required: true
description: ID da configuração geral
type: integer
responses:
200:
description: Detalhes da configuração retornados com sucesso
content:
application/json:
schema:
type: object
properties:
id:
type: integer
tolerancia_entrada:
type: integer
tolerancia_saida:
type: integer
limite_diario_he:
type: integer
limite_mensal_he:
type: integer
limite_banco_horas_positivo:
type: integer
limite_banco_horas_negativo:
type: integer
validacao_reconhecimento_facial:
type: string
registro_remoto:
type: string
ajuste_colaborador:
type: string
dias_aprovacao_automatica:
type: integer
service_instance_id:
type: integer
examples:
application/json:
id: 1
tolerancia_entrada: 10
tolerancia_saida: 5
limite_diario_he: 120
limite_mensal_he: 2400
limite_banco_horas_positivo: 800
limite_banco_horas_negativo: -400
validacao_reconhecimento_facial: "True"
registro_remoto: "True"
ajuste_colaborador: "False"
dias_aprovacao_automatica: 3
service_instance_id: 4
401:
description: Token inválido ou ausente
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
application/json:
error: "Token inválido ou ausente"
404:
description: Configuração não encontrada
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
application/json:
error: "Configuração não encontrada"

View File

@ -0,0 +1,76 @@
tags:
- Settings Gerais
summary: Lista todas as configurações gerais
description: >
Essa rota permite listar todas as configurações gerais cadastradas.
Pode-se filtrar por uma instância de serviço específica.
parameters:
- in: query
name: service_instance_id
required: false
description: ID da instância de serviço para filtrar as configurações
type: integer
responses:
200:
description: Lista de configurações retornada com sucesso
content:
application/json:
schema:
type: object
properties:
settings_gerais_list:
type: array
items:
type: object
properties:
id:
type: integer
tolerancia_entrada:
type: integer
tolerancia_saida:
type: integer
limite_diario_he:
type: integer
limite_mensal_he:
type: integer
limite_banco_horas_positivo:
type: integer
limite_banco_horas_negativo:
type: integer
validacao_reconhecimento_facial:
type: string
registro_remoto:
type: string
ajuste_colaborador:
type: string
dias_aprovacao_automatica:
type: integer
service_instance_id:
type: integer
examples:
application/json:
settings_gerais_list:
- id: 1
tolerancia_entrada: 10
tolerancia_saida: 5
limite_diario_he: 120
limite_mensal_he: 2400
limite_banco_horas_positivo: 800
limite_banco_horas_negativo: -400
validacao_reconhecimento_facial: "True"
registro_remoto: "True"
ajuste_colaborador: "False"
dias_aprovacao_automatica: 3
service_instance_id: 4
401:
description: Token inválido ou ausente
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
application/json:
error: "Token inválido ou ausente"

View File

@ -0,0 +1,111 @@
tags:
- Settings Gerais
summary: Atualiza uma configuração geral existente
description: >
Essa rota permite atualizar os dados de uma configuração geral específica, associada a uma instância de serviço.
parameters:
- in: path
name: settings_id
required: true
description: ID da configuração geral que será atualizada
type: integer
- in: body
name: body
description: Dados para atualização da configuração.
required: true
schema:
type: object
properties:
tolerancia_entrada:
type: integer
description: Tolerância de entrada em minutos
example: 10
tolerancia_saida:
type: integer
description: Tolerância de saída em minutos
example: 5
limite_diario_he:
type: integer
description: Limite diário de horas extras em minutos
example: 120
limite_mensal_he:
type: integer
description: Limite mensal de horas extras em minutos
example: 2400
limite_banco_horas_positivo:
type: integer
description: Limite positivo do banco de horas
example: 800
limite_banco_horas_negativo:
type: integer
description: Limite negativo do banco de horas
example: -400
validacao_reconhecimento_facial:
type: string
description: Habilita ou não a validação facial
example: "True"
registro_remoto:
type: string
description: Permite ou não o registro remoto
example: "True"
ajuste_colaborador:
type: string
description: Permite ou não o ajuste pelo colaborador
example: "False"
dias_aprovacao_automatica:
type: integer
description: Número de dias para aprovação automática
example: 3
service_instance_id:
type: integer
description: ID da instância de serviço associada
example: 4
responses:
200:
description: Configuração atualizada com sucesso
content:
application/json:
schema:
type: object
properties:
message:
type: string
examples:
application/json:
message: "Configuração atualizada com sucesso"
400:
description: Requisição inválida (dados incorretos ou ausentes)
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
application/json:
error: "Campos obrigatórios ausentes ou inválidos."
401:
description: Token inválido ou ausente
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
application/json:
error: "Token inválido ou ausente"
404:
description: Configuração não encontrada
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
application/json:
error: "Configuração não encontrada"

25
models/settings_gerais.py Normal file
View File

@ -0,0 +1,25 @@
from extensions import db
class SettingsGerais(db.Model):
__tablename__ = "settings_gerais"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
tolerancia_entrada = db.Column(db.Integer, nullable=True) # Tolerância de entrada em minutos
tolerancia_saida = db.Column(db.Integer, nullable=True) # Tolerância de saída em minutos
limite_diario_he = db.Column(db.Integer, nullable=True) # Limite diário de horas extras
limite_mensal_he = db.Column(db.Integer, nullable=True) # Limite mensal de horas extras
limite_banco_horas_positivo = db.Column(db.Integer, nullable=True) # Limite de banco de horas positivo
limite_banco_horas_negativo = db.Column(db.Integer, nullable=True) # Limite de banco de horas negativo
validacao_reconhecimento_facial = db.Column(db.String(255), default=False) # Validação de reconhecimento facial
registro_remoto = db.Column(db.String(255), default=False) # Registro remoto
ajuste_colaborador = db.Column(db.String(255), default=False) # Ajuste colaborador
dias_aprovacao_automatica = db.Column(db.Integer, nullable=True) # Dias para aprovação automática
service_instance_id = db.Column(db.Integer, db.ForeignKey('service_instance.id'), nullable=False)
def __repr__(self):
return f"<SettingsGerais id={self.id} service_instance_id={self.service_instance_id}>"

140
routes/settings_gerais.py Normal file
View File

@ -0,0 +1,140 @@
from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required
from flasgger.utils import swag_from
from models.user import db
from models.settings_gerais import SettingsGerais
settings_gerais_bp = Blueprint('settings_gerais', __name__, url_prefix='/settings_gerais')
# Criar configurações gerais
@settings_gerais_bp.route('/', methods=['POST'])
@jwt_required()
@swag_from('../docs/settings_gerais/create.yml')
def create_settings_gerais():
data = request.get_json()
tolerancia_entrada = data.get('tolerancia_entrada')
tolerancia_saida = data.get('tolerancia_saida')
limite_diario_he = data.get('limite_diario_he')
limite_mensal_he = data.get('limite_mensal_he')
limite_banco_horas_positivo = data.get('limite_banco_horas_positivo')
limite_banco_horas_negativo = data.get('limite_banco_horas_negativo')
validacao_reconhecimento_facial = data.get('validacao_reconhecimento_facial', False)
registro_remoto = data.get('registro_remoto', False)
ajuste_colaborador = data.get('ajuste_colaborador', False)
dias_aprovacao_automatica = data.get('dias_aprovacao_automatica')
service_instance_id = data.get('service_instance_id')
settings = SettingsGerais(
tolerancia_entrada=tolerancia_entrada,
tolerancia_saida=tolerancia_saida,
limite_diario_he=limite_diario_he,
limite_mensal_he=limite_mensal_he,
limite_banco_horas_positivo=limite_banco_horas_positivo,
limite_banco_horas_negativo=limite_banco_horas_negativo,
validacao_reconhecimento_facial=validacao_reconhecimento_facial,
registro_remoto=registro_remoto,
ajuste_colaborador=ajuste_colaborador,
dias_aprovacao_automatica=dias_aprovacao_automatica,
service_instance_id=service_instance_id
)
db.session.add(settings)
db.session.commit()
return jsonify({'message': 'Configuração criada com sucesso', 'settings_id': settings.id}), 201
# Atualizar configurações gerais
@settings_gerais_bp.route('/<int:settings_id>', methods=['PUT'])
@jwt_required()
@swag_from('../docs/settings_gerais/update.yml')
def update_settings_gerais(settings_id):
data = request.get_json()
settings = SettingsGerais.query.get_or_404(settings_id)
if 'tolerancia_entrada' in data:
settings.tolerancia_entrada = data['tolerancia_entrada']
if 'tolerancia_saida' in data:
settings.tolerancia_saida = data['tolerancia_saida']
if 'limite_diario_he' in data:
settings.limite_diario_he = data['limite_diario_he']
if 'limite_mensal_he' in data:
settings.limite_mensal_he = data['limite_mensal_he']
if 'limite_banco_horas_positivo' in data:
settings.limite_banco_horas_positivo = data['limite_banco_horas_positivo']
if 'limite_banco_horas_negativo' in data:
settings.limite_banco_horas_negativo = data['limite_banco_horas_negativo']
if 'validacao_reconhecimento_facial' in data:
settings.validacao_reconhecimento_facial = data['validacao_reconhecimento_facial']
if 'registro_remoto' in data:
settings.registro_remoto = data['registro_remoto']
if 'ajuste_colaborador' in data:
settings.ajuste_colaborador = data['ajuste_colaborador']
if 'dias_aprovacao_automatica' in data:
settings.dias_aprovacao_automatica = data['dias_aprovacao_automatica']
if 'service_instance_id' in data:
# Verifica se a nova instância de serviço existe
from models import ServiceInstance # Evita import circular se necessário
ServiceInstance.query.get_or_404(data['service_instance_id'])
settings.service_instance_id = data['service_instance_id']
db.session.commit()
return jsonify({'message': 'Configuração atualizada com sucesso'}), 200
# Listar configurações gerais
@settings_gerais_bp.route('/', methods=['GET'])
@jwt_required()
@swag_from('../docs/settings_gerais/list.yml')
def list_settings_gerais():
service_instance_id = request.args.get('service_instance_id')
if service_instance_id:
settings_list = SettingsGerais.query.filter_by(service_instance_id=service_instance_id).all()
else:
settings_list = SettingsGerais.query.all()
return jsonify({
'settings_gerais_list': [{
'id': settings.id,
'tolerancia_entrada': settings.tolerancia_entrada,
'tolerancia_saida': settings.tolerancia_saida,
'limite_diario_he': settings.limite_diario_he,
'limite_mensal_he': settings.limite_mensal_he,
'limite_banco_horas_positivo': settings.limite_banco_horas_positivo,
'limite_banco_horas_negativo': settings.limite_banco_horas_negativo,
'validacao_reconhecimento_facial': settings.validacao_reconhecimento_facial,
'registro_remoto': settings.registro_remoto,
'ajuste_colaborador': settings.ajuste_colaborador,
'dias_aprovacao_automatica': settings.dias_aprovacao_automatica,
'service_instance_id': settings.service_instance_id
} for settings in settings_list]
}), 200
@settings_gerais_bp.route('/<int:id>', methods=['GET'])
@jwt_required()
@swag_from('../docs/settings_gerais/get.yml')
def get_settings_by_id(id):
s = SettingsGerais.query.get_or_404(id)
return jsonify({
'id': s.id,
'tolerancia_entrada': s.tolerancia_entrada,
'tolerancia_saida': s.tolerancia_saida,
'limite_diario_he': s.limite_diario_he,
'limite_mensal_he': s.limite_mensal_he,
'limite_banco_horas_positivo': s.limite_banco_horas_positivo,
'limite_banco_horas_negativo': s.limite_banco_horas_negativo,
'validacao_reconhecimento_facial': s.validacao_reconhecimento_facial,
'registro_remoto': s.registro_remoto,
'ajuste_colaborador': s.ajuste_colaborador,
'dias_aprovacao_automatica': s.dias_aprovacao_automatica,
'service_instance_id': s.service_instance_id
}), 200
@settings_gerais_bp.route('/<int:id>', methods=['DELETE'])
@jwt_required()
@swag_from('../docs/settings_gerais/delete.yml')
def delete_settings(id):
s = SettingsGerais.query.get_or_404(id)
db.session.delete(s)
db.session.commit()
return jsonify({'message': 'Configuração deletada com sucesso.'}), 200

View File

@ -16,6 +16,7 @@ from .reports_seed import reports_seed
from .shifts_times_seed import seed_shifts_and_schedules
from .company_seed import seed_company
from .time_schedule import seed_time_schedules
from .settings_gerais_seed import seed_settings_gerais
from extensions import db
@ -40,6 +41,7 @@ def run_all_seeds():
# seed_cameras()
#seed_shifts_and_schedules()
seed_time_schedules()
seed_settings_gerais()
print("Seeds executados com sucesso!")
except Exception as e:

View File

@ -0,0 +1,44 @@
from extensions import db
from models.settings_gerais import SettingsGerais
def seed_settings_gerais():
settings_data = [
{
"service_instance_id": 1,
"tolerancia_entrada": 10,
"tolerancia_saida": 5,
"limite_diario_he": 120, # minutos
"limite_mensal_he": 2400, # minutos
"limite_banco_horas_positivo": 800, # minutos
"limite_banco_horas_negativo": -400, # minutos
"validacao_reconhecimento_facial": "True",
"registro_remoto": "True",
"ajuste_colaborador": "False",
"dias_aprovacao_automatica": 3
}
]
for setting in settings_data:
existing = db.session.query(SettingsGerais).filter_by(
service_instance_id=setting["service_instance_id"]
).first()
if not existing:
new_setting = SettingsGerais(
service_instance_id=setting["service_instance_id"],
tolerancia_entrada=setting["tolerancia_entrada"],
tolerancia_saida=setting["tolerancia_saida"],
limite_diario_he=setting["limite_diario_he"],
limite_mensal_he=setting["limite_mensal_he"],
limite_banco_horas_positivo=setting["limite_banco_horas_positivo"],
limite_banco_horas_negativo=setting["limite_banco_horas_negativo"],
validacao_reconhecimento_facial=setting["validacao_reconhecimento_facial"],
registro_remoto=setting["registro_remoto"],
ajuste_colaborador=setting["ajuste_colaborador"],
dias_aprovacao_automatica=setting["dias_aprovacao_automatica"]
)
print("antes do banco")
db.session.add(new_setting)
print("adicionei no banco")
db.session.commit()