Advertisement
NelloRizzo

[VBNET] Classe Person per codice fiscale

Feb 15th, 2017
407
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VB.NET 7.83 KB | None | 0 0
  1. Public Enum SexType As Byte
  2.     Male = 0
  3.     Female = 40
  4. End Enum
  5. Public Class Person
  6.     ' parte pubblica!!! INTERFACCIA PUBBLICA DELLA CLASSE
  7.     Public Property FirstName As String
  8.     Public Property LastName As String
  9.     Public Property Birthday As DateTime
  10.     Public Property Sex As SexType
  11.     Public Property CityOfBirth As String ' ?????
  12.     ' metodo che implementa il business aziendale
  13.     ' per la fornitura del codice fiscale della persona
  14.     Public Function GetFiscalCode() As String
  15.         ' http://www.dotnethell.it/articles/CalcoloCodiceFiscale.aspx
  16.         'E' un codice Alfanumerico (composto da lettere e numeri) di 16 caratteri.
  17.         'I primi 15 sono relativi ai dati personali (nome, cognome, sesso, Data di nascita e luogo di nascita)
  18.         ' mentre l'ultimo è un carattere di controllo che viene calcolato
  19.         ' con delle formule applicate ai precedenti 15 caratteri.        
  20.         Dim cf As New Text.StringBuilder(16)
  21.         '- 3 lettere per il cognome
  22.         cf.Append(HandleLastName())
  23.         '- 3 lettere per il nome
  24.         cf.Append(HandleFirstName())
  25.         '- l'anno di nascita (numero)
  26.         '- il mese della data di nascita (lettera)
  27.         '- il giorno della data di nascita (numero)
  28.         cf.Append(HandleBirthDate())
  29.         '- il codice del comune di nascita
  30.         cf.Append(HandleBirthCity())
  31.         '- il carattere di controllo
  32.         cf.Append(CalcCheckCode(cf.ToString()))
  33.         Return cf.ToString
  34.     End Function
  35.     ' calcola il codice di controllo
  36.     'Si comincia con il prendere i caratteri del codice fiscale fin qui calcolato
  37.     'che sono 15, si prendono quelli In posizione pari e si convertono con i numeri
  38.     'corrispondenti della prima tabella. Tutti questi numeri vengono sommati.
  39.     'Allo stesso modo con i caratteri dispari che devono essere convertiti però
  40.     'utilizzando la seconda tabella e vengono tutti sommati.
  41.     'I valori ottenuti vengono a loro volta sommati e il totale viene diviso per 26.
  42.     'Il resto della divisione dev'essere convertito usando l'ultima tabella.
  43.     'Il carattere corrispondente è il codice di controllo!
  44.     Private Function CalcCheckCode(code As String) As String
  45.         ' i caratteri sono gestiti in una tabella, cosiddetta ASCII
  46.         ' ad ogni carattere è associato un numero
  47.         Dim table() As Integer =
  48.             {1, 0, 5, 7, 9, 13, 15, 17, 19, 21,
  49.             2, 4, 18, 20, 11, 3, 6, 8, 12, 14,
  50.             16, 10, 22, 25, 24, 23}
  51.         Dim sum As Integer = 0
  52.         For index As Integer = 0 To 14
  53.             Dim c As Char = code(index) ' prendo il carattere di posizione index
  54.             If index Mod 2 = 0 Then ' indice posizione dispari
  55.                 If Char.IsLetter(c) Then
  56.                     sum += table(Asc(c) - Asc("A"))
  57.                 Else
  58.                     sum += table(Asc(c) - Asc("0"))
  59.                 End If
  60.             Else ' indice posizione pari
  61.                 If Char.IsLetter(c) Then
  62.                     sum += Asc(c) - Asc("A")
  63.                 Else
  64.                     sum += Asc(c) - Asc("0")
  65.                 End If
  66.             End If
  67.         Next
  68.  
  69.         Return Chr(Asc("A") + sum Mod 26)
  70.     End Function
  71.     ' gestisce la città di nascita
  72.     Private Function HandleBirthCity() As String
  73.         Return CityOfBirth.ToUpper
  74.     End Function
  75.     ' gestisce la data di nascita
  76.     'Anno di nascita
  77.     'Per l 'anno vengono prese semplicemente le ultime due cifre.
  78.     'Esempio:
  79.     'Anno: 1970 - Codice Anno: 70
  80.     'Mese
  81.     'Per quanto riguarda il mese c'è una tabella di conversione che riportiamo qui di seguito. Ad ogni mese corrisponde una lettera dell'alfabeto:
  82.     'ABCDEHLMPRST
  83.     'Giorno
  84.     'In questo caso è sufficiente riportare il numero del giorno, con il particolare che per le donne questo numero dev'essere aumentato di 40!
  85.     'Esempi:
  86.     'Uomo nato il : 22/10/1980 - Codice Giorno: 22
  87.     'Donna nata il : 22/10/1980 - Codice Giorno: 62
  88.     Private Function HandleBirthDate() As String
  89.         Dim d = Birthday.Day + Sex 'sex.male = 0, sex.female = 40!!!!
  90.         Dim m = Birthday.Month
  91.         Dim table = "ABCDEHLMPRST"
  92.         Return String.Format("{0:yy}{1}{2:00}", Birthday, table(m - 1), d)
  93.     End Function
  94.     ' gestisce il nome
  95.     'Per il nome il discorso è analogo con la particolarità che
  96.     'se il nome è composto da 4 o più consonanti vengono prese
  97.     'nell'ordine la prima, la terza e la quarta.
  98.     'Anche qui potremmo trovarci nella situazione di un numero di consonanti minore di 3 e allo stesso modo si aggiungo le vocali.
  99.     'Ripetiamo anche qui che se il nome è più corto di 3 lettere è possibile sostituire i caratteri mancanti con delle X.
  100.     'Se il nome fosse composto da più nomi, bisogna considerarlo tutto assieme.
  101.     'Esempi:
  102.     '(Normale) Nome "MARTA" - Codice Nome: "MRT"
  103.     '(Solo due consonanti) Nome : "SALA" - Codice Nome : "SLA"
  104.     '(Nome minore di 3 car.) Nome: "AL" - Codice Nome : "LAX"
  105.     '(Nome composto) Nome : "MARIA PIA" - Codice Nome : "MRP"
  106.     Private Function HandleFirstName() As String
  107.         Dim cv = SeparateLetters(FirstName)
  108.         If cv.Consonants.Length > 3 Then ' se il nome ha più di 3 consonanti
  109.             ' prendo la prima, salto la seconda e prendo le altre dalla terza in poi
  110.             cv.Consonants = cv.Consonants(0) & cv.Consonants.Substring(2)
  111.         End If
  112.         Return String.Format("{0}{1}XXX", cv.Consonants, cv.Vowels).Substring(0, 3)
  113.     End Function
  114.     ' gestisce il cognome
  115.     ' Sono necessarie come detto prima 3 caratteri per rappresentare il cognome, e sono la prima la seconda e la terza consonante del cognome.
  116.     ' E' possibile che le consonanti siano meno di tre, in questo caso è possibile aggiungere le vocali nell'ordine in cui compaiono nel cognome.
  117.     ' Per cognomi più corti di 3 caratteri, è possibile sostituire il carattere mancante con la lettera X.
  118.     ' Chiaramente se ci sono cognomi con più parti, è necessario rimuovere gli spazi e considerare tutto come un cognome unico.
  119.     '
  120.     ' Esempi:
  121.     ' (Normale) Cognome  "ROSSI" - Codice Cognome : "RSS"
  122.     ' (Solo due consonanti) Cognome : "RIVA" - Codice Cognome : "RVI"
  123.     ' (Cognome minore di 3 car.) Cognome : "RE" - Codice Cognome : "REX"
  124.     ' (Cognome composto) Cognome : "DE CRESCENZO" - Codice Cognome : "DCR"
  125.     Private Function HandleLastName() As String
  126.         ' mi servono le consonanti e le vocali del cognome
  127.         ' suppongo di demandare ad un metodo la separazione di consonanti
  128.         ' e vocali
  129.         Dim cv = SeparateLetters(LastName)
  130.         Return String.Format("{0}{1}XXX", cv.Consonants, cv.Vowels).Substring(0, 3)
  131.     End Function
  132.     ' struttura che veicola due informazioni diverse
  133.     ' utilizzata come tipo di risultato della funzione
  134.     Private Structure ConsonantsVowels
  135.         Public Property Consonants As String
  136.         Public Property Vowels As String
  137.     End Structure
  138.     'separa le consonanti dalle vocali
  139.     Private Function SeparateLetters(text As String) As ConsonantsVowels
  140.         Dim result As New ConsonantsVowels
  141.         For Each c As Char In text.ToUpperInvariant
  142.             If Char.IsLetter(c) Then ' controllo se c è una lettera
  143.                 If "AEIOU".Contains(c) Then ' controllo se è una vocale
  144.                     result.Vowels &= c ' aggiungo c alle vocali
  145.                 Else
  146.                     result.Consonants &= c ' aggiungo c alle consonanti
  147.                 End If
  148.             End If
  149.         Next
  150.         Return result
  151.     End Function
  152.  
  153.     ' sovrascrive i metodi di Object
  154.     Public Overrides Function ToString() As String
  155.         Return String.Format("{0} {1} ({2} - {3:d})",
  156.                              FirstName,
  157.                              LastName,
  158.                              Sex.ToString.Substring(0, 1),
  159.                              Birthday)
  160.     End Function
  161. End Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement