SlideShare a Scribd company logo
1 of 97
Download to read offline
Universit`a degli studi di Camerino
Scuola di Scienze e Tecnologie
Corso di Laurea in Informatica (Classe L-31)
Openfisca Managing Tool: strumento per
la gestione di sistemi fiscali
Tesi sperimentale
Laureandi
Stacchio Lorenzo
Petrelli Corrado
Relatore
Prof. Polini Andrea
Correlatore
Prof. Esposito Roberto
Avv. Lonoce Antonino
Anno Accademico 2017/2018
Indice
1 Introduzione 2
2 Metodologie e strumenti di sviluppo 4
2.1 Sviluppo Open Source . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 La community . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.1 AgID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.2 DevelopersItalia . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Simulazione e Microsimulazione . . . . . . . . . . . . . . . . . . . . . 7
2.3.1 Definizione di Simulatore e Simulazione . . . . . . . . . . . . . 7
2.3.2 Microsimulazione . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4 OpenFisca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5 OpenFisca-italy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.6 OpenFisca-Management-Tool . . . . . . . . . . . . . . . . . . . . . . 9
2.7 Strumenti open-source utilizzati durante lo sviluppo . . . . . . . . . . 10
2.7.1 Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.7.2 Github . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.7.3 Slack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.7.4 GitKraken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.7.5 Atom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.7.6 CircleCI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.8 Linguaggi Utilizzati . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.8.1 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.8.2 Pew . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.8.3 Python Kivy . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.8.4 GitHub Flavored Markdown . . . . . . . . . . . . . . . . . . . 16
3 OpenFisca 17
3.1 Struttura dello stack Openfisca . . . . . . . . . . . . . . . . . . . . . 17
3.2 Esempi di utilizzo di sistemi Openfisca . . . . . . . . . . . . . . . . . 18
3.3 Analisi dei requisiti e studio preliminare . . . . . . . . . . . . . . . . 19
3.4 Studio del core di Openfisca . . . . . . . . . . . . . . . . . . . . . . . 20
3.5 Studio della documentazione per sviluppare il country-package . . . . 21
3.6 Descrizione della documentazione per sviluppare il country-package . 21
3.7 Openfisca Core: Concetti chiave . . . . . . . . . . . . . . . . . . . . . 22
3.7.1 Sistema di tasse e benefici . . . . . . . . . . . . . . . . . . . . 22
3.7.2 Entit`a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.7.3 Variabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.7.4 Parametro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.7.5 Periodo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.7.6 Riforma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.7.7 Test per le variabili . . . . . . . . . . . . . . . . . . . . . . . . 23
3.7.8 Simulazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.8 Codifica del country-package: “Dalla legge al codice” . . . . . . . . . 23
3.8.1 Entit`a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.8.2 Variabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.8.3 Parametro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.8.4 Riforma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.8.5 Test per le variabili . . . . . . . . . . . . . . . . . . . . . . . . 33
3.8.6 Simulazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.8.7 Estensione dei file per la codifica . . . . . . . . . . . . . . . . 35
3.9 Flusso operativo della simulazione . . . . . . . . . . . . . . . . . . . . 36
3.9.1 Regione1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.9.2 Regione2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.9.3 Regione3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.10 Openfisca country-template . . . . . . . . . . . . . . . . . . . . . . . 39
3.10.1 Country-template . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.11 Contributo al progetto Openfisca . . . . . . . . . . . . . . . . . . . . 40
3.11.1 Contributo al country-template . . . . . . . . . . . . . . . . . 40
3.11.2 Contributo alla documentazione . . . . . . . . . . . . . . . . . 40
3.11.3 Contributo al core di OpenFisca . . . . . . . . . . . . . . . . . 41
4 OpenFisca Italy 43
4.1 Scelta della legislazione . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.2 Nozioni teoriche IRPEF . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.2.1 Definizione legislativa . . . . . . . . . . . . . . . . . . . . . . . 44
4.2.2 Struttura generale . . . . . . . . . . . . . . . . . . . . . . . . 44
4.3 Implementazione IRPEF . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.4 Nozioni teoriche IMU . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.4.1 Definizione legislativa . . . . . . . . . . . . . . . . . . . . . . . 50
4.4.2 Struttura generale . . . . . . . . . . . . . . . . . . . . . . . . 50
4.5 Implementazione IMU . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5 Openfisca Managing Tool 56
5.1 Scopo del software . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.2 Funzionalit`a del software . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.3 Architettura del sistema . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.3.1 Regione 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.3.2 Regione 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.3.3 Regione 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.3.4 Regione 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.4 Dalla teoria alla pratica . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.4.1 Download and choose an openfisca system . . . . . . . . . . . 62
5.4.2 Home . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.4.3 Legislation Explorer . . . . . . . . . . . . . . . . . . . . . . . 64
5.4.4 Reform Maker . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.4.5 Simulation Maker . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.5 Openfisca Managing Tool: Manuale d’uso . . . . . . . . . . . . . . . . 68
5.5.1 Schermata Iniziale . . . . . . . . . . . . . . . . . . . . . . . . 68
5.5.2 Schermata Home . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.5.3 Schermata Visualizza Sistema . . . . . . . . . . . . . . . . . . 69
5.5.4 Schermata Effettua Riforme . . . . . . . . . . . . . . . . . . . 70
5.5.5 Schermata Effettua Simulazione . . . . . . . . . . . . . . . . . 77
5.6 Fattori esterni che causano il mal funzionamento del sistema . . . . . 82
5.6.1 Lunghezza massima del pathname su sistemi operativi Windows 82
5.6.2 Standardizzazione nella nomenclatura delle directory nei si-
stemi Openfisca . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.6.3 Problemi di versioning delle dipendenze tra i vari Openfisca . 83
5.7 Funzionalit`a future da implementare . . . . . . . . . . . . . . . . . . 84
5.7.1 Impossibilit`a di aggiungere e/o modificare Variabili di tipo
Enum nelle riforme . . . . . . . . . . . . . . . . . . . . . . . . 84
5.7.2 Mancanza di riferimenti alle Enumeration per Variabili di tipo
Enum in lettura . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.7.3 Parameter Reform . . . . . . . . . . . . . . . . . . . . . . . . 84
5.7.4 Parameter Node reader . . . . . . . . . . . . . . . . . . . . . . 84
6 Conclusioni 85
7 Ringraziamenti 87
Abstract
Diversi stati nel mondo hanno tempi per l’attuazione di procedimenti legisla-
tivi molto lunghi, che spesso non portano al risultato desiderato.
Per evitare ci`o, si effettua una pianificazione strategica che non `e sempre cos`ı
semplice da progettare e da verificare dato l’elevato numero di variabili da gestire.
Inoltre, una pianificazione strategica approfondita `e molto costosa in termini di
tempo (che potrebbe essere dedicato all’attuazione dei procedimenti legislativi).
Proprio per i motivi sopracitati, `e necessario rendere trasparente tale pianificazione
e poter valutare, in modo immediato, l’impatto che avrebbe un nuovo procedimento
legislativo su tutto il sistema.
Contribuisce a questo obiettivo OpenFisca (organizzazione governativa francese)
che `e riuscita a sviluppare uno stack di moduli open-source in grado di definire
un sistema di tasse e benefici per ogni stato esistente. In questo contesto ci siamo
mossi per sviluppare il sistema di tasse e benefici italiano.
Successivamente, valutando le alte barriere professionali che impediscono l’utiliz-
zo del sistema ai non esperti nell’ambito informatico, abbiamo deciso di creare il
progetto Openfisca Managing Tool, che propone di essere un software multi-
piattaforma a interfaccia grafica per la gestione di un qualsiasi sistema di tasse e
benefici.
1
1. Introduzione
Alla base di questo documento vi `e l’analisi dello stack di componenti open-
source del sistema Openfisca (sviluppato dall’omonima organizzazione) e l’analisi
delle problematiche relative al sistema stesso, che generano barriere professionali per
l’utilizzo.
In particolare, lo stack di componenti Openfisca consente di:
• Definire un sistema di tasse e benefici per ogni paese esistente al mondo;
• Effettuare delle simulazioni su di un qualsiasi sistema di tasse e benefici
gi`a definito;
• Valutare l’impatto di una riforma su di un qualsiasi sistema di tasse e
benefici gi`a definito.
Le motivazioni, che ci hanno spinto ad approfondire l’analisi dello stack di
componenti del sistema Openfisca, sono molteplici:
• L’interesse per il campo della microsimulazione del quale eravamo neofiti;
• Fornire al legislatore un software di microsimulazione econometrica, comple-
tamente open-source, per il sistema fiscale italiano;
• La nascita di rapporti internazionali con team di sviluppo da differenti paesi.
Nonostante le premesse, l’obiettivo di questa tesi non `e solamente quello di fornire
un’analisi del sistema Openfisca, mettendo in evidenza sia le caratteristiche che
le problematiche, ma `e anche quello di mostrare le scelte, organizzative ed ope-
rative adottate per lo sviluppo del sistema openfisca-italy (sfruttando il motore
Openfisca-Core) e del software Openfisca Managing Tool.
Nonostante la complessit`a del sistema openfisca-italy, questo non sar`a l’argomen-
to centrale della tesi; lo `e Il software ad interfaccia grafica, di nostra invenzione,
Openfisca Managing Tool il cui scopo `e quello di fornire un’implementazione per
le seguenti operazioni:
• Visualizzazione del sistema di regolamenti legislativi 1
gi`a definiti all’in-
terno di un sistema di tasse e benefici Openfisca;
1
I regolamenti legislativi si concretizzano in strutture che verranno definite nel capitolo relativo
ad Openfisca
2
• Definizione di riforme, che consentono la modifica dei regolamenti gi`a
definiti e/o la definizione di nuovi regolamenti legislativi;
• Simulazioni sul sistema corrente e su di un sistema riformato.
Openfisca-italy ed Openfisca Managing Tool, sono stati progettati e sviluppati
adottando tecniche tipiche della metodologia AGILE, effettuando revisioni continue
dei prototipi creati con il team Openfisca. Sono state anche adottate tecniche per
la facilitazione dell’internazionalizzazione del sistema.
Il linguaggio di codifica scelto `e Python 2.7 (necessario per sviluppare un qualunque
sistema openfisca) accoppiato con il framework Python Kivy.
La tesi `e articolata in quattro capitoli:
1. Nel primo capitolo, viene fornita una descrizione, abbastanza dettagliata
delle metodologie e degli strumenti utilizzati per sviluppare sia il sistema
Openfisca-italy che il software Openfisca Managing Tool;
2. Nel secondo capitolo, viene descritto l’ecosistema Openfisca, dettagliando
particolarmente la struttura, l’implementazione dei vari elementi giuridici e
come utilizzarli per sviluppare un generico sistema di tasse e benefici;
3. Nel terzo capitolo, vengono discusse le scelte, organizzative ed operative,
prese per definire ed implementare il sistema di tasse e benefici per lo stato
italiano descrivendo anche gli obiettivi raggiunti a livello implementativo;
4. Nel quarto ed ultimo capitolo, viene descritto il processo di sviluppo del
software Openfisca Managing Tool. Verranno discusse l’l’architettura, le
funzionalit`a attualmente presenti e gli sviluppi futuri.
3
2. Metodologie e strumenti di svi-
luppo
In questo capitolo, discuteremo:
• Del mondo Open-source e della nostra partecipazione alle varie community
durante lo sviluppo del sistema Openfisca-italy ed il software Openfisca
Managing Tool;
• Della teoria della simulazione e dell’ecosistema Openfisca;
• Gli approcci e gli strumenti utilizzati per sviluppare il sistema Openfisca-
italy ed il software Openfisca Managing Tool.
2.1 Sviluppo Open Source
In informatica, il termine open source viene utilizzato per riferirsi ad un soft-
ware di cui gli autori rendono pubblico il codice sorgente, favorendone il libe-
ro studio e permettendo a programmatori indipendenti di apportarvi modifiche ed
estensioni [1].
Questo non significa necessariamente che il software open source sia gratuito per
chiunque: a seconda della licenza che lo accompagna, il codice sorgente pu`o essere
rilasciato dallo sviluppatore solo a scopo di ispezione (frequente nell’ambito dei soft-
ware di crittografia), per favorire l’integrazione con altri software aziendali, a scopo
di studio e ricerca ma non per utilizzi commerciali [2].
A primo impatto, si potrebbe pensare che l’approccio open source sia nato con l’o-
biettivo di produrre e/o migliorare software in maniera totalmente gratuita, in realt`a
lo scopo dell’open source `e quello di “permettere la collaborazione tra persone, con
abilit`a e conoscenze differenti, riuscendo a raggiungere obiettivi che non si potrebbe-
ro raggiungere in nessun altro modo”[3].
A discapito delle aspettative, ci sono vari modi per guadagnare tramite proget-
ti open-source, ad esempio, una raccolta fondi tramite piattaforme di crowdfun-
ding[4] per finanziare un progetto.
Esempi di software con licenze open source, giusto per citarne alcuni, sono:
• Libre Office: suite di applicazioni che offre servizi di tipo office automation;
• Gimp: editor di immagini;
4
• Mozilla Firefox: web browser;
• Sistemi Operativi GNU linux: Gentoo, Debian, Ubuntu....
Lo sviluppo open source ha subito un forte incremento nel primo decennio del 2000,
anche grazie alla nascita di strumenti come Git e piattaforme come Github (di-
scussi rispettivamente nelle sezioni 2.7.1 e 2.7.2); esistono, infatti, pi`u di 57 milioni
di repository (ossia progetti) solamente all’interno della piattaforma appena citata.
(a) Firefox. (b) VLC. (c) 7-zip. (d) Ubuntu.
Fig. 2.1: Progetti open-source
2.2 La community
La community `e un gruppo di persone che partecipano a discussioni on-line per
raggiungere un fine comune. In particolare, esistono community Open-source
che si occupano della gestione e lo sviluppo di progetti.
Durante lo sviluppo dei vari progetti, abbiamo aderito a due community Open-
source:
• “Team per l’Italia in digitale” che ha come obiettivo quello di digitaliz-
zare la Pubblica Amministrazione italiana;
• OpenFisca, nata per supportare gli sviluppatori con la definizione di nuovi
sistemi fiscali.
2.2.1 AgID
L’Agenzia per l’Italia in Digitale `e un’azienda pubblica, vigilata dal Presidente
del Consiglio dei Ministri, che ha lo scopo di innovare tecnologicamente la pubblica
amministrazione ed i servizi forniti alle aziende ed ai cittadini.
2.2.1.1 Competenze e Funzioni
Questa azienda ha lo scopo di seguire l’Agenda digitale per l’Europa (DAE)
creata nel maggio 2010, quest’ultilma si propone di aiutare le imprese ed i cittadini
ad ottenere il massimo dalle tecnologie digitali. Proprio dalla DAE nasce l’Agenda
digitale per l’Italia che fornisce all’AgID le seguenti competenze e funzioni:
• Migliorare tecnologie e servizi per la crescita economica e sociale del Paese, ad
esempio centralizzando l’accesso ai servizi dei cittadini attraverso SPID[5];
5
• Dirigere ed organizzare le attivit`a del CERT (un’organizzazione che ha lo
scopo di raccogliere le vulnerabilit`a software e gli incidenti informatici) della
Pubblica Amministrazione;
• Promuovere lo sviluppo di comunit`a intelligenti, ad esempio: aiutare la diffu-
sione della banda ultralarga[6] in Italia;
• Promuovere l’alfabetizzazione digitale;
• Coordinare e progettare iniziative strategiche di interesse nazionale per l’ero-
gazione efficiente di servizi in rete;
• Dettare regole tecniche, linee guida, metodologie progettuali in materia di
tecnologie informatiche e rendere omogenei i sistemi informativi pubblici in
tutto il Paese;
• Emanare pareri interpretativi riguardo le nuove regole (ad esempio: Codice
dell’amministrazione digitale) e le metodologie di sicurezza per le pubbli-
che amministrazioni (ad esempio: Misure minime di sicurezza ICT per
le pubbliche amministrazioni).
2.2.2 DevelopersItalia
`E una piattaforma open source, nata dalla collaborazione del-
l’AgID ed il Team per la Trasformazione Digitale, che gestisce i
principali progetti tecnologici in sviluppo nel Paese.
2.2.2.1 Competenze e Funzioni
Questa piattaforma ha lo scopo di organizzare e gestire pro-
getti open source, e di aiutare gli sviluppatori intenti a implementarli. Tra i vari
progetti, gestiti da Developers Italia, ci sono:
• SPID (Sistema Pubblico di Identit`a Digitale): un nuovo sistema di login che
permette di accedere ai servizi online forniti dalla Pubblica Amministrazione
con un’unica identit`a digitale;
• ANPR (Anagrafe Nazionale della Popolazione Residente): `e una banca dati
anagrafica nazionale che ha lo scopo di semplificare la burocrazia e migliorare i
servizi dei cittadini riguardanti: residenza, domicilio... (per esempio: il cambio
di residenza);
• dati.gov.it: `e un catalogo di Open Data della Pubblica Amministrazione che
ha fatto in modo di centralizzare i dati forniti e renderli disponibili al pubblico;
(a) SPID (b) ANPR (c) dati.gov.it
Fig. 2.2: Progetti
6
2.3 Simulazione e Microsimulazione
Nelle successive sezioni, parleremo dei sistemi Openfisca, che verranno definiti
come software di microsimulazione economica. E’ doveroso, quindi, definire i
concetti di simulazione e microsimulazione per poter proseguire la lettura del
documento.
2.3.1 Definizione di Simulatore e Simulazione
Un simulatore `e un dispositivo o un ambiente, che riproduce un particolare
modello concreto o astratto della realt`a, sul quale possono essere effettuate delle
simulazioni [7].
Un esempio di modello concreto ´e il modello in scala di una nave che viene poi posto
in un’apposita vasca per effettuare prove simulate allo scopo di stimare opportune
misure di prestazione.
Per il lettore esperto in Scienze dell’informazione automatica, ed in particolare della
programmazione ad oggetti, `e facile fare un’assonanza tra i concetti di <Insieme
di classi di un programma-oggetti creati sulle classi> e <Simulatore-
simulazioni>.
L’insieme delle classi di un programma formano l’ambiente in cui gli oggetti e
le variabili prendono vita, assumendo un comportamento in base alle defi-
nizioni poste dal programmatore.
Per il simulatore il concetto `e del tutto simile: il simulatore definisce l’ambiente
ed il modello di base (un po’ come se fosse un insieme di classi) che grazie alle
varie simulazioni prendono vita assumendo comportamenti differenti (un po’ come
differenti oggetti che vengono creati a partire dalla stessa classe).
Riprendendo l’esempio descritto poco fa, il modello a scala della nave e della
vasca formano l’ambiente fissato creato dal simulatore (come fosse una classe),
mentre nelle simulazioni, create a partire dal simulatore in esame, vengono definiti
attributi quali la quantit`a d’acqua nella vasca, il peso e la forma della nave,
che saranno differenti per ogni simulazione generata (come le istanziazioni di
vari oggetti).
Per poter definire un Simulatore, bisogna seguire una serie di step:
1. ANALISI DEL PROBLEMA
Vengono considerati gli obiettivi e le problematiche da esaminare e viene fatta
un’analisi di fattibilit`a per circoscrivere il problema da prendere in esame (per
esempio la simulazione di un volo deve tener conto di differenti variabili e varie
problematiche, ma alcune possono essere trascurate);
2. FORMULAZIONE DEL MODELLO DI SIMULAZIONE
Viene steso un modello concettuale dove vengono definiti i flussi delle informa-
zioni del problema preso in considerazione. Questo modello viene poi valutato
per verificare se offre un’immagine consistente della realt`a (`e possibile che
venga definito un modello con variabili errate o non congruenti);
3. ANALISI DEI DATI IN INGRESSO
Vengono raccolti dei dati di ingresso che verranno considerati come para-
metri di funzionamento del sistema dopo opportune trasformazioni (vengono
applicate diverse tecniche econometriche, probabilistiche e statistiche);
7
4. VALIDAZIONE DEL MODELLO
Il modello concettuale viene convertito in modello matematico che viene, in
seguito, dimostrato;
5. TESTING
In questa fase, vengono pianificati dei test per ogni iterazione di sviluppo del
Simulatore, per evidenziare la sua validit`a nel tempo;
6. ANALISI DEI DATI IN USCITA
Nell’ultima fase vengono definiti dei dati di uscita attesi, che vengono com-
parati ai risultati forniti dal simulatore (accettando risultati differenti con un
certo margine di errore).
2.3.2 Microsimulazione
Il termine Microsimulazione deriva dall’inglese “Microanalytics Simulation”,
e viene definita come una sottocategoria della Simulazione che fa uso di strumenti
analitici computerizzati che eseguono analisi altamente dettagliate di attivit`a come
il traffico stradale in un incrocio, transazioni finanziarie o agenti patogeni che dif-
fondono malattie attraverso una popolazione [8].
La microsimulazione viene spesso utilizzata per valutare gli effetti degli interventi
proposti, prima che vengano implementati nel mondo reale.
Nei vari sistemi Openfisca, la microsimulazione viene utilizzata per valutare l’im-
patto di una Riforma su di un sistema fiscale prima che questa venga attuata
tramite un procedimento legislativo, si parla quindi di Microsimulazione Econo-
metrica.
Esistono differenti tipologie di microsimulazione:
• Microsimulazione econometrica
Permette di effettuare simulazioni economiche cos`ı da predire delle situazioni.
Un esempio di utilizzo potrebbe essere la misurazione dell’impatto di una
riforma nel sistema economico italiano;
• Microsimulazione del traffico
Permette di effettuare simulazioni sul traffico. Utilizzata moltissimo da inge-
gneri civili per valutare, ad esempio, la viabilit`a della strada inserendo una
rotatoria o un semaforo in un incrocio;
• Microsimulazione pedonale/di folla
Permette di effettuare simulazioni sul comportamento delle persone in mol-
ti ambiti, ad esempio, `e possibile utilizzare questa tipologia per scegliere la
posizione delle uscite antincendio in una biblioteca;
• Microsimulazione nelle scienze della salute
Permette di effettuare simulazione sulla distribuzione dei microrganismi, ad
esempio si pu`o visualizzare la diffusione di una determinata malattia;
• Microsimulazione spaziale
Permette di misurare il cambiamento di varie entit`a nello spazio in differenti
periodi temporali.
8
2.4 OpenFisca
Openfisca `e una community nata in Francia nel 2015 con lo scopo di creare un
software open source di microsimulazione economica (denominato anch’esso
OpenFisca) che consenta di:
• Definire un sistema di tasse e benefici per un determinato paese;
• Effettuare delle simulazioni sul sistema definito utilizzando la normativa in
vigore;
• Definire riforme sul sistema corrente e valutarne l’impatto tramite Simulazioni.
I repositories dei vari progetti software, gestiti dalla community OpenFisca, sono
disponibili al seguente link https://github.com/openfisca/.
2.5 OpenFisca-italy
Il 30 aprile 2018, dalla collaborazione tra Lorenzo Stacchio, Corrado petrelli e
l’Universit`a di Camerino con le community Developers Italia e Openfisca, nasce
il progetto tutto italiano denominato OpenFisca-Italy dopo aver tenuto varie di-
scussioni con i leader delle community.
Lo scopo del progetto Openfisca-italy `e quello di fornire un simulatore che per-
metta:
• Al legislatore di avere un supporto per visualizzare l’impatto di una nuova
riforma sul sistema corrente;
• Agli sviluppatori di applicazioni Web/Desktop/Mobile di costruire un’inter-
faccia grafica che agevoli l’uso del simulatore per cittadini e giuristi.
Lo sviluppo e la struttura del progetto, verranno dettagliati nei capitoli 3 e 4.
2.6 OpenFisca-Management-Tool
Il 1 giugno 2018, da un’idea di Lorenzo Stacchio e Corrado Petrelli, nasce il pro-
getto software Openfisca-Managing-Tool, approvato dalla community Openfi-
sca.
Lo scopo del progetto Openfisca-Managing-Tool `e quello di fornire un software
multi-piattaforma ad interfaccia grafica, che consenta di manipolare un generico si-
stema Openfisca-NameOfCountry.
In particolare questo software consente di:
• Visualizzare il sistema di regolamenti legislativi gi`a definiti;
• Definire nuove riforme che consentono la modifica dei regolamenti gi`a
definiti e/o la definizione di nuovi regolamenti legislativi;
• Effettuare simulazioni sul sistema corrente e/o su di un sistema riformato.
Lo sviluppo e la struttura del progetto, verranno dettagliati nel capitolo 5.
9
2.7 Strumenti open-source utilizzati durante lo
sviluppo
In questa sezione verranno elencati e dettagliati, tutti gli strumenti open-source
utilizzati durante lo sviluppo del sistema openfisca-italy e del software Openfisca-
Managing-Tool.
2.7.1 Git
Git `e un software di controllo di versione distribuito a riga di comando,
nato nel 2005 che venne creato per facilitare lo sviluppo del kernel di Linux da parte
di numerosi sviluppatori provenienti da tutto il mondo.
Fig. 2.3: Logo di Git.
Git nacque perch´e, a quei tempi, BitKeeper (un software analogo a Git) cam-
bi`o licenza e divenne un software proprietario.
Col passare del tempo, Git divenne sempre pi`u usato perch´e permetteva di modi-
ficare e sviluppare iterativamente progetti code-based in un ambiente flessibile, e
di condividere il codice con i propri collaboratori in maniera istantanea con il solo
ausilio di una connessione internet.
Questo ha consentito, di evitare la condivisione del codice tramite dispositivi di
memoria di massa esterni che risultava oneroso a causa dei prezzi e dell’affidabilit`a.
2.7.2 Github
GitHub `e principalmente un servizio di hosting per repository Git, lanciato nel
2009, che pu`o anche esser visto come una piattaforma sociale, dove gli utenti pos-
sono collaborare in qualunque progetto pubblico presente sulla piattaforma.
La collaborazione libera sui vari progetti presenti nella piattaforma, consente di rag-
giungere obiettivi prima irrealizzabili e di imparare studiando i progetti
altrui.
Fig. 2.4: Logo di Github
10
2.7.3 Slack
Fig. 2.5: Logo di
Slack
Slack `e una piattaforma di messaggistica costruita per i
team che permette di integrare differenti canali di comunica-
zione in un unico servizio.
Molto utilizzata dai team di sviluppo per la facilit`a di con-
divisione del codice e per i numerosi strumenti di supporto
alla comunicazione integrati nella piattaforma (videochiama-
ta, riferimenti...); tantoch´e l’obiettivo della piattaforma `e
quello di organizzare e migliorare l’esperienza in team, consolidando e dando senso
ad un enorme flusso di dati che altrimenti sarebbero non-strutturati.
2.7.3.1 Perch´e usare slack?
Slack, oltre a permettere la creazione di canali, consente di integrare servizi ester-
ni tra cui: Google Drive (per l’archiviazione di file condivisi), Trello (per la gestione
dei task), GitHub (per la gestione dei repository) e Smooz (per la connessione di
Team differenti).
Inoltre, centralizza la comunicazione in una singola applicazione migliorando la pro-
duttivit`a, infatti, `e possibile: condividere file, comunicare privatamente o ad un
insieme preciso di persone (presenti in un canale privato o creando una chat di
gruppo) ed eseguirlo su qualunque dispositivo (PC, Smartphone e Tablet).
11
2.7.4 GitKraken
GitKraken `e un Git client ad interfaccia grafica, che fornisce servizi quali:
• Un’integrazione completa con Github.com e Bitbucket.com per l’hosting di
repository git. Questa integrazione permette di eseguire tutte le operazioni
normalmente effettuate tramite riga di comando, ma con un’interfaccia grafica
intuitiva e un’automatizzazione del processo di autenticazione;
• Una rappresentazione grafica dei branch, dei commit e dei tag permet-
tendo cos`ı agli utenti di visualizzare il flusso del lavoro svolto;
• Una rappresentazione grafica dei conflitti durante l’azione di Merging
permettendo la scelta del codice in conflitto che si vuole accettare.
2.7.4.1 Scelta del Client
Esistono moltissimi client Git, molto simili tra loro.
`E stato scelto GitKraken perch´e non richiede ulteriori registrazioni a siti (cosa ri-
chiesta da SourceTree, suo principale concorrente) e perch´e ha una grafica curata e
comprensibile anche da un neofita.
Fig. 2.6: Screenshot di GitKraken[9].
12
2.7.5 Atom
Atom `e un IDE open-source multi-piattaforma basato su Chromium, ed `e perci`o
eseguibile su qualunque Sistema Operativo che supporti Chromium.
Fig. 2.7: Logo di Atom.
Atom possiede caratteristiche analoghe a quelle di molti altri editor di codice (in-
tegrazione di pacchetti aggiuntivi, integrazione con Git...) ma abbiamo constatato,
dopo vari mesi di utilizzo, che possiede:
• Performance pi`u elevate rispetto ai vari concorrenti;
• Minor consumo di risorse (RAM e CPU);
• Maggiori performance dell’intelligence;
• Assenza dei bug riscontrati, precedentemente, con altri editor (Visual Studio
Code), utilizzando il simulatore Openfisca.
Per questi motivi lo reputiamo un ottimo editor per sviluppare un sistema openfisca
ed, in generale, un progetto Python-based.
2.7.6 CircleCI
Fig. 2.8: Logo di
CircleCI.
`E una piattaforma di integrazione continua di software usata
quando si lavora con team di sviluppo avente molti contributori.
Viene utilizzata perch´e racchiude metodologie utili per:
• Evitare errori nel repository;
• Avere un codice pi`u leggibile (`e possibile definire uno stile
di indentazione predefinito cosicch´e i programmatori siano
costretti ad indentare in un determinato modo);
• Rendere operativo il progetto, automatizzando una serie
di passaggi che altrimenti sarebbero dovuti esser fatti ma-
nualmente dal programmatore (ad esempio: testing delle
funzionalit`a).
Permette, inoltre, l’integrazione con GitHub: ad ogni Pull Request verr`a lanciato
uno script su uno o pi`u container (in cui vengono eseguiti ambienti virtuali con risorse
mutualmente esclusive per testare il codice) creato su CircleCI; successivamente
verranno eseguiti tutti i test e tutti i controlli contenuti nello script per poi fornire
l’esito della computazione direttamente sulla Pull Request mittente, cos`ı facendo la
revisione del codice in fase di testing di nuove funzionalit`a risulta molto pi`u agevole.
13
2.8 Linguaggi Utilizzati
In questa sezione verranno illustrati i linguaggi utilizzati durante il progetto.
2.8.1 Python
Python `e un linguaggio di programmazione ad
alto livello multi-paradigma, permette infatti la pro-
grammazione orientata ad oggetti, la programmazione
strutturata ed alcune caratteristiche di programmazio-
ne funzionale (come le lambda expressions).
Oggigiorno questo linguaggio presenta una crescita espo-
nenziale, si pensa infatti che nei prossimi 5 anni sar`a tra i 3 linguaggi pi`u utilizzati
al mondo grazie alla facilit`a che i neofiti trovano nell’impararlo rispetto a Java [10].
Per fare un confronto, possiamo vedere come Python, nei codici sottostanti, per-
metta di scrivere codice pi`u snello, comprensibile e semanticamente uguale a Java
[11].
(a) Codice in Python (b) Codice in Java
Fig. 2.9: Codici a confronto
Inoltre, possiamo notare come nell’indice TIOBE (l’indice dei pi`u popolari soft-
ware redatto dall’azienda TIOBE, leader nel campo del controllo di qualit`a dei
software)[12] sia evidente l’enorme crescita annuale di Python rispetto a Java.
Fig. 2.10: Java vs Python - Aprile 2018.
14
2.8.1.1 Possibili utilizzi di Python
• Programmazione GUI: grazie a Tkinter, PyGtk e wxPython e framework
quali Python Kivy e PyQt;
• Sviluppo Web: mediante l’utilizzo di framework come Django;
• Sviluppo di sistemi di controllo (sviluppati anche dalla NASA[13]);
• Data Science: grazie alle numerose librerie contenute in SciPy;
• Internet Of Things: consente di programmare dispositivi IoT (Raspberry
Pi).
2.8.1.2 Utilizzi di Python all’interno del progetto
Python `e stato utilizzato per sviluppare sia il sistema Openfisca-italy sia la
logica del software Openfisca-Managing-Tool.
2.8.1.3 Perch´e `e stato scelto Python?
Il linguaggio Python `e stato scelto per vari motivi:
• E’ un linguaggio facile da imparare, fattore fondamentale dato che, per contri-
buire a questo progetto, sono necessarie sia nozioni informatiche che tributarie.
Questa facilit`a di utilizzo, consente ad un tributarista di contribuire al progetto
pur affrontando qualche difficolt`a iniziale.
• Ha molte librerie integrabili per elaborazioni complesse. Il motore di sistemi
Openfisca, infatti, sfrutta appieno la libreria NumPy, che `e il pacchetto fon-
damentale per effettuare elaborazioni scientifiche su grandi quantit`a di dati
[14].
• Ha strumenti per la creazione e gestione di ambienti virtuali, in particolare,
Pew, descritto nella prossima sezione.
2.8.2 Pew
Pew, acronimo di Python Enviroment Wrapper[15] `e un insieme di comandi che
permette la gestione di ambienti virtuali.
2.8.2.1 Definizione di ambiente virtuale
`E un ambiente di sviluppo isolato che contiene librerie di una determinata ver-
sione, per esempio un nostro programma richiede l’utilizzo della libreria X nella
versione Y, invece un altro programma richiede sempre la libreria X ma nella ver-
sione Z.
Non sappiamo se la versione Z ha deprecato qualche funzione presente nella versione
Y (o viceversa) quindi per non avere errori si preferisce creare due ambienti virtuali
differenti cosicch´e ambedue gli applicativi possano funzionare senza problemi.
15
2.8.2.2 Utilizzo di Pew in Openfisca
Pew viene utilizzato per far eseguire il simulatore di un determinato paese. La
procedura per l’installazione e il modus operandi per far eseguire il simulatore `e
ampiamente dettagliato al seguente link: https://goo.gl/Ut5tYi.
2.8.3 Python Kivy
Python Kivy `e una libreria open-source per il
rapido sviluppo di applicazioni che fanno uso di
interfacce grafiche innovative [16]. In particolare
Python Kivy, `e stato scelto in quanto `e:
• Cross-platform, infatti lo stesso codice pu`o essere
eseguito su Linux, Windows, Os X, Android, iOS e
Raspberry Pi;
• Business Friendly, Python Kivy `e sotto licen-
za MIT ed `e quindi open-source al 100%, inoltre `e
stabile e fornito di una discreta documentazione;
• Basato sull’elaborazione accelerata tramite
GPU, infatti il motore grafico `e costruito su OpenGL ES 2, che utilizza una pi-
peline grafica, moderna e veloce, che viene eseguita in modalit`a Elaborazione
accelerata tramite GPU1
.
2.8.4 GitHub Flavored Markdown
Per utilizzare al meglio la piattaforma di Versioning Github, bisogna stilare
dei documenti accessori al codice, come supporto alla navigazione nella storia del
progetto. Questi documenti sono solitamente:
• I file README, che possono essere o meno aggiornati ad ogni commit, che
spiegano il contenuto di una cartella o dell’intero progetto;
• I file di CHANGELOG, che servono per conoscere le nuove features o cam-
biamenti effettuati riferendosi a una certa versione del software.
Per scrivere questi documenti, `e necessario conoscere il linguaggio di markdown
esteso da Github.
1
L’elaborazione accelerata tramite GPU consiste nello sfruttare una GPU affiancata ad
una CPU per facilitare operazioni di tipo CPU bound [17].
16
3. OpenFisca
In questa sezione, verr`a discusso la struttura dello stack di componenti del siste-
ma Openfisca e verranno analizzati, utilizzando la documentazione come supporto,
i vari elementi che compongono la componente “kernel” dello stack (Openfisca-
Core) ed i modi, per utilizzare questi elementi, al fine di implementare un sistema
di tasse e benefici.
Verranno, inoltre, discussi sia i contributi forniti alla community ed ai vari progetti
Openfisca, sia il progetto openfisca-country template, che consente di inizializ-
zare un sistema di tasse e benefici in pochi istanti.
3.1 Struttura dello stack Openfisca
Fig. 3.1: Stack OpenFisca
Sotto un punto di vista architetturale, Openfisca `e formato da uno stack di com-
ponenti. Ogni componente permette allo sviluppatore di focalizzarsi su un determi-
nato obiettivo senza intaccare le restanti parti (segue il principio di modularit`a
del software) [18].
Le componenti, che formano lo stack dell’ecosistema OpenFisca, sono:
• OpenFisca-Core, `e la componente “kernel”, che contiene le funzioni princi-
pali (creazione di variabili, simulazioni...) utilizzate per sviluppare un sistema
di tasse e benefici;
• OpenFisca-NameOfCountry `e la componente che sfrutta le funzioni pre-
senti Openfisca-Core per definire un sistema di tasse e benefici (ad esempio
OpenFisca-Italy, ne esiste uno per ogni stato).
17
Per velocizzare il processo di istanziazione del sistema `e stato definito il proget-
to OpenFisca-CountryTemplate (https://github.com/openfisca/
country-template), che contiene una struttura gerarchica di base e vari
esempi per iniziare a sviluppare il sistema fiscale di riferimento;
• OpenFisca-NameOfExtension `e una componente aggiuntiva opzionale che
si sovrappone al OpenFisca-NameOfCountry e che offre ulteriori funzio-
nalit`a e specifiche di una certa regione/citt`a del paese di riferimento. Un
esempio di instanza di OpenFisca-NameOfExtension sono le regioni a
statuto speciale.
• Web API `e la componente che consente di richiamare le varie funzioni, definite
all’interno sia del core che del country template, tramite utilizzo di Web Api.
Lo scopo di questa componente `e, per lo pi`u, di supporto alla creazione di
applicazioni web.
3.2 Esempi di utilizzo di sistemi Openfisca
La community francese ha, per ora, utilizzato il sistema Openfisca-france,
interfacciandosi tramite Web API per costruire tre applicazioni web:
• Consultazione dei parametri e delle variabili del sistema francese
Fig. 3.2: Ricerca delle variabili e parametri riguardanti il Salario.
L’applicazione `e reperibile al seguente link: https://fr.openfisca.org/legislation.
• Simulatore di benefici sociali francesi
L’applicativo in questione valuta, a seconda degli input forniti nei vari form
presentati, se si ha diritto ad usufruire di alcuni benefici fiscali. Nell’immagine
sottostante `e presente il risultato della simulazione, si noti che il soggetto ha
diritto ai benefici fiscali riguardante l’energia elettrica pari a 144€/anno.
18
Fig. 3.3: Risultato del simulatore di benefici sociali francesi.
L’applicazione `e reperibile al seguente link: https://mes-aides.gouv.
fr/.
• Simulatore dell’impatto fiscale causato dal divorzio
Fornendo in input le persone fisiche coinvolte, la situazione familiare prima e
dopo il divorzio, il simulatore permette di visualizzare la ridistribuzione delle
ricchezze su ciascun componente. L’applicazione `e reperibile al seguente link:
https://pa-comp.firebaseapp.com/.
3.3 Analisi dei requisiti e studio preliminare
Prima di iniziare la fase di analisi del problema (come costruire il sistema
fiscale italiano), ci siamo chiesti quali strumenti fossero necessari, per studiare ed
apprendere, le tecniche di sviluppo richieste al fine di codificare il sistema di tasse e
benefici italiano.
Dopo aver discusso con il rappresentante del team Developers Italia, accompagna-
ta da una prima lettura del codice delle varie repository che compongono il sistema
Openfisca, abbiamo constatato che gli strumenti da studiare fossero:
• Linguaggio di programmazione Python;
• Software versioning Git;
• Architettura e componenti di Openfisca-Core;
• Documentazione relativa allo sviluppo del country-package;
• Legislazione Italiana.
Gli strumenti utilizzati sono stati ampiamenti discussi nella Sezione 2.7 e nella
Sezione 2.8. Non sono stati, per`o, descritti importanti manufatti quali la docu-
mentazione relativa allo sviluppo del country-package e l’architettura del core
di Openfisca. Nelle prossime sezioni ci concentreremo sull’analisi e la descrizione
di quest’ultime.
19
3.4 Studio del core di Openfisca
Si dice che “un buon programmatore, prima di sviluppare un qualsiasi
software, studi la macchina e/o il sistema operativo su cui quest’ultimo
verr`a eseguito”, per questo, prima di studiare la documentazione di sviluppo
del country-package italiano, sono state apprese le funzioni principali del core di
openfisca.
Lo studio del core `e stato lungo e complesso ma, in compenso, ha apportato una
maggior consapevolezza e ci ha fatto comprendere molte delle scelte prese dal team
di sviluppo. Segue un class diagram, derivato dallo studio di Openfisca-core, che
riassume le componenti nello stesso e le loro correlazioni.
20
3.5 Studio della documentazione per sviluppare il
country-package
Per poter codificare il sistema di tasse e benefici italiano `e stato necessario lo
studio della documentazione, a volte ambigua, fornita dagli sviluppatori (https:
//openfisca.org/doc/key-concepts.html).
Durante questa fase, c’`e stata una comunicazione continua con il team di svilup-
po di Openfisca, grazie alla quale, abbiamo chiarito dubbi riguardo la documenta-
zione e suggerito alcune migliorie che potevano essere apportate al progetto e alla
documentazione stessa (discusse nella Sezione 3.11).
3.6 Descrizione della documentazione per svilup-
pare il country-package
La documentazione `e suddivisa in otto sezioni:
• Concetti chiave;
• Dalla legge al codice;
• Openfisca Web Api;
• Risoluzione dei problemi;
• Istruzioni per l’utilizzo di Openfisca;
• Pubblicare i risultati;
• Community;
• Come contribuire al progetto Openfisca.
Questa documentazione spiega, in maniera a volte poco dettagliata, come sfruttare
le componenti fornite da openfisca-core per sviluppare un generico sistema di
tasse e benefici.
Dato che sarebbe prolisso e tedioso descrivere tutte le sezioni in maniera specifica,
concentreremo la nostra attenzione sulle sezioni ritenute di maggior rilievo, ossia la
sezione Concetti chiave e la sezione Dalla legge al codice.
21
3.7 Openfisca Core: Concetti chiave
I concetti chiave del sistema Openfisca sono stati generalizzati, affinch´e potessero
adattarsi a qualsiasi (o quasi) legislazione esistente.
3.7.1 Sistema di tasse e benefici
Il primo concetto chiave `e quello del Sistema di tasse e benefici che rappre-
senta l’insieme delle variabili e dei parametri esistenti. Prima di capire cosa siano
le variabili ed i parametri, bisogna definire cosa sia un’entit`a.
3.7.2 Entit`a
Un’entit`a non `e altro che un soggetto, sia esso fisico o giuridico, che possiede da
0 ad n variabili. Esempi di entit`a potrebbero essere Persona fisica e Persona giuri-
dica. Le entit`a possono essere raggruppate creando cos`ı quella che viene definita
come entit`a raggruppata. Esempi di entit`a raggruppate sono: famiglia, gruppi
aziendali etc..
3.7.3 Variabile
Una variabile:
• `E una propriet`a di un’entit`a;
• Pu`o appartenere ad un’unica entit`a (ma non `e vero il contrario);
• Pu`o assumere un valore calcolato tramite una formula (che `e definita all’interno
della variabile stessa) o passato in input (proprio per questo motivo sono sorti
dei problemi che verranno spiegati nella Sezione 3.11.3).
3.7.4 Parametro
Un parametro `e una propriet`a numerica della legislazione che pu`o evolvere nel
tempo, ma a differenza di una variabile, questo non appartiene a nessuna entit`a.
I parametri vengono solitamente usati nelle formule per calcolare delle variabili.
3.7.5 Periodo
Ogni parametro o variabile assume un valore per un certo periodo che sia
esso mensile o annuale (o infinito nel caso in cui la variabile sia una costante).
3.7.6 Riforma
Un altro concetto da esprimere `e sicuramente quello della Riforma.
Una Riforma pu`o essere applicata in una simulazione per capire gli effetti di un
cambiamento apportato ad una formula di una variabile o ad un parametro esistente.
22
3.7.7 Test per le variabili
I test per le variabili sono particolari file, che consentono di testare il comporta-
mento delle variabili, in particolare, si dovrebbe testare ogni formula con almeno
un test.
3.7.8 Simulazione
Una simulazione permette di calcolare tasse e benefici per il country-package
definito da entit`a, parametri, variabili e riforme avendo come base uno scenario
(che non `e altro che un insieme di entit`a e variabili che generano la situazione che
vogliamo sfruttare).
N.B. Una simulazione funge anche da test per le riforme.
Questa rapida panoramica dei concetti principali ci consente di introdurre la visione
del sistema da un punto di vista pi`u pratico: sappiamo ora cosa siano le Variabili, i
Parametri, le Entit`a e le Riforme, ma come vengono codificate?
3.8 Codifica del country-package: “Dalla legge al
codice”
In questa sezione viene illustrato come codificare i concetti chiave, descritti nella
sezione precedente.
3.8.1 Entit`a
Il processo di codifica di una nuova entit`a `e molto complesso: sono necessarie
modifiche in vari file di configurazione e la riscrittura di parte del codice, espresso
nel core di openfisca, all’interno del proprio country-package.
Nella documentazione, infatti, non si fa alcun riferimento alla scrittura di una nuova
entit`a ma si parla solo di come utilizzarle e di come comporne di nuove partendo
da quelle esistenti.
Le operazioni principali utilizzabili su un’entit`a o un gruppo di entit`a sono l’ aggre-
gazione (che consente di aggregare valori definiti per ogni membro di un gruppo di
entit`a o di pi`u entit`a singole) e la proiezione (che consente di conoscere il valore
di una certa variabile di un’entit`a).
3.8.2 Variabile
Come detto in precedenza, una variabile pu`o assumere un valore calcolato tra-
mite una formula o assegnato input. La cosa interessante `e che la prima opzione
comprende anche la seconda: se una variabile definisce una formula per essere cal-
colata, quest’ultima pu`o assumere un valore sia calcolato tramite una formula sia
assegnato in input, mentre non `e vero il contrario. Una variabile che pu`o assumere
unicamente un valore tramite input, assume il seguente aspetto:
class variabile_di_esempio(Variable):
value_type = float
23
default_value = 100
entity = Person
label = u``Esempo di variabile numerica''
definition_period = MONTH
Ogni variabile:
• Eredita della classe Variable definita all’interno del core di Openfisca;
• Ha un tipo di valore che pu`o assumere, questi tipi per`o non sono dati dal
linguaggio Python, ma sono stati definiti dal team di Openfisca e sono i
seguenti:
– bool : boolean;
– date : date;
– Enum : valori discreti numerabili;
– float : float;
– int : integer;
– str : string.
• A seconda del tipo, assume un valore di default, che pu`o essere per`o anche im-
postato dal programmatore (come nell’esempio). I valori di default, a seconda
del tipo della variabile, sono:
– bool : False;
– date : 1970-01-01;
– Enum : lista vuota;
– float : 0.0;
– int : 0;
– str : ’ ’ .
• Appartiene obbligatoriamente ad un’entit`a, in questo caso all’entit`a Persona;
• Pu`o possedere una descrizione, indicata nel campo label;
• Pu`o assumere diversi valori in base al periodo di definizione (nell’esempio, il
periodo `e mensile). Il periodo di definizione `e unico ed `e scelto tra:
– MONTH : Il valore della variabile pu`o cambiare di mese in mese (Es.
et`a di una persona);
– YEAR : Il valore della variabile pu`o cambiare di anno in anno (Es.
IRPEF netta);
– ETERNITY : Il valore della variabile `e una costante, ossia non pu`o
cambiare nel tempo (Es. data di nascita).
24
Un fattore interessante `e l’interoperabilit`a dei periodi: normalmente infatti
una variabile mensile non pu`o essere calcolata su base annuale ed `e vero anche
il contrario.
Esiste per`o un particolare attributo, denominato set input, che consente, a
seconda del valore assunto, di calcolare una variabile mensile su base annuale
e viceversa.
Una variabile che, invece, pu`o essere calcolata tramite una formula assume la
seguente forma:
class variabile_di_esempio(Variable):
value_type = float
default_value = 100
entity = Person
label = u``Esempo di variabile numerica calcolata
tramite formula''→
definition_period = MONTH
def formula(person,period,parameters):
return
person('altra_variabile_di_esempio',period)→
* parameters
.moltiplicatore_altra_variabile_di_esempio
Come detto in precedenza, una variabile calcolata tramite formula pu`o anche assu-
mere un valore tramite input, tutto dipende da cosa forniamo al simulatore.
Se al simulatore imponiamo che la variabile di esempio sia uguale a un valore X
allora la variabile assumer`a questo valore, se invece non `e indicato alcun tipo di
valore, questo verr`a calcolato tramite la sua formula.
Da ci`o, si evince, che la regola di priorit`a per il simulatore sia:
V alore in input > valore calcolato tramite variabile
Questa regola, nata per facilitare il lavoro d testing, `e in realt`a uno svantaggio,
quantomeno a livello semantico. Il problema riscontrato `e dettagliato nella Sezione
3.11.3).
La formula `e una funzione che prende in input l’entit`a utilizzata nella formula per
effettuare il calcolo (nel nostro caso person), il periodo preso in considerazione per
il calcolo (che viene indicato in input al simulatore) e i parametri esistenti all’in-
terno del sistema. Il calcolo di una formula sfrutta da 0...n variabili di un entit`a e
da 0...n parametri esistenti.
Nell’esempio, la formula effettua una semplice moltiplicazione tra una variabile pro-
priet`a dell’entit`a persona (per un certo periodo dato in input) e il suo parametro
moltiplicatore, dopodich´e ritorna il risultato.
3.8.3 Parametro
Un parametro pu`o essere codificato in diverse maniere, a seconda del suo scopo.
25
3.8.3.1 Parametro Base
Un parametro che ha come unico scopo, quello di rappresentare una semplice
propriet`a numerica in base al periodo preso in esame, `e il modello base. Vediamo
un esempio di parametro base :
description: Esempio di parametro base
unit: currency
values:
1993-01-01:
value: 1000
2010-01-01:
value: 1500
reference: https://openfisca.org/doc
/coding-the-legislation
/legislation_parameters.html
2020-01-01:
expected: 1700
Come si evince da queste righe di codice, un parametro base definisce dei valori a
seconda del periodo considerato, ma vediamo nel dettaglio da cosa un parametro di
questo genere `e composto. Ogni parametro base ha:
• Una descrizione;
• Un riferimento legislativo (opzionale);
• Un’unit`a di misura. Possono essere di tre tipologie:
– years : il valore `e rappresentato in anni;
– currency : il valore `e rappresentato nella valuta corrente del paese;
– /1 : il valore `e in percentuale (dove 1.0 = 100%).
• Dei valori per il parametro a seconda del periodo. I valori del parametro di
esempio vanno interpretati in questa maniera:
– Prima del 01-01-1993 questo parametro non esisteva;
– Dal 01-01-1993 al 01-01-2010 questo parametro assume valore 1000;
– Dal 01-01-2010 al 01-01-2020 questo parametro assume valore 1500;
– Ci si aspetta che dal 01-01-2020 questo parametro assuma come valore
1700. La parola chiave expected viene utilizzata per periodi successivi
a quello presente, `e stato inserito per poter effettuare delle simulazioni
per gli anni futuri.
N.B. In questo caso, tutti i valori indicati sono dei valori interi. Bisogna stare
attenti ad utilizzarli, in quanto potrebbero portare ad errori nel calcolo delle
varie formule (Problema del troncamento della divisione intera [19]).
Per evitare ogni sorta di problema `e consigliabile indicare il valore, anche se
non ha cifre dopo la virgola, come numero reale (invece di 1000 scrivere
1000.00).
26
3.8.3.2 Parametro a scala
Una scala `e formata da raggruppamenti di valori, tassi e soglie. Un para-
metro a scala viene di solito definito per gestire calcoli basati su scaglioni (Es.
calcolo dell’IRPEF lorda).
Prendiamo come esempio di parametro a scala un frammento di codice del file
’Aliquote IRPEF’ da noi codifcato:
description: Aliquote dell'imposta sul reddito delle
persone fisiche→
reference: https://goo.gl/bd4986
brackets:
- rate:
2007-01-01:
value: 0.23
threshold:
2007-01-01:
value: 0.0
- rate:
2007-01-01:
value: 0.27
threshold:
2007-01-01:
value: 15000
Ogni parametro a scala possiede:
• Una descrizione;
• Un riferimento legislativo (opzionale);
• 1..n Tassi. Ogni tasso `e formato a sua volta da:
– Valori per diversi periodi (anche se nell’esempio `e definito un solo valore
a partire dal 01-01-2007);
– Soglie per diversi periodi (anche se nell’esempio `e definito un solo valore
a partire dal 01-01-2007).
La prima domande che ci si pongono, dato che questo `e un parametro pi`u complesso
rispetto a quello di base, `e come vada interpretato e come poterlo utilizzare. Per
poter rispondere a queste domande bisogna introdurre la funzione calc(). Prendia-
mo come esempio la seguente istruzione, utilizzata per calcolare la quota di IRPEF
lorda all’interno del nostro progetto:
parameters(period).
aliquote_scaglioni_IRPEF.calc(reddito_imponibile)
27
Questa istruzione `e suddivisa in 3 sezioni:
• parameters(period).aliquote_scaglioni_IRPEF
# richiamo il parametro a scala
• reddito_imponibile
# valore che verr`a passato alla funzione calc()
• calc(reddito_imponibile)
# calcola il valore della scala
# in base all'oggetto passato in input
Nel nostro caso, la funzione calc() prende in input il valore reddito imponibile e
si applica sul parametro a scala aliquote scaglioni IRPEF.
Per capire cosa fa la funzione calc() supponiamo che il valore di
reddito imponibile sia 20000. La funzione applicata a questa cifra effettua il
seguento calcolo:
(15000 ∗ 0.23) + ((20000 − 15000) ∗ 0.27)
Il calcolo scaturisce dal fatto che, prima di ogni cosa, la funzione calc() controlla
in quale range di soglia si trovi il valore passato in input utilizzando come metro di
giudizio il campo threshold. Nel nostro caso il valore `e maggiore della soglia dei
15000 per la quale vale la rata del 27 %. Questo non significa che tutto il valore
passato sia la base per il calcolo del 27 %, infatti, questa funzione, accoppiata con
il parametro a scala, serve per effettuare calcoli a scaglioni, ed `e per questo che,
prima si calcola il 23 % di 15000 (che `e il massimo del primo range di valori) e poi
si calcola il 27 % ma solo della differenza tra il valore passato in input e la soglia
minima del range in cui ci si trova.
Come esempio rafforzativo, prendiamo il caso in cui il reddito imponibile sia
13000, il calcolo effettuato sarebbe il seguente:
((13000 − 0) ∗ 0.23)
Da questi esempi `e chiaro anche come il parametro a scala debba essere in-
terpretato: nell’esempio il parametro assume il valore di 0.23 se la cifra passata in
input `e maggiore di 0 e minore di 15000, altrimenti assume 0.27.
In questa maniera, si possono creare n scaglioni e, a seconda delle esigenze, applicare
la funzione calc() per effettuare il calcolo, in maniera semanticamente corretta.
3.8.3.3 Parametro Fancy Indexing
L’ultimo tipo di parametro `e il parametro fancy indexing, ossia un parametro
che viene calcolato in base al valore di una certa Variabile. Questo tipo di oggetto `e
molto comodo in situazioni in cui esistono delle condizioni sul valore di una variabile
generica: Il parametro `e infatti, indicizzato di fantasia, nel senso che non si basa su
un valore di una variabile specifica ma su un valore generico che qualsiasi variabile
pu`o assumere. Vediamo il seguente esempio:
28
zona_1:
single:
description: "Ammontare beneficio per una certa
persona single nella zona 1"→
values:
2015-01-01:
value: 150
coppia:
description: "Ammontare beneficio per una certa
coppia nella zona 1"→
values:
2015-01-01:
value: 250
zona_2:
single:
description: ""Ammontare beneficio per una certa
persona single nella zona 2"→
values:
2015-01-01:
value: 200
coppia:
description: "Ammontare beneficio per una certa
coppia nella zona 2"→
values:
2015-01-01:
value: 300
Il funzionamento `e il seguente: I valori zona 1 e zona 2 sono valori che posso essere
assunti da una qualsiasi variabile (che `e sicuramente un Enum in questo caso)
e per ognuno di essi vengono definiti ben due parametri utilizzabili (single e
coppia). Sar`a cura del programmatore, scegliere quale di questi utilizzare in base
alle esigenze, un esempio di utilizzo `e il seguente:
def formula(famiglia, period, parameters):
coppia = famiglia('coppia', period)
zona = famiglia('zona_abitazione', period) #
zona_abitazione pu`o essere solamente zona_1 o
zona_2
→
→
P = parameters(period).beneficio_abitazione[zona]
return where(coppia, P.coppia, P.single) # ritorno il
parametro coppia se la famiglia `e formata da due
persone, altrimenti quello per single
→
→
29
3.8.4 Riforma
Una riforma, `e un insieme di modifiche che possono essere applicate ad un
sistema di tasse e benefici. Viene solitamente utilizzata per valutare l’impatto di un
possibile cambiamento nel sistema legislativo.
Il cambio al sistema apportato da una Riforma pu`o concretizzarsi in tre modi:
• Ridefinire la formula per il calcolo di una variabile esistente;
• Ridefinire un parametro esistente;
• Introdurre un nuovo parametro (staticamente o dinamicamente).
3.8.4.1 Ridefinire la formula per il calcolo di una variabile esistente
Grazie ad una riforma `e possibile misurare l’impatto della ridefinizione del calcolo
di una variabile. Questo strumento `e molto comodo in quanto, il cambiamento del
calcolo di una variabile (in particolare una tassa) potrebbe impattare in maniera
inaspettata sull’intero sistema. La ridefinizione di una variabile `e molto semplice:
basta riscrivere la stessa variabile (cambiandone la struttura) e poi far partire una
simulazione per constatare l’impatto del cambiamento.
Prendiamo come esempio una semplice variabile del sistema attuale:
class variabile_di_esempio_senza_riforma(Variable):
value_type = float
entity = Person
label = u``Esempo di variabile da riformare"
definition_period = YEAR
def formula(person,period,parameters):
return
person('altra_variabile_di_esempio',period)→
* parameters
.moltiplicatore_altra_variabile_di_esempio
Supponiamo ora di voler riformare questa variabile e di cambiare il corpo della sua
formula scrivendo la seguente variabile riformata:
class variabile_di_esempio_riformata(Variable):
value_type = float
entity = Person
label =
u``Variabile riformata da applicare su
variabile_di_esempio_senza_riforma"→
definition_period = YEAR
def formula(person,period,parameters):
return
person('altra_variabile_di_esempio',period)→
30
* (1.0 - parameters
.moltiplicatore_altra_variabile_di_esempio)
Supponendo che il parametro moltiplicatore altra variabile di esempio sia una
percentuale, decido di cambiare la moltiplicazione e di trasformare la formula della
variabile da:
return person('altra_variabile_di_esempio',period)
* parameters
.moltiplicatore_altra_variabile_di_esempio
a
return person('altra_variabile_di_esempio',period)
* ( 1.0 - parameters
.moltiplicatore_altra_variabile_di_esempio)
Una volta definita, la variabile riformata va applicata al sistema. E’ ora di scrivere
una riforma! Prendiamo come esempio, la seguente riforma:
class simple_reform(Reform):
name = u'Reform on
variabile_di_esempio_senza_riforma'→
def apply(self):
self.update_variable(
variabile_di_esempio_senza_riforma)
Ogni riforma:
• Eredita dalla classe Reform definita nel core;
• Possiede un nome;
• Deve sempre definire il metodo apply, sia che essa debba essere applicata su
una variabile che su un parametro.
In questo caso il metodo apply, richiama la funzione update variable definita
all’interno del core nella classe Reform. Questo metodo far`a in modo di aggiornare
la variabile in una simulazione.
Da notare che la la riforma e la variabile riformata dovrebbero trovarsi nello
stesso file, sia per motivi di namespace sia per ragioni convenzionali.
31
3.8.4.2 Ridefinire un parametro esistente
Il procedimento `e molto simile a quello della variabile ma con qualche cam-
biamento strutturale. Innanzitutto per ridefinire un parametro esistente bisogna
definire una funzione di modifica dei parametri come nel seguente esempio:
def modify_parameters(parameters):
reform_period = periods.period("2015")
parameters.tax_on_salary.brackets[1].threshold.
update(period = reform_period, value = 4000)
return parameters
In questo caso la modifica si applica per l’anno 2015, su un parametro a scala,
nella seconda sezione del raggruppamento (brackets[1]), aggiornando la soglia per
la quale varr`a la rata in quella sezione con il valore 4000. Dopodich`e, si scrive
una riforma che sfrutta il metodo modify parameters per effettuare le stesse
operazioni espresse nella sezione precedente ma prendendo di mira un parametro al
posto di una variabile. La riforma per modificare un parametro esistente avr`a un
aspetto di questo tipo:
class incrementare_soglia_minima(Reform):
name = u'Incrementare la soglia minima'
def apply(self):
self.modify_parameters(modifier_function =
modify_parameters)→
3.8.4.3 Introdurre un nuovo parametro
Come detto in precedenza, grazie ad una riforma `e possibile non solo modificare
un parametro ma anche introdurne uno nuovo in maniera statica o dinamica.
Per introdurre un nuovo parametro in maniera statica, bisogna innanzitutto posse-
dere un file in cui `e definito un parametro ma che non si trova nel percorso dei
parametri (per questo si dice in maniera “statica”, in quanto il file esiste gi`a ed il
parametro `e gi`a fissato).
Dopodich´e, bisogna scrivere la solita funzione modify parameters che, questa vol-
ta, ha lo scopo di caricare in memoria il file. Un esempio di codice generico `e il
seguente:
import osˆˆA
from openfisca_core.parameters import
load_parameter_file→
dir_path = os.path.dirname(__file__)
def modify_parameters(parameters):
file_path = os.path.join(dir_path, 'new_parmt.yaml')
32
reform_parameters_subtree =
load_parameter_file(file_path, name='new_parmt')→
parameters.add_child('new_parmt',
reform_parameters_subtree)→
return parameters
Una volta definita questa funzione, si scrive una riforma applicando il metodo
modify parameters:
class some_reform(Reform):
def apply(self):
self.modify_parameters(modifier_function =
modify_parameters)→
Per introdurre invece un nuovo parametro in maniera dinamica, si eseguono gli
stessi passi ma cambiando la funzione di modify parameters che ora, invece di
caricare un file in cui si trova il parametro, ne definisce direttamente uno.
L’esempio di codice generico per questa situazione `e il seguente:
from openfisca_core.parameters import Parameter
def modify_parameters(parameters):
reform_parameters_subtree = Parameter('new_parmt',
data = {→
'description': 'New dinamyc parameter'
'values': {
"2000-01-01": {'value': 550, reference =
'http://openfisca.readthedocs.io→
/en/latest/parameters.html'},
"2017-01-01": {'value': 600, reference =
'http://openfisca.readthedocs.io→
/en/latest/parameters.html'}
}
})
parameters.add_child('new_parmt',
reform_parameters_subtree)→
3.8.5 Test per le variabili
I test riguardanti le variabili, vengono eseguiti in un ambiente virtuale di Pew.
L’unico scopo di questi test `e controllare se gli effetti del calcolo di una variabile
siano quelli voluti. Prendiamo come esempio il seguente test:
- name: Test esempio
period: 2018
33
input_variables:
reddito_complessivo: 10000
oneri_deducibili: 1000
output_variables:
irpef_lorda: 2070
Come si evince dal codice, ogni test possiede:
• Un nome;
• Un periodo sul quale le variabili vengono calcolate;
• Un insieme di variabili di input;
• Un insieme di variabili di output attese.
I test si comportano in una maniera molto pervasiva: un qualsiasi test, fa in modo
di calcolare, non solo le variabili attese in output, ma anche tutte le altre variabili
esistenti.
In realt`a, la maggior parte della variabili assumer`a il valore di default, a meno che
la formula per il calcolo delle stesse non contenga le variabili date in input, in quel
caso assumeranno un valore diverso.
Se il test fallisce, significa che le variabili calcolate in output assumono dei valo-
ri diversi rispetto a quello specificato nei test, o che c’`e stato un qualche errore
sintattico.
3.8.6 Simulazione
Le simulazioni possono essere eseguite su un sistema di tasse benefici standard
o riformato.
Supponendo di voler calcolare una variabile del sistema standard il procedimento
`e il seguente:
from openfisca_italy import CountryTaxBenefitSystem #
import tax benefit system→
from openfisca_italy.scenarios import Scenario # import
scenario→
# definire funzione per inizializzare scenario
def init_profile(scenario):
scenario.init_single_entity(
period = '2017',
person = dict(
age = 50
var_reddito= 10000,
# ...
)
)
return scenario
34
#carico il sistema di tasse e benefici
tax_benefit_system = CountryTaxBenefitSystem()
#creo uno scenario sul sistema
scenario = tax_benefit_system.new_scenario()
#inizializzo lo scenario
scenario = init_profile(simple_scenario)
# creo una simulazione su uno scenario
simulation = scenario.new_simulation()
# calcolo una variabile sulla simulazione
simulation.calculate('irpef_lorda','2017')
Se invece vogliamo calcolare una variabile del sistema riformato si utilizza lo
stesso codice di prima, solamente cambiando il sistema di tasse e benefici preso in
esame:
# prendo sistema con riforma applicata
sistema_con_riforma =
diminuzione_aliquota_IRPEF_redditi_inferiori_15000(→
tax_benefit_system)
# creo un nuovo scenario sul sistema con riforma
reform_scenario = sistema_con_riforma.new_scenario()
# inizializzo lo scenario sul sistema con riforma
reform_scenario = init_profile(reform_scenario)
# creo una simulazione sullo scenario
simulation_riforma = reform_scenario.new_simulation()
# calcolo la variabile sulla simulazione del sistema
riformato→
simulation_riforma.calculate('irpef_lorda','2017')
3.8.7 Estensione dei file per la codifica
Quello che non `e stato detto, `e quale sia l’estensione dei file supportata dai vari
concetti dell’ecosistema Openfisca.
Concetto Tipologia FIle
Entit`a ’.py’
Variabili ’.py’
Parametri ’.yaml’
Simulazioni ’.py’
Situation ’.json’
Test Variabili ’.yaml’
Test Riforme ’.py’
Tab. 3.1: Tipologie di file associate a concetti
35
3.9 Flusso operativo della simulazione
Dopo aver descritto tutte le componenti, utili al fine di definire un sistema di
tasse e benefici tramite lo stack di moduli openfisca, `e doveroso specificare come
questi elementi si concatenino per effettuare una semplice simulazione.
Segue un diagramma di flusso, che verr`a dettagliato effettuando dei focus nelle sue
varie regioni:
Fig. 3.4: Flusso di lavoro di una simulazione Openfisca
36
3.9.1 Regione1
Fig. 3.5: Flusso di lavoro di una simulazione Openfisca: Regione 1
La prima cosa da fare per effettuare una simulazione `e definire, all’interno di un
file del country-package (script python), l’l’ambiente della simulazione.
Per definire questo ambiente, `e necessario generare il sistema completo di tasse e
benefici (operazione standard della componente openfisca-core) ed inizializzare
una situazione fiscale.
3.9.2 Regione2
Fig. 3.6: Flusso di lavoro di una simulazione Openfisca: Regione 2
Per inizializzare una situazione fiscale `e necessario selezionare:
• N coppie di <Variabile di input-Valore assegnato alla variabile>;
• N <Variabile di output>;
Tutte le variabili selezionate, vengono impacchettate in una Situazione fiscale,
che accoppiata con il sistema di tasse e benefici, `e in grado di generare una
situazione fiscale compatibile con il simulatore openfisca.
37
3.9.3 Regione3
Fig. 3.7: Flusso di lavoro di una simulazione Openfisca: Regione 3
Una volta generata una situazione fiscale compatibile con il simulatore open-
fisca si effettua la simulazione.
Basandosi sulle N coppie di <Variabile di input-Valore assegnato alla varia-
bile> indicate nella situazione fiscale, il simulatore calcola le N <Variabile di
output> e tutte le variabili necessarie al fine di calcolare quest’ultime.
Una volta effettuati i calcoli, il simulatore restituisce i vari risultati al country-
package che ha la possibilit`a di mostrarli a video o utilizzarli per effettuare altre
simulazioni.
38
3.10 Openfisca country-template
3.10.1 Country-template
Per inizializzare il repository di una de-
terminata nazione bisogna seguire un deter-
minato numero di step. La prima co-
sa da fare `e clonare o scaricare, il pro-
getto openfisca-country-template (fruibi-
lie al seguente link https://github.com/
openfisca/country-template/).
Successivamente, basta far eseguire una serie di
istruzioni, codificate in Bash scripting, sul pro-
prio elaboratore per adattare il progetto e creare
cos`ı una base del sistema fiscale del paese di ri-
ferimento (generando l’albero di directory
che troviamo in figura).
Nonostante la facilit`a con cui sia possibile model-
lare una base per un sistema fiscale, c’`e un grosso
limite: come specificato, le istruzioni sono codifi-
cate in Bash scripting, ci`o significa che queste
funzionano unicamente su sistemi operativi Unix
(OSx, Ubuntu etc...), per questo, abbiamo deciso
di contribuire sviluppando uno script python
cross-platform che emulasse i comportamenti de-
scritti dal team (sezione 3.11).
Openfisca-country-template non `e altro che
un insieme di file e cartelle necessarie per iniziare
a sviluppare il sistema fiscale per il proprio pae-
se, infatti, esso contiene vari file che sono generali
per ogni sistema fiscale, tra i quali troviamo:
• File di configurazione ed informazione che
agevolano il lavoro dello sviluppatore;
• Cartelle .github e .circleci;
• Cartella openfisca-name of country, che
contiene, non solo la struttura base di un
sistema fiscale, ma anche vari file che fungono da esempio per comprendere il
collegamento tra le varie componenti viste nella sezione 3.7.
39
3.11 Contributo al progetto Openfisca
In questa sezione, verranno discussi i vari contributi forniti ai vari progetti della
community Openfisca, escludendo openfisca-italy al quale dedicheremo un capitolo
intero.
3.11.1 Contributo al country-template
Per contribuire ad openfisca-country-template abbiamo deciso di sviluppare
due python script:
• Lo script per inizializzare il country-template di un qualsiasi paese
(disponibile al link: https://pastebin.com/fHXRUvac), che generaliz-
za la procedura di adattamento del country-template, rendendola cross-
platform ed user-friendly.
• Lo script per eseguire ricorsivamente tutti i test esistenti in una di-
rectory scelta dall’utente (disponibile al link: https://pastebin.com/
j8BPT3dm), che consente con due semplici click, di eseguire tutti i test all’in-
terno di un sistema fiscale, senza dover ricorrere all’uso del terminale.
3.11.2 Contributo alla documentazione
Durante lo studio della documentazioe e lo sviluppo del software, ci siamo ac-
corti che alcune istruzioni erano errate o mancanti. Parlando col team di sviluppo,
abbiamo potuto aggiornare la documentazione esistente per renderla corretta.
In particolare abbiamo:
• Aggiornato la documentazione riguardante un’istruzione errata e un’istru-
zione mancante nella sezione della codifica delle riforme;
• Preparato l’introduzione di documentazione mancante, riguardante
l’importazione di particolari variabili (Enum) da un file all’altro (che `e as-
solutamente necessaria per avere una buona organizzazione del codice). Di
seguito la bozza da migliorare e convertire in markdown:
Per poter importare una variabile di tipo Enum, da
un file all'altro `e necessario che questo
particolare tipo di variabile si trovi su un
file '.py' in un livello di gerarchia pi`u alto
rispetto al file in cui lo si vuole importare.
Normalmente questa azione non serve, in quanto
tutti gli altri tipo di variabili esistono a
livello globale, a prescindere dalla gerarchia
di directory in cui queste si trovano.
→
→
→
→
→
→
→
→
40
3.11.3 Contributo al core di OpenFisca
Sviluppando il sistema fiscale italiano, ci siamo accorti di alcune migliorie che
potevano essere apportate ad openfisca-core per rendere migliore lo sviluppo di un
generico country-package. In particolare, abbiamo suggerito due migliorie, una di
queste segnalata formlamente tramite issue (visionabile al seguente link: https:
//github.com/openfisca/openfisca-core/issues/657). Questi sugge-
rimenti sono stati accettati dagli sviluppatori e consistono in:
• Nuova funzionalit`a interpretativa del Fancy Indexing Brevemente, il
Fancy Indexing `e un meccanismo che consente di calcolare il valore dei
parametri in base al valore delle variabili a run-time.
Per questo meccanismo, gli sviluppatori hanno previsto solamente un calcolo
di uguaglianza:
– Se la variabile a assume il valore X1 allora il param calc su a varr`a Y1;
– Se la variabile a assume il valore X2 allora il param calc su a varr`a Y2;
– ...
– Se la variabile a assume il valore Xn allora il param calc su a varr`a Yn;
Durante lo sviluppo delle varie leggi, abbiamo trovato l’esigenza di calcolare
parametri in base a un range di valori matematici:
Ad esempio, ci sono alcune soglie che, se non superate, rendono i redditi
scaturiti da pensioni non sono soggetti all’imposta IRPEF. Queste soglie,
cambiano in base all’et`a della persona: Se il soggetto ha 75 anni o meno, vale
il valore di soglia X1 mentre se ha pi`u di 75 anni entra in gioco il valore di
soglia X2.
Per implementare un concetto del gener, con il meccanismo attuale dell’ugua-
glianza, avremmo dovuto definire il primo valore per 75 volte e il secondo per
almeno altre 40 (supponendo che una persona possa vivere fino a 115 anni)
con conseguente spreco di codice.
La soluzione al problema, da noi proposta, `e quella di introdurre un simbolo
che consenta al simulatore, di capire che non vogliamo confrontare il valo-
re della variabile tramite uguaglianza ma tramite un altro criterio (come ad
esempio >= ,<= ,> ,< ...).
• Due campi aggiuntivi per le Variabili
L’esigenza della richiesta dell’introduzione di due nuovi campi, `e sorta durante
lo sviluppo di variabili numeriche che non vengono calcolate tramite una
formula; infatti, l’introduzione di questi due campi varrebbe solamente per
variabili numeriche (una situazione simile alle variabili Enum, che necessitano
di un campo aggiuntivo rispetto a tutti gli altri tipi).
Nel sistema legislativo italiano, ed anche in molti altri sistemi legislativi, esi-
stono variabili che non dipendono da nessun’altra variabile o parametro, ma
che sono soggette a imposizioni numeriche (ad esempio, ci sono alcune detra-
zioni IRPEF che non possono superare una certa quantit`a fissata X).
Queste variabili vengono ovviamente tradotte in variabili il cui valore `e
assegnabile unicamente tramite input, ed `e proprio qui che si presenta
quello che abbiamo denominato Problema del limite superiore-inferiore:
41
Una variabile, il cui valore pu`o essere assegnato unicamente in input, non viene
sottoposta ad alcun controllo semantico, ci`o significa che il valore teorico di
una variabile, che non dovrebbe superare/precedere un certo valore numeri-
co X, pu`o tranquillamente farlo.
Si potrebbe pensare, che questo problema non valga per le variabili il cui
valore `e assegnabile tramite formula, in quanto la formula impone , chia-
ramente, un controllo semantico.
Il problema `e purtroppo valido, anche per loro: come descritto nella sezio-
ne 3.8.2, relativa alle variabili “se una variabile definisce una formula
per essere calcolata, quest’ultima pu`o assumere un valore sia calcolato tramite
una formula sia assegnato in input, mentre non `e vero il contrario”, ma per
l’assioma che regola le priorit`a dell’assegnamento: l’assegnamento in in-
put `e pi`u forte dell’assegnamento tramite formula.
Ci`o significa, che anche il controllo semantico dettato dalla formula pu`o essere
facilmente ignorato. La soluzione da noi proposta, consiste nell’introdurre due
campi all’interno della dichiarazione della variabile numerica:
– max limit: Per definire quale sia il valore massimo che la variabile
numerica pu`o assumere;
– min limit: Per definire quale sia il valore minimo che la variabile nume-
rica pu`o assumere;
Dialogando con il team, abbiamo trovato una soluzione provvisoria che evita
il problema, ma non lo risolve.
La soluzione, consiste nel duplicare la variabile, facendo in modo che la prima
copia, sia quella assegnabile e la seconda sia quella che il sistema considerer`a
per i suoi calcoli e che sottopone la prima ai controlli semantici, una sorta di
wrapping tra variabili.
Ci si chiede ora il motivo per il quale questa soluzione evita il problema ma
non lo risolve: la seconda variabile (ossia quella che sottopone al controllo
la prima, e che verr`a considerata dal sistema) pu`o comunque essere assegnata
in input, cadendo cos`ı nel problema del limite superiore-inferiore.
42
4. OpenFisca Italy
In questa sezione, discuteremo dei criteri con i quali abbiamo scelto le leggi del
sistema fiscale italiano da introdurre nel sistema openfisca-italy e di come queste
sono state implementate.
4.1 Scelta della legislazione
Nella fase di studio preliminare, ci siamo chiesti quali potessero essere le Fonti
Normative principali da dover sviluppare e inserire con priorit`a, all’intero del sistema
Openfisca italiano.
Ragionando assieme all’ Avv. Lonoce Antonino abbiamo concordato che le prime
Fonti da inserire nel sistema dovessero essere:
• Utilizzate dalla maggior parte delle persone fisiche (dato che per ora, nel
sistema openfisca-core non `e possibile definire variabili per entit`a giuridiche);
• Pi`u o meno stabili a livello di comportamento.
Basandoci su questi criteri, la scelta `e ricaduta nell’ambito delle Imposte, in parti-
colare sull’ Imposta sul reddito delle persone fisiche (IRPEF) e sull’ Imposta
municipale unica (IMU).
Queste imposte sono state scelte per due motivazioni principali:
• Ricomprendono la maggior parte dei soggetti (tutti i cittadini sono
contribuenti in tema dell’Imposta sul Reddito a meno di esenzioni, e molti
sono soggetti ad Imu);
• Sono utili per effettuare delle simulazioni e delle statistiche comples-
se. Immaginiamo, ad esempio, di poter calcolare l’imposta Irpef dovuta da
100000 cittadini, ognuno con redditi e situazioni fiscali autonome, prima con la
normative in vigore e poi applicando una “riforma” definita dal legislatore.
Le informazioni scaturite da questi calcoli complessi, una volta organizzate,
potrebbero facilmente aiutare il legislatore nel validare se si debba/possa av-
viare un procedimento legislativo (Es. abbassare o alzare un’aliquota, per un
determinato range di redditi).
43
4.2 Nozioni teoriche IRPEF
In questa sezione, discuteremo della complessa struttura che porta alla defini-
zione dell’IRPEF. Tutte le informazioni relative a quest’imposta sono state derivate
dal TUIR [20] e dal sito dell’Agenzia Delle Entrate [21].
4.2.1 Definizione legislativa
L’Imposta sul reddito delle persone fisiche `e l’imposta diretta sul reddito che
colpisce le persone fisiche nell’ordinamento tributario nazionale.
L’imposta colpisce la capacit`a contributiva personale globale del contribuente (red-
dito posseduto, situazione personale e situazione familiare) con un approccio pro-
gressivo, ossia, viene utilizzata un’aliquota pi`u elevata all’aumentare del reddito
totale [22]. La tabella del sistema a scaglioni [23], che indica le aliquote e la quota
lorda da pagare in base al reddito, `e la seguente:
4.2.2 Struttura generale
Per poter calcolare, in maniera corretta, l’ imposta sul reddito delle persone fisi-
che `e necessario compilare vari fascicoli [24], in particolare, `e necessario il fascicolo
1:
Questo fascicolo `e composto da quadri di vario tipo, in particolare, ogni quadro
possiede un insieme di righi, per il quale `e prevista una regolamentazione per la
compilazione.
La compilazione dei quadri RA, RB, RC, CR, RP LC sono necessari alla for-
mazione della base imponibile e quindi, alla compilazione del quadro RN relativo
alla determinazione dell’IRPEF e di tutti i quadri successivi (RV, DI, RX).
Sarebbe tedioso e superfluo, descrivere tutti i quadri uno per uno, inoltre, tutte
44
le istruzioni per la compilazione sono presenti nel sito dell’Agenzia Delle Entra-
te (https://goo.gl/BNxNWQ). La descrizione dei quadri verr`a, quindi, limitata
alle nozioni necessarie per il calcolo dell’imposta in esame. Di seguito il quadro RN,
relativo alla determinazione dell’IRPEF:
4.2.2.1 Base imponibile
Il presupposto d’imposta e la base imponibile sono individuati nell’ambito delle
discipline delle singole categorie reddituali.
La base imponibile `e la cifra sulla quale viene calcolata l’imposta lorda IRPEF, ed
`e generata dal seguente calcolo:
Base imponibile (RN4)= Reddito complessivo
- Deduzione per abitazione principale
- Oneri deducibili
4.2.2.2 Reddito complessivo
Il reddito complessivo(RN1) `e il risultato della sommatoria delle redditivit`a
prodotte dalla persona fisica. Le tipologie di reddito, che concorrono alla formazione
del reddito complessivo, restrittivamente sono:
• Redditi di lavoro dipendente, sono quelli che derivano da rapporti aventi
per oggetto la prestazione di lavoro, con qualsiasi qualifica, alle dipendenze e
sotto la direzione di altri, compreso il lavoro a domicilio quando `e considerato
lavoro dipendente secondo le norme della legislazione sul lavoro [25];
45
• Redditi di lavoro autonomo,sono quelli derivanti dall’esercizio abituale,
ancorch´e non esclusivo, di attivit`a lavorative diverse da quelle di impresa o di
lavoro dipendente [26];
• Redditi fondiari, sono quelli inerenti ai terreni e ai fabbricati, situati nel
territorio dello Stato, che sono o devono essere iscritti, con attribuzione di
rendita, nel catasto dei terreni o nel catasto edilizio urbano [27];
• Redditi di capitale, sono redditi derivanti dalle rendite finanziarie e dai
dividendi da partecipazione [28];
• Redditi di impresa, sono redditi derivanti dall’esercizio di imprese commer-
ciali, ossia dall’esercizio professionale ed abituale, anche se non esclusivo, delle
attivit`a indicate nell’art. 2195 del codice civile e delle attivit`a agricole indicate
nell’art. 32, c.2, lettere b) e c), che eccedono i limiti ivi stabili, anche se non
organizzate in forma di impresa. [29];
• Redditi diversi, costituiscono una categoria di reddito residuale, che ha
carattere eterogeneo, in quanto comprende i redditi pi`u disparati che non
rientrano nelle altre categorie di reddito o che hanno caratteri peculiari non
inquadrabili in una categoria tipica [30].
In termini algoritmici, il reddito complessivo `e dato da:
Tipologie reddito = [redditi lavoro dipendente,
redditi di capitale, redditi lavoro autonomo,redditi fondiari,
redditi di impresa, redditi lavoro dipendente]
Reddito complessivo =
N
t=1
Tipologie reddito[t]
Gli importi delle varie categorie reddituali, vengono definiti compilando i vari quadri
RA,RB ed RC elencati di seguito:
(a) Quadro RA (b) Quadro RB (c) Quadro RC
4.2.2.3 Deduzione per abitazione principale
Prima di mostrare come si determina la deduzione per abitazione principale,
bisogna definire cosa sia l’ abitazione principale:
“Per abitazione principale si deve intendere l’immobile che il contribuente possiede
46
a titolo di propriet`a o di altro diritto reale e che ha destinato a dimora abituale
propria e dei propri familiari” [31].
Questa deduzione compete:
• al proprietario;
• all’ usufruttuario;
• al titolare di un diritto di abitazione;
• ai familiari del contribuente, se parenti entro il terzo grado ed affini entro il
secondo.
La deduzione per abitazione principale(RN2), si calcola sottraendo al reddito
complessivo il reddito dell’abitazione principale e delle relative pertinen-
ze, attribuita alla casa di abitazione e riducendo, in tal modo, l’importo sul quale
calcolare le imposte.
4.2.2.4 Oneri deducibili
Il totale degli oneri deducibili(RN3), scaturisce dalla compilazione della Se-
zione II del quadro RP, indicato di seguito: Le istruzioni per la compilazione,
sono rimandate alla sezione relativa nel sito della Agenzia Delle Entrate.
47
4.2.2.5 Imposta lorda
Per determinare l’imposta lorda IRPEF(RN5) applicare il metodo a sca-
glioni alla base imponibile. Il calcolo a livello algoritmico `e il seguente:
Imposta lorda IRPEF(R) =
N
i=1
αi ∗ max(0, min(R, Si+1) − Si)
R: Reddito
si: Scaglione
αi: Aliquota
sn+1: ∞
n: numero scagloni
Supponendo che valga la seguente tabella
i
Si
Scaglione
αi
Aliquota
1 0 23%
2 15000 27%
3 28000 38%
4 55000 41%
n = 5 75000 43%
4.2.2.6 Imposta netta
Per calcolare l’imposta IRPEF netta(RN26) `e necessario sottrarre dall’impor-
to lordo il totale delle altre detrazioni d’imposta e crediti d’imposta(RN22)
e il totale delle detrazioni d’imposta(RN25):
Imposta netta IRPEF(R) = Imposta lorda IRPEF(R) -
totale altre detrazioni imposta crediti imposta - totale detrazioni imposta
4.2.2.7 Totale detrazioni d’ imposta
Il totale delle detrazioni di imposta si ottiene sommando il totale delle detra-
zioni per carichi di famiglia e lavoro (RN8) e dalle altre detrazioni indicate
dal rigo RN12 al RN21.
4.2.2.8 Totale altre detrazioni d’ imposta e crediti d’imposta
Il totale delle altre detrazioni di imposta si ottiene dalla somma delle detrazioni
per spese sanitarie per determinate patologie(RN23) e dal totale dei crediti
d’imposta che generano residui(RN24).
48
4.3 Implementazione IRPEF
Dopo aver discusso con l’Avv. Lonoce Antonino dell’imposta ed aver appreso
tutte le nozioni necessarie, siamo passati alla codifica 1
.
Per aiutare un futuro programmatore nella lettura del codice, l’albero di directory
generato per l’implementazione, ha seguito fedelmente la struttura della dichia-
razione dei redditi[32]. Le variabili e i parametri, presenti all’interno dei vari file,
sono stati definiti seguendo le istruzioni per la compilazione delle dichiara-
zione dei redditi [33].
L’implementazione dei vari quadri dell’IRPEF `e stata molto lunga data la comples-
sit`a degli aspetti da gestire (detrazioni specifiche, calcoli di aliquote...). Nonostante
il lungo lavoro di codifica, non `e stato possibile implementare in maniera completa
la compilazione di tutti i quadri necessari. In particolare, `e possibile compilare:
• Il Quadro RP, destinato all’indicazione di specifici oneri che, a seconda dei
casi, possono essere fatti valere nella dichiarazione dei redditi come detraibili
e deducibili.
• Il Quadro LC, destinato all’indicazione della Cedolare secca sulle locazioni.
In particolare, il Quadro LC accoglie la liquidazione unitaria della cedolare
secca complessivamente dovuta dal contribuente per il periodo dichiarativo.
• Il Quadro RN, che riassume tutti i dati, dichiarati negli altri quadri di
questo modello, utili per determinare l’imposta sul reddito delle persone fi-
siche (Irpef). Questo quadro `e compilabile fino al rigo RN26 che corrisponde
all’importo dell’IRPEF netta.
Tutte le varie implementazioni, consentono di definire e/o calcolare ogni rigo per
tutti i quadri2
.
La struttura di tutti gli altri quadri `e stata creata ma non implementata. L’imple-
mentazione dell’IRPEF `e disponibile al seguente link: https://github.com/openfisca/openfisca-
italy3
.
1
Prima di gettarci a capofitto nell’implementazione dell’IRPEF, abbiamo definito variabili e
parametri generali per ogni persona fisica, come l’et`a anagrafica, il codice fiscale, etc...
2
Alcuni righi dei vari quadri (in particolare le detrazioni per i figli a carico) non sono state
sviluppate completamente a causa di strutture dati mancanti che sono ancora in fase di sviluppo
nella piattaforma OpenFisca
3
Tuttavia le varie implementazioni si trovano in branch differenti rispetto a quello principale.
49
4.4 Nozioni teoriche IMU
4.4.1 Definizione legislativa
L’Imposta municipale unica[34] `e un’imposta italiana che si applica sugli immo-
bili che sostituisce l’ICI. Questa imposta[35] `e:
• Diretta: colpisce direttamente il patrimonio che una persona possiede in un
dato momento;
• Patrimoniale: colpisce la disponibilit`a di ricchezza accumulata anche nell’ar-
co di intere generazioni.
Dal 2014 `e stata integrata nella IUC (Imposta Unica Comunale)[36], imposta che
raggruppa le principali imposte locali presenti nel Ordinamento italiano:
• IMU;
• TASI;
• TARI.
4.4.2 Struttura generale
4.4.2.1 Soggetti coinvolti
Nell’imposta sono coinvolti due tipologie di soggetti[37]:
• Soggetto Attivo: Il Comune (che ha funzione impositiva);
• Soggetti Passivi, categoria che include:
– Il proprietario di un immobile;
– I titolari di usufrutto, uso, enfiteusi, abitazione e superficie;
– L’ex coniuge titolare di un immobile;
– Il locatario di un immobile (ad esempio: l’immobile sia concesso in lea-
sing);
– Il concessionario di aree demaniali (ad esempio uno stabilimento balnea-
re).
50
4.4.2.2 Immobili
Il legislatore ha diviso gli immobili nelle seguenti categorie[38] per strutturare al
meglio il calcolo dell’imposta:
Fig. 4.2: Categorie Catastali.
4.4.2.3 Rendita catastale
Per calcolare l’IMU `e necessario conoscere la rendita catastale[39] di un bene
immobile che viene calcolata in base alla categoria di appartenenza, per esempio la
categoria B viene calcolata in base ai metri cubi. Il valore della rendita catastale
pu`o essere richiesto dall’Ufficio dell’Agenzia del territorio fornendo i dati catastali
dell’immobile.
La rendita verr`a successivamente rivalutata del 5 percento per compensare l’errore
dato dall’estimo (25 percento per il gruppo T).
51
4.4.2.4 Moltiplicatori Catastali e Aliquote
Per ogni categoria `e presente un moltiplicatore catastale che andr`a moltiplicato
per la rendita catastale rivalutata, il risultato di questa operazione `e chiamata base
imponibile. I moltiplicatori[40] sono i seguenti:
• 160: Per le categorie C/2, C/6, C/7 e tutto il gruppo A tranne la categoria
A/10;
• 140: Per il gruppo B e le categorie C/3, C/4, C/5;
• 135: Per il gruppo T;
• 110: Per il gruppo T che abbia come possessore un coltivatore diretto o un
imprenditore agricolo professionale;
• 80: Per le categorie A/10 e D/5
• 65: Per il gruppo D tranne la categoria D/5;
• 55: Per la categoria C/1
Successivamente la base imponibile viene moltiplicata per l’aliquota della categoria
dell’immobile[41]a cui fa riferimento; questa che pu`o essere modificata dal Comune
dov’`e locato l’immobile, se cos`ı non fosse, allora viene applicata l’aliquota stan-
dard relativa alla categoria dell’immobile. Il risultato dell’operazione `e chiamata
Imposta IMU.
Fig. 4.3: Aliquote Catastali[42].
52
4.4.2.5 Percentuale, Mesi di possesso e Detrazioni
L’imposta tiene anche conto dei mesi e la percentuale di possesso dell’immobile,
per ottenere l’importo da pagare di un determinato immobile posseduto X mesi in
una percentuale Y, successivamente vengono poi sottratte le detrazioni Imu (che
vengono date in determinati casi)[43].
Risultato = ImpostaImu ∗
X
12
∗
Y
100
− DetrazioniImu
4.4.2.6 Esenti parziali/totali
L’imposta offre uno sconto totale o parziale in base a determinati fattori quali
la tipologia, l’ubicazione, lo stato, lo scopo ed il possessore dell’immobile[44].
Sono esenti al 100% gli immobili:
• Appartenenti allo Stato;
• Appartenenti a regioni, province, comuni, comunit`a montane, consorzi dei
enti (non soppressi), enti del servizio sanitario nazionale destinati a scopi
istituzionali;
• Destinati ai compiti istituzionali posseduti dai consorzi tra enti territoriali,
prevista all’art. 7, comma 1, lett. a), del D. Lgs. n. 504 del 1992;
• Classificati nel gruppo E
• Destinati ad usi culturali di cui all’art. 5-bis del D.P.R. 29 settembre 1973, n.
601, e successive modificazioni;
• Destinati esclusivamente all’esercizio del culto, purch´e compatibile con le di-
sposizioni degli artt. 8 e 19 della Costituzione, e le loro pertinenze;
• Di propriet`a della Santa Sede indicati negli artt. 13, 14, 15 e 16 del Trattato
lateranense;
• Appartenenti agli Stati esteri ed alle organizzazioni internazionali per i quali
`e prevista l’esenzione dall’imposta locale sul reddito dei fabbricati in base ad
accordi internazionali resi esecutivi in Italia;
• Utilizzati dai soggetti di cui all’art. 73, comma 1, lett. c), del TUIR, destinati
esclusivamente allo svolgimento con modalit`a non commerciali di attivit`a as-
sistenziali, previdenziali, sanitarie, didattiche, ricettive, culturali, ricreative e
sportive, nonch´e delle attivit`a di cui all’art. 16, lett. a), della legge 20 maggio
1985, n. 222;
• Rurali ad uso strumentale di cui all’art. 9, comma 3-bis, del D. L. n. 557 del
1993, ubicati nei comuni classificati montani o parzialmente montani di cui
all’elenco dei comuni italiani predisposto dall’ISTAT;
• Appartenti alla categoria T e ricadenti in aree montane o di collina individuati
dalla circolare del Ministero delle Finanze n. 9 del 14/06/1993
53
• Appartenti alla categoria T e posseduti e condotti da coltivatori diretti (CD)
o da imprenditori agricoli professionali (IAP);
• Appartenti alla categoria T e ubicati nei comuni delle isole minori di cui
all’allegato A annesso alla legge 28/12/2011 n.448;
• Appartenti alla categoria T e con immutabile destinazione agrosilvo-pastorale
a propriet`a collettiva indivisibile e inusucapibile;
• Ad uso abitativo ma non locata (con le relative pertinenze) posseduta da
anziani o disabili residenti in modo permanente presso un istituto di ricove-
ro/sanitario;
• Aventi il ruolo di prima casa appartenenti fra la categoria A/2 e A/7 (Legge
di stabilit`a 2014) con le pertinenze (C/2, C/6, C/7)) ad essa correlata (valida
solo per un’istanza per ogni categoria di pertinenza).
Sono esenti al 25% gli immobili locati a canone concordato, cio`e relativo a
contratti dalla durata minima di 5 anni 4
che abbiano importi minimi e massimi
stabiliti a livello locale, dal Comune in cui risiede l’immobile.
Sono esenti al 50% sull’imposta imu gli immobili per il comodato d’uso gratuito
genitori-figli, cio`e la consegna gratuita di un immobile per un certo lasso di tempo
a genitori/figli. Questo `e valido solo se:
• Il contratto di comodato `e stato regolarmente registrato presso l’Agenzia delle
Entrate;
• Il comodante possiede un solo immobile sul territorio nazionale e che risieda e
dimori abitualmente nello stesso comune in cui `e situato l’immobile concesso
in comodato;
• Il comodante oltre a possedere l’immobile dato in comodato, possiede nello
stesso comune un altro immobile adibito a propria abitazione principale, fatta
eccezione delle abitazioni di categorie catastali A/1, A/8 e A/9.
`E presente uno sconto del 50% sulla base imponibile dell’immobile per i fabbri-
cati di interesse storico o artistico, e per i fabbricati dichiarati inagibili (accertati
dall’ufficio tecnico comunale).
4.5 Implementazione IMU
Dopo aver discusso con l’Avv. Lonoce Antonino dell’imposta ed aver appreso i
concetti necessari, siamo passati alla codifica. In questa sezione mostriamo breve-
mente i risultati ottenuti.
Sfortunatamente l’implementazione dell’IMU non sar`a dettagliata come quella del-
l’IRPEF a causa della sua enorme complessit`a e della grandissima articolazione delle
sue variabili, ci`o avrebbe richiesto un numero maggiore di colloqui con l’avvocato.
Inoltre un’analisi pi`u approfondita avrebbe richiesto un’implementazione pi`u det-
tagliata con strutture dati che sono ancora in fase di sviluppo nella piattaforma
OpenFisca. Inizialmente abbiamo implementato la base dell’IMU:
4
Il contratto `e nella forma 3 + 2 cio`e dura 3 anni ma `e previsto un rinnovo tacito di 2 anni.
54
• Categorie catastali;
• Aliquote;
• Variabili booleane per verificare delle condizioni;
• Variabili basilari dell’immobile (base imponibile, valore dell’immobile...)
Successivamente abbiamo implementato tutte le formule utili per calcolare l’IMU
su:
• Aree fabbricabili;
• Seconda casa;
• Prima casa;
• Immobili a canone concordato;
• Immobili con interesse storico/artistico;
• Immobili inagibili;
• Immobili posseduti in una determinata percentuale;
• Immobili posseduti solo per un numero definito di mesi;
• Pertinenze dell’immobile;
• Terreni.
Tutto ci`o `e stato anche testato durante l’implementazione in modo che le nuove
funzionalit`a non intacchino le precedenti. Il codice riguardante l’IMU `e disponibi-
le al seguente URL: https://github.com/openfisca/openfisca-italy/
tree/Initizialize_open-fisca-italy/openfisca_italy5
5
Attualmente le funzionalit`a sopra riportate non si trovano sul branch master
55
5. Openfisca Managing Tool
Avendo gi`a descritto, anche se in minima parte, il sistema openfisca-italy, pos-
siamo ora descrivere l’argomento centrale della tesi, il software di nostra concezione
Openfisca Managing Tool (repository Github: https://goo.gl/s9kFhz).
In particolare, descriveremo le motivazioni che ci hanno spinto a sviluppare questo
software, l’architettura e le varie funzionalit`a, descrivendole dapprima in maniera
teorica con l’ausilio di diagrammi per poi passare alla descrizione dell’
implementazione, con l’ausilio di immagini derivate dal software .
5.1 Scopo del software
Durante lo sviluppo del sistema openfisca-italy abbiamo constatato che sarebbe
impossibile, per il legislatore, definire nuove riforme, variabili , parametri o effettuare
analisi senza l’ausilio di un team di sviluppatori. Da questa premessa, nasce l’idea
Openfisca Managing Tool, che si propone di essere un software user-friendly per
la gestione e l’analisi di un generico sistema fiscale openfisca.
56
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems
Openfisca Managing Tool: a tool to manage fiscal sistems

More Related Content

What's hot

Il Modello Pragmatico Elementare per lo sviluppo di Sistemi Adattivi - Tesi
Il Modello Pragmatico Elementare per lo sviluppo di Sistemi Adattivi - TesiIl Modello Pragmatico Elementare per lo sviluppo di Sistemi Adattivi - Tesi
Il Modello Pragmatico Elementare per lo sviluppo di Sistemi Adattivi - TesiFrancesco Magagnino
 
Linee guida AGID su acquisizione e riuso di software per le pubbliche amminis...
Linee guida AGID su acquisizione e riuso di software per le pubbliche amminis...Linee guida AGID su acquisizione e riuso di software per le pubbliche amminis...
Linee guida AGID su acquisizione e riuso di software per le pubbliche amminis...Simone Aliprandi
 
Progetto e sviluppo di un'applicazionemobile multipiattaforma per il supporto...
Progetto e sviluppo di un'applicazionemobile multipiattaforma per il supporto...Progetto e sviluppo di un'applicazionemobile multipiattaforma per il supporto...
Progetto e sviluppo di un'applicazionemobile multipiattaforma per il supporto...maik_o
 
Cloud Computing: Una Soluzione "Private" Basata Su Software IBM (Tesi di laur...
Cloud Computing: Una Soluzione "Private" Basata Su Software IBM (Tesi di laur...Cloud Computing: Una Soluzione "Private" Basata Su Software IBM (Tesi di laur...
Cloud Computing: Una Soluzione "Private" Basata Su Software IBM (Tesi di laur...Alberto Scotto
 
Imparare c n.104
Imparare c  n.104Imparare c  n.104
Imparare c n.104Pi Libri
 
Progetto e realizzazione di un kernel linux per il controllo dinamico degli s...
Progetto e realizzazione di un kernel linux per il controllo dinamico degli s...Progetto e realizzazione di un kernel linux per il controllo dinamico degli s...
Progetto e realizzazione di un kernel linux per il controllo dinamico degli s...Myrteza Kertusha
 
Tesi Laurea Sergio Taddia
Tesi Laurea Sergio TaddiaTesi Laurea Sergio Taddia
Tesi Laurea Sergio TaddiaSergio Taddia
 
Documentazione progetto software - IoSegnalo
Documentazione progetto software - IoSegnaloDocumentazione progetto software - IoSegnalo
Documentazione progetto software - IoSegnaloMarco Vaiano
 
Progetto e Realizzazione di un Software per la Rilevazione Automatica di Codi...
Progetto e Realizzazione di un Software per la Rilevazione Automatica di Codi...Progetto e Realizzazione di un Software per la Rilevazione Automatica di Codi...
Progetto e Realizzazione di un Software per la Rilevazione Automatica di Codi...danielenicassio
 
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...Francesco Cucari
 
Interfaccia utente basata su eye-tracking per sistemi di controllo ambientale
Interfaccia utente basata su eye-tracking per sistemi di controllo ambientaleInterfaccia utente basata su eye-tracking per sistemi di controllo ambientale
Interfaccia utente basata su eye-tracking per sistemi di controllo ambientaleLuigi De Russis
 
Inoltro di pacchetti ip in sistemi linux
Inoltro di pacchetti ip in sistemi linuxInoltro di pacchetti ip in sistemi linux
Inoltro di pacchetti ip in sistemi linuxCe.Se.N.A. Security
 
Software Architecture Documentation - Fastfood
Software Architecture Documentation - FastfoodSoftware Architecture Documentation - Fastfood
Software Architecture Documentation - Fastfoodgioacchinolonardo
 
Publish/Subscribe EDI with Content-Based Routing
Publish/Subscribe EDI with Content-Based RoutingPublish/Subscribe EDI with Content-Based Routing
Publish/Subscribe EDI with Content-Based RoutingNicola Mezzetti
 
Tesi Triennale - X509 e PGP
Tesi Triennale - X509 e PGPTesi Triennale - X509 e PGP
Tesi Triennale - X509 e PGPFabio Pustetto
 

What's hot (20)

Il Modello Pragmatico Elementare per lo sviluppo di Sistemi Adattivi - Tesi
Il Modello Pragmatico Elementare per lo sviluppo di Sistemi Adattivi - TesiIl Modello Pragmatico Elementare per lo sviluppo di Sistemi Adattivi - Tesi
Il Modello Pragmatico Elementare per lo sviluppo di Sistemi Adattivi - Tesi
 
Linee guida AGID su acquisizione e riuso di software per le pubbliche amminis...
Linee guida AGID su acquisizione e riuso di software per le pubbliche amminis...Linee guida AGID su acquisizione e riuso di software per le pubbliche amminis...
Linee guida AGID su acquisizione e riuso di software per le pubbliche amminis...
 
Progetto e sviluppo di un'applicazionemobile multipiattaforma per il supporto...
Progetto e sviluppo di un'applicazionemobile multipiattaforma per il supporto...Progetto e sviluppo di un'applicazionemobile multipiattaforma per il supporto...
Progetto e sviluppo di un'applicazionemobile multipiattaforma per il supporto...
 
Guida C# By Megahao
Guida C# By MegahaoGuida C# By Megahao
Guida C# By Megahao
 
Cloud Computing: Una Soluzione "Private" Basata Su Software IBM (Tesi di laur...
Cloud Computing: Una Soluzione "Private" Basata Su Software IBM (Tesi di laur...Cloud Computing: Una Soluzione "Private" Basata Su Software IBM (Tesi di laur...
Cloud Computing: Una Soluzione "Private" Basata Su Software IBM (Tesi di laur...
 
Dynamic Scheduling
Dynamic SchedulingDynamic Scheduling
Dynamic Scheduling
 
Imparare c n.104
Imparare c  n.104Imparare c  n.104
Imparare c n.104
 
ECDL-modulo1
ECDL-modulo1ECDL-modulo1
ECDL-modulo1
 
Progetto e realizzazione di un kernel linux per il controllo dinamico degli s...
Progetto e realizzazione di un kernel linux per il controllo dinamico degli s...Progetto e realizzazione di un kernel linux per il controllo dinamico degli s...
Progetto e realizzazione di un kernel linux per il controllo dinamico degli s...
 
Tesi Laurea Sergio Taddia
Tesi Laurea Sergio TaddiaTesi Laurea Sergio Taddia
Tesi Laurea Sergio Taddia
 
Tesi peiretti
Tesi peirettiTesi peiretti
Tesi peiretti
 
Documentazione progetto software - IoSegnalo
Documentazione progetto software - IoSegnaloDocumentazione progetto software - IoSegnalo
Documentazione progetto software - IoSegnalo
 
Progetto e Realizzazione di un Software per la Rilevazione Automatica di Codi...
Progetto e Realizzazione di un Software per la Rilevazione Automatica di Codi...Progetto e Realizzazione di un Software per la Rilevazione Automatica di Codi...
Progetto e Realizzazione di un Software per la Rilevazione Automatica di Codi...
 
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...
 
Interfaccia utente basata su eye-tracking per sistemi di controllo ambientale
Interfaccia utente basata su eye-tracking per sistemi di controllo ambientaleInterfaccia utente basata su eye-tracking per sistemi di controllo ambientale
Interfaccia utente basata su eye-tracking per sistemi di controllo ambientale
 
Inoltro di pacchetti ip in sistemi linux
Inoltro di pacchetti ip in sistemi linuxInoltro di pacchetti ip in sistemi linux
Inoltro di pacchetti ip in sistemi linux
 
Software Architecture Documentation - Fastfood
Software Architecture Documentation - FastfoodSoftware Architecture Documentation - Fastfood
Software Architecture Documentation - Fastfood
 
Publish/Subscribe EDI with Content-Based Routing
Publish/Subscribe EDI with Content-Based RoutingPublish/Subscribe EDI with Content-Based Routing
Publish/Subscribe EDI with Content-Based Routing
 
Sismicadita
SismicaditaSismicadita
Sismicadita
 
Tesi Triennale - X509 e PGP
Tesi Triennale - X509 e PGPTesi Triennale - X509 e PGP
Tesi Triennale - X509 e PGP
 

Similar to Openfisca Managing Tool: a tool to manage fiscal sistems

Uno studio sull'efficacia di checker automatici per la modernizzazione di cod...
Uno studio sull'efficacia di checker automatici per la modernizzazione di cod...Uno studio sull'efficacia di checker automatici per la modernizzazione di cod...
Uno studio sull'efficacia di checker automatici per la modernizzazione di cod...Idriss Riouak
 
Tesi Triennale - Grid Credit System: un portale per la sostenibilità di COMPCHEM
Tesi Triennale - Grid Credit System: un portale per la sostenibilità di COMPCHEMTesi Triennale - Grid Credit System: un portale per la sostenibilità di COMPCHEM
Tesi Triennale - Grid Credit System: un portale per la sostenibilità di COMPCHEMDavide Ciambelli
 
Imparare asp.net 107
Imparare asp.net 107Imparare asp.net 107
Imparare asp.net 107Pi Libri
 
Progettazione e sviluppo di un'applicazione web per la gestione di dati di at...
Progettazione e sviluppo di un'applicazione web per la gestione di dati di at...Progettazione e sviluppo di un'applicazione web per la gestione di dati di at...
Progettazione e sviluppo di un'applicazione web per la gestione di dati di at...daniel_zotti
 
Analisi e sviluppo di un sistema collaborativo simultaneo per la modifica di ...
Analisi e sviluppo di un sistema collaborativo simultaneo per la modifica di ...Analisi e sviluppo di un sistema collaborativo simultaneo per la modifica di ...
Analisi e sviluppo di un sistema collaborativo simultaneo per la modifica di ...Filippo Muscolino
 
GaPiL - Guida alla Programmazione in Linux
GaPiL - Guida alla Programmazione in LinuxGaPiL - Guida alla Programmazione in Linux
GaPiL - Guida alla Programmazione in LinuxAmmLibera AL
 
Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...
Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...
Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...Davide Ciambelli
 
24546913 progettazione-e-implementazione-del-sistema-di-controllo-per-un-pend...
24546913 progettazione-e-implementazione-del-sistema-di-controllo-per-un-pend...24546913 progettazione-e-implementazione-del-sistema-di-controllo-per-un-pend...
24546913 progettazione-e-implementazione-del-sistema-di-controllo-per-un-pend...maaske
 
CaputiDomenicoMagistrale
CaputiDomenicoMagistraleCaputiDomenicoMagistrale
CaputiDomenicoMagistraleDomenico Caputi
 
Anomaly detection in network traffic flows with big data analysis techniques
Anomaly detection in network traffic flows with big data analysis techniques Anomaly detection in network traffic flows with big data analysis techniques
Anomaly detection in network traffic flows with big data analysis techniques Maurizio Cacace
 
Porting evolutivo di un’applicazione per la gestione di note spese in ambient...
Porting evolutivo di un’applicazione per la gestione di note spese in ambient...Porting evolutivo di un’applicazione per la gestione di note spese in ambient...
Porting evolutivo di un’applicazione per la gestione di note spese in ambient...enriconatella
 
Guida all'estrazione di dati dai Social Network
Guida all'estrazione di dati dai Social NetworkGuida all'estrazione di dati dai Social Network
Guida all'estrazione di dati dai Social NetworkLeonardo Di Donato
 
Estrazione automatica di informazioni da documenti cartacei: progetto e reali...
Estrazione automatica di informazioni da documenti cartacei: progetto e reali...Estrazione automatica di informazioni da documenti cartacei: progetto e reali...
Estrazione automatica di informazioni da documenti cartacei: progetto e reali...Luca Bressan
 
Progettazione e Sviluppo di un Sistema per Migliorare il Codice Generato da u...
Progettazione e Sviluppo di un Sistema per Migliorare il Codice Generato da u...Progettazione e Sviluppo di un Sistema per Migliorare il Codice Generato da u...
Progettazione e Sviluppo di un Sistema per Migliorare il Codice Generato da u...DamianoRavalico
 
Sviluppo Di Portali Tramite La Tecnologia Sharepoint
Sviluppo Di Portali Tramite La Tecnologia SharepointSviluppo Di Portali Tramite La Tecnologia Sharepoint
Sviluppo Di Portali Tramite La Tecnologia SharepointDenis Tomada
 

Similar to Openfisca Managing Tool: a tool to manage fiscal sistems (20)

Uno studio sull'efficacia di checker automatici per la modernizzazione di cod...
Uno studio sull'efficacia di checker automatici per la modernizzazione di cod...Uno studio sull'efficacia di checker automatici per la modernizzazione di cod...
Uno studio sull'efficacia di checker automatici per la modernizzazione di cod...
 
Tesi Triennale - Grid Credit System: un portale per la sostenibilità di COMPCHEM
Tesi Triennale - Grid Credit System: un portale per la sostenibilità di COMPCHEMTesi Triennale - Grid Credit System: un portale per la sostenibilità di COMPCHEM
Tesi Triennale - Grid Credit System: un portale per la sostenibilità di COMPCHEM
 
Imparare asp.net 107
Imparare asp.net 107Imparare asp.net 107
Imparare asp.net 107
 
Progettazione e sviluppo di un'applicazione web per la gestione di dati di at...
Progettazione e sviluppo di un'applicazione web per la gestione di dati di at...Progettazione e sviluppo di un'applicazione web per la gestione di dati di at...
Progettazione e sviluppo di un'applicazione web per la gestione di dati di at...
 
Tesi Tamiazzo09
Tesi Tamiazzo09Tesi Tamiazzo09
Tesi Tamiazzo09
 
Analisi e sviluppo di un sistema collaborativo simultaneo per la modifica di ...
Analisi e sviluppo di un sistema collaborativo simultaneo per la modifica di ...Analisi e sviluppo di un sistema collaborativo simultaneo per la modifica di ...
Analisi e sviluppo di un sistema collaborativo simultaneo per la modifica di ...
 
GaPiL - Guida alla Programmazione in Linux
GaPiL - Guida alla Programmazione in LinuxGaPiL - Guida alla Programmazione in Linux
GaPiL - Guida alla Programmazione in Linux
 
Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...
Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...
Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...
 
24546913 progettazione-e-implementazione-del-sistema-di-controllo-per-un-pend...
24546913 progettazione-e-implementazione-del-sistema-di-controllo-per-un-pend...24546913 progettazione-e-implementazione-del-sistema-di-controllo-per-un-pend...
24546913 progettazione-e-implementazione-del-sistema-di-controllo-per-un-pend...
 
Monitoraggio di rete con nagios
Monitoraggio di rete con nagiosMonitoraggio di rete con nagios
Monitoraggio di rete con nagios
 
Sat howto
Sat howtoSat howto
Sat howto
 
Compas Project
Compas ProjectCompas Project
Compas Project
 
CaputiDomenicoMagistrale
CaputiDomenicoMagistraleCaputiDomenicoMagistrale
CaputiDomenicoMagistrale
 
repairpdf_Oy51nCFX
repairpdf_Oy51nCFXrepairpdf_Oy51nCFX
repairpdf_Oy51nCFX
 
Anomaly detection in network traffic flows with big data analysis techniques
Anomaly detection in network traffic flows with big data analysis techniques Anomaly detection in network traffic flows with big data analysis techniques
Anomaly detection in network traffic flows with big data analysis techniques
 
Porting evolutivo di un’applicazione per la gestione di note spese in ambient...
Porting evolutivo di un’applicazione per la gestione di note spese in ambient...Porting evolutivo di un’applicazione per la gestione di note spese in ambient...
Porting evolutivo di un’applicazione per la gestione di note spese in ambient...
 
Guida all'estrazione di dati dai Social Network
Guida all'estrazione di dati dai Social NetworkGuida all'estrazione di dati dai Social Network
Guida all'estrazione di dati dai Social Network
 
Estrazione automatica di informazioni da documenti cartacei: progetto e reali...
Estrazione automatica di informazioni da documenti cartacei: progetto e reali...Estrazione automatica di informazioni da documenti cartacei: progetto e reali...
Estrazione automatica di informazioni da documenti cartacei: progetto e reali...
 
Progettazione e Sviluppo di un Sistema per Migliorare il Codice Generato da u...
Progettazione e Sviluppo di un Sistema per Migliorare il Codice Generato da u...Progettazione e Sviluppo di un Sistema per Migliorare il Codice Generato da u...
Progettazione e Sviluppo di un Sistema per Migliorare il Codice Generato da u...
 
Sviluppo Di Portali Tramite La Tecnologia Sharepoint
Sviluppo Di Portali Tramite La Tecnologia SharepointSviluppo Di Portali Tramite La Tecnologia Sharepoint
Sviluppo Di Portali Tramite La Tecnologia Sharepoint
 

Openfisca Managing Tool: a tool to manage fiscal sistems

  • 1. Universit`a degli studi di Camerino Scuola di Scienze e Tecnologie Corso di Laurea in Informatica (Classe L-31) Openfisca Managing Tool: strumento per la gestione di sistemi fiscali Tesi sperimentale Laureandi Stacchio Lorenzo Petrelli Corrado Relatore Prof. Polini Andrea Correlatore Prof. Esposito Roberto Avv. Lonoce Antonino Anno Accademico 2017/2018
  • 2.
  • 3. Indice 1 Introduzione 2 2 Metodologie e strumenti di sviluppo 4 2.1 Sviluppo Open Source . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2 La community . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2.1 AgID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2.2 DevelopersItalia . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.3 Simulazione e Microsimulazione . . . . . . . . . . . . . . . . . . . . . 7 2.3.1 Definizione di Simulatore e Simulazione . . . . . . . . . . . . . 7 2.3.2 Microsimulazione . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.4 OpenFisca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.5 OpenFisca-italy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.6 OpenFisca-Management-Tool . . . . . . . . . . . . . . . . . . . . . . 9 2.7 Strumenti open-source utilizzati durante lo sviluppo . . . . . . . . . . 10 2.7.1 Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.7.2 Github . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.7.3 Slack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.7.4 GitKraken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.7.5 Atom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.7.6 CircleCI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.8 Linguaggi Utilizzati . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.8.1 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.8.2 Pew . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.8.3 Python Kivy . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.8.4 GitHub Flavored Markdown . . . . . . . . . . . . . . . . . . . 16 3 OpenFisca 17 3.1 Struttura dello stack Openfisca . . . . . . . . . . . . . . . . . . . . . 17 3.2 Esempi di utilizzo di sistemi Openfisca . . . . . . . . . . . . . . . . . 18 3.3 Analisi dei requisiti e studio preliminare . . . . . . . . . . . . . . . . 19 3.4 Studio del core di Openfisca . . . . . . . . . . . . . . . . . . . . . . . 20 3.5 Studio della documentazione per sviluppare il country-package . . . . 21 3.6 Descrizione della documentazione per sviluppare il country-package . 21 3.7 Openfisca Core: Concetti chiave . . . . . . . . . . . . . . . . . . . . . 22 3.7.1 Sistema di tasse e benefici . . . . . . . . . . . . . . . . . . . . 22 3.7.2 Entit`a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
  • 4. 3.7.3 Variabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.7.4 Parametro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.7.5 Periodo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.7.6 Riforma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.7.7 Test per le variabili . . . . . . . . . . . . . . . . . . . . . . . . 23 3.7.8 Simulazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.8 Codifica del country-package: “Dalla legge al codice” . . . . . . . . . 23 3.8.1 Entit`a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.8.2 Variabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.8.3 Parametro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.8.4 Riforma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.8.5 Test per le variabili . . . . . . . . . . . . . . . . . . . . . . . . 33 3.8.6 Simulazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.8.7 Estensione dei file per la codifica . . . . . . . . . . . . . . . . 35 3.9 Flusso operativo della simulazione . . . . . . . . . . . . . . . . . . . . 36 3.9.1 Regione1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.9.2 Regione2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.9.3 Regione3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.10 Openfisca country-template . . . . . . . . . . . . . . . . . . . . . . . 39 3.10.1 Country-template . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.11 Contributo al progetto Openfisca . . . . . . . . . . . . . . . . . . . . 40 3.11.1 Contributo al country-template . . . . . . . . . . . . . . . . . 40 3.11.2 Contributo alla documentazione . . . . . . . . . . . . . . . . . 40 3.11.3 Contributo al core di OpenFisca . . . . . . . . . . . . . . . . . 41 4 OpenFisca Italy 43 4.1 Scelta della legislazione . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4.2 Nozioni teoriche IRPEF . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.2.1 Definizione legislativa . . . . . . . . . . . . . . . . . . . . . . . 44 4.2.2 Struttura generale . . . . . . . . . . . . . . . . . . . . . . . . 44 4.3 Implementazione IRPEF . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.4 Nozioni teoriche IMU . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 4.4.1 Definizione legislativa . . . . . . . . . . . . . . . . . . . . . . . 50 4.4.2 Struttura generale . . . . . . . . . . . . . . . . . . . . . . . . 50 4.5 Implementazione IMU . . . . . . . . . . . . . . . . . . . . . . . . . . 54 5 Openfisca Managing Tool 56 5.1 Scopo del software . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.2 Funzionalit`a del software . . . . . . . . . . . . . . . . . . . . . . . . . 57 5.3 Architettura del sistema . . . . . . . . . . . . . . . . . . . . . . . . . 57 5.3.1 Regione 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 5.3.2 Regione 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 5.3.3 Regione 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 5.3.4 Regione 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 5.4 Dalla teoria alla pratica . . . . . . . . . . . . . . . . . . . . . . . . . 62 5.4.1 Download and choose an openfisca system . . . . . . . . . . . 62 5.4.2 Home . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 5.4.3 Legislation Explorer . . . . . . . . . . . . . . . . . . . . . . . 64 5.4.4 Reform Maker . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
  • 5. 5.4.5 Simulation Maker . . . . . . . . . . . . . . . . . . . . . . . . . 66 5.5 Openfisca Managing Tool: Manuale d’uso . . . . . . . . . . . . . . . . 68 5.5.1 Schermata Iniziale . . . . . . . . . . . . . . . . . . . . . . . . 68 5.5.2 Schermata Home . . . . . . . . . . . . . . . . . . . . . . . . . 68 5.5.3 Schermata Visualizza Sistema . . . . . . . . . . . . . . . . . . 69 5.5.4 Schermata Effettua Riforme . . . . . . . . . . . . . . . . . . . 70 5.5.5 Schermata Effettua Simulazione . . . . . . . . . . . . . . . . . 77 5.6 Fattori esterni che causano il mal funzionamento del sistema . . . . . 82 5.6.1 Lunghezza massima del pathname su sistemi operativi Windows 82 5.6.2 Standardizzazione nella nomenclatura delle directory nei si- stemi Openfisca . . . . . . . . . . . . . . . . . . . . . . . . . . 82 5.6.3 Problemi di versioning delle dipendenze tra i vari Openfisca . 83 5.7 Funzionalit`a future da implementare . . . . . . . . . . . . . . . . . . 84 5.7.1 Impossibilit`a di aggiungere e/o modificare Variabili di tipo Enum nelle riforme . . . . . . . . . . . . . . . . . . . . . . . . 84 5.7.2 Mancanza di riferimenti alle Enumeration per Variabili di tipo Enum in lettura . . . . . . . . . . . . . . . . . . . . . . . . . . 84 5.7.3 Parameter Reform . . . . . . . . . . . . . . . . . . . . . . . . 84 5.7.4 Parameter Node reader . . . . . . . . . . . . . . . . . . . . . . 84 6 Conclusioni 85 7 Ringraziamenti 87
  • 6. Abstract Diversi stati nel mondo hanno tempi per l’attuazione di procedimenti legisla- tivi molto lunghi, che spesso non portano al risultato desiderato. Per evitare ci`o, si effettua una pianificazione strategica che non `e sempre cos`ı semplice da progettare e da verificare dato l’elevato numero di variabili da gestire. Inoltre, una pianificazione strategica approfondita `e molto costosa in termini di tempo (che potrebbe essere dedicato all’attuazione dei procedimenti legislativi). Proprio per i motivi sopracitati, `e necessario rendere trasparente tale pianificazione e poter valutare, in modo immediato, l’impatto che avrebbe un nuovo procedimento legislativo su tutto il sistema. Contribuisce a questo obiettivo OpenFisca (organizzazione governativa francese) che `e riuscita a sviluppare uno stack di moduli open-source in grado di definire un sistema di tasse e benefici per ogni stato esistente. In questo contesto ci siamo mossi per sviluppare il sistema di tasse e benefici italiano. Successivamente, valutando le alte barriere professionali che impediscono l’utiliz- zo del sistema ai non esperti nell’ambito informatico, abbiamo deciso di creare il progetto Openfisca Managing Tool, che propone di essere un software multi- piattaforma a interfaccia grafica per la gestione di un qualsiasi sistema di tasse e benefici. 1
  • 7. 1. Introduzione Alla base di questo documento vi `e l’analisi dello stack di componenti open- source del sistema Openfisca (sviluppato dall’omonima organizzazione) e l’analisi delle problematiche relative al sistema stesso, che generano barriere professionali per l’utilizzo. In particolare, lo stack di componenti Openfisca consente di: • Definire un sistema di tasse e benefici per ogni paese esistente al mondo; • Effettuare delle simulazioni su di un qualsiasi sistema di tasse e benefici gi`a definito; • Valutare l’impatto di una riforma su di un qualsiasi sistema di tasse e benefici gi`a definito. Le motivazioni, che ci hanno spinto ad approfondire l’analisi dello stack di componenti del sistema Openfisca, sono molteplici: • L’interesse per il campo della microsimulazione del quale eravamo neofiti; • Fornire al legislatore un software di microsimulazione econometrica, comple- tamente open-source, per il sistema fiscale italiano; • La nascita di rapporti internazionali con team di sviluppo da differenti paesi. Nonostante le premesse, l’obiettivo di questa tesi non `e solamente quello di fornire un’analisi del sistema Openfisca, mettendo in evidenza sia le caratteristiche che le problematiche, ma `e anche quello di mostrare le scelte, organizzative ed ope- rative adottate per lo sviluppo del sistema openfisca-italy (sfruttando il motore Openfisca-Core) e del software Openfisca Managing Tool. Nonostante la complessit`a del sistema openfisca-italy, questo non sar`a l’argomen- to centrale della tesi; lo `e Il software ad interfaccia grafica, di nostra invenzione, Openfisca Managing Tool il cui scopo `e quello di fornire un’implementazione per le seguenti operazioni: • Visualizzazione del sistema di regolamenti legislativi 1 gi`a definiti all’in- terno di un sistema di tasse e benefici Openfisca; 1 I regolamenti legislativi si concretizzano in strutture che verranno definite nel capitolo relativo ad Openfisca 2
  • 8. • Definizione di riforme, che consentono la modifica dei regolamenti gi`a definiti e/o la definizione di nuovi regolamenti legislativi; • Simulazioni sul sistema corrente e su di un sistema riformato. Openfisca-italy ed Openfisca Managing Tool, sono stati progettati e sviluppati adottando tecniche tipiche della metodologia AGILE, effettuando revisioni continue dei prototipi creati con il team Openfisca. Sono state anche adottate tecniche per la facilitazione dell’internazionalizzazione del sistema. Il linguaggio di codifica scelto `e Python 2.7 (necessario per sviluppare un qualunque sistema openfisca) accoppiato con il framework Python Kivy. La tesi `e articolata in quattro capitoli: 1. Nel primo capitolo, viene fornita una descrizione, abbastanza dettagliata delle metodologie e degli strumenti utilizzati per sviluppare sia il sistema Openfisca-italy che il software Openfisca Managing Tool; 2. Nel secondo capitolo, viene descritto l’ecosistema Openfisca, dettagliando particolarmente la struttura, l’implementazione dei vari elementi giuridici e come utilizzarli per sviluppare un generico sistema di tasse e benefici; 3. Nel terzo capitolo, vengono discusse le scelte, organizzative ed operative, prese per definire ed implementare il sistema di tasse e benefici per lo stato italiano descrivendo anche gli obiettivi raggiunti a livello implementativo; 4. Nel quarto ed ultimo capitolo, viene descritto il processo di sviluppo del software Openfisca Managing Tool. Verranno discusse l’l’architettura, le funzionalit`a attualmente presenti e gli sviluppi futuri. 3
  • 9. 2. Metodologie e strumenti di svi- luppo In questo capitolo, discuteremo: • Del mondo Open-source e della nostra partecipazione alle varie community durante lo sviluppo del sistema Openfisca-italy ed il software Openfisca Managing Tool; • Della teoria della simulazione e dell’ecosistema Openfisca; • Gli approcci e gli strumenti utilizzati per sviluppare il sistema Openfisca- italy ed il software Openfisca Managing Tool. 2.1 Sviluppo Open Source In informatica, il termine open source viene utilizzato per riferirsi ad un soft- ware di cui gli autori rendono pubblico il codice sorgente, favorendone il libe- ro studio e permettendo a programmatori indipendenti di apportarvi modifiche ed estensioni [1]. Questo non significa necessariamente che il software open source sia gratuito per chiunque: a seconda della licenza che lo accompagna, il codice sorgente pu`o essere rilasciato dallo sviluppatore solo a scopo di ispezione (frequente nell’ambito dei soft- ware di crittografia), per favorire l’integrazione con altri software aziendali, a scopo di studio e ricerca ma non per utilizzi commerciali [2]. A primo impatto, si potrebbe pensare che l’approccio open source sia nato con l’o- biettivo di produrre e/o migliorare software in maniera totalmente gratuita, in realt`a lo scopo dell’open source `e quello di “permettere la collaborazione tra persone, con abilit`a e conoscenze differenti, riuscendo a raggiungere obiettivi che non si potrebbe- ro raggiungere in nessun altro modo”[3]. A discapito delle aspettative, ci sono vari modi per guadagnare tramite proget- ti open-source, ad esempio, una raccolta fondi tramite piattaforme di crowdfun- ding[4] per finanziare un progetto. Esempi di software con licenze open source, giusto per citarne alcuni, sono: • Libre Office: suite di applicazioni che offre servizi di tipo office automation; • Gimp: editor di immagini; 4
  • 10. • Mozilla Firefox: web browser; • Sistemi Operativi GNU linux: Gentoo, Debian, Ubuntu.... Lo sviluppo open source ha subito un forte incremento nel primo decennio del 2000, anche grazie alla nascita di strumenti come Git e piattaforme come Github (di- scussi rispettivamente nelle sezioni 2.7.1 e 2.7.2); esistono, infatti, pi`u di 57 milioni di repository (ossia progetti) solamente all’interno della piattaforma appena citata. (a) Firefox. (b) VLC. (c) 7-zip. (d) Ubuntu. Fig. 2.1: Progetti open-source 2.2 La community La community `e un gruppo di persone che partecipano a discussioni on-line per raggiungere un fine comune. In particolare, esistono community Open-source che si occupano della gestione e lo sviluppo di progetti. Durante lo sviluppo dei vari progetti, abbiamo aderito a due community Open- source: • “Team per l’Italia in digitale” che ha come obiettivo quello di digitaliz- zare la Pubblica Amministrazione italiana; • OpenFisca, nata per supportare gli sviluppatori con la definizione di nuovi sistemi fiscali. 2.2.1 AgID L’Agenzia per l’Italia in Digitale `e un’azienda pubblica, vigilata dal Presidente del Consiglio dei Ministri, che ha lo scopo di innovare tecnologicamente la pubblica amministrazione ed i servizi forniti alle aziende ed ai cittadini. 2.2.1.1 Competenze e Funzioni Questa azienda ha lo scopo di seguire l’Agenda digitale per l’Europa (DAE) creata nel maggio 2010, quest’ultilma si propone di aiutare le imprese ed i cittadini ad ottenere il massimo dalle tecnologie digitali. Proprio dalla DAE nasce l’Agenda digitale per l’Italia che fornisce all’AgID le seguenti competenze e funzioni: • Migliorare tecnologie e servizi per la crescita economica e sociale del Paese, ad esempio centralizzando l’accesso ai servizi dei cittadini attraverso SPID[5]; 5
  • 11. • Dirigere ed organizzare le attivit`a del CERT (un’organizzazione che ha lo scopo di raccogliere le vulnerabilit`a software e gli incidenti informatici) della Pubblica Amministrazione; • Promuovere lo sviluppo di comunit`a intelligenti, ad esempio: aiutare la diffu- sione della banda ultralarga[6] in Italia; • Promuovere l’alfabetizzazione digitale; • Coordinare e progettare iniziative strategiche di interesse nazionale per l’ero- gazione efficiente di servizi in rete; • Dettare regole tecniche, linee guida, metodologie progettuali in materia di tecnologie informatiche e rendere omogenei i sistemi informativi pubblici in tutto il Paese; • Emanare pareri interpretativi riguardo le nuove regole (ad esempio: Codice dell’amministrazione digitale) e le metodologie di sicurezza per le pubbli- che amministrazioni (ad esempio: Misure minime di sicurezza ICT per le pubbliche amministrazioni). 2.2.2 DevelopersItalia `E una piattaforma open source, nata dalla collaborazione del- l’AgID ed il Team per la Trasformazione Digitale, che gestisce i principali progetti tecnologici in sviluppo nel Paese. 2.2.2.1 Competenze e Funzioni Questa piattaforma ha lo scopo di organizzare e gestire pro- getti open source, e di aiutare gli sviluppatori intenti a implementarli. Tra i vari progetti, gestiti da Developers Italia, ci sono: • SPID (Sistema Pubblico di Identit`a Digitale): un nuovo sistema di login che permette di accedere ai servizi online forniti dalla Pubblica Amministrazione con un’unica identit`a digitale; • ANPR (Anagrafe Nazionale della Popolazione Residente): `e una banca dati anagrafica nazionale che ha lo scopo di semplificare la burocrazia e migliorare i servizi dei cittadini riguardanti: residenza, domicilio... (per esempio: il cambio di residenza); • dati.gov.it: `e un catalogo di Open Data della Pubblica Amministrazione che ha fatto in modo di centralizzare i dati forniti e renderli disponibili al pubblico; (a) SPID (b) ANPR (c) dati.gov.it Fig. 2.2: Progetti 6
  • 12. 2.3 Simulazione e Microsimulazione Nelle successive sezioni, parleremo dei sistemi Openfisca, che verranno definiti come software di microsimulazione economica. E’ doveroso, quindi, definire i concetti di simulazione e microsimulazione per poter proseguire la lettura del documento. 2.3.1 Definizione di Simulatore e Simulazione Un simulatore `e un dispositivo o un ambiente, che riproduce un particolare modello concreto o astratto della realt`a, sul quale possono essere effettuate delle simulazioni [7]. Un esempio di modello concreto ´e il modello in scala di una nave che viene poi posto in un’apposita vasca per effettuare prove simulate allo scopo di stimare opportune misure di prestazione. Per il lettore esperto in Scienze dell’informazione automatica, ed in particolare della programmazione ad oggetti, `e facile fare un’assonanza tra i concetti di <Insieme di classi di un programma-oggetti creati sulle classi> e <Simulatore- simulazioni>. L’insieme delle classi di un programma formano l’ambiente in cui gli oggetti e le variabili prendono vita, assumendo un comportamento in base alle defi- nizioni poste dal programmatore. Per il simulatore il concetto `e del tutto simile: il simulatore definisce l’ambiente ed il modello di base (un po’ come se fosse un insieme di classi) che grazie alle varie simulazioni prendono vita assumendo comportamenti differenti (un po’ come differenti oggetti che vengono creati a partire dalla stessa classe). Riprendendo l’esempio descritto poco fa, il modello a scala della nave e della vasca formano l’ambiente fissato creato dal simulatore (come fosse una classe), mentre nelle simulazioni, create a partire dal simulatore in esame, vengono definiti attributi quali la quantit`a d’acqua nella vasca, il peso e la forma della nave, che saranno differenti per ogni simulazione generata (come le istanziazioni di vari oggetti). Per poter definire un Simulatore, bisogna seguire una serie di step: 1. ANALISI DEL PROBLEMA Vengono considerati gli obiettivi e le problematiche da esaminare e viene fatta un’analisi di fattibilit`a per circoscrivere il problema da prendere in esame (per esempio la simulazione di un volo deve tener conto di differenti variabili e varie problematiche, ma alcune possono essere trascurate); 2. FORMULAZIONE DEL MODELLO DI SIMULAZIONE Viene steso un modello concettuale dove vengono definiti i flussi delle informa- zioni del problema preso in considerazione. Questo modello viene poi valutato per verificare se offre un’immagine consistente della realt`a (`e possibile che venga definito un modello con variabili errate o non congruenti); 3. ANALISI DEI DATI IN INGRESSO Vengono raccolti dei dati di ingresso che verranno considerati come para- metri di funzionamento del sistema dopo opportune trasformazioni (vengono applicate diverse tecniche econometriche, probabilistiche e statistiche); 7
  • 13. 4. VALIDAZIONE DEL MODELLO Il modello concettuale viene convertito in modello matematico che viene, in seguito, dimostrato; 5. TESTING In questa fase, vengono pianificati dei test per ogni iterazione di sviluppo del Simulatore, per evidenziare la sua validit`a nel tempo; 6. ANALISI DEI DATI IN USCITA Nell’ultima fase vengono definiti dei dati di uscita attesi, che vengono com- parati ai risultati forniti dal simulatore (accettando risultati differenti con un certo margine di errore). 2.3.2 Microsimulazione Il termine Microsimulazione deriva dall’inglese “Microanalytics Simulation”, e viene definita come una sottocategoria della Simulazione che fa uso di strumenti analitici computerizzati che eseguono analisi altamente dettagliate di attivit`a come il traffico stradale in un incrocio, transazioni finanziarie o agenti patogeni che dif- fondono malattie attraverso una popolazione [8]. La microsimulazione viene spesso utilizzata per valutare gli effetti degli interventi proposti, prima che vengano implementati nel mondo reale. Nei vari sistemi Openfisca, la microsimulazione viene utilizzata per valutare l’im- patto di una Riforma su di un sistema fiscale prima che questa venga attuata tramite un procedimento legislativo, si parla quindi di Microsimulazione Econo- metrica. Esistono differenti tipologie di microsimulazione: • Microsimulazione econometrica Permette di effettuare simulazioni economiche cos`ı da predire delle situazioni. Un esempio di utilizzo potrebbe essere la misurazione dell’impatto di una riforma nel sistema economico italiano; • Microsimulazione del traffico Permette di effettuare simulazioni sul traffico. Utilizzata moltissimo da inge- gneri civili per valutare, ad esempio, la viabilit`a della strada inserendo una rotatoria o un semaforo in un incrocio; • Microsimulazione pedonale/di folla Permette di effettuare simulazioni sul comportamento delle persone in mol- ti ambiti, ad esempio, `e possibile utilizzare questa tipologia per scegliere la posizione delle uscite antincendio in una biblioteca; • Microsimulazione nelle scienze della salute Permette di effettuare simulazione sulla distribuzione dei microrganismi, ad esempio si pu`o visualizzare la diffusione di una determinata malattia; • Microsimulazione spaziale Permette di misurare il cambiamento di varie entit`a nello spazio in differenti periodi temporali. 8
  • 14. 2.4 OpenFisca Openfisca `e una community nata in Francia nel 2015 con lo scopo di creare un software open source di microsimulazione economica (denominato anch’esso OpenFisca) che consenta di: • Definire un sistema di tasse e benefici per un determinato paese; • Effettuare delle simulazioni sul sistema definito utilizzando la normativa in vigore; • Definire riforme sul sistema corrente e valutarne l’impatto tramite Simulazioni. I repositories dei vari progetti software, gestiti dalla community OpenFisca, sono disponibili al seguente link https://github.com/openfisca/. 2.5 OpenFisca-italy Il 30 aprile 2018, dalla collaborazione tra Lorenzo Stacchio, Corrado petrelli e l’Universit`a di Camerino con le community Developers Italia e Openfisca, nasce il progetto tutto italiano denominato OpenFisca-Italy dopo aver tenuto varie di- scussioni con i leader delle community. Lo scopo del progetto Openfisca-italy `e quello di fornire un simulatore che per- metta: • Al legislatore di avere un supporto per visualizzare l’impatto di una nuova riforma sul sistema corrente; • Agli sviluppatori di applicazioni Web/Desktop/Mobile di costruire un’inter- faccia grafica che agevoli l’uso del simulatore per cittadini e giuristi. Lo sviluppo e la struttura del progetto, verranno dettagliati nei capitoli 3 e 4. 2.6 OpenFisca-Management-Tool Il 1 giugno 2018, da un’idea di Lorenzo Stacchio e Corrado Petrelli, nasce il pro- getto software Openfisca-Managing-Tool, approvato dalla community Openfi- sca. Lo scopo del progetto Openfisca-Managing-Tool `e quello di fornire un software multi-piattaforma ad interfaccia grafica, che consenta di manipolare un generico si- stema Openfisca-NameOfCountry. In particolare questo software consente di: • Visualizzare il sistema di regolamenti legislativi gi`a definiti; • Definire nuove riforme che consentono la modifica dei regolamenti gi`a definiti e/o la definizione di nuovi regolamenti legislativi; • Effettuare simulazioni sul sistema corrente e/o su di un sistema riformato. Lo sviluppo e la struttura del progetto, verranno dettagliati nel capitolo 5. 9
  • 15. 2.7 Strumenti open-source utilizzati durante lo sviluppo In questa sezione verranno elencati e dettagliati, tutti gli strumenti open-source utilizzati durante lo sviluppo del sistema openfisca-italy e del software Openfisca- Managing-Tool. 2.7.1 Git Git `e un software di controllo di versione distribuito a riga di comando, nato nel 2005 che venne creato per facilitare lo sviluppo del kernel di Linux da parte di numerosi sviluppatori provenienti da tutto il mondo. Fig. 2.3: Logo di Git. Git nacque perch´e, a quei tempi, BitKeeper (un software analogo a Git) cam- bi`o licenza e divenne un software proprietario. Col passare del tempo, Git divenne sempre pi`u usato perch´e permetteva di modi- ficare e sviluppare iterativamente progetti code-based in un ambiente flessibile, e di condividere il codice con i propri collaboratori in maniera istantanea con il solo ausilio di una connessione internet. Questo ha consentito, di evitare la condivisione del codice tramite dispositivi di memoria di massa esterni che risultava oneroso a causa dei prezzi e dell’affidabilit`a. 2.7.2 Github GitHub `e principalmente un servizio di hosting per repository Git, lanciato nel 2009, che pu`o anche esser visto come una piattaforma sociale, dove gli utenti pos- sono collaborare in qualunque progetto pubblico presente sulla piattaforma. La collaborazione libera sui vari progetti presenti nella piattaforma, consente di rag- giungere obiettivi prima irrealizzabili e di imparare studiando i progetti altrui. Fig. 2.4: Logo di Github 10
  • 16. 2.7.3 Slack Fig. 2.5: Logo di Slack Slack `e una piattaforma di messaggistica costruita per i team che permette di integrare differenti canali di comunica- zione in un unico servizio. Molto utilizzata dai team di sviluppo per la facilit`a di con- divisione del codice e per i numerosi strumenti di supporto alla comunicazione integrati nella piattaforma (videochiama- ta, riferimenti...); tantoch´e l’obiettivo della piattaforma `e quello di organizzare e migliorare l’esperienza in team, consolidando e dando senso ad un enorme flusso di dati che altrimenti sarebbero non-strutturati. 2.7.3.1 Perch´e usare slack? Slack, oltre a permettere la creazione di canali, consente di integrare servizi ester- ni tra cui: Google Drive (per l’archiviazione di file condivisi), Trello (per la gestione dei task), GitHub (per la gestione dei repository) e Smooz (per la connessione di Team differenti). Inoltre, centralizza la comunicazione in una singola applicazione migliorando la pro- duttivit`a, infatti, `e possibile: condividere file, comunicare privatamente o ad un insieme preciso di persone (presenti in un canale privato o creando una chat di gruppo) ed eseguirlo su qualunque dispositivo (PC, Smartphone e Tablet). 11
  • 17. 2.7.4 GitKraken GitKraken `e un Git client ad interfaccia grafica, che fornisce servizi quali: • Un’integrazione completa con Github.com e Bitbucket.com per l’hosting di repository git. Questa integrazione permette di eseguire tutte le operazioni normalmente effettuate tramite riga di comando, ma con un’interfaccia grafica intuitiva e un’automatizzazione del processo di autenticazione; • Una rappresentazione grafica dei branch, dei commit e dei tag permet- tendo cos`ı agli utenti di visualizzare il flusso del lavoro svolto; • Una rappresentazione grafica dei conflitti durante l’azione di Merging permettendo la scelta del codice in conflitto che si vuole accettare. 2.7.4.1 Scelta del Client Esistono moltissimi client Git, molto simili tra loro. `E stato scelto GitKraken perch´e non richiede ulteriori registrazioni a siti (cosa ri- chiesta da SourceTree, suo principale concorrente) e perch´e ha una grafica curata e comprensibile anche da un neofita. Fig. 2.6: Screenshot di GitKraken[9]. 12
  • 18. 2.7.5 Atom Atom `e un IDE open-source multi-piattaforma basato su Chromium, ed `e perci`o eseguibile su qualunque Sistema Operativo che supporti Chromium. Fig. 2.7: Logo di Atom. Atom possiede caratteristiche analoghe a quelle di molti altri editor di codice (in- tegrazione di pacchetti aggiuntivi, integrazione con Git...) ma abbiamo constatato, dopo vari mesi di utilizzo, che possiede: • Performance pi`u elevate rispetto ai vari concorrenti; • Minor consumo di risorse (RAM e CPU); • Maggiori performance dell’intelligence; • Assenza dei bug riscontrati, precedentemente, con altri editor (Visual Studio Code), utilizzando il simulatore Openfisca. Per questi motivi lo reputiamo un ottimo editor per sviluppare un sistema openfisca ed, in generale, un progetto Python-based. 2.7.6 CircleCI Fig. 2.8: Logo di CircleCI. `E una piattaforma di integrazione continua di software usata quando si lavora con team di sviluppo avente molti contributori. Viene utilizzata perch´e racchiude metodologie utili per: • Evitare errori nel repository; • Avere un codice pi`u leggibile (`e possibile definire uno stile di indentazione predefinito cosicch´e i programmatori siano costretti ad indentare in un determinato modo); • Rendere operativo il progetto, automatizzando una serie di passaggi che altrimenti sarebbero dovuti esser fatti ma- nualmente dal programmatore (ad esempio: testing delle funzionalit`a). Permette, inoltre, l’integrazione con GitHub: ad ogni Pull Request verr`a lanciato uno script su uno o pi`u container (in cui vengono eseguiti ambienti virtuali con risorse mutualmente esclusive per testare il codice) creato su CircleCI; successivamente verranno eseguiti tutti i test e tutti i controlli contenuti nello script per poi fornire l’esito della computazione direttamente sulla Pull Request mittente, cos`ı facendo la revisione del codice in fase di testing di nuove funzionalit`a risulta molto pi`u agevole. 13
  • 19. 2.8 Linguaggi Utilizzati In questa sezione verranno illustrati i linguaggi utilizzati durante il progetto. 2.8.1 Python Python `e un linguaggio di programmazione ad alto livello multi-paradigma, permette infatti la pro- grammazione orientata ad oggetti, la programmazione strutturata ed alcune caratteristiche di programmazio- ne funzionale (come le lambda expressions). Oggigiorno questo linguaggio presenta una crescita espo- nenziale, si pensa infatti che nei prossimi 5 anni sar`a tra i 3 linguaggi pi`u utilizzati al mondo grazie alla facilit`a che i neofiti trovano nell’impararlo rispetto a Java [10]. Per fare un confronto, possiamo vedere come Python, nei codici sottostanti, per- metta di scrivere codice pi`u snello, comprensibile e semanticamente uguale a Java [11]. (a) Codice in Python (b) Codice in Java Fig. 2.9: Codici a confronto Inoltre, possiamo notare come nell’indice TIOBE (l’indice dei pi`u popolari soft- ware redatto dall’azienda TIOBE, leader nel campo del controllo di qualit`a dei software)[12] sia evidente l’enorme crescita annuale di Python rispetto a Java. Fig. 2.10: Java vs Python - Aprile 2018. 14
  • 20. 2.8.1.1 Possibili utilizzi di Python • Programmazione GUI: grazie a Tkinter, PyGtk e wxPython e framework quali Python Kivy e PyQt; • Sviluppo Web: mediante l’utilizzo di framework come Django; • Sviluppo di sistemi di controllo (sviluppati anche dalla NASA[13]); • Data Science: grazie alle numerose librerie contenute in SciPy; • Internet Of Things: consente di programmare dispositivi IoT (Raspberry Pi). 2.8.1.2 Utilizzi di Python all’interno del progetto Python `e stato utilizzato per sviluppare sia il sistema Openfisca-italy sia la logica del software Openfisca-Managing-Tool. 2.8.1.3 Perch´e `e stato scelto Python? Il linguaggio Python `e stato scelto per vari motivi: • E’ un linguaggio facile da imparare, fattore fondamentale dato che, per contri- buire a questo progetto, sono necessarie sia nozioni informatiche che tributarie. Questa facilit`a di utilizzo, consente ad un tributarista di contribuire al progetto pur affrontando qualche difficolt`a iniziale. • Ha molte librerie integrabili per elaborazioni complesse. Il motore di sistemi Openfisca, infatti, sfrutta appieno la libreria NumPy, che `e il pacchetto fon- damentale per effettuare elaborazioni scientifiche su grandi quantit`a di dati [14]. • Ha strumenti per la creazione e gestione di ambienti virtuali, in particolare, Pew, descritto nella prossima sezione. 2.8.2 Pew Pew, acronimo di Python Enviroment Wrapper[15] `e un insieme di comandi che permette la gestione di ambienti virtuali. 2.8.2.1 Definizione di ambiente virtuale `E un ambiente di sviluppo isolato che contiene librerie di una determinata ver- sione, per esempio un nostro programma richiede l’utilizzo della libreria X nella versione Y, invece un altro programma richiede sempre la libreria X ma nella ver- sione Z. Non sappiamo se la versione Z ha deprecato qualche funzione presente nella versione Y (o viceversa) quindi per non avere errori si preferisce creare due ambienti virtuali differenti cosicch´e ambedue gli applicativi possano funzionare senza problemi. 15
  • 21. 2.8.2.2 Utilizzo di Pew in Openfisca Pew viene utilizzato per far eseguire il simulatore di un determinato paese. La procedura per l’installazione e il modus operandi per far eseguire il simulatore `e ampiamente dettagliato al seguente link: https://goo.gl/Ut5tYi. 2.8.3 Python Kivy Python Kivy `e una libreria open-source per il rapido sviluppo di applicazioni che fanno uso di interfacce grafiche innovative [16]. In particolare Python Kivy, `e stato scelto in quanto `e: • Cross-platform, infatti lo stesso codice pu`o essere eseguito su Linux, Windows, Os X, Android, iOS e Raspberry Pi; • Business Friendly, Python Kivy `e sotto licen- za MIT ed `e quindi open-source al 100%, inoltre `e stabile e fornito di una discreta documentazione; • Basato sull’elaborazione accelerata tramite GPU, infatti il motore grafico `e costruito su OpenGL ES 2, che utilizza una pi- peline grafica, moderna e veloce, che viene eseguita in modalit`a Elaborazione accelerata tramite GPU1 . 2.8.4 GitHub Flavored Markdown Per utilizzare al meglio la piattaforma di Versioning Github, bisogna stilare dei documenti accessori al codice, come supporto alla navigazione nella storia del progetto. Questi documenti sono solitamente: • I file README, che possono essere o meno aggiornati ad ogni commit, che spiegano il contenuto di una cartella o dell’intero progetto; • I file di CHANGELOG, che servono per conoscere le nuove features o cam- biamenti effettuati riferendosi a una certa versione del software. Per scrivere questi documenti, `e necessario conoscere il linguaggio di markdown esteso da Github. 1 L’elaborazione accelerata tramite GPU consiste nello sfruttare una GPU affiancata ad una CPU per facilitare operazioni di tipo CPU bound [17]. 16
  • 22. 3. OpenFisca In questa sezione, verr`a discusso la struttura dello stack di componenti del siste- ma Openfisca e verranno analizzati, utilizzando la documentazione come supporto, i vari elementi che compongono la componente “kernel” dello stack (Openfisca- Core) ed i modi, per utilizzare questi elementi, al fine di implementare un sistema di tasse e benefici. Verranno, inoltre, discussi sia i contributi forniti alla community ed ai vari progetti Openfisca, sia il progetto openfisca-country template, che consente di inizializ- zare un sistema di tasse e benefici in pochi istanti. 3.1 Struttura dello stack Openfisca Fig. 3.1: Stack OpenFisca Sotto un punto di vista architetturale, Openfisca `e formato da uno stack di com- ponenti. Ogni componente permette allo sviluppatore di focalizzarsi su un determi- nato obiettivo senza intaccare le restanti parti (segue il principio di modularit`a del software) [18]. Le componenti, che formano lo stack dell’ecosistema OpenFisca, sono: • OpenFisca-Core, `e la componente “kernel”, che contiene le funzioni princi- pali (creazione di variabili, simulazioni...) utilizzate per sviluppare un sistema di tasse e benefici; • OpenFisca-NameOfCountry `e la componente che sfrutta le funzioni pre- senti Openfisca-Core per definire un sistema di tasse e benefici (ad esempio OpenFisca-Italy, ne esiste uno per ogni stato). 17
  • 23. Per velocizzare il processo di istanziazione del sistema `e stato definito il proget- to OpenFisca-CountryTemplate (https://github.com/openfisca/ country-template), che contiene una struttura gerarchica di base e vari esempi per iniziare a sviluppare il sistema fiscale di riferimento; • OpenFisca-NameOfExtension `e una componente aggiuntiva opzionale che si sovrappone al OpenFisca-NameOfCountry e che offre ulteriori funzio- nalit`a e specifiche di una certa regione/citt`a del paese di riferimento. Un esempio di instanza di OpenFisca-NameOfExtension sono le regioni a statuto speciale. • Web API `e la componente che consente di richiamare le varie funzioni, definite all’interno sia del core che del country template, tramite utilizzo di Web Api. Lo scopo di questa componente `e, per lo pi`u, di supporto alla creazione di applicazioni web. 3.2 Esempi di utilizzo di sistemi Openfisca La community francese ha, per ora, utilizzato il sistema Openfisca-france, interfacciandosi tramite Web API per costruire tre applicazioni web: • Consultazione dei parametri e delle variabili del sistema francese Fig. 3.2: Ricerca delle variabili e parametri riguardanti il Salario. L’applicazione `e reperibile al seguente link: https://fr.openfisca.org/legislation. • Simulatore di benefici sociali francesi L’applicativo in questione valuta, a seconda degli input forniti nei vari form presentati, se si ha diritto ad usufruire di alcuni benefici fiscali. Nell’immagine sottostante `e presente il risultato della simulazione, si noti che il soggetto ha diritto ai benefici fiscali riguardante l’energia elettrica pari a 144€/anno. 18
  • 24. Fig. 3.3: Risultato del simulatore di benefici sociali francesi. L’applicazione `e reperibile al seguente link: https://mes-aides.gouv. fr/. • Simulatore dell’impatto fiscale causato dal divorzio Fornendo in input le persone fisiche coinvolte, la situazione familiare prima e dopo il divorzio, il simulatore permette di visualizzare la ridistribuzione delle ricchezze su ciascun componente. L’applicazione `e reperibile al seguente link: https://pa-comp.firebaseapp.com/. 3.3 Analisi dei requisiti e studio preliminare Prima di iniziare la fase di analisi del problema (come costruire il sistema fiscale italiano), ci siamo chiesti quali strumenti fossero necessari, per studiare ed apprendere, le tecniche di sviluppo richieste al fine di codificare il sistema di tasse e benefici italiano. Dopo aver discusso con il rappresentante del team Developers Italia, accompagna- ta da una prima lettura del codice delle varie repository che compongono il sistema Openfisca, abbiamo constatato che gli strumenti da studiare fossero: • Linguaggio di programmazione Python; • Software versioning Git; • Architettura e componenti di Openfisca-Core; • Documentazione relativa allo sviluppo del country-package; • Legislazione Italiana. Gli strumenti utilizzati sono stati ampiamenti discussi nella Sezione 2.7 e nella Sezione 2.8. Non sono stati, per`o, descritti importanti manufatti quali la docu- mentazione relativa allo sviluppo del country-package e l’architettura del core di Openfisca. Nelle prossime sezioni ci concentreremo sull’analisi e la descrizione di quest’ultime. 19
  • 25. 3.4 Studio del core di Openfisca Si dice che “un buon programmatore, prima di sviluppare un qualsiasi software, studi la macchina e/o il sistema operativo su cui quest’ultimo verr`a eseguito”, per questo, prima di studiare la documentazione di sviluppo del country-package italiano, sono state apprese le funzioni principali del core di openfisca. Lo studio del core `e stato lungo e complesso ma, in compenso, ha apportato una maggior consapevolezza e ci ha fatto comprendere molte delle scelte prese dal team di sviluppo. Segue un class diagram, derivato dallo studio di Openfisca-core, che riassume le componenti nello stesso e le loro correlazioni. 20
  • 26. 3.5 Studio della documentazione per sviluppare il country-package Per poter codificare il sistema di tasse e benefici italiano `e stato necessario lo studio della documentazione, a volte ambigua, fornita dagli sviluppatori (https: //openfisca.org/doc/key-concepts.html). Durante questa fase, c’`e stata una comunicazione continua con il team di svilup- po di Openfisca, grazie alla quale, abbiamo chiarito dubbi riguardo la documenta- zione e suggerito alcune migliorie che potevano essere apportate al progetto e alla documentazione stessa (discusse nella Sezione 3.11). 3.6 Descrizione della documentazione per svilup- pare il country-package La documentazione `e suddivisa in otto sezioni: • Concetti chiave; • Dalla legge al codice; • Openfisca Web Api; • Risoluzione dei problemi; • Istruzioni per l’utilizzo di Openfisca; • Pubblicare i risultati; • Community; • Come contribuire al progetto Openfisca. Questa documentazione spiega, in maniera a volte poco dettagliata, come sfruttare le componenti fornite da openfisca-core per sviluppare un generico sistema di tasse e benefici. Dato che sarebbe prolisso e tedioso descrivere tutte le sezioni in maniera specifica, concentreremo la nostra attenzione sulle sezioni ritenute di maggior rilievo, ossia la sezione Concetti chiave e la sezione Dalla legge al codice. 21
  • 27. 3.7 Openfisca Core: Concetti chiave I concetti chiave del sistema Openfisca sono stati generalizzati, affinch´e potessero adattarsi a qualsiasi (o quasi) legislazione esistente. 3.7.1 Sistema di tasse e benefici Il primo concetto chiave `e quello del Sistema di tasse e benefici che rappre- senta l’insieme delle variabili e dei parametri esistenti. Prima di capire cosa siano le variabili ed i parametri, bisogna definire cosa sia un’entit`a. 3.7.2 Entit`a Un’entit`a non `e altro che un soggetto, sia esso fisico o giuridico, che possiede da 0 ad n variabili. Esempi di entit`a potrebbero essere Persona fisica e Persona giuri- dica. Le entit`a possono essere raggruppate creando cos`ı quella che viene definita come entit`a raggruppata. Esempi di entit`a raggruppate sono: famiglia, gruppi aziendali etc.. 3.7.3 Variabile Una variabile: • `E una propriet`a di un’entit`a; • Pu`o appartenere ad un’unica entit`a (ma non `e vero il contrario); • Pu`o assumere un valore calcolato tramite una formula (che `e definita all’interno della variabile stessa) o passato in input (proprio per questo motivo sono sorti dei problemi che verranno spiegati nella Sezione 3.11.3). 3.7.4 Parametro Un parametro `e una propriet`a numerica della legislazione che pu`o evolvere nel tempo, ma a differenza di una variabile, questo non appartiene a nessuna entit`a. I parametri vengono solitamente usati nelle formule per calcolare delle variabili. 3.7.5 Periodo Ogni parametro o variabile assume un valore per un certo periodo che sia esso mensile o annuale (o infinito nel caso in cui la variabile sia una costante). 3.7.6 Riforma Un altro concetto da esprimere `e sicuramente quello della Riforma. Una Riforma pu`o essere applicata in una simulazione per capire gli effetti di un cambiamento apportato ad una formula di una variabile o ad un parametro esistente. 22
  • 28. 3.7.7 Test per le variabili I test per le variabili sono particolari file, che consentono di testare il comporta- mento delle variabili, in particolare, si dovrebbe testare ogni formula con almeno un test. 3.7.8 Simulazione Una simulazione permette di calcolare tasse e benefici per il country-package definito da entit`a, parametri, variabili e riforme avendo come base uno scenario (che non `e altro che un insieme di entit`a e variabili che generano la situazione che vogliamo sfruttare). N.B. Una simulazione funge anche da test per le riforme. Questa rapida panoramica dei concetti principali ci consente di introdurre la visione del sistema da un punto di vista pi`u pratico: sappiamo ora cosa siano le Variabili, i Parametri, le Entit`a e le Riforme, ma come vengono codificate? 3.8 Codifica del country-package: “Dalla legge al codice” In questa sezione viene illustrato come codificare i concetti chiave, descritti nella sezione precedente. 3.8.1 Entit`a Il processo di codifica di una nuova entit`a `e molto complesso: sono necessarie modifiche in vari file di configurazione e la riscrittura di parte del codice, espresso nel core di openfisca, all’interno del proprio country-package. Nella documentazione, infatti, non si fa alcun riferimento alla scrittura di una nuova entit`a ma si parla solo di come utilizzarle e di come comporne di nuove partendo da quelle esistenti. Le operazioni principali utilizzabili su un’entit`a o un gruppo di entit`a sono l’ aggre- gazione (che consente di aggregare valori definiti per ogni membro di un gruppo di entit`a o di pi`u entit`a singole) e la proiezione (che consente di conoscere il valore di una certa variabile di un’entit`a). 3.8.2 Variabile Come detto in precedenza, una variabile pu`o assumere un valore calcolato tra- mite una formula o assegnato input. La cosa interessante `e che la prima opzione comprende anche la seconda: se una variabile definisce una formula per essere cal- colata, quest’ultima pu`o assumere un valore sia calcolato tramite una formula sia assegnato in input, mentre non `e vero il contrario. Una variabile che pu`o assumere unicamente un valore tramite input, assume il seguente aspetto: class variabile_di_esempio(Variable): value_type = float 23
  • 29. default_value = 100 entity = Person label = u``Esempo di variabile numerica'' definition_period = MONTH Ogni variabile: • Eredita della classe Variable definita all’interno del core di Openfisca; • Ha un tipo di valore che pu`o assumere, questi tipi per`o non sono dati dal linguaggio Python, ma sono stati definiti dal team di Openfisca e sono i seguenti: – bool : boolean; – date : date; – Enum : valori discreti numerabili; – float : float; – int : integer; – str : string. • A seconda del tipo, assume un valore di default, che pu`o essere per`o anche im- postato dal programmatore (come nell’esempio). I valori di default, a seconda del tipo della variabile, sono: – bool : False; – date : 1970-01-01; – Enum : lista vuota; – float : 0.0; – int : 0; – str : ’ ’ . • Appartiene obbligatoriamente ad un’entit`a, in questo caso all’entit`a Persona; • Pu`o possedere una descrizione, indicata nel campo label; • Pu`o assumere diversi valori in base al periodo di definizione (nell’esempio, il periodo `e mensile). Il periodo di definizione `e unico ed `e scelto tra: – MONTH : Il valore della variabile pu`o cambiare di mese in mese (Es. et`a di una persona); – YEAR : Il valore della variabile pu`o cambiare di anno in anno (Es. IRPEF netta); – ETERNITY : Il valore della variabile `e una costante, ossia non pu`o cambiare nel tempo (Es. data di nascita). 24
  • 30. Un fattore interessante `e l’interoperabilit`a dei periodi: normalmente infatti una variabile mensile non pu`o essere calcolata su base annuale ed `e vero anche il contrario. Esiste per`o un particolare attributo, denominato set input, che consente, a seconda del valore assunto, di calcolare una variabile mensile su base annuale e viceversa. Una variabile che, invece, pu`o essere calcolata tramite una formula assume la seguente forma: class variabile_di_esempio(Variable): value_type = float default_value = 100 entity = Person label = u``Esempo di variabile numerica calcolata tramite formula''→ definition_period = MONTH def formula(person,period,parameters): return person('altra_variabile_di_esempio',period)→ * parameters .moltiplicatore_altra_variabile_di_esempio Come detto in precedenza, una variabile calcolata tramite formula pu`o anche assu- mere un valore tramite input, tutto dipende da cosa forniamo al simulatore. Se al simulatore imponiamo che la variabile di esempio sia uguale a un valore X allora la variabile assumer`a questo valore, se invece non `e indicato alcun tipo di valore, questo verr`a calcolato tramite la sua formula. Da ci`o, si evince, che la regola di priorit`a per il simulatore sia: V alore in input > valore calcolato tramite variabile Questa regola, nata per facilitare il lavoro d testing, `e in realt`a uno svantaggio, quantomeno a livello semantico. Il problema riscontrato `e dettagliato nella Sezione 3.11.3). La formula `e una funzione che prende in input l’entit`a utilizzata nella formula per effettuare il calcolo (nel nostro caso person), il periodo preso in considerazione per il calcolo (che viene indicato in input al simulatore) e i parametri esistenti all’in- terno del sistema. Il calcolo di una formula sfrutta da 0...n variabili di un entit`a e da 0...n parametri esistenti. Nell’esempio, la formula effettua una semplice moltiplicazione tra una variabile pro- priet`a dell’entit`a persona (per un certo periodo dato in input) e il suo parametro moltiplicatore, dopodich´e ritorna il risultato. 3.8.3 Parametro Un parametro pu`o essere codificato in diverse maniere, a seconda del suo scopo. 25
  • 31. 3.8.3.1 Parametro Base Un parametro che ha come unico scopo, quello di rappresentare una semplice propriet`a numerica in base al periodo preso in esame, `e il modello base. Vediamo un esempio di parametro base : description: Esempio di parametro base unit: currency values: 1993-01-01: value: 1000 2010-01-01: value: 1500 reference: https://openfisca.org/doc /coding-the-legislation /legislation_parameters.html 2020-01-01: expected: 1700 Come si evince da queste righe di codice, un parametro base definisce dei valori a seconda del periodo considerato, ma vediamo nel dettaglio da cosa un parametro di questo genere `e composto. Ogni parametro base ha: • Una descrizione; • Un riferimento legislativo (opzionale); • Un’unit`a di misura. Possono essere di tre tipologie: – years : il valore `e rappresentato in anni; – currency : il valore `e rappresentato nella valuta corrente del paese; – /1 : il valore `e in percentuale (dove 1.0 = 100%). • Dei valori per il parametro a seconda del periodo. I valori del parametro di esempio vanno interpretati in questa maniera: – Prima del 01-01-1993 questo parametro non esisteva; – Dal 01-01-1993 al 01-01-2010 questo parametro assume valore 1000; – Dal 01-01-2010 al 01-01-2020 questo parametro assume valore 1500; – Ci si aspetta che dal 01-01-2020 questo parametro assuma come valore 1700. La parola chiave expected viene utilizzata per periodi successivi a quello presente, `e stato inserito per poter effettuare delle simulazioni per gli anni futuri. N.B. In questo caso, tutti i valori indicati sono dei valori interi. Bisogna stare attenti ad utilizzarli, in quanto potrebbero portare ad errori nel calcolo delle varie formule (Problema del troncamento della divisione intera [19]). Per evitare ogni sorta di problema `e consigliabile indicare il valore, anche se non ha cifre dopo la virgola, come numero reale (invece di 1000 scrivere 1000.00). 26
  • 32. 3.8.3.2 Parametro a scala Una scala `e formata da raggruppamenti di valori, tassi e soglie. Un para- metro a scala viene di solito definito per gestire calcoli basati su scaglioni (Es. calcolo dell’IRPEF lorda). Prendiamo come esempio di parametro a scala un frammento di codice del file ’Aliquote IRPEF’ da noi codifcato: description: Aliquote dell'imposta sul reddito delle persone fisiche→ reference: https://goo.gl/bd4986 brackets: - rate: 2007-01-01: value: 0.23 threshold: 2007-01-01: value: 0.0 - rate: 2007-01-01: value: 0.27 threshold: 2007-01-01: value: 15000 Ogni parametro a scala possiede: • Una descrizione; • Un riferimento legislativo (opzionale); • 1..n Tassi. Ogni tasso `e formato a sua volta da: – Valori per diversi periodi (anche se nell’esempio `e definito un solo valore a partire dal 01-01-2007); – Soglie per diversi periodi (anche se nell’esempio `e definito un solo valore a partire dal 01-01-2007). La prima domande che ci si pongono, dato che questo `e un parametro pi`u complesso rispetto a quello di base, `e come vada interpretato e come poterlo utilizzare. Per poter rispondere a queste domande bisogna introdurre la funzione calc(). Prendia- mo come esempio la seguente istruzione, utilizzata per calcolare la quota di IRPEF lorda all’interno del nostro progetto: parameters(period). aliquote_scaglioni_IRPEF.calc(reddito_imponibile) 27
  • 33. Questa istruzione `e suddivisa in 3 sezioni: • parameters(period).aliquote_scaglioni_IRPEF # richiamo il parametro a scala • reddito_imponibile # valore che verr`a passato alla funzione calc() • calc(reddito_imponibile) # calcola il valore della scala # in base all'oggetto passato in input Nel nostro caso, la funzione calc() prende in input il valore reddito imponibile e si applica sul parametro a scala aliquote scaglioni IRPEF. Per capire cosa fa la funzione calc() supponiamo che il valore di reddito imponibile sia 20000. La funzione applicata a questa cifra effettua il seguento calcolo: (15000 ∗ 0.23) + ((20000 − 15000) ∗ 0.27) Il calcolo scaturisce dal fatto che, prima di ogni cosa, la funzione calc() controlla in quale range di soglia si trovi il valore passato in input utilizzando come metro di giudizio il campo threshold. Nel nostro caso il valore `e maggiore della soglia dei 15000 per la quale vale la rata del 27 %. Questo non significa che tutto il valore passato sia la base per il calcolo del 27 %, infatti, questa funzione, accoppiata con il parametro a scala, serve per effettuare calcoli a scaglioni, ed `e per questo che, prima si calcola il 23 % di 15000 (che `e il massimo del primo range di valori) e poi si calcola il 27 % ma solo della differenza tra il valore passato in input e la soglia minima del range in cui ci si trova. Come esempio rafforzativo, prendiamo il caso in cui il reddito imponibile sia 13000, il calcolo effettuato sarebbe il seguente: ((13000 − 0) ∗ 0.23) Da questi esempi `e chiaro anche come il parametro a scala debba essere in- terpretato: nell’esempio il parametro assume il valore di 0.23 se la cifra passata in input `e maggiore di 0 e minore di 15000, altrimenti assume 0.27. In questa maniera, si possono creare n scaglioni e, a seconda delle esigenze, applicare la funzione calc() per effettuare il calcolo, in maniera semanticamente corretta. 3.8.3.3 Parametro Fancy Indexing L’ultimo tipo di parametro `e il parametro fancy indexing, ossia un parametro che viene calcolato in base al valore di una certa Variabile. Questo tipo di oggetto `e molto comodo in situazioni in cui esistono delle condizioni sul valore di una variabile generica: Il parametro `e infatti, indicizzato di fantasia, nel senso che non si basa su un valore di una variabile specifica ma su un valore generico che qualsiasi variabile pu`o assumere. Vediamo il seguente esempio: 28
  • 34. zona_1: single: description: "Ammontare beneficio per una certa persona single nella zona 1"→ values: 2015-01-01: value: 150 coppia: description: "Ammontare beneficio per una certa coppia nella zona 1"→ values: 2015-01-01: value: 250 zona_2: single: description: ""Ammontare beneficio per una certa persona single nella zona 2"→ values: 2015-01-01: value: 200 coppia: description: "Ammontare beneficio per una certa coppia nella zona 2"→ values: 2015-01-01: value: 300 Il funzionamento `e il seguente: I valori zona 1 e zona 2 sono valori che posso essere assunti da una qualsiasi variabile (che `e sicuramente un Enum in questo caso) e per ognuno di essi vengono definiti ben due parametri utilizzabili (single e coppia). Sar`a cura del programmatore, scegliere quale di questi utilizzare in base alle esigenze, un esempio di utilizzo `e il seguente: def formula(famiglia, period, parameters): coppia = famiglia('coppia', period) zona = famiglia('zona_abitazione', period) # zona_abitazione pu`o essere solamente zona_1 o zona_2 → → P = parameters(period).beneficio_abitazione[zona] return where(coppia, P.coppia, P.single) # ritorno il parametro coppia se la famiglia `e formata da due persone, altrimenti quello per single → → 29
  • 35. 3.8.4 Riforma Una riforma, `e un insieme di modifiche che possono essere applicate ad un sistema di tasse e benefici. Viene solitamente utilizzata per valutare l’impatto di un possibile cambiamento nel sistema legislativo. Il cambio al sistema apportato da una Riforma pu`o concretizzarsi in tre modi: • Ridefinire la formula per il calcolo di una variabile esistente; • Ridefinire un parametro esistente; • Introdurre un nuovo parametro (staticamente o dinamicamente). 3.8.4.1 Ridefinire la formula per il calcolo di una variabile esistente Grazie ad una riforma `e possibile misurare l’impatto della ridefinizione del calcolo di una variabile. Questo strumento `e molto comodo in quanto, il cambiamento del calcolo di una variabile (in particolare una tassa) potrebbe impattare in maniera inaspettata sull’intero sistema. La ridefinizione di una variabile `e molto semplice: basta riscrivere la stessa variabile (cambiandone la struttura) e poi far partire una simulazione per constatare l’impatto del cambiamento. Prendiamo come esempio una semplice variabile del sistema attuale: class variabile_di_esempio_senza_riforma(Variable): value_type = float entity = Person label = u``Esempo di variabile da riformare" definition_period = YEAR def formula(person,period,parameters): return person('altra_variabile_di_esempio',period)→ * parameters .moltiplicatore_altra_variabile_di_esempio Supponiamo ora di voler riformare questa variabile e di cambiare il corpo della sua formula scrivendo la seguente variabile riformata: class variabile_di_esempio_riformata(Variable): value_type = float entity = Person label = u``Variabile riformata da applicare su variabile_di_esempio_senza_riforma"→ definition_period = YEAR def formula(person,period,parameters): return person('altra_variabile_di_esempio',period)→ 30
  • 36. * (1.0 - parameters .moltiplicatore_altra_variabile_di_esempio) Supponendo che il parametro moltiplicatore altra variabile di esempio sia una percentuale, decido di cambiare la moltiplicazione e di trasformare la formula della variabile da: return person('altra_variabile_di_esempio',period) * parameters .moltiplicatore_altra_variabile_di_esempio a return person('altra_variabile_di_esempio',period) * ( 1.0 - parameters .moltiplicatore_altra_variabile_di_esempio) Una volta definita, la variabile riformata va applicata al sistema. E’ ora di scrivere una riforma! Prendiamo come esempio, la seguente riforma: class simple_reform(Reform): name = u'Reform on variabile_di_esempio_senza_riforma'→ def apply(self): self.update_variable( variabile_di_esempio_senza_riforma) Ogni riforma: • Eredita dalla classe Reform definita nel core; • Possiede un nome; • Deve sempre definire il metodo apply, sia che essa debba essere applicata su una variabile che su un parametro. In questo caso il metodo apply, richiama la funzione update variable definita all’interno del core nella classe Reform. Questo metodo far`a in modo di aggiornare la variabile in una simulazione. Da notare che la la riforma e la variabile riformata dovrebbero trovarsi nello stesso file, sia per motivi di namespace sia per ragioni convenzionali. 31
  • 37. 3.8.4.2 Ridefinire un parametro esistente Il procedimento `e molto simile a quello della variabile ma con qualche cam- biamento strutturale. Innanzitutto per ridefinire un parametro esistente bisogna definire una funzione di modifica dei parametri come nel seguente esempio: def modify_parameters(parameters): reform_period = periods.period("2015") parameters.tax_on_salary.brackets[1].threshold. update(period = reform_period, value = 4000) return parameters In questo caso la modifica si applica per l’anno 2015, su un parametro a scala, nella seconda sezione del raggruppamento (brackets[1]), aggiornando la soglia per la quale varr`a la rata in quella sezione con il valore 4000. Dopodich`e, si scrive una riforma che sfrutta il metodo modify parameters per effettuare le stesse operazioni espresse nella sezione precedente ma prendendo di mira un parametro al posto di una variabile. La riforma per modificare un parametro esistente avr`a un aspetto di questo tipo: class incrementare_soglia_minima(Reform): name = u'Incrementare la soglia minima' def apply(self): self.modify_parameters(modifier_function = modify_parameters)→ 3.8.4.3 Introdurre un nuovo parametro Come detto in precedenza, grazie ad una riforma `e possibile non solo modificare un parametro ma anche introdurne uno nuovo in maniera statica o dinamica. Per introdurre un nuovo parametro in maniera statica, bisogna innanzitutto posse- dere un file in cui `e definito un parametro ma che non si trova nel percorso dei parametri (per questo si dice in maniera “statica”, in quanto il file esiste gi`a ed il parametro `e gi`a fissato). Dopodich´e, bisogna scrivere la solita funzione modify parameters che, questa vol- ta, ha lo scopo di caricare in memoria il file. Un esempio di codice generico `e il seguente: import osˆˆA from openfisca_core.parameters import load_parameter_file→ dir_path = os.path.dirname(__file__) def modify_parameters(parameters): file_path = os.path.join(dir_path, 'new_parmt.yaml') 32
  • 38. reform_parameters_subtree = load_parameter_file(file_path, name='new_parmt')→ parameters.add_child('new_parmt', reform_parameters_subtree)→ return parameters Una volta definita questa funzione, si scrive una riforma applicando il metodo modify parameters: class some_reform(Reform): def apply(self): self.modify_parameters(modifier_function = modify_parameters)→ Per introdurre invece un nuovo parametro in maniera dinamica, si eseguono gli stessi passi ma cambiando la funzione di modify parameters che ora, invece di caricare un file in cui si trova il parametro, ne definisce direttamente uno. L’esempio di codice generico per questa situazione `e il seguente: from openfisca_core.parameters import Parameter def modify_parameters(parameters): reform_parameters_subtree = Parameter('new_parmt', data = {→ 'description': 'New dinamyc parameter' 'values': { "2000-01-01": {'value': 550, reference = 'http://openfisca.readthedocs.io→ /en/latest/parameters.html'}, "2017-01-01": {'value': 600, reference = 'http://openfisca.readthedocs.io→ /en/latest/parameters.html'} } }) parameters.add_child('new_parmt', reform_parameters_subtree)→ 3.8.5 Test per le variabili I test riguardanti le variabili, vengono eseguiti in un ambiente virtuale di Pew. L’unico scopo di questi test `e controllare se gli effetti del calcolo di una variabile siano quelli voluti. Prendiamo come esempio il seguente test: - name: Test esempio period: 2018 33
  • 39. input_variables: reddito_complessivo: 10000 oneri_deducibili: 1000 output_variables: irpef_lorda: 2070 Come si evince dal codice, ogni test possiede: • Un nome; • Un periodo sul quale le variabili vengono calcolate; • Un insieme di variabili di input; • Un insieme di variabili di output attese. I test si comportano in una maniera molto pervasiva: un qualsiasi test, fa in modo di calcolare, non solo le variabili attese in output, ma anche tutte le altre variabili esistenti. In realt`a, la maggior parte della variabili assumer`a il valore di default, a meno che la formula per il calcolo delle stesse non contenga le variabili date in input, in quel caso assumeranno un valore diverso. Se il test fallisce, significa che le variabili calcolate in output assumono dei valo- ri diversi rispetto a quello specificato nei test, o che c’`e stato un qualche errore sintattico. 3.8.6 Simulazione Le simulazioni possono essere eseguite su un sistema di tasse benefici standard o riformato. Supponendo di voler calcolare una variabile del sistema standard il procedimento `e il seguente: from openfisca_italy import CountryTaxBenefitSystem # import tax benefit system→ from openfisca_italy.scenarios import Scenario # import scenario→ # definire funzione per inizializzare scenario def init_profile(scenario): scenario.init_single_entity( period = '2017', person = dict( age = 50 var_reddito= 10000, # ... ) ) return scenario 34
  • 40. #carico il sistema di tasse e benefici tax_benefit_system = CountryTaxBenefitSystem() #creo uno scenario sul sistema scenario = tax_benefit_system.new_scenario() #inizializzo lo scenario scenario = init_profile(simple_scenario) # creo una simulazione su uno scenario simulation = scenario.new_simulation() # calcolo una variabile sulla simulazione simulation.calculate('irpef_lorda','2017') Se invece vogliamo calcolare una variabile del sistema riformato si utilizza lo stesso codice di prima, solamente cambiando il sistema di tasse e benefici preso in esame: # prendo sistema con riforma applicata sistema_con_riforma = diminuzione_aliquota_IRPEF_redditi_inferiori_15000(→ tax_benefit_system) # creo un nuovo scenario sul sistema con riforma reform_scenario = sistema_con_riforma.new_scenario() # inizializzo lo scenario sul sistema con riforma reform_scenario = init_profile(reform_scenario) # creo una simulazione sullo scenario simulation_riforma = reform_scenario.new_simulation() # calcolo la variabile sulla simulazione del sistema riformato→ simulation_riforma.calculate('irpef_lorda','2017') 3.8.7 Estensione dei file per la codifica Quello che non `e stato detto, `e quale sia l’estensione dei file supportata dai vari concetti dell’ecosistema Openfisca. Concetto Tipologia FIle Entit`a ’.py’ Variabili ’.py’ Parametri ’.yaml’ Simulazioni ’.py’ Situation ’.json’ Test Variabili ’.yaml’ Test Riforme ’.py’ Tab. 3.1: Tipologie di file associate a concetti 35
  • 41. 3.9 Flusso operativo della simulazione Dopo aver descritto tutte le componenti, utili al fine di definire un sistema di tasse e benefici tramite lo stack di moduli openfisca, `e doveroso specificare come questi elementi si concatenino per effettuare una semplice simulazione. Segue un diagramma di flusso, che verr`a dettagliato effettuando dei focus nelle sue varie regioni: Fig. 3.4: Flusso di lavoro di una simulazione Openfisca 36
  • 42. 3.9.1 Regione1 Fig. 3.5: Flusso di lavoro di una simulazione Openfisca: Regione 1 La prima cosa da fare per effettuare una simulazione `e definire, all’interno di un file del country-package (script python), l’l’ambiente della simulazione. Per definire questo ambiente, `e necessario generare il sistema completo di tasse e benefici (operazione standard della componente openfisca-core) ed inizializzare una situazione fiscale. 3.9.2 Regione2 Fig. 3.6: Flusso di lavoro di una simulazione Openfisca: Regione 2 Per inizializzare una situazione fiscale `e necessario selezionare: • N coppie di <Variabile di input-Valore assegnato alla variabile>; • N <Variabile di output>; Tutte le variabili selezionate, vengono impacchettate in una Situazione fiscale, che accoppiata con il sistema di tasse e benefici, `e in grado di generare una situazione fiscale compatibile con il simulatore openfisca. 37
  • 43. 3.9.3 Regione3 Fig. 3.7: Flusso di lavoro di una simulazione Openfisca: Regione 3 Una volta generata una situazione fiscale compatibile con il simulatore open- fisca si effettua la simulazione. Basandosi sulle N coppie di <Variabile di input-Valore assegnato alla varia- bile> indicate nella situazione fiscale, il simulatore calcola le N <Variabile di output> e tutte le variabili necessarie al fine di calcolare quest’ultime. Una volta effettuati i calcoli, il simulatore restituisce i vari risultati al country- package che ha la possibilit`a di mostrarli a video o utilizzarli per effettuare altre simulazioni. 38
  • 44. 3.10 Openfisca country-template 3.10.1 Country-template Per inizializzare il repository di una de- terminata nazione bisogna seguire un deter- minato numero di step. La prima co- sa da fare `e clonare o scaricare, il pro- getto openfisca-country-template (fruibi- lie al seguente link https://github.com/ openfisca/country-template/). Successivamente, basta far eseguire una serie di istruzioni, codificate in Bash scripting, sul pro- prio elaboratore per adattare il progetto e creare cos`ı una base del sistema fiscale del paese di ri- ferimento (generando l’albero di directory che troviamo in figura). Nonostante la facilit`a con cui sia possibile model- lare una base per un sistema fiscale, c’`e un grosso limite: come specificato, le istruzioni sono codifi- cate in Bash scripting, ci`o significa che queste funzionano unicamente su sistemi operativi Unix (OSx, Ubuntu etc...), per questo, abbiamo deciso di contribuire sviluppando uno script python cross-platform che emulasse i comportamenti de- scritti dal team (sezione 3.11). Openfisca-country-template non `e altro che un insieme di file e cartelle necessarie per iniziare a sviluppare il sistema fiscale per il proprio pae- se, infatti, esso contiene vari file che sono generali per ogni sistema fiscale, tra i quali troviamo: • File di configurazione ed informazione che agevolano il lavoro dello sviluppatore; • Cartelle .github e .circleci; • Cartella openfisca-name of country, che contiene, non solo la struttura base di un sistema fiscale, ma anche vari file che fungono da esempio per comprendere il collegamento tra le varie componenti viste nella sezione 3.7. 39
  • 45. 3.11 Contributo al progetto Openfisca In questa sezione, verranno discussi i vari contributi forniti ai vari progetti della community Openfisca, escludendo openfisca-italy al quale dedicheremo un capitolo intero. 3.11.1 Contributo al country-template Per contribuire ad openfisca-country-template abbiamo deciso di sviluppare due python script: • Lo script per inizializzare il country-template di un qualsiasi paese (disponibile al link: https://pastebin.com/fHXRUvac), che generaliz- za la procedura di adattamento del country-template, rendendola cross- platform ed user-friendly. • Lo script per eseguire ricorsivamente tutti i test esistenti in una di- rectory scelta dall’utente (disponibile al link: https://pastebin.com/ j8BPT3dm), che consente con due semplici click, di eseguire tutti i test all’in- terno di un sistema fiscale, senza dover ricorrere all’uso del terminale. 3.11.2 Contributo alla documentazione Durante lo studio della documentazioe e lo sviluppo del software, ci siamo ac- corti che alcune istruzioni erano errate o mancanti. Parlando col team di sviluppo, abbiamo potuto aggiornare la documentazione esistente per renderla corretta. In particolare abbiamo: • Aggiornato la documentazione riguardante un’istruzione errata e un’istru- zione mancante nella sezione della codifica delle riforme; • Preparato l’introduzione di documentazione mancante, riguardante l’importazione di particolari variabili (Enum) da un file all’altro (che `e as- solutamente necessaria per avere una buona organizzazione del codice). Di seguito la bozza da migliorare e convertire in markdown: Per poter importare una variabile di tipo Enum, da un file all'altro `e necessario che questo particolare tipo di variabile si trovi su un file '.py' in un livello di gerarchia pi`u alto rispetto al file in cui lo si vuole importare. Normalmente questa azione non serve, in quanto tutti gli altri tipo di variabili esistono a livello globale, a prescindere dalla gerarchia di directory in cui queste si trovano. → → → → → → → → 40
  • 46. 3.11.3 Contributo al core di OpenFisca Sviluppando il sistema fiscale italiano, ci siamo accorti di alcune migliorie che potevano essere apportate ad openfisca-core per rendere migliore lo sviluppo di un generico country-package. In particolare, abbiamo suggerito due migliorie, una di queste segnalata formlamente tramite issue (visionabile al seguente link: https: //github.com/openfisca/openfisca-core/issues/657). Questi sugge- rimenti sono stati accettati dagli sviluppatori e consistono in: • Nuova funzionalit`a interpretativa del Fancy Indexing Brevemente, il Fancy Indexing `e un meccanismo che consente di calcolare il valore dei parametri in base al valore delle variabili a run-time. Per questo meccanismo, gli sviluppatori hanno previsto solamente un calcolo di uguaglianza: – Se la variabile a assume il valore X1 allora il param calc su a varr`a Y1; – Se la variabile a assume il valore X2 allora il param calc su a varr`a Y2; – ... – Se la variabile a assume il valore Xn allora il param calc su a varr`a Yn; Durante lo sviluppo delle varie leggi, abbiamo trovato l’esigenza di calcolare parametri in base a un range di valori matematici: Ad esempio, ci sono alcune soglie che, se non superate, rendono i redditi scaturiti da pensioni non sono soggetti all’imposta IRPEF. Queste soglie, cambiano in base all’et`a della persona: Se il soggetto ha 75 anni o meno, vale il valore di soglia X1 mentre se ha pi`u di 75 anni entra in gioco il valore di soglia X2. Per implementare un concetto del gener, con il meccanismo attuale dell’ugua- glianza, avremmo dovuto definire il primo valore per 75 volte e il secondo per almeno altre 40 (supponendo che una persona possa vivere fino a 115 anni) con conseguente spreco di codice. La soluzione al problema, da noi proposta, `e quella di introdurre un simbolo che consenta al simulatore, di capire che non vogliamo confrontare il valo- re della variabile tramite uguaglianza ma tramite un altro criterio (come ad esempio >= ,<= ,> ,< ...). • Due campi aggiuntivi per le Variabili L’esigenza della richiesta dell’introduzione di due nuovi campi, `e sorta durante lo sviluppo di variabili numeriche che non vengono calcolate tramite una formula; infatti, l’introduzione di questi due campi varrebbe solamente per variabili numeriche (una situazione simile alle variabili Enum, che necessitano di un campo aggiuntivo rispetto a tutti gli altri tipi). Nel sistema legislativo italiano, ed anche in molti altri sistemi legislativi, esi- stono variabili che non dipendono da nessun’altra variabile o parametro, ma che sono soggette a imposizioni numeriche (ad esempio, ci sono alcune detra- zioni IRPEF che non possono superare una certa quantit`a fissata X). Queste variabili vengono ovviamente tradotte in variabili il cui valore `e assegnabile unicamente tramite input, ed `e proprio qui che si presenta quello che abbiamo denominato Problema del limite superiore-inferiore: 41
  • 47. Una variabile, il cui valore pu`o essere assegnato unicamente in input, non viene sottoposta ad alcun controllo semantico, ci`o significa che il valore teorico di una variabile, che non dovrebbe superare/precedere un certo valore numeri- co X, pu`o tranquillamente farlo. Si potrebbe pensare, che questo problema non valga per le variabili il cui valore `e assegnabile tramite formula, in quanto la formula impone , chia- ramente, un controllo semantico. Il problema `e purtroppo valido, anche per loro: come descritto nella sezio- ne 3.8.2, relativa alle variabili “se una variabile definisce una formula per essere calcolata, quest’ultima pu`o assumere un valore sia calcolato tramite una formula sia assegnato in input, mentre non `e vero il contrario”, ma per l’assioma che regola le priorit`a dell’assegnamento: l’assegnamento in in- put `e pi`u forte dell’assegnamento tramite formula. Ci`o significa, che anche il controllo semantico dettato dalla formula pu`o essere facilmente ignorato. La soluzione da noi proposta, consiste nell’introdurre due campi all’interno della dichiarazione della variabile numerica: – max limit: Per definire quale sia il valore massimo che la variabile numerica pu`o assumere; – min limit: Per definire quale sia il valore minimo che la variabile nume- rica pu`o assumere; Dialogando con il team, abbiamo trovato una soluzione provvisoria che evita il problema, ma non lo risolve. La soluzione, consiste nel duplicare la variabile, facendo in modo che la prima copia, sia quella assegnabile e la seconda sia quella che il sistema considerer`a per i suoi calcoli e che sottopone la prima ai controlli semantici, una sorta di wrapping tra variabili. Ci si chiede ora il motivo per il quale questa soluzione evita il problema ma non lo risolve: la seconda variabile (ossia quella che sottopone al controllo la prima, e che verr`a considerata dal sistema) pu`o comunque essere assegnata in input, cadendo cos`ı nel problema del limite superiore-inferiore. 42
  • 48. 4. OpenFisca Italy In questa sezione, discuteremo dei criteri con i quali abbiamo scelto le leggi del sistema fiscale italiano da introdurre nel sistema openfisca-italy e di come queste sono state implementate. 4.1 Scelta della legislazione Nella fase di studio preliminare, ci siamo chiesti quali potessero essere le Fonti Normative principali da dover sviluppare e inserire con priorit`a, all’intero del sistema Openfisca italiano. Ragionando assieme all’ Avv. Lonoce Antonino abbiamo concordato che le prime Fonti da inserire nel sistema dovessero essere: • Utilizzate dalla maggior parte delle persone fisiche (dato che per ora, nel sistema openfisca-core non `e possibile definire variabili per entit`a giuridiche); • Pi`u o meno stabili a livello di comportamento. Basandoci su questi criteri, la scelta `e ricaduta nell’ambito delle Imposte, in parti- colare sull’ Imposta sul reddito delle persone fisiche (IRPEF) e sull’ Imposta municipale unica (IMU). Queste imposte sono state scelte per due motivazioni principali: • Ricomprendono la maggior parte dei soggetti (tutti i cittadini sono contribuenti in tema dell’Imposta sul Reddito a meno di esenzioni, e molti sono soggetti ad Imu); • Sono utili per effettuare delle simulazioni e delle statistiche comples- se. Immaginiamo, ad esempio, di poter calcolare l’imposta Irpef dovuta da 100000 cittadini, ognuno con redditi e situazioni fiscali autonome, prima con la normative in vigore e poi applicando una “riforma” definita dal legislatore. Le informazioni scaturite da questi calcoli complessi, una volta organizzate, potrebbero facilmente aiutare il legislatore nel validare se si debba/possa av- viare un procedimento legislativo (Es. abbassare o alzare un’aliquota, per un determinato range di redditi). 43
  • 49. 4.2 Nozioni teoriche IRPEF In questa sezione, discuteremo della complessa struttura che porta alla defini- zione dell’IRPEF. Tutte le informazioni relative a quest’imposta sono state derivate dal TUIR [20] e dal sito dell’Agenzia Delle Entrate [21]. 4.2.1 Definizione legislativa L’Imposta sul reddito delle persone fisiche `e l’imposta diretta sul reddito che colpisce le persone fisiche nell’ordinamento tributario nazionale. L’imposta colpisce la capacit`a contributiva personale globale del contribuente (red- dito posseduto, situazione personale e situazione familiare) con un approccio pro- gressivo, ossia, viene utilizzata un’aliquota pi`u elevata all’aumentare del reddito totale [22]. La tabella del sistema a scaglioni [23], che indica le aliquote e la quota lorda da pagare in base al reddito, `e la seguente: 4.2.2 Struttura generale Per poter calcolare, in maniera corretta, l’ imposta sul reddito delle persone fisi- che `e necessario compilare vari fascicoli [24], in particolare, `e necessario il fascicolo 1: Questo fascicolo `e composto da quadri di vario tipo, in particolare, ogni quadro possiede un insieme di righi, per il quale `e prevista una regolamentazione per la compilazione. La compilazione dei quadri RA, RB, RC, CR, RP LC sono necessari alla for- mazione della base imponibile e quindi, alla compilazione del quadro RN relativo alla determinazione dell’IRPEF e di tutti i quadri successivi (RV, DI, RX). Sarebbe tedioso e superfluo, descrivere tutti i quadri uno per uno, inoltre, tutte 44
  • 50. le istruzioni per la compilazione sono presenti nel sito dell’Agenzia Delle Entra- te (https://goo.gl/BNxNWQ). La descrizione dei quadri verr`a, quindi, limitata alle nozioni necessarie per il calcolo dell’imposta in esame. Di seguito il quadro RN, relativo alla determinazione dell’IRPEF: 4.2.2.1 Base imponibile Il presupposto d’imposta e la base imponibile sono individuati nell’ambito delle discipline delle singole categorie reddituali. La base imponibile `e la cifra sulla quale viene calcolata l’imposta lorda IRPEF, ed `e generata dal seguente calcolo: Base imponibile (RN4)= Reddito complessivo - Deduzione per abitazione principale - Oneri deducibili 4.2.2.2 Reddito complessivo Il reddito complessivo(RN1) `e il risultato della sommatoria delle redditivit`a prodotte dalla persona fisica. Le tipologie di reddito, che concorrono alla formazione del reddito complessivo, restrittivamente sono: • Redditi di lavoro dipendente, sono quelli che derivano da rapporti aventi per oggetto la prestazione di lavoro, con qualsiasi qualifica, alle dipendenze e sotto la direzione di altri, compreso il lavoro a domicilio quando `e considerato lavoro dipendente secondo le norme della legislazione sul lavoro [25]; 45
  • 51. • Redditi di lavoro autonomo,sono quelli derivanti dall’esercizio abituale, ancorch´e non esclusivo, di attivit`a lavorative diverse da quelle di impresa o di lavoro dipendente [26]; • Redditi fondiari, sono quelli inerenti ai terreni e ai fabbricati, situati nel territorio dello Stato, che sono o devono essere iscritti, con attribuzione di rendita, nel catasto dei terreni o nel catasto edilizio urbano [27]; • Redditi di capitale, sono redditi derivanti dalle rendite finanziarie e dai dividendi da partecipazione [28]; • Redditi di impresa, sono redditi derivanti dall’esercizio di imprese commer- ciali, ossia dall’esercizio professionale ed abituale, anche se non esclusivo, delle attivit`a indicate nell’art. 2195 del codice civile e delle attivit`a agricole indicate nell’art. 32, c.2, lettere b) e c), che eccedono i limiti ivi stabili, anche se non organizzate in forma di impresa. [29]; • Redditi diversi, costituiscono una categoria di reddito residuale, che ha carattere eterogeneo, in quanto comprende i redditi pi`u disparati che non rientrano nelle altre categorie di reddito o che hanno caratteri peculiari non inquadrabili in una categoria tipica [30]. In termini algoritmici, il reddito complessivo `e dato da: Tipologie reddito = [redditi lavoro dipendente, redditi di capitale, redditi lavoro autonomo,redditi fondiari, redditi di impresa, redditi lavoro dipendente] Reddito complessivo = N t=1 Tipologie reddito[t] Gli importi delle varie categorie reddituali, vengono definiti compilando i vari quadri RA,RB ed RC elencati di seguito: (a) Quadro RA (b) Quadro RB (c) Quadro RC 4.2.2.3 Deduzione per abitazione principale Prima di mostrare come si determina la deduzione per abitazione principale, bisogna definire cosa sia l’ abitazione principale: “Per abitazione principale si deve intendere l’immobile che il contribuente possiede 46
  • 52. a titolo di propriet`a o di altro diritto reale e che ha destinato a dimora abituale propria e dei propri familiari” [31]. Questa deduzione compete: • al proprietario; • all’ usufruttuario; • al titolare di un diritto di abitazione; • ai familiari del contribuente, se parenti entro il terzo grado ed affini entro il secondo. La deduzione per abitazione principale(RN2), si calcola sottraendo al reddito complessivo il reddito dell’abitazione principale e delle relative pertinen- ze, attribuita alla casa di abitazione e riducendo, in tal modo, l’importo sul quale calcolare le imposte. 4.2.2.4 Oneri deducibili Il totale degli oneri deducibili(RN3), scaturisce dalla compilazione della Se- zione II del quadro RP, indicato di seguito: Le istruzioni per la compilazione, sono rimandate alla sezione relativa nel sito della Agenzia Delle Entrate. 47
  • 53. 4.2.2.5 Imposta lorda Per determinare l’imposta lorda IRPEF(RN5) applicare il metodo a sca- glioni alla base imponibile. Il calcolo a livello algoritmico `e il seguente: Imposta lorda IRPEF(R) = N i=1 αi ∗ max(0, min(R, Si+1) − Si) R: Reddito si: Scaglione αi: Aliquota sn+1: ∞ n: numero scagloni Supponendo che valga la seguente tabella i Si Scaglione αi Aliquota 1 0 23% 2 15000 27% 3 28000 38% 4 55000 41% n = 5 75000 43% 4.2.2.6 Imposta netta Per calcolare l’imposta IRPEF netta(RN26) `e necessario sottrarre dall’impor- to lordo il totale delle altre detrazioni d’imposta e crediti d’imposta(RN22) e il totale delle detrazioni d’imposta(RN25): Imposta netta IRPEF(R) = Imposta lorda IRPEF(R) - totale altre detrazioni imposta crediti imposta - totale detrazioni imposta 4.2.2.7 Totale detrazioni d’ imposta Il totale delle detrazioni di imposta si ottiene sommando il totale delle detra- zioni per carichi di famiglia e lavoro (RN8) e dalle altre detrazioni indicate dal rigo RN12 al RN21. 4.2.2.8 Totale altre detrazioni d’ imposta e crediti d’imposta Il totale delle altre detrazioni di imposta si ottiene dalla somma delle detrazioni per spese sanitarie per determinate patologie(RN23) e dal totale dei crediti d’imposta che generano residui(RN24). 48
  • 54. 4.3 Implementazione IRPEF Dopo aver discusso con l’Avv. Lonoce Antonino dell’imposta ed aver appreso tutte le nozioni necessarie, siamo passati alla codifica 1 . Per aiutare un futuro programmatore nella lettura del codice, l’albero di directory generato per l’implementazione, ha seguito fedelmente la struttura della dichia- razione dei redditi[32]. Le variabili e i parametri, presenti all’interno dei vari file, sono stati definiti seguendo le istruzioni per la compilazione delle dichiara- zione dei redditi [33]. L’implementazione dei vari quadri dell’IRPEF `e stata molto lunga data la comples- sit`a degli aspetti da gestire (detrazioni specifiche, calcoli di aliquote...). Nonostante il lungo lavoro di codifica, non `e stato possibile implementare in maniera completa la compilazione di tutti i quadri necessari. In particolare, `e possibile compilare: • Il Quadro RP, destinato all’indicazione di specifici oneri che, a seconda dei casi, possono essere fatti valere nella dichiarazione dei redditi come detraibili e deducibili. • Il Quadro LC, destinato all’indicazione della Cedolare secca sulle locazioni. In particolare, il Quadro LC accoglie la liquidazione unitaria della cedolare secca complessivamente dovuta dal contribuente per il periodo dichiarativo. • Il Quadro RN, che riassume tutti i dati, dichiarati negli altri quadri di questo modello, utili per determinare l’imposta sul reddito delle persone fi- siche (Irpef). Questo quadro `e compilabile fino al rigo RN26 che corrisponde all’importo dell’IRPEF netta. Tutte le varie implementazioni, consentono di definire e/o calcolare ogni rigo per tutti i quadri2 . La struttura di tutti gli altri quadri `e stata creata ma non implementata. L’imple- mentazione dell’IRPEF `e disponibile al seguente link: https://github.com/openfisca/openfisca- italy3 . 1 Prima di gettarci a capofitto nell’implementazione dell’IRPEF, abbiamo definito variabili e parametri generali per ogni persona fisica, come l’et`a anagrafica, il codice fiscale, etc... 2 Alcuni righi dei vari quadri (in particolare le detrazioni per i figli a carico) non sono state sviluppate completamente a causa di strutture dati mancanti che sono ancora in fase di sviluppo nella piattaforma OpenFisca 3 Tuttavia le varie implementazioni si trovano in branch differenti rispetto a quello principale. 49
  • 55. 4.4 Nozioni teoriche IMU 4.4.1 Definizione legislativa L’Imposta municipale unica[34] `e un’imposta italiana che si applica sugli immo- bili che sostituisce l’ICI. Questa imposta[35] `e: • Diretta: colpisce direttamente il patrimonio che una persona possiede in un dato momento; • Patrimoniale: colpisce la disponibilit`a di ricchezza accumulata anche nell’ar- co di intere generazioni. Dal 2014 `e stata integrata nella IUC (Imposta Unica Comunale)[36], imposta che raggruppa le principali imposte locali presenti nel Ordinamento italiano: • IMU; • TASI; • TARI. 4.4.2 Struttura generale 4.4.2.1 Soggetti coinvolti Nell’imposta sono coinvolti due tipologie di soggetti[37]: • Soggetto Attivo: Il Comune (che ha funzione impositiva); • Soggetti Passivi, categoria che include: – Il proprietario di un immobile; – I titolari di usufrutto, uso, enfiteusi, abitazione e superficie; – L’ex coniuge titolare di un immobile; – Il locatario di un immobile (ad esempio: l’immobile sia concesso in lea- sing); – Il concessionario di aree demaniali (ad esempio uno stabilimento balnea- re). 50
  • 56. 4.4.2.2 Immobili Il legislatore ha diviso gli immobili nelle seguenti categorie[38] per strutturare al meglio il calcolo dell’imposta: Fig. 4.2: Categorie Catastali. 4.4.2.3 Rendita catastale Per calcolare l’IMU `e necessario conoscere la rendita catastale[39] di un bene immobile che viene calcolata in base alla categoria di appartenenza, per esempio la categoria B viene calcolata in base ai metri cubi. Il valore della rendita catastale pu`o essere richiesto dall’Ufficio dell’Agenzia del territorio fornendo i dati catastali dell’immobile. La rendita verr`a successivamente rivalutata del 5 percento per compensare l’errore dato dall’estimo (25 percento per il gruppo T). 51
  • 57. 4.4.2.4 Moltiplicatori Catastali e Aliquote Per ogni categoria `e presente un moltiplicatore catastale che andr`a moltiplicato per la rendita catastale rivalutata, il risultato di questa operazione `e chiamata base imponibile. I moltiplicatori[40] sono i seguenti: • 160: Per le categorie C/2, C/6, C/7 e tutto il gruppo A tranne la categoria A/10; • 140: Per il gruppo B e le categorie C/3, C/4, C/5; • 135: Per il gruppo T; • 110: Per il gruppo T che abbia come possessore un coltivatore diretto o un imprenditore agricolo professionale; • 80: Per le categorie A/10 e D/5 • 65: Per il gruppo D tranne la categoria D/5; • 55: Per la categoria C/1 Successivamente la base imponibile viene moltiplicata per l’aliquota della categoria dell’immobile[41]a cui fa riferimento; questa che pu`o essere modificata dal Comune dov’`e locato l’immobile, se cos`ı non fosse, allora viene applicata l’aliquota stan- dard relativa alla categoria dell’immobile. Il risultato dell’operazione `e chiamata Imposta IMU. Fig. 4.3: Aliquote Catastali[42]. 52
  • 58. 4.4.2.5 Percentuale, Mesi di possesso e Detrazioni L’imposta tiene anche conto dei mesi e la percentuale di possesso dell’immobile, per ottenere l’importo da pagare di un determinato immobile posseduto X mesi in una percentuale Y, successivamente vengono poi sottratte le detrazioni Imu (che vengono date in determinati casi)[43]. Risultato = ImpostaImu ∗ X 12 ∗ Y 100 − DetrazioniImu 4.4.2.6 Esenti parziali/totali L’imposta offre uno sconto totale o parziale in base a determinati fattori quali la tipologia, l’ubicazione, lo stato, lo scopo ed il possessore dell’immobile[44]. Sono esenti al 100% gli immobili: • Appartenenti allo Stato; • Appartenenti a regioni, province, comuni, comunit`a montane, consorzi dei enti (non soppressi), enti del servizio sanitario nazionale destinati a scopi istituzionali; • Destinati ai compiti istituzionali posseduti dai consorzi tra enti territoriali, prevista all’art. 7, comma 1, lett. a), del D. Lgs. n. 504 del 1992; • Classificati nel gruppo E • Destinati ad usi culturali di cui all’art. 5-bis del D.P.R. 29 settembre 1973, n. 601, e successive modificazioni; • Destinati esclusivamente all’esercizio del culto, purch´e compatibile con le di- sposizioni degli artt. 8 e 19 della Costituzione, e le loro pertinenze; • Di propriet`a della Santa Sede indicati negli artt. 13, 14, 15 e 16 del Trattato lateranense; • Appartenenti agli Stati esteri ed alle organizzazioni internazionali per i quali `e prevista l’esenzione dall’imposta locale sul reddito dei fabbricati in base ad accordi internazionali resi esecutivi in Italia; • Utilizzati dai soggetti di cui all’art. 73, comma 1, lett. c), del TUIR, destinati esclusivamente allo svolgimento con modalit`a non commerciali di attivit`a as- sistenziali, previdenziali, sanitarie, didattiche, ricettive, culturali, ricreative e sportive, nonch´e delle attivit`a di cui all’art. 16, lett. a), della legge 20 maggio 1985, n. 222; • Rurali ad uso strumentale di cui all’art. 9, comma 3-bis, del D. L. n. 557 del 1993, ubicati nei comuni classificati montani o parzialmente montani di cui all’elenco dei comuni italiani predisposto dall’ISTAT; • Appartenti alla categoria T e ricadenti in aree montane o di collina individuati dalla circolare del Ministero delle Finanze n. 9 del 14/06/1993 53
  • 59. • Appartenti alla categoria T e posseduti e condotti da coltivatori diretti (CD) o da imprenditori agricoli professionali (IAP); • Appartenti alla categoria T e ubicati nei comuni delle isole minori di cui all’allegato A annesso alla legge 28/12/2011 n.448; • Appartenti alla categoria T e con immutabile destinazione agrosilvo-pastorale a propriet`a collettiva indivisibile e inusucapibile; • Ad uso abitativo ma non locata (con le relative pertinenze) posseduta da anziani o disabili residenti in modo permanente presso un istituto di ricove- ro/sanitario; • Aventi il ruolo di prima casa appartenenti fra la categoria A/2 e A/7 (Legge di stabilit`a 2014) con le pertinenze (C/2, C/6, C/7)) ad essa correlata (valida solo per un’istanza per ogni categoria di pertinenza). Sono esenti al 25% gli immobili locati a canone concordato, cio`e relativo a contratti dalla durata minima di 5 anni 4 che abbiano importi minimi e massimi stabiliti a livello locale, dal Comune in cui risiede l’immobile. Sono esenti al 50% sull’imposta imu gli immobili per il comodato d’uso gratuito genitori-figli, cio`e la consegna gratuita di un immobile per un certo lasso di tempo a genitori/figli. Questo `e valido solo se: • Il contratto di comodato `e stato regolarmente registrato presso l’Agenzia delle Entrate; • Il comodante possiede un solo immobile sul territorio nazionale e che risieda e dimori abitualmente nello stesso comune in cui `e situato l’immobile concesso in comodato; • Il comodante oltre a possedere l’immobile dato in comodato, possiede nello stesso comune un altro immobile adibito a propria abitazione principale, fatta eccezione delle abitazioni di categorie catastali A/1, A/8 e A/9. `E presente uno sconto del 50% sulla base imponibile dell’immobile per i fabbri- cati di interesse storico o artistico, e per i fabbricati dichiarati inagibili (accertati dall’ufficio tecnico comunale). 4.5 Implementazione IMU Dopo aver discusso con l’Avv. Lonoce Antonino dell’imposta ed aver appreso i concetti necessari, siamo passati alla codifica. In questa sezione mostriamo breve- mente i risultati ottenuti. Sfortunatamente l’implementazione dell’IMU non sar`a dettagliata come quella del- l’IRPEF a causa della sua enorme complessit`a e della grandissima articolazione delle sue variabili, ci`o avrebbe richiesto un numero maggiore di colloqui con l’avvocato. Inoltre un’analisi pi`u approfondita avrebbe richiesto un’implementazione pi`u det- tagliata con strutture dati che sono ancora in fase di sviluppo nella piattaforma OpenFisca. Inizialmente abbiamo implementato la base dell’IMU: 4 Il contratto `e nella forma 3 + 2 cio`e dura 3 anni ma `e previsto un rinnovo tacito di 2 anni. 54
  • 60. • Categorie catastali; • Aliquote; • Variabili booleane per verificare delle condizioni; • Variabili basilari dell’immobile (base imponibile, valore dell’immobile...) Successivamente abbiamo implementato tutte le formule utili per calcolare l’IMU su: • Aree fabbricabili; • Seconda casa; • Prima casa; • Immobili a canone concordato; • Immobili con interesse storico/artistico; • Immobili inagibili; • Immobili posseduti in una determinata percentuale; • Immobili posseduti solo per un numero definito di mesi; • Pertinenze dell’immobile; • Terreni. Tutto ci`o `e stato anche testato durante l’implementazione in modo che le nuove funzionalit`a non intacchino le precedenti. Il codice riguardante l’IMU `e disponibi- le al seguente URL: https://github.com/openfisca/openfisca-italy/ tree/Initizialize_open-fisca-italy/openfisca_italy5 5 Attualmente le funzionalit`a sopra riportate non si trovano sul branch master 55
  • 61. 5. Openfisca Managing Tool Avendo gi`a descritto, anche se in minima parte, il sistema openfisca-italy, pos- siamo ora descrivere l’argomento centrale della tesi, il software di nostra concezione Openfisca Managing Tool (repository Github: https://goo.gl/s9kFhz). In particolare, descriveremo le motivazioni che ci hanno spinto a sviluppare questo software, l’architettura e le varie funzionalit`a, descrivendole dapprima in maniera teorica con l’ausilio di diagrammi per poi passare alla descrizione dell’ implementazione, con l’ausilio di immagini derivate dal software . 5.1 Scopo del software Durante lo sviluppo del sistema openfisca-italy abbiamo constatato che sarebbe impossibile, per il legislatore, definire nuove riforme, variabili , parametri o effettuare analisi senza l’ausilio di un team di sviluppatori. Da questa premessa, nasce l’idea Openfisca Managing Tool, che si propone di essere un software user-friendly per la gestione e l’analisi di un generico sistema fiscale openfisca. 56