Skip to content

Instantly share code, notes, and snippets.

@zafe
Created August 23, 2023 00:37
Show Gist options
  • Save zafe/495a274c719a8753b6357c33ae63c4bf to your computer and use it in GitHub Desktop.
Save zafe/495a274c719a8753b6357c33ae63c4bf to your computer and use it in GitHub Desktop.
CBU Validator
//
// 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