diff --git a/api/customs/management/commands/eliminar_pedimentos_duplicados.py b/api/customs/management/commands/eliminar_pedimentos_duplicados.py index ef6897c..49f8b38 100644 --- a/api/customs/management/commands/eliminar_pedimentos_duplicados.py +++ b/api/customs/management/commands/eliminar_pedimentos_duplicados.py @@ -2,21 +2,54 @@ 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 = ( - Pedimento.objects - .values('pedimento') + base_query + .values('pedimento', 'organizacion_id') .annotate(total=Count('id')) .filter(total__gt=1) ) - for dup in duplicados: + + 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']) + .filter( + pedimento=dup['pedimento'], + organizacion_id=dup['organizacion_id'] + ) .annotate( num_docs=Count('documents'), num_coves=Count('coves'), @@ -25,13 +58,29 @@ class Command(BaseCommand): ) .order_by('-num_docs', '-num_coves', '-num_edocs', '-num_partidas') ) + # Mantener el primero, eliminar los demás - to_delete = pedimentos[1:] + 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} ({ped.pedimento})') - 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() - self.stdout.write(self.style.SUCCESS('Eliminación de duplicados completada.')) \ No newline at end of file + 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}' + )) \ No newline at end of file