loko/streetup/contracts/signals.py
2026-07-22 14:48:40 +02:00

84 lines
2.9 KiB
Python

from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from contracts.models import ContractOrderQuote, ContractOrderQuoteItem
@receiver(post_save, sender=ContractOrderQuote)
def update_order_total_on_quote_save(sender, instance, **kwargs):
"""
Met à jour le total_amount de la commande lorsqu'un devis est créé ou modifié.
"""
order = instance.order
order.total_amount = instance.get_total_amount()
order.save(update_fields=['total_amount'])
@receiver(post_delete, sender=ContractOrderQuote)
def clear_order_total_on_quote_delete(sender, instance, **kwargs):
"""
Réinitialise le total_amount de la commande lorsqu'un devis est supprimé.
"""
order = instance.order
order.total_amount = 0
order.save(update_fields=['total_amount'])
@receiver(post_save, sender=ContractOrderQuoteItem)
def update_order_total_on_quote_item_save(sender, instance, **kwargs):
"""
Met à jour le total_amount de la commande lorsqu'un item du devis est créé ou modifié.
"""
quote = instance.quote
order = quote.order
order.total_amount = quote.get_total_amount()
order.save(update_fields=['total_amount'])
@receiver(post_delete, sender=ContractOrderQuoteItem)
def update_order_total_on_quote_item_delete(sender, instance, **kwargs):
"""
Met à jour le total_amount de la commande lorsqu'un item du devis est supprimé.
"""
quote = instance.quote
order = quote.order
order.total_amount = quote.get_total_amount()
order.save(update_fields=['total_amount'])
from django.db.models.signals import m2m_changed
from contracts.models import CompanyMember, CompanyMemberHistory
from django.utils import timezone
@receiver(m2m_changed, sender=CompanyMember.teams.through)
def update_member_team_history(sender, instance, action, reverse, pk_set, **kwargs):
if reverse:
return
today = timezone.now().date()
if action == "post_add":
# Pour chaque équipe ajoutée, on crée un enregistrement d'historique s'il n'existe pas déjà de période active
for team_id in pk_set:
CompanyMemberHistory.objects.get_or_create(
member=instance,
team_id=team_id,
leave_date__isnull=True,
defaults={'join_date': today}
)
elif action == "post_remove":
# Pour chaque équipe retirée, on clôture la période d'appartenance active
for team_id in pk_set:
CompanyMemberHistory.objects.filter(
member=instance,
team_id=team_id,
leave_date__isnull=True
).update(leave_date=today)
elif action == "pre_clear":
# Avant d'effacer toutes les équipes d'un membre, on clôture toutes les périodes actives
CompanyMemberHistory.objects.filter(
member=instance,
leave_date__isnull=True
).update(leave_date=today)