Feat ERP 3
This commit is contained in:
43
frontend/counter-panel/src/utils/cuitValidator.ts
Normal file
43
frontend/counter-panel/src/utils/cuitValidator.ts
Normal 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)}`;
|
||||
};
|
||||
Reference in New Issue
Block a user