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)