Files
plantillas-proyectos/backend/api/v1/modules/a76/invoices/permission_map.py
2026-05-04 14:06:44 -06:00

92 lines
2.7 KiB
Python

"""
Única fuente de verdad para permisos de facturas por (operation_type, invoice_type).
Debe mantenerse alineado con el seed en api/v1/modules/core/permissions/seed.py
y con frontend/src/lib/permissions/invoice-permissions.ts.
"""
from __future__ import annotations
from typing import Any, Iterable, Optional
# Tipos de exportación que cubre únicamente invoice.exp.view (histórico list_invoices).
EXP_TYPES_FROM_GENERAL_EXPORT_VIEW: tuple[str, ...] = (
"EXDEF",
"MATDE",
"NODES",
"PTERM",
"SCRAP",
"VEMEX",
"VIRTU",
"AFIJO",
"REEXP",
)
def get_invoice_permission_base(operation_type: Any, invoice_type: Any) -> str:
"""Devuelve la clave base del permiso (sin .view/.create/...) según tipo de factura."""
op = str(operation_type).lower().split(".")[-1] if operation_type else ""
inv = str(invoice_type).upper() if invoice_type else ""
if op == "imp":
if inv == "TEM":
return "invoice.imp.tem"
if inv == "DEF":
return "invoice.imp.def"
if inv == "MEX":
return "invoice.imp.cm"
if inv == "CR":
return "invoice.imp.cr"
if inv == "REP":
return "invoice.imp.rep"
return "invoice.imp.tem"
if op == "exp":
if inv == "REPAR":
return "invoice.exp.rep"
if inv == "DONAC":
return "invoice.exp.donac"
return "invoice.exp"
return "invoice.imp.tem"
def build_allowed_types_from_view_permissions(
perm_codes: Iterable[str],
) -> list[tuple[str, str]]:
"""
Construye la lista de tuplas (operation_type en minúsculas, invoice_type en MAYÚSCULAS)
permitidas por los permisos *.view del usuario. Misma lógica que el antiguo list_invoices
(sin permiso global invoice.view_all — eliminado de producto).
"""
codes = set(perm_codes)
allowed: list[tuple[str, str]] = []
seen: set[tuple[str, str]] = set()
def add_pair(op: str, inv: str) -> None:
pair = (op.lower(), inv.upper())
if pair not in seen:
seen.add(pair)
allowed.append(pair)
if "invoice.imp.tem.view" in codes:
add_pair("imp", "TEM")
if "invoice.imp.def.view" in codes:
add_pair("imp", "DEF")
if "invoice.imp.cm.view" in codes:
add_pair("imp", "MEX")
if "invoice.imp.cr.view" in codes:
add_pair("imp", "CR")
if "invoice.imp.rep.view" in codes:
add_pair("imp", "REP")
if "invoice.exp.rep.view" in codes:
add_pair("exp", "REPAR")
if "invoice.exp.donac.view" in codes:
add_pair("exp", "DONAC")
if "invoice.exp.view" in codes:
for t in EXP_TYPES_FROM_GENERAL_EXPORT_VIEW:
add_pair("exp", t)
return allowed