Files
basic-erp/apps/api/src/sl/sl-resources.ts
T

86 lines
3.5 KiB
TypeScript

export type SlMethod = 'GET' | 'POST' | 'PATCH';
/** Ruta(s) de menú que el usuario debe tener permitidas (basta con una). */
export type RequiredPath = string | string[];
export interface SlResource {
/** Nombre de la entidad en el Service Layer (sensible a mayúsculas). */
name: string;
/** Tipo de la clave primaria: se valida y se escapa al armar `Entidad(clave)`. */
key: 'number' | 'string';
methods: SlMethod[];
/** Ruta de menú requerida para leer; `null` = cualquier sesión (catálogos de consulta). */
read: RequiredPath | null;
/** Ruta de menú requerida para crear/modificar. */
write: RequiredPath;
/** Colecciones permitidas en `$expand` (por defecto ninguna). */
expand?: string[];
}
const document = (name: string, path: RequiredPath): SlResource => ({
name,
key: 'number',
methods: ['GET', 'POST', 'PATCH'],
read: path,
write: path,
});
const catalog = (name: string, key: 'number' | 'string', writePath?: RequiredPath): SlResource => ({
name,
key,
methods: writePath ? ['GET', 'POST', 'PATCH'] : ['GET'],
read: null,
write: writePath ?? [],
});
/**
* Único lugar donde se declara qué puede tocar el frontend. Lo que no esté aquí
* no se puede consultar (404). Nunca registrar `EmployeesInfo`: contiene U_WEB_PASS.
*
* Las rutas de menú son las mismas que usará el frontend (permisos por pantalla).
*/
export const SL_RESOURCES: readonly SlResource[] = [
// Ventas
document('Quotations', '/ventas/ofertas'),
document('Orders', '/ventas/ordenes'),
document('DeliveryNotes', '/ventas/entrega'),
// Boletas (`DocumentSubType = bod_Bill`) y facturas de reserva (`ReserveInvoice = tYES`) son facturas: mismo recurso, cuatro pantallas.
document('Invoices', ['/ventas/facturas', '/ventas/boletas', '/ventas/facturas-reserva', '/ventas/boletas-reserva']),
document('Returns', '/ventas/devoluciones'),
document('CreditNotes', '/ventas/notas-credito'),
// Compras
document('PurchaseRequests', '/compras/solicitudes'),
document('PurchaseQuotations', '/compras/ofertas'),
document('PurchaseOrders', '/compras/ordenes'),
document('PurchaseDeliveryNotes', '/compras/recepcion'),
document('PurchaseInvoices', '/compras/facturas'),
document('PurchaseReturns', '/compras/devoluciones'),
document('PurchaseCreditNotes', '/compras/notas-credito'),
// Inventario
document('StockTransfers', '/inventario/transferencias'),
document('InventoryTransferRequests', '/inventario/solicitudes-traslado'),
document('InventoryGenEntries', '/inventario/entradas'),
document('InventoryGenExits', '/inventario/salidas'),
// Maestros (consulta para cualquier sesión; escritura según el módulo)
catalog('BusinessPartners', 'string', ['/socios/clientes', '/socios/proveedores']),
catalog('Items', 'string', '/inventario/articulos'),
catalog('Warehouses', 'string'),
catalog('Currencies', 'string'),
catalog('SalesTaxCodes', 'string'),
catalog('VatGroups', 'string'),
catalog('PaymentTermsTypes', 'number'),
catalog('SalesPersons', 'number'),
catalog('PriceLists', 'number'),
catalog('UnitOfMeasurements', 'number'),
// Grupos de los maestros (para elegirlos y filtrar las listas de clientes, proveedores y artículos).
catalog('BusinessPartnerGroups', 'number'),
catalog('ItemGroups', 'number'),
// Gastos adicionales de un documento (el flete): se leen para elegir el código de gasto.
catalog('AdditionalExpenses', 'number'),
];
export const SL_RESOURCE_MAP: ReadonlyMap<string, SlResource> = new Map(SL_RESOURCES.map((r) => [r.name, r]));