Advertisement
MRtecno98

Fiscal Code Generator

Apr 12th, 2019
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.04 KB | None | 0 0
  1. import requests
  2. from string import ascii_lowercase
  3.  
  4. MALE = 0
  5. FEMALE = 1
  6.  
  7. monthMap = {
  8.         1 : "A",
  9.         2 : "B",
  10.         3 : "C",
  11.         4 : "D",
  12.         5 : "E",
  13.         6 : "H",
  14.         7 : "L",
  15.         8 : "M",
  16.         9 : "P",
  17.         10 : "R",
  18.         11 : "S",
  19.         12 : "T"
  20.     }
  21.  
  22. def conditionInput(inputText, errorText, inputCondition) :
  23.     while True :
  24.         try :
  25.             n = input(inputText)
  26.             if not inputCondition(n) :
  27.                 raise Exception()
  28.             break
  29.         except :
  30.             print(errorText)
  31.             continue
  32.     return n
  33.  
  34. def letterizeMonth(month) :
  35.     return monthMap[month]
  36.  
  37. def numberInput(inputText, errorText, inputCondition) :
  38.     return int(conditionInput(inputText, errorText, \
  39.                           lambda n: n.isdecimal() and inputCondition(int(n))))
  40.  
  41. def reduceName(name) :
  42.     consonants = [i for i in list(name) if i not in ('a', 'e', 'i', 'o', 'u')]
  43.     vowels = [i for i in list(name) if i in ('a', 'e', 'i', 'o', 'u')]
  44.  
  45.     return ("".join(consonants[:3]) if len(consonants) >= 3 else \
  46.             "".join(consonants) + "".join(vowels[:3 - len(consonants)]) \
  47.             if len(vowels) >= 3 - len(consonants) else \
  48.             "".join(consonants + vowels)).upper()
  49.  
  50. class CodeCertifier() :
  51.     DRAW_MAP = {
  52.         "A":0,  0:0,  "K":10,  "T":19,
  53.         "B":1,  1:1,  "L":11,  "U":20,
  54.         "C":2,  2:2,  "L":11,  "V":21,
  55.         "D":3,  3:3,  "M":12,  "W":22,
  56.         "E":4,  4:4,  "N":13,  "X":23,
  57.         "F":5,  5:5,  "O":14,  "Y":24,
  58.         "G":6,  6:6,  "P":15,  "Z":25,
  59.         "H":7,  7:7,  "Q":16,
  60.         "I":8,  8:8,  "R":17,
  61.         "J":9,  9:9,  "S":18
  62.     }
  63.  
  64.     ODD_MAP = {
  65.         "A":1,  0:1,  "K":2,  "T":14,
  66.         "B":0,  1:0,  "S":12, "U":16,
  67.         "C":5,  2:5,  "L":4,  "V":10,
  68.         "D":7,  3:7,  "M":18, "W":22,
  69.         "E":9,  4:9,  "N":20, "X":25,
  70.         "F":13, 5:13, "O":11, "Y":24,
  71.         "G":15, 6:15, "P":3,  
  72.         "H":17, 7:17, "Q":6,
  73.         "I":19, 8:19, "R":8,
  74.         "J":21, 9:21, "Z":25
  75.     }
  76.  
  77.     CH_MAP = {index : letter.upper()  \
  78.               for index, letter in enumerate(ascii_lowercase)}
  79.    
  80.     def calculateCertifyCode(self, code) :
  81.         total = 0
  82.         for i in list(code) :
  83.             if i.isdecimal() : i = int(i)
  84.             if ((code.index(str(i)) + 1) % 2) == 0 :
  85.                 total += self.DRAW_MAP[i]
  86.             else : total += self.ODD_MAP[i]
  87.  
  88.         chc = int(total / 26)
  89.         return self.CH_MAP[chc]
  90.        
  91.        
  92.  
  93. class CitiesScraper() :
  94.     CITIES_URL = "https://raw.githubusercontent.com" + \
  95.                  "/matteocontrini/comuni-json/master/comuni.json"
  96.    
  97.     def __init__(self) :
  98.         r = requests.get(self.CITIES_URL)
  99.         r.raise_for_status()
  100.         self.cities = r.json()
  101.  
  102.     def getRawData(self) :
  103.         return self.cities
  104.  
  105.     def isCityExistent(self, name) :
  106.         for city in self.cities :
  107.             if name.strip().lower() == \
  108.                city["nome"].strip().lower() :
  109.                 return True
  110.         return False
  111.  
  112.     def getCityFromName(self, name) :
  113.         for city in self.cities :
  114.             if name.strip().lower() == \
  115.                city["nome"].strip().lower() :
  116.                 return city
  117.         return None
  118.    
  119. print("Caricamento informazioni sui comuni...")
  120. cities = CitiesScraper()
  121. print("Comuni caricati\n")
  122.  
  123.  
  124. print("CALCOLATORE CODICE FISCALE")
  125. print("by MRtecno98\n")
  126.  
  127.  
  128. surname = input("Inserisci cognome: ")
  129. name = input("Inserisci nome: ")
  130.  
  131.  
  132. print()
  133. print("Inserisci data di nascita:")
  134. day = numberInput("Inserisci giorno: ", \
  135.                   "Inserisci un numero valido", \
  136.                   lambda n: n > 0 and n <= 31)
  137.  
  138. month = numberInput("Inserisci mese: ", \
  139.                     "Inserisci un numero valido", \
  140.                     lambda n: n > 0 and n <= 12)
  141.  
  142. year = numberInput("Inserisci anno: ", \
  143.                   "Inserisci un numero valido", \
  144.                   lambda n: True)
  145.  
  146.  
  147. print()
  148. sex = conditionInput("Inserisci sesso: ", \
  149.                      "Inserisci un sesso valido", \
  150.                      lambda n: n.lower() == "m" or n.lower() == "maschio" or \
  151.                                n.lower() == "f" or n.lower() == "femmina").lower()
  152. sex_ser = MALE if sex == "maschio" or sex == "m" else \
  153.           FEMALE if sex == "femmina" or sex == "f" else None
  154.  
  155.  
  156. print()
  157. city = conditionInput("Inserisci comune: ", \
  158.                       "Inserisci un comune valido", \
  159.                       lambda n: cities.isCityExistent(n))
  160.  
  161. city_code = cities.getCityFromName(city)["codiceCatastale"]
  162.  
  163. print()
  164. print("Calcolo del codice fiscale...")
  165.  
  166. code = (reduceName(surname) + reduceName(name) + \
  167.        "".join(str(year)[2:]) + letterizeMonth(month) + \
  168.        str(day if sex_ser == MALE else day + 40) + city_code).upper()
  169.  
  170. print("Caricamento certificatore...")
  171. certifier = CodeCertifier()
  172. ccode = certifier.calculateCertifyCode(code)
  173.  
  174. code += ccode
  175.  
  176. print()
  177. print("Operazioni Terminate. Codice fiscale: " + code)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement