Skip to content

Instantly share code, notes, and snippets.

@AlexGalhardo
Forked from fiuzagr/cpf.js
Created October 9, 2023 13:35
Show Gist options
  • Save AlexGalhardo/0a5cbdb51da3356e28f55283c634a354 to your computer and use it in GitHub Desktop.
Save AlexGalhardo/0a5cbdb51da3356e28f55283c634a354 to your computer and use it in GitHub Desktop.

Revisions

  1. @fiuzagr fiuzagr revised this gist Nov 6, 2018. No changes.
  2. @fiuzagr fiuzagr revised this gist Apr 23, 2018. 1 changed file with 39 additions and 26 deletions.
    65 changes: 39 additions & 26 deletions cpf.js
    Original file line number Diff line number Diff line change
    @@ -1,39 +1,52 @@
    const cpfDigitMod = value => {
    let mod = 11 - Math.round(value - Math.floor(value / 11) * 11);
    mod = mod >= 10 ? 0 : mod;
    return mod;
    const digitMod = (value, len) => {
    const mod = len - Math.round(value - Math.floor(value / len) * len);
    return mod >= 10 ? 0 : mod;
    };

    const mapValuesWithCpfDigitModByKey = _key => (value, key) =>
    _key === key ? cpfDigitMod(value) : value;
    const mapValuesWithDigitModByKey = (_key, _len) => (value, key) =>
    _key === key ? digitMod(value, _len) : value;

    const reduceCpfDigitsByKey = _key => (cpf, value, key) => {
    const reduceDigitsByKey = _key => (digits, value, key) => {
    if (key > _key) {
    cpf[_key] = cpf[_key] + value * (key + (_key === 0 ? 1 : 0));
    cpf[key] = value;
    digits[_key] = digits[_key] + value * (key + (_key === 0 ? 1 : 0));
    digits[key] = value;
    }
    return cpf;
    return digits;
    };

    const mockDigits = len => new Array(len).fill(0);
    const genArrayDigits = len => new Array(len).fill(0);

    const mockCpf = () =>
    new Array(9)
    .fill()
    .map(() => Math.round(Math.random() * 9)).concat(mockDigits(2));
    const genRandomArrayDigits = len =>
    genArrayDigits(len).map(() => Math.round(Math.random() * 9));

    const generateCpf = (cpfDigits = mockCpf()) =>
    cpfDigits
    .reverse()
    .reduce(reduceCpfDigitsByKey(1), mockDigits(2))
    .map(mapValuesWithCpfDigitModByKey(1))
    .reduce(reduceCpfDigitsByKey(0), mockDigits(1))
    .map(mapValuesWithCpfDigitModByKey(0))
    .reverse()
    .join('');
    const reduceArrayDigits = (digits, verifyDigits) =>
    verifyDigits.length
    ? reduceArrayDigits(
    digits
    .reduce(
    reduceDigitsByKey(verifyDigits.length - 1),
    genArrayDigits(verifyDigits.length)
    )
    .map(mapValuesWithDigitModByKey(verifyDigits.length - 1, digits.length)),
    verifyDigits.slice(1)
    )
    : digits;

    const validateCpf = cpf => generateCpf(cpf.split('')) === cpf;
    const calculateDigits = (digits, verifyDigits) =>
    reduceArrayDigits(digits.concat(verifyDigits).reverse(), verifyDigits).reverse();

    const generateCpf = () =>
    calculateDigits(genRandomArrayDigits(9), genArrayDigits(2)).join('');

    const validateCpf = cpf =>
    calculateDigits(cpf.split('').slice(0, -2), genArrayDigits(2)).join('') === cpf;

    // use:
    //document.getElementById('generate').innerText = generateCpf();
    //document.getElementById('validate').innerText = validateCpf('0418693625');
    //document.getElementById('validate').innerText = validateCpf('75314746700');

    // Implements your own verified digits:
    //const generateAnotherVerifiedDigits = () =>
    // calculateDigits(genRandomArrayDigits(10), genArrayDigits(3)).join('');
    //const validateAnotherVerifiedDigits = digits =>
    // calculateDigits(digits.split('').slice(0, -3), genArrayDigits(3)).join('') === digits;
  3. @fiuzagr fiuzagr created this gist Apr 23, 2018.
    39 changes: 39 additions & 0 deletions cpf.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,39 @@
    const cpfDigitMod = value => {
    let mod = 11 - Math.round(value - Math.floor(value / 11) * 11);
    mod = mod >= 10 ? 0 : mod;
    return mod;
    };

    const mapValuesWithCpfDigitModByKey = _key => (value, key) =>
    _key === key ? cpfDigitMod(value) : value;

    const reduceCpfDigitsByKey = _key => (cpf, value, key) => {
    if (key > _key) {
    cpf[_key] = cpf[_key] + value * (key + (_key === 0 ? 1 : 0));
    cpf[key] = value;
    }
    return cpf;
    };

    const mockDigits = len => new Array(len).fill(0);

    const mockCpf = () =>
    new Array(9)
    .fill()
    .map(() => Math.round(Math.random() * 9)).concat(mockDigits(2));

    const generateCpf = (cpfDigits = mockCpf()) =>
    cpfDigits
    .reverse()
    .reduce(reduceCpfDigitsByKey(1), mockDigits(2))
    .map(mapValuesWithCpfDigitModByKey(1))
    .reduce(reduceCpfDigitsByKey(0), mockDigits(1))
    .map(mapValuesWithCpfDigitModByKey(0))
    .reverse()
    .join('');

    const validateCpf = cpf => generateCpf(cpf.split('')) === cpf;

    // use:
    //document.getElementById('generate').innerText = generateCpf();
    //document.getElementById('validate').innerText = validateCpf('0418693625');