Compare commits
7 Commits
T2025-09-0
...
T2026-01-0
| Author | SHA1 | Date | |
|---|---|---|---|
| fa518972ba | |||
| 6299c6f0fe | |||
| 67f339bd18 | |||
| 98331dae8f | |||
| 6eaf6dc6d9 | |||
| 426c2f7065 | |||
| 86c0dd6d8b |
@@ -36,7 +36,8 @@ class Command(BaseCommand):
|
|||||||
|
|
||||||
if organizacion_id:
|
if organizacion_id:
|
||||||
if procesamiento:
|
if procesamiento:
|
||||||
microservice_v2.ejecutar_procesamiento_por_organizacion(organizacion_id, procesamiento)
|
# microservice_v2.ejecutar_procesamiento_por_organizacion(organizacion_id, procesamiento)
|
||||||
|
microservice_v2.ejecutar_por_organizacion_y_procesamiento(organizacion_id, procesamiento)
|
||||||
self.stdout.write(self.style.SUCCESS(f'Se ejecutó el procesamiento {procesamiento} para la organización {organizacion_id}.'))
|
self.stdout.write(self.style.SUCCESS(f'Se ejecutó el procesamiento {procesamiento} para la organización {organizacion_id}.'))
|
||||||
else:
|
else:
|
||||||
microservice_v2.ejecutar_todos_por_organizacion(organizacion_id)
|
microservice_v2.ejecutar_todos_por_organizacion(organizacion_id)
|
||||||
|
|||||||
@@ -222,14 +222,15 @@ def procesar_pedimentos_completos(organizacion_id):
|
|||||||
pedimento_dict = pedimento_to_dict(pedimento)
|
pedimento_dict = pedimento_to_dict(pedimento)
|
||||||
credenciales = Vucem.objects.filter(id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id).first()
|
credenciales = Vucem.objects.filter(id=CredencialesImportador.objects.filter(rfc=pedimento.contribuyente).first().vucem.id).first()
|
||||||
|
|
||||||
|
if not credenciales:
|
||||||
|
print(f"No se encontraron credenciales para el pedimento {pedimento.pedimento_app}")
|
||||||
|
continue
|
||||||
|
|
||||||
credenciales_dict = credenciales_to_dict(credenciales)
|
credenciales_dict = credenciales_to_dict(credenciales)
|
||||||
|
|
||||||
payload = {
|
payload = {
|
||||||
"pedimento": pedimento_dict,
|
"pedimento": pedimento_dict,
|
||||||
"credencial": credenciales_dict
|
"credencial": credenciales_dict
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
response = requests.post(
|
response = requests.post(
|
||||||
f"{SERVICE_API_URL_V2}/services/pedimento_completo",
|
f"{SERVICE_API_URL_V2}/services/pedimento_completo",
|
||||||
data=json.dumps(payload),
|
data=json.dumps(payload),
|
||||||
@@ -428,7 +429,35 @@ def documentos_con_errores(organizacion_id):
|
|||||||
# Aquí puedes agregar lógica adicional para manejar documentos con errores
|
# Aquí puedes agregar lógica adicional para manejar documentos con errores
|
||||||
# como enviar notificaciones, registrar en un log, etc.
|
# como enviar notificaciones, registrar en un log, etc.
|
||||||
|
|
||||||
|
@shared_task
|
||||||
|
def procesar_procesamiento_pedimento(organizacion_id):
|
||||||
|
# print("Creando procesamientos de pedimentos para organización:", organizacion_id)
|
||||||
|
|
||||||
|
pedimentos = Pedimento.objects.filter(organizacion_id=organizacion_id)
|
||||||
|
# pedimentos = Pedimento.objects.filter(id='1c061182-ac68-45b0-b3d7-35bf2264982b')
|
||||||
|
if not pedimentos.exists():
|
||||||
|
print("No se encontraron pedimentos para la organización:", organizacion_id)
|
||||||
|
return
|
||||||
|
for pedimento in pedimentos:
|
||||||
|
if not pedimento.documents.filter(document_type=2).exists(): # Tipo 2: Pedimento Completo
|
||||||
|
|
||||||
|
procesamiento_pedimento = ProcesamientoPedimento.objects.filter(
|
||||||
|
pedimento_id=pedimento.id,
|
||||||
|
servicio_id=3, # servicio 3: Pedimento Completo
|
||||||
|
)
|
||||||
|
|
||||||
|
if not procesamiento_pedimento.exists():
|
||||||
|
ProcesamientoPedimento.objects.create(
|
||||||
|
pedimento_id=pedimento.id
|
||||||
|
, organizacion_id=pedimento.organizacion_id
|
||||||
|
, estado_id =1
|
||||||
|
, servicio_id=3
|
||||||
|
, tipo_procesamiento_id=2) # servicio 3: Pedimento Completo
|
||||||
|
|
||||||
|
# print("Procesamiento creado para pedimento:", pedimento.pedimento_app)
|
||||||
|
|
||||||
|
procesar_pedimentos_completos.delay(organizacion_id)
|
||||||
|
|
||||||
def ejecutar_por_organizacion_y_procesamiento(organizacion_id, procesamiento):
|
def ejecutar_por_organizacion_y_procesamiento(organizacion_id, procesamiento):
|
||||||
if procesamiento == 'coves':
|
if procesamiento == 'coves':
|
||||||
procesar_coves.delay(organizacion_id)
|
procesar_coves.delay(organizacion_id)
|
||||||
@@ -444,9 +473,11 @@ def ejecutar_por_organizacion_y_procesamiento(organizacion_id, procesamiento):
|
|||||||
procesar_pedimentos_completos.delay(organizacion_id)
|
procesar_pedimentos_completos.delay(organizacion_id)
|
||||||
elif procesamiento == 'remesas':
|
elif procesamiento == 'remesas':
|
||||||
procesar_remesas.delay(organizacion_id)
|
procesar_remesas.delay(organizacion_id)
|
||||||
|
elif procesamiento == 'procesamiento_pedimento':
|
||||||
|
procesar_procesamiento_pedimento.delay(organizacion_id)
|
||||||
else:
|
else:
|
||||||
# Procesamiento no reconocido
|
# Procesamiento no reconocido
|
||||||
|
# print(f"Procesamiento no reconocido: {procesamiento}")
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def ejecutar_todos_por_organizacion(organizacion_id):
|
def ejecutar_todos_por_organizacion(organizacion_id):
|
||||||
@@ -459,3 +490,5 @@ def ejecutar_todos_por_organizacion(organizacion_id):
|
|||||||
procesar_remesas.delay(organizacion_id)
|
procesar_remesas.delay(organizacion_id)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ from .views import (
|
|||||||
ViewSetEDocument,
|
ViewSetEDocument,
|
||||||
ViewSetCove,
|
ViewSetCove,
|
||||||
ImportadorViewSet,
|
ImportadorViewSet,
|
||||||
PartidaViewSet
|
PartidaViewSet,
|
||||||
|
EjecutarComandoView
|
||||||
)
|
)
|
||||||
# from .views import YourViewSet # Import your viewsets here
|
# from .views import YourViewSet # Import your viewsets here
|
||||||
|
|
||||||
@@ -95,4 +96,7 @@ urlpatterns = [
|
|||||||
path('auditor/obtener-respuesta/acuse-cove-vu/', auditor_obtener_respuesta_acuse_cove_vu, name='obtener-respuesta-acuse-cove-vu'),
|
path('auditor/obtener-respuesta/acuse-cove-vu/', auditor_obtener_respuesta_acuse_cove_vu, name='obtener-respuesta-acuse-cove-vu'),
|
||||||
path('auditor/obtener-peticion/edocument-vu/', auditor_obtener_peticion_edocument_vu, name='obtener-peticion-edocument-vu'),
|
path('auditor/obtener-peticion/edocument-vu/', auditor_obtener_peticion_edocument_vu, name='obtener-peticion-edocument-vu'),
|
||||||
path('auditor/obtener-respuesta/edocument-vu/', auditor_obtener_respuesta_edocument_vu, name='obtener-respuesta-edocument-vu'),
|
path('auditor/obtener-respuesta/edocument-vu/', auditor_obtener_respuesta_edocument_vu, name='obtener-respuesta-edocument-vu'),
|
||||||
|
|
||||||
|
path('procesamientopedimentos-ejecutar-comando/', EjecutarComandoView.as_view(), name='procesamientopedimentos-ejecutar-comando'),
|
||||||
|
|
||||||
]
|
]
|
||||||
@@ -1777,6 +1777,66 @@ class ImportadorViewSet(viewsets.ModelViewSet, OrganizacionFiltradaMixin):
|
|||||||
|
|
||||||
my_tags = ['Importadores']
|
my_tags = ['Importadores']
|
||||||
|
|
||||||
|
class EjecutarComandoView(APIView):
|
||||||
|
permission_classes = [IsAuthenticated & (IsSameOrganization | IsSameOrganizationAndAdmin | IsSameOrganizationDeveloper | IsSuperUser)]
|
||||||
|
"""
|
||||||
|
View para ejecutar el comando de microservicios desde una petición HTTP.
|
||||||
|
"""
|
||||||
|
def post(self, request):
|
||||||
|
|
||||||
|
# Obtener organizacion_id del request (si se envía)
|
||||||
|
organizacion_id_request = request.data.get('organizacionid', None)
|
||||||
|
procesamiento = request.data.get('procesamiento', None)
|
||||||
|
todos = request.data.get('todos', False)
|
||||||
|
|
||||||
|
if not self.request.user.is_authenticated or not hasattr(self.request.user, 'organizacion'):
|
||||||
|
raise ValueError("Usuario no autenticado o sin organización")
|
||||||
|
|
||||||
|
if organizacion_id_request is None:
|
||||||
|
return Response(
|
||||||
|
{"error": 'No se proporcionó la organización a ejecutar el proceso.'},
|
||||||
|
status=status.HTTP_400_BAD_REQUEST
|
||||||
|
)
|
||||||
|
|
||||||
|
# organizacion_id = self.request.user.organizacion.id
|
||||||
|
organizacion_id = organizacion_id_request
|
||||||
|
nombre_organizacion = self.request.user.organizacion.nombre
|
||||||
|
|
||||||
|
if procesamiento is None and todos == False:
|
||||||
|
return Response(
|
||||||
|
{"message": 'No se detectó el tipo de ejecución de procesamiento.'},
|
||||||
|
status=status.HTTP_400_BAD_REQUEST
|
||||||
|
)
|
||||||
|
|
||||||
|
procesamiento = str(procesamiento)
|
||||||
|
|
||||||
|
from api.customs.tasks import microservice_v2
|
||||||
|
|
||||||
|
if todos:
|
||||||
|
|
||||||
|
microservice_v2.ejecutar_todos_por_organizacion(organizacion_id)
|
||||||
|
|
||||||
|
return Response(
|
||||||
|
{"message": f'Se estarán ejecutando todos los procesos para la organización {nombre_organizacion} en segundo plano.'},
|
||||||
|
status=status.HTTP_200_OK
|
||||||
|
)
|
||||||
|
|
||||||
|
elif organizacion_id:
|
||||||
|
|
||||||
|
if procesamiento:
|
||||||
|
microservice_v2.ejecutar_por_organizacion_y_procesamiento(organizacion_id, procesamiento)
|
||||||
|
return Response(
|
||||||
|
{"message": f'Se estará ejecutando el procesamiento {procesamiento} para la organización {nombre_organizacion} en segundo plano.'},
|
||||||
|
status=status.HTTP_200_OK
|
||||||
|
)
|
||||||
|
|
||||||
|
return Response(
|
||||||
|
{"error": "Parámetros insuficientes. Proporcione 'organizacion' y 'procesamiento', o seleccione 'todos'."},
|
||||||
|
status=status.HTTP_400_BAD_REQUEST
|
||||||
|
)
|
||||||
|
|
||||||
|
my_tags = ['Procesamientos_Pedimentos']
|
||||||
|
|
||||||
# helper | reglas para formato de docuemnto antes de cargarlo
|
# helper | reglas para formato de docuemnto antes de cargarlo
|
||||||
def normalize_filename(filename):
|
def normalize_filename(filename):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ class TaskFilter(filters.FilterSet):
|
|||||||
timestamp_gte = filters.DateTimeFilter(field_name='timestamp', lookup_expr='gte')
|
timestamp_gte = filters.DateTimeFilter(field_name='timestamp', lookup_expr='gte')
|
||||||
timestamp_lte = filters.DateTimeFilter(field_name='timestamp', lookup_expr='lte')
|
timestamp_lte = filters.DateTimeFilter(field_name='timestamp', lookup_expr='lte')
|
||||||
status = filters.CharFilter(field_name='status')
|
status = filters.CharFilter(field_name='status')
|
||||||
|
organizacion = filters.UUIDFilter(field_name='organizacion__id') # Cambiado a relación directa
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Task
|
model = Task
|
||||||
fields = ['servicio', 'pedimento_app', 'pedimento', 'timestamp_gte', 'timestamp_lte', 'status']
|
fields = ['servicio', 'pedimento_app', 'pedimento', 'timestamp_gte', 'timestamp_lte', 'status', 'organizacion']
|
||||||
@@ -4,6 +4,7 @@ from django_filters.rest_framework import DjangoFilterBackend
|
|||||||
from rest_framework.pagination import PageNumberPagination
|
from rest_framework.pagination import PageNumberPagination
|
||||||
|
|
||||||
from api.logger.mixins import LoggingMixin
|
from api.logger.mixins import LoggingMixin
|
||||||
|
from mixins.filtrado_organizacion import OrganizacionFiltradaMixin, ProcesosPorOrganizacionMixin
|
||||||
from .models import Task
|
from .models import Task
|
||||||
from .serializers import TaskSerializer
|
from .serializers import TaskSerializer
|
||||||
from .filters import TaskFilter
|
from .filters import TaskFilter
|
||||||
@@ -22,7 +23,7 @@ class TaskPagination(PageNumberPagination):
|
|||||||
page_size_query_param = 'page_size'
|
page_size_query_param = 'page_size'
|
||||||
max_page_size = 100
|
max_page_size = 100
|
||||||
|
|
||||||
class TaskViewSet(LoggingMixin,viewsets.ModelViewSet):
|
class TaskViewSet(LoggingMixin,viewsets.ModelViewSet,OrganizacionFiltradaMixin):
|
||||||
permission_classes = [IsAuthenticated & (IsSameOrganization | IsSameOrganizationAndAdmin | IsSameOrganizationDeveloper | IsSuperUser)]
|
permission_classes = [IsAuthenticated & (IsSameOrganization | IsSameOrganizationAndAdmin | IsSameOrganizationDeveloper | IsSuperUser)]
|
||||||
queryset = Task.objects.select_related('pedimento', 'servicio').all()
|
queryset = Task.objects.select_related('pedimento', 'servicio').all()
|
||||||
serializer_class = TaskSerializer
|
serializer_class = TaskSerializer
|
||||||
@@ -32,4 +33,19 @@ class TaskViewSet(LoggingMixin,viewsets.ModelViewSet):
|
|||||||
ordering_fields = ['timestamp']
|
ordering_fields = ['timestamp']
|
||||||
ordering = ['-timestamp'] # ordenamiento por defecto, más reciente primero
|
ordering = ['-timestamp'] # ordenamiento por defecto, más reciente primero
|
||||||
|
|
||||||
my_tags = ['tasks']
|
my_tags = ['tasks']
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Filtra las tareas según la organización del usuario.
|
||||||
|
Superusuarios pueden ver todas las tareas.
|
||||||
|
"""
|
||||||
|
queryset = self.get_queryset_filtrado_por_organizacion() # Tambien filtra por importador
|
||||||
|
# if user.is_superuser:
|
||||||
|
# return self.queryset
|
||||||
|
# # return self.queryset.filter(organizacion_id=user.organizacion.id)
|
||||||
|
# else:
|
||||||
|
# return self.queryset.filter(organizacion_id=user.organizacion.id)
|
||||||
|
return queryset
|
||||||
|
|
||||||
Reference in New Issue
Block a user