feat(contracts): auto-sync team schedule daily and on mobile access

- Register sync_teams_schedule in init_scheduled_tasks (daily at 04:00 local)
- Trigger sync_member_current_teams on mobile intervention list load
- Trigger sync_member_current_teams on user login signal
This commit is contained in:
kdeterme 2026-09-28 14:17:44 +02:00
parent f4460a5323
commit 0bbe267498
3 changed files with 64 additions and 1 deletions

View file

@ -325,7 +325,46 @@ Chaque utilisateur configure son délai et ses préférences dans la page /notif
if task7.next_run:
self.stdout.write(f' - Prochaine exécution: {task7.next_run.strftime("%Y-%m-%d %H:%M")}')
self.stdout.write(self.style.SUCCESS('\n=== Initialisation terminée ==='))
# 8. Synchronisation quotidienne des équipes du planning
task_name_sync_teams = "Synchronisation quotidienne des équipes"
task8, created8 = ScheduledCommand.objects.get_or_create(
name=task_name_sync_teams,
defaults={
'command_name': 'sync_teams_schedule',
'command_args': {},
'frequency': 'daily',
'hour': 2,
'minute': 0,
'is_active': True,
'send_email': False,
'description': '''
Synchronise quotidiennement la composition des équipes (member.teams) avec l'historique planifié pour la journée (CompanyMemberHistory).
La tâche s'exécute tous les jours à 2h00 UTC (4h00 locale).
Elle garantit que les techniciens et membres d'équipes disposent de leurs assignations d'équipes dès le début de leur journée de travail.
'''.strip()
}
)
if created8:
task8.next_run = task8.calculate_next_run()
task8.save()
self.stdout.write(self.style.SUCCESS(f'
[OK] Tâche créée: {task_name_sync_teams}'))
self.stdout.write(f' - Fréquence: {task8.get_frequency_display()}')
self.stdout.write(f' - Planning: Tous les jours à {task8.hour:02d}:{task8.minute:02d} UTC')
self.stdout.write(f' - Prochaine exécution: {task8.next_run.strftime("%Y-%m-%d %H:%M")}')
else:
self.stdout.write(self.style.WARNING(f'
! Tâche déjà existante: {task_name_sync_teams}'))
self.stdout.write(f' - Statut: {"Active" if task8.is_active else "Inactive"}')
if task8.next_run:
self.stdout.write(f' - Prochaine exécution: {task8.next_run.strftime("%Y-%m-%d %H:%M")}')
self.stdout.write(self.style.SUCCESS('
=== Initialisation terminée ==='))
self.stdout.write('\nPour gérer les tâches planifiées:')
self.stdout.write(' 1. Accédez à l\'admin Django: /admin/')
self.stdout.write(' 2. Section: Common > Commandes planifiées')

View file

@ -120,3 +120,21 @@ def update_member_team_history(sender, instance, action, reverse, pk_set, **kwar
).update(leave_date=today)
from django.contrib.auth.signals import user_logged_in
@receiver(user_logged_in)
def sync_user_current_teams_on_login(sender, request, user, **kwargs):
"""
Synchronise les équipes du membre connecté avec l'historique planifié pour aujourd'hui.
"""
try:
from contracts.services_teams import sync_member_current_teams
member = CompanyMember.objects.filter(user=user).first()
if member:
sync_member_current_teams(member)
except Exception:
pass

View file

@ -167,6 +167,12 @@ def interventions_index_mobile(request):
return HttpResponseRedirect(f"{request.path}?{query_params.urlencode()}")
# Synchroniser les équipes du jour du membre avec l'historique planifié
company_member_current = CompanyMember.objects.filter(user=request.user).first()
if company_member_current:
from contracts.services_teams import sync_member_current_teams
sync_member_current_teams(company_member_current)
# permissions
interventions = filter_viewable_interventions_for_user(request.user, limit_to_default_thematic=True)