Files
plantillas-proyectos/backend/api/v1/modules/sitar/fracciones/service.py

92 lines
2.9 KiB
Python

"""Fracciones Service"""
import asyncio
from typing import Optional, List, Tuple
from ..common import SitarAPIBaseService
from .schemas import FraccionesResponse
class FraccionesService(SitarAPIBaseService):
"""Service for Fracciones operations"""
_instance: Optional["FraccionesService"] = None
@classmethod
def get_instance(cls) -> "FraccionesService":
"""Get singleton instance"""
if cls._instance is None:
cls._instance = cls()
return cls._instance
async def search_with_total(
self,
fraccion: Optional[str] = None,
nico: Optional[str] = None,
description: Optional[str] = None,
nivel: Optional[int] = None,
skip: int = 0,
limit: int = 100,
) -> Tuple[List[FraccionesResponse], int]:
"""Search Mexican tariff fractions; total matches SITAR PaginatedFraccionesResponse.total."""
params = {"skip": skip, "limit": min(limit, 1000)}
if fraccion:
params["fraccion"] = fraccion
if nico:
params["nico"] = nico
if description:
params["descripcion"] = description
if nivel is not None:
params["nivel"] = nivel
raw = await self._make_request("GET", "/api/v1/fracciones/", params=params)
rows, total = self._parse_paginated_list_and_total(raw)
return [FraccionesResponse(**item) for item in rows], total
async def search(
self,
fraccion: Optional[str] = None,
nico: Optional[str] = None,
description: Optional[str] = None,
nivel: Optional[int] = None,
skip: int = 0,
limit: int = 100,
) -> List[FraccionesResponse]:
"""Search Mexican tariff fractions"""
items, _ = await self.search_with_total(
fraccion=fraccion,
nico=nico,
description=description,
nivel=nivel,
skip=skip,
limit=limit,
)
return items
async def get_by_id(self, sysid: int) -> FraccionesResponse:
"""Get single Fraccion record by SYSID"""
data = await self._make_request("GET", f"/api/v1/fracciones/{sysid}")
return FraccionesResponse(**data)
@classmethod
def search_sync(
cls,
fraccion: Optional[str] = None,
nico: Optional[str] = None,
description: Optional[str] = None,
nivel: Optional[int] = None,
skip: int = 0,
limit: int = 100,
) -> List[FraccionesResponse]:
"""Search Mexican tariff fractions (sync wrapper for use in Celery/sync context)."""
service = cls.get_instance()
return asyncio.run(
service.search(
fraccion=fraccion,
nico=nico,
description=description,
nivel=nivel,
skip=skip,
limit=limit,
)
)