Files
backend/api/customs/management/commands/eliminar_pedimentos_duplicados.py
2025-10-06 19:35:38 -06:00

86 lines
3.5 KiB
Python

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}'
))