Skip to content

Commit

Permalink
Merge branch 'master' into aide-aep-eure-et-loir-finalisation-#143
Browse files Browse the repository at this point in the history
  • Loading branch information
Shamzic authored Oct 22, 2024
2 parents ffebc7f + ded15d2 commit a20fde4
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@

_Pour les changements détaillés et les discussions associées, référencez la pull request [#217](https://github.com/openfisca/openfisca-france-local/pull/217)_

## [6.14.1] - 2024-10-22

_Pour les changements détaillés et les discussions associées, référencez la pull request [#199](https://github.com/openfisca/openfisca-france-local/pull/199)_

### Added

- Ajoute de la documentation pour `aides_jeunes_reform`

## [6.14.0] - 2024-10-02

_Pour les changements détaillés et les discussions associées, référencez la pull request [#216](https://github.com/openfisca/openfisca-france-local/pull/216)_
Expand Down
52 changes: 52 additions & 0 deletions openfisca_france_local/aides_jeunes_reform.py
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,9 @@ def is_situation_handicap(individu: Population, period: Period) -> np.ndarray:


def build_condition_evaluator_list(conditions: 'list[dict]') -> 'list[ConditionEvaluator]':
"""
Établit une correspondance entre les conditions et les fonctions qui évaluent ces conditions.
"""
try:
evaluators: 'list[ConditionEvaluator]' = [
ConditionEvaluator(condition, condition_table[condition['type']])
Expand All @@ -296,6 +299,9 @@ def build_condition_evaluator_list(conditions: 'list[dict]') -> 'list[ConditionE


def build_profil_evaluator(profil: dict) -> ProfileEvaluator:
"""
Associe un test d'éligibilité au profil et pour chacune de ses conditions.
"""
try:
predicate = profil_table[profil['type']]
except KeyError:
Expand Down Expand Up @@ -334,6 +340,12 @@ def eval_profil(profil_evaluator: ProfileEvaluator,


def generate_variable(benefit: dict):
"""
Créé la variable qui va être intégrée dans le TaxAndBenefitSystem.
Génère une `Variable` Openfisca dont le type est la formule correspondent
aux données du dictionaire source issue d'un fichier `YAML`.
"""
variable_name: str = benefit['slug']
amount = benefit.get('montant')

Expand Down Expand Up @@ -379,6 +391,21 @@ def formula(individu: Population, period: Period, parameters):


class aides_jeunes_reform_dynamic(reforms.Reform):
"""
Cette réforme n'est pas une réforme au sens légal du terme.
La réforme ici présente est utilisée pour lire des fichiers `YAML`
qui modélisent des dispositifs d'aides sociales avec des conditions simples
de manière à les intégrer dans une instance Openfisca.
Pour utiliser la réforme, il faut :
- Définir le chemin des dossiers qui contiennent
les aides et les institutions avec les variables d'environement
`DYNAMIC_BENEFIT_FOLDER` et `DYNAMIC_INSTITUTION_FOLDER`
- Lancer Openfisca en appelant la réforme :
`--reform openfisca_france_local.aides_jeunes_reform.aides_jeunes_reform_dynamic`
"""

def __init__(self, baseline, benefits_folder_path=default_benefit_path, institutions_folder_path=default_institutions_path):
self.benefits_folder_path = getenv('DYNAMIC_BENEFIT_FOLDER', benefits_folder_path)
self.institutions_folder_path = getenv('DYNAMIC_INSTITUTION_FOLDER', institutions_folder_path)
Expand All @@ -403,12 +430,30 @@ def apply(self):

def _extract_benefit_file_content(self, benefit_path: str):
def _convert_institution_to_condition(benefit: dict) -> dict:
"""
Si le fichier `YAML` traité contient une condition de type `attached_to_institution`,
un traitement est nécessaire car les modalités de cette condition ne sont pas précisées
dans le fichier en question.
Cette condition est une condition géographique.
Il faut aller récupérer les informations liées à l'institution en question
dans un fichier qui modélise l'institution correspondante pour ensuite ajouter
une condition géographique équivalente.
Il existe 4 type de condition géographique :
`msa`, `caf`, `epci`, `regions`, `departements` et `communes`.
"""
if {'type': 'attached_to_institution'} in benefit['conditions_generales']:
conditions_generales_without_attached_institution = [
condition for condition
in benefit['conditions_generales']
if condition != {'type': 'attached_to_institution'}]

# /!\ Pas de mise en cache faite ici. Si deux fichiers font appel à la même institution,
# le fichier de l'institution en question sera ouvert 2 fois.
# Si un jour la condition `attached_to_institution` venait à être utilisée de manière
# intensive, il pourrait être intéressant d'implanter un cache ici
with open(f'{self.institutions_folder_path}/{benefit["institution"]}.yml') as file:
institution: dict = yaml.safe_load(file)

Expand All @@ -429,6 +474,13 @@ def _convert_institution_to_condition(benefit: dict) -> dict:
return benefit

def _slug_from_path(path: str):
"""
Pour créer une nouvelle variable Openfisca, il est necessaire
de lui donner un nom qui respecte la syntaxe d'une variable Python.
Cette méthode utilise le nom du fichier pour déterminer
un nom de variable compatible.
"""
return path.split('/')[-1].replace('-', '_').split('.')[0]

with open(benefit_path) as file:
Expand Down

0 comments on commit a20fde4

Please sign in to comment.