diff options
Diffstat (limited to 'venv/lib/python3.11/site-packages/faker/providers/ssn/en_CA')
2 files changed, 80 insertions, 0 deletions
diff --git a/venv/lib/python3.11/site-packages/faker/providers/ssn/en_CA/__init__.py b/venv/lib/python3.11/site-packages/faker/providers/ssn/en_CA/__init__.py new file mode 100644 index 0000000..6df8f8b --- /dev/null +++ b/venv/lib/python3.11/site-packages/faker/providers/ssn/en_CA/__init__.py @@ -0,0 +1,80 @@ +from .. import Provider as SsnProvider + + +def checksum(sin): + """ + Determine validity of a Canadian Social Insurance Number. + Validation is performed using a modified Luhn Algorithm. To check + the Every second digit of the SIN is doubled and the result is + summed. If the result is a multiple of ten, the Social Insurance + Number is considered valid. + + https://en.wikipedia.org/wiki/Social_Insurance_Number + """ + + # Remove spaces and create a list of digits. + checksumCollection = list(sin.replace(" ", "")) + checksumCollection = [int(i) for i in checksumCollection] + + # Discard the last digit, we will be calculating it later. + checksumCollection[-1] = 0 + + # Iterate over the provided SIN and double every second digit. + # In the case that doubling that digit results in a two-digit + # number, then add the two digits together and keep that sum. + + for i in range(1, len(checksumCollection), 2): + result = checksumCollection[i] * 2 + if result < 10: + checksumCollection[i] = result + else: + checksumCollection[i] = result - 10 + 1 + + # The appropriate checksum digit is the value that, when summed + # with the first eight values, results in a value divisible by 10 + + check_digit = 10 - (sum(checksumCollection) % 10) + check_digit = 0 if check_digit == 10 else check_digit + + return check_digit + + +class Provider(SsnProvider): + # In order to create a valid SIN we need to provide a number that + # passes a simple modified Luhn Algorithm checksum. + # + # This function reverses the checksum steps to create a random + # valid nine-digit Canadian SIN (Social Insurance Number) in the + # format '### ### ###'. + def ssn(self) -> str: + # Create an array of 8 elements initialized randomly. + digits = self.generator.random.sample(range(9), 8) + + # The final step of the validation requires that all of the + # digits sum to a multiple of 10. First, sum the first 8 and + # set the 9th to the value that results in a multiple of 10. + check_digit = 10 - (sum(digits) % 10) + check_digit = 0 if check_digit == 10 else check_digit + + digits.append(check_digit) + + # digits is now the digital root of the number we want + # multiplied by the magic number 121 212 121. The next step is + # to reverse the multiplication which occurred on every other + # element. + for i in range(1, len(digits), 2): + if digits[i] % 2 == 0: + digits[i] = digits[i] // 2 + else: + digits[i] = (digits[i] + 9) // 2 + + # Build the resulting SIN string. + sin = "" + for i in range(0, len(digits)): + sin += str(digits[i]) + # Add a space to make it conform to Canadian formatting. + if i in (2, 5): + sin += " " + + # Finally return our random but valid SIN. + return sin diff --git a/venv/lib/python3.11/site-packages/faker/providers/ssn/en_CA/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/faker/providers/ssn/en_CA/__pycache__/__init__.cpython-311.pyc Binary files differnew file mode 100644 index 0000000..08e6402 --- /dev/null +++ b/venv/lib/python3.11/site-packages/faker/providers/ssn/en_CA/__pycache__/__init__.cpython-311.pyc |