feature/permisos-reference-data
This commit is contained in:
@@ -10,6 +10,7 @@ from .dto import DocumentTypeDigitizationResponse
|
||||
from .service import DocumentTypeDigitizationService
|
||||
|
||||
router = APIRouter(prefix='/document-types-digitization', tags=['Document Types Digitization'])
|
||||
VIEW_PERMISSION = ['ref_invoice_types.view']
|
||||
|
||||
|
||||
@router.get('/', response_model=Dict[str, Any])
|
||||
@@ -24,7 +25,7 @@ async def list_document_types(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: dict = Depends(get_current_user),
|
||||
):
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, VIEW_PERMISSION)
|
||||
skip = (page - 1) * page_size
|
||||
filters: Dict[str, Any] = {}
|
||||
|
||||
@@ -59,7 +60,7 @@ async def get_document_type(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: dict = Depends(get_current_user),
|
||||
):
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, VIEW_PERMISSION)
|
||||
document_type = DocumentTypeDigitizationService.get_by_id(
|
||||
db,
|
||||
document_type_id,
|
||||
@@ -83,7 +84,7 @@ async def get_document_type_by_code(
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: dict = Depends(get_current_user),
|
||||
):
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user)
|
||||
tenant_id = validate_access_to_resource(db, company_id, current_user, VIEW_PERMISSION)
|
||||
document_type = DocumentTypeDigitizationService.get_by_code(
|
||||
db,
|
||||
code,
|
||||
|
||||
@@ -20,8 +20,8 @@ router = TenantCRUDRoutes(
|
||||
enable_filters=True,
|
||||
default_page_size=50,
|
||||
max_page_size=100,
|
||||
list_permissions=["cat_sectors.view"],
|
||||
get_permissions=["cat_sectors.view"],
|
||||
list_permissions=["ref_sectors.view"],
|
||||
get_permissions=["ref_sectors.view"],
|
||||
create_permissions=["cat_sectors.create"],
|
||||
update_permissions=["cat_sectors.edit"],
|
||||
delete_permissions=["cat_sectors.delete"],
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy.orm import Session
|
||||
|
||||
from .dto import AgencyTariffCodeDTO
|
||||
from .models import AgencyTariffCode
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/agency-tariff-codes")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_pedimento_codes.view"))],
|
||||
)
|
||||
async def list_agency_tariff_codes(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=1000, description="Tamaño de página"),
|
||||
@@ -61,7 +66,11 @@ async def list_agency_tariff_codes(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{id}", response_model=AgencyTariffCodeDTO)
|
||||
@router.get(
|
||||
"/{id}",
|
||||
response_model=AgencyTariffCodeDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_pedimento_codes.view"))],
|
||||
)
|
||||
async def get_agency_tariff_code(
|
||||
id: int,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -9,11 +9,16 @@ from sqlalchemy.orm import Session
|
||||
|
||||
from .dto import CartaPorteDTO
|
||||
from .models import CartaPorte
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/carta-porte")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_transport_types.view"))],
|
||||
)
|
||||
async def list_carta_porte(
|
||||
page: int = Query(1, ge=1),
|
||||
page_size: int = Query(50, ge=1, le=100),
|
||||
@@ -55,7 +60,11 @@ async def list_carta_porte(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{id}", response_model=CartaPorteDTO)
|
||||
@router.get(
|
||||
"/{id}",
|
||||
response_model=CartaPorteDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_transport_types.view"))],
|
||||
)
|
||||
async def get_carta_porte(
|
||||
id: int,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import CodePedimentoRegimenDTO
|
||||
from .models import CodePedimentoRegimen
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/code-pedimento-regimens")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_pedimento_regimens.view"))],
|
||||
)
|
||||
def list_code_pedimento_regimens(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=1000, description="Tamaño de página"),
|
||||
@@ -51,7 +56,11 @@ def list_code_pedimento_regimens(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{id}", response_model=CodePedimentoRegimenDTO)
|
||||
@router.get(
|
||||
"/{id}",
|
||||
response_model=CodePedimentoRegimenDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_pedimento_regimens.view"))],
|
||||
)
|
||||
def get_code_pedimento_regimen(
|
||||
id: int,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import ContainerDTO
|
||||
from .models import Container
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/containers")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_containers.view"))],
|
||||
)
|
||||
async def list_containers(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=100, description="Tamaño de página"),
|
||||
@@ -41,7 +46,11 @@ async def list_containers(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{key}", response_model=ContainerDTO)
|
||||
@router.get(
|
||||
"/{key}",
|
||||
response_model=ContainerDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_containers.view"))],
|
||||
)
|
||||
async def get_container(
|
||||
key: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -7,18 +7,23 @@ from sqlalchemy.orm import Session
|
||||
|
||||
from .dto import CountryDTO
|
||||
from .models import Country
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/countries")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_countries.view"))],
|
||||
)
|
||||
async def list_countries(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=100, description="Tamaño de página"),
|
||||
search: str = Query(None, description="Término de búsqueda"),
|
||||
db: Session = Depends(get_core_db),
|
||||
):
|
||||
"""Endpoint público para obtener lista de países - no requiere autenticación"""
|
||||
"""Lista de países protegida por permiso ref_countries.view"""
|
||||
skip = (page - 1) * page_size
|
||||
query = db.query(Country)
|
||||
|
||||
@@ -43,7 +48,11 @@ async def list_countries(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{m3_key}", response_model=CountryDTO)
|
||||
@router.get(
|
||||
"/{m3_key}",
|
||||
response_model=CountryDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_countries.view"))],
|
||||
)
|
||||
async def get_country(
|
||||
m3_key: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import CurrencyTypeDTO
|
||||
from .models import CurrencyType
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/currency-types")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_currency_types.view"))],
|
||||
)
|
||||
async def list_currency_types(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=100, description="Tamaño de página"),
|
||||
@@ -42,7 +47,11 @@ async def list_currency_types(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{code}", response_model=CurrencyTypeDTO)
|
||||
@router.get(
|
||||
"/{code}",
|
||||
response_model=CurrencyTypeDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_currency_types.view"))],
|
||||
)
|
||||
async def get_currency_type(
|
||||
code: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import CustomsSectionDTO
|
||||
from .models import CustomsSection
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/customs-sections")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_customs_sections.view"))],
|
||||
)
|
||||
def list_customs_sections(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=100, description="Tamaño de página"),
|
||||
@@ -41,7 +46,11 @@ def list_customs_sections(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{customs_code}", response_model=CustomsSectionDTO)
|
||||
@router.get(
|
||||
"/{customs_code}",
|
||||
response_model=CustomsSectionDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_customs_sections.view"))],
|
||||
)
|
||||
def get_customs_section(
|
||||
customs_code: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import CustomsWarehouseDTO
|
||||
from .models import CustomsWarehouse
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/customs-warehouses")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_customs_warehouses.view"))],
|
||||
)
|
||||
def list_customs_warehouses(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=100, description="Tamaño de página"),
|
||||
@@ -42,7 +47,11 @@ def list_customs_warehouses(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{key}/{customs}", response_model=CustomsWarehouseDTO)
|
||||
@router.get(
|
||||
"/{key}/{customs}",
|
||||
response_model=CustomsWarehouseDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_customs_warehouses.view"))],
|
||||
)
|
||||
def get_customs_warehouse(
|
||||
key: str,
|
||||
customs: str,
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy.orm import Session
|
||||
|
||||
from .dto import IdentifierDTO
|
||||
from .models import IdentifierCatalog
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/identifiers")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("cat_identifiers.view"))],
|
||||
)
|
||||
async def list_identifiers(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=1000, description="Tamaño de página"),
|
||||
@@ -59,7 +64,11 @@ async def list_identifiers(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{key}", response_model=IdentifierDTO)
|
||||
@router.get(
|
||||
"/{key}",
|
||||
response_model=IdentifierDTO,
|
||||
dependencies=[Depends(require_ref_view("cat_identifiers.view"))],
|
||||
)
|
||||
async def get_identifier(
|
||||
key: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import IncotermDTO
|
||||
from .models import Incoterm
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/incoterms")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_incoterms.view"))],
|
||||
)
|
||||
async def list_incoterms(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=100, description="Tamaño de página"),
|
||||
@@ -53,7 +58,11 @@ async def list_incoterms(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{key}", response_model=IncotermDTO)
|
||||
@router.get(
|
||||
"/{key}",
|
||||
response_model=IncotermDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_incoterms.view"))],
|
||||
)
|
||||
async def get_incoterm(
|
||||
key: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import InvoiceTypeDTO
|
||||
from .models import InvoiceType
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/invoice-types")
|
||||
|
||||
|
||||
@router.get("/", response_model=dict)
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=dict,
|
||||
dependencies=[Depends(require_ref_view("ref_invoice_types.view"))],
|
||||
)
|
||||
def list_invoice_types(
|
||||
page: int = Query(1, ge=1),
|
||||
page_size: int = Query(50, ge=1, le=100),
|
||||
@@ -55,7 +60,11 @@ def list_invoice_types(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{key}", response_model=InvoiceTypeDTO)
|
||||
@router.get(
|
||||
"/{key}",
|
||||
response_model=InvoiceTypeDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_invoice_types.view"))],
|
||||
)
|
||||
def get_invoice_type(
|
||||
key: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy.orm import Session
|
||||
|
||||
from .dto import LicenseExceptionDTO
|
||||
from .models import LicenseException
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/license-exceptions")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_pedimento_regimens.view"))],
|
||||
)
|
||||
async def list_license_exceptions(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=1000, description="Tamaño de página"),
|
||||
@@ -52,7 +57,11 @@ async def list_license_exceptions(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{key}", response_model=LicenseExceptionDTO)
|
||||
@router.get(
|
||||
"/{key}",
|
||||
response_model=LicenseExceptionDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_pedimento_regimens.view"))],
|
||||
)
|
||||
async def get_license_exception(
|
||||
key: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import MaterialTypeDTO
|
||||
from .models import MaterialType
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/material-types")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_material_types.view"))],
|
||||
)
|
||||
async def list_material_types(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=1000, description="Tamaño de página"),
|
||||
@@ -48,7 +53,11 @@ async def list_material_types(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{key}", response_model=MaterialTypeDTO)
|
||||
@router.get(
|
||||
"/{key}",
|
||||
response_model=MaterialTypeDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_material_types.view"))],
|
||||
)
|
||||
async def get_material_type(
|
||||
key: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import PaymentMethodDTO
|
||||
from .models import PaymentMethod
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/payment-methods")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_payment_methods.view"))],
|
||||
)
|
||||
def list_payment_methods(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=100, description="Tamaño de página"),
|
||||
@@ -41,7 +46,11 @@ def list_payment_methods(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{key}", response_model=PaymentMethodDTO)
|
||||
@router.get(
|
||||
"/{key}",
|
||||
response_model=PaymentMethodDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_payment_methods.view"))],
|
||||
)
|
||||
def get_payment_method(
|
||||
key: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import PedimentoCodeDTO
|
||||
from .models import PedimentoCode
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/pedimento-codes")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_pedimento_codes.view"))],
|
||||
)
|
||||
def list_pedimento_codes(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=1000, description="Tamaño de página"),
|
||||
@@ -41,7 +46,11 @@ def list_pedimento_codes(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{code}", response_model=PedimentoCodeDTO)
|
||||
@router.get(
|
||||
"/{code}",
|
||||
response_model=PedimentoCodeDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_pedimento_codes.view"))],
|
||||
)
|
||||
def get_pedimento_code(
|
||||
code: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import RegimenPedimentoDTO
|
||||
from .models import RegimenPedimento
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/pedimento-regimens")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_pedimento_regimens.view"))],
|
||||
)
|
||||
def list_pedimento_regimens(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=100, description="Tamaño de página"),
|
||||
@@ -41,7 +46,11 @@ def list_pedimento_regimens(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{key}", response_model=RegimenPedimentoDTO)
|
||||
@router.get(
|
||||
"/{key}",
|
||||
response_model=RegimenPedimentoDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_pedimento_regimens.view"))],
|
||||
)
|
||||
def get_pedimento_regimen(
|
||||
key: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import PedimentoTransportCatalogDTO
|
||||
from .models import PedimentoTransportCatalog
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/pedimento-transport-catalog")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_transport_types.view"))],
|
||||
)
|
||||
async def list_pedimento_transport_catalog(
|
||||
page: int = Query(1, ge=1, description="Numero de pagina"),
|
||||
page_size: int = Query(100, ge=1, le=200, description="Tamano de pagina"),
|
||||
@@ -42,7 +47,11 @@ async def list_pedimento_transport_catalog(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{code}", response_model=PedimentoTransportCatalogDTO)
|
||||
@router.get(
|
||||
"/{code}",
|
||||
response_model=PedimentoTransportCatalogDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_transport_types.view"))],
|
||||
)
|
||||
async def get_pedimento_transport_catalog(code: str, db: Session = Depends(get_core_db)):
|
||||
obj = (
|
||||
db.query(PedimentoTransportCatalog)
|
||||
|
||||
25
backend/api/v1/modules/public/reference_data/rbac.py
Normal file
25
backend/api/v1/modules/public/reference_data/rbac.py
Normal file
@@ -0,0 +1,25 @@
|
||||
from typing import Callable
|
||||
|
||||
from core.database import get_core_db
|
||||
from core.security import get_current_user, validate_access_to_resource
|
||||
from fastapi import Depends, Query
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
|
||||
def require_ref_view(permission_code: str) -> Callable:
|
||||
"""
|
||||
Dependency factory to enforce reference-data view permissions per company.
|
||||
|
||||
Endpoints using this dependency must receive `company_id` in query params.
|
||||
"""
|
||||
|
||||
async def _dep(
|
||||
company_id: int = Query(..., description="Company ID"),
|
||||
db: Session = Depends(get_core_db),
|
||||
current_user: dict = Depends(get_current_user),
|
||||
) -> bool:
|
||||
validate_access_to_resource(db, company_id, current_user, [permission_code])
|
||||
return True
|
||||
|
||||
return _dep
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import StateDTO
|
||||
from .models import State
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/states")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_states.view"))],
|
||||
)
|
||||
async def list_states(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=100, description="Tamaño de página"),
|
||||
@@ -41,7 +46,11 @@ async def list_states(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{m3_key}", response_model=StateDTO)
|
||||
@router.get(
|
||||
"/{m3_key}",
|
||||
response_model=StateDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_states.view"))],
|
||||
)
|
||||
async def get_state(
|
||||
m3_key: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -5,11 +5,16 @@ from fastapi import APIRouter, Depends, HTTPException, Query
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from . import dto, services
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("/trailer-types/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/trailer-types/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("trailers.view"))],
|
||||
)
|
||||
def list_trailer_types(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=100, description="Tamaño de página"),
|
||||
@@ -27,7 +32,9 @@ def list_trailer_types(
|
||||
|
||||
|
||||
@router.get(
|
||||
"/trailer-types/{trailer_type_key}", response_model=dto.TrailerTypeResponseDTO
|
||||
"/trailer-types/{trailer_type_key}",
|
||||
response_model=dto.TrailerTypeResponseDTO,
|
||||
dependencies=[Depends(require_ref_view("trailers.view"))],
|
||||
)
|
||||
def get_trailer_type(trailer_type_key: str, db: Session = Depends(get_core_db)):
|
||||
trailer_type = services.TrailerTypeService.get_trailer_type_by_key(
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import TransportModeDTO
|
||||
from .models import TransportMode
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/transport-modes")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_transport_modes.view"))],
|
||||
)
|
||||
async def list_transport_modes(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=100, description="Tamaño de página"),
|
||||
@@ -40,7 +45,11 @@ async def list_transport_modes(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{key}", response_model=TransportModeDTO)
|
||||
@router.get(
|
||||
"/{key}",
|
||||
response_model=TransportModeDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_transport_modes.view"))],
|
||||
)
|
||||
async def get_transport_mode(key: str, db: Session = Depends(get_core_db)):
|
||||
obj = db.query(TransportMode).filter(TransportMode.key == key).first()
|
||||
if not obj:
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import TransportTypeDTO
|
||||
from .models import TransportType
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/transport-types")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_transport_types.view"))],
|
||||
)
|
||||
def list_transport_types(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=100, description="Tamaño de página"),
|
||||
@@ -40,7 +45,11 @@ def list_transport_types(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{transport_code}", response_model=TransportTypeDTO)
|
||||
@router.get(
|
||||
"/{transport_code}",
|
||||
response_model=TransportTypeDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_transport_types.view"))],
|
||||
)
|
||||
def get_transport_type(transport_code: str, db: Session = Depends(get_core_db)):
|
||||
obj = (
|
||||
db.query(TransportType)
|
||||
|
||||
@@ -8,11 +8,16 @@ from sqlalchemy import or_
|
||||
|
||||
from .dto import ValuationMethodDTO
|
||||
from .models import ValuationMethod
|
||||
from ..rbac import require_ref_view
|
||||
|
||||
router = APIRouter(prefix="/valuation-methods")
|
||||
|
||||
|
||||
@router.get("/", response_model=Dict[str, Any])
|
||||
@router.get(
|
||||
"/",
|
||||
response_model=Dict[str, Any],
|
||||
dependencies=[Depends(require_ref_view("ref_valuation_methods.view"))],
|
||||
)
|
||||
async def list_valuation_methods(
|
||||
page: int = Query(1, ge=1, description="Número de página"),
|
||||
page_size: int = Query(50, ge=1, le=100, description="Tamaño de página"),
|
||||
@@ -41,7 +46,11 @@ async def list_valuation_methods(
|
||||
}
|
||||
|
||||
|
||||
@router.get("/{key}", response_model=ValuationMethodDTO)
|
||||
@router.get(
|
||||
"/{key}",
|
||||
response_model=ValuationMethodDTO,
|
||||
dependencies=[Depends(require_ref_view("ref_valuation_methods.view"))],
|
||||
)
|
||||
async def get_valuation_method(
|
||||
key: str,
|
||||
db: Session = Depends(get_core_db),
|
||||
|
||||
@@ -100,14 +100,17 @@ export function getSidebarData(): SidebarData {
|
||||
{
|
||||
title: m["sidebar.reference_data.codes_pedimento_regimen"](),
|
||||
url: "/dashboard/reference_data/code_pedimento_regimens",
|
||||
permission: "ref_pedimento_regimens.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.containers"](),
|
||||
url: "/dashboard/reference_data/containers",
|
||||
permission: "ref_containers.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.countries"](),
|
||||
url: "/dashboard/reference_data/countries",
|
||||
permission: "ref_countries.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.currency_types"](),
|
||||
@@ -117,58 +120,72 @@ export function getSidebarData(): SidebarData {
|
||||
{
|
||||
title: m["sidebar.reference_data.customs_sections"](),
|
||||
url: "/dashboard/reference_data/customs_sections",
|
||||
permission: "ref_customs_sections.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.customs_warehouses"](),
|
||||
url: "/dashboard/reference_data/customs_warehouses",
|
||||
permission: "ref_customs_warehouses.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.incoterms"](),
|
||||
url: "/dashboard/reference_data/incoterms",
|
||||
permission: "ref_incoterms.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.document_types_digitization"](),
|
||||
url: "/dashboard/reference_data/document_types_digitization",
|
||||
permission: "ref_invoice_types.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.invoice_types"](),
|
||||
url: "/dashboard/reference_data/invoice_types",
|
||||
permission: "ref_invoice_types.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.material_types"](),
|
||||
url: "/dashboard/reference_data/material_types",
|
||||
permission: "ref_material_types.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.payment_methods"](),
|
||||
url: "/dashboard/reference_data/payment_methods",
|
||||
permission: "ref_payment_methods.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.pedimento_codes"](),
|
||||
url: "/dashboard/reference_data/pedimento_codes",
|
||||
permission: "ref_pedimento_codes.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.pedimento_regimes"](),
|
||||
url: "/dashboard/reference_data/pedimento_regimens",
|
||||
permission: "ref_pedimento_regimens.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.sectors"](),
|
||||
url: "/dashboard/reference_data/sectors",
|
||||
permission: "ref_sectors.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.states"](),
|
||||
url: "/dashboard/reference_data/states",
|
||||
permission: "ref_states.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.transportation_modes"](),
|
||||
url: "/dashboard/reference_data/transport_modes",
|
||||
permission: "ref_transport_modes.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.transportation_types"](),
|
||||
url: "/dashboard/reference_data/transport_types",
|
||||
permission: "ref_transport_types.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.reference_data.valuation_methods"](),
|
||||
url: "/dashboard/reference_data/valuation_methods",
|
||||
permission: "ref_valuation_methods.view",
|
||||
},
|
||||
],
|
||||
isActive: false,
|
||||
@@ -206,6 +223,7 @@ export function getSidebarData(): SidebarData {
|
||||
{
|
||||
title: m["sidebar.general_catalogs.incoterms"](),
|
||||
url: "/dashboard/reference_data/incoterms",
|
||||
permission: "ref_incoterms.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.general_catalogs.inpc"](),
|
||||
@@ -222,10 +240,12 @@ export function getSidebarData(): SidebarData {
|
||||
{
|
||||
title: m["sidebar.general_catalogs.valuation_methods"](),
|
||||
url: "/dashboard/reference_data/valuation_methods",
|
||||
permission: "ref_valuation_methods.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.general_catalogs.countries"](),
|
||||
url: "/dashboard/reference_data/countries",
|
||||
permission: "ref_countries.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.general_catalogs.ports"](),
|
||||
@@ -269,6 +289,7 @@ export function getSidebarData(): SidebarData {
|
||||
{
|
||||
title: m["sidebar.general_catalogs.currency_types"](),
|
||||
url: "/dashboard/reference_data/currency_types",
|
||||
permission: "ref_currency_types.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.general_catalogs.multi_currency"](),
|
||||
@@ -278,6 +299,7 @@ export function getSidebarData(): SidebarData {
|
||||
{
|
||||
title: m["sidebar.general_catalogs.invoice_types"](),
|
||||
url: "/dashboard/reference_data/invoice_types",
|
||||
permission: "ref_invoice_types.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.general_catalogs.electronic_signatures"](),
|
||||
@@ -290,6 +312,7 @@ export function getSidebarData(): SidebarData {
|
||||
{
|
||||
title: m["sidebar.general_catalogs.customs_warehouses"](),
|
||||
url: "/dashboard/reference_data/customs_warehouses",
|
||||
permission: "ref_customs_warehouses.view",
|
||||
},
|
||||
{
|
||||
title: m["sidebar.general_catalogs.prevalidators"](),
|
||||
@@ -413,7 +436,7 @@ export function getSidebarData(): SidebarData {
|
||||
{
|
||||
title: m["sidebar.pedimentos.payment_methods"](),
|
||||
url: "/dashboard/reference_data/payment_methods",
|
||||
permission: 'pedimentos_payments.view',
|
||||
permission: 'ref_payment_methods.view',
|
||||
},
|
||||
{
|
||||
title: m["sidebar.pedimentos.customs_sections"](),
|
||||
|
||||
@@ -41,8 +41,8 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_pedimento_regimens.view'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_pedimento_regimens.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_pedimento_regimens.delete'));
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
{#if isError}
|
||||
<ErrorState
|
||||
status={!canView ? 403 : status}
|
||||
error={!canView ? 'Permission denied: ref_code_pedimento_regimens.view' : error || ''}
|
||||
error={!canView ? 'Permission denied: ref_pedimento_regimens.view' : error || ''}
|
||||
onRetry={reloadData}
|
||||
/>
|
||||
{:else}
|
||||
|
||||
@@ -29,9 +29,9 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_containers.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_containers.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_containers.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_containers.delete'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -64,10 +64,10 @@
|
||||
let status = $state<number>(data.status || 200);
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_countries.view') || userHasPermission($currentUser, 'cat_countries.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_countries.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_countries.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_countries.delete'));
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_countries.view'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -62,10 +62,10 @@
|
||||
let status = $state<number>(data.status || 200);
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_currency_types.view') || userHasPermission($currentUser, 'cat_currency.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_currency_types.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_currency_types.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_currency_types.delete'));
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_currency_types.view'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -33,9 +33,9 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_customs_sections.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_customs_sections.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_customs_sections.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_customs_sections.delete'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(status >= 400 || error);
|
||||
|
||||
|
||||
@@ -37,10 +37,10 @@
|
||||
let status = $state<number>(data.status || 200);
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_customs_warehouses.view') || userHasPermission($currentUser, 'cat_warehouses.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_customs_warehouses.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_customs_warehouses.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_customs_warehouses.delete'));
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_customs_warehouses.view'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -11,7 +11,8 @@ export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => {
|
||||
items: [],
|
||||
total: 0,
|
||||
page: 1,
|
||||
page_size: 50
|
||||
page_size: 50,
|
||||
status: 401
|
||||
};
|
||||
}
|
||||
|
||||
@@ -28,7 +29,8 @@ export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => {
|
||||
items: [],
|
||||
total: 0,
|
||||
page,
|
||||
page_size: pageSize
|
||||
page_size: pageSize,
|
||||
status: 400
|
||||
};
|
||||
}
|
||||
|
||||
@@ -50,19 +52,25 @@ export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => {
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
const errorText = await response.text();
|
||||
console.error('📊 [Document Types Digitization] API Error:', {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
error: errorText
|
||||
});
|
||||
|
||||
const message =
|
||||
response.status === 403
|
||||
? 'No tiene permiso para ver tipos de documento para digitalización'
|
||||
: `Error ${response.status}: ${response.statusText}`;
|
||||
if (response.status !== 403) {
|
||||
const errorText = await response.text();
|
||||
console.error('📊 [Document Types Digitization] API Error:', {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
error: errorText
|
||||
});
|
||||
}
|
||||
return {
|
||||
error: `Error ${response.status}: ${response.statusText}`,
|
||||
error: message,
|
||||
items: [],
|
||||
total: 0,
|
||||
page,
|
||||
page_size: pageSize
|
||||
page_size: pageSize,
|
||||
status: response.status
|
||||
};
|
||||
}
|
||||
|
||||
@@ -73,7 +81,8 @@ export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => {
|
||||
total: data.total || 0,
|
||||
page: data.page || page,
|
||||
page_size: data.page_size || pageSize,
|
||||
error: null
|
||||
error: null,
|
||||
status: 200
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('📊 [Document Types Digitization] Load error:', error);
|
||||
@@ -82,7 +91,8 @@ export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => {
|
||||
items: [],
|
||||
total: 0,
|
||||
page: 1,
|
||||
page_size: 50
|
||||
page_size: 50,
|
||||
status: 500
|
||||
};
|
||||
}
|
||||
};
|
||||
@@ -16,6 +16,8 @@
|
||||
import { createColumns } from '$lib/components/dashboard/reference_data/document_types_digitization/columns';
|
||||
import { useShortcuts } from '$lib/hooks/use-shortcuts';
|
||||
import type { PageData } from './$types';
|
||||
import { currentUser, userHasPermission } from '$lib/auth';
|
||||
import ErrorState from '$lib/components/dashboard/common/error-state.svelte';
|
||||
|
||||
let { data }: { data: PageData } = $props();
|
||||
|
||||
@@ -39,9 +41,12 @@
|
||||
let totalItems = $state(data.total || 0);
|
||||
let loading = $state(false);
|
||||
let error = $state<string | null>(data.error || null);
|
||||
let status = $state<number>(data.status || 200);
|
||||
let searchQuery = $state($page.url.searchParams.get('search') || '');
|
||||
let timeout: ReturnType<typeof setTimeout>;
|
||||
let hasMore = $derived(allItems.length < totalItems);
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_invoice_types.view'));
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
function getActiveCompanyId(): number | null {
|
||||
const fromStore = companyStore.activeCompany?.id;
|
||||
@@ -137,42 +142,54 @@
|
||||
const columns = createColumns();
|
||||
</script>
|
||||
|
||||
<div class="flex h-[calc(100svh-4rem)] flex-col gap-6 overflow-hidden p-6 group-has-data-[collapsible=icon]/sidebar-wrapper:h-[calc(100svh-3rem)]">
|
||||
<div class="flex-none flex items-center justify-between">
|
||||
<div class="space-y-1">
|
||||
<h1 class="text-2xl font-bold tracking-tight">Tipos de documento para digitalización</h1>
|
||||
<p class="text-muted-foreground">
|
||||
Consulta el catálogo fijo de solo lectura utilizado por digitalización y pedimentos.
|
||||
</p>
|
||||
</div>
|
||||
{#if isError}
|
||||
<div
|
||||
class="flex h-[calc(100svh-4rem)] flex-col p-6 group-has-data-[collapsible=icon]/sidebar-wrapper:h-[calc(100svh-3rem)]"
|
||||
>
|
||||
<ErrorState
|
||||
status={!canView ? 403 : status}
|
||||
error={!canView ? 'Permission denied: ref_invoice_types.view' : error || ''}
|
||||
onRetry={reloadData}
|
||||
/>
|
||||
</div>
|
||||
|
||||
{#if error}
|
||||
<div class="flex-none rounded-md border border-destructive px-4 py-3 text-sm text-destructive">
|
||||
{error}
|
||||
{:else}
|
||||
<div class="flex h-[calc(100svh-4rem)] flex-col gap-6 overflow-hidden p-6 group-has-data-[collapsible=icon]/sidebar-wrapper:h-[calc(100svh-3rem)]">
|
||||
<div class="flex-none flex items-center justify-between">
|
||||
<div class="space-y-1">
|
||||
<h1 class="text-2xl font-bold tracking-tight">Tipos de documento para digitalización</h1>
|
||||
<p class="text-muted-foreground">
|
||||
Consulta el catálogo fijo de solo lectura utilizado por digitalización y pedimentos.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<Card.Root class="border bg-background flex min-h-0 flex-1 flex-col">
|
||||
<Card.Header>
|
||||
<div class="flex flex-wrap items-center justify-between gap-3">
|
||||
<Card.Title>Listado de tipos de documento</Card.Title>
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<Input
|
||||
placeholder="Buscar por código o descripción"
|
||||
bind:value={searchQuery}
|
||||
oninput={handleSearch}
|
||||
class="h-9 w-56 bg-card lg:w-72"
|
||||
/>
|
||||
{#if error}
|
||||
<div class="flex-none rounded-md border border-destructive px-4 py-3 text-sm text-destructive">
|
||||
{error}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<Card.Root class="border bg-background flex min-h-0 flex-1 flex-col">
|
||||
<Card.Header>
|
||||
<div class="flex flex-wrap items-center justify-between gap-3">
|
||||
<Card.Title>Listado de tipos de documento</Card.Title>
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<Input
|
||||
placeholder="Buscar por código o descripción"
|
||||
bind:value={searchQuery}
|
||||
oninput={handleSearch}
|
||||
class="h-9 w-56 bg-card lg:w-72"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Card.Header>
|
||||
<Card.Content class="min-h-0 p-0">
|
||||
<div class="rounded-md border bg-background overflow-hidden flex min-h-0 flex-1 flex-col">
|
||||
<DataTable data={allItems} {columns} {loading} {hasMore} {loadMore} />
|
||||
</div>
|
||||
</Card.Content>
|
||||
</Card.Root>
|
||||
</Card.Header>
|
||||
<Card.Content class="min-h-0 p-0">
|
||||
<div class="rounded-md border bg-background overflow-hidden flex min-h-0 flex-1 flex-col">
|
||||
<DataTable data={allItems} {columns} {loading} {hasMore} {loadMore} />
|
||||
</div>
|
||||
</Card.Content>
|
||||
</Card.Root>
|
||||
|
||||
<div class="flex-none text-sm text-muted-foreground">Mostrando {allItems.length} de {totalItems} registros</div>
|
||||
</div>
|
||||
<div class="flex-none text-sm text-muted-foreground">Mostrando {allItems.length} de {totalItems} registros</div>
|
||||
</div>
|
||||
{/if}
|
||||
@@ -37,10 +37,10 @@
|
||||
let status = $state<number>(data.status || 200);
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_incoterms.view') || userHasPermission($currentUser, 'cat_incoterms.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_incoterms.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_incoterms.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_incoterms.delete'));
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_incoterms.view'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
@@ -119,8 +119,18 @@
|
||||
const columns = $derived(createColumns(handleSuccess, { canEdit, canDelete }));
|
||||
</script>
|
||||
|
||||
<div class="flex flex-col gap-6 p-6 h-[calc(100svh-4rem)] group-has-data-[collapsible=icon]/sidebar-wrapper:h-[calc(100svh-3rem)] overflow-hidden">
|
||||
|
||||
{#if isError}
|
||||
<div
|
||||
class="flex h-[calc(100svh-4rem)] flex-col p-6 group-has-data-[collapsible=icon]/sidebar-wrapper:h-[calc(100svh-3rem)]"
|
||||
>
|
||||
<ErrorState
|
||||
status={!canView ? 403 : status}
|
||||
error={!canView ? 'Permission denied: ref_incoterms.view' : error || ''}
|
||||
onRetry={reloadData}
|
||||
/>
|
||||
</div>
|
||||
{:else}
|
||||
<div class="flex flex-col gap-6 p-6 h-[calc(100svh-4rem)] group-has-data-[collapsible=icon]/sidebar-wrapper:h-[calc(100svh-3rem)] overflow-hidden">
|
||||
{#if error}
|
||||
<div class="flex-none rounded-md border border-destructive px-4 py-3 text-sm text-destructive">
|
||||
{error}
|
||||
@@ -145,4 +155,5 @@
|
||||
</Card.Root>
|
||||
|
||||
<div class="flex-none text-sm text-muted-foreground">Mostrando {allItems.length} de {totalItems} registros</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -37,10 +37,10 @@
|
||||
let status = $state<number>(data.status || 200);
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_invoice_types.view') || userHasPermission($currentUser, 'cat_inv_types.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_invoice_types.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_invoice_types.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_invoice_types.delete'));
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_invoice_types.view'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_material_types.view'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_material_types.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_material_types.delete'));
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -29,9 +29,9 @@
|
||||
let status = $state<number>(data.status || 200);
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'pedimentos_payments.view'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'pedimentos_payments.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'pedimentos_payments.delete'));
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_payment_methods.view'));
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(status >= 400 || error);
|
||||
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_pedimento_codes.view'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_pedimento_codes.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_pedimento_codes.delete'));
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(status >= 400 || error);
|
||||
|
||||
|
||||
@@ -42,9 +42,9 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_pedimento_regimens.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_pedimento_regimens.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_pedimento_regimens.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_pedimento_regimens.delete'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(status >= 400 || error);
|
||||
|
||||
|
||||
@@ -38,9 +38,9 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_sectors.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_sectors.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_sectors.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_sectors.delete'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
|
||||
// 🛡️ Permisos (Runas derivadas)
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_states.view'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_states.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_states.delete'));
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -33,9 +33,9 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_transport_modes.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_transport_modes.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_transport_modes.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_transport_modes.delete'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_transport_types.view'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_transport_types.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_transport_types.delete'));
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
@@ -38,10 +38,10 @@
|
||||
let status = $state<number>(data.status || 200);
|
||||
|
||||
// Permisos
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_valuation_methods.view') || userHasPermission($currentUser, 'cat_valuation.view'));
|
||||
const canCreate = $derived(userHasPermission($currentUser, 'ref_valuation_methods.create'));
|
||||
const canEdit = $derived(userHasPermission($currentUser, 'ref_valuation_methods.edit'));
|
||||
const canDelete = $derived(userHasPermission($currentUser, 'ref_valuation_methods.delete'));
|
||||
const canView = $derived(userHasPermission($currentUser, 'ref_valuation_methods.view'));
|
||||
const canCreate = $derived(false);
|
||||
const canEdit = $derived(false);
|
||||
const canDelete = $derived(false);
|
||||
|
||||
const isError = $derived(!canView || status >= 400 || error);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user