feature/filtros-cliente-proveedor
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user