Feat ERP 3

This commit is contained in:
2026-02-21 19:23:17 -03:00
parent 29aa8e30e7
commit 841cc961b5
13 changed files with 835 additions and 26 deletions

View File

@@ -0,0 +1,43 @@
/**
* Valida un CUIT/CUIL argentino aplicando el algoritmo de Módulo 11.
* Soporta formatos con o sin guiones (20-12345678-9 o 20123456789).
*/
export const isValidCuit = (cuit: string): boolean => {
if (!cuit) return false;
// 1. Limpiar el input: dejar solo números
const cleanCuit = cuit.replace(/[^0-9]/g, '');
// 2. Verificar longitud exacta (11 dígitos)
if (cleanCuit.length !== 11) return false;
// 3. Convertir a array de números
const digits = cleanCuit.split('').map(Number);
// 4. Algoritmo de verificación (Módulo 11)
const multipliers = [5, 4, 3, 2, 7, 6, 5, 4, 3, 2];
let total = 0;
for (let i = 0; i < 10; i++) {
total += digits[i] * multipliers[i];
}
const remainder = total % 11;
const calculatedVerifier = remainder === 0 ? 0 : remainder === 1 ? 9 : 11 - remainder;
const actualVerifier = digits[10];
// Caso especial: Cuando el resto es 1, el resultado suele ser 9 en algunos casos específicos
// o se considera inválido y se debe cambiar el prefijo (Hombres/Mujeres),
// pero para validación estricta matemática:
return calculatedVerifier === actualVerifier;
};
/**
* Formatea un string de números al formato XX-XXXXXXXX-X
*/
export const formatCuit = (cuit: string): string => {
const nums = cuit.replace(/[^0-9]/g, '');
if (nums.length <= 2) return nums;
if (nums.length <= 10) return `${nums.slice(0, 2)}-${nums.slice(2)}`;
return `${nums.slice(0, 2)}-${nums.slice(2, 10)}-${nums.slice(10, 11)}`;
};