Mudanza de repo

This commit is contained in:
2025-09-22 18:43:29 -06:00
parent 26fe36ca52
commit d11d543bdc
193 changed files with 10998 additions and 0 deletions

View File

44
api/datastage/admin.py Normal file
View File

@@ -0,0 +1,44 @@
from django.contrib import admin
from .models import (
DataStage, Registro500,
Registro501, Registro502,
Registro503, Registro504,
Registro505, Registro506,
Registro507, Registro508,
Registro509, Registro510,
Registro511, Registro512,
Registro520, Registro551,
Registro552, Registro553,
Registro554, Registro555,
Registro556, Registro557,
Registro558, RegistroSel,
Registro701, Registro702
)
# Register your models here.
admin.site.register(DataStage)
admin.site.register(Registro500)
admin.site.register(Registro501)
admin.site.register(Registro502)
admin.site.register(Registro503)
admin.site.register(Registro504)
admin.site.register(Registro505)
admin.site.register(Registro506)
admin.site.register(Registro507)
admin.site.register(Registro508)
admin.site.register(Registro509)
admin.site.register(Registro510)
admin.site.register(Registro511)
admin.site.register(Registro512)
admin.site.register(Registro520)
admin.site.register(Registro551)
admin.site.register(Registro552)
admin.site.register(Registro553)
admin.site.register(Registro554)
admin.site.register(Registro555)
admin.site.register(Registro556)
admin.site.register(Registro557)
admin.site.register(Registro558)
admin.site.register(Registro701)
admin.site.register(Registro702)
admin.site.register(RegistroSel)

7
api/datastage/apps.py Normal file
View File

@@ -0,0 +1,7 @@
from django.apps import AppConfig
class DatastageConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'api.datastage'

View File

@@ -0,0 +1,33 @@
# Generated by Django 5.2.3 on 2025-07-14 16:14
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('organization', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='DataStage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nombre', models.CharField(max_length=100, unique=True)),
('almacenamiento', models.PositiveIntegerField(default=0)),
('archivo', models.FileField(upload_to='datastages/')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('organizacion', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='datastages', to='organization.organizacion')),
],
options={
'verbose_name': 'DataStage',
'verbose_name_plural': 'DataStages',
'db_table': 'datastage',
},
),
]

View File

@@ -0,0 +1,32 @@
# Generated by Django 5.2.3 on 2025-08-14 15:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('datastage', '0001_initial'),
]
operations = [
migrations.RemoveField(
model_name='datastage',
name='almacenamiento',
),
migrations.RemoveField(
model_name='datastage',
name='nombre',
),
migrations.AddField(
model_name='datastage',
name='contribuyente',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
migrations.AddField(
model_name='datastage',
name='procesado',
field=models.BooleanField(default=False),
),
]

View File

@@ -0,0 +1,20 @@
# Generated by Django 5.2.3 on 2025-08-14 15:44
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('datastage', '0002_remove_datastage_almacenamiento_and_more'),
('organization', '0002_remove_organizacion_membretado_and_more'),
]
operations = [
migrations.AlterField(
model_name='datastage',
name='organizacion',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='datastages', to='organization.organizacion'),
),
]

View File

@@ -0,0 +1,588 @@
# Generated by Django 5.2.3 on 2025-08-14 19:15
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('datastage', '0003_alter_datastage_organizacion'),
('organization', '0002_remove_organizacion_membretado_and_more'),
]
operations = [
migrations.CreateModel(
name='Registro500',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=4, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=3, null=True)),
('consecutivo_remesa', models.CharField(blank=True, max_length=50, null=True)),
('numero_seleccion', models.CharField(blank=True, max_length=50, null=True)),
('fecha_inicio_reconocimiento', models.DateField(blank=True, null=True)),
('hora_inicio_reconocimiento', models.TimeField(blank=True, null=True)),
('fecha_fin_reconocimiento', models.DateField(blank=True, null=True)),
('hora_fin_reconocimiento', models.TimeField(blank=True, null=True)),
('fraccion', models.CharField(blank=True, max_length=50, null=True)),
('secuencia_fraccion', models.CharField(blank=True, max_length=50, null=True)),
('clave_documento', models.CharField(blank=True, max_length=50, null=True)),
('tipo_operacion', models.CharField(blank=True, max_length=50, null=True)),
('grado_incidencia', models.CharField(blank=True, max_length=50, null=True)),
('fecha_seleccion', models.DateField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro500s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro500s', to='organization.organizacion')),
],
options={
'db_table': 'registro500',
},
),
migrations.CreateModel(
name='Registro501',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=4, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=3, null=True)),
('tipo_operacion', models.CharField(blank=True, max_length=1, null=True)),
('clave_documento', models.CharField(blank=True, max_length=2, null=True)),
('seccion_aduanera_entrada', models.CharField(blank=True, max_length=3, null=True)),
('curp_contribuyente', models.CharField(blank=True, max_length=18, null=True)),
('rfc', models.CharField(blank=True, max_length=13, null=True)),
('curp_agente_a', models.CharField(blank=True, max_length=18, null=True)),
('tipo_cambio', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('total_fletes', models.CharField(blank=True, max_length=12, null=True)),
('total_seguros', models.CharField(blank=True, max_length=12, null=True)),
('total_embalajes', models.CharField(blank=True, max_length=12, null=True)),
('total_incrementables', models.CharField(blank=True, max_length=12, null=True)),
('total_deducibles', models.CharField(blank=True, max_length=12, null=True)),
('peso_bruto_mercancia', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('medio_transporte_salida', models.CharField(blank=True, max_length=2, null=True)),
('medio_transporte_arribo', models.CharField(blank=True, max_length=2, null=True)),
('medio_transporte_entrada_salida', models.CharField(blank=True, max_length=2, null=True)),
('destino_mercancia', models.CharField(blank=True, max_length=2, null=True)),
('nombre_contribuyente', models.CharField(blank=True, max_length=120, null=True)),
('calle_contribuyente', models.CharField(blank=True, max_length=80, null=True)),
('num_interior_contribuyente', models.CharField(blank=True, max_length=10, null=True)),
('num_exterior_contribuyente', models.CharField(blank=True, max_length=10, null=True)),
('cp_contribuyente', models.CharField(blank=True, max_length=10, null=True)),
('municipio_contribuyente', models.CharField(blank=True, max_length=80, null=True)),
('entidad_fed_contribuyente', models.CharField(blank=True, max_length=3, null=True)),
('pais_contribuyente', models.CharField(blank=True, max_length=3, null=True)),
('tipo_pedimento', models.CharField(blank=True, max_length=50, null=True)),
('fecha_recepcion_pedimento', models.DateTimeField(blank=True, null=True)),
('fecha_pago_real', models.DateTimeField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro501s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro501s', to='organization.organizacion')),
],
options={
'db_table': 'registro501',
},
),
migrations.CreateModel(
name='Registro502',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('rfc_transportista', models.CharField(blank=True, max_length=13, null=True)),
('curp_transportista', models.CharField(blank=True, max_length=18, null=True)),
('nombre_transportista', models.CharField(blank=True, max_length=120, null=True)),
('pais_transporte', models.CharField(blank=True, max_length=3, null=True)),
('identificador_transporte', models.CharField(blank=True, max_length=17, null=True)),
('fecha_pago_real', models.DateField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro502s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro502s', to='organization.organizacion')),
],
options={
'db_table': 'registro502',
},
),
migrations.CreateModel(
name='Registro503',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('numero_guia', models.CharField(blank=True, max_length=20, null=True)),
('tipo_guia', models.CharField(blank=True, max_length=1, null=True)),
('fecha_pago_real', models.DateField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro503s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro503s', to='organization.organizacion')),
],
options={
'db_table': 'registro503',
},
),
migrations.CreateModel(
name='Registro504',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('num_contenedor', models.CharField(blank=True, max_length=12, null=True)),
('tipo_contenedor', models.CharField(blank=True, max_length=2, null=True)),
('fecha_pago_real', models.DateField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro504s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro504s', to='organization.organizacion')),
],
options={
'db_table': 'registro504',
},
),
migrations.CreateModel(
name='Registro505',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('fecha_facturacion', models.DateField(blank=True, null=True)),
('numero_factura', models.CharField(blank=True, max_length=40, null=True)),
('termino_facturacion', models.CharField(blank=True, max_length=3, null=True)),
('moneda_facturacion', models.CharField(blank=True, max_length=3, null=True)),
('valor_dolares', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('valor_moneda_extranjera', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('pais_facturacion', models.CharField(blank=True, max_length=3, null=True)),
('entidad_fed_facturacion', models.CharField(blank=True, max_length=3, null=True)),
('indent_fiscal_proveedor', models.CharField(blank=True, max_length=30, null=True)),
('proveedor_mercancia', models.CharField(blank=True, max_length=120, null=True)),
('calle_proveedor', models.CharField(blank=True, max_length=80, null=True)),
('num_interior_proveedor', models.CharField(blank=True, max_length=10, null=True)),
('num_exterior_proveedor', models.CharField(blank=True, max_length=10, null=True)),
('cp_proveedor', models.CharField(blank=True, max_length=10, null=True)),
('municipio_proveedor', models.CharField(blank=True, max_length=80, null=True)),
('fecha_pago_real', models.CharField(blank=True, max_length=50, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro505s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro505s', to='organization.organizacion')),
],
options={
'db_table': 'registro505',
},
),
migrations.CreateModel(
name='Registro506',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('tipo_fecha', models.CharField(blank=True, max_length=2, null=True)),
('fecha_operacion', models.DateField(blank=True, null=True)),
('fecha_validacion_pago_r', models.DateTimeField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro506s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro506s', to='organization.organizacion')),
],
options={
'db_table': 'registro506',
},
),
migrations.CreateModel(
name='Registro507',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('clave_caso', models.CharField(blank=True, max_length=50, null=True)),
('identificador_caso', models.CharField(blank=True, max_length=50, null=True)),
('tipo_pedimento', models.CharField(blank=True, max_length=50, null=True)),
('complemento_caso', models.CharField(blank=True, max_length=50, null=True)),
('fecha_validacion_pago_r', models.CharField(blank=True, max_length=50, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro507s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro507s', to='organization.organizacion')),
],
options={
'db_table': 'registro507',
},
),
migrations.CreateModel(
name='Registro508',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('institucion_emisora', models.CharField(blank=True, max_length=2, null=True)),
('numero_cuenta', models.CharField(blank=True, max_length=50, null=True)),
('folio_constancia', models.CharField(blank=True, max_length=17, null=True)),
('fecha_constancia', models.DateField(blank=True, null=True)),
('tipo_cuenta', models.CharField(blank=True, max_length=2, null=True)),
('clave_garantia', models.CharField(blank=True, max_length=50, null=True)),
('valor_unitario_titulo', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('total_garantia', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('cantidad_unidades', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('titulos_asignados', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('fecha_pago_real', models.DateField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro508s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro508s', to='organization.organizacion')),
],
options={
'db_table': 'registro508',
},
),
migrations.CreateModel(
name='Registro509',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=4, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=3, null=True)),
('clave_contribucion', models.CharField(blank=True, max_length=2, null=True)),
('tasa_contribucion', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('tipo_tasa', models.CharField(blank=True, max_length=2, null=True)),
('tipo_pedimento', models.IntegerField(blank=True, null=True)),
('fecha_pago_real', models.DateTimeField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro509s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro509s', to='organization.organizacion')),
],
options={
'db_table': 'registro509',
},
),
migrations.CreateModel(
name='Registro510',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('clave_contribucion', models.CharField(blank=True, max_length=2, null=True)),
('tasa_contribucion', models.CharField(blank=True, max_length=50, null=True)),
('tipo_tasa', models.CharField(blank=True, max_length=50, null=True)),
('tipo_pedimento', models.CharField(blank=True, max_length=50, null=True)),
('fecha_pago_real', models.CharField(blank=True, max_length=50, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('forma_pago', models.CharField(blank=True, max_length=3, null=True)),
('importe_pago', models.CharField(blank=True, max_length=12, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro510s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro510s', to='organization.organizacion')),
],
options={
'db_table': 'registro510',
},
),
migrations.CreateModel(
name='Registro511',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('secuencia_observacion', models.CharField(blank=True, max_length=3, null=True)),
('observaciones', models.CharField(blank=True, max_length=120, null=True)),
('tipo_pedimento', models.CharField(blank=True, max_length=50, null=True)),
('fecha_validacion_pago_r', models.DateTimeField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro511s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro511s', to='organization.organizacion')),
],
options={
'db_table': 'registro511',
},
),
migrations.CreateModel(
name='Registro512',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=3, null=True)),
('patente_aduanal_orig', models.CharField(blank=True, max_length=4, null=True)),
('pedimento_original', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera_desp_orig', models.CharField(blank=True, max_length=50, null=True)),
('documento_original', models.CharField(blank=True, max_length=50, null=True)),
('fecha_operacion_orig', models.DateField(blank=True, null=True)),
('fraccion_original', models.CharField(blank=True, max_length=8, null=True)),
('unidad_medida', models.CharField(blank=True, max_length=2, null=True)),
('mercancia_descargada', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('tipo_pedimento', models.CharField(blank=True, max_length=50, null=True)),
('fecha_pago_real', models.DateTimeField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro512s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro512s', to='organization.organizacion')),
],
options={
'db_table': 'registro512',
},
),
migrations.CreateModel(
name='Registro520',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('indent_fiscal_destinatario', models.CharField(blank=True, max_length=17, null=True)),
('nombre_destinatario_mercancia', models.CharField(blank=True, max_length=120, null=True)),
('calle_destinatario', models.CharField(blank=True, max_length=80, null=True)),
('num_interior_destinatario', models.CharField(blank=True, max_length=10, null=True)),
('num_exterior_destinatario', models.CharField(blank=True, max_length=10, null=True)),
('cp_destinatario', models.CharField(blank=True, max_length=10, null=True)),
('municipio_destinatario', models.CharField(blank=True, max_length=80, null=True)),
('pais_destinatario', models.CharField(blank=True, max_length=3, null=True)),
('fecha_pago_real', models.CharField(blank=True, max_length=50, null=True)),
('created_at', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro520s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro520s', to='organization.organizacion')),
],
options={
'db_table': 'registro520',
},
),
migrations.CreateModel(
name='Registro551',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('fraccion', models.CharField(blank=True, max_length=8, null=True)),
('secuencia_fraccion', models.CharField(blank=True, max_length=50, null=True)),
('subdivision_fraccion', models.CharField(blank=True, max_length=8, null=True)),
('descripcion_mercancia', models.CharField(blank=True, max_length=250, null=True)),
('precio_unitario', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('valor_aduana', models.CharField(blank=True, max_length=12, null=True)),
('valor_comercial', models.CharField(blank=True, max_length=12, null=True)),
('valor_dolares', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('cantidad_um_comercial', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('unidad_medida_comercial', models.CharField(blank=True, max_length=2, null=True)),
('cantidad_um_tarifa', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('unidad_medida_tarifa', models.CharField(blank=True, max_length=2, null=True)),
('valor_agregado', models.CharField(blank=True, max_length=12, null=True)),
('clave_vinculacion', models.CharField(blank=True, max_length=1, null=True)),
('metodo_valorizacion', models.CharField(blank=True, max_length=2, null=True)),
('codigo_mercancia_producto', models.CharField(blank=True, max_length=20, null=True)),
('marca_mercancia_producto', models.CharField(blank=True, max_length=80, null=True)),
('modelo_mercancia_producto', models.CharField(blank=True, max_length=80, null=True)),
('pais_origen_destino', models.CharField(blank=True, max_length=3, null=True)),
('pais_comprador_vendedor', models.CharField(blank=True, max_length=3, null=True)),
('entidad_fed_origen', models.CharField(blank=True, max_length=3, null=True)),
('entidad_fed_comprador', models.CharField(blank=True, max_length=3, null=True)),
('entidad_fed_vendedor', models.CharField(blank=True, max_length=3, null=True)),
('tipo_operacion', models.CharField(blank=True, max_length=50, null=True)),
('clave_documento', models.CharField(blank=True, max_length=50, null=True)),
('fecha_pago_real', models.DateTimeField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('entidad_fed_destino', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro551s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro551s', to='organization.organizacion')),
],
options={
'db_table': 'registro551',
},
),
migrations.CreateModel(
name='Registro552',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('fraccion', models.CharField(blank=True, max_length=8, null=True)),
('secuencia_fraccion', models.CharField(blank=True, max_length=50, null=True)),
('vin_numero_serie', models.CharField(blank=True, max_length=25, null=True)),
('kilometraje_vehiculo', models.CharField(blank=True, max_length=6, null=True)),
('fecha_pago_real', models.DateField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro552s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro552s', to='organization.organizacion')),
],
options={
'db_table': 'registro552',
},
),
migrations.CreateModel(
name='Registro553',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('fraccion', models.CharField(blank=True, max_length=8, null=True)),
('secuencia_fraccion', models.CharField(blank=True, max_length=50, null=True)),
('clave_permiso', models.CharField(blank=True, max_length=3, null=True)),
('firma_descargo', models.CharField(blank=True, max_length=40, null=True)),
('numero_permiso', models.CharField(blank=True, max_length=30, null=True)),
('valor_comercial_dolares', models.CharField(blank=True, max_length=50, null=True)),
('cantidad_mum_tarifa', models.CharField(blank=True, max_length=50, null=True)),
('fecha_pago_real', models.CharField(blank=True, max_length=50, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro553s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro553s', to='organization.organizacion')),
],
options={
'db_table': 'registro553',
},
),
migrations.CreateModel(
name='Registro554',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('fraccion', models.CharField(blank=True, max_length=8, null=True)),
('secuencia_fraccion', models.CharField(blank=True, max_length=50, null=True)),
('clave_caso', models.CharField(blank=True, max_length=50, null=True)),
('identificador_caso', models.CharField(blank=True, max_length=50, null=True)),
('complemento_caso', models.CharField(blank=True, max_length=50, null=True)),
('fecha_pago_real', models.DateTimeField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro554s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro554s', to='organization.organizacion')),
],
options={
'db_table': 'registro554',
},
),
migrations.CreateModel(
name='Registro555',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('fraccion', models.CharField(blank=True, max_length=8, null=True)),
('secuencia_fraccion', models.CharField(blank=True, max_length=50, null=True)),
('institucion_emisora', models.CharField(blank=True, max_length=2, null=True)),
('numero_cuenta', models.CharField(blank=True, max_length=17, null=True)),
('folio_constancia', models.CharField(blank=True, max_length=17, null=True)),
('fecha_constancia', models.DateField(blank=True, null=True)),
('clave_garantia', models.CharField(blank=True, max_length=50, null=True)),
('valor_unitario_titulo', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('total_garantia', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('cantidad_unidades_medida', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('titulos_asignados', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('fecha_pago_real', models.DateField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro555s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro555s', to='organization.organizacion')),
],
options={
'db_table': 'registro555',
},
),
migrations.CreateModel(
name='Registro556',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('clave_contribucion', models.CharField(blank=True, max_length=2, null=True)),
('tasa_contribucion', models.DecimalField(blank=True, decimal_places=6, max_digits=18, null=True)),
('tipo_tasa', models.CharField(blank=True, max_length=2, null=True)),
('fecha_pago_real', models.DateTimeField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('fraccion', models.CharField(blank=True, max_length=8, null=True)),
('secuencia_fraccion', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro556s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro556s', to='organization.organizacion')),
],
options={
'db_table': 'registro556',
},
),
migrations.CreateModel(
name='Registro557',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('fraccion', models.CharField(blank=True, max_length=8, null=True)),
('secuencia_fraccion', models.CharField(blank=True, max_length=50, null=True)),
('clave_contribucion', models.CharField(blank=True, max_length=2, null=True)),
('forma_pago', models.CharField(blank=True, max_length=3, null=True)),
('importe_pago', models.CharField(blank=True, max_length=12, null=True)),
('fecha_pago_real', models.DateTimeField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro557s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro557s', to='organization.organizacion')),
],
options={
'db_table': 'registro557',
},
),
migrations.CreateModel(
name='Registro558',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('fraccion', models.CharField(blank=True, max_length=8, null=True)),
('secuencia_fraccion', models.CharField(blank=True, max_length=50, null=True)),
('secuencia_observacion', models.CharField(blank=True, max_length=3, null=True)),
('observaciones', models.CharField(blank=True, max_length=120, null=True)),
('fecha_pago_real', models.DateTimeField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro558s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro558s', to='organization.organizacion')),
],
options={
'db_table': 'registro558',
},
),
migrations.CreateModel(
name='RegistroSel',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=50, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('consecutivo_remesa', models.CharField(blank=True, max_length=50, null=True)),
('numero_seleccion', models.CharField(blank=True, max_length=50, null=True)),
('fecha_seleccion', models.DateField(blank=True, null=True)),
('hora_seleccion', models.TimeField(blank=True, null=True)),
('semaforo_fiscal', models.CharField(blank=True, max_length=1, null=True)),
('clave_documento', models.CharField(blank=True, max_length=3, null=True)),
('tipo_operacion', models.CharField(blank=True, max_length=1, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro_sel', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro_sel', to='organization.organizacion')),
],
options={
'db_table': 'registro_sel',
},
),
]

View File

@@ -0,0 +1,63 @@
# Generated by Django 5.2.3 on 2025-08-14 19:19
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('datastage', '0004_registro500_registro501_registro502_registro503_and_more'),
('organization', '0002_remove_organizacion_membretado_and_more'),
]
operations = [
migrations.CreateModel(
name='Registro701',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=4, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=3, null=True)),
('clave_documento', models.CharField(blank=True, max_length=2, null=True)),
('fecha_pago', models.DateField(blank=True, null=True)),
('pedimento_anterior', models.CharField(blank=True, max_length=50, null=True)),
('patente_anterior', models.CharField(blank=True, max_length=50, null=True)),
('seccion_aduanera_anterior', models.CharField(blank=True, max_length=50, null=True)),
('documento_anterior', models.CharField(blank=True, max_length=50, null=True)),
('fecha_operacion_anterior', models.DateField(blank=True, null=True)),
('pedimento_original', models.CharField(blank=True, max_length=50, null=True)),
('patente_aduanal_orig', models.CharField(blank=True, max_length=50, null=True)),
('seccion_aduanera_desp_orig', models.CharField(blank=True, max_length=50, null=True)),
('fecha_pago_real', models.DateTimeField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro701s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro701s', to='organization.organizacion')),
],
options={
'db_table': 'registro701',
},
),
migrations.CreateModel(
name='Registro702',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('patente', models.CharField(blank=True, max_length=50, null=True)),
('pedimento', models.CharField(blank=True, max_length=7, null=True)),
('seccion_aduanera', models.CharField(blank=True, max_length=50, null=True)),
('clave_contribucion', models.CharField(blank=True, max_length=2, null=True)),
('forma_pago', models.CharField(blank=True, max_length=50, null=True)),
('importe_pago', models.CharField(blank=True, max_length=12, null=True)),
('tipo_pedimento', models.CharField(blank=True, max_length=50, null=True)),
('fecha_pago_real', models.DateTimeField(blank=True, null=True)),
('created_by', models.IntegerField(blank=True, null=True)),
('consulta', models.CharField(blank=True, max_length=50, null=True)),
('datastage', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro702s', to='datastage.datastage')),
('organizacion', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='registro702s', to='organization.organizacion')),
],
options={
'db_table': 'registro702',
},
),
]

View File

@@ -0,0 +1,22 @@
# Generated by Django 5.2.3 on 2025-08-14 21:04
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('datastage', '0005_registro701_registro702'),
]
operations = [
migrations.RenameField(
model_name='registro520',
old_name='municipio_destinatario',
new_name='municpio_destinatario',
),
migrations.RemoveField(
model_name='registro520',
name='created_by',
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 5.2.3 on 2025-08-14 21:13
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('datastage', '0006_rename_municipio_destinatario_registro520_municpio_destinatario_and_more'),
]
operations = [
migrations.AlterField(
model_name='datastage',
name='archivo',
field=models.FileField(blank=True, null=True, upload_to='datastages/'),
),
migrations.AlterField(
model_name='datastage',
name='contribuyente',
field=models.CharField(blank=True, max_length=100, null=True),
),
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 5.2.3 on 2025-08-14 21:13
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('datastage', '0007_alter_datastage_archivo_and_more'),
]
operations = [
migrations.AlterField(
model_name='datastage',
name='archivo',
field=models.FileField(default='', upload_to='datastages/'),
preserve_default=False,
),
migrations.AlterField(
model_name='datastage',
name='contribuyente',
field=models.CharField(default='', max_length=100),
preserve_default=False,
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 5.2.3 on 2025-08-14 21:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('datastage', '0008_alter_datastage_archivo_and_more'),
]
operations = [
migrations.AlterField(
model_name='registro501',
name='tipo_operacion',
field=models.CharField(blank=True, max_length=50, null=True),
),
migrations.AlterField(
model_name='registrosel',
name='tipo_operacion',
field=models.CharField(blank=True, max_length=50, null=True),
),
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 5.2.3 on 2025-08-14 21:27
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('datastage', '0009_alter_registro501_tipo_operacion_and_more'),
]
operations = [
migrations.AlterField(
model_name='registro501',
name='clave_documento',
field=models.CharField(blank=True, max_length=50, null=True),
),
migrations.AlterField(
model_name='registro502',
name='pais_transporte',
field=models.CharField(blank=True, max_length=50, null=True),
),
migrations.AlterField(
model_name='registro503',
name='tipo_guia',
field=models.CharField(blank=True, max_length=50, null=True),
),
migrations.AlterField(
model_name='registro701',
name='clave_documento',
field=models.CharField(blank=True, max_length=50, null=True),
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 5.2.3 on 2025-08-14 21:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('datastage', '0010_alter_registro501_clave_documento_and_more'),
]
operations = [
migrations.AlterField(
model_name='registro502',
name='fecha_pago_real',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AlterField(
model_name='registro503',
name='fecha_pago_real',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AlterField(
model_name='registro504',
name='fecha_pago_real',
field=models.DateTimeField(blank=True, null=True),
),
]

View File

571
api/datastage/models.py Normal file
View File

@@ -0,0 +1,571 @@
from django.db import models
# Create your models here.
class DataStage(models.Model):
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='datastages', null=True, blank=True)
archivo = models.FileField(upload_to='datastages/', blank=False, null=False)
contribuyente = models.CharField(max_length=100, blank=False, null=False)
procesado = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
verbose_name = "DataStage"
verbose_name_plural = "DataStages"
db_table = 'datastage'
def __str__(self):
return organizacion.nombre if self.organizacion else "DataStage sin organizacion"
class Registro500(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=4, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=3, null=True, blank=True)
consecutivo_remesa = models.CharField(max_length=50, null=True, blank=True)
numero_seleccion = models.CharField(max_length=50, null=True, blank=True)
fecha_inicio_reconocimiento = models.DateField(null=True, blank=True)
hora_inicio_reconocimiento = models.TimeField(null=True, blank=True)
fecha_fin_reconocimiento = models.DateField(null=True, blank=True)
hora_fin_reconocimiento = models.TimeField(null=True, blank=True)
fraccion = models.CharField(max_length=50, null=True, blank=True)
secuencia_fraccion = models.CharField(max_length=50, null=True, blank=True)
clave_documento = models.CharField(max_length=50, null=True, blank=True)
tipo_operacion = models.CharField(max_length=50, null=True, blank=True)
grado_incidencia = models.CharField(max_length=50, null=True, blank=True)
fecha_seleccion = models.DateField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro500s', null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro500s', null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"{self.patente} - {self.pedimento} - {self.seccion_aduanera}"
class Meta:
db_table = 'registro500'
class Registro501(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=4, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=3, null=True, blank=True)
tipo_operacion = models.CharField(max_length=50, null=True, blank=True)
clave_documento = models.CharField(max_length=50, null=True, blank=True)
seccion_aduanera_entrada = models.CharField(max_length=3, null=True, blank=True)
curp_contribuyente = models.CharField(max_length=18, null=True, blank=True)
rfc = models.CharField(max_length=13, null=True, blank=True)
curp_agente_a = models.CharField(max_length=18, null=True, blank=True)
tipo_cambio = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
total_fletes = models.CharField(max_length=12, null=True, blank=True)
total_seguros = models.CharField(max_length=12, null=True, blank=True)
total_embalajes = models.CharField(max_length=12, null=True, blank=True)
total_incrementables = models.CharField(max_length=12, null=True, blank=True)
total_deducibles = models.CharField(max_length=12, null=True, blank=True)
peso_bruto_mercancia = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
medio_transporte_salida = models.CharField(max_length=2, null=True, blank=True)
medio_transporte_arribo = models.CharField(max_length=2, null=True, blank=True)
medio_transporte_entrada_salida = models.CharField(max_length=2, null=True, blank=True)
destino_mercancia = models.CharField(max_length=2, null=True, blank=True)
nombre_contribuyente = models.CharField(max_length=120, null=True, blank=True)
calle_contribuyente = models.CharField(max_length=80, null=True, blank=True)
num_interior_contribuyente = models.CharField(max_length=10, null=True, blank=True)
num_exterior_contribuyente = models.CharField(max_length=10, null=True, blank=True)
cp_contribuyente = models.CharField(max_length=10, null=True, blank=True)
municipio_contribuyente = models.CharField(max_length=80, null=True, blank=True)
entidad_fed_contribuyente = models.CharField(max_length=3, null=True, blank=True)
pais_contribuyente = models.CharField(max_length=3, null=True, blank=True)
tipo_pedimento = models.CharField(max_length=50, null=True, blank=True)
fecha_recepcion_pedimento = models.DateTimeField(null=True, blank=True)
fecha_pago_real = models.DateTimeField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro501s', null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro501s', null=True, blank=True)
class Meta:
db_table = 'registro501'
class Registro502(models.Model):
id = models.AutoField(primary_key=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
rfc_transportista = models.CharField(max_length=13, null=True, blank=True)
curp_transportista = models.CharField(max_length=18, null=True, blank=True)
nombre_transportista = models.CharField(max_length=120, null=True, blank=True)
pais_transporte = models.CharField(max_length=50, null=True, blank=True)
identificador_transporte = models.CharField(max_length=17, null=True, blank=True)
fecha_pago_real = models.DateTimeField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro502s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro502s', null=True, blank=True)
patente = models.CharField(max_length=50, null=True, blank=True)
class Meta:
db_table = 'registro502'
class Registro503(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
numero_guia = models.CharField(max_length=20, null=True, blank=True)
tipo_guia = models.CharField(max_length=50, null=True, blank=True)
fecha_pago_real = models.DateTimeField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro503s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro503s', null=True, blank=True)
class Meta:
db_table = 'registro503'
class Registro504(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
num_contenedor = models.CharField(max_length=12, null=True, blank=True)
tipo_contenedor = models.CharField(max_length=2, null=True, blank=True)
fecha_pago_real = models.DateTimeField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro504s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro504s', null=True, blank=True)
class Meta:
db_table = 'registro504'
class Registro505(models.Model):
id = models.AutoField(primary_key=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
fecha_facturacion = models.DateField(null=True, blank=True)
numero_factura = models.CharField(max_length=40, null=True, blank=True)
termino_facturacion = models.CharField(max_length=3, null=True, blank=True)
moneda_facturacion = models.CharField(max_length=3, null=True, blank=True)
valor_dolares = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
valor_moneda_extranjera = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
pais_facturacion = models.CharField(max_length=3, null=True, blank=True)
entidad_fed_facturacion = models.CharField(max_length=3, null=True, blank=True)
indent_fiscal_proveedor = models.CharField(max_length=30, null=True, blank=True)
proveedor_mercancia = models.CharField(max_length=120, null=True, blank=True)
calle_proveedor = models.CharField(max_length=80, null=True, blank=True)
num_interior_proveedor = models.CharField(max_length=10, null=True, blank=True)
num_exterior_proveedor = models.CharField(max_length=10, null=True, blank=True)
cp_proveedor = models.CharField(max_length=10, null=True, blank=True)
municipio_proveedor = models.CharField(max_length=80, null=True, blank=True)
fecha_pago_real = models.CharField(max_length=50, null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro505s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro505s', null=True, blank=True)
patente = models.CharField(max_length=50, null=True, blank=True)
class Meta:
db_table = 'registro505'
class Registro506(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
tipo_fecha = models.CharField(max_length=2, null=True, blank=True)
fecha_operacion = models.DateField(null=True, blank=True)
fecha_validacion_pago_r = models.DateTimeField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro506s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro506s', null=True, blank=True)
class Meta:
db_table = 'registro506'
class Registro507(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
clave_caso = models.CharField(max_length=50, null=True, blank=True)
identificador_caso = models.CharField(max_length=50, null=True, blank=True)
tipo_pedimento = models.CharField(max_length=50, null=True, blank=True)
complemento_caso = models.CharField(max_length=50, null=True, blank=True)
fecha_validacion_pago_r = models.CharField(max_length=50, null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro507s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro507s', null=True, blank=True)
class Meta:
db_table = 'registro507'
class Registro508(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
institucion_emisora = models.CharField(max_length=2, null=True, blank=True)
numero_cuenta = models.CharField(max_length=50, null=True, blank=True)
folio_constancia = models.CharField(max_length=17, null=True, blank=True)
fecha_constancia = models.DateField(null=True, blank=True)
tipo_cuenta = models.CharField(max_length=2, null=True, blank=True)
clave_garantia = models.CharField(max_length=50, null=True, blank=True)
valor_unitario_titulo = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
total_garantia = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
cantidad_unidades = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
titulos_asignados = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
fecha_pago_real = models.DateField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro508s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro508s', null=True, blank=True)
class Meta:
db_table = 'registro508'
class Registro509(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=4, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=3, null=True, blank=True)
clave_contribucion = models.CharField(max_length=2, null=True, blank=True)
tasa_contribucion = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
tipo_tasa = models.CharField(max_length=2, null=True, blank=True)
tipo_pedimento = models.IntegerField(null=True, blank=True)
fecha_pago_real = models.DateTimeField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro509s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro509s', null=True, blank=True)
class Meta:
db_table = 'registro509'
class Registro510(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
clave_contribucion = models.CharField(max_length=2, null=True, blank=True)
tasa_contribucion = models.CharField(max_length=50, null=True, blank=True)
tipo_tasa = models.CharField(max_length=50, null=True, blank=True)
tipo_pedimento = models.CharField(max_length=50, null=True, blank=True)
fecha_pago_real = models.CharField(max_length=50, null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro510s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro510s', null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
forma_pago = models.CharField(max_length=3, null=True, blank=True)
importe_pago = models.CharField(max_length=12, null=True, blank=True)
class Meta:
db_table = 'registro510'
class Registro511(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
secuencia_observacion = models.CharField(max_length=3, null=True, blank=True)
observaciones = models.CharField(max_length=120, null=True, blank=True)
tipo_pedimento = models.CharField(max_length=50, null=True, blank=True)
fecha_validacion_pago_r = models.DateTimeField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro511s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro511s', null=True, blank=True)
class Meta:
db_table = 'registro511'
class Registro512(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=3, null=True, blank=True)
patente_aduanal_orig = models.CharField(max_length=4, null=True, blank=True)
pedimento_original = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera_desp_orig = models.CharField(max_length=50, null=True, blank=True)
documento_original = models.CharField(max_length=50, null=True, blank=True)
fecha_operacion_orig = models.DateField(null=True, blank=True)
fraccion_original = models.CharField(max_length=8, null=True, blank=True)
unidad_medida = models.CharField(max_length=2, null=True, blank=True)
mercancia_descargada = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
tipo_pedimento = models.CharField(max_length=50, null=True, blank=True)
fecha_pago_real = models.DateTimeField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro512s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro512s', null=True, blank=True)
class Meta:
db_table = 'registro512'
class Registro520(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
indent_fiscal_destinatario = models.CharField(max_length=17, null=True, blank=True)
nombre_destinatario_mercancia = models.CharField(max_length=120, null=True, blank=True)
calle_destinatario = models.CharField(max_length=80, null=True, blank=True)
num_interior_destinatario = models.CharField(max_length=10, null=True, blank=True)
num_exterior_destinatario = models.CharField(max_length=10, null=True, blank=True)
cp_destinatario = models.CharField(max_length=10, null=True, blank=True)
municpio_destinatario = models.CharField(max_length=80, null=True, blank=True)
pais_destinatario = models.CharField(max_length=3, null=True, blank=True)
fecha_pago_real = models.CharField(max_length=50, null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro520s', null=True, blank=True)
created_at = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro520s', null=True, blank=True)
class Meta:
db_table = 'registro520'
class Registro551(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
fraccion = models.CharField(max_length=8, null=True, blank=True)
secuencia_fraccion = models.CharField(max_length=50, null=True, blank=True)
subdivision_fraccion = models.CharField(max_length=8, null=True, blank=True)
descripcion_mercancia = models.CharField(max_length=250, null=True, blank=True)
precio_unitario = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
valor_aduana = models.CharField(max_length=12, null=True, blank=True)
valor_comercial = models.CharField(max_length=12, null=True, blank=True)
valor_dolares = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
cantidad_um_comercial = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
unidad_medida_comercial = models.CharField(max_length=2, null=True, blank=True)
cantidad_um_tarifa = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
unidad_medida_tarifa = models.CharField(max_length=2, null=True, blank=True)
valor_agregado = models.CharField(max_length=12, null=True, blank=True)
clave_vinculacion = models.CharField(max_length=1, null=True, blank=True)
metodo_valorizacion = models.CharField(max_length=2, null=True, blank=True)
codigo_mercancia_producto = models.CharField(max_length=20, null=True, blank=True)
marca_mercancia_producto = models.CharField(max_length=80, null=True, blank=True)
modelo_mercancia_producto = models.CharField(max_length=80, null=True, blank=True)
pais_origen_destino = models.CharField(max_length=3, null=True, blank=True)
pais_comprador_vendedor = models.CharField(max_length=3, null=True, blank=True)
entidad_fed_origen = models.CharField(max_length=3, null=True, blank=True)
entidad_fed_comprador = models.CharField(max_length=3, null=True, blank=True)
entidad_fed_vendedor = models.CharField(max_length=3, null=True, blank=True)
tipo_operacion = models.CharField(max_length=50, null=True, blank=True)
clave_documento = models.CharField(max_length=50, null=True, blank=True)
fecha_pago_real = models.DateTimeField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro551s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro551s', null=True, blank=True)
entidad_fed_destino = models.CharField(max_length=50, null=True, blank=True)
class Meta:
db_table = 'registro551'
class Registro552(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
fraccion = models.CharField(max_length=8, null=True, blank=True)
secuencia_fraccion = models.CharField(max_length=50, null=True, blank=True)
vin_numero_serie = models.CharField(max_length=25, null=True, blank=True)
kilometraje_vehiculo = models.CharField(max_length=6, null=True, blank=True)
fecha_pago_real = models.DateField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro552s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro552s', null=True, blank=True)
class Meta:
db_table = 'registro552'
class Registro553(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
fraccion = models.CharField(max_length=8, null=True, blank=True)
secuencia_fraccion = models.CharField(max_length=50, null=True, blank=True)
clave_permiso = models.CharField(max_length=3, null=True, blank=True)
firma_descargo = models.CharField(max_length=40, null=True, blank=True)
numero_permiso = models.CharField(max_length=30, null=True, blank=True)
valor_comercial_dolares = models.CharField(max_length=50, null=True, blank=True)
cantidad_mum_tarifa = models.CharField(max_length=50, null=True, blank=True)
fecha_pago_real = models.CharField(max_length=50, null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro553s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro553s', null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
class Meta:
db_table = 'registro553'
class Registro554(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
fraccion = models.CharField(max_length=8, null=True, blank=True)
secuencia_fraccion = models.CharField(max_length=50, null=True, blank=True)
clave_caso = models.CharField(max_length=50, null=True, blank=True)
identificador_caso = models.CharField(max_length=50, null=True, blank=True)
complemento_caso = models.CharField(max_length=50, null=True, blank=True)
fecha_pago_real = models.DateTimeField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro554s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro554s', null=True, blank=True)
class Meta:
db_table = 'registro554'
class Registro555(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
fraccion = models.CharField(max_length=8, null=True, blank=True)
secuencia_fraccion = models.CharField(max_length=50, null=True, blank=True)
institucion_emisora = models.CharField(max_length=2, null=True, blank=True)
numero_cuenta = models.CharField(max_length=17, null=True, blank=True)
folio_constancia = models.CharField(max_length=17, null=True, blank=True)
fecha_constancia = models.DateField(null=True, blank=True)
clave_garantia = models.CharField(max_length=50, null=True, blank=True)
valor_unitario_titulo = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
total_garantia = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
cantidad_unidades_medida = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
titulos_asignados = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
fecha_pago_real = models.DateField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro555s', null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro555s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
class Meta:
db_table = 'registro555'
class Registro556(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
clave_contribucion = models.CharField(max_length=2, null=True, blank=True)
tasa_contribucion = models.DecimalField(max_digits=18, decimal_places=6, null=True, blank=True)
tipo_tasa = models.CharField(max_length=2, null=True, blank=True)
fecha_pago_real = models.DateTimeField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro556s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro556s', null=True, blank=True)
fraccion = models.CharField(max_length=8, null=True, blank=True)
secuencia_fraccion = models.CharField(max_length=50, null=True, blank=True)
class Meta:
db_table = 'registro556'
class Registro557(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
fraccion = models.CharField(max_length=8, null=True, blank=True)
secuencia_fraccion = models.CharField(max_length=50, null=True, blank=True)
clave_contribucion = models.CharField(max_length=2, null=True, blank=True)
forma_pago = models.CharField(max_length=3, null=True, blank=True)
importe_pago = models.CharField(max_length=12, null=True, blank=True)
fecha_pago_real = models.DateTimeField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro557s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro557s', null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
class Meta:
db_table = 'registro557'
class Registro558(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
fraccion = models.CharField(max_length=8, null=True, blank=True)
secuencia_fraccion = models.CharField(max_length=50, null=True, blank=True)
secuencia_observacion = models.CharField(max_length=3, null=True, blank=True)
observaciones = models.CharField(max_length=120, null=True, blank=True)
fecha_pago_real = models.DateTimeField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro558s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro558s', null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
class Meta:
db_table = 'registro558'
class RegistroSel(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=50, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
consecutivo_remesa = models.CharField(max_length=50, null=True, blank=True)
numero_seleccion = models.CharField(max_length=50, null=True, blank=True)
fecha_seleccion = models.DateField(null=True, blank=True)
hora_seleccion = models.TimeField(null=True, blank=True)
semaforo_fiscal = models.CharField(max_length=1, null=True, blank=True)
clave_documento = models.CharField(max_length=3, null=True, blank=True)
tipo_operacion = models.CharField(max_length=50, null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro_sel', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro_sel', null=True, blank=True)
class Meta:
db_table = 'registro_sel'
class Registro701(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=4, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=3, null=True, blank=True)
clave_documento = models.CharField(max_length=50, null=True, blank=True)
fecha_pago = models.DateField(null=True, blank=True)
pedimento_anterior = models.CharField(max_length=50, null=True, blank=True)
patente_anterior = models.CharField(max_length=50, null=True, blank=True)
seccion_aduanera_anterior = models.CharField(max_length=50, null=True, blank=True)
documento_anterior = models.CharField(max_length=50, null=True, blank=True)
fecha_operacion_anterior = models.DateField(null=True, blank=True)
pedimento_original = models.CharField(max_length=50, null=True, blank=True)
patente_aduanal_orig = models.CharField(max_length=50, null=True, blank=True)
seccion_aduanera_desp_orig = models.CharField(max_length=50, null=True, blank=True)
fecha_pago_real = models.DateTimeField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro701s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro701s', null=True, blank=True)
class Meta:
db_table = 'registro701'
class Registro702(models.Model):
id = models.AutoField(primary_key=True)
patente = models.CharField(max_length=50, null=True, blank=True)
pedimento = models.CharField(max_length=7, null=True, blank=True)
seccion_aduanera = models.CharField(max_length=50, null=True, blank=True)
clave_contribucion = models.CharField(max_length=2, null=True, blank=True)
forma_pago = models.CharField(max_length=50, null=True, blank=True)
importe_pago = models.CharField(max_length=12, null=True, blank=True)
tipo_pedimento = models.CharField(max_length=50, null=True, blank=True)
fecha_pago_real = models.DateTimeField(null=True, blank=True)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='registro702s', null=True, blank=True)
created_by = models.IntegerField(null=True, blank=True)
consulta = models.CharField(max_length=50, null=True, blank=True)
datastage = models.ForeignKey(DataStage, on_delete=models.CASCADE, related_name='registro702s', null=True, blank=True)
class Meta:
db_table = 'registro702'

View File

@@ -0,0 +1,12 @@
from rest_framework import serializers
from .models import DataStage
from api.organization.models import Organizacion
class DataStageSerializer(serializers.ModelSerializer):
organizacion = serializers.PrimaryKeyRelatedField(required=False, allow_null=True, queryset=Organizacion.objects.all())
class Meta:
model = DataStage
fields = '__all__'
read_only_fields = ('id', 'created_at', 'updated_at')

276
api/datastage/tasks.py Normal file
View File

@@ -0,0 +1,276 @@
from celery import group
from celery import shared_task
import logging
from django.apps import apps
from django.utils import timezone
import os
import zipfile
import re
@shared_task
def procesar_datastage_task(datastage_id, user_organizacion_id=None):
import traceback
try:
logger = logging.getLogger(__name__)
from api.datastage.models import DataStage
from api.organization.models import Organizacion
from api.customs.models import Pedimento, TipoOperacion, Regimen
datastage = DataStage.objects.get(id=datastage_id)
if not datastage.archivo:
return {'detail': 'No hay archivo asociado a este DataStage.'}
file_path = datastage.archivo.path
if not os.path.exists(file_path):
return {'detail': 'El archivo no existe en el servidor.'}
if not file_path.endswith('.zip'):
return {'detail': 'El archivo no es un .zip.'}
documentos_encontrados = []
registros_cargados = {}
registros_por_archivo = {}
errores_por_archivo = {}
errores_pedimento = []
user_organizacion = None
if user_organizacion_id:
user_organizacion = Organizacion.objects.get(id=user_organizacion_id)
def to_snake_case(name):
s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
s2 = re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1)
return s2.replace('__', '_').lower()
# Lanzar una subtarea por cada archivo ASC
subtasks = []
with zipfile.ZipFile(file_path, 'r') as zip_ref:
for asc_name in zip_ref.namelist():
if asc_name.endswith('.asc'):
subtasks.append(procesar_archivo_asc_task.s(datastage_id, user_organizacion_id, asc_name))
if subtasks:
job = group(subtasks).apply_async()
return {
'group_id': job.id,
'subtask_ids': [t.id for t in job.results],
'detail': 'Procesamiento lanzado. Monitorea el estado de cada subtask_id.'
}
return {'detail': 'No se encontraron archivos .asc'}
except Exception as e:
import traceback
return {'error': str(e), 'traceback': traceback.format_exc()}
@shared_task
def procesar_archivo_asc_task(datastage_id, user_organizacion_id, asc_name):
import traceback
try:
logger = logging.getLogger(__name__)
from api.datastage.models import DataStage
from api.organization.models import Organizacion
from api.customs.models import Pedimento, TipoOperacion, Regimen
from django.apps import apps
import zipfile
import re
datastage = DataStage.objects.get(id=datastage_id)
user_organizacion = None
if user_organizacion_id:
user_organizacion = Organizacion.objects.get(id=user_organizacion_id)
file_path = datastage.archivo.path
def to_snake_case(name):
s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
s2 = re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1)
return s2.replace('__', '_').lower()
with zipfile.ZipFile(file_path, 'r') as zip_ref:
if asc_name not in zip_ref.namelist():
return {'errores': [f'{asc_name} no encontrado en el zip']}
match = re.match(r'.*_(\d+)\.asc$', asc_name)
if match:
registro_key = match.group(1)
model_name = f'Registro{registro_key}'
else:
match2 = re.match(r'.*_([A-Za-z]+)\.asc$', asc_name)
if match2:
registro_key = match2.group(1).capitalize()
model_name = f'Registro{registro_key}'
else:
return {'errores': ["No se pudo determinar el modelo"]}
try:
Model = apps.get_model('datastage', model_name)
except LookupError:
return {'errores': [f"No existe el modelo para {model_name}"]}
with zip_ref.open(asc_name) as asc_file:
first = True
field_names = []
field_names_snake = []
objects_to_create = []
errores_pedimento = []
for line in asc_file:
line_decoded = None
try:
line_decoded = line.decode('utf-8').strip()
except UnicodeDecodeError:
try:
line_decoded = line.decode('latin-1').strip()
except Exception as e:
continue
except Exception as e:
continue
if not line_decoded:
continue
if first:
field_names = [f for f in line_decoded.split('|')]
field_names_snake = [to_snake_case(f) for f in field_names]
first = False
continue
values = line_decoded.split('|')
while values and values[-1] == '':
values.pop()
if len(values) == len(field_names_snake) + 1 and values[-1] == '':
values = values[:-1]
if len(values) < len(field_names_snake):
values += [None] * (len(field_names_snake) - len(values))
if len(values) != len(field_names_snake):
continue
data = dict(zip(field_names_snake, values))
if hasattr(Model, 'organizacion_id'):
data['organizacion_id'] = user_organizacion.id if user_organizacion else None
if hasattr(Model, 'datastage_id'):
data['datastage_id'] = datastage.id
# Limpiar campos de fecha vacíos ('') a None
for field in Model._meta.get_fields():
if hasattr(field, 'get_internal_type') and field.get_internal_type() in ["DateField", "DateTimeField"]:
if data.get(field.name) == "":
data[field.name] = None
# Convertir fecha_pago_real a timezone-aware si existe
if 'fecha_pago_real' in data and data['fecha_pago_real']:
from django.utils import timezone
import datetime
fecha_val = data['fecha_pago_real']
if isinstance(fecha_val, str):
try:
dt = datetime.datetime.strptime(fecha_val, '%Y-%m-%d %H:%M:%S')
except ValueError:
try:
dt = datetime.datetime.strptime(fecha_val, '%Y-%m-%d')
except Exception:
dt = None
if dt and timezone.is_naive(dt):
dt = timezone.make_aware(dt)
if dt:
data['fecha_pago_real'] = dt
elif isinstance(fecha_val, datetime.datetime) and timezone.is_naive(fecha_val):
data['fecha_pago_real'] = timezone.make_aware(fecha_val)
try:
obj = Model(**data)
objects_to_create.append(obj)
# Si es Registro501, crear Pedimento
if model_name == 'Registro501':
organizacion_instance = None
org_id = data.get('organizacion_id')
if org_id:
try:
organizacion_instance = Organizacion.objects.get(id=org_id)
except Exception as org_exc:
logger.warning(f"No se encontró la organización con id {org_id}: {org_exc}")
if not organizacion_instance:
organizacion_instance = user_organizacion
fecha_pago_raw = data.get('fecha_pago_real')
fecha_pago = None
if fecha_pago_raw:
if isinstance(fecha_pago_raw, str):
fecha_pago = fecha_pago_raw.split(' ')[0]
elif hasattr(fecha_pago_raw, 'date'):
fecha_pago = fecha_pago_raw.date()
else:
fecha_pago = fecha_pago_raw
aduana = data.get('seccion_aduanera')
patente = data.get('patente')
pedimento_num = data.get('pedimento')
pedimento_app = ""
try:
if fecha_pago and aduana and patente and pedimento_num:
if isinstance(fecha_pago, str):
year = fecha_pago[:4]
else:
year = str(fecha_pago.year)
pedimento_app = f"{year[-2:]}-{str(aduana).zfill(2)[-2:]}-{str(patente).zfill(4)[-4:]}-{str(pedimento_num).zfill(7)[-7:]}"
except Exception as ped_app_exc:
logger.warning(f"No se pudo generar pedimento_app: {ped_app_exc}")
tipo_operacion_val = data.get('tipo_operacion')
tipo_operacion = TipoOperacion.objects.filter(id=int(tipo_operacion_val)).first() if tipo_operacion_val else None
regimen = Regimen.objects.filter(claveped=data.get('clave_documento', '').strip(), tipo=tipo_operacion.id if tipo_operacion else None).first() if tipo_operacion else None
# Buscar o crear Importador para el RFC
importador_instance = None
rfc = data.get('rfc')
if rfc:
from api.customs.models import Importador
importador_instance = Importador.objects.filter(rfc=rfc).first()
if not importador_instance and organizacion_instance:
importador_instance = Importador.objects.create(rfc=rfc, organizacion=organizacion_instance)
pedimento_data = {
'pedimento': pedimento_num,
'patente': patente,
'aduana': aduana,
'regimen': regimen.regimenped if regimen else None,
'clave_pedimento': data.get('clave_documento'),
'pedimento_app': pedimento_app,
'organizacion': organizacion_instance,
'patente': patente,
'fecha_pago': fecha_pago,
'alerta': False,
'contribuyente': importador_instance,
'agente_aduanal': data.get('curp_agente_a'),
"tipo_operacion": tipo_operacion,
"numero_partidas": data.get('numero_partidas', 0),
"importe_total": data.get('importe_total', 0.0),
"saldo_disponible": data.get('saldo_disponible', 0.0),
"importe_pedimento": data.get('importe_pedimento', 0.0),
"existe_expediente": data.get('existe_expediente', False),
"remesas": data.get('remesas', False),
}
try:
Pedimento.objects.create(**pedimento_data)
except Exception as ped_exc:
pass
except Exception as e:
continue
if objects_to_create:
try:
Model.objects.bulk_create(objects_to_create, batch_size=1000)
except Exception as e:
return {'archivo': asc_name, 'error': str(e), 'traceback': traceback.format_exc()}
return {
'archivo': asc_name,
'insertados': len(objects_to_create)
}
except Exception as e:
import traceback
return {'archivo': asc_name, 'error': str(e), 'traceback': traceback.format_exc()}
detalles = {}
for key in ['502', '503', '504']:
model_name = f'Registro{key}'
asc_file = None
encabezado = None
errores = []
for asc_name in registros_por_archivo:
if asc_name.endswith(f'_{key}.asc'):
asc_file = asc_name
break
if asc_file:
try:
with zipfile.ZipFile(file_path, 'r') as zip_ref:
with zip_ref.open(asc_file) as f:
for line in f:
try:
encabezado = line.decode('utf-8').strip()
except UnicodeDecodeError:
encabezado = line.decode('latin-1').strip()
break
except Exception as e:
encabezado = f'Error leyendo encabezado: {e}'
errores = errores_por_archivo.get(asc_file, [])
detalles[model_name] = {
'archivo': asc_file,
'encabezado': encabezado,
'errores': errores
}
return {'registros_cargados': registros_cargados, 'errores_pedimento': errores_pedimento}

85
api/datastage/tests.py Normal file
View File

@@ -0,0 +1,85 @@
from django.urls import reverse
from rest_framework.test import APITestCase, APIClient
from rest_framework import status
from django.contrib.auth import get_user_model
from api.organization.models import Organizacion
from .models import DataStage
from io import BytesIO
from django.core.files.uploadedfile import SimpleUploadedFile
User = get_user_model()
class DataStageViewSetTests(APITestCase):
def setUp(self):
self.org = Organizacion.objects.create(nombre="OrgTest", is_active=True, is_verified=True)
self.org2 = Organizacion.objects.create(nombre="OrgTest2", is_active=True, is_verified=True)
self.admin = User.objects.create_user(username="admin", password="adminpass", organizacion=self.org)
self.admin.groups.create(name="admin")
self.superuser = User.objects.create_superuser(username="superuser", password="superpass")
self.importador = User.objects.create_user(username="importador", password="importpass", organizacion=self.org2, is_importador=True, rfc="RFC123456789")
self.importador.groups.create(name="importador")
self.client = APIClient()
def test_admin_sees_only_own_org(self):
ds1 = DataStage.objects.create(nombre="DS1", almacenamiento=10, organizacion=self.org, archivo=SimpleUploadedFile("a.txt", b"a"))
ds2 = DataStage.objects.create(nombre="DS2", almacenamiento=20, organizacion=self.org2, archivo=SimpleUploadedFile("b.txt", b"b"))
self.client.force_authenticate(user=self.admin)
url = reverse('datastage-list')
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
nombres = [ds['nombre'] for ds in response.data]
self.assertIn("DS1", nombres)
self.assertNotIn("DS2", nombres)
def test_superuser_sees_all(self):
ds1 = DataStage.objects.create(nombre="DS1", almacenamiento=10, organizacion=self.org, archivo=SimpleUploadedFile("a.txt", b"a"))
ds2 = DataStage.objects.create(nombre="DS2", almacenamiento=20, organizacion=self.org2, archivo=SimpleUploadedFile("b.txt", b"b"))
self.client.force_authenticate(user=self.superuser)
url = reverse('datastage-list')
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
nombres = [ds['nombre'] for ds in response.data]
self.assertIn("DS1", nombres)
self.assertIn("DS2", nombres)
def test_importador_cannot_create(self):
self.client.force_authenticate(user=self.importador)
url = reverse('datastage-list')
file_content = BytesIO(b"dummy data")
file = SimpleUploadedFile("test.txt", file_content.read(), content_type="text/plain")
data = {
"nombre": "DataStageImportador",
"almacenamiento": 10,
"archivo": file
}
response = self.client.post(url, data, format='multipart')
self.assertNotIn(response.status_code, [status.HTTP_201_CREATED, status.HTTP_200_OK])
def test_list_datastages(self):
url = reverse('datastage-list')
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_create_datastage(self):
url = reverse('datastage-list')
file_content = BytesIO(b"dummy data")
file = SimpleUploadedFile("test.txt", file_content.read(), content_type="text/plain")
data = {
"nombre": "DataStageTest",
"almacenamiento": 10,
"archivo": file
}
response = self.client.post(url, data, format='multipart')
self.assertIn(response.status_code, [status.HTTP_201_CREATED, status.HTTP_200_OK])
def test_update_datastage(self):
# First create
file_content = BytesIO(b"dummy data")
file = SimpleUploadedFile("test.txt", file_content.read(), content_type="text/plain")
ds = DataStage.objects.create(nombre="DataStageTest", almacenamiento=10, organizacion=self.org, archivo=file)
url = reverse('datastage-detail', args=[ds.id])
data = {"almacenamiento": 20}
response = self.client.patch(url, data)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data['almacenamiento'], 20)

12
api/datastage/urls.py Normal file
View File

@@ -0,0 +1,12 @@
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import DataStageViewSet
# Create a router and register our viewset with it.
router = DefaultRouter()
router.register(r'datastages', DataStageViewSet, basename='datastage')
# The API URLs are now determined automatically by the router.
urlpatterns = [
path('', include(router.urls)),
]

140
api/datastage/views.py Normal file
View File

@@ -0,0 +1,140 @@
from rest_framework.pagination import PageNumberPagination
from api.customs.models import Pedimento, TipoOperacion, Regimen
from django.shortcuts import render
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated
from rest_framework.decorators import action
from rest_framework.response import Response
from django.http import FileResponse, Http404
import os
from .models import DataStage
from .serializer import DataStageSerializer
from api.logger.mixins import LoggingMixin
from mixins.filtrado_organizacion import OrganizacionFiltradaMixin
from core.permissions import (
IsSameOrganization,
IsSameOrganizationDeveloper,
IsSameOrganizationAndAdmin,
IsSuperUser
)
# Create your views here.
class DataStagePagination(PageNumberPagination):
page_size = 20 # Valor por defecto
page_size_query_param = 'page_size'
max_page_size = 1000
class DataStageViewSet(LoggingMixin, viewsets.ModelViewSet, OrganizacionFiltradaMixin):
"""
ViewSet for managing DataStage instances.
Provides CRUD operations for DataStage.
"""
serializer_class = DataStageSerializer
permission_classes = [IsAuthenticated & (IsSameOrganization | IsSameOrganizationAndAdmin | IsSameOrganizationDeveloper | IsSuperUser)]
model = DataStage
my_tags = ['DataStage']
pagination_class = DataStagePagination
def get_queryset(self):
if self.request.user.is_superuser:
return DataStage.objects.all().order_by('-created_at')
if self.request.user.groups.filter(name='developer').exists() or self.request.user.groups.filter(name='admin').exists() or self.request.user.groups.filter(name='Agente Aduanal').exists():
return DataStage.objects.filter(organizacion=self.request.user.organizacion).order_by('-created_at')
return self.get_queryset_filtrado_por_organizacion().order_by('-created_at')
def perform_create(self, serializer):
"""
Permite que la organización sea opcional en el request, pero si no se envía, se asigna la del usuario autenticado.
"""
if not self.request.user.is_authenticated or not hasattr(self.request.user, 'organizacion'):
raise ValueError("Usuario no autenticado o sin organización")
data = serializer.validated_data
organizacion = data.get('organizacion')
if self.request.user.is_superuser:
# Permitir que el superusuario cree sin organización o la especifique
serializer.save()
return
if (self.request.user.groups.filter(name='developer').exists() or self.request.user.groups.filter(name='admin').exists() or self.request.user.groups.filter(name='user').exists()) and self.request.user.groups.filter(name='Agente Aduanal').exists():
if not organizacion:
serializer.save(organizacion=self.request.user.organizacion)
else:
serializer.save()
return
raise ValueError("No cuentas con los permisos necesarios para crear un DataStage")
def perform_update(self, serializer):
"""
Override to ensure organization is set on update.
"""
if not self.request.user.is_authenticated or not hasattr(self.request.user, 'organizacion'):
raise ValueError("Usuario no autenticado o sin organización")
if self.request.user.is_superuser:
# Allow superuser to update without organization
serializer.save()
return
if (self.request.user.groups.filter(name='developer').exists() or self.request.user.groups.filter(name='admin').exists() or self.request.user.groups.filter(name='user').exists()) and self.request.user.groups.filter(name='Agente Aduanal').exists():
serializer.save(organizacion=self.request.user.organizacion)
return
raise ValueError("No cuentas con los permisos necesarios para actualizar un DataStage")
@action(detail=True, methods=['get'], url_path='download-datastage', url_name='download-datastage')
def download_datastage(self, request, pk=None):
"""
Endpoint para descargar el archivo asociado a un DataStage.
"""
try:
datastage = self.get_object()
if not datastage.archivo:
raise Http404("No hay archivo asociado a este DataStage.")
file_path = datastage.archivo.path
if not os.path.exists(file_path):
raise Http404("El archivo no existe en el servidor.")
response = FileResponse(open(file_path, 'rb'), as_attachment=True, filename=os.path.basename(file_path))
return response
except Exception as e:
return Response({'detail': str(e)}, status=404)
@action(detail=True, methods=['post'], url_path='procesar')
def procesar(self, request, pk=None):
"""
Endpoint para procesar el DataStage de forma asíncrona usando Celery.
"""
from api.datastage.tasks import procesar_datastage_task
datastage = self.get_object()
user_organizacion = getattr(self.request.user, 'organizacion', None)
user_organizacion_id = user_organizacion.id if user_organizacion else None
task = procesar_datastage_task.delay(datastage.id, user_organizacion_id)
return Response({
'task_id': task.id,
'detail': 'Procesamiento iniciado. Puede consultar el estado con el task_id.'
})
@action(detail=False, methods=['get'], url_path='task-status')
def task_status(self, request):
"""
Consulta el estado de una tarea de Celery por task_id.
"""
from celery.result import AsyncResult
task_id = request.query_params.get('task_id')
if not task_id:
return Response({'detail': 'Falta el parámetro task_id.'}, status=400)
result = AsyncResult(task_id)
return Response({
'task_id': task_id,
'status': result.status,
'result': result.result if result.successful() else None
})