//BCHJOB JOB(JCODFIS) JOBD(NERONI2/NERONI2) OUTQ(QPRINT) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* Open source scaricabile da www.neroni.it */ /* LA JOB DESCRIPTION "NERONI2/NERONI2" DEVE PREESISTERE. PUO' ESSERE */ /* IDENTICA A QBATCH E PUO' ESSERE SOSTITUITA DA QBATCH O SIMILE. */ /* From System: "S65D69DA" */ /* From Library: "NERONI2" */ /* Unload Time: 2015-07-23 16:50 */ /* To File : "JCODFIS" */ /* To Library : "NERONI2" */ /* To Text : "Controlla Codice Fiscale. Src" */ /********* INIZIO ISTRUZIONI *******************************************/ /* LE SUCCESSIVE ISTRUZIONI PERMETTONO DI RICARICARE I SORGENTI. */ /* 1) DA UN VIDEO COMANDI DELL'AS400 RICEVENTE */ /* CREARE UN FILE SORGENTE DI LUNGHEZZA RECORD 112: */ /* CRTSRCPF FILE(NERONI2/STRINGHE) RCDLEN(112) */ /* 2) SPOSTARE IL FILE "JCODFIS.txt" NELL'INDIRIZZARIO */ /* DI UN PC CONNESSO IN RETE CON L'AS400 RICEVENTE */ /* (AD ES.: "c:\"). */ /* 3) DAL VIDEO COMANDI DEL PC CHIAMARE FTP: */ /* ftp nomeas400 */ /* 4) DIGITARE UTENTE E PASSWORD. */ /* 5) ESEGUIRE IL COMANDO DI COPIA DA FILE PC A MEMBRO AS400: */ /* put "c:\JCODFIS.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JCODFIS.mbr" */ /* 6) ABBANDONARE FTP: */ /* quit */ /* 7) DA UN VIDEO COMANDI DELL'AS400 RICEVENTE */ /* ESEGUIRE LA STRINGA COPIATA NEL MEMBRO SORGENTE: */ /* SBMDBJOB FILE(NERONI2/STRINGHE) MBR(JCODFIS) JOBQ(QBATCH) */ /* LE SUCCESSIVE ISTRUZIONI PERMETTONO DI CREARE L'UTILITY. */ /* 8) DA UN VIDEO COMANDI DELL'AS400 RICEVENTE */ /* ESEGUIRE LA STRINGA O LE STRINGHE SORGENTE DI TIPO SEU "CL" */ /* (IL CUI NOME TERMINA SEMPRE CON ".") */ /* PRESENTI NEL FILE RICARICATO "NERONI2/JCODFIS" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JCODFIS) MBR(JCODFIS.) JOBQ(QBATCH) */ /********* FINE ISTRUZIONI *********************************************/ /* Crea la libreria. */ MKDIR DIR('/qsys.lib/NERONI2.lib') CHGLIB LIB(NERONI2) TEXT('Utility di Claudio Neroni') /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP NERONI2 QGPL) /* Crea il file sorgente. */ DLTF FILE(NERONI2/JCODFIS) CRTSRCPF FILE(NERONI2/JCODFIS) RCDLEN(112) + TEXT('Controlla Codice Fiscale. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCODFIS) TOFILE(NERONI2/JCODFIS) + TOMBR(JCODFIS) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCODFIS) MBR(JCODFIS) + SRCTYPE(CMD) + TEXT('Controlla codice fiscale. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCODFIS.) TOFILE(NERONI2/JCODFIS) + TOMBR(JCODFIS.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCODFIS) MBR(JCODFIS.) + SRCTYPE(CL) + TEXT('Controlla codice fiscale. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCODFISC) TOFILE(NERONI2/JCODFIS) + TOMBR(JCODFISC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCODFIS) MBR(JCODFISC) + SRCTYPE(CLLE) + TEXT('Controlla codice fiscale. Cpp') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCODFISD) TOFILE(NERONI2/JCODFIS) + TOMBR(JCODFISD) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCODFIS) MBR(JCODFISD) + SRCTYPE(RPGLE) + TEXT('Controlla codice fiscale. Exe') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCODFISD.0) TOFILE(NERONI2/JCODFIS) + TOMBR(JCODFISD.0) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCODFIS) MBR(JCODFISD.0) + SRCTYPE(RPGLE) + TEXT('Controlla codice fiscale. Exe ORIGINALE') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCODFISP) TOFILE(NERONI2/JCODFIS) + TOMBR(JCODFISP) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCODFIS) MBR(JCODFISP) + SRCTYPE(PNLGRP) + TEXT('Controlla codice fiscale. Help') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCODFISS) TOFILE(NERONI2/JCODFIS) + TOMBR(JCODFISS) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCODFIS) MBR(JCODFISS) + SRCTYPE(RPGLE) + TEXT('Controlla codice fiscale. Sample') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCODFIS2) TOFILE(NERONI2/JCODFIS) + TOMBR(JCODFIS2) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCODFIS) MBR(JCODFIS2) + SRCTYPE(RPGLE) + TEXT('Controlla Codice Fiscale. ExeAlter') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCODFIS2.0) TOFILE(NERONI2/JCODFIS) + TOMBR(JCODFIS2.0) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCODFIS) MBR(JCODFIS2.0) + SRCTYPE(RPGLE) + TEXT('Controlla Codice Fiscale. ExeAlter ORIGINALE') /*---------------------------------------------------------------------*/ //DATA FILE(JCODFIS) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Controlla codice fiscale. */ /* Claudio Neroni 12-11-1981 Creato. */ CMD PROMPT('Controlla codice fiscale') PARM KWD(CODFIS) TYPE(*CHAR) LEN(16) MIN(1) + PROMPT('Codice fiscale') //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JCODFIS.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JCODFIS.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* Claudio Neroni 12-11-1981 Creato. */ /* JCODFIS */ /* Controlla codice fiscale. */ /* Prerequisiti: nessuno */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella gli oggetti preesistenti. */ DLTCMD CMD(NERONI2/JCODFIS) DLTCMD CMD(QGPL/JCODFIS) DLTPGM PGM(NERONI2/JCODFISC) DLTPGM PGM(NERONI2/JCODFISD) DLTPGM PGM(QGPL/JCODFISD) DLTPGM PGM(NERONI2/JCODFIS2) /* Crea il testo d'aiuto. */ CRTPNLGRP PNLGRP(NERONI2/JCODFISP) SRCFILE(JCODFIS) /* Crea il comando. */ CRTCMD CMD(NERONI2/JCODFIS) PGM(NERONI2/JCODFISC) + SRCFILE(JCODFIS) HLPPNLGRP(JCODFISP) HLPID(CMD) + PRDLIB(NERONI2) CRTCMD CMD(QGPL/JCODFIS) PGM(NERONI2/JCODFISC) SRCFILE(JCODFIS) + HLPPNLGRP(JCODFISP) HLPID(CMD) PRDLIB(NERONI2) /* Crea il command processing program. */ CRTBNDCL PGM(NERONI2/JCODFISC) SRCFILE(JCODFIS) TGTRLS(*CURRENT) + DBGVIEW(*ALL) /* Crea l'esecutore. */ CRTBNDRPG PGM(NERONI2/JCODFISD) SRCFILE(JCODFIS) DBGVIEW(*ALL) + TGTRLS(*CURRENT) CRTBNDRPG PGM(QGPL/JCODFISD) SRCFILE(JCODFIS) DBGVIEW(*ALL) + TGTRLS(*CURRENT) /* Crea l'esempio di chiamata. */ CRTBNDRPG PGM(NERONI2/JCODFISS) SRCFILE(JCODFIS) DBGVIEW(*ALL) + TGTRLS(*CURRENT) /* Crea l'alternativo. */ CRTBNDRPG PGM(NERONI2/JCODFIS2) SRCFILE(JCODFIS) DBGVIEW(*ALL) + TGTRLS(*CURRENT) //ENDBCHJOB //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JCODFISC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Claudio Neroni 12-11-1981 Creato. */ /* Controlla codice fiscale. */ /* */ PGM PARM(&CODFIS) DCL VAR(&CODFIS) TYPE(*CHAR) LEN(16) DCL VAR(&FISICA) TYPE(*LGL) DCL VAR(&OMONIM) TYPE(*LGL) DCL VAR(&SINTAX) TYPE(*LGL) DCL VAR(&CHKDIG) TYPE(*LGL) DCL VAR(&MSG) TYPE(*CHAR) LEN(132) ALLINEA: IF COND((&CODFIS *NE ' ') *AND (%SST(&CODFIS 16 + 1) *EQ ' ')) THEN(DO) CHGVAR VAR(&CODFIS) VALUE(' ' *CAT %SST(&CODFIS 1 15)) GOTO CMDLBL(ALLINEA) ENDDO CALL PGM(JCODFISD) PARM(&CODFIS &FISICA &OMONIM + &SINTAX &CHKDIG) IF COND(*NOT &SINTAX *AND *NOT &CHKDIG) + THEN(CHGVAR VAR(&MSG) VALUE(&MSG *TCAT + 'Controllo ok.')) IF COND(&FISICA) THEN(CHGVAR VAR(&MSG) + VALUE(&MSG *TCAT 'Persona fisica.')) IF COND(&OMONIM) THEN(CHGVAR VAR(&MSG) + VALUE(&MSG *TCAT 'Omonimo.')) IF COND(&SINTAX) THEN(CHGVAR VAR(&MSG) + VALUE(&MSG *TCAT 'Errore sintassi.')) IF COND(*NOT &SINTAX *AND &CHKDIG) THEN(CHGVAR + VAR(&MSG) VALUE(&MSG *TCAT 'Errore + carattere controllo.')) SNDPGMMSG MSG(&MSG) ENDPGM //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JCODFISD) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /TITLE Controlla il codice fiscale. * Claudio Neroni 12-11-1981 Creato. * * Il codice fiscale può essere di due tipi. * Il primo di 16 caratteri è quello definitivo * delle persone fisiche. * Il secondo di 11 caratteri si riferisce al provvisorio * delle persone fisiche e al provvisorio e definitivo delle * persone non fisiche. * * Il programma calcola il carattere di controllo del codice * fiscale ricevuto e lo confronta con il carattere di controllo * contenuto nel codice stesso. * CN01 * Claudio Neroni 23-07-2015 Modificato CN01 * Vista la pratica invalsa anche in altri pgm sul web, ad esempio CN01 * http://www.nonsolocap.it/codice-fiscale/controllo/ , CN01 * permette ora la sostituzione indiscriminata dei numeri CN01 * con le lettere equivalenti senza più pretendere che tutti i numeri CN01 * a destra della prima sostituzione siano anch'essi sostituiti. * *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * Testo che ha originato il presente programma. *------------------------------------------------------------------- * * D.M.23 dicembre 1976:Sistemi di codificazione dei * soggetti da iscrivere all'anagrafe tributaria (Suppl. * ord.alla Gazzetta Ufficiale n.345 del 29 dicembre * 1976). * Art. 1 * Sistemi di codificazione * Le persone fisiche,le persone giuridiche e le società, * associazione ed altre organizzazioni di persone o di * beni prive di personalità giuridica sono iscritte all'ana- * grafe tributaria secondo appositi sistemi di codificazione. * Art. 2 * Numero di codice fiscale delle persone fisiche * Il numero di codice fiscale delle persone fisiche é * costituito da una espressione alfanumerica di sedici * caratteri. * I primi quindici caratteri sono indicativi dei dati a- * nagrafici di ciascun soggetto secondo l'ordine seguente: * tre caratteri alfabetici per il cognome; * tre caratteri alfabetici per il nome; * due caratteri numerici per l'anno di nascita; * un carattere alfabetico per il mese di nascita; * due caratteri numerici per il giorno di nascita ed il * sesso; * quattro caratteri(uno alfabetico e tre numerici)per * il comune italiano o per lo Stato estero di nascita. * Il sedicesimo carattere,alfabetico,ha la funzione di * controllo. * Art. 3 * Caratteri indicativi del cognome * I cognomi che risultano composti da più parti o co- * munque separati od interrotti, vengono considerati * come se fossero scritti secondo un'unica ed ininterrot- * ta successione di caratteri. * Per i soggetti di sesso femminile coniugati si prende * in considerazione soltanto il cognome da nubile. * Se il cognome contiene tre o più consonanti,i tre * caratteri da rilevare sono,nell'ordine,la prima,la se- * conda e la terza consonante. * Se il cognome contiene due consonanti,i tre carat- * teri da rilevare sono,nell'ordine,la prima e la seconda * consonante e la prima vocale. * Se il cognome contiene una consonante e due voca- * li,si rilevano,nell'ordine,quella consonante e quindi la * prima e la seconda vocale. * Se il cognome contiene una consonante e una voca- * le,si rilevano la consonante e la vocale,nell'ordine,e * si assume come terzo carattere la lettera x(ics). * Se il cognome é costituito da due sole vocali,esse si * rilevano,nell'ordine,e si assume come terzo carattere * la lettera x(ics). * Art. 4 * Caratteri indicativi del nome * I nomi doppi, multipli o comunque composti, ven- * gono considerati come scritti per esteso in ogni loro * parte e secondo un'unica ed ininterrotta successione di * caratteri. * Se il nome contiene quattro o più consonanti i tre * caratteri da rilevare sono,nell'ordine,la prima, la ter- * za e la quarta consonante. * Se il nome contiene tre consonanti,i tre caratteri da * rilevare sono,nell'ordine,la prima,la seconda e la ter- * za consonante. * Se il nome contiene due consonanti,i tre caratteri * da rilevare sono,nell'ordine,la prima e la seconda * consonante e la prima vocale. * Se il nome contiene una consonante e due vocali,i * tre caratteri da rilevare sono,nell'ordine,quella conso- * nante e quindi la prima e la seconda vocale. * Se il nome contiene una consonante e una vocale,si * rilevano la consonante e la vocale,nell'ordine,e si as- * sume come terzo carattere la lettera x(ics). * Se il nome é costituito da due sole vocali,esse si ri- * levano nell'ordine,e si assume come terzo carattere la * lettera x(ics). * Art. 5 * Data,sesso e luogo di nascita * I due caratteri numerici indicativi dell'anno di na- * scita sono,nell'ordine,la cifra delle decine e la cifra * dell'unità dell'anno stesso. * Il carattere alfabetico corrisponde al mese di na- * scita é quello stabilito per ciascun mese nella seguente * tabella: * Gennaio = A Luglio = L * Febbraio = B Agosto = M * Marzo = C Settembre = P * Aprile = D Ottobre = R * Maggio = E Novembre = S * Giugno = H Dicembre = T * I due caratteri numerici indicativi del giorno di na- * scita e del sesso vengono determinati nel modo se- * guente: * per i soggetti maschili il giorno di nascita figura in- * variato, con i numeri da uno a trentuno, facendo pre- * cedere dalla cifra zero i giorni del mese dall'uno al no- * ve. Per i soggetti femminili il giorno di nascita viene * aumentato di quaranta unità, per cui esso figura con i * numeri da quarantuno a settantuno. * I quattro caratteri alfanumerici indicativi del comu- * ne italiano o dello Stato estero di nascita,costituiti da * un carattere alfabetico seguito da tre caratteri numeri- * ci,si rilevano rispettivamente dal volume "Codice dei * comuni d'Italia" o dal volume "Codice degli Stati este- * ri" redatti a cura della Direzione generale del catasto * e dei servizi tecnici erariali * All'aggiornamento dei volumi di cui al precedente * comma provvede la Direzione generale del catasto e * dei servizi tecnici erariali * Art. 6 * Persone fisiche con identica espressione alfanumerica * Quando l'espressione alfanumerica relativa ai primi * quindici caratteri del codice risulta comune a due o * tre soggetti,si provvede a differenziarla per ciascuno * dei soggetti successivi al primo soggetto codificato. A * tal fine,si effettuano,nell'ambito di sette caratteri nu- * merici contenuti nel codice,sistematiche sostituzioni * di una o più cifre a partire da quella di destra,con cor- * rispondenti caratteri alfabetici secondo la seguente ta- * bella: * 0 = L 4 = Q 7 = T * 1 = M 5 = R 8 = U * 2 = N 6 = S 9 = V * 3 = P * Art. 7 * Carattere alfabetico di controllo * Il sedicesimo carattere ha funzione di controllo del * l'esatta trascrizione dei primi quindici caratteri.Esso * viene determinato nel modo seguente: ciascuno degli * anzidetti quindici caratteri ,a seconda che occupi posi- * zione di ordine pari o posizione di ordine dispari,viene * convertito in un valore numerico in base alle corri- * spondenze indicate rispettivamente ai successivi punti * 1) e 2). * 1) Per la conversione dei sette caratteri con posi- * zione di ordine pari: * A o zero = zero O = 14 * B o 1 = 1 P = 15 * C o 2 = 2 Q = 16 * D o 3 = 3 R = 17 * E o 4 = 4 S = 18 * F o 5 = 5 T = 19 * G o 6 = 6 U = 20 * H o 7 = 7 V = 21 * I o 8 = 8 W = 22 * J o 9 = 9 X = 23 * K = 10 Y = 24 * L = 11 Z = 25 * M = 12 _ _ * N = 13 _ _ * 2) Per la conversione degli otto caratteri con posi- * zione di ordine dispari: * A o zero = 1 O = 11 * B o 1 = 0 P = 3 * C o 2 = 5 Q = 6 * D o 3 = 7 R = 8 * E o 4 = 9 S = 12 * F o 5 = 13 T = 14 * G o 6 = 15 U = 16 * H o 7 = 17 V = 10 * I o 8 = 19 W = 22 * J o 9 = 21 X = 25 * K = 2 Y = 24 * L = 4 Z = 23 * M = 18 _ _ * N = 20 _ _ * I valori numerici cosi determinati vengono addizio- * nati e la somma si divide per numero 26. * Il carattere di controllo si ottiene convertendo il re- * sto di tale divisione nel carattere alfabetico ad esso * corrispondente nella sottoindicata tabella: * zero = A 9 = J 18 = S * 1 = B 10 = K 19 = T * 2 = C 11 = L 20 = U * 3 = D 12 = M 21 = V * 4 = E 13 = N 22 = W * 5 = F 14 = O 23 = X * 6 = G 15 = P 24 = Y * 7 = H 16 = Q 25 = Z * 8 = I 17 = R _ _ * Art. 8 * Numero di codice fiscale dei soggetti diversi dalle per- * sone fisiche * Il numero di codice fiscale dei soggetti diversi dalle * persone fisiche è costituito da una espressione numeri- * ca di undici cifre.Le prime sette cifre rappresentano il * numero di matricola del soggetto nell'ambito della * provincia in cui ha sede l'ufficio che attribuisce il nu- * mero di codice fiscale;esso si ottiene, per ciascun sog- * getto, incrementando di una unità il numero di matri- * cola stabilito per il soggetto che immediatamente lo * precede. * Le tre cifre dall'ottava alla decima rappresentano il * codice identificativo della provincia in cui ha sede l'uf- * ficio che attribuisce il numero di codice fiscale. * L'undicesimo carattere ha funzione di controllo del * l'esatta trascrizione delle prime dieci cifre. * Art. 9 * Carattere numerico di controllo * Il carattere di controllo viene determinato nel modo * seguente; * si sommano i valori di ciascuna delle cinque cifre di * ordine dispari partendo da sinistra; * si raddoppia ogni cifra di ordine pari e se il risulta- * to è un numero di due cifre,esso si riduce ad una sola * sommando la cifra relativa alle decina e quella relativa * alle unità; si sommano quindi tutti i precedenti risulta- * ti; * si determina il totale delle due somme di cui sopra; * si sottrae da dieci la cifra relativa alle unità del pre- * cedente totale. Il carattere di controllo è la cifra relati- * va alle unità del risultato. * Art. 10 * Numero di codice fiscale provvisorio * L'Amministrazione finanziaria può attribuire un * numero di codice fiscale provvisorio. * Il numero di codice fiscale provvisorio delle persone * fisiche ha struttura e composizione uguali a quelle di * al precedente art.8. Le prime sette cifre rappresen- * tano il numero di matricola del soggetto; le cifre dal * l'ottava alla decima identificano l'ufficio che attribui- * sce il numero di codice fiscale provvisorio e l'undicesi- * ma è il carattere di controllo, che viene determinato * con le modalità di cui all'art.9. * Ha inoltre validità di numero di codice fiscale prov- * visorio il numero di codice fiscale attribuito a soggetti * persone fisiche,avente struttura e composizione con- * formi agli artt. da 2 a 7 del presente decreto,in corri- * spondenza del quale siano errati uno o più dati ana- * grafici che concorrono alla formazione del numero di * codice fiscale stesso.Si applicano in tal caso le dispo- * sizione di cui dagli artt.5 secondo comma,e 19 del * D.P.R. 2 novembre 1976 n.784. * Il numero di codice fiscale provvisorio dei soggetti * diversi dalle persone fisiche ha struttura uguale a quel- * la del numero di codice fiscale definitivo. * *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * Definizioni. *------------------------------------------------------------------- * Codice fiscale ricevuto spezzato nei suoi caratteri. D CX S 1 DIM(16) Cod fis comodo * Codice fiscale di comodo. * Le cifre che negli omonimi sono sostituite da lettere * sono qui ripristinate. D SN S 1 DIM(16) CTDATA PERRCD(16) Sintassi * Sintassi del codice fiscale definitivo di persona fisica. * Il singolo elemento di schiera vale 0 se il corrispondente * elemento del codice fiscale deve essere un carattere * alfabetico. Vale invece 1 per carattere numerico. D NU S 2 0 DIM(15) Numeri * Numeri di lavoro. * Ognuno dei primi 15 caratteri del codice fiscale definitivo * di persona fisica genera nel corrispondente elemento * della schiera numeri un proprio peso. D CP S 1 DIM(36) CTDATA PERRCD(36) Caratteri permess * Caratteri permessi nel codice fiscale definitivo * di persona fisica. D LN S 1 DIM(36) CTDATA PERRCD(36) Lettera o numero * Per ognuno dei caratteri permessi viene codificata la * caratteristica alfabetica con 0 o la caratteristica * numerica con 1. D PA S 2 0 DIM(36) CTDATA PERRCD(36) Pari * Peso da attribuire ai caratteri permessi che nel * codice fiscale definitivo di persona fisica hanno * posizione pari. D DI S 2 0 DIM(36) CTDATA PERRCD(36) Dispari * Peso da attribuire ai caratteri permessi che nel * codice fiscale definitivo di persona fisica hanno * posizione dispari. D ME S 1 DIM(12) CTDATA PERRCD(12) Mese di nascita * Lettere permesse nella posizione significativa * del mese di nascita. D TN S 1 DIM(10) CTDATA PERRCD(10) Numeri/Lettere D TL S 1 DIM(10) ALT(TN) * Le cifre TN sono, per gli omonimi, sostituite dalle lettere TL. D CFDS DS * Spezzamenti di comodo del codice fiscale in immissione. D CF 1 16 D DIM(16) Codice fiscale D CF0105 1 5 D CF0615 6 15 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * Routine principale. *------------------------------------------------------------------- * Scambia parametri. * Riceve il codice fiscale da esaminare. * Restituisce 1 in FISICA se esegue il controllo per * persona fisica. * Restituisce 1 in OMONIM se durante il controllo per persona * fisica riscontra dalla sintassi trattarsi di un omonimo. * L'indicazione non viene data se il codice viene giudicato * in errore. * Restituisce 1 in SINTAX se riscontra errore di sintassi. * Restituisce 1 in CHKDIG se riscontra errore nel carattere * di controllo. * L'indicatore di errore nel carattere di controllo viene * sempre acceso anche per errore di sintassi perché * il carattere di controllo non ha senso in presenza di * un errore di sintassi. C *ENTRY PLIST C PARM CFDS I Codice fiscal C PARM FISICA 1 O Persona fisic C PARM OMONIM 1 O Omonimo C PARM SINTAX 1 O Error sintass C PARM CHKDIG 1 O Errore chkdig * Inizializza i parametri di ritorno. C MOVE *ZERO FISICA C MOVE *ZERO OMONIM C MOVE *ZERO SINTAX C MOVE *ZERO CHKDIG * Se il primo carattere del codice fiscale è diverso da blank, * lo considera un codice definitivo di persona fisica ed esegue * l'apposita routine di controllo. * Altrimenti esegue la routine di controllo degli altri tipi * di codice. C CF(1) COMP *BLANK 5858 C 58 MOVE '1' FISICA C 58 EXSR FIDE C N58 EXSR ALTI C GOTO FINE * Label di fine con errore di sintassi. C FINESN TAG C MOVE '1' SINTAX * Label di fine con errore sul carattere di controllo. C FINECD TAG C MOVE '1' CHKDIG C MOVE *ZERO OMONIM * Label di fine felice. C FINE TAG C RETURN *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C FIDE BEGSR * Controlla il codice fiscale definitivo di persona fisica. *------------------------------------------------------------------- * Riempie il codice fiscale di comodo. C MOVE CF CX * Cerca nell'apposita schiera la lettera significativa * del mese di nascita. * Se non la trova, termina subito con errore di sintassi. C CF(9) LOOKUP ME 50 C N50 GOTO FINESN * Spegne l'indicatore di posizione pari e quello di impedita * sostituzione. C SETOFF 5155 * Esamina la schiera del codice fiscale partendo dal quindicesimo * carattere e tornando al primo. C DO 15 X 3 0 C 16 SUB X XC 3 0 * Cerca il carattere tra i caratteri permessi. C Z-ADD 1 Y 3 0 C CF(XC) LOOKUP CP(Y) 50 * Se non lo trova, termina subito con errore di sintassi. C N50 GOTO FINESN * Se il carattere ha posizione pari, gli attribuisce * il peso prelevato dall'apposita schiera. C 51 Z-ADD PA(Y) NU(XC) * Se il carattere ha posizione dispari, gli attribuisce * il peso prelevato dall'apposita schiera. C N51 Z-ADD DI(Y) NU(XC) * Trascrive in un indicatore che il controllo di sintassi, * nella posizione corrente del codice fiscale, vuole * un carattere numerico (57 on) o alfabetico (57 off). C MOVE SN(XC) *IN57 * Quando, durante l'esplorazione del codice da destra * a sinistra, viene incontrato il primo carattere numerico, * annota con 55 on che non è più permesso che un carattere * chiesto numerico dal controllo di sintassi sia invece * alfabetico. Si ricorda che la sostituzione di un carattere * numerico con uno alfabetico riguarda le persone che altrimenti * avrebbero il medesimo codice fiscale di un'altra persona * con gli stessi dati anagrafici. C N55 MOVE LN(Y) *IN55 * Mette on 56 se il carattere non rispetta la sintassi. C SN(XC) COMP LN(Y) 5656 * Se nella posizione esaminata il controllo di sintassi vuole * un carattere numerico e ne trova invece uno alfabetico * ma tale sostituzione è permessa dal fatto che a destra del * carattere esaminato non ci sono caratteri numerici, * annota che si tratta di un omonimo, * esegue la routine di sostituzione * ed evita di terminare in errore. C** 57 C**AN 56 C**ANN55 DO C* if *in57 and *in56 and (not *in55) CN01 * Eliminato obbligo di tutte lettere dopo prima sostituzione numero. C if *in57 and *in56 C MOVE '1' OMONIM C EXSR SOST C GOTO FIDEOL C END * Altrimenti, per carattere irriguardoso della sintassi, * termina subito con errore di sintassi. C 56 GOTO FINESN C FIDEOL TAG * Manovra il flip flop dell'indicatore 51 che caratterizza * la posizione dispari (51 off) o pari (51 on). C *IN51 COMP *ZERO 51 * Fine del ciclo ripetitivo. C END * Il giorno di nascita, dopo eventuali sostituzioni di lettere * con cifre corrispondenti, deve essere compreso tra 01 e 31 * oppure tra 41 e 71. * Altrimenti termina subito con errore di sintassi. C MOVEA CX(10) A2 2 C A2 COMP '01' 50 50 C 50A2 COMP '31' 5050 C N50 DO C A2 COMP '41' 50 50 C 50A2 COMP '71' 5050 C END C N50 GOTO FINESN * Somma i numeri espressivi del peso assegnato a ciascun carattere * durante il ciclo ripetitivo. C XFOOT NU IND 5 0 * Divide per il numero dei possibili caratteri di controllo, * conserva il resto e tramite questo individua l'indice * di accesso alla schiera dei caratteri permessi che, * in questa occasione e in parte, diventa la schiera dei caratteri * di controllo permessi. C IND DIV 26 IND C MVR IND C ADD 1 IND * Se il carattere di controllo calcolato non coincide con il * carattere di controllo ricevuto, termina subito con errore * sul carattere di controllo. C CP(IND) CABNE CF(16) FINECD C ENDSR *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C SOST BEGSR * Sostituisce le lettere con cifre. *------------------------------------------------------------------- * Cerca la lettera sostitutrice di numero in una schiera apposita * e, se non la trova, termina subito con errore di sintassi. C Z-ADD 1 Z 3 0 C CF(XC) LOOKUP TL(Z) 50 C N50 GOTO FINESN * Nel codice fiscale di comodo sostituisce alla lettera * il numero corrispondente. C MOVE TN(Z) CX(XC) C ENDSR *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C ALTI BEGSR * Controlla gli altri tipi di codice fiscale. * Codice fiscale provvisorio di persona fisica. * Codice fiscale provvisorio e definitivo di persona non fisica. *------------------------------------------------------------------- * I primi 5 caratteri devono essere in bianco, i successivi 10 * devono essere numerici e l'ultimo uguale al carattere calcolato * dalla presente routine. C CF0105 CABNE *BLANK FINESN C TESTN CF0615 50 C N50 GOTO FINESN C CF(15) CABLT *ZERO FINESN * Rifiuta anche 10 zeri allineati a destra. C CF0615 CABEQ *ZERO FINESN * Azzera l'accumulatore dei risultati parziali. C Z-ADD *ZERO IND * Spegne l'indicatore di posizione pari. C SETOFF 51 * Esamina la schiera del codice fiscale dal sesto al quindicesimo * carattere. C 6 DO 15 X * Trascrive il carattere in un campo numerico di una posizione. C MOVE CF(X) N1 1 0 * Se il carattere ha posizione dispari, lo somma nell'accumulatore. C N51 ADD N1 IND * Se il carattere ha posizione pari, * lo moltiplica per due e somma nell'accumulatore * ciascuna delle due cifre ottenute. C 51 DO C N1 ADD N1 N2 2 0 C MOVEL N2 N1 C ADD N1 IND C MOVE N2 N1 C ADD N1 IND C END * Manovra il flip flop dell'indicatore 51 che caratterizza * la posizione dispari (51 off) o pari (51 on). C *IN51 COMP *ZERO 51 * Fine del ciclo ripetitivo. C END * Preleva l'ultima cifra dell'accumulatore. C MOVE IND N1 * Ne fa il complemento a 10. C 10 SUB N1 N1 * Trascrive la cifra calcolata in un campo alfanumerico. C MOVE N1 A1 1 * Se il carattere di controllo trovato non coincide con il * carattere di controllo ricevuto, termina subito con errore. C A1 CABNE CF(16) FINECD C ENDSR ** SN Sintassi codice. 0=carattere alfabetico, 1=carattere numerico. 0000001101101110 ** CP Caratteri permessi. ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ** LN Caratteristica alfabetica o numerica dei caratteri permessi. 000000000000000000000000001111111111 ** PA Valori da attribuire ai caratteri di posizione pari. 000102030405060708091011121314151617181920212223242500010203040506070809 ** DI Valori da attribuire ai caratteri di posizione dispari. 010005070913151719210204182011030608121416102225242301000507091315171921 ** ME Lettere permesse nella posizione del mese di nascita. ABCDEHLMPRST ** TN/TL Le cifre sono, per gli omonimi, sostituite dalle lettere accoppiate. 0L1M2N3P4Q5R6S7T8U9V //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JCODFISD.0) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /TITLE Controlla il codice fiscale. * * RPG §CODFIS. * * Controlla il codice fiscale. * * Il codice fiscale può essere di due tipi. * Il primo di 16 caratteri è quello definitivo * delle persone fisiche. * Il secondo di 11 caratteri si riferisce al provvisorio * delle persone fisiche e al provvisorio e definitivo delle * persone non fisiche. * * Il programma calcola il carattere di controllo del codice * fiscale ricevuto e lo confronta con il carattere di controllo * contenuto nel codice stesso. * /EJECT *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * Testo che ha originato il presente programma. *------------------------------------------------------------------- * * D.M.23 dicembre 1976:Sistemi di codificazione dei * soggetti da iscrivere all'anagrafe tributaria (Suppl. * ord.alla Gazzetta Ufficiale n.345 del 29 dicembre * 1976). * Art. 1 * Sistemi di codificazione * Le persone fisiche,le persone giuridiche e le società, * associazione ed altre organizzazioni di persone o di * beni prive di personalità giuridica sono iscritte all'ana- * grafe tributaria secondo appositi sistemi di codificazione. * Art. 2 * Numero di codice fiscale delle persone fisiche * Il numero di codice fiscale delle persone fisiche é * costituito da una espressione alfanumerica di sedici * caratteri. * I primi quindici caratteri sono indicativi dei dati a- * nagrafici di ciascun soggetto secondo l'ordine seguente: * tre caratteri alfabetici per il cognome; * tre caratteri alfabetici per il nome; * due caratteri numerici per l'anno di nascita; * un carattere alfabetico per il mese di nascita; * due caratteri numerici per il giorno di nascita ed il * sesso; * quattro caratteri(uno alfabetico e tre numerici)per * il comune italiano o per lo Stato estero di nascita. * Il sedicesimo carattere,alfabetico,ha la funzione di * controllo. * Art. 3 * Caratteri indicativi del cognome * I cognomi che risultano composti da più parti o co- * munque separati od interrotti, vengono considerati * come se fossero scritti secondo un'unica ed ininterrot- * ta successione di caratteri. * Per i soggetti di sesso femminile coniugati si prende * in considerazione soltanto il cognome da nubile. * Se il cognome contiene tre o più consonanti,i tre * caratteri da rilevare sono,nell'ordine,la prima,la se- * conda e la terza consonante. * Se il cognome contiene due consonanti,i tre carat- * teri da rilevare sono,nell'ordine,la prima e la seconda * consonante e la prima vocale. * Se il cognome contiene una consonante e due voca- * li,si rilevano,nell'ordine,quella consonante e quindi la * prima e la seconda vocale. * Se il cognome contiene una consonante e una voca- * le,si rilevano la consonante e la vocale,nell'ordine,e * si assume come terzo carattere la lettera x(ics). * Se il cognome é costituito da due sole vocali,esse si * rilevano,nell'ordine,e si assume come terzo carattere * la lettera x(ics). * Art. 4 * Caratteri indicativi del nome * I nomi doppi, multipli o comunque composti, ven- * gono considerati come scritti per esteso in ogni loro * parte e secondo un'unica ed ininterrotta successione di * caratteri. * Se il nome contiene quattro o più consonanti i tre * caratteri da rilevare sono,nell'ordine,la prima, la ter- * za e la quarta consonante. * Se il nome contiene tre consonanti,i tre caratteri da * rilevare sono,nell'ordine,la prima,la seconda e la ter- * za consonante. * Se il nome contiene due consonanti,i tre caratteri * da rilevare sono,nell'ordine,la prima e la seconda * consonante e la prima vocale. * Se il nome contiene una consonante e due vocali,i * tre caratteri da rilevare sono,nell'ordine,quella conso- * nante e quindi la prima e la seconda vocale. * Se il nome contiene una consonante e una vocale,si * rilevano la consonante e la vocale,nell'ordine,e si as- * sume come terzo carattere la lettera x(ics). * Se il nome é costituito da due sole vocali,esse si ri- * levano nell'ordine,e si assume come terzo carattere la * lettera x(ics). * Art. 5 * Data,sesso e luogo di nascita * I due caratteri numerici indicativi dell'anno di na- * scita sono,nell'ordine,la cifra delle decine e la cifra * dell'unità dell'anno stesso. * Il carattere alfabetico corrisponde al mese di na- * scita é quello stabilito per ciascun mese nella seguente * tabella: * Gennaio = A Luglio = L * Febbraio = B Agosto = M * Marzo = C Settembre = P * Aprile = D Ottobre = R * Maggio = E Novembre = S * Giugno = H Dicembre = T * I due caratteri numerici indicativi del giorno di na- * scita e del sesso vengono determinati nel modo se- * guente: * per i soggetti maschili il giorno di nascita figura in- * variato, con i numeri da uno a trentuno, facendo pre- * cedere dalla cifra zero i giorni del mese dall'uno al no- * ve. Per i soggetti femminili il giorno di nascita viene * aumentato di quaranta unità, per cui esso figura con i * numeri da quarantuno a settantuno. * I quattro caratteri alfanumerici indicativi del comu- * ne italiano o dello Stato estero di nascita,costituiti da * un carattere alfabetico seguito da tre caratteri numeri- * ci,si rilevano rispettivamente dal volume "Codice dei * comuni d'Italia" o dal volume "Codice degli Stati este- * ri" redatti a cura della Direzione generale del catasto * e dei servizi tecnici erariali * All'aggiornamento dei volumi di cui al precedente * comma provvede la Direzione generale del catasto e * dei servizi tecnici erariali * Art. 6 * Persone fisiche con identica espressione alfanumerica * Quando l'espressione alfanumerica relativa ai primi * quindici caratteri del codice risulta comune a due o * tre soggetti,si provvede a differenziarla per ciascuno * dei soggetti successivi al primo soggetto codificato. A * tal fine,si effettuano,nell'ambito di sette caratteri nu- * merici contenuti nel codice,sistematiche sostituzioni * di una o più cifre a partire da quella di destra,con cor- * rispondenti caratteri alfabetici secondo la seguente ta- * bella: * 0 = L 4 = Q 7 = T * 1 = M 5 = R 8 = U * 2 = N 6 = S 9 = V * 3 = P * Art. 7 * Carattere alfabetico di controllo * Il sedicesimo carattere ha funzione di controllo del * l'esatta trascrizione dei primi quindici caratteri.Esso * viene determinato nel modo seguente: ciascuno degli * anzidetti quindici caratteri ,a seconda che occupi posi- * zione di ordine pari o posizione di ordine dispari,viene * convertito in un valore numerico in base alle corri- * spondenze indicate rispettivamente ai successivi punti * 1) e 2). * 1) Per la conversione dei sette caratteri con posi- * zione di ordine pari: * A o zero = zero O = 14 * B o 1 = 1 P = 15 * C o 2 = 2 Q = 16 * D o 3 = 3 R = 17 * E o 4 = 4 S = 18 * F o 5 = 5 T = 19 * G o 6 = 6 U = 20 * H o 7 = 7 V = 21 * I o 8 = 8 W = 22 * J o 9 = 9 X = 23 * K = 10 Y = 24 * L = 11 Z = 25 * M = 12 _ _ * N = 13 _ _ * 2) Per la conversione degli otto caratteri con posi- * zione di ordine dispari: * A o zero = 1 O = 11 * B o 1 = 0 P = 3 * C o 2 = 5 Q = 6 * D o 3 = 7 R = 8 * E o 4 = 9 S = 12 * F o 5 = 13 T = 14 * G o 6 = 15 U = 16 * H o 7 = 17 V = 10 * I o 8 = 19 W = 22 * J o 9 = 21 X = 25 * K = 2 Y = 24 * L = 4 Z = 23 * M = 18 _ _ * N = 20 _ _ * I valori numerici cosi determinati vengono addizio- * nati e la somma si divide per numero 26. * Il carattere di controllo si ottiene convertendo il re- * sto di tale divisione nel carattere alfabetico ad esso * corrispondente nella sottoindicata tabella: * zero = A 9 = J 18 = S * 1 = B 10 = K 19 = T * 2 = C 11 = L 20 = U * 3 = D 12 = M 21 = V * 4 = E 13 = N 22 = W * 5 = F 14 = O 23 = X * 6 = G 15 = P 24 = Y * 7 = H 16 = Q 25 = Z * 8 = I 17 = R _ _ * Art. 8 * Numero di codice fiscale dei soggetti diversi dalle per- * sone fisiche * Il numero di codice fiscale dei soggetti diversi dalle * persone fisiche è costituito da una espressione numeri- * ca di undici cifre.Le prime sette cifre rappresentano il * numero di matricola del soggetto nell'ambito della * provincia in cui ha sede l'ufficio che attribuisce il nu- * mero di codice fiscale;esso si ottiene, per ciascun sog- * getto, incrementando di una unità il numero di matri- * cola stabilito per il soggetto che immediatamente lo * precede. * Le tre cifre dall'ottava alla decima rappresentano il * codice identificativo della provincia in cui ha sede l'uf- * ficio che attribuisce il numero di codice fiscale. * L'undicesimo carattere ha funzione di controllo del * l'esatta trascrizione delle prime dieci cifre. * Art. 9 * Carattere numerico di controllo * Il carattere di controllo viene determinato nel modo * seguente; * si sommano i valori di ciascuna delle cinque cifre di * ordine dispari partendo da sinistra; * si raddoppia ogni cifra di ordine pari e se il risulta- * to è un numero di due cifre,esso si riduce ad una sola * sommando la cifra relativa alle decina e quella relativa * alle unità; si sommano quindi tutti i precedenti risulta- * ti; * si determina il totale delle due somme di cui sopra; * si sottrae da dieci la cifra relativa alle unità del pre- * cedente totale. Il carattere di controllo è la cifra relati- * va alle unità del risultato. * Art. 10 * Numero di codice fiscale provvisorio * L'Amministrazione finanziaria può attribuire un * numero di codice fiscale provvisorio. * Il numero di codice fiscale provvisorio delle persone * fisiche ha struttura e composizione uguali a quelle di * al precedente art.8. Le prime sette cifre rappresen- * tano il numero di matricola del soggetto; le cifre dal * l'ottava alla decima identificano l'ufficio che attribui- * sce il numero di codice fiscale provvisorio e l'undicesi- * ma è il carattere di controllo, che viene determinato * con le modalità di cui all'art.9. * Ha inoltre validità di numero di codice fiscale prov- * visorio il numero di codice fiscale attribuito a soggetti * persone fisiche,avente struttura e composizione con- * formi agli artt. da 2 a 7 del presente decreto,in corri- * spondenza del quale siano errati uno o più dati ana- * grafici che concorrono alla formazione del numero di * codice fiscale stesso.Si applicano in tal caso le dispo- * sizione di cui dagli artt.5 secondo comma,e 19 del * D.P.R. 2 novembre 1976 n.784. * Il numero di codice fiscale provvisorio dei soggetti * diversi dalle persone fisiche ha struttura uguale a quel- * la del numero di codice fiscale definitivo. * /EJECT *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * Definizioni. *------------------------------------------------------------------- * Codice fiscale ricevuto spezzato nei suoi caratteri. D CX S 1 DIM(16) Cod fis comodo * Codice fiscale di comodo. * Le cifre che negli omonimi sono sostituite da lettere * sono qui ripristinate. D SN S 1 DIM(16) CTDATA PERRCD(16) Sintassi * Sintassi del codice fiscale definitivo di persona fisica. * Il singolo elemento di schiera vale 0 se il corrispondente * elemento del codice fiscale deve essere un carattere * alfabetico. Vale invece 1 per carattere numerico. D NU S 2 0 DIM(15) Numeri * Numeri di lavoro. * Ognuno dei primi 15 caratteri del codice fiscale definitivo * di persona fisica genera nel corrispondente elemento * della schiera numeri un proprio peso. D CP S 1 DIM(36) CTDATA PERRCD(36) Caratteri permess * Caratteri permessi nel codice fiscale definitivo * di persona fisica. D LN S 1 DIM(36) CTDATA PERRCD(36) Lettera o numero * Per ognuno dei caratteri permessi viene codificata la * caratteristica alfabetica con 0 o la caratteristica * numerica con 1. D PA S 2 0 DIM(36) CTDATA PERRCD(36) Pari * Peso da attribuire ai caratteri permessi che nel * codice fiscale definitivo di persona fisica hanno * posizione pari. D DI S 2 0 DIM(36) CTDATA PERRCD(36) Dispari * Peso da attribuire ai caratteri permessi che nel * codice fiscale definitivo di persona fisica hanno * posizione dispari. D ME S 1 DIM(12) CTDATA PERRCD(12) Mese di nascita * Lettere permesse nella posizione significativa * del mese di nascita. D TN S 1 DIM(10) CTDATA PERRCD(10) Numeri/Lettere D TL S 1 DIM(10) ALT(TN) * Le cifre TN sono, per gli omonimi, sostituite dalle lettere TL. D CFDS DS * Spezzamenti di comodo del codice fiscale in immissione. D CF 1 16 D DIM(16) Codice fiscale D CF0105 1 5 D CF0615 6 15 C EJECT TAG /EJECT *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * Routine principale. *------------------------------------------------------------------- * Scambia parametri. * Riceve il codice fiscale da esaminare. * Restituisce 1 in FISICA se esegue il controllo per * persona fisica. * Restituisce 1 in OMONIM se durante il controllo per persona * fisica riscontra dalla sintassi trattarsi di un omonimo. * L'indicazione non viene data se il codice viene giudicato * in errore. * Restituisce 1 in SINTAX se riscontra errore di sintassi. * Restituisce 1 in CHKDIG se riscontra errore nel carattere * di controllo. * L'indicatore di errore nel carattere di controllo viene * sempre acceso anche per errore di sintassi perché * il carattere di controllo non ha senso in presenza di * un errore di sintassi. C *ENTRY PLIST C PARM CFDS I Codice fiscal C PARM FISICA 1 O Persona fisic C PARM OMONIM 1 O Omonimo C PARM SINTAX 1 O Error sintass C PARM CHKDIG 1 O Errore chkdig * Inizializza i parametri di ritorno. C MOVE *ZERO FISICA C MOVE *ZERO OMONIM C MOVE *ZERO SINTAX C MOVE *ZERO CHKDIG * Se il primo carattere del codice fiscale è diverso da blank, * lo considera un codice definitivo di persona fisica ed esegue * l'apposita routine di controllo. * Altrimenti esegue la routine di controllo degli altri tipi * di codice. C CF(1) COMP *BLANK 5858 C 58 MOVE '1' FISICA C 58 EXSR FIDE C N58 EXSR ALTI C GOTO FINE * Label di fine con errore di sintassi. C FINESN TAG C MOVE '1' SINTAX * Label di fine con errore sul carattere di controllo. C FINECD TAG C MOVE '1' CHKDIG C MOVE *ZERO OMONIM * Label di fine felice. C FINE TAG C RETURN /EJECT *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C FIDE BEGSR * Controlla il codice fiscale definitivo di persona fisica. *------------------------------------------------------------------- * Riempie il codice fiscale di comodo. C MOVE CF CX * Cerca nell'apposita schiera la lettera significativa * del mese di nascita. * Se non la trova, termina subito con errore di sintassi. C CF(9) LOOKUP ME 50 C N50 GOTO FINESN * Spegne l'indicatore di posizione pari e quello di impedita * sostituzione. C SETOFF 5155 * Esamina la schiera del codice fiscale partendo dal quindicesimo * carattere e tornando al primo. C DO 15 X 3 0 C 16 SUB X XC 3 0 * Cerca il carattere tra i caratteri permessi. C Z-ADD 1 Y 3 0 C CF(XC) LOOKUP CP(Y) 50 * Se non lo trova, termina subito con errore di sintassi. C N50 GOTO FINESN * Se il carattere ha posizione pari, gli attribuisce * il peso prelevato dall'apposita schiera. C 51 Z-ADD PA(Y) NU(XC) * Se il carattere ha posizione dispari, gli attribuisce * il peso prelevato dall'apposita schiera. C N51 Z-ADD DI(Y) NU(XC) * Trascrive in un indicatore che il controllo di sintassi, * nella posizione corrente del codice fiscale, vuole * un carattere numerico (57 on) o alfabetico (57 off). C MOVE SN(XC) *IN57 * Quando, durante l'esplorazione del codice da destra * a sinistra, viene incontrato il primo carattere numerico, * annota con 55 on che non è più permesso che un carattere * chiesto numerico dal controllo di sintassi sia invece * alfabetico. Si ricorda che la sostituzione di un carattere * numerico con uno alfabetico riguarda le persone che altrimenti * avrebbero il medesimo codice fiscale di un'altra persona * con gli stessi dati anagrafici. C N55 MOVE LN(Y) *IN55 * Mette on 56 se il carattere non rispetta la sintassi. C SN(XC) COMP LN(Y) 5656 * Se nella posizione esaminata il controllo di sintassi vuole * un carattere numerico e ne trova invece uno alfabetico * ma tale sostituzione è permessa dal fatto che a destra del * carattere esaminato non ci sono caratteri numerici, * annota che si tratta di un omonimo, * esegue la routine di sostituzione * ed evita di terminare in errore. C 57 CAN 56 CANN55 DO C MOVE '1' OMONIM C EXSR SOST C GOTO FIDEOL C END * Altrimenti, per carattere irriguardoso della sintassi, * termina subito con errore di sintassi. C 56 GOTO FINESN C FIDEOL TAG * Manovra il flip flop dell'indicatore 51 che caratterizza * la posizione dispari (51 off) o pari (51 on). C *IN51 COMP *ZERO 51 * Fine del ciclo ripetitivo. C END * Il giorno di nascita, dopo eventuali sostituzioni di lettere * con cifre corrispondenti, deve essere compreso tra 01 e 31 * oppure tra 41 e 71. * Altrimenti termina subito con errore di sintassi. C MOVEA CX(10) A2 2 C A2 COMP '01' 50 50 C 50A2 COMP '31' 5050 C N50 DO C A2 COMP '41' 50 50 C 50A2 COMP '71' 5050 C END C N50 GOTO FINESN * Somma i numeri espressivi del peso assegnato a ciascun carattere * durante il ciclo ripetitivo. C XFOOT NU IND 5 0 * Divide per il numero dei possibili caratteri di controllo, * conserva il resto e tramite questo individua l'indice * di accesso alla schiera dei caratteri permessi che, * in questa occasione e in parte, diventa la schiera dei caratteri * di controllo permessi. C IND DIV 26 IND C MVR IND C ADD 1 IND * Se il carattere di controllo calcolato non coincide con il * carattere di controllo ricevuto, termina subito con errore * sul carattere di controllo. C CP(IND) CABNE CF(16) FINECD C ENDSR /EJECT *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C SOST BEGSR * Sostituisce le lettere con cifre. *------------------------------------------------------------------- * Cerca la lettera sostitutrice di numero in una schiera apposita * e, se non la trova, termina subito con errore di sintassi. C Z-ADD 1 Z 3 0 C CF(XC) LOOKUP TL(Z) 50 C N50 GOTO FINESN * Nel codice fiscale di comodo sostituisce alla lettera * il numero corrispondente. C MOVE TN(Z) CX(XC) C ENDSR /EJECT *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C ALTI BEGSR * Controlla gli altri tipi di codice fiscale. * Codice fiscale provvisorio di persona fisica. * Codice fiscale provvisorio e definitivo di persona non fisica. *------------------------------------------------------------------- * I primi 5 caratteri devono essere in bianco, i successivi 10 * devono essere numerici e l'ultimo uguale al carattere calcolato * dalla presente routine. C CF0105 CABNE *BLANK FINESN C TESTN CF0615 50 C N50 GOTO FINESN C CF(15) CABLT *ZERO FINESN * Rifiuta anche 10 zeri allineati a destra. C CF0615 CABEQ *ZERO FINESN * Azzera l'accumulatore dei risultati parziali. C Z-ADD *ZERO IND * Spegne l'indicatore di posizione pari. C SETOFF 51 * Esamina la schiera del codice fiscale dal sesto al quindicesimo * carattere. C 6 DO 15 X * Trascrive il carattere in un campo numerico di una posizione. C MOVE CF(X) N1 1 0 * Se il carattere ha posizione dispari, lo somma nell'accumulatore. C N51 ADD N1 IND * Se il carattere ha posizione pari, * lo moltiplica per due e somma nell'accumulatore * ciascuna delle due cifre ottenute. C 51 DO C N1 ADD N1 N2 2 0 C MOVEL N2 N1 C ADD N1 IND C MOVE N2 N1 C ADD N1 IND C END * Manovra il flip flop dell'indicatore 51 che caratterizza * la posizione dispari (51 off) o pari (51 on). C *IN51 COMP *ZERO 51 * Fine del ciclo ripetitivo. C END * Preleva l'ultima cifra dell'accumulatore. C MOVE IND N1 * Ne fa il complemento a 10. C 10 SUB N1 N1 * Trascrive la cifra calcolata in un campo alfanumerico. C MOVE N1 A1 1 * Se il carattere di controllo trovato non coincide con il * carattere di controllo ricevuto, termina subito con errore. C A1 CABNE CF(16) FINECD C ENDSR ** Sintassi codice. 0=carattere alfabetico, 1=carattere numerico. 0000001101101110 ** Caratteri permessi. ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ** Caratteristica alfabetica o numerica dei caratteri permessi. 000000000000000000000000001111111111 ** Valori da attribuire ai caratteri di posizione pari. 000102030405060708091011121314151617181920212223242500010203040506070809 ** Valori da attribuire ai caratteri di posizione dispari. 010005070913151719210204182011030608121416102225242301000507091315171921 ** Lettere permesse nella posizione del mese di nascita. ABCDEHLMPRST ** Le cifre sono, per gli omonimi, sostituite dalle lettere accoppiate. 0L1M2N3P4Q5R6S7T8U9V //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JCODFISP) FILETYPE(*SRC) ENDCHAR('//ENDSRC') :PNLGRP. .*--------------------------------------------------------------------- :HELP NAME=CMD. :H3.Comando JCODFIS :H2.Controlla il codice fiscale ricevuto. :P.Il comando permette di verificare la validita' formale del codice fiscale ricevuto. :P.Riguardo alla forma del codice fiscale: :XMP. * Il codice fiscale puo' essere di due tipi. * Il primo di 16 caratteri e' quello definitivo * delle persone fisiche. * Il secondo di 11 caratteri si riferisce al provvisorio * delle persone fisiche e al provvisorio e definitivo delle * persone non fisiche. * * Il programma calcola il carattere di controllo del codice * fiscale ricevuto e lo confronta con il carattere di controllo * contenuto nel codice stesso. :EXMP. :P.Esempio di istruzioni di chiamata del programma di controllo che deve giacere in QGPL. Le istruzioni qui riportate in modo disgraziato, sono copiabili dal sorgente RPGLE JCODFISS . :XMP. * Controlla il codice fiscale. * Riceve il codice fiscale da esaminare i JCFCOD. * Restituisce 1 in JCFFIS se esegue il controllo per persona * fisica. * Restituisce 1 in JCFOMO se durante il controllo per persona * fisica riscontra dalla sintassi trattarsi di un omonimo. * L'indicazione non viene data se il codice viene giudicato * in errore. * Restituisce 1 in JCFSIN se riscontra errore di sintassi. * Restituisce 1 in JCFCHK se riscontra errore nel carattere * di controllo. * L'indicatore di errore nel carattere di controllo viene * sempre acceso anche per errore di sintassi perché * il carattere di controllo non ha senso in presenza di * un errore di sintassi. C CALL 'JCODFISD' C PARM JCFCOD 16 I Codice fiscale C PARM JCFFIS 1 O Persona fisica C PARM JCFOMO 1 O Omonimo C PARM JCFSIN 1 O Errore sintassi C PARM JCFCHK 1 O Errore chkdig :EXMP. :P.Si riporta il testo che ha generato il presente programma. :XMP. * D.M.23 dicembre 1976: Sistemi di codificazione dei * soggetti da iscrivere all'anagrafe tributaria (Suppl. * ord. alla Gazzetta Ufficiale n.345 del 29 dicembre * 1976). * Art. 1 * Sistemi di codificazione * Le persone fisiche, le persone giuridiche e le societa', * associazione ed altre organizzazioni di persone o di * beni prive di personalita' giuridica sono iscritte all'ana- * grafe tributaria secondo appositi sistemi di codificazione. * Art. 2 * Numero di codice fiscale delle persone fisiche * Il numero di codice fiscale delle persone fisiche e' * costituito da una espressione alfanumerica di sedici * caratteri. * I primi quindici caratteri sono indicativi dei dati a- * nagrafici di ciascun soggetto secondo l'ordine seguente: * tre caratteri alfabetici per il cognome; * tre caratteri alfabetici per il nome; * due caratteri numerici per l'anno di nascita; * un carattere alfabetico per il mese di nascita; * due caratteri numerici per il giorno di nascita ed il * sesso; * quattro caratteri (uno alfabetico e tre numerici) per * il comune italiano o per lo Stato estero di nascita. * Il sedicesimo carattere, alfabetico, ha la funzione di * controllo. * Art. 3 * Caratteri indicativi del cognome * I cognomi che risultano composti da piu' parti o co- * munque separati od interrotti, vengono considerati * come se fossero scritti secondo un'unica ed ininterrot- * ta successione di caratteri. * Per i soggetti di sesso femminile coniugati si prende * in considerazione soltanto il cognome da nubile. * Se il cognome contiene tre o piu' consonanti, i tre * caratteri da rilevare sono, nell'ordine, la prima, la se- * conda e la terza consonante. * Se il cognome contiene due consonanti, i tre carat- * teri da rilevare sono, nell'ordine, la prima e la seconda * consonante e la prima vocale. * Se il cognome contiene una consonante e due voca- * li, si rilevano, nell'ordine, quella consonante e quindi la * prima e la seconda vocale. * Se il cognome contiene una consonante e una voca- * le, si rilevano la consonante e la vocale, nell'ordine, e * si assume come terzo carattere la lettera x(ics). * Se il cognome e' costituito da due sole vocali, esse si * rilevano, nell'ordine, e si assume come terzo carattere * la lettera x(ics). * Art. 4 * Caratteri indicativi del nome * I nomi doppi, multipli o comunque composti, ven- * gono considerati come scritti per esteso in ogni loro * parte e secondo un'unica ed ininterrotta successione di * caratteri. * Se il nome contiene quattro o piu' consonanti i tre * caratteri da rilevare sono, nell'ordine, la prima, la ter- * za e la quarta consonante. * Se il nome contiene tre consonanti, i tre caratteri da * rilevare sono, nell'ordine, la prima, la seconda e la ter- * za consonante. * Se il nome contiene due consonanti, i tre caratteri * da rilevare sono, nell'ordine, la prima e la seconda * consonante e la prima vocale. * Se il nome contiene una consonante e due vocali, i * tre caratteri da rilevare sono, nell'ordine, quella conso- * nante e quindi la prima e la seconda vocale. * Se il nome contiene una consonante e una vocale, si * rilevano la consonante e la vocale, nell'ordine, e si as- * sume come terzo carattere la lettera x(ics). * Se il nome e' costituito da due sole vocali, esse si ri- * levano nell'ordine, e si assume come terzo carattere la * lettera x(ics). * Art. 5 * Data, sesso e luogo di nascita * I due caratteri numerici indicativi dell'anno di na- * scita sono, nell'ordine, la cifra delle decine e la cifra * dell'unita' dell'anno stesso. * Il carattere alfabetico corrisponde al mese di na- * scita e' quello stabilito per ciascun mese nella seguente * tabella: * Gennaio = A Luglio = L * Febbraio = B Agosto = M * Marzo = C Settembre = P * Aprile = D Ottobre = R * Maggio = E Novembre = S * Giugno = H Dicembre = T * I due caratteri numerici indicativi del giorno di na- * scita e del sesso vengono determinati nel modo se- * guente: * per i soggetti maschili il giorno di nascita figura in- * variato, con i numeri da uno a trentuno, facendo pre- * cedere dalla cifra zero i giorni del mese dall'uno al no- * ve. Per i soggetti femminili il giorno di nascita viene * aumentato di quaranta unita', per cui esso figura con i * numeri da quarantuno a settantuno. * I quattro caratteri alfanumerici indicativi del comu- * ne italiano o dello Stato estero di nascita, costituiti da * un carattere alfabetico seguito da tre caratteri numeri- * ci, si rilevano rispettivamente dal volume "Codice dei * comuni d'Italia" o dal volume "Codice degli Stati este- * ri" redatti a cura della Direzione generale del catasto * e dei servizi tecnici erariali * All'aggiornamento dei volumi di cui al precedente * comma provvede la Direzione generale del catasto e * dei servizi tecnici erariali * Art. 6 * Persone fisiche con identica espressione alfanumerica * Quando l'espressione alfanumerica relativa ai primi * quindici caratteri del codice risulta comune a due o * tre soggetti, si provvede a differenziarla per ciascuno * dei soggetti successivi al primo soggetto codificato. A * tal fine, si effettuano, nell'ambito di sette caratteri nu- * merici contenuti nel codice, sistematiche sostituzioni * di una o piu' cifre a partire da quella di destra, con cor- * rispondenti caratteri alfabetici secondo la seguente ta- * bella: * 0 = L 4 = Q 7 = T * 1 = M 5 = R 8 = U * 2 = N 6 = S 9 = V * 3 = P * Art. 7 * Carattere alfabetico di controllo * Il sedicesimo carattere ha funzione di controllo del * l'esatta trascrizione dei primi quindici caratteri. Esso * viene determinato nel modo seguente: ciascuno degli * anzidetti quindici caratteri, a seconda che occupi posi- * zione di ordine pari o posizione di ordine dispari, viene * convertito in un valore numerico in base alle corri- * spondenze indicate rispettivamente ai successivi punti * 1) e 2). * 1) Per la conversione dei sette caratteri con posi- * zione di ordine pari: * A o zero = zero O = 14 * B o 1 = 1 P = 15 * C o 2 = 2 Q = 16 * D o 3 = 3 R = 17 * E o 4 = 4 S = 18 * F o 5 = 5 T = 19 * G o 6 = 6 U = 20 * H o 7 = 7 V = 21 * I o 8 = 8 W = 22 * J o 9 = 9 X = 23 * K = 10 Y = 24 * L = 11 Z = 25 * M = 12 _ _ * N = 13 _ _ * 2) Per la conversione degli otto caratteri con posi- * zione di ordine dispari: * A o zero = 1 O = 11 * B o 1 = 0 P = 3 * C o 2 = 5 Q = 6 * D o 3 = 7 R = 8 * E o 4 = 9 S = 12 * F o 5 = 13 T = 14 * G o 6 = 15 U = 16 * H o 7 = 17 V = 10 * I o 8 = 19 W = 22 * J o 9 = 21 X = 25 * K = 2 Y = 24 * L = 4 Z = 23 * M = 18 _ _ * N = 20 _ _ * I valori numerici cosi determinati vengono addizio- * nati e la somma si divide per numero 26. * Il carattere di controllo si ottiene convertendo il re- * sto di tale divisione nel carattere alfabetico ad esso * corrispondente nella sottoindicata tabella: * zero = A 9 = J 18 = S * 1 = B 10 = K 19 = T * 2 = C 11 = L 20 = U * 3 = D 12 = M 21 = V * 4 = E 13 = N 22 = W * 5 = F 14 = O 23 = X * 6 = G 15 = P 24 = Y * 7 = H 16 = Q 25 = Z * 8 = I 17 = R _ _ * Art. 8 * Numero di codice fiscale dei soggetti diversi dalle per- * sone fisiche * Il numero di codice fiscale dei soggetti diversi dalle * persone fisiche e' costituito da una espressione numeri- * ca di undici cifre. Le prime sette cifre rappresentano il * numero di matricola del soggetto nell'ambito della * provincia in cui ha sede l'ufficio che attribuisce il nu- * mero di codice fiscale; esso si ottiene, per ciascun sog- * getto, incrementando di una unita' il numero di matri- * cola stabilito per il soggetto che immediatamente lo * precede. * Le tre cifre dall'ottava alla decima rappresentano il * codice identificativo della provincia in cui ha sede l'uf- * ficio che attribuisce il numero di codice fiscale. * L'undicesimo carattere ha funzione di controllo del * l'esatta trascrizione delle prime dieci cifre. * Art. 9 * Carattere numerico di controllo * Il carattere di controllo viene determinato nel modo * seguente; * si sommano i valori di ciascuna delle cinque cifre di * ordine dispari partendo da sinistra; * si raddoppia ogni cifra di ordine pari e se il risulta- * to e' un numero di due cifre, esso si riduce ad una sola * sommando la cifra relativa alle decina e quella relativa * alle unita'; si sommano quindi tutti i precedenti risulta- * ti; * si determina il totale delle due somme di cui sopra; * si sottrae da dieci la cifra relativa alle unita' del pre- * cedente totale. Il carattere di controllo e' la cifra relati- * va alle unita' del risultato. * Art. 10 * Numero di codice fiscale provvisorio * L'Amministrazione finanziaria puo' attribuire un * numero di codice fiscale provvisorio. * Il numero di codice fiscale provvisorio delle persone * fisiche ha struttura e composizione uguali a quelle di * al precedente art.8. Le prime sette cifre rappresen- * tano il numero di matricola del soggetto; le cifre dal * l'ottava alla decima identificano l'ufficio che attribui- * sce il numero di codice fiscale provvisorio e l'undicesi- * ma e' il carattere di controllo, che viene determinato * con le modalita' di cui all'art.9. * Ha inoltre validita' di numero di codice fiscale prov- * visorio il numero di codice fiscale attribuito a soggetti * persone fisiche, avente struttura e composizione con- * formi agli artt. da 2 a 7 del presente decreto, in corri- * spondenza del quale siano errati uno o piu' dati ana- * grafici che concorrono alla formazione del numero di * codice fiscale stesso. Si applicano in tal caso le dispo- * sizione di cui dagli artt.5 secondo comma, e 19 del * D.P.R. 2 novembre 1976 n.784. * Il numero di codice fiscale provvisorio dei soggetti * diversi dalle persone fisiche ha struttura uguale a quel- * la del numero di codice fiscale definitivo. :EXMP. :EHELP. .*--------------------------------------------------------------------- :HELP name='CMD/codfis'. :H3.Codice fiscale (CODFIS) :P.Codice fiscale da verificare. :P.Il valore e' obbligatorio. :P.Forme permesse: :PARML. :PT.16 caratteri alfanumerici. :PD.Forma definitiva del codice fiscale di persona fisica. :XMP. Nella forma CogNomAaMGgComuK dove Cog = Acronimo del Cognome Nom = Acronimo del Nome Aa = Anno di nascita di due cifre M = Mese di nascita codificato con una lettera Gg = Giorno di nascita + 40 se sesso femminile Comu = Codice del comune italiano o della nazione estera di nascita K = Carattere di controllo :EXMP. :PT.11 caratteri numerici :PD.Forma definitivia o provvisoria del codice fiscale di persona non fisica o forma provvisoria del codice fiscale di persona fisica. :XMP. Nella forma ProgresPrvK dove Progres = Progressivo di assegnazione dentro l'ufficio Prv = Codice dell'ufficio che assegna il progressivo K = Carattere di controllo :EXMP. :EPARML. :EHELP. .*--------------------------------------------------------------------- :EPNLGRP. //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JCODFISS) FILETYPE(*SRC) ENDCHAR('//ENDSRC') C seton lr * Controlla il codice fiscale. * Riceve il codice fiscale da esaminare i JCFCOD. * Restituisce 1 in JCFFIS se esegue il controllo per persona fisica. * Restituisce 1 in JCFOMO se durante il controllo per persona * fisica riscontra dalla sintassi trattarsi di un omonimo. * L'indicazione non viene data se il codice viene giudicato * in errore. * Restituisce 1 in JCFSIN se riscontra errore di sintassi. * Restituisce 1 in JCFCHK se riscontra errore nel carattere * di controllo. * L'indicatore di errore nel carattere di controllo viene * sempre acceso anche per errore di sintassi perché * il carattere di controllo non ha senso in presenza di * un errore di sintassi. C CALL 'JCODFISD' C PARM JCFCOD 16 I Codice fiscale C PARM JCFFIS 1 O Persona fisica C PARM JCFOMO 1 O Omonimo C PARM JCFSIN 1 O Errore sintassi C PARM JCFCHK 1 O Errore chkdig //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JCODFIS2) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /TITLE Controlla correttezza formale Codice Fiscale * Claudio Neroni 23/06/2005 Creato. * Il programma e' costruito secondo le regole illustrate nel sito * www.agenziaentrate.it * Home * Servizi * Codice fiscale - Tessera Sanitaria * Codice fiscale * Informazioni sulla codificazione delle persone fisiche * Il programma, tuttavia, non risolve tutti i controlli * illustrati in tale documentazione. * In particolare, tiene comunque conto dell'omocodia. *--------------------------------------------------------------------- * $C/$P/$D Caratteri/PesiPari/PesiDispari D $cpdds ds D $cpd 7 dim(36) ctdata perrcd(1) D $c 1 overlay($cpd:1) D $p 2s 0 overlay($cpd:3) D $d 2s 0 overlay($cpd:6) * $n/$e CaratteriPermessiNeiNumerici/NumeriEquivalentiPerOmocodia D $n s 1 dim(20) ctdata perrcd(1) D $e s 1 dim(20) alt($n) * $A CaratteriPermessiNegliAlfabetici D $a s 1 dim(26) ctdata perrcd(26) * Codicilli mesi. D $m S 1 dim(12) ctdata perrcd(12) *--------------------------------------------------------------------- * $F Codice fiscale D $f s 1 dim(16) * $O Codice fiscale tolta omocodia D $o s 1 dim(16) * Data di nascita del codice fiscale sostituiti gli omocodici. D $fn s 1 dim(5) *--------------------------------------------------------------------- * Comodo data ricevuta in forma numerica. D ds D ddmmccyy 1 8 0 D dd 1 2 0 D mm 3 4 0 D cc 5 6 0 D yy 7 8 0 * Comodo data ricevuta in forma cf. D xxyzz ds D xx 1 2 D y 3 3 D zz 4 5 *--------------------------------------------------------------------- * Scambia parametri. C *entry plist * Riceve Codice fiscale. C parm codfis 16 * Riceve Data di nascita. C parm data 8 0 * Riceve Sesso. C parm sesso 1 * Restituisce Errore. * ' ' = Corretto * '1' = Incompleto * '2' = Errato C parm errore 1 * Assume codice fiscale corretto. C clear errore * Esegue i controlli. C do * Trascrive codice fiscale in schiera. C movea codfis $f * CONTROLLA RIEMPIMENTO * Cerca blank nel codice fiscale. C *blank lookup $f 50 * Se il codice fiscale contiene blank. C if *in50 * Restituisce Incompleto. C movel(p) '1' errore * Abbandona. C leave * Se il codice fiscale contiene blank. C endif * VALIDA CARATTERI * Esamina tutti i caratteri. C do 16 $i 5 0 * Se corre un carattere alfabetico. C if $i<=6 or $i=9 or $i=12 or $i=16 * Cerca il carattere tra gli alfabetici permessi. C $f($i) lookup $a 50 * Se corre un carattere numerico. C else * Cerca il carattere tra i numerici permessi. C $f($i) lookup $n 50 * Se corre un carattere numerico. C endif * Se il carattere non e' previsto. C if not *in50 * Restituisce Errato. C movel(p) '2' errore * Abbandona. C leave * Se il carattere non e' previsto. C endif * Esamina tutti i caratteri. C enddo * Se errore, abbandona. C if errore<>*blank C leave C endif * CARATTERE DI CONTROLLO * Calcola il carattere di controllo. C do * Imposta il flag pari-dispari su pari. C seton 88 * Pulisce la somma dei pesi. C clear $sum 5 0 * Esamina i primi 15 caratteri. C do 15 $i 5 0 * Commuta il flag pari-dispari. C *in88 comp *off 88 * Imposta indice di ricerca. C z-add 1 $x 5 0 * Cerca il carattere corrente tra i caratteri permessi. C $f($i) lookup $c($x) 50 * Se il carattere non e' previsto. C if not *in50 * Restituisce Errato. C movel(p) '2' errore * Abbandona. C leave * Se il carattere non e' previsto. C endif * Accumula il peso pari. C 88 add $p($x) $sum * Accumula il peso dispari. C n88 add $d($x) $sum * Esamina i primi 15 caratteri. C enddo * Se errore, abbandona. C if errore<>*blank C leave C endif * Calcola l'indice del carattere di controllo. C $sum div 26 $res 5 0 C mvr $res C add 1 $res * Se il car di controllo calcolato e' diverso dal ricevuto. C if $c($res)<>$f(16) * Restituisce Errato. C movel(p) '2' errore * Abbandona. C leave * Se il car di controllo calcolato e' diverso dal ricevuto. C endif * Calcola il carattere di controllo. C enddo * Trascrive la data di nascita del cf convertendo gli omocodici. C movea $f(7) $fn C do 5 $i 5 0 C if $i=3 C iter C endif C z-add 1 $x 5 0 C $fn($i) lookup $n($x) 50 C 50 movel(p) $e($x) $fn($i) C enddo C movea $fn $fna 5 * Trasforma la data ricevuta nella forma del codice fiscale. C z-add data ddmmccyy C clear xxyzz C move(p) yy xx C if mm>=1 and mm<=12 C move(p) $m(mm) y C endif C if sesso<>'M' C add 40 dd C endif C move(p) dd zz * Se la data ricevuta e quella del codice fiscale non coincidono. C if $fna<>xxyzz * Restituisce Errato. C movel(p) '2' errore * Abbandona. C leave * Se la data ricevuta e quella del codice fiscale non coincidono. C endif * Esegue i controlli. C enddo * Predispone chiusura. C seton lr ** $C/$P/$D Caratteri/PesiPari/PesiDispari A 00 01 B 01 00 C 02 05 D 03 07 E 04 09 F 05 13 G 06 15 H 07 17 I 08 19 J 09 21 K 10 02 L 11 04 M 12 18 N 13 20 O 14 11 P 15 03 Q 16 06 R 17 08 S 18 12 T 19 14 U 20 16 V 21 10 W 22 22 X 23 25 Y 24 24 Z 25 23 0 00 01 1 01 00 2 02 05 3 03 07 4 04 09 5 05 13 6 06 15 7 07 17 8 08 19 9 09 21 ** $n/$e CaratteriPermessiNeiNumerici/NumeriEquivalentiPerOmocodia L0 M1 N2 P3 Q4 R5 S6 T7 U8 V9 00 11 22 33 44 55 66 77 88 99 ** $A CaratteriPermessiNegliAlfanumerici ABCDEFGHIJKLMNOPQRSTUVWXYZ ** $M Codicilli mesi ABCDEHLMPRST //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JCODFIS2.0) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /TITLE Controlla correttezza formale Codice Fiscale * Claudio Neroni 23/06/2005 Creato. * Il programma e' costruito secondo le regole illustrate nel sito * www.agenziaentrate.it * Home * Servizi * Codice fiscale - Tessera Sanitaria * Codice fiscale * Informazioni sulla codificazione delle persone fisiche * Il programma, tuttavia, non risolve tutti i controlli * illustrati in tale documentazione. * In particolare, tiene comunque conto dell'omocodia. *--------------------------------------------------------------------- * $C/$P/$D Caratteri/PesiPari/PesiDispari D $cpdds ds D $cpd 7 dim(36) ctdata perrcd(1) D $c 1 overlay($cpd:1) D $p 2s 0 overlay($cpd:3) D $d 2s 0 overlay($cpd:6) * $n/$e CaratteriPermessiNeiNumerici/NumeriEquivalentiPerOmocodia D $n s 1 dim(20) ctdata perrcd(1) D $e s 1 dim(20) alt($n) * $A CaratteriPermessiNegliAlfabetici D $a s 1 dim(26) ctdata perrcd(26) * Codicilli mesi. D $m S 1 dim(12) ctdata perrcd(12) *--------------------------------------------------------------------- * $F Codice fiscale D $f s 1 dim(16) * $O Codice fiscale tolta omocodia D $o s 1 dim(16) * Data di nascita del codice fiscale sostituiti gli omocodici. D $fn s 1 dim(5) *--------------------------------------------------------------------- * Comodo data ricevuta in forma numerica. D ds D ddmmccyy 1 8 0 D dd 1 2 0 D mm 3 4 0 D cc 5 6 0 D yy 7 8 0 * Comodo data ricevuta in forma cf. D xxyzz ds D xx 1 2 D y 3 3 D zz 4 5 *--------------------------------------------------------------------- * Scambia parametri. C *entry plist * Riceve Codice fiscale. C parm codfis 16 * Riceve Data di nascita. C parm data 8 0 * Riceve Sesso. C parm sesso 1 * Restituisce Errore. * ' ' = Corretto * '1' = Incompleto * '2' = Errato C parm errore 1 * Assume codice fiscale corretto. C clear errore * Esegue i controlli. C do * Trascrive codice fiscale in schiera. C movea codfis $f * CONTROLLA RIEMPIMENTO * Cerca blank nel codice fiscale. C *blank lookup $f 50 * Se il codice fiscale contiene blank. C if *in50 * Restituisce Incompleto. C movel(p) '1' errore * Abbandona. C leave * Se il codice fiscale contiene blank. C endif * VALIDA CARATTERI * Esamina tutti i caratteri. C do 16 $i 5 0 * Se corre un carattere alfabetico. C if $i<=6 or $i=9 or $i=12 or $i=16 * Cerca il carattere tra gli alfabetici permessi. C $f($i) lookup $a 50 * Se corre un carattere numerico. C else * Cerca il carattere tra i numerici permessi. C $f($i) lookup $n 50 * Se corre un carattere numerico. C endif * Se il carattere non e' previsto. C if not *in50 * Restituisce Errato. C movel(p) '2' errore * Abbandona. C leave * Se il carattere non e' previsto. C endif * Esamina tutti i caratteri. C enddo * Se errore, abbandona. C if errore<>*blank C leave C endif * CARATTERE DI CONTROLLO * Calcola il carattere di controllo. C do * Imposta il flag pari-dispari su pari. C seton 88 * Pulisce la somma dei pesi. C clear $sum 5 0 * Esamina i primi 15 caratteri. C do 15 $i 5 0 * Commuta il flag pari-dispari. C *in88 comp *off 88 * Imposta indice di ricerca. C z-add 1 $x 5 0 * Cerca il carattere corrente tra i caratteri permessi. C $f($i) lookup $c($x) 50 * Se il carattere non e' previsto. C if not *in50 * Restituisce Errato. C movel(p) '2' errore * Abbandona. C leave * Se il carattere non e' previsto. C endif * Accumula il peso pari. C 88 add $p($x) $sum * Accumula il peso dispari. C n88 add $d($x) $sum * Esamina i primi 15 caratteri. C enddo * Se errore, abbandona. C if errore<>*blank C leave C endif * Calcola l'indice del carattere di controllo. C $sum div 26 $res 5 0 C mvr $res C add 1 $res * Se il car di controllo calcolato e' diverso dal ricevuto. C if $c($res)<>$f(16) * Restituisce Errato. C movel(p) '2' errore * Abbandona. C leave * Se il car di controllo calcolato e' diverso dal ricevuto. C endif * Calcola il carattere di controllo. C enddo * Trascrive la data di nascita del cf convertendo gli omocodici. C movea $f(7) $fn C do 5 $i 5 0 C if $i=3 C iter C endif C z-add 1 $x 5 0 C $fn($i) lookup $n($x) 50 C 50 movel(p) $e($x) $fn($i) C enddo C movea $fn $fna 5 * Trasforma la data ricevuta nella forma del codice fiscale. C z-add data ddmmccyy C clear xxyzz C move(p) yy xx C if mm>=1 and mm<=12 C move(p) $m(mm) y C endif C if sesso<>'M' C add 40 dd C endif C move(p) dd zz * Se la data ricevuta e quella del codice fiscale non coincidono. C if $fna<>xxyzz * Restituisce Errato. C movel(p) '2' errore * Abbandona. C leave * Se la data ricevuta e quella del codice fiscale non coincidono. C endif * Esegue i controlli. C enddo * Predispone chiusura. C seton lr ** $C/$P/$D Caratteri/PesiPari/PesiDispari A 00 01 B 01 00 C 02 05 D 03 07 E 04 09 F 05 13 G 06 15 H 07 17 I 08 19 J 09 21 K 10 02 L 11 04 M 12 18 N 13 20 O 14 11 P 15 03 Q 16 06 R 17 08 S 18 12 T 19 14 U 20 16 V 21 10 W 22 22 X 23 25 Y 24 24 Z 25 23 0 00 01 1 01 00 2 02 05 3 03 07 4 04 09 5 05 13 6 06 15 7 07 17 8 08 19 9 09 21 ** $n/$e CaratteriPermessiNeiNumerici/NumeriEquivalentiPerOmocodia L0 M1 N2 P3 Q4 R5 S6 T7 U8 V9 00 11 22 33 44 55 66 77 88 99 ** $A CaratteriPermessiNegliAlfanumerici ABCDEFGHIJKLMNOPQRSTUVWXYZ ** $M Codicilli mesi ABCDEHLMPRST //ENDSRC //ENDBCHJOB