feature/clases-paginacion
This commit is contained in:
@@ -240,4 +240,15 @@ class ClassWithFADataResponse(BaseModel):
|
||||
eccn_code: Optional[str] = None
|
||||
class_enabled: Optional[bool] = None
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
class ClassWithFADataPaginatedResponse(BaseModel):
|
||||
"""Lista paginada de clases con datos FA (fixed-asset-classes)"""
|
||||
|
||||
items: list[ClassWithFADataResponse]
|
||||
total: int
|
||||
page: int
|
||||
page_size: int
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
@@ -2,7 +2,7 @@
|
||||
Endpoints API para gestión de clases SCAII y SCAF
|
||||
"""
|
||||
|
||||
from typing import Dict, Any, List, Optional
|
||||
from typing import Any, Dict, Optional
|
||||
from fastapi import APIRouter, Depends, Query
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
@@ -10,7 +10,14 @@ from core.database import get_core_db
|
||||
from core.security import get_current_user
|
||||
from api.v1.common.tenant_crud_routes import TenantCRUDRoutes, validate_access_to_resource
|
||||
|
||||
from .dto import ClassCreateDTO, ClassCreateDTOFA, ClassResponseDTO, ClassResponseDTOFA, ClassUpdateDTO, ClassWithFADataResponse
|
||||
from .dto import (
|
||||
ClassCreateDTO,
|
||||
ClassCreateDTOFA,
|
||||
ClassResponseDTO,
|
||||
ClassResponseDTOFA,
|
||||
ClassUpdateDTO,
|
||||
ClassWithFADataPaginatedResponse,
|
||||
)
|
||||
from .service import ClassService
|
||||
from api.v1.modules.a76.layouts_csv.classes.routes import router as imports_router
|
||||
|
||||
@@ -24,17 +31,21 @@ router.include_router(imports_router, prefix="/imports", tags=["a76 / classes /
|
||||
# This ensures they have priority over the generic /{id} route
|
||||
@router.get(
|
||||
"/with-fa-data",
|
||||
response_model=List[ClassWithFADataResponse],
|
||||
response_model=ClassWithFADataPaginatedResponse,
|
||||
summary="Get Classes with FA Data",
|
||||
description="Get all classes with their FA data in a single query (eliminates N+1 problem)",
|
||||
description="Clases con datos FA en una sola consulta (JOIN); respuesta paginada",
|
||||
tags=["a76 / classes"],
|
||||
)
|
||||
async def get_classes_with_fa_data(
|
||||
company_id: int = Query(..., description="Company ID"),
|
||||
page: int = Query(1, ge=1, description="Page number"),
|
||||
page_size: int = Query(1000, ge=1, le=1000, description="Page size"),
|
||||
page_size: int = Query(50, ge=1, le=1000, description="Page size"),
|
||||
sort_by: Optional[str] = Query(None, description="Column to sort by"),
|
||||
sort_order: Optional[str] = Query("asc", description="Sort order (asc/desc)"),
|
||||
class_code: Optional[str] = Query(None, description="Filter by class code (contains)"),
|
||||
description: Optional[str] = Query(None, description="Filter by ES/EN description (contains)"),
|
||||
material_key: Optional[str] = Query(None, description="Filter by material key (contains)"),
|
||||
fraction: Optional[str] = Query(None, description="Filter by tariff fraction (contains)"),
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: Dict[str, Any] = Depends(get_current_user),
|
||||
):
|
||||
@@ -45,6 +56,18 @@ async def get_classes_with_fa_data(
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, ["goods_classes.view"])
|
||||
|
||||
skip = (page - 1) * page_size
|
||||
|
||||
filters: Optional[Dict[str, Any]] = None
|
||||
if any([class_code, description, material_key, fraction]):
|
||||
filters = {}
|
||||
if class_code:
|
||||
filters["class_code"] = class_code
|
||||
if description:
|
||||
filters["description"] = description
|
||||
if material_key:
|
||||
filters["material_key"] = material_key
|
||||
if fraction:
|
||||
filters["fraction"] = fraction
|
||||
|
||||
classes_with_fa, total = ClassService.get_all_with_fa_data(
|
||||
db=db,
|
||||
@@ -52,11 +75,17 @@ async def get_classes_with_fa_data(
|
||||
company_id=company_id,
|
||||
skip=skip,
|
||||
limit=page_size,
|
||||
filters=filters,
|
||||
sort_by=sort_by,
|
||||
sort_order=sort_order,
|
||||
)
|
||||
|
||||
return classes_with_fa
|
||||
return ClassWithFADataPaginatedResponse(
|
||||
items=classes_with_fa,
|
||||
total=total,
|
||||
page=page,
|
||||
page_size=page_size,
|
||||
)
|
||||
|
||||
@router.post(
|
||||
"/fa",
|
||||
|
||||
Reference in New Issue
Block a user