Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ajoute une première version du dispositif départ 18-25 #1507

Merged
merged 15 commits into from
Jul 29, 2021
Merged

Conversation

guillett
Copy link
Member

  • Évolution du système socio-fiscal.
  • Périodes concernées : à partir du 05/09/2014.
  • Zones impactées : prestations/depart1825.py.
  • Détails :
    • Ajoute une première version du dispositif départ 18-25

Ces changements (effacez les lignes ne correspondant pas à votre cas) :

  • Ajoutent une fonctionnalité (par exemple ajout d'une variable).

Quelques conseils à prendre en compte :

Et surtout, n'hésitez pas à demander de l'aide ! :)

MattiSG
MattiSG previously requested changes Apr 6, 2021
Copy link
Member

@MattiSG MattiSG left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je suis très gêné par le nombre de variables introduites. J'y vois une approche très pertinente d'un point de vue de génie logiciel, avec de l'encapsulation de fonctions, mais qui me paraît inappropriée pour la modélisation de la loi en code : chacun des éléments apportés n'a pas de sens d'un point de vue législatif, et le nombre de variables introduites dans l'espace de nommage global rend leur utilisation très compliquée.

openfisca_france/model/prestations/depart1825.py Outdated Show resolved Hide resolved
openfisca_france/model/prestations/depart1825.py Outdated Show resolved Hide resolved
@guillett
Copy link
Member Author

guillett commented Apr 7, 2021

Après plusieurs années d'écriture, d'investigation et de revue de code OpenFisca, je ne sais plus écrire des variables qui contiennent beaucoup de complexité et de logique. Je peux comprendre la gêne ressentie par la création de nombreuses variables mais, selon moi, elles ont bien chacune un seus d'un point de vue législatif (pris au sens très large, étant donné qu'ici, la loi, c'est de la documentation ANCV).

La création de plusieurs variables permet aussi de créer des espaces de complexité séparés où les liens avec le restes de la modélisation du système socio-fiscal sont explicités et sont disposés à une sorte de frontière avec un nouvel espace de complexité. Cela facilite grandement la rédaction de tests plus unitaires et la réutilisation du moteur (lorsque l'on souhaite calculer qu'une variable en particulier).

@guillett guillett requested a review from MattiSG April 7, 2021 06:36
openfisca_france/parameters/prestations/depart1825.yml Outdated Show resolved Hide resolved
Comment on lines +4 to +7
2014-09-05:
value: 17000
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Quand on ne renseigne que value, je trouve plus lisible d'utiliser la notation condensée 2014-09-05: 17000 🙂

openfisca_france/parameters/prestations/depart1825.yml Outdated Show resolved Hide resolved
openfisca_france/parameters/prestations/depart1825.yml Outdated Show resolved Hide resolved
openfisca_france/parameters/prestations/depart1825.yml Outdated Show resolved Hide resolved
openfisca_france/model/prestations/depart1825.py Outdated Show resolved Hide resolved
openfisca_france/model/prestations/depart1825.py Outdated Show resolved Hide resolved
openfisca_france/model/prestations/depart1825.py Outdated Show resolved Hide resolved
openfisca_france/model/prestations/depart1825.py Outdated Show resolved Hide resolved
openfisca_france/model/prestations/depart1825.py Outdated Show resolved Hide resolved
Copy link
Member

@MattiSG MattiSG left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Super ! Ce dispositif me semble pertinent à ajouter tel quel en l'absence de lignes directrices sur l'éclatement des variables intermédiaires.

Je me permets de suggérer d'attendre jusqu'à demain fin d'après-midi avant d'intégrer puisque nous avons une discussion prévue précisément sur ce sujet et que cette implémentation me semble être un bon cas d'exemple, qui pourrait donc se retrouver impacté en fonction des résultats, et dont tout changement nécessitera un changement de version majeur 🙂

openfisca_france/parameters/prestations/depart1825.yml Outdated Show resolved Hide resolved
openfisca_france/parameters/prestations/depart1825.yml Outdated Show resolved Hide resolved
openfisca_france/parameters/prestations/depart1825.yml Outdated Show resolved Hide resolved
@guillett
Copy link
Member Author

@MattiSG tu avais déjà validé la PR mais avec des réserves, donc je me suis permis de t'en redemander une.

J'ai supprimé une variable (le calcul du plafond de ressources) mais conservé les variables d'éligibilité. Est-ce Ok pour toi ? Merci.

Copy link
Member

@MattiSG MattiSG left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Est-ce Ok pour toi ?

Je persiste à penser que l'éclatement de depart1825_eligibilite en depart1825_eligibilite_statut et depart1825_eligibilite_financiere n'apporte que très peu de lisibilité supplémentaire par l'éclatement en deux formules (lisibilité que l'on pourrait tout aussi bien retrouver avec deux blocs de code introduits par un commentaire ou en nommant une variable interne à la fonction), voire même qu'au contraire le nombre de lignes ajoutées est plutôt contre-productif pour la compréhensibilité au vu de la quantité de métadonnées nécessaires pour OpenFisca ; et que dans tous les cas ces variables supplémentaires exposées publiquement n'ont pas de valeur de réutilisabilité et au contraire la diminuent en demandant une exploration et un choix supplémentaires pour les réutiliser.

Je joins à cette revue une proposition de refactor qui illustre pour moi la lisibilité d'une seule formule, avec 30% de code en moins, et une seule variable publiquement exposée.

Comment on lines 4 to 65
class depart1825_eligibilite_financiere(Variable):
value_type = bool
label = "Éligibilité au dispositif Départ 18-25 en raison des ressources du foyer"
entity = Individu
definition_period = MONTH
reference = [
"https://programme-depart-1825.com/eligibilite/",
"https://www.ancv.com/actualites/le-magazine/depart-1825-un-nouveau-programme-pour-les-jeunes-de-18-25-ans"
]

def formula(individu, period, parameters):
nbptr = individu.foyer_fiscal('nbptr', period.n_2)
plafond_ressources = parameters(period).prestations.depart1825.plafond_ressources
plafond_ressources = plafond_ressources.base + 2 * max_(0, nbptr - 1) * plafond_ressources.par_demi_part_supplementaire

ressources = individu.foyer_fiscal('rfr', period.n_2)
return ressources <= plafond_ressources


class depart1825_eligibilite_statut(Variable):
"""
Situations non prises en compte
- en contrat aidé,
- inscrit dans une école de la deuxième chance,
- volontaire en service civique,
- jeunes suivis par l'Aide Sociale à l'Enfance.​
"""
value_type = bool
label = "Éligibilité au dispositif Départ 18-25 en raison de la situation du jeune"
entity = Individu
definition_period = MONTH
reference = [
"https://programme-depart-1825.com/eligibilite/"
]

def formula(individu, period):
etudiant_boursier = (individu('activite', period) == TypesActivite.etudiant) * individu('boursier', period)
alternant = individu('alternant', period)
garantie_jeunes = individu('garantie_jeunes', period) > 0

return etudiant_boursier + alternant + garantie_jeunes


class depart1825_eligibilite(Variable):
value_type = bool
label = "Éligibilité au dispositif départ 18-25"
entity = Individu
definition_period = MONTH
reference = [
"https://programme-depart-1825.com/eligibilite/",
"https://www.ancv.com/actualites/le-magazine/depart-1825-un-nouveau-programme-pour-les-jeunes-de-18-25-ans"
]

def formula(individu, period, parameters):
criteres_age = parameters(period).prestations.depart1825.age
age = individu('age', period)

eligibilite_statut = individu('depart1825_eligibilite_statut', period)
eligibilite_financiere = individu('depart1825_eligibilite_financiere', period)
eligible = eligibilite_statut + eligibilite_financiere

return (criteres_age.minimum <= age) * (age <= criteres_age.maximum) * eligible
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
class depart1825_eligibilite_financiere(Variable):
value_type = bool
label = "Éligibilité au dispositif Départ 18-25 en raison des ressources du foyer"
entity = Individu
definition_period = MONTH
reference = [
"https://programme-depart-1825.com/eligibilite/",
"https://www.ancv.com/actualites/le-magazine/depart-1825-un-nouveau-programme-pour-les-jeunes-de-18-25-ans"
]
def formula(individu, period, parameters):
nbptr = individu.foyer_fiscal('nbptr', period.n_2)
plafond_ressources = parameters(period).prestations.depart1825.plafond_ressources
plafond_ressources = plafond_ressources.base + 2 * max_(0, nbptr - 1) * plafond_ressources.par_demi_part_supplementaire
ressources = individu.foyer_fiscal('rfr', period.n_2)
return ressources <= plafond_ressources
class depart1825_eligibilite_statut(Variable):
"""
Situations non prises en compte
- en contrat aidé,
- inscrit dans une école de la deuxième chance,
- volontaire en service civique,
- jeunes suivis par l'Aide Sociale à l'Enfance.​
"""
value_type = bool
label = "Éligibilité au dispositif Départ 18-25 en raison de la situation du jeune"
entity = Individu
definition_period = MONTH
reference = [
"https://programme-depart-1825.com/eligibilite/"
]
def formula(individu, period):
etudiant_boursier = (individu('activite', period) == TypesActivite.etudiant) * individu('boursier', period)
alternant = individu('alternant', period)
garantie_jeunes = individu('garantie_jeunes', period) > 0
return etudiant_boursier + alternant + garantie_jeunes
class depart1825_eligibilite(Variable):
value_type = bool
label = "Éligibilité au dispositif départ 18-25"
entity = Individu
definition_period = MONTH
reference = [
"https://programme-depart-1825.com/eligibilite/",
"https://www.ancv.com/actualites/le-magazine/depart-1825-un-nouveau-programme-pour-les-jeunes-de-18-25-ans"
]
def formula(individu, period, parameters):
criteres_age = parameters(period).prestations.depart1825.age
age = individu('age', period)
eligibilite_statut = individu('depart1825_eligibilite_statut', period)
eligibilite_financiere = individu('depart1825_eligibilite_financiere', period)
eligible = eligibilite_statut + eligibilite_financiere
return (criteres_age.minimum <= age) * (age <= criteres_age.maximum) * eligible
class depart1825_eligibilite(Variable):
"""
Situations non prises en compte
- en contrat aidé,
- inscrit dans une école de la deuxième chance,
- volontaire en service civique,
- jeunes suivis par l'Aide Sociale à l'Enfance.​
"""
value_type = bool
label = "Éligibilité au dispositif départ 18-25"
entity = Individu
definition_period = MONTH
reference = [
"https://programme-depart-1825.com/eligibilite/",
"https://www.ancv.com/actualites/le-magazine/depart-1825-un-nouveau-programme-pour-les-jeunes-de-18-25-ans"
]
def formula(individu, period, parameters):
criteres_age = parameters(period).prestations.depart1825.age
age = individu('age', period)
eligibilite_age = (criteres_age.minimum <= age) * (age <= criteres_age.maximum)
etudiant_boursier = (individu('activite', period) == TypesActivite.etudiant) * individu('boursier', period)
alternant = individu('alternant', period)
garantie_jeunes = individu('garantie_jeunes', period) > 0
eligibilite_statut = etudiant_boursier + alternant + garantie_jeunes
nombre_parts = individu.foyer_fiscal('nbptr', period.n_2)
plafond_ressources = parameters(period).prestations.depart1825.plafond_ressources
plafond_ressources = plafond_ressources.base + 2 * max_(0, nbptr - 1) * plafond_ressources.par_demi_part_supplementaire
ressources = individu.foyer_fiscal('rfr', period.n_2)
eligibilite_financiere = ressources <= plafond_ressources
return eligibilite_age * (eligibilite_statut + eligibilite_financiere)

@QuentinMadura QuentinMadura force-pushed the depart1825 branch 4 times, most recently from 10ac672 to b91f3b1 Compare July 8, 2021 07:52
@MattiSG
Copy link
Member

MattiSG commented Jul 8, 2021

Hello @QuentinMadura !

Je vois qu'il y a de nombreux pushes et force-pushes sur cette PR ouverte il y a trois mois et déjà revue à deux reprises. Or :

  1. Chaque modification publique de ce type génère une notification par mail, ce qui fait pas mal de bruit.
  2. Il devient impossible de savoir quand une PR est réellement prête pour être revue ou non. Cette insécurité réduit la probabilité d'une revue, et en augmente le délai.

En l'occurrence, cette PR disposait déjà d'une revue acceptée. Je ne sais plus si cette acceptation est encore valide à ce stade au vu du nombre de commits ultérieurs, ce qui me pose d'autant plus problème que c'est moi qui avais accepté : je ne sais pas si je peux encore prendre à ce stade la responsabilité d'une validation donnée il y a plusieurs semaines !

Mes demandes sont donc de :

  1. Minimiser le nombre de pushes une fois la PR ouverte (quitte à la rebasculer en draft ou la fermer si des modifications importantes sont prévues, en expliquant sur quel sujet).
  2. N'utiliser le force-push qu'après une revue, pour un rebase, et sans modifier d'aucune façon le code final.
  3. Indiquer dans le fil de conversation si des modifications importantes sont prévues, et sur quel thème, ultérieurement à l'ouverture de la PR.

Est-ce que cela te semble assez clair ? Est-ce acceptable ? 🙂

Bonne journée,
Matti

@QuentinMadura
Copy link
Contributor

Hello @QuentinMadura !

Je vois qu'il y a de nombreux pushes et force-pushes sur cette PR ouverte il y a trois mois et déjà revue à deux reprises. Or :

  1. Chaque modification publique de ce type génère une notification par mail, ce qui fait pas mal de bruit.
  2. Il devient impossible de savoir quand une PR est réellement prête pour être revue ou non. Cette insécurité réduit la probabilité d'une revue, et en augmente le délai.

En l'occurrence, cette PR disposait déjà d'une revue acceptée. Je ne sais plus si cette acceptation est encore valide à ce stade au vu du nombre de commits ultérieurs, ce qui me pose d'autant plus problème que c'est moi qui avais accepté : je ne sais pas si je peux encore prendre à ce stade la responsabilité d'une validation donnée il y a plusieurs semaines !

Mes demandes sont donc de :

  1. Minimiser le nombre de pushes une fois la PR ouverte (quitte à la rebasculer en draft ou la fermer si des modifications importantes sont prévues, en expliquant sur quel sujet).
  2. N'utiliser le force-push qu'après une revue, pour un rebase, et sans modifier d'aucune façon le code final.
  3. Indiquer dans le fil de conversation si des modifications importantes sont prévues, et sur quel thème, ultérieurement à l'ouverture de la PR.

Est-ce que cela te semble assez clair ? Est-ce acceptable ? 🙂

Bonne journée,
Matti

Bonjour @MattiSG,

merci de ton retour et pour tes commentaires, et cela me semble clair et acceptable :) !

Effectivement je me rends compte que d'amender un commit n'est pas une bonne pratique et rajoute du bruit pour les autres contributeurs (notification mail, etc.) en plus de l'insécurité, augmentation du délai..

Je tâcherai de faire attention à ces remarques lors de mes prochaines contributions.

Merci d'avoir pris le temps et bonne journée,
Quentin

@guillett
Copy link
Member Author

Je considère mergeable. Je vais faire un rebase et les modifications du Changelog et de setup avec pour objectif de merge dans l'après midi.

@guillett guillett merged commit 74ad1b8 into master Jul 29, 2021
@guillett guillett deleted the depart1825 branch July 29, 2021 13:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants