import { MENU } from '@basic-erp/sap-types'; /** * Tipo de objeto de SAP de cada documento: es el `BaseType` de las líneas copiadas y el documento * del que se piden las series de numeración. Facturas, boletas y sus reservas son el objeto 13. */ export const OBJECT_TYPES: Readonly> = { '/ventas/ofertas': 23, '/ventas/ordenes': 17, '/ventas/entrega': 15, '/ventas/devoluciones': 16, '/ventas/facturas': 13, '/ventas/boletas': 13, '/ventas/facturas-reserva': 13, '/ventas/boletas-reserva': 13, '/ventas/notas-credito': 14, '/compras/solicitudes': 1470000113, '/compras/ofertas': 540000006, '/compras/ordenes': 22, '/compras/recepcion': 20, '/compras/devoluciones': 21, '/compras/facturas': 18, '/compras/notas-credito': 19, '/inventario/entradas': 59, '/inventario/salidas': 60, '/inventario/transferencias': 67, '/inventario/solicitudes-traslado': 1250000001, }; /** Primera pantalla de cada tipo de objeto (las facturas, boletas y reservas comparten el 13). */ const PATH_OF_OBJECT: ReadonlyMap = new Map( Object.entries(OBJECT_TYPES) .reverse() .map(([path, type]) => [type, path]), ); /** * En las líneas de una transferencia de stock, `BaseType` no es el número del objeto sino un enumerado de * texto de SAP (`InvBaseDocTypeEnum`; sin origen vale `Default`). Objeto → nombre del enumerado. */ export const STOCK_BASE_TYPES: Readonly> = { 1250000001: 'InventoryTransferRequest', 67: 'WarehouseTransfers', 59: 'InventoryGeneralEntry', 20: 'PurchaseDeliveryNotes', }; const OBJECT_OF_ENUM: ReadonlyMap = new Map(Object.entries(STOCK_BASE_TYPES).map(([obj, name]) => [name, Number(obj)])); /** La línea referencia a un documento origen: `BaseType` útil (número > 0 o nombre del enumerado) y `BaseEntry`. */ export function hasBaseRef(baseType: unknown, baseEntry: unknown): boolean { if (baseEntry === null || baseEntry === undefined || baseEntry === '') return false; if (typeof baseType === 'string') return OBJECT_OF_ENUM.has(baseType) || Number(baseType) > 0; return Number(baseType) > 0; } /** Nombre del documento de un tipo de objeto (`17` → «Órdenes de venta»), o el número si no se conoce. */ export function objectLabel(type: unknown): string { const code = typeof type === 'string' && OBJECT_OF_ENUM.has(type) ? OBJECT_OF_ENUM.get(type)! : Number(type); const path = PATH_OF_OBJECT.get(code); return (path && MENU.flatMap((m) => m.items).find((i) => i.path === path)?.label) || (code > 0 ? String(code) : ''); } /** * Código de subtipo con que SAP etiqueta las series de numeración, según el `DocumentSubType` del * documento. Solo `bod_None` (`--`) está verificado contra SBODemoCL; los demás son los del enum de SAP * y se confirman al tener series de ese subtipo. */ export const SERIES_SUBTYPE: Readonly> = { bod_None: '--', bod_InvoiceExempt: 'IX', bod_DebitMemo: 'DN', bod_Bill: 'IB', bod_ExemptBill: 'EB', bod_ExportInvoice: 'EI', };