Files
reference_number_converter/reference.py

51 lines
1.4 KiB
Python
Executable File

#!/usr/bin/env python3
import sys
# Creates an iterator that loops a list indefinitely
class LoopList:
def __init__(self, ls):
self.ls = ls
def __iter__(self):
self.i = 0
return self
def __next__(self):
v = self.ls[self.i]
self.i = (self.i + 1) % len(self.ls)
return v
def splitAt(w,n):
for i in range(0,len(w),n):
yield w[i:i+n]
# computes checkdigit for invoice number
# https://www.pangaliit.ee/settlements-and-standards/reference-number-of-the-invoice
def checkdigit(ref):
ref = str(ref)
weights = [7,3,1]
wref = [int(x[0])*int(x[1]) for x in zip(ref[::-1], LoopList(weights))]
wsum = sum(wref)
checkdigit = 10 - (wsum % 10)
return str(checkdigit)[-1]
# https://github.com/terokallio/reference-numbers/blob/master/src/main/java/com/terokallio/referencenumbers/RFCreditorReference.java
def isocheckdigits(ref):
# ref + "RF" + "00"
# | | |
# v v v
magic = ref + '2715' + '00'
mod = int(magic) % 97
check = 98 - mod
return '0' + str(check) if check < 10 else str(check)
def convert(ref):
refc = ref + checkdigit(ref)
print('Reference with checkdigit: \n\t', refc)
refiso = 'RF' + isocheckdigits(refc) + refc
refiso = " ".join(splitAt(refiso,4))
print('ISO 11649 converted reference: \n\t', refiso)
if __name__ == '__main__':
ref = sys.argv[1]
convert(ref)