fix/de los tickets T2026-05-027, T2025-09-004 y T2025-09-056

This commit is contained in:
2026-06-15 11:18:58 -06:00
parent 7644446267
commit 23ed52c78a
29 changed files with 2992 additions and 987 deletions

View File

@@ -66,6 +66,13 @@ class Pedimento(models.Model):
['organizacion', 'pedimento_app']
]
class EstadoDescarga(models.TextChoices):
"""Estado de descarga de documentos VUCEM (requerimiento T2026-05-027):
'error' indica que la descarga no pudo completarse y requiere atención."""
PENDIENTE = 'pendiente', 'Pendiente'
DESCARGADO = 'descargado', 'Descargado'
ERROR = 'error', 'Error'
class Partida(models.Model):
pedimento = models.ForeignKey(Pedimento, on_delete=models.CASCADE, related_name='partidas', help_text="Pedimento asociado a la partida")
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='partidas', help_text="Organización a la que pertenece la partida")
@@ -94,8 +101,28 @@ class EDocument(models.Model):
descripcion = models.CharField(max_length=200, blank=True, null=True, help_text="Descripción del documento")
created_at = models.DateTimeField(auto_now_add=True, help_text="Fecha de creación del documento")
updated_at = models.DateTimeField(auto_now=True, help_text="Fecha de última actualización del documento")
edocument_descargado = models.BooleanField(default=False, help_text="Indica si el e-documento ha sido descargado")
acuse_descargado = models.BooleanField(default=False, help_text="Indica si el acuse del e-documento ha sido descargado")
edocument_descargado = models.BooleanField(default=False, help_text="Indica si el e-documento ha sido descargado (legado, derivado de edocument_estado)")
acuse_descargado = models.BooleanField(default=False, help_text="Indica si el acuse del e-documento ha sido descargado (legado, derivado de acuse_estado)")
edocument_estado = models.CharField(max_length=12, choices=EstadoDescarga.choices, default=EstadoDescarga.PENDIENTE, help_text="Estado de descarga del e-documento: pendiente, descargado o error")
acuse_estado = models.CharField(max_length=12, choices=EstadoDescarga.choices, default=EstadoDescarga.PENDIENTE, help_text="Estado de descarga del acuse: pendiente, descargado o error")
edocument_intentos = models.PositiveSmallIntegerField(default=0, help_text="Intentos automáticos de descarga del e-documento (un ciclo de orquestación = un intento)")
acuse_intentos = models.PositiveSmallIntegerField(default=0, help_text="Intentos automáticos de descarga del acuse (un ciclo de orquestación = un intento)")
ultimo_intento_at = models.DateTimeField(null=True, blank=True, help_text="Fecha del último intento automático de descarga")
ultimo_error = models.TextField(null=True, blank=True, help_text="Detalle del último error de descarga")
def save(self, *args, **kwargs):
# El estado de 3 valores es la fuente de verdad; los booleanos legados se derivan
self.edocument_descargado = self.edocument_estado == EstadoDescarga.DESCARGADO
self.acuse_descargado = self.acuse_estado == EstadoDescarga.DESCARGADO
update_fields = kwargs.get('update_fields')
if update_fields is not None:
update_fields = set(update_fields)
if 'edocument_estado' in update_fields:
update_fields.add('edocument_descargado')
if 'acuse_estado' in update_fields:
update_fields.add('acuse_descargado')
kwargs['update_fields'] = list(update_fields)
super().save(*args, **kwargs)
def __str__(self):
return f"{self.descripcion} - {self.pedimento.pedimento}"
@@ -112,8 +139,28 @@ class Cove(models.Model):
numero_cove = models.CharField(max_length=20, unique=True, help_text="Número único de la cove")
created_at = models.DateTimeField(auto_now_add=True, help_text="Fecha de creación de la cove")
updated_at = models.DateTimeField(auto_now=True, help_text="Fecha de última actualización de la cove")
cove_descargado = models.BooleanField(default=False, help_text="Indica si la cove ha sido descargada")
acuse_cove_descargado = models.BooleanField(default=False, help_text="Indica si el acuse de la cove ha sido descargado")
cove_descargado = models.BooleanField(default=False, help_text="Indica si la cove ha sido descargada (legado, derivado de cove_estado)")
acuse_cove_descargado = models.BooleanField(default=False, help_text="Indica si el acuse de la cove ha sido descargado (legado, derivado de acuse_cove_estado)")
cove_estado = models.CharField(max_length=12, choices=EstadoDescarga.choices, default=EstadoDescarga.PENDIENTE, help_text="Estado de descarga de la cove: pendiente, descargado o error")
acuse_cove_estado = models.CharField(max_length=12, choices=EstadoDescarga.choices, default=EstadoDescarga.PENDIENTE, help_text="Estado de descarga del acuse de la cove: pendiente, descargado o error")
cove_intentos = models.PositiveSmallIntegerField(default=0, help_text="Intentos automáticos de descarga de la cove (un ciclo de orquestación = un intento)")
acuse_cove_intentos = models.PositiveSmallIntegerField(default=0, help_text="Intentos automáticos de descarga del acuse de la cove (un ciclo de orquestación = un intento)")
ultimo_intento_at = models.DateTimeField(null=True, blank=True, help_text="Fecha del último intento automático de descarga")
ultimo_error = models.TextField(null=True, blank=True, help_text="Detalle del último error de descarga")
def save(self, *args, **kwargs):
# El estado de 3 valores es la fuente de verdad; los booleanos legados se derivan
self.cove_descargado = self.cove_estado == EstadoDescarga.DESCARGADO
self.acuse_cove_descargado = self.acuse_cove_estado == EstadoDescarga.DESCARGADO
update_fields = kwargs.get('update_fields')
if update_fields is not None:
update_fields = set(update_fields)
if 'cove_estado' in update_fields:
update_fields.add('cove_descargado')
if 'acuse_cove_estado' in update_fields:
update_fields.add('acuse_cove_descargado')
kwargs['update_fields'] = list(update_fields)
super().save(*args, **kwargs)
def __str__(self):
return f"{self.numero_cove} - {self.pedimento.pedimento}"