From 82ab9fd8cfa15ec008baf9cee057dc84062e84b1 Mon Sep 17 00:00:00 2001 From: Eduardo Fernandes Marques Date: Thu, 27 Aug 2020 18:13:19 -0300 Subject: [PATCH 1/4] feat(placa renavam): iniciado implementacao de renavam e placa --- src/index.test.ts | 1 + src/utilities/index.ts | 1 + src/utilities/placa/index.test.ts | 84 +++++++++++++++++++++++++++++ src/utilities/placa/index.ts | 18 +++++++ src/utilities/renavam/index.test.ts | 56 +++++++++++++++++++ src/utilities/renavam/index.ts | 43 +++++++++++++++ 6 files changed, 203 insertions(+) create mode 100644 src/utilities/placa/index.test.ts create mode 100644 src/utilities/placa/index.ts create mode 100644 src/utilities/renavam/index.test.ts create mode 100644 src/utilities/renavam/index.ts diff --git a/src/index.test.ts b/src/index.test.ts index f524a94f..eb5fbf80 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -28,6 +28,7 @@ describe('Public API', () => { 'capitalize', 'formatCurrency', 'parseCurrency', + 'isValidRenavam', ]; Object.keys(API).forEach((method) => { diff --git a/src/utilities/index.ts b/src/utilities/index.ts index fe776ed1..edbd0244 100644 --- a/src/utilities/index.ts +++ b/src/utilities/index.ts @@ -1,4 +1,5 @@ export { isValid as isValidIE } from './inscricao-estadual'; +export { isValid as isValidRenavam } from './renavam'; export { isValid as isValidPIS } from './pis'; export { isValid as isValidPhone, isValidMobilePhone, isValidLandlinePhone } from './phone'; export { isValid as isValidEmail } from './email'; diff --git a/src/utilities/placa/index.test.ts b/src/utilities/placa/index.test.ts new file mode 100644 index 00000000..54ddc3ff --- /dev/null +++ b/src/utilities/placa/index.test.ts @@ -0,0 +1,84 @@ +import { isValid } from '.'; + +describe('isValid', () => { + describe('should return false', () => { + test('when is a empty string', () => { + expect(isValid('')).toBe(false); + }); + + test('when is null', () => { + expect(isValid(null as any)).toBe(false); + }); + + test('when is undefined', () => { + expect(isValid(undefined as any)).toBe(false); + }); + + test('when is a boolean', () => { + expect(isValid(true as any)).toBe(false); + expect(isValid(false as any)).toBe(false); + }); + + test('when is a object', () => { + expect(isValid({} as any)).toBe(false); + }); + + test('when is a array', () => { + expect(isValid([] as any)).toBe(false); + }); + + test(`when dont match with CPF length`, () => { + expect(isValid('IWH-86288')).toBe(false); + }); + + test('when contains only letters', () => { + expect(isValid('IWH')).toBe(false); + }); + + test('when contains only numbers', () => { + expect(isValid('8628')).toBe(false); + }); + + test('when is invalid mercosul plate', () => { + expect(isValid('IWH-8628', { mercosul: true })).toBe(false); + }); + + test('when is invalid motorcycle mercosul plate', () => { + expect(isValid('AAA-1A11', { mercosul: true, motorcycle: true })).toBe(false); + }); + + test('when options params is not pass in mercosul plate', () => { + expect(isValid('AAA-1A11')).toBe(false); + }); + + test('when options params is not pass in motorcycle mercosul plate', () => { + expect(isValid('AAA-11A1', { mercosul: true })).toBe(false); + }); + }); + + describe('should return true', () => { + test('when is a valid plate without mask', () => { + expect(isValid('IWH8628')).toBe(true); + }); + + test('when is a valid plate with mask', () => { + expect(isValid('IWH-8628')).toBe(true); + }); + + test('when is a valid mercosul plate', () => { + expect(isValid('AAA-1A11', { mercosul: true })).toBe(true); + }); + + test('when is a valid motorcycle mercosul plate', () => { + expect(isValid('AAA-11A1', { mercosul: true, motorcycle: true })).toBe(true); + }); + + test('when is a valid mercosul plate without mask', () => { + expect(isValid('AAA1A11', { mercosul: true })).toBe(true); + }); + + test('when is a valid motorcycle mercosul plate without mask', () => { + expect(isValid('AAA11A1', { mercosul: true, motorcycle: true })).toBe(true); + }); + }); +}); diff --git a/src/utilities/placa/index.ts b/src/utilities/placa/index.ts new file mode 100644 index 00000000..be7ff652 --- /dev/null +++ b/src/utilities/placa/index.ts @@ -0,0 +1,18 @@ +export type Options = { + mercosul?: boolean; + motorcycle?: boolean; +}; + +export const isValid = (input: string, options?: Options) => { + if (!input || typeof input !== 'string') return false; + + const plate = input.replace('-', ''); + + if (options?.mercosul && options?.motorcycle) { + return /^[a-zA-Z]{3}[0-9]{2}[a-zA-Z]{1}[0-9]{1}$/.test(plate); + } else if (options?.mercosul) { + return /^[a-zA-Z]{3}[0-9]{1}[a-zA-Z]{1}[0-9]{2}$/.test(plate); + } else { + return /^[a-zA-Z]{3}[0-9]{4}$/.test(plate); + } +}; diff --git a/src/utilities/renavam/index.test.ts b/src/utilities/renavam/index.test.ts new file mode 100644 index 00000000..70455393 --- /dev/null +++ b/src/utilities/renavam/index.test.ts @@ -0,0 +1,56 @@ +import { isValid, LENGTH } from '.'; + +describe('isValid', () => { + describe('should return false', () => { + test('when is a empty string', () => { + expect(isValid('')).toBe(false); + }); + + test('when is null', () => { + expect(isValid(null as any)).toBe(false); + }); + + test('when is undefined', () => { + expect(isValid(undefined as any)).toBe(false); + }); + + test('when is a boolean', () => { + expect(isValid(true as any)).toBe(false); + expect(isValid(false as any)).toBe(false); + }); + + test('when is a object', () => { + expect(isValid({} as any)).toBe(false); + }); + + test('when is a array', () => { + expect(isValid([] as any)).toBe(false); + }); + + test(`when dont match with CPF length (${LENGTH})`, () => { + expect(isValid('123456')).toBe(false); + }); + + test('when contains only letters or special characters', () => { + expect(isValid('abcabcabcde')).toBe(false); + }); + + test('when is a invalid Renavam', () => { + expect(isValid('95965727047')).toBe(false); + }); + + test('when is a invalid Renavam test numbers with letters', () => { + expect(isValid('foo391.838.38test0-66')).toBe(false); + }); + }); + + describe('should return true', () => { + test('when is a Renavam valid without mask', () => { + expect(isValid('95965727048')).toBe(true); + }); + + test('when is a valid Renavam with mask', () => { + expect(isValid('9596572704-8')).toBe(true); + }); + }); +}); diff --git a/src/utilities/renavam/index.ts b/src/utilities/renavam/index.ts new file mode 100644 index 00000000..67fec732 --- /dev/null +++ b/src/utilities/renavam/index.ts @@ -0,0 +1,43 @@ +import { onlyNumbers } from '../../helpers'; + +export const MIN_LENGTH = 9; +export const LENGTH = 11; +export const SUM = 284; + +export const isValid = (input: string) => { + if (!input || typeof input !== 'string' || input.length < MIN_LENGTH) return false; + + let result = onlyNumbers(input.padStart(11, '0')); + + if (!result.match('[0-9]{11}')) return false; + + let resultWithoutDigit = result.substring(0, 10); + resultWithoutDigit = resultWithoutDigit.split('').reverse().join(''); + + const sum = sumCalculationRest(resultWithoutDigit); + + const realDigit = parseInt(input.substring(input.length - 1, input.length)); + + return sum === realDigit; +}; + +const sumCalculationRest = (input: string) => { + let sum = 0; + let multiple = 2; + + for (let i = 0; i < 10; i++) { + sum += parseInt(input.substring(i, i + 1)) * multiple; + + if (multiple >= 9) { + multiple = 2; + } else { + multiple++; + } + } + + sum = LENGTH - (sum % LENGTH); + + return sum; +}; + +//https://github.com/eliseuborges/Renavam/blob/master/Renavam.js From 0df4f50d5bb97282240fa3ee9b2c2a01d9fcb5a7 Mon Sep 17 00:00:00 2001 From: Eduardo Fernandes Marques Date: Thu, 27 Aug 2020 18:16:21 -0300 Subject: [PATCH 2/4] feat(placa renavam): adicionado scripts --- src/index.test.ts | 1 + src/utilities/index.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/index.test.ts b/src/index.test.ts index eb5fbf80..a785afc5 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -29,6 +29,7 @@ describe('Public API', () => { 'formatCurrency', 'parseCurrency', 'isValidRenavam', + 'isValidPlate', ]; Object.keys(API).forEach((method) => { diff --git a/src/utilities/index.ts b/src/utilities/index.ts index edbd0244..0037afa1 100644 --- a/src/utilities/index.ts +++ b/src/utilities/index.ts @@ -1,4 +1,5 @@ export { isValid as isValidIE } from './inscricao-estadual'; +export { isValid as isValidPlate } from './placa'; export { isValid as isValidRenavam } from './renavam'; export { isValid as isValidPIS } from './pis'; export { isValid as isValidPhone, isValidMobilePhone, isValidLandlinePhone } from './phone'; From 2064aab0d74195c8b7b7d3966b3ef822bd3af2c1 Mon Sep 17 00:00:00 2001 From: Eduardo Fernandes Marques Date: Fri, 28 Aug 2020 11:32:57 -0300 Subject: [PATCH 3/4] fix(renavam-plate): corrigido solicitacoes do mr --- src/utilities/index.ts | 2 +- src/utilities/{placa => plate}/index.test.ts | 0 src/utilities/{placa => plate}/index.ts | 0 src/utilities/renavam/index.ts | 12 ++++-------- 4 files changed, 5 insertions(+), 9 deletions(-) rename src/utilities/{placa => plate}/index.test.ts (100%) rename src/utilities/{placa => plate}/index.ts (100%) diff --git a/src/utilities/index.ts b/src/utilities/index.ts index 0037afa1..54317c14 100644 --- a/src/utilities/index.ts +++ b/src/utilities/index.ts @@ -1,5 +1,5 @@ export { isValid as isValidIE } from './inscricao-estadual'; -export { isValid as isValidPlate } from './placa'; +export { isValid as isValidPlate } from './plate'; export { isValid as isValidRenavam } from './renavam'; export { isValid as isValidPIS } from './pis'; export { isValid as isValidPhone, isValidMobilePhone, isValidLandlinePhone } from './phone'; diff --git a/src/utilities/placa/index.test.ts b/src/utilities/plate/index.test.ts similarity index 100% rename from src/utilities/placa/index.test.ts rename to src/utilities/plate/index.test.ts diff --git a/src/utilities/placa/index.ts b/src/utilities/plate/index.ts similarity index 100% rename from src/utilities/placa/index.ts rename to src/utilities/plate/index.ts diff --git a/src/utilities/renavam/index.ts b/src/utilities/renavam/index.ts index 67fec732..69d6b793 100644 --- a/src/utilities/renavam/index.ts +++ b/src/utilities/renavam/index.ts @@ -1,3 +1,4 @@ +//base on https://github.com/eliseuborges/Renavam/blob/master/Renavam.js import { onlyNumbers } from '../../helpers'; export const MIN_LENGTH = 9; @@ -7,15 +8,12 @@ export const SUM = 284; export const isValid = (input: string) => { if (!input || typeof input !== 'string' || input.length < MIN_LENGTH) return false; - let result = onlyNumbers(input.padStart(11, '0')); + const numeric = onlyNumbers(input.padStart(11, '0')); - if (!result.match('[0-9]{11}')) return false; - - let resultWithoutDigit = result.substring(0, 10); - resultWithoutDigit = resultWithoutDigit.split('').reverse().join(''); + if (!numeric.match('[0-9]{11}')) return false; + const resultWithoutDigit = numeric.substring(0, 10).split('').reverse().join(''); const sum = sumCalculationRest(resultWithoutDigit); - const realDigit = parseInt(input.substring(input.length - 1, input.length)); return sum === realDigit; @@ -39,5 +37,3 @@ const sumCalculationRest = (input: string) => { return sum; }; - -//https://github.com/eliseuborges/Renavam/blob/master/Renavam.js From 0e6fd4da74d2fcd6f178eb2d6628b2e830027e0a Mon Sep 17 00:00:00 2001 From: Eduardo Fernandes Marques Date: Fri, 28 Aug 2020 11:42:27 -0300 Subject: [PATCH 4/4] fix(renavam-plate): convertido arrow function para function --- src/utilities/plate/index.ts | 4 ++-- src/utilities/renavam/index.ts | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/utilities/plate/index.ts b/src/utilities/plate/index.ts index be7ff652..e442e169 100644 --- a/src/utilities/plate/index.ts +++ b/src/utilities/plate/index.ts @@ -3,7 +3,7 @@ export type Options = { motorcycle?: boolean; }; -export const isValid = (input: string, options?: Options) => { +export function isValid(input: string, options?: Options) { if (!input || typeof input !== 'string') return false; const plate = input.replace('-', ''); @@ -15,4 +15,4 @@ export const isValid = (input: string, options?: Options) => { } else { return /^[a-zA-Z]{3}[0-9]{4}$/.test(plate); } -}; +} diff --git a/src/utilities/renavam/index.ts b/src/utilities/renavam/index.ts index 69d6b793..069dc7e7 100644 --- a/src/utilities/renavam/index.ts +++ b/src/utilities/renavam/index.ts @@ -5,7 +5,7 @@ export const MIN_LENGTH = 9; export const LENGTH = 11; export const SUM = 284; -export const isValid = (input: string) => { +export function isValid(input: string) { if (!input || typeof input !== 'string' || input.length < MIN_LENGTH) return false; const numeric = onlyNumbers(input.padStart(11, '0')); @@ -17,9 +17,9 @@ export const isValid = (input: string) => { const realDigit = parseInt(input.substring(input.length - 1, input.length)); return sum === realDigit; -}; +} -const sumCalculationRest = (input: string) => { +function sumCalculationRest(input: string) { let sum = 0; let multiple = 2; @@ -36,4 +36,4 @@ const sumCalculationRest = (input: string) => { sum = LENGTH - (sum % LENGTH); return sum; -}; +}