feature/implementacion de hub en EFC

This commit is contained in:
2026-06-08 07:19:01 -06:00
parent a9931d2838
commit e1716d65a7
20 changed files with 3749 additions and 649 deletions

View File

@@ -257,12 +257,16 @@ class PedimentoFilter(django_filters.FilterSet):
# Rango de fecha de pago: ?fecha_pago_desde=YYYY-MM-DD&fecha_pago_hasta=YYYY-MM-DD
fecha_pago_desde = django_filters.DateFilter(field_name='fecha_pago', lookup_expr='gte')
fecha_pago_hasta = django_filters.DateFilter(field_name='fecha_pago', lookup_expr='lte')
# CharFilter directo sobre contribuyente_id (RFC). ModelChoiceFilter silenciosamente
# omite el filtro cuando el RFC no existe, lo que causa fuga de pedimentos de otros
# importadores. Con CharFilter+exact: RFC inválido → cero resultados, nunca fuga.
contribuyente = django_filters.CharFilter(field_name='contribuyente', lookup_expr='exact')
class Meta:
model = Pedimento
fields = [
'patente', 'aduana', 'tipo_operacion', 'clave_pedimento',
'pedimento', 'existe_expediente', 'contribuyente',
'pedimento', 'existe_expediente',
'curp_apoderado', 'fecha_pago', 'pedimento_app',
]
class ViewSetPedimento(LoggingMixin, viewsets.ModelViewSet, OrganizacionFiltradaMixin): # Pendiente de permisos de creacion
@@ -1198,18 +1202,18 @@ class ViewSetPedimento(LoggingMixin, viewsets.ModelViewSet, OrganizacionFiltrada
status=status.HTTP_400_BAD_REQUEST
)
# Validar organización del usuario
if not request.user.is_authenticated or not hasattr(request.user, 'organizacion'):
# Validar organización del usuario (superuser usa active_organization)
from core.permissions import get_org_context
organizacion = get_org_context(request.user) if request.user.is_authenticated else None
if not organizacion:
return Response(
{
"tieneError": True,
"error": "Usuario no autenticado o sin organización"
},
"error": "Usuario no autenticado o sin organización asignada"
},
status=status.HTTP_400_BAD_REQUEST
)
organizacion = request.user.organizacion
# Regex para validar nomenclatura: anio-aduana-patente-pedimento
nomenclatura_pattern = re.compile(r'^(\d{2})-(\d{2,3})-(\d{4})-(\d{7})$')
nomenclatura_pattern_sin_anio = re.compile(r'^(\d{2,3})-(\d{4})-(\d{7})$')
@@ -1744,17 +1748,17 @@ class ViewSetPedimento(LoggingMixin, viewsets.ModelViewSet, OrganizacionFiltrada
partidas_input = request.data.get('partidas')
fuente_archivos = request.data.get('partidas')
# Validar organización del usuario
if not request.user.is_authenticated or not hasattr(request.user, 'organizacion'):
# Validar organización del usuario (superuser usa active_organization)
from core.permissions import get_org_context
organizacion = get_org_context(request.user) if request.user.is_authenticated else None
if not organizacion:
return Response(
{
"tieneError": True,
"error": "Usuario no autenticado o sin organización"
},
"error": "Usuario no autenticado o sin organización asignada"
},
status=status.HTTP_400_BAD_REQUEST
)
organizacion = request.user.organizacion
# Regex para validar nomenclatura: anio-aduana-patente-pedimento
nomenclatura_pattern = re.compile(r'^(\d{2})-(\d{2,3})-(\d{4})-(\d{7})$')
@@ -2210,16 +2214,16 @@ class ViewSetPedimento(LoggingMixin, viewsets.ModelViewSet, OrganizacionFiltrada
status=status.HTTP_400_BAD_REQUEST
)
# Validar organización del usuario
if not request.user.is_authenticated or not hasattr(request.user, 'organizacion'):
# Validar organización del usuario (superuser usa active_organization)
from core.permissions import get_org_context
organizacion = get_org_context(request.user) if request.user.is_authenticated else None
if not organizacion:
return Response(
{'tieneError': True,
"mensaje": "Usuario no autenticado o sin organización"},
"mensaje": "Usuario no autenticado o sin organización asignada"},
status=status.HTTP_400_BAD_REQUEST
)
organizacion = request.user.organizacion
# Preparar parámetros
parametros = {
'contribuyente': request.data.get('contribuyente'),