openfisca / openfisca-tunisia

Tunisian tax and benefit system for OpenFisca
http://www.openfisca.tn
15 stars 7 forks source link

Corriger et tester la réforme de_net_a_brut #53

Closed sandcha closed 6 years ago

sandcha commented 6 years ago

Définir la période de la simulation pour la réforme. Tester la réforme.

sandcha commented 6 years ago

Ceci vient résoudre laValueError obtenue pour l'appel via API :

curl -X POST http://localhost:8000/calculate -H 'Content-Type: application/json' -d @situation.json

Avec le situation.json suivant :

{
  "individus": { 
    "openjibayiste": {
      "salaire_net_a_payer": {
        "2017-12": 1225
      },
      "salaire_imposable" : {
        "2017-12": null
      }
    }
  },
  "foyers_fiscaux": {
    "foyer_fiscal_1": {
      "declarants": [
        "openjibayiste"
      ]
    }
  },
  "menages": {
    "menage_1": {
      "personne_de_reference": [
          "openjibayiste"
      ]
    }
  }
}

Qui produisait cette erreur côté serveur :

ERROR:openfisca_core.formulas:An error occurred while calling formula salaire_imposable@individu<2017-12> in module openfisca_tunisia.reforms.de_net_a_brut
[2018-01-07 17:01:49,195] ERROR in app: Exception on /calculate [POST]
Traceback (most recent call last):
  File "/Users/sch/.local/share/virtualenvs/tnc20/lib/python2.7/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/sch/.local/share/virtualenvs/tnc20/lib/python2.7/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/sch/.local/share/virtualenvs/tnc20/lib/python2.7/site-packages/flask_cors/extension.py", line 161, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/Users/sch/.local/share/virtualenvs/tnc20/lib/python2.7/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/sch/.local/share/virtualenvs/tnc20/lib/python2.7/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/sch/.local/share/virtualenvs/tnc20/lib/python2.7/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/sch/Dev/github/tunisie/openfisca-core/openfisca_web_api_preview/app.py", line 108, in calculate
    result = simulation.calculate(variable_name, period).tolist()
  File "/Users/sch/Dev/github/tunisie/openfisca-core/openfisca_core/simulations.py", line 116, in calculate
    return self.compute(variable_name, period = period, **parameters).array
  File "/Users/sch/Dev/github/tunisie/openfisca-core/openfisca_core/simulations.py", line 167, in compute
    result = holder.compute(period = period, **parameters)
  File "/Users/sch/Dev/github/tunisie/openfisca-core/openfisca_core/holders.py", line 165, in compute
    dated_holder = self.formula.compute(period = period, **parameters)
  File "/Users/sch/Dev/github/tunisie/openfisca-core/openfisca_core/formulas.py", line 470, in compute
    array = self.base_function(simulation, period)
  File "/Users/sch/Dev/github/tunisie/openfisca-core/openfisca_core/base_functions.py", line 57, in requested_period_default_value
    return formula.exec_function(simulation, period, *extra_params)
  File "/Users/sch/Dev/github/tunisie/openfisca-core/openfisca_core/formulas.py", line 558, in exec_function
    return function(entity, period)
  File "/Users/sch/Dev/github/tunisie/openfisca-tunisia/openfisca_tunisia/reforms/de_net_a_brut.py", line 76, in formula
    xtol = 1 / 100  # précision
  File "/Users/sch/.local/share/virtualenvs/tnc20/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 146, in fsolve
    res = _root_hybr(func, x0, args, jac=fprime, **options)
  File "/Users/sch/.local/share/virtualenvs/tnc20/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 212, in _root_hybr
    shape, dtype = _check_func('fsolve', 'func', func, x0, args, n, (n,))
  File "/Users/sch/.local/share/virtualenvs/tnc20/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 26, in _check_func
    res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
  File "/Users/sch/Dev/github/tunisie/openfisca-tunisia/openfisca_tunisia/reforms/de_net_a_brut.py", line 69, in innerfunc
    return calculate_net_from(essai, individu, period, requested_variable_names) - net
  File "/Users/sch/Dev/github/tunisie/openfisca-tunisia/openfisca_tunisia/reforms/de_net_a_brut.py", line 22, in calculate_net_from
    holder.array = salaire_imposable
  File "/Users/sch/Dev/github/tunisie/openfisca-core/openfisca_core/holders.py", line 95, in array
    return self.put_in_cache(array, self.simulation.period)
  File "/Users/sch/Dev/github/tunisie/openfisca-core/openfisca_core/holders.py", line 293, in put_in_cache
    raise ValueError('A period must be specified to put values in cache, except for variables with ETERNITY as as period_definition.')
ValueError: A period must be specified to put values in cache, except for variables with ETERNITY as as period_definition.
sandcha commented 6 years ago

Avec le correctif sur la réforme, la réponse obtenue est la suivante :

{
  "foyers_fiscaux": {
    "foyer_fiscal_1": {
      "declarants": [
        "openjibayiste"
      ]
    }
  }, 
  "individus": {
    "openjibayiste": {
      "salaire_imposable": {
        "2017-12": 1475.8065185546875
      }, 
      "salaire_net_a_payer": {
        "2017-12": 1225
      }
    }
  }, 
  "menages": {
    "menage_1": {
      "personne_de_reference": [
        "openjibayiste"
      ]
    }
  }
}

Sachant que 1225 * 12 = 14700, le test yaml ajouté par cette PR est censé être identique à l'appel json. Pourtant, le test yaml ne fonctionne pas ; il donne :

AssertionError: salaire_imposable@2017-12: [ 0.] differs from [ 1475.83337402] with an absolute margin [ 1475.83337402] > 0.5

@benjello Verrais-tu pourquoi ?

sandcha commented 6 years ago

@benjello le test_yaml.py ne semblait plus fonctionnel et je n'en vois pas l'utilité du moment qu'on peut préciser la réforme dans le fichier yaml même. tests/base.py ne me semblait pas utilisé ailleurs. Mais, surtout, dis moi si tu as un usage quelconque de l'un de ces fichiers.

Par ailleurs, country_template ne les contient pas.

laem commented 6 years ago

Avez-vous pu repérer une incompatibilité qui pourrait expliquer pourquoi la réforme ne marche plus sur -france :thinking: ?

benjello commented 6 years ago

@laem pas que je me souvienne mais @sandcha a peut-être une idée.

sandcha commented 6 years ago

@laem Peux-tu m'en dire plus sur ce qui ne marche pas côté -france ? J'ai fait un premier test et je ne vois pas d'erreur 🤔

laem commented 6 years ago

la simulation du net au brut sur /cout-embauche n'a pas supporté la mise à jour. J'obtenais un message d'erreur pas parlant du tout. On a donc désactivé la fonctionnalité qu'on a jugé moins importante que des taux à jour en 2018. Si tu me dis que ça marche, c'est sûrement sur l'interface /formula entre l'appel HTTP du simulateur et OpenFisca que ça plante...