77 lines
3.0 KiB
TypeScript
77 lines
3.0 KiB
TypeScript
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<Record<string, number>> = {
|
|
'/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<number, string> = 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<Record<number, string>> = {
|
|
1250000001: 'InventoryTransferRequest',
|
|
67: 'WarehouseTransfers',
|
|
59: 'InventoryGeneralEntry',
|
|
20: 'PurchaseDeliveryNotes',
|
|
};
|
|
|
|
const OBJECT_OF_ENUM: ReadonlyMap<string, number> = 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<Record<string, string>> = {
|
|
bod_None: '--',
|
|
bod_InvoiceExempt: 'IX',
|
|
bod_DebitMemo: 'DN',
|
|
bod_Bill: 'IB',
|
|
bod_ExemptBill: 'EB',
|
|
bod_ExportInvoice: 'EI',
|
|
};
|