from django.core.management.base import BaseCommand from django.db.models import Count from api.customs.models import Pedimento, Cove, EDocument, Partida from api.record.models import Document from datetime import datetime class Command(BaseCommand): help = 'Elimina pedimentos duplicados dejando el que tiene más documentos, coves, edocs y partidas.' def add_arguments(self, parser): parser.add_argument( '--organizacion', help='ID de la organización para procesar (opcional)', ) parser.add_argument( '--batch-size', type=int, default=100, help='Número de pedimentos a procesar por lote (default: 100)', ) def handle(self, *args, **options): start_time = datetime.now() batch_size = options['batch_size'] # Base query base_query = Pedimento.objects if options['organizacion']: base_query = base_query.filter(organizacion_id=options['organizacion']) self.stdout.write(f'Procesando solo organización: {options["organizacion"]}') # Obtener duplicados duplicados = ( base_query .values('pedimento', 'organizacion_id') .annotate(total=Count('id')) .filter(total__gt=1) ) total_duplicados = duplicados.count() self.stdout.write(f'Encontrados {total_duplicados} grupos de pedimentos duplicados') procesados = 0 for dup in duplicados.iterator(): self.stdout.write(f'Procesando grupo {procesados + 1}/{total_duplicados} - Pedimento: {dup["pedimento"]} - Org: {dup["organizacion_id"]}') pedimentos = ( Pedimento.objects .filter( pedimento=dup['pedimento'], organizacion_id=dup['organizacion_id'] ) .annotate( num_docs=Count('documents'), num_coves=Count('coves'), num_edocs=Count('documentos'), num_partidas=Count('partidas') ) .order_by('-num_docs', '-num_coves', '-num_edocs', '-num_partidas') ) # Mantener el primero, eliminar los demás to_keep = pedimentos.first() to_delete = pedimentos.exclude(id=to_keep.id) self.stdout.write(f' Manteniendo pedimento {to_keep.id} con {to_keep.num_docs} docs') for ped in to_delete: self.stdout.write(f' Eliminando pedimento {ped.id} con {ped.num_docs} docs') try: Cove.objects.filter(pedimento=ped).delete() EDocument.objects.filter(pedimento=ped).delete() Partida.objects.filter(pedimento=ped).delete() Document.objects.filter(pedimento=ped).delete() ped.delete() except Exception as e: self.stdout.write(self.style.ERROR(f'Error eliminando pedimento {ped.id}: {str(e)}')) procesados += 1 if procesados % batch_size == 0: self.stdout.write(f'Procesados {procesados}/{total_duplicados} grupos') tiempo_total = datetime.now() - start_time self.stdout.write(self.style.SUCCESS( f'Eliminación completada. Procesados {procesados} grupos en {tiempo_total}' ))