cydside

Cod Fis Par IVA Validation

Sep 12th, 2026
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.99 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "regexp"
  6.     "strconv"
  7.     "strings"
  8. )
  9.  
  10. // IsValidCodiceFiscale verifica la validità formale e del carattere di controllo
  11. // di un codice fiscale italiano.
  12. // Gestisce anche i caratteri numerici dell'omocodia.
  13. func IsValidCodiceFiscale(cf string) bool {
  14.     cf = strings.ToUpper(strings.TrimSpace(cf))
  15.  
  16.     // Il codice fiscale deve contenere esattamente 16 caratteri
  17.     if len(cf) != 16 {
  18.         return false
  19.     }
  20.  
  21.     // Formato: 6 lettere + 2 cifre + 1 lettera + 2 cifre + 1 lettera + 3 cifre + 1 lettera
  22.     // Sono ammessi i caratteri dell'omocodia nelle posizioni numeriche.
  23.     matched, _ := regexp.MatchString(
  24.         `^[A-Z]{6}[A-Z0-9]{2}[A-Z][A-Z0-9]{2}[A-Z][A-Z0-9]{3}[A-Z]$`,
  25.         cf,
  26.     )
  27.  
  28.     if !matched {
  29.         return false
  30.     }
  31.  
  32.     // Tabella caratteri dispari
  33.     oddValues := map[byte]int{
  34.         '0': 1, '1': 0, '2': 5, '3': 7, '4': 9,
  35.         '5': 13, '6': 15, '7': 17, '8': 19, '9': 21,
  36.         'A': 1, 'B': 0, 'C': 5, 'D': 7, 'E': 9,
  37.         'F': 13, 'G': 15, 'H': 17, 'I': 19, 'J': 21,
  38.         'K': 2, 'L': 4, 'M': 18, 'N': 20, 'O': 11,
  39.         'P': 3, 'Q': 6, 'R': 8, 'S': 12, 'T': 14,
  40.         'U': 16, 'V': 10, 'W': 22, 'X': 25, 'Y': 24,
  41.         'Z': 23,
  42.     }
  43.  
  44.     // Tabella caratteri pari
  45.     evenValues := map[byte]int{
  46.         '0': 0, '1': 1, '2': 2, '3': 3, '4': 4,
  47.         '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
  48.         'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4,
  49.         'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9,
  50.         'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14,
  51.         'P': 15, 'Q': 16, 'R': 17, 'S': 18, 'T': 19,
  52.         'U': 20, 'V': 21, 'W': 22, 'X': 23, 'Y': 24,
  53.         'Z': 25,
  54.     }
  55.  
  56.     sum := 0
  57.  
  58.     // Le posizioni sono numerate da 1 a 15
  59.     for i := 0; i < 15; i++ {
  60.         if (i+1)%2 == 1 {
  61.             sum += oddValues[cf[i]]
  62.         } else {
  63.             sum += evenValues[cf[i]]
  64.         }
  65.     }
  66.  
  67.     expectedControl := byte('A' + (sum % 26))
  68.  
  69.     return cf[15] == expectedControl
  70. }
  71.  
  72. // IsValidPartitaIVA verifica la validità formale e del checksum
  73. // di una Partita IVA italiana.
  74. func IsValidPartitaIVA(piva string) bool {
  75.     piva = strings.TrimSpace(piva)
  76.  
  77.     // Rimuove eventualmente il prefisso internazionale
  78.     piva = strings.ToUpper(piva)
  79.     piva = strings.TrimPrefix(piva, "IT")
  80.  
  81.     // Deve contenere esattamente 11 cifre
  82.     if len(piva) != 11 {
  83.         return false
  84.     }
  85.  
  86.     for _, c := range piva {
  87.         if c < '0' || c > '9' {
  88.             return false
  89.         }
  90.     }
  91.  
  92.     // Algoritmo ufficiale del carattere di controllo:
  93.     // posizione dispari: valore invariato
  94.     // posizione pari: valore * 2, somma delle cifre se > 9
  95.     sum := 0
  96.  
  97.     for i := 0; i < 10; i++ {
  98.         n, _ := strconv.Atoi(string(piva[i]))
  99.  
  100.         // Posizioni numerate da 1 a 10
  101.         if (i+1)%2 == 0 {
  102.             n *= 2
  103.             if n > 9 {
  104.                 n = (n / 10) + (n % 10)
  105.             }
  106.         }
  107.  
  108.         sum += n
  109.     }
  110.  
  111.     checkDigit := (10 - (sum % 10)) % 10
  112.  
  113.     lastDigit, _ := strconv.Atoi(string(piva[10]))
  114.  
  115.     return checkDigit == lastDigit
  116. }
  117.  
  118. func main() {
  119.     fmt.Println(IsValidCodiceFiscale("RSSMRA80A01H501U"))
  120.     // true
  121.  
  122.     fmt.Println(IsValidCodiceFiscale("RSSMRA80A01H501X"))
  123.     // false
  124.  
  125.     fmt.Println(IsValidPartitaIVA("01093321006"))
  126.     // true
  127.  
  128.     fmt.Println(IsValidPartitaIVA("01093321007"))
  129. }
  130.  
Advertisement
Add Comment
Please, Sign In to add comment