Co-authored-by: OpenAI/GPT-5.6-Terra <vibecoder@antoineve.me> Co-authored-by: Google/Gemini-3.5-Flash <vibecoder@antoineve.me> Co-authored-by: DeepSeek/DeepSeek-v4-Pro <vibecoder@antoineve.me> Co-authored-by: DeepSeek/DeepSeek-v4-Flash <vibecoder@antoineve.me>
78 lines
2.3 KiB
Python
78 lines
2.3 KiB
Python
from datetime import date
|
|
|
|
import sqlalchemy as sa
|
|
|
|
from app import db
|
|
from app.models import LeaveBalance, WorkEntry
|
|
|
|
|
|
def compute_leave_used(year: int) -> dict[str, int]:
|
|
"""
|
|
Calcule le nombre de jours de congés et de RTT consommés pour une année donnée.
|
|
|
|
Cette fonction interroge la base de données pour compter le nombre d'entrées
|
|
de journal (`WorkEntry`) de type 'CONGE' et 'RTT' comprises entre le 1er janvier
|
|
et le 31 décembre de l'année spécifiée.
|
|
|
|
Accès DB :
|
|
- Lecture seule sur la table `work_entries`.
|
|
|
|
Paramètres :
|
|
year (int) : L'année pour laquelle calculer les jours consommés.
|
|
|
|
Retour :
|
|
dict[str, int] : Un dictionnaire contenant :
|
|
- "conges" (int) : Le nombre de jours de congés consommés.
|
|
- "rtt" (int) : Le nombre de jours de RTT consommés.
|
|
"""
|
|
start = date(year, 1, 1)
|
|
end = date(year, 12, 31)
|
|
|
|
conges = (
|
|
db.session.scalar(
|
|
sa.select(sa.func.count()).where(
|
|
WorkEntry.date.between(start, end),
|
|
WorkEntry.day_type == "CONGE",
|
|
)
|
|
)
|
|
or 0
|
|
)
|
|
|
|
rtt = (
|
|
db.session.scalar(
|
|
sa.select(sa.func.count()).where(
|
|
WorkEntry.date.between(start, end),
|
|
WorkEntry.day_type == "RTT",
|
|
)
|
|
)
|
|
or 0
|
|
)
|
|
|
|
return {"conges": conges, "rtt": rtt}
|
|
|
|
|
|
def get_or_create_balance(year: int) -> LeaveBalance:
|
|
"""
|
|
Récupère le solde annuel des congés et RTT pour une année donnée, ou le crée s'il n'existe pas.
|
|
|
|
Si aucun solde n'existe pour l'année spécifiée, un nouvel enregistrement `LeaveBalance`
|
|
est créé avec les valeurs par défaut (28 jours de congés, 19 jours de RTT) et enregistré
|
|
en base de données.
|
|
|
|
Accès DB :
|
|
- Lecture sur la table `leave_balance`.
|
|
- Écriture (insertion et commit) si l'enregistrement n'existe pas.
|
|
|
|
Paramètres :
|
|
year (int) : L'année concernée.
|
|
|
|
Retour :
|
|
LeaveBalance : L'objet représentant le solde annuel pour l'année spécifiée.
|
|
"""
|
|
balance = db.session.scalar(sa.select(LeaveBalance).where(LeaveBalance.year == year))
|
|
if balance is None:
|
|
balance = LeaveBalance(year=year)
|
|
db.session.add(balance)
|
|
db.session.commit()
|
|
return balance
|