README.md 5.88 KB
Newer Older
Christophe Benz's avatar
Christophe Benz committed
1
# Calculette Impôts traduite en Python
Christophe Benz's avatar
Christophe Benz committed
2

3 4 5 6
## Installation

Le langage Python 3 est utilisé.

AlexisEidelman's avatar
AlexisEidelman committed
7 8
Il est nécessaire d'avoir au préalable installé le paquet [calculette-impots-m-language-parser](https://git.framasoft.org/openfisca/calculette-impots-m-language-parser).

Christophe Benz's avatar
Christophe Benz committed
9
Ce paquet n'est pas publié sur le dépôt [PyPI](https://pypi.python.org/pypi) donc pour l'installer il faut passer par `git clone`.
AlexisEidelman's avatar
AlexisEidelman committed
10

11
```
Christophe Benz's avatar
Christophe Benz committed
12 13
git clone https://git.framasoft.org/openfisca/calculette-impots-python.git
cd calculette-impots-python
14 15 16 17 18 19 20
pip3 install --editable . --user
```

> L'option `--user` sert sur les systèmes GNU/Linux.

Un utilisateur plus expérimenté en Python peut utiliser
un [`virtualenv`](https://virtualenv.readthedocs.org/en/latest/) s'il le souhaite.
21

22 23
## Utilisation

Christophe Benz's avatar
Christophe Benz committed
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
Ce paquet installe une commande `calculette-impots` dans votre répertoire utilisateur.
Cela signifie que vous pouvez la taper dans un terminal et elle sera reconnue, sauf si elle a été installée
en dehors du "PATH".

Cette commande accepte des sous-commandes. Voyons son utilisation :

```
$ calculette-impots
Usage:
  calculette-impots calculate [--no-verifs] VARIABLE...
  calculette-impots info VARIABLE...
  calculette-impots (-h | --help)
  calculette-impots --version
```

### La sous-commande `info`

La sous-commande `info` permet d'afficher des informations sur les variables, en particulier leur type,
quelques attributs, leurs éventuelles dépendances et dépendances inverses.

Exemple :

```
$  $ calculette-impots info TSHALLOV
{
  "TSHALLOV": {
    "variable_definition": {
      "alias": "1AJ",
      "attributes": {
        "acompte": 1,
        "avfisc": 0,
        "categorie_TL": 20,
        "classe": 0,
        "cotsoc": 5,
        "ind_abat": 1,
        "nat_code": 0,
        "priorite": 10,
        "rapcat": 4,
        "sanction": 8
      },
      "description": "Salaires - Declarant 1",
      "name": "TSHALLOV",
      "restituee": true,
      "subtype": "revenu",
      "tgvh_linecol": [
        13637,
        1
      ],
      "type": "variable_saisie"
    },
    "variable_reverse_dependencies": [
      "ABTS1AJ",
      "INDPPEV",
      "INDREV1A8IR",
      [...]
    ]
  }
}
```

Certains bouts ont été coupés pour ne pas polluer le README.

Ceci était une variable de saisie mais on peut également obtenir des infos les variables calculées.

### La sous-commande `calculate`

Sans argument, la sous-commande `calculate` calcule toutes les variables restituées,
91
sans remplir aucune case de la déclaration. Cela équivaut à un célibataire sans enfants et sans revenu.
Christophe Benz's avatar
Christophe Benz committed
92 93 94

Il faut tout de même préciser une variable de saisie spéciale (`V_ANREV` pour "Annee des revenus") pour laquelle
on donne la valeur `2014` car ici on calcule les impôts de 2015 sur les revenus de 2014.
Christophe Benz's avatar
Christophe Benz committed
95
Si on ne le fait pas un "warning" nous le rappelle.
Christophe Benz's avatar
Christophe Benz committed
96 97 98

De plus, pour l'instant, on peut passer une autre option (`--no-verifs`) à la commande `calculette-impots`
pour ignorer les "vérifs", qui sont des tests validant la cohérence des calculs.
99 100

```
Christophe Benz's avatar
Christophe Benz committed
101 102 103 104 105 106 107 108 109 110
$ calculette-impots calculate V_ANREV=2014 --no-verifs
{
  "calculate_results": {
    "ABSPE": 9,
    "APPLI_BATCH": 1,
    "CIIMSI": 2,
    "CIRIRF": 2,
    [...]
  }
}
111 112
```

Christophe Benz's avatar
Christophe Benz committed
113 114
Le JSON de sortie est coupé ici pour ne pas surcharger le README.
Pour info on peut utiliser un outil comme [`jq`](https://stedolan.github.io/jq/) pour le manipuler.
Christophe Benz's avatar
Christophe Benz committed
115

Christophe Benz's avatar
Christophe Benz committed
116
Ceci était une simulation à vide, maintenant il serait intéressant de remplir les cases de la déclaration d'impôts.
Christophe Benz's avatar
Christophe Benz committed
117

Christophe Benz's avatar
Christophe Benz committed
118
## Cas-types
Christophe Benz's avatar
Christophe Benz committed
119

Christophe Benz's avatar
Christophe Benz committed
120 121
Tout d'abord il faut savoir qu'on peut demander à calculer une ou plusieurs variables en particulier.
Pour cela il suffit d'ajouter le nom des variables mais sans le signe "=".
Christophe Benz's avatar
Christophe Benz committed
122 123

```
Christophe Benz's avatar
Christophe Benz committed
124 125 126 127 128 129 130
$ calculette-impots calculate V_ANREV=2014 IRN IDRS2 --no-verifs
{
  "calculate_results": {
    "IDRS2": 0,
    "IRN": 0
  }
}
Christophe Benz's avatar
Christophe Benz committed
131
```
132

Christophe Benz's avatar
Christophe Benz committed
133
Il faut aussi savoir que la variable `IRN` correspond (grosso-modo) à l'impôt total. C'est pour cela qu'on la demande.
Christophe Benz's avatar
Christophe Benz committed
134

Christophe Benz's avatar
Christophe Benz committed
135
Testons à présent quelques cas-types.
136 137 138

- Un célibataire sans enfants gagnant 10000€ par an
```
Christophe Benz's avatar
Christophe Benz committed
139 140 141 142 143 144
$ calculette-impots calculate V_ANREV=2014 TSHALLOV=10000 IRN --no-verifs
{
  "calculate_results": {
    "IRN": 0
  }
}
145 146 147
```
- Un célibataire sans enfants gagnant 30000€ par an
```
Christophe Benz's avatar
Christophe Benz committed
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
$ calculette-impots calculate V_ANREV=2014 TSHALLOV=30000 IRN --no-verifs
{
  "calculate_results": {
    "IRN": 2461
  }
}
```
- Un couple marié (date du mariage 05/05/1980) sans enfants dont le déclarant 1 gagne 10000€ par an et le déclarant 2 gagne 20000€ par an
```
$ calculette-impots calculate V_ANREV=2014 TSHALLOV=10000 TSHALLOC=20000 V_0AM=1 V_0AX=05051980 IRN --no-verifs
{
  "calculate_results": {
    "IRN": 264
  }
}
163 164
```

165 166
## Simulateur en ligne

Christophe Benz's avatar
Christophe Benz committed
167
Pour comparer les résultats avec ceux du simulateur en ligne :
168
http://www3.finances.gouv.fr/calcul_impot/2015/simplifie/index.htm
Christophe Benz's avatar
Christophe Benz committed
169

Christophe Benz's avatar
Christophe Benz committed
170 171 172 173
Un script permet d'appeler le simulateur en ligne :

```
python3 calculette_impots/scripts/calculette_online.py
174
python3 calculette_impots/scripts/calculette_online.py --saisie 1AJ=10000 1BJ=20000 0DA=1980 0DB=1970 0AX=05052014 pre_situation_famille=M
Christophe Benz's avatar
Christophe Benz committed
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
```

Cependant il n'est pas peaufiné au point d'accepter des arguments sur la ligne de commande.
Il faut donc l'éditer pour changer les valeurs.

De plus, les noms des variables ne sont pas les mêmes que dans le code source en langage M.
Ici ce sont les "aliases" qui sont définis dans le fichier `tgvH.m` (dans le projet [m-source-code](https://git.framasoft.org/openfisca/calculette-impots-m-source-code)).

Les contributions sont les bienvenues !

## Transpilation de l'AST JSON en Python

> Transpiler signifie compiler vers un autre langage de programmation.

Cette étape n'est utile que lorsque les fichiers JSON définissant l'AST changent.
Ceux-ci sont dans le dépôt [m-language-parser](https://git.framasoft.org/openfisca/calculette-impots-m-language-parser).

```
Christophe Benz's avatar
Christophe Benz committed
193
python3 calculette_impots/scripts/ast_to_python.py /path/to/calculette-impots-m-language-parser/json
Christophe Benz's avatar
Christophe Benz committed
194 195
```

Christophe Benz's avatar
Christophe Benz committed
196 197 198 199 200
## Qualité du code

```
flake8 --max-line-length 120 .
```