From 57e0047cc0a69e4c8672297fee4cc5cd89f5a83d Mon Sep 17 00:00:00 2001 From: ka-lucas Date: Wed, 7 May 2025 08:54:44 -0300 Subject: [PATCH] =?UTF-8?q?tabela=20de=20configura=C3=A7=C3=B5es=20gerais?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 3 + docs/settings_gerais/create.yml | 97 ++++++++++++++++++++++ docs/settings_gerais/delete.yml | 48 +++++++++++ docs/settings_gerais/get.yml | 81 ++++++++++++++++++ docs/settings_gerais/list.yml | 76 +++++++++++++++++ docs/settings_gerais/update.yml | 111 +++++++++++++++++++++++++ models/settings_gerais.py | 25 ++++++ routes/settings_gerais.py | 140 ++++++++++++++++++++++++++++++++ seeds/run_seed.py | 2 + seeds/settings_gerais_seed.py | 44 ++++++++++ 10 files changed, 627 insertions(+) create mode 100644 docs/settings_gerais/create.yml create mode 100644 docs/settings_gerais/delete.yml create mode 100644 docs/settings_gerais/get.yml create mode 100644 docs/settings_gerais/list.yml create mode 100644 docs/settings_gerais/update.yml create mode 100644 models/settings_gerais.py create mode 100644 routes/settings_gerais.py create mode 100644 seeds/settings_gerais_seed.py diff --git a/app.py b/app.py index 9e37855..1404544 100644 --- a/app.py +++ b/app.py @@ -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(): diff --git a/docs/settings_gerais/create.yml b/docs/settings_gerais/create.yml new file mode 100644 index 0000000..28c8d84 --- /dev/null +++ b/docs/settings_gerais/create.yml @@ -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" diff --git a/docs/settings_gerais/delete.yml b/docs/settings_gerais/delete.yml new file mode 100644 index 0000000..35480f8 --- /dev/null +++ b/docs/settings_gerais/delete.yml @@ -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" diff --git a/docs/settings_gerais/get.yml b/docs/settings_gerais/get.yml new file mode 100644 index 0000000..a7348bc --- /dev/null +++ b/docs/settings_gerais/get.yml @@ -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" diff --git a/docs/settings_gerais/list.yml b/docs/settings_gerais/list.yml new file mode 100644 index 0000000..03c8c10 --- /dev/null +++ b/docs/settings_gerais/list.yml @@ -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" diff --git a/docs/settings_gerais/update.yml b/docs/settings_gerais/update.yml new file mode 100644 index 0000000..467d55b --- /dev/null +++ b/docs/settings_gerais/update.yml @@ -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" diff --git a/models/settings_gerais.py b/models/settings_gerais.py new file mode 100644 index 0000000..9bdb700 --- /dev/null +++ b/models/settings_gerais.py @@ -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"" + + + \ No newline at end of file diff --git a/routes/settings_gerais.py b/routes/settings_gerais.py new file mode 100644 index 0000000..9d6453a --- /dev/null +++ b/routes/settings_gerais.py @@ -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('/', 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('/', 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('/', 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 diff --git a/seeds/run_seed.py b/seeds/run_seed.py index 40a633b..19ee5e1 100644 --- a/seeds/run_seed.py +++ b/seeds/run_seed.py @@ -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: diff --git a/seeds/settings_gerais_seed.py b/seeds/settings_gerais_seed.py new file mode 100644 index 0000000..e7bc438 --- /dev/null +++ b/seeds/settings_gerais_seed.py @@ -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()