Skip to content

squeeze69/generacodicefiscale

Repository files navigation

Generazione codice fiscale in GO

package: github.com/squeeze69/generacodicefiscale

Disponibile come modulo

--- NON si danno garanzie ---

dipende dal package codicefiscale

Uso:

package main

import (
    "github.com/squeeze69/generacodicefiscale"
    "fmt"
    "log"
)

func main() {
    codicecitta,erc := generacodicefiscale.CercaComune("Milano")
    if erc != nil {
        log.Fatal(erc)
    }
    fmt.Println(codicecitta)
    cf,erg := generacodicefiscale.Genera("Cognome","Nome","M",codicecitta.Codice,"2017-05-1")
    if erg != nil {
        log.Fatal(erg)
    }
    fmt.Println(cf)
}

Note:

  • Per la corretta generazione del codice fiscale vengono rimossi gli accenti dalle vocali accentate, al momento sono supportate solo le "èéàùìò" (maiuscole o minuscole)

  • La ricerca del comune avviene tramite CercaComune ed il nome esatto della città (non importano spazi, vocali accentate od altri simboli, la chiave di ricerca viene "normalizzata")

  • Per ricerche più sofisticate, è a disposizione Cittacod []Cittacodice, definito in "comuni.go", è ordinato per "CoIdx", ottenuto rimuovendo gli accenti e tutto quel che non è un carattere alfabetico.

  • Per cercare la nazione, prego, iterare su Nazionecod []Nazionecodice, definito in "nazioni.go"

  • Se si vuole ri-scaricare l'elenco dei comuni e delle nazioni fate "go generate", se tutto andrà bene "nazioni.go" e "comuni.go" verranno rigenerati, anche se ==NON== è consigliato di farlo per la nazione, attualmente il file da cui venivano prese le informazioni è stato modificato togliendo i suddetti codici. Sto lavorando ad una soluzione.

  • Sono inclusi i comuni soppressi (diventati, nella maggior parte dei casi, frazioni), poiché il CF dovrebbe tenere conto dell'esistenza del comune al momento della nascita.

  • Un pezzo di codice interessante, Codici Fiscali a parte, per avere almeno un piccolo indizio di quanto sia comodo e potente GO, è la (brutta) funzione qua sotto scarica l'archivio zip (in memoria), poi fa una scansione dei file presenti finché non trova un file con ".csv" nel nome (potrebbe controllare che finisca per .csv, ma visto lo scopo molto preciso e l'uso di nomi stile windows/dos (nome.estensione), basta ed avanza), la funzione si trova in "scaricanazioni.go".

//leggiCSVinZIP : legge il primo csv contenuto in uno zip file scaricato al volo in memoria
func leggiCSVinZIP(url string) (data []byte, err error) {

    r, er := http.Get(url)
    if er != nil {
        log.Fatal(er)
    }
    defer r.Body.Close()
    tutto, er := io.ReadAll(r.Body)
    if er != nil {
        log.Fatal(er)
    }
    zipR, er := zip.NewReader(bytes.NewReader(tutto), int64(len(tutto)))
    if er != nil {
        log.Fatal(er)
    }

    // cerca il CSV
    for _, zipf := range zipR.File {
        if strings.Contains(strings.ToLower(zipf.Name), ".csv") {
            zf, er := zipf.Open()
            if er != nil {
                log.Fatal(er)
            }
            defer zf.Close()
            return io.ReadAll(zf)
        }
    }
    return nil, errors.New("non è stato trovato niente")
}

About

Generazione Codice Fiscale formato Italiano

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages