This commit is contained in:
2025-10-06 19:35:38 -06:00
parent da36896dd8
commit 7137f2e355

View File

@@ -2,21 +2,54 @@ from django.core.management.base import BaseCommand
from django.db.models import Count from django.db.models import Count
from api.customs.models import Pedimento, Cove, EDocument, Partida from api.customs.models import Pedimento, Cove, EDocument, Partida
from api.record.models import Document from api.record.models import Document
from datetime import datetime
class Command(BaseCommand): class Command(BaseCommand):
help = 'Elimina pedimentos duplicados dejando el que tiene más documentos, coves, edocs y partidas.' 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): 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 = ( duplicados = (
Pedimento.objects base_query
.values('pedimento') .values('pedimento', 'organizacion_id')
.annotate(total=Count('id')) .annotate(total=Count('id'))
.filter(total__gt=1) .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 = ( pedimentos = (
Pedimento.objects Pedimento.objects
.filter(pedimento=dup['pedimento']) .filter(
pedimento=dup['pedimento'],
organizacion_id=dup['organizacion_id']
)
.annotate( .annotate(
num_docs=Count('documents'), num_docs=Count('documents'),
num_coves=Count('coves'), num_coves=Count('coves'),
@@ -25,13 +58,29 @@ class Command(BaseCommand):
) )
.order_by('-num_docs', '-num_coves', '-num_edocs', '-num_partidas') .order_by('-num_docs', '-num_coves', '-num_edocs', '-num_partidas')
) )
# Mantener el primero, eliminar los demás # 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: for ped in to_delete:
self.stdout.write(f'Eliminando pedimento {ped.id} ({ped.pedimento})') self.stdout.write(f' Eliminando pedimento {ped.id} con {ped.num_docs} docs')
Cove.objects.filter(pedimento=ped).delete() try:
EDocument.objects.filter(pedimento=ped).delete() Cove.objects.filter(pedimento=ped).delete()
Partida.objects.filter(pedimento=ped).delete() EDocument.objects.filter(pedimento=ped).delete()
Document.objects.filter(pedimento=ped).delete() Partida.objects.filter(pedimento=ped).delete()
ped.delete() Document.objects.filter(pedimento=ped).delete()
self.stdout.write(self.style.SUCCESS('Eliminación de duplicados completada.')) 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}'
))