summaryrefslogtreecommitdiff
path: root/venv/lib/python3.11/site-packages/faker/providers/ssn/en_CA
diff options
context:
space:
mode:
Diffstat (limited to 'venv/lib/python3.11/site-packages/faker/providers/ssn/en_CA')
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/ssn/en_CA/__init__.py80
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/ssn/en_CA/__pycache__/__init__.cpython-311.pycbin0 -> 2836 bytes
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
new 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
Binary files differ