metis-desk/modules/assets/src/api/domain/asset-catalog-seed.ts

369 lines
13 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { UniqueID } from "@repo/rdx-ddd";
import type { AssetTemplateIconKey } from "../../common/asset-template-icons";
import type { AssetCatalog } from "./asset-catalog.aggregate";
import type { AssetDefinitionSpec, AssetFieldType } from "./asset-definition";
import { AssetDefinitionValues } from "./value-objects/asset-definition-values.vo";
// Catálogo revisado por el usuario en el Excel del 10/10/2026. Todos los campos son opcionales.
const FIELDS: readonly [string, string, AssetFieldType, string][] = [
[
"brand",
"Marca",
"text",
"Lenovo\nHP\nDell\nKyocera\nMikroTik\nFortinet\nAruba\nUbiquiti\nSynology\nSamsung\nAPC",
],
[
"model",
"Modelo",
"text",
"ThinkPad T14 Gen 5\nProDesk (variante por confirmar)\nUltraSharp (variante por confirmar)\nECOSYS (variante por confirmar)\nRouterBOARD (variante por confirmar)\nFortiGate (variante por confirmar)\nInstant On (variante por confirmar)\nUniFi (variante por confirmar)\nDiskStation (variante por confirmar)\nPowerEdge (variante por confirmar)\nGalaxy (variante por confirmar)\nSmart-UPS (variante por confirmar)",
],
["serial", "Número de serie", "text", "PF12AB34"],
["product_code", "Código de producto / Service Tag", "text", "21ML000TSP"],
["processor", "Procesador", "text", "Intel Core Ultra 7 155U"],
["graphics", "Tarjeta gráfica", "text", "Intel Arc integrada\nNVIDIA RTX 4060 8 GB"],
["webcam", "Webcam integrada", "text", "1080p, obturador físico, IR"],
["memory", "Memoria RAM", "text", "32 GB DDR5-5600"],
[
"storage",
"Almacenamiento",
"text",
"1 TB M.2 2280 PCIe 4.0 NVMe SSD\n1 TB M.2 2280 PCIe 4.0 NVMe SSD, 4 bahías SATA de 3,5 / 2,5 pulgadas",
],
["integrated_screen", "Pantalla integrada", "text", "14 pulgadas 1920x1200 IPS táctil"],
["microphone", "Micrófono integrado", "boolean", "Si/No"],
["keyboard_language", "Idioma del teclado", "text", "Español ISO"],
["numeric_keypad", "Teclado numérico", "text", "Sin teclado numérico"],
["keyboard_backlight", "Teclado retroiluminado", "boolean", "Si/No"],
[
"connectivity",
"Conectividad",
"text",
"Intel AX211, Wi-Fi 6E, Bluetooth 5.3, Ethernet 1Gbps\nEthernet, Wifi",
],
["battery_reference", "Referencia / modelo de batería", "text", "L22D4P71"],
["battery_capacity", "Capacidad de la batería", "text", "52,5 Wh, 4 celdas"],
["charger_power", "Potencia del cargador", "text", "65 W"],
["charger_connector", "Tipo de conector del cargador", "text", "USB-C PD"],
["charger_reference", "Referencia / modelo del cargador", "text", "ADLX65YLC3A"],
[
"factory_os",
"Sistema operativo precargado",
"text",
"Windows 11 Pro 64-bit\nWindows 11 Pro 64-bit precargado",
],
["purchased_on", "Fecha de compra", "date", "2026-03-12"],
["warranty_until", "Fin de garantía", "date", "2029-03-12"],
["supplier", "Proveedor", "text", "Amazon, PCComponentes, etc."],
[
"support_page",
"Enlace a la página de soporte",
"text",
"https://fabricante.example/manual-servicio",
],
["mpn", "Código de producto / MPN", "text", "21ML000TSP"],
["motherboard", "Placa base / chipset", "text", "Intel B760; referencia OEM"],
["factory_memory", "Memoria RAM de fábrica", "text", "32 GB DDR5-5600"],
["factory_storage", "Almacenamiento de fábrica", "text", "1 TB M.2 2280 PCIe 4.0 NVMe SSD"],
[
"connections",
"Conexiones",
"text",
"2 × HDMI 2.0; DisplayPort 1.4; USB-C PD 65 W\nEthernet, USB",
],
[
"power_supply",
"Fuente de alimentación",
"text",
"500 W, 80 Plus Bronze\nInterna; 100–240 V AC\nExterna 100 W",
],
["screen_size", "Tamaño de pantalla", "text", "14 pulgadas"],
["resolution", "Resolución", "text", "1920 × 1200"],
["panel_technology", "Tecnología del panel", "text", "IPS mate, 350 nits"],
["mounting_adjustment", "Anclaje y ajuste", "text", "VESA 100 × 100; altura y giro"],
["printing", "Tecnología de impresión", "text", "Láser"],
["color", "Impresión en color", "boolean", "SI/No"],
["duplex", "Doble cara", "text", "Dúplex automático"],
["paper_trays", "Formatos de papel y bandejas", "text", "A4; bandeja 250 hojas"],
["consumables", "Referencias de consumibles", "text", "Tóner TK-xxxx; tambor DK-xxxx"],
[
"maintenance_parts",
"Kit de mantenimiento / otras piezas",
"text",
"Referencia del fusor y kit de mantenimiento",
],
["physical_ports", "Puertos físicos", "multiline", "24 × RJ45 1 GbE; 4 × SFP+ 10 GbE"],
["wifi", "Versión Wi-Fi", "text", "Intel AX211, Wi-Fi 6E"],
["power_adapter", "Alimentación y adaptador", "text", "12 V DC, 2 A"],
["poe", "PoE", "text", "PoE+ 802.3at, presupuesto 370 W"],
[
"supported_storage",
"Almacenamiento admitido",
"multiline",
"4 bahías SATA de 3,5 / 2,5 pulgadas",
],
["equipped_storage", "Almacenamiento equipado", "multiline", "4 discos 3,5 de 20 TB WD"],
[
"service_manual",
"Enlace al manual de servicio",
"text",
"https://fabricante.example/manual-servicio",
],
[
"cpu_configuration",
"Formato y configuración de CPU",
"text",
"Rack 2U; 2 sockets; 1 CPU de fábrica",
],
["redundant_power", "Fuentes y redundancia", "text", "2 × 750 W, redundantes"],
[
"factory_preloaded_os",
"Sistema operativo de fábrica / precargado",
"text",
"Sin SO precargado",
],
["imei", "IMEI", "text", "356123456789012"],
["ups_battery", "Referencia de batería", "text", "RBC7; 2 × 12 V / 18 Ah"],
["power_connections", "Conexiones eléctricas", "text", "Line interactive; 6 salidas IEC C13"],
["form_factor", "Formato y montaje", "text", "Torre / rack 2U"],
];
const TEMPLATES: readonly [
string,
string,
AssetTemplateIconKey,
readonly (readonly [string, readonly string[]])[],
][] = [
[
"laptop",
"Portátil",
"laptop",
[
["Identificación", ["brand", "model", "serial", "product_code"]],
[
"Hardware",
[
"processor",
"graphics",
"webcam",
"memory",
"storage",
"integrated_screen",
"microphone",
"keyboard_language",
"numeric_keypad",
"keyboard_backlight",
],
],
["Conectividad", ["connectivity"]],
["Batería", ["battery_reference", "battery_capacity"]],
["Alimentación", ["charger_power", "charger_connector", "charger_reference"]],
["Software", ["factory_os"]],
["Compra y garantía", ["purchased_on", "warranty_until", "supplier"]],
["Soporte y reparación", ["support_page"]],
],
],
[
"desktop",
"PC de sobremesa",
"desktop",
[
["Identificación", ["brand", "model", "serial", "mpn"]],
["Hardware", ["processor", "graphics", "motherboard", "factory_memory", "factory_storage"]],
["Conectividad", ["connectivity", "connections"]],
["Alimentación", ["power_supply"]],
["Software", ["factory_os"]],
["Compra y garantía", ["purchased_on", "warranty_until", "supplier"]],
["Soporte y reparación", ["support_page"]],
],
],
[
"monitor",
"Monitor",
"monitor",
[
["Identificación", ["brand", "model", "serial", "mpn"]],
["Pantalla", ["screen_size", "resolution", "panel_technology"]],
["Conectividad", ["connections"]],
["Montaje", ["mounting_adjustment"]],
["Compra y garantía", ["purchased_on", "warranty_until", "supplier"]],
["Soporte y reparación", ["support_page"]],
],
],
[
"printer",
"Impresora",
"printer",
[
["Identificación", ["brand", "model", "serial", "mpn"]],
["Conectividad", ["connectivity"]],
["Impresión", ["printing", "color", "duplex", "paper_trays"]],
["Consumibles y mantenimiento", ["consumables", "maintenance_parts"]],
["Compra y garantía", ["purchased_on", "warranty_until", "supplier"]],
["Soporte y reparación", ["support_page"]],
],
],
[
"router",
"Router",
"router",
[
["Identificación", ["brand", "model", "serial", "mpn"]],
["Conectividad", ["physical_ports", "wifi"]],
["Alimentación", ["power_adapter"]],
["Compra y garantía", ["purchased_on", "warranty_until", "supplier"]],
["Soporte y reparación", ["support_page"]],
],
],
[
"firewall",
"Firewall",
"shield",
[
["Identificación", ["brand", "model", "serial", "mpn"]],
["Conectividad", ["physical_ports"]],
["Compra y garantía", ["supplier", "purchased_on", "warranty_until"]],
["Soporte y reparación", ["support_page"]],
],
],
[
"switch",
"Switch",
"network",
[
["Identificación", ["brand", "model", "serial", "mpn"]],
["Conectividad", ["physical_ports", "poe"]],
["Alimentación", ["power_supply"]],
["Compra y garantía", ["supplier", "purchased_on", "warranty_until"]],
["Soporte y reparación", ["support_page"]],
],
],
[
"access_point",
"Punto de acceso Wi-Fi",
"wifi",
[
["Identificación", ["brand", "model", "serial", "mpn"]],
["Conectividad", ["wifi", "poe"]],
["Compra y garantía", ["supplier", "purchased_on", "warranty_until"]],
["Soporte y reparación", ["support_page"]],
],
],
[
"nas",
"NAS",
"hard-drive",
[
["Identificación", ["brand", "model", "serial", "mpn"]],
["Almacenamiento", ["supported_storage", "equipped_storage"]],
["Alimentación", ["power_supply"]],
["Compra y garantía", ["purchased_on", "warranty_until", "supplier"]],
["Soporte y reparación", ["service_manual"]],
],
],
[
"server",
"Servidor",
"server",
[
["Identificación", ["brand", "model", "serial", "mpn"]],
["Hardware", ["processor", "cpu_configuration", "memory", "storage"]],
["Alimentación", ["redundant_power", "power_supply"]],
["Configuración de fábrica", ["factory_preloaded_os"]],
["Conectividad", ["connectivity", "connections"]],
["Software", ["factory_os"]],
["Compra y garantía", ["purchased_on", "warranty_until", "supplier"]],
["Soporte y reparación", ["support_page"]],
],
],
[
"smartphone",
"Smartphone",
"smartphone",
[
["Identificación", ["brand", "model", "serial", "imei", "mpn"]],
["Compra y garantía", ["purchased_on", "warranty_until", "supplier"]],
["Soporte y reparación", ["service_manual"]],
],
],
[
"ups",
"SAI",
"battery",
[
["Identificación", ["brand", "model", "serial", "mpn"]],
["Conectividad", ["connections"]],
["Batería", ["ups_battery"]],
["Compra y garantía", ["supplier", "purchased_on", "warranty_until"]],
["Alimentación", ["power_connections"]],
["Montaje", ["form_factor"]],
["Soporte y reparación", ["service_manual"]],
],
],
];
export function seedAssetCatalog(catalog: AssetCatalog) {
let current = catalog;
const add = (key: string, input: AssetDefinitionSpec) => {
const values = AssetDefinitionValues.create(input);
if (!values.isSuccess) {
throw new Error("Definición inicial de activos inválida.");
}
const result = current.seed(key, values.data);
if (!result.isSuccess) {
throw new Error("Catálogo inicial de activos inconsistente.");
}
current = result.data;
};
for (const [key, name, type, description] of FIELDS) {
add(`field:${key}`, { kind: "field", name, type, description, unit: "", choices: [] });
}
for (const [key, name, icon, layout] of TEMPLATES) {
const sections = layout.map(([sectionName]) => ({
id: UniqueID.generateNewID().toPrimitive(),
name: sectionName,
description: "",
}));
const references = layout.flatMap(([, keys], index) =>
keys.map((field) => {
const definition = current.definitions.find(
(item) => item.stockKey.getOrUndefined() === `field:${field}`
);
const section = sections[index];
if (!(definition && section)) {
throw new Error("Campo inicial de activos ausente.");
}
return { fieldId: definition.id.toPrimitive(), required: false, sectionId: section.id };
})
);
add(`template:${key}`, {
kind: "template",
icon,
name,
description: "",
fields: references,
sections,
});
}
for (const [key, name, inverseName, symmetric] of [
["connected", "Conectado a", "Conectado a", true],
["hosted", "Alojado en", "Aloja", false],
["depends", "Depende de", "Es necesario para", false],
["powered", "Alimentado por", "Alimenta", false],
["installed", "Instalado en", "Tiene instalado", false],
] as const) {
add(`relation:${key}`, { kind: "relation", name, inverseName, symmetric, description: "" });
}
return current;
}