""" Script pour exporter les interventions en fichier XLSX avec filtrage par dates. Usage: python manage.py export_interventions_xlsx --start_date=2024-01-01 --end_date=2024-12-31 --output=interventions.xlsx # Ou sans dates (exporte le mois précédent par défaut) python manage.py export_interventions_xlsx --output=interventions.xlsx """ from django.core.management.base import BaseCommand from django.conf import settings from datetime import datetime, date from dateutil.relativedelta import relativedelta import os from interventions.services import generate_interventions_excel class Command(BaseCommand): help = 'Exporte les interventions au format XLSX avec possibilité de filtrage par dates' def add_arguments(self, parser): parser.add_argument( '--start_date', type=str, help='Date de début (format: YYYY-MM-DD)', default=None, ) parser.add_argument( '--end_date', type=str, help='Date de fin (format: YYYY-MM-DD)', default=None, ) parser.add_argument( '--output', type=str, help='Nom du fichier de sortie', default='exports/interventions_%(year)s_%(month)s.xlsx', ) def handle(self, *args, **options): start_date = options['start_date'] end_date = options['end_date'] output_file = options['output'] # Si aucune date n'est fournie, utiliser le mois précédent par défaut if not start_date and not end_date: today = date.today() # Premier jour du mois précédent first_day_prev_month = (today.replace(day=1) - relativedelta(months=1)) # Dernier jour du mois précédent last_day_prev_month = today.replace(day=1) - relativedelta(days=1) start_date = first_day_prev_month end_date = last_day_prev_month self.stdout.write( self.style.WARNING( f'Aucune date fournie : export du mois précédent ({start_date.strftime("%B %Y")}) ' f'du {start_date} au {end_date}' ) ) else: # Validation des dates if start_date: try: start_date = datetime.strptime(start_date, '%Y-%m-%d').date() except ValueError: self.stderr.write(self.style.ERROR(f'Format de date invalide pour start_date: {start_date}. Utilisez YYYY-MM-DD')) return if end_date: try: end_date = datetime.strptime(end_date, '%Y-%m-%d').date() except ValueError: self.stderr.write(self.style.ERROR(f'Format de date invalide pour end_date: {end_date}. Utilisez YYYY-MM-DD')) return # Substituer les variables dans le nom du fichier de sortie if output_file: # Utiliser le mois précédent pour le nom de fichier (cohérent avec les données exportées) if start_date: file_year = start_date.year file_month = start_date.month else: today = date.today() prev_month = today.replace(day=1) - relativedelta(months=1) file_year = prev_month.year file_month = prev_month.month output_file = output_file.replace('%(year)s', str(file_year)) output_file = output_file.replace('%(month)s', f'{file_month:02d}') output_file = output_file.replace('%(day)s', f'{date.today().day:02d}') output_file = output_file.replace('%(date)s', date.today().strftime('%Y-%m-%d')) # Convertir en chemin absolu si c'est un chemin relatif if not os.path.isabs(output_file): output_file = os.path.join(settings.BASE_DIR, output_file) # Créer le répertoire parent s'il n'existe pas output_dir = os.path.dirname(output_file) if output_dir and not os.path.exists(output_dir): os.makedirs(output_dir, exist_ok=True) self.stdout.write(f'Répertoire créé: {output_dir}') self.stdout.write(self.style.SUCCESS('Démarrage de l\'export des interventions...')) self.stdout.write(f'Fichier de sortie: {output_file}') # Générer le workbook en utilisant le service wb = generate_interventions_excel(start_date, end_date, output_format='workbook') # Sauvegarder le fichier try: wb.save(output_file) self.stdout.write(self.style.SUCCESS(f'\n✓ Export terminé avec succès!')) self.stdout.write(self.style.SUCCESS(f'✓ Fichier généré: {output_file}')) except Exception as e: self.stderr.write(self.style.ERROR(f'Erreur lors de la sauvegarde du fichier: {e}'))