Compare commits

...

10 Commits

43 changed files with 2396 additions and 101 deletions

17
app.py
View File

@ -27,6 +27,10 @@ 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
from routes.settings_calculo_horas import settings_calculo_horas_bp
from routes.settings_integracoes import settings_integracoes_bp
from routes.settings_notificacoes import settings_notificacoes_bp
import logging
from dotenv import load_dotenv
from werkzeug.exceptions import BadRequest
@ -132,6 +136,11 @@ def create_app():
app.register_blueprint(record_bp)
app.register_blueprint(holiday_bp)
app.register_blueprint(company_bp)
app.register_blueprint(settings_gerais_bp)
app.register_blueprint(settings_calculo_horas_bp)
app.register_blueprint(settings_integracoes_bp)
app.register_blueprint(settings_notificacoes_bp)
# Testa a conexão com o banco de dados
with app.app_context():
@ -153,7 +162,7 @@ def get_database_type(uri):
if __name__ == "__main__":
app = create_app()
# with app.app_context():
# db.create_all() # Cria as tabelas
# run_all_seeds()
app.run(debug=True, host="0.0.0.0")
with app.app_context():
db.create_all() # Cria as tabelas
run_all_seeds() # Executa os seeds
app.run(debug=True, host="0.0.0.0")

View File

@ -0,0 +1,87 @@
tags:
- Settings Cálculo Horas
summary: Cria uma nova configuração de cálculo de horas
description: >
Essa rota permite criar uma configuração de cálculo de horas 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:
jornada_diaria:
type: integer
description: Jornada de trabalho diária em minutos
example: 480
jornada_semanal:
type: integer
description: Jornada de trabalho semanal em minutos
example: 2400
inicio_periodo_noturno:
type: string
format: time
description: Hora de início do período noturno
example: "22:00:00"
fim_periodo_noturno:
type: string
format: time
description: Hora de fim do período noturno
example: "05:00:00"
desconto_atraso_automatico:
type: string
description: Habilita ou não o desconto automático por atraso
example: "True"
tolerancia_para_descontos:
type: integer
description: Tolerância em minutos para aplicação de descontos
example: 10
arredondamento_minutos:
type: integer
description: Minutos utilizados para arredondamento
example: 5
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,49 @@
tags:
- Settings Cálculo Horas
summary: Deleta uma configuração de cálculo de horas existente
description: >
Essa rota permite deletar uma configuração de cálculo de horas especificada pelo ID.
parameters:
- in: path
name: id
required: true
schema:
type: integer
description: ID da configuração que será deletada.
responses:
200:
description: Configuração deletada 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,75 @@
tags:
- Settings Cálculo Horas
summary: Busca uma configuração de cálculo de horas por ID
description: >
Essa rota retorna os detalhes de uma configuração de cálculo de horas com base no ID informado.
parameters:
- in: path
name: id
required: true
schema:
type: integer
description: ID da configuração de cálculo de horas.
responses:
200:
description: Detalhes da configuração retornados com sucesso
content:
application/json:
schema:
type: object
properties:
id:
type: integer
jornada_diaria:
type: integer
jornada_semanal:
type: integer
inicio_periodo_noturno:
type: string
format: time
fim_periodo_noturno:
type: string
format: time
desconto_atraso_automatico:
type: string
tolerancia_para_descontos:
type: integer
arredondamento_minutos:
type: integer
service_instance_id:
type: integer
examples:
application/json:
id: 1
jornada_diaria: 480
jornada_semanal: 2400
inicio_periodo_noturno: "22:00:00"
fim_periodo_noturno: "05:00:00"
desconto_atraso_automatico: "True"
tolerancia_para_descontos: 10
arredondamento_minutos: 5
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,57 @@
tags:
- Settings Cálculo Horas
summary: Lista todas as configurações de cálculo de horas
description: >
Essa rota retorna uma lista de todas as configurações de cálculo de horas cadastradas, podendo ser filtrada por ID da instância de serviço.
parameters:
- in: query
name: service_instance_id
required: false
schema:
type: integer
description: ID da instância de serviço para filtrar as configurações
responses:
200:
description: Lista de configurações retornada com sucesso
content:
application/json:
schema:
type: object
properties:
settings_calculo_horas_list:
type: array
items:
type: object
properties:
id:
type: integer
jornada_diaria:
type: integer
jornada_semanal:
type: integer
inicio_periodo_noturno:
type: string
format: time
fim_periodo_noturno:
type: string
format: time
desconto_atraso_automatico:
type: string
tolerancia_para_descontos:
type: integer
arredondamento_minutos:
type: integer
service_instance_id:
type: integer
examples:
application/json:
settings_calculo_horas_list:
- id: 1
jornada_diaria: 480
jornada_semanal: 2400
inicio_periodo_noturno: "22:00:00"
fim_periodo_noturno: "05:00:00"
desconto_atraso_automatico: "True"
tolerancia_para_descontos: 10
arredondamento_minutos: 5
service_instance_id: 4

View File

@ -0,0 +1,102 @@
tags:
- Settings Cálculo Horas
summary: Atualiza uma configuração de cálculo de horas existente
description: >
Essa rota permite atualizar uma configuração de cálculo de horas especificada pelo ID.
parameters:
- in: path
name: settings_id
required: true
schema:
type: integer
description: ID da configuração que será atualizada.
- in: body
name: body
description: Dados para atualização da configuração.
required: true
schema:
type: object
properties:
jornada_diaria:
type: integer
description: Jornada de trabalho diária em minutos
example: 480
jornada_semanal:
type: integer
description: Jornada de trabalho semanal em minutos
example: 2400
inicio_periodo_noturno:
type: string
format: time
description: Hora de início do período noturno
example: "22:00:00"
fim_periodo_noturno:
type: string
format: time
description: Hora de fim do período noturno
example: "05:00:00"
desconto_atraso_automatico:
type: string
description: Habilita ou não o desconto automático por atraso
example: "True"
tolerancia_para_descontos:
type: integer
description: Tolerância em minutos para aplicação de descontos
example: 10
arredondamento_minutos:
type: integer
description: Minutos utilizados para arredondamento
example: 5
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"

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"

View File

@ -0,0 +1,77 @@
tags:
- Settings Integrações
summary: Cria uma nova configuração de integrações
description: >
Essa rota permite criar uma configuração de integrações 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:
integrar_folha_pagamento:
type: string
description: Habilita integração com folha de pagamento
example: "True"
exportar_dados:
type: string
description: Habilita exportação de dados
example: "True"
exportacao_csv:
type: string
description: Habilita exportação em formato CSV
example: "True"
exportacao_pdf:
type: string
description: Habilita exportação em formato PDF
example: "False"
integrar_calendario:
type: string
description: Habilita integração com calendários
example: "True"
service_instance_id:
type: integer
description: ID da instância de serviço associada
example: 1
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 de integrações 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,49 @@
tags:
- Settings Integrações
summary: Deleta uma configuração de integrações existente
description: >
Essa rota permite deletar uma configuração de integrações especificada pelo ID.
parameters:
- in: path
name: id
required: true
schema:
type: integer
description: ID da configuração que será deletada.
responses:
200:
description: Configuração deletada 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,67 @@
tags:
- Settings Integrações
summary: Busca uma configuração de integrações por ID
description: >
Essa rota retorna os detalhes de uma configuração de integrações com base no ID informado.
parameters:
- in: path
name: id
required: true
schema:
type: integer
description: ID da configuração de integrações.
responses:
200:
description: Detalhes da configuração retornados com sucesso
content:
application/json:
schema:
type: object
properties:
id:
type: integer
integrar_folha_pagamento:
type: string
exportar_dados:
type: string
exportacao_csv:
type: string
exportacao_pdf:
type: string
integrar_calendario:
type: string
service_instance_id:
type: integer
examples:
application/json:
id: 1
integrar_folha_pagamento: "True"
exportar_dados: "True"
exportacao_csv: "True"
exportacao_pdf: "False"
integrar_calendario: "True"
service_instance_id: 1
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,49 @@
tags:
- Settings Integrações
summary: Lista todas as configurações de integrações
description: >
Essa rota retorna uma lista de todas as configurações de integrações cadastradas, podendo ser filtrada por instância de serviço.
parameters:
- in: query
name: service_instance_id
required: false
schema:
type: integer
description: ID da instância de serviço para filtrar as configurações
responses:
200:
description: Lista de configurações retornada com sucesso
content:
application/json:
schema:
type: object
properties:
settings_integracoes_list:
type: array
items:
type: object
properties:
id:
type: integer
integrar_folha_pagamento:
type: string
exportar_dados:
type: string
exportacao_csv:
type: string
exportacao_pdf:
type: string
integrar_calendario:
type: string
service_instance_id:
type: integer
examples:
application/json:
settings_integracoes_list:
- id: 1
integrar_folha_pagamento: "True"
exportar_dados: "True"
exportacao_csv: "True"
exportacao_pdf: "False"
integrar_calendario: "True"
service_instance_id: 1

View File

@ -0,0 +1,86 @@
tags:
- Settings Integrações
summary: Atualiza uma configuração de integrações existente
description: >
Essa rota permite atualizar uma configuração de integrações com base no ID informado.
parameters:
- in: path
name: settings_id
required: true
schema:
type: integer
description: ID da configuração de integrações.
- in: body
name: body
description: Dados para atualização da configuração.
required: true
schema:
type: object
properties:
integrar_folha_pagamento:
type: string
example: "True"
exportar_dados:
type: string
example: "True"
exportacao_csv:
type: string
example: "True"
exportacao_pdf:
type: string
example: "False"
integrar_calendario:
type: string
example: "True"
service_instance_id:
type: integer
example: 1
responses:
200:
description: Configuração de integrações atualizada com sucesso
content:
application/json:
schema:
type: object
properties:
message:
type: string
examples:
application/json:
message: "Configuração de integrações atualizada com sucesso"
400:
description: Requisição inválida
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"

View File

@ -0,0 +1,80 @@
tags:
- Settings Notificações
summary: Cria uma nova configuração de notificações
description: >
Essa rota permite criar uma configuração de notificações associada a uma instância de serviço.
parameters:
- in: body
name: body
description: Dados para a criação de uma nova configuração de notificações.
required: true
schema:
type: object
properties:
notificar_esquecimento_ponto:
type: string
example: "True"
notificar_horas_extras:
type: string
example: "True"
notificar_solicitacao_pendentes:
type: string
example: "True"
notificar_banco_horas:
type: string
example: "True"
notificar_gestor:
type: string
example: "False"
relatorios_email:
type: string
example: "True"
relatorios_diario_gestor:
type: string
example: "False"
relatorios_semanal_colaboradores:
type: string
example: "True"
service_instance_id:
type: integer
example: 1
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 de notificações 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,49 @@
tags:
- Settings Notificações
summary: Deleta uma configuração de notificações existente
description: >
Essa rota permite deletar uma configuração de notificações especificada pelo ID.
parameters:
- in: path
name: id
required: true
schema:
type: integer
description: ID da configuração de notificações que será deletada.
responses:
200:
description: Configuração deletada 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,76 @@
tags:
- Settings Notificações
summary: Busca uma configuração de notificações por ID
description: >
Essa rota retorna os detalhes de uma configuração de notificações com base no ID informado.
parameters:
- in: path
name: id
required: true
schema:
type: integer
description: ID da configuração de notificações.
responses:
200:
description: Detalhes da configuração retornados com sucesso
content:
application/json:
schema:
type: object
properties:
id:
type: integer
notificar_esquecimento_ponto:
type: string
notificar_horas_extras:
type: string
notificar_solicitacao_pendentes:
type: string
notificar_banco_horas:
type: string
notificar_gestor:
type: string
relatorios_email:
type: string
relatorios_diario_gestor:
type: string
relatorios_semanal_colaboradores:
type: string
service_instance_id:
type: integer
examples:
application/json:
id: 1
notificar_esquecimento_ponto: "True"
notificar_horas_extras: "True"
notificar_solicitacao_pendentes: "True"
notificar_banco_horas: "True"
notificar_gestor: "False"
relatorios_email: "True"
relatorios_diario_gestor: "False"
relatorios_semanal_colaboradores: "True"
service_instance_id: 1
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,82 @@
tags:
- Settings Notificações
summary: Lista todas as configurações de notificações
description: >
Essa rota retorna uma lista de todas as configurações de notificações cadastradas, podendo ser filtrada por instância de serviço.
parameters:
- in: query
name: service_instance_id
required: false
schema:
type: integer
description: ID da instância de serviço para filtrar as configurações
responses:
200:
description: Lista de configurações retornada com sucesso
content:
application/json:
schema:
type: object
properties:
settings_notificacoes_list:
type: array
items:
type: object
properties:
id:
type: integer
notificar_esquecimento_ponto:
type: string
notificar_horas_extras:
type: string
notificar_solicitacao_pendentes:
type: string
notificar_banco_horas:
type: string
notificar_gestor:
type: string
relatorios_email:
type: string
relatorios_diario_gestor:
type: string
relatorios_semanal_colaboradores:
type: string
service_instance_id:
type: integer
examples:
application/json:
settings_notificacoes_list:
- id: 1
notificar_esquecimento_ponto: "True"
notificar_horas_extras: "True"
notificar_solicitacao_pendentes: "True"
notificar_banco_horas: "True"
notificar_gestor: "False"
relatorios_email: "True"
relatorios_diario_gestor: "False"
relatorios_semanal_colaboradores: "True"
service_instance_id: 1
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"
400:
description: Requisição inválida
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
application/json:
error: "Parâmetro inválido ou ausente"

View File

@ -0,0 +1,95 @@
tags:
- Settings Notificações
summary: Atualiza uma configuração de notificações existente
description: >
Essa rota permite atualizar uma configuração de notificações especificada pelo ID.
parameters:
- in: path
name: settings_id
required: true
schema:
type: integer
description: ID da configuração que será atualizada.
- in: body
name: body
description: Dados para a atualização da configuração de notificações.
required: true
schema:
type: object
properties:
notificar_esquecimento_ponto:
type: string
example: "True"
notificar_horas_extras:
type: string
example: "True"
notificar_solicitacao_pendentes:
type: string
example: "True"
notificar_banco_horas:
type: string
example: "True"
notificar_gestor:
type: string
example: "False"
relatorios_email:
type: string
example: "True"
relatorios_diario_gestor:
type: string
example: "False"
relatorios_semanal_colaboradores:
type: string
example: "True"
service_instance_id:
type: integer
example: 1
responses:
200:
description: Configuração de notificações atualizada com sucesso
content:
application/json:
schema:
type: object
properties:
message:
type: string
examples:
application/json:
message: "Configuração de notificações atualizada com sucesso"
400:
description: Requisição inválida
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"

View File

@ -7,8 +7,6 @@ class Holiday(db.Model):
name = db.Column(db.String(80), unique=True, nullable=True)
type = db.Column(db.String(80), nullable=True)
date = db.Column(db.Date, nullable=True)
estado = db.Column(db.String(80), nullable=True)
municipio = db.Column(db.String(80), nullable=True)
recorrente = db.Column(db.Boolean, default=True, nullable=False) # Se o feriado é recorrente (todo ano)
adicional_he = db.Column(db.Integer, nullable=False) # Percentual adicional de horas extras (%)

View File

@ -0,0 +1,18 @@
from extensions import db
class SettingsCalculoHoras(db.Model):
__tablename__ = "settings_calculo_horas"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
jornada_diaria = db.Column(db.Integer, nullable=True)
jornada_semanal = db.Column(db.Integer, nullable=True)
inicio_periodo_noturno = db.Column(db.Time, nullable=False)
fim_periodo_noturno = db.Column(db.Time, nullable=False)
desconto_atraso_automatico = db.Column(db.String(255), default=False)
tolerancia_para_descontos = db.Column(db.Integer, nullable=True)
arredondamento_minutos = db.Column(db.Integer, nullable=True)
service_instance_id = db.Column(db.Integer, db.ForeignKey('service_instance.id'), nullable=False)
def __repr__(self):
return f"<SettingsCalculoHoras id={self.id} service_instance_id={self.service_instance_id}>"

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}>"

View File

@ -0,0 +1,16 @@
from extensions import db
class SettingsIntegracoes(db.Model):
__tablename__ = "settings_integracoes"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
integrar_folha_pagamento = db.Column(db.String(255), default=False)
exportar_dados = db.Column(db.String(255), default=False)
exportacao_csv = db.Column(db.String(255), default=False)
exportacao_pdf = db.Column(db.String(255), default=False)
integrar_calendario = db.Column(db.String(255), default=False)
#----------------------------------------------------
service_instance_id = db.Column(db.Integer, db.ForeignKey('service_instance.id'), nullable=False)
def __repr__(self):
return f"<SettingsIntegracoes id={self.id} service_instance_id={self.service_instance_id}>"

View File

@ -0,0 +1,20 @@
from extensions import db
class SettingsNotificacoes(db.Model):
__tablename__ = "settings_notificacoes"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
notificar_esquecimento_ponto = db.Column(db.String(255), default=False)
notificar_horas_extras = db.Column(db.String(255), default=False)
notificar_solicitacao_pendentes = db.Column(db.String(255), default=False)
notificar_banco_horas = db.Column(db.String(255), default=False)
notificar_gestor = db.Column(db.String(255), default=False)
#---------------------------------------------------
relatorios_email = db.Column(db.String(255), default=False)
relatorios_diario_gestor = db.Column(db.String(255), default=False)
relatorios_semanal_colaboradores = db.Column(db.String(255), default=False)
#----------------------------------------------------
service_instance_id = db.Column(db.Integer, db.ForeignKey('service_instance.id'), nullable=False)
def __repr__(self):
return f"<SettingsNotificacoes id={self.id} service_instance_id={self.service_instance_id}>"

View File

@ -2,28 +2,39 @@ from datetime import datetime
from sqlalchemy import Column, Integer, String, ForeignKey, Time
from sqlalchemy.orm import relationship
from extensions import db
from models.time_schedule import TimeSchedule # Certo!
# 🔗 Tabela de associação many-to-many
shift_time_schedule = db.Table(
'shift_time_schedule',
db.Column('shift_id', db.Integer, db.ForeignKey('shift.id'), primary_key=True),
db.Column('time_schedule_id', db.Integer, db.ForeignKey('time_schedules.id'), primary_key=True)
)
class Shift(db.Model):
__tablename__ = 'shift'
id = db.Column(db.Integer, primary_key=True)
service_instance_id = db.Column(db.Integer, db.ForeignKey('service_instance.id'), nullable=False) # Relaciona com ServiceInstance
name = db.Column(db.String(50), nullable=False) # Nome do turno (Manhã, Tarde, etc.)
day = db.Column(db.String(20), nullable=False) # Ex: Segunda, Terça
service_instance_id = db.Column(db.Integer, db.ForeignKey('service_instance.id'), nullable=False)
name = db.Column(db.String(50), nullable=False)
start_time = db.Column(db.Time, nullable=False)
end_time = db.Column(db.Time, nullable=False)
interval_start = db.Column(db.Time, nullable=True)
interval_end = db.Column(db.Time, nullable=True)
type_interval = db.Column(db.String(50), nullable=False)
description = db.Column(db.String(255), nullable=True) # Descrição do turno
tolerance = db.Column(db.Integer, nullable=True) # Tolerância em minutos
# Relacionamento com o modelo TimeSchedule
time_schedules = db.relationship('TimeSchedule', backref='shifts', lazy=True)
# 🗓️ Relacionamento com os dias (TimeSchedule usados como dias da semana)
time_schedules = db.relationship(
'TimeSchedule',
secondary=shift_time_schedule,
backref='shifts',
lazy='subquery'
)
# Relacionamento com o modelo Record, utilizando a chave estrangeira corretamente
# Relacionamento com records
records = db.relationship("Record", back_populates="shifts", lazy=True)
def __repr__(self):

View File

@ -4,13 +4,11 @@ from datetime import datetime
# Modelo para TimeSchedule (Horários dentro de um turno)
class TimeSchedule(db.Model):
__tablename__ = 'time_schedules'
id = db.Column(db.Integer, primary_key=True)
shift_id = db.Column(db.Integer, db.ForeignKey('shift.id'), nullable=False) # Relaciona com Shift
start_time = db.Column(db.Time, nullable=False) # Hora de início do time slot
end_time = db.Column(db.Time, nullable=False) # Hora de término do time slot
description = db.Column(db.String(255)) # Descrição do time schedule (ex: 'Almoço')
name = db.Column(db.String(20), nullable=False, unique=True) # Ex: Segunda, Terça, etc.
records = db.relationship("Record", back_populates="schedule")
def __repr__(self):
return f'<TimeSchedule {self.description} ({self.start_time} - {self.end_time})>'
return f'<TimeSchedule {self.name}>'

View File

@ -16,8 +16,6 @@ def create_holiday():
name = data.get('name')
type = data.get('type')
date = data.get('date')
estado = data.get('estado')
municipio = data.get('municipio')
parent_id = data.get('parent_id')
adicional_he = data.get('adicional_he')
recorrente = data.get('recorrente', True) # Default True se não enviado
@ -27,8 +25,6 @@ def create_holiday():
name=name,
type=type,
date=date,
estado=estado,
municipio=municipio,
parent_id=parent_id,
service_instance_id=service_instance_id,
recorrente=recorrente,
@ -54,14 +50,14 @@ def update_holiday(holiday_id):
holiday.date = data['date']
if 'type' in data:
holiday.type = data['type']
if 'estado' in data:
holiday.estado = data['estado']
if 'municipio' in data:
holiday.municipio = data['municipio']
if 'service_instance_id' in data:
# Validação para garantir que a instância de serviço existe
ServiceInstance.query.get_or_404(data['service_instance_id'])
holiday.service_instance_id = data['service_instance_id']
if 'adicional_he' in data:
holiday.adicional_he = data['adicional_he']
if 'recorrente' in data:
holiday.recorrente = data['recorrente']
db.session.commit()
return jsonify({'message': 'Feriado atualizado com sucesso'}), 200
@ -81,8 +77,6 @@ def list_holiday():
'holiday_list': [{
'id': holiday.id,
'name': holiday.name,
'estado': holiday.estado,
'municipio': holiday.municipio,
'type': holiday.type,
'date': holiday.date.strftime("%Y-%m-%d") if holiday.date else None,
'parent_id': holiday.parent_id,
@ -102,12 +96,11 @@ def get_holiday_id(holiday_id):
return jsonify({
'id': holiday.id,
'name': holiday.name,
'estado': holiday.estado,
'municipio': holiday.municipio,
'type': holiday.type,
'date': holiday.date.strftime("%Y-%m-%d") if holiday.date else None,
'parent_id': holiday.parent_id,
'service_instance_id': holiday.service_instance_id
'service_instance_id': holiday.service_instance_id,
'adicional_he': holiday.adicional_he,
}), 200
# Deletar feriado

View File

@ -0,0 +1,116 @@
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_calculo_horas import SettingsCalculoHoras
settings_calculo_horas_bp = Blueprint('settings_calculo_horas', __name__, url_prefix='/settings_calculo_horas')
# Criar configurações de cálculo de horas
@settings_calculo_horas_bp.route('/', methods=['POST'])
@jwt_required()
@swag_from('../docs/settings_calculo_horas/create.yml')
def create_settings_calculo_horas():
data = request.get_json()
settings = SettingsCalculoHoras(
jornada_diaria=data.get('jornada_diaria'),
jornada_semanal=data.get('jornada_semanal'),
inicio_periodo_noturno=data['inicio_periodo_noturno'],
fim_periodo_noturno=data['fim_periodo_noturno'],
desconto_atraso_automatico=data.get('desconto_atraso_automatico', False),
tolerancia_para_descontos=data.get('tolerancia_para_descontos'),
arredondamento_minutos=data.get('arredondamento_minutos'),
service_instance_id=data['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 de cálculo de horas
@settings_calculo_horas_bp.route('/<int:settings_id>', methods=['PUT'])
@jwt_required()
@swag_from('../docs/settings_calculo_horas/update.yml')
def update_settings_calculo_horas(settings_id):
data = request.get_json()
settings = SettingsCalculoHoras.query.get_or_404(settings_id)
if 'jornada_diaria' in data:
settings.jornada_diaria = data['jornada_diaria']
if 'jornada_semanal' in data:
settings.jornada_semanal = data['jornada_semanal']
if 'inicio_periodo_noturno' in data:
settings.inicio_periodo_noturno = data['inicio_periodo_noturno']
if 'fim_periodo_noturno' in data:
settings.fim_periodo_noturno = data['fim_periodo_noturno']
if 'desconto_atraso_automatico' in data:
settings.desconto_atraso_automatico = data['desconto_atraso_automatico']
if 'tolerancia_para_descontos' in data:
settings.tolerancia_para_descontos = data['tolerancia_para_descontos']
if 'arredondamento_minutos' in data:
settings.arredondamento_minutos = data['arredondamento_minutos']
if 'service_instance_id' in data:
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 de cálculo de horas
@settings_calculo_horas_bp.route('/', methods=['GET'])
@jwt_required()
@swag_from('../docs/settings_calculo_horas/list.yml')
def list_settings_calculo_horas():
service_instance_id = request.args.get('service_instance_id')
if service_instance_id:
settings_list = SettingsCalculoHoras.query.filter_by(service_instance_id=service_instance_id).all()
else:
settings_list = SettingsCalculoHoras.query.all()
return jsonify({
'settings_calculo_horas_list': [
{
'id': s.id,
'jornada_diaria': s.jornada_diaria,
'jornada_semanal': s.jornada_semanal,
'inicio_periodo_noturno': s.inicio_periodo_noturno.isoformat(),
'fim_periodo_noturno': s.fim_periodo_noturno.isoformat(),
'desconto_atraso_automatico': s.desconto_atraso_automatico,
'tolerancia_para_descontos': s.tolerancia_para_descontos,
'arredondamento_minutos': s.arredondamento_minutos,
'service_instance_id': s.service_instance_id
} for s in settings_list
]
}), 200
# Obter configuração por ID
@settings_calculo_horas_bp.route('/<int:id>', methods=['GET'])
@jwt_required()
@swag_from('../docs/settings_calculo_horas/get.yml')
def get_settings_calculo_horas_by_id(id):
s = SettingsCalculoHoras.query.get_or_404(id)
return jsonify({
'id': s.id,
'jornada_diaria': s.jornada_diaria,
'jornada_semanal': s.jornada_semanal,
'inicio_periodo_noturno': s.inicio_periodo_noturno.isoformat(),
'fim_periodo_noturno': s.fim_periodo_noturno.isoformat(),
'desconto_atraso_automatico': s.desconto_atraso_automatico,
'tolerancia_para_descontos': s.tolerancia_para_descontos,
'arredondamento_minutos': s.arredondamento_minutos,
'service_instance_id': s.service_instance_id
}), 200
# Deletar configuração
@settings_calculo_horas_bp.route('/<int:id>', methods=['DELETE'])
@jwt_required()
@swag_from('../docs/settings_calculo_horas/delete.yml')
def delete_settings_calculo_horas(id):
s = SettingsCalculoHoras.query.get_or_404(id)
db.session.delete(s)
db.session.commit()
return jsonify({'message': 'Configuração deletada com sucesso.'}), 200

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

@ -0,0 +1,113 @@
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_integracoes import SettingsIntegracoes
settings_integracoes_bp = Blueprint('settings_integracoes', __name__, url_prefix='/settings_integracoes')
# Criar configuração de integrações
@settings_integracoes_bp.route('/', methods=['POST'])
@jwt_required()
@swag_from('../docs/settings_integracoes/create.yml')
def create_settings_integracoes():
data = request.get_json()
integrar_folha_pagamento = data.get('integrar_folha_pagamento', False)
exportar_dados = data.get('exportar_dados', False)
exportacao_csv = data.get('exportacao_csv', False)
exportacao_pdf = data.get('exportacao_pdf', False)
integrar_calendario = data.get('integrar_calendario', False)
service_instance_id = data.get('service_instance_id')
settings = SettingsIntegracoes(
integrar_folha_pagamento=integrar_folha_pagamento,
exportar_dados=exportar_dados,
exportacao_csv=exportacao_csv,
exportacao_pdf=exportacao_pdf,
integrar_calendario=integrar_calendario,
service_instance_id=service_instance_id
)
db.session.add(settings)
db.session.commit()
return jsonify({'message': 'Configuração de integrações criada com sucesso', 'settings_id': settings.id}), 201
# Atualizar configuração
@settings_integracoes_bp.route('/<int:settings_id>', methods=['PUT'])
@jwt_required()
@swag_from('../docs/settings_integracoes/update.yml')
def update_settings_integracoes(settings_id):
data = request.get_json()
settings = SettingsIntegracoes.query.get_or_404(settings_id)
if 'integrar_folha_pagamento' in data:
settings.integrar_folha_pagamento = data['integrar_folha_pagamento']
if 'exportar_dados' in data:
settings.exportar_dados = data['exportar_dados']
if 'exportacao_csv' in data:
settings.exportacao_csv = data['exportacao_csv']
if 'exportacao_pdf' in data:
settings.exportacao_pdf = data['exportacao_pdf']
if 'integrar_calendario' in data:
settings.integrar_calendario = data['integrar_calendario']
if 'service_instance_id' in data:
from models import ServiceInstance
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 de integrações atualizada com sucesso'}), 200
# Listar configurações
@settings_integracoes_bp.route('/', methods=['GET'])
@jwt_required()
@swag_from('../docs/settings_integracoes/list.yml')
def list_settings_integracoes():
service_instance_id = request.args.get('service_instance_id')
if service_instance_id:
settings_list = SettingsIntegracoes.query.filter_by(service_instance_id=service_instance_id).all()
else:
settings_list = SettingsIntegracoes.query.all()
return jsonify({
'settings_integracoes_list': [
{
'id': s.id,
'integrar_folha_pagamento': s.integrar_folha_pagamento,
'exportar_dados': s.exportar_dados,
'exportacao_csv': s.exportacao_csv,
'exportacao_pdf': s.exportacao_pdf,
'integrar_calendario': s.integrar_calendario,
'service_instance_id': s.service_instance_id
} for s in settings_list
]
}), 200
# Obter por ID
@settings_integracoes_bp.route('/<int:id>', methods=['GET'])
@jwt_required()
@swag_from('../docs/settings_integracoes/get.yml')
def get_settings_integracoes_by_id(id):
s = SettingsIntegracoes.query.get_or_404(id)
return jsonify({
'id': s.id,
'integrar_folha_pagamento': s.integrar_folha_pagamento,
'exportar_dados': s.exportar_dados,
'exportacao_csv': s.exportacao_csv,
'exportacao_pdf': s.exportacao_pdf,
'integrar_calendario': s.integrar_calendario,
'service_instance_id': s.service_instance_id
}), 200
# Deletar configuração
@settings_integracoes_bp.route('/<int:id>', methods=['DELETE'])
@jwt_required()
@swag_from('../docs/settings_integracoes/delete.yml')
def delete_settings_integracoes(id):
s = SettingsIntegracoes.query.get_or_404(id)
db.session.delete(s)
db.session.commit()
return jsonify({'message': 'Configuração deletada com sucesso.'}), 200

View File

@ -0,0 +1,131 @@
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_notificacoes import SettingsNotificacoes
settings_notificacoes_bp = Blueprint('settings_notificacoes', __name__, url_prefix='/settings_notificacoes')
# Criar configuração de notificações
@settings_notificacoes_bp.route('/', methods=['POST'])
@jwt_required()
@swag_from('../docs/settings_notificacoes/create.yml')
def create_settings_notificacoes():
data = request.get_json()
notificar_esquecimento_ponto = data.get('notificar_esquecimento_ponto', False)
notificar_horas_extras = data.get('notificar_horas_extras', False)
notificar_solicitacao_pendentes = data.get('notificar_solicitacao_pendentes', False)
notificar_banco_horas = data.get('notificar_banco_horas', False)
notificar_gestor = data.get('notificar_gestor', False)
relatorios_email = data.get('relatorios_email', False)
relatorios_diario_gestor = data.get('relatorios_diario_gestor', False)
relatorios_semanal_colaboradores = data.get('relatorios_semanal_colaboradores', False)
service_instance_id = data.get('service_instance_id')
settings = SettingsNotificacoes(
notificar_esquecimento_ponto=notificar_esquecimento_ponto,
notificar_horas_extras=notificar_horas_extras,
notificar_solicitacao_pendentes=notificar_solicitacao_pendentes,
notificar_banco_horas=notificar_banco_horas,
notificar_gestor=notificar_gestor,
relatorios_email=relatorios_email,
relatorios_diario_gestor=relatorios_diario_gestor,
relatorios_semanal_colaboradores=relatorios_semanal_colaboradores,
service_instance_id=service_instance_id
)
db.session.add(settings)
db.session.commit()
return jsonify({'message': 'Configuração de notificações criada com sucesso', 'settings_id': settings.id}), 201
# Atualizar configuração
@settings_notificacoes_bp.route('/<int:settings_id>', methods=['PUT'])
@jwt_required()
@swag_from('../docs/settings_notificacoes/update.yml')
def update_settings_notificacoes(settings_id):
data = request.get_json()
settings = SettingsNotificacoes.query.get_or_404(settings_id)
if 'notificar_esquecimento_ponto' in data:
settings.notificar_esquecimento_ponto = data['notificar_esquecimento_ponto']
if 'notificar_horas_extras' in data:
settings.notificar_horas_extras = data['notificar_horas_extras']
if 'notificar_solicitacao_pendentes' in data:
settings.notificar_solicitacao_pendentes = data['notificar_solicitacao_pendentes']
if 'notificar_banco_horas' in data:
settings.notificar_banco_horas = data['notificar_banco_horas']
if 'notificar_gestor' in data:
settings.notificar_gestor = data['notificar_gestor']
if 'relatorios_email' in data:
settings.relatorios_email = data['relatorios_email']
if 'relatorios_diario_gestor' in data:
settings.relatorios_diario_gestor = data['relatorios_diario_gestor']
if 'relatorios_semanal_colaboradores' in data:
settings.relatorios_semanal_colaboradores = data['relatorios_semanal_colaboradores']
if 'service_instance_id' in data:
from models import ServiceInstance
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 de notificações atualizada com sucesso'}), 200
# Listar configurações
@settings_notificacoes_bp.route('/', methods=['GET'])
@jwt_required()
@swag_from('../docs/settings_notificacoes/list.yml')
def list_settings_notificacoes():
service_instance_id = request.args.get('service_instance_id')
if service_instance_id:
settings_list = SettingsNotificacoes.query.filter_by(service_instance_id=service_instance_id).all()
else:
settings_list = SettingsNotificacoes.query.all()
return jsonify({
'settings_notificacoes_list': [
{
'id': s.id,
'notificar_esquecimento_ponto': s.notificar_esquecimento_ponto,
'notificar_horas_extras': s.notificar_horas_extras,
'notificar_solicitacao_pendentes': s.notificar_solicitacao_pendentes,
'notificar_banco_horas': s.notificar_banco_horas,
'notificar_gestor': s.notificar_gestor,
'relatorios_email': s.relatorios_email,
'relatorios_diario_gestor': s.relatorios_diario_gestor,
'relatorios_semanal_colaboradores': s.relatorios_semanal_colaboradores,
'service_instance_id': s.service_instance_id
} for s in settings_list
]
}), 200
# Obter por ID
@settings_notificacoes_bp.route('/<int:id>', methods=['GET'])
@jwt_required()
@swag_from('../docs/settings_notificacoes/get.yml')
def get_settings_notificacoes_by_id(id):
s = SettingsNotificacoes.query.get_or_404(id)
return jsonify({
'id': s.id,
'notificar_esquecimento_ponto': s.notificar_esquecimento_ponto,
'notificar_horas_extras': s.notificar_horas_extras,
'notificar_solicitacao_pendentes': s.notificar_solicitacao_pendentes,
'notificar_banco_horas': s.notificar_banco_horas,
'notificar_gestor': s.notificar_gestor,
'relatorios_email': s.relatorios_email,
'relatorios_diario_gestor': s.relatorios_diario_gestor,
'relatorios_semanal_colaboradores': s.relatorios_semanal_colaboradores,
'service_instance_id': s.service_instance_id
}), 200
# Deletar configuração
@settings_notificacoes_bp.route('/<int:id>', methods=['DELETE'])
@jwt_required()
@swag_from('../docs/settings_notificacoes/delete.yml')
def delete_settings_notificacoes(id):
s = SettingsNotificacoes.query.get_or_404(id)
db.session.delete(s)
db.session.commit()
return jsonify({'message': 'Configuração deletada com sucesso.'}), 200

View File

@ -2,31 +2,36 @@ from flask import Blueprint, request, jsonify
from flasgger.utils import swag_from
from models.shifts import Shift, db
from models.service_instance import ServiceInstance
from models.time_schedule import TimeSchedule
shift_bp = Blueprint('shift', __name__, url_prefix='/shift/')
# Criar um turno
@shift_bp.route('/', methods=['POST'])
@swag_from('../docs/shifts/create.yml')
def create_shift():
"""Cria um novo turno."""
data = request.get_json()
# Verifica se a service_instance existe
service_instance_id = data.get('service_instance_id')
ServiceInstance.query.get_or_404(service_instance_id)
# Cria o turno
shift = Shift(
name=data['name'],
day=data['day'],
start_time=data['start_time'],
end_time=data['end_time'],
interval_start=data['interval_start'],
interval_end=data['interval_end'],
interval_start=data.get('interval_start'),
interval_end=data.get('interval_end'),
type_interval=data['type_interval'],
service_instance_id=data['service_instance_id']
service_instance_id=service_instance_id,
description=data.get('description'), # Adicionando a descrição
tolerance=data.get('tolerance'), # Adicionando a tolerância
)
# Associa os dias (TimeSchedules)
time_schedule_ids = data.get('time_schedule_ids', [])
if time_schedule_ids:
shift.time_schedules = TimeSchedule.query.filter(TimeSchedule.id.in_(time_schedule_ids)).all()
db.session.add(shift)
db.session.commit()
@ -39,34 +44,45 @@ def create_shift():
def update_shift(shift_id):
"""Atualiza um turno existente."""
data = request.get_json()
print(data)
# Localiza o turno ou retorna 404
shift = Shift.query.get_or_404(shift_id)
# Atualiza os campos fornecidos no body
if 'name' in data:
shift.name = data['name']
if 'day' in data:
shift.days = data['day']
if 'start_time' in data:
if 'start_time' in data:
shift.start_time = data['start_time']
if 'end_time' in data:
shift.end_time=data['end_time']
shift.end_time = data['end_time']
if 'interval_start' in data:
shift.interval_start=data['interval_start']
shift.interval_start = data['interval_start']
if 'interval_end' in data:
shift.interval_end=data['interval_end']
shift.interval_end = data['interval_end']
if 'type_interval' in data:
shift.type_interval=data['type_interval']
shift.type_interval = data['type_interval']
if 'description' in data:
shift.description = data['description']
if 'tolerance' in data:
shift.tolerance = data['tolerance']
if 'service_instance_id' in data:
ServiceInstance.query.get_or_404(data['service_instance_id']) # Valida a existência
shift.service_instance_id = data['service_instance_id']
# Atualiza os dias (TimeSchedules)
if 'time_schedule_ids' in data:
# Recebe a lista de IDs dos dias a serem associados ao turno
time_schedule_ids = data['time_schedule_ids']
# Verifica se os IDs existem no banco e atualiza a associação
shift.time_schedules = TimeSchedule.query.filter(TimeSchedule.id.in_(time_schedule_ids)).all()
db.session.commit()
return jsonify({'message': 'Shift updated successfully'}), 200
# Listar turnos
@shift_bp.route('/', methods=['GET'])
@swag_from('../docs/shifts/list.yml')
@ -84,17 +100,26 @@ def list_shifts():
shift_list = [{
'id': shift.id,
'name': shift.name,
'day': shift.day,
"start_time": shift.start_time.strftime("%H:%M"),
"end_time": shift.end_time.strftime("%H:%M"),
"interval_start": shift.interval_start.strftime("%H:%M") if shift.interval_start else None,
"interval_end": shift.interval_end.strftime("%H:%M") if shift.interval_end else None,
'type_interval' : shift.type_interval,
'service_instance_id': shift.service_instance_id
'type_interval': shift.type_interval,
'service_instance_id': shift.service_instance_id,
'description': shift.description,
'tolerance': shift.tolerance,
# Adicionando a tolerância
# Adicionando os dias associados (TimeSchedules)
'time_schedules': [
{'id': ts.id, 'name': ts.name} for ts in shift.time_schedules
]
} for shift in shifts]
return jsonify(shift_list), 200
@shift_bp.route('/<int:shift_id>', methods=['GET'])
@swag_from('../docs/shifts/get.yml')
def get_shift_id(shift_id):
@ -105,12 +130,17 @@ def get_shift_id(shift_id):
return jsonify({
'id': shift.id,
'name': shift.name,
'day': shift.day,
#'day': shift.day,
"start_time": shift.start_time.strftime("%H:%M"),
"end_time": shift.end_time.strftime("%H:%M"),
"interval_start": shift.interval_start.strftime("%H:%M") if shift.interval_start else None,
"interval_end": shift.interval_end.strftime("%H:%M") if shift.interval_end else None,
'type_interval' : shift.type_interval,
'description': shift.description,
'tolerance': shift.tolerance,
'time_schedules': [
{'id': ts.id, 'name': ts.name} for ts in shift.time_schedules
],
'service_instance_id': shift.service_instance_id}),200

View File

@ -342,6 +342,6 @@ def delete_user(user_id):
return jsonify({'message': 'Usuário já está inativo'}), 400
# Atualiza o status para inativo
user.status = "inativo"
user.status = "Inativo"
db.session.commit()
return jsonify({'message': 'Usuário excluído com sucesso'}), 200

View File

@ -17,38 +17,29 @@ def seed_holiday():
"estado":"Rio de Janeiro",
"municipio":"Rio de Janeiro",
},
}
# Feriado 2
{
"parent_id": 1,
"service_instance_id":4,
"name": "Dia das crianças",
"date": data_iso2,
"estado":"Rio de Janeiro",
"municipio":"Rio de Janeiro",
},
]
for holiday_data in holidays:
# Verifica se já existe um papel para o service_id e name fornecidos
existing_holiday = db.session.query(Holiday).filter_by(
date=holiday_data["date"],
name=holiday_data["name"]
).first()
# Se não existe, cria o novo papel
if not existing_holiday:
holiday = Holiday(
# Verifica se já existe um papel para o service_id e name fornecidos
existing_holiday = db.session.query(Holiday).filter_by(
date=holiday_data["date"],
service_instance_id=holiday_data["service_instance_id"],
name=holiday_data["name"],
parent_id=holiday_data["parent_id"],
estado=holiday_data["estado"],
municipio=holiday_data["municipio"]
)
print("antes do banco")
db.session.add(holiday)
print("adiconei no banco")
# Commit a transação para salvar os dados no banco
db.session.commit()
name=holiday_data["name"]
).first()
# Se não existe, cria o novo papel
if not existing_holiday:
holiday = Holiday(
date=holiday_data["date"],
service_instance_id=holiday_data["service_instance_id"],
name=holiday_data["name"],
parent_id=holiday_data["parent_id"],
estado=holiday_data["estado"],
municipio=holiday_data["municipio"]
)
print("antes do banco")
db.session.add(holiday)
print("adiconei no banco")
# Commit a transação para salvar os dados no banco
db.session.commit()

View File

@ -14,32 +14,40 @@ from .camera_seed import seed_cameras
from .ambiente_seed import seed_ambiente
from .reports_seed import reports_seed
from .shifts_times_seed import seed_shifts_and_schedules
from .holiday_seed import seed_holiday
from .company_seed import seed_company
from .time_schedule import seed_time_schedules
from .settings_gerais_seed import seed_settings_gerais
from .settings_calculo_horas_seed import seed_settings_calculo_horas
from .settings_integracoes_seed import seed_settings_integracoes
from .settings_notificacoes_seed import seed_settings_notificacoes
from extensions import db
####### checar seeds holiday, esta quebrando o codigo
def run_all_seeds():
try:
print("Iniciando o processo de seed...")
seed_services()
seed_holiday()
# seed_holiday()
seed_service_instances()
seed_company()
# seed_company()
seed_permissions()
seed_service_roles()
seed_service_role_permissions()
seed_users()
seed_address_types()
seed_address()
# seed_address_types()
# seed_address()
#seed_contacts()
seed_user_service_roles()
seed_licenses()
seed_ambiente()
reports_seed()
seed_cameras()
seed_shifts_and_schedules()
seed_holiday()
# seed_user_service_roles()
# seed_licenses()
# seed_ambiente()
# reports_seed()
# seed_cameras()
#seed_shifts_and_schedules()
#seed_time_schedules()
seed_settings_gerais()
seed_settings_calculo_horas()
seed_settings_integracoes()
seed_settings_notificacoes()
print("Seeds executados com sucesso!")
except Exception as e:

View File

@ -0,0 +1,38 @@
from extensions import db
from models.settings_calculo_horas import SettingsCalculoHoras
def seed_settings_calculo_horas():
settings_data = [
{
"service_instance_id": 1,
"jornada_diaria": 480, # minutos
"jornada_semanal": 2400, # minutos
"inicio_periodo_noturno": "22:00:00",
"fim_periodo_noturno": "05:00:00",
"desconto_atraso_automatico": "True",
"tolerancia_para_descontos": 10,
"arredondamento_minutos": 5
}
]
for setting in settings_data:
existing = db.session.query(SettingsCalculoHoras).filter_by(
service_instance_id=setting["service_instance_id"]
).first()
if not existing:
new_setting = SettingsCalculoHoras(
service_instance_id=setting["service_instance_id"],
jornada_diaria=setting["jornada_diaria"],
jornada_semanal=setting["jornada_semanal"],
inicio_periodo_noturno=setting["inicio_periodo_noturno"],
fim_periodo_noturno=setting["fim_periodo_noturno"],
desconto_atraso_automatico=setting["desconto_atraso_automatico"],
tolerancia_para_descontos=setting["tolerancia_para_descontos"],
arredondamento_minutos=setting["arredondamento_minutos"]
)
print("antes do banco")
db.session.add(new_setting)
print("adicionei no banco")
db.session.commit()

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()

View File

@ -0,0 +1,34 @@
from extensions import db
from models.settings_integracoes import SettingsIntegracoes
def seed_settings_integracoes():
settings_data = [
{
"service_instance_id": 1,
"integrar_folha_pagamento": "True",
"exportar_dados": "True",
"exportacao_csv": "True",
"exportacao_pdf": "False",
"integrar_calendario": "True"
}
]
for setting in settings_data:
existing = db.session.query(SettingsIntegracoes).filter_by(
service_instance_id=setting["service_instance_id"]
).first()
if not existing:
new_setting = SettingsIntegracoes(
service_instance_id=setting["service_instance_id"],
integrar_folha_pagamento=setting["integrar_folha_pagamento"],
exportar_dados=setting["exportar_dados"],
exportacao_csv=setting["exportacao_csv"],
exportacao_pdf=setting["exportacao_pdf"],
integrar_calendario=setting["integrar_calendario"]
)
print("antes do banco")
db.session.add(new_setting)
print("adicionei no banco")
db.session.commit()

View File

@ -0,0 +1,40 @@
from extensions import db
from models.settings_notificacoes import SettingsNotificacoes
def seed_settings_notificacoes():
settings_data = [
{
"service_instance_id": 1,
"notificar_esquecimento_ponto": "True",
"notificar_horas_extras": "True",
"notificar_solicitacao_pendentes": "True",
"notificar_banco_horas": "True",
"notificar_gestor": "False",
"relatorios_email": "True",
"relatorios_diario_gestor": "False",
"relatorios_semanal_colaboradores": "True"
}
]
for setting in settings_data:
existing = db.session.query(SettingsNotificacoes).filter_by(
service_instance_id=setting["service_instance_id"]
).first()
if not existing:
new_setting = SettingsNotificacoes(
service_instance_id=setting["service_instance_id"],
notificar_esquecimento_ponto=setting["notificar_esquecimento_ponto"],
notificar_horas_extras=setting["notificar_horas_extras"],
notificar_solicitacao_pendentes=setting["notificar_solicitacao_pendentes"],
notificar_banco_horas=setting["notificar_banco_horas"],
notificar_gestor=setting["notificar_gestor"],
relatorios_email=setting["relatorios_email"],
relatorios_diario_gestor=setting["relatorios_diario_gestor"],
relatorios_semanal_colaboradores=setting["relatorios_semanal_colaboradores"]
)
print("antes do banco")
db.session.add(new_setting)
print("adicionei no banco")
db.session.commit()

30
seeds/time_schedule.py Normal file
View File

@ -0,0 +1,30 @@
from extensions import db
from models.time_schedule import TimeSchedule
def seed_time_schedules():
# Lista de dias da semana
days = [
{"id": 1, "name": "Domingo"},
{"id": 2, "name": "Segunda-feira"},
{"id": 3, "name": "Terça-feira"},
{"id": 4, "name": "Quarta-feira"},
{"id": 5, "name": "Quinta-feira"},
{"id": 6, "name": "Sexta-feira"},
{"id": 7, "name": "Sábado"},
]
# Verifica se já existe algum dia na tabela
existing_days = TimeSchedule.query.all()
existing_names = [day.name for day in existing_days]
for day in days:
if day["name"] in existing_names:
print(f"Dia '{day['name']}' já existe. Pulando...")
continue
# Cria e adiciona o dia
new_day = TimeSchedule(id=day["id"], name=day["name"])
db.session.add(new_day)
db.session.commit()
print("Dias da semana criados com sucesso, se não existirem.")

View File

@ -66,8 +66,7 @@ def seed_users():
user = User(
username=user_data["username"],
email=user_data["email"],
phone=user_data["phone"],
service_role_id=user_data["service_role_id"]
service_instance_id=user_data["service_instance_id"]
)
user.set_password(user_data["password"]) # Gerar o hash da senha
db.session.add(user)