Skip to content
Snippets Groups Projects
Unverified Commit f4c97eb2 authored by sandcha's avatar sandcha Committed by GitHub
Browse files

Ajoute un endpoint /dotations

Merge pull request #19 from leximpact/endpoint-dotations
parents 7a17caf9 509fe599
No related branches found
No related tags found
No related merge requests found
......@@ -180,7 +180,7 @@ END
```
## Endpoints de l'API Web
## Endpoints de l'API Web - Impôt sur le revenu
L'API Web dispose des itinéraires suivants :
......@@ -442,7 +442,29 @@ Où `PAC` désigne `personne à charge`.
- foyers_fiscaux_touches : dictionnaire contenant les clefs `avant_to_plf`, `avant_to_apres`, `plf_to_apres`. Chaque élément du dictionnaire divise les foyers fiscaux en 5 catégories : `gagnant`, `perdant`, `neutre`, `neutre_zero`, `perdant_zero` : Ils décrivent si les foyers fiscaux payent plus ou moins d'impôts à l'arrivée qu'au départ. Les catégories finissant par `_zero` décrivent le foyers fiscaux qui étaient exonérés d'impôt au départ.
Par exemple, `neutre_zero` désigne le nombre de personnes pour lesquelles l'impact est neutre (avant = après) et qui sont exonérées d'impôt (donc, avant = après = 0).
## Endpoints de l'API Web - Dotations aux collectivités locales
L'API Web traite également d'une thématique isolée de l'impôt sur le revenu : les dotations
de l'État aux collectivités locales.
### /dotations
- Type : POST
- Description :
- Requête - contenu du body :
> En cours de définition. Valeur par défaut :
```
{
"reforme": { # décrit la réforme
"dotations": { # configure les éléments de la réforme des dotations
"montants": {"dgf": montant de la DGF},
"communes": {}
}
}
}
```
- Réponse - contenu du body :
> En cours de définition. Valeur par défaut `{"hello": "coucou"}`
## Base de données
......
def simulate(request_body):
simulation_result = {"hello": "coucou"} # construire le body de la response dans le handler ?
return simulation_result
......@@ -79,6 +79,19 @@ paths:
description: L'usager a pu étre authentifié·e
'401':
description: L'usager n'est pas dans la liste validée par l'INSEE
/dotations:
post:
summary: Demande le calcul de l'impact des articles de loi sur les dotations aux collectivités.
operationId: server.handlers.Dotations.simule_dotations
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/dotations'
responses:
'201':
description: Résultat de la simulation des dotations aux collectivités.
components:
schemas:
Greetings:
......@@ -256,3 +269,8 @@ components:
properties:
email:
type: string
dotations:
type: object
properties:
dotations:
type: object
from .cas_types import CasTypes, SimulationRunner # noqa
from .welcome import Welcome # noqa
from .dotations import Dotations # noqa
from Simulation_engine.simulate_dotations import simulate
# Checks whether all dictionnaries in the model exist in the target dict.
# Returns True or False, and the problematic field
def check_keys_dict(dict_to_check, model):
for k, v in model.items():
if k not in dict_to_check: # key does not exist
return False, k
if isinstance(v, dict):
if not isinstance(dict_to_check[k], dict): # should be a dict but is not
return False, k
res_child, node_err = check_keys_dict(dict_to_check[k], v)
if not res_child:
return False, ".".join([k, node_err])
return True, "All required keys are in the checked dictionary"
def check_request_body(request_body):
required_dict = {"reforme": {"dotations": {"montants": {"dgf": None}, "communes": None}}}
result, errorfield = check_keys_dict(request_body, required_dict)
if not result:
return {"Error": "Missing required '{}' field in request body.".format(errorfield)}, 400
class Dotations(object):
def simule_dotations(**params: dict) -> tuple:
request_body = params["body"]
# vérifier le format
check_result = check_request_body(request_body)
if check_result is not None:
return check_result
# calculer
simulation_result = simulate(request_body)
# constuire la réponse
return simulation_result, 200
......@@ -4,7 +4,7 @@ setup(
name="LexImpact Server",
author="LexImpact Team",
author_email="leximpact@openfisca.org",
version="1.2.0",
version="1.3.0",
license="https://www.fsf.org/licensing/licenses/agpl-3.0.html",
url="https://github.com/betagouv/leximpact",
classifiers=[
......
from functools import partial
import json
def test_dotations_request_body_error(client, headers):
request = {}
response_function = partial(client.post, "dotations", headers=headers)
response = response_function(data=json.dumps(request))
assert response.status_code == 400
assert "Error" in json.loads(response.data)
def test_dotations(client, headers):
request = {
"reforme": {
"dotations": {
"montants": {"dgf": 16},
"communes": {}
}
}
}
response_function = partial(client.post, "dotations", headers=headers)
response = response_function(data=json.dumps(request))
assert response.status_code == 200
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment