diff --git a/loko/contracts/services_teams.py b/loko/contracts/services_teams.py index 12765a8..718b3a5 100644 --- a/loko/contracts/services_teams.py +++ b/loko/contracts/services_teams.py @@ -125,6 +125,21 @@ def sync_member_current_teams(member: CompanyMember, for_date: Optional[date] = if for_date is None: for_date = timezone.now().date() + has_history = CompanyMemberHistory.objects.filter(member=member).exists() + if not has_history: + # Si le membre n'a aucun historique d'assignation mais a des équipes configurées dans member.teams, + # on initialise son historique pour préserver ses affectations. + current_teams = list(member.teams.all()) + if current_teams: + for t in current_teams: + CompanyMemberHistory.objects.get_or_create( + member=member, + team=t, + leave_date__isnull=True, + defaults={'join_date': for_date} + ) + return + active_team = get_member_team_for_date(member, for_date) current_team_ids = set(member.teams.values_list('id', flat=True)) target_team_ids = {active_team.id} if active_team else set() diff --git a/loko/contracts/signals.py b/loko/contracts/signals.py index 24fe10b..04930d6 100644 --- a/loko/contracts/signals.py +++ b/loko/contracts/signals.py @@ -51,34 +51,50 @@ 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: + + if not reverse: + # instance est CompanyMember, pk_set contient les team_id + if action == "post_add" and pk_set: + 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" and pk_set: + 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": 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) + else: + # instance est CompanyTeam, pk_set contient les member_id + if action == "post_add" and pk_set: + for member_id in pk_set: + CompanyMemberHistory.objects.get_or_create( + member_id=member_id, + team=instance, + leave_date__isnull=True, + defaults={'join_date': today} + ) + elif action == "post_remove" and pk_set: + for member_id in pk_set: + CompanyMemberHistory.objects.filter( + member_id=member_id, + team=instance, + leave_date__isnull=True + ).update(leave_date=today) + elif action == "pre_clear": + CompanyMemberHistory.objects.filter( + team=instance, + leave_date__isnull=True + ).update(leave_date=today)