/** * Numeración de unidades: el patrón admite `{clave}` (clave del desarrollo) y * `{n}` (número consecutivo del rango). */ export const MAX_UNIDADES_GENERADOR = 1000 export function aplicarPatron(patron: string, clave: string, n: number): string { return patron.split('{clave}').join(clave).split('{n}').join(String(n)) } /** Primeros `max` códigos del rango (vista previa antes de confirmar) */ export function generarCodigos( patron: string, clave: string, desde: number, hasta: number, max = 5, ): string[] { if (!patron.includes('{n}') || !Number.isInteger(desde) || !Number.isInteger(hasta) || hasta < desde) { return [] } const cantidad = Math.min(hasta - desde + 1, Math.max(0, max)) return Array.from({ length: cantidad }, (_, i) => aplicarPatron(patron, clave, desde + i)) } /** Total de unidades que crearía el generador con el rango actual */ export function totalDelRango(desde: number, hasta: number): number { if (!Number.isInteger(desde) || !Number.isInteger(hasta) || hasta < desde) return 0 return hasta - desde + 1 } /** Devuelve el mensaje de error del generador o null si todo está bien */ export function validarGenerador(patron: string, desde: number, hasta: number): string | null { if (patron.trim() === '') return 'Escribe el patrón de código de la unidad.' if (!patron.includes('{n}')) return 'El patrón debe incluir {n} para numerar las unidades.' if (/[^A-Za-z0-9{}_-]/.test(patron)) { return 'El patrón solo admite letras, números, guiones, {clave} y {n}.' } if (!Number.isInteger(desde) || !Number.isInteger(hasta)) return 'El rango debe usar números enteros.' if (hasta < desde) return 'El valor "hasta" debe ser mayor o igual que "desde".' if (hasta - desde + 1 > MAX_UNIDADES_GENERADOR) { return `El rango no puede superar ${MAX_UNIDADES_GENERADOR} unidades por vez.` } return null }