feature/filtros-cliente-proveedor

This commit is contained in:
2026-04-24 08:33:27 -06:00
parent db18b4463d
commit 9bdb401e78
3 changed files with 49 additions and 22 deletions

View File

@@ -7,6 +7,7 @@ from typing import List, Optional
from core.database import get_core_db
from core.security import get_current_user, validate_access_to_resource
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy import or_
from sqlalchemy.orm import Session, joinedload
from api.v1.common.tenant_crud_routes import TenantCRUDRoutes
from .models import ClientOrProviderEnum
@@ -32,10 +33,16 @@ router.include_router(imports_router, prefix="/imports", tags=["clients_and_prov
@router.get("/", response_model=ClientProviderPaginatedResponseDTO)
async def get_clients_and_providers(
company_id: int = Query(..., description="Company ID"),
name: Optional[str] = Query(None, description="Filter by name (contains)"),
rfc: Optional[str] = Query(None, description="Filter by RFC/TAX-ID (contains)"),
type: Optional[ClientOrProviderEnum] = Query(
None, description="Type of entity (client or provider)"
),
active: Optional[bool] = Query(None, description="Active status"),
page: Optional[int] = Query(None, ge=1, description="Page number (1-based)"),
page_size: Optional[int] = Query(
None, ge=1, le=1000, description="Page size when using page-based pagination"
),
skip: int = Query(0, ge=0),
limit: int = Query(100, ge=1, le=1000),
db: Session = Depends(get_core_db),
@@ -44,6 +51,9 @@ async def get_clients_and_providers(
"""Get clients and providers"""
tenant_id = validate_access_to_resource(db, company_id, current_user)
resolved_limit = page_size if page_size is not None else limit
resolved_skip = ((page - 1) * resolved_limit) if page is not None else skip
query = db.query(ClientProvider).options(
joinedload(ClientProvider.address),
joinedload(ClientProvider.programs)
@@ -52,9 +62,14 @@ async def get_clients_and_providers(
ClientProvider.company_id == company_id,
)
if name:
query = query.filter(ClientProvider.name.ilike(f"%{name.strip()}%"))
if rfc:
query = query.filter(ClientProvider.rfc.ilike(f"%{rfc.strip()}%"))
if type is not None:
# Include 'both' type when filtering by client or provider
from sqlalchemy import or_
query = query.filter(
or_(
ClientProvider.client_or_provider == type,
@@ -66,13 +81,13 @@ async def get_clients_and_providers(
query = query.filter(ClientProvider.is_active == active)
total = query.count()
clients = query.offset(skip).limit(limit).all()
clients = query.offset(resolved_skip).limit(resolved_limit).all()
return {
"items": [ClientProviderResponseDTO.model_validate(c) for c in clients],
"total": total,
"page": (skip // limit) + 1,
"page_size": limit,
"page": (resolved_skip // resolved_limit) + 1,
"page_size": resolved_limit,
}
@router.get("/{client_id}/basic", response_model=ClientProviderBasicDTO)