86 lines
3.5 KiB
Python
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}'
|
|
)) |