Merge branch 'Feature-holiday' of http://git.tarslabs.io:3000/TARS/API_Farmacia into futura_main

This commit is contained in:
ka-lucas 2025-04-30 16:46:47 -03:00
commit d5ca0d4991
5 changed files with 116 additions and 51 deletions

View File

@ -2,28 +2,39 @@ from datetime import datetime
from sqlalchemy import Column, Integer, String, ForeignKey, Time from sqlalchemy import Column, Integer, String, ForeignKey, Time
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
from extensions import db 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): class Shift(db.Model):
__tablename__ = 'shift' __tablename__ = 'shift'
id = db.Column(db.Integer, primary_key=True) 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 service_instance_id = db.Column(db.Integer, db.ForeignKey('service_instance.id'), nullable=False)
name = db.Column(db.String(50), nullable=False) # Nome do turno (Manhã, Tarde, etc.) name = db.Column(db.String(50), nullable=False)
day = db.Column(db.String(20), nullable=False) # Ex: Segunda, Terça
start_time = db.Column(db.Time, nullable=False) start_time = db.Column(db.Time, nullable=False)
end_time = db.Column(db.Time, nullable=False) end_time = db.Column(db.Time, nullable=False)
interval_start = db.Column(db.Time, nullable=True) interval_start = db.Column(db.Time, nullable=True)
interval_end = db.Column(db.Time, nullable=True) interval_end = db.Column(db.Time, nullable=True)
type_interval = db.Column(db.String(50), nullable=False) 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 # 🗓️ Relacionamento com os dias (TimeSchedule usados como dias da semana)
time_schedules = db.relationship('TimeSchedule', backref='shifts', lazy=True) 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) records = db.relationship("Record", back_populates="shifts", lazy=True)
def __repr__(self): def __repr__(self):

View File

@ -6,11 +6,9 @@ class TimeSchedule(db.Model):
__tablename__ = 'time_schedules' __tablename__ = 'time_schedules'
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
shift_id = db.Column(db.Integer, db.ForeignKey('shift.id'), nullable=False) # Relaciona com Shift name = db.Column(db.String(20), nullable=False, unique=True) # Ex: Segunda, Terça, etc.
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')
records = db.relationship("Record", back_populates="schedule") records = db.relationship("Record", back_populates="schedule")
def __repr__(self): def __repr__(self):
return f'<TimeSchedule {self.description} ({self.start_time} - {self.end_time})>' return f'<TimeSchedule {self.name}>'

View File

@ -2,31 +2,36 @@ from flask import Blueprint, request, jsonify
from flasgger.utils import swag_from from flasgger.utils import swag_from
from models.shifts import Shift, db from models.shifts import Shift, db
from models.service_instance import ServiceInstance from models.service_instance import ServiceInstance
from models.time_schedule import TimeSchedule
shift_bp = Blueprint('shift', __name__, url_prefix='/shift/') shift_bp = Blueprint('shift', __name__, url_prefix='/shift/')
# Criar um turno # Criar um turno
@shift_bp.route('/', methods=['POST']) @shift_bp.route('/', methods=['POST'])
@swag_from('../docs/shifts/create.yml')
def create_shift(): def create_shift():
"""Cria um novo turno."""
data = request.get_json() data = request.get_json()
# Verifica se a service_instance existe
service_instance_id = data.get('service_instance_id') service_instance_id = data.get('service_instance_id')
ServiceInstance.query.get_or_404(service_instance_id) ServiceInstance.query.get_or_404(service_instance_id)
# Cria o turno # Cria o turno
shift = Shift( shift = Shift(
name=data['name'], name=data['name'],
day=data['day'],
start_time=data['start_time'], start_time=data['start_time'],
end_time=data['end_time'], end_time=data['end_time'],
interval_start=data['interval_start'], interval_start=data.get('interval_start'),
interval_end=data['interval_end'], interval_end=data.get('interval_end'),
type_interval=data['type_interval'], 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.add(shift)
db.session.commit() db.session.commit()
@ -39,34 +44,45 @@ def create_shift():
def update_shift(shift_id): def update_shift(shift_id):
"""Atualiza um turno existente.""" """Atualiza um turno existente."""
data = request.get_json() data = request.get_json()
print(data)
# Localiza o turno ou retorna 404 # Localiza o turno ou retorna 404
shift = Shift.query.get_or_404(shift_id) shift = Shift.query.get_or_404(shift_id)
# Atualiza os campos fornecidos no body # Atualiza os campos fornecidos no body
if 'name' in data: if 'name' in data:
shift.name = data['name'] 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'] shift.start_time = data['start_time']
if 'end_time' in data: if 'end_time' in data:
shift.end_time=data['end_time'] shift.end_time = data['end_time']
if 'interval_start' in data: if 'interval_start' in data:
shift.interval_start=data['interval_start'] shift.interval_start = data['interval_start']
if 'interval_end' in data: if 'interval_end' in data:
shift.interval_end=data['interval_end'] shift.interval_end = data['interval_end']
if 'type_interval' in data: 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: if 'service_instance_id' in data:
ServiceInstance.query.get_or_404(data['service_instance_id']) # Valida a existência ServiceInstance.query.get_or_404(data['service_instance_id']) # Valida a existência
shift.service_instance_id = data['service_instance_id'] 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() db.session.commit()
return jsonify({'message': 'Shift updated successfully'}), 200 return jsonify({'message': 'Shift updated successfully'}), 200
# Listar turnos # Listar turnos
@shift_bp.route('/', methods=['GET']) @shift_bp.route('/', methods=['GET'])
@swag_from('../docs/shifts/list.yml') @swag_from('../docs/shifts/list.yml')
@ -84,17 +100,25 @@ def list_shifts():
shift_list = [{ shift_list = [{
'id': shift.id, 'id': shift.id,
'name': shift.name, 'name': shift.name,
'day': shift.day,
"start_time": shift.start_time.strftime("%H:%M"), "start_time": shift.start_time.strftime("%H:%M"),
"end_time": shift.end_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_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, "interval_end": shift.interval_end.strftime("%H:%M") if shift.interval_end else None,
'type_interval' : shift.type_interval, 'type_interval': shift.type_interval,
'service_instance_id': shift.service_instance_id 'service_instance_id': shift.service_instance_id,
'description': shift.description, # Adicionando a descrição
'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] } for shift in shifts]
return jsonify(shift_list), 200 return jsonify(shift_list), 200
@shift_bp.route('/<int:shift_id>', methods=['GET']) @shift_bp.route('/<int:shift_id>', methods=['GET'])
@swag_from('../docs/shifts/get.yml') @swag_from('../docs/shifts/get.yml')
def get_shift_id(shift_id): def get_shift_id(shift_id):

View File

@ -16,30 +16,32 @@ from .reports_seed import reports_seed
from .shifts_times_seed import seed_shifts_and_schedules from .shifts_times_seed import seed_shifts_and_schedules
from .holiday_seed import seed_holiday from .holiday_seed import seed_holiday
from .company_seed import seed_company from .company_seed import seed_company
from .time_schedule import seed_time_schedules
from extensions import db from extensions import db
def run_all_seeds(): def run_all_seeds():
try: try:
print("Iniciando o processo de seed...") print("Iniciando o processo de seed...")
seed_services() # seed_services()
seed_holiday() # seed_holiday()
seed_service_instances() # seed_service_instances()
seed_company() # seed_company()
seed_permissions() # seed_permissions()
seed_service_roles() # seed_service_roles()
seed_service_role_permissions() # seed_service_role_permissions()
seed_users() # seed_users()
seed_address_types() # seed_address_types()
seed_address() # seed_address()
#seed_contacts() #seed_contacts()
seed_user_service_roles() # seed_user_service_roles()
seed_licenses() # seed_licenses()
seed_ambiente() # seed_ambiente()
reports_seed() # reports_seed()
seed_cameras() # seed_cameras()
seed_shifts_and_schedules() # seed_shifts_and_schedules()
seed_holiday() # seed_holiday()
seed_time_schedules()
print("Seeds executados com sucesso!") print("Seeds executados com sucesso!")
except Exception as e: except Exception as e:

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.")