Created
August 23, 2023 00:37
-
-
Save zafe/495a274c719a8753b6357c33ae63c4bf to your computer and use it in GitHub Desktop.
CBU Validator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// CBUValidator.swift | |
// CBU Scanner | |
// | |
// Created by Fernando Zafe on 21/08/2023. | |
// | |
import Foundation | |
class CBUValidator { | |
typealias CBU = [UInt8] | |
typealias BankNumber = [UInt8] | |
typealias BranchNumber = [UInt8] | |
typealias AccountNumber = [UInt8] | |
typealias BlockOneVerificationNumber = UInt8 | |
typealias BlockTwoVerificationNumber = UInt8 | |
typealias BlockOneIsValid = Bool | |
typealias BlockTwoIsValid = Bool | |
typealias CBUIsValid = Bool | |
private func cutNumber(from text: String) -> String { | |
let start = text.index(text.startIndex, offsetBy: 0) | |
let end = text.index(text.startIndex, offsetBy: 22) | |
let range = start..<end | |
return String(text[range]) | |
} | |
private func transformToCBU(from text: String) -> CBU { | |
let cbu = text.map { UInt8(String($0))! } | |
return cbu | |
} | |
private func getBankNumber(from cbu: CBU) -> BankNumber { | |
Array(cbu[0..<3]) | |
} | |
private func getBranchNumber(from cbu: CBU) -> BranchNumber { | |
Array(cbu[3..<7]) | |
} | |
private func getBlockOneVerificationNumber(from cbu: CBU) -> BlockOneVerificationNumber { | |
cbu[7] | |
} | |
private func getAccountNumber(from cbu: CBU) -> AccountNumber { | |
Array(cbu[8..<21]) | |
} | |
private func getBlockTwoVerificationNumber(from cbu: CBU) -> BlockTwoVerificationNumber { | |
cbu[21] | |
} | |
private func verifyFirstBlock(bankNumber: BankNumber, branchNumber: BranchNumber, blockOneVerificationNumber: BlockOneVerificationNumber) -> BlockOneIsValid { | |
let sumBank: UInt8 = | |
bankNumber[0] * 7 + | |
bankNumber[1] * 1 + | |
bankNumber[2] * 3 | |
let sumBranch: UInt8 = | |
branchNumber[0] * 9 + | |
branchNumber[1] * 7 + | |
branchNumber[2] * 1 + | |
branchNumber[3] * 3 | |
let sum = sumBank + sumBranch | |
let remainder = sum % 10 | |
let substract = 10 - remainder | |
return | |
blockOneVerificationNumber == 0 ? | |
substract == 10 : | |
substract == blockOneVerificationNumber | |
} | |
private func verifySecondBlock(accountNumber: AccountNumber, blockTwoVerificationNumber: BlockTwoVerificationNumber) -> BlockTwoIsValid { | |
var sum : UInt = UInt(3 * (accountNumber[0] + accountNumber[4] + accountNumber[8] + accountNumber[12])) | |
sum = sum + UInt(9 * (accountNumber[1] + accountNumber[5] + accountNumber[9])) | |
sum = sum + UInt(7 * (accountNumber[2] + accountNumber[6] + accountNumber[10])) | |
sum = sum + UInt(accountNumber[3] + accountNumber[7] + accountNumber[11]) | |
let remainder = sum % 10 | |
let substract = 10 - remainder | |
return | |
blockTwoVerificationNumber == 0 ? | |
substract == 10 : | |
substract == blockTwoVerificationNumber | |
} | |
public func verifyCBU(_ text: String) -> CBUIsValid { | |
let cbu = transformToCBU(from: text) | |
let bankNumber = getBankNumber(from: cbu) | |
let branchNumber = getBranchNumber(from: cbu) | |
let blockOneVerificationNumber = getBlockOneVerificationNumber(from: cbu) | |
let accountNumber = getAccountNumber(from: cbu) | |
let blockTwoVerificationNumber = getBlockTwoVerificationNumber(from: cbu) | |
let blockOneIsValid = verifyFirstBlock(bankNumber: bankNumber, branchNumber: branchNumber, blockOneVerificationNumber: blockOneVerificationNumber) | |
let blockTwoIsValid = verifySecondBlock(accountNumber: accountNumber, blockTwoVerificationNumber: blockTwoVerificationNumber) | |
return blockOneIsValid && blockTwoIsValid | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment