PK'G}openfisca_france/__init__.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import os COUNTRY_DIR = os.path.dirname(os.path.abspath(__file__)) CURRENCY = u"€" REVENUES_CATEGORIES = { 'brut': ['salaire_brut', 'chobrut', 'rstbrut', 'pensions_alimentaires_percues', 'pensions_alimentaires_versees', 'rev_cap_brut', 'fon'], 'imposable': ['salaire_imposable', 'cho', 'rst', 'pensions_alimentaires_percues', 'pensions_alimentaires_versees', 'rev_cap_brut', 'fon', 'cotsoc_cap'], 'net': ['salaire_net', 'chonet', 'rstnet', 'pensions_alimentaires_percues', 'pensions_alimentaires_versees', 'rev_cap_net', 'fon'], 'superbrut': ['salsuperbrut', 'chobrut', 'rstbrut', 'pensions_alimentaires_percues', 'pensions_alimentaires_versees', 'rev_cap_brut', 'fon'], } def init_country(qt = False): # drop_survey_only_variables = False, simulate_f6de = False, start_from = 'imposable' """Create a country-specific TaxBenefitSystem.""" # from openfisca_core.columns import FloatCol from openfisca_core.taxbenefitsystems import LegacyTaxBenefitSystem if qt: from openfisca_qt import widgets as qt_widgets from . import decompositions, entities, scenarios from .model import datatrees from .model import model # Load output variables into entities. # noqa analysis:ignore from .model.prelevements_obligatoires.prelevements_sociaux.cotisations_sociales import preprocessing if qt: from .widgets.Composition import CompositionWidget # if simulate_f6de: # del column_by_name['f6de'] # csg_deduc_patrimoine_simulated = prestation_by_name.pop('csg_deduc_patrimoine_simulated') # prestation_by_name['csg_deduc_patrimoine'] = FloatCol( # csg_deduc_patrimoine_simulated._func, # entity = csg_deduc_patrimoine_simulated.entity, # label = csg_deduc_patrimoine_simulated.label, # start = csg_deduc_patrimoine_simulated.start, # end = csg_deduc_patrimoine_simulated.end, # val_type = csg_deduc_patrimoine_simulated.val_type, # freq = csg_deduc_patrimoine_simulated.freq, # survey_only = False, # ) # else: # prestation_by_name.pop('csg_deduc_patrimoine_simulated', None) if qt: qt_widgets.CompositionWidget = CompositionWidget class TaxBenefitSystem(LegacyTaxBenefitSystem): """French tax benefit system""" check_consistency = None # staticmethod(utils.check_consistency) CURRENCY = CURRENCY DATA_SOURCES_DIR = os.path.join(COUNTRY_DIR, 'data', 'sources') DECOMP_DIR = os.path.dirname(os.path.abspath(decompositions.__file__)) DEFAULT_DECOMP_FILE = decompositions.DEFAULT_DECOMP_FILE entity_class_by_key_plural = dict( (entity_class.key_plural, entity_class) for entity_class in entities.entity_class_by_symbol.itervalues() ) # Declared below to avoid "name is not defined" exception # column_by_name = None # prestation_by_name = None columns_name_tree_by_entity = datatrees.columns_name_tree_by_entity legislation_xml_file_path = os.path.join(COUNTRY_DIR, 'param', 'param.xml') preprocess_legislation = staticmethod(preprocessing.preprocess_legislation) REFORMS_DIR = os.path.join(COUNTRY_DIR, 'reformes') REV_TYP = None # utils.REV_TYP # Not defined for France REVENUES_CATEGORIES = REVENUES_CATEGORIES Scenario = scenarios.Scenario def prefill_cache(self): # Compute one "zone APL" variable, to pre-load CSV of "code INSEE commune" to "Zone APL". from .model.prestations import aides_logement aides_logement.preload_zone_apl() from .model.prelevements_obligatoires.prelevements_sociaux import taxes_salaires_main_oeuvre taxes_salaires_main_oeuvre.preload_taux_versement_transport() return TaxBenefitSystem PK'G4́iiopenfisca_france/scenarios.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import collections import datetime import itertools import logging import re import uuid from openfisca_core import conv, scenarios def N_(message): return message log = logging.getLogger(__name__) year_or_month_or_day_re = re.compile(ur'(18|19|20)\d{2}(-(0[1-9]|1[0-2])(-([0-2]\d|3[0-1]))?)?$') class Scenario(scenarios.AbstractScenario): def init_single_entity(self, axes = None, enfants = None, famille = None, foyer_fiscal = None, menage = None, parent1 = None, parent2 = None, period = None): if enfants is None: enfants = [] assert parent1 is not None famille = famille.copy() if famille is not None else {} foyer_fiscal = foyer_fiscal.copy() if foyer_fiscal is not None else {} individus = [] menage = menage.copy() if menage is not None else {} for index, individu in enumerate([parent1, parent2] + (enfants or [])): if individu is None: continue id = individu.get('id') if id is None: individu = individu.copy() individu['id'] = id = 'ind{}'.format(index) individus.append(individu) if index <= 1: famille.setdefault('parents', []).append(id) foyer_fiscal.setdefault('declarants', []).append(id) if index == 0: menage['personne_de_reference'] = id else: menage['conjoint'] = id else: famille.setdefault('enfants', []).append(id) foyer_fiscal.setdefault('personnes_a_charge', []).append(id) menage.setdefault('enfants', []).append(id) conv.check(self.make_json_or_python_to_attributes())(dict( axes = axes, period = period, test_case = dict( familles = [famille], foyers_fiscaux = [foyer_fiscal], individus = individus, menages = [menage], ), )) return self def make_json_or_python_to_test_case(self, period = None, repair = False): assert period is not None def json_or_python_to_test_case(value, state = None): if value is None: return value, None if state is None: state = conv.default_state column_by_name = self.tax_benefit_system.column_by_name # First validation and conversion step test_case, error = conv.pipe( conv.test_isinstance(dict), conv.struct( dict( familles = conv.pipe( conv.make_item_to_singleton(), conv.test_isinstance(list), conv.uniform_sequence( conv.test_isinstance(dict), drop_none_items = True, ), conv.function(scenarios.set_entities_json_id), conv.uniform_sequence( conv.struct( dict(itertools.chain( dict( enfants = conv.pipe( conv.make_item_to_singleton(), conv.test_isinstance(list), conv.uniform_sequence( conv.test_isinstance((basestring, int)), drop_none_items = True, ), conv.default([]), ), id = conv.pipe( conv.test_isinstance((basestring, int)), conv.not_none, ), parents = conv.pipe( conv.make_item_to_singleton(), conv.test_isinstance(list), conv.uniform_sequence( conv.test_isinstance((basestring, int)), drop_none_items = True, ), conv.default([]), ), ).iteritems(), ( (column.name, column.json_to_python) for column in column_by_name.itervalues() if column.entity == 'fam' ), )), drop_none_values = True, ), drop_none_items = True, ), conv.default([]), ), foyers_fiscaux = conv.pipe( conv.make_item_to_singleton(), conv.test_isinstance(list), conv.uniform_sequence( conv.test_isinstance(dict), drop_none_items = True, ), conv.function(scenarios.set_entities_json_id), conv.uniform_sequence( conv.struct( dict(itertools.chain( dict( declarants = conv.pipe( conv.make_item_to_singleton(), conv.test_isinstance(list), conv.uniform_sequence( conv.test_isinstance((basestring, int)), drop_none_items = True, ), conv.default([]), ), id = conv.pipe( conv.test_isinstance((basestring, int)), conv.not_none, ), personnes_a_charge = conv.pipe( conv.make_item_to_singleton(), conv.test_isinstance(list), conv.uniform_sequence( conv.test_isinstance((basestring, int)), drop_none_items = True, ), conv.default([]), ), ).iteritems(), ( (column.name, column.json_to_python) for column in column_by_name.itervalues() if column.entity == 'foy' ), )), drop_none_values = True, ), drop_none_items = True, ), conv.default([]), ), individus = conv.pipe( conv.make_item_to_singleton(), conv.test_isinstance(list), conv.uniform_sequence( conv.test_isinstance(dict), drop_none_items = True, ), conv.function(scenarios.set_entities_json_id), conv.uniform_sequence( conv.struct( dict(itertools.chain( dict( id = conv.pipe( conv.test_isinstance((basestring, int)), conv.not_none, ), ).iteritems(), ( (column.name, column.json_to_python) for column in column_by_name.itervalues() if column.entity == 'ind' and column.name not in ( 'idfam', 'idfoy', 'idmen', 'quifam', 'quifoy', 'quimen') ), )), drop_none_values = True, ), drop_none_items = True, ), conv.empty_to_none, conv.not_none, ), menages = conv.pipe( conv.make_item_to_singleton(), conv.test_isinstance(list), conv.uniform_sequence( conv.test_isinstance(dict), drop_none_items = True, ), conv.function(scenarios.set_entities_json_id), conv.uniform_sequence( conv.struct( dict(itertools.chain( dict( autres = conv.pipe( # personnes ayant un lien autre avec la personne de référence conv.make_item_to_singleton(), conv.test_isinstance(list), conv.uniform_sequence( conv.test_isinstance((basestring, int)), drop_none_items = True, ), conv.default([]), ), # conjoint de la personne de référence conjoint = conv.test_isinstance((basestring, int)), enfants = conv.pipe( # enfants de la personne de référence ou de son conjoint conv.make_item_to_singleton(), conv.test_isinstance(list), conv.uniform_sequence( conv.test_isinstance((basestring, int)), drop_none_items = True, ), conv.default([]), ), id = conv.pipe( conv.test_isinstance((basestring, int)), conv.not_none, ), personne_de_reference = conv.test_isinstance((basestring, int)), ).iteritems(), ( (column.name, column.json_to_python) for column in column_by_name.itervalues() if column.entity == 'men' ), )), drop_none_values = True, ), drop_none_items = True, ), conv.default([]), ), ), ), )(value, state = state) if error is not None: return test_case, error # Second validation step familles_individus_id = [individu['id'] for individu in test_case['individus']] foyers_fiscaux_individus_id = [individu['id'] for individu in test_case['individus']] menages_individus_id = [individu['id'] for individu in test_case['individus']] test_case, error = conv.struct( dict( familles = conv.uniform_sequence( conv.struct( dict( enfants = conv.uniform_sequence(conv.test_in_pop(familles_individus_id)), parents = conv.uniform_sequence(conv.test_in_pop(familles_individus_id)), ), default = conv.noop, ), ), foyers_fiscaux = conv.uniform_sequence( conv.struct( dict( declarants = conv.uniform_sequence(conv.test_in_pop(foyers_fiscaux_individus_id)), personnes_a_charge = conv.uniform_sequence(conv.test_in_pop( foyers_fiscaux_individus_id)), ), default = conv.noop, ), ), menages = conv.uniform_sequence( conv.struct( dict( autres = conv.uniform_sequence(conv.test_in_pop(menages_individus_id)), conjoint = conv.test_in_pop(menages_individus_id), enfants = conv.uniform_sequence(conv.test_in_pop(menages_individus_id)), personne_de_reference = conv.test_in_pop(menages_individus_id), ), default = conv.noop, ), ), ), default = conv.noop, )(test_case, state = state) individu_by_id = { individu['id']: individu for individu in test_case['individus'] } if repair: # Affecte à une famille chaque individu qui n'appartient à aucune d'entre elles. new_famille = dict( enfants = [], parents = [], ) new_famille_id = None for individu_id in familles_individus_id[:]: # Tente d'affecter l'individu à une famille d'après son foyer fiscal. foyer_fiscal, foyer_fiscal_role = find_foyer_fiscal_and_role(test_case, individu_id) if foyer_fiscal_role == u'declarants' and len(foyer_fiscal[u'declarants']) == 2: for declarant_id in foyer_fiscal[u'declarants']: if declarant_id != individu_id: famille, other_role = find_famille_and_role(test_case, declarant_id) if other_role == u'parents' and len(famille[u'parents']) == 1: # Quand l'individu n'est pas encore dans une famille, mais qu'il est déclarant # dans un foyer fiscal, qu'il y a un autre déclarant dans ce même foyer fiscal # et que cet autre déclarant est seul parent dans sa famille, alors ajoute # l'individu comme autre parent de cette famille. famille[u'parents'].append(individu_id) familles_individus_id.remove(individu_id) break elif foyer_fiscal_role == u'personnes_a_charge' and foyer_fiscal[u'declarants']: for declarant_id in foyer_fiscal[u'declarants']: famille, other_role = find_famille_and_role(test_case, declarant_id) if other_role == u'parents': # Quand l'individu n'est pas encore dans une famille, mais qu'il est personne à charge # dans un foyer fiscal, qu'il y a un déclarant dans ce foyer fiscal et que ce déclarant # est parent dans sa famille, alors ajoute l'individu comme enfant de cette famille. famille[u'enfants'].append(individu_id) familles_individus_id.remove(individu_id) break if individu_id in familles_individus_id: # L'individu n'est toujours pas affecté à une famille. # Tente d'affecter l'individu à une famille d'après son ménage. menage, menage_role = find_menage_and_role(test_case, individu_id) if menage_role == u'personne_de_reference': conjoint_id = menage[u'conjoint'] if conjoint_id is not None: famille, other_role = find_famille_and_role(test_case, conjoint_id) if other_role == u'parents' and len(famille[u'parents']) == 1: # Quand l'individu n'est pas encore dans une famille, mais qu'il est personne de # référence dans un ménage, qu'il y a un conjoint dans ce ménage et que ce # conjoint est seul parent dans sa famille, alors ajoute l'individu comme autre # parent de cette famille. famille[u'parents'].append(individu_id) familles_individus_id.remove(individu_id) elif menage_role == u'conjoint': personne_de_reference_id = menage[u'personne_de_reference'] if personne_de_reference_id is not None: famille, other_role = find_famille_and_role(test_case, personne_de_reference_id) if other_role == u'parents' and len(famille[u'parents']) == 1: # Quand l'individu n'est pas encore dans une famille, mais qu'il est conjoint # dans un ménage, qu'il y a une personne de référence dans ce ménage et que # cette personne est seul parent dans une famille, alors ajoute l'individu comme # autre parent de cette famille. famille[u'parents'].append(individu_id) familles_individus_id.remove(individu_id) elif menage_role == u'enfants' and (menage['personne_de_reference'] is not None or menage[u'conjoint'] is not None): for other_id in (menage['personne_de_reference'], menage[u'conjoint']): if other_id is None: continue famille, other_role = find_famille_and_role(test_case, other_id) if other_role == u'parents': # Quand l'individu n'est pas encore dans une famille, mais qu'il est enfant dans un # ménage, qu'il y a une personne à charge ou un conjoint dans ce ménage et que # celui-ci est parent dans une famille, alors ajoute l'individu comme enfant de # cette famille. famille[u'enfants'].append(individu_id) familles_individus_id.remove(individu_id) break if individu_id in familles_individus_id: # L'individu n'est toujours pas affecté à une famille. individu = individu_by_id[individu_id] age = find_age(individu, period.start.date) if len(new_famille[u'parents']) < 2 and (age is None or age >= 18): new_famille[u'parents'].append(individu_id) else: new_famille[u'enfants'].append(individu_id) if new_famille_id is None: new_famille[u'id'] = new_famille_id = unicode(uuid.uuid4()) test_case[u'familles'].append(new_famille) familles_individus_id.remove(individu_id) # Affecte à un foyer fiscal chaque individu qui n'appartient à aucun d'entre eux. new_foyer_fiscal = dict( declarants = [], personnes_a_charge = [], ) new_foyer_fiscal_id = None for individu_id in foyers_fiscaux_individus_id[:]: # Tente d'affecter l'individu à un foyer fiscal d'après sa famille. famille, famille_role = find_famille_and_role(test_case, individu_id) if famille_role == u'parents' and len(famille[u'parents']) == 2: for parent_id in famille[u'parents']: if parent_id != individu_id: foyer_fiscal, other_role = find_foyer_fiscal_and_role(test_case, parent_id) if other_role == u'declarants' and len(foyer_fiscal[u'declarants']) == 1: # Quand l'individu n'est pas encore dans un foyer fiscal, mais qu'il est parent # dans une famille, qu'il y a un autre parent dans cette famille et que cet autre # parent est seul déclarant dans son foyer fiscal, alors ajoute l'individu comme # autre déclarant de ce foyer fiscal. foyer_fiscal[u'declarants'].append(individu_id) foyers_fiscaux_individus_id.remove(individu_id) break elif famille_role == u'enfants' and famille[u'parents']: for parent_id in famille[u'parents']: foyer_fiscal, other_role = find_foyer_fiscal_and_role(test_case, parent_id) if other_role == u'declarants': # Quand l'individu n'est pas encore dans un foyer fiscal, mais qu'il est enfant dans une # famille, qu'il y a un parent dans cette famille et que ce parent est déclarant dans # son foyer fiscal, alors ajoute l'individu comme personne à charge de ce foyer fiscal. foyer_fiscal[u'personnes_a_charge'].append(individu_id) foyers_fiscaux_individus_id.remove(individu_id) break if individu_id in foyers_fiscaux_individus_id: # L'individu n'est toujours pas affecté à un foyer fiscal. # Tente d'affecter l'individu à un foyer fiscal d'après son ménage. menage, menage_role = find_menage_and_role(test_case, individu_id) if menage_role == u'personne_de_reference': conjoint_id = menage[u'conjoint'] if conjoint_id is not None: foyer_fiscal, other_role = find_foyer_fiscal_and_role(test_case, conjoint_id) if other_role == u'declarants' and len(foyer_fiscal[u'declarants']) == 1: # Quand l'individu n'est pas encore dans un foyer fiscal, mais qu'il est personne de # référence dans un ménage, qu'il y a un conjoint dans ce ménage et que ce # conjoint est seul déclarant dans un foyer fiscal, alors ajoute l'individu comme # autre déclarant de ce foyer fiscal. foyer_fiscal[u'declarants'].append(individu_id) foyers_fiscaux_individus_id.remove(individu_id) elif menage_role == u'conjoint': personne_de_reference_id = menage[u'personne_de_reference'] if personne_de_reference_id is not None: foyer_fiscal, other_role = find_foyer_fiscal_and_role(test_case, personne_de_reference_id) if other_role == u'declarants' and len(foyer_fiscal[u'declarants']) == 1: # Quand l'individu n'est pas encore dans un foyer fiscal, mais qu'il est conjoint # dans un ménage, qu'il y a une personne de référence dans ce ménage et que # cette personne est seul déclarant dans un foyer fiscal, alors ajoute l'individu # comme autre déclarant de ce foyer fiscal. foyer_fiscal[u'declarants'].append(individu_id) foyers_fiscaux_individus_id.remove(individu_id) elif menage_role == u'enfants' and (menage['personne_de_reference'] is not None or menage[u'conjoint'] is not None): for other_id in (menage['personne_de_reference'], menage[u'conjoint']): if other_id is None: continue foyer_fiscal, other_role = find_foyer_fiscal_and_role(test_case, other_id) if other_role == u'declarants': # Quand l'individu n'est pas encore dans un foyer fiscal, mais qu'il est enfant dans # un ménage, qu'il y a une personne à charge ou un conjoint dans ce ménage et que # celui-ci est déclarant dans un foyer fiscal, alors ajoute l'individu comme # personne à charge de ce foyer fiscal. foyer_fiscal[u'declarants'].append(individu_id) foyers_fiscaux_individus_id.remove(individu_id) break if individu_id in foyers_fiscaux_individus_id: # L'individu n'est toujours pas affecté à un foyer fiscal. individu = individu_by_id[individu_id] age = find_age(individu, period.start.date) if len(new_foyer_fiscal[u'declarants']) < 2 and (age is None or age >= 18): new_foyer_fiscal[u'declarants'].append(individu_id) else: new_foyer_fiscal[u'personnes_a_charge'].append(individu_id) if new_foyer_fiscal_id is None: new_foyer_fiscal[u'id'] = new_foyer_fiscal_id = unicode(uuid.uuid4()) test_case[u'foyers_fiscaux'].append(new_foyer_fiscal) foyers_fiscaux_individus_id.remove(individu_id) # Affecte à un ménage chaque individu qui n'appartient à aucun d'entre eux. new_menage = dict( autres = [], conjoint = None, enfants = [], personne_de_reference = None, ) new_menage_id = None for individu_id in menages_individus_id[:]: # Tente d'affecter l'individu à un ménage d'après sa famille. famille, famille_role = find_famille_and_role(test_case, individu_id) if famille_role == u'parents' and len(famille[u'parents']) == 2: for parent_id in famille[u'parents']: if parent_id != individu_id: menage, other_role = find_menage_and_role(test_case, parent_id) if other_role == u'personne_de_reference' and menage[u'conjoint'] is None: # Quand l'individu n'est pas encore dans un ménage, mais qu'il est parent # dans une famille, qu'il y a un autre parent dans cette famille et que cet autre # parent est personne de référence dans un ménage et qu'il n'y a pas de conjoint # dans ce ménage, alors ajoute l'individu comme conjoint de ce ménage. menage[u'conjoint'] = individu_id menages_individus_id.remove(individu_id) elif other_role == u'conjoint' and menage[u'personne_de_reference'] is None: # Quand l'individu n'est pas encore dans un ménage, mais qu'il est parent # dans une famille, qu'il y a un autre parent dans cette famille et que cet autre # parent est conjoint dans un ménage et qu'il n'y a pas de personne de référence # dans ce ménage, alors ajoute l'individu comme personne de référence de ce ménage. menage[u'personne_de_reference'] = individu_id menages_individus_id.remove(individu_id) break elif famille_role == u'enfants' and famille[u'parents']: for parent_id in famille[u'parents']: menage, other_role = find_menage_and_role(test_case, parent_id) if other_role in (u'personne_de_reference', u'conjoint'): # Quand l'individu n'est pas encore dans un ménage, mais qu'il est enfant dans une # famille, qu'il y a un parent dans cette famille et que ce parent est personne de # référence ou conjoint dans un ménage, alors ajoute l'individu comme enfant de ce # ménage. menage[u'enfants'].append(individu_id) menages_individus_id.remove(individu_id) break if individu_id in menages_individus_id: # L'individu n'est toujours pas affecté à un ménage. # Tente d'affecter l'individu à un ménage d'après son foyer fiscal. foyer_fiscal, foyer_fiscal_role = find_foyer_fiscal_and_role(test_case, individu_id) if foyer_fiscal_role == u'declarants' and len(foyer_fiscal[u'declarants']) == 2: for declarant_id in foyer_fiscal[u'declarants']: if declarant_id != individu_id: menage, other_role = find_menage_and_role(test_case, declarant_id) if other_role == u'personne_de_reference' and menage[u'conjoint'] is None: # Quand l'individu n'est pas encore dans un ménage, mais qu'il est déclarant # dans un foyer fiscal, qu'il y a un autre déclarant dans ce foyer fiscal et que # cet autre déclarant est personne de référence dans un ménage et qu'il n'y a # pas de conjoint dans ce ménage, alors ajoute l'individu comme conjoint de ce # ménage. menage[u'conjoint'] = individu_id menages_individus_id.remove(individu_id) elif other_role == u'conjoint' and menage[u'personne_de_reference'] is None: # Quand l'individu n'est pas encore dans un ménage, mais qu'il est déclarant # dans une foyer fiscal, qu'il y a un autre déclarant dans ce foyer fiscal et # que cet autre déclarant est conjoint dans un ménage et qu'il n'y a pas de # personne de référence dans ce ménage, alors ajoute l'individu comme personne # de référence de ce ménage. menage[u'personne_de_reference'] = individu_id menages_individus_id.remove(individu_id) break elif foyer_fiscal_role == u'personnes_a_charge' and foyer_fiscal[u'declarants']: for declarant_id in foyer_fiscal[u'declarants']: menage, other_role = find_menage_and_role(test_case, declarant_id) if other_role in (u'personne_de_reference', u'conjoint'): # Quand l'individu n'est pas encore dans un ménage, mais qu'il est personne à charge # dans un foyer fiscal, qu'il y a un déclarant dans ce foyer fiscal et que ce # déclarant est personne de référence ou conjoint dans un ménage, alors ajoute # l'individu comme enfant de ce ménage. menage[u'enfants'].append(individu_id) menages_individus_id.remove(individu_id) break if individu_id in menages_individus_id: # L'individu n'est toujours pas affecté à un ménage. if new_menage[u'personne_de_reference'] is None: new_menage[u'personne_de_reference'] = individu_id elif new_menage[u'conjoint'] is None: new_menage[u'conjoint'] = individu_id else: new_menage[u'enfants'].append(individu_id) if new_menage_id is None: new_menage[u'id'] = new_menage_id = unicode(uuid.uuid4()) test_case[u'menages'].append(new_menage) menages_individus_id.remove(individu_id) remaining_individus_id = set(familles_individus_id).union(foyers_fiscaux_individus_id, menages_individus_id) if remaining_individus_id: individu_index_by_id = { individu[u'id']: individu_index for individu_index, individu in enumerate(test_case[u'individus']) } if error is None: error = {} for individu_id in remaining_individus_id: error.setdefault('individus', {})[individu_index_by_id[individu_id]] = state._( u"Individual is missing from {}").format( state._(u' & ').join( word for word in [ u'familles' if individu_id in familles_individus_id else None, u'foyers_fiscaux' if individu_id in foyers_fiscaux_individus_id else None, u'menages' if individu_id in menages_individus_id else None, ] if word is not None )) if error is not None: return test_case, error # Third validation step parents_id = set( parent_id for famille in test_case['familles'] for parent_id in famille['parents'] ) test_case, error = conv.struct( dict( familles = conv.pipe( conv.uniform_sequence( conv.struct( dict( enfants = conv.uniform_sequence( conv.test( lambda individu_id: individu_by_id[individu_id].get('invalide', False) or find_age(individu_by_id[individu_id], period.start.date, default = 0) <= 25, error = u"Une personne à charge d'un foyer fiscal doit avoir moins de" u" 25 ans ou être invalide", ), ), parents = conv.pipe( conv.empty_to_none, conv.not_none, conv.test(lambda parents: len(parents) <= 2, error = N_(u'A "famille" must have at most 2 "parents"')) ), ), default = conv.noop, ), ), conv.empty_to_none, conv.not_none, ), foyers_fiscaux = conv.pipe( conv.uniform_sequence( conv.struct( dict( declarants = conv.pipe( conv.empty_to_none, conv.not_none, conv.test( lambda declarants: len(declarants) <= 2, error = N_(u'A "foyer_fiscal" must have at most 2 "declarants"'), ), conv.uniform_sequence(conv.pipe( # conv.test(lambda individu_id: # find_age(individu_by_id[individu_id], period.start.date, # default = 100) >= 18, # error = u"Un déclarant d'un foyer fiscal doit être agé d'au moins 18" # u" ans", # ), conv.test( lambda individu_id: individu_id in parents_id, error = u"Un déclarant ou un conjoint sur la déclaration d'impôt, doit" u" être un parent dans sa famille", ), )), ), personnes_a_charge = conv.uniform_sequence( conv.test( lambda individu_id: individu_by_id[individu_id].get('invalide', False) or find_age(individu_by_id[individu_id], period.start.date, default = 0) <= 25, error = u"Une personne à charge d'un foyer fiscal doit avoir moins de" u" 25 ans ou être invalide", ), ), ), default = conv.noop, ), ), conv.empty_to_none, conv.not_none, ), # individus = conv.uniform_sequence( # conv.struct( # dict( # birth = conv.test( # lambda birth: period.start.date - birth >= datetime.timedelta(0), # error = u"L'individu doit être né au plus tard le jour de la simulation", # ), # ), # default = conv.noop, # drop_none_values = 'missing', # ), # ), menages = conv.pipe( conv.uniform_sequence( conv.struct( dict( personne_de_reference = conv.not_none, ), default = conv.noop, ), ), conv.empty_to_none, conv.not_none, ), ), default = conv.noop, )(test_case, state = state) return test_case, error return json_or_python_to_test_case def suggest(self): """Returns a dict of suggestions and modifies self.test_case applying those suggestions.""" test_case = self.test_case if test_case is None: return None period_start_date = self.period.start.date period_start_year = self.period.start.year suggestions = dict() for individu in test_case['individus']: individu_id = individu['id'] if individu.get('age') is None and individu.get('age_en_mois') is None and individu.get('birth') is None: # Add missing birth date to person (a parent is 40 years old and a child is 10 years old. is_parent = any(individu_id in famille['parents'] for famille in test_case['familles']) birth_year = period_start_year - 40 if is_parent else period_start_year - 10 birth = datetime.date(birth_year, 1, 1) individu['birth'] = birth suggestions.setdefault('test_case', {}).setdefault('individus', {}).setdefault(individu_id, {})[ 'birth'] = birth.isoformat() if individu.get('activite') is None: if find_age(individu, period_start_date) < 16: individu['activite'] = 2 # Étudiant, élève suggestions.setdefault('test_case', {}).setdefault('individus', {}).setdefault(individu_id, {})[ 'activite'] = u'2' # Étudiant, élève individu_by_id = { individu['id']: individu for individu in test_case['individus'] } for foyer_fiscal in test_case['foyers_fiscaux']: if len(foyer_fiscal['declarants']) == 1 and foyer_fiscal['personnes_a_charge']: # Suggest "parent isolé" when foyer_fiscal contains a single "declarant" with "personnes_a_charge". if foyer_fiscal.get('caseT') is None: suggestions.setdefault('test_case', {}).setdefault('foyers_fiscaux', {}).setdefault( foyer_fiscal['id'], {})['caseT'] = foyer_fiscal['caseT'] = True elif len(foyer_fiscal['declarants']) == 2: # Suggest "PACSé" or "Marié" instead of "Célibataire" when foyer_fiscal contains 2 "declarants" without # "statmarit". statmarit = 5 # PACSé for individu_id in foyer_fiscal['declarants']: individu = individu_by_id[individu_id] if individu.get('statmarit') == 1: # Marié statmarit = 1 for individu_id in foyer_fiscal['declarants']: individu = individu_by_id[individu_id] if individu.get('statmarit') is None: individu['statmarit'] = statmarit suggestions.setdefault('test_case', {}).setdefault('individus', {}).setdefault(individu_id, {})[ 'statmarit'] = unicode(statmarit) return suggestions or None def to_json(self): self_json = collections.OrderedDict() if self.axes is not None: self_json['axes'] = self.axes if self.period is not None: self_json['period'] = str(self.period) test_case = self.test_case if test_case is not None: column_by_name = self.tax_benefit_system.column_by_name test_case_json = collections.OrderedDict() familles_json = [] for famille in (test_case.get('familles') or []): famille_json = collections.OrderedDict() famille_json['id'] = famille['id'] parents = famille.get('parents') if parents: famille_json['parents'] = parents enfants = famille.get('enfants') if enfants: famille_json['enfants'] = enfants for column_name, variable_value in famille.iteritems(): column = column_by_name.get(column_name) if column is not None and column.entity == 'fam': variable_value_json = column.transform_value_to_json(variable_value) if variable_value_json is not None: famille_json[column_name] = variable_value_json familles_json.append(famille_json) if familles_json: test_case_json['familles'] = familles_json foyers_fiscaux_json = [] for foyer_fiscal in (test_case.get('foyers_fiscaux') or []): foyer_fiscal_json = collections.OrderedDict() foyer_fiscal_json['id'] = foyer_fiscal['id'] declarants = foyer_fiscal.get('declarants') if declarants: foyer_fiscal_json['declarants'] = declarants personnes_a_charge = foyer_fiscal.get('personnes_a_charge') if personnes_a_charge: foyer_fiscal_json['personnes_a_charge'] = personnes_a_charge for column_name, variable_value in foyer_fiscal.iteritems(): column = column_by_name.get(column_name) if column is not None and column.entity == 'foy': variable_value_json = column.transform_value_to_json(variable_value) if variable_value_json is not None: foyer_fiscal_json[column_name] = variable_value_json foyers_fiscaux_json.append(foyer_fiscal_json) if foyers_fiscaux_json: test_case_json['foyers_fiscaux'] = foyers_fiscaux_json individus_json = [] for individu in (test_case.get('individus') or []): individu_json = collections.OrderedDict() individu_json['id'] = individu['id'] for column_name, variable_value in individu.iteritems(): column = column_by_name.get(column_name) if column is not None and column.entity == 'ind': variable_value_json = column.transform_value_to_json(variable_value) if variable_value_json is not None: individu_json[column_name] = variable_value_json individus_json.append(individu_json) if individus_json: test_case_json['individus'] = individus_json menages_json = [] for menage in (test_case.get('menages') or []): menage_json = collections.OrderedDict() menage_json['id'] = menage['id'] personne_de_reference = menage.get('personne_de_reference') if personne_de_reference is not None: menage_json['personne_de_reference'] = personne_de_reference conjoint = menage.get('conjoint') if conjoint is not None: menage_json['conjoint'] = conjoint enfants = menage.get('enfants') if enfants: menage_json['enfants'] = enfants autres = menage.get('autres') if autres: menage_json['autres'] = autres for column_name, variable_value in menage.iteritems(): column = column_by_name.get(column_name) if column is not None and column.entity == 'men': variable_value_json = column.transform_value_to_json(variable_value) if variable_value_json is not None: menage_json[column_name] = variable_value_json menages_json.append(menage_json) if menages_json: test_case_json['menages'] = menages_json self_json['test_case'] = test_case_json return self_json # Finders def find_age(individu, date, default = None): birth = individu.get('birth') if isinstance(birth, dict): birth = birth.values()[0] if birth else None if birth is not None: age = date.year - birth.year if date.month < birth.month or date.month == birth.month and date.day < birth.day: age -= 1 return age age = individu.get('age') if isinstance(age, dict): age = age.values()[0] if age else None if age is not None: return age age_en_mois = individu.get('age_en_mois') if isinstance(age_en_mois, dict): age_en_mois = age_en_mois.values()[0] if age_en_mois else None if age_en_mois is not None: return age_en_mois / 12.0 return default def find_famille_and_role(test_case, individu_id): for famille in test_case['familles']: for role in (u'parents', u'enfants'): if individu_id in famille[role]: return famille, role return None, None def find_foyer_fiscal_and_role(test_case, individu_id): for foyer_fiscal in test_case['foyers_fiscaux']: for role in (u'declarants', u'personnes_a_charge'): if individu_id in foyer_fiscal[role]: return foyer_fiscal, role return None, None def find_menage_and_role(test_case, individu_id): for menage in test_case['menages']: for role in (u'personne_de_reference', u'conjoint'): if menage[role] == individu_id: return menage, role for role in (u'enfants', u'autres'): if individu_id in menage[role]: return menage, role return None, None PK'G=aaopenfisca_france/entities.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import collections import itertools from openfisca_core import entities class Entreprises(entities.AbstractEntity): column_by_name = collections.OrderedDict() index_for_person_variable_name = 'entreprise_id' key_plural = 'entreprises' key_singular = 'entreprise' label = u'Entreprise' role_for_person_variable_name = 'entreprise_role' roles_key = ['salaries'] # 'dirigeants'] label_by_role_key = { 'salaries': u'Salariés', # 'dirigeants': u'Dirigeants', } symbol = 'entreprise' def iter_member_persons_role_and_id(self, member): role = 0 salaries_id = member['salariés'] for salarie_role, salarie_id in enumerate(salaries_id, role): assert salarie_id is not None yield salarie_role, salarie_id class Familles(entities.AbstractEntity): column_by_name = collections.OrderedDict() index_for_person_variable_name = 'idfam' key_plural = 'familles' key_singular = 'famille' label = u'Famille' max_cardinality_by_role_key = {'parents': 2} role_for_person_variable_name = 'quifam' roles_key = ['parents', 'enfants'] label_by_role_key = { 'enfants': u'Enfants', 'parents': u'Parents', } symbol = 'fam' def iter_member_persons_role_and_id(self, member): role = 0 parents_id = member['parents'] assert 1 <= len(parents_id) <= 2 for parent_role, parent_id in enumerate(parents_id, role): assert parent_id is not None yield parent_role, parent_id role += 2 enfants_id = member.get('enfants') if enfants_id is not None: for enfant_role, enfant_id in enumerate(enfants_id, role): assert enfant_id is not None yield enfant_role, enfant_id class FoyersFiscaux(entities.AbstractEntity): column_by_name = collections.OrderedDict() index_for_person_variable_name = 'idfoy' key_plural = 'foyers_fiscaux' key_singular = 'foyer_fiscal' label = u'Déclaration d\'impôt' max_cardinality_by_role_key = {'declarants': 2} role_for_person_variable_name = 'quifoy' roles_key = ['declarants', 'personnes_a_charge'] label_by_role_key = { 'declarants': u'Déclarants', 'personnes_a_charge': u'Personnes à charge', } symbol = 'foy' def iter_member_persons_role_and_id(self, member): role = 0 declarants_id = member['declarants'] assert 1 <= len(declarants_id) <= 2 for declarant_role, declarant_id in enumerate(declarants_id, role): assert declarant_id is not None yield declarant_role, declarant_id role += 2 personnes_a_charge_id = member.get('personnes_a_charge') if personnes_a_charge_id is not None: for personne_a_charge_role, personne_a_charge_id in enumerate(personnes_a_charge_id, role): assert personne_a_charge_id is not None yield personne_a_charge_role, personne_a_charge_id class Individus(entities.AbstractEntity): column_by_name = collections.OrderedDict() is_persons_entity = True key_plural = 'individus' key_singular = 'individu' label = u'Personne' symbol = 'ind' class Menages(entities.AbstractEntity): column_by_name = collections.OrderedDict() index_for_person_variable_name = 'idmen' key_plural = 'menages' key_singular = 'menage' label = u'Logement principal' max_cardinality_by_role_key = {'conjoint': 1, 'personne_de_reference': 1} role_for_person_variable_name = 'quimen' roles_key = ['personne_de_reference', 'conjoint', 'enfants', 'autres'] label_by_role_key = { 'autres': u'Autres', 'conjoint': u'Conjoint', 'enfants': u'Enfants', 'personne_de_reference': u'Personne de référence', } symbol = 'men' def iter_member_persons_role_and_id(self, member): role = 0 personne_de_reference_id = member['personne_de_reference'] assert personne_de_reference_id is not None yield role, personne_de_reference_id role += 1 conjoint_id = member.get('conjoint') if conjoint_id is not None: yield role, conjoint_id role += 1 autres_id = member.get('autres') or [] enfants_id = member.get('enfants') or [] for enfant_role, enfant_id in enumerate(itertools.chain(enfants_id, autres_id), role): yield enfant_role, enfant_id entity_class_by_key_plural = dict( familles = Familles, foyers_fiscaux = FoyersFiscaux, individus = Individus, menages = Menages, ) entity_class_by_symbol = dict( fam = Familles, foy = FoyersFiscaux, ind = Individus, men = Menages, ) PK'G;}_ZZLopenfisca_france/scripts/merge_ipp_tax_and_benefit_tables_with_parameters.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . """Merge YAML files of IPP tax and benefit tables with OpenFisca parameters to generate new parameters.""" import argparse import collections import datetime import logging import os import sys import xml.etree.ElementTree as etree from biryani import strings import yaml date_names = ( # u"Age de départ (AAD=Age d'annulation de la décôte)", u"Date", u"Date d'effet", u"Date de perception du salaire", u"Date ISF", ) log = logging.getLogger(__name__) note_names = ( u"Notes", u"Notes bis", ) parameters_dir = os.path.normpath(os.path.join(os.path.dirname(__file__), '..', 'param')) reference_names = ( u"Parution au JO", u"Références BOI", u"Références législatives", u"Références législatives - définition des ressources et plafonds", u"Références législatives - revalorisation des plafonds", u"Références législatives des règles de calcul et du paramètre Po", u"Références législatives de tous les autres paramètres", ) # YAML configuration def dict_constructor(loader, node): return collections.OrderedDict(loader.construct_pairs(node)) yaml.add_constructor(yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, dict_constructor) # Functions def iter_ipp_values(node): if isinstance(node, dict): for name, child in node.iteritems(): for path, value in iter_ipp_values(child): yield [name] + path, value else: yield [], node def main(): parser = argparse.ArgumentParser() parser.add_argument('-i', '--ipp-translations', default = os.path.join(parameters_dir, 'ipp-tax-and-benefit-tables-to-parameters.yaml'), help = 'path of YAML file containing the association between IPP fields and OpenFisca parameters') parser.add_argument('-o', '--origin', default = os.path.join(parameters_dir, 'param.xml'), help = 'path of XML file containing the original OpenFisca parameters') parser.add_argument('-p', '--param-translations', default = os.path.join(parameters_dir, 'param-to-parameters.yaml'), help = 'path of YAML file containing the association between param elements and OpenFisca parameters') parser.add_argument('-s', '--source-dir', default = 'yaml-clean', help = 'path of source directory containing clean IPP YAML files') parser.add_argument('-t', '--target', default = os.path.join(parameters_dir, 'parameters.xml'), help = 'path of generated YAML file containing the association between IPP fields with OpenFisca parameters') parser.add_argument('-v', '--verbose', action = 'store_true', default = False, help = "increase output verbosity") args = parser.parse_args() logging.basicConfig(level = logging.DEBUG if args.verbose else logging.WARNING, stream = sys.stdout) file_system_encoding = sys.getfilesystemencoding() original_element_tree = etree.parse(args.origin) original_root_element = original_element_tree.getroot() # Apply translations to original parameters. with open(args.param_translations) as param_translations_file: param_translations = yaml.load(param_translations_file) for old_path, new_path in param_translations.iteritems(): parent_element = None element = original_root_element for name in old_path.split('.'): for child in element: if child.get('code') == name: parent_element = element element = child break else: assert False, 'Path "{}" not found in "{}"'.format(old_path, args.origin) parent_element.remove(element) if new_path is not None: parent_element = original_root_element split_new_path = new_path.split('.') for name in split_new_path[:-1]: for child in parent_element: if child.get('code') == name: parent_element = child break else: parent_element = etree.SubElement(parent_element, 'NODE', attrib = dict( code = name, )) name = split_new_path[-1] assert all( child.get('code') != name for child in parent_element ), 'Path "{}" already exists in "{}"'.format(new_path, args.origin) element.set('code', name) parent_element.append(element) with open(args.ipp_translations) as ipp_translations_file: ipp_translations = yaml.load(ipp_translations_file) tree = collections.OrderedDict() for source_dir_encoded, directories_name_encoded, filenames_encoded in os.walk(args.source_dir): directories_name_encoded.sort() for filename_encoded in sorted(filenames_encoded): if not filename_encoded.endswith('.yaml'): continue filename = filename_encoded.decode(file_system_encoding) sheet_name = os.path.splitext(filename)[0] source_file_path_encoded = os.path.join(source_dir_encoded, filename_encoded) relative_file_path_encoded = source_file_path_encoded[len(args.source_dir):].lstrip(os.sep) relative_file_path = relative_file_path_encoded.decode(file_system_encoding) if sheet_name.isupper(): continue assert sheet_name.islower(), sheet_name log.info(u'Loading file {}'.format(relative_file_path)) with open(source_file_path_encoded) as source_file: data = yaml.load(source_file) rows = data.get(u"Valeurs") if rows is None: log.info(u' Skipping file {} without "Valeurs"'.format(relative_file_path)) continue row_by_start = {} for row in rows: start = row.get(u"Date d'effet") if start is None: for date_name in date_names: start = row.get(date_name) if start is not None: break else: # No date found. Skip row. continue elif not isinstance(start, datetime.date): start = start[u"Année Revenus"] row_by_start[start] = row sorted_row_by_start = sorted(row_by_start.iteritems()) unsorted_relative_ipp_paths = set() relative_ipp_paths_by_start = {} for start, row in sorted_row_by_start: relative_ipp_paths_by_start[start] = start_relative_ipp_paths = [] for name, child in row.iteritems(): if name in date_names: continue if name in note_names: continue if name in reference_names: continue start_relative_ipp_paths.extend( (name,) + tuple(path) for path, value in iter_ipp_values(child) ) unsorted_relative_ipp_paths.update(start_relative_ipp_paths) def compare_relative_ipp_paths(x, y): if x == y: return 0 for relative_ipp_paths in relative_ipp_paths_by_start.itervalues(): try: return cmp(relative_ipp_paths.index(x), relative_ipp_paths.index(y)) except ValueError: # Either x or y paths are missing in relative_ipp_paths => Their order can't be compared. continue return -1 sorted_relative_ipp_paths = sorted(unsorted_relative_ipp_paths, cmp = compare_relative_ipp_paths) for start, row in sorted_row_by_start: for relative_ipp_path in sorted_relative_ipp_paths: value = row for fragment in relative_ipp_path: value = value.get(fragment) if value is None: break if value in (u'-', u'na', u'nc'): # Value is unknown. Previous value must be propagated. continue ipp_path = relative_file_path.split(os.sep)[:-1] + [sheet_name] + list(relative_ipp_path) remaining_path = ipp_path[:] skip_ipp_path = False sub_tree = tree translations = ipp_translations translated_path = [] while remaining_path: fragment = remaining_path.pop(0) type = None if translations is not None: translations = translations.get(fragment, fragment) if translations is None: skip_ipp_path = True break elif isinstance(translations, dict): translation = translations.get('RENAME') if translation is not None: fragment = translation type = translations.get('TYPE') assert type in (None, u'BAREME') else: fragment = translations translations = None sub_path = [fragment] if isinstance(fragment, basestring) else fragment[:] while sub_path: fragment = sub_path.pop(0) translated_path.append(fragment) if fragment == u'ASSIETTE': assert sub_tree.get('TYPE') == u'BAREME', str((translated_path, sub_path, sub_tree)) assert not sub_path slice_name = remaining_path.pop(0) assert not remaining_path sub_tree = sub_tree.setdefault(u'ASSIETTE', collections.OrderedDict()).setdefault( slice_name, []) elif fragment == u'BAREME': existing_type = sub_tree.get('TYPE') if existing_type is None: sub_tree['TYPE'] = fragment else: assert existing_type == fragment elif fragment == u'MONTANT': assert sub_tree.get('TYPE') == u'BAREME', str((translated_path, sub_path, sub_tree)) assert not sub_path slice_name = remaining_path.pop(0) assert not remaining_path sub_tree = sub_tree.setdefault(u'MONTANT', collections.OrderedDict()).setdefault( slice_name, []) elif fragment == u'SEUIL': assert sub_tree.get('TYPE') == u'BAREME', str((translated_path, sub_path, sub_tree)) assert not sub_path slice_name = remaining_path.pop(0) assert not remaining_path sub_tree = sub_tree.setdefault(u'SEUIL', collections.OrderedDict()).setdefault( slice_name, []) elif fragment == u'TAUX': assert sub_tree.get('TYPE') == u'BAREME', str((translated_path, sub_path, sub_tree)) assert not sub_path slice_name = remaining_path.pop(0) assert not remaining_path sub_tree = sub_tree.setdefault(u'TAUX', collections.OrderedDict()).setdefault( slice_name, []) elif sub_path or remaining_path: sub_tree = sub_tree.setdefault(fragment, collections.OrderedDict()) if type is not None: existing_type = sub_tree.get('TYPE') if existing_type is None: sub_tree['TYPE'] = type else: assert existing_type == type else: sub_tree = sub_tree.setdefault(fragment, []) if skip_ipp_path: continue if sub_tree: last_leaf = sub_tree[-1] if last_leaf['value'] == value: continue last_leaf['stop'] = start - datetime.timedelta(days = 1) sub_tree.append(dict( start = start, value = value, )) root_element = transform_node_to_element(u'root', tree) root_element.set('deb', original_root_element.get('deb')) root_element.set('fin', original_root_element.get('fin')) merge_elements(root_element, original_root_element) sort_elements(root_element) reindent(root_element) element_tree = etree.ElementTree(root_element) element_tree.write(args.target, encoding = 'utf-8') return 0 def merge_elements(element, original_element, path = None): if path is None: path = [] else: path = path[:] path.append(element.get('code')) assert element.tag == original_element.tag, 'At {}, IPP element "{}"" differs from original element "{}"'.format( '.'.join(path), element.tag, original_element.tag) if element.tag == 'NODE': for original_child in original_element: for child in element: if child.get('code') == original_child.get('code'): merge_elements(child, original_child) break else: # A child with the same code as the original child doesn't exist yet. element.append(original_child) def sort_elements(element): if element.tag in ('BAREME', 'NODE', 'TRANCHE'): if element.tag == 'NODE': children = list(element) for child in children: element.remove(child) children.sort(key = lambda child: child.get('code')) element.extend(children) for child in element: sort_elements(child) else: children = list(element) for child in children: element.remove(child) children.sort(key = lambda child: child.get('deb') or '', reverse = True) element.extend(children) def prepare_xml_values(name, leafs): leafs = list(reversed([ leaf for leaf in leafs if leaf['value'] is not None ])) format = None type = None for leaf in leafs: value = leaf['value'] if isinstance(value, basestring): split_value = value.split() if len(split_value) == 2 and split_value[1] in ( u'%', u'AF', # anciens francs u'CFA', # francs CFA # u'COTISATIONS', u'EUR', u'FRF', ): value = float(split_value[0]) unit = split_value[1] if unit == u'%': if format is None: format = u'percent' elif format != u'percent': log.warning(u'Non constant percent format {} in {}: {}'.format(format, name, leafs)) return None, format, type value = value / 100 else: if format is None: format = u'float' elif format != u'float': log.warning(u'Non constant float format {} in {}: {}'.format(format, name, leafs)) return None, format, type if type is None: type = u'monetary' elif type != u'monetary': log.warning(u'Non constant monetary type {} in {}: {}'.format(type, name, leafs)) return None, format, type else: assert type == u'monetary', type # elif unit == u'AF': # # Convert "anciens francs" to €. # value = round(value / (100 * 6.55957), 2) # elif unit == u'FRF': # # Convert "nouveaux francs" to €. # if month < year_1960: # value /= 100 # value = round(value / 6.55957, 2) if isinstance(value, float) and value == int(value): value = int(value) leaf['value'] = value return leafs, format, type def reindent(elem, depth = 0): # cf http://effbot.org/zone/element-lib.htm indent = "\n" + depth * " " if len(elem): if not elem.text or not elem.text.strip(): elem.text = indent + " " if not elem.tail or not elem.tail.strip(): elem.tail = indent for elem in elem: reindent(elem, depth + 1) if not elem.tail or not elem.tail.strip(): elem.tail = indent else: if depth and (not elem.tail or not elem.tail.strip()): elem.tail = indent def transform_node_to_element(name, node): if isinstance(node, dict): if node.get('TYPE') == u'BAREME': scale_element = etree.Element('BAREME', attrib = dict( code = strings.slugify(name, separator = u'_'), )) for slice_name in node.get('SEUIL', {}).keys(): slice_element = etree.Element('TRANCHE', attrib = dict( code = strings.slugify(slice_name, separator = u'_'), )) threshold_element = etree.Element('SEUIL') values, format, type = prepare_xml_values(name, node.get('SEUIL', {}).get(slice_name, [])) for value in values: value_element = transform_value_to_element(value) if value_element is not None: threshold_element.append(value_element) if len(threshold_element) > 0: slice_element.append(threshold_element) amount_element = etree.Element('MONTANT') values, format, type = prepare_xml_values(name, node.get('MONTANT', {}).get(slice_name, [])) for value in values: value_element = transform_value_to_element(value) if value_element is not None: amount_element.append(value_element) if len(amount_element) > 0: slice_element.append(amount_element) rate_element = etree.Element('TAUX') values, format, type = prepare_xml_values(name, node.get('TAUX', {}).get(slice_name, [])) for value in values: value_element = transform_value_to_element(value) if value_element is not None: rate_element.append(value_element) if len(rate_element) > 0: slice_element.append(rate_element) base_element = etree.Element('ASSIETTE') values, format, type = prepare_xml_values(name, node.get('ASSIETTE', {}).get(slice_name, [])) for value in values: value_element = transform_value_to_element(value) if value_element is not None: base_element.append(value_element) if len(base_element) > 0: slice_element.append(base_element) if len(slice_element) > 0: scale_element.append(slice_element) return scale_element if len(scale_element) > 0 else None else: node_element = etree.Element('NODE', attrib = dict( code = strings.slugify(name, separator = u'_'), )) for key, value in node.iteritems(): child_element = transform_node_to_element(key, value) if child_element is not None: node_element.append(child_element) return node_element if len(node_element) > 0 else None else: assert isinstance(node, list), node values, format, type = prepare_xml_values(name, node) if not values: return None code_element = etree.Element('CODE', attrib = dict( code = strings.slugify(name, separator = u'_'), )) if format is not None: code_element.set('format', format) if type is not None: code_element.set('type', type) for value in values: value_element = transform_value_to_element(value) if value_element is not None: code_element.append(value_element) return code_element if len(code_element) > 0 else None def transform_value_to_element(leaf): value = leaf.get('value') if value is None: return None value_element = etree.Element('VALUE', attrib = dict( valeur = unicode(value), )) start = leaf.get('start') if start is not None: value_element.set('deb', start.isoformat()) stop = leaf.get('stop') if stop is not None: value_element.set('fin', stop.isoformat()) return value_element if __name__ == "__main__": sys.exit(main()) PK'G`qU1openfisca_france/scripts/generate_columns_tree.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . """Generate the columns tree from flat dictionary of columns. When tree already exists, don't change location of columns that have already been placed in tree. """ import argparse import collections import logging import os import pprint import sys from openfisca_core import formulas from openfisca_france import init_country, model try: from openfisca_france.model.datatrees import columns_name_tree_by_entity except ImportError: columns_name_tree_by_entity = collections.OrderedDict() app_name = os.path.splitext(os.path.basename(__file__))[0] log = logging.getLogger(app_name) TaxBenefitSystem = init_country() tax_benefit_system = TaxBenefitSystem() class PrettyPrinter(pprint.PrettyPrinter): """Override pprint PrettyPrinter to correctly handle diacritical characters.""" def format(self, object, context, maxlevels, level): if isinstance(object, unicode): return ('u"""{}"""'.format(object.encode('utf8')), True, False) return pprint.PrettyPrinter.format(self, object, context, maxlevels, level) pretty_printer = PrettyPrinter() def cleanup_tree(entity, tree): children = [] for child in (tree.get('children') or []): if isinstance(child, basestring): # Child is a column name. column = tax_benefit_system.column_by_name.get(child) if column is not None and column.entity == entity and is_valid_input_column(column): children.append(child) else: assert isinstance(child, dict), child if child.get('label') != u'Autres': child = cleanup_tree(entity, child) if child is not None: children.append(child) if not children: return None tree = tree.copy() tree['children'] = children return tree def is_valid_input_column(column): return column.name not in ('age', 'age_en_mois', 'idfam', 'idfoy', 'idmen', 'quifam', 'quifoy', 'quimen') \ and issubclass(column.formula_class, formulas.SimpleFormula) and column.formula_class.function is None \ and not column.survey_only def iter_placed_tree(tree): assert tree.get('children'), tree for child in tree['children']: if isinstance(child, basestring): # Child is a column name. yield child else: if child.get('label') != u'Autres': for column_name in iter_placed_tree(child): yield column_name def main(): parser = argparse.ArgumentParser(description = __doc__) parser.add_argument('-v', '--verbose', action = 'store_true', default = False, help = "increase output verbosity") args = parser.parse_args() logging.basicConfig(level = logging.DEBUG if args.verbose else logging.WARNING, stream = sys.stdout) global columns_name_tree_by_entity columns_name_tree_by_entity = collections.OrderedDict( (entity, columns_name_tree) for entity, columns_name_tree in ( (entity1, cleanup_tree(entity1, columns_name_tree1)) for entity1, columns_name_tree1 in columns_name_tree_by_entity.iteritems() ) if columns_name_tree is not None ) placed_columns_name = set( column_name for columns_name_tree in columns_name_tree_by_entity.itervalues() for column_name in iter_placed_tree(columns_name_tree) ) for name, column in tax_benefit_system.column_by_name.iteritems(): if not is_valid_input_column(column): continue if name in placed_columns_name: continue placed_columns_name.add(name) entity_children = columns_name_tree_by_entity.setdefault(column.entity, collections.OrderedDict()).setdefault( 'children', []) if entity_children and entity_children[-1].get('label') == u'Autres': last_entity_child = entity_children[-1] else: last_entity_child = collections.OrderedDict(label = u'Autres') entity_children.append(last_entity_child) last_entity_child.setdefault('children', []).append(name) datatrees_module_path = os.path.join(os.path.dirname(model.__file__), 'datatrees.py') with open(datatrees_module_path, 'w') as datatree_file: datatree_file.write('''\ # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import collections columns_name_tree_by_entity = collections.OrderedDict([ ''') for entity in ('ind', 'fam', 'foy', 'men'): datatree_file.write(' ({}, '.format(pretty_printer.pformat(entity))) write_tree(datatree_file, columns_name_tree_by_entity[entity]) datatree_file.write('),\n') datatree_file.write(' ])\n') return 0 def write_tree(tree_file, tree, level = 1): tree_file.write('collections.OrderedDict([\n') label = tree.get('label') if label is not None: tree_file.write(' ' * (level + 1)) tree_file.write("('label', {}),\n".format(pretty_printer.pformat(label))) children = tree.get('children') if children is not None: tree_file.write(' ' * (level + 1)) tree_file.write("('children', [\n".format(pretty_printer.pformat(label))) for child in children: tree_file.write(' ' * (level + 2)) if isinstance(child, basestring): tree_file.write(pretty_printer.pformat(child)) tree_file.write(',') column = tax_benefit_system.column_by_name[child] label = column.label if label is not None: label = label.strip() or None if label == child: label = None if label is not None: tree_file.write(' # ') tree_file.write(column.label.strip().encode('utf-8')) tree_file.write('\n') else: write_tree(tree_file, child, level = level + 2) tree_file.write(',\n') tree_file.write(' ' * (level + 2)) tree_file.write("]),\n") tree_file.write(' ' * (level + 1)) tree_file.write('])') if __name__ == "__main__": sys.exit(main()) PKxIE$openfisca_france/scripts/__init__.pyPKF4 .openfisca_france/scripts/holidays_generator.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . """Use weekalendar to generate holidays.""" from collections import OrderedDict from workalendar.europe import France holidays = [] for year in range(1990, 2020): holidays += France().get_calendar_holidays(year) header = """#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from datetime import datetime holidays = [""" footer = """ ] """ with open("../assets/holidays.py", "w") as text_file: text_file.write(header) for holiday_date, holiday_name in OrderedDict(holidays).iteritems(): text_file.write(""" datetime.strptime("{}", "%Y-%m-%d").date(), # {}""".format(holiday_date, holiday_name)) text_file.write(footer) PK'G"C00Iopenfisca_france/scripts/link_ipp_tax_and_benefit_tables_to_parameters.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . """Create a YAML file associating the fields in IPP tax and benefit tables to their matching parameters in OpenFisca.""" import argparse import collections import copy import datetime import logging import os import sys import yaml from openfisca_france import init_country date_names = ( u"Age de départ (AAD=Age d'annulation de la décôte)", u"Date", u"Date d'effet", u"Date de perception du salaire", u"Date ISF", ) log = logging.getLogger(__name__) # YAML configuration class folded_unicode(unicode): pass class literal_unicode(unicode): pass def dict_constructor(loader, node): return collections.OrderedDict(loader.construct_pairs(node)) yaml.add_constructor(yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, dict_constructor) yaml.add_representer(collections.OrderedDict, lambda dumper, data: dumper.represent_dict( (copy.deepcopy(key), value) for key, value in data.iteritems() )) yaml.add_representer(dict, lambda dumper, data: dumper.represent_dict( (copy.deepcopy(key), value) for key, value in data.iteritems() )) yaml.add_representer(folded_unicode, lambda dumper, data: dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='>')) yaml.add_representer(literal_unicode, lambda dumper, data: dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='|')) yaml.add_representer(tuple, lambda dumper, data: dumper.represent_list(data)) yaml.add_representer(unicode, lambda dumper, data: dumper.represent_scalar(u'tag:yaml.org,2002:str', data)) # Functions def iter_ipp_values(node): if isinstance(node, dict): for name, child in node.iteritems(): for path, value in iter_ipp_values(child): yield [name] + path, value else: yield [], node def iter_openfisca_values(node): type = node['@type'] if type == 'Node': for name, child in node['children'].iteritems(): for path, start, value in iter_openfisca_values(child): yield [name] + path, start, value elif type == 'Parameter': for dated_value in node['values']: value = dated_value['value'] if isinstance(value, float) and value == int(value): value = int(value) yield [], dated_value['start'], value else: assert type == 'Scale', type for bracket in node['brackets']: for i, amount in enumerate(bracket.get('amount') or []): value = amount['value'] if isinstance(value, float) and value == int(value): value = int(value) yield [u'amount', i], amount['start'], value for i, base in enumerate(bracket.get('base') or []): value = base['value'] if isinstance(value, float) and value == int(value): value = int(value) yield [u'base', i], base['start'], value for i, rate in enumerate(bracket.get('rate') or []): value = rate['value'] if isinstance(value, float) and value == int(value): value = int(value) yield [u'rate', i], rate['start'], value for i, threshold in enumerate(bracket.get('threshold') or []): value = threshold['value'] if isinstance(value, float) and value == int(value): value = int(value) yield [u'threshold', i], threshold['start'], value def main(): parser = argparse.ArgumentParser() parser.add_argument('-s', '--source-dir', default = 'yaml-clean', help = 'path of source directory containing clean IPP YAML files') parser.add_argument('-t', '--target', default = 'ipp-tax-and-benefit-tables-to-openfisca-parameters.yaml', help = 'path of generated YAML file containing the association between IPP fields to OpenFisca parameters') parser.add_argument('-v', '--verbose', action = 'store_true', default = False, help = "increase output verbosity") args = parser.parse_args() logging.basicConfig(level = logging.DEBUG if args.verbose else logging.WARNING, stream = sys.stdout) file_system_encoding = sys.getfilesystemencoding() ipp_infos_by_value = {} for source_dir_encoded, directories_name_encoded, filenames_encoded in os.walk(args.source_dir): directories_name_encoded.sort() for filename_encoded in sorted(filenames_encoded): if not filename_encoded.endswith('.yaml'): continue filename = filename_encoded.decode(file_system_encoding) sheet_name = os.path.splitext(filename)[0] source_file_path_encoded = os.path.join(source_dir_encoded, filename_encoded) relative_file_path_encoded = source_file_path_encoded[len(args.source_dir):].lstrip(os.sep) relative_file_path = relative_file_path_encoded.decode(file_system_encoding) if sheet_name.isupper(): continue assert sheet_name.islower(), sheet_name log.info(u'Loading file {}'.format(relative_file_path)) with open(source_file_path_encoded) as source_file: data = yaml.load(source_file) rows = data.get(u"Valeurs") if rows is None: log.info(u' Skipping file {} without "Valeurs"'.format(relative_file_path)) continue for row in rows: start = row.get(u"Date d'effet") if start is None: for date_name in date_names: start = row.get(date_name) if start is not None: break else: # No date found. Skip row. continue elif not isinstance(start, datetime.date): start = start[u"Année Revenus"] for name, child in row.iteritems(): if name in date_names: continue for path, value in iter_ipp_values(child): if isinstance(value, basestring): split_value = value.split() if len(split_value) == 2 and split_value[1] in ( u'%', u'AF', # anciens francs u'CFA', # francs CFA u'COTISATIONS', u'EUR', u'FRF', ): value = float(split_value[0]) if isinstance(value, float) and value == int(value): value = int(value) full_path = tuple(relative_file_path.split(os.sep)[:-1]) + (sheet_name, name) + tuple(path) ipp_infos_by_value.setdefault(value, []).append(dict( path = full_path, start = start, )) # print yaml.dump(ipp_infos_by_value, allow_unicode = True, default_flow_style = False, indent = 2, width = 120) TaxBenefitSystem = init_country() tax_benefit_system = TaxBenefitSystem() # print yaml.dump(tax_benefit_system.legislation_json, allow_unicode = True, default_flow_style = False, indent = 2, # width = 120) # openfisca_infos_by_value = {} # for path, start, value in iter_openfisca_values(tax_benefit_system.legislation_json): # openfisca_infos_by_value.setdefault(value, []).append(dict( # path = tuple(path), # start = start, # )) # print yaml.dump(openfisca_infos_by_value, allow_unicode = True, default_flow_style = False, indent = 2, width = 120) # ipp_count = {} # for path, start, value in iter_openfisca_values(tax_benefit_system.legislation_json): # ipp_infos = ipp_infos_by_value.get(value) # if ipp_infos is None: # # OpenFisca parameter doesn't exit in IPP. # continue # for ipp_info in ipp_infos: # if ipp_info['start'] == start: # ipp_child = ipp_count # ipp_path = ipp_info['path'] # for name in path: # ipp_child = ipp_child.setdefault(name, {}) # ipp_child_count = ipp_child.setdefault('count_by_path', {}) # for ipp_index in range(len(ipp_path)): # ipp_sub_path = ipp_path[:ipp_index + 1] # ipp_child_count[ipp_sub_path] = ipp_child_count.get(ipp_sub_path, 0) + 1 # print yaml.dump(ipp_count, allow_unicode = True, default_flow_style = False, indent = 2, width = 120) starts_by_ipp_path_by_openfisca_path = {} starts_by_openfisca_path_by_ipp_path = {} for path, start, value in iter_openfisca_values(tax_benefit_system.legislation_json): ipp_infos = ipp_infos_by_value.get(value) if ipp_infos is None: # OpenFisca parameter doesn't exit in IPP. continue same_start_ipp_paths = [ ipp_info['path'] for ipp_info in ipp_infos if ipp_info['start'] == start ] if len(same_start_ipp_paths) == 1: ipp_path = same_start_ipp_paths[0] starts_by_ipp_path_by_openfisca_path.setdefault(tuple(path), {}).setdefault(ipp_path, set()).add(start) starts_by_openfisca_path_by_ipp_path.setdefault(ipp_path, {}).setdefault(tuple(path), set()).add(start) # for openfisca_path, starts_by_ipp_path in sorted(starts_by_ipp_path_by_openfisca_path.iteritems()): ## if len(starts_by_ipp_path) == 1: ## print u'.'.join(openfisca_path), '->', u' / '.join(starts_by_ipp_path.keys()[0]) # if len(starts_by_ipp_path) > 1: # print u'.'.join(openfisca_path), '->', starts_by_ipp_path # for ipp_path, starts_by_openfisca_path in sorted(starts_by_openfisca_path_by_ipp_path.iteritems()): # if len(starts_by_openfisca_path) == 1: # print u' / '.join(ipp_path), '->', u'.'.join( # unicode(fragment) # for fragment in starts_by_openfisca_path.keys()[0] # ) ## if len(starts_by_openfisca_path) > 1: ## print u' / '.join(ipp_path), '->', u'.'.join( ## unicode(fragment) ## for fragment in starts_by_openfisca_path.keys()[0] ## ) openfisca_path_by_ipp_tree = collections.OrderedDict() for ipp_path, starts_by_openfisca_path in sorted(starts_by_openfisca_path_by_ipp_path.iteritems()): openfisca_path_by_ipp_sub_tree = openfisca_path_by_ipp_tree for ipp_name in ipp_path[:-1]: openfisca_path_by_ipp_sub_tree = openfisca_path_by_ipp_sub_tree.setdefault(ipp_name, collections.OrderedDict()) ipp_name = ipp_path[-1] openfisca_path_by_ipp_sub_tree[ipp_name] = [ u'.'.join( unicode(fragment) for fragment in openfisca_name ) for openfisca_name in sorted(starts_by_openfisca_path) ] with open(args.target, 'w') as target_file: yaml.dump(openfisca_path_by_ipp_tree, target_file, allow_unicode = True, default_flow_style = False, indent = 2, width = 120) return 0 if __name__ == "__main__": sys.exit(main()) PKF+oP %openfisca_france/scripts/web_trace.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . """Send scenario to tracer.""" import datetime import io import json import logging import os import urllib import webbrowser from openfisca_core import periods app_name = os.path.splitext(os.path.basename(__file__))[0] log = logging.getLogger(app_name) def trace(scenario, variables, period = None, browser_name = 'chromium', api_url = u"http://api.openfisca.fr", json_dumped_file = None): scenario_json = scenario.to_json() simulation_json = { "scenarios": [scenario_json], "variables": variables, } trace_base_url = u"http://www.openfisca.fr/outils/trace" url = trace_base_url + "?" + urllib.urlencode({ "simulation": json.dumps(simulation_json), "api_url": api_url, }) browser = webbrowser.get(browser_name) browser.open_new_tab(url) if json_dumped_file: with io.open(json_dumped_file, 'w', encoding='utf-8') as f: f.write(unicode(json.dumps(scenario_json, ensure_ascii=False, encoding='utf-8', indent = 2))) if __name__ == '__main__': from openfisca_france.tests.base import tax_benefit_system period = "2014-12" parent1 = dict( birth = datetime.date(periods.period(period).start.year - 40, 1, 1), salbrut = {"2014-12": 1445.38}, ) scenario = tax_benefit_system.new_scenario().init_single_entity( period = period, parent1 = parent1, ) variables = ["salsuperbrut"] trace( scenario, variables, api_url = u"http://127.0.0.1:2000", json_dumped_file = "test_smicard.json", ) PKF}d&&*openfisca_france/scripts/date_variables.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . ########### DESCRIPTION ############ ## Ce programme est utilisé pour renseigner les dates de début et de fin des variables d'entrée ## Il n'est a priori plus utile puisque désormais ces dates ont été remplies dans OpenFisca ## Ce programme trouve, à partir de 2005, les cases qui sont présentes dans la déclaration de revenus ## grâce à des requêtes au simulateur de la DGFiP ## Le résultat est date_variables.json qui contient pour chaque variable, les années à partir desquelles la case existe ## ATTENTION : ce script interroge le simulateur en ligne de la DGFiP, qui n'est pas complet : certaines cases de la déclaration pro (2042 c) n'y sont pas, ainsi certaines variables peuvent exister même si le .json dit le contraire. Le fichier 2_init_foyer_3_encapsulation3.sas peut aider pour ces cas-là (il vient d'INES, voir avec Mahdi) import codecs import collections import cStringIO import json import os import sys import urllib import urllib2 from lxml import etree import openfisca_france TaxBenefitSystem = openfisca_france.init_country() tax_benefit_system = TaxBenefitSystem() def main(): global dates dates = {} def test(var): global dates, t t = 0 p = 0 j = 3 year = 2005 dates[var] = [] def requete(p, i, year, var): global t, dates, j j = min(i, 8 - 1 * p * (year < 2010)) path = 'http://www3.finances.gouv.fr/calcul_impot/' + str(year + 1) + '/complet/calc_c_p' + str(p) + str(j) + '_data.htm' request = urllib2.Request(path, headers = { 'User-Agent': 'OpenFisca-Script', }) response = urllib2.urlopen(request) response_html = response.read() if 'Erreur' in response_html: raise Exception(u"Erreur : {}".format(response_html.decode('iso-8859-1')).encode('utf-8')) page_doc = etree.parse(cStringIO.StringIO(response_html), etree.HTMLParser()) for element in page_doc.xpath('//input[@name]'): code = element.get('name') if code == var: t = 1 j = i dates[var].append(year) # Si la case existe pour l'année, on rajoute l'année dans le fichier résultat for year in range(2005,2014): # On teste toutes les pages du simulateur pour trouver la variable requete(p, j, year, var) # Pour accélérer le programme, on cherche d'abord à la même page pour l'année suivante for i in range(1, 10): if not t: p = 0 requete(0, i, year, var) lim = 8 if year < 2010 else 9 for i in range(0, lim): if not t: p = 1 requete(1, i, year, var) t = 0 for column in tax_benefit_system.column_by_name.itervalues(): # On teste les variables une par une var = column.cerfa_field if isinstance(var, dict): for k,v in var.iteritems(): if len('_' + v) > 2: test('_' + v) elif var is not None: if len(var) > 1: test('_' + var) with codecs.open(os.path.join('dates_variables.json'),'w', encoding='utf-8') as fichier: json.dump(dates, fichier, encoding='utf-8', ensure_ascii=False, indent=2, sort_keys=True) main() PK'Gbww(openfisca_france/scripts/rattachement.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . ########### DESCRIPTION ############ ## Ce script (qui n'est pas utilisé par l'UI) sert à calculer les impôts dûs par les différentes combinaisons ## de foyers fiscaux quand les jeunes adultes ont le choix d'être rattachés au foyer fiscal de leurs parents ## Il prend en entrée un scenario contenant un unique foyer fiscal, où sont rattachés les enfants. ## Il ne gère ni le cas de séparation des parents, ni les pensions alimentaires. Même si pour la séparation, il suffit ## de faire tourner le programme deux fois en rattachant successivement les enfants au parent1 puis au parent2 ; ## et pour les pensions il suffit d'inscrire une pension versée et reçue au sein même du foyer (mais le script n'aide pas ## à calculer la pension optimale - qui est la plupart du temps la pension maximale (5698€ si l'enfant n'habite pas chez ## les parents) #TODO: gestion des APL et autres prestations (pour l'instant on retourne l'irpp, je ne sais pas si en retournant le # revenu disponible on gérerait les droits aux prestations) import copy import logging import numpy as np import os import openfisca_france app_name = os.path.splitext(os.path.basename(__file__))[0] log = logging.getLogger(app_name) TaxBenefitSystem = openfisca_france.init_country() tax_benefit_system = TaxBenefitSystem() def split(scenario): # On fait l'hypothèse que le scénario ne contient qu'un seul foyer fiscal tax_benefit_system = scenario.tax_benefit_system test_case = scenario.test_case foyer_fiscal = test_case['foyers_fiscaux'][0] individus = test_case['individus'] year = scenario.year rattachements_possibles = [] # Contient en réalité les détachements possibles puisqu'au départ tous les membres sous rattachés au même foyer detachements_impossibles = [] scenarios = [] impots = [] for pac_index, pac_id in enumerate(foyer_fiscal.pop('personnes_a_charge')): pac = individus[pac_id].copy() age = year - pac.pop('birth').year - 1 if 18 <= age < (21 + 4 * (pac['activite'] == 2)): # Exprime la condition de rattachement au foyer pour les majeurs rattachements_possibles.append(pac_id) else: detachements_impossibles.append(pac_id) foyers_possibles = partiesDe(list(rattachements_possibles)) n = len(foyers_possibles) j = 1 min_ = [-1, 0] for i in range(0, n): scenarios.append(scenario.__class__()) scenarios[i].__dict__ = copy.copy(scenario.__dict__) scenarios[i].test_case = copy.deepcopy(scenario.test_case) scenarios[i].test_case['foyers_fiscaux'][0]['personnes_a_charge'] = foyers_possibles[i]+detachements_impossibles for jeune in rattachements_possibles: if jeune not in foyers_possibles[i]: scenarios[i].test_case['foyers_fiscaux'][j] = { 'declarants': [jeune], 'personnes_a_charge': [] } j += 1 scenarios[i].suggest() simulation = scenarios[i].new_simulation() irpp = - round(np.sum(simulation.calculate('irpp'))) if irpp < min_[1] or min_[0] == -1: min_ = [i, irpp] impots.append(irpp) print "Le plus avantageux pour votre famille est que les jeunes rattachés à votre foyer fiscal soient : {}. Vous paierez alors {}€ d'impôts. (Seuls les jeunes éligibles au rattachement sont indiqués (18 <= age < 21 si pas étudiant / 25 sinon. Le calculateur a émis l'hypothèse qu'il n'y avait qu'un seul foyer fiscal au départ, auquel tous les jeunes éligibles étaient rattachés.)".format(foyers_possibles[min_[0]],min_[1]) return impots def partiesDe(tab): # Calcule l'ensemble des parties des éléments d'un array, sous forme d'un array d'arrays n = len(tab) if n == 0: return [[]] else: a = tab.pop() tab2 = partiesDe(tab) return add(a, tab2) def add(a, tab): # Concatène un array d'arrays (tab) avec le même array où un élément (a) aura été rajouté à chaque sous-array n = len(tab) for i in range (0, n): b = list(tab[i]) tab.append(b) tab[i].append(a) return tab def define_scenario(year): scenario = tax_benefit_system.new_scenario() scenario.init_single_entity( parent1 = dict( activite = u'Actif occupé', birth = 1973, # cadre = True, salaire_imposable = 90000, statmarit = u'Célibataire', ), enfants = [ dict( activite = u'Étudiant, élève', birth = '1992-02-01', ), dict( activite = u'Étudiant, élève', birth = '2000-04-17', ), ], foyer_fiscal = dict( #TODO: pb avec f2ck # f7cn = 1500, f7rd = 100000 ), period = year, ) scenario.suggest() return scenario def main(): split(define_scenario(2014)) return 0 if __name__ == "__main__": # sys.exit(main()) main() PKF.kQQ2openfisca_france/scripts/inspect_dgfip_variable.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . """Open a variable in the DGFIP website in a browser.""" import argparse import logging import os import re import sys import webbrowser app_name = os.path.splitext(os.path.basename(__file__))[0] log = logging.getLogger(app_name) DEFAULT_YEAR = 2013 def inspect_dgfip_variable(variable, year, browser_name): # Attention les liens changent entre la version simplifiée matched = re.match('^f[1-8][a-z]{2}', variable) assert matched is not None, 'Invalid variable: {}'.format(variable) section_number = variable[1] case = variable[2:4].upper() log.info(u"section %s, case %s", section_number, case) url_base = u"http://www3.finances.gouv.fr/calcul_impot/" + unicode(year + 1) + "/aides/" url_section = { '2': u"capitaux_mobiliers.htm", '3': u"gains_c.htm", '4': u"fonciers.htm", # '5': u"charges_s.htm", '6': u"charges.htm", '7': u"reductions.htm", '8': u"autres_imputations.htm", }.get(section_number) assert url_section is not None, 'Unhandled section number: {}'.format(section_number) url = url_base + url_section if section_number not in ('3', '4'): url += u'#' + case browser = webbrowser.get(browser_name) browser.open_new_tab(url) def main(): parser = argparse.ArgumentParser(description = __doc__) parser.add_argument('variable_name', help = u'Name of the variable to inspect. Example: "f7wr"') parser.add_argument('--browser', dest = 'browser_name', default = 'chromium', help = u'Open links in this browser') parser.add_argument('--min-year', default = None, help = u'Year to start from', type = int) parser.add_argument('--max-year', default = None, help = u'Year to stop to', type = int) parser.add_argument('-v', '--verbose', action = 'store_true', default = False, help = "Increase output verbosity") parser.add_argument('--year', default = None, help = u'Inspect the variable for the given year', type = int) args = parser.parse_args() logging.basicConfig(level = logging.DEBUG if args.verbose else logging.WARNING, stream = sys.stdout) if args.year and (args.min_year or args.max_year): parser.error(u'year and {min,max}-year arguments cannot be used together') if args.min_year or args.max_year: if args.min_year and args.max_year: for year in range(args.max_year, args.min_year, -1): try: inspect_dgfip_variable(args.variable_name, year, args.browser_name) except ValueError: log.error(u'Variable "%s" not found', args.variable_name) else: parser.error(u'Please give min and max year') else: year = args.year or DEFAULT_YEAR try: inspect_dgfip_variable(args.variable_name, year, args.browser_name) except ValueError: log.error(u'Variable "%s" not found', args.variable_name) if __name__ == '__main__': sys.exit(main()) PKF; .openfisca_france/scripts/reindent_xml_files.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . """Reindent XML files.""" import argparse import logging import os import sys import xml.etree.ElementTree as etree from openfisca_france import decompositions, param app_name = os.path.splitext(os.path.basename(__file__))[0] log = logging.getLogger(app_name) def indent(elem, level = 0): # cf http://effbot.org/zone/element-lib.htm i = "\n" + level * " " if len(elem): if not elem.text or not elem.text.strip(): elem.text = i + " " if not elem.tail or not elem.tail.strip(): elem.tail = i for elem in elem: indent(elem, level + 1) if not elem.tail or not elem.tail.strip(): elem.tail = i else: if level and (not elem.tail or not elem.tail.strip()): elem.tail = i def main(): parser = argparse.ArgumentParser(description = __doc__) parser.add_argument('-v', '--verbose', action = 'store_true', default = False, help = "increase output verbosity") args = parser.parse_args() logging.basicConfig(level = logging.DEBUG if args.verbose else logging.WARNING, stream = sys.stdout) for module in (decompositions, param): dir = os.path.dirname(module.__file__) for filename in os.listdir(dir): if not filename.endswith('.xml'): continue xml_file_path = os.path.join(dir, filename) try: tree = etree.parse(xml_file_path) except (AttributeError, etree.ParseError): log.exception(u'Ignoring "{}" because of a syntax error in XML'.format(xml_file_path)) continue root_element = tree.getroot() indent(root_element) with open(xml_file_path, 'w') as xml_file: xml_file.write(etree.tostring(root_element, encoding = 'utf-8')) return 0 if __name__ == "__main__": sys.exit(main()) PK'G+++0openfisca_france/scripts/measure_performances.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . """Measure performances of formulas calculations to compare to other OpenFisca implementations.""" import argparse import logging import sys import time import numpy as np from openfisca_core import periods, simulations from openfisca_core.tools import assert_near from openfisca_france import init_country args = None log = logging.getLogger(__name__) def add_member(entity, **variables_value_by_name): entity.count += 1 entity.step_size += 1 member_index = entity.count - 1 simulation = entity.simulation # Add a cell to all arrays of all variables of entity. for variable_name, variable_holder in entity.holder_by_name.iteritems(): column = variable_holder.column if column.is_permanent: variable_holder._array = np.hstack((variable_holder._array, [column.default])) else: array_by_period = variable_holder._array_by_period if array_by_period is None: variable_holder._array_by_period = array_by_period = {} for period, array in array_by_period.iteritems(): array_by_period[period] = np.hstack((array, [column.default])) # When entity is a person, ensure that the index & role of the person in the other entities are set. value_by_name = variables_value_by_name.copy() if entity.is_persons_entity: for other_entity in simulation.entity_by_key_singular.itervalues(): if not other_entity.is_persons_entity: assert other_entity.count > 0 value_by_name.setdefault(other_entity.index_for_person_variable_name, other_entity.count - 1) role = value_by_name.get(other_entity.role_for_person_variable_name) assert role is not None, "Missing role {} in person arguments: {}".format( other_entity.role_for_person_variable_name, value_by_name) if role >= other_entity.roles_count: other_entity.roles_count = role + 1 # Set arguments in variables. for variable_name, value in value_by_name.iteritems(): variable_holder = entity.get_or_new_holder(variable_name) column = variable_holder.column if isinstance(value, dict): for period, period_value in value.iteritems(): array = variable_holder.get_array(period) if array is None: array = np.empty(entity.count, dtype = column.dtype) array.fill(column.default) variable_holder.set_array(period, array) array[member_index] = period_value else: period = simulation.period array = variable_holder.get_array(period) if array is None: array = np.empty(entity.count, dtype = column.dtype) array.fill(column.default) variable_holder.set_array(period, array) array[member_index] = value return member_index def timeit(method): def timed(*args, **kwargs): start_time = time.time() result = method(*args, **kwargs) # print '%r (%r, %r) %2.9f s' % (method.__name__, args, kw, time.time() - start_time) print '{:2.6f} s'.format(time.time() - start_time) return result return timed TaxBenefitSystem = init_country() tax_benefit_system = TaxBenefitSystem() @timeit def test_irpp(year, irpp, **variables_value_by_name): simulation = simulations.Simulation(period = periods.period(year), tax_benefit_system = tax_benefit_system, debug = args.verbose) famille = simulation.entity_by_key_singular['famille'] foyer_fiscal = simulation.entity_by_key_singular['foyer_fiscal'] individu = simulation.entity_by_key_singular['individu'] menage = simulation.entity_by_key_singular['menage'] # Dispatch arguments to their respective entities. variables_value_by_name_by_entity = {} for variable_name, value in variables_value_by_name.iteritems(): variable_holder = simulation.get_or_new_holder(variable_name) entity_variables_value_by_name = variables_value_by_name_by_entity.setdefault(variable_holder.entity, {}) entity_variables_value_by_name[variable_name] = value add_member(famille, **variables_value_by_name_by_entity.get(famille, {})) add_member(foyer_fiscal, **variables_value_by_name_by_entity.get(foyer_fiscal, {})) add_member(menage, **variables_value_by_name_by_entity.get(menage, {})) add_member(individu, quifam = 1, quifoy = 1, quimen = 1, **variables_value_by_name_by_entity.get(individu, {})) assert_near(simulation.calculate('irpp'), irpp, absolute_error_margin = 0.51) def main(): parser = argparse.ArgumentParser(description = __doc__) parser.add_argument('-v', '--verbose', action = 'store_true', default = False, help = "increase output verbosity") global args args = parser.parse_args() logging.basicConfig(level = logging.DEBUG if args.verbose else logging.WARNING, stream = sys.stdout) print 'salaire_imposable' test_irpp(2010, -1181, salaire_imposable = 20000) test_irpp(2010, -7934, salaire_imposable = 50000) test_irpp(2010, -42338, salaire_imposable = 150000) test_irpp(2011, -1181, salaire_imposable = 20000) test_irpp(2011, -7934, salaire_imposable = 50000) test_irpp(2011, -42338, salaire_imposable = 150000) test_irpp(2012, -1181, salaire_imposable = 20000) test_irpp(2012, -7934, salaire_imposable = 50000) test_irpp(2012, -43222, salaire_imposable = 150000) test_irpp(2013, -1170, salaire_imposable = 20000) test_irpp(2013, -7889, salaire_imposable = 50000) test_irpp(2013, -43076, salaire_imposable = 150000) print 'rst' test_irpp(2010, -1181, rst = 20000) test_irpp(2010, -8336, rst = 50000) test_irpp(2010, -46642, rst = 150000) test_irpp(2011, -1181, rst = 20000) test_irpp(2011, -8336, rst = 50000) test_irpp(2011, -46642, rst = 150000) test_irpp(2012, -1181, rst = 20000) test_irpp(2012, -8336, rst = 50000) test_irpp(2012, -46642, rst = 150000) test_irpp(2013, -1170, rst = 20000) test_irpp(2013, -8283, rst = 50000) test_irpp(2013, -46523, rst = 150000) print 'f2da' test_irpp(2010, 0, f2da = 20000) test_irpp(2010, 0, f2da = 50000) test_irpp(2010, 0, f2da = 150000) test_irpp(2011, 0, f2da = 20000) test_irpp(2011, 0, f2da = 50000) test_irpp(2011, 0, f2da = 150000) test_irpp(2012, 0, f2da = 20000) test_irpp(2012, 0, f2da = 50000) test_irpp(2012, 0, f2da = 150000) # test_irpp(2013, 0, f2da = 20000) # test_irpp(2013, 0, f2da = 50000) # test_irpp(2013, 0, f2da = 150000) print 'f2dc' test_irpp(2010, 0, f2dc = 20000) test_irpp(2010, -2976, f2dc = 50000) test_irpp(2010, -22917, f2dc = 150000) test_irpp(2011, 0, f2dc = 20000) test_irpp(2011, -2976, f2dc = 50000) test_irpp(2011, -22917, f2dc = 150000) test_irpp(2012, 0, f2dc = 20000) test_irpp(2012, -3434, f2dc = 50000) test_irpp(2012, -23542, f2dc = 150000) # test_irpp(2013, 0, f2dc = 20000) # test_irpp(2013, 0, f2dc = 50000) # test_irpp(2013, 0, f2dc = 150000) print 'f2dh' test_irpp(2010, 345, f2dh = 20000) test_irpp(2010, 345, f2dh = 50000) test_irpp(2010, 345, f2dh = 150000) test_irpp(2011, 345, f2dh = 20000) test_irpp(2011, 345, f2dh = 50000) test_irpp(2011, 345, f2dh = 150000) test_irpp(2012, 345, f2dh = 20000) test_irpp(2012, 345, f2dh = 50000) test_irpp(2012, 345, f2dh = 150000) test_irpp(2013, 345, f2dh = 20000) test_irpp(2013, 345, f2dh = 50000) test_irpp(2013, 345, f2dh = 150000) print 'f2tr' test_irpp(2010, -1461, f2tr = 20000) test_irpp(2010, -9434, f2tr = 50000) test_irpp(2010, -48142, f2tr = 150000) test_irpp(2011, -1461, f2tr = 20000) test_irpp(2011, -9434, f2tr = 50000) test_irpp(2011, -48142, f2tr = 150000) test_irpp(2012, -1461, f2tr = 20000) test_irpp(2012, -9434, f2tr = 50000) test_irpp(2012, -48142, f2tr = 150000) test_irpp(2013, -1450, f2tr = 20000) test_irpp(2013, -9389, f2tr = 50000) test_irpp(2013, -48036, f2tr = 150000) print 'f2ts' test_irpp(2010, -1461, f2ts = 20000) test_irpp(2010, -9434, f2ts = 50000) test_irpp(2010, -48142, f2ts = 150000) test_irpp(2011, -1461, f2ts = 20000) test_irpp(2011, -9434, f2ts = 50000) test_irpp(2011, -48142, f2ts = 150000) test_irpp(2012, -1461, f2ts = 20000) test_irpp(2012, -9434, f2ts = 50000) test_irpp(2012, -48142, f2ts = 150000) test_irpp(2013, -1450, f2ts = 20000) test_irpp(2013, -9389, f2ts = 50000) test_irpp(2013, -48036, f2ts = 150000) print 'f3vg' test_irpp(2010, -3600, f3vg = 20000) test_irpp(2010, -9000, f3vg = 50000) test_irpp(2010, -27000, f3vg = 150000) test_irpp(2011, -3800, f3vg = 20000) test_irpp(2011, -9500, f3vg = 50000) test_irpp(2011, -28500, f3vg = 150000) test_irpp(2012, -4800, f3vg = 20000) test_irpp(2012, -12000, f3vg = 50000) test_irpp(2012, -36000, f3vg = 150000) test_irpp(2013, -1450, f3vg = 20000) test_irpp(2013, -9389, f3vg = 50000) test_irpp(2013, -48036, f3vg = 150000) print 'f3vz' # test_irpp(2010, 0, f3vz = 20000) # test_irpp(2010, 0, f3vz = 50000) # test_irpp(2010, 0, f3vz = 150000) test_irpp(2011, 0, f3vz = 20000) test_irpp(2011, 0, f3vz = 50000) test_irpp(2011, 0, f3vz = 150000) test_irpp(2012, 0, f3vz = 20000) test_irpp(2012, 0, f3vz = 50000) test_irpp(2012, 0, f3vz = 150000) test_irpp(2013, 0, f3vz = 20000) test_irpp(2013, 0, f3vz = 50000) test_irpp(2013, 0, f3vz = 150000) print 'f4ba' test_irpp(2010, -1461, f4ba = 20000) test_irpp(2010, -9434, f4ba = 50000) test_irpp(2010, -48142, f4ba = 150000) test_irpp(2011, -1461, f4ba = 20000) test_irpp(2011, -9434, f4ba = 50000) test_irpp(2011, -48142, f4ba = 150000) test_irpp(2012, -1461, f4ba = 20000) test_irpp(2012, -9434, f4ba = 50000) test_irpp(2012, -48142, f4ba = 150000) test_irpp(2013, -1450, f4ba = 20000) test_irpp(2013, -9389, f4ba = 50000) test_irpp(2013, -48036, f4ba = 150000) if __name__ == "__main__": sys.exit(main()) PK'G~*  1openfisca_france/scripts/calculate_all_columns.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import datetime import numpy as np import openfisca_france TaxBenefitSystem = openfisca_france.init_country() tax_benefit_system = TaxBenefitSystem() def check_1_parent(year = 2013): simulation = tax_benefit_system.new_scenario().init_single_entity( axes = [ dict( count = 3, name = 'salaire_imposable', max = 100000, min = 0, ), ], period = year, parent1 = dict(birth = datetime.date(year - 40, 1, 1)), ).new_simulation(debug = True) simulation.calculate('revdisp') salaire_imposable = simulation.get_holder('salaire_imposable').new_test_case_array(simulation.period) assert (salaire_imposable - np.linspace(0, 100000, 3) == 0).all(), 'salaire_imposable: {}'.format(salaire_imposable) def test_1_parent(): for year in range(2002, 2015): yield check_1_parent, year def check_1_parent_2_enfants(year): simulation = tax_benefit_system.new_scenario().init_single_entity( axes = [ dict( count = 3, name = 'salaire_imposable', max = 24000, min = 0, ), ], period = year, parent1 = dict( activite = u'Actif occupé', birth = 1970, statmarit = u'Célibataire', ), enfants = [ dict( activite = u'Étudiant, élève', birth = '1992-02-01', ), dict( activite = u'Étudiant, élève', birth = '1990-04-17', ), ], ).new_simulation(debug = True) salaire_imposable = simulation.get_holder('salaire_imposable').new_test_case_array(simulation.period) assert (salaire_imposable - np.linspace(0, 24000, 3) == 0).all(), 'salaire_imposable: {}'.format(salaire_imposable) simulation.calculate('revdisp') def test_1_parent_2_enfants(): for year in range(2002, 2015): yield check_1_parent_2_enfants, year def check_1_parent_2_enfants_1_column(column_name, year): simulation = tax_benefit_system.new_scenario().init_single_entity( axes = [ dict( count = 3, name = 'salaire_imposable', max = 24000, min = 0, ), ], period = year, parent1 = dict( activite = u'Actif occupé', birth = 1970, statmarit = u'Célibataire', ), enfants = [ dict( activite = u'Étudiant, élève', birth = '1992-02-01', ), dict( activite = u'Étudiant, élève', birth = '1990-04-17', ), ], ).new_simulation(debug = True) simulation.calculate(column_name) def test_1_parent_2_enfants_1_column(): for column_name, column in tax_benefit_system.column_by_name.iteritems(): if not column.survey_only: for year in range(2006, 2015): yield check_1_parent_2_enfants_1_column, column_name, year if __name__ == '__main__': import logging import sys logging.basicConfig(level = logging.ERROR, stream = sys.stdout) check_1_parent() test_1_parent() test_1_parent_2_enfants() test_1_parent_2_enfants_1_column() PKF``Gopenfisca_france/scripts/calculateur_impots/extraction_champs_impots.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . """Use finances.gouv.fr web simulator as an API to compute income taxes.""" import argparse import collections import logging import os import sys import urllib2 from lxml import etree app_name = os.path.splitext(os.path.basename(__file__))[0] log = logging.getLogger(app_name) def main(): parser = argparse.ArgumentParser(description = __doc__) parser.add_argument('-v', '--verbose', action = 'store_true', default = False, help = "increase output verbosity") args = parser.parse_args() logging.basicConfig(level = logging.DEBUG if args.verbose else logging.WARNING, stream = sys.stdout) request = urllib2.Request('http://www3.finances.gouv.fr/calcul_impot/2014/simplifie/calc_s_data.htm', headers = { 'User-Agent': 'OpenFisca-Script', }) response = urllib2.urlopen(request) page_doc = etree.parse(response, etree.HTMLParser()) fields = collections.OrderedDict() for element in page_doc.xpath('//*[@name]'): tag = element.tag.lower() if tag in ('a', 'form'): continue assert tag == 'input', tag # field = collections.OrderedDict( # (attribute_name, attribute_value) # for attribute_name, attribute_value in attributes.iteritems() # if attribute_value # ) attributes = element.attrib name = attributes['name'] type = attributes['type'] if type in ('checkbox', 'radio'): existing_field = fields.get(name) if existing_field is None: field = collections.OrderedDict( (attribute_name, attribute_value) for attribute_name, attribute_value in attributes.iteritems() if attribute_value ) if field.pop('checked', False): field['default'] = field['value'] field['values'] = [field.pop('value')] fields[name] = field else: value = attributes['value'] for attribute_name, attribute_value in attributes.iteritems(): if attribute_name == 'value': continue if attribute_name == 'checked': existing_field['default'] = value continue assert existing_field.get(attribute_name) == attribute_value, etree.tostring(element) existing_field['values'].append(value) else: assert type in ('hidden', 'text'), type assert name not in fields, name fields[name] = collections.OrderedDict( (attribute_name, attribute_value) for attribute_name, attribute_value in attributes.iteritems() if attribute_value ) import json print json.dumps(fields, encoding = 'utf-8', ensure_ascii = False, indent = 2) return 0 if __name__ == "__main__": sys.exit(main()) PKF7openfisca_france/scripts/calculateur_impots/__init__.pyPK'Gˍyy<openfisca_france/scripts/calculateur_impots/generate_json.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # ########## DESCRIPTION ############ # Ce programme contient export_json, utilisé par d'autres scripts pour écrire un fichier .json contenant un scenario # et le résultat de la simulation officielle (DGFiP) correspondant si le fichier n'existe pas déjà, et qui compare # ensuite le résultat d'OpenFisca avec le résultat officiel import codecs import hashlib import json import os import sys from ..scripts.compare_openfisca_impots import compare from . import base def define_scenario(year = 2013): scenario = base.tax_benefit_system.new_scenario() scenario.init_single_entity( period = year, parent1 = dict( activite = u'Actif occupé', birth = 1970, salaire_imposable = 24000, statmarit = u'Célibataire', ), enfants = [ dict( activite = u'Étudiant, élève', birth = '2002-02-01', ), dict( activite = u'Étudiant, élève', birth = '2000-04-17', ), ], foyer_fiscal = dict( f8ta = 3000, ), ) scenario.suggest() return scenario def add_official(scenario, fichier, tested = False): json_scenario = scenario.to_json() fields = compare(scenario, tested, fichier) return {'scenario': json_scenario, 'resultat_officiel': fields} def export_json(scenario, var = "", tested = True): # On peut passer un scenario en entrée, ou un scenario assorti d'une # variable : dans ce cas le scenario est créé par create_json_then_test json_scenario = scenario.to_json() string_scenario = json.dumps(json_scenario, encoding='utf-8', ensure_ascii=False, indent=2, sort_keys=True) h = var + '-' + hashlib.sha256(string_scenario).hexdigest() h2 = var + '-' + str(scenario.period.date.year) + '-' + hashlib.sha256(string_scenario).hexdigest() # Le fichier de sortie est nommé : # [variable éventuelle]-[année du scénario (sauf pour .json créés avant 05/14)]-[Hash du scenario] if not (os.path.isfile(os.path.join('json', h + '.json')) or os.path.isfile(os.path.join('json', h2 + '.json'))): # TODO: scenario > single entity with codecs.open(os.path.join('json', h2 + '.json'), 'w', encoding = 'utf-8') as fichier: json.dump(add_official(scenario, h2, tested), fichier, encoding = 'utf-8', ensure_ascii = False, indent = 2, sort_keys = True) elif os.path.isfile(os.path.join('json', h + '.json')): compare(scenario, tested, h) else: compare(scenario, tested, h2) def main(): scenario = define_scenario() export_json(scenario) if __name__ == "__main__": sys.exit(main()) PKFw1p%%3openfisca_france/scripts/calculateur_impots/base.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . """Tools to use income taxes calculator from finances.gouv.fr web site.""" import urllib import urllib2 __all__ = [ 'call_tax_calculator', 'openfisca_variable_name_by_tax_calculator_code', 'transform_scenario_to_tax_calculator_inputs', ] openfisca_variable_name_by_tax_calculator_code = dict( AVFISCOPTER = None, BCSG = None, BPRS = None, BRDS = None, CIADCRE = None, CICA = None, CICORSE = None, CIDEPENV = None, CIDEVDUR = None, CIGARD = None, CIGE = None, CIHABPRIN = None, CIMOBIL = None, CIPERT = None, CIPRETUD = None, CIRCM = None, CIRELANCE = None, CITEC = None, I2DH = None, IAVF2 = None, IAVIM = u'iai', IDEC = u'decote', IDRS2 = u'ir_plaf_qf', IINET = None, IINETIR = u'irpp', IPROP = None, IREST = None, IRESTIR = u'irpp', IRETS = None, ITRED = u'reductions', NAPCR = None, NAPCRP = None, NAPCS = None, NAPPS = None, NAPRD = None, NBP = u'nbptr', NBPT = u'nbptr', PERPPLAFTC = None, PERPPLAFTP = None, PERPPLAFTV = None, PPETOT = u'ppe', RAA = None, RAH = None, RAIDE = None, RCEL = None, RCEL2012 = None, RCELCOM = None, RCELFABC = None, RCELFD = None, RCELHJK = None, RCELHL = None, RCELHM = None, RCELHNO = None, RCELHR = None, RCELJBGL = None, RCELJOQR = None, RCELJP = None, RCELLIER = None, RCELNBGL = None, RCELNQ = None, RCELREPGJ = None, RCELREPGK = None, RCELREPGL = None, RCELREPGP = None, RCELREPGS = None, RCELREPGT = None, RCELREPGU = None, RCELREPGV = None, RCELREPGW = None, RCELREPGX = None, RCELREPHA = None, RCELREPHB = None, RCELREPHD = None, RCELREPHE = None, RCELREPHF = None, RCELREPHG = None, RCELREPHH = None, RCELREPHR = None, RCELREPHS = None, RCELREPHT = None, RCELREPHU = None, RCELREPHV = None, RCELREPHW = None, RCELREPHX = None, RCELREPHZ = None, RCELRRED09 = None, RCELRREDLA = None, RCELRREDLB = None, RCELRREDLC = None, RCELRREDLD = None, RCELRREDLE = None, RCELRREDLF = None, RCELRREDLM = None, RCELRREDLS = None, RCELRREDLZ = None, RCELRREDMG = None, RCINE = None, RCODELOP = None, RCODJT = None, RCODJU = None, RCODJV = None, RCODJW = None, RCODJX = None, RCOLENT = None, RCONS = None, RCOTFOR = None, RDIFAGRI = None, RDONS = None, RDUFLOGIH = None, REI = None, REVKIRE = u'rfr', RFCPI = None, RFIPC = None, RFOR = None, RFORET = None, RHEBE = None, RIDOMENT = None, RIDOMPROE1 = None, RIDOMPROE2 = None, RIDOMPROE3 = None, RIDOMPROE4 = None, RIDOMPROE5 = None, RILMIA = None, RILMIB = None, RILMIC = None, RILMIH = None, RILMIX = None, RILMIZ = None, RILMJI = None, RILMJS = None, RILMJV = None, RILMJW = None, RILMJX = None, RINNO = None, RINVDOMTOMLG = None, RINVRED = None, RLOCIDEFG = None, RLOGDOM = None, RMEUBLE = None, RNI = None, RNICOL = u'rni', RNOUV = None, RPATNAT = None, RPATNATOT = None, RPECHE = None, RPRESCOMPREP = None, RPROREP = None, RRBG = u'rbg', RRDOM = None, RREDMEUB = None, RREDREP = None, RREPA = None, RREPMEU = None, RREPNPRO = None, RRESIMEUB = None, RRESINEUV = None, RRESIVIEU = None, RRESTIMO = None, RRIRENOV = None, RRPRESCOMP = None, RSOCREPR = None, RSOUFIP = None, RSURV = None, RTELEIR = None, RTITPRISE = None, RTOUHOTR = None, RTOUR = None, RTOUREPA = None, RTOURES = None, RTOURHOT = None, RTOURNEUF = None, RTOURREP = None, RTOURTRA = None, TEFF = None, TOTPAC = None, # Nombre de personnes à charge dans le foyer fiscal TXMARJ = None, TXMOYIMP = None, ) def call_tax_calculator(year, inputs): url = 'http://www3.finances.gouv.fr/cgi-bin/calc-{}.cgi'.format(year) request = urllib2.Request(url, headers = { 'User-Agent': 'OpenFisca-Script', }) response = urllib2.urlopen(request, urllib.urlencode([ (name, str(value)) for name, value in inputs.iteritems() ])) response_html = response.read() if 'Erreur' in response_html: raise Exception(u"Erreur : {}".format(response_html.decode('iso-8859-1')).encode('utf-8')) return response_html def transform_scenario_to_tax_calculator_inputs(scenario): tax_benefit_system = scenario.tax_benefit_system test_case = scenario.test_case impots_arguments = { 'pre_situation_residence': 'M', # Métropole } individu_by_id = { individu['id']: individu for individu in test_case['individus'] } for foyer_fiscal in test_case['foyers_fiscaux']: foyer_fiscal = foyer_fiscal.copy() for declarant_index, declarant_id in enumerate(foyer_fiscal.pop('declarants')): declarant = individu_by_id[declarant_id].copy() birth = declarant.pop('birth') impots_arguments['0D{}'.format(chr(ord('A') + declarant_index))] = birth.year statmarit = declarant.pop('statmarit', None) column = tax_benefit_system.column_by_name['statmarit'] if statmarit is None: statmarit = column.enum._vars[column.default] pre_situation_famille = { u"Marié": 'M', u"Célibataire": 'C', u"Divorcé": 'D', u"Veuf": 'V', u"Pacsé": 'O', # u"Jeune veuf": TODO }[statmarit if isinstance(statmarit, basestring) else column.enum._vars[statmarit]] assert 'pre_situation_famille' not in impots_arguments \ or impots_arguments['pre_situation_famille'] == pre_situation_famille, str((impots_arguments, pre_situation_famille)) impots_arguments['pre_situation_famille'] = pre_situation_famille for column_code, value in declarant.iteritems(): if column_code in ( 'activite', 'cadre', 'id', ): continue column = tax_benefit_system.column_by_name[column_code] cerfa_field = column.cerfa_field assert cerfa_field is not None and isinstance(cerfa_field, dict), column_code impots_arguments[cerfa_field[declarant_index]] = value impots_arguments['0CF'] = len(foyer_fiscal['personnes_a_charge']) for personne_a_charge_index, personne_a_charge_id in enumerate(foyer_fiscal.pop('personnes_a_charge')): personne_a_charge = individu_by_id[personne_a_charge_id].copy() birth = personne_a_charge.pop('birth') impots_arguments['0F{}'.format(personne_a_charge_index)] = birth.year personne_a_charge.pop('statmarit', None) for column_code, value in personne_a_charge.iteritems(): if column_code in ( 'activite', 'cadre', 'id', ): continue column = tax_benefit_system.column_by_name[column_code] cerfa_field = column.cerfa_field assert cerfa_field is not None and isinstance(cerfa_field, dict), column_code impots_arguments[cerfa_field[personne_a_charge_index]] = value if foyer_fiscal.pop('caseT', False): impots_arguments['0BT'] = '1' for column_code, value in foyer_fiscal.iteritems(): if column_code == 'id': continue if column_code == 'f7uf': impots_arguments['7UG'] = str(value) # bug dans le site des impots if column_code == 'f7ud': impots_arguments['7UE'] = str(value) # bug dans le site des impots if column_code == 'f7vc': impots_arguments['7VD'] = str(value) # bug dans le site des impots column = tax_benefit_system.column_by_name[column_code] cerfa_field = column.cerfa_field assert cerfa_field is not None and isinstance(cerfa_field, basestring), column_code impots_arguments[cerfa_field] = int(value) if isinstance(value, bool) else value return impots_arguments PKFπSL,L,=openfisca_france/scripts/calculateur_impots/request_impots.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . ########### DESCRIPTION ############ ## Ce script affiche le résultat de la simulation officielle (DGFiP) en renseignant les champs CERFA_FIELDS ## On peut choisir d'afficher seulement certaines variables en décommentant la ligne 254 import collections import cStringIO import json import os import sys import urllib import urllib2 from lxml import etree def main(): year = 2013 impots_arguments = { 'pre_situation_residence': 'M', # Métropole '0DA': 1970, # '0DB': 1970, 'pre_situation_famille': 'C', # '0CF': 2, # nombre de personnes à charge # '0F1': 1990, # âge de la première personne à charge # '0BT': 1, # case T '1AJ': 48000, # '5HO': 10000, '5NK': 5000 } request = urllib2.Request('http://www3.finances.gouv.fr/cgi-bin/calc-' + str(year + 1) + '.cgi', headers = { 'User-Agent': 'OpenFisca-Script', }) response = urllib2.urlopen(request, urllib.urlencode(impots_arguments)) response_html = response.read() if 'Erreur' in response_html: raise Exception(u"Erreur : {}".format(response_html.decode('iso-8859-1')).encode('utf-8')) page_doc = etree.parse(cStringIO.StringIO(response_html), etree.HTMLParser()) fields = collections.OrderedDict() names = { # Sert à afficher le nom des variables retournées par le script #TODO: mutualiser ce dictionnaire avec compare_openfisca_impots, qui contient le même 'CIGE': u'Crédit aides aux personnes', 'CIRELANCE': u'Crédit d\'impôt exceptionnel sur les revenus 2008', 'IAVIM': u'Impôt avant imputations', 'IDEC': u'Décote', 'IDRS2': u'Droits simples', 'IINET': u'Montant net à payer', 'IINETIR': u'Impôt sur le revenu net', 'IREST': u'Montant net à restituer', 'IRESTIR': u'Impôt sur le revenu net', 'ITRED': u'Total des réductions d\'impôt', 'I2DH': u'Prélèvement libératoire de 7,5%', 'NAPCRP': u'Montant net des prélèvements sociaux (sur revenu du patrimoine et revenus d\'activité et' u' de remplacement', 'NBPT': u'Nombre de parts', 'NBP': u'Nombre de parts', 'PERPPLAFTV': u'Plafond de déduction pour les revenus 2014 au titre de l\'épargne retraite, pour déclarant 1', 'PPETOT': u'Prime pour l\'emploi', 'REVKIRE': u'Revenu fiscal de référence', 'RNICOL': u'Revenu net imposable ou déficit à reporter', 'RRBG': u'Revenu brut global ou déficit', 'TEFF': u'?',#TODO (ebnc_impo) 'TOTPAC': u'Nombre de personnes à charge', 'TXMARJ': u'Taux marginal d\'imposition', 'TXMOYIMP': u'Taux moyen d\'imposition', 'IRETS' : u'?',#TODO 'RNI': u'?',#TODO 'AVFISCOPTER': u'?',#TODO (f8tf) 'BCSG': u'Base CSG', 'BRDS': u'Base CRDS', 'BPRS': u'Base prélèvement social et contributions annexes', 'NAPCS': u'Montant net CSG', 'NAPRD': u'Montant net CRDS', 'NAPPS': u'Montant net prélèvement social et contributions annexes', 'CIRCM': u'?',#TODO (f2dc) 'CICA': u'?',#TODO (f4tq) 'CICORSE': u'?',#TODO (f8to) 'CIDEPENV': u'?',#TODO (f7sz) 'CIGARD': u'?',#TODO (f7ga) 'CIHABPRIN': u'?',#TODO (f7vy) 'CIPRETUD': u'?',#TODO (f7uk) 'CITEC': u'?',#TODO (f7wr) 'CIDEVDUR': u'?',#TODO (f7wf) 'CIADCRE': u'?',#TODO (f7dg) 'CIMOBIL': u'?',#TODO (f1ar) 'CIPERT': u'?',#TODO (f3vv) 'IAVF2': u'?',#TODO (f8th) 'IPROP': u'Impôt proportionnel', 'RFOR': u'?',#TODO (f7up) 'PERPPLAFTC': u'?',#TODO (f2ch, f2dh, marpac) 'RHEBE': u'?',#TODO (7ce) 'RAA': u'?',#TODO (7ud) 'RAH': u'?',#TODO (7ce) 'RAIDE': u'?',#TODO (7df) 'RCEL': u'?',#TODO (scellier) 'RCELHJK': u'?',#TODO (scellier) 'RCELHNO': u'?',#TODO (7hn) 'RCELHM': u'?',#TODO (7hm) 'RCELHR': u'?',#TODO (7hr) 'RCELREPHS': u'?',#TODO (7hs) 'RCELRRED09': u'?',#TODO (7la) 'RCELRREDLD': u'?',#TODO (7ld) 'RCELRREDLE': u'?',#TODO (7le) 'RCELRREDLF': u'?',#TODO (7lf) 'RCELRREDLM': u'?',#TODO (7lm) 'RCELRREDMG': u'?',#TODO (7mg) 'RCELREPHR': u'?',#TODO (scellier) 'RCELRREDLA': u'?',#TODO (scellier) 'RCELRREDLS': u'?',#TODO (7ls) 'RCELREPGJ': u'?',#TODO (7gj) 'RCELREPGK': u'?',#TODO (7gk) 'RCELREPGL': u'?',#TODO (7gl) 'RCELREPGW': u'?',#TODO (f7gw) 'RCELREPGX': u'?',#TODO (f7gx) 'RCELFD': u'?',#TODO (f7fd) 'RCELRREDLB': u'?',#TODO (f7lb) 'RCELRREDLC': u'?',#TODO (f7lc) 'RCELRREDLZ': u'?',#TODO (f7lz) 'RCONS': u'?',#TODO (7uh) 'RCODELOP': u'?',#TODO (7uh) 'RCOLENT': u'?',#TODO (7ls) 'RDIFAGRI': u'?',#TODO (7um) 'RDONS': u'?',#TODO (7uf) 'RDUFLOGIH': u'?',#TODO (7gh) 'REI': u'?',#TODO (f8tf) 'RFORET': u'?',#TODO (f7uc) 'RINVDOMTOMLG': u'?',#TODO (f7ui) 'RTELEIR': u'?',#TODO (7ul) 'RCOTFOR': u'?',#TODO (7ul) 'RCELLIER': u'?',#TODO (7hk) 'RCELCOM': u'?',#TODO (7np) 'RCELJP': u'?',#TODO (7jp) 'RCELHL': u'?',#TODO (7hl) 'RCELJOQR': u'?',#TODO (7jo) 'RCELNQ': u'?',#TODO (7nq) 'RCELREPGP': u'?',#TODO (7gp) 'RCELREPGS': u'?',#TODO (7gs) 'RCELREPGU': u'?',#TODO (7gu) 'RCELREPGT': u'?',#TODO (7gt) 'RCELREPGV': u'?',#TODO (7gv) 'RCELREPHA': u'?',#TODO (7ha) 'RCELREPHB': u'?',#TODO (7hb) 'RCELREPHD': u'?',#TODO (7hd) 'RCELREPHE': u'?',#TODO (7he) 'RCELREPHF': u'?',#TODO (7hf) 'RCELREPHG': u'?',#TODO (7hg) 'RCELREPHH': u'?',#TODO (7hh) 'RCELREPHT': u'?',#TODO (7ht) 'RCELREPHU': u'?',#TODO (7hu) 'RCELREPHV': u'?',#TODO (7hv) 'RCELREPHW': u'?',#TODO (7hw) 'RCELREPHX': u'?',#TODO (7hx) 'RCELREPHZ': u'?',#TODO (7hz) 'RCELFABC': u'?',#TODO (7fa) 'RCEL2012': u'?',#TODO (7ja) 'RCELJBGL': u'?',#TODO (7jb) 'RLOCIDEFG': u'?',#TODO (7id) 'RRESINEUV': u'?',#TODO (7ij) 'RCELNBGL': u'?',#TODO (7nb) 'RFCPI': u'?',#TODO (7gq) 'RFIPC': u'?',#TODO (7fm) 'RILMIA': u'?',#TODO (7ia) 'RILMIB': u'?',#TODO (7ib) 'RILMIC': u'?',#TODO (7ic) 'RILMIH': u'?',#TODO (7ih) 'RINNO': u'?',#TODO (7gq) 'RCINE': u'?',#TODO (7gn) 'RIDOMENT': u'?',#TODO (7ur) 'RIDOMPROE1': u'?',#TODO (f7sz) 'RIDOMPROE2': u'?',#TODO (f7qz) 'RIDOMPROE3': u'?',#TODO (f7qz) 'RIDOMPROE4': u'?',#TODO (f7oz) 'RIDOMPROE5': u'?',#TODO (f7oz) 'RLOGDOM': u'?',#TODO (f7qd) 'RNOUV': u'?',#TODO (cappme) 'RPATNAT': u'?',#TODO (7ka) 'RPATNATOT': u'?',#TODO (7ka) 'RRDOM': u'?',#TODO (7ub) 'RRESTIMO': u'?',#TODO (7rd) 'RRESIVIEU': u'?',#TODO (7im) 'RMEUBLE': u'?',#TODO (7ik) 'RREDMEUB': u'?',#TODO (7is) 'RREPA': u'?',#TODO (7ud) 'RRPRESCOMP': u'?',#TODO (7wp) 'RRESIMEUB': u'?',#TODO (7io) 'RREPMEU': u'?',#TODO (7ip) 'RINVRED': u'?',#TODO (7it) 'RREDREP': u'?',#TODO (7iu) 'RILMIX': u'?',#TODO (7ix) 'RILMIZ': u'?',#TODO (7iz) 'RILMJI': u'?',#TODO (7ji) 'RILMJS': u'?',#TODO (7ji) 'RCODJT': u'?',#TODO (7jt) 'RCODJU': u'?',#TODO (7jt) 'RCODJV': u'?',#TODO (7jv) 'RCODJW': u'?',#TODO (7jw) 'RCODJX': u'?',#TODO (7jx) 'RPRESCOMPREP': u'?',#TODO (7wp) 'RCELRREDLM': u'?',#TODO 'RRIRENOV': u'?',#TODO (7nz) 'RFIPC': u'?',#TODO 'RILMJX': u'?',#TODO 'RILMJV': u'?',#TODO 'RCELREPHG': u'?',#TODO 'RILMJW': u'?',#TODO 'RCELREPGV': u'?',#TODO 'RCELRREDMG': u'?',#TODO 'RSOCREPR': u'?',#TODO (7fh) 'RSOUFIP': u'?',#TODO (7fq) 'RSURV': u'?',#TODO (7gz) 'RTITPRISE': u'?',#TODO (7cu) 'RTOURNEUF': u'?', #TODO (f7xc) 'RTOURREP': u'?', #TODO (7xi) 'RTOUREPA': u'?', #TODO (7xj) 'RTOUHOTR': u'?', #TODO (7xk) 'RTOUR': u'?',#TODO (f7xd) 'RTOURTRA': u'?',#TODO (f7xc) 'RTOURHOT': u'?',#TODO (f7xc) 'RTOURES': u'?',#TODO (f7xc) } for element in page_doc.xpath('//input[@type="hidden"][@name]'): code = element.get('name') fields[code] = { 'code' : code, 'name' : names[code] if (code in names) else u'nom inconnu', 'value' : float(element.get('value').replace(" ","")), } # for code in ('ITRED',): print u'{} : {} ({})'.format(code, fields[code]['value'], fields[code]['name']).encode('utf-8') if __name__ == "__main__": # sys.exit(main()) main() PKFpp<openfisca_france/scripts/calculateur_impots/calcul_impots.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . """Use finances.gouv.fr web simulator as an API to compute income taxes.""" import argparse import collections import logging import os import sys import urllib import urllib2 from lxml import etree app_name = os.path.splitext(os.path.basename(__file__))[0] log = logging.getLogger(app_name) def main(): parser = argparse.ArgumentParser(description = __doc__) parser.add_argument('-v', '--verbose', action = 'store_true', default = False, help = "increase output verbosity") args = parser.parse_args() logging.basicConfig(level = logging.DEBUG if args.verbose else logging.WARNING, stream = sys.stdout) request = urllib2.Request('http://www3.finances.gouv.fr/cgi-bin/calc-2014.cgi', headers = { 'User-Agent': 'OpenFisca-Script', }) response = urllib2.urlopen(request, urllib.urlencode([ ('0DA', '1965'), ('1AJ', '15000'), ('pre_situation_famille', 'C'), ('pre_situation_residence', 'M'), # ('simplifie', '1'), ])) page_doc = etree.parse(response, etree.HTMLParser()) fields = collections.OrderedDict() # fieldsOpenFisca = collections.OrderedDict() # def fillFields(code, value): # if code == 'IAVIM': # # Impôt avant imputations # fieldsOpenFisca['iai']=value # elif code == 'IDEC': # # Décote # fieldsOpenFisca['decote']=value # elif code == 'IDRS2': # # Droits simples # fieldsOpenFisca['ir_plaf_qf']=value # elif code == 'IINET': # # Montant net à payer # pass # elif code == 'IINETIR': # # Impôt sur le revenu net # fieldsOpenFisca['irpp']=value # elif code == 'IREST': # # Montant net à restituer # pass # elif code == 'ITRED': # # Total des réductions d'impôt # fieldsOpenFisca['reductions']=value # pass # elif code == 'NAPCRP': # # Montant net des prélèvements sociaux (sur revenu du patrimoine et revenus d'activité et de remplacement # # de source étrangère) # # TODO # pass # elif code == 'NBPT': # # Nombre de parts # fieldsOpenFisca['nbptr']=value # elif code == 'PERPPLAFTV': # # Plafond de déduction pour les revenus 2014 au titre de l'épargne retraite, pour déclarant 1 # # TODO # pass # elif code == 'PPETOT': # # Prime pour l'emploi # fieldsOpenFisca['ppe']=value # elif code == 'REVKIRE': # # Revenu fiscal de référence # fieldsOpenFisca['rfr']=value # elif code == 'RNICOL': # # Revenu net imposable ou déficit à reporter # fieldsOpenFisca['rni']=value # elif code == 'RRBG': # # Revenu brut global ou déficit # fieldsOpenFisca['rbg']=value # elif code == 'TOTPAC': # # Nombre de personnes à charge # fieldsOpenFisca['personnes_a_charge']=value # elif code == 'TXMARJ': # # Taux marginal d'imposition (revenus soumis au barème) # # TODO # pass # elif code == 'TXMOYIMP': # # Taux moyen d'imposition # # TODO # pass # else: # raise KeyError(u'Unexpected code {} = {}'.format(code, value).encode('utf-8')) for element in page_doc.xpath('//input[@type="hidden"][@name]'): tag = element.tag.lower() parent = element.getparent() parent_tag = parent.tag.lower() if parent_tag == 'table': tr = parent[parent.index(element) - 1] assert tr.tag.lower() == 'tr', tr else: assert parent_tag == 'tr' tr = parent while True: name = etree.tostring(tr[1], encoding = unicode, method = 'text').strip().rstrip(u'*').rstrip() if name: break table = tr.getparent() tr = table[table.index(tr) - 1] code = element.get('name') fields[code] = dict( code = code, name = name, value = float(element.get('value').strip()), ) # fillFields(code,element.get('value')) import json print json.dumps(fields, encoding = 'utf-8', ensure_ascii = False, indent = 2) # print json.dumps(fieldsOpenFisca, encoding = 'utf-8', ensure_ascii = False, indent = 2) return 0 if __name__ == "__main__": sys.exit(main()) PKF{P:P:Copenfisca_france/scripts/calculateur_impots/convert_json_to_yaml.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import argparse import collections import cStringIO import hashlib import json import logging import os import sys from lxml import etree from openfisca_core import conv import yaml from openfisca_france import init_country from openfisca_france.scripts.calculateur_impots.base import ( call_tax_calculator, openfisca_variable_name_by_tax_calculator_code, transform_scenario_to_tax_calculator_inputs, ) app_name = os.path.splitext(os.path.basename(__file__))[0] html_parser = etree.HTMLParser() income_taxes_test_cases_dir = os.path.normpath(os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', 'french-income-taxes-test-cases', 'test_cases')) json_dir = os.path.normpath(os.path.join(os.path.dirname(__file__), '..', '..', 'tests', 'json')) log = logging.getLogger(app_name) TaxBenefitSystem = init_country() tax_benefit_system = TaxBenefitSystem() tests_dir = os.path.normpath(os.path.join(os.path.dirname(__file__), '..', '..', 'tests', 'calculateur_impots')) variables_name_file_path = os.path.normpath(os.path.join(income_taxes_test_cases_dir, '..', 'output_variables_names.yaml')) # YAML configuration class folded_unicode(unicode): pass class literal_unicode(unicode): pass def dict_constructor(loader, node): return collections.OrderedDict(loader.construct_pairs(node)) def dict_representer(dumper, data): return dumper.represent_dict(data.iteritems()) yaml.add_constructor(yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, dict_constructor) yaml.add_representer(folded_unicode, lambda dumper, data: dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='>')) yaml.add_representer(literal_unicode, lambda dumper, data: dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='|')) yaml.add_representer(collections.OrderedDict, dict_representer) yaml.add_representer(unicode, lambda dumper, data: dumper.represent_scalar(u'tag:yaml.org,2002:str', data)) # Converters def input_to_json_data(value, state = None): return conv.pipe( conv.make_input_to_json(), conv.test_isinstance(dict), conv.struct( dict( resultat_officiel = conv.pipe( conv.test_isinstance(dict), conv.uniform_mapping( conv.pipe( conv.test_isinstance(basestring), conv.not_none, ), conv.pipe( conv.test_isinstance(dict), conv.struct( dict( code = conv.pipe( conv.test_isinstance(basestring), conv.not_none, ), name = conv.pipe( conv.test_isinstance(basestring), conv.not_none, ), value = conv.pipe( conv.test_isinstance(float), conv.not_none, ), ), ), conv.not_none, ), ), conv.not_none, ), scenario = conv.pipe( conv.test_isinstance(dict), conv.struct( dict( test_case = conv.pipe( conv.test_isinstance(dict), # For each entity convert its members from a dict to a list. conv.uniform_mapping( conv.noop, conv.pipe( conv.test_isinstance(dict), conv.function(transform_entity_member_by_id_to_members), ), ), ), ), default = conv.noop, ), tax_benefit_system.Scenario.make_json_to_instance( tax_benefit_system = tax_benefit_system), conv.not_none, ), ), ), )(value, state = state or conv.default_state) def transform_entity_member_by_id_to_members(member_by_id): members = [] for id, member in member_by_id.iteritems(): assert 'id' not in member or member['id'] == id member['id'] = id members.append(member) return members # Functions def main(): parser = argparse.ArgumentParser(description = __doc__) parser.add_argument('-v', '--verbose', action = 'store_true', default = False, help = "increase output verbosity") args = parser.parse_args() logging.basicConfig(level = logging.DEBUG if args.verbose else logging.WARNING, stream = sys.stdout) if not os.path.exists(income_taxes_test_cases_dir): os.makedirs(income_taxes_test_cases_dir) if os.path.exists(tests_dir): for filename in os.listdir(tests_dir): if filename.endswith(filename): os.remove(os.path.join(tests_dir, filename)) else: os.makedirs(tests_dir) if os.path.exists(variables_name_file_path): with open(variables_name_file_path) as variables_name_file: name_by_year_by_code = yaml.load(variables_name_file) else: name_by_year_by_code = {} name_by_year_by_code_changed = False for json_filename in sorted(os.listdir(json_dir)): if not json_filename.endswith('.json'): continue log.info(u"Converting file {}...".format(json_filename)) with open(os.path.join(json_dir, json_filename)) as json_file: data = conv.check(input_to_json_data)(json_file.read()) scenario = data['scenario'] tax_calculator_inputs = transform_scenario_to_tax_calculator_inputs(scenario) tax_year = scenario.period.start.year + 1 if tax_year <= 2011: # Tax calculator is no more available for years before 2011. tax_calculator_outputs = collections.OrderedDict() tax_calculator_outputs_infos = data['resultat_officiel'] for code, infos in tax_calculator_outputs_infos.iteritems(): float_value = infos['value'] int_value = int(float_value) tax_calculator_outputs[code] = int_value if float_value == int_value else float_value name = infos['name'].strip().rstrip(u'*').rstrip() name = u' '.join(name.split()) # Remove duplicate spaces. if name not in (u'', u'?', u'nom inconnu'): name_by_year = name_by_year_by_code.setdefault(code, {}) current_name = name_by_year.get(tax_year) if current_name is not None and current_name != name \ and not name.lower().endswith(current_name.lower()): log.warning(u'Ignoring rename of variable {} for year {} from:\n {}\nto:\n {}'.format(code, tax_year, current_name, name)) elif current_name != name: name_by_year[tax_year] = name name_by_year_by_code_changed = True else: page = call_tax_calculator(tax_year, tax_calculator_inputs) page_doc = etree.parse(cStringIO.StringIO(page), html_parser) codes_without_name = set() tax_calculator_outputs = collections.OrderedDict() for element in page_doc.xpath('//input[@type="hidden"][@name]'): code = element.get('name') name = None parent = element.getparent() parent_tag = parent.tag.lower() if parent_tag == 'table': tr = parent[parent.index(element) - 1] assert tr.tag.lower() == 'tr', tr elif parent_tag == 'tr': tr = parent elif code == 'NAPCR': name = u'Contributions sociales supplémentaires' else: codes_without_name.add(code) continue if name is None: while True: name = etree.tostring(tr[1], encoding = unicode, method = 'text').strip().rstrip(u'*').rstrip() if name: name = u' '.join(name.split()) # Remove duplicate spaces. break table = tr.getparent() tr = table[table.index(tr) - 1] codes_without_name.discard(code) float_value = float(element.get('value').strip()) int_value = int(float_value) tax_calculator_outputs[code] = int_value if float_value == int_value else float_value name_by_year = name_by_year_by_code.setdefault(code, {}) current_name = name_by_year.get(tax_year) if current_name is not None and current_name != name \ and not name.lower().endswith(current_name.lower()): log.warning(u'Renaming variable {} for year {} from:\n {}\nto:\n {}'.format(code, tax_year, current_name, name)) if current_name != name and (current_name is None or not name.lower().endswith(current_name.lower())): name_by_year[tax_year] = name name_by_year_by_code_changed = True assert not codes_without_name, 'Output variables {} have no name in page:\n{}'.format( sorted(codes_without_name), page.decode('iso-8859-1').encode('utf-8')) # Create or update test for "calculateur impôt". sorted_tax_calculator_inputs = collections.OrderedDict(sorted(tax_calculator_inputs.iteritems())) income_taxes_test_case_file_path = os.path.join(income_taxes_test_cases_dir, '{}.yaml'.format( hashlib.md5(json.dumps(sorted_tax_calculator_inputs)).hexdigest())) if os.path.exists(income_taxes_test_case_file_path): with open(income_taxes_test_case_file_path) as income_taxes_test_case_file: income_taxes_test_case = yaml.load(income_taxes_test_case_file) income_taxes_test_case['output_variables'][str(tax_year)] = collections.OrderedDict(sorted( tax_calculator_outputs.iteritems())) income_taxes_test_case['output_variables'] = collections.OrderedDict(sorted( income_taxes_test_case['output_variables'].iteritems())) else: income_taxes_test_case = collections.OrderedDict(( ('input_variables', sorted_tax_calculator_inputs), ('output_variables', collections.OrderedDict(( (str(tax_year), collections.OrderedDict(sorted(tax_calculator_outputs.iteritems()))), ))), )) with open(income_taxes_test_case_file_path, 'w') as income_taxes_test_case_file: yaml.dump(income_taxes_test_case, income_taxes_test_case_file, allow_unicode = True, default_flow_style = False, indent = 2, width = 120) # Create or update YAML file containing the names associated to each result code of "calculateur impôt". if name_by_year_by_code_changed: variables_name_data = collections.OrderedDict( (code, collections.OrderedDict(sorted(name_by_year.iteritems()))) for code, name_by_year in sorted(name_by_year_by_code.iteritems()) ) with open(variables_name_file_path, 'w') as variables_name_file: yaml.dump(variables_name_data, variables_name_file, allow_unicode = True, default_flow_style = False, indent = 2, width = 120) name_by_year_by_code_changed = False # Create or update YAML file containing OpenFisca test. main_input_variable_name = json_filename.split('-', 1)[0] test = collections.OrderedDict(( ('name', main_input_variable_name), )) test.update(scenario.to_json()) test['period'] = scenario.period.start.year # Replace period string with an integer. test_case = test.pop('test_case', None) for entity_name_plural, entity_variables in test_case.iteritems(): test[entity_name_plural] = entity_variables test['output_variables'] = collections.OrderedDict(sorted( (variable_name, variable_value) for variable_name, variable_value in ( (openfisca_variable_name_by_tax_calculator_code[code], value) for code, value in tax_calculator_outputs.iteritems() ) if variable_name is not None )) tests_file_path = os.path.join(tests_dir, '{}.yaml'.format(main_input_variable_name)) if os.path.exists(tests_file_path): with open(tests_file_path) as tests_file: tests = yaml.load(tests_file) tests.append(test) tests.sort(key = lambda test: (test['name'], test['period'])) else: tests = [test] with open(tests_file_path, 'w') as tests_file: yaml.dump(tests, tests_file, allow_unicode = True, default_flow_style = False, indent = 2, width = 120) return 0 if __name__ == "__main__": sys.exit(main()) PK'Gv)k0k0Gopenfisca_france/scripts/calculateur_impots/compare_openfisca_impots.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . #TODO: reduce margin error from 2 to 0 by coding the floor and round rules """Compare income taxes computed by finances.gouv.fr web simulator with OpenFisca results.""" ########### DESCRIPTION ############ ## Ce script compare la simulation OpenFisca d'un scenario (à définir ci-dessous) avec l'officielle (DGFiP) ## Il renvoie les erreurs d'OpenFisca : les valeurs attendues et les valeurs obtenues pour une dizaine de variables ## quand elles diffèrent de plus de la marge d'erreur (=2€ à ce jour) import argparse import collections import cStringIO import logging import os import sys import urllib import urllib2 from lxml import etree import numpy as np import openfisca_france from .base import transform_scenario_to_tax_calculator_inputs app_name = os.path.splitext(os.path.basename(__file__))[0] log = logging.getLogger(app_name) TaxBenefitSystem = openfisca_france.init_country() tax_benefit_system = TaxBenefitSystem() def define_scenario(year): scenario = tax_benefit_system.new_scenario() scenario.init_single_entity( period = year, parent1 = dict( activite = u'Actif occupé', birth = 1973, salaire_imposable = 48000, statmarit = u'Marié', ), parent2 = dict( activite = u'Actif occupé', birth = 1973, statmarit = u'Marié', ), enfants = [ dict( activite = u'Étudiant, élève', birth = '1993-02-01', ), # dict( # activite = u'Étudiant, élève', # birth = '2000-04-17', # ), ], foyer_fiscal = dict( #TODO: pb avec f2ck f5rn = 5000, mbic_mvct = 2000, ), ) scenario.suggest() return scenario def main(): parser = argparse.ArgumentParser(description = __doc__) parser.add_argument('-v', '--verbose', action = 'store_true', default = False, help = "increase output verbosity") args = parser.parse_args() logging.basicConfig(level = logging.DEBUG if args.verbose else logging.WARNING, stream = sys.stdout) year = 2010 scenario = define_scenario(year) compare(scenario, tested = True) return 0 def compare(scenario, tested = False): year = scenario.period.date.year totpac = scenario.test_case['foyers_fiscaux'].values()[0].get('personnes_a_charge') impots_arguments = transform_scenario_to_tax_calculator_inputs(scenario) simulation = scenario.new_simulation(debug = True) request = urllib2.Request('http://www3.finances.gouv.fr/cgi-bin/calc-' + str(year + 1) + '.cgi', headers = { 'User-Agent': 'OpenFisca-Script', }) response = urllib2.urlopen(request, urllib.urlencode(impots_arguments)) response_html = response.read() if 'Erreur' in response_html: raise Exception(u"Erreur : {}".format(response_html.decode('iso-8859-1')).encode('utf-8')) page_doc = etree.parse(cStringIO.StringIO(response_html), etree.HTMLParser()) fields = collections.OrderedDict() names = { # Sert à afficher le nom des variables retournées par le script #TODO: mutualiser ce dictionnaire avec request_impots, qui contient le même 'CIGE': u'Crédit aides aux personnes', 'CIRELANCE': u'Crédit d\'impôt exceptionnel sur les revenus 2008', 'IAVIM': u'Impôt avant imputations', 'IDEC': u'Décote', 'IDRS2': u'Droits simples', 'IINET': u'Montant net à payer', 'IINETIR': u'Impôt sur le revenu net', 'IREST': u'Montant net à restituer', 'IRESTIR': u'Impôt sur le revenu net', 'ITRED': u'Total des réductions d\'impôt', 'I2DH': u'Prélèvement libératoire de 7,5%', 'NAPCRP': u'Montant net des prélèvements sociaux (sur revenu du patrimoine et revenus d\'activité et' u' de remplacement', 'NBPT': u'Nombre de parts', 'NBP': u'Nombre de parts', 'PERPPLAFTV': u'Plafond de déduction pour les revenus 2014 au titre de l\'épargne retraite, pour déclarant 1', 'PPETOT': u'Prime pour l\'emploi', 'REVKIRE': u'Revenu fiscal de référence', 'RNICOL': u'Revenu net imposable ou déficit à reporter', 'RRBG': u'Revenu brut global ou déficit', 'TEFF': u'?',#TODO (ebnc_impo) 'TOTPAC': u'Nombre de personnes à charge', 'TXMARJ': u'Taux marginal d\'imposition', 'TXMOYIMP': u'Taux moyen d\'imposition', 'IRETS' : u'?',#TODO 'RNI': u'?',#TODO 'AVFISCOPTER': u'?',#TODO (f8tf) 'CIRCM': u'?',#TODO (f2dc) 'BCSG': u'Base CSG', 'BRDS': u'Base CRDS', 'BPRS': u'Base prélèvement social et contributions annexes', 'NAPCS': u'Montant net CSG', 'NAPRD': u'Montant net CRDS', 'NAPPS': u'Montant net prélèvement social et contributions annexes', 'CICA': u'?',#TODO (f4tq) 'CICORSE': u'?',#TODO (f8to) 'CIDEPENV': u'?',#TODO (f7sz) 'CIGARD': u'?',#TODO (f7ga) 'CIHABPRIN': u'?',#TODO (f7vy) 'CIPRETUD': u'?',#TODO (f7uk) 'CITEC': u'?',#TODO (f7wr) 'CIDEVDUR': u'?',#TODO (f7wf) 'CIADCRE': u'?',#TODO (f7dg) 'CIMOBIL': u'?',#TODO (f1ar) 'CIPERT': u'?',#TODO (f3vv) 'IAVF2': u'?',#TODO (f8th) 'IPROP': u'Impôt proportionnel', 'RFOR': u'?',#TODO (f7up) 'PERPPLAFTP': u'?', 'PERPPLAFTC': u'?',#TODO (f2ch, f2dh, marpac) 'RHEBE': u'?',#TODO (7ce) 'RAA': u'?',#TODO (7ud) 'RAH': u'?',#TODO (7ce) 'RAIDE': u'?',#TODO (7df) 'RCEL': u'?',#TODO (scellier) 'RCELHJK': u'?',#TODO (scellier) 'RCELHNO': u'?',#TODO (7hn) 'RCELHM': u'?',#TODO (7hm) 'RCELHR': u'?',#TODO (7hr) 'RCELREPHS': u'?',#TODO (7hs) 'RCELRRED09': u'?',#TODO (7la) 'RCELRREDLD': u'?',#TODO (7ld) 'RCELRREDLE': u'?',#TODO (7le) 'RCELRREDLF': u'?',#TODO (7lf) 'RCELRREDLM': u'?',#TODO (7lm) 'RCELRREDMG': u'?',#TODO (7mg) 'RCELREPHR': u'?',#TODO (scellier) 'RCELRREDLA': u'?',#TODO (scellier) 'RCELRREDLS': u'?',#TODO (7ls) 'RCELREPGJ': u'?',#TODO (7gj) 'RCELREPGK': u'?',#TODO (7gk) 'RCELREPGL': u'?',#TODO (7gl) 'RCELREPGW': u'?',#TODO (f7gw) 'RCELREPGX': u'?',#TODO (f7gx) 'RCELFD': u'?',#TODO (f7fd) 'RCELRREDLB': u'?',#TODO (f7lb) 'RCELRREDLC': u'?',#TODO (f7lc) 'RCELRREDLZ': u'?',#TODO (f7lz) 'RCONS': u'?',#TODO (7uh) 'RCODJT': u'?',#TODO (7jt) 'RCODJU': u'?',#TODO (7jt) 'RCODJV': u'?',#TODO (7jv) 'RCODJW': u'?',#TODO (7jw) 'RCODJX': u'?',#TODO (7jx) 'RCOLENT': u'?',#TODO (7ls) 'RDIFAGRI': u'?',#TODO (7um) 'RDONS': u'?',#TODO (7uf) 'RDUFLOGIH': u'?',#TODO (7gh) 'REI': u'?',#TODO (f8tf) 'RILMIA': u'?',#TODO (7ia) 'RILMIB': u'?',#TODO (7ib) 'RILMIC': u'?',#TODO (7ic) 'RILMIH': u'?',#TODO (7ih) 'RILMJI': u'?',#TODO (7ji) 'RILMJS': u'?',#TODO (7ji) 'RFIPC': u'?',#TODO 'RILMJX': u'?',#TODO 'RILMJV': u'?',#TODO 'RILMJW': u'?',#TODO 'RCELREPHG': u'?',#TODO 'RCELREPGV': u'?',#TODO 'RCELRREDLM': u'?',#TODO 'RCELRREDMG': u'?',#TODO 'RFORET': u'?',#TODO (f7uc) 'RINVDOMTOMLG': u'?',#TODO (f7ui) 'RTELEIR': u'?',#TODO (7ul) 'RCOTFOR': u'?',#TODO (7ul) 'RCODELOP': u'?',#TODO (7uh) 'RCELLIER': u'?',#TODO (7hk) 'RCELCOM': u'?',#TODO (7np) 'RCELHL': u'?',#TODO (7hl) 'RCELJP': u'?',#TODO (7jp) 'RCELJOQR': u'?',#TODO (7jo) 'RCELNQ': u'?',#TODO (7nq) 'RCELREPGP': u'?',#TODO (7gp) 'RCELREPGS': u'?',#TODO (7gs) 'RCELREPGU': u'?',#TODO (7gu) 'RCELREPGT': u'?',#TODO (7gt) 'RCELREPGV': u'?',#TODO (7gv) 'RCELREPHA': u'?',#TODO (7ha) 'RCELREPHB': u'?',#TODO (7hb) 'RCELREPHD': u'?',#TODO (7hd) 'RCELREPHE': u'?',#TODO (7he) 'RCELREPHF': u'?',#TODO (7hf) 'RCELREPHG': u'?',#TODO (7hg) 'RCELREPHH': u'?',#TODO (7hh) 'RCELREPHT': u'?',#TODO (7ht) 'RCELREPHU': u'?',#TODO (7hu) 'RCELREPHV': u'?',#TODO (7hv) 'RCELREPHW': u'?',#TODO (7hw) 'RCELREPHX': u'?',#TODO (7hx) 'RCELREPHZ': u'?',#TODO (7hz) 'RCELFABC': u'?',#TODO (7fa) 'RCEL2012': u'?',#TODO (7ja) 'RCELJBGL': u'?',#TODO (7jb) 'RRESINEUV': u'?',#TODO (7ij) 'RCELNBGL': u'?',#TODO (7nb) 'RLOCIDEFG': u'?',#TODO (7id) 'RFCPI': u'?',#TODO (7gq) 'RFIPC': u'?',#TODO (7fm) 'RINNO': u'?',#TODO (7gq) 'RCINE': u'?',#TODO (7gn) 'RIDOMENT': u'?',#TODO (7ur) 'RIDOMPROE1': u'?',#TODO (f7sz) 'RIDOMPROE2': u'?',#TODO (f7qz) 'RIDOMPROE3': u'?',#TODO (f7qz) 'RIDOMPROE4': u'?',#TODO (f7oz) 'RIDOMPROE5': u'?',#TODO (f7oz) 'RLOGDOM': u'?',#TODO (f7qd) 'RNOUV': u'?',#TODO (cappme) 'RPATNAT': u'?',#TODO (7ka) 'RPATNATOT': u'?',#TODO (7ka) 'RRDOM': u'?',#TODO (7ub) 'RRESTIMO': u'?',#TODO (7rd) 'RRESIVIEU': u'?',#TODO (7im) 'RMEUBLE': u'?',#TODO (7ik) 'RREDMEUB': u'?',#TODO (7is) 'RREPA': u'?',#TODO (7ud) 'RRPRESCOMP': u'?',#TODO (7wp) 'RRESIMEUB': u'?',#TODO (7io) 'RREPMEU': u'?',#TODO (7ip) 'RPRESCOMPREP': u'?',#TODO (7wp) 'RREPNPRO': u'?',#TODO (7ir) 'RPROREP': u'?',#TODO (7is) 'RINVRED': u'?',#TODO (7it) 'RREDREP': u'?',#TODO (7iu) 'RILMIX': u'?',#TODO (7ix) 'RILMIZ': u'?',#TODO (7iz) 'RRIRENOV': u'?',#TODO (7nz) 'RSOCREPR': u'?',#TODO (7fh) 'RSOUFIP': u'?',#TODO (7fq) 'RSURV': u'?',#TODO (7gz) 'RTITPRISE': u'?',#TODO (7cu) 'RTOURNEUF': u'?', #TODO (f7xc) 'RTOURREP': u'?', #TODO (7xi) 'RTOUREPA': u'?', #TODO (7xj) 'RTOUHOTR': u'?', #TODO (7xk) 'RTOUR': u'?',#TODO (f7xd) 'RTOURTRA': u'?',#TODO (f7xc) 'RTOURHOT': u'?',#TODO (f7xc) 'RTOURES': u'?',#TODO (f7xc) } for element in page_doc.xpath('//input[@type="hidden"][@name]'): code = element.get('name') fields[code] = { 'code': code, 'name': names[code] if (code in names) else u'nom inconnu', 'value': float(element.get('value').replace(" ", "")), } iinet = 1 if tested: for code, field in fields.iteritems(): if code == 'IINETIR' or code == 'IRESTIR': iinet = 0 compare_variable(code, field, simulation, totpac, year) # print u'{} : {} ({})'.format(code, fields[code]['value'], fields[code]['name']).encode('utf-8') # print simulation.calculate('reductions') # print fields['ITRED']['value'] if iinet: # S'il n'y a pas IINETIR et IRESTIR dans les résultats, on compare irpp à IINET (s'ils y sont c'est # normal que les résultats soient différents compare_variable('IINETIR', fields['IINET'], simulation, totpac, year) return fields if __name__ == "__main__": # sys.exit(main()) main() PK'Ge!  Dopenfisca_france/scripts/calculateur_impots/create_json_then_test.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # ######### DESCRIPTION ############ # Ce script crée un fichier json comprenant le scenario et le résultat officiel de la simulation, à partir d'une # variable # Que le fichier existe déjà ou non, ce script teste ensuite si le résultat officiel correspond au résultat OpenFisca # Si un long message d'erreur apparaît, il faut supprimer le fichier créé (qui est vide) # On attribue la valeur 1500 à la variable à tester dans le scenario, constitué d'une personne seule avec un salaire de # 24000 # TODO: générer des tests aléatoires : on prend 5 valeurs au hasard pour autant de variables et on crée un .json. On # s'arrête d'en créer quand on trouve une erreur dans OpenFisca (qu'on affiche). import sys from openfisca_core import conv from . import base, generate_json def define_scenario(year, column_code): scenario = base.tax_benefit_system.new_scenario() column = base.tax_benefit_system.column_by_name[column_code] entity = column.entity start = 1990 if column.start is None else column.start.year end = 2050 if column.end is None else column.end.year value = 1500 if conv.test_between(start, end)(year)[1] is None else 0 parent1 = { "activite": u'Actif occupé', "birth": 1970, "salaire_imposable": 24000, "statmarit": u'Célibataire', } enfants = [ # dict( # activite = u'Étudiant, élève', # birth = '2002-02-01', # ), # dict( # activite = u'Étudiant, élève', # birth = '2000-04-17', # ), ] famille = dict() menage = dict() foyer_fiscal = dict() if entity == 'ind': parent1[column_code] = value elif entity == 'foy': foyer_fiscal[column_code] = value elif entity == 'fam': famille[column_code] = value elif entity == 'men': menage[column_code] = value scenario.init_single_entity( period = year, parent1 = parent1, # parent2 = dict(), enfants = enfants, famille = famille, menage = menage, foyer_fiscal = foyer_fiscal, ) scenario.suggest() return scenario def main(): # for column_code in ( # 'f7nu', 'f7nv', 'f7nw', 'f7nx', 'f7oz', 'f7pa', 'f7pb', 'f7pc', 'f7pe', 'f7pf', 'f7pg', 'f7pi', 'f7pj', # 'f7pk', 'f7pm', 'f7pn', 'f7po', 'f7pp', 'f7pq', 'f7ps', 'f7pt', 'f7pu', 'f7pv', 'f7px', 'f7py', 'f7rg', # 'f7rh', 'f7rj', 'f7rk', 'f7rl', 'f7rm', 'f7rn', 'f7rp', 'f7rq', 'f7rr', 'f7rs', 'f7ru', 'f7rv', 'f7rw', # 'f7rx', 'f7pz', 'f7qz', 'f7qe', 'f7qf', 'f7qg', 'f7qo', 'f7qp', 'f7qv', 'f7mm', 'f7ma', 'f7mb', 'f7mn', # 'f7lg', 'f7lh', 'f7ks', 'f7kt', 'f7li', 'f7mc', 'f7ku'): # jusqu'en 2012 # for column_code in ( # 'fhsa', 'fhsb', 'fhsf', 'fhsg', 'fhsc', 'fhsh', 'fhsd', 'fhsi', 'fhsk', 'fhsl', 'fhsp', 'fhsq', 'fhsm', # 'fhsr', 'fhsn', 'fhss', 'fhsu', 'fhsv', 'fhsw', 'fhsx', 'fhsz', 'fhta', 'fhtb', 'fhtc', 'fhoz', 'fhpa', # 'fhpb', 'fhpc', 'fhpe', 'fhpf', 'fhpg', 'fhpi', 'fhpj', 'fhpk', 'fhpm', 'fhpn', 'fhpo', 'fhpp', 'fhpq', # 'fhps', 'fhpt', 'fhpu', 'fhpv', 'fhpx', 'fhpy', 'fhrg', 'fhrh', 'fhrj', 'fhrk', 'fhrl', 'fhrm', 'fhrn', # 'fhrp', 'fhrq', 'fhrr', 'fhrs', 'fhru', 'fhrv', 'fhrw', 'fhrx', 'fhpz', 'fhqz', 'fhqe', 'fhqf', 'fhqg', # 'fhqo', 'fhqp', 'fhqv', 'fhmm', 'fhma', 'fhmb', 'fhmn', 'fhlg', 'fhlh', 'fhks', 'fhkt', 'fhli', 'fhmc', # 'fhku'): # 2013 uniquement while True: column_code = raw_input("Which variable would you like to test ? ") assert column_code in base.tax_benefit_system.column_by_name, "This variable doesn't exist" for year in range(2006, 2007): scenario = define_scenario(year, column_code) generate_json.export_json(scenario, var = column_code, tested = True) if __name__ == "__main__": sys.exit(main()) PKF#openfisca_france/assets/__init__.pyPKFI:)b)b#openfisca_france/assets/holidays.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from datetime import datetime holidays = [ datetime.strptime("1990-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("1990-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("1990-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("1990-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("1990-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("1990-04-16", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("1990-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("1990-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("1990-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("1990-05-24", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("1990-06-04", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("1991-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("1991-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("1991-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("1991-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("1991-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("1991-04-01", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("1991-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("1991-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("1991-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("1991-05-09", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("1991-05-20", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("1992-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("1992-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("1992-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("1992-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("1992-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("1992-04-20", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("1992-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("1992-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("1992-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("1992-05-28", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("1992-06-08", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("1993-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("1993-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("1993-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("1993-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("1993-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("1993-04-12", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("1993-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("1993-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("1993-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("1993-05-20", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("1993-05-31", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("1994-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("1994-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("1994-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("1994-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("1994-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("1994-04-04", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("1994-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("1994-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("1994-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("1994-05-12", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("1994-05-23", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("1995-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("1995-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("1995-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("1995-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("1995-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("1995-04-17", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("1995-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("1995-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("1995-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("1995-05-25", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("1995-06-05", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("1996-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("1996-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("1996-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("1996-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("1996-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("1996-04-08", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("1996-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("1996-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("1996-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("1996-05-16", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("1996-05-27", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("1997-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("1997-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("1997-05-08", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("1997-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("1997-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("1997-03-31", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("1997-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("1997-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("1997-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("1997-05-19", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("1998-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("1998-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("1998-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("1998-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("1998-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("1998-04-13", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("1998-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("1998-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("1998-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("1998-05-21", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("1998-06-01", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("1999-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("1999-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("1999-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("1999-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("1999-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("1999-04-05", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("1999-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("1999-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("1999-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("1999-05-13", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("1999-05-24", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2000-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2000-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2000-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2000-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2000-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2000-04-24", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2000-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2000-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2000-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2000-06-01", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2000-06-12", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2001-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2001-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2001-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2001-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2001-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2001-04-16", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2001-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2001-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2001-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2001-05-24", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2001-06-04", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2002-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2002-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2002-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2002-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2002-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2002-04-01", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2002-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2002-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2002-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2002-05-09", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2002-05-20", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2003-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2003-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2003-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2003-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2003-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2003-04-21", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2003-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2003-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2003-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2003-05-29", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2003-06-09", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2004-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2004-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2004-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2004-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2004-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2004-04-12", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2004-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2004-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2004-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2004-05-20", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2004-05-31", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2005-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2005-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2005-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2005-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2005-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2005-03-28", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2005-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2005-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2005-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2005-05-05", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2005-05-16", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2006-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2006-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2006-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2006-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2006-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2006-04-17", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2006-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2006-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2006-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2006-05-25", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2006-06-05", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2007-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2007-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2007-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2007-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2007-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2007-04-09", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2007-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2007-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2007-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2007-05-17", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2007-05-28", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2008-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2008-05-01", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2008-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2008-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2008-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2008-03-24", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2008-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2008-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2008-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2008-05-12", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2009-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2009-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2009-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2009-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2009-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2009-04-13", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2009-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2009-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2009-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2009-05-21", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2009-06-01", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2010-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2010-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2010-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2010-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2010-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2010-04-05", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2010-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2010-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2010-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2010-05-13", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2010-05-24", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2011-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2011-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2011-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2011-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2011-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2011-04-25", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2011-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2011-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2011-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2011-06-02", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2011-06-13", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2012-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2012-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2012-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2012-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2012-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2012-04-09", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2012-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2012-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2012-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2012-05-17", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2012-05-28", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2013-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2013-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2013-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2013-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2013-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2013-04-01", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2013-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2013-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2013-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2013-05-09", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2013-05-20", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2014-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2014-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2014-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2014-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2014-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2014-04-21", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2014-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2014-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2014-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2014-05-29", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2014-06-09", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2015-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2015-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2015-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2015-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2015-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2015-04-06", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2015-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2015-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2015-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2015-05-14", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2015-05-25", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2016-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2016-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2016-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2016-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2016-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2016-03-28", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2016-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2016-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2016-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2016-05-05", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2016-05-16", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2017-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2017-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2017-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2017-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2017-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2017-04-17", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2017-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2017-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2017-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2017-05-25", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2017-06-05", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2018-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2018-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2018-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2018-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2018-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2018-04-02", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2018-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2018-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2018-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2018-05-10", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2018-05-21", "%Y-%m-%d").date(), # Whit Monday datetime.strptime("2019-01-01", "%Y-%m-%d").date(), # New year datetime.strptime("2019-05-01", "%Y-%m-%d").date(), # Labour Day datetime.strptime("2019-05-08", "%Y-%m-%d").date(), # Victory in Europe Day datetime.strptime("2019-07-14", "%Y-%m-%d").date(), # Bastille Day datetime.strptime("2019-11-11", "%Y-%m-%d").date(), # Armistice Day datetime.strptime("2019-04-22", "%Y-%m-%d").date(), # Easter Monday datetime.strptime("2019-08-15", "%Y-%m-%d").date(), # Assumption of Mary to Heaven datetime.strptime("2019-11-01", "%Y-%m-%d").date(), # All Saints Day datetime.strptime("2019-12-25", "%Y-%m-%d").date(), # Christmas Day datetime.strptime("2019-05-30", "%Y-%m-%d").date(), # Ascension Thursday datetime.strptime("2019-06-10", "%Y-%m-%d").date(), # Whit Monday ] PK]ME"openfisca_france/model/__init__.pyPK'G|Copenfisca_france/model/base.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from datetime import date import functools from openfisca_core.columns import (AgeCol, BoolCol, build_column, DateCol, EnumCol, FixedStrCol, FloatCol, IntCol, PeriodSizeIndependentIntCol, StrCol) from openfisca_core.enumerations import Enum from openfisca_core.formulas import (calculate_output_add, calculate_output_add_divide, calculate_output_divide, dated_function, DatedFormulaColumn, EntityToPersonColumn, last_duration_last_value, make_reference_formula_decorator, missing_value, PersonToEntityColumn, reference_input_variable, requested_period_added_value, requested_period_default_value, requested_period_last_value, set_input_dispatch_by_period, set_input_divide_by_period, SimpleFormulaColumn) from ..entities import entity_class_by_symbol, Familles, FoyersFiscaux, Individus, Menages __all__ = [ 'AgeCol', 'build_column', 'BoolCol', 'calculate_output_add', 'calculate_output_add_divide', 'calculate_output_divide', 'CAT', 'CHEF', 'CONJ', 'CREF', 'date', 'DateCol', 'dated_function', 'DatedFormulaColumn', 'ENFS', 'EntityToPersonColumn', 'Enum', 'EnumCol', 'Familles', 'FixedStrCol', 'FloatCol', 'FoyersFiscaux', 'Individus', 'IntCol', 'last_duration_last_value', 'Menages', 'missing_value', 'PAC1', 'PAC2', 'PAC3', 'PART', 'PeriodSizeIndependentIntCol', 'PersonToEntityColumn', 'PREF', 'QUIFAM', 'QUIFOY', 'QUIMEN', 'reference_formula', 'reference_input_variable', 'requested_period_added_value', 'requested_period_default_value', 'requested_period_last_value', 'set_input_dispatch_by_period', 'set_input_divide_by_period', 'SimpleFormulaColumn', 'StrCol', 'TAUX_DE_PRIME', 'VOUS', ] CAT = Enum([ 'prive_non_cadre', 'prive_cadre', 'public_titulaire_etat', 'public_titulaire_militaire', 'public_titulaire_territoriale', 'public_titulaire_hospitaliere', 'public_non_titulaire', ]) TAUX_DE_PRIME = 1 / 4 # primes_fonction_publique (hors suppl. familial et indemnité de résidence)/rémunération brute QUIFAM = Enum(['chef', 'part', 'enf1', 'enf2', 'enf3', 'enf4', 'enf5', 'enf6', 'enf7', 'enf8', 'enf9']) QUIFOY = Enum(['vous', 'conj', 'pac1', 'pac2', 'pac3', 'pac4', 'pac5', 'pac6', 'pac7', 'pac8', 'pac9']) QUIMEN = Enum(['pref', 'cref', 'enf1', 'enf2', 'enf3', 'enf4', 'enf5', 'enf6', 'enf7', 'enf8', 'enf9']) CHEF = QUIFAM['chef'] CONJ = QUIFOY['conj'] CREF = QUIMEN['cref'] ENFS = [ QUIFAM['enf1'], QUIFAM['enf2'], QUIFAM['enf3'], QUIFAM['enf4'], QUIFAM['enf5'], QUIFAM['enf6'], QUIFAM['enf7'], QUIFAM['enf8'], QUIFAM['enf9'], ] PAC1 = QUIFOY['pac1'] PAC2 = QUIFOY['pac2'] PAC3 = QUIFOY['pac3'] PART = QUIFAM['part'] PREF = QUIMEN['pref'] VOUS = QUIFOY['vous'] # Functions and decorators build_column = functools.partial( build_column, entity_class_by_symbol = entity_class_by_symbol, ) reference_formula = make_reference_formula_decorator(entity_class_by_symbol = entity_class_by_symbol) PK'Ghcc!openfisca_france/model/mesures.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import floor, logical_not as not_ from .base import * # noqa analysis:ignore @reference_formula class uc(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Menages label = u"Unités de consommation" def function(self, simulation, period): ''' Calcule le nombre d'unités de consommation du ménage avec l'échelle de l'insee 'men' ''' period = period.start.offset('first-of', 'year').period('year') age_en_mois_holder = simulation.compute('age_en_mois', period) age_en_mois = self.split_by_roles(age_en_mois_holder) uc_adt = 0.5 uc_enf = 0.3 uc = 0.5 for agm in age_en_mois.itervalues(): age = floor(agm / 12) adt = (15 <= age) & (age <= 150) enf = (0 <= age) & (age <= 14) uc += adt * uc_adt + enf * uc_enf return period, uc @reference_formula class typ_men(SimpleFormulaColumn): column = PeriodSizeIndependentIntCol(default = 0) entity_class = Menages label = u"Type de ménage" def function(self, simulation, period): ''' type de menage 'men' TODO: prendre les enfants du ménage et non ceux de la famille ''' period = period.start.offset('first-of', 'year').period('year') isol_holder = simulation.compute('isol', period) af_nbenf_holder = simulation.compute('af_nbenf', period) af_nbenf = self.cast_from_entity_to_role(af_nbenf_holder, role = CHEF) af_nbenf = self.sum_by_entity(af_nbenf) isol = self.cast_from_entity_to_role(isol_holder, role = CHEF) isol = self.sum_by_entity(isol) _0_kid = af_nbenf == 0 _1_kid = af_nbenf == 1 _2_kid = af_nbenf == 2 _3_kid = af_nbenf >= 3 return period, (0 * (isol & _0_kid) + # Célibataire 1 * (not_(isol) & _0_kid) + # Couple sans enfants 2 * (not_(isol) & _1_kid) + # Couple un enfant 3 * (not_(isol) & _2_kid) + # Couple deux enfants 4 * (not_(isol) & _3_kid) + # Couple trois enfants et plus 5 * (isol & _1_kid) + # Famille monoparentale un enfant 6 * (isol & _2_kid) + # Famille monoparentale deux enfants 7 * (isol & _3_kid)) # Famille monoparentale trois enfants et plus @reference_formula class revdisp(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Menages label = u"Revenu disponible du ménage" url = "http://fr.wikipedia.org/wiki/Revenu_disponible" def function(self, simulation, period): ''' Revenu disponible - ménage 'men' ''' period = period.start.period('year').offset('first-of') rev_trav_holder = simulation.compute('rev_trav', period) pen_holder = simulation.compute('pen', period) rev_cap_holder = simulation.compute('rev_cap', period) psoc_holder = simulation.compute('psoc', period) ppe_holder = simulation.compute('ppe', period) impo = simulation.calculate('impo', period) pen = self.sum_by_entity(pen_holder) ppe = self.cast_from_entity_to_role(ppe_holder, role = VOUS) ppe = self.sum_by_entity(ppe) psoc = self.cast_from_entity_to_role(psoc_holder, role = CHEF) psoc = self.sum_by_entity(psoc) rev_cap = self.sum_by_entity(rev_cap_holder) rev_trav = self.sum_by_entity(rev_trav_holder) return period, rev_trav + pen + rev_cap + psoc + ppe + impo @reference_formula class nivvie(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Menages label = u"Niveau de vie du ménage" def function(self, simulation, period): ''' Niveau de vie du ménage 'men' ''' period = period.start.offset('first-of', 'year').period('year') revdisp = simulation.calculate('revdisp', period) uc = simulation.calculate('uc', period) return period, revdisp / uc @reference_formula class revenu_net_individu(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Revenu net de l'individu" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') pen = simulation.calculate('pen', period) rev_cap = simulation.calculate('rev_cap', period) rev_trav = simulation.calculate('rev_trav', period) return period, pen + rev_cap + rev_trav @reference_formula class revnet(PersonToEntityColumn): entity_class = Menages label = u"Revenu net du ménage" operation = 'add' url = u"http://impotsurlerevenu.org/definitions/115-revenu-net-imposable.php", variable = revenu_net_individu @reference_formula class nivvie_net(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Menages label = u"Niveau de vie net du ménage" def function(self, simulation, period): ''' Niveau de vie net du ménage 'men' ''' period = period.start.offset('first-of', 'year').period('year') revnet = simulation.calculate('revnet', period) uc = simulation.calculate('uc', period) return period, revnet / uc @reference_formula class revenu_initial_individu(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Revenu initial de l'individu" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') cotisations_employeur_contributives = simulation.calculate('cotisations_employeur_contributives', period) cotisations_salariales_contributives = simulation.calculate('cotisations_salariales_contributives', period) pen = simulation.calculate('pen', period) rev_cap = simulation.calculate('rev_cap', period) rev_trav = simulation.calculate('rev_trav', period) return period, (rev_trav + pen + rev_cap - cotisations_employeur_contributives - cotisations_salariales_contributives) @reference_formula class revini(PersonToEntityColumn): entity_class = Menages label = u"Revenu initial du ménage" operation = 'add' variable = revenu_initial_individu @reference_formula class nivvie_ini(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Menages label = u"Niveau de vie initial du ménage" def function(self, simulation, period): ''' Niveau de vie initial du ménage 'men' ''' period = period.start.offset('first-of', 'year').period('year') revini = simulation.calculate('revini', period) uc = simulation.calculate('uc', period) return period, revini / uc def _revprim(rev_trav, cho, rev_cap, cotisations_employeur, cotisations_salariales): ''' Revenu primaire du ménage Ensemble des revenus d'activités superbruts avant tout prélèvement Il est égale à la valeur ajoutée produite par les résidents 'men' ''' return rev_trav + rev_cap - cotisations_employeur - cotisations_salariales - cho @reference_formula class rev_trav(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Revenus du travail (salariés et non salariés)" url = "http://fr.wikipedia.org/wiki/Revenu_du_travail" def function(self, simulation, period): ''' Revenu du travail ''' period = period.start.offset('first-of', 'year').period('year') rev_sal = simulation.calculate('rev_sal', period) rag = simulation.calculate('rag', period) ric = simulation.calculate('ric', period) rnc = simulation.calculate('rnc', period) return period, rev_sal + rag + ric + rnc @reference_formula class pen(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Total des pensions et revenus de remplacement" url = "http://fr.wikipedia.org/wiki/Rente" def function(self, simulation, period): ''' Pensions ''' period = period.start.period('year').offset('first-of') chonet = simulation.calculate('chonet', period) rstnet = simulation.calculate('rstnet', period) pensions_alimentaires_percues = simulation.calculate('pensions_alimentaires_percues', period) pensions_alimentaires_versees_declarant1 = simulation.calculate( 'pensions_alimentaires_versees_declarant1', period ) rto_declarant1 = simulation.calculate_add('rto_declarant1', period) return period, (chonet + rstnet + pensions_alimentaires_percues + pensions_alimentaires_versees_declarant1 + rto_declarant1) @reference_formula class cotsoc_bar_declarant1(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Cotisations sociales sur les revenus du capital imposés au barème" def function(self, simulation, period): ''' Cotisations sociales sur les revenus du capital imposés au barème ''' period = period.start.period('year').offset('first-of') csg_cap_bar_declarant1 = simulation.calculate('csg_cap_bar_declarant1', period) prelsoc_cap_bar_declarant1 = simulation.calculate('prelsoc_cap_bar_declarant1', period) crds_cap_bar_declarant1 = simulation.calculate('crds_cap_bar_declarant1', period) return period, csg_cap_bar_declarant1 + prelsoc_cap_bar_declarant1 + crds_cap_bar_declarant1 @reference_formula class cotsoc_lib_declarant1(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Cotisations sociales sur les revenus du capital soumis au prélèvement libératoire" def function(self, simulation, period): ''' Cotisations sociales sur les revenus du capital soumis au prélèvement libératoire ''' period = period.start.offset('first-of', 'year').period('year') csg_cap_lib_declarant1 = simulation.calculate('csg_cap_lib_declarant1', period) prelsoc_cap_lib_declarant1 = simulation.calculate('prelsoc_cap_lib_declarant1', period) crds_cap_lib_declarant1 = simulation.calculate('crds_cap_lib_declarant1', period) return period, csg_cap_lib_declarant1 + prelsoc_cap_lib_declarant1 + crds_cap_lib_declarant1 @reference_formula class rev_cap(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Revenus du patrimoine" url = "http://fr.wikipedia.org/wiki/Revenu#Revenu_du_Capital" def function(self, simulation, period): ''' Revenus du patrimoine ''' period = period.start.offset('first-of', 'year').period('year') fon_holder = simulation.compute('fon', period) rev_cap_bar_holder = simulation.compute_add('rev_cap_bar', period) cotsoc_bar_declarant1 = simulation.calculate('cotsoc_bar_declarant1', period) rev_cap_lib_holder = simulation.compute_add('rev_cap_lib', period) cotsoc_lib_declarant1 = simulation.calculate('cotsoc_lib_declarant1', period) imp_lib_holder = simulation.compute('imp_lib', period) rac = simulation.calculate('rac', period) fon = self.cast_from_entity_to_role(fon_holder, role = VOUS) imp_lib = self.cast_from_entity_to_role(imp_lib_holder, role = VOUS) rev_cap_bar = self.cast_from_entity_to_role(rev_cap_bar_holder, role = VOUS) rev_cap_lib = self.cast_from_entity_to_role(rev_cap_lib_holder, role = VOUS) return period, fon + rev_cap_bar + cotsoc_bar_declarant1 + rev_cap_lib + cotsoc_lib_declarant1 + imp_lib + rac @reference_formula class psoc(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"Total des prestations sociales" url = "http://fr.wikipedia.org/wiki/Prestation_sociale" def function(self, simulation, period): ''' Prestations sociales ''' period = period.start.offset('first-of', 'year').period('year') pfam = simulation.calculate('pfam', period) mini = simulation.calculate('mini', period) aides_logement = simulation.calculate('aides_logement', period) return period, pfam + mini + aides_logement @reference_formula class pfam(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"Total des prestations familiales" url = "http://www.social-sante.gouv.fr/informations-pratiques,89/fiches-pratiques,91/prestations-familiales,1885/les-prestations-familiales,12626.html" def function(self, simulation, period): ''' Prestations familiales ''' period = period.start.offset('first-of', 'year').period('year') af = simulation.calculate_add('af', period) cf = simulation.calculate_add('cf', period) ars = simulation.calculate('ars', period) aeeh = simulation.calculate('aeeh', period) paje = simulation.calculate_add('paje', period) asf = simulation.calculate_add('asf', period) crds_pfam = simulation.calculate('crds_pfam', period) return period, af + cf + ars + aeeh + paje + asf + crds_pfam @reference_formula class mini(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"Minima sociaux" url = "http://fr.wikipedia.org/wiki/Minima_sociaux" def function(self, simulation, period): ''' Minima sociaux ''' period = period.start.offset('first-of', 'year').period('year') aspa = simulation.calculate_add('aspa', period) aah_holder = simulation.compute_add('aah', period) caah_holder = simulation.compute_add('caah', period) asi = simulation.calculate_add('asi', period) rsa = simulation.calculate_add('rsa', period) aefa = simulation.calculate('aefa', period) api = simulation.calculate('api', period) ass = simulation.calculate_add('ass', period) psa = simulation.calculate_add('psa', period) aah = self.sum_by_entity(aah_holder) caah = self.sum_by_entity(caah_holder) return period, aspa + aah + caah + asi + rsa + aefa + api + ass + psa @reference_formula class aides_logement(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"Allocations logements" url = "http://vosdroits.service-public.fr/particuliers/N20360.xhtml" def function(self, simulation, period): ''' Prestations logement ''' period = period.start.offset('first-of', 'year').period('year') apl = simulation.calculate_add('apl', period) als = simulation.calculate_add('als', period) alf = simulation.calculate_add('alf', period) crds_logement = simulation.calculate_add('crds_logement', period) return period, apl + als + alf + crds_logement @reference_formula class impo(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Menages label = u"Impôts sur le revenu" url = "http://fr.wikipedia.org/wiki/Imp%C3%B4t_direct" def function(self, simulation, period): ''' Impôts directs ''' period = period.start.offset('first-of', 'year').period('year') irpp_holder = simulation.compute('irpp', period) taxe_habitation = simulation.calculate('taxe_habitation', period) irpp = self.cast_from_entity_to_role(irpp_holder, role = VOUS) irpp = self.sum_by_entity(irpp) return period, irpp + taxe_habitation @reference_formula class crds(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Total des contributions au remboursement de la dette sociale" def function(self, simulation, period): """Contribution au remboursement de la dette sociale""" period = period.start.offset('first-of', 'year').period('year') crds_salaire = simulation.calculate_add('crds_salaire', period) crds_retraite = simulation.calculate_add('crds_retraite', period) crds_chomage = simulation.calculate_add('crds_chomage', period) crds_fon_holder = simulation.compute('crds_fon', period) crds_cap_bar_declarant1 = simulation.calculate('crds_cap_bar_declarant1', period) crds_cap_lib_declarant1 = simulation.calculate('crds_cap_lib_declarant1', period) crds_pfam_holder = simulation.compute('crds_pfam', period) crds_logement_holder = simulation.compute_add('crds_logement', period) crds_mini_holder = simulation.compute_add('crds_mini', period) crds_pv_mo_holder = simulation.compute('crds_pv_mo', period) crds_pv_immo_holder = simulation.compute('crds_pv_immo', period) crds_fon = self.cast_from_entity_to_role(crds_fon_holder, role = VOUS) crds_logement = self.cast_from_entity_to_role(crds_logement_holder, role = CHEF) crds_mini = self.cast_from_entity_to_role(crds_mini_holder, role = CHEF) crds_pfam = self.cast_from_entity_to_role(crds_pfam_holder, role = CHEF) crds_pv_immo = self.cast_from_entity_to_role(crds_pv_immo_holder, role = VOUS) crds_pv_mo = self.cast_from_entity_to_role(crds_pv_mo_holder, role = VOUS) return period, (crds_salaire + crds_retraite + crds_chomage + crds_fon + crds_cap_bar_declarant1 + crds_cap_lib_declarant1 + crds_pv_mo + crds_pv_immo + crds_pfam + crds_logement + crds_mini) @reference_formula class csg(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Total des contributions sociale généralisée" def function(self, simulation, period): """Contribution sociale généralisée""" period = period.start.offset('first-of', 'year').period('year') csg_imposable_salaire = simulation.calculate_add('csg_imposable_salaire', period) csg_deductible_salaire = simulation.calculate_add('csg_deductible_salaire', period) csg_imposable_chomage = simulation.calculate_add('csg_imposable_chomage', period) csg_deductible_chomage = simulation.calculate_add('csg_deductible_chomage', period) csg_imposable_retraite = simulation.calculate_add('csg_imposable_retraite', period) csg_deductible_retraite = simulation.calculate_add('csg_deductible_retraite', period) csg_fon_holder = simulation.compute('csg_fon', period) csg_cap_lib_declarant1 = simulation.calculate('csg_cap_lib_declarant1', period) csg_cap_bar_declarant1 = simulation.calculate('csg_cap_bar_declarant1', period) csg_pv_mo_holder = simulation.compute('csg_pv_mo', period) csg_pv_immo_holder = simulation.compute('csg_pv_immo', period) csg_fon = self.cast_from_entity_to_role(csg_fon_holder, role = VOUS) csg_pv_immo = self.cast_from_entity_to_role(csg_pv_immo_holder, role = VOUS) csg_pv_mo = self.cast_from_entity_to_role(csg_pv_mo_holder, role = VOUS) return period, (csg_imposable_salaire + csg_deductible_salaire + csg_imposable_chomage + csg_deductible_chomage + csg_imposable_retraite + csg_deductible_retraite + csg_fon + csg_cap_lib_declarant1 + csg_pv_mo + csg_pv_immo + csg_cap_bar_declarant1) @reference_formula class cotsoc_noncontrib(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Cotisations sociales non contributives" def function(self, simulation, period): ''' Cotisations sociales non contributives (hors prelsoc_cap_lib, prelsoc_cap_bar) ''' period = period.start.offset('first-of', 'year').period('year') cotisations_employeur_non_contributives = simulation.calculate('cotisations_employeur_non_contributives', period) cotisations_salariales_non_contributives = simulation.calculate('cotisations_salariales_non_contributives', period) return period, cotisations_employeur_non_contributives + cotisations_salariales_non_contributives @reference_formula class prelsoc_cap(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Prélèvements sociaux sur les revenus du capital" url = "http://www.impots.gouv.fr/portal/dgi/public/particuliers.impot?pageId=part_ctrb_soc&paf_dm=popup&paf_gm=content&typePage=cpr02&sfid=501&espId=1&impot=CS" def function(self, simulation, period): """ Prélèvements sociaux sur les revenus du capital """ period = period.start.offset('first-of', 'year').period('year') prelsoc_fon_holder = simulation.compute('prelsoc_fon', period) prelsoc_cap_lib_declarant1 = simulation.calculate('prelsoc_cap_lib_declarant1', period) prelsoc_cap_bar_declarant1 = simulation.calculate('prelsoc_cap_bar_declarant1', period) prelsoc_pv_mo_holder = simulation.compute('prelsoc_pv_mo', period) prelsoc_pv_immo_holder = simulation.compute('prelsoc_pv_immo', period) prelsoc_fon = self.cast_from_entity_to_role(prelsoc_fon_holder, role = VOUS) prelsoc_pv_immo = self.cast_from_entity_to_role(prelsoc_pv_immo_holder, role = VOUS) prelsoc_pv_mo = self.cast_from_entity_to_role(prelsoc_pv_mo_holder, role = VOUS) return period, (prelsoc_fon + prelsoc_cap_lib_declarant1 + prelsoc_cap_bar_declarant1 + prelsoc_pv_mo + prelsoc_pv_immo) @reference_formula class check_csk(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Menages label = u"check_csk" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') prelsoc_cap_bar_declarant1_holder = simulation.compute('prelsoc_cap_bar_declarant1', period) prelsoc_pv_mo_holder = simulation.compute('prelsoc_pv_mo', period) prelsoc_fon_holder = simulation.compute('prelsoc_fon', period) prelsoc_cap_bar = self.sum_by_entity(prelsoc_cap_bar_declarant1_holder) prelsoc_pv_mo = self.cast_from_entity_to_role(prelsoc_pv_mo_holder, role = CHEF) prelsoc_pv_mo = self.sum_by_entity(prelsoc_pv_mo) prelsoc_fon = self.cast_from_entity_to_role(prelsoc_fon_holder, role = CHEF) prelsoc_fon = self.sum_by_entity(prelsoc_fon) return period, prelsoc_cap_bar + prelsoc_pv_mo + prelsoc_fon @reference_formula class check_csg(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Menages label = u"check_csg" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') csg_cap_bar_declarant1_holder = simulation.compute('csg_cap_bar_declarant1', period) csg_pv_mo_holder = simulation.compute('csg_pv_mo', period) csg_fon_holder = simulation.compute('csg_fon', period) csg_cap_bar = self.sum_by_entity(csg_cap_bar_declarant1_holder) csg_pv_mo = self.cast_from_entity_to_role(csg_pv_mo_holder, role = CHEF) csg_pv_mo = self.sum_by_entity(csg_pv_mo) csg_fon = self.cast_from_entity_to_role(csg_fon_holder, role = CHEF) csg_fon = self.sum_by_entity(csg_fon) return period, csg_cap_bar + csg_pv_mo + csg_fon @reference_formula class check_crds(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Menages label = u"check_crds" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') crds_cap_bar_declarant1_holder = simulation.compute('crds_cap_bar_declarant1', period) crds_pv_mo_holder = simulation.compute('crds_pv_mo', period) crds_fon_holder = simulation.compute('crds_fon', period) crds_cap_bar = self.sum_by_entity(crds_cap_bar_declarant1_holder) crds_pv_mo = self.cast_from_entity_to_role(crds_pv_mo_holder, role = CHEF) crds_pv_mo = self.sum_by_entity(crds_pv_mo) crds_fon = self.cast_from_entity_to_role(crds_fon_holder, role = CHEF) crds_fon = self.sum_by_entity(crds_fon) return period, crds_cap_bar + crds_pv_mo + crds_fon PK'Gd==#openfisca_france/model/datatrees.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import collections columns_name_tree_by_entity = collections.OrderedDict([ ('ind', collections.OrderedDict([ ('children', [ collections.OrderedDict([ ('label', u"""Principal"""), ('children', [ 'birth', # Date de naissance 'statmarit', # Statut marital 'salaire_de_base', # Salaire de base, en général appelé salaire brut, la 1ère ligne sur la fiche de paie 'choi', # Autres revenus imposables (chômage, préretraite) 'rsti', # Pensions, retraites, rentes connues imposables ]), ]), collections.OrderedDict([ ('label', u"""Traitements, salaires, primes pour l'emploi et rentes"""), ('children', [ 'activite', # Activité 'fra', # Frais réels 'hsup', # Heures supplémentaires : revenus exonérés connus 'ppe_tp_sa', # Prime pour l'emploi des salariés: indicateur de travail à temps plein sur l'année entière 'ppe_tp_ns', # Prime pour l'emploi des non-salariés: indicateur de travail à temps plein sur l'année entière 'ppe_du_sa', # Prime pour l'emploi des salariés: nombre d'heures payées dans l'année 'ppe_du_ns', # Prime pour l'emploi des non-salariés: nombre de jours travaillés dans l'année 'cho_ld', # Demandeur d'emploi inscrit depuis plus d'un an 'taux_csg_remplacement', # Taux retenu sur la CSG des revenus de remplacment 'pensions_alimentaires_percues', # Pensions alimentaires perçues 'pensions_alimentaires_percues_decl', # Pension déclarée ]), ]), collections.OrderedDict([ ('label', u"""Auto-entrepreneur (ayant opté pour le versement libératoire)"""), ('children', [ 'ebic_impv', # Revenus industriels et commerciaux professionnels imposables: vente de marchandises et assimilées (régime auto-entrepreneur) 'ebic_imps', # Revenus industriels et commerciaux professionnels imposables: prestations de services et locations meublées (régime auto-entrepreneur) 'ebnc_impo', # Revenus non commerciaux (régime auto-entrepreneur ayant opté pour le versement libératoire) ]), ]), collections.OrderedDict([ ('label', u"""Revenus agricoles"""), ('children', [ 'frag_exon', # Revenus agricoles exonérés (régime du forfait) 'frag_impo', # Revenus agricoles imposables (régime du forfait) 'frag_pvct', # Plus-values agricoles à court terme (régime du forfait) 'frag_pvce', # Plus-values agricoles de cession taxables à 16% (régime du forfait) 'arag_exon', # Revenus agricoles exonérés yc plus-values (Régime du bénéfice réel, revenus bénéficiant de l'abattement CGA ou viseur), activités exercées en Corse 'arag_impg', # Revenus agricoles imposables, cas général moyenne triennale (Régime du bénéfice réel, revenus bénéficiant de l'abattement CGA ou viseur) 'arag_defi', # Déficits agricoles (Régime du bénéfice réel, revenus bénéficiant de l'abattement CGA ou viseur) 'arag_pvce', # Plus-values agricoles de cession taxables à 16% (Régime du bénéfice réel, revenus bénéficiant de l'abattement CGA ou viseur) 'nrag_exon', # Revenus agricoles exonérés yc plus-values (Régime du bénéfice réel, revenus ne bénéficiant pas de l'abattement CGA ou viseur), activités exercées en Corse 'nrag_impg', # Revenus agricoles imposables, cas général moyenne triennale (Régime du bénéfice réel, revenus ne bénéficiant pas de l'abattement CGA ou viseur) 'nrag_defi', # Déficits agricoles (Régime du bénéfice réel, revenus ne bénéficiant pas de l'abattement CGA ou viseur) 'nrag_pvce', # Plus-values agricoles de cession taxables à 16% (Régime du bénéfice réel, revenus ne bénéficiant pas de l'abattement CGA ou viseur) 'nrag_ajag', # Jeunes agriculteurs, Abattement de 50% ou 100% (Régime du bénéfice réel, revenus bénéficiant de l'abattement CGA ou viseur) ]), ]), collections.OrderedDict([ ('label', u"""Revenus industriels et commerciaux professionnels"""), ('children', [ 'mbic_exon', # Revenus industriels et commerciaux professionnels nets exonérés (régime micro entreprise) 'mbic_impv', # Revenus industriels et commerciaux professionnels imposables: vente de marchandises (régime micro entreprise) 'mbic_imps', # Revenus industriels et commerciaux professionnels imposables: prestations de services et locations meublées (régime micro entreprise) 'mbic_pvct', # Plus-values industrielles et commerciales professionnels imposables: plus-values nettes à court terme (régime micro entreprise) 'mbic_mvlt', # Moins-values industrielles et commerciales professionnels à long terme (régime micro entreprise) 'mbic_pvce', # Plus-values industrielles et commerciales professionnelles imposables: plus-values de cession taxables à 16% (régime micro entreprise) 'abic_exon', # Revenus industriels et commerciaux nets exonérés yc plus-values avec CGA ou viseur (régime du bénéfice réel) 'nbic_exon', # Revenus industriels et commerciaux nets exonérés yc plus-values sans CGA (régime du bénéfice réel) 'abic_impn', # Revenus industriels et commerciaux imposables: régime normal ou simplifié avec CGA ou viseur (régime du bénéfice réel) 'abic_imps', # Revenus industriels et commerciaux imposables: régime simplifié avec CGA ou viseur (régime du bénéfice réel) 'nbic_impn', # Revenus industriels et commerciaux professionnels imposables: régime normal ou simplifié sans CGA (régime du bénéfice réel) 'nbic_imps', # Revenus industriels et commerciaux professionnels imposables: régime simplifié sans CGA (régime du bénéfice réel) 'abic_defn', # Déficits industriels et commerciaux: régime normal ou simplifié avec CGA ou viseur (régime du bénéfice réel) 'abic_defs', # Déficits industriels et commerciaux: simplifié avec CGA ou viseur (régime du bénéfice réel) 'nbic_defn', # Déficits industriels et commerciaux: régime normal ou simplifié sans CGA (régime du bénéfice réel) 'nbic_defs', # Locations déjà soumises aux prélèvements sociaux sans CGA (régime du bénéfice réel) 'nbic_apch', # Artisans pêcheurs : abattement 50% avec CGA ou viseur (régime du bénéfice réel) 'abic_pvce', # Plus-values industrielles et commerciales de cession taxables à 16% avec CGA ou viseur (régime du bénéfice réel) 'nbic_pvce', # Revenus non commerciaux non professionnels exonérés sans AA (régime de la déclaration controlée) ]), ]), collections.OrderedDict([ ('label', u"""Revenus industriels et commerciaux non professionnels"""), ('children', [ 'macc_exon', # Revenus industriels et commerciaux non professionnels nets exonérés (régime micro entreprise) 'aacc_exon', # Revenus industriels et commerciaux non professionnels exonérés yc plus-values avec CGA ou viseur (régime du bénéfice réel) 'nacc_exon', # Revenus industriels et commerciaux non professionnels exonérés yc plus-values sans CGA (régime du bénéfice réel) 'macc_impv', # Revenus industriels et commerciaux non professionnels imposables: vente de marchandises et assimilées (régime micro entreprise) 'macc_imps', # Revenus industriels et commerciaux non professionnels imposables: prestations de services (régime micro entreprise) 'aacc_impn', # Revenus industriels et commerciaux non professionnels imposables: régime normal ou simplifié avec CGA ou viseur (régime du bénéfice réel) 'aacc_imps', # Locations meublées non professionnelles (régime micro entreprise) 'aacc_defn', # Déficits industriels et commerciaux non professionnels: régime normal ou simplifié avec CGA ou viseur (régime du bénéfice réel) 'aacc_defs', # Déficits de revenus industriels et commerciaux non professionnels avec CGA (régime simplifié du bénéfice réel) 'nacc_impn', # Revenus industriels et commerciaux non professionnels imposables: régime normal ou simplifié sans CGA (régime du bénéfice réel) 'nacc_defn', # Déficits industriels et commerciaux non professionnels: régime normal ou simplifié sans CGA (régime du bénéfice réel) 'nacc_defs', # Locations meublées non professionnelles: Gîtes ruraux et chambres d'hôtes déjà soumis aux prélèvements sociaux avec CGA (régime du bénéfice réel) 'macc_pvct', # Plus-values industrielles et commerciales non professionnelles imposables: plus-values nettes à court terme (régime micro entreprise) 'macc_mvlt', # Moins-values industrielles et commerciales non professionnelles à long terme (régime micro entreprise) 'macc_pvce', # Plus-values industrielles et commerciales non professionnelles imposables: plus-values de cession taxables à 16% (régime micro entreprise) 'aacc_pvce', # Plus-values industrielles et commerciales non professionnelles de cession taxables à 16% avec CGA ou viseur (régime du bénéfice réel) 'nacc_pvce', # Locations meublées non professionnelles: Revenus imposables sans CGA (régime du bénéfice réel) ]), ]), collections.OrderedDict([ ('label', u"""Revenus non commerciaux professionnels"""), ('children', [ 'mbnc_exon', # Revenus non commerciaux professionnels nets exonérés (régime déclaratif spécial ou micro BNC) 'abnc_exon', # Revenus non commerciaux professionnels exonérés (yc compris plus-values) (régime de la déclaration controlée, revenus bénéficiant de l'abattement association agrée ou viseur) 'nbnc_exon', # Revenus non commerciaux professionnels exonérés (yc compris plus-values) (régime de la déclaration controlée, revenus ne bénéficiant pas de l'abattement association agrée) 'mbnc_impo', # Revenus non commerciaux professionnels imposables (régime déclaratif spécial ou micro BNC) 'abnc_impo', # Revenus non commerciaux professionnels imposables (régime de la déclaration controlée, revenus bénéficiant de l'abattement association agrée ou viseur) 'abnc_defi', # Déficits non commerciaux professionnels (régime de la déclaration controlée, revenus bénéficiant de l'abattement association agrée ou viseur) 'nbnc_impo', # Revenus non commerciaux professionnels imposables (régime de la déclaration controlée, revenus ne bénéficiant pas de l'abattement association agrée) 'nbnc_defi', # Déficits non commerciaux professionnels (régime de la déclaration controlée, revenus ne bénéficiant pas de l'abattement association agrée) 'mbnc_pvct', # Plus-values non commerciales professionnelles imposables et Plus-values nettes à court terme (régime déclaratif spécial ou micro BNC) 'mbnc_mvlt', # Moins-values non commerciales professionnelles à long terme (régime déclaratif spécial ou micro BNC) 'mbnc_pvce', # Plus-values non commerciales professionnelles de cession taxables à 16% (régime déclaratif spécial ou micro BNC) 'abnc_pvce', # Plus-values non commerciaux professionnels de cession taxables à 16% (régime de la déclaration controlée, revenus bénéficiant de l'abattement association agrée ou viseur) 'nbnc_pvce', # Déficits industriels et commerciaux: locations meublées sans CGA (régime du bénéfice réel) ]), ]), collections.OrderedDict([ ('label', u"""Revenus non commerciaux non professionnels"""), ('children', [ 'mncn_impo', # Revenus non commerciaux non professionnels imposables (régime déclaratif spécial ou micro BNC) 'cncn_bene', # Revenus non commerciaux non professionnels imposables sans AA (régime de la déclaration controlée) 'cncn_defi', # Déficits non commerciaux non professionnels sans AA (régime de la déclaration controlée) 'mncn_pvct', # Plus-values non commerciales non professionnelles imposables et plus-values nettes à court terme (régime déclaratif spécial ou micro BNC) 'mncn_mvlt', # Moins-values non commerciales non professionnelles à long terme (régime déclaratif spécial ou micro BNC) 'mncn_pvce', # Plus-values non commerciales non professionnelles de cession taxables à 16% (régime déclaratif spécial ou micro BNC) 'cncn_pvce', # Plus-values non commerciales non professionnelles taxables à 16% avec AA ou viseur (régime de la déclaration controlée) ]), ]), collections.OrderedDict([ ('label', u"""Autres"""), ('children', [ u"""adoption""", # Enfant adopté u"""alt""", # Enfant en garde alternée u"""enceinte""", # Est enceinte u"""invalide""", # Invalide u"""rempli_obligation_scolaire""", # Rempli l'obligation scolaire u"""coloc""", # Vie en colocation u"""logement_chambre""", # Le logement est considéré comme une chambre u"""etr""", u"""f6ps""", # Plafond de déduction épargne retraite (plafond calculé sur les revenus perçus en n-1) u"""f6rs""", # Cotisations d'épargne retraite versées au titre d'un PERP, PREFON, COREM et C.G.O.S u"""f6ss""", # Rachat de cotisations PERP, PREFON, COREM et C.G.O.S u"""f7ac""", # Cotisations syndicales des salariées et pensionnés u"""elig_creimp_jeunes""", # Éligible au crédit d'impôt jeunes u"""jei_date_demande""", # Date de demande (et d'octroi) du statut de jeune entreprise innovante (JEI) u"""stage_duree_heures""", # Nombre d'heures effectuées en stage u"""stage_gratification_taux""", # Taux de gratification (en plafond de la Sécurité sociale) u"""scolarite""", # Scolarité de l'enfant : collège, lycée... u"""boursier""", # Élève ou étudiant boursier u"""inapte_travail""", # Reconnu inapte au travail u"""taux_invalidite""", # Taux d'invalidité u"""ass_precondition_remplie""", # Éligible à l'ASS u"""categ_inv""", # Catégorie de handicap (AEEH) u"""pensions_alimentaires_versees_individu""", # Pensions alimentaires versées pour un individu u"""gains_exceptionnels""", # Gains exceptionnels u"""allocation_aide_retour_emploi""", # Allocation d'aide au retour à l'emploi u"""allocation_securisation_professionnelle""", # Allocation de sécurisation professionnelle u"""prime_forfaitaire_mensuelle_reprise_activite""", # Prime forfaitaire mensuelle pour la reprise d'activité u"""indemnites_volontariat""", # Indemnités de volontariat u"""dedommagement_victime_amiante""", # Dédommagement versé aux victimes de l'amiante u"""prestation_compensatoire""", # Dédommagement versé aux victimes de l'amiante u"""pensions_invalidite""", # Pensions d'invalidité u"""bourse_enseignement_sup""", # Bourse de l'enseignement supérieur u"""f5qm""", # Agents généraux d’assurances: indemnités de cessation d’activité u"""nbic_mvct""", # Revenus industriels et commerciaux professionnels moins-values nettes à court terme u"""aacc_gits""", # Location de gîtes ruraux, chambres d'hôtes et meublés de tourisme (régime micro entreprise) u"""nacc_meup""", # Locations meublées non professionnelles: Locations déjà soumises aux prélèvements sociaux (régime micro entreprise) u"""mbnc_mvct""", # Moins-values non commerciales professionnelles nettes à court terme (régime déclaratif spécial ou micro BNC) u"""frag_fore""", # Revenus des exploitants forestiers (régime du forfait) u"""arag_sjag""", # Abattement pour les jeunes agriculteurs des revenus agricoles sans CGA (régime du bénéfice réel) u"""abic_impm""", # Locations meublées imposables avec CGA ou viseur (régime du bénéfice réel pour les revenus industriels et commerciaux professionnels) u"""nbic_impm""", # Locations meublées imposables sans CGA (régime du bénéfice réel) u"""abic_defm""", # Déficits de locations meubléesavec CGA ou viseur (régime du bénéfice réel pour les revenus industriels et commerciaux professionnels) u"""alnp_imps""", # Locations meublées non professionnelles imposables avec CGA ou viseur (régime du bénéfice réel) u"""alnp_defs""", # Déficits de locations meublées non professionnelles avec CGA ou viseur (régime du bénéfice réel) u"""nlnp_defs""", # Déficits de locations meublées non professionnelles imposables sans CGA (régime du bénéfice réel) u"""cbnc_assc""", # Agents généraux d'assurances : indemnités de cessation d'activité (revenus non commerciaux professionnels, régime de la déclaration contrôlée) u"""abnc_proc""", # Honoraires de prospection commerciale exonérés avec CGA ou viseur (revenus non commerciaux professionnels, régime de la déclaration contrôlée) u"""nbnc_proc""", # Honoraires de prospection commerciale exonérés sans CGA (revenus non commerciaux professionnels, régime de la déclaration contrôlée) u"""mncn_exon""", # Revenus nets exonérés non commerciaux non professionnels (régime déclaratif spécial ou micro BNC) u"""cncn_exon""", # Revenus nets exonérés non commerciaux non professionnels (régime de la déclaration contrôlée) u"""cncn_aimp""", # Revenus imposables non commerciaux non professionnels avec CGA (régime de la déclaration contrôlée) u"""cncn_adef""", # Déficits non commerciaux non professionnels avec CGA (régime de la déclaration contrôlée) u"""cncn_info""", # Inventeurs et auteurs de logiciels : produits taxables à 16%, revenus non commerciaux non professionnels avec CGA (régime de la déclaration contrôlée) u"""cncn_jcre""", # Jeunes créateurs : abattement de 50%, revenus non commerciaux non professionnels avec CGA (régime de la déclaration contrôlée) u"""revimpres""", # Revenus nets à imposer aux prélèvements sociaux u"""pveximpres""", # Plus-values à long terme exonérées en cas de départ à la retraite à imposer aux prélèvements sociaux u"""pvtaimpres""", # Plus-values à long terme taxables à 16% à la retraite à imposer aux prélèvements sociaux u"""f5sq""", u"""tns_auto_entrepreneur_chiffre_affaires""", # Chiffre d'affaires en tant qu'auto-entrepreneur u"""tns_micro_entreprise_chiffre_affaires""", # Chiffre d'affaires en de micro-entreprise u"""tns_auto_entrepreneur_type_activite""", # Type d'activité de l'auto-entrepreneur u"""tns_micro_entreprise_type_activite""", # Type d'activité de la micro-entreprise u"""tns_autres_revenus""", # Autres revenus non salariés u"""tns_autres_revenus_chiffre_affaires""", # Chiffre d'affaire pour les TNS non agricoles autres que les AE et ME u"""tns_autres_revenus_type_activite""", # Type d'activité de l'entreprise non AE ni ME u"""tns_employe""", # Le TNS a au moins un employé. Ne s'applique pas pour les agricoles ni auto-entrepreneurs ni micro entreprise u"""tns_benefice_exploitant_agricole""", # Dernier bénéfice agricole u"""indemnites_stage""", # Indemnités de stage u"""revenus_stage_formation_pro""", # Revenus de stage de formation professionnelle u"""bourse_recherche""", # Bourse de recherche u"""sal_pen_exo_etr""", # Salaires et pensions exonérés de source étrangère retenus pour le calcul du taux effectif u"""nbsala""", # Nombre de salariés dans l'établissement de l'emploi actuel u"""tva_ent""", # L'entreprise employant le salarié paye de la TVA u"""exposition_accident""", # Exposition au risque pour les accidents du travail u"""allegement_fillon_mode_recouvrement""", # Mode de recouvrement des allègements Fillon u"""apprentissage_contrat_debut""", # Date de début du contrat d'apprentissage u"""arrco_tranche_a_taux_employeur""", # Taux ARRCO tranche A employeur) propre à l'entreprise u"""arrco_tranche_a_taux_salarie""", # Taux ARRCO tranche A salarié) propre à l'entreprise u"""assujettie_taxe_salaires""", # Entreprise assujettie à la taxe sur les salaires u"""avantage_en_nature_valeur_reelle""", # Avantages en nature (Valeur réelle) u"""indemnites_compensatrices_conges_payes""", u"""contrat_de_travail""", # Type contrat de travail u"""contrat_de_travail_debut""", # Date d'arrivée dans l'entreprise u"""contrat_de_travail_fin""", # Date de départ de l'entreprise u"""contrat_de_travail_duree""", # Type (durée determinée ou indéterminée) du contrat de travail u"""cotisation_sociale_mode_recouvrement""", # Mode de recouvrement des cotisations sociales u"""depcom_entreprise""", # Localisation entreprise (depcom) u"""code_postal_entreprise""", # Localisation entreprise (Code postal) u"""effectif_entreprise""", # Effectif de l'entreprise u"""entreprise_assujettie_cet""", # Entreprise assujettie à la contribution économique territoriale u"""entreprise_assujettie_is""", # Entreprise assujettie à l'impôt sur les sociétés (IS) u"""entreprise_assujettie_tva""", # Entreprise assujettie à la TVA u"""entreprise_benefice""", # Bénéfice de l'entreprise u"""entreprise_bilan""", # Bilan de l'entreprise u"""entreprise_chiffre_affaire""", # Chiffre d'affaire de l'entreprise u"""entreprise_creation""", # Date de création de l'entreprise u"""nombre_tickets_restaurant""", # Nombre de tickets restaurant u"""nouvelle_bonification_indiciaire""", # Nouvelle bonification indicaire u"""prevoyance_obligatoire_cadre_taux_employe""", # Taux de cotisation employeur pour la prévoyance obligatoire des cadres u"""prevoyance_obligatoire_cadre_taux_employeur""", # Taux de cotisation employeur pour la prévoyance obligatoire des cadres u"""primes_salaires""", # Indemnités, primes et avantages en argent u"""prise_en_charge_employeur_prevoyance_complementaire""", # Part salariale des cotisations de prévoyance complémentaire prise en charge par l'employeur u"""prise_en_charge_employeur_retraite_complementaire""", # Part salariale des cotisations de retraite complémentaire prise en charge par l'employeur u"""prise_en_charge_employeur_retraite_supplementaire""", # Part salariale des cotisations de retraite supplémentaire prise en charge par l'employeur u"""ratio_alternants""", # Ratio d'alternants dans l'effectif moyen u"""redevable_taxe_apprentissage""", # Entreprise redevable de la taxe d'apprentissage u"""remboursement_transport_base""", # Base pour le calcul du remboursement des frais de transport u"""indemnites_forfaitaires""", # Indemnités forfaitaires (transport, nourriture) u"""titre_restaurant_taux_employeur""", # Taux de participation de l'employeur au titre restaurant u"""titre_restaurant_valeur_unitaire""", # Valeur faciale unitaire du titre restaurant u"""titre_restaurant_volume""", # Volume des titres restaurant u"""traitement_indiciaire_brut""", # Traitement indiciaire brut (TIB) u"""type_sal""", # Catégorie de salarié u"""heures_duree_collective_entreprise""", # Durée mensuelle collective dans l'entreprise (heures, temps plein) u"""heures_non_remunerees_volume""", # Volume des heures non rémunérées (convenance personnelle hors contrat/forfait) u"""heures_remunerees_volume""", # Volume des heures rémunérées contractuellement (heures/mois, temps partiel) u"""forfait_heures_remunerees_volume""", # Volume des heures rémunérées à un forfait heures u"""forfait_jours_remuneres_volume""", # Volume des heures rémunérées à forfait jours u"""volume_jours_ijss""", # Volume des jours pour lesquels sont versés une idemnité journalière par la sécurité sociale u"""epargne_non_remuneree""", # Épargne non rémunérée u"""interets_epargne_sur_livrets""", # Intérêts versés pour l'épargne sur livret u"""revenus_capital""", # Revenus du capital u"""revenus_locatifs""", # Revenus locatifs u"""valeur_locative_immo_non_loue""", # Valeur locative des biens immobiliers possédés et non loués u"""valeur_locative_terrains_non_loue""", # Valeur locative des terrains possédés et non loués u"""f1tv""", # Gains de levée d'options sur titres en cas de cession ou de conversion au porteur dans le délai d'indisponibilité: entre 1 et 2 ans u"""f1tw""", # Gains de levée d'options sur titres en cas de cession ou de conversion au porteur dans le délai d'indisponibilité: entre 2 et 3 ans u"""f1tx""", # Gains de levée d'options sur titres en cas de cession ou de conversion au porteur dans le délai d'indisponibilité: entre 3 et 4 ans u"""f3vd""", # Gains de levée d'options sur titres et gains d'acquisition d'actions taxables à 18 % u"""f3vf""", # Gains de levée d'options sur titres et gains d'acquisition d'actions taxables à 41 % u"""f3vi""", # Gains de levée d'options sur titres et gains d'acquisition d'actions taxables à 30 % u"""f3vj""", # Gains imposables sur option dans la catégorie des salaires u"""f3va""", # Abattement pour durée de détention des titres en cas de départ à la retraite d'un dirigeant appliqué sur des plus-values u"""chobrut""", # Chômage brut u"""indemnites_chomage_partiel""", # Indemnités de chômage partiel u"""rstbrut""", # Retraite brute u"""aer""", # Allocation équivalent retraite (AER) u"""retraite_combattant""", # Retraite du combattant u"""indemnites_journalieres_maternite""", # Indemnités journalières de maternité u"""indemnites_journalieres_paternite""", # Indemnités journalières de paternité u"""indemnites_journalieres_adoption""", # Indemnités journalières d'adoption u"""indemnites_journalieres_maladie""", # Indemnités journalières de maladie u"""indemnites_journalieres_accident_travail""", # Indemnités journalières d'accident du travail u"""indemnites_journalieres_maladie_professionnelle""", # Indemnités journalières de maladie professionnelle ]), ]), ]), ])), ('fam', collections.OrderedDict([ ('children', [ collections.OrderedDict([ ('label', u"""Principal"""), ('children', [ u"""inactif""", # Parent inactif (PAJE-CLCA) u"""partiel1""", # Parent actif à moins de 50% (PAJE-CLCA) u"""partiel2""", # Parent actif entre 50% et 80% (PAJE-CLCA) u"""opt_colca""", # Opte pour le COLCA u"""empl_dir""", # Emploi direct (CLCMG) u"""ass_mat""", # Assistante maternelle (CLCMG) u"""gar_dom""", # Garde à domicile (CLCMG) ]), ]), collections.OrderedDict([ ('label', u"""Autres"""), ('children', [ u"""proprietaire_proche_famille""", # Le propriétaire du logement a un lien de parenté avec la personne de référence ou son conjoint u"""paje_prepare""", # Prestation Partagée d’éducation de l’Enfant (PreParE) ]), ]), ]), ])), ('foy', collections.OrderedDict([ ('children', [ collections.OrderedDict([ ('label', u"""Principal"""), ('children', [ u"""jour_xyz""", # Jours décomptés au titre de cette déclaration ]), ]), collections.OrderedDict([ ('label', u"""Situations particulières"""), ('children', [ 'caseK', # Situation pouvant donner droit à une demi-part supplémentaire: vous avez eu un enfant décédé après l’âge de 16 ans ou par suite de faits de guerre 'caseL', # Situation pouvant donner droit à une demi-part supplémentaire: vous vivez seul au 1er janvier de l'année de perception des revenus et vous avez élevé un enfant pendant au moins 5 ans durant la période où vous viviez seul 'caseE', # Situation pouvant donner droit à une demi-part supplémentaire : vous vivez seul au 1er janvier de l'année de perception des revenus et vous avez élevé un enfant pendant moins de 5 ans durant la période où vous viviez seul 'caseN', # Vous ne viviez pas seul au 1er janvier de l'année de perception des revenus 'caseP', # Titulaire d'une pension pour une invalidité d'au moins 40 % ou d'une carte d'invalidité d'au moins 80% 'caseF', # Situation pouvant donner droit à une demi-part supplémentaire : conjoint titulaire d'une pension ou d'une carte d'invalidité (vivant ou décédé l'année de perception des revenus) 'caseW', # Vous ou votre conjoint (même s'il est décédé), âgés de plus de 75 ans, êtes titulaire de la carte du combattant ou d'une pension militaire d'invalidité ou de victime de guerre 'caseS', # Vous êtes mariés/pacsés et l'un des deux déclarants âgé de plus de 75 ans est titulaire de la carte du combattant ou d'une pension militaire d'invalidité ou de victime de guerre 'caseG', # Titulaire d'une pension de veuve de guerre 'caseH', # Année de naissance des enfants à charge en garde alternée 'nbN', # Nombre d'enfants mariés/pacsés et d'enfants non mariés chargés de famille 'nbR', # Nombre de titulaires (autres que les enfants) de la carte invalidité d'au moins 80 % 'caseT', # Vous êtes parent isolé au 1er janvier de l'année de perception des revenus 'rfr_n_2', # Revenu fiscal de référence année n - 2 'nbptr_n_2', # Nombre de parts année n - 2 ]), ]), collections.OrderedDict([ ('label', u"""Traitements, salaires, primes pour l'emploi, pensions et rentes"""), ('children', [ 'f1aw', # Rentes viagères à titre onéreux perçues par le foyer par âge d'entrée en jouissance : Moins de 50 ans 'f1bw', # Rentes viagères à titre onéreux perçues par le foyer par âge d'entrée en jouissance : De 50 à 59 ans 'f1cw', # Rentes viagères à titre onéreux perçues par le foyer par âge d'entrée en jouissance : De 60 à 69 ans 'f1dw', # Rentes viagères à titre onéreux perçues par le foyer par âge d'entrée en jouissance : A partir de 70 ans ]), ]), collections.OrderedDict([ ('label', u"""Revenus des valeurs et capitaux mobiliers"""), ('children', [ 'f2da', # Revenus des actions et parts soumis au prélèvement libératoire de 21 % 'f2dh', # Produits d’assurance-vie et de capitalisation soumis au prélèvement libératoire de 7.5 % 'f2ee', # Autres produits de placement soumis aux prélèvements libératoires 'f2dc', # Revenus des actions et parts donnant droit à abattement 'f2fu', # Revenus imposables des titres non côtés détenus dans le PEA et distributions perçues via votre entreprise donnant droit à abattement 'f2ch', # Produits des contrats d'assurance-vie et de capitalisation d'une durée d'au moins 6 ou 8 ans donnant droit à abattement 'f2ts', # Revenus de valeurs mobilières, produits des contrats d'assurance-vie d'une durée inférieure à 8 ans et distributions (n'ouvrant pas droit à abattement) 'f2go', # Autres revenus distribués et revenus des structures soumises hors de France à un régime fiscal privilégié (n'ouvrant pas droit à abattement) 'f2tr', # Produits de placements à revenu fixe, intérêts et autres revenus assimilés (n'ouvrant pas droit à abattement) 'f2cg', # Revenus des lignes 2DC, 2CH, 2TS, 2TR déjà soumis au prélèvement sociaux sans CSG déductible 'f2bh', # Revenus des lignes 2DC, 2CH, 2TS, 2TR déjà soumis au prélèvement sociaux avec CSG déductible 'f2ca', # Frais et charges déductibles 'f2aa', # Déficits des années antérieures non encore déduits 'f2ab', # Crédits d'impôt sur valeurs étrangères 'f2al', # Déficits des années antérieures non encore déduits 'f2am', # Déficits des années antérieures non encore déduits 'f2an', # Déficits des années antérieures non encore déduits 'f2aq', # Déficits des années antérieures non encore déduits 'f2ar', # Déficits des années antérieures non encore déduits 'f2as', # Déficits des années antérieures non encore déduits: année 2012 'f2gr', # Revenus distribués dans le PEA (pour le calcul du crédit d'impôt de 50 %) ]), ]), collections.OrderedDict([ ('label', u"""Plus-values de cession de valeurs mobilières, droits sociaux et gains assimilés"""), ('children', [ 'f3vc', # Produits et plus-values exonérés provenant de structure de capital-risque 'f3ve', # Plus-values réalisées par les non-résidents pour lesquelles vous demandez le remboursement de l'excédent du prélèvement de 45 % 'f3vl', # Distributions par des sociétés de capital-risque taxables à 19 % 'f3vm', # Clôture du PEA avant l'expiration de la 2e année: gains taxables à 22.5 % 'f3vg', # Plus-value imposable sur gains de cession de valeurs mobilières, de droits sociaux et gains assimilés 'f3vh', # Perte de l'année de perception des revenus 'f3vt', # Clôture du PEA entre la 2e et la 5e année: gains taxables à 19 % 'f3vu', 'f3vv', # Plus-values réalisées par les non-résidents: montant du prélèvement de 45 % déjà versé 'f3si', 'f3sa', 'f3sf', 'f3sd', 'f3vz', # Plus-values imposables sur cessions d’immeubles ou de biens meubles ]), ]), collections.OrderedDict([ ('label', u"""Revenus fonciers"""), ('children', [ 'f4ba', # Revenus fonciers imposables 'f4bb', # Déficit imputable sur les revenus fonciers 'f4bc', # Déficit imputable sur le revenu global 'f4bd', # Déficits antérieurs non encore imputés 'f4be', # Micro foncier: recettes brutes sans abattement 'f4bf', # Primes d'assurance pour loyers impayés des locations conventionnées 'f4bl', ]), ]), collections.OrderedDict([ ('label', u"""Charges déductibles"""), ('children', [ 'f6de', # CSG déductible calculée sur les revenus du patrimoine 'f6gi', # Pensions alimentaires versées à des enfants majeurs (décision de justice définitive avant 2006): 1er enfant 'f6gj', # Pensions alimentaires versées à des enfants majeurs (décision de justice définitive avant 2006): 2eme enfant 'f6el', # Autres pensions alimentaires versées à des enfants majeurs: 1er enfant 'f6em', # Autres pensions alimentaires versées à des enfants majeurs: 2eme enfant 'f6gp', # Autres pensions alimentaires versées décision de justice définitive avant 2006 (mineurs, ascendants) 'f6gu', # Autres pensions alimentaires versées (mineurs, ascendants) 'f6eu', # Frais d'accueil de personnes de plus de 75 ans dans le besoin 'f6ev', # Nombre de personnes de plus de 75 ans dans le besoin accueillies sous votre toit 'f6dd', # Déductions diverses 'f6aa', # Souscriptions en faveur du cinéma ou de l’audiovisuel 'f6cc', # Souscriptions au capital des SOFIPÊCHE 'f6eh', 'f6da', # Pertes en capital consécutives à la souscription au capital de sociétés nouvelles ou de sociétés en difficulté 'f6cb', # Dépenses de grosses réparations effectuées par les nus-propriétaires (dépenses réalisées au cours de l'année de perception des revenus) 'f6hj', # Dépenses de grosses réparations effectuées par les nus-propriétaires: report des dépenses des années antérieures 'f6gh', # Sommes à ajouter au revenu imposable 'f6fa', # Deficits globaux des années antérieures non encore déduits les années précédentes: année de perception des revenus -6 'f6fb', # Deficits globaux des années antérieures non encore déduits: année de perception des revenus -5 'f6fc', # Deficits globaux des années antérieures non encore déduits: année de perception des revenus -4 'f6fd', # Deficits globaux des années antérieures non encore déduits: année de perception des revenus -3 'f6fe', # Deficits globaux des années antérieures non encore déduits: année de perception des revenus -2 'f6fl', # Deficits globaux des années antérieures non encore déduits: année de perception des revenus -1 ]), ]), collections.OrderedDict([ ('label', u"""Charges déductibles (autres)"""), ('children', [ 'f7ud', # Dons à des organismes d'aide aux personnes en difficulté 'f7uf', # Dons à d'autres oeuvres d'utilité publique ou fiscalement assimilables aux oeuvres d'intérêt général 'f7xs', # Report des années antérieures des dons (report des réductions et crédits d'impôt): année de perception des revenus -5 'f7xt', # Report des années antérieures des dons (report des réductions et crédits d'impôt): année de perception des revenus -4 'f7xu', # Report des années antérieures des dons (report des réductions et crédits d'impôt): année de perception des revenus -3 'f7xw', # Report des années antérieures des dons (report des réductions et crédits d'impôt): année de perception des revenus -2 'f7xy', # Report des années antérieures des dons (report des réductions et crédits d'impôt): année de perception des revenus -1 'f7db', # Sommes versées pour l'emploi d'un salarié à domicile par les personnes ayant excercé une activité professionnelle ou ayant été demandeur d'emploi l'année de perception des revenus déclarés 'f7df', # Sommes versées pour l'emploi d'un salarié à domicile par les personnes retraités, ou inactives l'année de perception des revenus déclarés 'f7dq', # Emploi direct pour la première fois d'un salarié à domicile durant l'année de perception des revenus déclarés 'f7dg', # Vous, votre conjoint ou une personne à votre charge à une carte d'invalidité d'au moins 80 % l'année de perception des revenus déclarés 'f7dl', # Nombre d'ascendants bénéficiaires de l'APA, âgés de plus de 65 ans, pour lesquels des dépenses ont été engagées l'année de perception des revenus déclarés 'f7vy', # Intérêt des emprunts contractés pour l'acquisition ou la construction de l'habitation principale: logements anciens (acquis entre le 06/05/2007 et le 30/09/2011) ou neufs (acquis entre le 06/05/2007 et le 31/12/2009): Première annuité 'f7vz', # Intérêt des emprunts contractés pour l'acquisition ou la construction de l'habitation principale: logements anciens (acquis entre le 06/05/2007 et le 30/09/2011) ou neufs (acquis entre le 06/05/2007 et le 31/12/2009): annuités suivantes 'f7vx', # Intérêt des emprunts contractés pour l'acquisition ou la construction de l'habitation principale: logements neufs BBC acquis ou construits du 01/01/2009 au 30/09/2011 'f7vw', # Intérêt des emprunts contractés pour l'acquisition ou la construction de l'habitation principale: logements neufs non-BBC acquis ou construits du 01/01/2010 au 31/12/2010: première annuité 'f7cd', # Dépenses d'accueil dans un établissement pour personnes âgées dépendantes: 1ere personne 'f7ce', # Dépenses d'accueil dans un établissement pour personnes âgées dépendantes: 2éme personne 'f7ga', # Frais de garde des enfants de moins de 6 ans au 01/01 de l'année de perception des revenus: 1er enfant à charge 'f7gb', # Frais de garde des enfants de moins de 6 ans au 01/01 de l'année de perception des revenus: 2ème enfant à charge 'f7gc', # Frais de garde des enfants de moins de 6 ans au 01/01 de l'année de perception des revenus: 3ème enfant à charge 'f7ge', # Frais de garde des enfants de moins de 6 ans au 01/01 de l'année de perception des revenus: 1er enfant à charge en résidence alternée 'f7gf', # Frais de garde des enfants de moins de 6 ans au 01/01 de l'année de perception des revenus: 2ème enfant à charge en résidence alternée 'f7gg', # Frais de garde des enfants de moins de 6 ans au 01/01 de l'année de perception des revenus: 3ème enfant à charge en résidence alternée 'f7ea', # Nombre d'enfants à charge poursuivant leurs études au collège 'f7eb', # Nombre d'enfants à charge en résidence alternée poursuivant leurs études au collège 'f7ec', # Nombre d'enfants à charge poursuivant leurs études au lycée 'f7ed', # Nombre d'enfants à charge en résidence alternée poursuivant leurs études au lycée 'f7ef', # Nombre d'enfants à charge poursuivant leurs études dans l'enseignement supérieur 'f7eg', # Nombre d'enfants à charge en résidence alternée poursuivant leurs études dans l'enseignement supérieur 'f7td', # Intérêts des prêts étudiants versés avant l'année de perception des revenus déclarés 'f7vo', # Nombre d'années de remboursement du prêt étudiant avant l'année de perception des revenus déclarés 'f7uk', # Intérêts des prêts étudiants versés durant l'année de perception des revenus déclarés 'f7gz', # Primes de rente survie, contrats d'épargne handicap 'f7wm', # Prestations compensatoires: Capital fixé en substitution de rente 'f7wn', # Prestations compensatoires: Sommes versées l'année de perception des revenus déclarés 'f7wo', # Prestations compensatoires: Sommes totales décidées par jugement l'année de perception des revenus déclarés ou capital reconstitué 'f7wp', # Prestations compensatoires: Report des sommes décidées l'année de perception des revenus -1 'f7we', # Dépenses en faveur de la qualité environnementale de l'habitation principale: éco-prêt à taux zéro avec offre de prêt émise l'année de perception des revenus déclarés 'f7wq', # Dépenses en faveur de la qualité environnementale de l'habitation principale: dépenses d'isolation thermique des parois vitrées du 01/01/2012 au 03/04/2012 'f7wh', # Dépenses en faveur de la qualité environnementale de l'habitation principale (logement achevé depuis plus de 2 ans): bouquet de travaux réalisé pendant l'année de perception des revenus 'f7wk', # Votre habitation principale est une maison individuelle 'f7wf', # Dépenses en faveur de la qualité environnementale de l'habitation principale: dépenses d'isolation thermique des parois vitrées avant le 01/01/n-1 'f7wi', # Dépenses en faveur de l'aide aux personnes réalisées dans l'habitation principale: Ascenseurs électriques à traction 'f7wj', # Dépenses en faveur de l'aide aux personnes réalisées dans l'habitation principale: équipements spécialement conçus pour les personnes âgées ou handicapées 'f7wl', # Dépenses en faveur de l'aide aux personnes réalisées dans l'habitation principale: travaux de prévention des risques technologiques 'f7ur', # Investissements réalisés en n-1, total réduction d’impôt 'f7oz', # Investissements outre-mer: report de réduction d'impôt non imputée les années antérieures année n-6 'f7pz', # Investissements outre-mer réalisés en 2007 dans le cadre d'une entreprise: report de réduction d'impôt non imputée les années antérieures 'f7qz', # Investissements outre-mer réalisés en 2008 dans le casdre d'une entreprise: report de réduction d'impôt non imputée les années antérieures 'f7rz', # Investissements outre-mer: report de réduction d'impôt non imputée les années antérieures année n-3 'f7sz', # Dépenses en faveur de la qualité environnementale des logements donnés en location 'f7fy', # Aide aux créateurs et repreneurs d'entreprises, nombre de créateurs aidés: conventions signées avant l'année n-1 et ayant pris fin en année n-1 'f7gy', # Aide aux créateurs et repreneurs d'entreprises, nombre de créateurs aidés dont handicapés: conventions signées avant l'année n-1 et ayant pris fin en année n-1 'f7jy', # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, réalisés en 2010 avec promesse d'achat en 2009 ou réalisés en 2009 'f7hy', # Aide aux créateurs et repreneurs d'entreprises, nombre de créateurs aidés: conventions signées en n-1 et n'ayant pas pris fin en n-1 'f7ky', # Aide aux créateurs et repreneurs d'entreprises, nombre de créateurs aidés dont handicapés: conventions signées en n-1 et ayant pris fin en n-1 'f7iy', # Report du solde de réduction d'impôt non encore imputé sur les investissements réalisés 'f7ly', # Aide aux créateurs et repreneurs d'entreprises, nombre de créateurs aidés: conventions ayant pas pris fin l'année de perception des revenus déclarés 'f7my', # Aide aux créateurs et repreneurs d'entreprises, nombre de créateurs aidés dont handicapés: conventions ayant pas pris fin l'année de perception des revenus déclarés 'f7ra', # Travaux de restauration immobilière dans une zone de protection du patrimoine architectural, urbain et paysager 'f7rb', # Travaux de restauration immobilière dans un secteur sauvegardé ou assimilé 'f7gw', # Investissements achevés en n-2 en Polynésie française, Nouvelle Calédonie, dans les îles Walllis et Futuna : report de 1/5 de la réduction d'impôt 'f7gx', # Investissements achevés en n-2 avec promesse d'achat en n-3 en Polynésie française, Nouvelle Calédonie, dans les îles Walllis et Futuna : report de 1/5 de la réduction d'impôt 'f7xc', # Investissements locatifs dans le secteur de touristique: prix d'acquisition ou de revient d'un logement neuf acquis ou achevé en n-1 'f7xd', # Investissements locatifs dans le secteur de touristique: logement neuf, demande d'étalement du solde de la réduction d'impôt sur 6 ans 'f7xe', # Investissements locatifs dans le secteur de touristique: réhabilitation d'un logement, demande d'étalement du solde de la réduction d'impôt sur 6 ans 'f7xf', # Investissements locatifs dans le secteur de touristique, logement neuf: report des dépenses d'investissement des années antérieures 'f7xh', # Investissements locatifs dans le secteur de touristique: travaux de reconstruction, agrandissement, réparation dans une résidence de tourisme classée ou un meublé de tourisme 'f7xi', # Investissements locatifs dans le secteur de touristique, logement neuf: report des dépenses d'investissement des années antérieures 'f7xj', # Investissements locatifs dans le secteur de touristique: réhabilitation d'un logement, report des dépenses d'investissement des années antérieures 'f7xk', # Investissements locatifs dans une résidence hôtelière à vocation sociale: report des dépenses d'investissement des années antérieures 'f7xl', # Investissements locatifs dans le secteur de touristique: réhabilitation d'un logement, prix de revient d'un logement réhabilité en n-1 et achevé depuis moins de 15 ans 'f7xm', # Investissements locatifs dans le secteur de touristique: réhabilitation d'un logement, report de dépenses des travaux de réhabilitation achevés les années antérieures 'f7xn', # Investissements locatifs dans le secteur de touristique, logement neuf: report des dépenses d'investissement des années antérieures 'f7xo', # Investissements locatifs dans une résidence hôtelière à vocation sociale: report des dépenses d'investissement des années antérieures 'f7cf', # Souscriptions au capital des PME non cotées, petites entreprises en phase de démarrage, ou d'expansion 'f7cl', # Souscriptions au capital des PME non cotées, report de versement de l'année de perception des revenus -4 'f7cm', # Souscriptions au capital des PME non cotées, report de versement de l'année de perception des revenus -3 'f7cn', # Souscriptions au capital des PME non cotées, report de versement de l'année de perception des revenus -2 'f7cu', # Souscriptions au capital des PME non cotées, montant versé au titre de souscriptions antérieures 'f7gs', # Reports concernant les investissements achevés ou acquis au cours des années antérieures: Investissements réalisés en n-3 en métropole, dans les DOM, à Saint-Barthélemy, Saint-Martin, Saint-Pierre-et-Miquelon 'f7ua', 'f7ub', 'f7uc', # Cotisations pour la défense des forêts contre l'incendie 'f7ui', 'f7uj', 'f7qb', 'f7qc', 'f7qd', 'f7ql', 'f7qt', 'f7qm', 'f7gq', # Souscription de parts de fonds communs de placement dans l'innovation 'f7fq', # Souscription de parts de fonds d'investissement de proximité 'f7fm', # Souscription de parts de fonds d'investissement de proximité investis en Corse 'f7fl', # Souscription de parts de fonds d'investissement de proximité investis outre-mer par des personnes domiciliées outre-mer 'f7gn', # Souscriptions au capital de SOFICA 36 % 'f7fn', # Souscriptions au capital de SOFICA 30 % 'f7fh', # Intérêts d'emprunt pour reprise de société 'f7ff', # Frais de comptabilité et d'adhésion à un CGA (centre de gestion agréée) ou à une AA (association agréée) 'f7fg', # Frais de comptabilité et d'adhésion à un CGA ou à une AA: nombre d'exploitations 'f7nz', # Travaux de conservation et de restauration d’objets classés monuments historiques 'f7ka', # Dépenses de protection du patrimoine naturel 'f7wg', # Dépenses en faveur de la qualité environnementale de l'habitation principale: éco-prêt à taux zéro avec offre de prêt émise l'année de perception des revenus déclarés -1 'f7uh', # Dons et cotisations versés aux partis politiques 'f7un', # Investissements forestiers: acquisition 'f7um', # Intérêts pour paiement différé accordé aux agriculteurs 'f7hj', # Investissements locatifs neufs dispositif Scellier: investissements réalisés en 2010 en métropole 'f7hk', # Investissements locatifs neufs dispositif Scellier: investissements réalisés en 2010 dans les DOM-COM 'f7hn', # Investissements locatifs neufs dispositif Scellier: investissements réalisés en 2010 en métropole avec promesse d'achat avant le 1er janvier 2010 'f7ho', # Investissements locatifs neufs dispositif Scellier: investissements réalisés en 2010 dans les DOM-COM avec promesse d'achat avant le 1er janvier 2010 'f7hl', # Investissements locatifs neufs dispositif Scellier: investissements réalisés en 2009 (métropole et DOM ne respectant pas les plafonds) 'f7hm', # Investissements locatifs neufs dispositif Scellier: investissements réalisés en 2009 dans les DOM et respectant les plafonds 'f7hr', # Investissements locatifs neufs dispositif Scellier: investissements réalisés et achevés en 2009, en métropole en 2009; dans les DOM du 1.1.2009 au 26.5.2009 ; dans les DOM du 27.5.2009 au 30.12.2009 lorsqu'ils ne respectent pas les plafonds spécifiques 'f7hs', # Investissements locatifs neufs dispositif Scellier: investissements réalisés et achevés en 2009 dans les DOM COM du 27.5.2009 au 31.12.2009 respectant les plafonds spécifiques 'f7la', # Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2009 ou 2010 ou réalisés et achevés en 2010 avec engagement avant le 1.1.2010, Report de l'année 2009 'f7ij', # Investissement destinés à la location meublée non professionnelle: Investissements réalisés en 2011 et achevés en 2012, engagement de réalisation de l'investissement en 2011 'f7il', # Investissement destinés à la location meublée non professionnelle: Investissements réalisés en 2011 et achevés en 2012, promesse d'achat en 2010 'f7im', # Investissement destinés à la location meublée non professionnelle: Investissements réalisés en 2010 et achevés en 2012 avec promesse d'achat en 2009 'f7ik', # Investissements destinés à la location meublée non professionnelle : Reports de 1/9 de l'investissement réalisé et achevé en 2009 'f7is', # Investissements destinés à la location meublée non professionnelle : Report du solde de réduction d'impôt non encore imputé: année n-4 'f7gt', # Scellier: report de 1/9 de la réduction d'impôt des investissements achevés en 2012 avec promesse d'achat en 2010 'f7xg', # Investissement locatif dans le secteur touristique, travaux réalisés dans un village résidentiel de tourisme 'f7gu', # Scellier: report de 1/9 de la réduction d'impôt des investissements achevés en 2012 avec promesse d'achat en 2009 'f7gv', # Scellier: report de 1/5 de la réduction d'impôt des investissements réalisés et achevés en 2012 en Polynésie, en Nouvelle Calédonie et à Wallis et Futuna ]), ]), collections.OrderedDict([ ('label', u"""Autres imputations et divers"""), ('children', [ 'f8ta', # Retenue à la source en France ou impôt payé à l'étranger 'f8tb', # Crédit d'impôt recherche (entreprises bénéficiant de la restitution immédiate) 'f8tf', # Reprises de réductions ou de crédits d'impôt 'f8tg', # Crédits d'impôt en faveur des entreprises: Investissement en Corse 'f8th', # Retenue à la source élus locaux 'f8tc', # Crédit d'impôt autres entreprises (recherche non encore remboursé (années antérieures)) 'f8td', # Revenus non imposables dépassent la moitié du RFR 'f8te', # Crédit d'impôt en faveur des entreprises: adhésion à un groupement de prévention agréé 'f8to', # Crédit d'impôt en faveur des entreprises: investissement en Corse, report non imputé les années antérieures 'f8tp', # Crédit d'impôt en faveur des entreprises: investissement en Corse, reprise de crédit d'impôt 'f8uz', # Crédit d'impôt en faveur des entreprises: Famille 'f8tz', # Crédit d'impôt en faveur des entreprises: Apprentissage 'f8wa', # Crédit d'impôt en faveur des entreprises: Agriculture biologique 'f8wb', # Crédit d'impôt en faveur des entreprises: Prospection commerciale 'f8wc', # Crédit d'impôt en faveur des entreprises: Prêts sans intérêt 'f8wd', # Crédit d'impôt en faveur des entreprises: Formation des chefs d'entreprise 'f8we', # Crédit d'impôt en faveur des entreprises: Intéressement 'f8wr', # Crédit d'impôt en faveur des entreprises: Métiers d'art 'f8ws', # Crédit d'impôt en faveur des entreprises: Emploi de salariés réservistes 'f8wt', # Crédit d'impôt en faveur des entreprises: Remplacement pour congé des agriculteurs 'f8wu', # Crédit d'impôt en faveur des entreprises: Maître restaurateur 'f8wv', # Crédit d'impôt en faveur des entreprises: Débitants de tabac 'f8wx', # Crédit d'impôt en faveur des entreprises: Formation des salariés à l'économie d'entreprise 'f7uo', # Acquisition de biens culturels 'f7us', # Réduction d'impôt mécénat d'entreprise 'f7sb', # Dépenses en faveur de la qualité environnementale des logements donnés en location: crédit à 25 % 'f7sd', # Dépenses en faveur de la qualité environnementale de l'habitation principale, économie d'énergie: chaudières à condensation 'f7se', # Dépenses en faveur de la qualité environnementale de l'habitation principale, économie d'énergie: chaudières à micro-cogénération gaz 'f7sh', # Dépenses en faveur de la qualité environnementale de l'habitation principale, isolation thermique: matériaux d'isolation des toitures (acquisition et pose) 'f7sc', # Crédits d’impôt pour dépenses en faveur de la qualité environnementale 'f7up', # Crédit d'impôt pour investissements forestiers: travaux 'f7uq', # Crédit d'impôt pour investissements forestiers: contrat de gestion 'f1ar', # Crédit d'impôt aide à la mobilité : le déclarant déménage à plus de 200 km pour son emploi 'f1br', # Crédit d'impôt aide à la mobilité : le conjoint déménage à plus de 200 km pour son emploi 'f1cr', # Crédit d'impôt aide à la mobilité : la 1ère personne à charge déménage à plus de 200 km pour son emploi 'f1dr', # Crédit d'impôt aide à la mobilité : la 2è personne à charge déménage à plus de 200 km pour son emploi 'f1er', # Crédit d'impôt aide à la mobilité : la 3è personne à charge déménage à plus de 200 km pour son emploi 'f2bg', # Crédits d'impôt 'directive épargne' et autres crédits d'impôt restituables 'f4tq', # Crédit d’impôt représentatif de la taxe additionnelle au droit de bail 'f7sf', # Crédit de travaux en faveur d'aides aux personnes pour des logements en location (avant 2012 ) / Appareils de régulation du chauffage, matériaux de calorifugeage (après 2011) 'f7si', # Matériaux d’isolation des planchers bas sur sous-sol, sur vide sanitaire ou sur passage couvert (acquisition et pose) 'f8uy', # Auto-entrepreneur : versements libératoires d’impôt sur le revenu dont le remboursement est demandé 'mbic_mvct', # Moins-values industrielles et commerciales nettes à court terme du foyer (régime micro entreprise) 'macc_mvct', # Moins-values industrielles et commerciales non professionnelles nettes à court terme du foyer (régime micro entreprise) 'mncn_mvct', # Moins-values non commerciales non professionnelles nettes à court terme du foyer (régime déclaratif spécial ou micro BNC) ]), ]), collections.OrderedDict([ ('label', u"""Impôt de solidarité sur la fortune"""), ('children', [ 'b1ab', # Valeur de la résidence principale avant abattement 'b1ac', # Valeur des autres immeubles avant abattement 'b1bc', # Immeubles non bâtis : bois, fôrets et parts de groupements forestiers 'b1be', # Immeubles non bâtis : biens ruraux loués à long termes 'b1bh', # Immeubles non bâtis : parts de groupements fonciers agricoles et de groupements agricoles fonciers 'b1bk', # Immeubles non bâtis : autres biens 'b1cl', # Parts et actions détenues par les salariés et mandataires sociaux 'b1cb', # Parts et actions de sociétés avec engagement de conservation de 6 ans minimum 'b1cd', # Droits sociaux de sociétés dans lesquelles vous exercez une fonction ou une activité 'b1ce', # Autres valeurs mobilières 'b1cf', # Liquidités 'b1cg', # Autres biens meubles 'b1co', # Autres biens meubles : contrats d'assurance-vie 'b2gh', # Total du passif et autres déductions 'b2mt', # Réductions pour investissements directs dans une société 'b2ne', # Réductions pour investissements directs dans une société 'b2mv', # Réductions pour investissements par sociétés interposées, holdings 'b2nf', # Réductions pour investissements par sociétés interposées, holdings 'b2mx', # Réductions pour investissements par le biais de FIP 'b2na', # Réductions pour investissements par le biais de FCPI ou FCPR 'b2nc', # Réductions pour dons à certains organismes d'intérêt général 'b4rs', # Montant de l'impôt acquitté hors de France 'rev_or', 'rev_exo', 'tax_fonc', # Taxe foncière 'restit_imp', ]), ]), collections.OrderedDict([ ('label', u"""Autres"""), ('children', [ u"""f6hk""", # Dépenses de grosses réparations effectuées par les nus-propriétaires: report des dépenses des années antérieures u"""f6hl""", # Dépenses de grosses réparations effectuées par les nus-propriétaires: report des dépenses des années antérieures u"""f6hm""", # Dépenses de grosses réparations effectuées par les nus-propriétaires: report des dépenses des années antérieures u"""rfr_n_1""", # Revenu fiscal de référence année n - 1 u"""f7va""", # Dons à des organismes d'aides aux personnes établis dans un Etat européen u"""f7vc""", # Dons à des autres organismes établis dans un Etat européen u"""f7uh_2007""", # Intérêts payés la première année de remboursement du prêt pour l'habitation principale u"""f7vv""", # Intérêt des emprunts contractés pour l'acquisition ou la construction de l'habitation principale: logements neufs non-BBC acquis ou construits du 01/01/2010 au 31/12/2010: annuités suivantes u"""f7vu""", # Intérêt des emprunts contractés pour l'acquisition ou la construction de l'habitation principale: logements neufs non-BBC acquis ou construits du 01/01/2011 au 30/09/2011: première annuité u"""f7vt""", # Intérêt des emprunts contractés pour l'acquisition ou la construction de l'habitation principale: logements neufs non-BBC acquis ou construits du 01/01/2011 au 30/09/2011: annuités suivantes u"""f7wa""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: travaux d'isolation thermique des murs avant le 03/04/2012 u"""f7wb""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: travaux d'isolation thermique des murs à compter du 04/04/2012 u"""f7wc""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: travaux d'isolation thermique sur plus de la moitié de la surface des murs extérieurs u"""f7ve""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: travaux d'isolation thermique de la toiture avant le 04/04/2012 u"""f7vf""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: travaux d'isolation thermique de la toiture à compter du 04/04/2012 u"""f7vg""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: travaux d'isolation thermique de toute la toiture u"""f7sg""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: Matériaux d'isolation thermique des murs (acquisitionn et pose) u"""f7sj""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: Matériaux d'isolation thermique des parois vitrées u"""f7sk""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: Volets isolants u"""f7sl""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: Portes d'entrées donnant sur l'extérieur u"""f7sm""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: Équipements de production d'électricité utilisant l'énergie radiative du soleil u"""f7sn""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: Appareils de chauffage au bois ou autres biomasses remplaçant un appareil équivalent u"""f7so""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: Appareils de chauffage au bois ou autres biomasses ne remplaçant pas un appareil équivalent u"""f7sp""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: Pompes à chaleur autres que air/air et autres que géothermiques dont la finalité essentielle est la production de chaleur u"""f7sq""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: Pompes à chaleur géothermiques dont la finalité essentielle est la production de chaleur u"""f7sr""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: Pompes à chaleur (autres que air/air) dédiées à la production d'eau chaude sanitaire (chauffe-eaux thermodynamiques) u"""f7ss""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: Équipements de fourniture d'eau chaude sanitaire fonctionnant à l'énergie solaire et dotés de capteurs solaires u"""f7st""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: Autres équipements de production d'énergie utilisant une source d'énergie renouvelable (éolien, hydraulique) u"""f7su""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: Équipements de récupération et de traitement des eaux pluviales u"""f7sv""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: Diagnostic de performance énergétique u"""f7sw""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: Équipements de raccordement à un réseau de chaleur u"""f7ws""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: dépenses d'isolations des parois vitrées à compter du 04/04/2012 u"""f7wt""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: dépenses d'isolation thermique des parois vitrées réalisées sur au moins la moitié des fenêtres du logement u"""f7wu""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: achat de volets avant 2012 u"""f7wv""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: achat de volets en 2012 u"""f7ww""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: achat de portes avant 2012 u"""f7wx""", # Dépenses en faveur de la qualité environnementale de l'habitation principale: achat de portes en 2012 u"""f7wr""", # Dépenses en faveur de l'aide aux personnes réalisées dans des habitations données en location : travaux de prévention des risques technologiques u"""f7qv""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements immobliliers engagés avant le 1.1.2011 et investissements ayant reçu un agrément avant le 5.12.2010, nvestissements ayant fait l'objet avant 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50% u"""f7qo""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements immobliliers engagés avant le 1.1.2011 et investissements ayant reçu un agrément avant le 5.12.2010 à hauteur de 50% u"""f7qp""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements immobliliers engagés avant le 1.1.2011 et investissements ayant reçu un agrément avant le 5.12.2010 à hauteur de 60% u"""f7pa""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63% u"""f7pb""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5% u"""f7pc""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements dans votre entreprise, montant de la réduction d' impôt calculée u"""f7pd""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements dans votre entreprise, montant de la réduction d' impôt dont vous demandez l'imputation en 2011 u"""f7qe""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet avant 1.1.2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50% u"""f7pe""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63% u"""f7pf""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5% u"""f7pg""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements dans votre entreprise, montant de la réduction d' impôt calculée u"""f7ph""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements dans votre entreprise, montant de la réduction d' impôt dont vous demandez l'imputation en 2011 u"""f7pi""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63% u"""f7pj""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5% u"""f7pk""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements dans votre entreprise, montant de la réduction d' impôt calculée u"""f7pl""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements dans votre entreprise, montant de la réduction d' impôt dont vous demandez l'imputation en 2011 u"""f7pm""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet avant 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% u"""f7pn""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 50 % u"""f7po""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 60 % u"""f7pp""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise u"""f7pq""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt calculée u"""f7pr""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt dont vous demandez l'imputation en 2012 u"""f7ps""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 50 % u"""f7pt""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 60 % u"""f7pu""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise u"""f7pv""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt calculée u"""f7pw""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt dont vous demandez l'imputation en 2012 u"""f7px""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63 % u"""f7py""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5 % u"""f7rg""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise u"""f7rh""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt calculée u"""f7ri""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt dont vous demandez l'imputation en 2012 u"""f7rj""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet avant 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % u"""f7rk""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63 % u"""f7rl""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5 % u"""f7rm""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise u"""f7rn""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt calculée u"""f7ro""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt dont vous demandez l'imputation en 2012 u"""f7rp""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63 % u"""f7rq""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5 % u"""f7rr""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise u"""f7rs""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt calculée u"""f7rt""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt dont vous demandez l'imputation en 2012 u"""f7ru""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63 % u"""f7rv""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5 % u"""f7rw""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise u"""f7rx""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt calculée u"""f7ry""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt dont vous demandez l'imputation en 2012 u"""f7nu""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63 % u"""f7nv""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5 % u"""f7nw""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, investissements dans votre entreprise u"""f7nx""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt calculée u"""f7ny""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt dont vous demandez l'imputation en 2012 u"""f7mn""", # Investissements outre-mer dans le cadre de l'entreprise REPORT : Investissements réalisés en 2010, Investissements ayant fait l'objet avant 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50% u"""f7lh""", # Investissements outre-mer dans le cadre de l'entreprise REPORT : Investissements réalisés en 2010, Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 50% u"""f7mb""", # Investissements outre-mer dans le cadre de l'entreprise REPORT : Investissements réalisés en 2010, Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 60% u"""f7kt""", # Investissements outre-mer dans le cadre de l'entreprise REPORT : Investissements réalisés en 2010, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt, Investissements dans votre entreprise u"""f7li""", # Investissements outre-mer dans le cadre de l'entreprise REPORT : Investissements réalisés en 2010, Autres investissements réalisés en 2010, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 50% u"""f7mc""", # Investissements outre-mer dans le cadre de l'entreprise REPORT : Investissements réalisés en 2010, Autres investissements réalisés en 2010, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 60% u"""f7ku""", # Investissements outre-mer dans le cadre de l'entreprise REPORT : Investissements réalisés en 2010, Investissements dans votre entreprise u"""fhsa""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt en 2010 à hauteur de 52,63% u"""fhsb""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt en 2010 à hauteur de 62,5% u"""fhsf""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt en 2011 à hauteur de 52,63% u"""fhsg""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt en 2011 à hauteur de 62,5% u"""fhsc""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements dans votre entreprise en 2010 u"""fhsh""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements dans votre entreprise en 2011 u"""fhsd""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt calculée en 2010 u"""fhsi""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt calculée en 2011 u"""fhse""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements dans votre entreprise avec exploitation directe montant de la réduction d’impôt dont vous demandez l’imputation en 2013, en 2010 u"""fhsj""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt dont vous demandez l’imputation en 2013, en 2011 u"""fhsk""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2010 ou 2011 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt en 2010 à hauteur de 52,63% u"""fhsl""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2010 ou 2011 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt en 2010 à hauteur de 62,5% u"""fhsp""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2010 ou 2011 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt en 2011 à hauteur de 52,63% u"""fhsq""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2010 ou 2011 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt en 2011 à hauteur de 62,5% u"""fhsm""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements dans votre entreprise en 2010 u"""fhsr""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements dans votre entreprise en 2011 u"""fhsn""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements dans votre entreprise avec exploitation directe en 2010 u"""fhss""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements dans votre entreprise avec exploitation directe en 2011 u"""fhso""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt dont vous demandez l’imputation en 2013, en 2010 u"""fhst""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt dont vous demandez l’imputation en 2013, en 2011 u"""fhsu""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2012 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt à hauteur de 52,63% u"""fhsv""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2012 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt à hauteur de 62,5% u"""fhsw""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2012 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements dans votre entreprise u"""fhsx""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2012 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt calculé u"""fhsy""", # Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2012 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt dont vous demandez l’imputation en 2013 u"""fhsz""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt à hauteur de 52,63% u"""fhta""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt à hauteur de 62,5% u"""fhtb""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements dans votre entreprise u"""fhtc""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt calculé u"""fhtd""", # Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt dont vous demandez l’imputation en 2013 u"""f7rc""", # Travaux de restauration immobilière dans un secteur sauvegardé ou assimilé u"""f7rd""", # Travaux de restauration immobilière dans un secteur sauvegardé ou assimilé u"""f7re""", # Travaux de restauration immobilière dans un secteur sauvegardé ou assimilé u"""f7rf""", # Travaux de restauration immobilière dans un secteur sauvegardé ou assimilé u"""f7sx""", # Travaux de restauration immobilière dans un secteur sauvegardé ou assimilé u"""f7sy""", # Travaux de restauration immobilière dans un secteur sauvegardé ou assimilé u"""f7xa""", # Investissements locatifs dans le secteur de touristique: travaux engagés avant 2011 dans un village résidentiel de tourisme u"""f7xb""", # Investissements locatifs dans le secteur de touristique: travaux engagés avant 2011 dans une résidence de tourisme classée ou meublée u"""f7xp""", # Investissements locatifs dans une résidence hôtelière à vocation sociale: report des dépenses d'investissement des années antérieures u"""f7xq""", # Investissements locatifs dans une résidence hôtelière à vocation sociale: report des dépenses d'investissement des années antérieures u"""f7xr""", # Investissements locatifs dans une résidence hôtelière à vocation sociale: report des dépenses d'investissement des années antérieures u"""f7xv""", # Investissements locatifs dans le secteur de touristique: Report des dépenses d'investissement des années antérieures u"""f7xx""", # Investissements locatifs dans le secteur de touristique: travaux engagés après 2012 dans un village résidentiel de tourisme u"""f7xz""", # Investissements locatifs dans le secteur de touristique: travaux engagés après 2012 dans une résidence de tourisme classée ou un meublé tourisme u"""f7uy""", # Investissements locatifs dans le secteur de touristique: Report des dépenses d'investissement des années antérieures u"""f7uz""", # Investissements locatifs dans le secteur de touristique: Report des dépenses d'investissement des années antérieures u"""f7cc""", # Souscriptions au capital des PME non cotées, report de versement de l'année de perception des revenus -1 u"""f7cq""", # Souscriptions au capital des PME non cotées, report de versement de l'année de perception des revenus -1pour les start-up u"""f7qk""", u"""f7qn""", u"""f7kg""", u"""f7qu""", u"""f7ki""", u"""f7qj""", u"""f7qw""", u"""f7qx""", u"""f7qf""", u"""f7qg""", u"""f7qh""", u"""f7qi""", u"""f7qq""", u"""f7qr""", u"""f7qs""", u"""f7mm""", u"""f7lg""", u"""f7ma""", u"""f7ks""", u"""f7kh""", u"""f7oa""", # Investissements outre-mer dans le logement : Investissements réalisés en 2011, Investissements immobiliers engagés avant le 1.1.2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% avant 2009 u"""f7ob""", # Investissements outre-mer dans le logement : Investissements réalisés en 2011, Investissements immobiliers engagés avant le 1.1.2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% en 2009 u"""f7oc""", # Investissements outre-mer dans le logement : Investissements réalisés en 2011, Investissements immobiliers engagés avant le 1.1.2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% en 2010 u"""f7oh""", # Investissements outre-mer dans le logement : Investissements réalisés en 2011, Investissements immobiliers engagés en 2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% avant 2009 u"""f7oi""", # Investissements outre-mer dans le logement : Investissements réalisés en 2011, Investissements immobiliers engagés en 2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% en 2009 u"""f7oj""", # Investissements outre-mer dans le logement : Investissements réalisés en 2011, Investissements immobiliers engagés en 2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% en 2010 u"""f7ok""", # Investissements outre-mer dans le logement : Investissements réalisés en 2011, Autres investissements u"""f7ol""", # Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé avant le 1.1.2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % avant 2009 u"""f7om""", # Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé avant le 1.1.2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2009 u"""f7on""", # Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé avant le 1.1.2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2010 u"""f7oo""", # Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % avant 2009 u"""f7op""", # Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2009 u"""f7oq""", # Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2010 u"""f7or""", # Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2011 u"""f7os""", # Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2012, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % avant 2009 u"""f7ot""", # Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2012, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2009 u"""f7ou""", # Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2012, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2010 u"""f7ov""", # Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2012, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2011 u"""f7ow""", # Investissements outre-mer dans le logement : Investissements réalisés en 2012, u"""fhod""", # Investissements outre-mer dans le logement : Investissements réalisés en 2013, Investissements immobiliers engagés avant le 1.1.2011 u"""fhoe""", # Investissements outre-mer dans le logement : Investissements réalisés en 2013, Investissements immobiliers que vous avez engagé en 2012, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2010 u"""fhof""", # Investissements outre-mer dans le logement : Investissements réalisés en 2013, Investissements immobiliers que vous avez engagé en 2012, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2011 u"""fhog""", # Investissements outre-mer dans le logement : Investissements réalisés en 2013, Investissements immobiliers engagés en 2012 ou 2013, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% en 2010 u"""fhox""", # Investissements outre-mer dans le logement : Investissements réalisés en 2013, Investissements immobiliers engagés en 2012 ou 2013, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% en 2011 u"""fhoy""", # Investissements outre-mer dans le logement : Investissements réalisés en 2013, Investissements immobiliers engagés en 2012 ou 2013, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% en 2012 u"""fhoz""", # Investissements outre-mer dans le logement : Investissements réalisés en 2013, Autres investissements u"""fhra""", # Investissements outre-mer dans le logement social : Investissements réalisés en 2013, Investissements ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2010 u"""fhrb""", # Investissements outre-mer dans le logement social : Investissements réalisés en 2013, Investissements ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2011 u"""fhrc""", # Investissements outre-mer dans le logement social : Investissements réalisés en 2013, Investissements ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2012 u"""fhrd""", # Investissements outre-mer dans le logement social : Investissements réalisés en 2013, Autres investissements u"""f7kb""", # Dépenses de protection du patrimoine naturel (excédent de réduction d’impôt d’années antérieures qui n’a pu être imputé) u"""f7kc""", # Dépenses de protection du patrimoine naturel (excédent de réduction d’impôt d’années antérieures qui n’a pu être imputé) u"""f7kd""", # Dépenses de protection du patrimoine naturel (excédent de réduction d’impôt d’années antérieures qui n’a pu être imputé) u"""f7ul""", # Investissements forestiers u"""f7uu""", # Investissements forestiers u"""f7uv""", # Investissements forestiers u"""f7uw""", # Investissements forestiers u"""f7th""", # Investissements forestiers u"""f7ux""", # Investissements forestiers u"""f7tg""", # Investissements forestiers u"""f7tf""", # Investissements forestiers u"""f7ut""", # Investissements forestiers u"""f7lb""", # Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2009 ou 2010 ou réalisés et achevés en 2010 avec engagement avant le 1.1.2010, Report de l'année 2010 u"""f7lc""", # Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2010 ; réalisés en 2010 et achevés en 2011 ; réalisés et achevés en 2011 avec engagement en 2010, Report de l'année 2010 u"""f7ld""", # Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2010 ; réalisés en 2010 et achevés en 2011 ; réalisés et achevés en 2011 avec engagement en 2010, Report de l'année 2011 u"""f7le""", # Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2009 ou 2010 ou réalisés et achevés en 2010 avec engagement avant le 1.1.2010, Report de l'année 2011 u"""f7lf""", # Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2011 : report du solde de réduction d'impôt de l'année 2011 u"""f7ls""", # Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2010 ; réalisés en 2010 et achevés en 2011 ; réalisés et achevés en 2011 avec engagement en 2010 u"""f7lm""", # Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2009 ou 2010 ou réalisés et achevés en 2010 avec engagement avant le 1.1.2010 u"""f7lz""", # Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Report du solde de réduction d'impôt de l'année 2012 u"""f7mg""", # Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2012 : report du solde de réduction d'impôt de l'année 2012 u"""f7na""", # Investissements locatifs neufs dispositif Scellier : investissements réalisés et engagés en 2011, métropole, BBC u"""f7nb""", # Investissements locatifs neufs dispositif Scellier : investissements engagés en 2010, réalisés en 2011, u"""f7nc""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.1.2011 au 31.1.2011, métropole, BBC u"""f7nd""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.2.2011 au 31.3.2011, métropole, BBC u"""f7ne""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.4.2011 au 31.12.2011, métropole, BBC u"""f7nf""", # Investissements locatifs neufs dispositif Scellier : investissements réalisés et engagés en 2011, u"""f7ng""", # Investissements locatifs neufs dispositif Scellier : investissements engagés en 2010, réalisés en 2011, u"""f7nh""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.1.2011 au 31.1.2011, Investissement réalisé du 1.1.2011 au 31.1.2011, métropole, non-BBC u"""f7ni""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.2.2011 au 31.3.2011, métropole, non-BBC u"""f7nj""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.4.2011 au 31.12.2011, métropole, non-BBC u"""f7nk""", # Investissements locatifs neufs dispositif Scellier : investissements réalisés et engagés en 2011, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon u"""f7nl""", # Investissements locatifs neufs dispositif Scellier : investissements engagés en 2010, réalisés en 2011, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon u"""f7nm""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.1.2011 au 31.1.2011, Investissement réalisé du 1.1.2011 au 31.1.2011, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon u"""f7nn""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.2.2011 au 31.3.2011, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon u"""f7no""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.4.2011 au 31.12.2011, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon u"""f7np""", # Investissements locatifs neufs dispositif Scellier : investissements réalisés et engagés en 2011, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna u"""f7nq""", # Investissements locatifs neufs dispositif Scellier : investissements engagés en 2010, réalisés en 2011, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna u"""f7nr""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.1.2011 au 31.1.2011, Investissement réalisé du 1.1.2011 au 31.1.2011, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna u"""f7ns""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.2.2011 au 31.3.2011, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna u"""f7nt""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.4.2011 au 31.12.2011, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna u"""f7hv""", # Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2010 en métropole u"""f7hw""", # Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2010 dans les DOM COM u"""f7hx""", # Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2010 en métropole avec promesse d'achat avant le 1.1.2010 u"""f7hz""", # Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2010 dans les DOM COM avec promesse d'achat avant le 1.1.2010 u"""f7ht""", # Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2009, Investissements réalisés en 2009 et achevés en 2010, en métropole en 2009; dans les DOM du 1.1.2009 au 26.5.2009 ; dans les DOM du 27.5.2009 au 30.12.2009 lorsqu'ils ne respectent pas les plafonds spécifiques u"""f7hu""", # Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2009, Investissements réalisés en 2009 et achevés en 2010, dans les DOM COM du 27.5.2009 au 31.12.2009 respectant les plafonds spécifiques u"""f7ha""", # Investissements locatifs neufs dispositif Scellier: Investissements achevés et réalisés en 2011 u"""f7hb""", # Investissements locatifs neufs dispositif Scellier: Investissements achevés et réalisés en 2011, avec promesse d'achat en 2010 u"""f7hg""", # Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2011 en Polynésie française, Nouvelle Calédonie, dans les îles Walllis et Futuna u"""f7hh""", # Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2011 en Polynésie française, Nouvelle Calédonie, dans les îles Walllis et Futuna avec promesse d'achat en 2010 u"""f7hd""", # Investissements locatifs neufs dispositif Scellier: Investissements achevés en 2011, réalisés en 2010, en métropole et dans les DOM-COM u"""f7he""", # Investissements locatifs neufs dispositif Scellier: Investissements achevés en 2011, en métropole et dans les DOM-COM avec promesse d'achat avant le 1.1.2010 u"""f7hf""", # Investissements locatifs neufs dispositif Scellier: Investissements achevés en 2011, Investissements réalisés en 2009 en métropole et dans les DOM-COM u"""f7ja""", # Investissements locatifs neufs dispositif Scellier : investissements réalisés et engagés en 2012, métropole, BBC u"""f7jb""", # Investissements locatifs neufs dispositif Scellier : investissements engagés en 2011, réalisés en 2012, métropole, BBC u"""f7jd""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.1.2012 au 31.3.2012, métropole, BBC u"""f7je""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.4.2012 au 31.12.2012, métropole, BBC u"""f7jf""", # Investissements locatifs neufs dispositif Scellier : investissements réalisés et engagés en 2012, métropole, non-BBC u"""f7jg""", # Investissements locatifs neufs dispositif Scellier : investissements engagés en 2011, réalisés en 2012, métropole, non-BBC u"""f7jh""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.1.2012 au 31.3.2012, métropole, non-BBC u"""f7jj""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.4.2012 au 31.12.2012, métropole, non-BBC u"""f7jk""", # Investissements locatifs neufs dispositif Scellier : investissements engagés en 2011, réalisés en 2012, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon u"""f7jl""", # Investissements locatifs neufs dispositif Scellier : investissements engagés en 2011, réalisés en 2012, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon u"""f7jm""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.1.2012 au 31.3.2012, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon u"""f7jn""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.4.2012 au 31.12.2012, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon u"""f7jo""", # Investissements locatifs neufs dispositif Scellier : investissements engagés en 2011, réalisés en 2012, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna u"""f7jp""", # Investissements locatifs neufs dispositif Scellier : investissements engagés en 2011, réalisés en 2012, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna u"""f7jq""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.1.2012 au 31.3.2012, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna u"""f7jr""", # Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.4.2012 au 31.12.2012, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna u"""f7gj""", # Investissements locatifs neufs dispositif Scellier : Reports concernant les investissements achevés ou acquis au cours des années antérieures, Investissements achevés et réalisés en 2012, en métropole, dans les DOM, à Saint-Barthélemy, Saint-Martin, Saint-Pierre-et-Miquelon u"""f7gk""", # Investissements locatifs neufs dispositif Scellier : Reports concernant les investissements achevés ou acquis au cours des années antérieures, Investissements achevés et réalisés en 2012, en métropole, dans les DOM, à Saint-Barthélemy, Saint-Martin, Saint-Pierre-et-Miquelon, avec promesse d'achat en 2011 u"""f7gl""", # Investissements locatifs neufs dispositif Scellier : Reports concernant les investissements achevés ou acquis au cours des années antérieures, Investissements achevés en 2012 et réalisés en 2011, en métropole, dans les DOM, à Saint-Barthélemy, Saint-Martin, Saint-Pierre-et-Miquelon u"""f7gp""", # Investissements locatifs neufs dispositif Scellier : Reports concernant les investissements achevés ou acquis au cours des années antérieures, Investissements achevés en 2012 et réalisés en 2011, en métropole, dans les DOM, à Saint-Barthélemy, Saint-Martin, Saint-Pierre-et-Miquelon, avec promesse d'achat en 2010s u"""f7fa""", # Investissements locatifs neufs dispositif Scellier : Investissements achevés ou acquis en 2013, réalisés du 1.1.2013 au 31.3.2013, métropole, BBC u"""f7fb""", # Investissements locatifs neufs dispositif Scellier : Investissements achevés ou acquis en 2013, réalisés du 1.1.2013 au 31.3.2013, métropole, non-BBC u"""f7fc""", # Investissements locatifs neufs dispositif Scellier : Investissements achevés ou acquis en 2013, réalisés du 1.1.2013 au 31.3.2013, DOM, à Saint-Barthélemy, Saint-Martin, Saint-Pierre-et-Miquelon u"""f7fd""", # Investissements locatifs neufs dispositif Scellier : Investissements achevés ou acquis en 2013, réalisés du 1.1.2013 au 31.3.2013 en Polynésie, en Nouvelle Calédonie et à Wallis et Futuna u"""f7in""", # Investissements destinés à la location meublée non professionnelle : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, investissement réalisé du 1.1.2011 au 31.3.2011 u"""f7iv""", # Investissements destinés à la location meublée non professionnelle : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, investissement réalisé du 1.4.2011 au 31.12.2011 u"""f7iw""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés en 2010 et achevés en 2012 u"""f7io""", # Investissements destinés à la location meublée non professionnelle : u"""f7ip""", # Investissements destinés à la location meublée non professionnelle : u"""f7ir""", # Investissements destinés à la location meublée non professionnelle : u"""f7iq""", # Investissements destinés à la location meublée non professionnelle : u"""f7iu""", # Investissements destinés à la location meublée non professionnelle : u"""f7it""", # Investissements destinés à la location meublée non professionnelle : u"""f7ia""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2011 u"""f7ib""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2011 avec promesse d'achat en 2010 ou réalisés en 2010 u"""f7ic""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés en 2010 et achevés en 2011 avec promesse d'achat en 2009 ou réalisés en 2009 u"""f7id""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, Engagement de réalisation de l'investissement en 2012 u"""f7ie""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, Promesse d'achat en 2011 u"""f7if""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, investissement réalisé du 1.1.2012 au 31.3.2012, investissement réalisé du 1.1.2012 au 31.3.2012 u"""f7ig""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, Investissements destinés à la location meublée non professionnelle : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, investissement réalisé du 1.4.2012 au 31.12.2012 u"""f7ix""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2009; réalisés en 2009 et achevés en 2010; réalisés et achevés en 2010 avec engagement avant le 1.1.2010, Report du solde de réduction d'impôt de l'année 2011 u"""f7ih""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2010 ; réalisés en 2010 et achevés en 2011 ; réalisés et achevés en 2011 avec engagement en 2010, Report du solde de réduction d'impôt de l'année 2011 u"""f7iz""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2011 : report du solde de réduction d'impôt de l'année 2011 u"""f7jt""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés en 2013, Engagement de réalisation de l'investissement en 2013 u"""f7ju""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés en 2013, Engagement de réalisation de l'investissement en 2012 u"""f7jv""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, réalisés en 2012 u"""f7jw""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, réalisés en 2011 ou réalisés en 2012 avec promesse d'achat en 2011 u"""f7jx""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, réalisés en 2011 avec promesse d'achat en 2010 ou réalisés en 2010 u"""f7jc""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2010 ; réalisés en 2010 et achevés en 2011 ; réalisés et achevés en 2011 avec engagement en 2010, Report du solde de réduction d'impôt de l'année 2012 u"""f7ji""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2011 ; réalisés en 2011 et achevés en 2011 ou 2012 ; réalisés en 2012 avec promesse d'achat en 2011 et achevés en 2012, Report du solde de réduction d'impôt de l'année 2012 u"""f7js""", # Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2011 ; réalisés en 2011 et achevés en 2011 ou 2012 ; réalisés en 2012 avec promesse d'achat en 2011 et achevés en 2012, Report du solde de réduction d’impôt de l’année 2012 u"""f7te""", # Dépenses d'investissement forestier u"""f7tu""", # Dépenses de travaux dans l'habitation principale u"""f7tt""", # Dépenses de travaux dans l'habitation principale u"""f7tv""", # Dépenses de travaux dans l'habitation principale u"""f7tx""", # Dépenses de travaux dans l'habitation principale u"""f7ty""", # Dépenses de travaux dans l'habitation principale u"""f7tw""", # Dépenses de travaux dans l'habitation principale u"""f7gh""", # Investissements locatifs intermédiaires en métropole u"""f7gi""", # Investissements locatifs intermédiaires outre-mer u"""f8tl""", # Crédit d'impôt compétitivité emploi (CICE), entreprises bénéficiant de la restitution immédiate u"""f8ts""", # Crédit d'impôt en faveur des entreprises: investissement en Corse, crédit d'impôt u"""f8uw""", # Crédit d'impôt compétitivité emploi (CICE), autres entreprises u"""f8wc__2008""", # Crédit d'impôt en faveur des entreprises: Nouvelles technologies u"""elig_creimp_exc_2008""", # Éligibilité au crédit d'impôt exceptionnel sur les revenus 2008 u"""f8td_2002_2005""", # Contribution exceptionnelle sur les hauts revenus u"""f8ti""", # Revenus de l'étranger exonérés d'impôt u"""f8tk""", # Revenus de l'étranger imposables u"""f5qf""", # Déficits des revenus agricoles des années antérieures non encore déduits (n-6) u"""f5qg""", # Déficits des revenus agricoles des années antérieures non encore déduits (n-5) u"""f5qn""", # Déficits des revenus agricoles des années antérieures non encore déduits (n-4) u"""f5qo""", # Déficits des revenus agricoles des années antérieures non encore déduits (n-3) u"""f5qp""", # Déficits des revenus agricoles des années antérieures non encore déduits (n-2) u"""f5qq""", # Déficits des revenus agricoles des années antérieures non encore déduits (n-1) u"""f5ga""", # Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-10) u"""f5gb""", # Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-9) u"""f5gc""", # Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-8) u"""f5gd""", # Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-7) u"""f5ge""", # Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-6) u"""f5gf""", # Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-5) u"""f5gg""", # Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-4) u"""f5gh""", # Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-3) u"""f5gi""", # Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-2) u"""f5gj""", # Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-1) u"""f5rn""", # Déficits des revenus industriels et commerciaux non professionnelles années antérieures non encore déduits (n-6) u"""f5ro""", # Déficits des revenus industriels et commerciaux non professionnelles années antérieures non encore déduits (n-5) u"""f5rp""", # Déficits des revenus industriels et commerciaux non professionnelles années antérieures non encore déduits (n-4) u"""f5rq""", # Déficits des revenus industriels et commerciaux non professionnelles années antérieures non encore déduits (n-3) u"""f5rr""", # Déficits des revenus industriels et commerciaux non professionnelles années antérieures non encore déduits (n-2) u"""f5rw""", # Déficits des revenus industriels et commerciaux non professionnelles années antérieures non encore déduits (n-1) u"""f5ht""", # Déficits des revenus non commerciaux non professionnelles années antérieures non encore déduits (n-6) u"""f5it""", # Déficits des revenus non commerciaux non professionnelles années antérieures non encore déduits (n-5) u"""f5jt""", # Déficits des revenus non commerciaux non professionnelles années antérieures non encore déduits (n-4) u"""f5kt""", # Déficits des revenus non commerciaux non professionnelles années antérieures non encore déduits (n-3) u"""f5lt""", # Déficits des revenus non commerciaux non professionnelles années antérieures non encore déduits (n-2) u"""f5mt""", # Déficits des revenus non commerciaux non professionnelles années antérieures non encore déduits (n-1) u"""f2ck""", # Crédit d'impôt égal au prélèvement forfaitaire déjà versé u"""f2dm""", # Impatriés: revenus de capitaux mobiliers perçus à l'étranger, abattement de 50 % u"""f3vv_end_2010""", # Pertes ouvrant droit au crédit d’impôt de 19 % ]), ]), ]), ])), ('men', collections.OrderedDict([ ('children', [ collections.OrderedDict([ ('label', u"""Principal"""), ('children', [ 'loyer', # Loyer 'statut_occupation', # Statut d'occupation 'depcom', # Code INSEE (depcom) du lieu de résidence ]), ]), ]), ])), ]) PK'G!Ow w openfisca_france/model/model.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from .caracteristiques_socio_demographiques import ( # noqa analysis:ignore demographie, logement, ) from . import ( # noqa analysis:ignore mesures, ) from .prelevements_obligatoires import( # noqa analysis:ignore isf, taxe_habitation, ) from .prelevements_obligatoires.impot_revenu import ( # noqa analysis:ignore charges_deductibles, credits_impot, ir, plus_values_immobilieres, reductions_impot, variables_reductions_credits, ) from .prelevements_obligatoires.prelevements_sociaux.contributions_sociales import ( # noqa analysis:ignore activite, capital, remplacement, ) from .prelevements_obligatoires.prelevements_sociaux.cotisations_sociales import ( # noqa analysis:ignore allegements, apprentissage, exonerations, # penalites, # remuneration_public, stage, travail_fonction_publique, travail_prive, travail_totaux, ) from .prelevements_obligatoires.prelevements_sociaux import taxes_salaires_main_oeuvre # noqa analysis:ignore from .prestations import ( # noqa analysis:ignore aides_logement, education, ) from prestations.minima_sociaux import ( # noqa analysis:ignore aah, asi_aspa, ass, cmu, rsa, ) from prestations.prestations_familiales import ( # noqa analysis:ignore aeeh, af, ars, asf, paje, cf, ) from revenus import autres from revenus.activite import ( # noqa analysis:ignore non_salarie, salarie, ) from revenus.capital import ( # noqa analysis:ignore financier, foncier, plus_value, ) from revenus.remplacement import ( # noqa analysis:ignore chomage, retraite, indemnites_journalieres_securite_sociale, ) PKF<openfisca_france/model/prelevements_obligatoires/__init__.pyPK'G$[b"&&Copenfisca_france/model/prelevements_obligatoires/taxe_habitation.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import logical_not as not_, maximum as max_, minimum as min_ from ..base import * # noqa analysis:ignore @reference_formula class exonere_taxe_habitation(SimpleFormulaColumn): column = BoolCol(default = True) entity_class = Menages label = u"Exonération de la taxe d'habitation" url = "http://vosdroits.service-public.fr/particuliers/F42.xhtml" def function(self, simulation, period): """Exonation de la taxe d'habitation 'men' Eligibilité: - âgé de plus de 60 ans, non soumis à l'impôt de solidarité sur la fortune (ISF) en n-1 - veuf quel que soit votre âge et non soumis à l'impôt de solidarité sur la fortune (ISF) n-1 - titulaire de l'allocation de solidarité aux personnes âgées (Aspa) ou de l'allocation supplémentaire d'invalidité (Asi), bénéficiaire de l'allocation aux adultes handicapés (AAH), atteint d'une infirmité ou d'une invalidité vous empêchant de subvenir à vos besoins par votre travail. """ period = period.start.offset('first-of', 'month').period('year') aah_holder = simulation.compute_add('aah', period) age_holder = simulation.compute('age', period) asi_holder = simulation.compute_add('asi', period) aspa_holder = simulation.compute_add('aspa', period) isf_tot_holder = simulation.compute('isf_tot', period) nbptr_holder = simulation.compute('nbptr', period) rfr_holder = simulation.compute('rfr', period) statmarit_holder = simulation.compute('statmarit', period) _P = simulation.legislation_at(period.start) aah = self.sum_by_entity(aah_holder) age = self.filter_role(age_holder, role = PREF) asi = self.cast_from_entity_to_roles(asi_holder) asi = self.sum_by_entity(asi) aspa = self.cast_from_entity_to_roles(aspa_holder) aspa = self.sum_by_entity(aspa) isf_tot = self.cast_from_entity_to_role(isf_tot_holder, role = VOUS) isf_tot = self.sum_by_entity(isf_tot) nbptr = self.cast_from_entity_to_role(nbptr_holder, role = VOUS) nbptr = self.sum_by_entity(nbptr) # TODO: Beurk rfr = self.cast_from_entity_to_role(rfr_holder, role = VOUS) rfr = self.sum_by_entity(rfr) statmarit = self.filter_role(statmarit_holder, role = PREF) P = _P.cotsoc.gen seuil_th = P.plaf_th_1 + P.plaf_th_supp * (max_(0, (nbptr - 1) / 2)) elig = ((age >= 60) + (statmarit == 4)) * (isf_tot <= 0) * (rfr < seuil_th) + (asi > 0) + (aspa > 0) + (aah > 0) return period, not_(elig) @reference_formula class taxe_habitation(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Menages label = u"Taxe d'habitation" url = "http://www.impots.gouv.fr/portal/dgi/public/particuliers.impot?espId=1&pageId=part_taxe_habitation&impot=TH&sfid=50" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('year') exonere_taxe_habitation = simulation.calculate('exonere_taxe_habitation', period) nombre_enfants_a_charge_menage = simulation.calculate('nombre_enfants_a_charge_menage', period) nombre_enfants_majeurs_celibataires_sans_enfant = simulation.calculate('nombre_enfants_majeurs_celibataires_sans_enfant', period) rfr_n_1_holder = simulation.compute('rfr_n_1', period) rfr_n_1 = self.cast_from_entity_to_role(rfr_n_1_holder, role = VOUS) rfr_n_1 = self.sum_by_entity(rfr_n_1) # Variables TODO: à inclure dans la fonction valeur_locative_brute = 0 valeur_locative_moyenne = 0 # déped de la collectivité) # Paramètres: à inclure dans param.xml taux_minimal_2_premiers = .1 # minimun depusi 2011 majoration_2_premiers = 0 taux_minimal_3_et_plus = .15 majoration_3_et_plus = 0 abattement_general_base_forfaitaire = 0 # si non nul le taux suivant est nul taux_abattement_general_base = .1 # entre 1% et 15% depuis 2011 taux_special_modeste = 0 seuil_elig_special_modeste = 1.3 # 130 % de la valeur locative moyenne seuil_elig_special_modeste_add = .1 # 10% par personne à charge en garde exclusive et 5% en garde altennée taux_special_invalide = .1 # 10% si l'abattement est voté est en vigueur taux_imposition = .10 # TODO: taux d'imposition voté par les colloc # abattements pour l'habitation principale # abattements obligatoires pour charges de famille # * les enfants du contribuable, de son conjoint ou les enfants recueillis qui sont pris en compte pour le # calcul de l’impôt sur le revenu (2). Ne sont pas concernés ceux pour lesquels le redevable déduit de ses # revenus imposables une pension alimentaire ; pac_enf = nombre_enfants_a_charge_menage + nombre_enfants_majeurs_celibataires_sans_enfant # TODO: inclure ceux du conjoint non présent sur la feuille d'impôt ? gestion des gardes alternées # * les ascendants du contribuable et ceux de son conjoint remplissant les 3 conditions suivantes : # – être âgés de plus de 70 ans ou infirmes (c’est-à-dire ne pouvant subvenir par leur travail aux nécessités # de l’existence), # – résider avec lui, # – et disposer d’un revenu fiscal de référence pour l’année précédente n’excédant pas la limite prévue à # l’article 1417-I du CGI (voir page 94). pac_asc = 0 # TODO taux_2_premiers = taux_minimal_2_premiers + majoration_2_premiers taux_3_et_plus = taux_minimal_3_et_plus + majoration_3_et_plus abattement_obligatoire = (min_(pac_enf + pac_asc, 2) * taux_2_premiers + max_(pac_enf + pac_asc - 2, 0) * taux_3_et_plus) * valeur_locative_moyenne # abattements facultatifs à la base : # abattement faculattif général abattement_general = abattement_general_base_forfaitaire + taux_abattement_general_base * valeur_locative_moyenne # abattement facultatif dit spécial en faveur des personnes dont le « revenu fiscal de référence » n’excède pas certaines limites # Il est institué à l’initiative des communes et EPCI à fiscalité propre ; il est indépendant de l’abattement géné- # ral à la base avec lequel il peut se cumuler. Il ne s’applique pas dans les départements d’outre-mer. # Son taux peut être fixé, selon la décision des communes et EPCI à fiscalité propre qui en décident # l’application, à une valeur entière comprise entre 1 et 15 % de la valeur locative moyenne des habitations # (pour rappel, jusqu’en 2011, les taux pouvaient être fixés à 5 %, 10 % ou 15 %) # # Pour bénéficier de cet abattement, les contribuables doivent remplir deux conditions : abattement_special_modeste = (valeur_locative_brute <= ((seuil_elig_special_modeste + seuil_elig_special_modeste_add * (pac_enf + pac_asc)) * valeur_locative_moyenne) # ) * (rfr_n_1 <= 100 # TODO ) * taux_special_modeste * valeur_locative_moyenne # abattement facultatif en faveur des personnes handicapées ou invalides. abattement_special_invalide = 0 * taux_special_invalide # Tous les habitants doivent êtres invalides base_nette = valeur_locative_brute - ( abattement_obligatoire + abattement_general + abattement_special_modeste + abattement_special_invalide) cotisation_brute = base_nette * taux_imposition # Frais de gestion # FRAIS DE GESTION DE LA # FISCALITÉ DIRECTE LOCALE (art. 1641 du CGI) # En contrepartie des frais de confection des # rôles et de dégrèvement qu’il prend à sa # charge, l’État perçoit une somme égale à : # - 3 % # (1) des cotisations perçues au profit # des communes et EPCI à fiscalité propre, # ramenée à 1 % pour les locaux meublés # affectés à l’habitation principale ; # - 8 % (2) des cotisations perçues au profit # des syndicats de communes ; # - 9 % (2) des cotisations perçues au profit # des établissements publics bénéficiaires de # taxes spéciales d’équipement (TSE). # (1) Dont frais de dégrèvement et de non-valeurs : 2 %. # (2) Dont frais de dégrèvement et de non-valeurs : 3,6 %. frais_gestion = 0 # Prélèvement pour base élevée et sur les résidences secondaires prelevement_residence_secondaire = 0 # TODO return period, - exonere_taxe_habitation * 0 PK'Gww7openfisca_france/model/prelevements_obligatoires/isf.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import maximum as max_, minimum as min_ from ..base import * # noqa analysis:ignore # Variables apparaissant dans la feuille de déclaration de patrimoine soumis à l'ISF ## Immeubles bâtis build_column('b1ab', IntCol(entity = 'foy', label = u"Valeur de la résidence principale avant abattement", val_type = "monetary")) build_column('b1ac', IntCol(entity = 'foy', label = u"Valeur des autres immeubles avant abattement", val_type = "monetary")) ## non bâtis build_column('b1bc', IntCol(entity = 'foy', label = u"Immeubles non bâtis : bois, fôrets et parts de groupements forestiers", val_type = "monetary")) build_column('b1be', IntCol(entity = 'foy', label = u"Immeubles non bâtis : biens ruraux loués à long termes", val_type = "monetary")) build_column('b1bh', IntCol(entity = 'foy', label = u"Immeubles non bâtis : parts de groupements fonciers agricoles et de groupements agricoles fonciers", val_type = "monetary")) build_column('b1bk', IntCol(entity = 'foy', label = u"Immeubles non bâtis : autres biens", val_type = "monetary")) ## droits sociaux- valeurs mobilières-liquidités- autres meubles build_column('b1cl', IntCol(entity = 'foy', label = u"Parts et actions détenues par les salariés et mandataires sociaux", val_type = "monetary")) build_column('b1cb', IntCol(entity = 'foy', label = u"Parts et actions de sociétés avec engagement de conservation de 6 ans minimum", val_type = "monetary")) build_column('b1cd', IntCol(entity = 'foy', label = u"Droits sociaux de sociétés dans lesquelles vous exercez une fonction ou une activité", val_type = "monetary")) build_column('b1ce', IntCol(entity = 'foy', label = u"Autres valeurs mobilières", val_type = "monetary")) build_column('b1cf', IntCol(entity = 'foy', label = u"Liquidités", val_type = "monetary")) build_column('b1cg', IntCol(entity = 'foy', label = u"Autres biens meubles", val_type = "monetary")) build_column('b1co', IntCol(entity = 'foy', label = u"Autres biens meubles : contrats d'assurance-vie", val_type = "monetary")) # b1ch # b1ci # b1cj # b1ck ## passifs et autres réductions build_column('b2gh', IntCol(entity = 'foy', label = u"Total du passif et autres déductions", val_type = "monetary")) ## réductions build_column('b2mt', IntCol(entity = 'foy', label = u"Réductions pour investissements directs dans une société", val_type = "monetary")) build_column('b2ne', IntCol(entity = 'foy', label = u"Réductions pour investissements directs dans une société", val_type = "monetary")) build_column('b2mv', IntCol(entity = 'foy', label = u"Réductions pour investissements par sociétés interposées, holdings" , val_type = "monetary")) build_column('b2nf', IntCol(entity = 'foy', label = u"Réductions pour investissements par sociétés interposées, holdings", val_type = "monetary")) build_column('b2mx', IntCol(entity = 'foy', label = u"Réductions pour investissements par le biais de FIP", val_type = "monetary")) build_column('b2na', IntCol(entity = 'foy', label = u"Réductions pour investissements par le biais de FCPI ou FCPR", val_type = "monetary")) build_column('b2nc', IntCol(entity = 'foy', label = u"Réductions pour dons à certains organismes d'intérêt général", val_type = "monetary")) ## montant impôt acquitté hors de France build_column('b4rs', IntCol(entity = 'foy', label = u"Montant de l'impôt acquitté hors de France", val_type = "monetary")) ## BOUCLIER FISCAL build_column('rev_or', IntCol(entity = 'foy', label = u"", val_type = "monetary")) build_column('rev_exo', IntCol(entity = 'foy', label = u"", val_type = "monetary")) build_column('tax_fonc', IntCol(entity = 'foy', label = u"Taxe foncière", val_type = "monetary")) build_column('restit_imp', IntCol(entity = 'foy', label = u"", val_type = "monetary")) build_column('etr', IntCol()) # Calcul de l'impôt de solidarité sur la fortune # 1 ACTIF BRUT @reference_formula class isf_imm_bati(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"isf_imm_bati" def function(self, simulation, period): ''' Immeubles bâtis ''' period = period.start.offset('first-of', 'year').period('year') b1ab = simulation.calculate('b1ab', period) b1ac = simulation.calculate('b1ac', period) P = simulation.legislation_at(period.start).isf.res_princ return period, (1 - P.taux) * b1ab + b1ac @reference_formula class isf_imm_non_bati(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"isf_imm_non_bati" def function(self, simulation, period): ''' Immeubles non bâtis ''' period = period.start.offset('first-of', 'year').period('year') b1bc = simulation.calculate('b1bc', period) b1be = simulation.calculate('b1be', period) b1bh = simulation.calculate('b1bh', period) b1bk = simulation.calculate('b1bk', period) P = simulation.legislation_at(period.start).isf.nonbat # forêts b1bd = b1bc * P.taux_f # bien ruraux loués à long terme b1bf = min_(b1be, P.seuil) * P.taux_r1 b1bg = max_(b1be - P.seuil, 0) * P.taux_r2 # part de groupements forestiers- agricoles fonciers b1bi = min_(b1bh, P.seuil) * P.taux_r1 b1bj = max_(b1bh - P.seuil, 0) * P.taux_r2 return period, b1bd + b1bf + b1bg + b1bi + b1bj + b1bk # # droits sociaux- valeurs mobilières- liquidités- autres meubles ## @reference_formula class isf_actions_sal(SimpleFormulaColumn): # # non présent en 2005## column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"isf_actions_sal" start_date = date(2006, 1, 1) def function(self, simulation, period): ''' Parts ou actions détenues par les salariés et mandataires sociaux ''' period = period.start.offset('first-of', 'year').period('year') b1cl = simulation.calculate('b1cl', period) P = simulation.legislation_at(period.start).isf.droits_soc return period, b1cl * P.taux1 @reference_formula class isf_droits_sociaux(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"isf_droits_sociaux" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') isf_actions_sal = simulation.calculate('isf_actions_sal', period) b1cb = simulation.calculate('b1cb', period) b1cd = simulation.calculate('b1cd', period) b1ce = simulation.calculate('b1ce', period) b1cf = simulation.calculate('b1cf', period) b1cg = simulation.calculate('b1cg', period) P = simulation.legislation_at(period.start).isf.droits_soc b1cc = b1cb * P.taux2 return period, isf_actions_sal + b1cc + b1cd + b1ce + b1cf + b1cg @reference_formula class ass_isf(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"ass_isf" def function(self, simulation, period): # TODO: Gérer les trois option meubles meublants period = period.start.offset('first-of', 'year').period('year') isf_imm_bati = simulation.calculate('isf_imm_bati', period) isf_imm_non_bati = simulation.calculate('isf_imm_non_bati', period) isf_droits_sociaux = simulation.calculate('isf_droits_sociaux', period) b1cg = simulation.calculate('b1cg', period) b2gh = simulation.calculate('b2gh', period) P = simulation.legislation_at(period.start).isf.forf_mob total = isf_imm_bati + isf_imm_non_bati + isf_droits_sociaux forf_mob = (b1cg != 0) * b1cg + (b1cg == 0) * total * P.taux actif_brut = total + forf_mob return period, actif_brut - b2gh # # calcul de l'impôt par application du barème ## @reference_formula class isf_iai(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"isf_iai" @dated_function(start = date(2002, 1, 1), stop = date(2010, 12, 31)) def function_20020101_20101231(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') ass_isf = simulation.calculate('ass_isf', period) bareme = simulation.legislation_at(period.start).isf.bareme return period, bareme.calc(ass_isf) @dated_function(start = date(2011, 1, 1), stop = date(2015, 12, 31)) def function_20110101_20151231(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') ass_isf = simulation.calculate('ass_isf', period) bareme = simulation.legislation_at(period.start).isf.bareme ass_isf = (ass_isf >= bareme.rates[1]) * ass_isf return period, bareme.calc(ass_isf) @reference_formula class isf_avant_reduction(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"isf_avant_reduction" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') isf_iai = simulation.calculate('isf_iai', period) decote_isf = simulation.calculate('decote_isf', period) return period, isf_iai - decote_isf @reference_formula class isf_reduc_pac(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"isf_reduc_pac" def function(self, simulation, period): ''' Réductions pour personnes à charges ''' period = period.start.offset('first-of', 'year').period('year') nb_pac = simulation.calculate('nb_pac', period) nbH = simulation.calculate('nbH', period) P = simulation.legislation_at(period.start).isf.reduc_pac return period, P.reduc_1 * nb_pac + P.reduc_2 * nbH @reference_formula class isf_inv_pme(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"isf_inv_pme" start_date = date(2008, 1, 1) def function(self, simulation, period): ''' Réductions pour investissements dans les PME à partir de 2008! ''' period = period.start.offset('first-of', 'year').period('year') b2mt = simulation.calculate('b2mt', period) b2ne = simulation.calculate('b2ne', period) b2mv = simulation.calculate('b2mv', period) b2nf = simulation.calculate('b2nf', period) b2mx = simulation.calculate('b2mx', period) b2na = simulation.calculate('b2na', period) P = simulation.legislation_at(period.start).isf.pme inv_dir_soc = b2mt * P.taux2 + b2ne * P.taux1 holdings = b2mv * P.taux2 + b2nf * P.taux1 fip = b2mx * P.taux1 fcpi = b2na * P.taux1 return period, holdings + fip + fcpi + inv_dir_soc @reference_formula class isf_org_int_gen(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"isf_org_int_gen" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') b2nc = simulation.calculate('b2nc', period) P = simulation.legislation_at(period.start).isf.pme return period, b2nc * P.taux2 @reference_formula class isf_avant_plaf(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"isf_avant_plaf" def function(self, simulation, period): ''' Montant de l'impôt avant plafonnement ''' period = period.start.offset('first-of', 'year').period('year') isf_avant_reduction = simulation.calculate('isf_avant_reduction', period) isf_inv_pme = simulation.calculate('isf_inv_pme', period) isf_org_int_gen = simulation.calculate('isf_org_int_gen', period) isf_reduc_pac = simulation.calculate('isf_reduc_pac', period) borne_max = simulation.legislation_at(period.start).isf.pme.max return period, max_(0, isf_avant_reduction - min_(isf_inv_pme + isf_org_int_gen, borne_max) - isf_reduc_pac) # # calcul du plafonnement ## @reference_formula class tot_impot(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"tot_impot" def function(self, simulation, period): ''' Total des impôts dus au titre des revenus et produits (irpp, cehr, pl, prélèvements sociaux) + ISF Utilisé pour calculer le montant du plafonnement de l'ISF ''' period = period.start.offset('first-of', 'year').period('year') irpp = simulation.calculate('irpp', period) isf_avant_plaf = simulation.calculate('isf_avant_plaf', period) crds_holder = simulation.compute('crds', period) csg_holder = simulation.compute('csg', period) prelsoc_cap_holder = simulation.compute('prelsoc_cap', period) crds = self.split_by_roles(crds_holder, roles = [VOUS, CONJ]) csg = self.split_by_roles(csg_holder, roles = [VOUS, CONJ]) prelsoc_cap = self.split_by_roles(prelsoc_cap_holder, roles = [VOUS, CONJ]) return period, (-irpp + isf_avant_plaf - (crds[VOUS] + crds[CONJ]) - (csg[VOUS] + csg[CONJ]) - (prelsoc_cap[VOUS] + prelsoc_cap[CONJ]) ) # TODO: irpp n'est pas suffisant : ajouter ir soumis à taux propor + impôt acquitté à l'étranger # + prélèvement libé de l'année passée + montant de la csg @reference_formula class revetproduits(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Revenus et produits perçus (avant abattement)" def function(self, simulation, period): ''' Utilisé pour calculer le montant du plafonnement de l'ISF Cf. http://www.impots.gouv.fr/portal/deploiement/p1/fichedescriptiveformulaire_8342/fichedescriptiveformulaire_8342.pdf ''' period = period.start.offset('first-of', 'year').period('year') salcho_imp_holder = simulation.compute('salcho_imp', period) pen_net_holder = simulation.compute('pen_net', period) rto_net = simulation.calculate('rto_net', period) rev_cap_bar = simulation.calculate('rev_cap_bar', period) fon = simulation.calculate('fon', period) ric_holder = simulation.compute('ric', period) rag_holder = simulation.compute('rag', period) rpns_exon_holder = simulation.compute('rpns_exon', period) rpns_pvct_holder = simulation.compute('rpns_pvct', period) rev_cap_lib = simulation.calculate('rev_cap_lib', period) imp_lib = simulation.calculate('imp_lib', period) P = simulation.legislation_at(period.start).isf.plafonnement pen_net = self.sum_by_entity(pen_net_holder) rag = self.sum_by_entity(rag_holder) ric = self.sum_by_entity(ric_holder) rpns_exon = self.sum_by_entity(rpns_exon_holder) rpns_pvct = self.sum_by_entity(rpns_pvct_holder) salcho_imp = self.sum_by_entity(salcho_imp_holder) # rev_cap et imp_lib pour produits soumis à prel libératoire- check TODO: # # def rev_exon et rev_etranger dans data? ## pt = max_( 0, salcho_imp + pen_net + rto_net + rev_cap_bar + rev_cap_lib + ric + rag + rpns_exon + rpns_pvct + imp_lib + fon ) return period, pt * P.taux @reference_formula class decote_isf(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Décote de l'ISF" start_date = date(2013, 1, 1) def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') ass_isf = simulation.calculate('ass_isf', period) P = simulation.legislation_at(period.start).isf.decote elig = (ass_isf >= P.min) & (ass_isf <= P.max) LB = P.base - P.taux * ass_isf return period, LB * elig @reference_formula class isf_apres_plaf(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Impôt sur la fortune après plafonnement" # Plafonnement supprimé pour l'année 2012 @dated_function(start = date(2002, 1, 1), stop = date(2011, 12, 31)) def function_20020101_20111231(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') tot_impot = simulation.calculate('tot_impot', period) revetproduits = simulation.calculate('revetproduits', period) isf_avant_plaf = simulation.calculate('isf_avant_plaf', period) P = simulation.legislation_at(period.start).isf.plaf # si ISF avant plafonnement n'excède pas seuil 1= la limitation du plafonnement ne joue pas # si entre les deux seuils; l'allègement est limité au 1er seuil # si ISF avant plafonnement est supérieur au 2nd seuil, l'allègement qui résulte du plafonnement # est limité à 50% de l'ISF plafonnement = max_(tot_impot - revetproduits, 0) limitationplaf = ( (isf_avant_plaf <= P.seuil1) * plafonnement + (P.seuil1 <= isf_avant_plaf) * (isf_avant_plaf <= P.seuil2) * min_(plafonnement, P.seuil1) + (isf_avant_plaf >= P.seuil2) * min_(isf_avant_plaf * P.taux, plafonnement) ) return period, max_(isf_avant_plaf - limitationplaf, 0) @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') isf_avant_plaf = simulation.calculate('isf_avant_plaf', period) # si ISF avant plafonnement n'excède pas seuil 1= la limitation du plafonnement ne joue pas ## # si entre les deux seuils; l'allègement est limité au 1er seuil ## # si ISF avant plafonnement est supérieur au 2nd seuil, l'allègement qui résulte du plafonnement # est limité à 50% de l'ISF return period, isf_avant_plaf @dated_function(start = date(2013, 1, 1), stop = date(2015, 12, 31)) def function_20130101_20151231(self, simulation, period): """ Impôt sur la fortune après plafonnement """ period = period.start.offset('first-of', 'year').period('year') tot_impot = simulation.calculate('tot_impot', period) revetproduits = simulation.calculate('revetproduits', period) isf_avant_plaf = simulation.calculate('isf_avant_plaf', period) plafond = max_(0, tot_impot - revetproduits) # case PU sur la déclaration d'impôt return period, max_(isf_avant_plaf - plafond, 0) @reference_formula class isf_tot(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"isf_tot" url = "http://www.impots.gouv.fr/portal/dgi/public/particuliers.impot?pageId=part_isf&espId=1&impot=ISF&sfid=50" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') b4rs = simulation.calculate('b4rs', period) isf_avant_plaf = simulation.calculate('isf_avant_plaf', period) isf_apres_plaf = simulation.calculate('isf_apres_plaf', period) irpp = simulation.calculate('irpp', period) return period, min_(-((isf_apres_plaf - b4rs) * ((-irpp) > 0) + (isf_avant_plaf - b4rs) * ((-irpp) <= 0)), 0) # # BOUCLIER FISCAL ## # # calcul de l'ensemble des revenus du contribuable ## # TODO: à reintégrer dans irpp @reference_formula class rvcm_plus_abat(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"rvcm_plus_abat" def function(self, simulation, period): ''' Revenu catégoriel avec abattement de 40% réintégré. ''' period = period.start.offset('first-of', 'year').period('year') rev_cat_rvcm = simulation.calculate('rev_cat_rvcm', period) rfr_rvcm = simulation.calculate('rfr_rvcm', period) return period, rev_cat_rvcm + rfr_rvcm @reference_formula class maj_cga_i(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Majoration pour non adhésion à un centre de gestion agréé (pour chaque individu du foyer)" # TODO: à reintégrer dans irpp (et vérifier au passage que frag_impo est dans la majo_cga def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') frag_impo = simulation.calculate('frag_impo', period) nrag_impg = simulation.calculate('nrag_impg', period) nbic_impn = simulation.calculate('nbic_impn', period) nbic_imps = simulation.calculate('nbic_imps', period) nbic_defn = simulation.calculate('nbic_defn', period) nbic_defs = simulation.calculate('nbic_defs', period) nacc_impn = simulation.calculate('nacc_impn', period) nacc_meup = simulation.calculate('nacc_meup', period) nacc_defn = simulation.calculate('nacc_defn', period) nacc_defs = simulation.calculate('nacc_defs', period) nbnc_impo = simulation.calculate('nbnc_impo', period) nbnc_defi = simulation.calculate('nbnc_defi', period) P = simulation.legislation_at(period.start).ir.rpns nbic_timp = (nbic_impn + nbic_imps) - (nbic_defn + nbic_defs) # C revenus industriels et commerciaux non professionnels # (revenus accesoires du foyers en nomenclature INSEE) nacc_timp = max_(0, (nacc_impn + nacc_meup) - (nacc_defn + nacc_defs)) # régime de la déclaration contrôlée ne bénéficiant pas de l'abattement association agréée nbnc_timp = nbnc_impo - nbnc_defi # Totaux ntimp = nrag_impg + nbic_timp + nacc_timp + nbnc_timp return period, max_(0, P.cga_taux2 * (ntimp + frag_impo)) @reference_formula class maj_cga(PersonToEntityColumn): entity_class = FoyersFiscaux label = u"Majoration pour non adhésion à un centre de gestion agréé" operation = 'add' variable = maj_cga_i @reference_formula class bouclier_rev(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"bouclier_rev" start_date = date(2006, 1, 1) stop_date = date(2010, 12, 31) def function(self, simulation, period): ''' Total des revenus sur l'année 'n' net de charges ''' period = period.start.offset('first-of', 'year').period('year') rbg = simulation.calculate('rbg', period) maj_cga = simulation.calculate('maj_cga', period) csg_deduc = simulation.calculate('csg_deduc', period) rvcm_plus_abat = simulation.calculate('rvcm_plus_abat', period) rev_cap_lib = simulation.calculate('rev_cap_lib', period) rev_exo = simulation.calculate('rev_exo', period) rev_or = simulation.calculate('rev_or', period) cd_penali = simulation.calculate('cd_penali', period) cd_eparet = simulation.calculate('cd_eparet', period) # TODO: réintégrer les déficits antérieur # TODO: intégrer les revenus soumis au prélèvement libératoire null = 0 * rbg deficit_ante = null # # Revenus frac_rvcm_rfr = 0.7 * rvcm_plus_abat # TODO: UNUSED ? # # revenus distribués? # # A majorer de l'abatt de 40% - montant brut en cas de PFL # # pour le calcul de droit à restitution : prendre 0.7*montant_brut_rev_dist_soumis_au_barème rev_bar = rbg - maj_cga - csg_deduc - deficit_ante # # TODO: AJOUTER : indemnités de fonction percus par les élus- revenus soumis à régimes spéciaux # Revenu soumis à l'impôt sur le revenu forfaitaire rev_lib = rev_cap_lib # # AJOUTER plus-values immo et moins values? # #Revenus exonérés d'IR réalisés en France et à l'étranger## # rev_exo = primes_pel + primes_cel + rente_pea + int_livrets + plus_values_per rev_exo = null # # proposer à l'utilisateur des taux de réference- PER, PEA, PEL,...TODO # # sommes investis- calculer les plus_values annuelles et prendre en compte pour rev_exo? # revenus soumis à la taxe forfaitaire sur les métaux précieux : rev_or revenus = rev_bar + rev_lib + rev_exo + rev_or # # CHARGES # Pension alimentaires # Cotisations ou primes versées au titre de l'épargne retraite charges = cd_penali + cd_eparet return period, revenus - charges @reference_formula class bouclier_imp_gen(SimpleFormulaColumn): # # ajouter CSG- CRDS column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"bouclier_imp_gen" start_date = date(2006, 1, 1) stop_date = date(2010, 12, 31) def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') irpp = simulation.calculate('irpp', period) taxe_habitation_holder = simulation.compute('taxe_habitation', period) tax_fonc = simulation.calculate('tax_fonc', period) isf_tot = simulation.calculate('isf_tot', period) cotsoc_lib_declarant1_holder = simulation.compute('cotsoc_lib_declarant1', period) cotsoc_bar_declarant1_holder = simulation.compute('cotsoc_bar_declarant1', period) csg_deductible_salaire_holder = simulation.compute('csg_deductible_salaire', period) csg_imposable_salaire_holder = simulation.compute('csg_imposable_salaire', period) crds_salaire_holder = simulation.compute('crds_salaire', period) csg_imposable_chomage_holder = simulation.compute('csg_imposable_chomage', period) csg_deductible_chomage_holder = simulation.compute('csg_deductible_chomage', period) csg_deductible_retraite_holder = simulation.compute('csg_deductible_retraite', period) csg_imposable_retraite_holder = simulation.compute('csg_imposable_retraite', period) imp_lib = simulation.calculate('imp_lib', period) cotsoc_bar = self.sum_by_entity(cotsoc_bar_declarant1_holder) cotsoc_lib = self.sum_by_entity(cotsoc_lib_declarant1_holder) crds_salaire = self.sum_by_entity(crds_salaire_holder) csg_deductible_chomage = self.sum_by_entity(csg_deductible_chomage_holder) csg_imposable_chomage = self.sum_by_entity(csg_imposable_chomage_holder) csg_deductible_salaire = self.sum_by_entity(csg_deductible_salaire_holder) csg_imposable_salaire = self.sum_by_entity(csg_imposable_salaire_holder) csg_deductible_retraite = self.sum_by_entity(csg_deductible_retraite_holder) csg_imposable_retraite = self.sum_by_entity(csg_imposable_retraite_holder) taxe_habitation = self.cast_from_entity_to_role(taxe_habitation_holder, role = PREF) taxe_habitation = self.sum_by_entity(taxe_habitation) # # ajouter Prelèvements sources/ libé # # ajouter crds rstd # # impôt sur les plus-values immo et cession de fonds de commerce imp1 = cotsoc_lib + cotsoc_bar + csg_deductible_salaire + csg_deductible_chomage + crds_salaire + csg_deductible_retraite + imp_lib ''' Impôts payés en l'année 'n' au titre des revenus réalisés sur l'année 'n' ''' imp2 = irpp + isf_tot + taxe_habitation + tax_fonc + csg_imposable_salaire + csg_imposable_chomage + csg_imposable_retraite ''' Impôts payés en l'année 'n' au titre des revenus réalisés en 'n-1' ''' return period, imp1 + imp2 @reference_formula class restitutions(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"restitutions" start_date = date(2006, 1, 1) stop_date = date(2010, 12, 31) def function(self, simulation, period): ''' Restitutions d'impôt sur le revenu et degrèvements percus en l'année 'n' ''' period = period.start.offset('first-of', 'year').period('year') ppe = simulation.calculate('ppe', period) restit_imp = simulation.calculate('restit_imp', period) return period, ppe + restit_imp @reference_formula class bouclier_sumimp(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"bouclier_sumimp" start_date = date(2006, 1, 1) stop_date = date(2010, 12, 31) def function(self, simulation, period): ''' Somme totale des impôts moins restitutions et degrèvements ''' period = period.start.offset('first-of', 'year').period('year') bouclier_imp_gen = simulation.calculate('bouclier_imp_gen', period) restitutions = simulation.calculate('restitutions', period) return period, -bouclier_imp_gen + restitutions @reference_formula class bouclier_fiscal(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"bouclier_fiscal" start_date = date(2006, 1, 1) stop_date = date(2010, 12, 31) url = "http://fr.wikipedia.org/wiki/Bouclier_fiscal" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') bouclier_sumimp = simulation.calculate('bouclier_sumimp', period) bouclier_rev = simulation.calculate('bouclier_rev', period) P = simulation.legislation_at(period.start).bouclier_fiscal return period, max_(0, bouclier_sumimp - (bouclier_rev * P.taux)) PK'GM<<copenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/taxes_salaires_main_oeuvre.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import csv import logging import pkg_resources from numpy import fromiter, logical_or as or_, round as round_ import openfisca_france from ...base import * # noqa analysis:ignore log = logging.getLogger(__name__) taux_aot_by_depcom = None taux_smt_by_depcom = None # TODO: # check hsup everywhere ! # versement transport dépdendant de la localité (décommenter et compléter) # Helpers from .cotisations_sociales.base import apply_bareme # Cotisations proprement dites @reference_formula class conge_individuel_formation_cdd(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Contribution au financement des congé individuel de formation (CIF) des salariées en CDD" # TODO: date de début def function(self, simulation, period): contrat_de_travail_duree = simulation.calculate('contrat_de_travail_duree', period) assiette_cotisations_sociales = simulation.calculate('assiette_cotisations_sociales', period) law = simulation.legislation_at(period.start).cotsoc.conge_individuel_formation cotisation = - law.cdd * (contrat_de_travail_duree == 1) * assiette_cotisations_sociales return period, cotisation @reference_formula class contribution_developpement_apprentissage(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Contribution additionnelle au développement de l'apprentissage" def function(self, simulation, period): redevable_taxe_apprentissage = simulation.calculate('redevable_taxe_apprentissage', period) cotisation = apply_bareme( simulation, period, cotisation_type = "employeur", bareme_name = "apprentissage_add", variable_name = self.__class__.__name__, ) return period, cotisation * redevable_taxe_apprentissage @reference_formula class contribution_supplementaire_apprentissage(DatedFormulaColumn): column = FloatCol entity_class = Individus label = u"Contribution supplémentaire à l'apprentissage" @dated_function(date(2010, 1, 1)) def function(self, simulation, period): redevable_taxe_apprentissage = simulation.calculate('redevable_taxe_apprentissage', period) assiette_cotisations_sociales = simulation.calculate('assiette_cotisations_sociales', period) ratio_alternants = simulation.calculate('ratio_alternants', period) effectif_entreprise = simulation.calculate('effectif_entreprise', period) taux = simulation.legislation_at(period.start).cotsoc.contribution_supplementaire_apprentissage if period.start.year > 2012: taux_contribution = redevable_taxe_apprentissage * ( (effectif_entreprise < 2000) * (ratio_alternants < .01) * taux.moins_2000_moins_1pc_alternants + (effectif_entreprise >= 2000) * (ratio_alternants < .01) * taux.plus_2000_moins_1pc_alternants + (.01 <= ratio_alternants) * (ratio_alternants < .02) * taux.entre_1_2_pc_alternants + (.02 <= ratio_alternants) * (ratio_alternants < .03) * taux.entre_2_3_pc_alternants + (.03 <= ratio_alternants) * (ratio_alternants < .04) * taux.entre_3_4_pc_alternants + (.04 <= ratio_alternants) * (ratio_alternants < .05) * taux.entre_4_5_pc_alternants ) else: taux_contribution = (effectif_entreprise >= 250) * taux.plus_de_250 * redevable_taxe_apprentissage # TODO: gestion de la place dans le XML pb avec l'arbre des paramètres / preprocessing return period, - taux_contribution * assiette_cotisations_sociales @reference_formula class cotisations_employeur_main_d_oeuvre(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Cotisation sociales employeur main d'oeuvre" def function(self, simulation, period): period = period conge_individuel_formation_cdd = simulation.calculate('conge_individuel_formation_cdd', period) contribution_developpement_apprentissage = simulation.calculate( 'contribution_developpement_apprentissage', period) contribution_supplementaire_apprentissage = simulation.calculate( 'contribution_supplementaire_apprentissage', period) financement_organisations_syndicales = simulation.calculate('financement_organisations_syndicales', period) fnal = simulation.calculate('fnal', period) formation_professionnelle = simulation.calculate('formation_professionnelle', period) participation_effort_construction = simulation.calculate_add('participation_effort_construction', period) prevoyance_obligatoire_cadre = simulation.calculate_add('prevoyance_obligatoire_cadre', period) taxe_apprentissage = simulation.calculate_add('taxe_apprentissage', period) versement_transport = simulation.calculate_add('versement_transport', period) cotisations_employeur_main_d_oeuvre = ( conge_individuel_formation_cdd + contribution_developpement_apprentissage + contribution_supplementaire_apprentissage + financement_organisations_syndicales + fnal + formation_professionnelle + participation_effort_construction + prevoyance_obligatoire_cadre + taxe_apprentissage + versement_transport ) return period, cotisations_employeur_main_d_oeuvre @reference_formula class fnal(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation fonds national action logement (FNAL)" def function(self, simulation, period): fnal_tranche_a = simulation.calculate('fnal_tranche_a', period) fnal_tranche_a_plus_20 = simulation.calculate('fnal_tranche_a_plus_20', period) return period, fnal_tranche_a + fnal_tranche_a_plus_20 @reference_formula class fnal_tranche_a(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation fonds national action logement (FNAL tout employeur)" def function(self, simulation, period): taille_entreprise = simulation.calculate('taille_entreprise', period) cotisation = apply_bareme( simulation, period, cotisation_type = 'employeur', bareme_name = 'fnal1', variable_name = self.__class__.__name__, ) return period, cotisation * (taille_entreprise <= 2) @reference_formula class fnal_tranche_a_plus_20(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Fonds national action logement (FNAL, employeur avec plus de 20 salariés)" def function(self, simulation, period): taille_entreprise = simulation.calculate('taille_entreprise', period) cotisation = apply_bareme( simulation, period, cotisation_type = 'employeur', bareme_name = 'fnal2', variable_name = self.__class__.__name__, ) return period, cotisation * (taille_entreprise > 2) @reference_formula class financement_organisations_syndicales(DatedFormulaColumn): column = FloatCol entity_class = Individus label = u"Contribution patronale au financement des organisations syndicales" @dated_function(date(2015, 1, 1)) def function(self, simulation, period): type_sal = simulation.calculate('type_sal', period) cotisation = apply_bareme( simulation, period, cotisation_type = 'employeur', bareme_name = 'financement_organisations_syndicales', variable_name = self.__class__.__name__, ) return period, cotisation * or_(type_sal <= 1, type_sal == 6) @reference_formula class formation_professionnelle(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Formation professionnelle" def function(self, simulation, period): taille_entreprise = simulation.calculate('taille_entreprise', period) cotisation_0_9 = (taille_entreprise == 1) * apply_bareme( simulation, period, cotisation_type = 'employeur', bareme_name = 'formprof_09', variable_name = self.__class__.__name__, ) cotisation_10_19 = (taille_entreprise == 2) * apply_bareme( simulation, period, cotisation_type = 'employeur', bareme_name = 'formprof_1019', variable_name = self.__class__.__name__, ) cotisation_20 = (taille_entreprise > 2) * apply_bareme( simulation, period, cotisation_type = 'employeur', bareme_name = 'formprof_20', variable_name = self.__class__.__name__, ) return period, cotisation_0_9 + cotisation_10_19 + cotisation_20 @reference_formula class participation_effort_construction(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Participation à l'effort de construction" def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') cotisation = apply_bareme( simulation, period, cotisation_type = 'employeur', bareme_name = 'construction', variable_name = self.__class__.__name__, ) return period, cotisation @reference_formula class taxe_apprentissage(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Taxe d'apprentissage (employeur, entreprise redevable de la taxe d'apprentissage uniquement)" def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') redevable_taxe_apprentissage = simulation.calculate('redevable_taxe_apprentissage', period) cotisation = apply_bareme( simulation, period, cotisation_type = 'employeur', bareme_name = 'apprentissage', variable_name = self.__class__.__name__, ) return period, redevable_taxe_apprentissage * cotisation @reference_formula class taxe_salaires(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Taxe sur les salaires" # Voir # http://www.impots.gouv.fr/portal/deploiement/p1/fichedescriptiveformulaire_8920/fichedescriptiveformulaire_8920.pdf def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') assujettie_taxe_salaires = simulation.calculate('assujettie_taxe_salaires', period) assiette_cotisations_sociales = simulation.calculate('assiette_cotisations_sociales', period) prevoyance_obligatoire_cadre = simulation.calculate('prevoyance_obligatoire_cadre', period) law = simulation.legislation_at(period.start) bareme = law.cotsoc.taxes_sal.taux_maj base = assiette_cotisations_sociales - prevoyance_obligatoire_cadre # TODO: exonérations apprentis # TODO: modify if DOM return period, - ( bareme.calc( base, factor = 1 / 12, round_base_decimals = 2 ) + round_(law.cotsoc.taxes_sal.taux.metro * base, 2) ) * assujettie_taxe_salaires @reference_formula class taux_versement_transport(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"" def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') depcom_entreprise = simulation.calculate('depcom_entreprise', period) effectif_entreprise = simulation.calculate('effectif_entreprise', period) type_sal = simulation.calculate('type_sal', period) preload_taux_versement_transport() public = (type_sal >= 2) default_value = 0.0 taux_aot = fromiter( ( taux_aot_by_depcom.get(depcom_cell, default_value) for depcom_cell in depcom_entreprise ), dtype = 'float', ) taux_smt = fromiter( ( taux_smt_by_depcom.get(depcom_cell, default_value) for depcom_cell in depcom_entreprise ), dtype = 'float', ) # "L'entreprise emploie-t-elle plus de 9 salariés dans le périmètre de l'Autorité organisatrice de transport # (AOT) suivante ou syndicat mixte de transport (SMT)" return period, (taux_aot + taux_smt) * or_(effectif_entreprise > 9, public) / 100 @reference_formula class versement_transport(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Versement transport" def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') assiette_cotisations_sociales = simulation.calculate('assiette_cotisations_sociales', period) taux_versement_transport = simulation.calculate('taux_versement_transport', period) cotisation = - taux_versement_transport * assiette_cotisations_sociales return period, cotisation def preload_taux_versement_transport(): global taux_aot_by_depcom global taux_smt_by_depcom if taux_aot_by_depcom is None: with pkg_resources.resource_stream( openfisca_france.__name__, 'assets/versement_transport/taux.csv', ) as csv_file: csv_reader = csv.DictReader(csv_file) taux_aot_by_depcom = { row['code INSEE']: float(row['taux'] or 0) # autorité organisatrice des transports for row in csv_reader } if taux_smt_by_depcom is None: with pkg_resources.resource_stream( openfisca_france.__name__, 'assets/versement_transport/taux.csv', ) as csv_file: csv_reader = csv.DictReader(csv_file) taux_smt_by_depcom = { row['code INSEE']: float(row['taux additionnel'] or 0) # syndicat mixte de transport for row in csv_reader } PKFQopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/__init__.pyPK'G 1XTTRopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/penalites.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import logging from numpy import logical_not as not_ from openfisca_core.formulas import SimpleFormulaColumn from ...base import * # noqa analysis:ignore log = logging.getLogger(__name__) # TODO: mettre les seuils entreprises dans les paramètres @reference_formula class penalite_egalite_professionnelle(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Pénalité visant à favoriser l'égalité professionnelle homme-femme" start_date = "2012-01-01" def function(self, simulation, period): egalite_professionnelle_accord = simulation.calculate('egalite_professionnelle_accord', period) effectif_entreprise = simulation.calculate('effectif_entreprise', period) taux = 0 # TODO: comment coder taux ? nouvelle variable ? Dans la loi < 1% déterminé par la direccte return period, not_(egalite_professionnelle_accord) * (effectif_entreprise >= 50) * taux @reference_formula class penalite_emploi_jeunes(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Pénalité visant à favoriser l'emploi des jeunes" start_date = "2010-01-01" end_date = "2013-09-30" def function(self, simulation, period): emploi_jeunes_accord = simulation.calculate('emploi_jeunes_accord', period) effectif_entreprise = simulation.calculate('effectif_entreprise', period) taux = 0 # TODO: comment coder taux ? nouvelle variable ? return period, not_(emploi_jeunes_accord) * (effectif_entreprise >= 300) * taux @reference_formula class penalite_emploi_seniors(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Pénalité visant à favoriser l'emploi des séniors" start_date = "2010-01-01" end_date = "2013-09-30" def function(self, simulation, period): emploi_senior_accord = simulation.calculate('emploi_senior_accord', period) effectif_entreprise = simulation.calculate('effectif_entreprise', period) taux = 0 # TODO: comment coder taux ? nouvelle variable ? 1% ? return period, not_(emploi_senior_accord) * (effectif_entreprise >= 50) * taux @reference_formula class penalite_penibilite(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Pénalité visant à favoriser la prévention de la pénibilité" # TODO start_date def function(self, simulation, period): penibilite_prevention_accord = simulation.calculate('penibilite_prevention_accord', period) effectif_entreprise = simulation.calculate('effectif_entreprise', period) taux = 0 # TODO: quel taux ? return period, not_(penibilite_prevention_accord) * (effectif_entreprise >= 50) * taux @reference_formula class penalite_handicapes(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Pénalité pour emploi insuffisant de personnes handicapées" # TODO start_date def function(self, simulation, period): # les entreprises sont soumises à une obligation d’emploi en faveur des travailleurs handicapés. # Toute entreprise (privée ou public) doit compter au moins 6% de # travailleurs ayant une reconnaissance administrative de handicap parmi ses # effectifs salariés. A défaut, l’employeur peut verser une contribution annuelle # proportionnelle au nombre de salariés handicapés qu’il aurait dû recruter pour # remplir son obligation d’emploi. effectif_entreprise = simulation.calculate('effectif_entreprise', period) return period, 0 * effectif_entreprise # TODO penibilite CDD évoquée page 11 du guide IPP est-elle la cotisation pour le CIF des CDD ? PK'G~u00kopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/apprentissage.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import datetime64, timedelta64 from ....base import * # noqa analysis:ignore @reference_formula class apprenti(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"L'individu est apprenti" url = "http://www.apce.com/pid927/contrat-d-apprentissage.html?espace=1&tp=1&pagination=2" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age = simulation.calculate('age', period) age_condition = (16 <= age) * (age < 25) apprentissage_contrat_debut = simulation.calculate('apprentissage_contrat_debut', period) duree_contrat = ( datetime64(period.start) + timedelta64(1, 'D') - apprentissage_contrat_debut ).astype('timedelta64[Y]') anciennete_contrat = (duree_contrat < timedelta64(3, 'Y')) return period, age_condition * anciennete_contrat @reference_formula class remuneration_apprenti(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Rémunération de l'apprenti" url = "http://www.apce.com/pid927/contrat-d-apprentissage.html?espace=1&tp=1&pagination=2" # Aux jeunes de 16 à 25 ans (exceptionnellement 15 ans, s'ils ont effectué la scolarité du premier cycle de # l'enseignement secondaire, ou, s'ils suivent une "formation apprentissage junior"). # # Depuis le 30 juillet 2011, il est possible pour un jeune mineur ayant 15 ans au cours de l'année civile, de # souscrire un contrat d'apprentissage s'il justifie avoir accompli la scolarité du premier cycle de l'enseignement # secondaire, ou avoir suivi une formation dans le cadre du dispositif d'initiation aux métiers en # alternance (DIMA). def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age = simulation.calculate('age', period) apprentissage_contrat_debut = simulation.calculate('apprentissage_contrat_debut', period) smic = simulation.legislation_at(period.start).cotsoc.gen.smic_h_b * 52 * 35 / 12 anciennete_contrat = ( datetime64(period.start) + timedelta64(1, 'D') - apprentissage_contrat_debut ).astype('timedelta64[Y]') apprenti = simulation.calculate('apprenti', period) salaire_en_smic = [ # TODO: move to parameters dict( part_de_smic_by_anciennete = { 1: .25, 2: .41, 3: .53, }, age_min = 15, age_max = 18, ), dict( part_de_smic_by_anciennete = { 1: .37, 2: .49, 3: .61, }, age_min = 18, age_max = 21, ), dict( part_de_smic_by_anciennete = { 1: .53, 2: .65, 3: .78, }, age_min = 21, age_max = 99 ) ] output = age * 0.0 for age_interval in salaire_en_smic: age_condition = (age_interval["age_min"] <= age) * (age < age_interval["age_max"]) output[age_condition] = sum([ (anciennete_contrat[age_condition] == anciennete) * part_de_smic for anciennete, part_de_smic in age_interval['part_de_smic_by_anciennete'].iteritems() ]) return period, output * smic * apprenti @reference_formula class exoneration_cotisations_employeur_apprenti(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Exonération de cotisations employeur pour l'emploi d'un apprenti" url = "http://www.apce.com/pid927/contrat-d-apprentissage.html?espace=1&tp=1&pagination=2" # Artisans et employeurs de moins de 11 salariés # # - exonération totale (part patronale et salariale) des charges sociales, # - sauf : cotisation sociale patronale d'accidents du travail et des maladies professionnelles, cotisation # supplémentaire accidents du travail et cotisation supplémentaire de retraite complémentaire (c'est-à-dire # dépassant le taux minimum obligatoire). # # Autres entreprises # # - exonération totale (part patronale et salariale) des cotisations de sécurité sociale # (maladie-veuvage-vieillesse) et d'allocations familiales, # - exonération des autres cotisations sociales salariales, # - restent donc dues par l'employeur : les cotisations supplémentaires d'accidents du travail, la part patronale # des cotisations d'accidents du travail et de maladies professionnelles, de retraite complémentaire, d'assurance # chômage et d'AGFF, le versement transport ainsi que les cotisations Fnal. # Précision : le décompte de l'effectif des entreprises non artisanales s'apprécie au 31 décembre précédant la date # de conclusion du contrat d'apprentissage. def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') accident_du_travail = simulation.calculate('accident_du_travail', period) apprenti = simulation.calculate('apprenti', period) cotisations_employeur = simulation.calculate('cotisations_employeur', period) effectif_entreprise = simulation.calculate('effectif_entreprise', period) famille = simulation.calculate('famille', period) mmid_employeur = simulation.calculate('mmid_employeur', period) vieillesse_deplafonnee_employeur = simulation.calculate('vieillesse_deplafonnee_employeur', period) vieillesse_plafonnee_employeur = simulation.calculate('vieillesse_plafonnee_employeur', period) cotisations_non_exonerees = accident_du_travail exoneration_moins_11 = cotisations_non_exonerees - cotisations_employeur cotisations_exonerees = (famille + mmid_employeur + vieillesse_plafonnee_employeur + vieillesse_deplafonnee_employeur) exoneration_plus_11 = -cotisations_exonerees return period, ( exoneration_plus_11 * (effectif_entreprise >= 11) + exoneration_moins_11 * (effectif_entreprise < 11) ) * apprenti @reference_formula class exoneration_cotisations_salariales_apprenti(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Exonération de cotisations salariales pour l'emploi d'un apprenti" url = "http://www.apce.com/pid927/contrat-d-apprentissage.html?espace=1&tp=1&pagination=2" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') apprenti = simulation.calculate('apprenti', period) cotisations_salariales_contributives = simulation.calculate('cotisations_salariales_contributives', period) cotisations_salariales_non_contributives = simulation.calculate( 'cotisations_salariales_non_contributives', period) return period, - (cotisations_salariales_contributives + cotisations_salariales_non_contributives) * apprenti @reference_formula class prime_apprentissage(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Prime d'apprentissage pour les entreprise employant un apprenti" url = "http://www.apce.com/pid927/contrat-d-apprentissage.html?espace=1&tp=1&pagination=2" # L'employeur peut également recevoir de la région dans laquelle est situé l'établissement du lieu de travail, # une prime d'apprentissage. # # Les conditions d'attribution de cette aide sont fixées par chaque région (ou pour la Corse, par la collectivité # territoriale de Corse) après avis du comité de coordination régional de l'emploi et de la formation # professionnelle en tenant compte notamment de l'ensemble de l'effort de l'employeur dans le domaine de # l'apprentissage, de la durée de la formation et des objectifs de développement de la formation professionnelle # des jeunes sur le territoire de la région (ou de la collectivité territoriale de Corse). # # Son montant est au minimum de 1 000 euros par année de cycle de formation. # nouveau. Depuis le 1er janvier 2014 , cette aide n'est versée qu'aux entreprises de moins de 11 salariés. # # Son versement est subordonné à la condition que l'embauche de l'apprenti soit confirmée à l'issue des deux # premiers mois de l'apprentissage. # # Son versement cesse lorsque l'apprenti n'est plus salarié dans l'entreprise ou l'établissement qui l'a embauché. def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') apprenti = simulation.calculate('apprenti', period) return period, 1000 * apprenti # @reference_formula # class credit_impot_emploi_apprenti(SimpleFormulaColumn): # column = FloatCol # entity_class = Individus # label = u" Crédit d'impôt pour l'emploi d'apprentis" # url = "http://www.apce.com/pid927/contrat-d-apprentissage.html?espace=1&tp=1&pagination=2" # # def function(self, simulation, period): # pass # # Cet avantage fiscal est réservé aux entreprises imposées selon un régime d'imposition du réel. # # Précision : les entreprises exonérées d'impôt sur les bénéfices au titre des entreprises nouvelles, d'une # # implantation en zone franche urbaine, du statut de jeune entreprise innovante ou d'une implantation en Corse # # peuvent également en bénéficier. # # # # Le crédit d'impôt est égal au nombre moyen d'apprentis dont le contrat de travail a atteint une durée d'au moins # # 1 mois au cours de l'année civile multiplié par : # # - 1 600 €, # # - ou 2 200 € si l'apprenti est reconnu travailleur handicapé et qu'il bénéficie d'un accompagnement personnalisé, # # ou si l'apprenti est employé par une entreprise portant le label "Entreprise du patrimoine vivant", ou s'il est # # recruté dans le cadre d'une "formation apprentissage junior". # # # # L'avantage fiscal est plafonné au montant des dépenses de personnel afférentes aux apprentis minoré des # # subventions perçues en contrepartie de leur embauche. # @reference_formula # class credit_impot_emploi_apprenti(SimpleFormulaColumn): # column = FloatCol # entity_class = Individus # label = u"Déduction de la créance "bonus alternant" # Les entreprises de plus de 250 salariés, tous établissements confondus, redevables de la taxe d'apprentissage, qui emploient plus de 4 % de jeunes en apprentissage (5 % pour la taxe payable en 2016 au titre de 2015), dans la limite de 6 % d'alternants, peuvent bénéficier d'une créance à déduire du hors quota de la taxe d'apprentissage (TA). # Les entreprises concernées doivent calculer elles-mêmes le montant de la créance à déduire de leur TA. # Son montant est calculé selon la formule suivante : pourcentage d'alternants ouvrant droit à l'aide x effectif annuel moyen de l'entreprise au 31 décembre de l'année précédente x un montant forfaitaire de 400 € par alternant. # Par exemple, une entreprise de 300 salariés employant 6 % de salariés en alternance, ce qui porte le nombre d'alternants ouvrant droit à l'aide à 2 % (6 % - 4 %), peut bénéficier d'une prime de : 2 % x 300 x 400 = 2 400 €. PKFfopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/__init__.pyPK'G copenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/stage.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import maximum as max_ from ....base import * # noqa analysis:ignore from .base import apply_bareme_for_relevant_type_sal reference_input_variable( column = IntCol(), entity_class = Individus, label = u"Nombre d'heures effectuées en stage", name = 'stage_duree_heures', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Taux de gratification (en plafond de la Sécurité sociale)", name = 'stage_gratification_taux', ) @reference_formula class stage_gratification(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Gratification de stage" start_date = date(2014, 11, 1) # TODO: remove when updating legislation backwards def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') stage_duree_heures = simulation.calculate('stage_duree_heures', period) stage_gratification_taux = simulation.calculate('stage_gratification_taux', period) stagiaire = simulation.calculate('stagiaire', period) plafond_securite_sociale_horaire = simulation.legislation_at(period.start).cotsoc.gen.plafond_securite_sociale_horaire # TODO: move to legislation parameters file stage_gratification_taux_min = .1375 # depuis le 1er décembre 2014 # .15 à partir de 2015-09-01 return period, stagiaire * plafond_securite_sociale_horaire * stage_duree_heures * max_( stage_gratification_taux, stage_gratification_taux_min) @reference_formula class stage_gratification_reintegration(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Part de la gratification de stage réintégrée à l'assiette des cotisations et contributions sociales" start_date = date(2014, 11, 1) # TODO: remove when updating legislation backwards def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') stage_duree_heures = simulation.calculate('stage_duree_heures', period) stage_gratification = simulation.calculate('stage_gratification', period) plafond_securite_sociale_horaire = ( simulation.legislation_at(period.start).cotsoc.gen.plafond_securite_sociale_horaire) # TODO: move to legislation parameters file stage_gratification_taux_min = .1375 # .15 à partir de 2015-09-01   stage_gratification_min = plafond_securite_sociale_horaire * stage_duree_heures * stage_gratification_taux_min return period, max_(stage_gratification - stage_gratification_min, 0) @reference_formula class stagiaire(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"L'individu est stagiaire" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') stage_duree_heures = simulation.calculate('stage_duree_heures', period) return period, (stage_duree_heures > 0) @reference_formula class exoneration_cotisations_employeur_stagiaire(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Exonrérations de cotisations employeur pour un stagaire" url = "http://www.apce.com/pid2798/stages.html?espace=3" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') agirc_employeur = simulation.calculate('agirc_employeur', period) agirc_gmp_employeur = simulation.calculate('agirc_gmp_employeur', period) arrco_employeur = simulation.calculate('arrco_employeur', period) plafond_securite_sociale = simulation.calculate('plafond_securite_sociale', period) stage_gratification_reintegration = simulation.calculate('stage_gratification_reintegration', period) stagiaire = simulation.calculate('stagiaire', period) type_sal = simulation.calculate('type_sal', period) bareme_by_type_sal_name = simulation.legislation_at(period.start).cotsoc.cotisations_employeur bareme_names = ['agffnc', 'agffc', 'chomfg', 'assedic'] exoneration = plafond_securite_sociale * 0.0 for bareme_name in bareme_names: exoneration += apply_bareme_for_relevant_type_sal( bareme_by_type_sal_name = bareme_by_type_sal_name, bareme_name = bareme_name, type_sal = type_sal, base = stage_gratification_reintegration, plafond_securite_sociale = plafond_securite_sociale, round_base_decimals = 2, ) exoneration = exoneration + agirc_employeur + agirc_gmp_employeur + arrco_employeur return period, - exoneration * stagiaire @reference_formula class exoneration_cotisations_salarie_stagiaire(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Exonrérations de cotisations salarié pour un stagiaire" url = "http://www.apce.com/pid2798/stages.html?espace=3" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') agirc_salarie = simulation.calculate('agirc_salarie', period) agirc_gmp_salarie = simulation.calculate('agirc_gmp_salarie', period) arrco_salarie = simulation.calculate('arrco_salarie', period) plafond_securite_sociale = simulation.calculate('plafond_securite_sociale', period) stage_gratification_reintegration = simulation.calculate('stage_gratification_reintegration', period) stagiaire = simulation.calculate('stagiaire', period) type_sal = simulation.calculate('type_sal', period) bareme_by_type_sal_name = simulation.legislation_at(period.start).cotsoc.cotisations_salarie bareme_names = ['agff', 'assedic'] exoneration = plafond_securite_sociale * 0.0 for bareme_name in bareme_names: exoneration += apply_bareme_for_relevant_type_sal( bareme_by_type_sal_name = bareme_by_type_sal_name, bareme_name = bareme_name, type_sal = type_sal, base = stage_gratification_reintegration, plafond_securite_sociale = plafond_securite_sociale, round_base_decimals = 2, ) exoneration = exoneration + agirc_salarie + agirc_gmp_salarie + arrco_salarie return period, - exoneration * stagiaire PK'GZ$$lopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/travail_totaux.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import logging from ....base import * # noqa analysis:ignore log = logging.getLogger(__name__) @reference_formula class cotisations_employeur(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Cotisations sociales employeur" set_input = set_input_divide_by_period def function(self, simulation, period): period = period cotisations_employeur_contributives = simulation.calculate('cotisations_employeur_contributives', period) cotisations_employeur_non_contributives = simulation.calculate( 'cotisations_employeur_non_contributives', period) cotisations_employeur_main_d_oeuvre = simulation.calculate('cotisations_employeur_main_d_oeuvre', period) return period, ( cotisations_employeur_contributives + cotisations_employeur_non_contributives + cotisations_employeur_main_d_oeuvre ) @reference_formula class cotisations_employeur_contributives(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Cotisations sociales employeur contributives" set_input = set_input_divide_by_period def function(self, simulation, period): period = period ags = simulation.calculate('ags', period) agff_employeur = simulation.calculate_add('agff_employeur', period) agirc_employeur = simulation.calculate_add('agirc_employeur', period) agirc_gmp_employeur = simulation.calculate_add('agirc_gmp_employeur', period) apec_employeur = simulation.calculate('apec_employeur', period) arrco_employeur = simulation.calculate('arrco_employeur', period) chomage_employeur = simulation.calculate('chomage_employeur', period) cotisation_exceptionnelle_temporaire_employeur = simulation.calculate( 'cotisation_exceptionnelle_temporaire_employeur', period) fonds_emploi_hospitalier = simulation.calculate_add('fonds_emploi_hospitalier', period) ircantec_employeur = simulation.calculate_add('ircantec_employeur', period) pension_civile_employeur = simulation.calculate_add('pension_civile_employeur', period) rafp_employeur = simulation.calculate_add('rafp_employeur', period) vieillesse_deplafonnee_employeur = simulation.calculate_add('vieillesse_deplafonnee_employeur', period) vieillesse_plafonnee_employeur = simulation.calculate_add('vieillesse_plafonnee_employeur', period) cotisations_employeur_contributives = ( # prive ags + agff_employeur + agirc_employeur + agirc_gmp_employeur + apec_employeur + arrco_employeur + chomage_employeur + cotisation_exceptionnelle_temporaire_employeur + vieillesse_deplafonnee_employeur + vieillesse_plafonnee_employeur + # public fonds_emploi_hospitalier + ircantec_employeur + pension_civile_employeur + rafp_employeur ) return period, cotisations_employeur_contributives @reference_formula class cotisations_employeur_non_contributives(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Cotisations sociales employeur non-contributives" set_input = set_input_divide_by_period def function(self, simulation, period): period = period accident_du_travail = simulation.calculate_add('accident_du_travail', period) allocations_temporaires_invalidite = simulation.calculate_add('allocations_temporaires_invalidite', period) contribution_solidarite_autonomie = simulation.calculate('contribution_solidarite_autonomie', period) famille = simulation.calculate('famille', period) mmid_employeur = simulation.calculate_add('mmid_employeur', period) taxe_salaires = simulation.calculate_add('taxe_salaires', period) cotisations_employeur_non_contributives = ( allocations_temporaires_invalidite + accident_du_travail + contribution_solidarite_autonomie + famille + mmid_employeur + taxe_salaires ) return period, cotisations_employeur_non_contributives @reference_formula class cotisations_salariales_contributives(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Cotisations sociales salariales contributives" set_input = set_input_divide_by_period def function(self, simulation, period): period = period agff_salarie = simulation.calculate_add('agff_salarie', period) agirc_salarie = simulation.calculate_add('agirc_salarie', period) agirc_gmp_salarie = simulation.calculate_add('agirc_gmp_salarie', period) apec_salarie = simulation.calculate_add('apec_salarie', period) arrco_salarie = simulation.calculate_add('arrco_salarie', period) chomage_salarie = simulation.calculate_add('chomage_salarie', period) cotisation_exceptionnelle_temporaire_salarie = simulation.calculate_add( 'cotisation_exceptionnelle_temporaire_salarie', period) ircantec_salarie = simulation.calculate_add('ircantec_salarie', period) pension_civile_salarie = simulation.calculate_add('pension_civile_salarie', period) rafp_salarie = simulation.calculate_add('rafp_salarie', period) vieillesse_deplafonnee_salarie = simulation.calculate_add('vieillesse_deplafonnee_salarie', period) vieillesse_plafonnee_salarie = simulation.calculate_add('vieillesse_plafonnee_salarie', period) cotisations_salariales_contributives = ( # prive agff_salarie + agirc_salarie + agirc_gmp_salarie + apec_salarie + arrco_salarie + chomage_salarie + cotisation_exceptionnelle_temporaire_salarie + vieillesse_deplafonnee_salarie + vieillesse_plafonnee_salarie + # public ircantec_salarie + pension_civile_salarie + rafp_salarie ) return period, cotisations_salariales_contributives @reference_formula class cotisations_salariales_non_contributives(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Cotisations sociales salariales non-contributives" set_input = set_input_divide_by_period def function(self, simulation, period): period = period contribution_exceptionnelle_solidarite = simulation.calculate_add( 'contribution_exceptionnelle_solidarite', period) mmid_salarie = simulation.calculate_add('mmid_salarie', period) cotisations_salariales_non_contributives = ( # prive mmid_salarie + # public contribution_exceptionnelle_solidarite ) return period, cotisations_salariales_non_contributives @reference_formula class cotisations_salariales(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Cotisations sociales salariales" set_input = set_input_divide_by_period def function(self, simulation, period): period = period cotisations_salariales_contributives = simulation.calculate('cotisations_salariales_contributives', period) cotisations_salariales_non_contributives = simulation.calculate( 'cotisations_salariales_non_contributives', period) exoneration_cotisations_salariales_apprenti = simulation.calculate_add( 'exoneration_cotisations_salariales_apprenti', period) exoneration_cotisations_salarie_stagiaire = simulation.calculate_add( 'exoneration_cotisations_salarie_stagiaire', period) return period, ( cotisations_salariales_contributives + cotisations_salariales_non_contributives + exoneration_cotisations_salariales_apprenti + exoneration_cotisations_salarie_stagiaire ) PK'G<--iopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/allegements.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from functools import partial from numpy import ( busday_count as original_busday_count, datetime64, logical_not as not_, logical_or as or_, maximum as max_, minimum as min_, round as round_, timedelta64 ) import logging from ....base import * # noqa analysis:ignore from .....assets.holidays import holidays log = logging.getLogger(__name__) @reference_formula class assiette_allegement(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Assiette des allègements de cotisations sociales employeur" def function(self, simulation, period): assiette_cotisations_sociales = simulation.calculate_add('assiette_cotisations_sociales', period) type_sal = simulation.calculate('type_sal', period) period = period # TODO vérifier changement d'assiette return period, assiette_cotisations_sociales * ( (type_sal == CAT['prive_non_cadre']) | (type_sal == CAT['prive_cadre']) ) @reference_formula class allegement_fillon(DatedFormulaColumn): column = FloatCol entity_class = Individus label = u"Allègement de charges employeur sur les bas et moyens salaires (dit allègement Fillon)" @dated_function(date(2005, 7, 1)) def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') stagiaire = simulation.calculate('stagiaire', period) apprenti = simulation.calculate('apprenti', period) allegement_fillon_mode_recouvrement = simulation.calculate('allegement_fillon_mode_recouvrement', period) allegement = ( # en fin d'année allegement_fillon_mode_recouvrement == 0) * ( compute_allegement_fillon_annuel(simulation, period) ) + ( # anticipé allegement_fillon_mode_recouvrement == 1) * ( compute_allegement_fillon_anticipe(simulation, period) ) + ( # cumul progressif allegement_fillon_mode_recouvrement == 2) * ( compute_allegement_fillon_progressif(simulation, period) ) return period, allegement * not_(stagiaire) * not_(apprenti) @reference_formula class coefficient_proratisation(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Coefficient de proratisation pour le calcul du SMIC et du plafond de la Sécurité socialele" def function(self, simulation, period): # u"temps_plein", # u"temps_partiel", # u"forfait_heures_semaines", # u"forfait_heures_mois", # u"forfait_heures_annee", # u"forfait_jours_annee", contrat_de_travail = simulation.calculate('contrat_de_travail', period) contrat_de_travail_debut = simulation.calculate('contrat_de_travail_debut', period) contrat_de_travail_fin = simulation.calculate('contrat_de_travail_fin', period) forfait_heures_remunerees_volume = simulation.calculate('forfait_heures_remunerees_volume', period) forfait_jours_remuneres_volume = simulation.calculate('forfait_jours_remuneres_volume', period) heures_duree_collective_entreprise = simulation.calculate('heures_duree_collective_entreprise', period) heures_remunerees_volume = simulation.calculate('heures_remunerees_volume', period) heures_non_remunerees_volume = simulation.calculate('heures_non_remunerees_volume', period) # Décompte des jours en début et fin de contrat # http://www.gestiondelapaie.com/flux-paie/?1029-la-bonne-premiere-paye busday_count = partial(original_busday_count, holidays = holidays) debut_mois = datetime64(period.start.offset('first-of', 'month')) fin_mois = datetime64(period.start.offset('last-of', 'month')) + timedelta64(1, 'D') mois_incomplet = or_(contrat_de_travail_debut > debut_mois, contrat_de_travail_fin < fin_mois) jours_travailles = busday_count( max_(contrat_de_travail_debut, debut_mois), min_(contrat_de_travail_fin, fin_mois) ) duree_legale = 35 * 52 / 12 # mensuelle_temps_plein heures_temps_plein = ( (heures_duree_collective_entreprise == 0) * duree_legale + heures_duree_collective_entreprise ) # heures remunerees avant conges sans soldes/ijss heures_remunerees_volume = ( (contrat_de_travail == 0) * ( heures_temps_plein * not_(mois_incomplet) + # 151.67 jours_travailles * 7 * mois_incomplet # TODO: 7 = heures / jours ) + (contrat_de_travail == 1) * heures_remunerees_volume ) heures_realisees = heures_remunerees_volume - heures_non_remunerees_volume coefficient = ( # Salariés à temps plein (contrat_de_travail == 0) * heures_realisees / heures_temps_plein + # Salariés à temps partiel : plafond proratisé en fonction du ratio durée travaillée / durée du temps plein # Salariés sans convention de forfait à temps partiel (contrat_de_travail == 1) * heures_realisees / heures_temps_plein + # Salariés avec convention de forfait # Forfait en heures (contrat_de_travail >= 2) * (contrat_de_travail <= 3) * ( forfait_heures_remunerees_volume / 45.7 * 52 / 12 ) + # Forfait en jours (contrat_de_travail == 4) * forfait_jours_remuneres_volume / 218 ) return period, coefficient @reference_formula class credit_impot_competitivite_emploi(DatedFormulaColumn): column = FloatCol entity_class = Individus label = u"Crédit d'imôt pour la compétitivité et l'emploi" @dated_function(date(2013, 1, 1)) def function_2013_(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') assiette_allegement = simulation.calculate('assiette_allegement', period) jeune_entreprise_innovante = simulation.calculate('jeune_entreprise_innovante', period) smic_proratise = simulation.calculate('smic_proratise', period) stagiaire = simulation.calculate('stagiaire', period) cotsoc = simulation.legislation_at(period.start).cotsoc taux_cice = taux_exo_cice(assiette_allegement, smic_proratise, cotsoc) credit_impot_competitivite_emploi = ( taux_cice * assiette_allegement ) non_cumul = (jeune_entreprise_innovante == 0 + stagiaire) > 0 return period, credit_impot_competitivite_emploi * non_cumul @reference_formula class smic_proratise(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"SMIC proratisé" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') coefficient_proratisation = simulation.calculate('coefficient_proratisation', period) smic_horaire_brut = simulation.legislation_at(period.start).cotsoc.gen.smic_h_b smic_proratise = coefficient_proratisation * smic_horaire_brut * 35 * 52 / 12 return period, smic_proratise # Helper functions def compute_allegement_fillon_annuel(simulation, period): if period.start.month < 12: return 0 if period.start.month == 12: return compute_allegement_fillon(simulation, period.start.offset('first-of', 'year').period('year')) def compute_allegement_fillon_anticipe(simulation, period): if period.start.month < 12: return compute_allegement_fillon(simulation, period.start.offset('first-of', 'month').period('month')) if period.start.month == 12: cumul = simulation.calculate_add( 'allegement_fillon', period.start.offset('first-of', 'year').period('month', 11)) return compute_allegement_fillon( simulation, period.start.offset('first-of', 'year').period('year') ) - cumul def compute_allegement_fillon_progressif(simulation, period): if period.start.month == 1: return compute_allegement_fillon(simulation, period.start.offset('first-of', 'month').period('month')) if period.start.month > 1: up_to_this_month = period.start.offset('first-of', 'year').period('month', period.start.month) up_to_previous_month = period.start.offset('first-of', 'year').period('month', period.start.month - 1) cumul = simulation.calculate_add('allegement_fillon', up_to_previous_month) up_to_this_month = period.start.offset('first-of', 'year').period('month', period.start.month) return compute_allegement_fillon(simulation, up_to_this_month) - cumul def compute_allegement_fillon(simulation, period): ''' Exonération Fillon http://www.securite-sociale.fr/comprendre/dossiers/exocotisations/exoenvigueur/fillon.htm ''' assiette_allegement = simulation.calculate_add('assiette_allegement', period) smic_proratise = simulation.calculate_add('smic_proratise', period) taille_entreprise = simulation.calculate('taille_entreprise', period) majoration = (taille_entreprise <= 2) # majoration éventuelle pour les petites entreprises # Calcul du taux # Le montant maximum de l’allègement dépend de l’effectif de l’entreprise. # Le montant est calculé chaque année civile, pour chaque salarié ; # il est égal au produit de la totalité de la rémunération annuelle telle # que visée à l’article L. 242-1 du code de la Sécurité sociale par un # coefficient. # Ce montant est majoré de 10 % pour les entreprises de travail temporaire # au titre des salariés temporaires pour lesquels elle est tenue à # l’obligation d’indemnisation compensatrice de congés payés. Pf = simulation.legislation_at(period.start).cotsoc.exo_bas_sal.fillon seuil = Pf.seuil tx_max = (Pf.tx_max * not_(majoration) + Pf.tx_max2 * majoration) if seuil <= 1: return 0 ratio_smic_salaire = smic_proratise / (assiette_allegement + 1e-16) # règle d'arrondi: 4 décimales au dix-millième le plus proche taux_fillon = round_(tx_max * min_(1, max_(seuil * ratio_smic_salaire - 1, 0) / (seuil - 1)), 4) # Montant de l'allegment allegement_fillon = taux_fillon * assiette_allegement return allegement_fillon def taux_exo_cice(assiette_allegement, smic_proratise, P): Pc = P.exo_bas_sal.cice taux_cice = ((assiette_allegement / (smic_proratise + 1e-16)) <= Pc.max) * Pc.taux return taux_cice PK'Gillkopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/travail_prive.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import logging from numpy import int16, maximum as max_, minimum as min_, logical_not as not_ from ....base import * # noqa analysis:ignore from .base import apply_bareme, apply_bareme_for_relevant_type_sal log = logging.getLogger(__name__) # TODO: # contribution patronale de prévoyance complémentaire # check hsup everywhere ! # versement transport dépdendant de la localité (décommenter et compléter) @reference_formula class assiette_cotisations_sociales(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Assiette des cotisations sociales des salaries" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period(u'month') assiette_cotisations_sociales_prive = simulation.calculate('assiette_cotisations_sociales_prive', period) assiette_cotisations_sociales_public = simulation.calculate('assiette_cotisations_sociales_public', period) stage_gratification_reintegration = simulation.calculate('stage_gratification_reintegration', period) return period, ( assiette_cotisations_sociales_prive + assiette_cotisations_sociales_public + stage_gratification_reintegration ) @reference_formula class assiette_cotisations_sociales_prive(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Assiette des cotisations sociales des salaries du prive" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period(u'month') apprenti = simulation.calculate('apprenti', period) avantage_en_nature = simulation.calculate('avantage_en_nature', period) hsup = simulation.calculate('hsup', period) indemnites_compensatrices_conges_payes = simulation.calculate('indemnites_compensatrices_conges_payes', period) indemnite_residence = simulation.calculate('indemnite_residence', period) primes_fonction_publique = simulation.calculate('primes_fonction_publique', period) primes_salaires = simulation.calculate('primes_salaires', period) reintegration_titre_restaurant_employeur = simulation.calculate( "reintegration_titre_restaurant_employeur", period ) remuneration_apprenti = simulation.calculate('remuneration_apprenti', period) salaire_de_base = simulation.calculate('salaire_de_base', period) type_sal = simulation.calculate('type_sal', period) smic_proratise = simulation.calculate('smic_proratise', period) assiette = ( salaire_de_base + primes_salaires + avantage_en_nature + hsup + indemnites_compensatrices_conges_payes + remuneration_apprenti + (type_sal == CAT['public_non_titulaire']) * (indemnite_residence + primes_fonction_publique) + reintegration_titre_restaurant_employeur ) return period, max_(assiette, smic_proratise * not_(apprenti)) * (assiette > 0) @reference_formula class reintegration_titre_restaurant_employeur(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Prise en charge de l'employeur des dépenses de cantine et des titres restaurants non exonérés de charges sociales" # noqa def function(self, simulation, period): period = period # TODO valeur_unitaire = simulation.calculate("titre_restaurant_valeur_unitaire", period) volume = simulation.calculate("titre_restaurant_volume", period) taux_employeur = simulation.calculate('titre_restaurant_taux_employeur', period) cantines_titres_restaurants = simulation.legislation_at( period.start).cotsoc.assiette.cantines_titres_restaurants taux_minimum_exoneration = cantines_titres_restaurants.taux_minimum_exoneration taux_maximum_exoneration = cantines_titres_restaurants.taux_maximum_exoneration seuil_prix_titre = cantines_titres_restaurants.seuil_prix_titre condition_exoneration_taux = ( (taux_minimum_exoneration <= taux_employeur) * (taux_maximum_exoneration >= taux_employeur) ) montant_reintegration = volume * ( condition_exoneration_taux * max_(valeur_unitaire * taux_employeur - seuil_prix_titre, 0) + not_(condition_exoneration_taux) * valeur_unitaire * taux_employeur ) return period, montant_reintegration # Cotisations proprement dites @reference_formula class accident_du_travail(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisations employeur accident du travail et maladie professionelle" def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') assiette_cotisations_sociales = simulation.calculate( 'assiette_cotisations_sociales', period) taux_accident_travail = simulation.calculate('taux_accident_travail', period) type_sal = simulation.calculate('type_sal', period) assujetti = type_sal <= 1 # TODO: ajouter contractuel du public salarié de moins d'un an ou à temps partiel return period, - assiette_cotisations_sociales * taux_accident_travail * assujetti @reference_formula class agff_salarie(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation retraite AGFF tranche A (salarié)" # AGFF: Association pour la gestion du fonds de financement (sous-entendu des départs entre 60 et 65 ans) def function(self, simulation, period): cotisation = apply_bareme( simulation, period, cotisation_type = "salarie", bareme_name = "agff", variable_name = self.__class__.__name__ ) return period, cotisation @reference_formula class agff_employeur(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation retraite AGFF tranche A (employeur)" # TODO: améliorer pour gérer mensuel/annuel def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') assiette_cotisations_sociales = simulation.calculate( 'assiette_cotisations_sociales', period) type_sal = simulation.calculate('type_sal', period) plafond_securite_sociale = simulation.calculate('plafond_securite_sociale', period) law = simulation.legislation_at(period.start) cotisation_non_cadre = apply_bareme_for_relevant_type_sal( bareme_by_type_sal_name = law.cotsoc.cotisations_employeur, bareme_name = "agffnc", base = assiette_cotisations_sociales, plafond_securite_sociale = plafond_securite_sociale, type_sal = type_sal, ) cotisation_cadre = apply_bareme_for_relevant_type_sal( bareme_by_type_sal_name = law.cotsoc.cotisations_employeur, bareme_name = "agffc", base = assiette_cotisations_sociales, plafond_securite_sociale = plafond_securite_sociale, type_sal = type_sal, ) return period, cotisation_cadre + cotisation_non_cadre @reference_formula class agirc_gmp_assiette(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Assiette de la cotisation AGIRC pour la garantie minimale de points (GMP, salarié)" # TODO: gestion annuel/mensuel def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') assiette_cotisations_sociales = simulation.calculate('assiette_cotisations_sociales', period) salaire_charniere = simulation.legislation_at(period.start).cotsoc.agirc_gmp.salaire_charniere # annuel assiette = max_( (salaire_charniere / 12 - assiette_cotisations_sociales) * (assiette_cotisations_sociales > 0), 0, ) return period, assiette @reference_formula class agirc_gmp_salarie(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation AGIRC pour la garantie minimale de points (GMP, salarié)" # TODO: gestion annuel/mensuel def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') agirc_gmp_assiette = simulation.calculate('agirc_gmp_assiette', period) agirc_salarie = simulation.calculate('agirc_salarie', period) assiette_cotisations_sociales = simulation.calculate('assiette_cotisations_sociales', period) type_sal = simulation.calculate('type_sal', period) law = simulation.legislation_at(period.start).cotsoc.agirc_gmp cotisation_forfaitaire = law.cotisation_salarie taux = simulation.legislation_at(period.start).cotsoc.cotisations_salarie['prive_cadre']['agirc'].rates[1] sous_plafond_securite_sociale = ( (assiette_cotisations_sociales <= plafond_securite_sociale) & (assiette_cotisations_sociales > 0) ) cotisation = - ( sous_plafond_securite_sociale * cotisation_forfaitaire + not_(sous_plafond_securite_sociale) * agirc_gmp_assiette * taux ) return period, min_((cotisation - agirc_salarie) * (type_sal == 1), 0) # cotisation are negative @reference_formula class agirc_gmp_employeur(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation AGIRC pour la garantie minimale de points (GMP, employeur)" # TODO: gestion annuel/mensuel def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') agirc_employeur = simulation.calculate('agirc_employeur', period) agirc_gmp_assiette = simulation.calculate('agirc_gmp_assiette', period) assiette_cotisations_sociales = simulation.calculate('assiette_cotisations_sociales', period) type_sal = simulation.calculate('type_sal', period) law = simulation.legislation_at(period.start).cotsoc.agirc_gmp cotisation_forfaitaire = law.cotisation_employeur taux = simulation.legislation_at(period.start).cotsoc.cotisations_employeur['prive_cadre']['agirc'].rates[1] sous_plafond_securite_sociale = ( (assiette_cotisations_sociales <= plafond_securite_sociale) & (assiette_cotisations_sociales > 0) ) cotisation = - ( sous_plafond_securite_sociale * cotisation_forfaitaire + not_(sous_plafond_securite_sociale) * agirc_gmp_assiette * taux ) return period, min_((cotisation - agirc_employeur) * (type_sal == 1), 0) # cotisation are negative @reference_formula class agirc_salarie(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation AGIRC tranche B (salarié)" def function(self, simulation, period): cotisation = apply_bareme( simulation, period, cotisation_type = "salarie", bareme_name = "agirc", variable_name = self.__class__.__name__ ) type_sal = simulation.calculate('type_sal', period) return period, cotisation * (type_sal == 1) @reference_formula class agirc_employeur(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation AGIRC tranche B (employeur)" def function(self, simulation, period): cotisation = apply_bareme( simulation, period, cotisation_type = "employeur", bareme_name = "agirc", variable_name = self.__class__.__name__ ) type_sal = simulation.calculate('type_sal', period) return period, cotisation * (type_sal == 1) @reference_formula class ags(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Contribution à l'association pour la gestion du régime de garantie des créances des salariés (AGS, employeur)" # noqa analysis:ignore def function(self, simulation, period): cotisation = apply_bareme( simulation, period, cotisation_type = "employeur", bareme_name = "chomfg", variable_name = self.__class__.__name__, ) return period, cotisation @reference_formula class apec_salarie(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisations agence pour l'emploi des cadres (APEC, salarié)" def function(self, simulation, period): cotisation = apply_bareme( simulation, period, cotisation_type = "salarie", bareme_name = "apec", variable_name = self.__class__.__name__, ) return period, cotisation # TODO: check public notamment contractuel @reference_formula class apec_employeur(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisations Agenece pour l'emploi des cadres (APEC, employeur)" def function(self, simulation, period): cotisation = apply_bareme( simulation, period, cotisation_type = "employeur", bareme_name = "apec", variable_name = self.__class__.__name__, ) return period, cotisation # TODO: check public notamment contractuel @reference_formula class arrco_salarie(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation ARRCO tranche 1 (salarié)" # TODO: check gestion mensuel/annuel def function(self, simulation, period): cotisation_minimale = apply_bareme( simulation, period, cotisation_type = "salarie", bareme_name = "arrco", variable_name = self.__class__.__name__, ) arrco_tranche_a_taux_salarie = simulation.calculate('arrco_tranche_a_taux_salarie', period) assiette_cotisations_sociales = simulation.calculate_add('assiette_cotisations_sociales', period) plafond_securite_sociale = simulation.calculate_add('plafond_securite_sociale', period) type_sal = simulation.calculate('type_sal', period) cotisation_entreprise = - ( min_(max_(assiette_cotisations_sociales, 0), plafond_securite_sociale) * arrco_tranche_a_taux_salarie ) return period, ( cotisation_minimale * (arrco_tranche_a_taux_salarie == 0) + cotisation_entreprise ) * (type_sal <= 1) @reference_formula class arrco_employeur(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation ARRCO tranche 1 (employeur)" # TODO: check gestion mensuel/annuel def function(self, simulation, period): cotisation_minimale = apply_bareme( simulation, period, cotisation_type = "employeur", bareme_name = "arrco", variable_name = self.__class__.__name__, ) arrco_tranche_a_taux_employeur = simulation.calculate('arrco_tranche_a_taux_employeur', period) assiette_cotisations_sociales = simulation.calculate_add('assiette_cotisations_sociales', period) plafond_securite_sociale = simulation.calculate_add('plafond_securite_sociale', period) type_sal = simulation.calculate('type_sal', period) cotisation_entreprise = - ( min_(max_(assiette_cotisations_sociales, 0), plafond_securite_sociale) * arrco_tranche_a_taux_employeur ) return period, ( cotisation_minimale * (arrco_tranche_a_taux_employeur == 0) + cotisation_entreprise ) * (type_sal <= 1) @reference_formula class chomage_salarie(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation chômage tranche A (salarié)" def function(self, simulation, period): cotisation = apply_bareme( simulation, period, cotisation_type = "salarie", bareme_name = "assedic", variable_name = self.__class__.__name__, ) return period, cotisation @reference_formula class chomage_employeur(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation chômage tranche A (employeur)" def function(self, simulation, period): cotisation = apply_bareme( simulation, period, cotisation_type = "employeur", bareme_name = "assedic", variable_name = self.__class__.__name__, ) return period, cotisation @reference_formula class contribution_solidarite_autonomie(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Contribution solidarité autonomie (employeur)" def function(self, simulation, period): cotisation = apply_bareme( simulation, period, cotisation_type = "employeur", bareme_name = "csa", variable_name = self.__class__.__name__, ) return period, cotisation @reference_formula class cotisation_exceptionnelle_temporaire_salarie(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation_exceptionnelle_temporaire (employe)" def function(self, simulation, period): cotisation = apply_bareme( simulation, period, cotisation_type = 'salarie', bareme_name = 'cet', variable_name = self.__class__.__name__, ) return period, cotisation @reference_formula class cotisation_exceptionnelle_temporaire_employeur(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation exceptionnelle temporaire (employeur)" def function(self, simulation, period): cotisation = apply_bareme( simulation, period, cotisation_type = 'employeur', bareme_name = 'cet', variable_name = self.__class__.__name__, ) return period, cotisation @reference_formula class famille(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation famille (employeur)" def function(self, simulation, period): cotisation = apply_bareme( simulation, period, cotisation_type = 'employeur', bareme_name = 'famille', variable_name = self.__class__.__name__, ) return period, cotisation @reference_formula class mmid_salarie(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation maladie (salarié)" def function(self, simulation, period): cotisation = apply_bareme( simulation, period, cotisation_type = 'salarie', bareme_name = 'maladie', variable_name = self.__class__.__name__, ) return period, cotisation @reference_formula class mmid_employeur(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation maladie (employeur)" def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') cotisation = apply_bareme( simulation, period, cotisation_type = 'employeur', bareme_name = 'maladie', variable_name = self.__class__.__name__, ) return period, cotisation # TODO: this formula is used only to check fiche_de_paie from memento @reference_formula class mmida_employeur(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation maladie (employeur)" def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') cotisation = apply_bareme( simulation, period, cotisation_type = 'employeur', bareme_name = 'maladie', variable_name = self.__class__.__name__, ) contribution_solidarite_autonomie = simulation.calculate('contribution_solidarite_autonomie', period) return period, cotisation + contribution_solidarite_autonomie @reference_formula class mhsup(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol entity_class = Individus label = u"Heures supplémentaires comptées négativement" def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') hsup = simulation.calculate('hsup', period) return period, -hsup @reference_formula class plafond_securite_sociale(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Plafond de la securite sociale" # TODO gérer les plafonds mensuel, trimestriel, annuel def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') heures_non_remunerees_volume = simulation.calculate('heures_non_remunerees_volume') nombre_jours_calendaires = simulation.calculate('nombre_jours_calendaires', period) _P = simulation.legislation_at(period.start) plafond_temps_plein = _P.cotsoc.gen.plafond_securite_sociale jours_travailles = nombre_jours_calendaires - heures_non_remunerees_volume / 7 plafond_securite_sociale = min_(jours_travailles, 30) / 30 * plafond_temps_plein return period, plafond_securite_sociale @reference_formula class prevoyance_obligatoire_cadre(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation de prévoyance pour les cadres et assimilés" # TODO: gérer le mode de recouvrement et l'aspect mensuel/annuel def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') type_sal = simulation.calculate('type_sal', period) assiette_cotisations_sociales = simulation.calculate('assiette_cotisations_sociales', period) plafond_securite_sociale = simulation.calculate('plafond_securite_sociale', period) prevoyance_obligatoire_cadre_taux_employeur = simulation.calculate( 'prevoyance_obligatoire_cadre_taux_employeur', period) cotisation = - ( (type_sal == CAT['prive_cadre']) * min_(assiette_cotisations_sociales, plafond_securite_sociale) * prevoyance_obligatoire_cadre_taux_employeur ) return period, cotisation @reference_formula class taille_entreprise(SimpleFormulaColumn): column = EnumCol( enum = Enum( [ u"Non pertinent", u"Moins de 10 salariés", u"De 10 à 19 salariés", u"De 20 à 249 salariés", u"Plus de 250 salariés", ], ), default = 0, ) entity_class = Individus label = u"Catégode taille d'entreprise (pour calcul des cotisations sociales)" url = u"http://www.insee.fr/fr/themes/document.asp?ref_id=ip1321" def function(self, simulation, period): period = period effectif_entreprise = simulation.calculate('effectif_entreprise', period) taille_entreprise = ( (effectif_entreprise > 0).astype(int16) + (effectif_entreprise > 10).astype(int16) + (effectif_entreprise > 20).astype(int16) + (effectif_entreprise > 250).astype(int16) ) return period, taille_entreprise @reference_formula class taux_accident_travail(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Approximation du taux accident à partir de l'exposition au risque donnée" start_date = date(2012, 1, 1) def function(self, simulation, period): period_extract = period.start.period(u'month').offset('first-of') exposition_accident = simulation.calculate('exposition_accident', period_extract) accident = simulation.legislation_at(period_extract.start).cotsoc.accident return period, (exposition_accident == 0) * accident.faible + (exposition_accident == 1) * accident.moyen \ + (exposition_accident == 2) * accident.eleve + (exposition_accident == 3) * accident.treseleve @reference_formula class vieillesse_deplafonnee_salarie(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation vieillesse déplafonnée (salarié)" def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') cotisation = apply_bareme( simulation, period, cotisation_type = 'salarie', bareme_name = 'vieillesse_deplafonnee', variable_name = self.__class__.__name__, ) return period, cotisation @reference_formula class vieillesse_plafonnee_salarie(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation vieillesse plafonnée (salarié)" def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') cotisation = apply_bareme( simulation, period, cotisation_type = 'salarie', bareme_name = 'vieillesse', variable_name = self.__class__.__name__, ) return period, cotisation @reference_formula class vieillesse_deplafonnee_employeur(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation vieillesse déplafonnée" def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') cotisation = apply_bareme( simulation, period, cotisation_type = 'employeur', bareme_name = 'vieillesse_deplafonnee', variable_name = self.__class__.__name__, ) return period, cotisation @reference_formula class vieillesse_plafonnee_employeur(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation vieillesse plafonnée (employeur)" def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') cotisation = apply_bareme( simulation, period, cotisation_type = 'employeur', bareme_name = 'vieillesse_plafonnee', variable_name = self.__class__.__name__, ) return period, cotisation PK'G ?:?:wopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/travail_fonction_publique.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import math from numpy import minimum as min_ from ....base import * # noqa analysis:ignore from .base import apply_bareme_for_relevant_type_sal @reference_formula class allocations_temporaires_invalidite(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Allocations temporaires d'invalidité (ATI, fonction publique et collectivités locales)" # patronale, non-contributive def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') assiette_cotisations_sociales_public = simulation.calculate('assiette_cotisations_sociales_public', period) plafond_securite_sociale = simulation.calculate('plafond_securite_sociale', period) type_sal = simulation.calculate('type_sal', period) _P = simulation.legislation_at(period.start) base = assiette_cotisations_sociales_public cotisation_etat = apply_bareme_for_relevant_type_sal( bareme_by_type_sal_name = _P.cotsoc.cotisations_employeur, bareme_name = "ati", base = base, plafond_securite_sociale = plafond_securite_sociale, type_sal = type_sal, ) cotisation_collectivites_locales = apply_bareme_for_relevant_type_sal( bareme_by_type_sal_name = _P.cotsoc.cotisations_employeur, bareme_name = "atiacl", base = base, plafond_securite_sociale = plafond_securite_sociale, type_sal = type_sal, ) return period, cotisation_etat + cotisation_collectivites_locales @reference_formula class assiette_cotisations_sociales_public(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Assiette des cotisations sociales des agents titulaires de la fonction publique" # TODO: gestion des heures supplémentaires def function(self, simulation, period): remuneration_principale = simulation.calculate('remuneration_principale', period) # primes_fonction_publique = simulation.calculate('primes_fonction_publique', period) # indemnite_residence = simulation.calculate('indemnite_residence', period) type_sal = simulation.calculate('type_sal', period) public = (type_sal >= 2) # titulaire = (type_sal >= 2) * (type_sal <= 5) assiette = public * ( remuneration_principale # + not_(titulaire) * (indemnite_residence + primes_fonction_publique) ) return period, assiette # sft dans assiette csg et RAFP et Cotisation exceptionnelle de solidarité et taxe sur les salaires # primes dont indemnites de residences idem sft # avantages en nature contrib exceptionnelle de solidarite, RAFP, CSG, CRDS. @reference_formula class contribution_exceptionnelle_solidarite(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation exceptionnelle au fonds de solidarité (salarié)" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') traitement_indiciaire_brut = simulation.calculate('traitement_indiciaire_brut', period) hsup = simulation.calculate('hsup', period) type_sal = simulation.calculate('type_sal', period) indemnite_residence = simulation.calculate('indemnite_residence', period) primes_fonction_publique = simulation.calculate('primes_fonction_publique', period) rafp_salarie = simulation.calculate('rafp_salarie', period) pension_civile_salarie = simulation.calculate('pension_civile_salarie', period) cotisations_salariales_contributives = simulation.calculate('cotisations_salariales_contributives', period) plafond_securite_sociale = simulation.calculate('plafond_securite_sociale', period) salaire_de_base = simulation.calculate('salaire_de_base', period) _P = simulation.legislation_at(period.start) seuil_assuj_fds = seuil_fds(_P) assujettis = ( (type_sal == CAT['public_titulaire_etat']) + (type_sal == CAT['public_titulaire_territoriale']) + (type_sal == CAT['public_titulaire_hospitaliere']) + (type_sal == CAT['public_non_titulaire']) ) * ( (traitement_indiciaire_brut + salaire_de_base - hsup) > seuil_assuj_fds ) # TODO: check assiette voir IPP cotisation = apply_bareme_for_relevant_type_sal( bareme_by_type_sal_name = _P.cotsoc.cotisations_salarie, bareme_name = "excep_solidarite", base = assujettis * min_( ( traitement_indiciaire_brut + salaire_de_base - hsup + indemnite_residence + rafp_salarie + pension_civile_salarie + primes_fonction_publique + (type_sal == CAT['public_non_titulaire']) * cotisations_salariales_contributives ), _P.cotsoc.sal.fonc.commun.plafond_base_solidarite, ), plafond_securite_sociale = plafond_securite_sociale, type_sal = type_sal, ) return period, cotisation @reference_formula class fonds_emploi_hospitalier(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Fonds pour l'emploi hospitalier (employeur)" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') assiette_cotisations_sociales_public = simulation.calculate('assiette_cotisations_sociales_public', period) plafond_securite_sociale = simulation.calculate('plafond_securite_sociale', period) type_sal = simulation.calculate('type_sal', period) _P = simulation.legislation_at(period.start) cotisation = apply_bareme_for_relevant_type_sal( bareme_by_type_sal_name = _P.cotsoc.cotisations_employeur, bareme_name = "feh", base = assiette_cotisations_sociales_public, # TODO: check base plafond_securite_sociale = plafond_securite_sociale, type_sal = type_sal, ) return period, cotisation @reference_formula class ircantec_salarie(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Ircantec salarié" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') assiette_cotisations_sociales = simulation.calculate('assiette_cotisations_sociales', period) plafond_securite_sociale = simulation.calculate('plafond_securite_sociale', period) type_sal = simulation.calculate('type_sal', period) _P = simulation.legislation_at(period.start) ircantec = apply_bareme_for_relevant_type_sal( bareme_by_type_sal_name = _P.cotsoc.cotisations_salarie, bareme_name = "ircantec", base = assiette_cotisations_sociales, plafond_securite_sociale = plafond_securite_sociale, type_sal = type_sal, ) return period, ircantec @reference_formula class ircantec_employeur(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Ircantec employeur" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') assiette_cotisations_sociales = simulation.calculate('assiette_cotisations_sociales', period) plafond_securite_sociale = simulation.calculate('plafond_securite_sociale', period) type_sal = simulation.calculate('type_sal', period) _P = simulation.legislation_at(period.start) ircantec = apply_bareme_for_relevant_type_sal( bareme_by_type_sal_name = _P.cotsoc.cotisations_employeur, bareme_name = "ircantec", base = assiette_cotisations_sociales, plafond_securite_sociale = plafond_securite_sociale, type_sal = type_sal, ) return period, ircantec @reference_formula class pension_civile_salarie(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Pension civile salarié" url = u"http://www.ac-besancon.fr/spip.php?article2662", def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') traitement_indiciaire_brut = simulation.calculate('traitement_indiciaire_brut', period) # TODO: check nbi type_sal = simulation.calculate('type_sal', period) _P = simulation.legislation_at(period.start) sal = _P.cotsoc.cotisations_salarie terr_or_hosp = ( type_sal == CAT['public_titulaire_territoriale']) | (type_sal == CAT['public_titulaire_hospitaliere']) pension_civile_salarie = ( (type_sal == CAT['public_titulaire_etat']) * sal['public_titulaire_etat']['pension'].calc(traitement_indiciaire_brut) + terr_or_hosp * sal['public_titulaire_territoriale']['cnracl1'].calc(traitement_indiciaire_brut) ) return period, -pension_civile_salarie @reference_formula class pension_civile_employeur(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Cotisation patronale pension civile" url = u"http://www.ac-besancon.fr/spip.php?article2662" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') assiette_cotisations_sociales_public = simulation.calculate('assiette_cotisations_sociales_public', period) # plafond_securite_sociale = simulation.calculate('plafond_securite_sociale', period) type_sal = simulation.calculate('type_sal', period) _P = simulation.legislation_at(period.start) pat = _P.cotsoc.cotisations_employeur terr_or_hosp = ( (type_sal == CAT['public_titulaire_territoriale']) | (type_sal == CAT['public_titulaire_hospitaliere']) ) cot_pat_pension_civile = ( (type_sal == CAT['public_titulaire_etat']) * pat['public_titulaire_etat']['pension'].calc( assiette_cotisations_sociales_public) + terr_or_hosp * pat['public_titulaire_territoriale']['cnracl'].calc(assiette_cotisations_sociales_public) ) return period, -cot_pat_pension_civile @reference_formula class rafp_salarie(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Part salariale de la retraite additionelle de la fonction publique" # Part salariale de la retraite additionelle de la fonction publique # TODO: ajouter la gipa qui n'est pas affectée par le plafond d'assiette def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') traitement_indiciaire_brut = simulation.calculate('traitement_indiciaire_brut', period) type_sal = simulation.calculate('type_sal', period) primes_fonction_publique = simulation.calculate('primes_fonction_publique', period) supp_familial_traitement = simulation.calculate('supp_familial_traitement', period) indemnite_residence = simulation.calculate('indemnite_residence', period) _P = simulation.legislation_at(period.start) eligible = ((type_sal == CAT['public_titulaire_etat']) + (type_sal == CAT['public_titulaire_territoriale']) + (type_sal == CAT['public_titulaire_hospitaliere'])) plaf_ass = _P.cotsoc.sal.fonc.etat.rafp_plaf_assiette base_imposable = primes_fonction_publique + supp_familial_traitement + indemnite_residence assiette = min_(base_imposable, plaf_ass * traitement_indiciaire_brut * eligible) # Même régime pour les fonctions publiques d'Etat et des collectivité locales rafp_salarie = eligible * _P.cotsoc.cotisations_salarie.public_titulaire_etat['rafp'].calc(assiette) return period, -rafp_salarie @reference_formula class rafp_employeur(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Part patronale de la retraite additionnelle de la fonction publique" # TODO: ajouter la gipa qui n'est pas affectée par le plafond d'assiette def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') traitement_indiciaire_brut = simulation.calculate('traitement_indiciaire_brut', period) type_sal = simulation.calculate('type_sal', period) primes_fonction_publique = simulation.calculate('primes_fonction_publique', period) supp_familial_traitement = simulation.calculate('supp_familial_traitement', period) indemnite_residence = simulation.calculate('indemnite_residence', period) _P = simulation.legislation_at(period.start) eligible = ( (type_sal == CAT['public_titulaire_etat']) + (type_sal == CAT['public_titulaire_territoriale']) + (type_sal == CAT['public_titulaire_hospitaliere']) ) plaf_ass = _P.cotsoc.sal.fonc.etat.rafp_plaf_assiette base_imposable = primes_fonction_publique + supp_familial_traitement + indemnite_residence assiette = min_(base_imposable, plaf_ass * traitement_indiciaire_brut * eligible) bareme_rafp = _P.cotsoc.cotisations_employeur.public_titulaire_etat['rafp'] rafp_employeur = eligible * bareme_rafp.calc(assiette) return period, - rafp_employeur def seuil_fds(law): ''' Calcul du seuil mensuel d'assujetissement à la contribution au fond de solidarité ''' ind_maj_ref = law.cotsoc.sal.fonc.commun.ind_maj_ref pt_ind_mensuel = law.cotsoc.sal.fonc.commun.pt_ind / 12 seuil_mensuel = math.floor((pt_ind_mensuel * ind_maj_ref)) return seuil_mensuel PKF':++bopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/base.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from numpy import zeros from ....base import CAT def apply_bareme_for_relevant_type_sal( bareme_by_type_sal_name = None, bareme_name = None, type_sal = None, base = None, plafond_securite_sociale = None, round_base_decimals = 2, ): assert bareme_by_type_sal_name is not None assert bareme_name is not None assert base is not None assert plafond_securite_sociale is not None assert type_sal is not None cotisation = zeros(len(base)) for type_sal_name, type_sal_index in CAT: if type_sal_name not in bareme_by_type_sal_name: # to deal with public_titulaire_militaire continue bareme = bareme_by_type_sal_name[type_sal_name].get(bareme_name) # TODO; should have better warnings if bareme is not None: cotisation += bareme.calc( base * (type_sal == type_sal_index), factor = plafond_securite_sociale, round_base_decimals = round_base_decimals, ) return - cotisation def apply_bareme(simulation, period, cotisation_type = None, bareme_name = None, variable_name = None): # period = period.start.offset('first-of', 'month').period('month') cotisation_mode_recouvrement = simulation.calculate('cotisation_sociale_mode_recouvrement', period) cotisation = ( # en fin d'année cotisation_mode_recouvrement == 1) * ( compute_cotisation_annuelle( simulation, period, cotisation_type = cotisation_type, bareme_name = bareme_name, ) ) + ( # anticipé cotisation_mode_recouvrement == 0) * ( compute_cotisation_anticipee( simulation, period, cotisation_type = cotisation_type, bareme_name = bareme_name, variable_name = variable_name, ) ) return cotisation def compute_cotisation(simulation, period, cotisation_type = None, bareme_name = None): assert cotisation_type is not None law = simulation.legislation_at(period.start) if cotisation_type == "employeur": bareme_by_type_sal_name = law.cotsoc.cotisations_employeur elif cotisation_type == "salarie": bareme_by_type_sal_name = law.cotsoc.cotisations_salarie assert bareme_name is not None assiette_cotisations_sociales = simulation.calculate_add('assiette_cotisations_sociales', period) plafond_securite_sociale = simulation.calculate_add('plafond_securite_sociale', period) type_sal = simulation.calculate('type_sal', period) cotisation = apply_bareme_for_relevant_type_sal( bareme_by_type_sal_name = bareme_by_type_sal_name, bareme_name = bareme_name, base = assiette_cotisations_sociales, plafond_securite_sociale = plafond_securite_sociale, type_sal = type_sal, ) return cotisation def compute_cotisation_annuelle(simulation, period, cotisation_type = None, bareme_name = None): if period.start.month < 12: return 0 if period.start.month == 12: return compute_cotisation( simulation, period.start.offset('first-of', 'year').period('year'), cotisation_type = cotisation_type, bareme_name = bareme_name, ) def compute_cotisation_anticipee(simulation, period, cotisation_type = None, bareme_name = None, variable_name = None): if period.start.month < 12: return compute_cotisation( simulation, period.start.offset('first-of', 'month').period('month'), cotisation_type = cotisation_type, bareme_name = bareme_name, ) if period.start.month == 12: assert variable_name is not None cumul = simulation.calculate_add(variable_name, period.start.offset('first-of', 'month').offset( -11, 'month').period('month', 11)) return compute_cotisation( simulation, period.start.offset('first-of', 'year').period('year'), cotisation_type = cotisation_type, bareme_name = bareme_name, ) - cumul PK'G`QWWzopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/contrat_professionnalisation.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import datetime64, timedelta64 from ....base import * # noqa analysis:ignore @reference_formula class professionnalisation(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"L'individu est en contrat de professionnalisation" url = "http://www.apce.com/pid879/contrat-de-professionnalisation.html?espace=1&tp=1" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age = simulation.calculate('age', period) ass = simulation.calculate_add('ass', period) rsa = simulation.calculate('rsa', period) aah = simulation.calculate('aah', period) age_condition = (16 <= age) * (age < 25) dummy_ass = ass > 0 dummy_rmi = rsa > 0 dummy_aah = aah > 0 return period, (age_condition + dummy_ass + dummy_aah + dummy_rmi) > 0 @reference_formula class remuneration_professionnalisation(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Rémunération de l'apprenti" url = "http://www.apce.com/pid927/contrat-d-apprentissage.html?espace=1&tp=1&pagination=2" # La rémunération minimale varie en fonction de l'âge et du niveau de qualification des bénéficiaires des contrats # de professionnalisation : # # Pour les personnes de moins de 21 ans : # au minimum 55 % du Smic, # au minimum 65 % du Smic si le jeune est titulaire d'une qualification au moins égale au baccalauréat # professionnel ou d'un titre ou d'un diplôme à finalité professionnelle de même niveau. # # Pour les personnes ayant entre 21 et 25 ans : # au minimum 70 % du Smic, # au minimum 80 % du Smic si le bénéficiaire est titulaire d'une qualification au moins égale à celle d'un # baccalauréat professionnel ou d'un titre/diplôme à finalité professionnelle de même niveau. # # Pour les personnes âgées de plus de 26 ans : # au minimum le Smic, # au minimum 85 % du salaire minimum prévu par la convention ou l'accord de branche auquel est soumise # l'entreprise. def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age = simulation.calculate('age', period) smic = simulation.legislation_at(period.start).cotsoc.gen.smic_h_b * 52 * 35 / 12 professionnalisation = simulation.calculate('professionnalisation', period) qualifie = simulation.calculate('qualifie') salaire_en_smic = [ dict( part_de_smic_by_qualification = { 'non_qualifie': .55, 'qualifie': .65 }, age_min = 16, age_max = 21, ), dict( part_de_smic_by_qualification = { 1: .70, }, age_min = 21, age_max = 25, ), dict( part_de_smic_by_qualification = { 1: 1.0, }, age_min = 26, age_max = 99 ) ] taux_smic = age * 0.0 for age_interval in salaire_en_smic: age_condition = (age_interval['age_min'] <= age) * (age <= age_interval['age_max']) taux_smic[age_condition] = sum([ (qualifie[age_condition] == qualification) * part_de_smic for qualification, part_de_smic in age_interval['part_de_smic_by_qualification'].iteritems() ]) return period, taux_smic * smic * professionnalisation @reference_formula class exoneration_cotisations_employeur_apprenti(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Exonération de cotisations patronales pour l'emploi d'un apprenti" url = "http://www.apce.com/pid927/contrat-d-apprentissage.html?espace=1&tp=1&pagination=2" # Exonération de cotisations sociales patronales d'assurance maladie-maternité, de vieillesse de base, # d'invalidité-décès et d'allocations familiales au titre des rémunérations versées aux demandeurs d'emploi de # plus de 45 ans # # Les salariés en contrat de professionnalisation ne sont pas comptabilisés dans l'effectif de l'entreprise pendant # la durée du contrat s'il est à durée déterminée ou pendant l'action de professionnalisation si le contrat est à # durée indéterminée. # Remboursement de certaines dépenses par les organismes collecteurs paritaires agréés (OPCA) # Aide forfaitaire versée par Pôle emploi pour l'embauche d'un demandeur d'emploi de 26 ans et plus # En cas d'embauche d'un demandeur d'emploi de 26 ans et plus, l'employeur peut bénéficier d'une aide forfaitaire # (AFE) d'un montant maximum de 2 000 euros par bénéficiaire. Pour les salariés à temps partiel, le montant de # l'aide est proratisé en fonction du temps de travail effectif. # Aide spécifique de 686 euros par accompagnement et pour une année pleine est attribuée sous certaines conditions # aux groupements d'employeurs qui organisent dans le cadre des contrats de professionnalisation def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age = simulation.calculate('age', period) mmid_employeur = simulation.calculate('mmid_employeur', period) famille = simulation.calculate('famille', period) vieillesse_plafonnee_employeur = simulation.calculate('vieillesse_plafonnee_employeur', period) # correspond à # vieillesse de base? cotisations_exonerees = mmid_employeur + famille + vieillesse_plafonnee_employeur return period, cotisations_exonerees * (age > 45) # On est bien d'accord qu'il y a les exos uniquement pour les # plus de 45 ans? # O est d'accord aucun avantage pour l'employé ?? # @reference_formula # class exoneration_cotisations_salariales_apprenti(SimpleFormulaColumn): # column = FloatCol # entity_class = Individus # label = u"Exonération de cotisations salariales pour l'emploi d'un apprenti" # url = "http://www.apce.com/pid927/contrat-d-apprentissage.html?espace=1&tp=1&pagination=2" # # def function(self, simulation, period): # cotisations_salariales = simulation.calculate('cotisations_salariales', period) # return period, - cotisations_salariales PK'GWkopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/preprocessing.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import collections import copy import logging from ....base import * # noqa DEBUG_SAL_TYPE = 'public_titulaire_etat' log = logging.getLogger(__name__) # TODO: contribution patronale de prévoyance complémentaire def build_pat(node_json): """Construit le dictionnaire de barèmes des cotisations employeur à partir de node_json['children']['cotsoc'][ 'children']['pat']""" pat = copy.deepcopy(node_json['children']['cotsoc']['children']['pat']) commun = pat['children'].pop('commun') for bareme in ['apprentissage', 'apprentissage_add']: commun['children'][bareme] = commun['children']['apprentissage_node']['children'][bareme] del commun['children']['apprentissage_node'] commun['children']['formprof_09'] = commun['children']['formprof_node']['children']['formprof_09'] commun['children']['formprof_1019'] = commun['children']['formprof_node']['children']['formprof_1019'] commun['children']['formprof_20'] = commun['children']['formprof_node']['children']['formprof_20'] del commun['children']['formprof_node'] commun['children']['construction'] = commun['children']['construction_node']['children']['construction_20'] del commun['children']['construction_node'] pat['children']['noncadre']['children'].update(commun['children']) pat['children']['cadre']['children'].update(commun['children']) pat['children']['fonc']['children']['contract']['children'].update(commun['children']) # Renaming pat['children']['prive_non_cadre'] = pat['children'].pop('noncadre') pat['children']['prive_cadre'] = pat['children'].pop('cadre') # Rework commun to deal with public employees for var in ["apprentissage", "apprentissage_add", "assedic", "chomfg", "construction", "maladie", "formprof_09", "formprof_1019", "formprof_20", "vieillesse_deplafonnee", "vieillesse_plafonnee"]: del commun['children'][var] for var in ["apprentissage", "apprentissage_add", "formprof_09", "formprof_1019", "formprof_20", "chomfg", "construction", "assedic"]: del pat['children']['fonc']['children']['contract']['children'][var] pat['children']['fonc']['children']['etat']['children'].update(commun['children']) pat['children']['fonc']['children']['colloc']['children'].update(commun['children']) pat['children']['etat_t'] = pat['children']['fonc']['children']['etat'] pat['children']['colloc_t'] = pat['children']['fonc']['children']['colloc'] pat['children']['contract'] = pat['children']['fonc']['children']['contract'] for var in ['etat', 'colloc', 'contract']: del pat['children']['fonc']['children'][var] # Renaming pat['children']['public_titulaire_etat'] = pat['children'].pop('etat_t') # del pat['children']['public_titulaire_etat']['children']['rafp'] pat['children']['public_titulaire_territoriale'] = pat['children'].pop('colloc_t') pat['children']['public_titulaire_hospitaliere'] = copy.deepcopy(pat['children']['public_titulaire_territoriale']) for category in ['territoriale', 'hospitaliere']: for name, bareme in pat['children']['public_titulaire_' + category]['children'][category]['children'].iteritems( ): pat['children']['public_titulaire_{}'.format(category)]['children'][name] = bareme for category in ['territoriale', 'hospitaliere']: del pat['children']['public_titulaire_territoriale']['children'][category] del pat['children']['public_titulaire_hospitaliere']['children'][category] pat['children']['public_non_titulaire'] = pat['children'].pop('contract') return pat def build_sal(node_json): ''' à partir des informations contenues dans node_json['children']['cotsoc']['children']['sal'] Construit le dictionnaire de barèmes des cotisations salariales ''' sal = copy.deepcopy(node_json['children']['cotsoc']['children']['sal']) sal['children']['noncadre']['children'].update(sal['children']['commun']['children']) sal['children']['cadre']['children'].update(sal['children']['commun']['children']) # Renaming sal['children']['prive_non_cadre'] = sal['children'].pop('noncadre') sal['children']['prive_cadre'] = sal['children'].pop('cadre') sal['children']['public_titulaire_etat'] = sal['children']['fonc']['children']['etat'] sal['children']['public_titulaire_territoriale'] = sal['children']['fonc']['children']['colloc'] sal['children']['public_titulaire_hospitaliere'] = sal['children']['fonc']['children']['colloc'] sal['children']['public_non_titulaire'] = sal['children']['fonc']['children']['contract'] for type_sal_category in ( 'public_titulaire_etat', 'public_titulaire_territoriale', 'public_titulaire_hospitaliere', 'public_non_titulaire', ): sal['children'][type_sal_category]['children']['excep_solidarite'] = sal['children']['fonc']['children'][ 'commun']['children']['solidarite'] sal['children']['public_non_titulaire']['children'].update(sal['children']['commun']['children']) del sal['children']['public_non_titulaire']['children']['arrco'] del sal['children']['public_non_titulaire']['children']['assedic'] # Cleaning del sal['children']['commun'] del sal['children']['fonc']['children']['etat'] del sal['children']['fonc']['children']['colloc'] del sal['children']['fonc']['children']['contract'] return sal def preprocess_legislation(legislation_json): ''' Preprocess the legislation parameters to build the cotisations sociales taxscales (barèmes) ''' sal = build_sal(legislation_json) pat = build_pat(legislation_json) cotsoc = legislation_json["children"]["cotsoc"] cotsoc["children"]["cotisations_employeur"] = collections.OrderedDict(( (u'@type', u'Node'), (u'children', collections.OrderedDict()), )) cotsoc["children"]["cotisations_salarie"] = collections.OrderedDict(( (u'@type', u'Node'), (u'children', collections.OrderedDict()), )) for cotisation_name, baremes in ( ('cotisations_employeur', pat['children']), ('cotisations_salarie', sal['children']), ): for category, bareme in baremes.iteritems(): if category in CAT._nums: cotsoc['children'][cotisation_name]['children'][category] = bareme PK'Geejopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/exonerations.py# -*- coding: utf-8 -*- # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import datetime64, maximum as max_, minimum as min_, round as round_, timedelta64 from ....base import * # noqa analysis:ignore from .base import apply_bareme_for_relevant_type_sal reference_input_variable( column = DateCol(default = date(2099, 12, 31)), entity_class = Individus, label = u"Date de demande (et d'octroi) du statut de jeune entreprise innovante (JEI)", name = 'jei_date_demande', ) @reference_formula class exoneration_cotisations_employeur_geographiques(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Exonérations de cotisations employeur dépendant d'une zone géographique" url = "https://www.apce.com/pid815/aides-au-recrutement.html?espace=1&tp=1" def function(self, simulation, period): exoneration_cotisations_employeur_zfu = simulation.calculate_add('exoneration_cotisations_employeur_zfu', period) exoneration_cotisations_employeur_zrd = simulation.calculate_add('exoneration_cotisations_employeur_zrd', period) exoneration_cotisations_employeur_zrr = simulation.calculate_add('exoneration_cotisations_employeur_zrr', period) exonerations_geographiques = (exoneration_cotisations_employeur_zfu + exoneration_cotisations_employeur_zrd + exoneration_cotisations_employeur_zrr) return period, exonerations_geographiques @reference_formula class exoneration_cotisations_employeur_jei(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Exonrérations de cotisations employeur pour une jeune entreprise innovante" url = "http://www.apce.com/pid1653/jeune-entreprise-innovante.html?pid=1653&pagination=2" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') assiette_allegement = simulation.calculate('assiette_allegement', period) jei_date_demande = simulation.calculate('jei_date_demande', period) jeune_entreprise_innovante = simulation.calculate('jeune_entreprise_innovante', period) plafond_securite_sociale = simulation.calculate('plafond_securite_sociale', period) smic_proratise = simulation.calculate('smic_proratise', period) type_sal = simulation.calculate('type_sal', period) bareme_by_type_sal_name = simulation.legislation_at(period.start).cotsoc.cotisations_employeur bareme_names = ['vieillesse_deplafonnee', 'vieillesse_plafonnee', 'maladie', 'famille'] exoneration = smic_proratise * 0.0 for bareme_name in bareme_names: exoneration += apply_bareme_for_relevant_type_sal( bareme_by_type_sal_name = bareme_by_type_sal_name, bareme_name = bareme_name, type_sal = type_sal, base = min_(assiette_allegement, 4.5 * smic_proratise), plafond_securite_sociale = plafond_securite_sociale, round_base_decimals = 2, ) exoneration_relative_year_passed = exoneration_relative_year(period, jei_date_demande) rate_by_year_passed = { 0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, } # TODO: move to legislation parameters file for year_passed, rate in rate_by_year_passed.iteritems(): if (exoneration_relative_year_passed == year_passed).any(): exoneration[exoneration_relative_year_passed == year_passed] = rate * exoneration return period, - exoneration * jeune_entreprise_innovante @reference_formula class exoneration_cotisations_employeur_zfu(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Exonrérations de cotisations employeur pour l'embauche en zone franche urbaine (ZFU)" url = "http://www.apce.com/pid553/exoneration-dans-les-zfu.html?espace=1&tp=1&pagination=2" # TODO # Ce dispositif d'exonération sociale est fermé depuis le 1er janvier 2015 mais reste applicable aux entreprises qui # en bénéficiaient avant cette date. # - ne pas être détenues à plus de 25 % par des entreprises employant plus de 250 salariés et dont le chiffre d'affaires # ou dont le bilan excède 50 M€ ou 43 M€, # - disposer des éléments d'exploitation ou des stocks nécessaires à l'activité des salariés, # - être à jour de ses cotisations sociales ou avoir souscrit à un engagement d'apurement progressif de ses dettes. # # Secteurs d'activité concernés # # L'exonération est applicable, quel que soit le secteur d'activité. # Toutefois, les entreprises exerçant une activité principale dans les secteurs de la construction automobile, # construction navale, fabrication de fibres textiles artificielles ou synthétiques, sidérurgie ou des transports # routiers de marchandises, ne pourront pas bénéficier de cette exonération. # Embauche de résidents (clause d'embauche locale) # Pour les entreprises qui se créent ou s'implantent dans une ZFU à compter du 1er janvier 2012, le bénéfice de # l'exonération des cotisations sociales est subordonnée lors de toute nouvelle embauche à la condition que la moitié # de salariés embauchés ou employés résident en ZFU ou en zone urbaine sensible. # # Le respect de la condition d'embauche locale est apprécié à la date d'effet de la nouvelle embauche dès la deuxième # embauche. # # Précision : les salariés employés sont ceux déjà présents dans l'entreprise à la date de la nouvelle embauche, les # salariés embauchés sont ceux recrutés depuis la date de création ou d'implantation de l'entreprise en ZFU. # # Est considéré comme résident le salarié habitant soit dans la ZFU d'implantation, soit dans l'une des ZUS de l'unité # urbaine où se trouve la ZFU. Le maire peut, à la demande de l'employeur, fournir des éléments d'informations relatifs # à la qualité de résident dans la zone afin de déterminer si la proportion exigée est respectée. # # Si la proportion n'est pas respectée à la date d'effet de l'embauche, l'employeur dispose d'un délai de 3 mois pour # régulariser la situation. A défaut, le bénéfice de l'exonération est suspendu du 1er jour du mois suivant # l'expiration du délai de 3 mois, jusqu'au 1er jour du mois suivant la date où la condition est de nouveau remplie. # # Le salarié résident doit être titulaire d'un contrat à durée indéterminée ou d'un contrat à durée déterminée d'au # moins 12 mois, conclu pour une durée minimale de 16 heures par semaine. # 5 ans + # Dans les entreprises de 5 salariés et plus, les cotisations employeur bénéficient d'un abattement sur la base # imposable pendant 3 ans de : # - 60 % la première année, # - 40 % la seconde année, # - 20 % la troisième année. # # Dans les entreprises de moins de 5 salariés, un abattement est appliqué sur 9 ans de la manière suivante : # - 60 % les 5 premières années, # - 40 % les 2 années suivantes, # - 20 % les deux dernières années. # # Le cumul de l'ensemble des aides publiques de minimis (allégements fiscaux, sociaux et aides des collectivités # territoriales) ne peut dépasser le plafond des aides de minimis, fixé à 200 000 euros sur une période glissante de 36 # mois (100 000 euros pour les entreprises de transport routier). def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') assiette_allegement = simulation.calculate('assiette_allegement', period) contrat_de_travail_duree = simulation.calculate('contrat_de_travail_duree', period) # 0: CDI, 1:CDD contrat_de_travail_debut = simulation.calculate('contrat_de_travail_debut', period) contrat_de_travail_fin = simulation.calculate('contrat_de_travail_fin', period) effectif_entreprise = simulation.calculate('effectif_entreprise', period) entreprise_chiffre_affaire = simulation.calculate('entreprise_chiffre_affaire', period) entreprise_bilan = simulation.calculate('entreprise_bilan', period) smic_proratise = simulation.calculate('smic_proratise', period) taux_versement_transport = simulation.calculate('taux_versement_transport', period) # TODO: move to legislation parameters file entreprise_eligible = (entreprise_chiffre_affaire <= 1e7) | (entreprise_bilan <= 1e7) smic_proratise = simulation.calculate('smic_proratise', period) zone_franche_urbaine = simulation.calculate('zone_franche_urbaine', period) duree_cdd_eligible = (contrat_de_travail_fin > contrat_de_travail_debut + timedelta64(365, 'D')) # TODO: move to legislation parameters file contrat_de_travail_eligible = (contrat_de_travail_debut <= datetime64("2014-12-31")) * ( (contrat_de_travail_duree == 0) + ( (contrat_de_travail_duree == 1) * (duree_cdd_eligible) ) ) # TODO: move to legislation parameters file eligible = ( contrat_de_travail_eligible * (effectif_entreprise <= 50) * zone_franche_urbaine * entreprise_eligible ) bareme_by_name = simulation.legislation_at(period.start).cotsoc.cotisations_employeur['prive_non_cadre'] taux_max = ( bareme_by_name['vieillesse_deplafonnee'].rates[0] + bareme_by_name['vieillesse_plafonnee'].rates[0] + bareme_by_name['maladie'].rates[0] + bareme_by_name['famille'].rates[0] + bareme_by_name['fnal1'].rates[0] + bareme_by_name['fnal2'].rates[0] * (effectif_entreprise >= 20) + taux_versement_transport ) # TODO: move to legislation parameters file : voir http://www.urssaf.fr/images/ref_lc2009-077.pdf seuil_max = 2 seuil_min = 1.4 taux_exoneration = compute_taux_exoneration(assiette_allegement, smic_proratise, taux_max, seuil_max, seuil_min) exoneration_relative_year_passed = exoneration_relative_year(period, contrat_de_travail_debut) large_rate_by_year_passed = { 0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: .60, 6: .40, 7: .20, } # TODO: move to legislation parameters file small_rate_by_year_passed = { 0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: .60, 6: .60, 7: .60, 8: .60, 9: .60, 10: .40, 11: .40, 12: .20, 13: .20, } # TODO: move to legislation parameters file large_taux_exoneration = eligible * 0.0 small_taux_exoneration = eligible * 0.0 for year_passed, rate in large_rate_by_year_passed.iteritems(): if (exoneration_relative_year_passed == year_passed).any(): large_taux_exoneration[exoneration_relative_year_passed == year_passed] = rate * taux_exoneration for year_passed, rate in small_rate_by_year_passed.iteritems(): if (exoneration_relative_year_passed == year_passed).any(): small_taux_exoneration[exoneration_relative_year_passed == year_passed] = rate * taux_exoneration exoneration_cotisations_zfu = eligible * assiette_allegement * ( small_taux_exoneration * (effectif_entreprise <= 5) + large_taux_exoneration * (effectif_entreprise > 5) ) return period, exoneration_cotisations_zfu # TODO: propager dans le temps @reference_formula class exoneration_cotisations_employeur_zrd(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Exonrérations de cotisations employeur pour l'embauche en zone de restructuration de la Défense (ZRD)" url = "http://www.apce.com/pid11668/exoneration-dans-les-zrd.html?espace=1&tp=1" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') assiette_allegement = simulation.calculate('assiette_allegement', period) entreprise_creation = simulation.calculate('entreprise_creation', period) smic_proratise = simulation.calculate('smic_proratise', period) zone_restructuration_defense = simulation.calculate('zone_restructuration_defense', period) eligible = zone_restructuration_defense taux_max = .281 # TODO: move to legislation parameters file seuil_max = 2.4 seuil_min = 1.4 taux_exoneration = compute_taux_exoneration(assiette_allegement, smic_proratise, taux_max, seuil_max, seuil_min) exoneration_relative_year_passed = exoneration_relative_year(period, entreprise_creation) rate_by_year_passed = { 0: 1, 1: 1, 2: 1, 3: 2 / 3, 4: 1 / 3, } # TODO: move to legislation parameters file ratio = eligible * 0.0 for year_passed, rate in rate_by_year_passed.iteritems(): if (exoneration_relative_year_passed == year_passed).any(): ratio[exoneration_relative_year_passed == year_passed] = rate exoneration_cotisations_zrd = ratio * taux_exoneration * assiette_allegement * eligible return period, exoneration_cotisations_zrd @reference_formula class exoneration_cotisations_employeur_zrr(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Exonrérations de cotisations employeur pour l'embauche en zone de revitalisation rurale (ZRR)" url = "http://www.apce.com/pid538/embauches-en-zru-et-zrr.html?espace=1&tp=1" # Les entreprises et groupements d'employeurs exerçant une activité industrielle, commerciale, artisanale, agricole # ou libérale et cotisant au régime d'assurance chômage. # Les entreprises concernées, y compris chacune de celles appartenant à un groupement d'employeurs, doivent avoir # au moins un établissement situé en zone de revitalisation rurale. # # A noter : les associations à but non lucratif sont exclues du dispositif. Par contre, quelle que soit leur forme # juridique, les entreprises d'insertion ou d'intérim d'insertion peuvent en bénéficier. Les régies de quartier # peuvent en bénéficier lorsque leur activité est susceptible d'entraîner l'assujettissement à la TVA à l'impôt sur # les sociétés ainsi qu'à la contribution économique territoriale qu'elles en soient effectivement redevables # ou non. # # L'employeur ne doit avoir procédé à aucun licenciement économique durant les 12 mois précédant l'embauche. def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') assiette_allegement = simulation.calculate('assiette_allegement', period) contrat_de_travail_duree = simulation.calculate('contrat_de_travail_duree', period) # 0: CDI, 1:CDD contrat_de_travail_debut = simulation.calculate('contrat_de_travail_debut', period) contrat_de_travail_fin = simulation.calculate('contrat_de_travail_fin', period) effectif_entreprise = simulation.calculate('effectif_entreprise', period) smic_proratise = simulation.calculate('smic_proratise', period) zone_revitalisation_rurale = simulation.calculate('zone_revitalisation_rurale', period) duree_cdd_eligible = contrat_de_travail_fin > contrat_de_travail_debut + timedelta64(365, 'D') # TODO: move to legislation parameters file contrat_de_travail_eligible = ( contrat_de_travail_duree == 0) + ( (contrat_de_travail_duree == 1) * (duree_cdd_eligible) ) duree_validite = ( datetime64(period.start) + timedelta64(1, 'D') - contrat_de_travail_debut).astype('timedelta64[Y]') < 1 eligible = ( contrat_de_travail_eligible * (effectif_entreprise <= 50) * zone_revitalisation_rurale * duree_validite ) taux_max = .281 if period.start.year < 2015 else .2655 # TODO: move to legislation parameters file seuil_max = 2.4 seuil_min = 1.5 taux_exoneration = compute_taux_exoneration(assiette_allegement, smic_proratise, taux_max, seuil_max, seuil_min) exoneration_cotisations_zrr = taux_exoneration * assiette_allegement * eligible return period, exoneration_cotisations_zrr # Aides à la création @reference_formula class exoneration_is_creation_zrr(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Exonrérations fiscales pour création d'une entreprise en zone de revitalisation rurale (ZRR)" url = 'http://www.apce.com/pid11690/exonerations-d-impots-zrr.html?espace=1&tp=1' def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') effectif_entreprise = simulation.calculate('effectif_entreprise', period) entreprise_benefice = simulation.calculate('entreprise_benefice', period) # TODO: MODIFIER avec création d'entreprise contrat_de_travail_duree = simulation.calculate('contrat_de_travail_duree', period) # 0: CDI, 1:CDD contrat_de_travail_debut = simulation.calculate('contrat_de_travail_debut', period) contrat_de_travail_fin = simulation.calculate('contrat_de_travail_fin', period) duree_eligible = contrat_de_travail_fin > contrat_de_travail_debut + timedelta64(365, 'D') # TODO: move to legislation parameters file contrat_de_travail_eligible = ( contrat_de_travail_duree == 0) + ( (contrat_de_travail_duree == 1) * (duree_eligible) ) zone_revitalisation_rurale = simulation.calculate('zone_revitalisation_rurale', period) eligible = ( contrat_de_travail_eligible * (effectif_entreprise <= 50) * zone_revitalisation_rurale ) exoneration_relative_year_passed = exoneration_relative_year(period, contrat_de_travail_debut) rate_by_year_passed = { 0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: .75, 6: .50, 7: .25, } # TODO: move to legislation parameters file taux_exoneraion = eligible * 0.0 for year_passed, rate in rate_by_year_passed.iteritems(): taux_exoneraion[exoneration_relative_year_passed == year_passed] = rate return period, taux_exoneraion * entreprise_benefice # TODO: mettre sur toutes les années # @reference_formula # class bassin_emploi_redynamiser(SimpleFormulaColumn): # column = BoolCol # entity_class = Individus # label = u"L'entreprise est située danns un bassin d'emploi à redynamiser(BER)" # # La liste des bassins d'emploi à redynamiser a été fixée par le décret n°2007-228 du 20 février 2007. # # Actuellement, deux régions sont concernées : Champagne-Ardenne (zone d'emploi de la Vallée de la Meuse) # # et Midi-Pyrénées (zone d'emploi de Lavelanet). # # def function(self, simulation, period): # effectif_entreprise = simulation.calculate('effectif_entreprise', period) # return period, (effectif_entreprise >= 1) * False @reference_formula class jeune_entreprise_innovante(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"L'entreprise est une jeune entreprise innovante" def function(self, simulation, period): # Toute entreprise existante au 1er janvier 2004 ou créée entre le 1er janvier 2004 et le 31 décembre 2016 à # condition de remplir les conditions suivantes : # # avoir moins de 8 ans d'existence au moment de la demande # # être réellement nouvelle, c'est-à-dire ne pas avoir été créée dans le cadre d'une concentration, # d'une restructuration, d'une extension d'activité préexistante ou d'une reprise # # employer moins de 250 personnes au cours de l'exercice au titre duquel elle demande à bénéficier de ce statut # # réaliser un chiffre d'affaires inférieur à 50 M€ et disposer d'un total de bilan inférieur à 43 M€ # # être indépendante, c'est-à-dire que son capital doit être détenu pour 50 % au minimum par : # # - des personnes physiques # # - une ou plusieurs autres JEI dont 50 % du capital au moins est détenu par des personnes physiques # # - des associations ou fondations reconnues d'utilité publique à caractère scientifique # # - des établissements de recherche et d'enseignement et leurs filiales # # - des structures d'investissement sous réserve qu'il n'y ait pas de lien de dépendance telles que des : # - fonds communs de placement dans l'innovation (FCPI) # - sociétés de capital-risque # - fonds d'investissement de proximité (FIP) # - sociétés de développement régional (SDR) # - sociétés financières d'innovation (SFI) # - sociétés unipersonnelles d'investissements à risques (SUIR). # # réaliser des dépenses de R§D représentant au moins 15 % des charges fiscalement déductibles au titre du même # exercice. effectif_entreprise = simulation.calculate('effectif_entreprise', period) entreprise_bilan = simulation.calculate('entreprise_bilan', period) entreprise_chiffre_affaire = simulation.calculate('entreprise_chiffre_affaire', period) entreprise_creation = simulation.calculate('entreprise_creation', period) # entreprise_depenses_rd = simulation.calculate('entreprise_depenses_rd', period) jei_date_demande = simulation.calculate('jei_date_demande', period) # TODO: move to legislation parameters file # entreprise_depenses_rd > .15 TODO independance = True jeune_entreprise_innovante = ( independance * (effectif_entreprise < 250) * (entreprise_creation <= datetime64("2016-12-31")) * ((jei_date_demande + timedelta64(1, 'D') - entreprise_creation).astype('timedelta64[Y]') < 8) * (entreprise_chiffre_affaire < 50e6) * (entreprise_bilan < 43e6) ) return period, jeune_entreprise_innovante @reference_formula class bassin_emploi_redynamiser(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"L'entreprise est située danns un bassin d'emploi à redynamiser (BER)" # La liste des bassins d'emploi à redynamiser a été fixée par le décret n°2007-228 du 20 février 2007. # Actuellement, deux régions sont concernées : Champagne-Ardenne (zone d'emploi de la Vallée de la Meuse) # et Midi-Pyrénées (zone d'emploi de Lavelanet). def function(self, simulation, period): effectif_entreprise = simulation.calculate('effectif_entreprise', period) return period, (effectif_entreprise >= 1) * False @reference_formula class zone_restructuration_defense(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"L'entreprise est située dans une zone de restructuration de la Défense (ZRD)" def function(self, simulation, period): effectif_entreprise = simulation.calculate('effectif_entreprise', period) return period, (effectif_entreprise >= 1) * False @reference_formula class zone_franche_urbaine(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"L'entreprise est située danns une zone franche urbaine (ZFU)" def function(self, simulation, period): effectif_entreprise = simulation.calculate('effectif_entreprise', period) return period, (effectif_entreprise >= 1) * False @reference_formula class zone_revitalisation_rurale(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"L'entreprise est située dans une zone de revitalisation rurale (ZRR)" def function(self, simulation, period): effectif_entreprise = simulation.calculate('effectif_entreprise', period) return period, (effectif_entreprise >= 1) * False # Helpers def compute_taux_exoneration(assiette_allegement, smic_proratise, taux_max, seuil_max, seuil_min = 1): ratio_smic_salaire = smic_proratise / (assiette_allegement + 1e-16) # règle d'arrondi: 4 décimales au dix-millième le plus proche ( # TODO: reprise de l'allègement Fillon unchecked) return round_( taux_max * min_(1, max_(seuil_max * seuil_min * ratio_smic_salaire - seuil_min, 0) / (seuil_max - seuil_min)), 4, ) def exoneration_relative_year(period, other_date): return (datetime64(period.start) + timedelta64(1, 'D') - other_date).astype('timedelta64[Y]') PK'GGlrLrLgopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/contributions_sociales/capital.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import logging from ....base import * # noqa analysis:ignore log = logging.getLogger(__name__) # TODO: CHECK la csg déductible en 2006 est case GH # TODO: la revenus soumis aux csg déductible et imposable sont # en CG et BH en 2010 # temp = 0 # if hasattr(P, "prelsoc"): # for val in P.prelsoc.__dict__.itervalues(): temp += val # P.prelsoc.total = temp # else : # P.__dict__.update({"prelsoc": {"total": 0} }) # # a = {'salaire_imposable':sal, 'pat':pat, 'csg':csg, 'crds':crds, # 'exo_fillon': P.cotsoc.exo_fillon, 'lps': P.lps, # 'ir': P.ir, 'prelsoc': P.prelsoc} # return Dicts2Object(**a) def _mhsup(hsup): """ Heures supplémentaires comptées négativement """ return -hsup ############################################################################ # # Revenus du capital ############################################################################ # revenus du capital soumis au barème @reference_formula class csg_cap_bar(SimpleFormulaColumn): """Calcule la CSG sur les revenus du capital soumis au barème.""" column = FloatCol entity_class = FoyersFiscaux label = u"CSG sur les revenus du capital soumis au barème" url = u"http://fr.wikipedia.org/wiki/Contribution_sociale_généralisée" def function(self, simulation, period): period = period.start.period(u'year').offset('first-of') rev_cap_bar = simulation.calculate_add('rev_cap_bar', period) _P = simulation.legislation_at(period.start) return period, -rev_cap_bar * _P.csg.capital.glob @reference_formula class csg_cap_bar_declarant1(EntityToPersonColumn): entity_class = Individus label = u"CSG sur les revenus du capital soumis au barème (pour le premier déclarant du foyer fiscal)" role = VOUS variable = csg_cap_bar @reference_formula class crds_cap_bar(SimpleFormulaColumn): """Calcule la CRDS sur les revenus du capital soumis au barème.""" column = FloatCol entity_class = FoyersFiscaux label = u"CRDS sur les revenus du capital soumis au barème" url = "http://fr.wikipedia.org/wiki/Contribution_pour_le_remboursement_de_la_dette_sociale" def function(self, simulation, period): period = period.start.period(u'year').offset('first-of') rev_cap_bar = simulation.calculate_add('rev_cap_bar', period) _P = simulation.legislation_at(period.start) return period, -rev_cap_bar * _P.crds.capital @reference_formula class crds_cap_bar_declarant1(EntityToPersonColumn): entity_class = Individus label = u"CRDS sur les revenus du capital soumis au barème (pour le premier déclarant du foyer fiscal)" role = VOUS variable = crds_cap_bar @reference_formula class prelsoc_cap_bar(DatedFormulaColumn): """Calcule le prélèvement social sur les revenus du capital soumis au barème""" column = FloatCol entity_class = FoyersFiscaux label = u"Prélèvements sociaux sur les revenus du capital soumis au barème" url = u"http://www.impots.gouv.fr/portal/dgi/public/particuliers.impot?pageId=part_ctrb_soc&paf_gm=content&typePage=cpr02&sfid=501&espId=1&impot=CS" # noqa @dated_function(start = date(2002, 1, 1), stop = date(2005, 12, 31)) def function_2002_2005(self, simulation, period): period = period.start.period(u'year').offset('first-of') rev_cap_bar = simulation.calculate_add('rev_cap_bar', period) P = simulation.legislation_at(period.start).prelsoc total = P.base_pat return period, -rev_cap_bar * total @dated_function(start = date(2006, 1, 1), stop = date(2008, 12, 31)) def function_2006_2008(self, simulation, period): period = period.start.period(u'year').offset('first-of') rev_cap_bar = simulation.calculate_add('rev_cap_bar', period) P = simulation.legislation_at(period.start).prelsoc total = P.base_pat + P.add_pat return period, -rev_cap_bar * total @dated_function(start = date(2009, 1, 1), stop = date(2015, 12, 31)) def function_2009_2015(self, simulation, period): period = period.start.period(u'year').offset('first-of') rev_cap_bar = simulation.calculate_add('rev_cap_bar', period) P = simulation.legislation_at(period.start).prelsoc total = P.base_pat + P.add_pat + P.rsa return period, -rev_cap_bar * total @reference_formula class prelsoc_cap_bar_declarant1(EntityToPersonColumn): entity_class = Individus label = u"Prélèvements sociaux sur les revenus du capital soumis au barème (pour le premier déclarant du foyer fiscal)" # noqa role = VOUS variable = prelsoc_cap_bar # plus-values de valeurs mobilières @reference_formula class csg_pv_mo(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"CSG sur les plus-values de cession de valeurs mobilières" url = "http://vosdroits.service-public.fr/particuliers/F21618.xhtml" def function(self, simulation, period): """ Calcule la CSG sur les plus-values de cession mobilière """ period = period.start.offset('first-of', 'year').period('year') f3vg = simulation.calculate('f3vg', period) _P = simulation.legislation_at(period.start) return period, -f3vg * _P.csg.capital.glob @reference_formula class crds_pv_mo(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"CRDS sur les plus-values de cession de valeurs mobilières" url = "http://fr.wikipedia.org/wiki/Contribution_pour_le_remboursement_de_la_dette_sociale" def function(self, simulation, period): """ Calcule la CRDS sur les plus-values de cession mobilière """ period = period.start.offset('first-of', 'year').period('year') f3vg = simulation.calculate('f3vg', period) _P = simulation.legislation_at(period.start) return period, -f3vg * _P.crds.capital @reference_formula class prelsoc_pv_mo(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Prélèvements sociaux sur les plus-values de cession de valeurs mobilières" url = "http://www.impots.gouv.fr/portal/dgi/public/particuliers.impot?pageId=part_ctrb_soc&paf_dm=popup&paf_gm=content&typePage=cpr02&sfid=501&espId=1&impot=CS" # noqa @dated_function(start = date(2002, 1, 1), stop = date(2005, 12, 31)) def function_20020101_20051231(self, simulation, period): """ Calcule le prélèvement social sur les plus-values de cession de valeurs mobilières """ period = period.start.offset('first-of', 'year').period('year') f3vg = simulation.calculate('f3vg', period) _P = simulation.legislation_at(period.start) P = _P.prelsoc total = P.base_pat return period, -f3vg * total @dated_function(start = date(2006, 1, 1), stop = date(2008, 12, 31)) def function_20060101_20081231(self, simulation, period): """ Calcule le prélèvement social sur les plus-values de cession de valeurs mobilières """ period = period.start.offset('first-of', 'year').period('year') f3vg = simulation.calculate('f3vg', period) _P = simulation.legislation_at(period.start) P = _P.prelsoc total = P.base_pat + P.add_pat return period, -f3vg * total @dated_function(start = date(2009, 1, 1), stop = date(2015, 12, 31)) def function_20090101_20151231(self, simulation, period): """ Calcule le prélèvement social sur les plus-values de cession de valeurs mobilières """ period = period.start.offset('first-of', 'year').period('year') f3vg = simulation.calculate('f3vg', period) _P = simulation.legislation_at(period.start) P = _P.prelsoc total = P.base_pat + P.add_pat + P.rsa return period, -f3vg * total # plus-values immobilières @reference_formula class csg_pv_immo(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"CSG sur les plus-values immobilières" url = "http://fr.wikipedia.org/wiki/Contribution_sociale_g%C3%A9n%C3%A9ralis%C3%A9e" def function(self, simulation, period): """ Calcule la CSG sur les plus-values de cession immobilière """ period = period.start.offset('first-of', 'year').period('year') f3vz = simulation.calculate('f3vz', period) _P = simulation.legislation_at(period.start) return period, -f3vz * _P.csg.capital.glob @reference_formula class crds_pv_immo(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"CRDS sur les plus-values immobilières" url = "http://fr.wikipedia.org/wiki/Contribution_pour_le_remboursement_de_la_dette_sociale" def function(self, simulation, period): """ Calcule la CRDS sur les plus-values de cession immobilière """ period = period.start.offset('first-of', 'year').period('year') f3vz = simulation.calculate('f3vz', period) _P = simulation.legislation_at(period.start) return period, -f3vz * _P.crds.capital @reference_formula class prelsoc_pv_immo(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Prélèvements sociaux sur les plus-values immobilières" url = "http://www.pap.fr/argent/impots/les-plus-values-immobilieres/a1314/l-imposition-de-la-plus-value-immobiliere" @dated_function(start = date(2002, 1, 1), stop = date(2005, 12, 31)) def function_20020101_20051231(self, simulation, period): """ Calcule le prélèvement social sur les plus-values de cession immobilière """ period = period.start.offset('first-of', 'year').period('year') f3vz = simulation.calculate('f3vz', period) _P = simulation.legislation_at(period.start) P = _P.prelsoc total = P.base_pat return period, -f3vz * total @dated_function(start = date(2006, 1, 1), stop = date(2008, 12, 31)) def function_20060101_20081231(self, simulation, period): """ Calcule le prélèvement social sur les plus-values de cession immobilière """ period = period.start.offset('first-of', 'year').period('year') f3vz = simulation.calculate('f3vz', period) _P = simulation.legislation_at(period.start) P = _P.prelsoc total = P.base_pat + P.add_pat return period, -f3vz * total @dated_function(start = date(2009, 1, 1), stop = date(2015, 12, 31)) def function_20090101_20151231(self, simulation, period): """ Calcule le prélèvement social sur les plus-values de cession immobilière """ period = period.start.offset('first-of', 'year').period('year') f3vz = simulation.calculate('f3vz', period) _P = simulation.legislation_at(period.start) P = _P.prelsoc total = P.base_pat + P.add_pat + P.rsa return period, -f3vz * total # revenus fonciers @reference_formula class csg_fon(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"CSG sur les revenus fonciers" url = "http://fr.wikipedia.org/wiki/Contribution_sociale_g%C3%A9n%C3%A9ralis%C3%A9e" def function(self, simulation, period): ''' Calcule la CSG sur les revenus fonciers Attention : assiette CSG = asiette IR valable 2006-2014 mais pourrait changer ''' period = period.start.offset('first-of', 'year').period('year') rev_cat_rfon = simulation.calculate('rev_cat_rfon', period) _P = simulation.legislation_at(period.start) return period, -rev_cat_rfon * _P.csg.capital.glob @reference_formula class crds_fon(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"CRDS sur les revenus fonciers" url = "http://vosdroits.service-public.fr/particuliers/F2329.xhtml" def function(self, simulation, period): ''' Calcule la CRDS sur les revenus fonciers Attention : assiette CSG = asiette IR valable 2006-2014 mais pourrait changer ''' period = period.start.offset('first-of', 'year').period('year') rev_cat_rfon = simulation.calculate('rev_cat_rfon', period) _P = simulation.legislation_at(period.start) return period, -rev_cat_rfon * _P.crds.capital @reference_formula class prelsoc_fon(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Prélèvements sociaux sur les revenus fonciers" url = "http://www.impots.gouv.fr/portal/dgi/public/particuliers.impot?pageId=part_ctrb_soc&paf_dm=popup&paf_gm=content&typePage=cpr02&sfid=501&espId=1&impot=CS" # noqa @dated_function(start = date(2002, 1, 1), stop = date(2005, 12, 31)) def function_20020101_20051231(self, simulation, period): ''' Calcule le prélèvement social sur les revenus fonciers Attention : assiette CSG = asiette IR valable 2006-2014 mais pourrait changer ''' period = period.start.offset('first-of', 'year').period('year') rev_cat_rfon = simulation.calculate('rev_cat_rfon', period) _P = simulation.legislation_at(period.start) P = _P.prelsoc total = P.base_pat return period, -rev_cat_rfon * total @dated_function(start = date(2006, 1, 1), stop = date(2008, 12, 31)) def function_20060101_20081231(self, simulation, period): ''' Calcule le prélèvement social sur les revenus fonciers Attention : assiette CSG = asiette IR valable 2006-2014 mais pourrait changer ''' period = period.start.offset('first-of', 'year').period('year') rev_cat_rfon = simulation.calculate('rev_cat_rfon', period) _P = simulation.legislation_at(period.start) P = _P.prelsoc total = P.base_pat + P.add_pat return period, -rev_cat_rfon * total @dated_function(start = date(2009, 1, 1), stop = date(2015, 12, 31)) def function_20090101_20151231(self, simulation, period): ''' Calcule le prélèvement social sur les revenus fonciers Attention : assiette CSG = asiette IR valable 2006-2014 mais pourrait changer ''' period = period.start.offset('first-of', 'year').period('year') rev_cat_rfon = simulation.calculate('rev_cat_rfon', period) _P = simulation.legislation_at(period.start) P = _P.prelsoc total = P.base_pat + P.add_pat + P.rsa return period, -rev_cat_rfon * total # revenus du capital soumis au prélèvement libératoire @reference_formula class csg_cap_lib(SimpleFormulaColumn): """Calcule la CSG sur les revenus du capital soumis au prélèvement libératoire.""" column = FloatCol entity_class = FoyersFiscaux label = u"CSG sur les revenus du capital soumis au prélèvement libératoire" url = u"http://fr.wikipedia.org/wiki/Contribution_sociale_généralisée" def function(self, simulation, period): period = period.start.period(u'year').offset('first-of') rev_cap_lib = simulation.calculate_add('rev_cap_lib', period) _P = simulation.legislation_at(period.start) return period, -rev_cap_lib * _P.csg.capital.glob @reference_formula class csg_cap_lib_declarant1(EntityToPersonColumn): entity_class = Individus label = u"CSG sur les revenus du capital soumis au prélèvement libératoire (pour le premier déclarant du foyer fiscal)" # noqa role = VOUS variable = csg_cap_lib @reference_formula class crds_cap_lib(SimpleFormulaColumn): """Calcule la CRDS sur les revenus du capital soumis au prélèvement libératoire.""" column = FloatCol entity_class = FoyersFiscaux label = u"CRDS sur les revenus du capital soumis au prélèvement libératoire" url = u"http://fr.wikipedia.org/wiki/Contribution_pour_le_remboursement_de_la_dette_sociale" def function(self, simulation, period): period = period.start.period(u'year').offset('first-of') rev_cap_lib = simulation.calculate_add('rev_cap_lib', period) _P = simulation.legislation_at(period.start) return period, -rev_cap_lib * _P.crds.capital @reference_formula class crds_cap_lib_declarant1(EntityToPersonColumn): entity_class = Individus label = u"CRDS sur les revenus du capital soumis au prélèvement libératoire (pour le premier déclarant du foyer fiscal)" # noqa role = VOUS variable = crds_cap_lib @reference_formula class prelsoc_cap_lib(SimpleFormulaColumn): """Calcule le prélèvement social sur les revenus du capital soumis au prélèvement libératoire.""" column = FloatCol entity_class = FoyersFiscaux label = u"Prélèvements sociaux sur les revenus du capital soumis au prélèvement libératoire" url = u"http://www.impots.gouv.fr/portal/dgi/public/particuliers.impot?pageId=part_ctrb_soc&paf_dm=popup&paf_gm=content&typePage=cpr02&sfid=501&espId=1&impot=CS" # noqa def function(self, simulation, period): period = period.start.period(u'year').offset('first-of') rev_cap_lib = simulation.calculate_add('rev_cap_lib', period) prelsoc = simulation.legislation_at(period.start).prelsoc start_year = period.start.year if start_year < 2006: total = prelsoc.base_pat elif start_year < 2009: total = prelsoc.base_pat + prelsoc.add_pat else: total = prelsoc.base_pat + prelsoc.add_pat + prelsoc.rsa return period, -rev_cap_lib * total @reference_formula class prelsoc_cap_lib_declarant1(EntityToPersonColumn): entity_class = Individus label = u"Prélèvements sociaux sur les revenus du capital soumis au prélèvement libératoire (pour le premier déclarant du foyer fiscal)" # noqa role = VOUS variable = prelsoc_cap_lib # TODO: non_imposabilité pour les revenus au barème # verse = (-csgcap_bar - crdscap_bar - prelsoccap_bar) > bareme.csg.capital.nonimp # # verse=1 # # CSG sur les revenus du patrimoine non imposés au barême (contributions sociales déjà prélevées) # # table.setIndiv('csgcap_bar', csgcap_bar*verse) # table.setIndiv('prelsoccap_bar', prelsoccap_bar*verse) # table.setIndiv('crdscap_bar', crdscap_bar*verse) PKFhopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/contributions_sociales/__init__.pyPKF UU dopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/contributions_sociales/base.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . def montant_csg_crds(base_avec_abattement = None, base_sans_abattement = None, indicatrice_taux_plein = None, indicatrice_taux_reduit = None, law_node = None, plafond_securite_sociale = None): assert law_node is not None assert plafond_securite_sociale is not None if base_sans_abattement is None: base_sans_abattement = 0 if base_avec_abattement is None: base = base_sans_abattement else: base = base_avec_abattement - law_node.abattement.calc( base_avec_abattement, factor = plafond_securite_sociale, round_base_decimals = 2, ) + base_sans_abattement if indicatrice_taux_plein is None and indicatrice_taux_reduit is None: return -law_node.taux * base else: return - (law_node.taux_plein * indicatrice_taux_plein + law_node.taux_reduit * indicatrice_taux_reduit) * base PK'Gof.0.0hopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/contributions_sociales/activite.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import logging from ....base import * # noqa analysis:ignore from .base import montant_csg_crds log = logging.getLogger(__name__) # TODO: prise_en_charge_employeur_retraite_supplementaire à la CSG/CRDS et au forfait social @reference_formula class assiette_csg_abattue(SimpleFormulaColumn): column = FloatCol label = u"Assiette CSG - CRDS" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') primes_salaires = simulation.calculate('primes_salaires', period) salaire_de_base = simulation.calculate('salaire_de_base', period) primes_fonction_publique = simulation.calculate('primes_fonction_publique', period) # indemnites_journalieres_maladie = simulation.calculate('indemnites_journalieres_maladie', period) # TODO: mettre à part ? indemnite_residence = simulation.calculate('indemnite_residence', period) supp_familial_traitement = simulation.calculate('supp_familial_traitement', period) hsup = simulation.calculate('hsup', period) remuneration_principale = simulation.calculate('remuneration_principale', period) stage_gratification_reintegration = simulation.calculate('stage_gratification_reintegration', period) return period, ( remuneration_principale + salaire_de_base + primes_salaires + primes_fonction_publique + indemnite_residence + stage_gratification_reintegration + supp_familial_traitement - hsup ) @reference_formula class assiette_csg_non_abattue(SimpleFormulaColumn): column = FloatCol label = u"Assiette CSG - CRDS" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') prevoyance_obligatoire_cadre = simulation.calculate('prevoyance_obligatoire_cadre', period) # TODO + indemnites_journalieres_maladie, return period, - prevoyance_obligatoire_cadre @reference_formula class csg_deductible_salaire(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol label = u"CSG déductible sur les salaires" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') assiette_csg_abattue = simulation.calculate('assiette_csg_abattue', period) assiette_csg_non_abattue = simulation.calculate('assiette_csg_non_abattue', period) plafond_securite_sociale = simulation.calculate('plafond_securite_sociale', period) law = simulation.legislation_at(period.start) montant_csg = montant_csg_crds( base_avec_abattement = assiette_csg_abattue, base_sans_abattement = assiette_csg_non_abattue, law_node = law.csg.activite.deductible, plafond_securite_sociale = plafond_securite_sociale, ) return period, montant_csg @reference_formula class csg_imposable_salaire(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol label = u"CSG imposables sur les salaires" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') assiette_csg_abattue = simulation.calculate('assiette_csg_abattue', period) assiette_csg_non_abattue = simulation.calculate('assiette_csg_non_abattue', period) plafond_securite_sociale = simulation.calculate('plafond_securite_sociale', period) law = simulation.legislation_at(period.start) montant_csg = montant_csg_crds( base_avec_abattement = assiette_csg_abattue, base_sans_abattement = assiette_csg_non_abattue, law_node = law.csg.activite.imposable, plafond_securite_sociale = plafond_securite_sociale, ) return period, montant_csg @reference_formula class crds_salaire(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol label = u"CRDS sur les salaires" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') assiette_csg_abattue = simulation.calculate('assiette_csg_abattue', period) assiette_csg_non_abattue = simulation.calculate('assiette_csg_non_abattue', period) plafond_securite_sociale = simulation.calculate('plafond_securite_sociale', period) law = simulation.legislation_at(period.start) montant_crds = montant_csg_crds( law_node = law.crds.activite, base_avec_abattement = assiette_csg_abattue, base_sans_abattement = assiette_csg_non_abattue, plafond_securite_sociale = plafond_securite_sociale, ) return period, montant_crds @reference_formula class forfait_social(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Forfait social" start_date = date(2009, 1, 1) # les contributions destinées au financement des prestations de prévoyance complémentaire versées # au bénéfice de leurs salariés, anciens salariés et de leurs ayants droit (entreprises à partir de 10 salariés), # la réserve spéciale de participation dans les sociétés coopératives ouvrières de production (Scop). def function(self, simulation, period): prevoyance_obligatoire_cadre = simulation.calculate_add('prevoyance_obligatoire_cadre', period) prise_en_charge_employeur_prevoyance_complementaire = simulation.calculate_add( 'prise_en_charge_employeur_prevoyance_complementaire', period) prise_en_charge_employeur_retraite_complementaire = simulation.calculate_add( 'prise_en_charge_employeur_retraite_complementaire', period) taux_plein = simulation.legislation_at(period.start).forfait_social.taux_plein taux_reduit = simulation.legislation_at(period.start).forfait_social.taux_reduit # TODO: complete this assiette_taux_plein = prise_en_charge_employeur_retraite_complementaire # TODO: compléter l'assiette assiette_taux_reduit = - prevoyance_obligatoire_cadre + prise_en_charge_employeur_prevoyance_complementaire return period, - ( assiette_taux_plein * taux_plein + assiette_taux_reduit * taux_reduit ) @reference_formula class salaire_imposable(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol( cerfa_field = { QUIFOY['vous']: u"1AJ", QUIFOY['conj']: u"1BJ", QUIFOY['pac1']: u"1CJ", QUIFOY['pac2']: u"1DJ", QUIFOY['pac3']: u"1EJ", }, # (f1aj, f1bj, f1cj, f1dj, f1ej) val_type = "monetary", ) entity_class = Individus label = u"Salaires imposables" set_input = set_input_divide_by_period def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') salaire_de_base = simulation.calculate('salaire_de_base', period) primes_salaires = simulation.calculate('primes_salaires', period) primes_fonction_publique = simulation.calculate('primes_fonction_publique', period) indemnite_residence = simulation.calculate('indemnite_residence', period) supp_familial_traitement = simulation.calculate('supp_familial_traitement', period) csg_deductible_salaire = simulation.calculate('csg_deductible_salaire', period) cotisations_salariales = simulation.calculate('cotisations_salariales', period) remuneration_principale = simulation.calculate('remuneration_principale', period) hsup = simulation.calculate('hsup', period) rev_microsocial_declarant1 = simulation.calculate_divide('rev_microsocial_declarant1', period) return period, ( salaire_de_base + primes_salaires + remuneration_principale + primes_fonction_publique + indemnite_residence + supp_familial_traitement + csg_deductible_salaire + cotisations_salariales - hsup + rev_microsocial_declarant1 ) @reference_formula class salaire_net(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Salaires nets d'après définition INSEE" set_input = set_input_divide_by_period def function(self, simulation, period): ''' Calcul du salaire net d'après définition INSEE net = net de csg et crds ''' period = period.start.period(u'month').offset('first-of') # salaire_de_base = simulation.get_array('salaire_de_base', period) # if salaire_de_base is None: # return period, zeros(self.holder.entity.count) salaire_imposable = simulation.calculate('salaire_imposable', period) crds_salaire = simulation.calculate('crds_salaire', period) csg_imposable_salaire = simulation.calculate('csg_imposable_salaire', period) return period, salaire_imposable + crds_salaire + csg_imposable_salaire @reference_formula class tehr(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Taxe exceptionnelle de solidarité sur les très hautes rémunérations" url = u"http://vosdroits.service-public.fr/professionnels-entreprises/F32096.xhtml" def function(self, simulation, period): period = period.start.period(u'year').offset('first-of') salaire_de_base = simulation.calculate_add('salaire_de_base', period) # TODO: check base law = simulation.legislation_at(period.start) bar = law.cotsoc.tehr return period, -bar.calc(salaire_de_base) ############################################################################ # # Non salariés ############################################################################ @reference_formula class rev_microsocial(SimpleFormulaColumn): """Revenu net des cotisations sociales sous régime microsocial (auto-entrepreneur)""" column = FloatCol entity_class = FoyersFiscaux label = u"Revenu net des cotisations sociales pour le régime microsocial" start_date = date(2009, 1, 1) url = u"http://www.apce.com/pid6137/regime-micro-social.html" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') assiette_service = simulation.calculate('assiette_service', period) assiette_vente = simulation.calculate('assiette_vente', period) assiette_proflib = simulation.calculate('assiette_proflib', period) _P = simulation.legislation_at(period.start) P = _P.cotsoc.sal.microsocial total = assiette_service + assiette_vente + assiette_proflib prelsoc_ms = assiette_service * P.servi + assiette_vente * P.vente + assiette_proflib * P.rsi return period, total - prelsoc_ms @reference_formula class rev_microsocial_declarant1(EntityToPersonColumn): entity_class = Individus label = u"Revenu net des cotisations sociales sous régime microsocial (auto-entrepreneur) (pour le premier déclarant du foyer fiscal)" # noqa role = VOUS variable = rev_microsocial PK'Go-44lopenfisca_france/model/prelevements_obligatoires/prelevements_sociaux/contributions_sociales/remplacement.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import logging from numpy import maximum as max_, minimum as min_ from ....base import * # noqa analysis:ignore from .base import montant_csg_crds log = logging.getLogger(__name__) build_column( 'taux_csg_remplacement', EnumCol( label = u"Taux retenu sur la CSG des revenus de remplacment", entity = 'ind', enum = Enum([ u"Non renseigné/non pertinent", u"Exonéré", u"Taux réduit", u"Taux plein", ]), default = 3, ), ) ############################################################################ # # Allocations chômage ############################################################################ @reference_formula class csg_deductible_chomage(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol entity_class = Individus label = u"CSG déductible sur les allocations chômage" url = u"http://vosdroits.service-public.fr/particuliers/F2329.xhtml" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') chobrut = simulation.calculate('chobrut', period) csg_imposable_chomage = simulation.calculate('csg_imposable_chomage', period) taux_csg_remplacement = simulation.calculate('taux_csg_remplacement', period) law = simulation.legislation_at(period.start) montant_csg = montant_csg_crds( base_avec_abattement = chobrut, indicatrice_taux_plein = (taux_csg_remplacement == 3), indicatrice_taux_reduit = (taux_csg_remplacement == 2), law_node = law.csg.chomage.deductible, plafond_securite_sociale = law.cotsoc.gen.plafond_securite_sociale, ) nbh_travail = 35 * 52 / 12 # = 151.67 # TODO: depuis 2001 mais avant ? cho_seuil_exo = law.csg.chomage.min_exo * nbh_travail * law.cotsoc.gen.smic_h_b csg_deductible_chomage = max_( - montant_csg - max_(cho_seuil_exo - (chobrut + csg_imposable_chomage + montant_csg), 0), 0, ) return period, - csg_deductible_chomage @reference_formula class csg_imposable_chomage(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol entity_class = Individus label = u"CSG imposable sur les allocations chômage" url = u"http://vosdroits.service-public.fr/particuliers/F2329.xhtml" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') chobrut = simulation.calculate('chobrut', period) law = simulation.legislation_at(period.start) montant_csg = montant_csg_crds( base_avec_abattement = chobrut, law_node = law.csg.chomage.imposable, plafond_securite_sociale = law.cotsoc.gen.plafond_securite_sociale, ) nbh_travail = 35 * 52 / 12 # = 151.67 # TODO: depuis 2001 mais avant ? cho_seuil_exo = law.csg.chomage.min_exo * nbh_travail * law.cotsoc.gen.smic_h_b csg_imposable_chomage = max_(- montant_csg - max_(cho_seuil_exo - (chobrut + montant_csg), 0), 0) return period, - csg_imposable_chomage @reference_formula class crds_chomage(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol entity_class = Individus label = u"CRDS sur les allocations chômage" url = u"http://www.insee.fr/fr/methodes/default.asp?page=definitions/contrib-remb-dette-sociale.htm" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') chobrut = simulation.calculate('chobrut', period) csg_deductible_chomage = simulation.calculate('csg_deductible_chomage', period) csg_imposable_chomage = simulation.calculate('csg_imposable_chomage', period) taux_csg_remplacement = simulation.calculate('taux_csg_remplacement', period) law = simulation.legislation_at(period.start) smic_h_b = law.cotsoc.gen.smic_h_b # salaire_mensuel_reference = chobrut / .7 # heures_mensuelles = min_(salaire_mensuel_reference / smic_h_b, 35 * 52 / 12) # TODO: depuis 2001 mais avant ? heures_mensuelles = 35 * 52 / 12 cho_seuil_exo = law.csg.chomage.min_exo * heures_mensuelles * smic_h_b montant_crds = montant_csg_crds( base_avec_abattement = chobrut, law_node = law.crds.activite, plafond_securite_sociale = law.cotsoc.gen.plafond_securite_sociale, ) * (2 <= taux_csg_remplacement) crds_chomage = max_( -montant_crds - max_( cho_seuil_exo - (chobrut + csg_imposable_chomage + csg_deductible_chomage + montant_crds), 0 ), 0 ) return period, -crds_chomage @reference_formula class cho(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Allocations chômage imposables" set_input = set_input_divide_by_period url = u"http://www.insee.fr/fr/methodes/default.asp?page=definitions/chomage.htm" def function(self, simulation, period): period = period chobrut = simulation.calculate('chobrut', period) csg_deductible_chomage = simulation.calculate_add('csg_deductible_chomage', period) return period, chobrut + csg_deductible_chomage @reference_formula class chonet(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Allocations chômage nettes" set_input = set_input_divide_by_period url = u"http://vosdroits.service-public.fr/particuliers/N549.xhtml" def function(self, simulation, period): period = period cho = simulation.calculate('cho', period) csg_imposable_chomage = simulation.calculate_add('csg_imposable_chomage', period) crds_chomage = simulation.calculate_add('crds_chomage', period) return period, cho + csg_imposable_chomage + crds_chomage ############################################################################ # # Pensions ############################################################################ @reference_formula class csg_deductible_retraite(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol entity_class = Individus label = u"CSG déductible sur les pensions de retraite" url = u"https://www.lassuranceretraite.fr/cs/Satellite/PUBPrincipale/Retraites/Paiement-Votre-Retraite/Prelevements-Sociaux?packedargs=null" # noqa def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') rstbrut = simulation.calculate('rstbrut', period) taux_csg_remplacement = simulation.calculate('taux_csg_remplacement', period) law = simulation.legislation_at(period.start) montant_csg = montant_csg_crds( base_sans_abattement = rstbrut, indicatrice_taux_plein = (taux_csg_remplacement == 3), indicatrice_taux_reduit = (taux_csg_remplacement == 2), law_node = law.csg.retraite.deductible, plafond_securite_sociale = law.cotsoc.gen.plafond_securite_sociale, ) return period, montant_csg @reference_formula class csg_imposable_retraite(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol entity_class = Individus label = u"CSG imposable sur les pensions de retraite" url = u"https://www.lassuranceretraite.fr/cs/Satellite/PUBPrincipale/Retraites/Paiement-Votre-Retraite/Prelevements-Sociaux?packedargs=null" # noqa def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') rstbrut = simulation.calculate('rstbrut', period) law = simulation.legislation_at(period.start) montant_csg = montant_csg_crds( base_sans_abattement = rstbrut, law_node = law.csg.retraite.imposable, plafond_securite_sociale = law.cotsoc.gen.plafond_securite_sociale, ) return period, montant_csg @reference_formula class crds_retraite(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol entity_class = Individus label = u"CRDS sur les pensions de retraite" url = u"http://www.pensions.bercy.gouv.fr/vous-%C3%AAtes-retrait%C3%A9-ou-pensionn%C3%A9/le-calcul-de-ma-pension/les-pr%C3%A9l%C3%A8vements-effectu%C3%A9s-sur-ma-pension" # noqa def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') rstbrut = simulation.calculate('rstbrut', period) taux_csg_remplacement = simulation.calculate('taux_csg_remplacement', period) law = simulation.legislation_at(period.start) montant_crds = montant_csg_crds( base_sans_abattement = rstbrut, law_node = law.crds.retraite, plafond_securite_sociale = law.cotsoc.gen.plafond_securite_sociale, ) * (taux_csg_remplacement == 1) return period, montant_crds @reference_formula class casa(DatedFormulaColumn): column = FloatCol entity_class = Individus label = u"Contribution additionnelle de solidarité et d'autonomie" url = u"http://www.service-public.fr/actualites/002691.html" @dated_function(date(2013, 4, 1)) def function_2013(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') rstbrut = simulation.calculate('rstbrut', period) rfr_holder = simulation.compute('rfr', period.start.offset('first-of', 'year').offset(-2, 'year').period('year')) taux_csg_remplacement = simulation.calculate('taux_csg_remplacement', period) law = simulation.legislation_at(period.start) rfr = self.cast_from_entity_to_roles(rfr_holder) casa = (taux_csg_remplacement == 3) * law.prelsoc.add_ret * rstbrut * (rfr > 13900) # TODO: insert in parameters file and deal with nombre de part fiscales return period, - casa @reference_formula class rst(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Pensions de retraite imposables" set_input = set_input_divide_by_period url = u"http://vosdroits.service-public.fr/particuliers/F415.xhtml" def function(self, simulation, period): period = period rstbrut = simulation.calculate_add('rstbrut', period) csg_deductible_retraite = simulation.calculate_add('csg_deductible_retraite', period) return period, rstbrut + csg_deductible_retraite @reference_formula class rstnet(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Pensions de retraite nettes" set_input = set_input_divide_by_period url = u"http://vosdroits.service-public.fr/particuliers/N20166.xhtml" # def function(self, rst, csg_imposable_retraite, crds_retraite, casa): # return rst + csg_imposable_retraite + crds_retraite + casa def function(self, simulation, period): period = period rst = simulation.calculate('rst', period) csg_imposable_retraite = simulation.calculate_add('csg_imposable_retraite', period) crds_retraite = simulation.calculate_add('crds_retraite', period) return period, rst + csg_imposable_retraite + crds_retraite @reference_formula class crds_pfam(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"CRDS sur les prestations familiales)" url = "http://www.cleiss.fr/docs/regimes/regime_francea1.html" def function(self, simulation, period): ''' Renvoie la CRDS des prestations familiales ''' period = period af = simulation.calculate_add('af', period) cf = simulation.calculate_add('cf', period) asf = simulation.calculate_add('asf', period) ars = simulation.calculate('ars', period) paje = simulation.calculate_add('paje', period) ape = simulation.calculate_add('ape', period) apje = simulation.calculate_add('apje', period) _P = simulation.legislation_at(period.start) return period, -(af + cf + asf + ars + paje + ape + apje) * _P.fam.af.crds PKFIopenfisca_france/model/prelevements_obligatoires/impot_revenu/__init__.pyPK'G~OҎCopenfisca_france/model/prelevements_obligatoires/impot_revenu/ir.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import logging from numpy import (datetime64, logical_and as and_, logical_not as not_, logical_or as or_, logical_xor as xor_, maximum as max_, minimum as min_, round) from ...base import * # noqa analysis:ignore log = logging.getLogger(__name__) # TODO: 8ti et 8tk (cerfa 2047) # TODO: CSG, CRDS et prélèvements sociaux sur revenu du patrimione, d'activité et de remplacement # TODO: finir RPNS (prise en compte des plafonds / cases non codées : codées pour certaines années mais pas pour # d'autres - car des cases sont réutilisées pour des variables différentes suivant les années) # zetrf = zeros(taille) # jveuf = zeros(taille, dtype = bool) # Reprise du crédit d'impôt en faveur des jeunes, des accomptes et des versements mensues de prime pour l'emploi # reprise = zeros(taille) # TODO : reprise=J80 # Pcredit = P.credits_impots # if hasattr(P.reductions_impots,'saldom'): Pcredit.saldom = P.reductions_impots.saldom # credits_impot = Credits(Pcredit, table) # Réduction d'impôt # reductions = Reductions(IPnet, P.reductions_impots) # def mcirra(): # # impôt sur le revenu # mcirra = -((IMP<=-8)*IMP) # mciria = max_(0,(IMP>=0)*IMP) # # mciria = max_(0,(IMP>=0)*IMP - credimp_etranger - cont_rev_loc - ( f8to + f8tb + f8tc )) # # # Dans l'ERFS, les prelevement libératoire sur les montants non déclarés # # sont intégrés. Pas possible de le recalculer. # # # impot sur le revenu du foyer (hors prélèvement libératoire, revenus au quotient) # irpp = -(mciria + ppetot - mcirra ) build_column('jour_xyz', IntCol(default = 360, entity = "foy", label = u"Jours décomptés au titre de cette déclaration")) build_column('rfr_n_1', IntCol(entity = 'foy', label = u"Revenu fiscal de référence année n - 1", val_type = "monetary")) build_column('rfr_n_2', IntCol(entity = 'foy', label = u"Revenu fiscal de référence année n - 2", val_type = "monetary")) build_column('nbptr_n_2', PeriodSizeIndependentIntCol(entity = 'foy', label = u"Nombre de parts année n - 2", val_type = "monetary")) ############################################################################### # # Initialisation de quelques variables utiles pour la suite ############################################################################### @reference_formula class age(SimpleFormulaColumn): base_function = missing_value column = AgeCol(val_type = "age") entity_class = Individus label = u"Âge (en années)" def function(self, simulation, period): has_birth = simulation.get_or_new_holder('birth')._array is not None if not has_birth: has_age_en_mois = bool(simulation.get_or_new_holder('age_en_mois')._array_by_period) if has_age_en_mois: return period, simulation.calculate('age_en_mois', period) // 12 # If age is known at the same day of another year, compute the new age from it. holder = self.holder start = period.start if holder._array_by_period is not None: for last_period, last_array in sorted(holder._array_by_period.iteritems(), reverse = True): last_start = last_period.start if last_start.day == start.day: return period, last_array + int((start.year - last_start.year) + (start.month - last_start.month) / 12) birth = simulation.calculate('birth', period) return period, (datetime64(period.start) - birth).astype('timedelta64[Y]') @reference_formula class age_en_mois(SimpleFormulaColumn): base_function = missing_value column = AgeCol(val_type = "months") entity_class = Individus label = u"Âge (en mois)" def function(self, simulation, period): # If age_en_mois is known at the same day of another month, compute the new age_en_mois from it. holder = self.holder start = period.start if holder._array_by_period is not None: for last_period, last_array in sorted(holder._array_by_period.iteritems(), reverse = True): last_start = last_period.start if last_start.day == start.day: return period, last_array + ((start.year - last_start.year) * 12 + (start.month - last_start.month)) has_birth = simulation.get_or_new_holder('birth')._array is not None if not has_birth: has_age = bool(simulation.get_or_new_holder('age')._array_by_period) if has_age: return period, simulation.calculate('age', period) * 12 birth = simulation.calculate('birth', period) return period, (datetime64(period.start) - birth).astype('timedelta64[M]') @reference_formula class nb_adult(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Nombre d'adulte(s) dans le foyer fiscal" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) celdiv = simulation.calculate('celdiv', period) veuf = simulation.calculate('veuf', period) return period, 2 * marpac + 1 * (celdiv | veuf) @reference_formula class nb_pac(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Nombre de personnes à charge dans le foyer fiscal" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') nbF = simulation.calculate('nbF', period) nbJ = simulation.calculate('nbJ', period) nbR = simulation.calculate('nbR', period) return period, nbF + nbJ + nbR @reference_formula class enfant_a_charge(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"Enfant à charge non marié, de moins de 18 ans au 1er janvier de l'année de perception des" \ u" revenus, ou né durant la même année, ou handicapés quel que soit son âge" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') age = simulation.calculate('age', period) alt = simulation.calculate('alt', period) invalide = simulation.calculate('invalide', period) quifoy = simulation.calculate('quifoy', period) return period, and_(and_(quifoy >= 2, or_(age < 18, invalide)), not_(alt)) @reference_formula class nbF(PersonToEntityColumn): cerfa_field = u'F' entity_class = FoyersFiscaux label = u"Nombre d'enfants à charge non mariés, de moins de 18 ans au 1er janvier de l'année de perception des" \ u" revenus, ou nés durant la même année ou handicapés quel que soit leur âge" operation = 'add' variable = enfant_a_charge @reference_formula class nombre_enfants_a_charge_menage(PersonToEntityColumn): entity_class = Menages label = u"Nombre d'enfants à charge non mariés, de moins de 18 ans au 1er janvier de l'année de perception des" \ u" revenus, ou nés durant la même année ou handicapés quel que soit leur âge" operation = 'add' variable = enfant_a_charge @reference_formula class enfant_a_charge_invalide(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"Enfant à charge titulaire de la carte d'invalidité" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') alt = simulation.calculate('alt', period) invalide = simulation.calculate('invalide', period) quifoy = simulation.calculate('quifoy', period) return period, and_(and_(quifoy >= 2, invalide), not_(alt)) @reference_formula class nbG(PersonToEntityColumn): cerfa_field = u'G' entity_class = FoyersFiscaux label = u"Nombre d'enfants à charge titulaires de la carte d'invalidité" operation = 'add' variable = enfant_a_charge_invalide @reference_formula class enfant_a_charge_garde_alternee(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"Enfant à charge en résidence alternée, non marié, de moins de 18 ans au 1er janvier de l'année de" \ u" perception des revenus, ou né durant la même année ou handicapés quel que soit son âge" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') age = simulation.calculate('age', period) alt = simulation.calculate('alt', period) invalide = simulation.calculate('invalide', period) quifoy = simulation.calculate('quifoy', period) return period, and_(and_(quifoy >= 2, or_(age < 18, invalide)), alt) @reference_formula class nbH(PersonToEntityColumn): cerfa_field = u'H' entity_class = FoyersFiscaux label = u"Nombre d'enfants à charge en résidence alternée, non mariés de moins de 18 ans au 1er janvier de" \ u" l'année de perception des revenus, ou nés durant la même année ou handicapés quel que soit leur âge" operation = 'add' variable = enfant_a_charge_garde_alternee @reference_formula class enfant_a_charge_garde_alternee_invalide(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"Enfant à charge en résidence alternée titulaire de la carte d'invalidité" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') alt = simulation.calculate('alt', period) invalide = simulation.calculate('invalide', period) quifoy = simulation.calculate('quifoy', period) return period, and_(and_(quifoy >= 2, invalide), alt) @reference_formula class nbI(PersonToEntityColumn): cerfa_field = u'I' entity_class = FoyersFiscaux label = u"Nombre d'enfants à charge en résidence alternée titulaires de la carte d'invalidité" operation = 'add' variable = enfant_a_charge_garde_alternee_invalide @reference_formula class enfant_majeur_celibataire_sans_enfant(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"Enfant majeur célibataire sans enfant" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') age = simulation.calculate('age', period) invalide = simulation.calculate('invalide', period) quifoy = simulation.calculate('quifoy', period) return period, and_(and_(quifoy >= 2, age >= 18), not_(invalide)) @reference_formula class nbJ(PersonToEntityColumn): cerfa_field = u'J' entity_class = FoyersFiscaux label = u"Nombre d'enfants majeurs célibataires sans enfant" operation = 'add' variable = enfant_majeur_celibataire_sans_enfant @reference_formula class nombre_enfants_majeurs_celibataires_sans_enfant(PersonToEntityColumn): entity_class = Menages label = u"Nombre d'enfants majeurs célibataires sans enfant" operation = 'add' variable = enfant_majeur_celibataire_sans_enfant @reference_formula class marpac(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = FoyersFiscaux label = u"marpac" def function(self, simulation, period): ''' Marié (1) ou Pacsé (5) 'foy' ''' period = period.start.offset('first-of', 'year').period('year') statmarit_holder = simulation.compute('statmarit', period) statmarit = self.filter_role(statmarit_holder, role = VOUS) return period, (statmarit == 1) | (statmarit == 5) @reference_formula class celdiv(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = FoyersFiscaux label = u"celdiv" def function(self, simulation, period): ''' Célibataire (2) ou divorcé (3) 'foy' ''' period = period.start.offset('first-of', 'year').period('year') statmarit_holder = simulation.compute('statmarit', period) statmarit = self.filter_role(statmarit_holder, role = VOUS) return period, (statmarit == 2) | (statmarit == 3) @reference_formula class veuf(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = FoyersFiscaux label = u"veuf" def function(self, simulation, period): ''' Veuf (4) 'foy' ''' period = period.start.offset('first-of', 'year').period('year') statmarit_holder = simulation.compute('statmarit', period) statmarit = self.filter_role(statmarit_holder, role = VOUS) return period, statmarit == 4 @reference_formula class jveuf(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = FoyersFiscaux label = u"jveuf" def function(self, simulation, period): ''' Jeune Veuf 'foy' ''' period = period.start.offset('first-of', 'year').period('year') statmarit_holder = simulation.compute('statmarit', period) statmarit = self.filter_role(statmarit_holder, role = VOUS) return period, statmarit == 6 ############################################################################### # # Revenus catégoriels ############################################################################### @reference_formula class rev_sal(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Revenu imposé comme des salaires (salaires, mais aussi 3vj, 3vk)" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') salaire_imposable = simulation.calculate_add('salaire_imposable', period) cho = simulation.calculate('cho', period) return period, salaire_imposable + cho @reference_formula class salcho_imp(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Salaires et chômage imposables après abattements" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') rev_sal = simulation.calculate('rev_sal', period) cho_ld = simulation.calculate('cho_ld', period) fra = simulation.calculate('fra', period) abatpro = simulation.legislation_at(period.start).ir.tspr.abatpro amin = abatpro.min * not_(cho_ld) + abatpro.min2 * cho_ld abatfor = round(min_(max_(abatpro.taux * rev_sal, amin), abatpro.max)) return period, (fra > abatfor) * (rev_sal - fra) + (fra <= abatfor) * max_(0, rev_sal - abatfor) @reference_formula class rev_act_sal(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"rev_act_sal" def function(self, simulation, period): ''' Revenus d'activités salariées''' period = period.start.offset('first-of', 'year').period('year') salaire_imposable = simulation.calculate_add('salaire_imposable', period) return period, salaire_imposable @reference_formula class rev_act_nonsal(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"rev_act_nonsal" def function(self, simulation, period): ''' Revenus d'activités non salariées ''' period = period.start.offset('first-of', 'year').period('year') rpns_i = simulation.calculate('rpns_i', period) return period, rpns_i # TODO: vérifier cette définition @reference_formula class rev_act(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"rev_act" def function(self, simulation, period): ''' Revenus d'activités ''' period = period.start.offset('first-of', 'year').period('year') rev_act_nonsal = simulation.calculate('rev_act_nonsal', period) rev_act_sal = simulation.calculate('rev_act_sal', period) return period, rev_act_nonsal + rev_act_sal @reference_formula class rev_pen(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Revenu imposé comme des pensions (retraites, pensions alimentaires, etc.)" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') pensions_alimentaires_percues = simulation.calculate('pensions_alimentaires_percues', period) pensions_alimentaires_percues_decl = simulation.calculate('pensions_alimentaires_percues_decl', period) rst = simulation.calculate('rst', period) return period, pensions_alimentaires_percues * pensions_alimentaires_percues_decl + rst @reference_formula class pen_net(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Pensions après abattements" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') rev_pen = simulation.calculate('rev_pen', period) abatpen = simulation.legislation_at(period.start).ir.tspr.abatpen # TODO: problème car les pensions sont majorées au niveau du foyer # d11 = ( AS + BS + CS + DS + ES + # AO + BO + CO + DO + EO ) # penv2 = (d11-f11> abatpen.max)*(penv + (d11-f11-abatpen.max)) + (d11-f11<= abatpen.max)*penv # Plus d'abatement de 20% en 2006 return period, max_(0, rev_pen - round(max_(abatpen.taux * rev_pen , abatpen.min))) # return max_(0, rev_pen - min_(round(max_(abatpen.taux*rev_pen , abatpen.min)), abatpen.max)) le max se met au niveau du foyer @reference_formula class indu_plaf_abat_pen(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"indu_plaf_abat_pen" def function(self, simulation, period): """ Plafonnement de l'abattement de 10% sur les pensions du foyer 'foy' """ period = period.start.offset('first-of', 'year').period('year') rev_pen_holder = simulation.compute('rev_pen', period) pen_net_holder = simulation.compute('pen_net', period) abatpen = simulation.legislation_at(period.start).ir.tspr.abatpen pen_net = self.sum_by_entity(pen_net_holder) rev_pen = self.sum_by_entity(rev_pen_holder) abat = rev_pen - pen_net return period, abat - min_(abat, abatpen.max) @reference_formula class abat_sal_pen(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Abattement de 20% sur les salaires" start_date = date(2002, 1, 1) stop_date = date(2005, 12, 31) def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') salcho_imp = simulation.calculate('salcho_imp', period) pen_net = simulation.calculate('pen_net', period) abatsalpen = simulation.legislation_at(period.start).ir.tspr.abatsalpen return period, min_(abatsalpen.taux * max_(salcho_imp + pen_net, 0), abatsalpen.max) @reference_formula class sal_pen_net(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Salaires et pensions après abattement de 20% sur les salaires" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') salcho_imp = simulation.calculate('salcho_imp', period) pen_net = simulation.calculate('pen_net', period) abat_sal_pen = simulation.calculate('abat_sal_pen', period) return period, salcho_imp + pen_net - abat_sal_pen @reference_formula class rto(SimpleFormulaColumn): """Rentes viagères à titre onéreux (avant abattements) Annuel pour les impôts mais mensuel pour la base ressource des minimas sociaux donc mensuel. """ calculate_output = calculate_output_add column = FloatCol entity_class = FoyersFiscaux label = u"Rentes viagères (rentes à titre onéreux)" set_input = set_input_divide_by_period url = u"http://fr.wikipedia.org/wiki/Rente_viagère" def function(self, simulation, period): year = period.start.period(u'year').offset('first-of') period = period.start.offset('first-of', 'month').period('month') f1aw = simulation.calculate('f1aw', year) f1bw = simulation.calculate('f1bw', year) f1cw = simulation.calculate('f1cw', year) f1dw = simulation.calculate('f1dw', year) return period, (f1aw + f1bw + f1cw + f1dw) / 12 @reference_formula class rto_declarant1(EntityToPersonColumn): entity_class = Individus label = u"Rentes viagères (rentes à titre onéreux) (pour le premier déclarant du foyer fiscal)" role = VOUS variable = rto @reference_formula class rto_net(SimpleFormulaColumn): column = FloatCol entity_class = FoyersFiscaux label = u"Rentes viagères après abattements" url = u"http://www.lafinancepourtous.fr/Vie-professionnelle-et-retraite/Retraite/Epargne-retraite/La-rente-viagere/La-fiscalite-de-la-rente-viagere" # noqa def function(self, simulation, period): period = period.start.period(u'year').offset('first-of') f1aw = simulation.calculate('f1aw', period) f1bw = simulation.calculate('f1bw', period) f1cw = simulation.calculate('f1cw', period) f1dw = simulation.calculate('f1dw', period) abatviag = simulation.legislation_at(period.start).ir.tspr.abatviag return period, round(abatviag.taux1 * f1aw + abatviag.taux2 * f1bw + abatviag.taux3 * f1cw + abatviag.taux4 * f1dw) @reference_formula class rto_net_declarant1(EntityToPersonColumn): entity_class = Individus label = u"Rentes viagères après abattements (pour le premier déclarant du foyer fiscal)" role = VOUS variable = rto_net @reference_formula class tspr(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Traitements salaires pensions et rentes individuelles" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') sal_pen_net = simulation.calculate('sal_pen_net', period) # Quand tspr est calculé sur une année glissante, rto_net_declarant1 est calculé sur l'année légale # correspondante. rto_net_declarant1 = simulation.calculate('rto_net_declarant1', period.offset('first-of')) return period, sal_pen_net + rto_net_declarant1 @reference_formula class rev_cat_pv(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Revenu catégoriel - Plus-values" start_date = date(2013, 1, 1) url = "http://www.insee.fr/fr/methodes/default.asp?page=definitions/revenus-categoriesl.htm" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') f3vg = simulation.calculate('f3vg', period) f3vh = simulation.calculate('f3vh', period) return period, f3vg - f3vh @reference_formula class rev_cat_tspr(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Revenu catégoriel - Traitements, salaires, pensions et rentes" url = "http://www.insee.fr/fr/methodes/default.asp?page=definitions/revenus-categoriesl.htm" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') tspr_holder = simulation.compute('tspr', period) indu_plaf_abat_pen = simulation.calculate('indu_plaf_abat_pen', period) tspr = self.sum_by_entity(tspr_holder) return period, tspr + indu_plaf_abat_pen @reference_formula class deficit_rcm(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Deficit capitaux mobiliers" start_date = date(2009, 1, 1) url = "http://www.lefigaro.fr/impots/2008/04/25/05003-20080425ARTFIG00254-les-subtilites-des-revenus-de-capitaux-mobiliers-.php" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') f2aa = simulation.calculate('f2aa', period) f2al = simulation.calculate('f2al', period) f2am = simulation.calculate('f2am', period) f2an = simulation.calculate('f2an', period) f2aq = simulation.calculate('f2aq', period) f2ar = simulation.calculate('f2ar', period) _P = simulation.legislation_at(period.start) return period, f2aa + f2al + f2am + f2an + f2aq + f2ar @reference_formula class rev_cat_rvcm(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Revenu catégoriel - Capitaux" url = "http://www.insee.fr/fr/methodes/default.asp?page=definitions/revenus-categoriesl.htm" @dated_function(start = date(2002, 1, 1), stop = date(2004, 12, 31)) def function_20020101_20041231(self, simulation, period): """ Revenus des valeurs et capitaux mobiliers """ period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) deficit_rcm = simulation.calculate('deficit_rcm', period) f2ch = simulation.calculate('f2ch', period) f2dc = simulation.calculate('f2dc', period) f2ts = simulation.calculate('f2ts', period) f2ca = simulation.calculate('f2ca', period) f2fu = simulation.calculate('f2fu', period) f2go = simulation.calculate('f2go', period) f2gr = simulation.calculate('f2gr', period) f2tr = simulation.calculate('f2tr', period) _P = simulation.legislation_at(period.start) finpfl = simulation.legislation_at(period.start).ir.autre.finpfl rvcm = simulation.legislation_at(period.start).ir.rvcm f2dc_bis = f2dc f2tr_bis = f2tr # # Calcul du revenu catégoriel # 1.2 Revenus des valeurs et capitaux mobiliers b12 = min_(f2ch, rvcm.abat_assvie * (1 + marpac)) TOT1 = f2ch - b12 # c12 # Part des frais s'imputant sur les revenus déclarés case DC den = ((f2dc_bis + f2ts) != 0) * (f2dc_bis + f2ts) + ((f2dc_bis + f2ts) == 0) F1 = f2ca / den * f2dc_bis # f12 # Revenus de capitaux mobiliers nets de frais, ouvrant droit à abattement # partie négative (à déduire des autres revenus nets de frais d'abattements g12a = -min_(f2dc_bis * (1 - rvcm.abatmob_taux) - F1, 0) # partie positive g12b = max_(f2dc_bis * (1 - rvcm.abatmob_taux) - F1, 0) rev = g12b + f2gr + f2fu * (1 - rvcm.abatmob_taux) # Abattements, limité au revenu h12 = rvcm.abatmob * (1 + marpac) TOT2 = max_(0, rev - h12) # i121= -min_(0,rev - h12) # Part des frais s'imputant sur les revenus déclarés ligne TS F2 = f2ca - F1 TOT3 = (f2ts - F2) + f2go * rvcm.majGO + f2tr_bis - g12a DEF = deficit_rcm return period, max_(TOT1 + TOT2 + TOT3 - DEF, 0) @dated_function(start = date(2005, 1, 1), stop = date(2012, 12, 31)) def function_20050101_20121231(self, simulation, period): """ Revenus des valeurs et capitaux mobiliers """ period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) deficit_rcm = simulation.calculate('deficit_rcm', period) f2ch = simulation.calculate('f2ch', period) f2dc = simulation.calculate('f2dc', period) f2ts = simulation.calculate('f2ts', period) f2ca = simulation.calculate('f2ca', period) f2fu = simulation.calculate('f2fu', period) f2go = simulation.calculate('f2go', period) f2gr = simulation.calculate('f2gr', period) f2tr = simulation.calculate('f2tr', period) finpfl = simulation.legislation_at(period.start).ir.autre.finpfl rvcm = simulation.legislation_at(period.start).ir.rvcm # Add f2da to f2dc and f2ee to f2tr when no PFL f2dc_bis = f2dc f2tr_bis = f2tr # # Calcul du revenu catégoriel # 1.2 Revenus des valeurs et capitaux mobiliers b12 = min_(f2ch, rvcm.abat_assvie * (1 + marpac)) TOT1 = f2ch - b12 # c12 # Part des frais s'imputant sur les revenus déclarés case DC den = ((f2dc_bis + f2ts) != 0) * (f2dc_bis + f2ts) + ((f2dc_bis + f2ts) == 0) F1 = f2ca / den * f2dc_bis # f12 # Revenus de capitaux mobiliers nets de frais, ouvrant droit à abattement # partie négative (à déduire des autres revenus nets de frais d'abattements g12a = -min_(f2dc_bis * (1 - rvcm.abatmob_taux) - F1, 0) # partie positive g12b = max_(f2dc_bis * (1 - rvcm.abatmob_taux) - F1, 0) rev = g12b + f2gr + f2fu * (1 - rvcm.abatmob_taux) # Abattements, limité au revenu h12 = rvcm.abatmob * (1 + marpac) TOT2 = max_(0, rev - h12) # i121= -min_(0,rev - h12) # Part des frais s'imputant sur les revenus déclarés ligne TS F2 = f2ca - F1 TOT3 = (f2ts - F2) + f2go * rvcm.majGO + f2tr_bis - g12a DEF = deficit_rcm return period, max_(TOT1 + TOT2 + TOT3 - DEF, 0) @dated_function(start = date(2013, 1, 1), stop = date(2015, 12, 31)) def function_20130101_20151231(self, simulation, period): """ Revenus des valeurs et capitaux mobiliers """ period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) deficit_rcm = simulation.calculate('deficit_rcm', period) f2ch = simulation.calculate('f2ch', period) f2dc = simulation.calculate('f2dc', period) f2ts = simulation.calculate('f2ts', period) f2ca = simulation.calculate('f2ca', period) f2fu = simulation.calculate('f2fu', period) f2go = simulation.calculate('f2go', period) f2tr = simulation.calculate('f2tr', period) f2da = simulation.calculate('f2da', period) f2ee = simulation.calculate('f2ee', period) finpfl = simulation.legislation_at(period.start).ir.autre.finpfl rvcm = simulation.legislation_at(period.start).ir.rvcm # Add f2da to f2dc and f2ee to f2tr when no PFL f2dc_bis = f2dc + f2da # TODO: l'abattement de 40% est déduit uniquement en l'absence de revenus déclarés case 2DA f2tr_bis = f2tr + f2ee # # Calcul du revenu catégoriel # 1.2 Revenus des valeurs et capitaux mobiliers b12 = min_(f2ch, rvcm.abat_assvie * (1 + marpac)) TOT1 = f2ch - b12 # c12 # Part des frais s'imputant sur les revenus déclarés case DC den = ((f2dc_bis + f2ts) != 0) * (f2dc_bis + f2ts) + ((f2dc_bis + f2ts) == 0) F1 = f2ca / den * f2dc_bis # f12 # Revenus de capitaux mobiliers nets de frais, ouvrant droit à abattement # partie négative (à déduire des autres revenus nets de frais d'abattements g12a = -min_(f2dc_bis * (1 - rvcm.abatmob_taux) - F1, 0) # partie positive g12b = max_(f2dc_bis * (1 - rvcm.abatmob_taux) - F1, 0) rev = g12b + f2fu * (1 - rvcm.abatmob_taux) # Abattements, limité au revenu h12 = rvcm.abatmob * (1 + marpac) TOT2 = max_(0, rev - h12) # i121= -min_(0,rev - h12) # Part des frais s'imputant sur les revenus déclarés ligne TS F2 = f2ca - F1 TOT3 = (f2ts - F2) + f2go * rvcm.majGO + f2tr_bis - g12a DEF = deficit_rcm return period, max_(TOT1 + TOT2 + TOT3 - DEF, 0) @reference_formula class rfr_rvcm(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"rfr_rvcm" def function(self, simulation, period): ''' Abattements sur rvcm à réintégrer dans le revenu fiscal de référence ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f2dc = simulation.calculate('f2dc', period) f2ts = simulation.calculate('f2ts', period) f2ca = simulation.calculate('f2ca', period) f2gr = simulation.calculate('f2gr', period) f2fu = simulation.calculate('f2fu', period) f2da = simulation.calculate('f2da', period) finpfl = simulation.legislation_at(period.start).ir.autre.finpfl rvcm = simulation.legislation_at(period.start).ir.rvcm if finpfl: f2dc_bis = f2dc + f2da else: f2dc_bis = f2dc # Calcul de i121 # Part des frais s'imputant sur les revenus déclarés case DC den = ((f2dc_bis + f2ts) != 0) * (f2dc_bis + f2ts) + ((f2dc_bis + f2ts) == 0) F1 = f2ca / den * f2dc_bis # f12 # Revenus de capitaux mobiliers nets de frais, ouvrant droit à abattement # partie positive g12b = max_(f2dc_bis * (1 - rvcm.abatmob_taux) - F1, 0) rev = g12b + f2gr + f2fu * (1 - rvcm.abatmob_taux) # Abattements, limité au revenu h12 = rvcm.abatmob * (1 + marpac) i121 = - min_(0, rev - h12) return period, max_((rvcm.abatmob_taux) * (f2dc_bis + f2fu) - i121, 0) @reference_formula class rev_cat_rfon(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Revenu catégoriel - Foncier" url = "http://www.insee.fr/fr/methodes/default.asp?page=definitions/revenus-categoriesl.htm" def function(self, simulation, period): """ Revenus fonciers TODO: add assert in validator """ period = period.start.offset('first-of', 'year').period('year') f4ba = simulation.calculate('f4ba', period) f4bb = simulation.calculate('f4bb', period) f4bc = simulation.calculate('f4bc', period) f4bd = simulation.calculate('f4bd', period) f4be = simulation.calculate('f4be', period) microfoncier = simulation.legislation_at(period.start).ir.microfoncier # # Calcul du revenu catégoriel if ((f4be != 0) & ((f4ba != 0) | (f4bb != 0) | (f4bc != 0))).any(): log.error(("Problème de déclarations des revenus : incompatibilité de la déclaration des revenus fonciers (f4ba, f4bb, f4bc) et microfonciers (f4be)")) a13 = f4ba + f4be - microfoncier.taux * f4be * (f4be <= microfoncier.max) b13 = f4bb c13 = a13 - b13 d13 = f4bc e13 = c13 - d13 * (c13 >= 0) f13 = f4bd * (e13 >= 0) g13 = max_(0, e13 - f13) rev_cat_rfon = (c13 >= 0) * (g13 + e13 * (e13 < 0)) - (c13 < 0) * d13 return period, rev_cat_rfon @reference_formula class rev_cat_rpns(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Revenu catégoriel - Rpns" url = "http://www.insee.fr/fr/methodes/default.asp?page=definitions/revenus-categoriesl.htm" def function(self, simulation, period): ''' Revenus personnels non salariés 'foy' ''' period = period.start.offset('first-of', 'year').period('year') nbnc_pvce_holder = simulation.compute('nbnc_pvce', period) mbic_mvct = simulation.calculate('mbic_mvct', period) rpns_i_holder = simulation.compute('rpns_i', period) defrag = simulation.calculate('defrag', period) defacc = simulation.calculate('defacc', period) defncn = simulation.calculate('defncn', period) defmeu = simulation.calculate('defmeu', period) return period, ( self.sum_by_entity(rpns_i_holder) - self.sum_by_entity(nbnc_pvce_holder) - defrag - defncn - defacc - defmeu - mbic_mvct ) @reference_formula class rev_cat(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Revenus catégoriels" url = "http://www.insee.fr/fr/methodes/default.asp?page=definitions/revenus-categoriesl.htm" def function(self, simulation, period): ''' Revenus Categoriels ''' period = period.start.offset('first-of', 'year').period('year') rev_cat_tspr = simulation.calculate('rev_cat_tspr', period) rev_cat_rvcm = simulation.calculate('rev_cat_rvcm', period) rev_cat_rfon = simulation.calculate('rev_cat_rfon', period) rev_cat_rpns = simulation.calculate('rev_cat_rpns', period) rev_cat_pv = simulation.calculate('rev_cat_pv', period) return period, rev_cat_tspr + rev_cat_rvcm + rev_cat_rfon + rev_cat_rpns + rev_cat_pv ############################################################################### # # Déroulé du calcul de l'irpp ############################################################################### @reference_formula class deficit_ante(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Déficit global antérieur" url = "http://impotsurlerevenu.org/declaration-de-revenus-fonciers-2044/796-deficits-anterieurs-restant-a-imputer-cadre-450.php" def function(self, simulation, period): ''' Déficits antérieurs ''' period = period.start.offset('first-of', 'year').period('year') f6fa = simulation.calculate('f6fa', period) f6fb = simulation.calculate('f6fb', period) f6fc = simulation.calculate('f6fc', period) f6fd = simulation.calculate('f6fd', period) f6fe = simulation.calculate('f6fe', period) f6fl = simulation.calculate('f6fl', period) return period, f6fa + f6fb + f6fc + f6fd + f6fe + f6fl @reference_formula class rbg(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Revenu brut global" url = "http://www.documentissime.fr/dossiers-droit-pratique/dossier-19-l-impot-sur-le-revenu-les-modalites-generales-d-imposition/la-determination-du-revenu-imposable/le-revenu-brut-global.html" def function(self, simulation, period): '''Revenu brut global ''' period = period.start.offset('first-of', 'year').period('year') rev_cat = simulation.calculate('rev_cat', period) deficit_ante = simulation.calculate('deficit_ante', period) f6gh = simulation.calculate('f6gh', period) nbic_impm_holder = simulation.compute('nbic_impm', period) nacc_pvce_holder = simulation.compute('nacc_pvce', period) cga = simulation.legislation_at(period.start).ir.rpns.cga_taux2 # (Total 17) # sans les revenus au quotient nacc_pvce = self.sum_by_entity(nacc_pvce_holder) return period, max_(0, rev_cat + f6gh + (self.sum_by_entity(nbic_impm_holder) + nacc_pvce) * (1 + cga) - deficit_ante) @reference_formula class csg_deduc_patrimoine(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Csg déductible sur le patrimoine" url = "http://www.impots.gouv.fr/portal/dgi/public/particuliers.impot?pageId=part_ctrb_soc&typePage=cpr02&sfid=503&espId=1&communaute=1&impot=CS" def function(self, simulation, period): ''' CSG déductible sur les revenus du patrimoine http://bofip.impots.gouv.fr/bofip/887-PGP ''' period = period.start.offset('first-of', 'year').period('year') f6de = simulation.calculate('f6de', period) return period, max_(f6de, 0) @reference_formula class csg_deduc_patrimoine_simulated(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Csg déductible sur le patrimoine simulée" url = "http://www.impots.gouv.fr/portal/dgi/public/particuliers.impot?pageId=part_ctrb_soc&typePage=cpr02&sfid=503&espId=1&communaute=1&impot=CS" def function(self, simulation, period): ''' Cette fonction simule le montant mentionné dans la case f6de de la déclaration 2042 http://bofip.impots.gouv.fr/bofip/887-PGP ''' period = period.start.offset('first-of', 'year').period('year') rev_cat_rfon = simulation.calculate('rev_cat_rfon', period) rev_cap_bar = simulation.calculate('rev_cap_bar', period) rto = simulation.calculate('rto', period) taux = simulation.legislation_at(period.start).csg.capital.deduc patrimoine_deduc = rev_cat_rfon + rev_cap_bar + rto return period, taux * patrimoine_deduc @reference_formula class csg_deduc(SimpleFormulaColumn): # f6de column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Csg déductible sur le patrimoine" url = "http://www.impots.gouv.fr/portal/dgi/public/particuliers.impot?pageId=part_ctrb_soc&typePage=cpr02&sfid=503&espId=1&communaute=1&impot=CS" def function(self, simulation, period): ''' CSG déductible ''' period = period.start.offset('first-of', 'year').period('year') rbg = simulation.calculate('rbg', period) csg_deduc_patrimoine = simulation.calculate('csg_deduc_patrimoine', period) # min_(f6de, max_(rbg, 0)) return period, min_(csg_deduc_patrimoine, max_(rbg, 0)) @reference_formula class rng(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Revenu net global" url = "http://impotsurlerevenu.org/definitions/114-revenu-net-global.php" def function(self, simulation, period): ''' Revenu net global (total 20) ''' period = period.start.offset('first-of', 'year').period('year') rbg = simulation.calculate('rbg', period) csg_deduc = simulation.calculate('csg_deduc', period) charges_deduc = simulation.calculate('charges_deduc', period) return period, max_(0, rbg - csg_deduc - charges_deduc) @reference_formula class rni(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Revenu net imposable" url = "http://impotsurlerevenu.org/definitions/115-revenu-net-imposable.php" def function(self, simulation, period): ''' Revenu net imposable ou déficit à reporter''' period = period.start.offset('first-of', 'year').period('year') rng = simulation.calculate('rng', period) abat_spe = simulation.calculate('abat_spe', period) return period, rng - abat_spe @reference_formula class ir_brut(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Impot sur le revenu brut avant non imposabilité et plafonnement du quotient" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('year') nbptr = simulation.calculate('nbptr', period) taux_effectif = simulation.calculate('taux_effectif', period) rni = simulation.calculate('rni', period) bareme = simulation.legislation_at(period.start).ir.bareme return period, (taux_effectif == 0) * nbptr * bareme.calc(rni / nbptr) + taux_effectif * rni @reference_formula class ir_ss_qf(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"ir_ss_qf" def function(self, simulation, period): ''' Impôt sans quotient familial ''' period = period.start.offset('first-of', 'year').period('year') ir_brut = simulation.calculate('ir_brut', period) rni = simulation.calculate('rni', period) nb_adult = simulation.calculate('nb_adult', period) bareme = simulation.legislation_at(period.start).ir.bareme A = bareme.calc(rni / nb_adult) return period, nb_adult * A @reference_formula class ir_plaf_qf(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"ir_plaf_qf" def function(self, simulation, period): ''' Impôt après plafonnement du quotient familial et réduction complémentaire ''' period = period.start.offset('first-of', 'year').period('year') ir_brut = simulation.calculate('ir_brut', period) ir_ss_qf = simulation.calculate('ir_ss_qf', period) nb_adult = simulation.calculate('nb_adult', period) nb_pac = simulation.calculate('nb_pac', period) nbptr = simulation.calculate('nbptr', period) marpac = simulation.calculate('marpac', period) veuf = simulation.calculate('veuf', period) jveuf = simulation.calculate('jveuf', period) celdiv = simulation.calculate('celdiv', period) caseE = simulation.calculate('caseE', period) caseF = simulation.calculate('caseF', period) caseG = simulation.calculate('caseG', period) caseH = simulation.calculate('caseH', period) caseK = simulation.calculate('caseK', period) caseN = simulation.calculate('caseN', period) caseP = simulation.calculate('caseP', period) caseS = simulation.calculate('caseS', period) caseT = simulation.calculate('caseT', period) caseW = simulation.calculate('caseW', period) nbF = simulation.calculate('nbF', period) nbG = simulation.calculate('nbG', period) nbH = simulation.calculate('nbH', period) nbI = simulation.calculate('nbI', period) nbR = simulation.calculate('nbR', period) plafond_qf = simulation.legislation_at(period.start).ir.plafond_qf A = ir_ss_qf I = ir_brut aa0 = (nbptr - nb_adult) * 2 # nombre de demi part excédant nbadult # on dirait que les impôts font une erreur sur aa1 (je suis obligé de # diviser par 2) aa1 = min_((nbptr - 1) * 2, 2) / 2 # deux première demi part excédants une part aa2 = max_((nbptr - 2) * 2, 0) # nombre de demi part restantes # celdiv parents isolés condition61 = celdiv & caseT B1 = plafond_qf.celib_enf * aa1 + plafond_qf.marpac * aa2 # tous les autres B2 = plafond_qf.marpac * aa0 # si autre # celdiv, veufs (non jveuf) vivants seuls et autres conditions # TODO: année en dur... pour caseH condition63 = (celdiv | (veuf & not_(jveuf))) & not_(caseN) & (nb_pac == 0) & (caseK | caseE) & (caseH < 1981) B3 = plafond_qf.celib B = B1 * condition61 + \ B2 * (not_(condition61 | condition63)) + \ B3 * (condition63 & not_(condition61)) C = max_(0, A - B) # Impôt après plafonnement IP0 = max_(I, C) # 6.2 réduction d'impôt pratiquée sur l'impot après plafonnement et le cas particulier des DOM # pas de réduction complémentaire condition62a = (I >= C) # réduction complémentaire condition62b = (I < C) # celdiv veuf condition62caa0 = (celdiv | (veuf & not_(jveuf))) condition62caa1 = (nb_pac == 0) & (caseP | caseG | caseF | caseW) condition62caa2 = caseP & ((nbF - nbG > 0) | (nbH - nbI > 0)) condition62caa3 = not_(caseN) & (caseE | caseK) & (caseH >= 1981) condition62caa = condition62caa0 & (condition62caa1 | condition62caa2 | condition62caa3) # marié pacs condition62cab = (marpac | jveuf) & caseS & not_(caseP | caseF) condition62ca = (condition62caa | condition62cab) # plus de 590 euros si on a des plus de condition62cb = ((nbG + nbR + nbI) > 0) | caseP | caseF D = plafond_qf.reduc_postplafond * (condition62ca + ~condition62ca * condition62cb * ( 1 * caseP + 1 * caseF + nbG + nbR + nbI / 2)) E = max_(0, A - I - B) Fo = D * (D <= E) + E * (E < D) IP1 = IP0 - Fo # TODO: 6.3 Cas particulier: Contribuables domiciliés dans les DOM. # conditionGuadMarReu = # conditionGuyane= # conitionDOM = conditionGuadMarReu | conditionGuyane # postplafGuadMarReu = 5100 # postplafGuyane = 6700 # IP2 = IP1 - conditionGuadMarReu*min( postplafGuadMarReu,.3*IP1) - conditionGuyane*min(postplafGuyane,.4*IP1) # Récapitulatif return period, condition62a * IP0 + condition62b * IP1 # IP2 si DOM @reference_formula class avantage_qf(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"avantage_qf" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') ir_ss_qf = simulation.calculate('ir_ss_qf', period) ir_plaf_qf = simulation.calculate('ir_plaf_qf', period) return period, ir_ss_qf - ir_plaf_qf @reference_formula class decote(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"décote" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') ir_plaf_qf = simulation.calculate('ir_plaf_qf', period) decote = simulation.legislation_at(period.start).ir.decote return period, (ir_plaf_qf < decote.seuil) * (decote.seuil - ir_plaf_qf) * 0.5 @reference_formula class nat_imp(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = FoyersFiscaux label = u"nat_imp" def function(self, simulation, period): ''' Renvoie True si le foyer est imposable, False sinon ''' period = period.start.offset('first-of', 'year').period('year') iai = simulation.calculate('iai', period) credits_impot = simulation.calculate('credits_impot', period) cehr = simulation.calculate('cehr', period) # def _nat_imp(rni, nbptr, non_imposable = law.ir.non_imposable): # seuil = non_imposable.seuil + (nbptr - 1)*non_imposable.supp return period, (iai - credits_impot + cehr) > 0 @reference_formula class ip_net(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"ip_net" def function(self, simulation, period): ''' irpp après décote ''' period = period.start.offset('first-of', 'year').period('year') ir_plaf_qf = simulation.calculate('ir_plaf_qf', period) cncn_info_holder = simulation.compute('cncn_info', period) decote = simulation.calculate('decote', period) taux = simulation.legislation_at(period.start).ir.rpns.taux16 return period, max_(0, ir_plaf_qf + self.sum_by_entity(cncn_info_holder) * taux - decote) @reference_formula class iaidrdi(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"iaidrdi" def function(self, simulation, period): ''' Impôt après imputation des réductions d'impôt ''' period = period.start.offset('first-of', 'year').period('year') ip_net = simulation.calculate('ip_net', period) reductions = simulation.calculate('reductions', period) return period, ip_net - reductions @reference_formula class cont_rev_loc(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"cont_rev_loc" start_date = date(2001, 1, 1) def function(self, simulation, period): ''' Contribution sur les revenus locatifs ''' period = period.start.offset('first-of', 'year').period('year') f4bl = simulation.calculate('f4bl', period) crl = simulation.legislation_at(period.start).ir.crl return period, round(crl.taux * (f4bl >= crl.seuil) * f4bl) @reference_formula class teicaa(SimpleFormulaColumn): # f5rm column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"teicaa" def function(self, simulation, period): """ Taxe exceptionelle sur l'indemnité compensatrice des agents d'assurance """ period = period.start.offset('first-of', 'year').period('year') f5qm_holder = simulation.compute('f5qm', period) bareme = simulation.legislation_at(period.start).ir.teicaa f5qm = self.filter_role(f5qm_holder, role = VOUS) f5rm = self.filter_role(f5qm_holder, role = CONJ) return period, bareme.calc(f5qm) + bareme.calc(f5rm) @reference_formula class assiette_vente(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"assiette_vente" start_date = date(2009, 1, 1) def function(self, simulation, period): ''' Assiette régime microsociale pour les ventes ''' period = period.start.offset('first-of', 'year').period('year') ebic_impv_holder = simulation.compute('ebic_impv', period) return period, self.sum_by_entity(ebic_impv_holder) @reference_formula class assiette_service(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"assiette_service" start_date = date(2009, 1, 1) def function(self, simulation, period): ''' Assiette régime microsociale pour les prestations et services ''' period = period.start.offset('first-of', 'year').period('year') ebic_imps_holder = simulation.compute('ebic_imps', period) return period, self.sum_by_entity(ebic_imps_holder) # P = _P.ir.rpns.microentreprise # assert (ebic_imps <= P.servi.max) @reference_formula class assiette_proflib(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"assiette_proflib" start_date = date(2009, 1, 1) def function(self, simulation, period): ''' Assiette régime microsociale pour les professions libérales ''' period = period.start.offset('first-of', 'year').period('year') ebnc_impo_holder = simulation.compute('ebnc_impo', period) P = simulation.legislation_at(period.start).ir.rpns.microentreprise # TODO: distinction RSI/CIPAV (pour les cotisations sociales) # http://vosdroits.service-public.fr/professionnels-entreprises/F23267.xhtml return period, self.sum_by_entity(ebnc_impo_holder) # assert (ebnc_impo <= P.specialbnc.max) @reference_formula class microsocial(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"microsocial" start_date = date(2009, 1, 1) url = "http://fr.wikipedia.org/wiki/R%C3%A9gime_micro-social" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') assiette_service = simulation.calculate('assiette_service', period) assiette_vente = simulation.calculate('assiette_vente', period) assiette_proflib = simulation.calculate('assiette_proflib', period) microsocial = simulation.legislation_at(period.start).ir.rpns.microsocial return period, ( assiette_service * microsocial.servi + assiette_vente * microsocial.vente + assiette_proflib * microsocial.bnc ) @reference_formula class microentreprise(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"microentreprise" start_date = date(2009, 1, 1) def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') ebnc_impo_holder = simulation.compute('ebnc_impo', period) ebic_imps_holder = simulation.compute('ebic_imps', period) ebic_impv_holder = simulation.compute('ebic_impv', period) me = simulation.legislation_at(period.start).ir.rpns.microentreprise ebnc_impo = self.sum_by_entity(ebnc_impo_holder) ebic_imps = self.sum_by_entity(ebic_imps_holder) ebic_impv = self.sum_by_entity(ebic_impv_holder) return period, ( ebnc_impo * (1 - me.specialbnc.taux) + ebic_imps * (1 - me.servi.taux) + ebic_impv * (1 - me.vente.taux) ) @reference_formula class plus_values(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"plus_values" @dated_function(start = date(2007, 1, 1), stop = date(2007, 12, 31)) def function_20070101_20071231(self, simulation, period): # f3sd is in f3vd holder """ Taxation des plus value TODO: f3vt, 2013 f3Vg au barème / tout refaire """ period = period.start.offset('first-of', 'year').period('year') f3vg = simulation.calculate('f3vg', period) f3vh = simulation.calculate('f3vh', period) f3vl = simulation.calculate('f3vl', period) f3vm = simulation.calculate('f3vm', period) f3vi_holder = simulation.compute('f3vi', period) f3vf_holder = simulation.compute('f3vf', period) f3vd_holder = simulation.compute('f3vd', period) rpns_pvce_holder = simulation.compute('rpns_pvce', period) _P = simulation.legislation_at(period.start) plus_values = simulation.legislation_at(period.start).ir.plus_values rpns_pvce = self.sum_by_entity(rpns_pvce_holder) f3vd = self.filter_role(f3vd_holder, role = VOUS) f3sd = self.filter_role(f3vd_holder, role = CONJ) f3vi = self.filter_role(f3vi_holder, role = VOUS) f3si = self.filter_role(f3vi_holder, role = CONJ) f3vf = self.filter_role(f3vf_holder, role = VOUS) f3sf = self.filter_role(f3vf_holder, role = CONJ) # TODO: remove this todo use sum for all fields after checking # revenus taxés à un taux proportionnel rdp = max_(0, f3vg - f3vh) + f3vl + rpns_pvce + f3vm + f3vi + f3vf out = (plus_values.pvce * rpns_pvce + plus_values.taux1 * max_(0, f3vg - f3vh) + plus_values.caprisque * f3vl + plus_values.pea * f3vm + plus_values.taux3 * f3vi + plus_values.taux4 * f3vf) return period, round(out) @dated_function(start = date(2008, 1, 1), stop = date(2011, 12, 31)) def function_20080101_20111231(self, simulation, period): # f3sd is in f3vd holder """ Taxation des plus value TODO: f3vt, 2013 f3Vg au barème / tout refaire """ period = period.start.offset('first-of', 'year').period('year') f3vg = simulation.calculate('f3vg', period) f3vh = simulation.calculate('f3vh', period) f3vl = simulation.calculate('f3vl', period) f3vm = simulation.calculate('f3vm', period) f3vi_holder = simulation.compute('f3vi', period) f3vf_holder = simulation.compute('f3vf', period) f3vd_holder = simulation.compute('f3vd', period) rpns_pvce_holder = simulation.compute('rpns_pvce', period) plus_values = simulation.legislation_at(period.start).ir.plus_values rpns_pvce = self.sum_by_entity(rpns_pvce_holder) f3vd = self.filter_role(f3vd_holder, role = VOUS) f3sd = self.filter_role(f3vd_holder, role = CONJ) f3vi = self.filter_role(f3vi_holder, role = VOUS) f3si = self.filter_role(f3vi_holder, role = CONJ) f3vf = self.filter_role(f3vf_holder, role = VOUS) f3sf = self.filter_role(f3vf_holder, role = CONJ) # TODO: remove this todo use sum for all fields after checking # revenus taxés à un taux proportionnel rdp = max_(0, f3vg - f3vh) + f3vl + rpns_pvce + f3vm + f3vi + f3vf out = (plus_values.pvce * rpns_pvce + plus_values.taux1 * max_(0, f3vg - f3vh) + plus_values.caprisque * f3vl + plus_values.pea * f3vm + plus_values.taux3 * f3vi + plus_values.taux4 * f3vf) # revenus taxés à un taux proportionnel rdp += f3vd out += plus_values.taux1 * f3vd return period, round(out) @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): # f3sd is in f3vd holder """ Taxation des plus value TODO: f3vt, 2013 f3Vg au barème / tout refaire """ period = period.start.offset('first-of', 'year').period('year') f3vg = simulation.calculate('f3vg', period) f3vh = simulation.calculate('f3vh', period) f3vl = simulation.calculate('f3vl', period) f3vm = simulation.calculate('f3vm', period) f3vi_holder = simulation.compute('f3vi', period) f3vf_holder = simulation.compute('f3vf', period) f3vd_holder = simulation.compute('f3vd', period) rpns_pvce_holder = simulation.compute('rpns_pvce', period) plus_values = simulation.legislation_at(period.start).ir.plus_values rpns_pvce = self.sum_by_entity(rpns_pvce_holder) f3vd = self.filter_role(f3vd_holder, role = VOUS) f3sd = self.filter_role(f3vd_holder, role = CONJ) f3vi = self.filter_role(f3vi_holder, role = VOUS) f3si = self.filter_role(f3vi_holder, role = CONJ) f3vf = self.filter_role(f3vf_holder, role = VOUS) f3sf = self.filter_role(f3vf_holder, role = CONJ) # TODO: remove this todo use sum for all fields after checking # revenus taxés à un taux proportionnel rdp = max_(0, f3vg - f3vh) + f3vl + rpns_pvce + f3vm + f3vi + f3vf out = (plus_values.pvce * rpns_pvce + plus_values.taux1 * max_(0, f3vg - f3vh) + plus_values.caprisque * f3vl + plus_values.pea * f3vm + plus_values.taux3 * f3vi + plus_values.taux4 * f3vf) # revenus taxés à un taux proportionnel rdp += f3vd out += plus_values.taux1 * f3vd # out = plus_values.taux2 * f3vd + plus_values.taux3 * f3vi + plus_values.taux4 * f3vf + plus_values.taux1 *max_( # 0, f3vg - f3vh) out = (plus_values.taux2 * (f3vd + f3sd) + plus_values.taux3 * (f3vi + f3si) + plus_values.taux4 * (f3vf + f3sf) + plus_values.taux1 * max_(0, f3vg - f3vh) + plus_values.pvce * rpns_pvce) # TODO: chek this rpns missing ? return period, round(out) @dated_function(start = date(2013, 1, 1), stop = date(2015, 12, 31)) def function_20130101_20151231(self, simulation, period): # f3sd is in f3vd holder """ Taxation des plus value TODO: f3vt, 2013 f3Vg au barème / tout refaire """ period = period.start.offset('first-of', 'year').period('year') f3vg = simulation.calculate('f3vg', period) f3vh = simulation.calculate('f3vh', period) f3vl = simulation.calculate('f3vl', period) f3vm = simulation.calculate('f3vm', period) f3vi_holder = simulation.compute('f3vi', period) f3vf_holder = simulation.compute('f3vf', period) f3vd_holder = simulation.compute('f3vd', period) f3sa = simulation.calculate('f3sa', period) rpns_pvce_holder = simulation.compute('rpns_pvce', period) _P = simulation.legislation_at(period.start) plus_values = simulation.legislation_at(period.start).ir.plus_values rpns_pvce = self.sum_by_entity(rpns_pvce_holder) f3vd = self.filter_role(f3vd_holder, role = VOUS) f3sd = self.filter_role(f3vd_holder, role = CONJ) f3vi = self.filter_role(f3vi_holder, role = VOUS) f3si = self.filter_role(f3vi_holder, role = CONJ) f3vf = self.filter_role(f3vf_holder, role = VOUS) f3sf = self.filter_role(f3vf_holder, role = CONJ) # TODO: remove this todo use sum for all fields after checking # revenus taxés à un taux proportionnel rdp = max_(0, f3vg - f3vh) + f3vl + rpns_pvce + f3vm + f3vi + f3vf out = (plus_values.pvce * rpns_pvce + plus_values.taux1 * max_(0, f3vg - f3vh) + plus_values.caprisque * f3vl + plus_values.pea * f3vm + plus_values.taux3 * f3vi + plus_values.taux4 * f3vf) # revenus taxés à un taux proportionnel rdp += f3vd out += plus_values.taux1 * f3vd # out = plus_values.taux2 * f3vd + plus_values.taux3 * f3vi + plus_values.taux4 * f3vf + plus_values.taux1 * max_( # 0, f3vg - f3vh) out = (plus_values.taux2 * (f3vd + f3sd) + plus_values.taux3 * (f3vi + f3si) + plus_values.taux4 * (f3vf + f3sf) + plus_values.taux1 * max_(0, - f3vh) + plus_values.pvce * (rpns_pvce + f3sa)) # TODO: chek this 3VG return period, round(out) @reference_formula class iai(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Impôt avant imputations" url = "http://forum-juridique.net-iris.fr/finances-fiscalite-assurance/43963-declaration-impots.html" def function(self, simulation, period): ''' impôt avant imputation de l'irpp ''' period = period.start.offset('first-of', 'year').period('year') iaidrdi = simulation.calculate('iaidrdi', period) plus_values = simulation.calculate('plus_values', period) cont_rev_loc = simulation.calculate('cont_rev_loc', period) teicaa = simulation.calculate('teicaa', period) return period, iaidrdi + plus_values + cont_rev_loc + teicaa @reference_formula class cehr(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Contribution exceptionnelle sur les hauts revenus" url = "http://www.legifrance.gouv.fr/affichCode.do?cidTexte=LEGITEXT000006069577&idSectionTA=LEGISCTA000025049019" def function(self, simulation, period): ''' Contribution exceptionnelle sur les hauts revenus 'foy' ''' period = period.start.offset('first-of', 'year').period('year') rfr = simulation.calculate('rfr', period) nb_adult = simulation.calculate('nb_adult', period) bareme = simulation.legislation_at(period.start).ir.cehr return period, bareme.calc(rfr / nb_adult) * nb_adult @reference_formula class irpp(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Impôt sur le revenu des personnes physiques" url = "http://www.impots.gouv.fr/portal/dgi/public/particuliers.impot?pageId=part_impot_revenu&espId=1&impot=IR&sfid=50" def function(self, simulation, period): ''' Montant après seuil de recouvrement (hors ppe) ''' period = period.start.offset('first-of', 'year').period('year') iai = simulation.calculate('iai', period) credits_impot = simulation.calculate('credits_impot', period) cehr = simulation.calculate('cehr', period) P = simulation.legislation_at(period.start).ir.recouvrement # TODO: crade ? pre_result = iai - credits_impot + cehr return period, ((iai > P.seuil) * ((pre_result < P.min) * (pre_result > 0) * iai * 0 + ((pre_result <= 0) + (pre_result >= P.min)) * (- pre_result)) + (iai <= P.seuil) * ((pre_result < 0) * (-pre_result) + (pre_result >= 0) * 0 * iai)) ############################################################################### # # Autres totaux utiles pour la suite ############################################################################### @reference_formula class pensions_alimentaires_versees(SimpleFormulaColumn): column = FloatCol entity_class = FoyersFiscaux label = u"Pensions alimentaires versées" url = u"http://vosdroits.service-public.fr/particuliers/F2.xhtml" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') f6gi = simulation.calculate('f6gi', period) f6gj = simulation.calculate('f6gj', period) f6el = simulation.calculate('f6el', period) f6em = simulation.calculate('f6em', period) f6gp = simulation.calculate('f6gp', period) f6gu = simulation.calculate('f6gu', period) return period, -(f6gi + f6gj + f6el + f6em + f6gp + f6gu) @reference_formula class pensions_alimentaires_versees_declarant1(EntityToPersonColumn): entity_class = Individus label = u"Pensions alimentaires versées (pour le premier déclarant du foyer fiscal)" role = VOUS variable = pensions_alimentaires_versees @reference_formula class rfr(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Revenu fiscal de référence" def function(self, simulation, period): ''' Revenu fiscal de référence f3vg -> rev_cat_pv -> ... -> rni ''' period = period.start.offset('first-of', 'year').period('year') rni = simulation.calculate('rni', period) f3va_holder = simulation.compute('f3va', period) f3vi_holder = simulation.compute('f3vi', period) rfr_cd = simulation.calculate('rfr_cd', period) rfr_rvcm = simulation.calculate('rfr_rvcm', period) rpns_exon_holder = simulation.compute('rpns_exon', period) rpns_pvce_holder = simulation.compute('rpns_pvce', period) rev_cap_lib = simulation.calculate_add('rev_cap_lib', period) f3vz = simulation.calculate('f3vz', period) microentreprise = simulation.calculate('microentreprise', period) f3va = self.sum_by_entity(f3va_holder) f3vi = self.sum_by_entity(f3vi_holder) rpns_exon = self.sum_by_entity(rpns_exon_holder) rpns_pvce = self.sum_by_entity(rpns_pvce_holder) return period, (max_(0, rni) + rfr_cd + rfr_rvcm + rev_cap_lib + f3vi + rpns_exon + rpns_pvce + f3va + f3vz + microentreprise) @reference_formula class glo(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Gain de levée d'options" url = "http://www.officeo.fr/imposition-au-bareme-progressif-de-l-impot-sur-le-revenu-des-gains-de-levee-d-options-sur-actions-et-attributions-d-actions-gratuites" def function(self, simulation, period): ''' Gains de levée d'option ''' period = period.start.offset('first-of', 'year').period('year') f1tv = simulation.calculate('f1tv', period) f1tw = simulation.calculate('f1tw', period) f1tx = simulation.calculate('f1tx', period) f3vf = simulation.calculate('f3vf', period) f3vi = simulation.calculate('f3vi', period) f3vj = simulation.calculate('f3vj', period) return period, f1tv + f1tw + f1tx + f3vf + f3vi + f3vj @reference_formula class rev_cap_bar(SimpleFormulaColumn): """Revenus du capital imposés au barème Annuel pour les impôts mais mensuel pour la base ressource des minimas sociaux donc mensuel. """ calculate_output = calculate_output_add column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"rev_cap_bar" set_input = set_input_divide_by_period url = "http://fr.wikipedia.org/wiki/Revenu#Revenu_du_Capital" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') year = period.start.offset('first-of', 'year').period('year') f2dc = simulation.calculate('f2dc', year) f2gr = simulation.calculate('f2gr', year) f2ch = simulation.calculate('f2ch', year) f2ts = simulation.calculate('f2ts', year) f2go = simulation.calculate('f2go', year) f2tr = simulation.calculate('f2tr', year) f2fu = simulation.calculate('f2fu', year) avf = simulation.calculate('avf', year) f2da = simulation.calculate('f2da', year) f2ee = simulation.calculate('f2ee', year) finpfl = simulation.legislation_at(period.start).ir.autre.finpfl # TODO remove ad check case majGO = simulation.legislation_at(period.start).ir.rvcm.majGO # year = period.start.year # if year <= 2011: # return f2dc + f2gr + f2ch + f2ts + f2go + f2tr + f2fu - avf # elif year > 2011: # return f2dc + f2gr + f2ch + f2ts + f2go + f2tr + f2fu - avf + (f2da + f2ee) return period, (f2dc + f2gr + f2ch + f2ts + f2go * majGO + f2tr + f2fu - avf + (f2da + f2ee) * finpfl) / 12 # We add f2da an f2ee to allow for comparaison between years @reference_formula class rev_cap_lib(DatedFormulaColumn): '''Revenu du capital imposé au prélèvement libératoire Annuel pour les impôts mais mensuel pour la base ressource des minimas sociaux donc mensuel. ''' calculate_output = calculate_output_add column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"rev_cap_lib" set_input = set_input_divide_by_period url = "http://fr.wikipedia.org/wiki/Revenu#Revenu_du_Capital" @dated_function(start = date(2002, 1, 1), stop = date(2007, 12, 31)) def function_20020101_20071231(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') year = period.start.offset('first-of', 'year').period('year') f2dh = simulation.calculate('f2dh', year) f2ee = simulation.calculate('f2ee', year) _P = simulation.legislation_at(period.start) finpfl = simulation.legislation_at(period.start).ir.autre.finpfl out = f2dh + f2ee return period, out * not_(finpfl) / 12 @dated_function(start = date(2008, 1, 1), stop = date(2015, 12, 31)) def function_20080101_20151231(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') year = period.start.offset('first-of', 'year').period('year') f2da = simulation.calculate('f2da', year) f2dh = simulation.calculate('f2dh', year) f2ee = simulation.calculate('f2ee', year) _P = simulation.legislation_at(period.start) finpfl = simulation.legislation_at(period.start).ir.autre.finpfl out = f2da + f2dh + f2ee return period, out * not_(finpfl) / 12 @reference_formula class avf(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"avf" def function(self, simulation, period): ''' Avoir fiscal et crédits d'impôt (zavff) ''' period = period.start.offset('first-of', 'year').period('year') f2ab = simulation.calculate('f2ab', period) return period, f2ab @reference_formula class imp_lib(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"imp_lib" url = "http://www.impots.gouv.fr/portal/dgi/public/particuliers.impot?pageId=part_ctrb_soc&paf_dm=popup&paf_gm=content&typePage=cpr02&sfid=501&espId=1&impot=CS" @dated_function(start = date(2002, 1, 1), stop = date(2007, 12, 31)) def function_20020101_20071231(self, simulation, period): ''' Prelèvement libératoire sur les revenus du capital ''' period = period.start.offset('first-of', 'year').period('year') f2dh = simulation.calculate('f2dh', period) f2ee = simulation.calculate('f2ee', period) _P = simulation.legislation_at(period.start) prelevement_liberatoire = simulation.legislation_at(period.start).ir.rvcm.prelevement_liberatoire out = -(prelevement_liberatoire.assvie * f2dh + prelevement_liberatoire.autre * f2ee) return period, out @dated_function(start = date(2008, 1, 1), stop = date(2012, 12, 31)) def function_20080101_20121231(self, simulation, period): ''' Prelèvement libératoire sur les revenus du capital ''' period = period.start.offset('first-of', 'year').period('year') f2da = simulation.calculate('f2da', period) f2dh = simulation.calculate('f2dh', period) f2ee = simulation.calculate('f2ee', period) _P = simulation.legislation_at(period.start) finpfl = simulation.legislation_at(period.start).ir.autre.finpfl prelevement_liberatoire = simulation.legislation_at(period.start).ir.rvcm.prelevement_liberatoire out = -(prelevement_liberatoire.action * f2da + prelevement_liberatoire.autre * f2ee) * not_(finpfl) \ - prelevement_liberatoire.assvie * f2dh return period, out @reference_formula class fon(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"fon" url = "http://impotsurlerevenu.org/definitions/220-revenu-foncier.php" def function(self, simulation, period): ''' Revenus fonciers ''' period = period.start.offset('first-of', 'year').period('year') f4ba = simulation.calculate('f4ba', period) f4bb = simulation.calculate('f4bb', period) f4bc = simulation.calculate('f4bc', period) f4bd = simulation.calculate('f4bd', period) f4be = simulation.calculate('f4be', period) microfoncier = simulation.legislation_at(period.start).ir.microfoncier return period, f4ba - f4bb - f4bc + round(f4be * (1 - microfoncier.taux)) @reference_formula class rpns_pvce(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"rpns_pvce" def function(self, simulation, period): ''' Plus values de cession 'ind' frag_pvce (f5hx, f5ix, f5jx) arag_pvce (f5he, f5ie, f5je) mbic_pvce (f5kq, f5lq, f5mq) abic_pvce (f5ke, f5le, f5me) macc_pvce (f5nq, f5oq, f5pq) aacc_pvce (f5ne, f5oe, f5pe) mncn_pvce (f5kv, f5lv, f5mv) cncn_pvce (f5so, f5nt, f5ot) mbnc_pvce (f5hr, f5ir, f5jr) abnc_pvce (f5qd, f5rd, f5sd) ''' period = period.start.offset('first-of', 'year').period('year') frag_pvce = simulation.calculate('frag_pvce', period) arag_pvce = simulation.calculate('arag_pvce', period) mbic_pvce = simulation.calculate('mbic_pvce', period) abic_pvce = simulation.calculate('abic_pvce', period) macc_pvce = simulation.calculate('macc_pvce', period) aacc_pvce = simulation.calculate('aacc_pvce', period) mbnc_pvce = simulation.calculate('mbnc_pvce', period) abnc_pvce = simulation.calculate('abnc_pvce', period) mncn_pvce = simulation.calculate('mncn_pvce', period) cncn_pvce = simulation.calculate('cncn_pvce', period) return period, (frag_pvce + arag_pvce + mbic_pvce + abic_pvce + macc_pvce + aacc_pvce + mbnc_pvce + abnc_pvce + mncn_pvce + cncn_pvce) @reference_formula class rpns_exon(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"rpns_exon" def function(self, simulation, period): ''' Plus values de cession 'ind' frag_exon (f5hn, f5in, f5jn) arag_exon (f5hb, f5ib, f5jb) nrag_exon (f5hh, f5ih, f5jh) mbic_exon (f5kn, f5ln, f5mn) abic_exon (f5kb, f5lb, f5mb) nbic_exon (f5kh, f5lh, f5mh) macc_exon (f5nn, f5on, f5pn) aacc_exon (f5nb, f5ob, f5pb) nacc_exon (f5nh, f5oh, f5ph) mbnc_exon (f5hp, f5ip, f5jp) abnc_exon (f5qb, f5rb, f5sb) nbnc_exon (f5qh, f5rh, f5sh) nbnc_pvce (f5qj, f5rj, f5sj) ''' period = period.start.offset('first-of', 'year').period('year') frag_exon = simulation.calculate('frag_exon', period) arag_exon = simulation.calculate('arag_exon', period) nrag_exon = simulation.calculate('nrag_exon', period) mbic_exon = simulation.calculate('mbic_exon', period) abic_exon = simulation.calculate('abic_exon', period) nbnc_proc = simulation.calculate('nbnc_proc', period) nbic_exon = simulation.calculate('nbic_exon', period) macc_exon = simulation.calculate('macc_exon', period) aacc_exon = simulation.calculate('aacc_exon', period) nacc_exon = simulation.calculate('nacc_exon', period) mbnc_exon = simulation.calculate('mbnc_exon', period) abnc_proc = simulation.calculate('abnc_proc', period) nrag_pvce = simulation.calculate('nrag_pvce', period) abnc_exon = simulation.calculate('abnc_exon', period) nbnc_exon = simulation.calculate('nbnc_exon', period) mncn_exon = simulation.calculate('mncn_exon', period) cncn_exon = simulation.calculate('cncn_exon', period) cncn_jcre = simulation.calculate('cncn_jcre', period) cncn_info = simulation.calculate('cncn_info', period) nbic_pvce = simulation.calculate('nbic_pvce', period) cga = simulation.legislation_at(period.start).ir.rpns.cga_taux2 return period, (frag_exon + arag_exon + nrag_exon + mbic_exon + abic_exon + nbnc_proc * (1 + cga) + nbic_exon + macc_exon + aacc_exon + nacc_exon + mbnc_exon + abnc_proc + abnc_exon + nbnc_exon + mncn_exon + cncn_exon + cncn_jcre + cncn_info + nbic_pvce + nrag_pvce) @reference_formula class defrag(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Déficit agricole des années antérieures" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') f5qf = simulation.calculate('f5qf', period) f5qg = simulation.calculate('f5qg', period) f5qn = simulation.calculate('f5qn', period) f5qo = simulation.calculate('f5qo', period) f5qp = simulation.calculate('f5qp', period) f5qq = simulation.calculate('f5qq', period) frag_impo_holder = simulation.compute('frag_impo', period) nrag_impg_holder = simulation.compute('nrag_impg', period) frag_fore_holder = simulation.compute('frag_fore', period) frag_pvct_holder = simulation.compute('frag_pvct', period) arag_impg_holder = simulation.compute('arag_impg', period) cga = simulation.legislation_at(period.start).ir.rpns.cga_taux2 frag_fore = self.sum_by_entity(frag_fore_holder) frag_impo = self.sum_by_entity(frag_impo_holder) arag_impg = self.sum_by_entity(arag_impg_holder) nrag_impg = self.sum_by_entity(nrag_impg_holder) frag_pvct = self.sum_by_entity(frag_pvct_holder) return period, min_(f5qf + f5qg + f5qn + f5qo + f5qp + f5qq, (1 + cga) * (frag_impo + nrag_impg + frag_pvct) + arag_impg + frag_fore) @reference_formula class defacc(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Déficit industriels et commerciaux non professionnels des années antérieures" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') f5rn = simulation.calculate('f5rn', period) f5ro = simulation.calculate('f5ro', period) f5rp = simulation.calculate('f5rp', period) f5rq = simulation.calculate('f5rq', period) f5rr = simulation.calculate('f5rr', period) f5rw = simulation.calculate('f5rw', period) macc_impv_holder = simulation.compute('macc_impv', period) macc_imps_holder = simulation.compute('macc_imps', period) nacc_impn_holder = simulation.compute('nacc_impn', period) macc_pvct_holder = simulation.compute('macc_pvct', period) aacc_impn_holder = simulation.compute('aacc_impn', period) cga = simulation.legislation_at(period.start).ir.rpns.cga_taux2 microentreprise = simulation.legislation_at(period.start).ir.rpns.microentreprise def abat_rpns(rev, P): return max_(0, rev - min_(rev, max_(P.taux * min_(P.max, rev), P.min))) nacc_impn = self.sum_by_entity(nacc_impn_holder) macc_pvct = self.sum_by_entity(macc_pvct_holder) macc_impv = self.sum_by_entity(macc_impv_holder) macc_imps = self.sum_by_entity(macc_imps_holder) aacc_impn = self.sum_by_entity(aacc_impn_holder) macc_timp = abat_rpns(macc_impv, microentreprise.vente) + abat_rpns(macc_imps, microentreprise.servi) return period, ( min_(f5rn + f5ro + f5rp + f5rq + f5rr + f5rw, aacc_impn + macc_pvct + macc_timp + (1 + cga) * nacc_impn) ) @reference_formula class defncn(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Déficit non commerciaux non professionnels des années antérieures" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') f5ht = simulation.calculate('f5ht', period) f5it = simulation.calculate('f5it', period) f5jt = simulation.calculate('f5jt', period) f5kt = simulation.calculate('f5kt', period) f5lt = simulation.calculate('f5lt', period) f5mt = simulation.calculate('f5mt', period) mncn_impo_holder = simulation.compute('mncn_impo', period) mncn_pvct_holder = simulation.compute('mncn_pvct', period) cncn_aimp_holder = simulation.compute('cncn_aimp', period) cncn_bene_holder = simulation.compute('cncn_bene', period) cga = simulation.legislation_at(period.start).ir.rpns.cga_taux2 spbnc = simulation.legislation_at(period.start).ir.rpns.microentreprise.specialbnc def abat_rpns(rev, P): return max_(0, rev - min_(rev, max_(P.taux * min_(P.max, rev), P.min))) cncn_bene = self.sum_by_entity(cncn_bene_holder) mncn_impo = self.sum_by_entity(mncn_impo_holder) mncn_pvct = self.sum_by_entity(mncn_pvct_holder) cncn_aimp = self.sum_by_entity(cncn_aimp_holder) return period, min_(f5ht + f5it + f5jt + f5kt + f5lt + f5mt, abat_rpns(mncn_impo, spbnc) + mncn_pvct + cncn_aimp + (1 + cga) * cncn_bene) @reference_formula class defmeu(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Déficit des locations meublées non professionnelles des années antérieures" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') f5ga = simulation.calculate('f5ga', period) f5gb = simulation.calculate('f5gb', period) f5gc = simulation.calculate('f5gc', period) f5gd = simulation.calculate('f5gd', period) f5ge = simulation.calculate('f5ge', period) f5gf = simulation.calculate('f5gf', period) f5gg = simulation.calculate('f5gg', period) f5gh = simulation.calculate('f5gh', period) f5gi = simulation.calculate('f5gi', period) f5gj = simulation.calculate('f5gj', period) alnp_imps_holder = simulation.compute('alnp_imps', period) nacc_defs_holder = simulation.compute('nacc_defs', period) nacc_defs = self.sum_by_entity(nacc_defs_holder) alnp_imps = self.sum_by_entity(alnp_imps_holder) return period, min_(f5ga + f5gb + f5gc + f5gd + f5ge + f5gf + f5gg + f5gh + f5gi + f5gj, alnp_imps + nacc_defs) @reference_formula class rag(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"rag" url = "http://www.impots.gouv.fr/portal/dgi/public/professionnels.impot?espId=2&impot=BA&pageId=prof_ba&sfid=50" def function(self, simulation, period): ''' Revenus agricoles 'ind' frag_exon (f5hn, f5in, f5jn) frag_impo (f5ho, f5io, f5jo) arag_exon (f5hb, f5ib, f5jb) arag_impg (f5hc, f5ic, f5jc) arag_defi (f5hf, f5if, f5jf) nrag_exon (f5hh, f5ih, f5jh) nrag_impg (f5hi, f5ii, f5ji) nrag_defi (f5hl, f5il, f5jl) nrag_ajag (f5hm, f5im, f5jm) ''' period = period.start.offset('first-of', 'year').period('year') frag_exon = simulation.calculate('frag_exon', period) frag_impo = simulation.calculate('frag_impo', period) arag_exon = simulation.calculate('arag_exon', period) arag_impg = simulation.calculate('arag_impg', period) arag_defi = simulation.calculate('arag_defi', period) nrag_exon = simulation.calculate('nrag_exon', period) nrag_impg = simulation.calculate('nrag_impg', period) nrag_defi = simulation.calculate('nrag_defi', period) nrag_ajag = simulation.calculate('nrag_ajag', period) return period, (frag_exon + frag_impo + arag_exon + arag_impg - arag_defi + nrag_exon + nrag_impg - nrag_defi + nrag_ajag) @reference_formula class ric(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"ric" url = "http://www.impots.gouv.fr/portal/dgi/public/professionnels.impot?pageId=prof_bic&espId=2&impot=BIC&sfid=50" def function(self, simulation, period): ''' Bénéfices industriels et commerciaux 'ind' mbic_exon (f5kn, f5ln, f5mn) abic_exon (f5kb, f5lb, f5mb) nbic_exon (f5kh, f5lh, f5mh) mbic_impv (f5ko, f5lo, f5mo) mbic_imps (f5kp, f5lp, f5mp) abic_impn (f5kc, f5lc, f5mc) abic_imps (f5kd, f5ld, f5md) nbic_impn (f5ki, f5li, f5mi) nbic_imps (f5kj, f5lj, f5mj) abic_defn (f5kf, f5lf, f5mf) abic_defs (f5kg, f5lg, f5mg) nbic_defn (f5kl, f5ll, f5ml) nbic_defs (f5km, f5lm, f5mm) nbic_apch (f5ks, f5ls, f5ms) ''' period = period.start.offset('first-of', 'year').period('year') mbic_exon = simulation.calculate('mbic_exon', period) mbic_impv = simulation.calculate('mbic_impv', period) mbic_imps = simulation.calculate('mbic_imps', period) abic_exon = simulation.calculate('abic_exon', period) nbic_exon = simulation.calculate('nbic_exon', period) abic_impn = simulation.calculate('abic_impn', period) nbic_impn = simulation.calculate('nbic_impn', period) abic_imps = simulation.calculate('abic_imps', period) nbic_imps = simulation.calculate('nbic_imps', period) abic_defn = simulation.calculate('abic_defn', period) nbic_defn = simulation.calculate('nbic_defn', period) abic_defs = simulation.calculate('abic_defs', period) nbic_defs = simulation.calculate('nbic_defs', period) nbic_apch = simulation.calculate('nbic_apch', period) microentreprise = simulation.legislation_at(period.start).ir.rpns.microentreprise zbic = (mbic_exon + mbic_impv + mbic_imps + abic_exon + nbic_exon + abic_impn + nbic_impn + abic_imps + nbic_imps - abic_defn - nbic_defn - abic_defs - nbic_defs + nbic_apch) cond = (mbic_impv > 0) & (mbic_imps == 0) taux = microentreprise.vente.taux * cond + microentreprise.servi.taux * not_(cond) cbic = min_( mbic_impv + mbic_imps + mbic_exon, max_( microentreprise.vente.min, round( mbic_impv * microentreprise.vente.taux + mbic_imps * microentreprise.servi.taux + mbic_exon * taux ) ) ) return period, zbic - cbic @reference_formula class rac(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"rac" url = "http://vosdroits.service-public.fr/particuliers/F1225.xhtml" def function(self, simulation, period): ''' Revenus accessoires individuels 'ind' macc_exon (f5nn, f5on, f5pn) aacc_exon (f5nb, f5ob, f5pb) nacc_exon (f5nh, f5oh, f5ph) macc_impv (f5no, f5oo, f5po) macc_imps (f5np, f5op, f5pp) aacc_impn (f5nc, f5oc, f5pc) aacc_imps (f5nd, f5od, f5pd) aacc_defn (f5nf, f5of, f5pf) aacc_defs (f5ng, f5og, f5pg) nacc_impn (f5ni, f5oi, f5pi) nacc_defn (f5nl, f5ol, f5pl) nacc_defs (f5nm, f5om, f5pm) mncn_impo (f5ku, f5lu, f5mu) cncn_bene (f5sn, f5ns, f5os) cncn_defi (f5sp, f5nu, f5ou, f5sr) f5sv???? ''' period = period.start.offset('first-of', 'year').period('year') macc_exon = simulation.calculate('macc_exon', period) macc_impv = simulation.calculate('macc_impv', period) macc_imps = simulation.calculate('macc_imps', period) aacc_exon = simulation.calculate('aacc_exon', period) aacc_impn = simulation.calculate('aacc_impn', period) aacc_imps = simulation.calculate('aacc_imps', period) aacc_defn = simulation.calculate('aacc_defn', period) aacc_defs = simulation.calculate('aacc_defs', period) nacc_exon = simulation.calculate('nacc_exon', period) nacc_impn = simulation.calculate('nacc_impn', period) nacc_defn = simulation.calculate('nacc_defn', period) nacc_defs = simulation.calculate('nacc_defs', period) mncn_impo = simulation.calculate('mncn_impo', period) cncn_bene = simulation.calculate('cncn_bene', period) cncn_defi = simulation.calculate('cncn_defi', period) microentreprise = simulation.legislation_at(period.start).ir.rpns.microentreprise zacc = (macc_exon + macc_impv + macc_imps + aacc_exon + aacc_impn + aacc_imps - aacc_defn - aacc_defs + nacc_exon + nacc_impn - nacc_defn - nacc_defs + mncn_impo + cncn_bene - cncn_defi) #TODO: aacc_imps aacc_defs cond = (macc_impv > 0) & (macc_imps == 0) taux = microentreprise.vente.taux * cond + microentreprise.servi.taux * not_(cond) cacc = min_(macc_impv + macc_imps + macc_exon + mncn_impo, max_(microentreprise.vente.min, round( macc_impv * microentreprise.vente.taux + macc_imps * microentreprise.servi.taux + macc_exon * taux + mncn_impo * microentreprise.specialbnc.taux))) return period, zacc - cacc @reference_formula class rnc(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"rnc" url = "http://www.impots.gouv.fr/portal/dgi/public/professionnels.impot?espId=2&pageId=prof_bnc&impot=BNC&sfid=50" def function(self, simulation, period): ''' Revenus non commerciaux individuels 'ind' mbnc_exon (f5hp, f5ip, f5jp) abnc_exon (f5qb, f5rb, f5sb) nbnc_exon (f5qh, f5rh, f5sh) mbnc_impo (f5hq, f5iq, f5jq) abnc_impo (f5qc, f5rc, f5sc) abnc_defi (f5qe, f5re, f5se) nbnc_impo (f5qi, f5ri, f5si) nbnc_defi (f5qk, f5rk, f5sk) f5ql, f5qm???? ''' period = period.start.offset('first-of', 'year').period('year') mbnc_exon = simulation.calculate('mbnc_exon', period) mbnc_impo = simulation.calculate('mbnc_impo', period) abnc_exon = simulation.calculate('abnc_exon', period) nbnc_exon = simulation.calculate('nbnc_exon', period) abnc_impo = simulation.calculate('abnc_impo', period) nbnc_impo = simulation.calculate('nbnc_impo', period) abnc_defi = simulation.calculate('abnc_defi', period) nbnc_defi = simulation.calculate('nbnc_defi', period) specialbnc = simulation.legislation_at(period.start).ir.rpns.microentreprise.specialbnc zbnc = (mbnc_exon + mbnc_impo + abnc_exon + nbnc_exon + abnc_impo + nbnc_impo - abnc_defi - nbnc_defi) cbnc = min_(mbnc_exon + mbnc_impo, max_(specialbnc.min, round((mbnc_exon + mbnc_impo) * specialbnc.taux))) return period, zbnc - cbnc @reference_formula class rpns(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Revenus individuels des professions non salariées" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') rag = simulation.calculate('rag', period) ric = simulation.calculate('ric', period) rac = simulation.calculate('rac', period) rnc = simulation.calculate('rnc', period) return period, rag + ric + rac + rnc @reference_formula class rpns_pvct(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"rpns_pvct" def function(self, simulation, period): ''' Plus values de court terme 'ind' frag_pvct (f5hw, f5iw, f5jw) mbic_pvct (f5kx, f5lx, f5mx) macc_pvct (f5nx, f5ox, f5px) mbnc_pvct (f5hv, f5iv, f5jv) mncn_pvct (f5ky, f5ly, f5my) ''' period = period.start.offset('first-of', 'year').period('year') frag_pvct = simulation.calculate('frag_pvct', period) mbic_pvct = simulation.calculate('mbic_pvct', period) macc_pvct = simulation.calculate('macc_pvct', period) mbnc_pvct = simulation.calculate('mbnc_pvct', period) mncn_pvct = simulation.calculate('mncn_pvct', period) return period, frag_pvct + macc_pvct + mbic_pvct + mbnc_pvct + mncn_pvct @reference_formula class rpns_mvct(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"rpns_mvct" def function(self, simulation, period): """Moins values de court terme 'ind' macc_mvct (f5iu) mncn_mvct (f5ju) mbnc_mvct (f5kz) """ period = period.start.offset('first-of', 'year').period('year') macc_mvct_holder = simulation.compute('macc_mvct', period) mbnc_mvct = simulation.calculate('mbnc_mvct', period) mncn_mvct_holder = simulation.compute('mncn_mvct', period) macc_mvct = self.cast_from_entity_to_role(macc_mvct_holder, role = VOUS) mncn_mvct = self.cast_from_entity_to_role(mncn_mvct_holder, role = VOUS) return period, mbnc_mvct + macc_mvct # mncn_mvct ? @reference_formula class rpns_mvlt(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"rpns_mvlt" def function(self, simulation, period): ''' Moins values de long terme 'ind' mbic_mvlt (f5kr, f5lr, f5mr) macc_mvlt (f5nr, f5or, f5pr) mncn_mvlt (f5kw, f5lw, f5mw) mbnc_mvlt (f5hs, f5is, f5js) ''' period = period.start.offset('first-of', 'year').period('year') mbic_mvlt = simulation.calculate('mbic_mvlt', period) macc_mvlt = simulation.calculate('macc_mvlt', period) mbnc_mvlt = simulation.calculate('mbnc_mvlt', period) mncn_mvlt = simulation.calculate('mncn_mvlt', period) return period, mbic_mvlt + macc_mvlt + mbnc_mvlt + mncn_mvlt @reference_formula class rpns_i(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"rpns_i" def function(self, simulation, period): ''' Revenus des professions non salariées individuels ''' period = period.start.offset('first-of', 'year').period('year') frag_impo = simulation.calculate('frag_impo', period) arag_impg = simulation.calculate('arag_impg', period) nrag_impg = simulation.calculate('nrag_impg', period) arag_defi = simulation.calculate('arag_defi', period) nrag_defi = simulation.calculate('nrag_defi', period) mbic_impv = simulation.calculate('mbic_impv', period) mbic_imps = simulation.calculate('mbic_imps', period) abic_impn = simulation.calculate('abic_impn', period) abic_imps = simulation.calculate('abic_imps', period) abic_defn = simulation.calculate('abic_defn', period) abic_defs = simulation.calculate('abic_defs', period) nbic_impn = simulation.calculate('nbic_impn', period) nbic_imps = simulation.calculate('nbic_imps', period) nbic_defn = simulation.calculate('nbic_defn', period) nbic_defs = simulation.calculate('nbic_defs', period) macc_impv = simulation.calculate('macc_impv', period) macc_imps = simulation.calculate('macc_imps', period) nbic_mvct = simulation.calculate('nbic_mvct', period) aacc_impn = simulation.calculate('aacc_impn', period) aacc_defn = simulation.calculate('aacc_defn', period) aacc_gits = simulation.calculate('aacc_gits', period) nacc_impn = simulation.calculate('nacc_impn', period) nacc_defn = simulation.calculate('nacc_defn', period) nacc_defs = simulation.calculate('nacc_defs', period) aacc_imps = simulation.calculate('aacc_imps', period) mbnc_impo = simulation.calculate('mbnc_impo', period) nacc_meup = simulation.calculate('nacc_meup', period) abic_impm = simulation.calculate('abic_impm', period) abic_defm = simulation.calculate('abic_defm', period) abnc_impo = simulation.calculate('abnc_impo', period) abnc_defi = simulation.calculate('abnc_defi', period) nbic_impm = simulation.calculate('nbic_impm', period) alnp_imps = simulation.calculate('alnp_imps', period) nbnc_impo = simulation.calculate('nbnc_impo', period) nbnc_defi = simulation.calculate('nbnc_defi', period) alnp_defs = simulation.calculate('alnp_defs', period) cbnc_assc = simulation.calculate('cbnc_assc', period) mncn_impo = simulation.calculate('mncn_impo', period) cncn_bene = simulation.calculate('cncn_bene', period) cncn_defi = simulation.calculate('cncn_defi', period) abnc_proc = simulation.calculate('abnc_proc', period) rpns_pvct = simulation.calculate('rpns_pvct', period) rpns_mvct = simulation.calculate('rpns_mvct', period) nbnc_proc = simulation.calculate('nbnc_proc', period) frag_fore = simulation.calculate('frag_fore', period) f5sq = simulation.calculate('f5sq', period) mncn_exon = simulation.calculate('mncn_exon', period) cncn_exon = simulation.calculate('cncn_exon', period) cncn_aimp = simulation.calculate('cncn_aimp', period) cncn_adef = simulation.calculate('cncn_adef', period) cncn_info = simulation.calculate('cncn_info', period) cncn_jcre = simulation.calculate('cncn_jcre', period) revimpres = simulation.calculate('revimpres', period) pveximpres = simulation.calculate('pveximpres', period) pvtaimpres = simulation.calculate('pvtaimpres', period) cga_taux2 = simulation.legislation_at(period.start).ir.rpns.cga_taux2 microentreprise = simulation.legislation_at(period.start).ir.rpns.microentreprise def abat_rpns(rev, P): return max_(0, rev - min_(rev, max_(P.taux * min_(P.max, rev), P.min))) # Jeunes agriculteurs montant de l'abattement de 50% ou 100% # nrag_ajag = f5hm + f5im + f5jm # # déficits agricole des années antérieurs (imputables uniquement # # sur des revenus agricoles) # rag_timp = frag_impo + frag_pvct + arag_impg + nrag_impg # cond = (AUTRE <= microentreprise.def_agri_seuil) # def_agri = cond*(arag_defi + nrag_defi) + not_(cond)*min_(rag_timp, arag_defi + nrag_defi) # # TODO : check 2006 cf art 156 du CGI pour 2006 # def_agri_ant = min_(max_(0,rag_timp - def_agri), f5sq) def_agri = f5sq + arag_defi + nrag_defi # # B revenus industriels et commerciaux professionnels # regime micro entreprise mbic_timp = abat_rpns(mbic_impv, microentreprise.vente) + abat_rpns(mbic_imps, microentreprise.servi) # Régime du bénéfice réel bénéficiant de l'abattement CGA abic_timp = abic_impn + abic_imps - (abic_defn + abic_defs) # Régime du bénéfice réel ne bénéficiant pas de l'abattement CGA nbic_timp = (nbic_impn + nbic_imps) - (nbic_defn + nbic_defs) # Abatemment artisant pécheur # nbic_apch = f5ks + f5ls + f5ms # TODO : à intégrer qqpart # # C revenus industriels et commerciaux non professionnels # (revenus accesoires du foyers en nomenclature INSEE) # regime micro entreprise macc_timp = abat_rpns(macc_impv, microentreprise.vente) + abat_rpns(macc_imps, microentreprise.servi) # Régime du bénéfice réel bénéficiant de l'abattement CGA aacc_timp = (max_(0, (aacc_impn + (aacc_gits > 0) * max_(microentreprise.servi.min, aacc_gits * (1 - microentreprise.vente.taux)) + (aacc_imps > 0) * max_(microentreprise.servi.min, aacc_imps * (1 - microentreprise.servi.taux)) + (nacc_meup > 0) * max_(microentreprise.servi.min, nacc_meup * (1 - microentreprise.vente.taux)) + nacc_defs - aacc_defn))) # Régime du bénéfice réel ne bénéficiant pas de l'abattement CGA nacc_timp = max_(0, nacc_impn - nacc_defn) # # E revenus non commerciaux non professionnels # regime déclaratif special ou micro-bnc mncn_timp = abat_rpns(mncn_impo, microentreprise.specialbnc) # régime de la déclaration controlée # total 11 cncn_timp = max_(0, cncn_bene - cncn_defi) # Abatement jeunes créateurs # # D revenus non commerciaux professionnels # regime déclaratif special ou micro-bnc mbnc_timp = abat_rpns(mbnc_impo, microentreprise.specialbnc) # regime de la déclaration contrôlée bénéficiant de l'abattement association agréée abnc_timp = abnc_impo - abnc_defi # regime de la déclaration contrôlée ne bénéficiant pas de l'abattement association agréée nbnc_timp = nbnc_impo - nbnc_defi # # Totaux atimp = arag_impg + abic_timp + aacc_timp + abnc_timp ntimp = nrag_impg + nbic_timp + nacc_timp + nbnc_timp + cncn_timp majo_cga = max_(0, cga_taux2 * (ntimp + frag_impo)) # Pour ne pas avoir à majorer les déficits # total 6 rev_NS = frag_impo + frag_fore + atimp + ntimp + majo_cga - def_agri # revenu net après abatement # total 7 rev_NS_mi = mbic_timp + max_(0, macc_timp) + mbnc_timp + mncn_timp exon = max_(0, macc_timp + nacc_timp - rpns_mvct) - macc_timp - nacc_timp # ajout artificiel RPNS = (rev_NS + rev_NS_mi + rpns_pvct + exon + abic_impm - abic_defm + alnp_imps + cncn_aimp - nbic_mvct) return period, RPNS @reference_formula class abat_spe(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Abattements spéciaux" url = "http://bofip.impots.gouv.fr/bofip/2036-PGP" def function(self, simulation, period): """ Abattements spéciaux - pour personnes âges ou invalides : âgé(e) de plus de 65 ans ou invalide (titulaire d’une pension d’invalidité militaire ou d’accident du travail d’au moins 40 % ou titulaire de la carte d’invalidité), abattement de 2 172 € si rng du foyer fiscal inférieur à 13 370 € 1 086 € si rng compris entre 13 370 € et 21 570 €. Abattement doublé si conjoint remplit également ces conditions d’âge ou d’invalidité. - pour enfants à charge ayant fondé un foyer distinct : Si rattachement enfants mariés ou pacsés ou enfants célibataires, veufs, divorcés, séparés, chargés de famille, abattement 5 495 € par personne ainsi rattachée. Si l’enfant de la personne rattachée est réputé à charge de l’un et l’autre de ses parents (garde alternée), cet abattement est divisé par deux soit 2 748€. Exemple : 10 990 € pour un jeune ménage et 8 243 € pour un célibataire avec un jeune enfant en résidence alternée. """ period = period.start.offset('first-of', 'year').period('year') age_holder = simulation.compute('age', period) caseP = simulation.calculate('caseP', period) caseF = simulation.calculate('caseF', period) rng = simulation.calculate('rng', period) nbN = simulation.calculate('nbN', period) abattements_speciaux = simulation.legislation_at(period.start).ir.abattements_speciaux age = self.split_by_roles(age_holder, roles = [VOUS, CONJ]) ageV, ageC = age[VOUS], age[CONJ] invV, invC = caseP, caseF nb_elig_as = (1 * (((ageV >= 65) | invV) & (ageV > 0)) + 1 * (((ageC >= 65) | invC) & (ageC > 0)) ) as_inv = (nb_elig_as * abattements_speciaux.inv_montant * ((rng <= abattements_speciaux.inv_max1) + ((rng > abattements_speciaux.inv_max1) & (rng <= abattements_speciaux.inv_max2)) * 0.5)) as_enf = nbN * abattements_speciaux.enf_montant return period, min_(rng, as_inv + as_enf) @reference_formula class taux_effectif(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"taux_effectif" start_date = date(2009, 1, 1) def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') rni = simulation.calculate('rni', period) nbptr = simulation.calculate('nbptr', period) microentreprise = simulation.calculate('microentreprise', period) abnc_proc_holder = simulation.compute('abnc_proc', period) nbnc_proc_holder = simulation.compute('nbnc_proc', period) bareme = simulation.legislation_at(period.start).ir.bareme cga = simulation.legislation_at(period.start).ir.rpns.cga_taux2 abnc_proc = self.sum_by_entity(abnc_proc_holder) nbnc_proc = self.sum_by_entity(nbnc_proc_holder) base_fictive = rni + microentreprise + abnc_proc + nbnc_proc * (1 + cga) trigger = (microentreprise != 0) | (abnc_proc != 0) | (nbnc_proc != 0) return period, trigger * nbptr * bareme.calc(base_fictive / nbptr) / max_(1, base_fictive) ############################################################################### # # Calcul du nombre de parts ############################################################################### @reference_formula class nbptr(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Nombre de parts" url = "http://vosdroits.service-public.fr/particuliers/F2705.xhtml" def function(self, simulation, period): ''' Nombre de parts du foyer 'foy' note 1 enfants et résidence alternée (formulaire 2041 GV page 10) quotient_familial.conj : nb part associées au conjoint d'un couple marié ou pacsé quotient_familial.enf1 : nb part 2 premiers enfants quotient_familial.enf2 : nb part enfants de rang 3 ou plus quotient_familial.inv1 : nb part supp enfants invalides (I, G) quotient_familial.inv2 : nb part supp adultes invalides (R) quotient_familial.not31 : nb part supp note 3 : cases W ou G pour veuf, celib ou div quotient_familial.not32 : nb part supp note 3 : personne seule ayant élevé des enfants quotient_familial.not41 : nb part supp adultes invalides (vous et/ou conjoint) note 4 quotient_familial.not42 : nb part supp adultes anciens combattants (vous et/ou conjoint) note 4 quotient_familial.not6 : nb part supp note 6 quotient_familial.isol : demi-part parent isolé (T) quotient_familial.edcd : enfant issu du mariage avec conjoint décédé; ''' period = period.start.offset('first-of', 'year').period('year') nb_pac = simulation.calculate('nb_pac', period) marpac = simulation.calculate('marpac', period) celdiv = simulation.calculate('celdiv', period) veuf = simulation.calculate('veuf', period) jveuf = simulation.calculate('jveuf', period) nbF = simulation.calculate('nbF', period) nbG = simulation.calculate('nbG', period) nbH = simulation.calculate('nbH', period) nbI = simulation.calculate('nbI', period) nbR = simulation.calculate('nbR', period) nbJ = simulation.calculate('nbJ', period) caseP = simulation.calculate('caseP', period) caseW = simulation.calculate('caseW', period) caseG = simulation.calculate('caseG', period) caseE = simulation.calculate('caseE', period) caseK = simulation.calculate('caseK', period) caseN = simulation.calculate('caseN', period) caseF = simulation.calculate('caseF', period) caseS = simulation.calculate('caseS', period) caseL = simulation.calculate('caseL', period) caseT = simulation.calculate('caseT', period) quotient_familial = simulation.legislation_at(period.start).ir.quotient_familial no_pac = nb_pac == 0 # Aucune personne à charge en garde exclusive has_pac = not_(no_pac) no_alt = nbH == 0 # Aucun enfant à charge en garde alternée has_alt = not_(no_alt) # # nombre de parts liées aux enfants à charge # que des enfants en résidence alternée enf1 = (no_pac & has_alt) * (quotient_familial.enf1 * min_(nbH, 2) * 0.5 + quotient_familial.enf2 * max_(nbH - 2, 0) * 0.5) # pas que des enfants en résidence alternée enf2 = (has_pac & has_alt) * ((nb_pac == 1) * (quotient_familial.enf1 * min_(nbH, 1) * 0.5 + quotient_familial.enf2 * max_(nbH - 1, 0) * 0.5) + (nb_pac > 1) * (quotient_familial.enf2 * nbH * 0.5)) # pas d'enfant en résidence alternée enf3 = quotient_familial.enf1 * min_(nb_pac, 2) + quotient_familial.enf2 * max_((nb_pac - 2), 0) enf = enf1 + enf2 + enf3 # # note 2 : nombre de parts liées aux invalides (enfant + adulte) n2 = quotient_familial.inv1 * (nbG + nbI / 2) + quotient_familial.inv2 * nbR # # note 3 : Pas de personne à charge # - invalide n31a = quotient_familial.not31a * (no_pac & no_alt & caseP) # - ancien combatant n31b = quotient_familial.not31b * (no_pac & no_alt & (caseW | caseG)) n31 = max_(n31a, n31b) # - personne seule ayant élevé des enfants n32 = quotient_familial.not32 * (no_pac & no_alt & ((caseE | caseK) & not_(caseN))) n3 = max_(n31, n32) # # note 4 Invalidité de la personne ou du conjoint pour les mariés ou # # jeunes veuf(ve)s n4 = max_(quotient_familial.not41 * (1 * caseP + 1 * caseF), quotient_familial.not42 * (caseW | caseS)) # # note 5 # - enfant du conjoint décédé n51 = quotient_familial.cdcd * (caseL & ((nbF + nbJ) > 0)) # - enfant autre et parent isolé n52 = quotient_familial.isol * caseT * (((no_pac & has_alt) * ((nbH == 1) * 0.5 + (nbH >= 2))) + 1 * has_pac) n5 = max_(n51, n52) # # note 6 invalide avec personne à charge n6 = quotient_familial.not6 * (caseP & (has_pac | has_alt)) # # note 7 Parent isolé n7 = quotient_familial.isol * caseT * ((no_pac & has_alt) * ((nbH == 1) * 0.5 + (nbH >= 2)) + 1 * has_pac) # # Régime des mariés ou pacsés m = 1 + quotient_familial.conj + enf + n2 + n4 # # veufs hors jveuf v = 1 + enf + n2 + n3 + n5 + n6 # # celib div c = 1 + enf + n2 + n3 + n6 + n7 return period, (marpac | jveuf) * m + (veuf & not_(jveuf)) * v + celdiv * c ############################################################################### # # Calcul de la prime pour l'emploi ############################################################################### @reference_formula class ppe_coef(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"ppe_coef" def function(self, simulation, period): ''' PPE: coefficient de conversion en cas de changement en cours d'année ''' period = period.start.offset('first-of', 'year').period('year') jour_xyz = simulation.calculate('jour_xyz', period) nb_jour = (jour_xyz == 0) + jour_xyz return period, 360 / nb_jour @reference_formula class ppe_elig(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = FoyersFiscaux label = u"ppe_elig" def function(self, simulation, period): ''' PPE: eligibilité à la ppe, condition sur le revenu fiscal de référence 'foy' CF ligne 1: http://bofip.impots.gouv.fr/bofip/3913-PGP.html ''' period = period.start.offset('first-of', 'year').period('year') rfr = simulation.calculate('rfr', period) ppe_coef = simulation.calculate('ppe_coef', period) marpac = simulation.calculate('marpac', period) veuf = simulation.calculate('veuf', period) celdiv = simulation.calculate('celdiv', period) nbptr = simulation.calculate('nbptr', period) ppe = simulation.legislation_at(period.start).ir.credits_impot.ppe seuil = (veuf | celdiv) * (ppe.eligi1 + 2 * max_(nbptr - 1, 0) * ppe.eligi3) \ + marpac * (ppe.eligi2 + 2 * max_(nbptr - 2, 0) * ppe.eligi3) return period, (rfr * ppe_coef) <= seuil @reference_formula class ppe_rev(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"ppe_rev" def function(self, simulation, period): ''' base ressource de la ppe 'ind' ''' period = period.start.offset('first-of', 'year').period('year') salaire_imposable = simulation.calculate_add('salaire_imposable', period) hsup = simulation.calculate('hsup', period) rpns = simulation.calculate('rpns', period) ppe = simulation.legislation_at(period.start).ir.credits_impot.ppe # Revenu d'activité salarié rev_sa = salaire_imposable + hsup # TODO: + TV + TW + TX + AQ + LZ + VJ # Revenu d'activité non salarié rev_ns = min_(0, rpns) / ppe.abatns + max_(0, rpns) * ppe.abatns #TODO: très bizarre la partie min(0,rpns) - après vérification c'est dans la loi return period, rev_sa + rev_ns @reference_formula class ppe_coef_tp(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"ppe_coef_tp" def function(self, simulation, period): ''' PPE: coefficient de conversion temps partiel 'ind' ''' period = period.start.offset('first-of', 'year').period('year') ppe_du_sa = simulation.calculate('ppe_du_sa', period) ppe_du_ns = simulation.calculate('ppe_du_ns', period) ppe_tp_sa = simulation.calculate('ppe_tp_sa', period) ppe_tp_ns = simulation.calculate('ppe_tp_ns', period) ppe = simulation.legislation_at(period.start).ir.credits_impot.ppe frac_sa = ppe_du_sa / ppe.TP_nbh frac_ns = ppe_du_ns / ppe.TP_nbj tp = ppe_tp_sa | ppe_tp_ns | (frac_sa + frac_ns >= 1) return period, tp + not_(tp) * (frac_sa + frac_ns) @reference_formula class ppe_base(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"ppe_base" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') ppe_rev = simulation.calculate('ppe_rev', period) ppe_coef_tp = simulation.calculate('ppe_coef_tp', period) ppe_coef_holder = simulation.compute('ppe_coef', period) ppe_coef = self.cast_from_entity_to_roles(ppe_coef_holder) return period, ppe_rev / (ppe_coef_tp + (ppe_coef_tp == 0)) * ppe_coef @reference_formula class ppe_elig_i(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = Individus label = u"ppe_elig_i" def function(self, simulation, period): ''' Eligibilité individuelle à la ppe Attention : condition de plafonnement introduite dans ppe brute 'ind' ''' period = period.start.offset('first-of', 'year').period('year') ppe_rev = simulation.calculate('ppe_rev', period) ppe_coef_tp = simulation.calculate('ppe_coef_tp', period) ppe = simulation.legislation_at(period.start).ir.credits_impot.ppe return period, (ppe_rev >= ppe.seuil1) & (ppe_coef_tp != 0) @reference_formula class ppe_brute(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Prime pour l'emploi brute" def function(self, simulation, period): ''' Prime pour l'emploi (avant éventuel dispositif de cumul avec le RSA) 'foy' Cf. http://travail-emploi.gouv.fr/informations-pratiques,89/fiches-pratiques,91/remuneration,113/la-prime-pour-l-emploi-ppe,1034.html ''' period = period.start.offset('first-of', 'year').period('year') ppe_elig = simulation.calculate('ppe_elig', period) ppe_elig_i_holder = simulation.compute('ppe_elig_i', period) ppe_rev_holder = simulation.compute('ppe_rev', period) ppe_base_holder = simulation.compute('ppe_base', period) ppe_coef = simulation.calculate('ppe_coef', period) ppe_coef_tp_holder = simulation.compute('ppe_coef_tp', period) nb_pac = simulation.calculate('nb_pac', period) marpac = simulation.calculate('marpac', period) celdiv = simulation.calculate('celdiv', period) veuf = simulation.calculate('veuf', period) caseT = simulation.calculate('caseT', period) caseL = simulation.calculate('caseL', period) nbH = simulation.calculate('nbH', period) ppe = simulation.legislation_at(period.start).ir.credits_impot.ppe ppe_base = self.split_by_roles(ppe_base_holder) ppe_coef_tp = self.split_by_roles(ppe_coef_tp_holder) ppe_elig_i = self.split_by_roles(ppe_elig_i_holder) ppe_rev = self.split_by_roles(ppe_rev_holder) eliv, elic, eli1, eli2, eli3 = ppe_elig_i[VOUS], ppe_elig_i[CONJ], ppe_elig_i[PAC1], \ ppe_elig_i[PAC2], ppe_elig_i[PAC3] basevi, baseci = ppe_rev[VOUS], ppe_rev[CONJ] basev, basec, base1, base2, base3 = ppe_base[VOUS], ppe_base[CONJ], ppe_base[PAC1], ppe_base[PAC2], ppe_base[PAC1] coef_tpv, coef_tpc, coef_tp1, coef_tp2, coef_tp3 = ppe_coef_tp[VOUS], ppe_coef_tp[CONJ], \ ppe_coef_tp[PAC1], ppe_coef_tp[PAC2], ppe_coef_tp[PAC1] nb_pac_ppe = max_(0, nb_pac - eli1 - eli2 - eli3) ligne2 = marpac & xor_(basevi >= ppe.seuil1, baseci >= ppe.seuil1) ligne3 = (celdiv | veuf) & caseT & not_(veuf & caseT & caseL) ligne1 = not_(ligne2) & not_(ligne3) base_monact = ligne2 * (eliv * basev + elic * basec) base_monacti = ligne2 * (eliv * basevi + elic * baseci) def ppe_bar1(base): # cond1 = ligne1 | ligne3 # cond2 = ligne2 # return 1 / ppe_coef * ((cond1 & (base <= ppe.seuil2)) * (base) * ppe.taux1 + # (cond1 & (base > ppe.seuil2) & (base <= ppe.seuil3)) * (ppe.seuil3 - base) * ppe.taux2 + # (cond2 & (base <= ppe.seuil2)) * (base * ppe.taux1) + # (cond2 & (base > ppe.seuil2) & (base <= ppe.seuil3)) * ((ppe.seuil3 - base) * ppe.taux2) + # (cond2 & (base > ppe.seuil4) & (base <= ppe.seuil5)) * (ppe.seuil5 - base) * ppe.taux3) return (1 / ppe_coef) * ( ((base <= ppe.seuil2)) * (base) * ppe.taux1 + ((base > ppe.seuil2) & (base <= ppe.seuil3)) * (ppe.seuil3 - base) * ppe.taux2 + ligne2 * ((base > ppe.seuil4) & (base <= ppe.seuil5)) * (ppe.seuil5 - base) * ppe.taux3) def ppe_bar2(base): return (1 / ppe_coef) * ( (base <= ppe.seuil2) * (base) * ppe.taux1 + ((base > ppe.seuil2) & (base <= ppe.seuil3)) * (ppe.seuil3 - base1) * ppe.taux2) # calcul des primes individuelles. ppev = eliv * ppe_bar1(basev) ppec = elic * ppe_bar1(basec) ppe1 = eli1 * ppe_bar2(base1) ppe2 = eli2 * ppe_bar2(base2) ppe3 = eli3 * ppe_bar2(base3) # Primes de monoactivité ppe_monact_vous = (eliv & ligne2 & (basevi >= ppe.seuil1) & (basev <= ppe.seuil4)) * ppe.monact ppe_monact_conj = (elic & ligne2 & (baseci >= ppe.seuil1) & (basec <= ppe.seuil4)) * ppe.monact # Primes pour enfants à charge maj_pac = ppe_elig * (eliv | elic) * ( (ligne1 & marpac & ((ppev + ppec) != 0) & (min_(basev, basec) <= ppe.seuil3)) * ppe.pac * (nb_pac_ppe + nbH * 0.5) + (ligne1 & (celdiv | veuf) & eliv & (basev <= ppe.seuil3)) * ppe.pac * (nb_pac_ppe + nbH * 0.5) + (ligne2 & (base_monacti >= ppe.seuil1) & (base_monact <= ppe.seuil3)) * ppe.pac * (nb_pac_ppe + nbH * 0.5) + (ligne2 & (base_monact > ppe.seuil3) & (base_monact <= ppe.seuil5)) * ppe.pac * ((nb_pac_ppe != 0) + 0.5 * ((nb_pac_ppe == 0) & (nbH != 0))) + (ligne3 & (basevi >= ppe.seuil1) & (basev <= ppe.seuil3)) * ( (min_(nb_pac_ppe, 1) * 2 * ppe.pac + max_(nb_pac_ppe - 1, 0) * ppe.pac) + (nb_pac_ppe == 0) * (min_(nbH, 2) * ppe.pac + max_(nbH - 2, 0) * ppe.pac * 0.5)) + (ligne3 & (basev > ppe.seuil3) & (basev <= ppe.seuil5)) * ppe.pac * ((nb_pac_ppe != 0) * 2 + ((nb_pac_ppe == 0) & (nbH != 0)))) def coef(coef_tp): return (coef_tp <= 0.5) * coef_tp * 1.45 + (coef_tp > 0.5) * (0.55 * coef_tp + 0.45) ppe_vous = ppe_elig * (ppev * coef(coef_tpv) + ppe_monact_vous) ppe_conj = ppe_elig * (ppec * coef(coef_tpc) + ppe_monact_conj) ppe_pac1 = ppe_elig * (ppe1 * coef(coef_tp1)) ppe_pac2 = ppe_elig * (ppe2 * coef(coef_tp2)) ppe_pac3 = ppe_elig * (ppe3 * coef(coef_tp3)) ppe_tot = ppe_vous + ppe_conj + ppe_pac1 + ppe_pac2 + ppe_pac3 + maj_pac ppe_tot = (ppe_tot != 0) * max_(ppe.versmin, ppe_tot) # from pandas import DataFrame # decompo = {0: ppev, 1 :ppe_vous, 2: ppec,3: ppe_conj, 4: maj_pac, 5 : ppe_monact_vous, 6: ppe_monact_conj, #8: basev, 81 : basevi, 9: basec, 91 : baseci, 10:ppe_tot} # ppe DataFrame(decompo).to_string() return period, ppe_tot @reference_formula class ppe(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Prime pour l'emploi" url = "http://vosdroits.service-public.fr/particuliers/F2882.xhtml" def function(self, simulation, period): """ PPE effectivement versée 'foy' """ period = period.start.offset('first-of', 'year').period('year') ppe_brute = simulation.calculate('ppe_brute', period) rsa_act_i_holder = simulation.compute('rsa_act_i', period) # TODO: les foyers qui paient l'ISF n'ont pas le droit à la PPE rsa_act_i = self.split_by_roles(rsa_act_i_holder, roles = [VOUS, CONJ]) # On retranche le RSA activité de la PPE # Dans les agrégats officiels de la DGFP, c'est la PPE brute qu'il faut comparer ppe = max_(ppe_brute - rsa_act_i[VOUS] - rsa_act_i[CONJ], 0) return period, ppe PK'GrSllTopenfisca_france/model/prelevements_obligatoires/impot_revenu/charges_deductibles.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import logging from numpy import minimum as min_, maximum as max_ from ...base import * # noqa analysis:ignore log = logging.getLogger(__name__) # Csg déductible build_column('f6de', IntCol(entity = 'foy', label = u"CSG déductible calculée sur les revenus du patrimoine", val_type = "monetary", cerfa_field = u'6DE')) # Pensions alimentaires build_column('f6gi', IntCol(entity = 'foy', label = u"Pensions alimentaires versées à des enfants majeurs (décision de justice définitive avant 2006): 1er enfant", val_type = "monetary", cerfa_field = u'6GI')) build_column('f6gj', IntCol(entity = 'foy', label = u"Pensions alimentaires versées à des enfants majeurs (décision de justice définitive avant 2006): 2eme enfant", val_type = "monetary", cerfa_field = u'6GJ')) build_column('f6el', IntCol(entity = 'foy', label = u"Autres pensions alimentaires versées à des enfants majeurs: 1er enfant", val_type = "monetary", start = date(2006, 1, 1), cerfa_field = u'6EL')) build_column('f6em', IntCol(entity = 'foy', label = u"Autres pensions alimentaires versées à des enfants majeurs: 2eme enfant", val_type = "monetary", start = date(2006, 1, 1), cerfa_field = u'6EM')) build_column('f6gp', IntCol(entity = 'foy', label = u"Autres pensions alimentaires versées décision de justice définitive avant 2006 (mineurs, ascendants)", val_type = "monetary", cerfa_field = u'6GP')) build_column('f6gu', IntCol(entity = 'foy', label = u"Autres pensions alimentaires versées (mineurs, ascendants)", start = date(2006, 1, 1), val_type = "monetary", cerfa_field = u'6GU')) # Frais d'accueil d'une personne de plus de 75 ans dans le besoin build_column('f6eu', IntCol(entity = 'foy', label = u"Frais d'accueil de personnes de plus de 75 ans dans le besoin", val_type = "monetary", cerfa_field = u'6EU')) build_column('f6ev', PeriodSizeIndependentIntCol(entity = 'foy', label = u"Nombre de personnes de plus de 75 ans dans le besoin accueillies sous votre toit", cerfa_field = u'6EV')) # Déductions diverses build_column('f6dd', IntCol(entity = 'foy', label = u"Déductions diverses", val_type = "monetary", cerfa_field = u'6DD')) # Épargne retraite - PERP, PRÉFON, COREM et CGOS build_column('f6ps', IntCol(entity = 'ind', label = u"Plafond de déduction épargne retraite (plafond calculé sur les revenus perçus en n-1)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"6PS", QUIFOY['conj']: u"6PT", QUIFOY['pac1']: u"6PU", })) # (f6ps, f6pt, f6pu) build_column('f6rs', IntCol(entity = 'ind', label = u"Cotisations d'épargne retraite versées au titre d'un PERP, PREFON, COREM et C.G.O.S", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"6RS", QUIFOY['conj']: u"6RT", QUIFOY['pac1']: u"6RU", })) # (f6rs, f6rt, f6ru))) build_column('f6ss', IntCol(entity = 'ind', label = u"Rachat de cotisations PERP, PREFON, COREM et C.G.O.S", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"6SS", QUIFOY['conj']: u"6ST", QUIFOY['pac1']: u"6SU", })) # (f6ss, f6st, f6su))) # Souscriptions en faveur du cinéma ou de l’audiovisuel build_column('f6aa', IntCol(entity = 'foy', label = u"Souscriptions en faveur du cinéma ou de l’audiovisuel", val_type = "monetary", start = date(2005, 1, 1), end = date(2006, 12, 31), cerfa_field = u'6AA')) # TODO: ancien numéro de case, antérieur à 2008 ....au moins! vérifier pour 07-06-05 ect...probablement avant 2005 (autre nom en 12 et 13) # Souscriptions au capital des SOFIPÊCHE build_column('f6cc', IntCol(entity = 'foy', label = u"Souscriptions au capital des SOFIPÊCHE", val_type = "monetary", cerfa_field = u'CC', start = date(2005, 1, 1), end = date(2005, 12, 31))) # ancien numéro de case, antérieur à 2008 ....au moins vérifier pour 07-06-05 ect...probablement avant 2005 (autre nom en 12 et13) # Investissements DOM-TOM dans le cadre d’une entreprise < = 2005 # ou Versements sur un compte épargne codéveloppement build_column('f6eh', IntCol(entity = 'foy', label = u"", val_type = "monetary", start = date(2005, 1, 1), end = date(2005, 12, 31), cerfa_field = u'EH')) # TODO: vérifier date de début et de fin de cette case (rien en 12 et 13) # Pertes en capital consécutives à la souscription au capital de sociétés # nouvelles ou de sociétés en difficulté build_column('f6da', IntCol(entity = 'foy', label = u"Pertes en capital consécutives à la souscription au capital de sociétés nouvelles ou de sociétés en difficulté", val_type = "monetary", start = date(2005, 1, 1), end = date(2005, 12, 31), cerfa_field = u'DA')) # Dépenses de grosses réparations effectuées par les nus propriétaires build_column('f6cb', IntCol(entity = 'foy', label = u"Dépenses de grosses réparations effectuées par les nus-propriétaires (dépenses réalisées au cours de l'année de perception des revenus)", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = u'6CB')) # TODO: before 2006 wasPertes en capital consécutives à la souscription au capital de sociétés nouvelles ou de sociétés en difficulté (cases CB et DA de la déclaration complémentaire) build_column('f6hj', IntCol(entity = 'foy', label = u"Dépenses de grosses réparations effectuées par les nus-propriétaires: report des dépenses des années antérieures", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'6HJ')) build_column('f6hk', IntCol(entity = 'foy', label = u"Dépenses de grosses réparations effectuées par les nus-propriétaires: report des dépenses des années antérieures", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'6HK')) build_column('f6hl', IntCol(entity = 'foy', label = u"Dépenses de grosses réparations effectuées par les nus-propriétaires: report des dépenses des années antérieures", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'6HL')) build_column('f6hm', IntCol(entity = 'foy', label = u"Dépenses de grosses réparations effectuées par les nus-propriétaires: report des dépenses des années antérieures", val_type = "monetary", start = date(2013, 1, 1), cerfa_field = u'6HM')) # Sommes à rajouter au revenu imposable build_column('f6gh', IntCol(entity = 'foy', label = u"Sommes à ajouter au revenu imposable", val_type = "monetary", cerfa_field = u'6GH')) # Deficits antérieurs build_column('f6fa', IntCol(entity = 'foy', label = u"Deficits globaux des années antérieures non encore déduits les années précédentes: année de perception des revenus -6", val_type = "monetary", cerfa_field = u'6FA')) build_column('f6fb', IntCol(entity = 'foy', label = u"Deficits globaux des années antérieures non encore déduits: année de perception des revenus -5", val_type = "monetary", cerfa_field = u'6FB')) build_column('f6fc', IntCol(entity = 'foy', label = u"Deficits globaux des années antérieures non encore déduits: année de perception des revenus -4", val_type = "monetary", cerfa_field = u'6FC')) build_column('f6fd', IntCol(entity = 'foy', label = u"Deficits globaux des années antérieures non encore déduits: année de perception des revenus -3", val_type = "monetary", cerfa_field = u'6FD')) build_column('f6fe', IntCol(entity = 'foy', label = u"Deficits globaux des années antérieures non encore déduits: année de perception des revenus -2", val_type = "monetary", cerfa_field = u'6FE')) build_column('f6fl', IntCol(entity = 'foy', label = u"Deficits globaux des années antérieures non encore déduits: année de perception des revenus -1", val_type = "monetary", cerfa_field = u'6FL')) @reference_formula class rfr_cd(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Charges déductibles entrant dans le revenus fiscal de référence" url = "http://impotsurlerevenu.org/definitions/215-charge-deductible.php" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') cd_acc75a = simulation.calculate('cd_acc75a', period) cd_doment = simulation.calculate('cd_doment', period) cd_eparet = simulation.calculate('cd_eparet', period) cd_sofipe = simulation.calculate('cd_sofipe', period) return period, cd_acc75a + cd_doment + cd_eparet + cd_sofipe @reference_formula class cd1(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Charges déductibles non plafonnées" url = "http://impotsurlerevenu.org/definitions/215-charge-deductible.php" @dated_function(start = date(2002, 1, 1), stop = date(2003, 12, 31)) def function_20020101_20031231(self, simulation, period): ''' Renvoie la liste des charges déductibles avant rbg_int pour 2002 ''' period = period.start.offset('first-of', 'year').period('year') cd_penali = simulation.calculate('cd_penali', period) cd_acc75a = simulation.calculate('cd_acc75a', period) cd_percap = simulation.calculate('cd_percap', period) cd_deddiv = simulation.calculate('cd_deddiv', period) cd_doment = simulation.calculate('cd_doment', period) niches1 = cd_penali + cd_acc75a + cd_percap + cd_deddiv + cd_doment return period, niches1 @dated_function(start = date(2004, 1, 1), stop = date(2005, 12, 31)) def function_20040101_20051231(self, simulation, period): ''' Renvoie la liste des charges déductibles avant rbg_int pour 2004 ''' period = period.start.offset('first-of', 'year').period('year') cd_penali = simulation.calculate('cd_penali', period) cd_acc75a = simulation.calculate('cd_acc75a', period) cd_percap = simulation.calculate('cd_percap', period) cd_deddiv = simulation.calculate('cd_deddiv', period) cd_doment = simulation.calculate('cd_doment', period) cd_eparet = simulation.calculate('cd_eparet', period) niches1 = cd_penali + cd_acc75a + cd_percap + cd_deddiv + cd_doment + cd_eparet return period, niches1 @dated_function(start = date(2006, 1, 1), stop = date(2006, 12, 31)) def function_20060101_20061231(self, simulation, period): ''' Renvoie la liste des charges déductibles avant rbg_int pour 2006 ''' period = period.start.offset('first-of', 'year').period('year') cd_penali = simulation.calculate('cd_penali', period) cd_acc75a = simulation.calculate('cd_acc75a', period) cd_percap = simulation.calculate('cd_percap', period) cd_deddiv = simulation.calculate('cd_deddiv', period) cd_eparet = simulation.calculate('cd_eparet', period) niches1 = cd_penali + cd_acc75a + cd_percap + cd_deddiv + cd_eparet return period, niches1 @dated_function(start = date(2007, 1, 1), stop = date(2008, 12, 31)) def function_20070101_20081231(self, simulation, period): ''' Renvoie la liste des charges déductibles avant rbg_int pour 2007 ''' period = period.start.offset('first-of', 'year').period('year') cd_penali = simulation.calculate('cd_penali', period) cd_acc75a = simulation.calculate('cd_acc75a', period) cd_deddiv = simulation.calculate('cd_deddiv', period) cd_eparet = simulation.calculate('cd_eparet', period) niches1 = cd_penali + cd_acc75a + cd_deddiv + cd_eparet return period, niches1 @dated_function(start = date(2009, 1, 1), stop = date(2013, 12, 31)) def function_20090101_20131231(self, simulation, period): ''' Renvoie la liste des charges déductibles avant rbg_int pour 2009 ''' period = period.start.offset('first-of', 'year').period('year') cd_penali = simulation.calculate('cd_penali', period) cd_acc75a = simulation.calculate('cd_acc75a', period) cd_deddiv = simulation.calculate('cd_deddiv', period) cd_eparet = simulation.calculate('cd_eparet', period) cd_grorep = simulation.calculate('cd_grorep', period) niches1 = cd_penali + cd_acc75a + cd_deddiv + cd_eparet + cd_grorep return period, niches1 @dated_function(start = date(2014, 1, 1), stop = date(2014, 12, 31)) def function_20140101_20141231(self, simulation, period): ''' Renvoie la liste des charges déductibles avant rbg_int pour 2014 ''' period = period.start.offset('first-of', 'year').period('year') cd_penali = simulation.calculate('cd_penali', period) cd_acc75a = simulation.calculate('cd_acc75a', period) cd_deddiv = simulation.calculate('cd_deddiv', period) cd_eparet = simulation.calculate('cd_eparet', period) cd_grorep = simulation.calculate('cd_grorep', period) niches1 = cd_penali + cd_acc75a + cd_deddiv + cd_eparet + cd_grorep # log.error("Charges déductibles to be checked because not defined for %s", 2014) return period, niches1 @reference_formula class cd2(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Charges déductibles plafonnées" url = "http://impotsurlerevenu.org/definitions/215-charge-deductible.php" @dated_function(start = date(2002, 1, 1), stop = date(2005, 12, 31)) def function_20020101_20051231(self, simulation, period): ''' Renvoie la liste des charges déductibles à intégrer après le rbg_int ''' period = period.start.offset('first-of', 'year').period('year') cd_sofipe = simulation.calculate('cd_sofipe', period) cd_cinema = simulation.calculate('cd_cinema', period) niches2 = cd_sofipe + cd_cinema return period, niches2 @dated_function(start = date(2006, 1, 1), stop = date(2006, 12, 31)) def function_20060101_20061231(self, simulation, period): ''' Renvoie la liste des charges déductibles à intégrer après le rbg_int ''' period = period.start.offset('first-of', 'year').period('year') cd_sofipe = simulation.calculate('cd_sofipe', period) niches2 = cd_sofipe return period, niches2 @dated_function(start = date(2007, 1, 1), stop = date(2008, 12, 31)) def function_20070101_20081231(self, simulation, period): ''' Renvoie la liste des charges déductibles à intégrer après le rbg_int ''' period = period.start.offset('first-of', 'year').period('year') cd_ecodev = simulation.calculate('cd_ecodev', period) niches2 = cd_ecodev return period, niches2 @reference_formula class rbg_int(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Revenu brut global intermédiaire" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') rbg = simulation.calculate('rbg', period) cd1 = simulation.calculate('cd1', period) return period, max_(rbg - cd1, 0) @reference_formula class charges_deduc(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Charges déductibles" url = "http://impotsurlerevenu.org/definitions/215-charge-deductible.php" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') cd1 = simulation.calculate('cd1', period) cd2 = simulation.calculate('cd2', period) return period, cd1 + cd2 @reference_formula class cd_penali(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"cd_penali" url = "http://frederic.anne.free.fr/Cours/ITV.htm" def function(self, simulation, period): ''' Pensions alimentaires ''' period = period.start.offset('first-of', 'year').period('year') f6gi = simulation.calculate('f6gi', period) f6gj = simulation.calculate('f6gj', period) f6gp = simulation.calculate('f6gp', period) f6el = simulation.calculate('f6el', period) f6em = simulation.calculate('f6em', period) f6gu = simulation.calculate('f6gu', period) penalim = simulation.legislation_at(period.start).ir.charges_deductibles.penalim max1 = penalim.max taux_jgt_2006 = penalim.taux_jgt_2006 # TODO: si vous subvenez seul(e) à l'entretien d'un enfant marié ou # pacsé ou chargé de famille, quel que soit le nmbre d'enfants du jeune # foyer, la déduction est limitée à 2*max # S'il habite chez ses parents, max 3359, sinon 5698 return period, (min_(f6gi * (1 + taux_jgt_2006), max1) + min_(f6gj * (1 + taux_jgt_2006), max1) + min_(f6el, max1) + min_(f6em, max1) + f6gp * (1 + taux_jgt_2006) + f6gu) @reference_formula class cd_acc75a(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"cd_acc75a" def function(self, simulation, period): ''' Frais d’accueil sous votre toit d’une personne de plus de 75 ans ''' period = period.start.offset('first-of', 'year').period('year') f6eu = simulation.calculate('f6eu', period) f6ev = simulation.calculate('f6ev', period) acc75a = simulation.legislation_at(period.start).ir.charges_deductibles.acc75a amax = acc75a.max * max_(1, f6ev) return period, min_(f6eu, amax) @reference_formula class cd_percap(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"cd_percap" @dated_function(start = date(2002, 1, 1), stop = date(2002, 12, 31)) def function_20020101_20021231(self, simulation, period): ''' Pertes en capital consécutives à la souscription au capital de sociétés nouvelles ou de sociétés en difficulté (cases CB et DA de la déclaration complémentaire) ''' period = period.start.offset('first-of', 'year').period('year') f6cb = simulation.calculate('f6cb', period) marpac = simulation.calculate('marpac', period) percap = simulation.legislation_at(period.start).ir.charges_deductibles.percap max_cb = percap.max_cb * (1 + marpac) return period, min_(f6cb, max_cb) @dated_function(start = date(2003, 1, 1), stop = date(2006, 12, 31)) def function_20030101_20061231(self, simulation, period): ''' Pertes en capital consécutives à la souscription au capital de sociétés nouvelles ou de sociétés en difficulté (cases CB et DA de la déclaration complémentaire) ''' period = period.start.offset('first-of', 'year').period('year') f6cb = simulation.calculate('f6cb', period) f6da = simulation.calculate('f6da', period) marpac = simulation.calculate('marpac', period) percap = simulation.legislation_at(period.start).ir.charges_deductibles.percap max_cb = percap.max_cb * (1 + marpac) max_da = percap.max_da * (1 + marpac) return period, min_(min_(f6cb, max_cb) + min_(f6da, max_da), max_da) @reference_formula class cd_deddiv(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"cd_deddiv" def function(self, simulation, period): ''' Déductions diverses (case DD) ''' period = period.start.offset('first-of', 'year').period('year') f6dd = simulation.calculate('f6dd', period) return period, f6dd @reference_formula class cd_doment(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"cd_doment" start_date = date(2002, 1, 1) stop_date = date(2005, 12, 31) def function(self, simulation, period): ''' Investissements DOM-TOM dans le cadre d’une entreprise (case EH de la déclaration n° 2042 complémentaire) 2002-2005 ''' period = period.start.offset('first-of', 'year').period('year') f6eh = simulation.calculate('f6eh', period) return period, f6eh @reference_formula class cd_eparet(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"cd_eparet" start_date = date(2004, 1, 1) def function(self, simulation, period): ''' Épargne retraite - PERP, PRÉFON, COREM et CGOS 2004- ''' period = period.start.offset('first-of', 'year').period('year') f6ps_holder = simulation.compute('f6ps', period) f6rs_holder = simulation.compute('f6rs', period) f6ss_holder = simulation.compute('f6ss', period) f6ps = self.filter_role(f6ps_holder, role = VOUS) f6pt = self.filter_role(f6ps_holder, role = CONJ) f6pu = self.filter_role(f6ps_holder, role = PAC1) f6rs = self.filter_role(f6rs_holder, role = VOUS) f6rt = self.filter_role(f6rs_holder, role = CONJ) f6ru = self.filter_role(f6rs_holder, role = PAC1) f6ss = self.filter_role(f6ss_holder, role = VOUS) f6st = self.filter_role(f6ss_holder, role = CONJ) f6su = self.filter_role(f6ss_holder, role = PAC1) # TODO: En théorie, les plafonds de déductions (ps, pt, pu) sont calculés sur # le formulaire 2041 GX return period, ((f6ps == 0) * (f6rs + f6ss) + (f6ps != 0) * min_(f6rs + f6ss, f6ps) + (f6pt == 0) * (f6rt + f6st) + (f6pt != 0) * min_(f6rt + f6st, f6pt) + (f6pu == 0) * (f6ru + f6su) + (f6pu != 0) * min_(f6ru + f6su, f6pu)) @reference_formula class cd_sofipe(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"cd_sofipe" start_date = date(2002, 1, 1) stop_date = date(2006, 12, 31) def function(self, simulation, period): ''' Souscriptions au capital des SOFIPÊCHE (case CC de la déclaration complémentaire) 2002-2006 ''' period = period.start.offset('first-of', 'year').period('year') f6cc = simulation.calculate('f6cc', period) rbg_int = simulation.calculate('rbg_int', period) marpac = simulation.calculate('marpac', period) sofipe = simulation.legislation_at(period.start).ir.charges_deductibles.sofipe max1 = min_(sofipe.taux * rbg_int, sofipe.max * (1 + marpac)) return period, min_(f6cc, max1) @reference_formula class cd_cinema(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"cd_cinema" start_date = date(2002, 1, 1) stop_date = date(2005, 12, 31) def function(self, simulation, period): ''' Souscriptions en faveur du cinéma ou de l’audiovisuel (case AA de la déclaration n° 2042 complémentaire) 2002-2005 ''' period = period.start.offset('first-of', 'year').period('year') f6aa = simulation.calculate('f6aa', period) rbg_int = simulation.calculate('rbg_int', period) cinema = simulation.legislation_at(period.start).ir.charges_deductibles.cinema max1 = min_(cinema.taux * rbg_int, cinema.max) return period, min_(f6aa, max1) @reference_formula class cd_ecodev(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"cd_ecodev" start_date = date(2007, 1, 1) stop_date = date(2008, 12, 31) def function(self, simulation, period): ''' Versements sur un compte épargne codéveloppement (case EH de la déclaration complémentaire) 2007-2008 ''' period = period.start.offset('first-of', 'year').period('year') f6eh = simulation.calculate('f6eh', period) rbg_int = simulation.calculate('rbg_int', period) ecodev = simulation.legislation_at(period.start).ir.charges_deductibles.ecodev max1 = min_(ecodev.taux * rbg_int, ecodev.max) return period, min_(f6eh, max1) @reference_formula class cd_grorep(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"cd_grorep" start_date = date(2009, 1, 1) def function(self, simulation, period): ''' Dépenses de grosses réparations des nus-propriétaires (case 6CB et 6HJ) 2009- ''' period = period.start.offset('first-of', 'year').period('year') f6cb = simulation.calculate('f6cb', period) f6hj = simulation.calculate('f6hj', period) f6hk = simulation.calculate('f6hk', period) f6hl = simulation.calculate('f6hl', period) grorep = simulation.legislation_at(period.start).ir.charges_deductibles.grorep return period, min_(f6cb + f6hj + f6hk + f6hl, grorep.max) PKF\J֖֖]openfisca_france/model/prelevements_obligatoires/impot_revenu/variables_reductions_credits.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from ...base import * # noqa # Dons à des organismes établis en France build_column('f7ud', IntCol(entity = 'foy', label = u"Dons à des organismes d'aide aux personnes en difficulté", val_type = "monetary", cerfa_field = u'7UD')) build_column('f7uf', IntCol(entity = 'foy', label = u"Dons à d'autres oeuvres d'utilité publique ou fiscalement assimilables aux oeuvres d'intérêt général", val_type = "monetary", cerfa_field = u'7UF')) # début/fin ? build_column('f7xs', IntCol(entity = 'foy', label = u"Report des années antérieures des dons (report des réductions et crédits d'impôt): année de perception des revenus -5", val_type = "monetary", cerfa_field = u'7XS')) build_column('f7xt', IntCol(entity = 'foy', label = u"Report des années antérieures des dons (report des réductions et crédits d'impôt): année de perception des revenus -4", val_type = "monetary", cerfa_field = u'7XT')) build_column('f7xu', IntCol(entity = 'foy', label = u"Report des années antérieures des dons (report des réductions et crédits d'impôt): année de perception des revenus -3", val_type = "monetary", start = date(2006, 1, 1), cerfa_field = u'7XU')) build_column('f7xw', IntCol(entity = 'foy', label = u"Report des années antérieures des dons (report des réductions et crédits d'impôt): année de perception des revenus -2", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'7XW')) build_column('f7xy', IntCol(entity = 'foy', label = u"Report des années antérieures des dons (report des réductions et crédits d'impôt): année de perception des revenus -1", val_type = "monetary", start = date(2008, 1, 1), cerfa_field = u'7XY')) build_column('f7va', IntCol(entity = 'foy', label = u"Dons à des organismes d'aides aux personnes établis dans un Etat européen", val_type = "monetary", cerfa_field = u'7VA', start = date(2011, 1, 1))) build_column('f7vc', IntCol(entity = 'foy', label = u"Dons à des autres organismes établis dans un Etat européen", val_type = "monetary", cerfa_field = u'7VC', start = date(2011, 1, 1))) # f7va, f7vc 2011 ou 2013 ? # Cotisations syndicales des salariées et pensionnés build_column('f7ac', IntCol(entity = 'ind', label = u"Cotisations syndicales des salariées et pensionnés", val_type = "monetary", start = date(2013, 1, 1), cerfa_field = {QUIFOY['vous']: u"7AC", QUIFOY['conj']: u"7AE", QUIFOY['pac1']: u"7AG", })) # f7ac, f7ae, f7ag # Salarié à domicile build_column('f7db', IntCol(entity = 'foy', label = u"Sommes versées pour l'emploi d'un salarié à domicile par les personnes ayant excercé une activité professionnelle ou ayant été demandeur d'emploi l'année de perception des revenus déclarés", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'7DB')) build_column('f7df', IntCol(entity = 'foy', label = u"Sommes versées pour l'emploi d'un salarié à domicile par les personnes retraités, ou inactives l'année de perception des revenus déclarés", val_type = "monetary", cerfa_field = u'7DF')) build_column('f7dq', BoolCol(entity = 'foy', label = u"Emploi direct pour la première fois d'un salarié à domicile durant l'année de perception des revenus déclarés", start = date(2009, 1, 1), cerfa_field = u'7DQ')) build_column('f7dg', BoolCol(entity = 'foy', label = u"Vous, votre conjoint ou une personne à votre charge à une carte d'invalidité d'au moins 80 % l'année de perception des revenus déclarés", cerfa_field = u'7DG')) build_column('f7dl', IntCol(entity = 'foy', label = u"Nombre d'ascendants bénéficiaires de l'APA, âgés de plus de 65 ans, pour lesquels des dépenses ont été engagées l'année de perception des revenus déclarés", cerfa_field = u'7DL')) # Intérêt des emprunts contractés pour l'acquisition ou la construction de l'habitation principale build_column('f7uh_2007', IntCol(entity = 'foy', label = u"Intérêts payés la première année de remboursement du prêt pour l'habitation principale", val_type = "monetary", cerfa_field = u'7UH', start = date(2007, 1, 1), end = date(2007, 12, 31))) build_column('f7vy', IntCol(entity = 'foy', label = u"Intérêt des emprunts contractés pour l'acquisition ou la construction de l'habitation principale: logements anciens (acquis entre le 06/05/2007 et le 30/09/2011) ou neufs (acquis entre le 06/05/2007 et le 31/12/2009): Première annuité", val_type = "monetary", start = date(2008, 1, 1), cerfa_field = u'7VY')) build_column('f7vz', IntCol(entity = 'foy', label = u"Intérêt des emprunts contractés pour l'acquisition ou la construction de l'habitation principale: logements anciens (acquis entre le 06/05/2007 et le 30/09/2011) ou neufs (acquis entre le 06/05/2007 et le 31/12/2009): annuités suivantes", val_type = "monetary", start = date(2008, 1, 1), cerfa_field = u'7VZ')) build_column('f7vx', IntCol(entity = 'foy', label = u"Intérêt des emprunts contractés pour l'acquisition ou la construction de l'habitation principale: logements neufs BBC acquis ou construits du 01/01/2009 au 30/09/2011", val_type = "monetary", cerfa_field = u'7VX')) build_column('f7vw', IntCol(entity = 'foy', label = u"Intérêt des emprunts contractés pour l'acquisition ou la construction de l'habitation principale: logements neufs non-BBC acquis ou construits du 01/01/2010 au 31/12/2010: première annuité", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7VW')) build_column('f7vv', IntCol(entity = 'foy', label = u"Intérêt des emprunts contractés pour l'acquisition ou la construction de l'habitation principale: logements neufs non-BBC acquis ou construits du 01/01/2010 au 31/12/2010: annuités suivantes", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7VV')) # TODO: variable non présente dans OF, à intégrer partout où c'est nécessaire build_column('f7vu', IntCol(entity = 'foy', label = u"Intérêt des emprunts contractés pour l'acquisition ou la construction de l'habitation principale: logements neufs non-BBC acquis ou construits du 01/01/2011 au 30/09/2011: première annuité", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7VU')) # TODO: variable non présente dans OF, à intégrer partout où c'est nécessaire build_column('f7vt', IntCol(entity = 'foy', label = u"Intérêt des emprunts contractés pour l'acquisition ou la construction de l'habitation principale: logements neufs non-BBC acquis ou construits du 01/01/2011 au 30/09/2011: annuités suivantes", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7VT')) # TODO: variable non présente dans OF, à intégrer partout où c'est nécessaire # Dépenses d'accueil dans un établissement pour personnes âgées dépendantes build_column('f7cd', IntCol(entity = 'foy', label = u"Dépenses d'accueil dans un établissement pour personnes âgées dépendantes: 1ere personne", val_type = "monetary", cerfa_field = u'7CD')) build_column('f7ce', IntCol(entity = 'foy', label = u"Dépenses d'accueil dans un établissement pour personnes âgées dépendantes: 2éme personne", val_type = "monetary", cerfa_field = u'7CE')) # Frais de garde des enfants de moins de 6 ans au 01/01 de l'année de perception des revenus build_column('f7ga', IntCol(entity = 'foy', label = u"Frais de garde des enfants de moins de 6 ans au 01/01 de l'année de perception des revenus: 1er enfant à charge", val_type = "monetary", cerfa_field = u'7GA')) build_column('f7gb', IntCol(entity = 'foy', label = u"Frais de garde des enfants de moins de 6 ans au 01/01 de l'année de perception des revenus: 2ème enfant à charge", val_type = "monetary", cerfa_field = u'7GB')) build_column('f7gc', IntCol(entity = 'foy', label = u"Frais de garde des enfants de moins de 6 ans au 01/01 de l'année de perception des revenus: 3ème enfant à charge", val_type = "monetary", cerfa_field = u'7GC')) build_column('f7ge', IntCol(entity = 'foy', label = u"Frais de garde des enfants de moins de 6 ans au 01/01 de l'année de perception des revenus: 1er enfant à charge en résidence alternée", val_type = "monetary", cerfa_field = u'7GE')) build_column('f7gf', IntCol(entity = 'foy', label = u"Frais de garde des enfants de moins de 6 ans au 01/01 de l'année de perception des revenus: 2ème enfant à charge en résidence alternée", val_type = "monetary", cerfa_field = u'7GF')) build_column('f7gg', IntCol(entity = 'foy', label = u"Frais de garde des enfants de moins de 6 ans au 01/01 de l'année de perception des revenus: 3ème enfant à charge en résidence alternée", val_type = "monetary", cerfa_field = u'7GG')) # Nombre d'enfants à charge poursuivant leurs études build_column('f7ea', PeriodSizeIndependentIntCol(entity = 'foy', label = u"Nombre d'enfants à charge poursuivant leurs études au collège", cerfa_field = u'7EA')) build_column('f7eb', PeriodSizeIndependentIntCol(entity = 'foy', label = u"Nombre d'enfants à charge en résidence alternée poursuivant leurs études au collège", cerfa_field = u'7EB')) build_column('f7ec', PeriodSizeIndependentIntCol(entity = 'foy', label = u"Nombre d'enfants à charge poursuivant leurs études au lycée", cerfa_field = u'7EC')) build_column('f7ed', PeriodSizeIndependentIntCol(entity = 'foy', label = u"Nombre d'enfants à charge en résidence alternée poursuivant leurs études au lycée", cerfa_field = u'7ED')) build_column('f7ef', PeriodSizeIndependentIntCol(entity = 'foy', label = u"Nombre d'enfants à charge poursuivant leurs études dans l'enseignement supérieur", cerfa_field = u'7EF')) build_column('f7eg', PeriodSizeIndependentIntCol(entity = 'foy', label = u"Nombre d'enfants à charge en résidence alternée poursuivant leurs études dans l'enseignement supérieur", cerfa_field = u'7EG')) # Intérêts des prêts étudiants build_column('f7td', IntCol(entity = 'foy', label = u"Intérêts des prêts étudiants versés avant l'année de perception des revenus déclarés", val_type = "monetary", start = date(2008, 1, 1), cerfa_field = u'7TD')) build_column('f7vo', PeriodSizeIndependentIntCol(entity = 'foy', label = u"Nombre d'années de remboursement du prêt étudiant avant l'année de perception des revenus déclarés", start = date(2006, 1, 1), cerfa_field = u'7VO')) build_column('f7uk', IntCol(entity = 'foy', label = u"Intérêts des prêts étudiants versés durant l'année de perception des revenus déclarés", val_type = "monetary", cerfa_field = u'7UK')) # Primes de rente survie, contrats d'épargne handicap build_column('f7gz', IntCol(entity = 'foy', label = u"Primes de rente survie, contrats d'épargne handicap", val_type = "monetary", cerfa_field = u'7GZ')) # Prestations compensatoires build_column('f7wm', IntCol(entity = 'foy', label = u"Prestations compensatoires: Capital fixé en substitution de rente", val_type = "monetary", cerfa_field = u'7WM')) build_column('f7wn', IntCol(entity = 'foy', label = u"Prestations compensatoires: Sommes versées l'année de perception des revenus déclarés", val_type = "monetary", cerfa_field = u'7WN')) build_column('f7wo', IntCol(entity = 'foy', label = u"Prestations compensatoires: Sommes totales décidées par jugement l'année de perception des revenus déclarés ou capital reconstitué", val_type = "monetary", cerfa_field = u'7WO')) build_column('f7wp', IntCol(entity = 'foy', label = u"Prestations compensatoires: Report des sommes décidées l'année de perception des revenus -1", val_type = "monetary", cerfa_field = u'7WP')) # Dépenses en faveur de la qualité environnementale de l'habitation principale build_column('f7we', BoolCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: éco-prêt à taux zéro avec offre de prêt émise l'année de perception des revenus déclarés", start = date(2009, 1, 1), cerfa_field = u'7WE')) build_column('f7wg', BoolCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: éco-prêt à taux zéro avec offre de prêt émise l'année de perception des revenus déclarés -1", val_type = "monetary", cerfa_field = u'7WG', start = date(2012, 1, 1))) build_column('f7wa', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: travaux d'isolation thermique des murs avant le 03/04/2012", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7WA')) build_column('f7wb', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: travaux d'isolation thermique des murs à compter du 04/04/2012", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7WB')) build_column('f7wc', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: travaux d'isolation thermique sur plus de la moitié de la surface des murs extérieurs", start = date(2012, 1, 1), cerfa_field = u'7WC')) build_column('f7ve', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: travaux d'isolation thermique de la toiture avant le 04/04/2012", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7VE')) build_column('f7vf', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: travaux d'isolation thermique de la toiture à compter du 04/04/2012", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7VF')) build_column('f7vg', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: travaux d'isolation thermique de toute la toiture", start = date(2012, 1, 1), cerfa_field = u'7VG')) build_column('f7sg', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: Matériaux d'isolation thermique des murs (acquisitionn et pose)", start = date(2012, 1, 1), cerfa_field = u'7SG')) build_column('f7sj', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: Matériaux d'isolation thermique des parois vitrées", start = date(2012, 1, 1), cerfa_field = u'7SJ')) build_column('f7sk', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: Volets isolants", start = date(2012, 1, 1), cerfa_field = u'7SK')) build_column('f7sl', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: Portes d'entrées donnant sur l'extérieur", start = date(2012, 1, 1), cerfa_field = u'7SL')) build_column('f7sm', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: Équipements de production d'électricité utilisant l'énergie radiative du soleil", start = date(2012, 1, 1), cerfa_field = u'7SM')) build_column('f7sn', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: Appareils de chauffage au bois ou autres biomasses remplaçant un appareil équivalent", start = date(2012, 1, 1), cerfa_field = u'7SN')) build_column('f7so', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: Appareils de chauffage au bois ou autres biomasses ne remplaçant pas un appareil équivalent", start = date(2012, 1, 1), cerfa_field = u'7SO')) build_column('f7sp', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: Pompes à chaleur autres que air/air et autres que géothermiques dont la finalité essentielle est la production de chaleur", start = date(2012, 1, 1), cerfa_field = u'7SP')) build_column('f7sq', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: Pompes à chaleur géothermiques dont la finalité essentielle est la production de chaleur", start = date(2012, 1, 1), cerfa_field = u'7SQ')) build_column('f7sr', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: Pompes à chaleur (autres que air/air) dédiées à la production d'eau chaude sanitaire (chauffe-eaux thermodynamiques)", start = date(2012, 1, 1), cerfa_field = u'7SR')) build_column('f7ss', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: Équipements de fourniture d'eau chaude sanitaire fonctionnant à l'énergie solaire et dotés de capteurs solaires", start = date(2012, 1, 1), cerfa_field = u'7SS')) build_column('f7st', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: Autres équipements de production d'énergie utilisant une source d'énergie renouvelable (éolien, hydraulique)", start = date(2012, 1, 1), cerfa_field = u'7ST')) build_column('f7su', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: Équipements de récupération et de traitement des eaux pluviales", start = date(2012, 1, 1), cerfa_field = u'7SU')) build_column('f7sv', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: Diagnostic de performance énergétique", start = date(2012, 1, 1), cerfa_field = u'7SV')) build_column('f7sw', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: Équipements de raccordement à un réseau de chaleur", start = date(2012, 1, 1), cerfa_field = u'7SW')) # TODO, nouvelle variable à intégrer dans OF (cf ancien nom déjà utilisé) # TODO vérifier pour les années précédentes # TODO: CHECK # Intérêts d'emprunts # build_column('f7wg', IntCol(entity = 'foy', label = u"Intérêts d'emprunts", val_type = "monetary", cerfa_field = u'7')) # cf pour quelle année # build_column('f7wq', BoolCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: dépenses d'isolation thermique des parois vitrées du 01/01/2012 au 03/04/2012", start = date(2010, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7WQ')) build_column('f7ws', BoolCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: dépenses d'isolations des parois vitrées à compter du 04/04/2012", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7WS')) build_column('f7wt', BoolCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: dépenses d'isolation thermique des parois vitrées réalisées sur au moins la moitié des fenêtres du logement ", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7WT')) build_column('f7wu', BoolCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: achat de volets avant 2012", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7WU')) build_column('f7wv', BoolCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: achat de volets en 2012", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7WV')) build_column('f7ww', BoolCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: achat de portes avant 2012", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7WW')) build_column('f7wx', BoolCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: achat de portes en 2012", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7WX')) build_column('f7wh', BoolCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale (logement achevé depuis plus de 2 ans): bouquet de travaux réalisé pendant l'année de perception des revenus", start = date(2013, 1, 1), cerfa_field = u'7WH')) build_column('f7wk', BoolCol(entity = 'foy', label = u"Votre habitation principale est une maison individuelle", start = date(2009, 1, 1), cerfa_field = u'7WK')) build_column('f7wf', BoolCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale: dépenses d'isolation thermique des parois vitrées avant le 01/01/n-1", end = date(2013, 12, 31), cerfa_field = u'7WF')) # Dépenses en faveur de l'aide aux personnes réalisées dans l'habitation principale build_column('f7wi', IntCol(entity = 'foy', label = u"Dépenses en faveur de l'aide aux personnes réalisées dans l'habitation principale: Ascenseurs électriques à traction", val_type = "monetary", cerfa_field = u'7WI', end = date(2012, 12, 31))) build_column('f7wj', IntCol(entity = 'foy', label = u"Dépenses en faveur de l'aide aux personnes réalisées dans l'habitation principale: équipements spécialement conçus pour les personnes âgées ou handicapées", val_type = "monetary", cerfa_field = u'7WJ')) build_column('f7wl', IntCol(entity = 'foy', label = u"Dépenses en faveur de l'aide aux personnes réalisées dans l'habitation principale: travaux de prévention des risques technologiques", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7WL')) build_column('f7wr', IntCol(entity = 'foy', label = u"Dépenses en faveur de l'aide aux personnes réalisées dans des habitations données en location : travaux de prévention des risques technologiques", val_type = "monetary", start = date(2013, 1, 1), cerfa_field = u'7WR')) # Investissements dans les DOM-TOM dans le cadre d'une entrepise build_column('f7ur', IntCol(entity = 'foy', label = u"Investissements réalisés en n-1, total réduction d’impôt", val_type = "monetary", cerfa_field = u'7UR', end = date(2008, 12, 31))) build_column('f7oz', IntCol(entity = 'foy', label = u"Investissements outre-mer: report de réduction d'impôt non imputée les années antérieures année n-6", val_type = "monetary", cerfa_field = u'7OZ', end = date(2011, 12, 31))) # TODO: vérifier les années antérieures build_column('f7pz', IntCol(entity = 'foy', label = u"Investissements outre-mer réalisés en 2007 dans le cadre d'une entreprise: report de réduction d'impôt non imputée les années antérieures", val_type = "monetary", cerfa_field = u'7PZ', end = date(2013, 12, 31))) build_column('f7qz', IntCol(entity = 'foy', label = u"Investissements outre-mer réalisés en 2008 dans le casdre d'une entreprise: report de réduction d'impôt non imputée les années antérieures", val_type = "monetary", cerfa_field = u'7QZ', end = date(2012, 12, 31))) build_column('f7rz', IntCol(entity = 'foy', label = u"Investissements outre-mer: report de réduction d'impôt non imputée les années antérieures année n-3", val_type = "monetary", cerfa_field = u'7RZ', end = date(2010, 12, 31))) build_column('f7qv', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements immobliliers engagés avant le 1.1.2011 et investissements ayant reçu un agrément avant le 5.12.2010, nvestissements ayant fait l'objet avant 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%", val_type = "monetary", cerfa_field = u'7QV', end = date(2011, 12, 31))) build_column('f7qo', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements immobliliers engagés avant le 1.1.2011 et investissements ayant reçu un agrément avant le 5.12.2010 à hauteur de 50%", val_type = "monetary", cerfa_field = u'7QO', end = date(2009, 12, 31))) build_column('f7qp', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements immobliliers engagés avant le 1.1.2011 et investissements ayant reçu un agrément avant le 5.12.2010 à hauteur de 60%", val_type = "monetary", cerfa_field = u'7QP', end = date(2009, 12, 31))) build_column('f7pa', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63%", val_type = "monetary", cerfa_field = u'7PA', end = date(2011, 12, 31))) build_column('f7pb', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5%", val_type = "monetary", cerfa_field = u'7PB', end = date(2011, 12, 31))) build_column('f7pc', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements dans votre entreprise, montant de la réduction d' impôt calculée", val_type = "monetary", cerfa_field = u'7PC', end = date(2011, 12, 31))) build_column('f7pd', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements dans votre entreprise, montant de la réduction d' impôt dont vous demandez l'imputation en 2011", val_type = "monetary", cerfa_field = u'7PD', end = date(2011, 12, 31))) build_column('f7qe', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet avant 1.1.2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%", val_type = "monetary", cerfa_field = u'7QE', end = date(2009, 12, 31))) build_column('f7pe', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63%", val_type = "monetary", cerfa_field = u'7PE', end = date(2011, 12, 31))) build_column('f7pf', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5%", val_type = "monetary", cerfa_field = u'7PF', end = date(2011, 12, 31))) build_column('f7pg', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements dans votre entreprise, montant de la réduction d' impôt calculée", val_type = "monetary", cerfa_field = u'7PG', end = date(2011, 12, 31))) build_column('f7ph', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements dans votre entreprise, montant de la réduction d' impôt dont vous demandez l'imputation en 2011", val_type = "monetary", cerfa_field = u'7PH', end = date(2011, 12, 31))) build_column('f7pi', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63%", val_type = "monetary", cerfa_field = u'7PI', end = date(2011, 12, 31))) build_column('f7pj', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5%", val_type = "monetary", cerfa_field = u'7PJ', end = date(2011, 12, 31))) build_column('f7pk', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements dans votre entreprise, montant de la réduction d' impôt calculée", val_type = "monetary", cerfa_field = u'7PK', end = date(2011, 12, 31))) build_column('f7pl', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements dans votre entreprise, montant de la réduction d' impôt dont vous demandez l'imputation en 2011", val_type = "monetary", cerfa_field = u'7PL', end = date(2011, 12, 31))) build_column('f7pm', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet avant 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%", cerfa_field = u'7PM', end = date(2013, 12, 31))) build_column('f7pn', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 50 %", cerfa_field = u'7PN', end = date(2013, 12, 31))) build_column('f7po', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 60 %", cerfa_field = u'7PO', end = date(2013, 12, 31))) build_column('f7pp', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise", cerfa_field = u'7PP', end = date(2013, 12, 31))) build_column('f7pq', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt calculée", cerfa_field = u'7PQ', end = date(2013, 12, 31))) build_column('f7pr', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt dont vous demandez l'imputation en 2012", cerfa_field = u'7PR', end = date(2013, 12, 31))) build_column('f7ps', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 50 %", cerfa_field = u'7PS', end = date(2013, 12, 31))) build_column('f7pt', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 60 %", cerfa_field = u'7PT', end = date(2013, 12, 31))) build_column('f7pu', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise", cerfa_field = u'7PU', end = date(2013, 12, 31))) build_column('f7pv', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt calculée", cerfa_field = u'7PV', end = date(2013, 12, 31))) build_column('f7pw', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt dont vous demandez l'imputation en 2012", cerfa_field = u'7PW', end = date(2013, 12, 31))) build_column('f7px', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63 %", cerfa_field = u'7PX', end = date(2013, 12, 31))) build_column('f7py', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5 %", cerfa_field = u'7PY', start = date(2012, 1, 1))) build_column('f7rg', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise", cerfa_field = u'7RG', start = date(2012, 1, 1))) build_column('f7rh', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt calculée", cerfa_field = u'7RH', start = date(2012, 1, 1))) build_column('f7ri', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2012, Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50%, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt dont vous demandez l'imputation en 2012", cerfa_field = u'7RI', start = date(2012, 1, 1))) build_column('f7rj', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet avant 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %", cerfa_field = u'7RJ', start = date(2012, 1, 1))) build_column('f7rk', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63 %", cerfa_field = u'7RK', start = date(2012, 1, 1))) build_column('f7rl', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5 %", cerfa_field = u'7RL', start = date(2012, 1, 1))) build_column('f7rm', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise", cerfa_field = u'7RM', start = date(2012, 1, 1))) build_column('f7rn', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt calculée", cerfa_field = u'7RN', start = date(2012, 1, 1))) build_column('f7ro', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt dont vous demandez l'imputation en 2012", cerfa_field = u'7RO', start = date(2012, 1, 1))) build_column('f7rp', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63 %", cerfa_field = u'7RP', start = date(2012, 1, 1))) build_column('f7rq', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5 %", cerfa_field = u'7RQ', start = date(2012, 1, 1))) build_column('f7rr', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise", cerfa_field = u'7RR', start = date(2012, 1, 1))) build_column('f7rs', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt calculée", cerfa_field = u'7RS', start = date(2012, 1, 1))) build_column('f7rt', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2010 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt dont vous demandez l'imputation en 2012", cerfa_field = u'7RT', start = date(2012, 1, 1))) build_column('f7ru', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63 %", cerfa_field = u'7RU', start = date(2012, 1, 1))) build_column('f7rv', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5 %", cerfa_field = u'7RV', start = date(2012, 1, 1))) build_column('f7rw', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise", cerfa_field = u'7RW', start = date(2012, 1, 1))) build_column('f7rx', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt calculée", cerfa_field = u'7RX', start = date(2012, 1, 1))) build_column('f7ry', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements ayant fait l'objet en 2011 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 %, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt dont vous demandez l'imputation en 2012", cerfa_field = u'7RY', start = date(2012, 1, 1))) build_column('f7nu', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 52,63 %", cerfa_field = u'7NU', start = date(2012, 1, 1))) build_column('f7nv', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 62,5 %", cerfa_field = u'7NV', start = date(2012, 1, 1))) build_column('f7nw', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, investissements dans votre entreprise", cerfa_field = u'7NW', start = date(2012, 1, 1))) build_column('f7nx', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt calculée", cerfa_field = u'7NX', start = date(2012, 1, 1))) build_column('f7ny', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, investissements dans votre entreprise avec exploitation directe, montant de la réduction d'impôt dont vous demandez l'imputation en 2012", cerfa_field = u'7NY', start = date(2012, 1, 1))) #TODO: 7N* : end ? build_column('f7mn', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise REPORT : Investissements réalisés en 2010, Investissements ayant fait l'objet avant 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%", val_type = "monetary", cerfa_field = u'7MN', start = date(2011, 1, 1), end = date(2012, 12, 31))) build_column('f7lh', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise REPORT : Investissements réalisés en 2010, Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 50%", val_type = "monetary", cerfa_field = u'7LH', end = date(2011, 12, 31))) build_column('f7mb', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise REPORT : Investissements réalisés en 2010, Investissements ayant fait l'objet en 2009 d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un accompte d'au moins 50%, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 60%", val_type = "monetary", cerfa_field = u'7MB', start = date(2011, 1, 1), end = date(2012, 12, 31))) build_column('f7kt', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise REPORT : Investissements réalisés en 2010, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt, Investissements dans votre entreprise", val_type = "monetary", cerfa_field = u'7KT', start = date(2011, 1, 1), end = date(2012, 12, 31))) build_column('f7li', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise REPORT : Investissements réalisés en 2010, Autres investissements réalisés en 2010, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 50%", val_type = "monetary", cerfa_field = u'7LI', start = date(2011, 1, 1))) build_column('f7mc', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise REPORT : Investissements réalisés en 2010, Autres investissements réalisés en 2010, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt à hauteur de 60%", val_type = "monetary", cerfa_field = u'7MC', start = date(2011, 1, 1), end = date(2012, 12, 31))) build_column('f7ku', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise REPORT : Investissements réalisés en 2010, Investissements dans votre entreprise", val_type = "monetary", cerfa_field = u'7KU', start = date(2011, 1, 1), end = date(2011, 12, 31))) # TODO: 7sz se rapporte à des choses différentes en 2012 et 2013 par rapport aux années précédentes, cf pour les années antérieures build_column('f7sz', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale des logements donnés en location", val_type = "monetary", cerfa_field = u'7SZ', start = date(2006, 1, 1))) build_column('fhsa', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt en 2010 à hauteur de 52,63%", val_type = "monetary", cerfa_field = u'HSA', start = date(2013, 1, 1))) build_column('fhsb', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt en 2010 à hauteur de 62,5%", val_type = "monetary", cerfa_field = u'HSB', start = date(2013, 1, 1))) build_column('fhsf', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt en 2011 à hauteur de 52,63%", val_type = "monetary", cerfa_field = u'HSF', start = date(2013, 1, 1))) build_column('fhsg', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d'impôt en 2011 à hauteur de 62,5%", val_type = "monetary", cerfa_field = u'HSG', start = date(2013, 1, 1))) build_column('fhsc', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements dans votre entreprise en 2010", val_type = "monetary", cerfa_field = u'HSC', start = date(2013, 1, 1))) build_column('fhsh', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements dans votre entreprise en 2011", val_type = "monetary", cerfa_field = u'HSH', start = date(2013, 1, 1))) build_column('fhsd', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt calculée en 2010", val_type = "monetary", cerfa_field = u'HSD', start = date(2013, 1, 1))) build_column('fhsi', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt calculée en 2011", val_type = "monetary", cerfa_field = u'HSI', start = date(2013, 1, 1))) build_column('fhse', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements dans votre entreprise avec exploitation directe montant de la réduction d’impôt dont vous demandez l’imputation en 2013, en 2010", val_type = "monetary", cerfa_field = u'HSE', start = date(2013, 1, 1))) build_column('fhsj', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements réalisés en 2013, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt dont vous demandez l’imputation en 2013, en 2011", val_type = "monetary", cerfa_field = u'HSJ', start = date(2013, 1, 1))) build_column('fhsk', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2010 ou 2011 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt en 2010 à hauteur de 52,63%", val_type = "monetary", cerfa_field = u'HSK', start = date(2013, 1, 1))) build_column('fhsl', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2010 ou 2011 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt en 2010 à hauteur de 62,5%", val_type = "monetary", cerfa_field = u'HSL', start = date(2013, 1, 1))) build_column('fhsp', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2010 ou 2011 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt en 2011 à hauteur de 52,63%", val_type = "monetary", cerfa_field = u'HSP', start = date(2013, 1, 1))) build_column('fhsq', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2010 ou 2011 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt en 2011 à hauteur de 62,5%", val_type = "monetary", cerfa_field = u'HSQ', start = date(2013, 1, 1))) build_column('fhsm', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements dans votre entreprise en 2010", val_type = "monetary", cerfa_field = u'HSM', start = date(2013, 1, 1))) build_column('fhsr', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements dans votre entreprise en 2011", val_type = "monetary", cerfa_field = u'HSR', start = date(2013, 1, 1))) build_column('fhsn', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements dans votre entreprise avec exploitation directe en 2010", val_type = "monetary", cerfa_field = u'HSN', start = date(2013, 1, 1))) build_column('fhss', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements dans votre entreprise avec exploitation directe en 2011", val_type = "monetary", cerfa_field = u'HSS', start = date(2013, 1, 1))) build_column('fhso', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt dont vous demandez l’imputation en 2013, en 2010", val_type = "monetary", cerfa_field = u'HSO', start = date(2013, 1, 1))) build_column('fhst', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt dont vous demandez l’imputation en 2013, en 2011", val_type = "monetary", cerfa_field = u'HST', start = date(2013, 1, 1))) build_column('fhsu', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2012 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt à hauteur de 52,63%", val_type = "monetary", cerfa_field = u'HSU', start = date(2013, 1, 1))) build_column('fhsv', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2012 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt à hauteur de 62,5%", val_type = "monetary", cerfa_field = u'HSV', start = date(2013, 1, 1))) build_column('fhsw', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2012 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements dans votre entreprise", val_type = "monetary", cerfa_field = u'HSW', start = date(2013, 1, 1))) build_column('fhsx', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2012 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt calculé", val_type = "monetary", cerfa_field = u'HSX', start = date(2013, 1, 1))) build_column('fhsy', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Autres investissements, Investissements ayant fait l’objet en 2012 d’une demande d’agrément, d’une déclaration d’ouverture de chantier ou d’un acompte d’au moins 50 %, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt dont vous demandez l’imputation en 2013", val_type = "monetary", cerfa_field = u'HS', start = date(2013, 1, 1))) build_column('fhsz', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt à hauteur de 52,63%", val_type = "monetary", cerfa_field = u'HSZ', start = date(2013, 1, 1))) build_column('fhta', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements donnés en location à une entreprise exploitante à laquelle vous rétrocédez la réduction d’impôt à hauteur de 62,5%", val_type = "monetary", cerfa_field = u'HTA', start = date(2013, 1, 1))) build_column('fhtb', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements dans votre entreprise", val_type = "monetary", cerfa_field = u'HTB', start = date(2013, 1, 1))) build_column('fhtc', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt calculé", val_type = "monetary", cerfa_field = u'HTC', start = date(2013, 1, 1))) build_column('fhtd', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le cadre de l'entreprise : Investissements autres que ceux des lignes précédentes, Investissements dans votre entreprise avec exploitation directe, montant de la réduction d’impôt dont vous demandez l’imputation en 2013", val_type = "monetary", cerfa_field = u'HTD', start = date(2013, 1, 1))) # Aide aux créateurs et repreneurs d'entreprises build_column('f7fy', IntCol(entity = 'foy', label = u"Aide aux créateurs et repreneurs d'entreprises, nombre de créateurs aidés: conventions signées avant l'année n-1 et ayant pris fin en année n-1", cerfa_field = u'7FY', end = date(2011, 12, 31))) build_column('f7gy', IntCol(entity = 'foy', label = u"Aide aux créateurs et repreneurs d'entreprises, nombre de créateurs aidés dont handicapés: conventions signées avant l'année n-1 et ayant pris fin en année n-1", cerfa_field = u'7GY', start = date(2006, 1, 1), end = date(2011, 12, 31))) build_column('f7hy', IntCol(entity = 'foy', label = u"Aide aux créateurs et repreneurs d'entreprises, nombre de créateurs aidés: conventions signées en n-1 et n'ayant pas pris fin en n-1", cerfa_field = u'7HY', start = date(2009, 1, 1), end = date(2011, 12, 31))) build_column('f7ky', IntCol(entity = 'foy', label = u"Aide aux créateurs et repreneurs d'entreprises, nombre de créateurs aidés dont handicapés: conventions signées en n-1 et ayant pris fin en n-1", cerfa_field = u'7KY', start = date(2009, 1, 1), end = date(2011, 12, 31))) build_column('f7iy', IntCol(entity = 'foy', label = u"Report du solde de réduction d'impôt non encore imputé sur les investissements réalisés", cerfa_field = u'7IY', start = date(2013, 1, 1))) build_column('f7ly', IntCol(entity = 'foy', label = u"Aide aux créateurs et repreneurs d'entreprises, nombre de créateurs aidés: conventions ayant pas pris fin l'année de perception des revenus déclarés", start = date(2010, 1, 1), cerfa_field = u'7LY')) # 2012 et 2013 ok build_column('f7my', IntCol(entity = 'foy', label = u"Aide aux créateurs et repreneurs d'entreprises, nombre de créateurs aidés dont handicapés: conventions ayant pas pris fin l'année de perception des revenus déclarés", cerfa_field = u'7MY', start = date(2010, 1, 1))) # 2012 et 2013 ok # Travaux de restauration immobilière build_column('f7ra', IntCol(entity = 'foy', label = u"Travaux de restauration immobilière dans une zone de protection du patrimoine architectural, urbain et paysager", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = u'7RA')) # 2012 et 2013 ok build_column('f7rb', IntCol(entity = 'foy', label = u"Travaux de restauration immobilière dans un secteur sauvegardé ou assimilé", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = u'7RB')) build_column('f7rc', IntCol(entity = 'foy', label = u"Travaux de restauration immobilière dans un secteur sauvegardé ou assimilé", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7RC')) build_column('f7rd', IntCol(entity = 'foy', label = u"Travaux de restauration immobilière dans un secteur sauvegardé ou assimilé", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7RD')) build_column('f7re', IntCol(entity = 'foy', label = u"Travaux de restauration immobilière dans un secteur sauvegardé ou assimilé", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7RE')) build_column('f7rf', IntCol(entity = 'foy', label = u"Travaux de restauration immobilière dans un secteur sauvegardé ou assimilé", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7RF')) build_column('f7sx', IntCol(entity = 'foy', label = u"Travaux de restauration immobilière dans un secteur sauvegardé ou assimilé", val_type = "monetary", start = date(2013, 1, 1), cerfa_field = u'7SX')) build_column('f7sy', IntCol(entity = 'foy', label = u"Travaux de restauration immobilière dans un secteur sauvegardé ou assimilé", val_type = "monetary", start = date(2013, 1, 1), cerfa_field = u'7SY')) # 2012 et 2013 ok build_column('f7gw', IntCol(entity = 'foy', label = u"Investissements achevés en n-2 en Polynésie française, Nouvelle Calédonie, dans les îles Walllis et Futuna : report de 1/5 de la réduction d'impôt", cerfa_field = u'7GW', start = date(2013, 1, 1))) build_column('f7gx', IntCol(entity = 'foy', label = u"Investissements achevés en n-2 avec promesse d'achat en n-3 en Polynésie française, Nouvelle Calédonie, dans les îles Walllis et Futuna : report de 1/5 de la réduction d'impôt", cerfa_field = u'7GX', start = date(2013, 1, 1))) # Investissements locatifs dans le secteur de touristique build_column('f7xa', IntCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique: travaux engagés avant 2011 dans un village résidentiel de tourisme", val_type = "monetary", cerfa_field = u'7XA', start = date(2011, 1, 1), end = date(2012, 12, 31))) build_column('f7xb', IntCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique: travaux engagés avant 2011 dans une résidence de tourisme classée ou meublée", val_type = "monetary", cerfa_field = u'7XB', start = date(2011, 1, 1), end = date(2012, 12, 31))) build_column('f7xc', IntCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique: prix d'acquisition ou de revient d'un logement neuf acquis ou achevé en n-1", val_type = "monetary", cerfa_field = u'7XC', end = date(2012, 12, 31))) build_column('f7xd', BoolCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique: logement neuf, demande d'étalement du solde de la réduction d'impôt sur 6 ans", cerfa_field = u'7XD', start = date(2009, 1, 1), end = date(2012, 12, 31))) build_column('f7xe', BoolCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique: réhabilitation d'un logement, demande d'étalement du solde de la réduction d'impôt sur 6 ans", cerfa_field = u'7XE', start = date(2009, 1, 1), end = date(2012, 12, 31))) build_column('f7xf', IntCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique, logement neuf: report des dépenses d'investissement des années antérieures", val_type = "monetary", cerfa_field = u'7XF')) build_column('f7xh', IntCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique: travaux de reconstruction, agrandissement, réparation dans une résidence de tourisme classée ou un meublé de tourisme", val_type = "monetary", cerfa_field = u'7XH', end = date(2012, 12, 31))) build_column('f7xi', IntCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique, logement neuf: report des dépenses d'investissement des années antérieures", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7XI')) build_column('f7xj', IntCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique: réhabilitation d'un logement, report des dépenses d'investissement des années antérieures", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7XJ')) build_column('f7xk', IntCol(entity = 'foy', label = u"Investissements locatifs dans une résidence hôtelière à vocation sociale: report des dépenses d'investissement des années antérieures", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7XK')) build_column('f7xl', IntCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique: réhabilitation d'un logement, prix de revient d'un logement réhabilité en n-1 et achevé depuis moins de 15 ans", val_type = "monetary", cerfa_field = u'7XL', end = date(2012, 12, 31))) build_column('f7xm', IntCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique: réhabilitation d'un logement, report de dépenses des travaux de réhabilitation achevés les années antérieures", val_type = "monetary", cerfa_field = u'7XM')) # TODO: f7xn cf années < à 2011 (possible erreur dans le label pour ces dates, à vérifier) build_column('f7xn', IntCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique, logement neuf: report des dépenses d'investissement des années antérieures", val_type = "monetary", cerfa_field = u'7XN', start = date(2012, 1, 1))) build_column('f7xo', IntCol(entity = 'foy', label = u"Investissements locatifs dans une résidence hôtelière à vocation sociale: report des dépenses d'investissement des années antérieures", val_type = "monetary", start = date(2008, 1, 1), cerfa_field = u'7XO')) build_column('f7xp', IntCol(entity = 'foy', label = u"Investissements locatifs dans une résidence hôtelière à vocation sociale: report des dépenses d'investissement des années antérieures", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7XP')) build_column('f7xq', IntCol(entity = 'foy', label = u"Investissements locatifs dans une résidence hôtelière à vocation sociale: report des dépenses d'investissement des années antérieures", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7XQ')) build_column('f7xr', IntCol(entity = 'foy', label = u"Investissements locatifs dans une résidence hôtelière à vocation sociale: report des dépenses d'investissement des années antérieures", start = date(2011, 1, 1), val_type = "monetary", cerfa_field = u'7XR')) build_column('f7xv', IntCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique: Report des dépenses d'investissement des années antérieures", val_type = "monetary", cerfa_field = u'7XV', start = date(2012, 1, 1))) build_column('f7xx', IntCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique: travaux engagés après 2012 dans un village résidentiel de tourisme", val_type = "monetary", cerfa_field = u'7XX', start = date(2012, 1, 1), end = date(2012, 12, 31))) build_column('f7xz', IntCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique: travaux engagés après 2012 dans une résidence de tourisme classée ou un meublé tourisme", val_type = "monetary", cerfa_field = u'7XZ', start = date(2012, 1, 1))) build_column('f7uy', IntCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique: Report des dépenses d'investissement des années antérieures", val_type = "monetary", cerfa_field = u'7UY', start = date(2013, 1, 1))) build_column('f7uz', IntCol(entity = 'foy', label = u"Investissements locatifs dans le secteur de touristique: Report des dépenses d'investissement des années antérieures", val_type = "monetary", cerfa_field = u'7UZ', start = date(2013, 1, 1))) # Souscriptions au capital des PME build_column('f7cf', IntCol(entity = 'foy', label = u"Souscriptions au capital des PME non cotées, petites entreprises en phase de démarrage, ou d'expansion", val_type = "monetary", cerfa_field = u'7CF')) build_column('f7cl', IntCol(entity = 'foy', label = u"Souscriptions au capital des PME non cotées, report de versement de l'année de perception des revenus -4", val_type = "monetary", cerfa_field = u'7CL')) build_column('f7cm', IntCol(entity = 'foy', label = u"Souscriptions au capital des PME non cotées, report de versement de l'année de perception des revenus -3", val_type = "monetary", cerfa_field = u'7CM')) build_column('f7cn', IntCol(entity = 'foy', label = u"Souscriptions au capital des PME non cotées, report de versement de l'année de perception des revenus -2", val_type = "monetary", cerfa_field = u'7CN')) build_column('f7cc', IntCol(entity = 'foy', label = u"Souscriptions au capital des PME non cotées, report de versement de l'année de perception des revenus -1", val_type = "monetary", start = date(2013, 1, 1), cerfa_field = u'7CC')) build_column('f7cq', IntCol(entity = 'foy', label = u"Souscriptions au capital des PME non cotées, report de versement de l'année de perception des revenus -1pour les start-up", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7CQ')) build_column('f7cu', IntCol(entity = 'foy', label = u"Souscriptions au capital des PME non cotées, montant versé au titre de souscriptions antérieures", val_type = "monetary", cerfa_field = u'7CU')) # TODO: en 2013 et 2012 plus de sofipêche (pourtant présent dans param à ces dates...), case 7gs réutilisée build_column('f7gs', IntCol(entity = 'foy', label = u"Reports concernant les investissements achevés ou acquis au cours des années antérieures: Investissements réalisés en n-3 en métropole, dans les DOM, à Saint-Barthélemy, Saint-Martin, Saint-Pierre-et-Miquelon", val_type = "monetary", cerfa_field = u'7GS', start = date(2013, 1, 1))) # Investissements OUTRE-MER dans le secteur du logement et autres secteurs d’activité build_column('f7ua', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7UA', end = date(2007, 12, 31))) build_column('f7ub', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7UB', end = date(2007, 12, 31))) # En 2013 les "7" sont remplacés par des "H" dans les CERFA-FIELDS # en 2013 et 2012, 7uc se rapporte à autre chose, réutilisation de la case # build_column('f7uc', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7UC', end = date(2011,12,31))) # vérifier <=2011 build_column('f7uc', IntCol(entity = 'foy', label = u"Cotisations pour la défense des forêts contre l'incendie ", val_type = "monetary", cerfa_field = u'7UC')) build_column('f7ui', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7UI', end = date(2008, 12, 31))) build_column('f7uj', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7UJ', end = date(2007, 12, 31))) build_column('f7qb', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QB', end = date(2011, 12, 31))) build_column('f7qc', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QC', end = date(2011, 12, 31))) build_column('f7qd', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QD', end = date(2011, 12, 31))) build_column('f7qk', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QK', end = date(2009, 12, 31))) build_column('f7qn', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QN', end = date(2010, 12, 31))) build_column('f7kg', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7KG', end = date(2010, 12, 31))) build_column('f7ql', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QL', end = date(2011, 12, 31))) build_column('f7qt', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QT', end = date(2011, 12, 31))) build_column('f7qm', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QM', end = date(2011, 12, 31))) build_column('f7qu', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QU')) build_column('f7ki', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7KI')) build_column('f7qj', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QJ')) build_column('f7qw', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QW')) build_column('f7qx', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QX')) build_column('f7qf', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QF')) build_column('f7qg', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QG')) build_column('f7qh', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QH')) build_column('f7qi', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QI')) build_column('f7qq', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QQ')) build_column('f7qr', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QR')) build_column('f7qs', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7QS')) build_column('f7mm', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7MM', start = date(2010, 1, 1), end = date(2012, 12, 31))) build_column('f7lg', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7LG', start = date(2010, 1, 1))) build_column('f7ma', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7MA', start = date(2010, 1, 1))) build_column('f7ks', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7KS')) build_column('f7kh', IntCol(entity = 'foy', label = u"", val_type = "monetary", cerfa_field = u'7KH')) build_column('f7oa', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2011, Investissements immobiliers engagés avant le 1.1.2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% avant 2009", val_type = "monetary", cerfa_field = u'7OA', start = date(2011, 1, 1))) build_column('f7ob', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2011, Investissements immobiliers engagés avant le 1.1.2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% en 2009", val_type = "monetary", cerfa_field = u'7OB', start = date(2011, 1, 1))) build_column('f7oc', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2011, Investissements immobiliers engagés avant le 1.1.2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% en 2010", val_type = "monetary", cerfa_field = u'7OC', start = date(2011, 1, 1))) build_column('f7oh', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2011, Investissements immobiliers engagés en 2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% avant 2009", val_type = "monetary", cerfa_field = u'7OH', start = date(2011, 1, 1))) build_column('f7oi', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2011, Investissements immobiliers engagés en 2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% en 2009", val_type = "monetary", cerfa_field = u'7OI', start = date(2011, 1, 1))) build_column('f7oj', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2011, Investissements immobiliers engagés en 2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% en 2010", val_type = "monetary", cerfa_field = u'7OJ', start = date(2011, 1, 1))) build_column('f7ok', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2011, Autres investissements", val_type = "monetary", cerfa_field = u'7OK', start = date(2011, 1, 1))) build_column('f7ol', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé avant le 1.1.2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % avant 2009", val_type = "monetary", cerfa_field = u'7OL', start = date(2012, 1, 1))) build_column('f7om', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé avant le 1.1.2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2009", val_type = "monetary", cerfa_field = u'7OM', start = date(2012, 1, 1))) build_column('f7on', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé avant le 1.1.2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2010", val_type = "monetary", cerfa_field = u'7ON', start = date(2012, 1, 1))) build_column('f7oo', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % avant 2009", val_type = "monetary", cerfa_field = u'7OO', start = date(2012, 1, 1))) build_column('f7op', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2009", val_type = "monetary", cerfa_field = u'7OP', start = date(2012, 1, 1))) build_column('f7oq', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2010", val_type = "monetary", cerfa_field = u'7OQ', start = date(2012, 1, 1))) build_column('f7or', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2011, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2011", val_type = "monetary", cerfa_field = u'7OR', start = date(2012, 1, 1))) build_column('f7os', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2012, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % avant 2009", val_type = "monetary", cerfa_field = u'7OS', start = date(2012, 1, 1))) build_column('f7ot', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2012, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2009", val_type = "monetary", cerfa_field = u'7OT', start = date(2012, 1, 1))) build_column('f7ou', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2012, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2010", val_type = "monetary", cerfa_field = u'7OU', start = date(2012, 1, 1))) build_column('f7ov', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2012, Investissements immobiliers que vous avez engagé en 2012, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2011", val_type = "monetary", cerfa_field = u'7OV', start = date(2012, 1, 1))) build_column('f7ow', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2012, ", val_type = "monetary", cerfa_field = u'7OW', start = date(2012, 1, 1))) #TODO: 7O* : end ? build_column('fhod', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2013, Investissements immobiliers engagés avant le 1.1.2011", val_type = "monetary", cerfa_field = u'HOD', start = date(2013, 1, 1))) build_column('fhoe', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2013, Investissements immobiliers que vous avez engagé en 2012, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2010", val_type = "monetary", cerfa_field = u'HOE', start = date(2013, 1, 1))) build_column('fhof', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2013, Investissements immobiliers que vous avez engagé en 2012, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2011", val_type = "monetary", cerfa_field = u'HOF', start = date(2013, 1, 1))) build_column('fhog', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2013, Investissements immobiliers engagés en 2012 ou 2013, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% en 2010", val_type = "monetary", cerfa_field = u'HOG', start = date(2013, 1, 1))) build_column('fhox', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2013, Investissements immobiliers engagés en 2012 ou 2013, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% en 2011", val_type = "monetary", cerfa_field = u'HOX', start = date(2013, 1, 1))) build_column('fhoy', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2013, Investissements immobiliers engagés en 2012 ou 2013, ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50% en 2012", val_type = "monetary", cerfa_field = u'HOY', start = date(2013, 1, 1))) build_column('fhoz', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement : Investissements réalisés en 2013, Autres investissements", val_type = "monetary", cerfa_field = u'HOZ', start = date(2013, 1, 1))) # Investissements outre-mer dans le logement social build_column('fhra', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement social : Investissements réalisés en 2013, Investissements ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2010", val_type = "monetary", cerfa_field = u'HRA', start = date(2013, 1, 1))) build_column('fhrb', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement social : Investissements réalisés en 2013, Investissements ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2011", val_type = "monetary", cerfa_field = u'HRB', start = date(2013, 1, 1))) build_column('fhrc', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement social : Investissements réalisés en 2013, Investissements ayant fait l'objet d'une demande d'agrément, d'une déclaration d'ouverture de chantier ou d'un acompte d'au moins 50 % en 2012", val_type = "monetary", cerfa_field = u'HRC', start = date(2013, 1, 1))) build_column('fhrd', IntCol(entity = 'foy', label = u"Investissements outre-mer dans le logement social : Investissements réalisés en 2013, Autres investissements", val_type = "monetary", cerfa_field = u'HRD', start = date(2013, 1, 1))) # Souscription de parts de fonds communs de placement dans l'innovation, # de fonds d'investissement de proximité build_column('f7gq', IntCol(entity = 'foy', label = u"Souscription de parts de fonds communs de placement dans l'innovation", val_type = "monetary", cerfa_field = u'7GQ')) build_column('f7fq', IntCol(entity = 'foy', label = u"Souscription de parts de fonds d'investissement de proximité", val_type = "monetary", cerfa_field = u'7FQ')) build_column('f7fm', IntCol(entity = 'foy', label = u"Souscription de parts de fonds d'investissement de proximité investis en Corse", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'7FM')) build_column('f7fl', IntCol(entity = 'foy', label = u"Souscription de parts de fonds d'investissement de proximité investis outre-mer par des personnes domiciliées outre-mer", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7FL')) # Souscriptions au capital de SOFICA build_column('f7gn', IntCol(entity = 'foy', label = u"Souscriptions au capital de SOFICA 36 %", val_type = "monetary", cerfa_field = u'7GN', start = date(2006, 1, 1))) build_column('f7fn', IntCol(entity = 'foy', label = u"Souscriptions au capital de SOFICA 30 %", val_type = "monetary", cerfa_field = u'7FN', start = date(2006, 1, 1))) # Intérêts d'emprunt pour reprise de société build_column('f7fh', IntCol(entity = 'foy', label = u"Intérêts d'emprunt pour reprise de société", val_type = "monetary", cerfa_field = u'7FH')) # Frais de comptabilité et d'adhésion à un CGA (centre de gestion agréée) ou à une AA (association agréée)) build_column('f7ff', IntCol(entity = 'foy', label = u"Frais de comptabilité et d'adhésion à un CGA (centre de gestion agréée) ou à une AA (association agréée)", val_type = "monetary", cerfa_field = u'7FF')) build_column('f7fg', IntCol(entity = 'foy', label = u"Frais de comptabilité et d'adhésion à un CGA ou à une AA: nombre d'exploitations", cerfa_field = u'7FG')) # Travaux de conservation et de restauration d’objets classés monuments historiques build_column('f7nz', IntCol(entity = 'foy', label = u"Travaux de conservation et de restauration d’objets classés monuments historiques", val_type = "monetary", start = date(2008, 1, 1), cerfa_field = u'7NZ')) # Dépenses de protection du patrimoine naturel build_column('f7ka', IntCol(entity = 'foy', label = u"Dépenses de protection du patrimoine naturel", val_type = "monetary", cerfa_field = u'7KA', start = date(2010, 1, 1))) build_column('f7kb', IntCol(entity = 'foy', label = u"Dépenses de protection du patrimoine naturel (excédent de réduction d’impôt d’années antérieures qui n’a pu être imputé)", val_type = "monetary", cerfa_field = u'7KB', start = date(2011, 1, 1))) build_column('f7kc', IntCol(entity = 'foy', label = u"Dépenses de protection du patrimoine naturel (excédent de réduction d’impôt d’années antérieures qui n’a pu être imputé)", val_type = "monetary", cerfa_field = u'7KC', start = date(2012, 1, 1))) build_column('f7kd', IntCol(entity = 'foy', label = u"Dépenses de protection du patrimoine naturel (excédent de réduction d’impôt d’années antérieures qui n’a pu être imputé)", val_type = "monetary", cerfa_field = u'7KD', start = date(2013, 1, 1))) build_column('f7uh', IntCol(entity = 'foy', label = u"Dons et cotisations versés aux partis politiques", val_type = "monetary", cerfa_field = u'7UH', start = date(2007, 1, 1))) #TODO: séparer en plusieurs variables (même case pour plusieurs variables selon les années) # Investissements forestiers build_column('f7un', IntCol(entity = 'foy', label = u"Investissements forestiers: acquisition", val_type = "monetary", cerfa_field = u'7UN')) build_column('f7ul', IntCol(entity = 'foy', label = u"Investissements forestiers", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7UL')) build_column('f7uu', IntCol(entity = 'foy', label = u"Investissements forestiers", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7UU')) build_column('f7uv', IntCol(entity = 'foy', label = u"Investissements forestiers", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7UV')) build_column('f7uw', IntCol(entity = 'foy', label = u"Investissements forestiers", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7UW')) build_column('f7th', IntCol(entity = 'foy', label = u"Investissements forestiers", val_type = "monetary", start = date(2013, 1, 1), cerfa_field = u'7TH')) build_column('f7ux', IntCol(entity = 'foy', label = u"Investissements forestiers", val_type = "monetary", start = date(2013, 1, 1), cerfa_field = u'7UX')) build_column('f7tg', IntCol(entity = 'foy', label = u"Investissements forestiers", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7TG')) build_column('f7tf', IntCol(entity = 'foy', label = u"Investissements forestiers", val_type = "monetary", start = date(2011, 1, 1), end = date(2013, 12, 31), cerfa_field = u'7TF')) build_column('f7ut', IntCol(entity = 'foy', label = u"Investissements forestiers", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = u'7UT')) # Intérêts pour paiement différé accordé aux agriculteurs build_column('f7um', IntCol(entity = 'foy', label = u"Intérêts pour paiement différé accordé aux agriculteurs", val_type = "monetary", cerfa_field = u'7UM')) # Investissements locatifs neufs : Dispositif Scellier: build_column('f7hj', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: investissements réalisés en 2010 en métropole", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = u'7HJ')) build_column('f7hk', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: investissements réalisés en 2010 dans les DOM-COM", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = u'7HK')) build_column('f7hn', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: investissements réalisés en 2010 en métropole avec promesse d'achat avant le 1er janvier 2010", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7HN')) build_column('f7ho', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: investissements réalisés en 2010 dans les DOM-COM avec promesse d'achat avant le 1er janvier 2010", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7HO')) build_column('f7hl', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: investissements réalisés en 2009 (métropole et DOM ne respectant pas les plafonds)", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7HL')) build_column('f7hm', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: investissements réalisés en 2009 dans les DOM et respectant les plafonds", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7HM')) build_column('f7hr', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: investissements réalisés et achevés en 2009, en métropole en 2009; dans les DOM du 1.1.2009 au 26.5.2009 ; dans les DOM du 27.5.2009 au 30.12.2009 lorsqu'ils ne respectent pas les plafonds spécifiques", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7HR')) build_column('f7hs', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: investissements réalisés et achevés en 2009 dans les DOM COM du 27.5.2009 au 31.12.2009 respectant les plafonds spécifiques", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7HS')) build_column('f7la', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2009 ou 2010 ou réalisés et achevés en 2010 avec engagement avant le 1.1.2010, Report de l'année 2009", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7LA')) build_column('f7lb', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2009 ou 2010 ou réalisés et achevés en 2010 avec engagement avant le 1.1.2010, Report de l'année 2010", val_type = "monetary", cerfa_field = u'7LB', start = date(2011, 1, 1))) build_column('f7lc', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2010 ; réalisés en 2010 et achevés en 2011 ; réalisés et achevés en 2011 avec engagement en 2010, Report de l'année 2010", val_type = "monetary", cerfa_field = u'7LC', start = date(2011, 1, 1))) build_column('f7ld', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2010 ; réalisés en 2010 et achevés en 2011 ; réalisés et achevés en 2011 avec engagement en 2010, Report de l'année 2011", val_type = "monetary", cerfa_field = u'7LD', start = date(2012, 1, 1))) build_column('f7le', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2009 ou 2010 ou réalisés et achevés en 2010 avec engagement avant le 1.1.2010, Report de l'année 2011", val_type = "monetary", cerfa_field = u'7LE', start = date(2012, 1, 1))) build_column('f7lf', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2011 : report du solde de réduction d'impôt de l'année 2011", val_type = "monetary", cerfa_field = u'7LF', start = date(2012, 1, 1))) build_column('f7ls', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2010 ; réalisés en 2010 et achevés en 2011 ; réalisés et achevés en 2011 avec engagement en 2010", val_type = "monetary", cerfa_field = u'7LS', start = date(2013, 1, 1))) build_column('f7lm', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2009 ou 2010 ou réalisés et achevés en 2010 avec engagement avant le 1.1.2010", val_type = "monetary", cerfa_field = u'7LM', start = date(2013, 1, 1))) build_column('f7lz', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Report du solde de réduction d'impôt de l'année 2012", val_type = "monetary", cerfa_field = u'7LZ', start = date(2013, 1, 1))) build_column('f7mg', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: Report du solde des réductions d'impôts non encore imputé, Investissements réalisés et achevés en 2012 : report du solde de réduction d'impôt de l'année 2012", val_type = "monetary", cerfa_field = u'7MG', start = date(2013, 1, 1))) build_column('f7na', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements réalisés et engagés en 2011, métropole, BBC", val_type = "monetary", cerfa_field = u'7NA', start = date(2011, 1, 1))) build_column('f7nb', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements engagés en 2010, réalisés en 2011, ", val_type = "monetary", cerfa_field = u'7NB', start = date(2011, 1, 1))) build_column('f7nc', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.1.2011 au 31.1.2011, métropole, BBC", val_type = "monetary", cerfa_field = u'7NC', start = date(2011, 1, 1))) build_column('f7nd', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.2.2011 au 31.3.2011, métropole, BBC", val_type = "monetary", cerfa_field = u'7ND', start = date(2011, 1, 1))) build_column('f7ne', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.4.2011 au 31.12.2011, métropole, BBC", val_type = "monetary", cerfa_field = u'7NE', start = date(2011, 1, 1))) build_column('f7nf', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements réalisés et engagés en 2011, ", val_type = "monetary", cerfa_field = u'7NF', start = date(2011, 1, 1))) build_column('f7ng', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements engagés en 2010, réalisés en 2011, ", val_type = "monetary", cerfa_field = u'7NG', start = date(2011, 1, 1))) build_column('f7nh', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.1.2011 au 31.1.2011, Investissement réalisé du 1.1.2011 au 31.1.2011, métropole, non-BBC", val_type = "monetary", cerfa_field = u'7NH', start = date(2011, 1, 1))) build_column('f7ni', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.2.2011 au 31.3.2011, métropole, non-BBC", val_type = "monetary", cerfa_field = u'7NI', start = date(2011, 1, 1))) build_column('f7nj', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.4.2011 au 31.12.2011, métropole, non-BBC", val_type = "monetary", cerfa_field = u'7NJ', start = date(2011, 1, 1))) build_column('f7nk', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements réalisés et engagés en 2011, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon", val_type = "monetary", cerfa_field = u'7NK', start = date(2011, 1, 1))) build_column('f7nl', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements engagés en 2010, réalisés en 2011, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon", val_type = "monetary", cerfa_field = u'7NL', start = date(2011, 1, 1))) build_column('f7nm', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.1.2011 au 31.1.2011, Investissement réalisé du 1.1.2011 au 31.1.2011, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon", val_type = "monetary", cerfa_field = u'7NM', start = date(2011, 1, 1))) build_column('f7nn', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.2.2011 au 31.3.2011, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon", val_type = "monetary", cerfa_field = u'7NN', start = date(2011, 1, 1))) build_column('f7no', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.4.2011 au 31.12.2011, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon", val_type = "monetary", cerfa_field = u'7NO', start = date(2011, 1, 1))) build_column('f7np', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements réalisés et engagés en 2011, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna", val_type = "monetary", cerfa_field = u'7NP', start = date(2011, 1, 1))) build_column('f7nq', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements engagés en 2010, réalisés en 2011, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna", val_type = "monetary", cerfa_field = u'7NQ', start = date(2011, 1, 1))) build_column('f7nr', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.1.2011 au 31.1.2011, Investissement réalisé du 1.1.2011 au 31.1.2011, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna", val_type = "monetary", cerfa_field = u'7NR', start = date(2011, 1, 1))) build_column('f7ns', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.2.2011 au 31.3.2011, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna", val_type = "monetary", cerfa_field = u'7NS', start = date(2011, 1, 1))) build_column('f7nt', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, Investissement réalisé du 1.4.2011 au 31.12.2011, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna", val_type = "monetary", cerfa_field = u'7NT', start = date(2011, 1, 1))) build_column('f7hv', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2010 en métropole", val_type = "monetary", cerfa_field = u'7HV', start = date(2011, 1, 1))) build_column('f7hw', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2010 dans les DOM COM", val_type = "monetary", cerfa_field = u'7HW', start = date(2011, 1, 1))) build_column('f7hx', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2010 en métropole avec promesse d'achat avant le 1.1.2010", val_type = "monetary", cerfa_field = u'7HX', start = date(2011, 1, 1))) build_column('f7hz', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2010 dans les DOM COM avec promesse d'achat avant le 1.1.2010", val_type = "monetary", cerfa_field = u'7HZ', start = date(2011, 1, 1))) build_column('f7ht', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2009, Investissements réalisés en 2009 et achevés en 2010, en métropole en 2009; dans les DOM du 1.1.2009 au 26.5.2009 ; dans les DOM du 27.5.2009 au 30.12.2009 lorsqu'ils ne respectent pas les plafonds spécifiques", val_type = "monetary", cerfa_field = u'7HT', start = date(2011, 1, 1))) build_column('f7hu', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2009, Investissements réalisés en 2009 et achevés en 2010, dans les DOM COM du 27.5.2009 au 31.12.2009 respectant les plafonds spécifiques", val_type = "monetary", cerfa_field = u'7HU', start = date(2011, 1, 1))) build_column('f7ha', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: Investissements achevés et réalisés en 2011", val_type = "monetary", cerfa_field = u'7HA', start = date(2012, 1, 1))) build_column('f7hb', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: Investissements achevés et réalisés en 2011, avec promesse d'achat en 2010", val_type = "monetary", cerfa_field = u'7HB', start = date(2012, 1, 1))) build_column('f7hg', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2011 en Polynésie française, Nouvelle Calédonie, dans les îles Walllis et Futuna", val_type = "monetary", cerfa_field = u'7HG', start = date(2012, 1, 1))) build_column('f7hh', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: réductions investissements réalisés et achevés en 2011 en Polynésie française, Nouvelle Calédonie, dans les îles Walllis et Futuna avec promesse d'achat en 2010", val_type = "monetary", cerfa_field = u'7HH', start = date(2012, 1, 1))) build_column('f7hd', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: Investissements achevés en 2011, réalisés en 2010, en métropole et dans les DOM-COM", val_type = "monetary", cerfa_field = u'7HD', start = date(2012, 1, 1))) build_column('f7he', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: Investissements achevés en 2011, en métropole et dans les DOM-COM avec promesse d'achat avant le 1.1.2010", val_type = "monetary", cerfa_field = u'7HE', start = date(2012, 1, 1))) build_column('f7hf', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier: Investissements achevés en 2011, Investissements réalisés en 2009 en métropole et dans les DOM-COM", val_type = "monetary", cerfa_field = u'7HF', start = date(2012, 1, 1))) build_column('f7ja', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements réalisés et engagés en 2012, métropole, BBC", val_type = "monetary", cerfa_field = u'7JA', start = date(2012, 1, 1))) build_column('f7jb', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements engagés en 2011, réalisés en 2012, métropole, BBC", val_type = "monetary", cerfa_field = u'7JB', start = date(2012, 1, 1))) build_column('f7jd', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.1.2012 au 31.3.2012, métropole, BBC", val_type = "monetary", cerfa_field = u'7JD', start = date(2012, 1, 1))) build_column('f7je', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.4.2012 au 31.12.2012, métropole, BBC ", val_type = "monetary", cerfa_field = u'7JE', start = date(2012, 1, 1))) build_column('f7jf', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements réalisés et engagés en 2012, métropole, non-BBC", val_type = "monetary", cerfa_field = u'7JF', start = date(2012, 1, 1))) build_column('f7jg', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements engagés en 2011, réalisés en 2012, métropole, non-BBC", val_type = "monetary", cerfa_field = u'7JG', start = date(2012, 1, 1))) build_column('f7jh', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.1.2012 au 31.3.2012, métropole, non-BBC", val_type = "monetary", cerfa_field = u'7JH', start = date(2012, 1, 1))) build_column('f7jj', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.4.2012 au 31.12.2012, métropole, non-BBC", val_type = "monetary", cerfa_field = u'7JJ', start = date(2012, 1, 1))) build_column('f7jk', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements engagés en 2011, réalisés en 2012, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon", val_type = "monetary", cerfa_field = u'7JK', start = date(2012, 1, 1))) build_column('f7jl', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements engagés en 2011, réalisés en 2012, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon", val_type = "monetary", cerfa_field = u'7JL', start = date(2012, 1, 1))) build_column('f7jm', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.1.2012 au 31.3.2012, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon", val_type = "monetary", cerfa_field = u'7JM', start = date(2012, 1, 1))) build_column('f7jn', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.4.2012 au 31.12.2012, DOM, Saint-Barthélémy, Saint-Martin, Saint-Pierre-et-Miquelon", val_type = "monetary", cerfa_field = u'7JN', start = date(2012, 1, 1))) build_column('f7jo', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements engagés en 2011, réalisés en 2012, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna", val_type = "monetary", cerfa_field = u'7JO', start = date(2012, 1, 1))) build_column('f7jp', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : investissements engagés en 2011, réalisés en 2012, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna", val_type = "monetary", cerfa_field = u'7JP', start = date(2012, 1, 1))) build_column('f7jq', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.1.2012 au 31.3.2012, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna", val_type = "monetary", cerfa_field = u'7JQ', start = date(2012, 1, 1))) build_column('f7jr', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, Investissement réalisé du 1.4.2012 au 31.12.2012, Polynésie Française, Nouvelle Calédonie, Wallis et Futuna", val_type = "monetary", cerfa_field = u'7JR', start = date(2012, 1, 1))) build_column('f7gj', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Reports concernant les investissements achevés ou acquis au cours des années antérieures, Investissements achevés et réalisés en 2012, en métropole, dans les DOM, à Saint-Barthélemy, Saint-Martin, Saint-Pierre-et-Miquelon", val_type = "monetary", cerfa_field = u'7GJ', start = date(2013, 1, 1))) build_column('f7gk', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Reports concernant les investissements achevés ou acquis au cours des années antérieures, Investissements achevés et réalisés en 2012, en métropole, dans les DOM, à Saint-Barthélemy, Saint-Martin, Saint-Pierre-et-Miquelon, avec promesse d'achat en 2011", val_type = "monetary", cerfa_field = u'7GK', start = date(2013, 1, 1))) build_column('f7gl', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Reports concernant les investissements achevés ou acquis au cours des années antérieures, Investissements achevés en 2012 et réalisés en 2011, en métropole, dans les DOM, à Saint-Barthélemy, Saint-Martin, Saint-Pierre-et-Miquelon", val_type = "monetary", cerfa_field = u'7GL', start = date(2013, 1, 1))) build_column('f7gp', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Reports concernant les investissements achevés ou acquis au cours des années antérieures, Investissements achevés en 2012 et réalisés en 2011, en métropole, dans les DOM, à Saint-Barthélemy, Saint-Martin, Saint-Pierre-et-Miquelon, avec promesse d'achat en 2010s", val_type = "monetary", cerfa_field = u'7GP', start = date(2013, 1, 1))) build_column('f7fa', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Investissements achevés ou acquis en 2013, réalisés du 1.1.2013 au 31.3.2013, métropole, BBC", val_type = "monetary", cerfa_field = u'7FA', start = date(2013, 1, 1))) build_column('f7fb', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Investissements achevés ou acquis en 2013, réalisés du 1.1.2013 au 31.3.2013, métropole, non-BBC", val_type = "monetary", cerfa_field = u'7FB', start = date(2013, 1, 1))) build_column('f7fc', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Investissements achevés ou acquis en 2013, réalisés du 1.1.2013 au 31.3.2013, DOM, à Saint-Barthélemy, Saint-Martin, Saint-Pierre-et-Miquelon", val_type = "monetary", cerfa_field = u'7FC', start = date(2013, 1, 1))) build_column('f7fd', IntCol(entity = 'foy', label = u"Investissements locatifs neufs dispositif Scellier : Investissements achevés ou acquis en 2013, réalisés du 1.1.2013 au 31.3.2013 en Polynésie, en Nouvelle Calédonie et à Wallis et Futuna", val_type = "monetary", cerfa_field = u'7FD', start = date(2013, 1, 1))) # Investissement en vue de la location meublée non professionnelle dans certains établissements ou résidences build_column('f7ij', IntCol(entity = 'foy', label = u"Investissement destinés à la location meublée non professionnelle: Investissements réalisés en 2011 et achevés en 2012, engagement de réalisation de l'investissement en 2011", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = u'7IJ')) build_column('f7il', IntCol(entity = 'foy', label = u"Investissement destinés à la location meublée non professionnelle: Investissements réalisés en 2011 et achevés en 2012, promesse d'achat en 2010", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7IL')) build_column('f7im', IntCol(entity = 'foy', label = u"Investissement destinés à la location meublée non professionnelle: Investissements réalisés en 2010 et achevés en 2012 avec promesse d'achat en 2009", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7IM')) build_column('f7ik', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Reports de 1/9 de l'investissement réalisé et achevé en 2009", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7IK')) build_column('f7in', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, investissement réalisé du 1.1.2011 au 31.3.2011", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7IN')) build_column('f7iv', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2010, investissement réalisé du 1.4.2011 au 31.12.2011", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7IV')) build_column('f7iw', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés en 2010 et achevés en 2012", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7IW')) build_column('f7io', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : ", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7IO')) build_column('f7ip', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : ", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7IP')) build_column('f7ir', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : ", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7IR')) build_column('f7iq', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : ", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7IQ')) build_column('f7iu', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : ", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7IU')) build_column('f7it', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : ", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = u'7IT')) build_column('f7is', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Report du solde de réduction d'impôt non encore imputé: année n-4", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7IS')) build_column('f7ia', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2011", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7IA')) build_column('f7ib', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2011 avec promesse d'achat en 2010 ou réalisés en 2010", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7IB')) build_column('f7ic', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés en 2010 et achevés en 2011 avec promesse d'achat en 2009 ou réalisés en 2009", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7IC')) build_column('f7id', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, Engagement de réalisation de l'investissement en 2012", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7ID')) build_column('f7ie', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, Promesse d'achat en 2011", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7IE')) build_column('f7if', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, investissement réalisé du 1.1.2012 au 31.3.2012, investissement réalisé du 1.1.2012 au 31.3.2012", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7IF')) build_column('f7ig', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, Investissements destinés à la location meublée non professionnelle : Logement acquis en l'état futur d'achèvement avec contrat de réservation enregistré au plus tard le 31.12.2011, investissement réalisé du 1.4.2012 au 31.12.2012", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7IG')) build_column('f7ix', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2009; réalisés en 2009 et achevés en 2010; réalisés et achevés en 2010 avec engagement avant le 1.1.2010, Report du solde de réduction d'impôt de l'année 2011", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7IX')) build_column('f7ih', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2010 ; réalisés en 2010 et achevés en 2011 ; réalisés et achevés en 2011 avec engagement en 2010, Report du solde de réduction d'impôt de l'année 2011", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7IH')) build_column('f7iz', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2011 : report du solde de réduction d'impôt de l'année 2011", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7IZ')) build_column('f7jt', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés en 2013, Engagement de réalisation de l'investissement en 2013", val_type = "monetary", cerfa_field = u'7JT', start = date(2013, 1, 1))) build_column('f7ju', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés en 2013, Engagement de réalisation de l'investissement en 2012", val_type = "monetary", cerfa_field = u'7JU', start = date(2013, 1, 1))) build_column('f7jv', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, réalisés en 2012", val_type = "monetary", cerfa_field = u'7JV', start = date(2013, 1, 1))) build_column('f7jw', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, réalisés en 2011 ou réalisés en 2012 avec promesse d'achat en 2011", val_type = "monetary", cerfa_field = u'7JW', start = date(2013, 1, 1))) build_column('f7jx', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, réalisés en 2011 avec promesse d'achat en 2010 ou réalisés en 2010", val_type = "monetary", cerfa_field = u'7JX', start = date(2013, 1, 1))) build_column('f7jy', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2012, réalisés en 2010 avec promesse d'achat en 2009 ou réalisés en 2009", val_type = "monetary", cerfa_field = u'7JY', start = date(2013, 1, 1))) build_column('f7jc', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2010 ; réalisés en 2010 et achevés en 2011 ; réalisés et achevés en 2011 avec engagement en 2010, Report du solde de réduction d'impôt de l'année 2012", val_type = "monetary", cerfa_field = u'7JC', start = date(2013, 1, 1))) build_column('f7ji', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2011 ; réalisés en 2011 et achevés en 2011 ou 2012 ; réalisés en 2012 avec promesse d'achat en 2011 et achevés en 2012, Report du solde de réduction d'impôt de l'année 2012", val_type = "monetary", cerfa_field = u'7JI', start = date(2013, 1, 1))) build_column('f7js', IntCol(entity = 'foy', label = u"Investissements destinés à la location meublée non professionnelle : Investissements réalisés et achevés en 2011 ; réalisés en 2011 et achevés en 2011 ou 2012 ; réalisés en 2012 avec promesse d'achat en 2011 et achevés en 2012, Report du solde de réduction d’impôt de l’année 2012", val_type = "monetary", cerfa_field = u'7JS', start = date(2013, 1, 1))) # Investissements locatifs dans les résidences de tourisme situées dans une zone de # revitalisation rurale # """ # réutilisation de cases en 2013 # """ build_column('f7gt', IntCol(entity = 'foy', label = u"Scellier: report de 1/9 de la réduction d'impôt des investissements achevés en 2012 avec promesse d'achat en 2010", val_type = "monetary", cerfa_field = u'7GT', start = date(2013, 1, 1))) # vérif <=2012 build_column('f7gu', IntCol(entity = 'foy', label = u"Scellier: report de 1/9 de la réduction d'impôt des investissements achevés en 2012 avec promesse d'achat en 2009", val_type = "monetary", cerfa_field = u'7GU', start = date(2013, 1, 1))) # vérif <=2012 build_column('f7gv', IntCol(entity = 'foy', label = u"Scellier: report de 1/5 de la réduction d'impôt des investissements réalisés et achevés en 2012 en Polynésie, en Nouvelle Calédonie et à Wallis et Futuna ", val_type = "monetary", cerfa_field = u'7GV', start = date(2013, 1, 1))) # vérif <=2012 build_column('f7xg', IntCol(entity = 'foy', label = u"Investissement locatif dans le secteur touristique, travaux réalisés dans un village résidentiel de tourisme", val_type = "monetary", cerfa_field = u'7XG', end = date(2012, 12, 1))) # vérif <=2012 # Crédits d'impôts en f7 # Acquisition de biens culturels build_column('f7uo', IntCol(entity = 'foy', label = u"Acquisition de biens culturels", val_type = "monetary", cerfa_field = u'7UO')) # Mécénat d'entreprise build_column('f7us', IntCol(entity = 'foy', label = u"Réduction d'impôt mécénat d'entreprise", val_type = "monetary", cerfa_field = u'7US')) # Crédits d’impôt pour dépenses en faveur de la qualité environnementale build_column('f7sb', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale des logements donnés en location: crédit à 25 %", val_type = "monetary", cerfa_field = u'7SB', start = date(2009, 1, 1), end = date(2011, 12, 31))) build_column('f7sc', IntCol(entity = 'foy', label = u"Crédits d’impôt pour dépenses en faveur de la qualité environnementale", val_type = "monetary", cerfa_field = u'7SC', start = date(2009, 1, 1), end = date(2009, 12, 1))) # """ # réutilisation de case pour 2013 # """ build_column('f7sd', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale, économie d'énergie: chaudières à condensation", val_type = "monetary", cerfa_field = u'7SD', start = date(2009, 1, 1))) build_column('f7se', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale, économie d'énergie: chaudières à micro-cogénération gaz", val_type = "monetary", cerfa_field = u'7SE', start = date(2009, 1, 1))) build_column('f7sh', IntCol(entity = 'foy', label = u"Dépenses en faveur de la qualité environnementale de l'habitation principale, isolation thermique: matériaux d'isolation des toitures (acquisition et pose)", val_type = "monetary", cerfa_field = u'7SH', start = date(2010, 1, 1))) # ('f7wg', IntCol() déjà disponible # Crédit d'impôt pour dépense d'acquisition ou de transformation d'un véhicule GPL ou mixte en 2007 et investissements forestiers aprés ??? build_column('f7up', IntCol(entity = 'foy', label = u"Crédit d'impôt pour investissements forestiers: travaux", val_type = "monetary", cerfa_field = u'7UP', start = date(2009, 1, 1))) build_column('f7uq', IntCol(entity = 'foy', label = u"Crédit d'impôt pour investissements forestiers: contrat de gestion", val_type = "monetary", cerfa_field = u'7UQ', start = date(2009, 1, 1))) # Déclaration de déménagement correspondant à un crédit d'impôt aide à la mobilité build_column('f1ar', BoolCol(entity = 'foy', label = u"Crédit d'impôt aide à la mobilité : le déclarant déménage à plus de 200 km pour son emploi", cerfa_field = u'1AR', end = date(2080, 12, 31))) #TODO: QUIFOY build_column('f1br', BoolCol(entity = 'foy', label = u"Crédit d'impôt aide à la mobilité : le conjoint déménage à plus de 200 km pour son emploi", cerfa_field = u'1BR', end = date(2008, 12, 31))) build_column('f1cr', BoolCol(entity = 'foy', label = u"Crédit d'impôt aide à la mobilité : la 1ère personne à charge déménage à plus de 200 km pour son emploi", cerfa_field = u'1CR', end = date(2008, 12, 31))) build_column('f1dr', BoolCol(entity = 'foy', label = u"Crédit d'impôt aide à la mobilité : la 2è personne à charge déménage à plus de 200 km pour son emploi", cerfa_field = u'1DR', end = date(2008, 12, 31))) build_column('f1er', BoolCol(entity = 'foy', label = u"Crédit d'impôt aide à la mobilité : la 3è personne à charge déménage à plus de 200 km pour son emploi", cerfa_field = u'1ER', end = date(2006, 12, 31))) # Crédit d’impôt représentatif de la taxe additionnelle au droit de bail build_column('f4tq', IntCol(entity = 'foy', label = u"Crédit d’impôt représentatif de la taxe additionnelle au droit de bail", val_type = "monetary", cerfa_field = u'4TQ')) # vérif libéllé, en 2013=Montant des loyers courus du 01/01/1998 au 30/09/1998 provenant des immeubles # pour lesquels la cessation ou l'interruption de la location est intervenue en 2013 et qui ont été # soumis à la taxe additionnelle au droit de bail # Crédits d’impôt pour dépenses en faveur de l’aide aux personnes build_column('f7sf', IntCol(entity = 'foy', label = u"Crédit de travaux en faveur d'aides aux personnes pour des logements en location (avant 2012 ) / Appareils de régulation du chauffage, matériaux de calorifugeage (après 2011)", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7SF')) build_column('f7si', IntCol(entity = 'foy', label = u"Matériaux d’isolation des planchers bas sur sous-sol, sur vide sanitaire ou sur passage couvert (acquisition et pose)", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'7SI')) build_column('f7te', IntCol(entity = 'foy', label = u"Dépenses d'investissement forestier", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'7TE')) build_column('f7tu', IntCol(entity = 'foy', label = u"Dépenses de travaux dans l'habitation principale", val_type = "monetary", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7TU')) build_column('f7tt', IntCol(entity = 'foy', label = u"Dépenses de travaux dans l'habitation principale", val_type = "monetary", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7TT')) build_column('f7tv', IntCol(entity = 'foy', label = u"Dépenses de travaux dans l'habitation principale", val_type = "monetary", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7TV')) build_column('f7tx', IntCol(entity = 'foy', label = u"Dépenses de travaux dans l'habitation principale", val_type = "monetary", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7TX')) build_column('f7ty', IntCol(entity = 'foy', label = u"Dépenses de travaux dans l'habitation principale", val_type = "monetary", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7TY')) build_column('f7tw', IntCol(entity = 'foy', label = u"Dépenses de travaux dans l'habitation principale", val_type = "monetary", start = date(2012, 1, 1), end = date(2012, 12, 31), cerfa_field = u'7TW')) # Réduction d'impôts sur les investissements locatifs intermédiaires (loi Duflot) build_column('f7gh', IntCol(entity = 'foy', label = u"Investissements locatifs intermédiaires en métropole", val_type = "monetary", start = date(2013, 1, 1), cerfa_field = u'7GH')) build_column('f7gi', IntCol(entity = 'foy', label = u"Investissements locatifs intermédiaires outre-mer", val_type = "monetary", start = date(2013, 1, 1), cerfa_field = u'7GI')) # section 8 build_column('f8tc', IntCol(entity = 'foy', label = u"Crédit d'impôt autres entreprises (recherche non encore remboursé (années antérieures))", # différence de label entre les années à voir val_type = "monetary", end = date(2008, 12, 31), cerfa_field = u'8TC')) build_column('f8tb', IntCol(entity = 'foy', label = u"Crédit d'impôt recherche (entreprises bénéficiant de la restitution immédiate)", # TODO: différence de label entre les années à voir val_type = "monetary", cerfa_field = u'8TB')) build_column('f8te', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: adhésion à un groupement de prévention agréé", val_type = "monetary", cerfa_field = u'8TE')) build_column('f8tf', IntCol(entity = 'foy', label = u"Reprises de réductions ou de crédits d'impôt", val_type = "monetary", cerfa_field = u'8TF')) build_column('f8tg', IntCol(entity = 'foy', label = u"Crédits d'impôt en faveur des entreprises: Investissement en Corse", val_type = "monetary", cerfa_field = u'8TG')) build_column('f8tl', IntCol(entity = 'foy', label = u"Crédit d'impôt compétitivité emploi (CICE), entreprises bénéficiant de la restitution immédiate", val_type = "monetary", cerfa_field = u'8TL')) build_column('f8to', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: investissement en Corse, report non imputé les années antérieures", val_type = "monetary", cerfa_field = u'8TO')) build_column('f8tp', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: investissement en Corse, reprise de crédit d'impôt", val_type = "monetary", cerfa_field = u'8TP')) build_column('f8ts', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: investissement en Corse, crédit d'impôt", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = u'8TS')) build_column('f8uz', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: Famille", val_type = "monetary", cerfa_field = u'8UZ')) build_column('f8uw', IntCol(entity = 'foy', label = u"Crédit d'impôt compétitivité emploi (CICE), autres entreprises", val_type = "monetary", start = date(2013, 1, 1), cerfa_field = u'8UW')) build_column('f8tz', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: Apprentissage", val_type = "monetary", cerfa_field = u'8TZ')) build_column('f8wa', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: Agriculture biologique", val_type = "monetary", cerfa_field = u'8WA')) build_column('f8wb', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: Prospection commerciale", val_type = "monetary", cerfa_field = u'8WB')) build_column('f8wc__2008', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: Nouvelles technologies", val_type = "monetary", cerfa_field = u'8WC', end = date(2008, 12, 31))) build_column('f8wc', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: Prêts sans intérêt", val_type = "monetary", cerfa_field = u'8WC', start = date(2012, 1, 1))) build_column('f8wd', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: Formation des chefs d'entreprise", val_type = "monetary", start = date(2006, 1, 1), cerfa_field = u'8WD')) build_column('f8we', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: Intéressement", val_type = "monetary", start = date(2008, 1, 1), cerfa_field = u'8WE')) build_column('f8wr', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: Métiers d'art", val_type = "monetary", start = date(2006, 1, 1), cerfa_field = u'8WR')) build_column('f8ws', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: Emploi de salariés réservistes", val_type = "monetary", cerfa_field = u'8WS', start = date(2006, 1, 1), end = date(2009, 12, 31))) # verif<=2012 build_column('f8wt', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: Remplacement pour congé des agriculteurs", val_type = "monetary", start = date(2006, 1, 1), cerfa_field = u'8WT')) build_column('f8wu', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: Maître restaurateur", val_type = "monetary", start = date(2006, 1, 1), cerfa_field = u'8WU')) build_column('f8wv', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: Débitants de tabac", val_type = "monetary", cerfa_field = u'8WV', start = date(2007, 1, 1), end = date(2012, 12, 31))) # verif<=2012 build_column('f8wx', IntCol(entity = 'foy', label = u"Crédit d'impôt en faveur des entreprises: Formation des salariés à l'économie d'entreprise", val_type = "monetary", cerfa_field = u'8WX', start = date(2007, 1, 1), end = date(2009, 12, 31))) # verif<=2012 build_column('elig_creimp_exc_2008', IntCol(entity = 'foy', #TODO: coder http://www11.minefi.gouv.fr/boi/boi2009/5fppub/textes/5b2509/5b2509.pdf B.12 default = 1, label = u"Éligibilité au crédit d'impôt exceptionnel sur les revenus 2008", val_type = 'monetary', start = date(2008, 1, 1), end = date(2008, 12, 31))) build_column('elig_creimp_jeunes', BoolCol(entity = "ind", label = u"Éligible au crédit d'impôt jeunes", start = date(2005, 1, 1), end = date(2008, 1, 1))) #Sert à savoir si son secteur d'activité permet au jeune de bénéficier du crédit impôts jeunes PK'GR'Yopenfisca_france/model/prelevements_obligatoires/impot_revenu/plus_values_immobilieres.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from numpy import maximum as max_, minimum as min_ from ...base import * # noqa analysis:ignore ######################################################################## # Calcul de l'impôt sur les plus-values immobilières # Impôt sur le revenu afférent à la plus-value immobilière (CGI, art. 150 U, 150 UC-I et 150 UD) # Prélèvement dû par les non-résidents assujettis ou non à l’impôt sur le revenu (CGI, art. 244 bis A) # Taxe forfaitaire sur la cession de terrains nus devenus constructibles (CGI, art. 1529) # Taxe sur la cession à titre onéreux de terrains nus rendus constructibles (CGI, art.1605 nonies) # 2048-IMM-SD ######################################################################## #TODO: create new function for f3VV (new legislation : non-resident_45%) # def _plus_value_brute(prix_pv_immo, charges_pv_immo, frais_pv_immo, prix_acqu_immo, # charges_aqu_immo, frais_acqu_immo, const_acqu_immo, voirie_acqu_immo): # """ # Calcul de la plus-value immobilière brute # """ # # CESSION # prix_cess_immo = 0 # 10; PRIX DE CESSION OU INDEMNITE D’EXPROPRIATION = € # charges_cess_immo = 0 # 11. CHARGES ET INDEMNITES SUPPORTEES PAR L’ACQUEREUR + € # frais_cess_immo =0 # 12. FRAIS ET TAXES SUPPORTES PAR LE VENDEUR (NOTAMMENT FRAIS DE REPRESENTATION FISCALE) - € # # # 13. PRIX DE CESSION CORRIGE (LIGNE 10 + LIGNE 11 – LIGNE 12) = = € # prix_cess_corr = prix_cess_immo + charges_cess_immo - frais_cess_immo # # # ACQISISTION # prix_acqu_immo = 0 # 20. PRIX D’ACQUISITION OU VALEUR VENALE = € # charges_aqu_immo = 0 # 21. CHARGES ET INDEMNITES (MONTANT REEL) + € # frais_acqu_immo = 0 # 22. FRAIS D’ACQUISITION : # # * A TITRE GRATUIT (MONTANT REEL) + € # # * A TITRE ONEREUX (MONTANT REEL OU FIXE A 7,5% DU PRIX D’ACQUISITION) + € # const_acqu_immo = 0 # 23. DEPENSES DE CONSTRUCTION, RECONSTRUCTION, AGRANDISSEMENT OU AMELIORATION + € # # (MONTANT REEL OU FIXE A 15% DU PRIX D’ACQUISITION SI IMMEUBLE BATI DETENU DEPUIS PLUS DE 5 ANS). # voirie_acqu_immo = 0 # 24. FRAIS DE VOIRIE, RESEAUX ET DISTRIBUTION + € # valeur_venale = prix_acqu_immo + charges_aqu_immo + frais_acqu_immo + const_acqu_immo + voirie_acqu_immo # 25. PRIX D’ACQUISITION OU VALEUR VENALE CORRIGE (LIGNE 20 + LIGNE 21 + LIGNE 22 + LIGNE 23 + LIGNE 24) = - € # return prix_cess_corr-valeur_venale # # # def _plus_value_nette(period, plus_value_brute, dur_det_immo, pv_immo = law.ir.pv_immo): # """ # Calcul de la plus value immobilière nette # """ # # 40. ABATTEMENT POUR DUREE DE DETENTION # # 41. NOMBRE D’ANNEES DE DETENTION AU-DELA DE LA 5EME ANNEE # if period.start: # TODO: # taux_reduc = max_(dur_det_immo - pv_immo.ann_det1, 0) * pv_immo.taux1 # else: # taux_reduc = (max_(dur_det_immo - pv_immo.ann_det3, 0) * pv_immo.taux3 # + max_(min_(dur_det_immo, pv_immo.ann_det3) - pv_immo.ann_det2, 0) * pv_immo.taux2 # + max_(min_(dur_det_immo, pv_immo.ann_det2) - pv_immo.ann_det1, 0) * pv_immo.taux1) # # taux_reduc = min_(taux_reduc, 1.0) # pv_impos = (1 - taux_reduc) * plus_value_brute # # # 45. MONTANT DE LA PLUS-VALUE BENEFICIANT, SOUS CONDITIONS, DE L’EXONERATION AU TITRE DE LA # # PREMIERE CESSION D’UN LOGEMENT EN VUE DE L’ACQUISITION DE LA RESIDENCE PRINCIPALE # # (CGI, 1° BIS DU II DE L’ARTICLE 150 U) TODO: # exo = 0 # # pv_net_impos = max_(pv_impos - exo, 0) # 46. PLUS-VALUE NETTE IMPOSABLE [LIGNE 44 OU (LIGNE 44 – LIGNE 45)] = € # # 50. PLUS-VALUE NETTE IMPOSABLE GLOBALE = # # (LIGNE 46 OU TOTAL DES LIGNES 46 SI PLUSIEURS 2048-IMM-SD PAGE 2) # # # Lorsqu’une même cession porte sur des biens pour lesquels sont prévues des règles différentes (acquisitions # # successives de fractions divises ou indivises notamment), il convient de remplir les lignes 10 à 46 pour chacune # # des fractions (utiliser plusieurs 2048-IMM-SD page 2). # return pv_net_impos @reference_formula class ir_pv_immo(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Impôt sur le revenu afférent à la plus-value immobilière" url = "http://www.impots.gouv.fr/portal/dgi/public/popup?espId=1&typePage=cpr02&docOid=documentstandard_2157" def function(self, simulation, period): """ Impôt sur le revenu afférent à la plus-value immobilière (CGI, art. 150 U, 150 UC-I et 150 UD) """ period = period.start.offset('first-of', 'year').period('year') f3vz = simulation.calculate('f3vz', period) pv_immo = simulation.legislation_at(period.start).ir.pv_immo # 61. MONTANT DU PAR LES PERSONNES PHYSIQUES RESIDENTES DE FRANCE OU D’UN AUTRE ETAT MEMBRE DE L’EEE(1) # (VOIR TABLEAU PAGE 3). # if resident impo = pv_immo.taux*f3vz # 62. MONTANT DU PAR LES AUTRES NON-RESIDENTS (VOIR TABLEAU PAGE 3 ET REMPLIR PAGE 4 SI NECESSAIRE) # IMPOSITION A 33,1/3% DES PERSONNES PHYSIQUES [(LIGNE 50 OU LIGNE 53) X 33,1/3%] = = € # IMPOSITION A 15% OU 19% OU 33,1/3% DES PERSONNES MORALES NON ASSUJETTIES A L’IR, ETABLIES DANS UN ETAT # MEMBRE DE L’EEE(1) (LIGNE 300 X 15% OU 19% OU 33,1/3%) = = € #IMPOSITION A 50% DES PERSONNES PHYSIQUES OU MORALES RESIDENTES D’UN ETNC(2) #[(LIGNE 50 OU (LIGNE 54 + LIGNE 300)) X 50%] = = € #63. ABATTEMENT REPRESENTATIF DU FORFAIT FORESTIER (SI LE CEDANT EST UNE PERSONNE PHYSIQUE RESIDENTE) - € #64. MONTANT DE L’IMPOT DU APRES ABATTEMENT [(LIGNE 61 + LIGNE 62) – LIGNE 63] = = € #(POUR L’APPLICATION DES PRELEVEMENTS SOCIAUX CI-DESSOUS, CF. TABLEAU « RAPPEL DES TAUX D’IMPOSITION » PAGE 5) : return period, -impo PK'G+:%P8P8Qopenfisca_france/model/prelevements_obligatoires/impot_revenu/reductions_impot.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import logging from numpy import minimum as min_, maximum as max_, logical_not as not_, around from ...base import * # noqa analysis:ignore log = logging.getLogger(__name__) @reference_formula class reductions(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"reductions" @dated_function(start = date(2002, 1, 1), stop = date(2002, 12, 31)) def function_20020101_20021231(self, simulation, period): ''' Renvoie la somme des réductions d'impôt à intégrer pour l'année 2002 ''' period = period.start.offset('first-of', 'year').period('year') adhcga = simulation.calculate('adhcga', period) assvie = simulation.calculate('assvie', period) cappme = simulation.calculate('cappme', period) cotsyn = simulation.calculate('cotsyn', period) dfppce = simulation.calculate('dfppce', period) daepad = simulation.calculate('daepad', period) doment = simulation.calculate('doment', period) domlog = simulation.calculate('domlog', period) donapd = simulation.calculate('donapd', period) ecpess = simulation.calculate('ecpess', period) garext = simulation.calculate('garext', period) intemp = simulation.calculate('intemp', period) invfor = simulation.calculate('invfor', period) invrev = simulation.calculate('invrev', period) ip_net = simulation.calculate('ip_net', period) prcomp = simulation.calculate('prcomp', period) rsceha = simulation.calculate('rsceha', period) saldom = simulation.calculate('saldom', period) spfcpi = simulation.calculate('spfcpi', period) total_reductions = (adhcga + assvie + cappme + cotsyn + dfppce + daepad + doment + domlog + donapd + ecpess + garext + intemp + invfor + invrev + prcomp + rsceha + saldom + spfcpi) return period, min_(ip_net, total_reductions) @dated_function(start = date(2003, 1, 1), stop = date(2004, 12, 31)) def function_20030101_20041231(self, simulation, period): ''' Renvoie la somme des réductions d'impôt à intégrer pour l'année 2003 et 2004 ''' period = period.start.offset('first-of', 'year').period('year') adhcga = simulation.calculate('adhcga', period) assvie = simulation.calculate('assvie', period) cappme = simulation.calculate('cappme', period) cotsyn = simulation.calculate('cotsyn', period) dfppce = simulation.calculate('dfppce', period) daepad = simulation.calculate('daepad', period) doment = simulation.calculate('doment', period) domlog = simulation.calculate('domlog', period) donapd = simulation.calculate('donapd', period) ecpess = simulation.calculate('ecpess', period) garext = simulation.calculate('garext', period) intemp = simulation.calculate('intemp', period) invfor = simulation.calculate('invfor', period) invrev = simulation.calculate('invrev', period) ip_net = simulation.calculate('ip_net', period) prcomp = simulation.calculate('prcomp', period) repsoc = simulation.calculate('repsoc', period) rsceha = simulation.calculate('rsceha', period) saldom = simulation.calculate('saldom', period) spfcpi = simulation.calculate('spfcpi', period) total_reductions = (adhcga + assvie + cappme + cotsyn + dfppce + daepad + doment + domlog + donapd + ecpess + garext + intemp + invfor + invrev + prcomp + repsoc + rsceha + saldom + spfcpi) return period, min_(ip_net, total_reductions) @dated_function(start = date(2005, 1, 1), stop = date(2005, 12, 31)) def function_20050101_20051231(self, simulation, period): ''' Renvoie la somme des réductions d'impôt à intégrer pour l'année 2005 ''' period = period.start.offset('first-of', 'year').period('year') adhcga = simulation.calculate('adhcga', period) cappme = simulation.calculate('cappme', period) cotsyn = simulation.calculate('cotsyn', period) daepad = simulation.calculate('daepad', period) dfppce = simulation.calculate('dfppce', period) doment = simulation.calculate('doment', period) domlog = simulation.calculate('domlog', period) donapd = simulation.calculate('donapd', period) ecpess = simulation.calculate('ecpess', period) intagr = simulation.calculate('intagr', period) intcon = simulation.calculate('intcon', period) invfor = simulation.calculate('invfor', period) invlst = simulation.calculate('invlst', period) ip_net = simulation.calculate('ip_net', period) prcomp = simulation.calculate('prcomp', period) repsoc = simulation.calculate('repsoc', period) rsceha = simulation.calculate('rsceha', period) saldom = simulation.calculate('saldom', period) spfcpi = simulation.calculate('spfcpi', period) total_reductions = (adhcga + cappme + cotsyn + daepad + dfppce + doment + domlog + donapd + ecpess + intagr + intcon + invfor + invlst + prcomp + repsoc + rsceha + saldom + spfcpi) return period, min_(ip_net, total_reductions) @dated_function(start = date(2006, 1, 1), stop = date(2006, 12, 31)) def function_20060101_20061231(self, simulation, period): ''' Renvoie la somme des réductions d'impôt à intégrer pour l'année 2006 ''' period = period.start.offset('first-of', 'year').period('year') adhcga = simulation.calculate('adhcga', period) cappme = simulation.calculate('cappme', period) cotsyn = simulation.calculate('cotsyn', period) creaen = simulation.calculate('creaen', period) daepad = simulation.calculate('daepad', period) deffor = simulation.calculate('deffor', period) dfppce = simulation.calculate('dfppce', period) doment = simulation.calculate('doment', period) domlog = simulation.calculate('domlog', period) donapd = simulation.calculate('donapd', period) ecpess = simulation.calculate('ecpess', period) intagr = simulation.calculate('intagr', period) invfor = simulation.calculate('invfor', period) invlst = simulation.calculate('invlst', period) ip_net = simulation.calculate('ip_net', period) prcomp = simulation.calculate('prcomp', period) repsoc = simulation.calculate('repsoc', period) rsceha = simulation.calculate('rsceha', period) saldom = simulation.calculate('saldom', period) sofica = simulation.calculate('sofica', period) spfcpi = simulation.calculate('spfcpi', period) total_reductions = (adhcga + cappme + cotsyn + creaen + daepad + deffor + dfppce + doment + domlog + donapd + ecpess + intagr + invfor + invlst + prcomp + repsoc + rsceha + saldom + sofica + spfcpi) return period, min_(ip_net, total_reductions) @dated_function(start = date(2007, 1, 1), stop = date(2007, 12, 31)) def function_20070101_20071231(self, simulation, period): ''' Renvoie la somme des réductions d'impôt à intégrer pour l'année 2007 ''' period = period.start.offset('first-of', 'year').period('year') adhcga = simulation.calculate('adhcga', period) cappme = simulation.calculate('cappme', period) cotsyn = simulation.calculate('cotsyn', period) creaen = simulation.calculate('creaen', period) daepad = simulation.calculate('daepad', period) deffor = simulation.calculate('deffor', period) dfppce = simulation.calculate('dfppce', period) doment = simulation.calculate('doment', period) domlog = simulation.calculate('domlog', period) donapd = simulation.calculate('donapd', period) ecpess = simulation.calculate('ecpess', period) intagr = simulation.calculate('intagr', period) invfor = simulation.calculate('invfor', period) invlst = simulation.calculate('invlst', period) ip_net = simulation.calculate('ip_net', period) prcomp = simulation.calculate('prcomp', period) repsoc = simulation.calculate('repsoc', period) rsceha = simulation.calculate('rsceha', period) saldom = simulation.calculate('saldom', period) sofica = simulation.calculate('sofica', period) spfcpi = simulation.calculate('spfcpi', period) total_reductions = (adhcga + cappme + cotsyn + creaen + daepad + deffor + dfppce + doment + domlog + donapd + ecpess + intagr + invfor + invlst + prcomp + repsoc + rsceha + saldom + sofica + spfcpi) return period, min_(ip_net, total_reductions) @dated_function(start = date(2008, 1, 1), stop = date(2008, 12, 31)) def function_20080101_20081231(self, simulation, period): ''' Renvoie la somme des réductions d'impôt à intégrer pour l'année 2008 ''' period = period.start.offset('first-of', 'year').period('year') adhcga = simulation.calculate('adhcga', period) cappme = simulation.calculate('cappme', period) cotsyn = simulation.calculate('cotsyn', period) creaen = simulation.calculate('creaen', period) daepad = simulation.calculate('daepad', period) deffor = simulation.calculate('deffor', period) dfppce = simulation.calculate('dfppce', period) doment = simulation.calculate('doment', period) domlog = simulation.calculate('domlog', period) donapd = simulation.calculate('donapd', period) ecpess = simulation.calculate('ecpess', period) intagr = simulation.calculate('intagr', period) invfor = simulation.calculate('invfor', period) invlst = simulation.calculate('invlst', period) ip_net = simulation.calculate('ip_net', period) mohist = simulation.calculate('mohist', period) prcomp = simulation.calculate('prcomp', period) repsoc = simulation.calculate('repsoc', period) rsceha = simulation.calculate('rsceha', period) saldom = simulation.calculate('saldom', period) sofica = simulation.calculate('sofica', period) spfcpi = simulation.calculate('spfcpi', period) total_reductions = (adhcga + cappme + cotsyn + creaen + daepad + deffor + dfppce + doment + domlog + donapd + ecpess + intagr + invfor + invlst + mohist + prcomp + repsoc + rsceha + saldom + sofica + spfcpi) return period, min_(ip_net, total_reductions) @dated_function(start = date(2009, 1, 1), stop = date(2009, 12, 31)) def function_20090101_20091231(self, simulation, period): ''' Renvoie la somme des réductions d'impôt à intégrer pour l'année 2009 ''' period = period.start.offset('first-of', 'year').period('year') adhcga = simulation.calculate('adhcga', period) cappme = simulation.calculate('cappme', period) cotsyn = simulation.calculate('cotsyn', period) creaen = simulation.calculate('creaen', period) daepad = simulation.calculate('daepad', period) deffor = simulation.calculate('deffor', period) dfppce = simulation.calculate('dfppce', period) doment = simulation.calculate('doment', period) domlog = simulation.calculate('domlog', period) domsoc = simulation.calculate('domsoc', period) donapd = simulation.calculate('donapd', period) ecodev = simulation.calculate('ecodev', period) ecpess = simulation.calculate('ecpess', period) intagr = simulation.calculate('intagr', period) invfor = simulation.calculate('invfor', period) invlst = simulation.calculate('invlst', period) ip_net = simulation.calculate('ip_net', period) locmeu = simulation.calculate('locmeu', period) mohist = simulation.calculate('mohist', period) prcomp = simulation.calculate('prcomp', period) repsoc = simulation.calculate('repsoc', period) resimm = simulation.calculate('resimm', period) rsceha = simulation.calculate('rsceha', period) saldom = simulation.calculate('saldom', period) scelli = simulation.calculate('scelli', period) sofica = simulation.calculate('sofica', period) sofipe = simulation.calculate('sofipe', period) spfcpi = simulation.calculate('spfcpi', period) total_reductions = (adhcga + cappme + cotsyn + creaen + daepad + deffor + dfppce + doment + domlog + domsoc + donapd + ecodev + ecpess + intagr + invfor + invlst + locmeu + mohist + prcomp + repsoc + resimm + rsceha + saldom + scelli + sofica + sofipe + spfcpi) return period, min_(ip_net, total_reductions) @dated_function(start = date(2010, 1, 1), stop = date(2010, 12, 31)) def function_20100101_20101231(self, simulation, period): # TODO: check (sees checked) and report in Niches.xls ''' Renvoie la somme des réductions d'impôt à intégrer pour l'année 2010 ''' period = period.start.offset('first-of', 'year').period('year') adhcga = simulation.calculate('adhcga', period) cappme = simulation.calculate('cappme', period) cotsyn = simulation.calculate('cotsyn', period) creaen = simulation.calculate('creaen', period) daepad = simulation.calculate('daepad', period) deffor = simulation.calculate('deffor', period) dfppce = simulation.calculate('dfppce', period) doment = simulation.calculate('doment', period) domlog = simulation.calculate('domlog', period) domsoc = simulation.calculate('domsoc', period) donapd = simulation.calculate('donapd', period) ecpess = simulation.calculate('ecpess', period) intagr = simulation.calculate('intagr', period) invfor = simulation.calculate('invfor', period) invlst = simulation.calculate('invlst', period) ip_net = simulation.calculate('ip_net', period) locmeu = simulation.calculate('locmeu', period) mohist = simulation.calculate('mohist', period) patnat = simulation.calculate('patnat', period) prcomp = simulation.calculate('prcomp', period) repsoc = simulation.calculate('repsoc', period) resimm = simulation.calculate('resimm', period) rsceha = simulation.calculate('rsceha', period) saldom = simulation.calculate('saldom', period) scelli = simulation.calculate('scelli', period) sofica = simulation.calculate('sofica', period) sofipe = simulation.calculate('sofipe', period) spfcpi = simulation.calculate('spfcpi', period) total_reductions = (adhcga + cappme + cotsyn + creaen + daepad + deffor + dfppce + doment + domlog + domsoc + donapd + ecpess + intagr + invfor + invlst + locmeu + mohist + patnat + prcomp + repsoc + resimm + rsceha + saldom + scelli + sofica + sofipe + spfcpi) # TODO: check (sees checked) and report in Niches.xls return period, min_(ip_net, total_reductions) @dated_function(start = date(2011, 1, 1), stop = date(2011, 12, 31)) def function_20110101_20111231(self, simulation, period): ''' Renvoie la somme des réductions d'impôt à intégrer pour l'année 2011 ''' period = period.start.offset('first-of', 'year').period('year') adhcga = simulation.calculate('adhcga', period) cappme = simulation.calculate('cappme', period) cotsyn = simulation.calculate('cotsyn', period) creaen = simulation.calculate('creaen', period) daepad = simulation.calculate('daepad', period) deffor = simulation.calculate('deffor', period) dfppce = simulation.calculate('dfppce', period) doment = simulation.calculate('doment', period) domlog = simulation.calculate('domlog', period) domsoc = simulation.calculate('domsoc', period) donapd = simulation.calculate('donapd', period) ecpess = simulation.calculate('ecpess', period) intagr = simulation.calculate('intagr', period) invfor = simulation.calculate('invfor', period) invlst = simulation.calculate('invlst', period) ip_net = simulation.calculate('ip_net', period) locmeu = simulation.calculate('locmeu', period) mohist = simulation.calculate('mohist', period) patnat = simulation.calculate('patnat', period) prcomp = simulation.calculate('prcomp', period) repsoc = simulation.calculate('repsoc', period) resimm = simulation.calculate('resimm', period) rsceha = simulation.calculate('rsceha', period) saldom = simulation.calculate('saldom', period) scelli = simulation.calculate('scelli', period) sofica = simulation.calculate('sofica', period) sofipe = simulation.calculate('sofipe', period) spfcpi = simulation.calculate('spfcpi', period) total_reductions = (adhcga + cappme + cotsyn + creaen + daepad + deffor + dfppce + doment + domlog + domsoc + donapd + ecpess + intagr + invfor + invlst + locmeu + mohist + patnat + prcomp + repsoc + resimm + rsceha + saldom + scelli + sofica + sofipe + spfcpi) return period, min_(ip_net, total_reductions) @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): ''' Renvoie la somme des réductions d'impôt à intégrer pour l'année 2012 ''' period = period.start.offset('first-of', 'year').period('year') adhcga = simulation.calculate('adhcga', period) cappme = simulation.calculate('cappme', period) creaen = simulation.calculate('creaen', period) daepad = simulation.calculate('daepad', period) deffor = simulation.calculate('deffor', period) dfppce = simulation.calculate('dfppce', period) doment = simulation.calculate('doment', period) domlog = simulation.calculate('domlog', period) domsoc = simulation.calculate('domsoc', period) donapd = simulation.calculate('donapd', period) ecpess = simulation.calculate('ecpess', period) intagr = simulation.calculate('intagr', period) invfor = simulation.calculate('invfor', period) invlst = simulation.calculate('invlst', period) ip_net = simulation.calculate('ip_net', period) locmeu = simulation.calculate('locmeu', period) mohist = simulation.calculate('mohist', period) patnat = simulation.calculate('patnat', period) prcomp = simulation.calculate('prcomp', period) repsoc = simulation.calculate('repsoc', period) resimm = simulation.calculate('resimm', period) rsceha = simulation.calculate('rsceha', period) saldom = simulation.calculate('saldom', period) scelli = simulation.calculate('scelli', period) sofica = simulation.calculate('sofica', period) spfcpi = simulation.calculate('spfcpi', period) total_reductions = (adhcga + cappme + creaen + daepad + deffor + dfppce + doment + domlog + domsoc + donapd + ecpess + intagr + invfor + invlst + locmeu + mohist + patnat + prcomp + repsoc + resimm + rsceha + saldom + scelli + sofica + spfcpi) return period, min_(ip_net, total_reductions) @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): ''' Renvoie la somme des réductions d'impôt à intégrer pour l'année 2013 ''' period = period.start.offset('first-of', 'year').period('year') accult = simulation.calculate('accult', period) adhcga = simulation.calculate('adhcga', period) cappme = simulation.calculate('cappme', period) creaen = simulation.calculate('creaen', period) daepad = simulation.calculate('daepad', period) deffor = simulation.calculate('deffor', period) dfppce = simulation.calculate('dfppce', period) doment = simulation.calculate('doment', period) domlog = simulation.calculate('domlog', period) donapd = simulation.calculate('donapd', period) duflot = simulation.calculate('duflot', period) ecpess = simulation.calculate('ecpess', period) garext = simulation.calculate('garext', period) intagr = simulation.calculate('intagr', period) invfor = simulation.calculate('invfor', period) invlst = simulation.calculate('invlst', period) ip_net = simulation.calculate('ip_net', period) locmeu = simulation.calculate('locmeu', period) mecena = simulation.calculate('mecena', period) mohist = simulation.calculate('mohist', period) patnat = simulation.calculate('patnat', period) prcomp = simulation.calculate('prcomp', period) repsoc = simulation.calculate('repsoc', period) resimm = simulation.calculate('resimm', period) rsceha = simulation.calculate('rsceha', period) saldom = simulation.calculate('saldom', period) scelli = simulation.calculate('scelli', period) sofica = simulation.calculate('sofica', period) spfcpi = simulation.calculate('spfcpi', period) total_reductions = (accult + adhcga + cappme + creaen + daepad + deffor + dfppce + doment + domlog + donapd + duflot + ecpess + garext + intagr + invfor + invlst + locmeu + mecena + mohist + patnat + prcomp + repsoc + resimm + rsceha + saldom + scelli + sofica + spfcpi) return period, min_(ip_net, total_reductions) #pour tous les dfppce: # : note de bas de page # TODO: plafonnement pour parti politiques depuis 2012 P.ir.reductions_impots.dfppce.max_niv @reference_formula class adhcga(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"adhcga" def function(self, simulation, period): ''' Frais de comptabilité et d'adhésion à un CGA ou AA 2002- ''' period = period.start.offset('first-of', 'year').period('year') f7ff = simulation.calculate('f7ff', period) f7fg = simulation.calculate('f7fg', period) P = simulation.legislation_at(period.start).ir.reductions_impots.adhcga return period, min_(f7ff, P.max * f7fg) @reference_formula class assvie(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"assvie" start_date = date(2002, 1, 1) stop_date = date(2004, 12, 31) def function(self, simulation, period): ''' Assurance-vie (cases GW, GX et GY de la 2042) 2002-2004 ''' period = period.start.offset('first-of', 'year').period('year') nb_pac = simulation.calculate('nb_pac', period) f7gw = simulation.calculate('f7gw', period) f7gx = simulation.calculate('f7gx', period) f7gy = simulation.calculate('f7gy', period) P = simulation.legislation_at(period.start).ir.reductions_impots.assvie max1 = P.max + nb_pac * P.pac return period, P.taux * min_(f7gw + f7gx + f7gy, max1) @reference_formula class cappme(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"cappme" @dated_function(start = date(2002, 1, 1), stop = date(2002, 12, 31)) def function_20020101_20021231(self, simulation, period): ''' Souscriptions au capital des PME 2002 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7cf = simulation.calculate('f7cf', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.cappme base = f7cf seuil = P.seuil * (marpac + 1) return period, P.taux * min_(base, seuil) @dated_function(start = date(2003, 1, 1), stop = date(2003, 12, 31)) def function_20030101_20031231(self, simulation, period): ''' Souscriptions au capital des PME 2003 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7cf = simulation.calculate('f7cf', period) f7cl = simulation.calculate('f7cl', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.cappme base = f7cf + f7cl seuil = P.seuil * (marpac + 1) return period, P.taux * min_(base, seuil) @dated_function(start = date(2004, 1, 1), stop = date(2004, 12, 31)) def function_20040101_20041231(self, simulation, period): ''' Souscriptions au capital des PME 2004 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7cf = simulation.calculate('f7cf', period) f7cl = simulation.calculate('f7cl', period) f7cm = simulation.calculate('f7cm', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.cappme base = f7cf + f7cl + f7cm seuil = P.seuil * (marpac + 1) return period, P.taux * min_(base, seuil) @dated_function(start = date(2005, 1, 1), stop = date(2008, 12, 31)) def function_20050101_20081231(self, simulation, period): ''' Souscriptions au capital des PME 2005-2008 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7cf = simulation.calculate('f7cf', period) f7cl = simulation.calculate('f7cl', period) f7cm = simulation.calculate('f7cm', period) f7cn = simulation.calculate('f7cn', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.cappme base = f7cf + f7cl + f7cm + f7cn seuil = P.seuil * (marpac + 1) return period, P.taux * min_(base, seuil) @dated_function(start = date(2009, 1, 1), stop = date(2010, 12, 31)) def function_20090101_20101231(self, simulation, period): ''' Souscriptions au capital des PME 2009-2010 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7cf = simulation.calculate('f7cf', period) f7cl = simulation.calculate('f7cl', period) f7cm = simulation.calculate('f7cm', period) f7cn = simulation.calculate('f7cn', period) f7cu = simulation.calculate('f7cu', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.cappme base = f7cf + f7cl + f7cm + f7cn + f7cu seuil = P.seuil * (marpac + 1) seuil = P.seuil_tpe * (marpac + 1) * (f7cu > 0) + P.seuil * (marpac + 1) * (f7cu <= 0) return period, P.taux * min_(base, seuil) @dated_function(start = date(2011, 1, 1), stop = date(2011, 12, 31)) def function_20110101_20111231(self, simulation, period): ''' Souscriptions au capital des PME 2011 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7cf = simulation.calculate('f7cf', period) f7cl = simulation.calculate('f7cl', period) f7cm = simulation.calculate('f7cm', period) f7cn = simulation.calculate('f7cn', period) f7cq = simulation.calculate('f7cq', period) f7cu = simulation.calculate('f7cu', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.cappme base = f7cl + f7cm + f7cn + f7cq seuil = P.seuil_tpe * (marpac + 1) * (f7cu > 0) + P.seuil * (marpac + 1) * (f7cu <= 0) max0 = max_(seuil - base, 0) return period, max_(P.taux25 * min_(base, seuil), P.taux * min_(max0, f7cf + f7cu)) @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): ''' Souscriptions au capital des PME 2012 cf. 2041 GR ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7cf = simulation.calculate('f7cf', period) f7cl = simulation.calculate('f7cl', period) f7cm = simulation.calculate('f7cm', period) f7cn = simulation.calculate('f7cn', period) f7cq = simulation.calculate('f7cq', period) f7cu = simulation.calculate('f7cu', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.cappme #TODO: gérer les changements de situation familiale base = f7cl + f7cm + f7cn seuil1 = P.seuil * (marpac + 1) seuil2 = max_(0, P.seuil_tpe * (marpac + 1) - min_(base, seuil1) - min_(f7cq, seuil1) - min_(f7cu, seuil1)) seuil3 = min_(P.seuil_tpe * (marpac + 1) - min_(base, seuil1) - min_(f7cq, seuil1), seuil1) return period, P.taux25 * min_(base, seuil1) + P.taux * min_(f7cq, seuil1) + P.taux18 * (min_(f7cf, seuil3) + mini(f7cu, seuil2, seuil1)) @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): ''' Souscriptions au capital des PME 2013 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7cc = simulation.calculate('f7cc', period) f7cf = simulation.calculate('f7cf', period) f7cl = simulation.calculate('f7cl', period) f7cm = simulation.calculate('f7cm', period) f7cn = simulation.calculate('f7cn', period) f7cq = simulation.calculate('f7cq', period) f7cu = simulation.calculate('f7cu', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.cappme base = f7cl + f7cm seuil1 = P.seuil * (marpac + 1) seuil2 = max_(0, P.seuil_tpe * (marpac + 1) - min_(base, seuil1) - min_(f7cn, seuil1) - min_(f7cu, seuil1)) seuil3 = min_(P.seuil_tpe * (marpac + 1) - min_(base, seuil1) - min_(f7cq, seuil1), seuil1) return period, P.taux25 * min_(base, seuil1) + P.taux22 * min_(f7cn, seuil1) + P.taux18 * (min_(f7cf + f7cc, seuil3) + min_(f7cu + f7cq, seuil2)) #TODO: vérifier l'existence du "max_" @reference_formula class cotsyn(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"cotsyn" def function(self, simulation, period): ''' Cotisations syndicales (2002-20131 ''' period = period.start.offset('first-of', 'year').period('year') f7ac_holder = simulation.compute('f7ac', period) salaire_imposable_holder = simulation.compute_add('salaire_imposable', period) cho_holder = simulation.compute('cho', period) rst_holder = simulation.compute('rst', period) P = simulation.legislation_at(period.start).ir.reductions_impots.cotsyn f7ac = self.filter_role(f7ac_holder, role = VOUS) f7ae = self.filter_role(f7ac_holder, role = CONJ) f7ag = self.filter_role(f7ac_holder, role = PAC1) cho = self.split_by_roles(cho_holder) rst = self.split_by_roles(rst_holder) salaire_imposable = self.split_by_roles(salaire_imposable_holder) tx = P.seuil salv, salc, salp = salaire_imposable[VOUS], salaire_imposable[CONJ], salaire_imposable[PAC1] chov, choc, chop = cho[VOUS], cho[CONJ], cho[PAC1] rstv, rstc, rstp = rst[VOUS], rst[CONJ], rst[PAC1] maxv = (salv + chov + rstv) * tx maxc = (salc + choc + rstc) * tx maxp = (salp + chop + rstp) * tx return period, P.taux * (min_(f7ac, maxv) + min_(f7ae, maxc) + min_(f7ag, maxp)) @reference_formula class creaen(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"creaen" @dated_function(start = date(2006, 1, 1), stop = date(2008, 12, 31)) def function_20060101_20081231(self, simulation, period): ''' Aide aux créateurs et repreneurs d'entreprises 2006-2008 ''' period = period.start.offset('first-of', 'year').period('year') f7fy = simulation.calculate('f7fy', period) f7gy = simulation.calculate('f7gy', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.creaen return period, (P.base * f7fy + P.hand * f7gy) @dated_function(start = date(2009, 1, 1), stop = date(2009, 12, 31)) def function_20090101_20091231(self, simulation, period): ''' Aide aux créateurs et repreneurs d'entreprises 2009 ''' period = period.start.offset('first-of', 'year').period('year') f7fy = simulation.calculate('f7fy', period) f7gy = simulation.calculate('f7gy', period) f7jy = simulation.calculate('f7jy', period) f7hy = simulation.calculate('f7hy', period) f7ky = simulation.calculate('f7ky', period) f7iy = simulation.calculate('f7iy', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.creaen return period, (P.base * ((f7jy + f7fy) + f7hy / 2) + P.hand * ((f7ky + f7gy) + f7iy / 2)) @dated_function(start = date(2010, 1, 1), stop = date(2011, 12, 31)) def function_20100101_20111231(self, simulation, period): ''' Aide aux créateurs et repreneurs d'entreprises 2010-2011 ''' period = period.start.offset('first-of', 'year').period('year') f7fy = simulation.calculate('f7fy', period) f7gy = simulation.calculate('f7gy', period) f7jy = simulation.calculate('f7jy', period) f7hy = simulation.calculate('f7hy', period) f7ky = simulation.calculate('f7ky', period) f7iy = simulation.calculate('f7iy', period) f7ly = simulation.calculate('f7ly', period) f7my = simulation.calculate('f7my', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.creaen return period, (P.base * ((f7jy + f7fy) + (f7hy + f7ly) / 2) + P.hand * ((f7ky + f7gy) + (f7iy + f7my) / 2)) @dated_function(start = date(2012, 1, 1), stop = date(2014, 12, 31)) def function_20120101_20141231(self, simulation, period): ''' Aide aux créateurs et repreneurs d'entreprises 2012- ''' period = period.start.offset('first-of', 'year').period('year') f7ly = simulation.calculate('f7ly', period) f7my = simulation.calculate('f7my', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.creaen return period, (P.base * (f7ly / 2) + P.hand * (f7my / 2)) @reference_formula class deffor(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"deffor" start_date = date(2006, 1, 1) def function(self, simulation, period): ''' Défense des forêts contre l'incendie 2006- ''' period = period.start.offset('first-of', 'year').period('year') f7uc = simulation.calculate('f7uc', period) P = simulation.legislation_at(period.start).ir.reductions_impots.deffor return period, P.taux * min_(f7uc, P.max) @reference_formula class daepad(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"daepad" def function(self, simulation, period): ''' Dépenses d'accueil dans un établissement pour personnes âgées dépendantes ?- ''' period = period.start.offset('first-of', 'year').period('year') f7cd = simulation.calculate('f7cd', period) f7ce = simulation.calculate('f7ce', period) P = simulation.legislation_at(period.start).ir.reductions_impots.daepad return period, P.taux * (min_(f7cd, P.max) + min_(f7ce, P.max)) @reference_formula class dfppce(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"dfppce" @dated_function(start = date(2002, 1, 1), stop = date(2003, 12, 31)) def function_20020101_20031231(self, simulation, period): ''' Dons aux autres oeuvres et dons effectués pour le financement des partis politiques et des campagnes électorales ''' period = period.start.offset('first-of', 'year').period('year') rbg_int = simulation.calculate('rbg_int', period) f7uf = simulation.calculate('f7uf', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.dfppce base = f7uf max1 = P.max * rbg_int return period, P.taux * min_(base, max1) @dated_function(start = date(2004, 1, 1), stop = date(2004, 12, 31)) def function_20040101_20041231(self, simulation, period): ''' Dons aux autres oeuvres et dons effectués pour le financement des partis politiques et des campagnes électorales ''' period = period.start.offset('first-of', 'year').period('year') rbg_int = simulation.calculate('rbg_int', period) f7uf = simulation.calculate('f7uf', period) f7xs = simulation.calculate('f7xs', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.dfppce base = f7uf + f7xs max1 = P.max * rbg_int return period, P.taux * min_(base, max1) @dated_function(start = date(2005, 1, 1), stop = date(2005, 12, 31)) def function_20050101_20051231(self, simulation, period): ''' Dons aux autres oeuvres et dons effectués pour le financement des partis politiques et des campagnes électorales ''' period = period.start.offset('first-of', 'year').period('year') rbg_int = simulation.calculate('rbg_int', period) f7uf = simulation.calculate('f7uf', period) f7xs = simulation.calculate('f7xs', period) f7xt = simulation.calculate('f7xt', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.dfppce base = f7uf + f7xs + f7xt max1 = P.max * rbg_int return period, P.taux * min_(base, max1) @dated_function(start = date(2006, 1, 1), stop = date(2006, 12, 31)) def function_20060101_20061231(self, simulation, period): ''' Dons aux autres oeuvres et dons effectués pour le financement des partis politiques et des campagnes électorales ''' period = period.start.offset('first-of', 'year').period('year') rbg_int = simulation.calculate('rbg_int', period) f7uf = simulation.calculate('f7uf', period) f7xs = simulation.calculate('f7xs', period) f7xt = simulation.calculate('f7xt', period) f7xu = simulation.calculate('f7xu', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.dfppce base = f7uf + f7xs + f7xt + f7xu max1 = P.max * rbg_int return period, P.taux * min_(base, max1) @dated_function(start = date(2007, 1, 1), stop = date(2007, 12, 31)) def function_20070101_20071231(self, simulation, period): ''' Dons aux autres oeuvres et dons effectués pour le financement des partis politiques et des campagnes électorales ''' period = period.start.offset('first-of', 'year').period('year') rbg_int = simulation.calculate('rbg_int', period) f7uf = simulation.calculate('f7uf', period) f7xs = simulation.calculate('f7xs', period) f7xt = simulation.calculate('f7xt', period) f7xu = simulation.calculate('f7xu', period) f7xw = simulation.calculate('f7xw', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.dfppce base = f7uf + f7xs + f7xt + f7xu + f7xw max1 = P.max * rbg_int return period, P.taux * min_(base, max1) @dated_function(start = date(2008, 1, 1), stop = date(2010, 12, 31)) def function_20080101_20101231(self, simulation, period): ''' Dons aux autres oeuvres et dons effectués pour le financement des partis politiques et des campagnes électorales ''' period = period.start.offset('first-of', 'year').period('year') rbg_int = simulation.calculate('rbg_int', period) f7uf = simulation.calculate('f7uf', period) f7xs = simulation.calculate('f7xs', period) f7xt = simulation.calculate('f7xt', period) f7xu = simulation.calculate('f7xu', period) f7xw = simulation.calculate('f7xw', period) f7xy = simulation.calculate('f7xy', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.dfppce base = f7uf + f7xs + f7xt + f7xu + f7xw + f7xy max1 = P.max * rbg_int return period, P.taux * min_(base, max1) @dated_function(start = date(2011, 1, 1), stop = date(2011, 12, 31)) def function_20110101_20111231(self, simulation, period): ''' Dons aux autres oeuvres et dons effectués pour le financement des partis politiques et des campagnes électorales (2011-2013) ''' period = period.start.offset('first-of', 'year').period('year') rbg_int = simulation.calculate('rbg_int', period) f7uf = simulation.calculate('f7uf', period) f7xs = simulation.calculate('f7xs', period) f7xt = simulation.calculate('f7xt', period) f7xu = simulation.calculate('f7xu', period) f7xw = simulation.calculate('f7xw', period) f7xy = simulation.calculate('f7xy', period) f7vc = simulation.calculate('f7vc', period) P = simulation.legislation_at(period.start).ir.reductions_impots.dfppce base = f7uf + f7vc + f7xs + f7xt + f7xu + f7xw + f7xy max1 = P.max * rbg_int return period, P.taux * min_(base, max1) @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): ''' Dons aux autres oeuvres et dons effectués pour le financement des partis politiques et des campagnes électorales (2011-2013) ''' period = period.start.offset('first-of', 'year').period('year') rbg_int = simulation.calculate('rbg_int', period) f7uf = simulation.calculate('f7uf', period) f7xs = simulation.calculate('f7xs', period) f7xt = simulation.calculate('f7xt', period) f7xu = simulation.calculate('f7xu', period) f7xw = simulation.calculate('f7xw', period) f7xy = simulation.calculate('f7xy', period) f7vc = simulation.calculate('f7vc', period) P = simulation.legislation_at(period.start).ir.reductions_impots.dfppce base = min_(P.max_niv, f7uf) + f7vc + f7xs + f7xt + f7xu + f7xw + f7xy max1 = P.max * rbg_int return period, P.taux * min_(base, max1) @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): ''' Dons aux autres oeuvres et dons effectués pour le financement des partis politiques et des campagnes électorales (2011-2013) ''' period = period.start.offset('first-of', 'year').period('year') rbg_int = simulation.calculate('rbg_int', period) f7uf = simulation.calculate('f7uf', period) f7uh = simulation.calculate('f7uh', period) f7xs = simulation.calculate('f7xs', period) f7xt = simulation.calculate('f7xt', period) f7xu = simulation.calculate('f7xu', period) f7xw = simulation.calculate('f7xw', period) f7xy = simulation.calculate('f7xy', period) f7vc = simulation.calculate('f7vc', period) P = simulation.legislation_at(period.start).ir.reductions_impots.dfppce base = min_(P.max_niv, f7uf + f7uh) + f7vc + f7xs + f7xt + f7xu + f7xw + f7xy max1 = P.max * rbg_int return period, P.taux * min_(base, max1) # TODO: note de bas de page # Introduire plus de détails dans la déclaration pour séparer les dons aux partis poitiques # et aux candidats des autres dons # Outre-mer : TODO: plafonnement, cf. 2041-GE 2042-IOM @reference_formula class doment(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"doment" @dated_function(start = date(2005, 1, 1), stop = date(2005, 12, 31)) def function_20050101_20051231(self, simulation, period): ''' Investissements dans les DOM-TOM dans le cadre d'une entrepise. ''' period = period.start.offset('first-of', 'year').period('year') f7ur = simulation.calculate('f7ur', period) f7oz = simulation.calculate('f7oz', period) f7pz = simulation.calculate('f7pz', period) f7qz = simulation.calculate('f7qz', period) f7rz = simulation.calculate('f7rz', period) return period, f7ur + f7oz + f7pz + f7qz + f7rz @dated_function(start = date(2006, 1, 1), stop = date(2008, 12, 31)) def function_20060101_20081231(self, simulation, period): ''' Investissements dans les DOM-TOM dans le cadre d'une entrepise. ''' period = period.start.offset('first-of', 'year').period('year') f7ur = simulation.calculate('f7ur', period) f7oz = simulation.calculate('f7oz', period) f7pz = simulation.calculate('f7pz', period) f7qz = simulation.calculate('f7qz', period) f7rz = simulation.calculate('f7rz', period) f7sz = simulation.calculate('f7sz', period) return period, f7ur + f7oz + f7pz + f7qz + f7rz + f7sz @dated_function(start = date(2009, 1, 1), stop = date(2009, 12, 31)) def function_20090101_20091231(self, simulation, period): ''' Investissements dans les DOM-TOM dans le cadre d'une entrepise. ''' period = period.start.offset('first-of', 'year').period('year') f7oz = simulation.calculate('f7oz', period) f7pz = simulation.calculate('f7pz', period) f7qz = simulation.calculate('f7qz', period) f7rz = simulation.calculate('f7rz', period) f7sz = simulation.calculate('f7sz', period) f7qe = simulation.calculate('f7qe', period) f7qf = simulation.calculate('f7qf', period) f7qg = simulation.calculate('f7qg', period) f7qh = simulation.calculate('f7qh', period) f7qi = simulation.calculate('f7qi', period) f7qj = simulation.calculate('f7qj', period) return period, f7oz + f7pz + f7qz + f7rz + f7sz + f7qe + f7qf + f7qg + f7qh + f7qi + f7qj @dated_function(start = date(2010, 1, 1), stop = date(2010, 12, 31)) def function_20100101_20101231(self, simulation, period): ''' Investissements dans les DOM-TOM dans le cadre d'une entrepise. ''' period = period.start.offset('first-of', 'year').period('year') f7oz = simulation.calculate('f7oz', period) f7pz = simulation.calculate('f7pz', period) f7qz = simulation.calculate('f7qz', period) f7rz = simulation.calculate('f7rz', period) f7qe = simulation.calculate('f7qe', period) f7qf = simulation.calculate('f7qf', period) f7qg = simulation.calculate('f7qg', period) f7qh = simulation.calculate('f7qh', period) f7qi = simulation.calculate('f7qi', period) f7qj = simulation.calculate('f7qj', period) f7qo = simulation.calculate('f7qo', period) f7qp = simulation.calculate('f7qp', period) f7qq = simulation.calculate('f7qq', period) f7qr = simulation.calculate('f7qr', period) f7qs = simulation.calculate('f7qs', period) f7mm = simulation.calculate('f7mm', period) f7ma = simulation.calculate('f7ma', period) f7lg = simulation.calculate('f7lg', period) f7ks = simulation.calculate('f7ks', period) f7ls = simulation.calculate('f7ls', period) return period, (f7oz + f7pz + f7qz + f7rz + f7qe + f7qf + f7qg + f7qh + f7qi + f7qj + f7qo + f7qp + f7qq + f7qr + f7qs + f7mm + f7ma + f7lg + f7ks + f7ls) @dated_function(start = date(2011, 1, 1), stop = date(2011, 12, 31)) def function_20110101_20111231(self, simulation, period): ''' Investissements dans les DOM-TOM dans le cadre d'une entrepise. ''' period = period.start.offset('first-of', 'year').period('year') f7ks = simulation.calculate('f7ks', period) f7kt = simulation.calculate('f7kt', period) f7ku = simulation.calculate('f7ku', period) f7lg = simulation.calculate('f7lg', period) f7lh = simulation.calculate('f7lh', period) f7li = simulation.calculate('f7li', period) f7mm = simulation.calculate('f7mm', period) f7ma = simulation.calculate('f7ma', period) f7mb = simulation.calculate('f7mb', period) f7mc = simulation.calculate('f7mc', period) f7mn = simulation.calculate('f7mn', period) f7oz = simulation.calculate('f7oz', period) f7pa = simulation.calculate('f7pa', period) f7pb = simulation.calculate('f7pb', period) f7pd = simulation.calculate('f7pd', period) f7pe = simulation.calculate('f7pe', period) f7pf = simulation.calculate('f7pf', period) f7ph = simulation.calculate('f7ph', period) f7pi = simulation.calculate('f7pi', period) f7pj = simulation.calculate('f7pj', period) f7pl = simulation.calculate('f7pl', period) f7pz = simulation.calculate('f7pz', period) f7qz = simulation.calculate('f7qz', period) f7qe = simulation.calculate('f7qe', period) f7qf = simulation.calculate('f7qf', period) f7qg = simulation.calculate('f7qg', period) f7qh = simulation.calculate('f7qh', period) f7qi = simulation.calculate('f7qi', period) f7qo = simulation.calculate('f7qo', period) f7qp = simulation.calculate('f7qp', period) f7qq = simulation.calculate('f7qq', period) f7qr = simulation.calculate('f7qr', period) f7qv = simulation.calculate('f7qv', period) return period, (f7ks + f7kt + f7ku + f7lg + f7lh + f7li + f7mb + f7mn + f7mc + f7mm + f7ma + f7oz + f7pa + f7pb + f7pd + f7pe + f7pf + f7ph + f7pi + f7pj + f7pl + f7pz + f7qz + f7qf + f7qg + f7qh + f7qi + f7qo + f7qp + f7qq + f7qr + f7qe + f7qv) @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): ''' Investissements dans les DOM-TOM dans le cadre d'une entrepise. ''' period = period.start.offset('first-of', 'year').period('year') f7ks = simulation.calculate('f7ks', period) f7kt = simulation.calculate('f7kt', period) f7ku = simulation.calculate('f7ku', period) f7lg = simulation.calculate('f7lg', period) f7lh = simulation.calculate('f7lh', period) f7li = simulation.calculate('f7li', period) f7ma = simulation.calculate('f7ma', period) f7mb = simulation.calculate('f7mb', period) f7mc = simulation.calculate('f7mc', period) f7mm = simulation.calculate('f7mm', period) f7mn = simulation.calculate('f7mn', period) f7nu = simulation.calculate('f7nu', period) f7nv = simulation.calculate('f7nv', period) f7nw = simulation.calculate('f7nw', period) f7ny = simulation.calculate('f7ny', period) f7pa = simulation.calculate('f7pa', period) f7pb = simulation.calculate('f7pb', period) f7pd = simulation.calculate('f7pd', period) f7pe = simulation.calculate('f7pe', period) f7pf = simulation.calculate('f7pf', period) f7ph = simulation.calculate('f7ph', period) f7pi = simulation.calculate('f7pi', period) f7pj = simulation.calculate('f7pj', period) f7pl = simulation.calculate('f7pl', period) f7pm = simulation.calculate('f7pm', period) f7pn = simulation.calculate('f7pn', period) f7po = simulation.calculate('f7po', period) f7pp = simulation.calculate('f7pp', period) f7pr = simulation.calculate('f7pr', period) f7ps = simulation.calculate('f7ps', period) f7pt = simulation.calculate('f7pt', period) f7pu = simulation.calculate('f7pu', period) f7pw = simulation.calculate('f7pw', period) f7px = simulation.calculate('f7px', period) f7py = simulation.calculate('f7py', period) f7pz = simulation.calculate('f7pz', period) f7qe = simulation.calculate('f7qe', period) f7qf = simulation.calculate('f7qf', period) f7qg = simulation.calculate('f7qg', period) f7qi = simulation.calculate('f7qi', period) f7qo = simulation.calculate('f7qo', period) f7qp = simulation.calculate('f7qp', period) f7qr = simulation.calculate('f7qr', period) f7qv = simulation.calculate('f7qv', period) f7qz = simulation.calculate('f7qz', period) f7rg = simulation.calculate('f7rg', period) f7ri = simulation.calculate('f7ri', period) f7rj = simulation.calculate('f7rj', period) f7rk = simulation.calculate('f7rk', period) f7rl = simulation.calculate('f7rl', period) f7rm = simulation.calculate('f7rm', period) f7ro = simulation.calculate('f7ro', period) f7rp = simulation.calculate('f7rp', period) f7rq = simulation.calculate('f7rq', period) f7rr = simulation.calculate('f7rr', period) f7rt = simulation.calculate('f7rt', period) f7ru = simulation.calculate('f7ru', period) f7rv = simulation.calculate('f7rv', period) f7rw = simulation.calculate('f7rw', period) f7rx = simulation.calculate('f7rx', period) f7ry = simulation.calculate('f7ry', period) return period, (f7ks + f7kt + f7ku + f7lg + f7lh + f7li + f7ma + f7mb + f7mc + f7mm + f7mn + f7pz + f7nu + f7nv + f7nw + f7ny + f7pa + f7pb + f7pd + f7pe + f7pf + f7ph + f7pi + f7pj + f7pl + f7pm + f7pn + f7po + f7pp + f7pr + f7ps + f7pt + f7pu + f7pw + f7px + f7py + f7qe + f7qf + f7qg + f7qi + f7qo + f7qp + f7qr + f7qv + f7qz + f7rg + f7ri + f7rj + f7rk + f7rl + f7rm + f7ro + f7rp + f7rq + f7rr + f7rt + f7ru + f7rv + f7rw) @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): ''' Investissements dans les DOM-TOM dans le cadre d'une entrepise. ''' period = period.start.offset('first-of', 'year').period('year') fhsa = simulation.calculate('fhsa', period) fhsb = simulation.calculate('fhsb', period) fhsf = simulation.calculate('fhsf', period) fhsg = simulation.calculate('fhsg', period) fhsc = simulation.calculate('fhsc', period) fhsh = simulation.calculate('fhsh', period) fhse = simulation.calculate('fhse', period) fhsj = simulation.calculate('fhsj', period) fhsk = simulation.calculate('fhsk', period) fhsl = simulation.calculate('fhsl', period) fhsp = simulation.calculate('fhsp', period) fhsq = simulation.calculate('fhsq', period) fhsm = simulation.calculate('fhsm', period) fhsr = simulation.calculate('fhsr', period) fhso = simulation.calculate('fhso', period) fhst = simulation.calculate('fhst', period) fhsu = simulation.calculate('fhsu', period) fhsv = simulation.calculate('fhsv', period) fhsw = simulation.calculate('fhsw', period) fhsz = simulation.calculate('fhsz', period) fhta = simulation.calculate('fhta', period) fhtb = simulation.calculate('fhtb', period) fhtd = simulation.calculate('fhtd', period) f7ks = simulation.calculate('f7ks', period) f7kt = simulation.calculate('f7kt', period) f7ku = simulation.calculate('f7ku', period) f7lg = simulation.calculate('f7lg', period) f7lh = simulation.calculate('f7lh', period) f7li = simulation.calculate('f7li', period) f7ma = simulation.calculate('f7ma', period) f7mb = simulation.calculate('f7mb', period) f7mc = simulation.calculate('f7mc', period) f7mm = simulation.calculate('f7mm', period) f7mn = simulation.calculate('f7mn', period) f7nu = simulation.calculate('f7nu', period) f7nv = simulation.calculate('f7nv', period) f7nw = simulation.calculate('f7nw', period) f7ny = simulation.calculate('f7ny', period) f7pa = simulation.calculate('f7pa', period) f7pb = simulation.calculate('f7pb', period) f7pd = simulation.calculate('f7pd', period) f7pe = simulation.calculate('f7pe', period) f7pf = simulation.calculate('f7pf', period) f7ph = simulation.calculate('f7ph', period) f7pi = simulation.calculate('f7pi', period) f7pj = simulation.calculate('f7pj', period) f7pl = simulation.calculate('f7pl', period) f7pm = simulation.calculate('f7pm', period) f7pn = simulation.calculate('f7pn', period) f7po = simulation.calculate('f7po', period) f7pp = simulation.calculate('f7pp', period) f7pr = simulation.calculate('f7pr', period) f7ps = simulation.calculate('f7ps', period) f7pt = simulation.calculate('f7pt', period) f7pu = simulation.calculate('f7pu', period) f7pw = simulation.calculate('f7pw', period) f7px = simulation.calculate('f7px', period) f7py = simulation.calculate('f7py', period) f7qe = simulation.calculate('f7qe', period) f7qf = simulation.calculate('f7qf', period) f7qg = simulation.calculate('f7qg', period) f7qi = simulation.calculate('f7qi', period) f7qo = simulation.calculate('f7qo', period) f7qp = simulation.calculate('f7qp', period) f7qr = simulation.calculate('f7qr', period) f7qv = simulation.calculate('f7qv', period) f7qz = simulation.calculate('f7qz', period) f7rg = simulation.calculate('f7rg', period) f7ri = simulation.calculate('f7ri', period) f7rj = simulation.calculate('f7rj', period) f7rk = simulation.calculate('f7rk', period) f7rl = simulation.calculate('f7rl', period) f7rm = simulation.calculate('f7rm', period) f7ro = simulation.calculate('f7ro', period) f7rp = simulation.calculate('f7rp', period) f7rq = simulation.calculate('f7rq', period) f7rr = simulation.calculate('f7rr', period) f7rt = simulation.calculate('f7rt', period) f7ru = simulation.calculate('f7ru', period) f7rv = simulation.calculate('f7rv', period) f7rw = simulation.calculate('f7rw', period) f7ry = simulation.calculate('f7ry', period) return period, (fhsa + fhsb + fhsf + fhsg + fhsc + fhsh + fhse + fhsj + fhsk + fhsl + fhsp + fhsq + fhsm + fhsr + fhso + fhst + fhsu + fhsv + fhsw + fhsz + fhta + fhtb + fhtd + f7ks + f7kt + f7ku + f7lg + f7lh + f7li + f7ma + f7mb + f7mc + f7mm + f7mn + f7nu + f7nv + f7nw + f7ny + f7pa + f7pb + f7pd + f7pe + f7pf + f7ph + f7pi + f7pj + f7pl + f7pm + f7pn + f7po + f7pp + f7pr + f7ps + f7pt + f7pu + f7pw + f7px + f7py + f7qe + f7qf + f7qg + f7qi + f7qo + f7qp + f7qr + f7qv + f7qz + f7rg + f7ri + f7rj + f7rk + f7rl + f7rm + f7ro + f7rp + f7rq + f7rr + f7rt + f7ru + f7rv + f7rw) #TODO: vérifier pour 2002 #TODO: pb 7ul 2005-2009 (ITRED = 0 au lieu de 20€ (forfaitaire), dû à ça : Cochez [7UL] si vous déclarez en ligne pour #la première fois vos revenus 2008 et si vous utilisez un moyen automatique de paiement (prélèvement mensuel ou à #l'échéance ou paiement par voie électronique)) #TODO: vérifier les dates des variables de doment et domsoc (y sont-elles encore en 2013 par ex ?) @reference_formula class domlog(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"domlog" @dated_function(start = date(2002, 1, 1), stop = date(2002, 12, 31)) def function_20020101_20021231(self, simulation, period): ''' Investissements OUTRE-MER dans le secteur du logement et autres secteurs d’activité 2002 ''' period = period.start.offset('first-of', 'year').period('year') f7ua = simulation.calculate('f7ua', period) f7ub = simulation.calculate('f7ub', period) f7uc = simulation.calculate('f7uc', period) f7uj = simulation.calculate('f7uj', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.domlog return period, P.taux1 * f7uj + P.taux2 * (f7ua + f7ub + f7uc) @dated_function(start = date(2003, 1, 1), stop = date(2004, 12, 31)) def function_20030101_20041231(self, simulation, period): ''' Investissements OUTRE-MER dans le secteur du logement et autres secteurs d’activité 2003-2004 ''' period = period.start.offset('first-of', 'year').period('year') f7ua = simulation.calculate('f7ua', period) f7ub = simulation.calculate('f7ub', period) f7uc = simulation.calculate('f7uc', period) f7ui = simulation.calculate('f7ui', period) f7uj = simulation.calculate('f7uj', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.domlog return period, P.taux1 * f7uj + P.taux2 * (f7ua + f7ub + f7uc) + f7ui @dated_function(start = date(2005, 1, 1), stop = date(2007, 12, 31)) def function_20050101_20071231(self, simulation, period): ''' Investissements OUTRE-MER dans le secteur du logement et autres secteurs d’activité 2005-2007 ''' period = period.start.offset('first-of', 'year').period('year') f7ua = simulation.calculate('f7ua', period) f7ub = simulation.calculate('f7ub', period) f7uc = simulation.calculate('f7uc', period) f7ui = simulation.calculate('f7ui', period) f7uj = simulation.calculate('f7uj', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.domlog return period, P.taux1 * f7uj + P.taux2 * (f7ua + f7ub) + f7ui @dated_function(start = date(2008, 1, 1), stop = date(2008, 12, 31)) def function_20080101_20081231(self, simulation, period): ''' Investissements OUTRE-MER dans le secteur du logement et autres secteurs d’activité 2008 ''' period = period.start.offset('first-of', 'year').period('year') f7ui = simulation.calculate('f7ui', period) return period, f7ui @dated_function(start = date(2009, 1, 1), stop = date(2009, 12, 31)) def function_20090101_20091231(self, simulation, period): ''' Investissements OUTRE-MER dans le secteur du logement et autres secteurs d’activité 2009 ''' period = period.start.offset('first-of', 'year').period('year') f7qb = simulation.calculate('f7qb', period) f7qc = simulation.calculate('f7qc', period) f7qd = simulation.calculate('f7qd', period) f7qk = simulation.calculate('f7qk', period) return period, f7qb + f7qc + f7qd + f7qk / 2 @dated_function(start = date(2010, 1, 1), stop = date(2010, 12, 31)) def function_20100101_20101231(self, simulation, period): ''' Investissements OUTRE-MER dans le secteur du logement et autres secteurs d’activité 2010 TODO: Plafonnement sur la notice ''' period = period.start.offset('first-of', 'year').period('year') f7qb = simulation.calculate('f7qb', period) f7qc = simulation.calculate('f7qc', period) f7qd = simulation.calculate('f7qd', period) f7ql = simulation.calculate('f7ql', period) f7qt = simulation.calculate('f7qt', period) f7qm = simulation.calculate('f7qm', period) return period, f7qb + f7qc + f7qd + f7ql + f7qt + f7qm @dated_function(start = date(2011, 1, 1), stop = date(2011, 12, 31)) def function_20110101_20111231(self, simulation, period): ''' Investissements OUTRE-MER dans le secteur du logement et autres secteurs d’activité 2011 TODO: Plafonnement sur la notice ''' period = period.start.offset('first-of', 'year').period('year') f7qb = simulation.calculate('f7qb', period) f7qc = simulation.calculate('f7qc', period) f7qd = simulation.calculate('f7qd', period) f7ql = simulation.calculate('f7ql', period) f7qm = simulation.calculate('f7qm', period) f7qt = simulation.calculate('f7qt', period) f7oa = simulation.calculate('f7oa', period) f7ob = simulation.calculate('f7ob', period) f7oc = simulation.calculate('f7oc', period) f7oh = simulation.calculate('f7oh', period) f7oi = simulation.calculate('f7oi', period) f7oj = simulation.calculate('f7oj', period) f7ok = simulation.calculate('f7ok', period) return period, f7qb + f7qc + f7qd + f7ql + f7qm + f7qt + f7oa + f7ob + f7oc + f7oh + f7oi + f7oj + f7ok @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): ''' Investissements OUTRE-MER dans le secteur du logement et autres secteurs d’activité 2012 TODO: Plafonnement sur la notice ''' period = period.start.offset('first-of', 'year').period('year') f7qb = simulation.calculate('f7qb', period) f7qc = simulation.calculate('f7qc', period) f7qd = simulation.calculate('f7qd', period) f7ql = simulation.calculate('f7ql', period) f7qm = simulation.calculate('f7qm', period) f7qt = simulation.calculate('f7qt', period) f7oa = simulation.calculate('f7oa', period) f7ob = simulation.calculate('f7ob', period) f7oc = simulation.calculate('f7oc', period) f7oh = simulation.calculate('f7oh', period) f7oi = simulation.calculate('f7oi', period) f7oj = simulation.calculate('f7oj', period) f7ok = simulation.calculate('f7ok', period) f7ol = simulation.calculate('f7ol', period) f7om = simulation.calculate('f7om', period) f7on = simulation.calculate('f7on', period) f7oo = simulation.calculate('f7oo', period) f7op = simulation.calculate('f7op', period) f7oq = simulation.calculate('f7oq', period) f7or = simulation.calculate('f7or', period) f7os = simulation.calculate('f7os', period) f7ot = simulation.calculate('f7ot', period) f7ou = simulation.calculate('f7ou', period) f7ov = simulation.calculate('f7ov', period) f7ow = simulation.calculate('f7ow', period) return period, (f7qb + f7qc + f7qd + f7ql + f7qm + f7qt + f7oa + f7ob + f7oc + f7oh + f7oi + f7oj + f7ok + f7ol + f7om + f7on + f7oo + f7op + f7oq + f7or + f7os + f7ot + f7ou + f7ov + f7ow) @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): ''' Investissements OUTRE-MER dans le secteur du logement et autres secteurs d’activité 2013 TODO: Plafonnement sur la notice ''' period = period.start.offset('first-of', 'year').period('year') fhod = simulation.calculate('fhod', period) fhoe = simulation.calculate('fhoe', period) fhof = simulation.calculate('fhof', period) fhog = simulation.calculate('fhog', period) fhox = simulation.calculate('fhox', period) fhoy = simulation.calculate('fhoy', period) fhoz = simulation.calculate('fhoz', period) f7qb = simulation.calculate('f7qb', period) f7qc = simulation.calculate('f7qc', period) f7qd = simulation.calculate('f7qd', period) f7ql = simulation.calculate('f7ql', period) f7qm = simulation.calculate('f7qm', period) f7qt = simulation.calculate('f7qt', period) f7oa = simulation.calculate('f7oa', period) f7ob = simulation.calculate('f7ob', period) f7oc = simulation.calculate('f7oc', period) f7oh = simulation.calculate('f7oh', period) f7oi = simulation.calculate('f7oi', period) f7oj = simulation.calculate('f7oj', period) f7ok = simulation.calculate('f7ok', period) f7ol = simulation.calculate('f7ol', period) f7om = simulation.calculate('f7om', period) f7on = simulation.calculate('f7on', period) f7oo = simulation.calculate('f7oo', period) f7op = simulation.calculate('f7op', period) f7oq = simulation.calculate('f7oq', period) f7or = simulation.calculate('f7or', period) f7os = simulation.calculate('f7os', period) f7ot = simulation.calculate('f7ot', period) f7ou = simulation.calculate('f7ou', period) f7ov = simulation.calculate('f7ov', period) f7ow = simulation.calculate('f7ow', period) return period, (f7qb + f7qc + f7qd + f7ql + f7qm + f7qt + f7oa + f7ob + f7oc + f7oh + f7oi + f7oj + f7ok + f7ol + f7om + f7on + f7oo + f7op + f7oq + f7or + f7os + f7ot + f7ou + f7ov + f7ow + fhod + fhoe + fhof + fhog + fhox + fhoy + fhoz) #En accord avec la DGFiP mais pas de 7ub et 7uj dans la notice @reference_formula class domsoc(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"domsoc" @dated_function(start = date(2010, 1, 1), stop = date(2012, 12, 31)) def function_20100101_20121231(self, simulation, period): ''' Investissements outre-mer dans le logement social (déclaration n°2042 IOM) 2010- TODO plafonnement à 15% f7qa / liens avec autres investissments ? ''' period = period.start.offset('first-of', 'year').period('year') f7qn = simulation.calculate('f7qn', period) f7qk = simulation.calculate('f7qk', period) f7qu = simulation.calculate('f7qu', period) f7kg = simulation.calculate('f7kg', period) f7kh = simulation.calculate('f7kh', period) f7ki = simulation.calculate('f7ki', period) f7qj = simulation.calculate('f7qj', period) f7qs = simulation.calculate('f7qs', period) f7qw = simulation.calculate('f7qw', period) f7qx = simulation.calculate('f7qx', period) return period, f7qn + f7qk + f7qu + f7kg + f7kh + f7ki + f7qj + f7qs + f7qw + f7qx @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): ''' Investissements outre-mer dans le logement social (déclaration n°2042 IOM) 2013 TODO plafonnement à 15% f7qa / liens avec autres investissments ? ''' period = period.start.offset('first-of', 'year').period('year') fhra = simulation.calculate('fhra', period) fhrb = simulation.calculate('fhrb', period) fhrc = simulation.calculate('fhrc', period) fhrd = simulation.calculate('fhrd', period) f7qn = simulation.calculate('f7qn', period) f7qk = simulation.calculate('f7qk', period) f7qu = simulation.calculate('f7qu', period) f7kg = simulation.calculate('f7kg', period) f7kh = simulation.calculate('f7kh', period) f7ki = simulation.calculate('f7ki', period) f7qj = simulation.calculate('f7qj', period) f7qs = simulation.calculate('f7qs', period) f7qw = simulation.calculate('f7qw', period) f7qx = simulation.calculate('f7qx', period) return period, fhra + fhrb + fhrc + fhrd + f7qn + f7qk + f7qu + f7kg + f7kh + f7ki + f7qj + f7qs + f7qw + f7qx @reference_formula class donapd(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"donapd" @dated_function(start = date(2002, 1, 1), stop = date(2010, 12, 31)) def function_20020101_20101231(self, simulation, period): ''' Dons effectués à des organises d'aide aux personnes en difficulté (2002-2010) ''' period = period.start.offset('first-of', 'year').period('year') f7ud = simulation.calculate('f7ud', period) P = simulation.legislation_at(period.start).ir.reductions_impots.donapd return period, P.taux * min_(f7ud, P.max) @dated_function(start = date(2011, 1, 1), stop = date(2013, 12, 31)) def function_20110101_20131231(self, simulation, period): ''' Dons effectués à des organises d'aide aux personnes en difficulté (2011-2013) ''' period = period.start.offset('first-of', 'year').period('year') f7ud = simulation.calculate('f7ud', period) f7va = simulation.calculate('f7va', period) P = simulation.legislation_at(period.start).ir.reductions_impots.donapd return period, P.taux * min_(f7ud + f7va, P.max) @reference_formula class duflot(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"duflot" start_date = date(2013, 1, 1) def function(self, simulation, period): ''' Investissements locatifs interméiaires (loi Duflot) 2013- ''' period = period.start.offset('first-of', 'year').period('year') f7gh = simulation.calculate('f7gh', period) f7gi = simulation.calculate('f7gi', period) P = simulation.legislation_at(period.start).ir.reductions_impots.duflot return period, min_(P.plafond, P.taux_m * f7gh + P.taux_om * f7gi) / 9 #TODO: / 5 dans trois TOM @reference_formula class ecodev(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"ecodev" start_date = date(2009, 1, 1) stop_date = date(2009, 12, 31) def function(self, simulation, period): ''' Sommes versées sur un compte épargne codéveloppement (case 7UH) 2009 ''' period = period.start.offset('first-of', 'year').period('year') f7uh = simulation.calculate('f7uh', period) rbg_int = simulation.calculate('rbg_int', period) P = simulation.legislation_at(period.start).ir.reductions_impots.ecodev return period, min_(f7uh * P.taux, min_(P.base * rbg_int, P.max)) # page3 ligne 18 @reference_formula class ecpess(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"ecpess" def function(self, simulation, period): ''' Réduction d'impôt au titre des enfants à charge poursuivant leurs études secondaires ou supérieures ''' period = period.start.offset('first-of', 'year').period('year') f7ea = simulation.calculate('f7ea', period) f7eb = simulation.calculate('f7eb', period) f7ec = simulation.calculate('f7ec', period) f7ed = simulation.calculate('f7ed', period) f7ef = simulation.calculate('f7ef', period) f7eg = simulation.calculate('f7eg', period) P = simulation.legislation_at(period.start).ir.reductions_impots.ecpess return period, (P.col * (f7ea + f7eb / 2) + P.lyc * (f7ec + f7ed / 2) + P.sup * (f7ef + f7eg / 2)) @reference_formula class garext(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"garext" @dated_function(start = date(2002, 1, 1), stop = date(2002, 12, 31)) def function_20020101_20021231(self, simulation, period): ''' Frais de garde des enfants à l’extérieur du domicile (cases GA, GB, GC de la 2042) et GE, GF, GG 2002 ''' period = period.start.offset('first-of', 'year').period('year') f7ga = simulation.calculate('f7ga', period) f7gb = simulation.calculate('f7gb', period) f7gc = simulation.calculate('f7gc', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.garext max1 = P.max return period, P.taux * (min_(f7ga, max1) + min_(f7gb, max1) + min_(f7gc, max1)) @dated_function(start = date(2003, 1, 1), stop = date(2005, 12, 31)) def function_20030101_20051231(self, simulation, period): ''' Frais de garde des enfants à l’extérieur du domicile (cases GA, GB, GC de la 2042) et GE, GF, GG 2003-2005 ''' period = period.start.offset('first-of', 'year').period('year') f7ga = simulation.calculate('f7ga', period) f7gb = simulation.calculate('f7gb', period) f7gc = simulation.calculate('f7gc', period) f7ge = simulation.calculate('f7ge', period) f7gf = simulation.calculate('f7gf', period) f7gg = simulation.calculate('f7gg', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.garext max1 = P.max max2 = P.max / 2 return period, P.taux * (min_(f7ga, max1) + min_(f7gb, max1) + min_(f7gc, max1) + min_(f7ge, max2) + min_(f7gf, max2) + min_(f7gg, max2)) @reference_formula class intagr(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"intagr" start_date = date(2005, 1, 1) def function(self, simulation, period): ''' Intérêts pour paiement différé accordé aux agriculteurs 2005- ''' period = period.start.offset('first-of', 'year').period('year') f7um = simulation.calculate('f7um', period) marpac = simulation.calculate('marpac', period) P = simulation.legislation_at(period.start).ir.reductions_impots.intagr max1 = P.max * (1 + marpac) return period, P.taux * min_(f7um, max1) @reference_formula class intcon(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"intcon" start_date = date(2004, 1, 1) stop_date = date(2005, 12, 31) def function(self, simulation, period): ''' Intérêts des prêts à la consommation (case UH) 2004-2005 ''' period = period.start.offset('first-of', 'year').period('year') f7uh = simulation.calculate('f7uh', period) P = simulation.legislation_at(period.start).ir.reductions_impots.intcon max1 = P.max return period, P.taux * min_(f7uh, max1) @reference_formula class intemp(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"intemp" start_date = date(2002, 1, 1) stop_date = date(2003, 12, 31) def function(self, simulation, period): ''' Intérêts d'emprunts 2002-2003 ''' period = period.start.offset('first-of', 'year').period('year') nb_pac = simulation.calculate('nb_pac', period) f7wg = simulation.calculate('f7wg', period) P = simulation.legislation_at(period.start).ir.reductions_impots.intemp max1 = P.max + P.pac * nb_pac return period, P.taux * min_(f7wg, max1) @reference_formula class invfor(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"invfor" @dated_function(start = date(2002, 1, 1), stop = date(2005, 12, 31)) def function_20020101_20051231(self, simulation, period): ''' Investissements forestiers pour 2002-2005 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7un = simulation.calculate('f7un', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.invfor seuil = P.seuil * (marpac + 1) return period, P.taux * min_(f7un, seuil) @dated_function(start = date(2006, 1, 1), stop = date(2008, 12, 31)) def function_20060101_20081231(self, simulation, period): ''' Investissements forestiers pour 2006-2008 ''' period = period.start.offset('first-of', 'year').period('year') f7un = simulation.calculate('f7un', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.invfor return period, P.taux * f7un @dated_function(start = date(2009, 1, 1), stop = date(2009, 12, 31)) def function_20090101_20091231(self, simulation, period): ''' Investissements forestiers pour 2009 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7un = simulation.calculate('f7un', period) f7up = simulation.calculate('f7up', period) f7uq = simulation.calculate('f7uq', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.invfor return period, P.taux * (min_(f7un, P.seuil * (marpac + 1)) + min_(f7up, P.ifortra_seuil * (marpac + 1)) + min_(f7uq, P.iforges_seuil * (marpac + 1))) @dated_function(start = date(2010, 1, 1), stop = date(2010, 12, 31)) def function_20100101_20101231(self, simulation, period): ''' Investissements forestiers pour 2010 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7te = simulation.calculate('f7te', period) f7un = simulation.calculate('f7un', period) f7up = simulation.calculate('f7up', period) f7uq = simulation.calculate('f7uq', period) f7uu = simulation.calculate('f7uu', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.invfor return period, (P.taux * ( min_(f7un, P.seuil * (marpac + 1)) + min_(f7up + f7uu + f7te, P.ifortra_seuil * (marpac + 1)) + min_(f7uq, P.iforges_seuil * (marpac + 1)))) @dated_function(start = date(2011, 1, 1), stop = date(2011, 12, 31)) def function_20110101_20111231(self, simulation, period): ''' Investissements forestiers pour 2011 cf. 2041 GK ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7te = simulation.calculate('f7te', period) f7tf = simulation.calculate('f7tf', period) f7ul = simulation.calculate('f7ul', period) f7un = simulation.calculate('f7un', period) f7up = simulation.calculate('f7up', period) f7uq = simulation.calculate('f7uq', period) f7uu = simulation.calculate('f7uu', period) f7uv = simulation.calculate('f7uv', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.invfor max0 = max_(0, P.ifortra_seuil * (marpac + 1) - f7ul) max1 = max_(0, max0 - f7uu + f7te + f7uv + f7tf) return period, (P.taux * ( min_(f7un, P.seuil * (marpac + 1)) + min_(f7up, max1) + min_(f7uq, P.iforges_seuil * (marpac + 1))) + P.report10 * min_(f7uu + f7te + f7uv + f7tf, max0) + P.taux_ass * min_(f7ul, P.ifortra_seuil * (marpac + 1))) @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): ''' Investissements forestiers pour 2012 cf. 2041 GK ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7te = simulation.calculate('f7te', period) f7tf = simulation.calculate('f7tf', period) f7tg = simulation.calculate('f7tg', period) f7ul = simulation.calculate('f7ul', period) f7un = simulation.calculate('f7un', period) f7up = simulation.calculate('f7up', period) f7uq = simulation.calculate('f7uq', period) f7uu = simulation.calculate('f7uu', period) f7uv = simulation.calculate('f7uv', period) f7uw = simulation.calculate('f7uw', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.invfor max0 = max_(0, P.ifortra_seuil * (marpac + 1) - f7ul) max1 = max_(0, max0 - f7uu + f7te + f7uv + f7tf) max2 = max_(0, max1 - f7tg - f7uw) return period, (P.taux * ( min_(f7un, P.seuil * (marpac + 1)) + min_(f7up, max2) + min_(f7uq, P.iforges_seuil * (marpac + 1))) + P.report10 * min_(f7uu + f7te + f7uv + f7tf, max0) + P.report11 * min_(f7tg + f7uw, max1) + P.taux_ass * min_(f7ul, P.ifortra_seuil * (marpac + 1))) @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): ''' Investissements forestiers pour 2013 cf. 2041 GK ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7te = simulation.calculate('f7te', period) f7tf = simulation.calculate('f7tf', period) f7tg = simulation.calculate('f7tg', period) f7th = simulation.calculate('f7th', period) f7ul = simulation.calculate('f7ul', period) f7un = simulation.calculate('f7un', period) f7up = simulation.calculate('f7up', period) f7uq = simulation.calculate('f7uq', period) f7uu = simulation.calculate('f7uu', period) f7uv = simulation.calculate('f7uv', period) f7uw = simulation.calculate('f7uw', period) f7ux = simulation.calculate('f7ux', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.invfor max0 = max_(0, P.ifortra_seuil * (marpac + 1) - f7ul) max1 = max_(0, max0 - f7uu + f7te + f7uv + f7tf) max2 = max_(0, max1 - f7tg - f7uw) max3 = max_(0, max2 - f7th - f7ux) return period, (P.taux * ( min_(f7un, P.seuil * (marpac + 1)) + min_(f7up, max3) + min_(f7uq, P.iforges_seuil * (marpac + 1))) + P.report10 * min_(f7uu + f7te + f7uv + f7tf, max0) + P.report11 * min_(f7tg + f7uw, max1) + P.report12 * min_(f7th + f7ux, max2) + P.taux_ass * min_(f7ul, P.ifortra_seuil * (marpac + 1))) @reference_formula class invlst(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"invlst" @dated_function(start = date(2004, 1, 1), stop = date(2004, 12, 31)) def function_20040101_20041231(self, simulation, period): ''' Investissements locatifs dans le secteur touristique 2004 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7xc = simulation.calculate('f7xc', period) f7xd = simulation.calculate('f7xd', period) f7xe = simulation.calculate('f7xe', period) f7xf = simulation.calculate('f7xf', period) f7xg = simulation.calculate('f7xg', period) f7xh = simulation.calculate('f7xh', period) f7xi = simulation.calculate('f7xi', period) f7xj = simulation.calculate('f7xj', period) f7xk = simulation.calculate('f7xk', period) f7xl = simulation.calculate('f7xl', period) f7xm = simulation.calculate('f7xm', period) f7xn = simulation.calculate('f7xn', period) f7xo = simulation.calculate('f7xo', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.invlst seuil1 = P.seuil1 * (1 + marpac) seuil2 = P.seuil2 * (1 + marpac) seuil3 = P.seuil3 * (1 + marpac) xc = P.taux_xc * min_(f7xc, seuil1 / 4) xd = P.taux_xd * f7xd xe = P.taux_xe * min_(f7xe, seuil1 / 6) xf = P.taux_xf * f7xf xg = P.taux_xg * min_(f7xg, seuil2) xh = P.taux_xh * min_(f7xh, seuil3) xi = P.taux_xi * min_(f7xi, seuil1 / 4) xj = P.taux_xj * f7xj xk = P.taux_xk * f7xk xl = P.taux_xl * min_(f7xl, seuil1 / 6) xm = P.taux_xm * f7xm xn = P.taux_xn * min_(f7xn, seuil1 / 6) xo = P.taux_xo * f7xo return period, around(xc + xd + xe + xf + xg + xh + xi + xj + xk + xl + xm + xn + xo) @dated_function(start = date(2005, 1, 1), stop = date(2010, 12, 31)) def function_20050101_20101231(self, simulation, period): ''' Investissements locatifs dans le secteur touristique 2005-2010 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7xc = simulation.calculate('f7xc', period) f7xd = simulation.calculate('f7xd', period) f7xe = simulation.calculate('f7xe', period) f7xf = simulation.calculate('f7xf', period) f7xg = simulation.calculate('f7xg', period) f7xh = simulation.calculate('f7xh', period) f7xi = simulation.calculate('f7xi', period) f7xj = simulation.calculate('f7xj', period) f7xk = simulation.calculate('f7xk', period) f7xl = simulation.calculate('f7xl', period) f7xm = simulation.calculate('f7xm', period) f7xn = simulation.calculate('f7xn', period) f7xo = simulation.calculate('f7xo', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.invlst seuil1 = P.seuil1 * (1 + marpac) seuil2 = P.seuil2 * (1 + marpac) seuil3 = P.seuil3 * (1 + marpac) xc = P.taux_xc * min_(f7xc, seuil1 / 6) xd = P.taux_xd * f7xd xe = P.taux_xe * min_(f7xe, seuil1 / 6) xf = P.taux_xf * f7xf xg = P.taux_xg * min_(f7xg, seuil2) xh = P.taux_xh * min_(f7xh, seuil2 - f7xg) xi = P.taux_xi * f7xi xj = P.taux_xj * f7xj xk = P.taux_xk * f7xk xl = P.taux_xl * min_(f7xl, seuil1 / 6) xm = P.taux_xm * f7xm xn = P.taux_xn * min_(f7xn, seuil1 / 6) xo = P.taux_xo * f7xo return period, around(xc + xd + xe + xf + xg + xh + xi + xj + xk + xl + xm + xn + xo) @dated_function(start = date(2011, 1, 1), stop = date(2011, 12, 31)) def function_20110101_20111231(self, simulation, period): ''' Investissements locatifs dans le secteur touristique 2011 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7xa = simulation.calculate('f7xa', period) f7xb = simulation.calculate('f7xb', period) f7xc = simulation.calculate('f7xc', period) f7xd = simulation.calculate('f7xd', period) f7xe = simulation.calculate('f7xe', period) f7xf = simulation.calculate('f7xf', period) f7xg = simulation.calculate('f7xg', period) f7xh = simulation.calculate('f7xh', period) f7xi = simulation.calculate('f7xi', period) f7xj = simulation.calculate('f7xj', period) f7xk = simulation.calculate('f7xk', period) f7xl = simulation.calculate('f7xl', period) f7xm = simulation.calculate('f7xm', period) f7xn = simulation.calculate('f7xn', period) f7xo = simulation.calculate('f7xo', period) f7xp = simulation.calculate('f7xp', period) f7xq = simulation.calculate('f7xq', period) f7xr = simulation.calculate('f7xr', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.invlst seuil1 = P.seuil1 * (1 + marpac) seuil2 = P.seuil2 * (1 + marpac) seuil3 = P.seuil3 * (1 + marpac) xc = P.taux_xc * min_(f7xc, seuil1 / 6) xa = P.taux_xa * min_(f7xa, seuil2) xg = P.taux_xg * min_(f7xg, seuil2 - f7xa) xb = P.taux_xb * min_(f7xb, seuil2 - f7xa - f7xg) xh = P.taux_xh * min_(f7xh, seuil2 - f7xa - f7xg - f7xb) xi = P.taux_xi * (f7xf + f7xi + f7xp) xj = P.taux_xj * (f7xm + f7xj + f7xq) xl = P.taux_xl * min_(f7xl, seuil1 / 6) xo = P.taux_xo * (f7xk + f7xo + f7xr) return period, around(xc + xa + xg + xb + xh + xi + xj + xl + xo) @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): ''' Investissements locatifs dans le secteur touristique 2012 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7xa = simulation.calculate('f7xa', period) f7xb = simulation.calculate('f7xb', period) f7xc = simulation.calculate('f7xc', period) f7xd = simulation.calculate('f7xd', period) f7xe = simulation.calculate('f7xe', period) f7xf = simulation.calculate('f7xf', period) f7xg = simulation.calculate('f7xg', period) f7xh = simulation.calculate('f7xh', period) f7xi = simulation.calculate('f7xi', period) f7xj = simulation.calculate('f7xj', period) f7xk = simulation.calculate('f7xk', period) f7xl = simulation.calculate('f7xl', period) f7xm = simulation.calculate('f7xm', period) f7xn = simulation.calculate('f7xn', period) f7xo = simulation.calculate('f7xo', period) f7xp = simulation.calculate('f7xp', period) f7xq = simulation.calculate('f7xq', period) f7xr = simulation.calculate('f7xr', period) f7xv = simulation.calculate('f7xv', period) f7xx = simulation.calculate('f7xx', period) f7xz = simulation.calculate('f7xz', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.invlst seuil1 = P.seuil1 * (1 + marpac) seuil2 = P.seuil2 * (1 + marpac) seuil3 = P.seuil3 * (1 + marpac) xc = P.taux_xc * min_(f7xc, seuil1 / 6) xa = P.taux_xa * min_(f7xa, seuil2) xg = P.taux_xg * min_(f7xg, seuil2 - f7xa) xx = P.taux_xx * min_(f7xx, seuil2 - f7xa - f7xg) xb = P.taux_xb * min_(f7xb, seuil2 - f7xa - f7xg - f7xx) xh = P.taux_xh * min_(f7xh, seuil2 - f7xa - f7xg - f7xb - f7xx) xz = P.taux_xz * min_(f7xz, seuil2 - f7xa - f7xg - f7xb - f7xx - f7xh) xi = P.taux_xi * (f7xf + f7xi + f7xp + f7xn) xj = P.taux_xj * (f7xm + f7xj + f7xq + f7xv) xl = P.taux_xl * min_(f7xl, seuil1 / 6) xo = P.taux_xo * (f7xk + f7xo + f7xr) return period, around(xc + xa + xg + xx + xb + xz + xh + xi + xj + xl + xo) @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): ''' Investissements locatifs dans le secteur touristique 2013 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7uy = simulation.calculate('f7uy', period) f7uz = simulation.calculate('f7uz', period) f7xf = simulation.calculate('f7xf', period) f7xi = simulation.calculate('f7xi', period) f7xj = simulation.calculate('f7xj', period) f7xk = simulation.calculate('f7xk', period) f7xm = simulation.calculate('f7xm', period) f7xn = simulation.calculate('f7xn', period) f7xo = simulation.calculate('f7xo', period) f7xp = simulation.calculate('f7xp', period) f7xq = simulation.calculate('f7xq', period) f7xr = simulation.calculate('f7xr', period) f7xv = simulation.calculate('f7xv', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.invlst xi = P.taux_xi * (f7xf + f7xi + f7xp + f7xn + f7uy) xj = P.taux_xj * (f7xm + f7xj + f7xq + f7xv + f7uz) xo = P.taux_xo * (f7xk + f7xo + f7xr) return period, around(xi + xj + xo) @reference_formula class invrev(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"invrev" start_date = date(2002, 1, 1) stop_date = date(2003, 12, 31) def function(self, simulation, period): ''' Investissements locatifs dans les résidences de tourisme situées dans une zone de revitalisation rurale (cases GS, GT, XG, GU et GV) 2002-2003 TODO 1/4 codé en dur ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7gs = simulation.calculate('f7gs', period) f7gt = simulation.calculate('f7gt', period) f7xg = simulation.calculate('f7xg', period) f7gu = simulation.calculate('f7gu', period) f7gv = simulation.calculate('f7gv', period) P = simulation.legislation_at(period.start).ir.reductions_impots.invrev return period, (P.taux_gs * min_(f7gs, P.seuil_gs * (1 + marpac)) / 4 + P.taux_gu * min_(f7gu, P.seuil_gu * (1 + marpac)) / 4 + P.taux_xg * min_(f7xg, P.seuil_xg * (1 + marpac)) / 4 + P.taux_gt * f7gt + P.taux_gt * f7gv) @reference_formula class locmeu(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"locmeu" @dated_function(start = date(2009, 1, 1), stop = date(2009, 12, 31)) def function_20090101_20091231(self, simulation, period): ''' Investissement en vue de la location meublée non professionnelle dans certains établissements ou résidences 2009 ''' period = period.start.offset('first-of', 'year').period('year') f7ij = simulation.calculate('f7ij', period) P = simulation.legislation_at(period.start).ir.reductions_impots.locmeu return period, P.taux * min_(P.max, f7ij) / 9 @dated_function(start = date(2010, 1, 1), stop = date(2010, 12, 31)) def function_20100101_20101231(self, simulation, period): ''' Investissement en vue de la location meublée non professionnelle dans certains établissements ou résidences 2010 ''' period = period.start.offset('first-of', 'year').period('year') f7ij = simulation.calculate('f7ij', period) f7ik = simulation.calculate('f7ik', period) f7il = simulation.calculate('f7il', period) f7im = simulation.calculate('f7im', period) f7is = simulation.calculate('f7is', period) P = simulation.legislation_at(period.start).ir.reductions_impots.locmeu return period, ((min_(P.max, max_(f7ij, f7il)) + min_(P.max, f7im)) / 9 + f7ik) * P.taux + f7is @dated_function(start = date(2011, 1, 1), stop = date(2011, 12, 31)) def function_20110101_20111231(self, simulation, period): ''' Investissement en vue de la location meublée non professionnelle dans certains établissements ou résidences 2011 ''' period = period.start.offset('first-of', 'year').period('year') f7ij = simulation.calculate('f7ij', period) f7ik = simulation.calculate('f7ik', period) f7il = simulation.calculate('f7il', period) f7im = simulation.calculate('f7im', period) f7in = simulation.calculate('f7in', period) f7io = simulation.calculate('f7io', period) f7ip = simulation.calculate('f7ip', period) f7iq = simulation.calculate('f7iq', period) f7ir = simulation.calculate('f7ir', period) f7is = simulation.calculate('f7is', period) f7it = simulation.calculate('f7it', period) f7iu = simulation.calculate('f7iu', period) f7iv = simulation.calculate('f7iv', period) f7iw = simulation.calculate('f7iw', period) P = simulation.legislation_at(period.start).ir.reductions_impots.locmeu m20 = (maxi(f7ij, f7il, f7in, f7iv) == max_(f7il, f7in)) return period, ((min_(P.max, maxi(f7ij, f7il, f7in, f7iv)) * (P.taux20 * m20 + P.taux18 * not_(m20)) + P.taux * (min_(P.max, max_(f7im, f7iw)) + min_(P.max, f7io))) / 9 + P.taux * max_(f7ik, f7ip + f7ir + f7iq) + f7is + f7iu + f7it) @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): ''' Investissement en vue de la location meublée non professionnelle dans certains établissements ou résidences 2012 ''' period = period.start.offset('first-of', 'year').period('year') f7ia = simulation.calculate('f7ia', period) f7ib = simulation.calculate('f7ib', period) f7ic = simulation.calculate('f7ic', period) f7id = simulation.calculate('f7id', period) f7ie = simulation.calculate('f7ie', period) f7if = simulation.calculate('f7if', period) f7ig = simulation.calculate('f7ig', period) f7ih = simulation.calculate('f7ih', period) f7ij = simulation.calculate('f7ij', period) f7ik = simulation.calculate('f7ik', period) f7il = simulation.calculate('f7il', period) f7im = simulation.calculate('f7im', period) f7in = simulation.calculate('f7in', period) f7io = simulation.calculate('f7io', period) f7ip = simulation.calculate('f7ip', period) f7iq = simulation.calculate('f7iq', period) f7ir = simulation.calculate('f7ir', period) f7is = simulation.calculate('f7is', period) f7it = simulation.calculate('f7it', period) f7iu = simulation.calculate('f7iu', period) f7iv = simulation.calculate('f7iv', period) f7iw = simulation.calculate('f7iw', period) f7ix = simulation.calculate('f7ix', period) f7iz = simulation.calculate('f7iz', period) P = simulation.legislation_at(period.start).ir.reductions_impots.locmeu m18 = (maxi(f7id, f7ie, f7if, f7ig) == max_(f7ie, f7if)) m20 = (maxi(f7ij, f7il, f7in, f7iv) == max_(f7il, f7in)) return period, ((min_(P.max, maxi(f7ij, f7il, f7in, f7iv)) * (P.taux20 * m20 + P.taux18 * not_(m20)) + min_(P.max, maxi(f7id, f7ie, f7if, f7ig)) * (P.taux18 * m18 + P.taux11 * not_(m18)) + P.taux * (min_(P.max, max_(f7im, f7iw)) + min_(P.max, f7io))) / 9 + P.taux * max_(f7ik + f7ip, f7ir + f7iq) + f7ia + f7ib + f7ic + f7ih + f7is + f7iu + f7it + f7ix + f7iz) @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): ''' Investissement en vue de la location meublée non professionnelle dans certains établissements ou résidences 2013 ''' period = period.start.offset('first-of', 'year').period('year') f7ia = simulation.calculate('f7ia', period) f7ib = simulation.calculate('f7ib', period) f7ic = simulation.calculate('f7ic', period) f7id = simulation.calculate('f7id', period) f7ie = simulation.calculate('f7ie', period) f7if = simulation.calculate('f7if', period) f7ig = simulation.calculate('f7ig', period) f7ih = simulation.calculate('f7ih', period) f7ij = simulation.calculate('f7ij', period) f7ik = simulation.calculate('f7ik', period) f7il = simulation.calculate('f7il', period) f7im = simulation.calculate('f7im', period) f7in = simulation.calculate('f7in', period) f7io = simulation.calculate('f7io', period) f7ip = simulation.calculate('f7ip', period) f7iq = simulation.calculate('f7iq', period) f7ir = simulation.calculate('f7ir', period) f7is = simulation.calculate('f7is', period) f7it = simulation.calculate('f7it', period) f7iu = simulation.calculate('f7iu', period) f7iv = simulation.calculate('f7iv', period) f7iw = simulation.calculate('f7iw', period) f7ix = simulation.calculate('f7ix', period) f7iy = simulation.calculate('f7iy', period) f7iz = simulation.calculate('f7iz', period) f7jc = simulation.calculate('f7jc', period) f7ji = simulation.calculate('f7ji', period) f7js = simulation.calculate('f7js', period) f7jt = simulation.calculate('f7jt', period) f7ju = simulation.calculate('f7ju', period) f7jv = simulation.calculate('f7jv', period) f7jw = simulation.calculate('f7jw', period) f7jx = simulation.calculate('f7jx', period) f7jy = simulation.calculate('f7jy', period) P = simulation.legislation_at(period.start).ir.reductions_impots.locmeu m18 = (maxi(f7id, f7ie, f7if, f7ig) == max_(f7ie, f7if)) m20 = (maxi(f7ij, f7il, f7in, f7iv) == max_(f7il, f7in)) return period, ((min_(P.max, maxi(f7ij, f7il, f7in, f7iv)) * (P.taux20 * m20 + P.taux18 * not_(m20)) + min_(P.max, maxi(f7id, f7ie, f7if, f7ig)) * (P.taux18 * m18 + P.taux11 * not_(m18)) + P.taux11 * min_(P.max, f7jt + f7ju) + P.taux * (min_(P.max, max_(f7im, f7iw)) + min_(P.max, f7io))) / 9 + P.taux * max_(f7ik + f7ip, f7ir + f7iq) + f7ia + f7ib + f7ic + f7ih + f7is + f7iu + f7it + f7ix + f7iy + f7iz + f7jv + f7jw + f7jx + f7jy + f7jc + f7ji + f7js) @reference_formula class mohist(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"mohist" start_date = date(2008, 1, 1) def function(self, simulation, period): ''' Travaux de conservation et de restauration d’objets classés monuments historiques (case NZ) 2008- ''' period = period.start.offset('first-of', 'year').period('year') f7nz = simulation.calculate('f7nz', period) P = simulation.legislation_at(period.start).ir.reductions_impots.mohist return period, P.taux * min_(f7nz, P.max) @reference_formula class patnat(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"patnat" @dated_function(start = date(2010, 1, 1), stop = date(2010, 12, 31)) def function_20100101_20101231(self, simulation, period): ''' Dépenses de protections du patrimoine naturel (case 7KA) 2010 ''' period = period.start.offset('first-of', 'year').period('year') f7ka = simulation.calculate('f7ka', period) P = simulation.legislation_at(period.start).ir.reductions_impots.patnat max1 = P.max return period, P.taux * min_(f7ka, max1) @dated_function(start = date(2011, 1, 1), stop = date(2011, 12, 31)) def function_20110101_20111231(self, simulation, period): ''' Dépenses de protections du patrimoine naturel (case 7KA, 7KB) 2011 ''' period = period.start.offset('first-of', 'year').period('year') f7ka = simulation.calculate('f7ka', period) f7kb = simulation.calculate('f7kb', period) P = simulation.legislation_at(period.start).ir.reductions_impots.patnat max1 = P.max return period, P.taux * min_(f7ka, max1) + f7kb @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): ''' Dépenses de protections du patrimoine naturel (case 7KA, 7KB, 7KC) 2012 ''' period = period.start.offset('first-of', 'year').period('year') f7ka = simulation.calculate('f7ka', period) f7kb = simulation.calculate('f7kb', period) f7kc = simulation.calculate('f7kc', period) P = simulation.legislation_at(period.start).ir.reductions_impots.patnat max1 = P.max return period, P.taux * min_(f7ka, max1) + f7kb + f7kc @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): ''' Dépenses de protections du patrimoine naturel (case 7KA, 7KB, 7KC) 2013 ''' period = period.start.offset('first-of', 'year').period('year') f7ka = simulation.calculate('f7ka', period) f7kb = simulation.calculate('f7kb', period) f7kc = simulation.calculate('f7kc', period) f7kd = simulation.calculate('f7kd', period) P = simulation.legislation_at(period.start).ir.reductions_impots.patnat max1 = P.max return period, P.taux * min_(f7ka, max1) + f7kb + f7kc + f7kd @reference_formula class prcomp(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"prcomp" def function(self, simulation, period): ''' Prestations compensatoires 2002- ''' period = period.start.offset('first-of', 'year').period('year') f7wm = simulation.calculate('f7wm', period) f7wn = simulation.calculate('f7wn', period) f7wo = simulation.calculate('f7wo', period) f7wp = simulation.calculate('f7wp', period) P = simulation.legislation_at(period.start).ir.reductions_impots.prcomp div = (f7wo == 0) * 1 + f7wo # Pour éviter les divisions par zéro return period, ((f7wm == 0) * ((f7wn == f7wo) * P.taux * min_(f7wn, P.seuil) + (f7wn < f7wo) * (f7wo <= P.seuil) * P.taux * f7wn + max_(0, (f7wn < f7wo) * (f7wo > P.seuil) * P.taux * P.seuil * f7wn / div)) + (f7wm != 0) * ((f7wn == f7wm) * (f7wo <= P.seuil) * P.taux * f7wm + max_(0, (f7wn == f7wm) * (f7wo >= P.seuil) * P.taux * f7wm / div) + (f7wn > f7wm) * (f7wo <= P.seuil) * P.taux * f7wn + max_(0, (f7wn > f7wm) * (f7wo >= P.seuil) * P.taux * f7wn / div)) + P.taux * f7wp) @reference_formula class repsoc(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"repsoc" start_date = date(2003, 1, 1) def function(self, simulation, period): ''' Intérèts d'emprunts pour reprises de société 2003- ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7fh = simulation.calculate('f7fh', period) P = simulation.legislation_at(period.start).ir.reductions_impots.repsoc seuil = P.seuil * (marpac + 1) return period, P.taux * min_(f7fh, seuil) @reference_formula class resimm(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"resimm" @dated_function(start = date(2009, 1, 1), stop = date(2010, 12, 31)) def function_20090101_20101231(self, simulation, period): ''' Travaux de restauration immobilière (cases 7RA et 7RB) 2009-2010 ''' period = period.start.offset('first-of', 'year').period('year') f7ra = simulation.calculate('f7ra', period) f7rb = simulation.calculate('f7rb', period) P = simulation.legislation_at(period.start).ir.reductions_impots.resimm max1 = P.max max2 = max_(max1 - f7rb, 0) return period, P.taux_rb * min_(f7rb, max1) + P.taux_ra * min_(f7ra, max2) @dated_function(start = date(2011, 1, 1), stop = date(2011, 12, 31)) def function_20110101_20111231(self, simulation, period): ''' Travaux de restauration immobilière (cases 7RA, 7RB, 7RC, 7RD) 2011 ''' period = period.start.offset('first-of', 'year').period('year') f7ra = simulation.calculate('f7ra', period) f7rb = simulation.calculate('f7rb', period) f7rc = simulation.calculate('f7rc', period) f7rd = simulation.calculate('f7rd', period) P = simulation.legislation_at(period.start).ir.reductions_impots.resimm max1 = P.max max2 = max_(max1 - f7rd, 0) max3 = max_(max2 - f7rb, 0) max4 = max_(max3 - f7rc, 0) return period, (P.taux_rd * min_(f7rd, max1) + P.taux_rb * min_(f7rb, max2) + P.taux_rc * min_(f7rc, max3) + P.taux_ra * min_(f7ra, max4)) @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): ''' Travaux de restauration immobilière (cases 7RA, 7RB, 7RC, 7RD, 7RE, 7RF) 2012 ''' period = period.start.offset('first-of', 'year').period('year') f7ra = simulation.calculate('f7ra', period) f7rb = simulation.calculate('f7rb', period) f7rc = simulation.calculate('f7rc', period) f7rd = simulation.calculate('f7rd', period) f7re = simulation.calculate('f7re', period) f7rf = simulation.calculate('f7rf', period) P = simulation.legislation_at(period.start).ir.reductions_impots.resimm max1 = P.max max2 = max_(max1 - f7rd, 0) max3 = max_(max2 - f7rb, 0) max4 = max_(max3 - f7rc - f7rf, 0) max5 = max_(max4 - f7ra, 0) return period, (P.taux_rd * min_(f7rd, max1) + P.taux_rb * min_(f7rb, max2) + P.taux_rc * min_(f7rc + f7rf, max3) + P.taux_ra * min_(f7ra, max4) + P.taux_re * min_(f7re, max5)) @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): ''' Travaux de restauration immobilière (cases 7RA, 7RB, 7RC, 7RD, 7RE, 7RF, 7SX, 7SY) 2012 ''' period = period.start.offset('first-of', 'year').period('year') f7ra = simulation.calculate('f7ra', period) f7rb = simulation.calculate('f7rb', period) f7rc = simulation.calculate('f7rc', period) f7rd = simulation.calculate('f7rd', period) f7re = simulation.calculate('f7re', period) f7rf = simulation.calculate('f7rf', period) f7sx = simulation.calculate('f7sx', period) f7sy = simulation.calculate('f7sy', period) P = simulation.legislation_at(period.start).ir.reductions_impots.resimm max1 = P.max max2 = max_(max1 - f7rd, 0) max3 = max_(max2 - f7rb, 0) max4 = max_(max3 - f7rc - f7sy - f7rf, 0) max5 = max_(max4 - f7ra, 0) return period, (P.taux_rd * min_(f7rd, max1) + P.taux_rb * min_(f7rb, max2) + P.taux_rc * min_(f7sy + f7rf + f7rc, max3) + P.taux_ra * min_(f7ra, max4) + P.taux_re * min_(f7re + f7sx, max5)) @reference_formula class rsceha(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"rsceha" def function(self, simulation, period): ''' Rentes de survie et contrats d'épargne handicap 2002- ''' period = period.start.offset('first-of', 'year').period('year') nb_pac2 = simulation.calculate('nb_pac2', period) nbR = simulation.calculate('nbR', period) f7gz = simulation.calculate('f7gz', period) P = simulation.legislation_at(period.start).ir.reductions_impots.rsceha max1 = P.seuil1 + (nb_pac2 - nbR) * P.seuil2 return period, P.taux * min_(f7gz, max1) @reference_formula class saldom(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"saldom" @dated_function(start = date(2002, 1, 1), stop = date(2004, 12, 31)) def function_20020101_20041231(self, simulation, period): ''' Sommes versées pour l'emploi d'un salariés à domicile 2002-2004 ''' period = period.start.offset('first-of', 'year').period('year') f7df = simulation.calculate('f7df', period) f7dg = simulation.calculate('f7dg', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.saldom isinvalid = f7dg max1 = P.max1 * not_(isinvalid) + P.max3 * isinvalid return period, P.taux * min_(f7df, max1) @dated_function(start = date(2005, 1, 1), stop = date(2006, 12, 31)) def function_20050101_20061231(self, simulation, period): ''' Sommes versées pour l'emploi d'un salariés à domicile 2005-2006 ''' period = period.start.offset('first-of', 'year').period('year') nb_pac2 = simulation.calculate('nb_pac2', period) f7df = simulation.calculate('f7df', period) f7dl = simulation.calculate('f7dl', period) f7dg = simulation.calculate('f7dg', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.saldom isinvalid = f7dg nbpacmin = nb_pac2 + f7dl maxBase = P.max1 maxDuMaxNonInv = P.max2 maxNonInv = min_(maxBase + P.pac * nbpacmin, maxDuMaxNonInv) max1 = maxNonInv * not_(isinvalid) + P.max3 * isinvalid return period, P.taux * min_(f7df, max1) @dated_function(start = date(2007, 1, 1), stop = date(2008, 12, 31)) def function_20070101_20081231(self, simulation, period): ''' Sommes versées pour l'emploi d'un salariés à domicile 2007-2008 ''' period = period.start.offset('first-of', 'year').period('year') nb_pac2 = simulation.calculate('nb_pac2', period) f7db = simulation.calculate('f7db', period) f7df = simulation.calculate('f7df', period) f7dl = simulation.calculate('f7dl', period) f7dg = simulation.calculate('f7dg', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.saldom isinvalid = f7dg nbpacmin = nb_pac2 + f7dl maxBase = P.max1 maxDuMaxNonInv = P.max2 maxNonInv = min_(maxBase + P.pac * nbpacmin, maxDuMaxNonInv) maxEffectif = maxNonInv * not_(isinvalid) + P.max3 * isinvalid max1 = maxEffectif - min_(f7db, maxEffectif) return period, P.taux * min_(f7df, max1) @dated_function(start = date(2009, 1, 1), stop = date(2013, 12, 31)) def function_20090101_20131231(self, simulation, period): ''' Sommes versées pour l'emploi d'un salariés à domicile 2009-2013 ''' period = period.start.offset('first-of', 'year').period('year') nb_pac2 = simulation.calculate('nb_pac2', period) f7db = simulation.calculate('f7db', period) f7df = simulation.calculate('f7df', period) f7dl = simulation.calculate('f7dl', period) f7dq = simulation.calculate('f7dq', period) f7dg = simulation.calculate('f7dg', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.saldom isinvalid = f7dg annee1 = f7dq nbpacmin = nb_pac2 + f7dl maxBase = P.max1 * not_(annee1) + P.max1_1ereAnnee * annee1 maxDuMaxNonInv = P.max2 * not_(annee1) + P.max2_1ereAnnee * annee1 maxNonInv = min_(maxBase + P.pac * nbpacmin, maxDuMaxNonInv) maxEffectif = maxNonInv * not_(isinvalid) + P.max3 * isinvalid max1 = maxEffectif - min_(f7db, maxEffectif) return period, P.taux * min_(f7df, max1) @reference_formula class scelli(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"scelli" @dated_function(start = date(2009, 1, 1), stop = date(2009, 12, 31)) def function_20090101_20091231(self, simulation, period): ''' Investissements locatif neufs : Dispositif Scellier (cases 7HJ et 7HK) 2009 ''' period = period.start.offset('first-of', 'year').period('year') f7hj = simulation.calculate('f7hj', period) f7hk = simulation.calculate('f7hk', period) P = simulation.legislation_at(period.start).ir.reductions_impots.scelli return period, max_(P.taux1 * min_(P.max, f7hj), P.taux2 * min_(P.max, f7hk)) / 9 @dated_function(start = date(2010, 1, 1), stop = date(2010, 12, 31)) def function_20100101_20101231(self, simulation, period): ''' Investissements locatif neufs : Dispositif Scellier 2010 ''' period = period.start.offset('first-of', 'year').period('year') f7hj = simulation.calculate('f7hj', period) f7hk = simulation.calculate('f7hk', period) f7hn = simulation.calculate('f7hn', period) f7ho = simulation.calculate('f7ho', period) f7hl = simulation.calculate('f7hl', period) f7hm = simulation.calculate('f7hm', period) f7hr = simulation.calculate('f7hr', period) f7hs = simulation.calculate('f7hs', period) f7la = simulation.calculate('f7la', period) P = simulation.legislation_at(period.start).ir.reductions_impots.scelli return period, (max_( max_(P.taux1 * min_(P.max, f7hj), P.taux2 * min_(P.max, f7hk)), max_(P.taux1 * min_(P.max, f7hn), P.taux2 * min_(P.max, f7ho))) / 9 + max_( P.taux1 * min_(P.max, f7hl), P.taux2 * min_(P.max, f7hm)) / 9 + max_(P.taux1 * f7hr, P.taux2 * f7hs) + f7la) @dated_function(start = date(2011, 1, 1), stop = date(2011, 12, 31)) def function_20110101_20111231(self, simulation, period): ''' Investissements locatif neufs : Dispositif Scellier 2011 ''' period = period.start.offset('first-of', 'year').period('year') f7hj = simulation.calculate('f7hj', period) f7hk = simulation.calculate('f7hk', period) f7hl = simulation.calculate('f7hl', period) f7hm = simulation.calculate('f7hm', period) f7hn = simulation.calculate('f7hn', period) f7ho = simulation.calculate('f7ho', period) f7hr = simulation.calculate('f7hr', period) f7hs = simulation.calculate('f7hs', period) f7ht = simulation.calculate('f7ht', period) f7hu = simulation.calculate('f7hu', period) f7hv = simulation.calculate('f7hv', period) f7hw = simulation.calculate('f7hw', period) f7hx = simulation.calculate('f7hx', period) f7hz = simulation.calculate('f7hz', period) f7la = simulation.calculate('f7la', period) f7lb = simulation.calculate('f7lb', period) f7lc = simulation.calculate('f7lc', period) f7na = simulation.calculate('f7na', period) f7nb = simulation.calculate('f7nb', period) f7nc = simulation.calculate('f7nc', period) f7nd = simulation.calculate('f7nd', period) f7ne = simulation.calculate('f7ne', period) f7nf = simulation.calculate('f7nf', period) f7ng = simulation.calculate('f7ng', period) f7nh = simulation.calculate('f7nh', period) f7ni = simulation.calculate('f7ni', period) f7nj = simulation.calculate('f7nj', period) f7nk = simulation.calculate('f7nk', period) f7nl = simulation.calculate('f7nl', period) f7nm = simulation.calculate('f7nm', period) f7nn = simulation.calculate('f7nn', period) f7no = simulation.calculate('f7no', period) f7np = simulation.calculate('f7np', period) f7nq = simulation.calculate('f7nq', period) f7nr = simulation.calculate('f7nr', period) f7ns = simulation.calculate('f7ns', period) f7nt = simulation.calculate('f7nt', period) P = simulation.legislation_at(period.start).ir.reductions_impots.scelli return period, (min_(P.max, maxi( P.taux13 * max_(f7nf, f7nj) / 9, P.taux15 * max_(f7ng, f7ni) / 9, P.taux22 * max_(f7na, f7ne) / 9, P.taux1 * maxi(f7nb, f7nc, f7nd, f7nh) / 9, P.taux36 * maxi(f7nk / 9, f7no / 9, f7np / 5, f7nt / 5), P.taux2 * maxi(f7nl / 9, f7nm / 9, f7nn / 9, f7nq / 5, f7nr / 5, f7ns / 5))) + min_(P.max, maxi( P.taux1 * max_(f7hj, f7hn), P.taux2 * max_(f7hk, f7ho))) / 9 + min_(P.max, max_(P.taux1 * f7hl, P.taux2 * f7hm)) / 9 + min_(P.max, maxi(P.taux1 * f7hv, P.taux1 * f7hx, P.taux2 * f7hw, P.taux2 * f7hz)) + min_(P.max, max_(P.taux1 * f7ht, P.taux2 * f7hu)) + min_(P.max, max_(P.taux1 * f7hr, P.taux2 * f7hs)) + f7la + f7lb + f7lc ) @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): ''' Investissements locatif neufs : Dispositif Scellier 2012 ''' period = period.start.offset('first-of', 'year').period('year') f7ha = simulation.calculate('f7ha', period) f7hb = simulation.calculate('f7hb', period) f7hg = simulation.calculate('f7hg', period) f7hh = simulation.calculate('f7hh', period) f7hd = simulation.calculate('f7hd', period) f7he = simulation.calculate('f7he', period) f7hf = simulation.calculate('f7hf', period) f7hj = simulation.calculate('f7hj', period) f7hk = simulation.calculate('f7hk', period) f7hl = simulation.calculate('f7hl', period) f7hm = simulation.calculate('f7hm', period) f7hn = simulation.calculate('f7hn', period) f7ho = simulation.calculate('f7ho', period) f7hr = simulation.calculate('f7hr', period) f7hs = simulation.calculate('f7hs', period) f7ht = simulation.calculate('f7ht', period) f7hu = simulation.calculate('f7hu', period) f7hv = simulation.calculate('f7hv', period) f7hw = simulation.calculate('f7hw', period) f7hx = simulation.calculate('f7hx', period) f7hz = simulation.calculate('f7hz', period) f7ja = simulation.calculate('f7ja', period) f7jb = simulation.calculate('f7jb', period) f7jd = simulation.calculate('f7jd', period) f7je = simulation.calculate('f7je', period) f7jf = simulation.calculate('f7jf', period) f7jg = simulation.calculate('f7jg', period) f7jh = simulation.calculate('f7jh', period) f7jj = simulation.calculate('f7jj', period) f7jk = simulation.calculate('f7jk', period) f7jl = simulation.calculate('f7jl', period) f7jm = simulation.calculate('f7jm', period) f7jn = simulation.calculate('f7jn', period) f7jo = simulation.calculate('f7jo', period) f7jp = simulation.calculate('f7jp', period) f7jq = simulation.calculate('f7jq', period) f7jr = simulation.calculate('f7jr', period) f7la = simulation.calculate('f7la', period) f7lb = simulation.calculate('f7lb', period) f7lc = simulation.calculate('f7lc', period) f7ld = simulation.calculate('f7ld', period) f7le = simulation.calculate('f7le', period) f7lf = simulation.calculate('f7lf', period) f7na = simulation.calculate('f7na', period) f7nb = simulation.calculate('f7nb', period) f7nc = simulation.calculate('f7nc', period) f7nd = simulation.calculate('f7nd', period) f7ne = simulation.calculate('f7ne', period) f7nf = simulation.calculate('f7nf', period) f7ng = simulation.calculate('f7ng', period) f7nh = simulation.calculate('f7nh', period) f7ni = simulation.calculate('f7ni', period) f7nj = simulation.calculate('f7nj', period) f7nk = simulation.calculate('f7nk', period) f7nl = simulation.calculate('f7nl', period) f7nm = simulation.calculate('f7nm', period) f7nn = simulation.calculate('f7nn', period) f7no = simulation.calculate('f7no', period) f7np = simulation.calculate('f7np', period) f7nq = simulation.calculate('f7nq', period) f7nr = simulation.calculate('f7nr', period) f7ns = simulation.calculate('f7ns', period) f7nt = simulation.calculate('f7nt', period) P = simulation.legislation_at(period.start).ir.reductions_impots.scelli return period, (min_(P.max, maxi( P.taux13 * max_(f7nf, f7nj) / 9, P.taux15 * max_(f7ng, f7ni) / 9, P.taux22 * max_(f7na, f7ne) / 9, P.taux1 * maxi(f7nb, f7nc, f7nd, f7nh) / 9, P.taux36 * maxi(f7nk / 9, f7no / 9, f7np / 5, f7nt / 5), P.taux2 * maxi(f7nl / 9, f7nm / 9, f7nn / 9, f7nq / 5, f7nr / 5, f7ns / 5))) + min_(P.max, maxi( P.taux1 * max_(f7hj, f7hn), P.taux2 * max_(f7hk, f7ho))) / 9 + min_(P.max, max_(P.taux1 * f7hl, P.taux2 * f7hm)) / 9 + min_(P.max, maxi(P.taux1 * f7hv, P.taux1 * f7hx, P.taux2 * f7hw, P.taux2 * f7hz)) + min_(P.max, max_(P.taux1 * f7ht, P.taux2 * f7hu)) + min_(P.max, max_(P.taux1 * f7hr, P.taux2 * f7hs)) + f7la + f7lb + f7lc + f7ld + f7le + f7lf + f7ha + f7hb + f7hg + f7hh + f7hd + f7he + f7hf + min_(P.max, maxi( P.taux6 * max_(f7jf, f7jj) / 9, P.taux13 * maxi(f7ja, f7je, f7jg, f7jh) / 9, P.taux22 * maxi(f7jb, f7jd) / 9, P.taux24 * maxi(f7jk / 9, f7jn / 9, f7jo / 5, f7jr / 5), P.taux36 * maxi(f7jl / 9, f7jm / 9, f7jp / 5, f7jq / 5))) ) @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): ''' Investissements locatif neufs : Dispositif Scellier 2013 ''' period = period.start.offset('first-of', 'year').period('year') f7fa = simulation.calculate('f7fa', period) f7fb = simulation.calculate('f7fb', period) f7fc = simulation.calculate('f7fc', period) f7fd = simulation.calculate('f7fd', period) f7gj = simulation.calculate('f7gj', period) f7gk = simulation.calculate('f7gk', period) f7gl = simulation.calculate('f7gl', period) f7gp = simulation.calculate('f7gp', period) f7gs = simulation.calculate('f7gs', period) f7gt = simulation.calculate('f7gt', period) f7gu = simulation.calculate('f7gu', period) f7gv = simulation.calculate('f7gv', period) f7gw = simulation.calculate('f7gw', period) f7gx = simulation.calculate('f7gx', period) f7ha = simulation.calculate('f7ha', period) f7hb = simulation.calculate('f7hb', period) f7hg = simulation.calculate('f7hg', period) f7hh = simulation.calculate('f7hh', period) f7hd = simulation.calculate('f7hd', period) f7he = simulation.calculate('f7he', period) f7hf = simulation.calculate('f7hf', period) f7hj = simulation.calculate('f7hj', period) f7hk = simulation.calculate('f7hk', period) f7hl = simulation.calculate('f7hl', period) f7hm = simulation.calculate('f7hm', period) f7hn = simulation.calculate('f7hn', period) f7ho = simulation.calculate('f7ho', period) f7hr = simulation.calculate('f7hr', period) f7hs = simulation.calculate('f7hs', period) f7ht = simulation.calculate('f7ht', period) f7hu = simulation.calculate('f7hu', period) f7hv = simulation.calculate('f7hv', period) f7hw = simulation.calculate('f7hw', period) f7hx = simulation.calculate('f7hx', period) f7hz = simulation.calculate('f7hz', period) f7ja = simulation.calculate('f7ja', period) f7jb = simulation.calculate('f7jb', period) f7jd = simulation.calculate('f7jd', period) f7je = simulation.calculate('f7je', period) f7jf = simulation.calculate('f7jf', period) f7jg = simulation.calculate('f7jg', period) f7jh = simulation.calculate('f7jh', period) f7jj = simulation.calculate('f7jj', period) f7jk = simulation.calculate('f7jk', period) f7jl = simulation.calculate('f7jl', period) f7jm = simulation.calculate('f7jm', period) f7jn = simulation.calculate('f7jn', period) f7jo = simulation.calculate('f7jo', period) f7jp = simulation.calculate('f7jp', period) f7jq = simulation.calculate('f7jq', period) f7jr = simulation.calculate('f7jr', period) f7la = simulation.calculate('f7la', period) f7lb = simulation.calculate('f7lb', period) f7lc = simulation.calculate('f7lc', period) f7ld = simulation.calculate('f7ld', period) f7le = simulation.calculate('f7le', period) f7lf = simulation.calculate('f7lf', period) f7lm = simulation.calculate('f7lm', period) f7ls = simulation.calculate('f7ls', period) f7lz = simulation.calculate('f7lz', period) f7mg = simulation.calculate('f7mg', period) f7na = simulation.calculate('f7na', period) f7nb = simulation.calculate('f7nb', period) f7nc = simulation.calculate('f7nc', period) f7nd = simulation.calculate('f7nd', period) f7ne = simulation.calculate('f7ne', period) f7nf = simulation.calculate('f7nf', period) f7ng = simulation.calculate('f7ng', period) f7nh = simulation.calculate('f7nh', period) f7ni = simulation.calculate('f7ni', period) f7nj = simulation.calculate('f7nj', period) f7nk = simulation.calculate('f7nk', period) f7nl = simulation.calculate('f7nl', period) f7nm = simulation.calculate('f7nm', period) f7nn = simulation.calculate('f7nn', period) f7no = simulation.calculate('f7no', period) f7np = simulation.calculate('f7np', period) f7nq = simulation.calculate('f7nq', period) f7nr = simulation.calculate('f7nr', period) f7ns = simulation.calculate('f7ns', period) f7nt = simulation.calculate('f7nt', period) P = simulation.legislation_at(period.start).ir.reductions_impots.scelli return period, (min_(P.max, maxi( P.taux13 * max_(f7nf, f7nj) / 9, P.taux15 * max_(f7ng, f7ni) / 9, P.taux22 * max_(f7na, f7ne) / 9, P.taux1 * maxi(f7nb, f7nc, f7nd, f7nh) / 9, P.taux36 * maxi(f7nk / 9, f7no / 9, f7np / 5, f7nt / 5), P.taux2 * maxi(f7nl / 9, f7nm / 9, f7nn / 9, f7nq / 5, f7nr / 5, f7ns / 5))) + min_(P.max, maxi( P.taux1 * max_(f7hj, f7hn), P.taux2 * max_(f7hk, f7ho))) / 9 + min_(P.max, max_(P.taux1 * f7hl, P.taux2 * f7hm)) / 9 + min_(P.max, maxi(P.taux1 * f7hv, P.taux1 * f7hx, P.taux2 * f7hw, P.taux2 * f7hz)) + min_(P.max, max_(P.taux1 * f7ht, P.taux2 * f7hu)) + min_(P.max, max_(P.taux1 * f7hr, P.taux2 * f7hs)) + min_(P.max, maxi( P.taux6 * maxi(f7jf, f7jj, f7fb) / 9, P.taux13 * maxi(f7ja, f7je, f7jg, f7jh, f7fa) / 9, P.taux22 * maxi(f7jb, f7jd) / 9, P.taux24 * maxi(f7jk / 9, f7jn / 9, f7jo / 5, f7jr / 5, f7fc / 9, f7fd / 5), P.taux36 * maxi(f7jl / 9, f7jm / 9, f7jp / 5, f7jq / 5))) + f7la + f7lb + f7lc + f7ld + f7le + f7lf + f7lm + f7ls + f7lz + f7mg + f7ha + f7hb + f7hg + f7hh + f7hd + f7he + f7hf + f7gj + f7gk + f7gl + f7gp + f7gs + f7gt + f7gu + f7gv + f7gx + f7gw ) @reference_formula class sofica(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"sofica" start_date = date(2006, 1, 1) def function(self, simulation, period): ''' Souscriptions au capital de SOFICA 2006- ''' period = period.start.offset('first-of', 'year').period('year') f7gn = simulation.calculate('f7gn', period) f7fn = simulation.calculate('f7fn', period) rng = simulation.calculate('rng', period) P = simulation.legislation_at(period.start).ir.reductions_impots.sofica max0 = min_(P.taux1 * max_(rng, 0), P.max) max1 = max_(0, max0 - f7gn) return period, P.taux2 * min_(f7gn, max0) + P.taux3 * min_(f7fn, max1) @reference_formula class sofipe(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"sofipe" start_date = date(2009, 1, 1) stop_date = date(2011, 1, 1) def function(self, simulation, period): """ Souscription au capital d’une SOFIPECHE (case 7GS) 2009-2011 """ period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) rbg_int = simulation.calculate('rbg_int', period) f7gs = simulation.calculate('f7gs', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.sofipe max1 = min_(P.max * (marpac + 1), P.base * rbg_int) # page3 ligne 18 return period, P.taux * min_(f7gs, max1) @reference_formula class spfcpi(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"spfcpi" @dated_function(start = date(2002, 1, 1), stop = date(2002, 12, 31)) def function_20020101_20021231(self, simulation, period): ''' Souscription de parts de fonds communs de placement dans l'innovation, de fonds d'investissement de proximité 2002 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7gq = simulation.calculate('f7gq', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.spfcpi max1 = P.max * (marpac + 1) return period, P.taux1 * min_(f7gq, max1) @dated_function(start = date(2003, 1, 1), stop = date(2006, 12, 31)) def function_20030101_20061231(self, simulation, period): ''' Souscription de parts de fonds communs de placement dans l'innovation, de fonds d'investissement de proximité 2003-2006 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7gq = simulation.calculate('f7gq', period) f7fq = simulation.calculate('f7fq', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.spfcpi max1 = P.max * (marpac + 1) return period, (P.taux1 * min_(f7gq, max1) + P.taux1 * min_(f7fq, max1)) @dated_function(start = date(2007, 1, 1), stop = date(2010, 12, 31)) def function_20070101_20101231(self, simulation, period): ''' Souscription de parts de fonds communs de placement dans l'innovation, de fonds d'investissement de proximité 2007-2010 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7gq = simulation.calculate('f7gq', period) f7fq = simulation.calculate('f7fq', period) f7fm = simulation.calculate('f7fm', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.spfcpi max1 = P.max * (marpac + 1) return period, (P.taux1 * min_(f7gq, max1) + P.taux1 * min_(f7fq, max1) + P.taux2 * min_(f7fm, max1)) @dated_function(start = date(2011, 1, 1), stop = date(2013, 12, 31)) def function_20110101_20131231(self, simulation, period): ''' Souscription de parts de fonds communs de placement dans l'innovation, de fonds d'investissement de proximité 2011-2013 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f7gq = simulation.calculate('f7gq', period) f7fq = simulation.calculate('f7fq', period) f7fm = simulation.calculate('f7fm', period) f7fl = simulation.calculate('f7fl', period) _P = simulation.legislation_at(period.start) P = simulation.legislation_at(period.start).ir.reductions_impots.spfcpi max1 = P.max * (marpac + 1) return period, (P.taux1 * min_(f7gq, max1) + P.taux1 * min_(f7fq, max1) + P.taux2 * min_(f7fm, max1) + P.taux3 * min_(f7fl, max1)) @dated_function(start = date(2014, 1, 1), stop = date(2014, 12, 31)) def function_20140101_20141231(self, simulation, period): ''' Souscription de parts de fonds communs de placement dans l'innovation, de fonds d'investissement de proximité 2014 ''' period = period.start.offset('first-of', 'year').period('year') f7gq = simulation.calculate('f7gq', period) return period, f7gq * 0 def mini(a, b, *args): if not args: return min_(a, b) else: return min_(a, mini(b, *args)) def maxi(a, b, *args): if not args: return max_(a, b) else: return max_(a, maxi(b, *args)) PK'G߷..Nopenfisca_france/model/prelevements_obligatoires/impot_revenu/credits_impot.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import logging from numpy import logical_not as not_, maximum as max_, minimum as min_, around, logical_or as or_ from ...base import * # noqa analysis:ignore log = logging.getLogger(__name__) @reference_formula class credits_impot(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"credits_impot" @dated_function(start = date(2002, 1, 1), stop = date(2002, 12, 31)) def function_20020101_20021231(self, simulation, period): """ Crédits d'impôt pour l'impôt sur les revenus de 2002 """ period = period.start.offset('first-of', 'year').period('year') accult = simulation.calculate('accult', period) acqgpl = simulation.calculate('acqgpl', period) aidper = simulation.calculate('aidper', period) creimp = simulation.calculate('creimp', period) drbail = simulation.calculate('drbail', period) prlire = simulation.calculate('prlire', period) return period, accult + acqgpl + aidper + creimp + drbail + prlire @dated_function(start = date(2003, 1, 1), stop = date(2004, 12, 31)) def function_20030101_20041231(self, simulation, period): """ Crédits d'impôt pour l'impôt sur les revenus de 2003 et 2004 """ period = period.start.offset('first-of', 'year').period('year') accult = simulation.calculate('accult', period) acqgpl = simulation.calculate('acqgpl', period) aidper = simulation.calculate('aidper', period) creimp = simulation.calculate('creimp', period) drbail = simulation.calculate('drbail', period) mecena = simulation.calculate('mecena', period) prlire = simulation.calculate('prlire', period) return period, accult + acqgpl + aidper + creimp + drbail + mecena + prlire @dated_function(start = date(2005, 1, 1), stop = date(2006, 12, 31)) def function_20050101_20061231(self, simulation, period): """ Crédits d'impôt pour l'impôt sur les revenus de 2005 et 2006 """ period = period.start.offset('first-of', 'year').period('year') accult = simulation.calculate('accult', period) acqgpl = simulation.calculate('acqgpl', period) aidmob = simulation.calculate('aidmob', period) aidper = simulation.calculate('aidper', period) assloy = simulation.calculate('assloy', period) ci_garext = simulation.calculate('ci_garext', period) creimp = simulation.calculate('creimp', period) divide = simulation.calculate('divide', period) direpa = simulation.calculate('direpa', period) drbail = simulation.calculate('drbail', period) jeunes = simulation.calculate('jeunes', period) mecena = simulation.calculate('mecena', period) preetu = simulation.calculate('preetu', period) prlire = simulation.calculate('prlire', period) quaenv = simulation.calculate('quaenv', period) return period, (accult + acqgpl + aidmob + aidper + assloy + ci_garext + creimp + divide + direpa + drbail + jeunes + mecena + preetu + prlire + quaenv) @dated_function(start = date(2007, 1, 1), stop = date(2007, 12, 31)) def function_20070101_20071231(self, simulation, period): """ Crédits d'impôt pour l'impôt sur les revenus de 2007 """ period = period.start.offset('first-of', 'year').period('year') accult = simulation.calculate('accult', period) acqgpl = simulation.calculate('acqgpl', period) aidmob = simulation.calculate('aidmob', period) aidper = simulation.calculate('aidper', period) assloy = simulation.calculate('assloy', period) ci_garext = simulation.calculate('ci_garext', period) creimp = simulation.calculate('creimp', period) divide = simulation.calculate('divide', period) direpa = simulation.calculate('direpa', period) drbail = simulation.calculate('drbail', period) inthab = simulation.calculate('inthab', period) jeunes = simulation.calculate('jeunes', period) mecena = simulation.calculate('mecena', period) preetu = simulation.calculate('preetu', period) prlire = simulation.calculate('prlire', period) quaenv = simulation.calculate('quaenv', period) saldom2 = simulation.calculate('saldom2', period) return period, (accult + acqgpl + aidmob + aidper + assloy + ci_garext + creimp + divide + direpa + drbail + inthab + jeunes + mecena + preetu + prlire + quaenv + saldom2) @dated_function(start = date(2008, 1, 1), stop = date(2008, 12, 31)) def function_20080101_20081231(self, simulation, period): """ Crédits d'impôt pour l'impôt sur les revenus de 2008 """ period = period.start.offset('first-of', 'year').period('year') accult = simulation.calculate('accult', period) aidmob = simulation.calculate('aidmob', period) aidper = simulation.calculate('aidper', period) assloy = simulation.calculate('assloy', period) ci_garext = simulation.calculate('ci_garext', period) creimp = simulation.calculate('creimp', period) creimp_exc_2008 = simulation.calculate('creimp_exc_2008', period) divide = simulation.calculate('divide', period) direpa = simulation.calculate('direpa', period) drbail = simulation.calculate('drbail', period) inthab = simulation.calculate('inthab', period) jeunes = simulation.calculate('jeunes', period) mecena = simulation.calculate('mecena', period) preetu = simulation.calculate('preetu', period) prlire = simulation.calculate('prlire', period) quaenv = simulation.calculate('quaenv', period) saldom2 = simulation.calculate('saldom2', period) return period, (accult + aidmob + aidper + assloy + ci_garext + creimp + creimp_exc_2008 + divide + direpa + drbail + inthab + jeunes + mecena + preetu + prlire + quaenv + saldom2) @dated_function(start = date(2009, 1, 1), stop = date(2009, 12, 31)) def function_20090101_20091231(self, simulation, period): """ Crédits d'impôt pour l'impôt sur les revenus de 2009 """ period = period.start.offset('first-of', 'year').period('year') accult = simulation.calculate('accult', period) aidper = simulation.calculate('aidper', period) assloy = simulation.calculate('assloy', period) ci_garext = simulation.calculate('ci_garext', period) creimp = simulation.calculate('creimp', period) divide = simulation.calculate('divide', period) direpa = simulation.calculate('direpa', period) drbail = simulation.calculate('drbail', period) inthab = simulation.calculate('inthab', period) mecena = simulation.calculate('mecena', period) preetu = simulation.calculate('preetu', period) prlire = simulation.calculate('prlire', period) quaenv = simulation.calculate('quaenv', period) saldom2 = simulation.calculate('saldom2', period) return period, (accult + aidper + assloy + ci_garext + creimp + divide + direpa + drbail + inthab + mecena + preetu + prlire + quaenv + saldom2) @dated_function(start = date(2010, 1, 1), stop = date(2010, 12, 31)) def function_20100101_20101231(self, simulation, period): """ Crédits d'impôt pour l'impôt sur les revenus de 2010 """ period = period.start.offset('first-of', 'year').period('year') accult = simulation.calculate('accult', period) aidper = simulation.calculate('aidper', period) assloy = simulation.calculate('assloy', period) autent = simulation.calculate('autent', period) ci_garext = simulation.calculate('ci_garext', period) creimp = simulation.calculate('creimp', period) direpa = simulation.calculate('direpa', period) drbail = simulation.calculate('drbail', period) inthab = simulation.calculate('inthab', period) jeunes = simulation.calculate('jeunes', period) mecena = simulation.calculate('mecena', period) percvm = simulation.calculate('percvm', period) preetu = simulation.calculate('preetu', period) prlire = simulation.calculate('prlire', period) quaenv = simulation.calculate('quaenv', period) saldom2 = simulation.calculate('saldom2', period) return period, (accult + aidper + assloy + autent + ci_garext + creimp + direpa + drbail + inthab + mecena + percvm + preetu + prlire + quaenv + saldom2) @dated_function(start = date(2011, 1, 1), stop = date(2011, 12, 31)) def function_20110101_20111231(self, simulation, period): """ Crédits d'impôt pour l'impôt sur les revenus de 2011 """ period = period.start.offset('first-of', 'year').period('year') accult = simulation.calculate('accult', period) aidper = simulation.calculate('aidper', period) assloy = simulation.calculate('assloy', period) autent = simulation.calculate('autent', period) ci_garext = simulation.calculate('ci_garext', period) creimp = simulation.calculate('creimp', period) direpa = simulation.calculate('direpa', period) drbail = simulation.calculate('drbail', period) inthab = simulation.calculate('inthab', period) mecena = simulation.calculate('mecena', period) preetu = simulation.calculate('preetu', period) prlire = simulation.calculate('prlire', period) quaenv = simulation.calculate('quaenv', period) saldom2 = simulation.calculate('saldom2', period) return period, (accult + aidper + assloy + autent + ci_garext + creimp + direpa + drbail + inthab + mecena + preetu + prlire + quaenv + saldom2) @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): """ Crédits d'impôt pour l'impôt sur les revenus de 2012 """ period = period.start.offset('first-of', 'year').period('year') accult = simulation.calculate('accult', period) aidper = simulation.calculate('aidper', period) assloy = simulation.calculate('assloy', period) autent = simulation.calculate('autent', period) ci_garext = simulation.calculate('ci_garext', period) cotsyn = simulation.calculate('cotsyn', period) creimp = simulation.calculate('creimp', period) direpa = simulation.calculate('direpa', period) drbail = simulation.calculate('drbail', period) inthab = simulation.calculate('inthab', period) mecena = simulation.calculate('mecena', period) preetu = simulation.calculate('preetu', period) prlire = simulation.calculate('prlire', period) quaenv = simulation.calculate('quaenv', period) saldom2 = simulation.calculate('saldom2', period) return period, (accult + aidper + assloy + autent + ci_garext + cotsyn + creimp + direpa + drbail + inthab + mecena + preetu + prlire + quaenv + saldom2) @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): """ Crédits d'impôt crédités l'impôt sur les revenus de 2013 """ period = period.start.offset('first-of', 'year').period('year') accult = simulation.calculate('accult', period) aidper = simulation.calculate('aidper', period) assloy = simulation.calculate('assloy', period) autent = simulation.calculate('autent', period) ci_garext = simulation.calculate('ci_garext', period) cotsyn = simulation.calculate('cotsyn', period) creimp = simulation.calculate('creimp', period) direpa = simulation.calculate('direpa', period) drbail = simulation.calculate('drbail', period) inthab = simulation.calculate('inthab', period) mecena = simulation.calculate('mecena', period) preetu = simulation.calculate('preetu', period) prlire = simulation.calculate('prlire', period) quaenv = simulation.calculate('quaenv', period) saldom2 = simulation.calculate('saldom2', period) return period, (accult + aidper + assloy + autent + ci_garext + cotsyn + creimp + direpa + drbail + inthab + mecena + preetu + prlire + quaenv + saldom2) @reference_formula class nb_pac2(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"nb_pac2" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') nbF = simulation.calculate('nbF', period) nbJ = simulation.calculate('nbJ', period) nbR = simulation.calculate('nbR', period) nbH = simulation.calculate('nbH', period) return period, nbF + nbJ + nbR - nbH / 2 @reference_formula class accult(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"accult" start_date = date(2002, 1, 1) def function(self, simulation, period): ''' Acquisition de biens culturels (case 7UO) 2002- ''' period = period.start.offset('first-of', 'year').period('year') f7uo = simulation.calculate('f7uo', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.accult return period, P.taux * f7uo @reference_formula class acqgpl(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"acqgpl" start_date = date(2002, 1, 1) stop_date = date(2007, 12, 31) def function(self, simulation, period): ''' Crédit d'impôt pour dépense d'acquisition ou de transformation d'un véhicule GPL ou mixte 2002-2007 ''' period = period.start.offset('first-of', 'year').period('year') f7up = simulation.calculate('f7up', period) f7uq = simulation.calculate('f7uq', period) acqgpl = simulation.legislation_at(period.start).ir.credits_impot.acqgpl return period, f7up * acqgpl.mont_up + f7uq * acqgpl.mont_uq @reference_formula class aidmob(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"aidmob" start_date = date(2005, 1, 1) stop_date = date(2008, 12, 31) def function(self, simulation, period): ''' Crédit d'impôt aide à la mobilité 2005-2008 ''' period = period.start.offset('first-of', 'year').period('year') f1ar = simulation.calculate('f1ar', period) f1br = simulation.calculate('f1br', period) f1cr = simulation.calculate('f1cr', period) f1dr = simulation.calculate('f1dr', period) f1er = simulation.calculate('f1er', period) _P = simulation.legislation_at(period.start) return period, (f1ar + f1br + f1cr + f1dr + f1er) * _P.ir.credits_impot.aidmob.montant @reference_formula class aidper(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"aidper" @dated_function(start = date(2002, 1, 1), stop = date(2003, 12, 31)) def function_20020101_20031231(self, simulation, period): ''' Crédits d’impôt pour dépenses en faveur de l’aide aux personnes (cases 7WI, 7WJ, 7WL). 2002-2003 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) nbH = simulation.calculate('nbH', period) f7wi = simulation.calculate('f7wi', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.aidper n = nb_pac2 - nbH / 2 max0 = (P.max * (1 + marpac) + P.pac1 * (n >= 1) + P.pac2 * (n >= 2) + P.pac3 * (max_(n - 2, 0)) + ((n >= 2) * P.pac3 * nbH + (n == 1) * (P.pac2 + (nbH > 1) * P.pac3 * (nbH - 1) ) * (nbH >= 1) + (n == 0) * (P.pac1 + (nbH > 1) * P.pac2 * (nbH - 1) + (nbH > 2) * P.pac3 * (nbH - 2)) * (nbH >= 1)) / 2) return period, P.taux_wi * min_(f7wi, max0) @dated_function(start = date(2004, 1, 1), stop = date(2005, 12, 31)) def function_20040101_20051231(self, simulation, period): ''' Crédits d’impôt pour dépenses en faveur de l’aide aux personnes (cases 7WI, 7WJ). 2004-2005 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) nbH = simulation.calculate('nbH', period) f7wi = simulation.calculate('f7wi', period) f7wj = simulation.calculate('f7wj', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.aidper n = nb_pac2 - nbH/2 max0 = (P.max * (1 + marpac) + P.pac1 * (n >= 1) + P.pac2 * (n >= 2) + P.pac3 * (max_(n - 2, 0)) + ((n >= 2) * P.pac3 * nbH + (n == 1) * (P.pac2 + (nbH > 1) * P.pac3 * (nbH - 1) ) * (nbH >= 1) + (n == 0) * (P.pac1 + (nbH > 1) * P.pac2 * (nbH - 1) + (nbH > 2) * P.pac3 * (nbH - 2)) * (nbH >= 1)) / 2) max1 = max_(0, max0 - f7wj) return period, (P.taux_wj * min_(f7wj, max0) + P.taux_wi * min_(f7wi, max1)) @dated_function(start = date(2006, 1, 1), stop = date(2009, 12, 31)) def function_20060101_20091231(self, simulation, period): ''' Crédits d’impôt pour dépenses en faveur de l’aide aux personnes (cases 7WI, 7WJ). 2006-2009 cf. cerfa 50796 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) f7wi = simulation.calculate('f7wi', period) f7wj = simulation.calculate('f7wj', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.aidper max0 = P.max * (1 + marpac) + P.pac1 * nb_pac2 max1 = max_(0, max0 - f7wj) return period, (P.taux_wj * min_(f7wj, max0) + P.taux_wi * min_(f7wi, max1)) @dated_function(start = date(2010, 1, 1), stop = date(2011, 12, 31)) def function_20100101_20111231(self, simulation, period): ''' Crédits d’impôt pour dépenses en faveur de l’aide aux personnes (cases 7SF, 7WI, 7WJ, 7WL). 2010-2011 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) f7sf = simulation.calculate('f7sf', period) f7wi = simulation.calculate('f7wi', period) f7wj = simulation.calculate('f7wj', period) f7wl = simulation.calculate('f7wl', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.aidper max0 = P.max * (1 + marpac) + P.pac1 * nb_pac2 max1 = max_(0, max0 - f7wl - f7sf) max2 = max_(0, max1 - f7wj) return period, P.taux_wl * min_(f7wl+f7sf, max0) + P.taux_wj * min_(f7wj, max1) + P.taux_wi * min_(f7wi, max2) @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): ''' Crédits d’impôt pour dépenses en faveur de l’aide aux personnes (cases 7WI, 7WJ, 7WL, 7WR). 2012 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) f7wi = simulation.calculate('f7wi', period) f7wj = simulation.calculate('f7wj', period) f7wl = simulation.calculate('f7wl', period) f7wr = simulation.calculate('f7wr', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.aidper # On ne contrôle pas que 7WR ne dépasse pas le plafond (ça dépend du nombre de logements (7sa) et de la nature des #travaux, c'est un peu le bordel) max00 = P.max * (1 + marpac) max0 = max00 + P.pac1 * nb_pac2 max1 = max_(0, max0 - max_(0,f7wl-max00)) max2 = max_(0, max1 - f7wj) return period, (P.taux_wr * f7wr + P.taux_wl * min_(f7wl, max00) + P.taux_wl * max_(f7wl - max00, 0) + P.taux_wj * min_(f7wj, max1) + P.taux_wi * min_(f7wi, max2)) @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): ''' Crédits d’impôt pour dépenses en faveur de l’aide aux personnes (cases 7WI, 7WJ, 7WL). 2013 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) f7wj = simulation.calculate('f7wj', period) f7wl = simulation.calculate('f7wl', period) f7wr = simulation.calculate('f7wr', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.aidper # On ne contrôle pas que 7WR ne dépasse pas le plafond (ça dépend du nombre de logements et de la nature des #travaux, c'est un peu le bordel) max00 = P.max * (1 + marpac) max0 = max00 + P.pac1 * nb_pac2 max1 = max_(0, max0 - max_(0,f7wl-max00)) return period, (P.taux_wr * f7wr + P.taux_wl * min_(f7wl, max00) + P.taux_wl * max_(f7wl - max00, 0) + P.taux_wj * min_(f7wj, max1)) @reference_formula class assloy(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"assloy" start_date = date(2005, 1, 1) def function(self, simulation, period): ''' Crédit d’impôt primes d’assurance pour loyers impayés (case 4BF) 2005- ''' period = period.start.offset('first-of', 'year').period('year') f4bf = simulation.calculate('f4bf', period) _P = simulation.legislation_at(period.start) return period, _P.ir.credits_impot.assloy.taux * f4bf @reference_formula class autent(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"autent" start_date = date(2009, 1, 1) def function(self, simulation, period): ''' Auto-entrepreneur : versements d’impôt sur le revenu (case 8UY) 2009- ''' period = period.start.offset('first-of', 'year').period('year') f8uy = simulation.calculate('f8uy', period) return period, f8uy @reference_formula class ci_garext(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"ci_garext" start_date = date(2005, 1, 1) def function(self, simulation, period): ''' Frais de garde des enfants à l’extérieur du domicile (cases 7GA à 7GC et 7GE à 7GG) 2005- ''' period = period.start.offset('first-of', 'year').period('year') f7ga = simulation.calculate('f7ga', period) f7gb = simulation.calculate('f7gb', period) f7gc = simulation.calculate('f7gc', period) f7ge = simulation.calculate('f7ge', period) f7gf = simulation.calculate('f7gf', period) f7gg = simulation.calculate('f7gg', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.garext max1 = P.max return period, P.taux * (min_(f7ga, max1) + min_(f7gb, max1) + min_(f7gc, max1) + min_(f7ge, max1 / 2) + min_(f7gf, max1 / 2) + min_(f7gg, max1 / 2)) @reference_formula class creimp_exc_2008(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"creimp_exc_2008" def function(self, simulation, period): ''' Crédit d'impôt exceptionnel sur les revenus 2008 http://www11.minefi.gouv.fr/boi/boi2009/5fppub/textes/5b2509/5b2509.pdf ''' period = period.start.offset('first-of', 'year').period('year') rni = simulation.calculate('rni', period) nbptr = simulation.calculate('nbptr', period) iai = simulation.calculate('iai', period) mohist = simulation.calculate('mohist', period) elig_creimp_exc_2008 = simulation.calculate('elig_creimp_exc_2008', period) #TODO: gérer les DOM-TOM, corriger les formules, inclure 7KA rpp = rni / nbptr return period, (elig_creimp_exc_2008 * (mohist < 10700) * (rpp <= 12475) * around((2/3) * min_(12475, iai) * (rpp < 11674) + (rpp > 11673) * max_(0, 8317 * (12475 - rpp) / 802))) @reference_formula class creimp(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"creimp" @dated_function(start = date(2002, 1, 1), stop = date(2002, 12, 31)) def function_20020101_20021231(self, simulation, period): '''Avoir fiscaux et crédits d'impôt 2002 ''' period = period.start.offset('first-of', 'year').period('year') f2ab = simulation.calculate('f2ab', period) f8ta = simulation.calculate('f8ta', period) f8tb = simulation.calculate('f8tb', period) f8tc = simulation.calculate('f8tc', period) f8td_2002_2005 = simulation.calculate('f8td_2002_2005', period) f8te = simulation.calculate('f8te', period) f8tf = simulation.calculate('f8tf', period) f8tg = simulation.calculate('f8tg', period) f8th = simulation.calculate('f8th', period) return period, (f2ab + f8ta + f8tb + f8tc + f8td_2002_2005 + f8te - f8tf + f8tg + f8th) @dated_function(start = date(2003, 1, 1), stop = date(2003, 12, 31)) def function_20030101_20031231(self, simulation, period): '''Avoir fiscaux et crédits d'impôt 2003 ''' period = period.start.offset('first-of', 'year').period('year') f2ab = simulation.calculate('f2ab', period) f8ta = simulation.calculate('f8ta', period) f8tb = simulation.calculate('f8tb', period) f8tc = simulation.calculate('f8tc', period) f8td_2002_2005 = simulation.calculate('f8td_2002_2005', period) f8te = simulation.calculate('f8te', period) f8tf = simulation.calculate('f8tf', period) f8tg = simulation.calculate('f8tg', period) f8th = simulation.calculate('f8th', period) f8to = simulation.calculate('f8to', period) f8tp = simulation.calculate('f8tp', period) return period, (f2ab + f8ta + f8tb + f8tc + f8td_2002_2005 + f8te - f8tf + f8tg + f8th + f8to - f8tp) @dated_function(start = date(2004, 1, 1), stop = date(2004, 12, 31)) def function_20040101_20041231(self, simulation, period): '''Avoir fiscaux et crédits d'impôt 2004 ''' period = period.start.offset('first-of', 'year').period('year') f2ab = simulation.calculate('f2ab', period) f8ta = simulation.calculate('f8ta', period) f8tb = simulation.calculate('f8tb', period) f8tc = simulation.calculate('f8tc', period) f8td_2002_2005 = simulation.calculate('f8td_2002_2005', period) f8te = simulation.calculate('f8te', period) f8tf = simulation.calculate('f8tf', period) f8tg = simulation.calculate('f8tg', period) f8th = simulation.calculate('f8th', period) f8to = simulation.calculate('f8to', period) f8tp = simulation.calculate('f8tp', period) f8tz = simulation.calculate('f8tz', period) f8uz = simulation.calculate('f8uz', period) return period, (f2ab + f8ta + f8tb + f8tc + f8td_2002_2005 + f8te - f8tf + f8tg + f8th + f8to - f8tp + f8tz + f8uz) @dated_function(start = date(2005, 1, 1), stop = date(2005, 12, 31)) def function_20050101_20051231(self, simulation, period): '''Avoir fiscaux et crédits d'impôt 2005 ''' period = period.start.offset('first-of', 'year').period('year') f2ab = simulation.calculate('f2ab', period) f8ta = simulation.calculate('f8ta', period) f8tb = simulation.calculate('f8tb', period) f8tc = simulation.calculate('f8tc', period) f8td_2002_2005 = simulation.calculate('f8td_2002_2005', period) f8te = simulation.calculate('f8te', period) f8tf = simulation.calculate('f8tf', period) f8tg = simulation.calculate('f8tg', period) f8th = simulation.calculate('f8th', period) f8to = simulation.calculate('f8to', period) f8tp = simulation.calculate('f8tp', period) f8tz = simulation.calculate('f8tz', period) f8uz = simulation.calculate('f8uz', period) f8wa = simulation.calculate('f8wa', period) f8wb = simulation.calculate('f8wb', period) f8wc = simulation.calculate('f8wc', period) f8we = simulation.calculate('f8we', period) return period, (f2ab + f8ta + f8tb + f8tc + f8td_2002_2005 + f8te - f8tf + f8tg + f8th + f8to - f8tp + f8tz + f8uz + f8wa + f8wb + f8wc + f8we) @dated_function(start = date(2006, 1, 1), stop = date(2006, 12, 31)) def function_20060101_20061231(self, simulation, period): '''Avoir fiscaux et crédits d'impôt 2006 ''' period = period.start.offset('first-of', 'year').period('year') f2ab = simulation.calculate('f2ab', period) f8ta = simulation.calculate('f8ta', period) f8tb = simulation.calculate('f8tb', period) f8tc = simulation.calculate('f8tc', period) f8te = simulation.calculate('f8te', period) f8tf = simulation.calculate('f8tf', period) f8tg = simulation.calculate('f8tg', period) f8th = simulation.calculate('f8th', period) f8to = simulation.calculate('f8to', period) f8tp = simulation.calculate('f8tp', period) f8tz = simulation.calculate('f8tz', period) f8uz = simulation.calculate('f8uz', period) f8wa = simulation.calculate('f8wa', period) f8wb = simulation.calculate('f8wb', period) f8wc = simulation.calculate('f8wc', period) f8wd = simulation.calculate('f8wd', period) f8we = simulation.calculate('f8we', period) f8wr = simulation.calculate('f8wr', period) f8ws = simulation.calculate('f8ws', period) f8wt = simulation.calculate('f8wt', period) f8wu = simulation.calculate('f8wu', period) return period, (f2ab + f8ta + f8tb + f8tc + f8te - f8tf + f8tg + f8th + f8to - f8tp + f8tz + f8uz + f8wa + f8wb + f8wc + f8wd + f8we + f8wr + f8ws + f8wt + f8wu) @dated_function(start = date(2007, 1, 1), stop = date(2007, 12, 31)) def function_20070101_20071231(self, simulation, period): '''Avoir fiscaux et crédits d'impôt 2007 ''' period = period.start.offset('first-of', 'year').period('year') f2ab = simulation.calculate('f2ab', period) f8ta = simulation.calculate('f8ta', period) f8tb = simulation.calculate('f8tb', period) f8tc = simulation.calculate('f8tc', period) f8te = simulation.calculate('f8te', period) f8tf = simulation.calculate('f8tf', period) f8tg = simulation.calculate('f8tg', period) f8th = simulation.calculate('f8th', period) f8to = simulation.calculate('f8to', period) f8tp = simulation.calculate('f8tp', period) f8tz = simulation.calculate('f8tz', period) f8uz = simulation.calculate('f8uz', period) f8wa = simulation.calculate('f8wa', period) f8wb = simulation.calculate('f8wb', period) f8wc = simulation.calculate('f8wc', period) f8wd = simulation.calculate('f8wd', period) f8wr = simulation.calculate('f8wr', period) f8ws = simulation.calculate('f8ws', period) f8wt = simulation.calculate('f8wt', period) f8wu = simulation.calculate('f8wu', period) f8wv = simulation.calculate('f8wv', period) f8wx = simulation.calculate('f8wx', period) return period, (f2ab + f8ta + f8tb + f8tc + f8te - f8tf + f8tg + f8th + f8to - f8tp + f8tz + f8uz + f8wa + f8wb + f8wc + f8wd + f8wr + f8ws + f8wt + f8wu + f8wv + f8wx) @dated_function(start = date(2008, 1, 1), stop = date(2008, 12, 31)) def function_20080101_20081231(self, simulation, period): '''Avoir fiscaux et crédits d'impôt 2008''' period = period.start.offset('first-of', 'year').period('year') f2ab = simulation.calculate('f2ab', period) f8ta = simulation.calculate('f8ta', period) f8tb = simulation.calculate('f8tb', period) f8tc = simulation.calculate('f8tc', period) f8te = simulation.calculate('f8te', period) f8tf = simulation.calculate('f8tf', period) f8tg = simulation.calculate('f8tg', period) f8th = simulation.calculate('f8th', period) f8to = simulation.calculate('f8to', period) f8tp = simulation.calculate('f8tp', period) f8tz = simulation.calculate('f8tz', period) f8uz = simulation.calculate('f8uz', period) f8wa = simulation.calculate('f8wa', period) f8wb = simulation.calculate('f8wb', period) f8wc = simulation.calculate('f8wc', period) f8wd = simulation.calculate('f8wd', period) f8we = simulation.calculate('f8we', period) f8wr = simulation.calculate('f8wr', period) f8ws = simulation.calculate('f8ws', period) f8wt = simulation.calculate('f8wt', period) f8wu = simulation.calculate('f8wu', period) f8wv = simulation.calculate('f8wv', period) f8wx = simulation.calculate('f8wx', period) return period, (f2ab + f8ta + f8tb + f8tc + f8te - f8tf + f8tg + f8th + f8to - f8tp + f8tz + f8uz + f8wa + f8wb + f8wc + f8wd + f8wr + f8ws + f8wt + f8wu + f8wv + f8wx) @dated_function(start = date(2009, 1, 1), stop = date(2009, 12, 31)) def function_20090101_20091231(self, simulation, period): '''Avoir fiscaux et crédits d'impôt 2009''' period = period.start.offset('first-of', 'year').period('year') f2ab = simulation.calculate('f2ab', period) f8ta = simulation.calculate('f8ta', period) f8tb = simulation.calculate('f8tb', period) f8te = simulation.calculate('f8te', period) f8tf = simulation.calculate('f8tf', period) f8tg = simulation.calculate('f8tg', period) f8th = simulation.calculate('f8th', period) f8to = simulation.calculate('f8to', period) f8tp = simulation.calculate('f8tp', period) f8tz = simulation.calculate('f8tz', period) f8uz = simulation.calculate('f8uz', period) f8wa = simulation.calculate('f8wa', period) f8wb = simulation.calculate('f8wb', period) f8wd = simulation.calculate('f8wd', period) f8we = simulation.calculate('f8we', period) f8wr = simulation.calculate('f8wr', period) f8ws = simulation.calculate('f8ws', period) f8wt = simulation.calculate('f8wt', period) f8wu = simulation.calculate('f8wu', period) f8wv = simulation.calculate('f8wv', period) f8wx = simulation.calculate('f8wx', period) return period, (f2ab + f8ta + f8tb + f8te - f8tf + f8tg + f8th + f8to - f8tp + f8tz + f8uz + f8wa + f8wb + f8wd + f8we + f8wr + f8ws + f8wt + f8wu + f8wv + f8wx) @dated_function(start = date(2010, 1, 1), stop = date(2011, 12, 31)) def function_20100101_20111231(self, simulation, period): '''Avoir fiscaux et crédits d'impôt 2010 et 2011 ''' period = period.start.offset('first-of', 'year').period('year') f2ab = simulation.calculate('f2ab', period) f8ta = simulation.calculate('f8ta', period) f8tb = simulation.calculate('f8tb', period) f8tc = simulation.calculate('f8tc', period) f8te = simulation.calculate('f8te', period) f8tf = simulation.calculate('f8tf', period) f8tg = simulation.calculate('f8tg', period) f8th = simulation.calculate('f8th', period) f8to = simulation.calculate('f8to', period) f8tp = simulation.calculate('f8tp', period) f8tz = simulation.calculate('f8tz', period) f8uz = simulation.calculate('f8uz', period) f8wa = simulation.calculate('f8wa', period) f8wb = simulation.calculate('f8wb', period) f8wd = simulation.calculate('f8wd', period) f8we = simulation.calculate('f8we', period) f8wr = simulation.calculate('f8wr', period) f8wt = simulation.calculate('f8wt', period) f8wu = simulation.calculate('f8wu', period) f8wv = simulation.calculate('f8wv', period) return period, (f2ab + f8ta + f8tb + f8tc + f8te - f8tf + f8tg + f8th + f8to - f8tp + f8tz + f8uz + f8wa + f8wb + f8wd + f8we + f8wr + f8wt + f8wu + f8wv) @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): '''Avoir fiscaux et crédits d'impôt 2012 ''' period = period.start.offset('first-of', 'year').period('year') f2ab = simulation.calculate('f2ab', period) f8ta = simulation.calculate('f8ta', period) f8tb = simulation.calculate('f8tb', period) f8tc = simulation.calculate('f8tc', period) f8te = simulation.calculate('f8te', period) f8tf = simulation.calculate('f8tf', period) f8tg = simulation.calculate('f8tg', period) f8th = simulation.calculate('f8th', period) f8to = simulation.calculate('f8to', period) f8tp = simulation.calculate('f8tp', period) f8ts = simulation.calculate('f8ts', period) f8tz = simulation.calculate('f8tz', period) f8uz = simulation.calculate('f8uz', period) f8wa = simulation.calculate('f8wa', period) f8wb = simulation.calculate('f8wb', period) f8wd = simulation.calculate('f8wd', period) f8we = simulation.calculate('f8we', period) f8wr = simulation.calculate('f8wr', period) f8wt = simulation.calculate('f8wt', period) f8wu = simulation.calculate('f8wu', period) f8wv = simulation.calculate('f8wv', period) return period, (f2ab + f8ta + f8tb + f8tc +f8te - f8tf + f8tg + f8th + f8to - f8tp + f8ts + f8tz + f8uz + f8wa + f8wb + f8wd + f8we + f8wr + f8wt + f8wu + f8wv) @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): '''Avoir fiscaux et crédits d'impôt 2013 ''' period = period.start.offset('first-of', 'year').period('year') f2ab = simulation.calculate('f2ab', period) f2ck = simulation.calculate('f2ck', period) f8ta = simulation.calculate('f8ta', period) f8tb = simulation.calculate('f8tb', period) f8tc = simulation.calculate('f8tc', period) f8te = simulation.calculate('f8te', period) f8tf = simulation.calculate('f8tf', period) f8tg = simulation.calculate('f8tg', period) f8th = simulation.calculate('f8th', period) f8tl = simulation.calculate('f8tl', period) f8to = simulation.calculate('f8to', period) f8tp = simulation.calculate('f8tp', period) f8ts = simulation.calculate('f8ts', period) f8tz = simulation.calculate('f8tz', period) f8uw = simulation.calculate('f8uw', period) f8uz = simulation.calculate('f8uz', period) f8wa = simulation.calculate('f8wa', period) f8wb = simulation.calculate('f8wb', period) f8wc = simulation.calculate('f8wc', period) f8wd = simulation.calculate('f8wd', period) f8we = simulation.calculate('f8we', period) f8wr = simulation.calculate('f8wr', period) f8wt = simulation.calculate('f8wt', period) f8wu = simulation.calculate('f8wu', period) return period, (f2ab + f2ck + f8ta + f8tb + f8tc + f8te - f8tf + f8tg + f8th + f8to - f8tp + f8tl + f8ts + f8tz + f8uw + f8uz + f8wa + f8wb + f8wc + f8wd + f8we + f8wr + f8wt + f8wu) @reference_formula class direpa(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"direpa" def function(self, simulation, period): ''' Crédit d’impôt directive « épargne » (case 2BG) 2006- ''' period = period.start.offset('first-of', 'year').period('year') f2bg = simulation.calculate('f2bg', period) return period, f2bg @reference_formula class divide(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"divide" start_date = date(2005, 1, 1) stop_date = date(2009, 12, 31) def function(self, simulation, period): ''' Crédit d'impôt dividendes 2005-2009 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) f2dc = simulation.calculate('f2dc', period) f2gr = simulation.calculate('f2gr', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.divide max1 = P.max * (marpac + 1) return period, min_(P.taux * (f2dc + f2gr), max1) @reference_formula class drbail(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"drbail" def function(self, simulation, period): ''' Crédit d’impôt représentatif de la taxe additionnelle au droit de bail (case 4TQ) 2002- ''' period = period.start.offset('first-of', 'year').period('year') f4tq = simulation.calculate('f4tq', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.drbail return period, P.taux * f4tq @reference_formula class inthab(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"inthab" @dated_function(start = date(2007, 1, 1), stop = date(2007, 12, 31)) def function_20070101_20071231(self, simulation, period): ''' Crédit d’impôt intérêts des emprunts pour l’habitation principale (cases 7UH) 2007 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) caseP = simulation.calculate('caseP', period) caseF = simulation.calculate('caseF', period) nbG = simulation.calculate('nbG', period) nbR = simulation.calculate('nbR', period) f7uh = simulation.calculate('f7uh', period) P = simulation.legislation_at(period.start).ir.credits_impot.inthab invalide = caseP | caseF | (nbG != 0) | (nbR != 0) max0 = P.max * (marpac + 1) * (1 + invalide) + nb_pac2 * P.add return period, P.taux1 * min_(max0, f7uh) @dated_function(start = date(2008, 1, 1), stop = date(2008, 12, 31)) def function_20080101_20081231(self, simulation, period): ''' Crédit d’impôt intérêts des emprunts pour l’habitation principale (cases 7VX, 7VY et 7VZ) 2008 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) caseP = simulation.calculate('caseP', period) caseF = simulation.calculate('caseF', period) nbG = simulation.calculate('nbG', period) nbR = simulation.calculate('nbR', period) f7vy = simulation.calculate('f7vy', period) f7vz = simulation.calculate('f7vz', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.inthab invalide = caseP | caseF | (nbG != 0) | (nbR != 0) max0 = P.max * (marpac + 1) * (1 + invalide) + nb_pac2 * P.add max1 = max_(max0 - f7vy, 0) return period, (P.taux1 * min_(f7vy, max0) + P.taux3 * min_(f7vz, max1)) @dated_function(start = date(2009, 1, 1), stop = date(2009, 12, 31)) def function_20090101_20091231(self, simulation, period): ''' Crédit d’impôt intérêts des emprunts pour l’habitation principale (cases 7VX, 7VY et 7VZ) 2009 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) caseP = simulation.calculate('caseP', period) caseF = simulation.calculate('caseF', period) nbG = simulation.calculate('nbG', period) nbR = simulation.calculate('nbR', period) f7vx = simulation.calculate('f7vx', period) f7vy = simulation.calculate('f7vy', period) f7vz = simulation.calculate('f7vz', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.inthab invalide = caseP | caseF | (nbG != 0) | (nbR != 0) max0 = P.max * (marpac + 1) * (1 + invalide) + nb_pac2 * P.add max1 = max_(max0 - f7vx, 0) max2 = max_(max1 - f7vy, 0) return period, (P.taux1 * min_(f7vx, max0) + P.taux1 * min_(f7vy, max1) + P.taux3 * min_(f7vz, max2)) @dated_function(start = date(2010, 1, 1), stop = date(2010, 12, 31)) def function_20100101_20101231(self, simulation, period): ''' Crédit d’impôt intérêts des emprunts pour l’habitation principale (cases 7VW, 7VX, 7VY et 7VZ) 2010 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) caseP = simulation.calculate('caseP', period) caseF = simulation.calculate('caseF', period) nbG = simulation.calculate('nbG', period) nbR = simulation.calculate('nbR', period) f7vw = simulation.calculate('f7vw', period) f7vx = simulation.calculate('f7vx', period) f7vy = simulation.calculate('f7vy', period) f7vz = simulation.calculate('f7vz', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.inthab invalide = caseP | caseF | (nbG != 0) | (nbR != 0) max0 = P.max * (marpac + 1) * (1 + invalide) + nb_pac2 * P.add max1 = max_(max0 - f7vx, 0) max2 = max_(max1 - f7vy, 0) max3 = max_(max2 - f7vw, 0) return period, (P.taux1 * min_(f7vx, max0) + P.taux1 * min_(f7vy, max1) + P.taux2 * min_(f7vw, max2) + P.taux3 * min_(f7vz, max3)) @dated_function(start = date(2011, 1, 1), stop = date(2011, 12, 31)) def function_20110101_20111231(self, simulation, period): ''' Crédit d’impôt intérêts des emprunts pour l’habitation principale (cases 7VW, 7VX, 7VY et 7VZ) 2011 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) caseP = simulation.calculate('caseP', period) caseF = simulation.calculate('caseF', period) nbG = simulation.calculate('nbG', period) nbR = simulation.calculate('nbR', period) f7vu = simulation.calculate('f7vu', period) f7vw = simulation.calculate('f7vw', period) f7vv = simulation.calculate('f7vv', period) f7vx = simulation.calculate('f7vx', period) f7vy = simulation.calculate('f7vy', period) f7vz = simulation.calculate('f7vz', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.inthab invalide = caseP | caseF | (nbG != 0) | (nbR != 0) max0 = P.max * (marpac + 1) * (1 + invalide) + nb_pac2 * P.add max1 = max_(max0 - f7vx, 0) max2 = max_(max1 - f7vy, 0) max3 = max_(max2 - f7vw, 0) max4 = max_(max3 - f7vu, 0) max5 = max_(max4 - f7vz, 0) return period, (P.taux1 * min_(f7vx, max0) + P.taux1 * min_(f7vy, max1) + P.taux2 * min_(f7vw, max2) + P.taux3 * min_(f7vu, max3) + P.taux4 * min_(f7vz, max4) + P.taux5 * min_(f7vv, max5)) @dated_function(start = date(2012, 1, 1), stop = date(2013, 12, 31)) def function_20120101_20131231(self, simulation, period): ''' Crédit d’impôt intérêts des emprunts pour l’habitation principale (cases 7VW, 7VX, 7VY et 7VZ) 2011 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) caseP = simulation.calculate('caseP', period) caseF = simulation.calculate('caseF', period) nbG = simulation.calculate('nbG', period) nbR = simulation.calculate('nbR', period) f7vt = simulation.calculate('f7vt', period) f7vu = simulation.calculate('f7vu', period) f7vv = simulation.calculate('f7vv', period) f7vw = simulation.calculate('f7vw', period) f7vx = simulation.calculate('f7vx', period) f7vy = simulation.calculate('f7vy', period) f7vz = simulation.calculate('f7vz', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.inthab invalide = caseP | caseF | (nbG != 0) | (nbR != 0) max0 = P.max * (marpac + 1) * (1 + invalide) + nb_pac2 * P.add max1 = max_(max0 - f7vx, 0) max2 = max_(max1 - f7vy, 0) max3 = max_(max2 - f7vw, 0) max4 = max_(max3 - f7vu, 0) max5 = max_(max4 - f7vz, 0) max6 = max_(max5 - f7vv, 0) return period, (P.taux1 * min_(f7vx, max0) + P.taux1 * min_(f7vy, max1) + P.taux2 * min_(f7vw, max2) + P.taux3 * min_(f7vu, max3) + P.taux4 * min_(f7vz, max4) + P.taux5 * min_(f7vv, max5) + P.taux6 * min_(f7vt, max6)) @reference_formula class jeunes(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"jeunes" start_date = date(2005, 1, 1) stop_date = date(2008, 12, 31) def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') jeunes_ind_holder = simulation.compute('jeunes_ind', period) return period, self.sum_by_entity(jeunes_ind_holder) @reference_formula class jeunes_ind(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"jeunes_ind" start_date = date(2005, 1, 1) stop_date = date(2008, 12, 31) def function(self, simulation, period): ''' Crédit d'impôt en faveur des jeunes 2005-2008 rfr de l'année où jeune de moins de 26 à travaillé six mois cf. http://www3.finances.gouv.fr/calcul_impot/2009/pdf/form-2041-GY.pdf Attention seuls certains ''' period = period.start.offset('first-of', 'year').period('year') age = simulation.calculate('age', period) nbptr_holder = simulation.compute('nbptr', period) rfr_holder = simulation.compute('rfr', period) salaire_imposable = simulation.calculate_add('salaire_imposable', period) marpac_holder = simulation.compute('marpac', period) elig_creimp_jeunes = simulation.calculate('elig_creimp_jeunes', period) _P = simulation.legislation_at(period.start) #TODO: vérifier si les jeunes sous le foyer fiscal de leurs parents sont éligibles P = _P.ir.credits_impot.jeunes rfr = self.cast_from_entity_to_roles(rfr_holder) nbptr = self.cast_from_entity_to_roles(nbptr_holder) marpac = self.cast_from_entity_to_roles(marpac_holder) elig = (age < P.age) * (rfr < P.rfr_plaf * (marpac * P.rfr_mult + not_(marpac)) + max_(0, nbptr - 2) * .5 * P.rfr_maj + (nbptr == 1.5) * P.rfr_maj) montant = ( (P.min <= salaire_imposable) * (salaire_imposable < P.int) * P.montant + (P.int <= salaire_imposable) * (salaire_imposable <= P.max) * (P.max - salaire_imposable) * P.taux ) return period, elig_creimp_jeunes * elig * max_(25, montant) # D'après le document num. 2041 GY # somme calculée sur formulaire 2041 @reference_formula class mecena(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"mecena" start_date = date(2003, 1, 1) def function(self, simulation, period): ''' Mécénat d'entreprise (case 7US) 2003- ''' period = period.start.offset('first-of', 'year').period('year') f7us = simulation.calculate('f7us', period) return period, f7us @reference_formula class percvm(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"percvm" start_date = date(2010, 1, 1) stop_date = date(2010, 12, 31) def function(self, simulation, period): ''' Crédit d’impôt pertes sur cessions de valeurs mobilières (3VV) -2010 ''' period = period.start.offset('first-of', 'year').period('year') f3vv_end_2010 = simulation.calculate('f3vv_end_2010', period) _P = simulation.legislation_at(period.start) return period, _P.ir.credits_impot.percvm.taux * f3vv_end_2010 @reference_formula class preetu(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"preetu" @dated_function(start = date(2005, 1, 1), stop = date(2005, 12, 31)) def function_20050101_20051231(self, simulation, period): ''' Crédit d’impôt pour souscription de prêts étudiants (cases 7UK, 7VO et 7TD) 2005 ''' period = period.start.offset('first-of', 'year').period('year') f7uk = simulation.calculate('f7uk', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.preetu return period, P.taux * min_(f7uk, P.max) @dated_function(start = date(2006, 1, 1), stop = date(2007, 12, 31)) def function_20060101_20071231(self, simulation, period): ''' Crédit d’impôt pour souscription de prêts étudiants (cases 7UK, 7VO et 7TD) 2006-2007 ''' period = period.start.offset('first-of', 'year').period('year') f7uk = simulation.calculate('f7uk', period) f7vo = simulation.calculate('f7vo', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.preetu max1 = P.max * (1 + f7vo) return period, P.taux * min_(f7uk, max1) @dated_function(start = date(2008, 1, 1), stop = date(2015, 12, 31)) def function_20080101_20151231(self, simulation, period): ''' Crédit d’impôt pour souscription de prêts étudiants (cases 7UK, 7VO et 7TD) 2008- ''' period = period.start.offset('first-of', 'year').period('year') f7uk = simulation.calculate('f7uk', period) f7vo = simulation.calculate('f7vo', period) f7td = simulation.calculate('f7td', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.preetu max1 = P.max * f7vo return period, P.taux * min_(f7uk, P.max) + P.taux * min_(f7td, max1) @reference_formula class prlire(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"Prélèvement libératoire à restituer (case 2DH)" stop_date = date(2013, 12, 31) def function(self, simulation, period): ''' Prélèvement libératoire à restituer (case 2DH) 2002- http://www2.impots.gouv.fr/documentation/2013/brochure_ir/index.html#122/z ''' period = period.start.offset('first-of', 'year').period('year') f2dh = simulation.calculate('f2dh', period) f2ch = simulation.calculate('f2ch', period) marpac = simulation.calculate('marpac', period) _P = simulation.legislation_at(period.start) plaf_resid = max_(_P.ir.rvcm.abat_assvie * (1 + marpac) - f2ch, 0) return period, _P.ir.credits_impot.prlire.taux * min_(f2dh, plaf_resid) @reference_formula class quaenv(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"quaenv" @dated_function(start = date(2005, 1, 1), stop = date(2005, 12, 31)) def function_20050101_20051231(self, simulation, period): ''' Crédits d’impôt pour dépenses en faveur de la qualité environnementale (cases 7WF, 7WG, 7WH) 2005 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) f7wf = simulation.calculate('f7wf', period) f7wg = simulation.calculate('f7wg', period) f7wh = simulation.calculate('f7wh', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.quaenv n = nb_pac2 max0 = P.max * (1 + marpac) + P.pac1 * (n >= 1) + P.pac2 * (n >= 2) + P.pac2 * (max_(n - 2, 0)) max1 = max_(0, max0 - f7wf) max2 = max_(0, max1 - f7wg) return period, (P.taux_wf * min_(f7wf, max0) + P.taux_wg * min_(f7wg, max1) + P.taux_wh * min_(f7wh, max2)) @dated_function(start = date(2006, 1, 1), stop = date(2008, 12, 31)) def function_20060101_20081231(self, simulation, period): ''' Crédits d’impôt pour dépenses en faveur de la qualité environnementale (cases 7WF, 7WG, 7WH, 7WQ) 2006-2008 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) f7wf = simulation.calculate('f7wf', period) f7wg = simulation.calculate('f7wg', period) f7wh = simulation.calculate('f7wh', period) f7wq = simulation.calculate('f7wq', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.quaenv max0 = P.max * (1 + marpac) + P.pac1 * nb_pac2 max1 = max_(0, max0 - f7wf) max2 = max_(0, max1 - f7wg) max3 = max_(0, max2 - f7wh) return period, (P.taux_wf * min_(f7wf, max0) + P.taux_wg * min_(f7wg, max1) + P.taux_wh * min_(f7wh, max2) + P.taux_wq * min_(f7wq, max3)) @dated_function(start = date(2009, 1, 1), stop = date(2009, 12, 31)) def function_20090101_20091231(self, simulation, period): ''' Crédits d’impôt pour dépenses en faveur de la qualité environnementale (cases 7WF, 7WG, 7WH, 7WK, 7WQ, 7SB, 7SC, 7SD, 7SE) 2009 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) f7we = simulation.calculate('f7we', period) f7wf = simulation.calculate('f7wf', period) f7wg = simulation.calculate('f7wg', period) f7wh = simulation.calculate('f7wh', period) f7wk = simulation.calculate('f7wk', period) f7wq = simulation.calculate('f7wq', period) f7sb = simulation.calculate('f7sb', period) f7sc = simulation.calculate('f7sc', period) f7sd = simulation.calculate('f7sd', period) f7se = simulation.calculate('f7se', period) rfr = simulation.calculate('rfr', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.quaenv max0 = P.max * (1 + marpac) + P.pac1 * nb_pac2 max1 = max_(0, max0 - f7wf) max2 = max_(0, max1 - f7se) max3 = max_(0, max2 - f7wk) max4 = max_(0, max3 - f7sd) max5 = max_(0, max4 - f7wg) max6 = max_(0, max5 - f7sc) max7 = max_(0, max6 - f7wh) max8 = max_(0, max7 - f7sb) return period, or_(not_(f7we), rfr < 45000) * (P.taux_wf * min_(f7wf, max0) + P.taux_se * min_(f7se, max1) + P.taux_wk * min_(f7wk, max2) + P.taux_sd * min_(f7sd, max3) + P.taux_wg * min_(f7wg, max4) + P.taux_sc * min_(f7sc, max5) + P.taux_wh * min_(f7wh, max6) + P.taux_sb * min_(f7sb, max7) + P.taux_wq * min_(f7wq, max8)) @dated_function(start = date(2010, 1, 1), stop = date(2011, 12, 31)) def function_20100101_20111231(self, simulation, period): ''' Crédits d’impôt pour dépenses en faveur de la qualité environnementale (cases 7WF, 7WH, 7WK, 7WQ, 7SB, 7SD, 7SE et 7SH) 2010-2011 ''' period = period.start.offset('first-of', 'year').period('year') marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) f7we = simulation.calculate('f7we', period) f7wf = simulation.calculate('f7wf', period) f7wg = simulation.calculate('f7wg', period) f7wh = simulation.calculate('f7wh', period) f7wk = simulation.calculate('f7wk', period) f7wq = simulation.calculate('f7wq', period) f7sb = simulation.calculate('f7sb', period) f7sd = simulation.calculate('f7sd', period) f7se = simulation.calculate('f7se', period) f7sh = simulation.calculate('f7sh', period) rfr = simulation.calculate('rfr', period) _P = simulation.legislation_at(period.start) P = _P.ir.credits_impot.quaenv max0 = P.max * (1 + marpac) + P.pac1 * nb_pac2 max1 = max_(0, max0 - f7wf) max2 = max_(0, max1 - f7se) max3 = max_(0, max2 - f7wk) max4 = max_(0, max3 - f7sd) max5 = max_(0, max4 - f7wh) max6 = max_(0, max5 - f7sb) max7 = max_(0, max6 - f7wq) return period, not_(f7wg) * or_(not_(f7we), (rfr < 45000)) * ( P.taux_wf * min_(f7wf, max0) + P.taux_se * min_(f7se, max1) + P.taux_wk * min_(f7wk, max2) + P.taux_sd * min_(f7sd, max3) + P.taux_wh * min_(f7wh, max4) + P.taux_sb * min_(f7sb, max5) + P.taux_wq * min_(f7wq, max6) + P.taux_sh * min_(f7sh, max7)) @dated_function(start = date(2012, 1, 1), stop = date(2012, 12, 31)) def function_20120101_20121231(self, simulation, period): ''' Crédits d’impôt pour dépenses en faveur de la qualité environnementale 2012 ''' period = period.start.offset('first-of', 'year').period('year') f7sd = simulation.calculate('f7sd', period) f7se = simulation.calculate('f7se', period) f7sf = simulation.calculate('f7sf', period) f7sg = simulation.calculate('f7sg', period) f7sh = simulation.calculate('f7sh', period) f7si = simulation.calculate('f7si', period) f7sj = simulation.calculate('f7sj', period) f7sk = simulation.calculate('f7sk', period) f7sl = simulation.calculate('f7sl', period) f7sm = simulation.calculate('f7sm', period) f7sn = simulation.calculate('f7sn', period) f7so = simulation.calculate('f7so', period) f7sp = simulation.calculate('f7sp', period) f7sq = simulation.calculate('f7sq', period) f7sr = simulation.calculate('f7sr', period) f7ss = simulation.calculate('f7ss', period) f7tt = simulation.calculate('f7tt', period) f7tu = simulation.calculate('f7tu', period) f7tv = simulation.calculate('f7tv', period) f7tw = simulation.calculate('f7tw', period) f7tx = simulation.calculate('f7tx', period) f7ty = simulation.calculate('f7ty', period) f7st = simulation.calculate('f7st', period) f7su = simulation.calculate('f7su', period) f7sv = simulation.calculate('f7sv', period) f7sw = simulation.calculate('f7sw', period) f7sz = simulation.calculate('f7sz', period) f7wc = simulation.calculate('f7wc', period) f7we = simulation.calculate('f7we', period) f7wg = simulation.calculate('f7wg', period) f7wh = simulation.calculate('f7wh', period) f7wk = simulation.calculate('f7wk', period) marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) quaenv_bouquet = simulation.calculate('quaenv_bouquet', period) rfr = simulation.calculate('rfr', period) P = simulation.legislation_at(period.start).ir.credits_impot.quaenv max0 = P.max * (1 + marpac) + P.pac1 * nb_pac2 maxi1 = max_(0, max0 - f7ty) maxi2 = max_(0, maxi1 - f7tx) maxi3 = max_(0, maxi2 - f7tw) maxi4 = max_(0, maxi3 - f7tv) maxi5 = max_(0, maxi4 - f7tu) collectif = (P.taux_ty * min_(f7ty, max0) + P.taux_tx * min_(f7tx, maxi1) + P.taux_tw * min_(f7tw, maxi2) + P.taux_tv * min_(f7tv, maxi3) + P.taux_tu * min_(f7tu, maxi4) + P.taux_tt * min_(f7tt, maxi5)) max1 = max_(0, max0 - quaenv_bouquet * (f7ss + f7st) - not_(quaenv_bouquet) * (f7ss + f7st + f7sv)) max2 = max_(0, max1 - quaenv_bouquet * (f7sn + f7sr + f7sq) - not_(quaenv_bouquet) * (f7sn + f7sq + f7sr)) max3 = max_(0, max2 - quaenv_bouquet * (f7sv) - not_(quaenv_bouquet) * (f7se)) max4 = (max_(0, max3 - quaenv_bouquet * (f7se) - not_(quaenv_bouquet) * (f7sf + f7sg + f7sh + f7si + f7so + f7su + f7sw + f7sp))) max5 = max_(0, max4 - quaenv_bouquet * (f7sg + f7sh + f7so + f7sp) - not_(quaenv_bouquet) * (f7sm)) max6 = max_(0, max5 - quaenv_bouquet * (f7sd + f7sj)) max7 = max_(0, max6 - quaenv_bouquet * (f7sf + f7si + f7su + f7sw)) max8 = max_(0, max7 - quaenv_bouquet * (f7sm)) montant = (quaenv_bouquet * ( min_(max8, P.taux10 * (f7sk + f7sl)) + min_(max7, P.taux11 * f7sm) + min_(max6, P.taux15 * (f7sf + f7si + f7su + f7sw)) + min_(max5, P.taux18 * (f7sd + f7sj)) + min_(max4, P.taux23 * (f7sg + f7sh + f7so + f7sp)) + min_(max3, P.taux26 * f7se) + min_(max2, P.taux32 * f7sv) + min_(max1, P.taux34 * (f7sn + f7sr + f7sq)) + min_(max0, P.taux40 * (f7ss + f7st))) + (not_(quaenv_bouquet) * ( min_(max0, P.taux32 * (f7ss + f7st + f7sv)) + min_(max1, P.taux26 * (f7sn + f7sq + f7sr)) + min_(max2, P.taux17 * f7se) + min_(max3, P.taux15 * (f7sf + f7sg + f7sh + f7si + f7so + f7su + f7sw + f7sp)) + min_(max4, P.taux11 * f7sm) + min_(max5, P.taux10 * (f7sd + f7wk * (f7sj + f7sk + f7sl)))) )) return period, not_(f7wg) * or_(not_(f7we), (rfr < 30000)) * (montant + collectif) + f7sz @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): ''' Crédits d’impôt pour dépenses en faveur de la qualité environnementale 2013 ''' period = period.start.offset('first-of', 'year').period('year') f7sd = simulation.calculate('f7sd', period) f7se = simulation.calculate('f7se', period) f7sf = simulation.calculate('f7sf', period) f7sg = simulation.calculate('f7sg', period) f7sh = simulation.calculate('f7sh', period) f7si = simulation.calculate('f7si', period) f7sj = simulation.calculate('f7sj', period) f7sk = simulation.calculate('f7sk', period) f7sl = simulation.calculate('f7sl', period) f7sm = simulation.calculate('f7sm', period) f7sn = simulation.calculate('f7sn', period) f7so = simulation.calculate('f7so', period) f7sp = simulation.calculate('f7sp', period) f7sq = simulation.calculate('f7sq', period) f7sr = simulation.calculate('f7sr', period) f7ss = simulation.calculate('f7ss', period) f7st = simulation.calculate('f7st', period) f7su = simulation.calculate('f7su', period) f7sv = simulation.calculate('f7sv', period) f7sw = simulation.calculate('f7sw', period) f7sz = simulation.calculate('f7sz', period) f7wc = simulation.calculate('f7wc', period) f7we = simulation.calculate('f7we', period) f7wg = simulation.calculate('f7wg', period) f7wh = simulation.calculate('f7wh', period) f7wk = simulation.calculate('f7wk', period) marpac = simulation.calculate('marpac', period) nb_pac2 = simulation.calculate('nb_pac2', period) quaenv_bouquet = simulation.calculate('quaenv_bouquet', period) rfr = simulation.calculate('rfr', period) P = simulation.legislation_at(period.start).ir.credits_impot.quaenv max0 = P.max * (1 + marpac) + P.pac1 * nb_pac2 max1 = max_(0, max0 - quaenv_bouquet * (f7ss + f7st) - not_(quaenv_bouquet) * (f7ss + f7st + f7sv)) max2 = max_(0, max1 - quaenv_bouquet * (f7sn + f7sr + f7sq) - not_(quaenv_bouquet) * (f7sn + f7sq + f7sr)) max3 = max_(0, max2 - quaenv_bouquet * (f7sv) - not_(quaenv_bouquet) * (f7se)) max4 = (max_(0, max3 - quaenv_bouquet * (f7se) - not_(quaenv_bouquet) * (f7sf + f7sg + f7sh + f7si + f7so + f7su + f7sw + f7sp))) max5 = max_(0, max4 - quaenv_bouquet * (f7sg + f7sh + f7so + f7sp) - not_(quaenv_bouquet) * (f7sm)) max6 = max_(0, max5 - quaenv_bouquet * (f7sd + f7sj)) max7 = max_(0, max6 - quaenv_bouquet * (f7sf + f7si + f7su + f7sw)) max8 = max_(0, max7 - quaenv_bouquet * (f7sm)) montant = (quaenv_bouquet * ( min_(max8, P.taux10 * (f7sk + f7sl)) + min_(max7, P.taux11 * f7sm) + min_(max6, P.taux15 * (f7sf + f7si + f7su + f7sw)) + min_(max5, P.taux18 * (f7sd + f7sj)) + min_(max4, P.taux23 * (f7sg + f7sh + f7so + f7sp)) + min_(max3, P.taux26 * f7se) + min_(max2, P.taux32 * f7sv) + min_(max1, P.taux34 * (f7sn + f7sr + f7sq)) + min_(max0, P.taux40 * (f7ss + f7st))) + (not_(quaenv_bouquet) * ( min_(max0, P.taux32 * (f7ss + f7st + f7sv)) + min_(max1, P.taux26 * (f7sn + f7sq + f7sr)) + min_(max2, P.taux17 * f7se) + min_(max3, P.taux15 * (f7sf + f7sg + f7sh + f7si + f7so + f7su + f7sw + f7sp)) + min_(max4, P.taux11 * f7sm) + min_(max5, P.taux10 * (f7sd + f7wk * (f7sj + f7sk + f7sl)))) )) return period, or_(not_(or_(f7we, f7wg)), (rfr < 30000)) * montant + f7sz @reference_formula class quaenv_bouquet(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = FoyersFiscaux label = u"quaenv_bouquet" start_date = date(2013, 1, 1) def function(self, simulation, period): ''' Les dépenses de travaux dépendent d'un bouquet de travaux 2013 ''' period = period.start.offset('first-of', 'year').period('year') f7sd = simulation.calculate('f7sd', period) f7se = simulation.calculate('f7se', period) f7sn = simulation.calculate('f7sn', period) f7so = simulation.calculate('f7so', period) f7sp = simulation.calculate('f7sp', period) f7sq = simulation.calculate('f7sq', period) f7sr = simulation.calculate('f7sr', period) f7ss = simulation.calculate('f7ss', period) f7st = simulation.calculate('f7st', period) f7ve = simulation.calculate('f7ve', period) f7vf = simulation.calculate('f7vf', period) f7vg = simulation.calculate('f7vg', period) f7wa = simulation.calculate('f7wa', period) f7wb = simulation.calculate('f7wb', period) f7wc = simulation.calculate('f7wc', period) f7wf = simulation.calculate('f7wf', period) f7wh = simulation.calculate('f7wh', period) f7wq = simulation.calculate('f7wq', period) f7ws = simulation.calculate('f7ws', period) f7wt = simulation.calculate('f7wt', period) t1 = or_(or_(f7wt * f7ws, f7wq), f7wf) t2 = or_(f7wc * f7wb, f7wa) t3 = or_(f7vg * f7vf, f7ve) t4 = or_(f7sn > 0, f7so > 0) t5 = or_(f7sr > 0, f7ss > 0) t6 = or_(or_(or_(f7st > 0, f7sp > 0), or_(f7sq > 0, f7sd > 0)), f7se > 0) bouquet = (t1 + t2 + t3 + t4 + t5 + t6 > 1) return period, or_(bouquet, f7wh) @reference_formula class saldom2(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = FoyersFiscaux label = u"saldom2" @dated_function(start = date(2007, 1, 1), stop = date(2008, 12, 31)) def function_20070101_20081231(self, simulation, period): ''' Crédit d’impôt emploi d’un salarié à domicile (cases 7DB, 7DG) 2007-2008 ''' period = period.start.offset('first-of', 'year').period('year') nb_pac2 = simulation.calculate('nb_pac2', period) f7db = simulation.calculate('f7db', period) f7dg = simulation.calculate('f7dg', period) f7dl = simulation.calculate('f7dl', period) _P = simulation.legislation_at(period.start) P = _P.ir.reductions_impots.saldom isinvalid = f7dg nbpacmin = nb_pac2 + f7dl maxBase = P.max1 maxDuMaxNonInv = P.max2 maxNonInv = min_(maxBase + P.pac * nbpacmin, maxDuMaxNonInv) maxEffectif = maxNonInv * not_(isinvalid) + P.max3 * isinvalid return period, P.taux * min_(f7db, maxEffectif) @dated_function(start = date(2009, 1, 1), stop = date(2013, 12, 31)) def function_20090101_20131231(self, simulation, period): ''' Crédit d’impôt emploi d’un salarié à domicile (cases 7DB, 7DG) 2009-2010 ''' period = period.start.offset('first-of', 'year').period('year') nb_pac2 = simulation.calculate('nb_pac2', period) f7db = simulation.calculate('f7db', period) f7dg = simulation.calculate('f7dg', period) f7dl = simulation.calculate('f7dl', period) f7dq = simulation.calculate('f7dq', period) _P = simulation.legislation_at(period.start) P = _P.ir.reductions_impots.saldom isinvalid = f7dg annee1 = f7dq nbpacmin = nb_pac2 + f7dl maxBase = P.max1 * not_(annee1) + P.max1_1ereAnnee * annee1 maxDuMaxNonInv = P.max2 * not_(annee1) + P.max2_1ereAnnee * annee1 maxNonInv = min_(maxBase + P.pac * nbpacmin, maxDuMaxNonInv) maxEffectif = maxNonInv * not_(isinvalid) + P.max3 * isinvalid return period, P.taux * min_(f7db, maxEffectif) PKF/openfisca_france/model/consommation/__init__.pyPKF-openfisca_france/model/patrimoine/__init__.pyPKFHopenfisca_france/model/caracteristiques_socio_demographiques/__init__.pyPK'G)CDDHopenfisca_france/model/caracteristiques_socio_demographiques/logement.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from numpy import logical_not as not_, logical_or as or_ from numpy.core.defchararray import startswith from ..base import * # noqa analysis:ignore build_column('coloc', BoolCol(label = u"Vie en colocation")) build_column('depcom', FixedStrCol(label = u"Code INSEE (depcom) du lieu de résidence", entity = 'men', max_length = 5)) build_column('logement_chambre', BoolCol(label = u"Le logement est considéré comme une chambre")) reference_input_variable( column = FloatCol(), entity_class = Menages, label = u"Loyer ou mensualité d'emprunt pour un primo-accédant", name = "loyer", set_input = set_input_divide_by_period, ) reference_input_variable( column = FloatCol(), entity_class = Menages, label = u'Charges locatives', name = 'charges_locatives', set_input = set_input_divide_by_period, ) build_column( 'proprietaire_proche_famille', BoolCol( entity = "fam", label = u"Le propriétaire du logement a un lien de parenté avec la personne de référence ou son conjoint", ), ) reference_input_variable( name = 'statut_occupation', column = EnumCol( enum = Enum([ u"Non renseigné", u"Accédant à la propriété", u"Propriétaire (non accédant) du logement", u"Locataire d'un logement HLM", u"Locataire ou sous-locataire d'un logement loué vide non-HLM", u"Locataire ou sous-locataire d'un logement loué meublé ou d'une chambre d'hôtel", u"Logé gratuitement par des parents, des amis ou l'employeur", u"Locataire d'un foyer (résidence universitaire, maison de retraite, foyer de jeune travailleur, résidence sociale...)", u"Sans domicile stable"]) ), entity_class = Menages, label = u"Statut d'occupation", set_input = set_input_dispatch_by_period, ) @reference_formula class residence_dom(SimpleFormulaColumn): column = BoolCol entity_class = Familles def function(self, simulation, period): residence_guadeloupe = simulation.calculate('residence_guadeloupe', period) residence_martinique = simulation.calculate('residence_martinique', period) residence_guyane = simulation.calculate('residence_guyane', period) residence_reunion = simulation.calculate('residence_reunion', period) residence_mayotte = simulation.calculate('residence_mayotte', period) return period, or_(or_(residence_guadeloupe, residence_martinique), or_(or_(residence_reunion, residence_guyane), residence_mayotte)) @reference_formula class residence_guadeloupe(SimpleFormulaColumn): column = BoolCol entity_class = Familles def function(self, simulation, period): depcom_holder = simulation.compute('depcom', period) depcom = self.cast_from_entity_to_roles(depcom_holder) depcom = self.filter_role(depcom, role = CHEF) return period, startswith(depcom, '971') @reference_formula class residence_martinique(SimpleFormulaColumn): column = BoolCol entity_class = Familles def function(self, simulation, period): depcom_holder = simulation.compute('depcom', period) depcom = self.cast_from_entity_to_roles(depcom_holder) depcom = self.filter_role(depcom, role = CHEF) return period, startswith(depcom, '972') @reference_formula class residence_guyane(SimpleFormulaColumn): column = BoolCol entity_class = Familles def function(self, simulation, period): depcom_holder = simulation.compute('depcom', period) depcom = self.cast_from_entity_to_roles(depcom_holder) depcom = self.filter_role(depcom, role = CHEF) return period, startswith(depcom, '973') @reference_formula class residence_reunion(SimpleFormulaColumn): column = BoolCol entity_class = Familles def function(self, simulation, period): depcom_holder = simulation.compute('depcom', period) depcom = self.cast_from_entity_to_roles(depcom_holder) depcom = self.filter_role(depcom, role = CHEF) return period, startswith(depcom, '974') @reference_formula class residence_mayotte(SimpleFormulaColumn): column = BoolCol entity_class = Familles def function(self, simulation, period): depcom_holder = simulation.compute('depcom', period) depcom = self.cast_from_entity_to_roles(depcom_holder) depcom = self.filter_role(depcom, role = CHEF) return period, startswith(depcom, '976') PK'G?t&t&Kopenfisca_france/model/caracteristiques_socio_demographiques/demographie.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from ..base import * # noqa build_column('idmen', IntCol(is_permanent = True, label = u"Identifiant du ménage")) build_column('idfoy', IntCol(is_permanent = True, label = u"Identifiant du foyer")) build_column('idfam', IntCol(is_permanent = True, label = u"Identifiant de la famille")) build_column('quimen', EnumCol(QUIMEN, is_permanent = True)) build_column('quifoy', EnumCol(QUIFOY, is_permanent = True)) build_column('quifam', EnumCol(QUIFAM, is_permanent = True)) build_column('birth', DateCol(default = date(1970, 1, 1), is_permanent = True, label = u"Date de naissance")) build_column('adoption', BoolCol(entity = "ind", label = u"Enfant adopté")) build_column('alt', BoolCol(label = u'Enfant en garde alternée')) # TODO: cerfa_field build_column('activite', EnumCol(label = u'Activité', enum = Enum([u'Actif occupé', u'Chômeur', u'Étudiant, élève', u'Retraité', u'Autre inactif']), default = 4)) build_column('enceinte', BoolCol(entity = 'ind', label = u"Est enceinte")) build_column('statmarit', EnumCol(label = u"Statut marital", default = 2, enum = Enum([u"Marié", u"Célibataire", u"Divorcé", u"Veuf", u"Pacsé", u"Jeune veuf"], start = 1))) build_column('nbN', PeriodSizeIndependentIntCol(cerfa_field = u'N', entity = 'foy', label = u"Nombre d'enfants mariés/pacsés et d'enfants non mariés chargés de famille")) build_column('nbR', PeriodSizeIndependentIntCol(cerfa_field = u'R', entity = 'foy', label = u"Nombre de titulaires (autres que les enfants) de la carte invalidité d'au moins 80 %")) build_column('caseE', BoolCol(label = u"Situation pouvant donner droit à une demi-part supplémentaire : vous vivez seul au 1er janvier de l'année de perception des revenus et vous avez élevé un enfant pendant moins de 5 ans durant la période où vous viviez seul", entity = 'foy', cerfa_field = u'E', end = date(2012, 12, 31))) build_column('caseF', BoolCol(label = u"Situation pouvant donner droit à une demi-part supplémentaire : conjoint titulaire d'une pension ou d'une carte d'invalidité (vivant ou décédé l'année de perception des revenus)", entity = 'foy', cerfa_field = u'F')) build_column('caseG', BoolCol(label = u"Titulaire d'une pension de veuve de guerre", entity = 'foy', cerfa_field = u'G')) # attention, ne pas confondre caseG et nbG qui se rapportent toutes les 2 à une "case" G, l'une étant une vraie case que l'on remplt et l'autre une case que l'on coche build_column('caseH', PeriodSizeIndependentIntCol(label = u"Année de naissance des enfants à charge en garde alternée", entity = 'foy', cerfa_field = u'H')) # il ne s'agit pas à proprement parlé de la case H, les cases permettant d'indiquer l'année de naissance # se rapportent bien à nbH mais ne sont pas nommées, choisissons nous de laisser cerfa_field = u'H' pour caseH ? # De plus les caseH peuvent être multiples puisqu'il peut y avoir plusieurs enfants? donc faut-il les nommer caseH1, caseH2...caseH6 (les 6 présentes dans la déclaration) ? # il faut aussi créer les cases F, G, R et I qui donnent également les années de naissances des PAC build_column('caseK', BoolCol(label = u"Situation pouvant donner droit à une demi-part supplémentaire: vous avez eu un enfant décédé après l’âge de 16 ans ou par suite de faits de guerre", entity = 'foy', cerfa_field = u'K', end = date(2011, 12, 31))) build_column('caseL', BoolCol(label = u"Situation pouvant donner droit à une demi-part supplémentaire: vous vivez seul au 1er janvier de l'année de perception des revenus et vous avez élevé un enfant pendant au moins 5 ans durant la période où vous viviez seul", entity = 'foy', cerfa_field = u'L')) build_column('caseN', BoolCol(label = u"Vous ne viviez pas seul au 1er janvier de l'année de perception des revenus", entity = 'foy', cerfa_field = u'N')) build_column('caseP', BoolCol(label = u"Titulaire d'une pension pour une invalidité d'au moins 40 % ou d'une carte d'invalidité d'au moins 80%", entity = 'foy', cerfa_field = u'P')) build_column('caseS', BoolCol(label = u"Vous êtes mariés/pacsés et l'un des deux déclarants âgé de plus de 75 ans est titulaire de la carte du combattant ou d'une pension militaire d'invalidité ou de victime de guerre", entity = 'foy', cerfa_field = u'S')) build_column('caseT', BoolCol(label = u"Vous êtes parent isolé au 1er janvier de l'année de perception des revenus", entity = 'foy', cerfa_field = u'T')) build_column('caseW', BoolCol(label = u"Vous ou votre conjoint (même s'il est décédé), âgés de plus de 75 ans, êtes titulaire de la carte du combattant ou d'une pension militaire d'invalidité ou de victime de guerre", entity = 'foy', cerfa_field = u'W')) # pour inv, il faut que tu regardes si tu es d'accord et si c'est bien la bonne case, # la case P exsite déjà plus bas ligne 339 sous le nom caseP build_column('invalide', BoolCol(label = u'Invalide')) # TODO: cerfa_field @reference_formula class nb_par(SimpleFormulaColumn): column = PeriodSizeIndependentIntCol(default = 0) entity_class = Familles label = u"Nombre d'adultes (parents) dans la famille" def function(self, simulation, period): # Note : Cette variable est "instantanée" : quelque soit la période demandée, elle retourne la valeur au premier # jour, sans changer la période. quifam_holder = simulation.compute('quifam', period) quifam = self.filter_role(quifam_holder, role = PART) return period, 1 + 1 * (quifam == PART) @reference_formula class maries(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = Familles label = u"maries" def function(self, simulation, period): """couple = 1 si couple marié sinon 0 TODO: faire un choix avec couple ?""" # Note : Cette variable est "instantanée" : quelque soit la période demandée, elle retourne la valeur au premier # jour, sans changer la période. statmarit_holder = simulation.compute('statmarit', period) statmarit = self.filter_role(statmarit_holder, role = CHEF) return period, statmarit == 1 @reference_formula class concub(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = Familles label = u"Indicatrice de vie en couple" def function(self, simulation, period): ''' concub = 1 si vie en couple TODO: pas très heureux ''' # Note : Cette variable est "instantanée" : quelque soit la période demandée, elle retourne la valeur au premier # jour, sans changer la période. nb_par = simulation.calculate('nb_par', period) # TODO: concub n'est pas égal à 1 pour les conjoints return period, nb_par == 2 @reference_formula class isol(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = Familles label = u"Parent (s'il y a lieu) isolé" def function(self, simulation, period): # Note : Cette variable est "instantanée" : quelque soit la période demandée, elle retourne la valeur au premier # jour, sans changer la période. nb_par = simulation.calculate('nb_par', period) return period, nb_par == 1 @reference_formula class est_enfant_dans_famille(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"Indique qe l'individu est un enfant dans une famille" def function(self, simulation, period): quifam = simulation.calculate('quifam', period) return period, quifam > PART @reference_formula class etu(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = Individus label = u"Indicatrice individuelle étudiant" def function(self, simulation, period): # Note : Cette variable est "instantanée" : quelque soit la période demandée, elle retourne la valeur au premier # jour, sans changer la période. activite = simulation.calculate('activite', period) return period, activite == 2 reference_input_variable( name = "rempli_obligation_scolaire", column = BoolCol(default = True), entity_class = Individus, label = u"Rempli l'obligation scolaire", ) PKF.openfisca_france/model/prestations/__init__.pyPK'GxNn/openfisca_france/model/prestations/education.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import zeros, logical_not as not_, logical_or as or_ from ..base import * # noqa analysis:ignore SCOLARITE_INCONNUE = 0 SCOLARITE_COLLEGE = 1 SCOLARITE_LYCEE = 2 @reference_formula class bourse_college(SimpleFormulaColumn): column = FloatCol label = u"Montant mensuel de la bourse de collège" entity_class = Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') rfr = simulation.calculate('rfr', period.start.offset('first-of', 'year').period('year').offset(-2)) age_holder = simulation.compute('age', period) scolarite_holder = simulation.compute('scolarite', period) P = simulation.legislation_at(period.start).bourses_education.bourse_college ages = self.split_by_roles(age_holder, roles = ENFS) nb_enfants = zeros(len(rfr)) for age in ages.itervalues(): nb_enfants += age >= 0 plafond_taux_1 = P.plafond_taux_1 + P.plafond_taux_1 * nb_enfants * P.coeff_enfant_supplementaire plafond_taux_2 = P.plafond_taux_2 + P.plafond_taux_2 * nb_enfants * P.coeff_enfant_supplementaire plafond_taux_3 = P.plafond_taux_3 + P.plafond_taux_3 * nb_enfants * P.coeff_enfant_supplementaire eligible_taux_3 = rfr < plafond_taux_3 eligible_taux_2 = not_(eligible_taux_3) * (rfr < plafond_taux_2) eligible_taux_1 = not_(or_(eligible_taux_2, eligible_taux_3)) * (rfr < plafond_taux_1) scolarites = self.split_by_roles(scolarite_holder, roles = ENFS) nb_enfants_college = zeros(len(rfr)) for scolarite in scolarites.itervalues(): nb_enfants_college += scolarite == SCOLARITE_COLLEGE montant = nb_enfants_college * ( eligible_taux_3 * P.montant_taux_3 + eligible_taux_2 * P.montant_taux_2 + eligible_taux_1 * P.montant_taux_1 ) return period, montant / 12 @reference_formula class bourse_lycee_points_de_charge(SimpleFormulaColumn): column = FloatCol label = u"Nombre de points de charge pour la bourse de lycée" entity_class = Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age_holder = simulation.compute('age', period) isol = simulation.calculate('isol', period) # compte le nombre d'enfants ages = self.split_by_roles(age_holder, roles = ENFS) nb_enfants = zeros(len(isol)) for age in ages.itervalues(): nb_enfants += age >= 0 points_de_charge = 11 * (nb_enfants >= 1) points_de_charge += 1 * (nb_enfants >= 2) # 1 point de charge pour le 2ème enfant points_de_charge += 2 * (nb_enfants >= 3) + 2 * (nb_enfants >= 4) # 2 points de charge pour les 3ème et 4ème enfants points_de_charge += 3 * (nb_enfants >= 5) * (nb_enfants - 4) # 3 points de charge pour chaque enfant au-dessus de 4 enfants points_de_charge += 3 * isol # 3 points de charge en plus si parent isolé return period, points_de_charge @reference_formula class bourse_lycee_nombre_parts(SimpleFormulaColumn): column = FloatCol label = u"Nombre de parts pour le calcul du montant de la bourse de lycée" entity_class = Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') points_de_charge = simulation.calculate('bourse_lycee_points_de_charge', period) rfr = simulation.calculate('rfr', period.start.offset('first-of', 'year').period('year').offset(-2)) plafonds_reference = simulation.legislation_at(period.start).bourses_education.bourse_lycee.plafonds_reference increments_par_point_de_charge = simulation.legislation_at(period.start).bourses_education.bourse_lycee.increments_par_point_de_charge plafond_10_parts = round(plafonds_reference['10_parts'] + ((points_de_charge - 9) * increments_par_point_de_charge['10_parts'])) plafond_9_parts = round(plafonds_reference['9_parts'] + ((points_de_charge - 9) * increments_par_point_de_charge['9_parts'])) plafond_8_parts = round(plafonds_reference['8_parts'] + ((points_de_charge - 9) * increments_par_point_de_charge['8_parts'])) plafond_7_parts = round(plafonds_reference['7_parts'] + ((points_de_charge - 9) * increments_par_point_de_charge['7_parts'])) plafond_6_parts = round(plafonds_reference['6_parts'] + ((points_de_charge - 9) * increments_par_point_de_charge['6_parts'])) plafond_5_parts = round(plafonds_reference['5_parts'] + ((points_de_charge - 9) * increments_par_point_de_charge['5_parts'])) plafond_4_parts = round(plafonds_reference['4_parts'] + ((points_de_charge - 9) * increments_par_point_de_charge['4_parts'])) plafond_3_parts = round(plafonds_reference['3_parts'] + ((points_de_charge - 9) * increments_par_point_de_charge['3_parts'])) nombre_parts = zeros(len(rfr)) nombre_parts = ((rfr <= plafond_10_parts) * 10 + (rfr > plafond_10_parts) * (rfr <= plafond_9_parts) * 9 + (rfr > plafond_9_parts) * (rfr <= plafond_8_parts) * 8 + (rfr > plafond_8_parts) * (rfr <= plafond_7_parts) * 7 + (rfr > plafond_7_parts) * (rfr <= plafond_6_parts) * 6 + (rfr > plafond_6_parts) * (rfr <= plafond_5_parts) * 5 + (rfr > plafond_5_parts) * (rfr <= plafond_4_parts) * 4 + (rfr > plafond_4_parts) * (rfr <= plafond_3_parts) * 3) return period, nombre_parts @reference_formula class bourse_lycee(SimpleFormulaColumn): column = FloatCol label = u"Montant mensuel de la bourse de lycée" entity_class = Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') nombre_parts = simulation.calculate('bourse_lycee_nombre_parts', period) scolarite_holder = simulation.compute('scolarite', period) valeur_part = simulation.legislation_at(period.start).bourses_education.bourse_lycee.valeur_part scolarites = self.split_by_roles(scolarite_holder, roles = ENFS) nb_enfants_lycee = zeros(len(nombre_parts)) for scolarite in scolarites.itervalues(): nb_enfants_lycee += scolarite == SCOLARITE_LYCEE montant = nombre_parts * valeur_part * nb_enfants_lycee return period, montant / 12 reference_input_variable( column = EnumCol( enum = Enum( [ u"Inconnue", u"Collège", u"Lycée" ], ), default = 0 ), entity_class = Individus, label = u"Scolarité de l'enfant : collège, lycée...", name = "scolarite", ) reference_input_variable( column = BoolCol, entity_class = Individus, label = u"Élève ou étudiant boursier", name = 'boursier', ) PK'G xoff4openfisca_france/model/prestations/aides_logement.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import csv import json import logging import pkg_resources from numpy import (ceil, fromiter, int16, logical_not as not_, logical_or as or_, logical_and as and_, maximum as max_, minimum as min_, round) import openfisca_france from ..base import * # noqa analysis:ignore from .prestations_familiales.base_ressource import nb_enf log = logging.getLogger(__name__) zone_apl_by_depcom = None @reference_formula class al_pac(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Nombre de personne à charge au sens des allocations logement" def function(self, simulation, period): ''' site de la CAF en 2011: # Enfant à charge Vous assurez financièrement l'entretien et asez la responsabilité affective et éducative d'un enfant, que vous ayez ou non un lien de parenté avec lui. Il est reconnu à votre charge pour le versement des aides au logement jusqu'au mois précédent ses 21 ans. Attention, s'il travaille, il doit gagner moins de 836,55 € par mois. # Parents âgés ou infirmes Sont à votre charge s'ils vivent avec vous et si leurs revenus 2009 ne dépassent pas 10 386,59 € : * vos parents ou grand-parents âgés de plus de 65 ans ou d'au moins 60 ans, inaptes au travail, anciens déportés, * vos proches parents infirmes âgés de 22 ans ou plus (parents, grand-parents, enfants, petits enfants, frères, soeurs, oncles, tantes, neveux, nièces). ''' period = period.start.offset('first-of', 'month').period('month') age_holder = simulation.compute('age', period) smic55_holder = simulation.compute('smic55', period) nbR_holder = simulation.compute('nbR', period.start.offset('first-of', 'year').period('year')) D_enfch = simulation.legislation_at(period.start).al.autres.D_enfch af = simulation.legislation_at(period.start).fam.af cf = simulation.legislation_at(period.start).fam.cf age = self.split_by_roles(age_holder, roles = ENFS) smic55 = self.split_by_roles(smic55_holder, roles = ENFS) # P_AL.D_enfch est une dummy qui vaut 1 si les enfants sont comptés à # charge (cas actuel) et zéro sinon. nbR = self.cast_from_entity_to_role(nbR_holder, role = VOUS) al_nbinv = self.sum_by_entity(nbR) age1 = af.age1 age2 = cf.age2 al_nbenf = nb_enf(age, smic55, age1, age2) al_pac = D_enfch * (al_nbenf + al_nbinv) # TODO: manque invalides # TODO: il faudrait probablement définir les aides au logement pour un ménage et non # pour une famille return period, al_pac @reference_formula class aide_logement_base_ressources_eval_forfaitaire(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Base ressources en évaluation forfaitaire des aides au logement (R351-7 du CCH)" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') salaire_imposable_holder = simulation.compute('salaire_imposable', period.offset(-1)) salaire_imposable = self.sum_by_entity(salaire_imposable_holder, roles = [CHEF, PART]) # Application de l'abattement pour frais professionnels params_abattement = simulation.legislation_at(period.start).ir.tspr.abatpro somme_salaires_mois_precedent = 12 * salaire_imposable montant_abattement = round( min_( max_(params_abattement.taux * somme_salaires_mois_precedent, params_abattement.min), params_abattement.max ) ) result = max_(0, somme_salaires_mois_precedent - montant_abattement) return period, result @reference_formula class aide_logement_abattement_chomage_indemnise(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Montant de l'abattement pour personnes au chômage indemnisé (R351-13 du CCH)" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') two_years_ago = period.start.offset('first-of', 'year').period('year').offset(-2) chomage_net_m_1 = simulation.calculate('chonet', period.offset(-1)) chomage_net_m_2 = simulation.calculate('chonet', period.offset(-2)) revenus_activite_pro = simulation.calculate('salaire_imposable', two_years_ago) taux_abattement = simulation.legislation_at(period.start).al.ressources.abattement_chomage_indemnise abattement = and_(chomage_net_m_1 > 0, chomage_net_m_2 > 0) * taux_abattement * revenus_activite_pro params_abattement_frais_pro = simulation.legislation_at(period.start).ir.tspr.abatpro abattement = round((1 - params_abattement_frais_pro.taux) * abattement) return period, abattement @reference_formula class aide_logement_base_ressources_defaut(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Base ressource par défaut des allocations logement" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') two_years_ago = period.start.offset('first-of', 'year').period('year').offset(-2) br_pf_i_holder = simulation.compute('br_pf_i', period) rev_coll_holder = simulation.compute('rev_coll', two_years_ago) rev_coll = self.sum_by_entity(rev_coll_holder) biact = simulation.calculate('biact', period) Pr = simulation.legislation_at(period.start).al.ressources br_pf_i = self.split_by_roles(br_pf_i_holder, roles = [CHEF, PART]) abattement_chomage_indemnise_holder = simulation.compute('aide_logement_abattement_chomage_indemnise', period) abattement_chomage_indemnise = self.sum_by_entity(abattement_chomage_indemnise_holder, roles = [CHEF, PART]) ressources = br_pf_i[CHEF] + br_pf_i[PART] + rev_coll - abattement_chomage_indemnise # Abattement forfaitaire pour double activité abattement_double_activite = biact * Pr.dar_1 # Arrondi aux 100 euros supérieurs result = max_(ressources - abattement_double_activite, 0) return period, result @reference_formula class aide_logement_base_ressources(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Base ressources des allocations logement" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') mois_precedent = period.offset(-1) last_day_reference_year = period.start.offset('first-of', 'year').period('year').offset(-2).stop base_ressources_defaut = simulation.calculate('aide_logement_base_ressources_defaut', period) base_ressources_eval_forfaitaire = simulation.calculate( 'aide_logement_base_ressources_eval_forfaitaire', period) concub = simulation.calculate('concub', period) aah_holder = simulation.compute('aah', mois_precedent) aah = self.sum_by_entity(aah_holder, roles = [CHEF, PART]) age_holder = simulation.compute('age', period) age = self.split_by_roles(age_holder, roles = [CHEF, PART]) smic_horaire_brut_n2 = simulation.legislation_at(last_day_reference_year).cotsoc.gen.smic_h_b salaire_imposable_holder = simulation.compute('salaire_imposable', period.offset(-1)) somme_salaires = self.sum_by_entity(salaire_imposable_holder, roles = [CHEF, PART]) plafond_eval_forfaitaire = 1015 * smic_horaire_brut_n2 plafond_salaire_jeune_isole = simulation.legislation_at(period.start).al.ressources.dar_8 plafond_salaire_jeune_couple = simulation.legislation_at(period.start).al.ressources.dar_9 plafond_salaire_jeune = not_(concub) * plafond_salaire_jeune_isole + concub * plafond_salaire_jeune_couple neutral_jeune = or_(age[CHEF] < 25, and_(concub, age[PART] < 25)) neutral_jeune &= somme_salaires < plafond_salaire_jeune eval_forfaitaire = base_ressources_defaut <= plafond_eval_forfaitaire eval_forfaitaire &= base_ressources_eval_forfaitaire > 0 eval_forfaitaire &= aah == 0 eval_forfaitaire &= not_(neutral_jeune) ressources = ( base_ressources_eval_forfaitaire * eval_forfaitaire + base_ressources_defaut * not_(eval_forfaitaire) ) # Planchers de ressources pour étudiants # Seul le statut étudiant (et boursier) du demandeur importe, pas celui du conjoint Pr = simulation.legislation_at(period.start).al.ressources etu_holder = simulation.compute('etu', period) boursier_holder = simulation.compute('boursier', period) etudiant = self.split_by_roles(etu_holder, roles = [CHEF, PART]) boursier = self.split_by_roles(boursier_holder, roles = [CHEF, PART]) montant_plancher_ressources = max_(0, etudiant[CHEF] * Pr.dar_4 - boursier[CHEF] * Pr.dar_5) ressources = max_(ressources, montant_plancher_ressources) # Arrondi aux 100 euros supérieurs ressources = ceil(ressources / 100) * 100 return period, ressources @reference_formula class aide_logement_montant_brut(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Formule des aides aux logements en secteur locatif en montant brut avant CRDS" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') concub = simulation.calculate('concub', period) aide_logement_base_ressources = simulation.calculate('aide_logement_base_ressources', period) statut_occupation_holder = simulation.compute('statut_occupation', period) loyer_holder = simulation.compute('loyer', period) coloc_holder = simulation.compute('coloc', period) logement_chambre_holder = simulation.compute('logement_chambre', period) al_pac = simulation.calculate('al_pac', period) enceinte_fam = simulation.calculate('enceinte_fam', period) zone_apl_famille = simulation.calculate('zone_apl_famille', period) nat_imp_holder = simulation.compute('nat_imp', period.start.period(u'year').offset('first-of')) al = simulation.legislation_at(period.start).al pfam_n_2 = simulation.legislation_at(period.start.offset(-2, 'year')).fam # le barème "couple" est utilisé pour les femmes enceintes isolées couple = or_(concub, enceinte_fam) personne_seule = not_(couple) statut_occupation = self.cast_from_entity_to_roles(statut_occupation_holder) statut_occupation = self.filter_role(statut_occupation, role = CHEF) loyer = self.cast_from_entity_to_roles(loyer_holder) loyer = self.filter_role(loyer, role = CHEF) zone_apl = zone_apl_famille # Variables individuelles coloc = self.any_by_roles(coloc_holder) chambre = self.any_by_roles(logement_chambre_holder) # Variables du foyer fiscal nat_imp = self.cast_from_entity_to_roles(nat_imp_holder) nat_imp = self.any_by_roles(nat_imp) # ne prend pas en compte les chambres ni les logements-foyers. # variables nécéssaires dans FA # al_pac : nb de personne à charge du ménage prise en compte pour les AL # zone_apl # loyer # coloc (1 si colocation, 0 sinon) # statut_occupation : statut d'occupation du logement # Voir statut_occupation dans model/caracteristiques_socio_demographiques/logement.py loca = ((3 <= statut_occupation) & (5 >= statut_occupation)) | (statut_occupation == 7) acce = statut_occupation == 1 # # aides au logement pour les locataires # loyer mensuel, multiplié par 2/3 pour les meublés L1 = round((statut_occupation == 5) * loyer * 2 / 3 + (statut_occupation != 5) * loyer, 2) # taux à appliquer sur le loyer plafond taux_loyer_plafond = (and_(not_(coloc), not_(chambre)) * 1 + chambre * al.loyers_plafond.chambre + not_(chambre) * coloc * al.loyers_plafond.colocation) loyer_plafond_personne_seule = or_(personne_seule * (al_pac == 0), chambre) loyer_plafond_famille = not_(loyer_plafond_personne_seule) * (al_pac > 0) loyer_plafond_couple = and_(not_(loyer_plafond_famille), not_(loyer_plafond_personne_seule)) z1 = al.loyers_plafond.zone1 z2 = al.loyers_plafond.zone2 z3 = al.loyers_plafond.zone3 Lz1 = ( loyer_plafond_personne_seule * z1.L1 + loyer_plafond_couple * z1.L2 + loyer_plafond_famille * (z1.L3 + (al_pac > 1) * (al_pac - 1) * z1.L4) ) Lz2 = ( loyer_plafond_personne_seule * z2.L1 + loyer_plafond_couple * z2.L2 + loyer_plafond_famille * (z2.L3 + (al_pac > 1) * (al_pac - 1) * z2.L4) ) Lz3 = ( loyer_plafond_personne_seule * z3.L1 + loyer_plafond_couple * z3.L2 + loyer_plafond_famille * (z3.L3 + (al_pac > 1) * (al_pac - 1) * z3.L4) ) L2 = Lz1 * (zone_apl == 1) + Lz2 * (zone_apl == 2) + Lz3 * (zone_apl == 3) L2 = round(L2 * taux_loyer_plafond, 2) # loyer retenu L = min_(L1, L2) # forfait de charges P_fc = al.forfait_charges C = ( not_(coloc) * (P_fc.fc1 + al_pac * P_fc.fc2) + coloc * ((personne_seule * 0.5 + couple) * P_fc.fc1 + al_pac * P_fc.fc2) ) # dépense éligible E = L + C # ressources prises en compte R = aide_logement_base_ressources # Plafond RO rmi = al.rmi R1 = ( al.R1.taux1 * rmi * personne_seule * (al_pac == 0) + al.R1.taux2 * rmi * couple * (al_pac == 0) + al.R1.taux3 * rmi * (al_pac == 1) + al.R1.taux4 * rmi * (al_pac >= 2) + al.R1.taux5 * rmi * (al_pac > 2) * (al_pac - 2) ) bmaf = pfam_n_2.af.bmaf R2 = ( al.R2.taux4 * bmaf * (al_pac >= 2) + al.R2.taux5 * bmaf * (al_pac > 2) * (al_pac - 2) ) Ro = round(12 * (R1 - R2) * (1 - al.autres.abat_sal)) Rp = max_(0, R - Ro) # Participation personnelle Po = max_(al.pp.taux * E, al.pp.min) # Taux de famille TF = ( al.TF.taux1 * (personne_seule) * (al_pac == 0) + al.TF.taux2 * (couple) * (al_pac == 0) + al.TF.taux3 * (al_pac == 1) + al.TF.taux4 * (al_pac == 2) + al.TF.taux5 * (al_pac == 3) + al.TF.taux6 * (al_pac >= 4) + al.TF.taux7 * (al_pac > 4) * (al_pac - 4) ) # Loyer de référence L_Ref = ( z2.L1 * (personne_seule) * (al_pac == 0) + z2.L2 * (couple) * (al_pac == 0) + z2.L3 * (al_pac >= 1) + z2.L4 * (al_pac > 1) * (al_pac - 1) ) RL = L / L_Ref # TODO: paramètres en dur ?? TL = max_(max_(0, al.TL.taux2 * (RL - 0.45)), al.TL.taux3 * (RL - 0.75) + al.TL.taux2 * (0.75 - 0.45)) Tp = TF + TL PP = Po + Tp * Rp al_loc = max_(0, E - PP) * loca al_loc = al_loc * (al_loc >= al.autres.nv_seuil) # # TODO: APL pour les accédants à la propriété al_acc = 0 * acce # # APL (tous) al = al_loc + al_acc return period, al @reference_formula class aide_logement_montant(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Montant des aides au logement net de CRDS" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') aide_logement_montant_brut = simulation.calculate('aide_logement_montant_brut', period) crds_logement = simulation.calculate('crds_logement', period) montant = round(aide_logement_montant_brut + crds_logement, 2) return period, montant @reference_formula class alf(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol entity_class = Familles label = u"Allocation logement familiale" url = u"http://vosdroits.service-public.fr/particuliers/F13132.xhtml" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') aide_logement_montant = simulation.calculate('aide_logement_montant', period) al_pac = simulation.calculate('al_pac', period) statut_occupation_famille = simulation.calculate('statut_occupation_famille', period) proprietaire_proche_famille = simulation.calculate('proprietaire_proche_famille', period) statut_occupation = statut_occupation_famille result = (al_pac >= 1) * (statut_occupation != 3) * not_(proprietaire_proche_famille) * aide_logement_montant return period, result @reference_formula class als_nonet(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Allocation logement sociale (non étudiante)" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') aide_logement_montant = simulation.calculate('aide_logement_montant', period) al_pac = simulation.calculate('al_pac', period) etu_holder = simulation.compute('etu', period) statut_occupation_famille = simulation.calculate('statut_occupation_famille', period) proprietaire_proche_famille = simulation.calculate('proprietaire_proche_famille', period) statut_occupation = statut_occupation_famille etu = self.split_by_roles(etu_holder, roles = [CHEF, PART]) return period, ( (al_pac == 0) * (statut_occupation != 3) * not_(proprietaire_proche_famille) * not_(etu[CHEF] | etu[PART]) * aide_logement_montant ) @reference_formula class alset(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol entity_class = Familles label = u"Allocation logement sociale (étudiante)" url = u"https://www.caf.fr/actualites/2012/etudiants-tout-savoir-sur-les-aides-au-logement" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') aide_logement_montant = simulation.calculate('aide_logement_montant', period) al_pac = simulation.calculate('al_pac', period) etu_holder = simulation.compute('etu', period) statut_occupation_holder = simulation.compute('statut_occupation', period) proprietaire_proche_famille = simulation.calculate('proprietaire_proche_famille', period) statut_occupation = self.cast_from_entity_to_roles(statut_occupation_holder) statut_occupation = self.filter_role(statut_occupation, role = CHEF) etu = self.split_by_roles(etu_holder, roles = [CHEF, PART]) return period, ( (al_pac == 0) * (statut_occupation != 3) * not_(proprietaire_proche_famille) * (etu[CHEF] | etu[PART]) * aide_logement_montant ) @reference_formula class als(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol entity_class = Familles label = u"Allocation logement sociale" url = u"http://vosdroits.service-public.fr/particuliers/F1280.xhtml" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') als_nonet = simulation.calculate('als_nonet', period) alset = simulation.calculate('alset', period) result = (als_nonet + alset) return period, result @reference_formula class apl(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol entity_class = Familles label = u" Aide personnalisée au logement" # (réservée aux logements conventionné, surtout des HLM, et financé par le fonds national de l'habitation)" url = u"http://vosdroits.service-public.fr/particuliers/F12006.xhtml", def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') aide_logement_montant = simulation.calculate('aide_logement_montant', period) statut_occupation_holder = simulation.compute('statut_occupation', period) statut_occupation = self.cast_from_entity_to_roles(statut_occupation_holder) statut_occupation = self.filter_role(statut_occupation, role = CHEF) return period, aide_logement_montant * (statut_occupation == 3) @reference_formula class aide_logement_non_calculable(SimpleFormulaColumn): column = EnumCol( enum = Enum([ u"", u"primo_accedant", u"locataire_foyer" ]), default = 0 ) entity_class = Familles label = u"Aide au logement non calculable" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') statut_occupation = simulation.calculate('statut_occupation', period) return period, (statut_occupation == 1) * 1 + (statut_occupation == 7) * 2 @reference_formula class aide_logement(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Aide au logement (tout type)" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') apl = simulation.calculate('apl', period) als = simulation.calculate('als', period) alf = simulation.calculate('alf', period) return period, max_(max_(apl, als), alf) @reference_formula class crds_logement(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol entity_class = Familles label = u"CRDS des allocations logement" url = u"http://vosdroits.service-public.fr/particuliers/F17585.xhtml" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') aide_logement_montant_brut = simulation.calculate('aide_logement_montant_brut', period) crds = simulation.legislation_at(period.start).fam.af.crds return period, -aide_logement_montant_brut * crds @reference_formula class statut_occupation_individu(EntityToPersonColumn): entity_class = Individus label = u"Statut d'occupation de l'individu" variable = Menages.column_by_name['statut_occupation'] @reference_formula class statut_occupation_famille(PersonToEntityColumn): entity_class = Familles label = u"Statut d'occupation de la famille" role = CHEF variable = Individus.column_by_name['statut_occupation_individu'] @reference_formula class zone_apl(SimpleFormulaColumn): column = EnumCol( enum = Enum([ u"Non renseigné", u"Zone 1", u"Zone 2", u"Zone 3", ]), default = 2 ) entity_class = Menages label = u"Zone APL" def function(self, simulation, period): ''' Retrouve la zone APL (aide personnalisée au logement) de la commune en fonction du depcom (code INSEE) ''' period = period depcom = simulation.calculate('depcom', period) preload_zone_apl() default_value = 2 return period, fromiter( ( zone_apl_by_depcom.get(depcom_cell, default_value) for depcom_cell in depcom ), dtype = int16, ) def preload_zone_apl(): global zone_apl_by_depcom if zone_apl_by_depcom is None: with pkg_resources.resource_stream( openfisca_france.__name__, 'assets/apl/20110914_zonage.csv', ) as csv_file: csv_reader = csv.DictReader(csv_file) zone_apl_by_depcom = { # Keep only first char of Zonage column because of 1bis value considered equivalent to 1. row['CODGEO']: int(row['Zonage'][0]) for row in csv_reader } # Add subcommunes (arrondissements and communes associées), use the same value as their parent commune. with pkg_resources.resource_stream( openfisca_france.__name__, 'assets/apl/commune_depcom_by_subcommune_depcom.json', ) as json_file: commune_depcom_by_subcommune_depcom = json.load(json_file) for subcommune_depcom, commune_depcom in commune_depcom_by_subcommune_depcom.iteritems(): zone_apl_by_depcom[subcommune_depcom] = zone_apl_by_depcom[commune_depcom] @reference_formula class zone_apl_individu(EntityToPersonColumn): entity_class = Individus label = u"Zone apl de la personne" variable = zone_apl @reference_formula class zone_apl_famille(PersonToEntityColumn): entity_class = Familles label = u"Zone apl de la famille" role = CHEF variable = zone_apl_individu PKFEopenfisca_france/model/prestations/prestations_familiales/__init__.pyPK'Gj?j??openfisca_france/model/prestations/prestations_familiales/af.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import round, maximum as max_, logical_not as not_, logical_or as or_ from ...base import * # noqa analysis:ignore from .base_ressource import nb_enf @reference_formula class af_enfant_a_charge(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"Enfant à charge au sens des allocations familiales" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') est_enfant_dans_famille = simulation.calculate('est_enfant_dans_famille', period) smic55 = simulation.calculate('smic55', period) age = simulation.calculate('age', period) rempli_obligation_scolaire = simulation.calculate('rempli_obligation_scolaire', period) pfam = simulation.legislation_at(period.start).fam condition_enfant = ((age >= pfam.enfants.age_minimal) * (age < pfam.enfants.age_intermediaire) * rempli_obligation_scolaire) condition_jeune = (age >= pfam.enfants.age_intermediaire) * (age < pfam.af.age3) * not_(smic55) return period, or_(condition_enfant, condition_jeune) * est_enfant_dans_famille @reference_formula class af_nbenf(SimpleFormulaColumn): column = IntCol entity_class = Familles label = u"Nombre d'enfants dans la famille au sens des allocations familiales" def function(self, simulation, period): period_mois = period.start.offset('first-of', 'month').period('month') af_enfant_a_charge_holder = simulation.compute('af_enfant_a_charge', period_mois) af_nbenf = self.sum_by_entity(af_enfant_a_charge_holder) return period, af_nbenf @reference_formula class af_forf_nbenf(SimpleFormulaColumn): column = IntCol entity_class = Familles label = u"Nombre d'enfants dans la famille éligibles à l'allocation forfaitaire des AF" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age_holder = simulation.compute('age', period) age = self.split_by_roles(age_holder, roles = ENFS) smic55_holder = simulation.compute('smic55', period) smic55 = self.split_by_roles(smic55_holder, roles = ENFS) pfam = simulation.legislation_at(period.start).fam.af af_forf_nbenf = nb_enf(age, smic55, pfam.age3, pfam.age3) return period, af_forf_nbenf @reference_formula class af_eligibilite_base(SimpleFormulaColumn): column = BoolCol entity_class = Familles label = u"Allocations familiales - Éligibilité pour la France métropolitaine sous condition de ressources" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') residence_dom = simulation.calculate('residence_dom', period) af_nbenf = simulation.calculate('af_nbenf', period) return period, not_(residence_dom) * (af_nbenf >= 2) @reference_formula class af_eligibilite_dom(SimpleFormulaColumn): column = BoolCol entity_class = Familles label = u"Allocations familiales - Éligibilité pour les DOM (hors Mayotte) sous condition de ressources" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') residence_dom = simulation.calculate('residence_dom', period) residence_mayotte = simulation.calculate('residence_mayotte', period) af_nbenf = simulation.calculate('af_nbenf', period) return period, residence_dom * not_(residence_mayotte) * (af_nbenf >= 1) @reference_formula class af_base(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Allocations familiales - allocation de base" # prestations familiales (brutes de crds) def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') eligibilite_base = simulation.calculate('af_eligibilite_base', period) eligibilite_dom = simulation.calculate('af_eligibilite_dom', period) af_nbenf = simulation.calculate('af_nbenf', period) pfam = simulation.legislation_at(period.start).fam.af eligibilite = or_(eligibilite_base, eligibilite_dom) un_seul_enfant = eligibilite_dom * (af_nbenf == 1) * pfam.taux.enf_seul plus_de_deux_enfants = (af_nbenf >= 2) * pfam.taux.enf2 plus_de_trois_enfants = max_(af_nbenf - 2, 0) * pfam.taux.enf3 taux_total = un_seul_enfant + plus_de_deux_enfants + plus_de_trois_enfants montant_base = eligibilite * round(pfam.bmaf * taux_total, 2) af_taux_modulation = simulation.calculate('af_taux_modulation', period) montant_base_module = montant_base * af_taux_modulation return period, montant_base_module @reference_formula class af_taux_modulation(DatedFormulaColumn): column = FloatCol entity_class = Familles label = u"Taux de modulation à appliquer au montant des AF depuis 2015" @dated_function(start = date(2002, 1, 1)) def function_2002(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') af_nbenf = simulation.calculate('af_nbenf', period) return period, 1 + 0 * af_nbenf # Trick pour avoir la bonne longueur d'array numpy. #Todo trouver mieux @dated_function(start = date(2015, 7, 1)) def function_2015(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') af_nbenf = simulation.calculate('af_nbenf', period) pfam = simulation.legislation_at(period.start).fam.af br_pf = simulation.calculate('br_pf', period) modulation = pfam.modulation plafond1 = modulation.plafond1 + af_nbenf * modulation.enfant_supp plafond2 = modulation.plafond2 + af_nbenf * modulation.enfant_supp taux = ( (br_pf <= plafond1) * 1 + (br_pf > plafond1) * (br_pf <= plafond2) * modulation.taux1 + (br_pf > plafond2) * modulation.taux2 ) return period, taux @reference_formula class af_forf_taux_modulation(DatedFormulaColumn): column = FloatCol entity_class = Familles label = u"Taux de modulation à appliquer à l'allocation forfaitaire des AF depuis 2015" @dated_function(start = date(2002, 1, 1)) def function_2002(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') af_nbenf = simulation.calculate('af_nbenf', period) return period, 1 + 0 * af_nbenf # Trick pour avoir la bonne longueur d'array numpy. #Todo trouver mieux @dated_function(start = date(2015, 7, 1)) def function_2015(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') pfam = simulation.legislation_at(period.start).fam.af af_nbenf = simulation.calculate('af_nbenf', period) af_forf_nbenf = simulation.calculate('af_forf_nbenf', period) nb_enf_tot = af_nbenf + af_forf_nbenf br_pf = simulation.calculate('br_pf', period) modulation = pfam.modulation plafond1 = modulation.plafond1 + nb_enf_tot * modulation.enfant_supp plafond2 = modulation.plafond2 + nb_enf_tot * modulation.enfant_supp taux = ( (br_pf <= plafond1) * 1 + (br_pf > plafond1) * (br_pf <= plafond2) * modulation.taux1 + (br_pf > plafond2) * modulation.taux2 ) return period, taux @reference_formula class af_age_aine(SimpleFormulaColumn): column = IntCol entity_class = Familles label = u"Allocations familiales - Âge de l'aîné des enfants éligibles" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age_holder = simulation.compute('age', period) age_enfants = self.split_by_roles(age_holder, roles = ENFS) af_enfant_a_charge_holder = simulation.compute('af_enfant_a_charge', period) af_enfants_a_charge = self.split_by_roles(af_enfant_a_charge_holder, roles = ENFS) pfam = simulation.legislation_at(period.start).fam # Calcul de l'âge de l'aîné age_aine = -9999 for key, age in age_enfants.iteritems(): a_charge = af_enfants_a_charge[key] * (age <= pfam.af.age2) aine_potentiel = a_charge * (age > age_aine) age_aine = aine_potentiel * age + not_(aine_potentiel) * age_aine return period, age_aine @reference_formula class af_majoration_enfant(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Allocations familiales - Majoration pour âge applicable à l'enfant" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') af_enfant_a_charge = simulation.calculate('af_enfant_a_charge', period) age = simulation.calculate('age', period) age_aine_holder = simulation.compute('af_age_aine', period) age_aine = self.cast_from_entity_to_roles(age_aine_holder, roles = ENFS) af_nbenf_holder = simulation.compute('af_nbenf', period) af_nbenf = self.cast_from_entity_to_roles(af_nbenf_holder, roles = ENFS) af_base_holder = simulation.compute('af_base', period) af_base = self.cast_from_entity_to_roles(af_base_holder, roles = ENFS) pfam = simulation.legislation_at(period.start).fam montant_enfant_seul = pfam.af.bmaf * ( (pfam.af.maj_age_un_enfant.age1 <= age) * (age < pfam.af.maj_age_un_enfant.age2) * pfam.af.maj_age_un_enfant.taux1 + (pfam.af.maj_age_un_enfant.age2 <= age) * pfam.af.maj_age_un_enfant.taux2 ) montant_plusieurs_enfants = pfam.af.bmaf * ( (pfam.af.maj_age_deux_enfants.age1 <= age) * (age < pfam.af.maj_age_deux_enfants.age2) * pfam.af.maj_age_deux_enfants.taux1 + (pfam.af.maj_age_deux_enfants.age2 <= age) * pfam.af.maj_age_deux_enfants.taux2 ) montant = (af_nbenf == 1) * montant_enfant_seul + (af_nbenf > 1) * montant_plusieurs_enfants # Attention ! Ne fonctionne pas pour les enfants du même âge (typiquement les jumeaux...) pas_aine = or_(af_nbenf != 2, (af_nbenf == 2) * not_(age == age_aine)) return period, af_enfant_a_charge * (af_base > 0) * pas_aine * montant @reference_formula class af_majo(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Allocations familiales - majoration pour âge" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') af_majoration_enfant_holder = simulation.compute('af_majoration_enfant', period) af_majoration_enfants = self.sum_by_entity(af_majoration_enfant_holder, roles = ENFS) af_taux_modulation = simulation.calculate('af_taux_modulation', period) af_majoration_enfants_module = af_majoration_enfants * af_taux_modulation return period, af_majoration_enfants_module @reference_formula class af_complement_degressif(DatedFormulaColumn): column = FloatCol entity_class = Familles label = u"AF - Complément dégressif en cas de dépassement du plafond" @dated_function(start = date(2015, 7, 1)) def function_2015(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') af_nbenf = simulation.calculate('af_nbenf', period) br_pf = simulation.calculate('br_pf', period) af_base = simulation.calculate('af_base', period) af_majo = simulation.calculate('af_majo', period) pfam = simulation.legislation_at(period.start).fam.af modulation = pfam.modulation plafond1 = modulation.plafond1 + af_nbenf * modulation.enfant_supp plafond2 = modulation.plafond2 + af_nbenf * modulation.enfant_supp depassement_plafond1 = max_(0, br_pf - plafond1) depassement_plafond2 = max_(0, br_pf - plafond2) depassement_mensuel = ( (depassement_plafond2 == 0) * depassement_plafond1 + (depassement_plafond2 > 0) * depassement_plafond2 ) / 12 af = af_base + af_majo return period, max_(0, af - depassement_mensuel) * (depassement_mensuel > 0) @reference_formula class af_forf_complement_degressif(DatedFormulaColumn): column = FloatCol entity_class = Familles label = u"AF - Complément dégressif pour l'allocation forfaitaire en cas de dépassement du plafond" @dated_function(start = date(2015, 7, 1)) def function_2015(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') af_nbenf = simulation.calculate('af_nbenf', period) af_forf_nbenf = simulation.calculate('af_forf_nbenf', period) pfam = simulation.legislation_at(period.start).fam.af nb_enf_tot = af_nbenf + af_forf_nbenf br_pf = simulation.calculate('br_pf', period) af_forf = simulation.calculate('af_forf', period) modulation = pfam.modulation plafond1 = modulation.plafond1 + nb_enf_tot * modulation.enfant_supp plafond2 = modulation.plafond2 + nb_enf_tot * modulation.enfant_supp depassement_plafond1 = max_(0, br_pf - plafond1) depassement_plafond2 = max_(0, br_pf - plafond2) depassement_mensuel = ( (depassement_plafond2 == 0) * depassement_plafond1 + (depassement_plafond2 > 0) * depassement_plafond2 ) / 12 return period, max_(0, af_forf - depassement_mensuel) * (depassement_mensuel > 0) @reference_formula class af_forf(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Allocations familiales - forfait" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') af_nbenf = simulation.calculate('af_nbenf', period) af_forf_nbenf = simulation.calculate('af_forf_nbenf', period) P = simulation.legislation_at(period.start).fam.af bmaf = P.bmaf af_forfait = round(bmaf * P.taux.forfait, 2) af_forf = ((af_nbenf >= 2) * af_forf_nbenf) * af_forfait af_forf_taux_modulation = simulation.calculate('af_forf_taux_modulation', period) af_forf_module = af_forf * af_forf_taux_modulation return period, af_forf_module @reference_formula class af(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol entity_class = Familles label = u"Allocations familiales - total des allocations" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') af_base = simulation.calculate('af_base', period) af_majo = simulation.calculate('af_majo', period) af_forf = simulation.calculate('af_forf', period) af_complement_degressif = simulation.calculate('af_complement_degressif', period) af_forf_complement_degressif = simulation.calculate('af_forf_complement_degressif', period) return period, af_base + af_majo + af_forf + af_complement_degressif + af_forf_complement_degressif PKFB @openfisca_france/model/prestations/prestations_familiales/ars.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import maximum as max_ from ...base import * # noqa analysis:ignore from .base_ressource import nb_enf @reference_formula class ars(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"Allocation de rentrée scolaire" url = "http://vosdroits.service-public.fr/particuliers/F1878.xhtml" def function(self, simulation, period): ''' Allocation de rentrée scolaire brute de CRDS ''' period_br = period.start.offset('first-of', 'year').period('year') period = period.start.offset('first-of', 'year').offset(9, 'month').period('month') age_holder = simulation.compute('age', period) af_nbenf = simulation.calculate('af_nbenf', period) smic55_holder = simulation.compute('smic55', period) br_pf = simulation.calculate('br_pf', period_br.start.offset('first-of', 'month').period('month')) P = simulation.legislation_at(period.start).fam # TODO: convention sur la mensualisation # On tient compte du fait qu'en cas de léger dépassement du plafond, une allocation dégressive # (appelée allocation différentielle), calculée en fonction des revenus, peut être versée. age = self.split_by_roles(age_holder, roles = ENFS) smic55 = self.split_by_roles(smic55_holder, roles = ENFS) bmaf = P.af.bmaf # On doit prendre l'âge en septembre enf_05 = nb_enf(age, smic55, P.ars.agep - 1, P.ars.agep - 1) # 5 ans et 6 ans avant le 31 décembre # enf_05 = 0 # Un enfant scolarisé qui n'a pas encore atteint l'âge de 6 ans # avant le 1er février 2012 peut donner droit à l'ARS à condition qu'il # soit inscrit à l'école primaire. Il faudra alors présenter un # certificat de scolarité. enf_primaire = enf_05 + nb_enf(age, smic55, P.ars.agep, P.ars.agec - 1) enf_college = nb_enf(age, smic55, P.ars.agec, P.ars.agel - 1) enf_lycee = nb_enf(age, smic55, P.ars.agel, P.ars.ages) arsnbenf = enf_primaire + enf_college + enf_lycee # Plafond en fonction du nb d'enfants A CHARGE (Cf. article R543) ars_plaf_res = P.ars.plaf * (1 + af_nbenf * P.ars.plaf_enf_supp) arsbase = bmaf * (P.ars.tx0610 * enf_primaire + P.ars.tx1114 * enf_college + P.ars.tx1518 * enf_lycee) # Forme de l'ARS en fonction des enfants a*n - (rev-plaf)/n # ars_diff = (ars_plaf_res + arsbase - br_pf) / arsnbenf ars = (arsnbenf > 0) * max_(0, arsbase - max_(0, (br_pf - ars_plaf_res) / max_(1, arsnbenf))) # Calcul net de crds : ars_net = (P.ars.enf0610 * enf_primaire + P.ars.enf1114 * enf_college + P.ars.enf1518 * enf_lycee) return period_br, ars * (ars >= P.ars.seuil_nv) PK'Gk%X**Kopenfisca_france/model/prestations/prestations_familiales/base_ressource.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import int32, logical_not as not_, logical_or as or_, zeros from ...base import * # noqa analysis:ignore @reference_formula class smic55(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"Indicatrice d'autonomie financière vis-à-vis des prestations familiales" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') salaire_net = simulation.calculate_add('salaire_net', period.start.period('month', 6).offset(-6)) _P = simulation.legislation_at(period.start) nbh_travaillees = 169 smic_mensuel_brut = _P.cotsoc.gen.smic_h_b * nbh_travaillees # Oui on compare du salaire net avec un bout du SMIC brut ... return period, salaire_net / 6 >= (_P.fam.af.seuil_rev_taux * smic_mensuel_brut) @reference_formula class pfam_enfant_a_charge(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = Individus label = u"Enfant considéré à charge au sens des prestations familiales" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') est_enfant_dans_famille = simulation.calculate('est_enfant_dans_famille', period) smic55 = simulation.calculate('smic55', period) age = simulation.calculate('age', period) rempli_obligation_scolaire = simulation.calculate('rempli_obligation_scolaire', period) pfam = simulation.legislation_at(period.start).fam condition_enfant = ((age >= pfam.enfants.age_minimal) * (age < pfam.enfants.age_intermediaire) * rempli_obligation_scolaire) condition_jeune = (age >= pfam.enfants.age_intermediaire) * (age < pfam.enfants.age_limite) * not_(smic55) return period, or_(condition_enfant, condition_jeune) * est_enfant_dans_famille @reference_formula class pfam_ressources_i(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Ressources de l'individu prises en compte dans le cadre des prestations familiales" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') br_pf_i = simulation.calculate('br_pf_i', period) est_enfant_dans_famille = simulation.calculate('est_enfant_dans_famille', period) pfam_enfant_a_charge = simulation.calculate('pfam_enfant_a_charge', period) return period, or_(not_(est_enfant_dans_famille), pfam_enfant_a_charge) * br_pf_i @reference_formula class br_pf_i(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Base ressource individuelle des prestations familiales" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') annee_fiscale_n_2 = period.start.offset('first-of', 'year').period('year').offset(-2) tspr = simulation.calculate('tspr', annee_fiscale_n_2) hsup = simulation.calculate('hsup', annee_fiscale_n_2) rpns = simulation.calculate('rpns', annee_fiscale_n_2) return period, tspr + hsup + rpns @reference_formula class biact(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = Familles label = u"Indicatrice de biactivité" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') annee_fiscale_n_2 = period.start.offset('first-of', 'year').period('year').offset(-2) br_pf_i_holder = simulation.compute('br_pf_i', period) br_pf_i = self.split_by_roles(br_pf_i_holder, roles = [CHEF, PART]) pfam = simulation.legislation_at(annee_fiscale_n_2.start).fam seuil_rev = 12 * pfam.af.bmaf return period, (br_pf_i[CHEF] >= seuil_rev) & (br_pf_i[PART] >= seuil_rev) @reference_formula class div(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"div" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('year') rpns_pvce = simulation.calculate('rpns_pvce', period) rpns_pvct = simulation.calculate('rpns_pvct', period) rpns_mvct = simulation.calculate('rpns_mvct', period) rpns_mvlt = simulation.calculate('rpns_mvlt', period) f3vc_holder = simulation.compute('f3vc', period) f3ve_holder = simulation.compute('f3ve', period) f3vg_holder = simulation.compute('f3vg', period) f3vh_holder = simulation.compute('f3vh', period) f3vl_holder = simulation.compute('f3vl', period) f3vm_holder = simulation.compute('f3vm', period) f3vc = self.cast_from_entity_to_role(f3vc_holder, role = VOUS) f3ve = self.cast_from_entity_to_role(f3ve_holder, role = VOUS) f3vg = self.cast_from_entity_to_role(f3vg_holder, role = VOUS) f3vh = self.cast_from_entity_to_role(f3vh_holder, role = VOUS) f3vl = self.cast_from_entity_to_role(f3vl_holder, role = VOUS) f3vm = self.cast_from_entity_to_role(f3vm_holder, role = VOUS) return period, f3vc + f3ve + f3vg - f3vh + f3vl + f3vm + rpns_pvce + rpns_pvct - rpns_mvct - rpns_mvlt @reference_formula class rev_coll(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Revenus collectifs" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('year') # Quand rev_coll est calculé sur une année glissante, rto_net_declarant1 est calculé sur l'année légale # correspondante. rto_net_declarant1 = simulation.calculate('rto_net_declarant1', period.offset('first-of')) rev_cap_lib_holder = simulation.compute_add('rev_cap_lib', period) rev_cat_rvcm_holder = simulation.compute('rev_cat_rvcm', period) # div = simulation.calculate('div', period) # TODO why is this variable not used ? abat_spe_holder = simulation.compute('abat_spe', period) glo = simulation.calculate('glo', period) fon_holder = simulation.compute('fon', period) # Quand rev_coll est calculé sur une année glissante, pensions_alimentaires_versees_declarant1 est calculé sur l'année légale # correspondante. pensions_alimentaires_versees_declarant1 = simulation.calculate('pensions_alimentaires_versees_declarant1', period.offset('first-of')) f7ga_holder = simulation.compute('f7ga', period) f7gb_holder = simulation.compute('f7gb', period) f7gc_holder = simulation.compute('f7gc', period) rev_cat_pv_holder = simulation.compute('rev_cat_pv', period) # TODO: ajouter les revenus de l'étranger etr*0.9 # pensions_alimentaires_versees_declarant1 is negative since it is paid by the declaree rev_cap_lib = self.cast_from_entity_to_role(rev_cap_lib_holder, role = VOUS) rev_cat_rvcm = self.cast_from_entity_to_role(rev_cat_rvcm_holder, role = VOUS) abat_spe = self.cast_from_entity_to_role(abat_spe_holder, role = VOUS) fon = self.cast_from_entity_to_role(fon_holder, role = VOUS) f7ga = self.cast_from_entity_to_role(f7ga_holder, role = VOUS) f7gb = self.cast_from_entity_to_role(f7gb_holder, role = VOUS) f7gc = self.cast_from_entity_to_role(f7gc_holder, role = VOUS) rev_cat_pv = self.cast_from_entity_to_role(rev_cat_pv_holder, role = VOUS) return period, (rto_net_declarant1 + rev_cap_lib + rev_cat_rvcm + fon + glo + pensions_alimentaires_versees_declarant1 - f7ga - f7gb - f7gc - abat_spe + rev_cat_pv) @reference_formula class br_pf(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"Base ressource des prestations familiales" def function(self, simulation, period): ''' Base ressource des prestations familiales de la famille 'fam' ''' period = period.start.offset('first-of', 'month').period('month') # period_legacy = period.start.offset('first-of', 'month').period('year') annee_fiscale_n_2 = period.start.offset('first-of', 'year').period('year').offset(-2) pfam_ressources_i_holder = simulation.compute('pfam_ressources_i', period) rev_coll_holder = simulation.compute('rev_coll', annee_fiscale_n_2) br_pf_i_total = self.sum_by_entity(pfam_ressources_i_holder) rev_coll = self.split_by_roles(rev_coll_holder, roles = [CHEF, PART]) br_pf = br_pf_i_total + rev_coll[CHEF] + rev_coll[PART] return period, br_pf ############################################################################ # Helper functions ############################################################################ def nb_enf(ages, smic55, ag1, ag2): """ Renvoie le nombre d'enfant au sens des allocations familiales dont l'âge est compris entre ag1 et ag2 """ # Les allocations sont dues à compter du mois civil qui suit la naissance # ag1==0 ou suivant les anniversaires ag1>0. # Un enfant est reconnu à charge pour le versement des prestations # jusqu'au mois précédant son age limite supérieur (ag2 + 1) mais # le versement à lieu en début de mois suivant res = None for key, age in ages.iteritems(): if res is None: res = zeros(len(age), dtype = int32) res += (ag1 <= age) & (age <= ag2) & not_(smic55[key]) return res def age_en_mois_benjamin(ages_en_mois): ''' Renvoie un vecteur (une entree pour chaque famille) avec l'age du benjamin. # TODO check age_en_mois > 0 ''' age_en_mois_benjamin = 12 * 9999 for age_en_mois in ages_en_mois.itervalues(): isbenjamin = (age_en_mois < age_en_mois_benjamin) & (age_en_mois != -9999) age_en_mois_benjamin = isbenjamin * age_en_mois + not_(isbenjamin) * age_en_mois_benjamin return age_en_mois_benjamin PK'G{O#33?openfisca_france/model/prestations/prestations_familiales/cf.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import (round, maximum as max_, minimum as min_, logical_not as not_, logical_or as or_) from ...base import * # noqa analysis:ignore @reference_formula class cf_enfant_a_charge(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"Complément familial - Enfant considéré à charge" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') est_enfant_dans_famille = simulation.calculate('est_enfant_dans_famille', period) smic55 = simulation.calculate('smic55', period) age = simulation.calculate('age', period) pfam = simulation.legislation_at(period.start).fam condition_age = (age >= 0) * (age < pfam.cf.age2) condition_situation = est_enfant_dans_famille * not_(smic55) return period, condition_age * condition_situation @reference_formula class cf_enfant_eligible(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"Complément familial - Enfant pris en compte pour l'éligibilité" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') cf_enfant_a_charge = simulation.calculate('cf_enfant_a_charge', period) age = simulation.calculate('age', period) rempli_obligation_scolaire = simulation.calculate('rempli_obligation_scolaire', period) pfam = simulation.legislation_at(period.start).fam condition_enfant = ((age >= pfam.cf.age1) * (age < pfam.enfants.age_intermediaire) * rempli_obligation_scolaire) condition_jeune = (age >= pfam.enfants.age_intermediaire) * (age < pfam.cf.age2) return period, or_(condition_enfant, condition_jeune) * cf_enfant_a_charge @reference_formula class cf_dom_enfant_eligible(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"Complément familial (DOM) - Enfant pris en compte pour l'éligibilité" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') cf_enfant_a_charge = simulation.calculate('cf_enfant_a_charge', period) age = simulation.calculate('age', period) rempli_obligation_scolaire = simulation.calculate('rempli_obligation_scolaire', period) pfam = simulation.legislation_at(period.start).fam condition_age = (age >= pfam.cf.age1) * (age < pfam.cf.age_limite_dom) condition_situation = cf_enfant_a_charge * rempli_obligation_scolaire return period, condition_age * condition_situation @reference_formula class cf_dom_enfant_trop_jeune(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"Complément familial (DOM) - Enfant trop jeune pour ouvrir le droit" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') est_enfant_dans_famille = simulation.calculate('est_enfant_dans_famille', period) age = simulation.calculate('age', period) pfam = simulation.legislation_at(period.start).fam condition_age = (age >= 0) * (age < pfam.cf.age1) return period, condition_age * est_enfant_dans_famille @reference_formula class cf_ressources_i(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Complément familial - Ressources de l'individu prises en compte" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') br_pf_i = simulation.calculate('br_pf_i', period) est_enfant_dans_famille = simulation.calculate('est_enfant_dans_famille', period) cf_enfant_a_charge = simulation.calculate('cf_enfant_a_charge', period) return period, or_(not_(est_enfant_dans_famille), cf_enfant_a_charge) * br_pf_i @reference_formula class cf_plafond(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Plafond d'éligibilité au Complément Familial" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') pfam = simulation.legislation_at(period.start).fam eligibilite_base = simulation.calculate('cf_eligibilite_base', period) eligibilite_dom = simulation.calculate('cf_eligibilite_dom', period) isol = simulation.calculate('isol', period) biact = simulation.calculate('biact', period) cf_enfant_a_charge_holder = simulation.compute('cf_enfant_a_charge', period) # Calcul du nombre d'enfants à charge au sens du CF cf_nbenf = self.sum_by_entity(cf_enfant_a_charge_holder) # Calcul du taux à appliquer au plafond de base pour la France métropolitaine taux_plafond_metropole = 1 + pfam.cf.majoration_plafond_tx1 * min_(cf_nbenf, 2) + pfam.cf.majoration_plafond_tx2 * max_(cf_nbenf - 2, 0) # Majoration du plafond pour biactivité ou isolement (France métropolitaine) majoration_plafond = (isol | biact) # Calcul du plafond pour la France métropolitaine plafond_metropole = pfam.cf.plafond * taux_plafond_metropole + pfam.cf.majoration_plafond_biact_isole * majoration_plafond # Calcul du taux à appliquer au plafond de base pour les DOM taux_plafond_dom = 1 + cf_nbenf * pfam.ars.plaf_enf_supp # Calcul du plafond pour les DOM plafond_dom = pfam.ars.plaf * taux_plafond_dom plafond = (eligibilite_base * plafond_metropole + eligibilite_dom * plafond_dom) return period, plafond @reference_formula class cf_majore_plafond(DatedFormulaColumn): column = FloatCol entity_class = Familles label = u"Plafond d'éligibilité au Complément Familial majoré" @dated_function(date(2014, 4, 1)) def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') plafond_base = simulation.calculate('cf_plafond', period) pfam = simulation.legislation_at(period.start).fam return period, plafond_base * pfam.cf.plafond_cf_majore @reference_formula class cf_ressources(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Ressources prises en compte pour l'éligibilité au complément familial" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') cf_ressources_i_holder = simulation.compute('cf_ressources_i', period) ressources = self.sum_by_entity(cf_ressources_i_holder) return period, ressources @reference_formula class cf_eligibilite_base(SimpleFormulaColumn): column = BoolCol entity_class = Familles label = u"Éligibilité au complément familial sous condition de ressources et avant cumul" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') residence_dom = simulation.calculate('residence_dom', period) cf_enfant_eligible_holder = simulation.compute('cf_enfant_eligible', period) cf_nbenf = self.sum_by_entity(cf_enfant_eligible_holder) return period, not_(residence_dom) * (cf_nbenf >= 3) @reference_formula class cf_eligibilite_dom(SimpleFormulaColumn): column = BoolCol entity_class = Familles label = u"Éligibilité au complément familial pour les DOM sous condition de ressources et avant cumul" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') residence_dom = simulation.calculate('residence_dom', period) residence_mayotte = simulation.calculate('residence_mayotte', period) cf_dom_enfant_eligible_holder = simulation.compute('cf_dom_enfant_eligible', period) cf_nbenf = self.sum_by_entity(cf_dom_enfant_eligible_holder) cf_dom_enfant_trop_jeune_holder = simulation.compute('cf_dom_enfant_trop_jeune', period) cf_nbenf_trop_jeune = self.sum_by_entity(cf_dom_enfant_trop_jeune_holder) condition_composition_famille = (cf_nbenf >= 1) * (cf_nbenf_trop_jeune == 0) condition_residence = residence_dom * not_(residence_mayotte) return period, condition_composition_famille * condition_residence @reference_formula class cf_non_majore_avant_cumul(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Complément familial non majoré avant cumul" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') eligibilite_base = simulation.calculate('cf_eligibilite_base', period) eligibilite_dom = simulation.calculate('cf_eligibilite_dom', period) ressources = simulation.calculate('cf_ressources', period) plafond = simulation.calculate('cf_plafond', period) pfam = simulation.legislation_at(period.start).fam eligibilite_sous_condition = or_(eligibilite_base, eligibilite_dom) # Montant montant = pfam.af.bmaf * (pfam.cf.tx * eligibilite_base + pfam.cf.tx_dom * eligibilite_dom) # Complément familial eligibilite = eligibilite_sous_condition * (ressources <= plafond) # Complément familial différentiel plafond_diff = plafond + 12 * montant eligibilite_diff = not_(eligibilite) * eligibilite_sous_condition * ( ressources <= plafond_diff) montant_diff = (plafond_diff - ressources) / 12 return period, max_(eligibilite * montant, eligibilite_diff * montant_diff) @reference_formula class cf_majore_avant_cumul(DatedFormulaColumn): column = FloatCol entity_class = Familles label = u"Complément familial majoré avant cumul" @dated_function(date(2014, 4, 1)) def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') eligibilite_base = simulation.calculate('cf_eligibilite_base', period) eligibilite_dom = simulation.calculate('cf_eligibilite_dom', period) ressources = simulation.calculate('cf_ressources', period) plafond_majore = simulation.calculate('cf_majore_plafond', period) pfam = simulation.legislation_at(period.start).fam eligibilite_sous_condition = or_(eligibilite_base, eligibilite_dom) # Montant montant = pfam.af.bmaf * (pfam.cf.tx_majore * eligibilite_base + pfam.cf.tx_majore_dom * eligibilite_dom) eligibilite = eligibilite_sous_condition * (ressources <= plafond_majore) return period, eligibilite * montant @reference_formula class cf_temp(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"Complément familial avant d'éventuels cumuls" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') cf_non_majore_avant_cumul = simulation.calculate('cf_non_majore_avant_cumul', period) cf_majore_avant_cumul = simulation.calculate('cf_majore_avant_cumul', period) return period, max_(cf_non_majore_avant_cumul, cf_majore_avant_cumul) @reference_formula class cf(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol(default = 0) entity_class = Familles label = u"Complément familial" url = "http://vosdroits.service-public.fr/particuliers/F13214.xhtml" def function(self, simulation, period): ''' L'allocation de base de la paje n'est pas cumulable avec le complément familial ''' period = period.start.offset('first-of', 'month').period('month') paje_base_temp = simulation.calculate('paje_base_temp', period) apje_temp = simulation.calculate_divide('apje_temp', period) ape_temp = simulation.calculate_divide('ape_temp', period) cf_temp = simulation.calculate('cf_temp', period) residence_mayotte = simulation.calculate('residence_mayotte', period) cf_brut = (paje_base_temp < cf_temp) * (apje_temp <= cf_temp) * (ape_temp <= cf_temp) * cf_temp return period, not_(residence_mayotte) * round(cf_brut, 2) PK'GAopenfisca_france/model/prestations/prestations_familiales/aeeh.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from ...base import * # noqa @reference_formula class aeeh(DatedFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"Allocation d'éducation de l'enfant handicapé" url = "http://vosdroits.service-public.fr/particuliers/N14808.xhtml" @dated_function(start = date(2002, 1, 1), stop = date(2002, 12, 31)) def function_20020101_20021231(self, simulation, period): ''' Allocation d'éducation de l'enfant handicapé (Allocation d'éducation spécialisée avant le 1er janvier 2006) Ce montant peut être majoré par un complément accordé par la Cdaph qui prend en compte : le coût du handicap de l'enfant, la cessation ou la réduction d'activité professionnelle d'un ou l'autre des deux parents, l'embauche d'une tierce personne rémunérée. Une majoration est versée au parent isolé bénéficiaire d'un complément d'Aeeh lorsqu'il cesse ou réduit son activité professionnelle ou lorsqu'il embauche une tierce personne rémunérée. ''' period = period.start.offset('first-of', 'month').period('year') age_holder = simulation.compute('age', period) invalide_holder = simulation.compute('invalide', period) categ_invalide_holder = simulation.compute('categ_inv', period) P = simulation.legislation_at(period.start).fam age = self.split_by_roles(age_holder, roles = ENFS) categ_inv = self.split_by_roles(categ_invalide_holder, roles = ENFS) invalide = self.split_by_roles(invalide_holder, roles = ENFS) aeeh = 0 for enfant in age.iterkeys(): enfhand = invalide[enfant] * (age[enfant] < P.aeeh.age) / 12 categ = categ_inv[enfant] aeeh += 0 * enfhand # TODO: # L'attribution de l'AEEH de base et de ses compléments éventuels ne fait pas obstacle au # versement des prestations familiales. # L'allocation de présence parentale peut être cumulée avec l'AEEH de base, mais pas avec son # complément ni avec la majoration de parent isolé. # Tous les éléments de la prestattion de compensation du handicap (PCH) sont également ouverts # aux bénéficiaires de l'AEEH de base, sous certaines conditions, mais ce cumul est exclusif du # complément de l'AEEH. Les parents d'enfants handicapés doivent donc choisir entre le versement # du complément d'AEEH et la PCH. # Ces allocations ne sont pas soumis à la CRDS return period, 12 * aeeh # annualisé @dated_function(start = date(2003, 1, 1), stop = date(2015, 12, 31)) def function_20030101_20151231(self, simulation, period): ''' Allocation d'éducation de l'enfant handicapé (Allocation d'éducation spécialisée avant le 1er janvier 2006) Ce montant peut être majoré par un complément accordé par la Cdaph qui prend en compte : le coût du handicap de l'enfant, la cessation ou la réduction d'activité professionnelle d'un ou l'autre des deux parents, l'embauche d'une tierce personne rémunérée. Une majoration est versée au parent isolé bénéficiaire d'un complément d'Aeeh lorsqu'il cesse ou réduit son activité professionnelle ou lorsqu'il embauche une tierce personne rémunérée. ''' period = period.start.offset('first-of', 'month').period('year') age_holder = simulation.compute('age', period) invalide_holder = simulation.compute('invalide', period) isol = simulation.calculate('isol', period) categ_invalide_holder = simulation.compute('categ_inv', period) P = simulation.legislation_at(period.start).fam age = self.split_by_roles(age_holder, roles = ENFS) categ_inv = self.split_by_roles(categ_invalide_holder, roles = ENFS) invalide = self.split_by_roles(invalide_holder, roles = ENFS) aeeh = 0 for enfant in age.iterkeys(): enfhand = invalide[enfant] * (age[enfant] < P.aeeh.age) / 12 categ = categ_inv[enfant] aeeh += enfhand * (P.af.bmaf * (P.aeeh.base + P.aeeh.cpl1 * (categ == 1) + (categ == 2) * (P.aeeh.cpl2 + P.aeeh.maj2 * isol) + (categ == 3) * (P.aeeh.cpl3 + P.aeeh.maj3 * isol) + (categ == 4) * (P.aeeh.cpl4 + P.aeeh.maj4 * isol) + (categ == 5) * (P.aeeh.cpl5 + P.aeeh.maj5 * isol) + (categ == 6) * (P.aeeh.maj6 * isol)) + (categ == 6) * P.aeeh.cpl6) # L'attribution de l'AEEH de base et de ses compléments éventuels ne fait pas obstacle au # versement des prestations familiales. # L'allocation de présence parentale peut être cumulée avec l'AEEH de base, mais pas avec son # complément ni avec la majoration de parent isolé. # Tous les éléments de la prestattion de compensation du handicap (PCH) sont également ouverts # aux bénéficiaires de l'AEEH de base, sous certaines conditions, mais ce cumul est exclusif du # complément de l'AEEH. Les parents d'enfants handicapés doivent donc choisir entre le versement # du complément d'AEEH et la PCH. # Ces allocations ne sont pas soumis à la CRDS return period, 12 * aeeh # annualisé PK'GAopenfisca_france/model/prestations/prestations_familiales/paje.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import (round, floor, maximum as max_, minimum as min_, logical_not as not_) from ...base import * # noqa analysis:ignore from .base_ressource import nb_enf, age_en_mois_benjamin # Prestations familiales build_column('inactif', BoolCol(entity = 'fam', label = u"Parent inactif (PAJE-CLCA)")) build_column('partiel1', BoolCol(entity = 'fam', label = u"Parent actif à moins de 50% (PAJE-CLCA)")) build_column('partiel2', BoolCol(entity = 'fam', label = u"Parent actif entre 50% et 80% (PAJE-CLCA)")) build_column('categ_inv', PeriodSizeIndependentIntCol(label = u"Catégorie de handicap (AEEH)")) build_column('opt_colca', BoolCol(entity = 'fam', label = u"Opte pour le COLCA")) build_column('empl_dir', BoolCol(entity = 'fam', label = u"Emploi direct (CLCMG)")) build_column('ass_mat', BoolCol(entity = 'fam', label = u"Assistante maternelle (CLCMG)")) build_column('gar_dom', BoolCol(entity = 'fam', label = u"Garde à domicile (CLCMG)")) @reference_formula class paje(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"PAJE - Ensemble des prestations" start_date = date(2004, 1, 1) url = "http://www.caf.fr/aides-et-services/s-informer-sur-les-aides/petite-enfance/la-prestation-d-accueil-du-jeune-enfant-paje-0" # noqa def function(self, simulation, period): ''' Prestation d'accueil du jeune enfant ''' period = period.start.offset('first-of', 'month').period('month') paje_base = simulation.calculate('paje_base', period) paje_nais = simulation.calculate('paje_nais', period) paje_clca = simulation.calculate('paje_clca', period) paje_clmg = simulation.calculate('paje_clmg', period) paje_colca = simulation.calculate('paje_colca', period) return period, paje_base + (paje_nais + paje_clca + paje_clmg + paje_colca) / 12 @reference_formula class paje_base_temp(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"Allocation de base de la PAJE sans tenir compte d'éventuels cumuls" start_date = date(2004, 1, 1) def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') annee_fiscale_n_2 = period.start.offset('first-of', 'year').period('year').offset(-2) age_holder = simulation.compute('age', period) af_nbenf = simulation.calculate('af_nbenf', period) br_pf = simulation.calculate('br_pf', period) biact = simulation.calculate('biact', period) isol = simulation.calculate('isol', period) smic55_holder = simulation.compute('smic55', period, accept_other_period = True) pfam = simulation.legislation_at(period.start).fam pfam_n_2 = simulation.legislation_at(period.start.offset(-2, 'year')).fam # TODO cumul des paje si et seulement si naissance multiples age = self.split_by_roles(age_holder, roles = ENFS) smic55 = self.split_by_roles(smic55_holder, roles = ENFS) bmaf = pfam.af.bmaf bmaf2 = pfam_n_2.af.bmaf base = round(pfam.paje.base.taux * bmaf, 2) base2 = round(pfam.paje.base.taux * bmaf2, 2) # L'allocation de base est versée jusqu'au dernier jour du mois civil précédant # celui au cours duquel l'enfant atteint l'âge de 3 ans. nbenf = nb_enf(age, smic55, 0, pfam.paje.base.age - 1) plaf_tx = ( (nbenf > 0) + pfam.paje.base.plaf_tx1 * min_(af_nbenf, 2) + pfam.paje.base.plaf_tx2 * max_(af_nbenf - 2, 0) ) majo = isol | biact plaf = pfam.paje.base.plaf * plaf_tx + (plaf_tx > 0) * pfam.paje.base.plaf_maj * majo plaf2 = plaf + 12 * base2 # TODO vérifier l'aspect différentielle de la PAJE et le plaf2 de la paje paje_base = (nbenf > 0) * ((br_pf < plaf) * base + (br_pf >= plaf) * max_(plaf2 - br_pf, 0) / 12) # non cumulabe avec la CF, voir Paje_CumulCf return period, paje_base @reference_formula class paje_nais(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol(default = 0) entity_class = Familles label = u"Allocation de naissance de la PAJE" start_date = date(2004, 1, 1) url = "http://vosdroits.service-public.fr/particuliers/F2550.xhtml" def function(self, simulation, period): ''' Prestation d'accueil du jeune enfant - Allocation de naissance ''' period = period.start.offset('first-of', 'month').period('month') age_en_mois_holder = simulation.compute('age_en_mois', period) # age_holder = simulation.compute('age', period) af_nbenf = simulation.calculate('af_nbenf', period) br_pf = simulation.calculate('br_pf', period) isol = simulation.calculate('isol', period) biact = simulation.calculate('biact', period) P = simulation.legislation_at(period.start).fam # age = self.split_by_roles(age_holder, roles = ENFS) age_en_mois = self.split_by_roles(age_en_mois_holder, roles = ENFS) bmaf = P.af.bmaf nais_prime = round(100 * P.paje.nais.prime_tx * bmaf) / 100 # Versée au 7e mois de grossesse dans l'année # donc les enfants concernés sont les enfants qui ont -2 mois nbnais = 0 for age_m in age_en_mois.itervalues(): nbnais += (age_m == -2) # cas mensuel # nbnais += (age_m >= -2) * (age_m < 10) # cas annuel nbenf = af_nbenf + nbnais # On ajoute l'enfant à naître; plaf_tx = (nbenf > 0) + P.paje.base.plaf_tx1 * min_(nbenf, 2) + P.paje.base.plaf_tx2 * max_(nbenf - 2, 0) majo = isol | biact plaf = P.paje.base.plaf * plaf_tx + (plaf_tx > 0) * P.paje.base.plaf_maj * majo elig = (br_pf <= plaf) * (nbnais != 0) nais_brut = nais_prime * elig * (nbnais) return period, nais_brut @reference_formula class paje_clca(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol(default = 0) entity_class = Familles label = u"PAJE - Complément de libre choix d'activité" start_date = date(2004, 1, 1) url = "http://vosdroits.service-public.fr/particuliers/F313.xhtml" def function(self, simulation, period): """ Prestation d'accueil du jeune enfant - Complément de libre choix d'activité 'fam' Parameters: ----------- age : âge en mois af_nbenf : nombre d'enfants aus sens des allocations familiales paje_base : allocation de base de la PAJE inactif : indicatrice d'inactivité partiel1 : Salarié: Temps de travail ne dépassant pas 50 % de la durée du travail fixée dans l'entreprise pour les salariés VRP ou non salarié travaillant à temps partiel: Temps de travail ne dépassant pas 76 heures par mois et un revenu professionnel mensuel inférieur ou égal à (smic_8.27*169*85 %) partiel2 : Salarié: Temps de travail compris entre 50 et 80 % de la durée du travail fixée dans l'entreprise. VRP ou non salarié travaillant à temps partiel: Temps de travail compris entre 77 et 122 heures par mois et un revenu professionnel mensuel ne dépassant pas (smic_8.27*169*136 %) http://www.caf.fr/wps/portal/particuliers/catalogue/metropole/paje """ period = period.start.offset('first-of', 'month').period('month') age_en_mois_holder = simulation.compute('age_en_mois', period) af_nbenf = simulation.calculate('af_nbenf', period) paje_base = simulation.calculate('paje_base', period) inactif = simulation.calculate('inactif', period) partiel1 = simulation.calculate('partiel1', period) partiel2 = simulation.calculate('partiel2', period) P = simulation.legislation_at(period.start).fam age_en_mois = self.split_by_roles(age_en_mois_holder, roles = ENFS) paje = paje_base >= 0 # durée de versement : # Pour un seul enfant à charge, le CLCA est versé pendant une période de 6 mois (P.paje.clca.duree1) # à partir de la naissance ou de la cessation des IJ maternité et paternité. # A partir du 2ème enfant, il est versé jusqu’au mois précédant le 3ème anniversaire # de l’enfant. # Calcul de l'année et mois de naisage_in_months( du cadet # TODO: ajuster en fonction de la cessation des IJ etc age_m_benjamin = age_en_mois_benjamin(age_en_mois) condition1 = (af_nbenf == 1) * (age_m_benjamin >= 0) * (age_m_benjamin < P.paje.clca.duree1) age_benjamin = floor(age_m_benjamin / 12) condition2 = (age_benjamin <= (P.paje.base.age - 1)) condition = (af_nbenf >= 2) * condition2 + condition1 paje_clca = (condition * P.af.bmaf) * ( (not_(paje)) * (inactif * P.paje.clca.sansab_tx_inactif + partiel1 * P.paje.clca.sansab_tx_partiel1 + partiel2 * P.paje.clca.sansab_tx_partiel2) + (paje) * (inactif * P.paje.clca.avecab_tx_inactif + partiel1 * P.paje.clca.avecab_tx_partiel1 + partiel2 * P.paje.clca.avecab_tx_partiel2)) return period, paje_clca reference_input_variable( name ='paje_prepare', column = FloatCol, entity_class = Familles, label = u"Prestation Partagée d’éducation de l’Enfant (PreParE)", set_input = set_input_divide_by_period ) @reference_formula class paje_clca_taux_plein(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = Familles label = u"Indicatrice Clca taux plein" start_date = date(2004, 1, 1) url = "http://vosdroits.service-public.fr/particuliers/F313.xhtml" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') paje_clca = simulation.calculate('paje_clca', period) inactif = simulation.calculate('inactif', period) return period, (paje_clca > 0) * inactif @reference_formula class paje_clca_taux_partiel(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = Familles label = u"Indicatrice Clca taux partiel" start_date = date(2004, 1, 1) url = "http://vosdroits.service-public.fr/particuliers/F313.xhtml" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') paje_clca = simulation.calculate('paje_clca', period) partiel1 = simulation.calculate('partiel1', period) return period, (paje_clca > 0) * partiel1 # TODO gérer les cumuls avec autres revenus et colca voir site caf @reference_formula class paje_clmg(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol(default = 0) entity_class = Familles label = u"PAJE - Complément de libre choix du mode de garde" start_date = date(2004, 1, 1) url = "http://www.caf.fr/aides-et-services/s-informer-sur-les-aides/petite-enfance/le-complement-de-libre-choix-du-mode-de-garde" # noqa def function(self, simulation, period): ''' Prestation d accueil du jeune enfant - Complément de libre choix du mode de garde Les conditions Vous devez : avoir un enfant de moins de 6 ans né, adopté ou recueilli en vue d'adoption à partir du 1er janvier 2004 employer une assistante maternelle agréée ou une garde à domicile. avoir une activité professionnelle minimale si vous êtes salarié cette activité doit vous procurer un revenu minimum de : si vous vivez seul : une fois la BMAF si vous vivez en couple soit 2 fois la BMAF si vous êtes non salarié, vous devez être à jour de vos cotisations sociales d'assurance vieillesse Vous n'avez pas besoin de justifier d'une activité min_ si vous êtes : bénéficiaire de l'allocation aux adultes handicapés (Aah) au chômage et bénéficiaire de l'allocation d'insertion ou de l'allocation de solidarité spécifique bénéficiaire du Revenu de solidarité active (Rsa), sous certaines conditions de ressources étudiées par votre Caf, et inscrit dans une démarche d'insertionétudiant (si vous vivez en couple, vous devez être tous les deux étudiants). Autres conditions à remplir : Assistante maternelle agréée Garde à domicile Son salaire brut ne doit pas dépasser par jour de garde et par enfant 5 fois le montant du Smic horaire brut, soit au max 45,00 €. Vous ne devez pas bénéficier de l'exonération des cotisations sociales dues pour la personne employée. ''' period = period.start.offset('first-of', 'month').period('month') aah_holder = simulation.compute('aah', period) age_holder = simulation.compute('age', period) smic55_holder = simulation.compute('smic55', period, accept_other_period = True) etu_holder = simulation.compute('etu', period) salaire_imposable_holder = simulation.compute('salaire_imposable', period) hsup_holder = simulation.compute('hsup', period) concub = simulation.calculate('concub', period) af_nbenf = simulation.calculate('af_nbenf', period) br_pf = simulation.calculate('br_pf', period.start.offset('first-of', 'month').period('month')) empl_dir = simulation.calculate('empl_dir', period) ass_mat = simulation.calculate('ass_mat', period) gar_dom = simulation.calculate('gar_dom', period) paje_clca_taux_partiel = simulation.calculate('paje_clca_taux_partiel', period) paje_clca_taux_plein = simulation.calculate('paje_clca_taux_plein', period) P = simulation.legislation_at(period.start).fam P_n_2 = simulation.legislation_at(period.start.offset(-2, 'year')).fam age = self.split_by_roles(age_holder, roles = ENFS) etu = self.split_by_roles(etu_holder, roles = [CHEF, PART]) hsup = self.split_by_roles(hsup_holder, roles = [CHEF, PART]) salaire_imposable = self.split_by_roles(salaire_imposable_holder, roles = [CHEF, PART]) smic55 = self.split_by_roles(smic55_holder, roles = ENFS) aah = self.sum_by_entity(aah_holder) # condition de revenu minimal bmaf_n_2 = P_n_2.af.bmaf cond_age_enf = (nb_enf(age, smic55, P.paje.clmg.age1, P.paje.clmg.age2 - 1) > 0) cond_sal = ( salaire_imposable[CHEF] + salaire_imposable[PART] + hsup[CHEF] + hsup[PART] > 12 * bmaf_n_2 * (1 + concub) ) # TODO: cond_rpns = cond_act = cond_sal # | cond_rpns cond_nonact = (aah > 0) | (etu[CHEF] & etu[PART]) # | (ass>0) # TODO: RSA insertion, alloc insertion, ass elig = cond_age_enf & (cond_act | cond_nonact) nbenf = af_nbenf seuil1 = (P.paje.clmg.seuil11 * (nbenf == 1) + P.paje.clmg.seuil12 * (nbenf >= 2) + max_(nbenf - 2, 0) * P.paje.clmg.seuil1sup) seuil2 = (P.paje.clmg.seuil21 * (nbenf == 1) + P.paje.clmg.seuil22 * (nbenf >= 2) + max_(nbenf - 2, 0) * P.paje.clmg.seuil2sup) # Si vous bénéficiez du Clca taux partiel (= vous travaillez entre 50 et 80% de la durée du travail fixée # dans l'entreprise), vous cumulez intégralement le Clca et le Cmg. # Si vous bénéficiez du Clca taux partiel (= vous travaillez à 50% ou moins de la durée # du travail fixée dans l'entreprise), le montant des plafonds Cmg est divisé par 2. seuil1 = seuil1 * (1 - .5 * paje_clca_taux_partiel) seuil2 = seuil2 * (1 - .5 * paje_clca_taux_partiel) clmg = P.af.bmaf * ((nb_enf(age, smic55, 0, P.paje.clmg.age1 - 1) > 0) + 0.5 * (nb_enf(age, smic55, P.paje.clmg.age1, P.paje.clmg.age2 - 1) > 0) ) * ( empl_dir * ( (br_pf < seuil1) * P.paje.clmg.empl_dir1 + ((br_pf >= seuil1) & (br_pf < seuil2)) * P.paje.clmg.empl_dir2 + (br_pf >= seuil2) * P.paje.clmg.empl_dir3) + ass_mat * ( (br_pf < seuil1) * P.paje.clmg.ass_mat1 + ((br_pf >= seuil1) & (br_pf < seuil2)) * P.paje.clmg.ass_mat2 + (br_pf >= seuil2) * P.paje.clmg.ass_mat3) + gar_dom * ( (br_pf < seuil1) * P.paje.clmg.domi1 + ((br_pf >= seuil1) & (br_pf < seuil2)) * P.paje.clmg.domi2 + (br_pf >= seuil2) * P.paje.clmg.domi3)) # TODO: connecter avec le crédit d'impôt # Si vous bénéficiez du Clca taux plein # (= vous ne travaillez plus ou interrompez votre activité professionnelle), # vous ne pouvez pas bénéficier du Cmg. paje_clmg = elig * not_(paje_clca_taux_plein) * clmg # TODO vérfiez les règles de cumul return period, paje_clmg @reference_formula class paje_colca(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol(default = 0) entity_class = Familles label = u"PAJE - Complément optionnel de libre choix d'activité" start_date = date(2004, 1, 1) url = "http://vosdroits.service-public.fr/particuliers/F15110.xhtml" def function(self, simulation, period): ''' Prestation d'accueil du jeune enfant - Complément optionnel de libre choix du mode de garde ''' period = period.start.offset('first-of', 'month').period('month') af_nbenf = simulation.calculate('af_nbenf', period) age_en_mois_holder = simulation.compute('age_en_mois', period) opt_colca = simulation.calculate('opt_colca', period) paje_base = simulation.calculate('paje_base', period) P = simulation.legislation_at(period.start).fam age_en_mois = self.split_by_roles(age_en_mois_holder, roles = ENFS) age_m_benjamin = age_en_mois_benjamin(age_en_mois) condition = (age_m_benjamin < 12 * P.paje.colca.age) * (age_m_benjamin >= 0) nbenf = af_nbenf paje = (paje_base > 0) paje_colca = opt_colca * condition * (nbenf >= 3) * P.af.bmaf * ( (paje) * P.paje.colca.avecab + not_(paje) * P.paje.colca.sansab) return period, paje_colca # TODO: cumul avec clca self.colca_tot_m @reference_formula class paje_base(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol(default = 0) entity_class = Familles label = u"Allocation de base de la PAJE" start_date = date(2004, 1, 1) url = "http://vosdroits.service-public.fr/particuliers/F2552.xhtml" def function(self, simulation, period): ''' L'allocation de base de la paje n'est pas cumulable avec le complément familial ''' period = period.start.offset('first-of', 'month').period('month') paje_base_temp = simulation.calculate('paje_base_temp', period) cf_temp = simulation.calculate('cf_temp', period) # On regarde ce qui est le plus intéressant pour la famille, chaque mois paje_base = (paje_base_temp >= cf_temp) * paje_base_temp return period, paje_base # def _afeama(self, age_holder, smic55_holder, ape, af_nbenf, br_pf, P = law.fam): # ''' # Aide à la famille pour l'emploi d'une assistante maternelle agréée # ''' # age = self.split_by_roles(age_holder, roles = ENFS) # smic55 = self.split_by_roles(smic55_holder, roles = ENFS) # # # TODO http://web.archive.org/web/20080205163300/http://www.caf.fr/wps/portal/particuliers/catalogue/metropole/afeama # # Les seuils sont de 80 et 110 % de l'ARS # # Vérifier que c'est la même chose pour le clmg # # elig = not_(ape) # assistante maternelle agréee # # Vous devez: # # faire garder votre enfant de moins de 6 ans par une assistante maternelle agréée dont vous êtes l'employeur # # déclarer son embauche à l'Urssaf # # lui verser un salaire ne dépassant pas par jour de garde et par enfant 5 fois le montant horaire du Smic, # # soit au max_ 42,20 € # # # # Si vous cessez de travailler et bénéficiez de l'allocation parentale d'éducation, vous ne recevrez plus l'Afeama. # # Vos enfants doivent être nés avant le 1er janvier 2004. # # # TODO calcul des cotisations urssaf # # # nbenf_afeama = nb_enf(age, smic55, P.af.age1, P.afeama.age - 1) # nbenf = elig * af_nbenf * (nbenf_afeama > 0) # # nb_par_ars = (nbenf == 1 + max_(nbenf - 1, 0) * (1 + P.ars.plaf_enf_supp)) # seuil1 = (P.afeama.mult_seuil1 * P.ars.plaf) * nb_par_ars # seuil2 = (P.afeama.mult_seuil2 * P.ars.plaf) * nb_par_ars # # afeama = nbenf_afeama * P.af.bmaf * ( # (br_pf < seuil1) * P.afeama.taux_mini + # ((br_pf >= seuil1) & (br_pf < seuil2)) * P.afeama.taux_median + # (br_pf >= seuil2) * P.afeama.taux_maxi) # return 12 * afeama # annualisé # # # L'AFEAMA comporte 2 volets complémentaires: l'AFEAMA proprement dit qui consiste à prendre en charge les # # cotisations sociales sur les salaires, d'une part, et une allocation complémentaire versée aux parents, # # la majoration AFEAMA, d'autre part. # # Le système de majoration AFEAMA a été modifié au 1er janvier 2001 : # # Jusqu'en décembre 2000, son montant ne dépendait que de l'âge de l'enfant. # # Depuis janvier 2001, il dépend également de la catégorie de revenus des parents employeurs (fonction de leur base # # ressources et du nombre d'enfants qu'ils ont à charge). # # Parallélement, son plafonnement a été ramené de 100 % à 85 % du salaire net versé à l'assistante maternelle # # (sauf si ces 85 % sont inférieurs au montant de la majoration la moins élevée, compte tenu de l'âge de l'enfant). # # La catégorie de revenus des parents employeurs est déterminée par la CAF en fonction de la base ressources # # du ménage. # # Le tableau suivant récapitule les montants pris en compte depuis le 1er juillet 2007 pour la détermination du # # montant maximal de la majoration AFEAMA selon les catégories de revenus : # # Base ressources du ménage # # 1 enfant 2 enfants par enfant suppémentaire # # revenus inférieurs à 17 593 € inférieurs à 21 653 € 4060 € # # inférieurs à 24 190 € inférieurs à 29 773 € 5583 € # # supérieurs à 24 190 € supérieurs à 29 773 € 5583 € # # Montant base ressources 2006, au 1er juillet 2007 # # # def _aged(self, age_holder, smic55_holder, br_pf, ape_taux_partiel, dep_trim, P = law.fam): # ''' # Allocation garde d'enfant à domicile # # les deux conjoints actif et revenu min requis, jusqu'aux 6 ans de l'enfant né avant le 01/01/2004, emploi d'une # garde A DOMICILE # cette allocation consiste en une prise en charge partielle des charges sociales inhérentes à l'emploi d'une personne # à domicile. # Si vous avez au moins un enfant de moins de 3 ans gardé au domicile, 2 cas : # Revenus 2005 > 37 241 € : la CAF prend en charge 50% des charges sociales (plafonné à 1 106 € par trimestre), # Revenus 2005 < 37 341 € : la CAF prend en charge 75% des charges sociales (plafonné à 1 659 € par trimestre). # Si vous avez un enfant de plus de 3 ans gardé au domicile (1 seul cas, sans condition de ressources) : # la CAF prend en charge 50% des charges sociales (plafonné à 553 € par trimestre) # ''' # # TODO: trimestrialiser # age = self.split_by_roles(age_holder, roles = ENFS) # smic55 = self.split_by_roles(smic55_holder, roles = ENFS) # # nbenf = nb_enf(age, smic55, 0, P.aged.age1 - 1) # nbenf2 = nb_enf(age, smic55, 0, P.aged.age2 - 1) # elig1 = (nbenf > 0) # elig2 = not_(elig1) * (nbenf2 > 0) * ape_taux_partiel # depenses = 4 * dep_trim # gérer les dépenses trimestrielles # aged3 = elig1 * (max_(P.aged.remb_plaf1 - P.aged.remb_taux1 * depenses, 0) * (br_pf > P.aged.revenus_plaf) + # (br_pf <= P.aged.revenus_plaf) * max_(P.aged.remb_taux2 * depenses - P.aged.remb_plaf1, 0)) # aged6 = elig2 * max_(P.aged.remb_taux2 * depenses - P.aged.remb_plaf2, 0) # return 12 * (aged3 + aged6) # annualisé @reference_formula class ape_temp(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"Allocation parentale d'éducation" stop_date = date(2004, 1, 1) url = "http://fr.wikipedia.org/wiki/Allocation_parentale_d'%C3%A9ducation_en_France" def function(self, simulation, period): ''' Allocation parentale d'éducation 'fam' L’allocation parentale d’éducation s’adresse aux parents qui souhaitent arrêter ou réduire leur activité pour s’occuper de leurs jeunes enfants, à condition que ceux-ci soient nés avant le 01/01/2004. En effet, pour les enfants nés depuis cette date, dans le cadre de la Prestation d’Accueil du Jeune Enfant, les parents peuvent bénéficier du « complément de libre choix d’activité. » Les personnes en couple peuvent toutes deux bénéficier de l’APE à taux plein, mais pas en même temps. En revanche, elles peuvent cumuler deux taux partiels, à condition que leur total ne dépasse pas le montant du taux plein. TODO: cumul, adoption, triplés, Cumul d'allocations : Cette allocation n'est pas cumulable pour un même ménage avec - une autre APE (sauf à taux partiel), - ou l'allocation pour jeune enfant (APJE) versée à partir de la naissance, - ou le complément familial, - ou l'allocation d’adulte handicapé (AAH). Enfin, il est à noter que cette allocation n’est pas cumulable avec : - une pension d’invalidité ou une retraite ; - des indemnités journalières de maladie, de maternité ou d’accident du travail ; - des allocations chômage. Il est tout de même possible de demander aux ASSEDIC la suspension de ces dernières pour percevoir l’APE. L'allocation parentale d'éducation n'est pas soumise à condition de ressources, sauf l’APE à taux partiel pour les professions non salariées. ''' period = period.start.offset('first-of', 'month').period('year') age_holder = simulation.compute('age', period) smic55_holder = simulation.compute('smic55', accept_other_period = True) inactif = simulation.calculate('inactif', period) partiel1 = simulation.calculate('partiel1', period) partiel2 = simulation.calculate('partiel2', period) P = simulation.legislation_at(period.start).fam age = self.split_by_roles(age_holder, roles = ENFS) smic55 = self.split_by_roles(smic55_holder, roles = ENFS) elig = (nb_enf(age, smic55, 0, P.ape.age - 1) >= 1) & (nb_enf(age, smic55, 0, P.af.age2) >= 2) # Inactif # Temps partiel 1 # Salarié: # Temps de travail ne dépassant pas 50 % de la durée du travail fixée dans l'entreprise # VRP ou non salarié travaillant à temps partiel: # Temps de travail ne dépassant pas 76 heures par mois et un revenu professionnel mensuel inférieur ou égal à # (smic_8.27*169*85 %) # partiel1 = zeros((12,self.taille)) # Temps partiel 2 # Salarié: # Salarié: Temps de travail compris entre 50 et 80 % de la durée du travail fixée dans l'entreprise. # Temps de travail compris entre 77 et 122 heures par mois et un revenu professionnel mensuel ne dépassant pas # (smic_8.27*169*136 %) ape = elig * (inactif * P.ape.tx_inactif + partiel1 * P.ape.tx_50 + partiel2 * P.ape.tx_80) # Cummul APE APJE CF return period, 12 * ape # annualisé @reference_formula class apje_temp(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"Allocation pour le jeune enfant" stop_date = date(2004, 1, 1) url = "http://vosdroits.service-public.fr/particuliers/F2552.xhtml" def function(self, simulation, period): ''' Allocation pour jeune enfant ''' period = period.start.offset('first-of', 'month').period('month') br_pf = simulation.calculate('br_pf', period.start.offset('first-of', 'month').period('month')) age_holder = simulation.compute('age', period) smic55_holder = simulation.compute('smic55', period.start.offset('first-of', 'month').period('month')) biact = simulation.calculate_add('biact', period) isol = simulation.calculate('isol', period) P = simulation.legislation_at(period.start).fam P_n_2 = simulation.legislation_at(period.start.offset(-2, 'year')).fam age = self.split_by_roles(age_holder, roles = ENFS) smic55 = self.split_by_roles(smic55_holder, roles = ENFS) # TODO: APJE courte voir doc ERF 2006 nbenf = nb_enf(age, smic55, 0, P.apje.age - 1) bmaf = P.af.bmaf bmaf_n_2 = P_n_2.af.bmaf base = round(P.apje.taux * bmaf, 2) base2 = round(P.apje.taux * bmaf_n_2, 2) plaf_tx = (nbenf > 0) + P.apje.plaf_tx1 * min_(nbenf, 2) + P.apje.plaf_tx2 * max_(nbenf - 2, 0) majo = isol | biact plaf = P.apje.plaf * plaf_tx + P.apje.plaf_maj * majo plaf2 = plaf + 12 * base2 apje = (nbenf >= 1) * ((br_pf <= plaf) * base + (br_pf > plaf) * max_(plaf2 - br_pf, 0) / 12.0) # Pour bénéficier de cette allocation, il faut que tous les enfants du foyer soient nés, adoptés, ou recueillis # en vue d’une adoption avant le 1er janvier 2004, et qu’au moins l’un d’entre eux ait moins de 3 ans. # Cette allocation est verséE du 5��me mois de grossesse jusqu���au mois précédant le 3ème anniversaire de # l’enfant. # Non cumul APE APJE CF # - L’allocation parentale d’éducation (APE), sauf pour les femmes enceintes. # L’APJE est alors versée du 5ème mois de grossesse jusqu’à la naissance de l’enfant. # - Le CF return period, apje @reference_formula class ape(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"Allocation parentale d'éducation" stop_date = date(2004, 1, 1) url = "http://fr.wikipedia.org/wiki/Allocation_parentale_d'%C3%A9ducation_en_France" def function(self, simulation, period): ''' L'allocation de base de la paje n'est pas cumulable avec le complément familial ''' period = period.start.offset('first-of', 'month').period('month') apje_temp = simulation.calculate('apje_temp', period) ape_temp = simulation.calculate('ape_temp', period) cf_temp = simulation.calculate('cf_temp', period) ape = (apje_temp < ape_temp) * (cf_temp < ape_temp) * ape_temp return period, round(ape, 2) @reference_formula class apje(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"Allocation pour le jeune enfant" stop_date = date(2004, 1, 1) url = "http://vosdroits.service-public.fr/particuliers/F2552.xhtml" def function(self, simulation, period): # L'APJE n'est pas cumulable avec le complément familial et l'APE period = period.start.offset('first-of', 'month').period('month') apje_temp = simulation.calculate('apje_temp', period) ape_temp = simulation.calculate('ape_temp', period) cf_temp = simulation.calculate('cf_temp', period) apje = (cf_temp < apje_temp) * (ape_temp < apje_temp) * apje_temp return period, round(apje, 2) PK'G$ @openfisca_france/model/prestations/prestations_familiales/asf.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import logical_not as not_ from ...base import * # noqa analysis:ignore # from .base_ressource import nb_enf @reference_formula class asf_elig_i(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = Individus label = u"Éligibilité à l'ASF (individuelle)" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age = simulation.calculate('age', period) smic55 = simulation.calculate('smic55', period) pensions_alimentaires_percues = simulation.calculate('pensions_alimentaires_percues', period) pfam = simulation.legislation_at(period.start).fam eligibilite = ( (age >= pfam.af.age1) * (age <= pfam.af.age3) * # Âge compatible avec les prestations familiales not_(smic55) * # Ne perçoit pas plus de ressources que "55% du SMIC" au sens CAF (pensions_alimentaires_percues == 0)) # Ne perçoit pas de pension alimentaire return period, eligibilite @reference_formula class asf_i(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"Montant à verser à l'individu pour l'ASF" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') asf_elig_i = simulation.calculate('asf_elig_i', period) pfam = simulation.legislation_at(period.start).fam return period, asf_elig_i * pfam.af.bmaf * pfam.asf.taux1 @reference_formula class asf_elig(SimpleFormulaColumn): column = BoolCol(default = False) entity_class = Familles label = u"Éligibilité à l'ASF" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') isol = simulation.calculate('isol', period) residence_mayotte = simulation.calculate('residence_mayotte', period) return period, not_(residence_mayotte) * isol # Parent isolé et ne résident pas à Mayotte @reference_formula class asf(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol(default = 0) entity_class = Familles label = u"Allocation de soutien familial (ASF)" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') asf_elig = simulation.calculate('asf_elig', period) asf_i_holder = simulation.compute('asf_i', period) montant = self.sum_by_entity(asf_i_holder, roles = ENFS) return period, asf_elig * montant PKF=openfisca_france/model/prestations/minima_sociaux/__init__.pyPK'GB338openfisca_france/model/prestations/minima_sociaux/aah.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import (maximum as max_) from ...base import * # noqa analysis:ignore @reference_formula class br_aah(SimpleFormulaColumn): column = FloatCol label = u"Base ressources de l'allocation adulte handicapé" entity_class = Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') # annee_fiscale_n_2 = period.start.offset('first-of', 'year').period('year').offset(-2) # inactifs ou travailleurs en ESAT : br_pf_n_2 = simulation.calculate_add('br_pf', period) # asi_n_2 = simulation.calculate_add('asi', annee_fiscale_n_2) # aspa_n_2 = simulation.calculate_add('aspa', annee_fiscale_n_2) # TODO: travailleurs en milieu protégé : les ressources celles des trois derniers mois. # toujours la même base ressources ? http://www.guide-familial.fr/actualite-149654--nouvelle-etape-dans-la-reforme-de-l-aah--la-prise-en-compte-trimestrielle-des-ressources.html return period, br_pf_n_2 # + asi_n_2 + aspa_n_2 ''' Allocation adulte handicapé Conditions liées au handicap La personne doit être atteinte d’un taux d’incapacité permanente : - d’au moins 80 %, - ou compris entre 50 et 79 %. Dans ce cas, elle doit remplir deux conditions supplémentaires : être dans l’impossibilité de se procurer un emploi compte tenu de son handicap et ne pas avoir travaillé depuis au moins 1 an Condition de résidence L'AAH peut être versée aux personnes résidant en France métropolitaine ou dans les départements d'outre-mer ou à Saint-Pierre et Miquelon de façon permanente. Les personnes de nationalité étrangère doivent être en possession d'un titre de séjour régulier ou être titulaire d'un récépissé de renouvellement de titre de séjour. Condition d'âge Age minimum : Le demandeur ne doit plus avoir l'âge de bénéficier de l'allocation d'éducation de l'enfant handicapé, c'est-à-dire qu'il doit être âgé : - de plus de vingt ans, - ou de plus de seize ans, s'il ne remplit plus les conditions pour ouvrir droit aux allocations familiales. Pour les montants http://www.handipole.org/spip.php?article666 Âge max_ Le versement de l'AAH prend fin à partir de l'âge minimum légal de départ à la retraite en cas d'incapacité de 50 % à 79 %. À cet âge, le bénéficiaire bascule dans le régime de retraite pour inaptitude. En cas d'incapacité d'au moins 80 %, une AAH différentielle (c'est-à-dire une allocation mensuelle réduite) peut être versée au-delà de l'âge minimum légal de départ à la retraite en complément d'une retraite inférieure au minimum vieillesse. N'entrent pas en compte dans les ressources : L'allocation compensatrice tierce personne, les allocations familiales, l'allocation de logement, la retraite du combattant, les rentes viagères constituées en faveur d'une personne handicapée ou dans la limite d'un montant fixé à l'article D.821-6 du code de la sécurité sociale (1 830 €/an), lorsqu'elles ont été constituées par une personne handicapée pour elle-même. Le RMI (article R 531-10 du code de la sécurité sociale). A partir du 1er juillet 2007, votre Caf, pour le calcul de votre Aah, continue à prendre en compte les ressources de votre foyer diminuées de 20%. Notez, dans certaines situations, la Caf évalue forfaitairement vos ressources à partir de votre revenu mensuel. ''' @reference_formula class aah_eligible(SimpleFormulaColumn): column = BoolCol label = u"Eligibilité à l'Allocation adulte handicapé" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') law = simulation.legislation_at(period.start) invalide = simulation.calculate('invalide', period) age = simulation.calculate('age', period) smic55 = simulation.calculate('smic55', period) eligible_aah = ( ((invalide) & (age <= law.minim.aah.age_legal_retraite)) & ((age >= law.fam.aeeh.age) | ((age >= 16) & (smic55))) ) return period, eligible_aah # TODO: dated_function : avant 2008, il fallait ne pas avoir travaillé pendant les 12 mois précédant la demande. @reference_formula class nb_eligib_aah(SimpleFormulaColumn): column = FloatCol label = "Nombre d'allocataires de l'AAH dans la famille" entity_class = Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') br_aah = simulation.calculate('br_aah', period) aah_eligible_holder = simulation.calculate('aah_eligible', period) aah_eligible = self.split_by_roles(aah_eligible_holder) nb_eligib_aah = 0.0 * br_aah for eligible in aah_eligible.values(): nb_eligib_aah = nb_eligib_aah + eligible return period, nb_eligib_aah @reference_formula class aah_famille(SimpleFormulaColumn): column = FloatCol label = u"Allocation adulte handicapé (Familles) mensualisée" entity_class = Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') law = simulation.legislation_at(period.start) br_aah = simulation.calculate('br_aah', period) concub = simulation.calculate('concub', period) af_nbenf = simulation.calculate('af_nbenf', period) nb_eligib_aah = simulation.calculate('nb_eligib_aah', period) plaf_ress_aah = 12 * law.minim.aah.montant * (1 + concub + law.minim.aah.tx_plaf_supp * af_nbenf) return period, nb_eligib_aah * max_(plaf_ress_aah - br_aah, 0) / 12 @reference_formula class aah(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol label = u"Allocation adulte handicapé (Individus) mensualisée" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') aah_eligible = simulation.calculate('aah_eligible', period) aah_famille_holder = simulation.compute('aah_famille', period) aah_famille = self.cast_from_entity_to_role(aah_famille_holder, role = VOUS) nb_eligib_aah_holder = simulation.compute('nb_eligib_aah', period) nb_eligib_aah = self.cast_from_entity_to_role(nb_eligib_aah_holder, role = VOUS) return period, aah_eligible * ( (nb_eligib_aah > 0) * aah_famille / max_(nb_eligib_aah, 1) ) @reference_formula class caah(DatedFormulaColumn): calculate_output = calculate_output_add column = FloatCol label = u"Complément d'allocation adulte handicapé (mensualisé)" entity_class = Individus ''' Complément d'allocation adulte handicapé : complément de ressources ou majoration vie autonome. Complément de ressources Pour bénéficier du complément de ressources, l’intéressé doit remplir les conditions suivantes : - percevoir l’allocation aux adultes handicapés à taux normal ou en complément d’une pension d’invalidité, d’une pension de vieillesse ou d’une rente accident du travail ; - avoir un taux d’incapacité égal ou supérieur à 80 % ; - avoir une capacité de travail, appréciée par la commission des droits et de l’autonomie (CDAPH) inférieure à 5 % du fait du handicap ; - ne pas avoir perçu de revenu à caractère professionnel depuis un an à la date du dépôt de la demande de complément ; - disposer d’un logement indépendant. A noter : une personne hébergée par un particulier à son domicile n’est pas considérée disposer d’un logement indépendant, sauf s’il s’agit de son conjoint, de son concubin ou de la personne avec laquelle elle est liée par un pacte civil de solidarité. Le complément de ressources est destiné aux personnes handicapées dans l’incapacité de travailler. Il est égal à la différence entre la garantie de ressources pour les personnes handicapées (GRPH) et l’AAH. Majoration pour la vie autonome La majoration pour la vie autonome est destinée à permettre aux personnes, en capacité de travailler et au chômage en raison de leur handicap, de pourvoir faire face à leur dépense de logement. Conditions d'attribution La majoration pour la vie autonome est versée automatiquement aux personnes qui remplissent les conditions suivantes : - percevoir l'AAH à taux normal ou en complément d'un avantage vieillesse ou d'invalidité ou d'une rente accident du travail, - avoir un taux d'incapacité au moins égal à 80 %, - disposer d'un logement indépendant, - bénéficier d'une aide au logement (aide personnelle au logement, ou allocation de logement sociale ou familiale), comme titulaire du droit, ou comme conjoint, concubin ou partenaire lié par un Pacs au titulaire du droit, - ne pas percevoir de revenu d'activité à caractère professionnel propre. Choix entre la majoration ou la garantie de ressources La majoration pour la vie autonome n'est pas cumulable avec la garantie de ressources pour les personnes handicapées. La personne qui remplit les conditions d'octroi de ces deux avantages doit choisir de bénéficier de l'un ou de l'autre. ''' @dated_function(start = date(2005, 7, 1)) def function_2005_07_01(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') law = simulation.legislation_at(period.start) grph = law.minim.caah.grph aah_montant = law.minim.aah.montant aah = simulation.calculate('aah', period) asi_elig = simulation.calculate('asi_elig', period) asi_holder = simulation.compute('asi', period) # montant asi de la famille asi = self.cast_from_entity_to_roles(asi_holder) # attribué à tous les membres de la famille benef_asi = (asi_elig * (asi > 0)) al_holder = simulation.compute('aide_logement_montant', period) # montant allocs logement de la famille al = self.cast_from_entity_to_roles(al_holder) # attribué à tout individu membre de la famille elig_cpl = ((aah > 0) | (benef_asi > 0)) # TODO: & logement indépendant & inactif 12 derniers mois # & capa de travail < 5% & taux d'invalidité >= 80% compl_ress = elig_cpl * max_(grph - aah_montant, 0) elig_mva = (al > 0) * ((aah > 0) | (benef_asi > 0)) # TODO: & logement indépendant & pas de revenus professionnels # propres & capa de travail < 5% & taux d'invalidité >= 80% mva = 0.0 * elig_mva # TODO: rentrer mva dans paramètres. mva (mensuelle) = 104,77 en 2015, était de 101,80 en 2006, et de 119,72 en 2007 return period, max_(compl_ress, mva) @dated_function(start = date(2002, 1, 1), stop = date(2005, 6, 30)) # TODO FIXME start date def function_2005_06_30(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') law = simulation.legislation_at(period.start) cpltx = law.minim.caah.cpltx aah_montant = law.minim.aah.montant aah = simulation.calculate('aah', period) asi_elig = simulation.calculate('asi_elig', period) asi_holder = simulation.compute('asi', period) # montant asi de la famille asi = self.cast_from_entity_to_roles(asi_holder) # attribué à tous les membres de la famille benef_asi = (asi_elig * (asi > 0)) al_holder = simulation.compute('aide_logement_montant', period) # montant allocs logement de la famille al = self.cast_from_entity_to_roles(al_holder) # attribué à tout individu membre de la famille elig_ancien_caah = (al > 0) * ((aah > 0) | (benef_asi > 0)) # TODO: & invalidité >= 80% & logement indépendant ancien_caah = cpltx * aah_montant * elig_ancien_caah # En fait le taux cpltx perdure jusqu'en 2008 return period, ancien_caah PK'G.I?%?%8openfisca_france/model/prestations/minima_sociaux/ass.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import (absolute as abs_, logical_and as and_, logical_not as not_, logical_or as or_, maximum as max_, minimum as min_) from ...base import * # noqa analysis:ignore build_column('ass_precondition_remplie', BoolCol(entity = "ind", label = u"Éligible à l'ASS")) @reference_formula class ass(SimpleFormulaColumn): column = FloatCol label = u"Montant de l'ASS pour une famille" entity_class = Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') ass_base_ressources = simulation.calculate('ass_base_ressources', period) ass_eligibilite_i_holder = simulation.compute('ass_eligibilite_i', period) concub = simulation.calculate('concub', period) ass_params = simulation.legislation_at(period.start).minim.ass ass_eligibilite_i = self.split_by_roles(ass_eligibilite_i_holder, roles = [CHEF, PART]) elig = or_(ass_eligibilite_i[CHEF], ass_eligibilite_i[PART]) montant_journalier = ass_params.montant_plein montant_mensuel = 30 * montant_journalier plafond_mensuel = montant_journalier * (ass_params.plaf_seul * not_(concub) + ass_params.plaf_coup * concub) revenus = ass_base_ressources / 12 ass = min_(montant_mensuel, plafond_mensuel - revenus) ass = max_(ass, 0) ass = ass * elig ass = ass * not_(ass < ass_params.montant_plein) # pas d'ASS si montant mensuel < montant journalier de base return period, ass @reference_formula class ass_base_ressources(SimpleFormulaColumn): column = FloatCol label = u"Base de ressources de l'ASS" entity_class = Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') ass_base_ressources_i_holder = simulation.compute('ass_base_ressources_i', period) ass_base_ressources_demandeur = self.filter_role(ass_base_ressources_i_holder, role = CHEF) ass_base_ressources_conjoint_holder = simulation.compute('ass_base_ressources_conjoint', period) ass_base_ressources_conjoint = self.filter_role(ass_base_ressources_conjoint_holder, role = PART) result = ass_base_ressources_demandeur + ass_base_ressources_conjoint return period, result @reference_formula class ass_base_ressources_i(SimpleFormulaColumn): column = FloatCol label = u"Base de ressources individuelle de l'ASS" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') previous_year = period.start.period('year').offset(-1) salaire_imposable = simulation.calculate_add('salaire_imposable', previous_year) salaire_imposable_this_month = simulation.calculate('salaire_imposable', period) salaire_imposable_interrompu = (salaire_imposable > 0) * (salaire_imposable_this_month == 0) # Le Salaire d'une activité partielle est neutralisé en cas d'interruption salaire_imposable = (1 - salaire_imposable_interrompu) * salaire_imposable rstnet = simulation.calculate('rstnet', previous_year) tns_auto_entrepreneur_benefice = simulation.calculate_add('tns_auto_entrepreneur_benefice', previous_year) tns_micro_entreprise_benefice = simulation.calculate_add('tns_micro_entreprise_benefice', period) tns_benefice_exploitant_agricole = simulation.calculate('tns_benefice_exploitant_agricole', period) tns_autres_revenus = simulation.calculate('tns_autres_revenus', period) pensions_alimentaires_percues = simulation.calculate('pensions_alimentaires_percues', previous_year) pensions_alimentaires_versees_individu = simulation.calculate( 'pensions_alimentaires_versees_individu', previous_year ) aah = simulation.calculate_add('aah', previous_year) indemnites_stage = simulation.calculate('indemnites_stage', previous_year) revenus_stage_formation_pro = simulation.calculate('revenus_stage_formation_pro', previous_year) return period, ( salaire_imposable + rstnet + pensions_alimentaires_percues - abs_(pensions_alimentaires_versees_individu) + aah + indemnites_stage + revenus_stage_formation_pro + tns_auto_entrepreneur_benefice + tns_micro_entreprise_benefice + tns_benefice_exploitant_agricole + tns_autres_revenus ) @reference_formula class ass_base_ressources_conjoint(SimpleFormulaColumn): column = FloatCol label = u"Base de ressources individuelle pour le conjoint du demandeur de l'ASS" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') previous_year = period.start.period('year').offset(-1) last_month = period.start.period('month').offset(-1) has_ressources_substitution = ( simulation.calculate('chonet', last_month) + simulation.calculate('indemnites_journalieres', last_month) + simulation.calculate('rstnet', last_month) ) > 0 def calculateWithAbatement(ressourceName, neutral_totale = False): ressource_year = simulation.calculate_add(ressourceName, previous_year) ressource_last_month = simulation.calculate(ressourceName, last_month) ressource_interrompue = (ressource_year > 0) * (ressource_last_month == 0) # Les ressources interrompues sont abattues différement si elles sont substituées ou non. # http://www.legifrance.gouv.fr/affichCodeArticle.do?idArticle=LEGIARTI000020398006&cidTexte=LEGITEXT000006072050 tx_abat_partiel = simulation.legislation_at(period.start).minim.ass.abat_rev_subst_conj tx_abat_total = simulation.legislation_at(period.start).minim.ass.abat_rev_non_subst_conj abat_partiel = ressource_interrompue * has_ressources_substitution * (1 - neutral_totale) abat_total = ressource_interrompue * (1 - abat_partiel) tx_abat_applique = abat_partiel * tx_abat_partiel + abat_total * tx_abat_total return (1 - tx_abat_applique) * ressource_year salaire_imposable = calculateWithAbatement('salaire_imposable') indemnites_stage = calculateWithAbatement('indemnites_stage', neutral_totale = True) revenus_stage_formation_pro = calculateWithAbatement('revenus_stage_formation_pro') chonet = calculateWithAbatement('chonet', neutral_totale = True) indemnites_journalieres = calculateWithAbatement('indemnites_journalieres') aah = calculateWithAbatement('aah') rstnet = calculateWithAbatement('rstnet') pensions_alimentaires_percues = calculateWithAbatement('pensions_alimentaires_percues') tns_auto_entrepreneur_benefice = calculateWithAbatement('tns_auto_entrepreneur_benefice') tns_micro_entreprise_benefice = simulation.calculate_add('tns_micro_entreprise_benefice', period) tns_benefice_exploitant_agricole = simulation.calculate('tns_benefice_exploitant_agricole', period) tns_autres_revenus = simulation.calculate('tns_autres_revenus', period) pensions_alimentaires_versees_individu = simulation.calculate_add( 'pensions_alimentaires_versees_individu', previous_year ) result = ( salaire_imposable + pensions_alimentaires_percues - abs_(pensions_alimentaires_versees_individu) + aah + indemnites_stage + revenus_stage_formation_pro + rstnet + chonet + indemnites_journalieres + tns_auto_entrepreneur_benefice + tns_micro_entreprise_benefice + tns_benefice_exploitant_agricole + tns_autres_revenus ) return period, result @reference_formula class ass_eligibilite_i(SimpleFormulaColumn): column = BoolCol label = u"Éligibilité individuelle à l'ASS" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') # 1 si demandeur d'emploi activite = simulation.calculate('activite', period) # Indique que l'user a travaillé 5 ans au cours des 10 dernieres années. ass_precondition_remplie = simulation.calculate('ass_precondition_remplie', period) are_perceived_this_month = simulation.calculate('chonet', period) return period, and_(and_(activite == 1, ass_precondition_remplie), are_perceived_this_month == 0) PK'Gϫ )E)E8openfisca_france/model/prestations/minima_sociaux/cmu.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from functools import partial from numpy import (absolute as abs_, apply_along_axis, array, int32, logical_not as not_, logical_or as or_, maximum as max_, minimum as min_, zeros) from ...base import * # noqa analysis:ignore @reference_formula class acs_montant(DatedFormulaColumn): column = FloatCol entity_class = Familles label = u"Montant de l'ACS en cas d'éligibilité" @dated_function(date(2000, 1, 1), date(2009, 7, 31)) def function_2000(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age_holder = simulation.compute('age', period) ages = self.filter_role(age_holder, role = CHEF) return period, 0 * ages @dated_function(date(2009, 8, 1)) def function_2009(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age_holder = simulation.compute('age', period) P = simulation.legislation_at(period.start).cmu ages_couple = self.split_by_roles(age_holder, roles = [CHEF, PART]) ages_pac = self.split_by_roles(age_holder, roles = ENFS) return period, ((nb_par_age(ages_couple, 0, 15) + nb_par_age(ages_pac, 0, 15)) * P.acs_moins_16_ans + (nb_par_age(ages_couple, 16, 49) + nb_par_age(ages_pac, 16, 25)) * P.acs_16_49_ans + nb_par_age(ages_couple, 50, 59) * P.acs_50_59_ans + nb_par_age(ages_couple, 60, 200) * P.acs_plus_60_ans) @reference_formula class cmu_forfait_logement_base(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Forfait logement applicable en cas de propriété ou d'occupation à titre gratuit" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') cmu_nbp_foyer = simulation.calculate('cmu_nbp_foyer', period) P = simulation.legislation_at(period.start).cmu.forfait_logement law_rsa = simulation.legislation_at(period.start).minim.rmi return period, forfait_logement(cmu_nbp_foyer, P, law_rsa) @reference_formula class cmu_forfait_logement_al(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Forfait logement applicable en cas d'aide au logement" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') cmu_nbp_foyer = simulation.calculate('cmu_nbp_foyer', period) P = simulation.legislation_at(period.start).cmu.forfait_logement_al law_rsa = simulation.legislation_at(period.start).minim.rmi return period, forfait_logement(cmu_nbp_foyer, P, law_rsa) @reference_formula class cmu_nbp_foyer(SimpleFormulaColumn): column = PeriodSizeIndependentIntCol entity_class = Familles label = u"Nombre de personnes dans le foyer CMU" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') nb_par = simulation.calculate('nb_par', period) cmu_nb_pac = simulation.calculate('cmu_nb_pac', period) return period, nb_par + cmu_nb_pac @reference_formula class cmu_eligible_majoration_dom(SimpleFormulaColumn): column = BoolCol entity_class = Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') residence_guadeloupe = simulation.calculate('residence_guadeloupe', period) residence_martinique = simulation.calculate('residence_martinique', period) residence_guyane = simulation.calculate('residence_guyane', period) residence_reunion = simulation.calculate('residence_reunion', period) return period, residence_guadeloupe | residence_martinique | residence_guyane | residence_reunion @reference_formula class cmu_c_plafond(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Plafond annuel de ressources pour l'éligibilité à la CMU-C" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age_holder = simulation.compute('age', period) alt_holder = simulation.compute('alt', period) cmu_eligible_majoration_dom = simulation.calculate('cmu_eligible_majoration_dom', period) # cmu_nbp_foyer = simulation.calculate('cmu_nbp_foyer', period) P = simulation.legislation_at(period.start).cmu PAC = [PART] + ENFS # Calcul du coefficient personnes à charge, avec prise en compte de la garde alternée # Tableau des coefficients coefficients_array = array( [P.coeff_p2, P.coeff_p3_p4, P.coeff_p3_p4] + [P.coeff_p5_plus] * (len(PAC) - 3) ) # Tri des personnes à charge, le conjoint en premier, les enfants par âge décroissant age_by_role = self.split_by_roles(age_holder, roles = PAC) alt_by_role = self.split_by_roles(alt_holder, roles = PAC) age_and_alt_matrix = array( [ (role == PART) * 10000 + age_by_role[role] * 10 + alt_by_role[role] - (age_by_role[role] < 0) * 999999 for role in sorted(age_by_role) ] ).transpose() # Calcul avec matrices intermédiaires reverse_sorted = partial(sorted, reverse = True) sorted_age_and_alt_matrix = apply_along_axis(reverse_sorted, 1, age_and_alt_matrix) # Calcule weighted_alt_matrix, qui vaut 0.5 pour les enfants en garde alternée, 1 sinon. sorted_present_matrix = sorted_age_and_alt_matrix >= 0 sorted_alt_matrix = (sorted_age_and_alt_matrix % 10) * sorted_present_matrix weighted_alt_matrix = sorted_present_matrix - sorted_alt_matrix * 0.5 # Calcul final du coefficient coeff_pac = weighted_alt_matrix.dot(coefficients_array) return period, (P.plafond_base * (1 + cmu_eligible_majoration_dom * P.majoration_dom) * (1 + coeff_pac) ) @reference_formula class acs_plafond(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Plafond annuel de ressources pour l'éligibilité à l'ACS" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') cmu_c_plafond = simulation.calculate('cmu_c_plafond', period) P = simulation.legislation_at(period.start).cmu return period, cmu_c_plafond * (1 + P.majoration_plafond_acs) @reference_formula class cmu_base_ressources_i(SimpleFormulaColumn): column = FloatCol label = u"Base de ressources de l'individu prise en compte pour l'éligibilité à la CMU-C / ACS" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') previous_year = period.start.period('year').offset(-1) last_month = period.start.period('month').offset(-1) activite = simulation.calculate('activite', period) salaire_net = simulation.calculate('salaire_net', previous_year) chonet = simulation.calculate('chonet', previous_year) rstnet = simulation.calculate('rstnet', previous_year) pensions_alimentaires_percues = simulation.calculate('pensions_alimentaires_percues', previous_year) pensions_alimentaires_versees_individu = simulation.calculate( 'pensions_alimentaires_versees_individu', previous_year ) rsa_base_ressources_patrimoine_i = simulation.calculate_add('rsa_base_ressources_patrimoine_i', previous_year) aah = simulation.calculate_add('aah', previous_year) indemnites_journalieres = simulation.calculate('indemnites_journalieres', previous_year) indemnites_stage = simulation.calculate('indemnites_stage', previous_year) revenus_stage_formation_pro_annee = simulation.calculate('revenus_stage_formation_pro', previous_year) revenus_stage_formation_pro_dernier_mois = simulation.calculate('revenus_stage_formation_pro', last_month) allocation_securisation_professionnelle = simulation.calculate( 'allocation_securisation_professionnelle', previous_year ) prime_forfaitaire_mensuelle_reprise_activite = simulation.calculate( 'prime_forfaitaire_mensuelle_reprise_activite', previous_year ) dedommagement_victime_amiante = simulation.calculate('dedommagement_victime_amiante', previous_year) prestation_compensatoire = simulation.calculate('prestation_compensatoire', previous_year) retraite_combattant = simulation.calculate('retraite_combattant', previous_year) pensions_invalidite = simulation.calculate('pensions_invalidite', previous_year) indemnites_chomage_partiel = simulation.calculate('indemnites_chomage_partiel', previous_year) bourse_enseignement_sup = simulation.calculate('bourse_enseignement_sup', previous_year) bourse_recherche = simulation.calculate('bourse_recherche', previous_year) gains_exceptionnels = simulation.calculate('gains_exceptionnels', previous_year) tns_total_revenus_net = simulation.calculate_add('tns_total_revenus_net', previous_year) P = simulation.legislation_at(period.start).cmu # Revenus de stage de formation professionnelle exclus si plus perçus depuis 1 mois revenus_stage_formation_pro = revenus_stage_formation_pro_annee * (revenus_stage_formation_pro_dernier_mois > 0) # Abattement sur revenus d'activité si chômage ou formation professionnelle abattement_chomage_fp = or_(activite == 1, revenus_stage_formation_pro_dernier_mois > 0) return period, ((salaire_net + indemnites_chomage_partiel) * (1 - abattement_chomage_fp * P.abattement_chomage) + indemnites_stage + aah + chonet + rstnet + pensions_alimentaires_percues - abs_(pensions_alimentaires_versees_individu) + rsa_base_ressources_patrimoine_i + allocation_securisation_professionnelle + indemnites_journalieres + prime_forfaitaire_mensuelle_reprise_activite + dedommagement_victime_amiante + prestation_compensatoire + retraite_combattant + pensions_invalidite + bourse_enseignement_sup + bourse_recherche + gains_exceptionnels + tns_total_revenus_net + revenus_stage_formation_pro) @reference_formula class cmu_base_ressources(SimpleFormulaColumn): column = FloatCol label = u"Base de ressources prise en compte pour l'éligibilité à la CMU-C / ACS" entity_class = Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') previous_year = period.start.period('year').offset(-1) aspa = simulation.calculate('aspa', period) ass = simulation.calculate('ass', period) asi = simulation.calculate('asi', period) af = simulation.calculate('af', period) cf = simulation.calculate_divide('cf', period) asf = simulation.calculate_divide('asf', period) paje_clca = simulation.calculate_add('paje_clca', previous_year) paje_prepare = simulation.calculate_add('paje_prepare', previous_year) statut_occupation_holder = simulation.compute('statut_occupation', period) aide_logement = simulation.calculate('aide_logement', period) cmu_forfait_logement_base = simulation.calculate('cmu_forfait_logement_base', period) cmu_forfait_logement_al = simulation.calculate('cmu_forfait_logement_al', period) age_holder = simulation.compute('age', period) cmu_base_ressources_i_holder = simulation.compute('cmu_base_ressources_i', period) P = simulation.legislation_at(period.start).cmu statut_occupation = self.cast_from_entity_to_roles(statut_occupation_holder) statut_occupation = self.filter_role(statut_occupation, role = CHEF) cmu_br_i_par = self.split_by_roles(cmu_base_ressources_i_holder, roles = [CHEF, PART]) cmu_br_i_pac = self.split_by_roles(cmu_base_ressources_i_holder, roles = ENFS) age_pac = self.split_by_roles(age_holder, roles = ENFS) forfait_logement = (((statut_occupation == 2) + (statut_occupation == 6)) * cmu_forfait_logement_base + (aide_logement > 0) * min_(cmu_forfait_logement_al, aide_logement * 12)) res = cmu_br_i_par[CHEF] + cmu_br_i_par[PART] + forfait_logement # Prestations calculées, donc valeurs mensuelles. On estime l'annuel en multipliant par 12 res += 12 * (aspa + ass + asi + af + cf + asf) res += paje_clca + paje_prepare for key, age in age_pac.iteritems(): res += (0 <= age) * (age <= P.age_limite_pac) * cmu_br_i_pac[key] return period, res @reference_formula class cmu_nb_pac(SimpleFormulaColumn): column = PeriodSizeIndependentIntCol entity_class = Familles label = u"Nombre de personnes à charge au titre de la CMU" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age_holder = simulation.compute('age', period) P = simulation.legislation_at(period.start).cmu ages = self.split_by_roles(age_holder, roles = ENFS) return period, nb_par_age(ages, 0, P.age_limite_pac) @reference_formula class cmu_c(SimpleFormulaColumn): ''' Détermine si le foyer a droit à la CMU complémentaire ''' column = BoolCol label = u"Éligibilité à la CMU-C" entity_class = Familles def function(self, simulation, period): # Note : Cette variable est calculée pour un an, mais si elle est demandée pour une période plus petite, elle # répond pour la période demandée. this_month = period.start.period('month').offset('first-of') this_rolling_year = this_month.start.period('year') if period.stop > this_rolling_year.stop: period = this_rolling_year else: period = this_month cmu_c_plafond = simulation.calculate('cmu_c_plafond', this_month) cmu_base_ressources = simulation.calculate('cmu_base_ressources', this_month) residence_mayotte = simulation.calculate('residence_mayotte', this_month) rsa_socle = simulation.calculate('rsa_socle', this_month) rsa_socle_majore = simulation.calculate('rsa_socle_majore', this_month) rsa_forfait_logement = simulation.calculate('rsa_forfait_logement', this_month) br_rmi = simulation.calculate('br_rmi', this_month) socle = max_(rsa_socle, rsa_socle_majore) eligibilite_basique = cmu_base_ressources <= cmu_c_plafond eligibilite_rsa = (socle > 0) * (br_rmi < socle - rsa_forfait_logement) return period, not_(residence_mayotte) * or_(eligibilite_basique, eligibilite_rsa) @reference_formula class acs(SimpleFormulaColumn): ''' Calcule le montant de l'ACS auquel le foyer a droit ''' column = FloatCol label = u"Éligibilité à l'ACS" entity_class = Familles def function(self, simulation, period): period = period.start.period('month').offset('first-of') cmu_c = simulation.calculate('cmu_c', period) cmu_base_ressources = simulation.calculate('cmu_base_ressources', period) acs_plafond = simulation.calculate('acs_plafond', period) acs_montant = simulation.calculate('acs_montant', period) residence_mayotte = simulation.calculate('residence_mayotte', period) return period, not_(residence_mayotte) * not_(cmu_c) * (cmu_base_ressources <= acs_plafond) * acs_montant / 12 ############################################################################ # Helper functions ############################################################################ def forfait_logement(nbp_foyer, P, law_rsa): ''' Calcule le forfait logement en fonction du nombre de personnes dans le "foyer CMU" et d'un jeu de taux ''' return (12 * rsa_socle_base(nbp_foyer, law_rsa) * ((nbp_foyer == 1) * P.taux_1p + (nbp_foyer == 2) * P.taux_2p + (nbp_foyer > 2) * P.taux_3p_plus)) def nb_par_age(ages, min, max): ''' Calcule le nombre d'individus ayant un âge compris entre min et max ''' res = None for key, age in ages.iteritems(): if res is None: res = zeros(len(age), dtype = int32) res += (min <= age) & (age <= max) return res def rsa_socle_base(nbp, P): ''' Calcule le RSA socle du foyer pour nombre de personnes donné ''' return P.rmi * (1 + P.txp2 * (nbp >= 2) + P.txp3 * (nbp >= 3) + P.txps * max_(0, nbp - 3)) PK'GtM=M==openfisca_france/model/prestations/minima_sociaux/asi_aspa.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import abs as abs_, logical_not as not_, logical_or as or_, maximum as max_ from ...base import * # noqa analysis:ignore reference_input_variable( name = "inapte_travail", column = BoolCol, entity_class = Individus, label = u"Reconnu inapte au travail", ) reference_input_variable( name = "taux_invalidite", column = FloatCol, entity_class = Individus, label = u"Taux d'invalidité", ) @reference_formula class br_mv_i(SimpleFormulaColumn): column = FloatCol label = u"Base ressources individuelle du minimum vieillesse/ASPA" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') three_previous_months = period.start.period('month', 3).offset(-3) aspa_elig = simulation.calculate('aspa_elig', period) aspa_couple_holder = simulation.compute('aspa_couple', period) salaire_de_base = simulation.calculate_add('salaire_de_base', three_previous_months) chonet = simulation.calculate_add('chonet', three_previous_months) rstbrut = simulation.calculate_add('rstbrut', three_previous_months) pensions_alimentaires_percues = simulation.calculate('pensions_alimentaires_percues', three_previous_months) pensions_alimentaires_versees_individu = simulation.calculate( 'pensions_alimentaires_versees_individu', three_previous_months ) rto_declarant1 = simulation.calculate_add('rto_declarant1', three_previous_months) rpns = simulation.calculate_add_divide('rpns', three_previous_months) rev_cap_bar_holder = simulation.compute_add_divide('rev_cap_bar', three_previous_months) rev_cap_lib_holder = simulation.compute_add_divide('rev_cap_lib', three_previous_months) rfon_ms = simulation.calculate_add_divide('rfon_ms', three_previous_months) div_ms = simulation.calculate_add_divide('div_ms', three_previous_months) revenus_stage_formation_pro = simulation.calculate('revenus_stage_formation_pro', three_previous_months) allocation_securisation_professionnelle = simulation.calculate( 'allocation_securisation_professionnelle', three_previous_months ) prime_forfaitaire_mensuelle_reprise_activite = simulation.calculate( 'prime_forfaitaire_mensuelle_reprise_activite', three_previous_months ) dedommagement_victime_amiante = simulation.calculate('dedommagement_victime_amiante', three_previous_months) prestation_compensatoire = simulation.calculate('prestation_compensatoire', three_previous_months) pensions_invalidite = simulation.calculate('pensions_invalidite', three_previous_months) gains_exceptionnels = simulation.calculate('gains_exceptionnels', three_previous_months) indemnites_chomage_partiel = simulation.calculate('indemnites_chomage_partiel', three_previous_months) indemnites_journalieres = simulation.calculate('indemnites_journalieres', three_previous_months) indemnites_volontariat = simulation.calculate('indemnites_volontariat', three_previous_months) tns_total_revenus_net = simulation.calculate_add('tns_total_revenus_net', three_previous_months) rsa_base_ressources_patrimoine_i = simulation.calculate_add( 'rsa_base_ressources_patrimoine_i', three_previous_months ) aah = simulation.calculate_add('aah', three_previous_months) legislation = simulation.legislation_at(period.start) leg_1er_janvier = simulation.legislation_at(period.start.offset('first-of', 'year')) aspa_couple = self.cast_from_entity_to_role(aspa_couple_holder, role = VOUS) rev_cap_bar = self.cast_from_entity_to_role(rev_cap_bar_holder, role = VOUS) rev_cap_lib = self.cast_from_entity_to_role(rev_cap_lib_holder, role = VOUS) # Inclus l'AAH si conjoint non pensionné ASPA, retraite et pension invalidité # FIXME Il faudrait vérifier que le conjoint est pensionné ASPA, pas qu'il est juste éligible ! aah = aah * not_(aspa_elig) # Abattement sur les salaires (appliqué sur une base trimestrielle) abattement_forfaitaire_base = ( leg_1er_janvier.cotsoc.gen.smic_h_b * legislation.minim.aspa.abattement_forfaitaire_nb_h ) abattement_forfaitaire_taux = (aspa_couple * legislation.minim.aspa.abattement_forfaitaire_tx_couple + not_(aspa_couple) * legislation.minim.aspa.abattement_forfaitaire_tx_seul ) abattement_forfaitaire = abattement_forfaitaire_base * abattement_forfaitaire_taux salaire_de_base = max_(0, salaire_de_base - abattement_forfaitaire) return period, (salaire_de_base + chonet + rstbrut + pensions_alimentaires_percues - abs_(pensions_alimentaires_versees_individu) + rto_declarant1 + rpns + max_(0, rev_cap_bar) + max_(0, rev_cap_lib) + max_(0, rfon_ms) + max_(0, div_ms) + # max_(0,etr) + revenus_stage_formation_pro + allocation_securisation_professionnelle + prime_forfaitaire_mensuelle_reprise_activite + dedommagement_victime_amiante + prestation_compensatoire + pensions_invalidite + gains_exceptionnels + indemnites_journalieres + indemnites_chomage_partiel + indemnites_volontariat + tns_total_revenus_net + rsa_base_ressources_patrimoine_i + aah ) / 3 @reference_formula class br_mv(SimpleFormulaColumn): column = FloatCol label = u"Base ressource du minimum vieillesse et assimilés (ASPA)" entity_class = Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') br_mv_i_holder = simulation.compute('br_mv_i', period) ass = simulation.calculate_divide('ass', period) br_mv_i = self.split_by_roles(br_mv_i_holder, roles = [CHEF, PART]) return period, ass + br_mv_i[CHEF] + br_mv_i[PART] @reference_formula class aspa_elig(SimpleFormulaColumn): column = BoolCol label = u"Indicatrice individuelle d'éligibilité à l'allocation de solidarité aux personnes agées" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age = simulation.calculate('age', period) inapte_travail = simulation.calculate('inapte_travail', period) taux_invalidite = simulation.calculate('taux_invalidite', period) P = simulation.legislation_at(period.start).minim condition_invalidite = (taux_invalidite > P.aspa.taux_invalidite_aspa_anticipe) + inapte_travail condition_age_base = (age >= P.aspa.age_min) condition_age_anticipe = (age >= P.aah.age_legal_retraite) * condition_invalidite condition_age = condition_age_base + condition_age_anticipe return period, condition_age @reference_formula class asi_elig(SimpleFormulaColumn): column = BoolCol label = u"Indicatrice individuelle d'éligibilité à l'allocation supplémentaire d'invalidité" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') last_month = period.start.period('month').offset(-1) aspa_elig = simulation.calculate('aspa_elig', period) invalide = simulation.calculate('invalide', period) rstnet = simulation.calculate('rstnet', last_month) pensions_invalidite = simulation.calculate('pensions_invalidite', last_month) condition_situation = invalide & not_(aspa_elig) condition_pensionnement = (rstnet + pensions_invalidite) > 0 return period, condition_situation * condition_pensionnement @reference_formula class asi_aspa_nb_alloc(SimpleFormulaColumn): column = IntCol label = u"Nombre d'allocataires ASI/ASPA" entity_class = Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') aspa_elig_holder = simulation.compute('aspa_elig', period) asi_elig_holder = simulation.compute('asi_elig', period) asi_elig = self.split_by_roles(asi_elig_holder, roles = [CHEF, PART]) aspa_elig = self.split_by_roles(aspa_elig_holder, roles = [CHEF, PART]) return period, (1 * aspa_elig[CHEF] + 1 * aspa_elig[PART] + 1 * asi_elig[CHEF] + 1 * asi_elig[PART]) @reference_formula class asi(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol label = u"Allocation supplémentaire d'invalidité" start_date = date(2007, 1, 1) url = u"http://vosdroits.service-public.fr/particuliers/F16940.xhtml" entity_class = Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') asi_elig_holder = simulation.compute('asi_elig', period) aspa_elig_holder = simulation.compute('aspa_elig', period) maries = simulation.calculate('maries', period) concub = simulation.calculate('concub', period) asi_aspa_nb_alloc = simulation.calculate('asi_aspa_nb_alloc', period) br_mv = simulation.calculate('br_mv', period) P = simulation.legislation_at(period.start).minim asi_elig = self.split_by_roles(asi_elig_holder, roles = [CHEF, PART]) aspa_elig = self.split_by_roles(aspa_elig_holder, roles = [CHEF, PART]) # Un seul éligible elig1 = ((asi_aspa_nb_alloc == 1) & (asi_elig[CHEF] | asi_elig[PART])) # Couple d'éligibles mariés elig2 = asi_elig[CHEF] & asi_elig[PART] & maries # Couple d'éligibles non mariés elig3 = asi_elig[CHEF] & asi_elig[PART] & not_(maries) # Un seul éligible et époux éligible ASPA elig4 = ((asi_elig[CHEF] & aspa_elig[PART]) | (asi_elig[PART] & aspa_elig[CHEF])) & maries # Un seul éligible et conjoint non marié éligible ASPA elig5 = ((asi_elig[CHEF] & aspa_elig[PART]) | (asi_elig[PART] & aspa_elig[CHEF])) & not_(maries) elig = elig1 | elig2 | elig3 | elig4 | elig5 montant_max = (elig1 * P.asi.montant_seul + elig2 * P.asi.montant_couple + elig3 * 2 * P.asi.montant_seul + elig4 * (P.asi.montant_couple / 2 + P.aspa.montant_couple / 2) + elig5 * (P.asi.montant_seul + P.aspa.montant_couple / 2)) / 12 ressources = br_mv + montant_max plafond_ressources = (elig1 * (P.asi.plaf_seul * not_(concub) + P.asi.plaf_couple * concub) + elig2 * P.asi.plaf_couple + elig3 * P.asi.plaf_couple + elig4 * P.aspa.plaf_couple + elig5 * P.aspa.plaf_couple) / 12 depassement = max_(ressources - plafond_ressources, 0) diff = ((elig1 | elig2 | elig3) * (montant_max - depassement) + elig4 * (P.asi.montant_couple / 12 / 2 - depassement / 2) + elig5 * (P.asi.montant_seul / 12 - depassement / 2)) # Montant mensuel servi (sous réserve d'éligibilité) montant_servi_asi = max_(diff, 0) # TODO: Faute de mieux, on verse l'asi à la famille plutôt qu'aux individus # asi[CHEF] = asi_elig[CHEF]*montant_servi_asi*(elig1*1 + elig2/2 + elig3/2) # asi[PART] = asi_elig[PART]*montant_servi_asi*(elig1*1 + elig2/2 + elig3/2) return period, elig * montant_servi_asi @reference_formula class aspa_couple(DatedFormulaColumn): column = BoolCol label = u"Couple au sens de l'ASPA" entity_class = Familles @dated_function(date(2002, 1, 1), date(2006, 12, 31)) def function_2002_2006(self, simulation, period): period = period maries = simulation.calculate('maries', period) return period, maries @dated_function(date(2007, 1, 1)) def function_2007(self, simulation, period): period = period concub = simulation.calculate('concub', period) return period, concub @reference_formula class aspa(SimpleFormulaColumn): calculate_output = calculate_output_add column = FloatCol entity_class = Familles label = u"Allocation de solidarité aux personnes agées" url = "http://vosdroits.service-public.fr/particuliers/F16871.xhtml" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') asi_elig_holder = simulation.compute('asi_elig', period) aspa_elig_holder = simulation.compute('aspa_elig', period) maries = simulation.calculate('maries', period) concub = simulation.calculate('concub', period) asi_aspa_nb_alloc = simulation.calculate('asi_aspa_nb_alloc', period) br_mv = simulation.calculate('br_mv', period) P = simulation.legislation_at(period.start).minim asi_elig = self.split_by_roles(asi_elig_holder, roles = [CHEF, PART]) aspa_elig = self.split_by_roles(aspa_elig_holder, roles = [CHEF, PART]) # Un seul éligible elig1 = ((asi_aspa_nb_alloc == 1) & (aspa_elig[CHEF] | aspa_elig[PART])) # Couple d'éligibles elig2 = (aspa_elig[CHEF] & aspa_elig[PART]) # Un seul éligible et époux éligible ASI elig3 = ((asi_elig[CHEF] & aspa_elig[PART]) | (asi_elig[PART] & aspa_elig[CHEF])) & maries # Un seul éligible et conjoint non marié éligible ASI elig4 = ((asi_elig[CHEF] & aspa_elig[PART]) | (asi_elig[PART] & aspa_elig[CHEF])) & not_(maries) elig = elig1 | elig2 | elig3 | elig4 montant_max = ( elig1 * P.aspa.montant_seul + elig2 * P.aspa.montant_couple + elig3 * (P.asi.montant_couple / 2 + P.aspa.montant_couple / 2) + elig4 * (P.asi.montant_seul + P.aspa.montant_couple / 2) ) / 12 ressources = br_mv + montant_max plafond_ressources = (elig1 * (P.aspa.plaf_seul * not_(concub) + P.aspa.plaf_couple * concub) + (elig2 | elig3 | elig4) * P.aspa.plaf_couple) / 12 depassement = max_(ressources - plafond_ressources, 0) diff = ((elig1 | elig2) * (montant_max - depassement) + (elig3 | elig4) * (P.aspa.montant_couple / 12 / 2 - depassement / 2)) # Montant mensuel servi (sous réserve d'éligibilité) montant_servi_aspa = max_(diff, 0) # TODO: Faute de mieux, on verse l'aspa à la famille plutôt qu'aux individus # aspa[CHEF] = aspa_elig[CHEF]*montant_servi_aspa*(elig1 + elig2/2) # aspa[PART] = aspa_elig[PART]*montant_servi_aspa*(elig1 + elig2/2) return period, elig * montant_servi_aspa PK'G ϻϻ8openfisca_france/model/prestations/minima_sociaux/rsa.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import (floor, logical_and as and_, logical_not as not_, logical_or as or_, maximum as max_, minimum as min_) from ...base import * # noqa analysis:ignore from ..prestations_familiales.base_ressource import nb_enf, age_en_mois_benjamin @reference_formula class aefa(DatedFormulaColumn): ''' Aide exceptionelle de fin d'année (prime de Noël) Instituée en 1998 Apparaît sous le nom de complément de rmi dans les ERF Le montant de l’aide mentionnée à l’article 1er versée aux bénéficiaires de l’allocation de solidarité spécifique à taux majoré servie aux allocataires âgés de cinquante-cinq ans ou plus justifiant de vingt années d’activité salariée, aux allocataires âgés de cinquante-sept ans et demi ou plus justifiant de dix années d’activité salariée ainsi qu’aux allocataires justifiant d’au moins 160 trimestres validés dans les régimes d’assurance vieillesse ou de périodes reconnues équivalentes est égal à Pour bénéficier de la Prime de Noël 2011, vous devez être éligible pour le compte du mois de novembre 2011 ou au plus de décembre 2011, soit d’une allocation de solidarité spécifique (ASS), de la prime forfaitaire mensuelle de reprise d'activité, de l'allocation équivalent retraite (allocataire AER), du revenu de solidarité active (Bénéficiaires RSA), de l'allocation de parent isolé (API), du revenu minimum d'insertion (RMI), de l’Allocation pour la Création ou la Reprise d'Entreprise (ACCRE-ASS) ou encore allocation chômage. ''' column = FloatCol entity_class = Familles label = u"Aide exceptionelle de fin d'année (prime de Noël)" url = u"http://www.pole-emploi.fr/candidat/aide-exceptionnelle-de-fin-d-annee-dite-prime-de-noel--@/suarticle.jspz?id=70996" # noqa @dated_function(start = date(2009, 1, 1), stop = date(2015, 12, 31)) def function_2009__(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') age_holder = simulation.compute('age', period) smic55_holder = simulation.compute('smic55', period, accept_other_period = True) af_nbenf = simulation.calculate('af_nbenf', period) nb_par = simulation.calculate('nb_par', period) ass = simulation.calculate_add('ass', period) aer_holder = simulation.compute('aer', period) api = simulation.calculate_add('api', period) rsa = simulation.calculate_add('rsa', period) P = simulation.legislation_at(period.start).minim.aefa af = simulation.legislation_at(period.start).fam.af age = self.split_by_roles(age_holder, roles = ENFS) aer = self.sum_by_entity(aer_holder) smic55 = self.split_by_roles(smic55_holder, roles = ENFS) dummy_ass = ass > 0 dummy_aer = aer > 0 dummy_api = api > 0 dummy_rmi = rsa > 0 maj = 0 # TODO condition = (dummy_ass + dummy_aer + dummy_api + dummy_rmi > 0) if hasattr(af, "age3"): nbPAC = nb_enf(age, smic55, af.age1, af.age3) else: nbPAC = af_nbenf # TODO check nombre de PAC pour une famille aefa = condition * P.mon_seul * ( 1 + (nb_par == 2) * P.tx_2p + nbPAC * P.tx_supp * (nb_par <= 2) + nbPAC * P.tx_3pac * max_(nbPAC - 2, 0) ) aefa_maj = P.mon_seul * maj aefa = max_(aefa_maj, aefa) return period, aefa @dated_function(start = date(2008, 1, 1), stop = date(2008, 12, 31)) def function_2008(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') age_holder = simulation.compute('age', period) smic55_holder = simulation.compute('smic55', period, accept_other_period = True) af_nbenf = simulation.calculate('af_nbenf', period) nb_par = simulation.calculate('nb_par', period) ass = simulation.calculate_add('ass', period) aer_holder = simulation.compute('aer', period) api = simulation.calculate_add('api', period) rsa = simulation.calculate('rsa', period) P = simulation.legislation_at(period.start).minim.aefa af = simulation.legislation_at(period.start).fam.af age = self.split_by_roles(age_holder, roles = ENFS) aer = self.sum_by_entity(aer_holder) smic55 = self.split_by_roles(smic55_holder, roles = ENFS) dummy_ass = ass > 0 dummy_aer = aer > 0 dummy_api = api > 0 dummy_rmi = rsa > 0 maj = 0 # TODO condition = (dummy_ass + dummy_aer + dummy_api + dummy_rmi > 0) if hasattr(af, "age3"): nbPAC = nb_enf(age, smic55, af.age1, af.age3) else: nbPAC = af_nbenf # TODO check nombre de PAC pour une famille aefa = condition * P.mon_seul * ( 1 + (nb_par == 2) * P.tx_2p + nbPAC * P.tx_supp * (nb_par <= 2) + nbPAC * P.tx_3pac * max_(nbPAC - 2, 0) ) aefa += condition * P.forf2008 aefa_maj = P.mon_seul * maj aefa = max_(aefa_maj, aefa) return period, aefa @dated_function(start = date(2002, 1, 1), stop = date(2007, 12, 31)) def function__2008_(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') age_holder = simulation.compute('age', period) smic55_holder = simulation.compute('smic55', period, accept_other_period = True) af_nbenf = simulation.calculate('af_nbenf', period) nb_par = simulation.calculate('nb_par', period) ass = simulation.calculate_add('ass', period) aer_holder = simulation.compute('aer', period) api = simulation.calculate_add('api', period) rsa = simulation.calculate('rsa', period) P = simulation.legislation_at(period.start).minim.aefa af = simulation.legislation_at(period.start).fam.af age = self.split_by_roles(age_holder, roles = ENFS) aer = self.sum_by_entity(aer_holder) smic55 = self.split_by_roles(smic55_holder, roles = ENFS) dummy_ass = ass > 0 dummy_aer = aer > 0 dummy_api = api > 0 dummy_rmi = rsa > 0 maj = 0 # TODO condition = (dummy_ass + dummy_aer + dummy_api + dummy_rmi > 0) if hasattr(af, "age3"): nbPAC = nb_enf(age, smic55, af.age1, af.age3) else: nbPAC = af_nbenf # TODO check nombre de PAC pour une famille aefa = condition * P.mon_seul * ( 1 + (nb_par == 2) * P.tx_2p + nbPAC * P.tx_supp * (nb_par <= 2) + nbPAC * P.tx_3pac * max_(nbPAC - 2, 0) ) aefa_maj = P.mon_seul * maj aefa = max_(aefa_maj, aefa) return period, aefa @reference_formula class api(DatedFormulaColumn): column = FloatCol entity_class = Familles label = u"Allocation de parent isolé" url = u"http://fr.wikipedia.org/wiki/Allocation_de_parent_isol%C3%A9", @dated_function(stop = date(2009, 5, 31)) def function__2009(self, simulation, period): """ Allocation de parent isolé """ period = period.start.offset('first-of', 'month').period('month') age_en_mois_holder = simulation.compute('age_en_mois', period) age_holder = simulation.compute('age', period) smic55_holder = simulation.compute('smic55', period) isol = simulation.calculate('isol', period) rsa_forfait_logement = simulation.calculate('rsa_forfait_logement', period) br_rmi = simulation.calculate('br_rmi', period) af_majo = simulation.calculate('af_majo', period) rsa = simulation.calculate('rsa', period) af = simulation.legislation_at(period.start).fam.af api = simulation.legislation_at(period.start).minim.api age = self.split_by_roles(age_holder, roles = ENFS) age_en_mois = self.split_by_roles(age_en_mois_holder, roles = ENFS) smic55 = self.split_by_roles(smic55_holder, roles = ENFS) # TODO: # Majoration pour isolement # Si vous êtes parent isolé, c’est-à-dire célibataire, divorcé(e), séparé(e) ou veuf(ve) avec des enfants # à charge ou enceinte, le montant forfaitaire garanti est majoré. # Ce montant forfaitaire majoré est accordé à partir du mois au cours duquel survient l'un des événements # suivants : # - déclaration de grossesse, # - naissance d'un enfant, # - prise en charge d'un enfant, # - séparation, veuvage, # - dépôt de la demande si l’événement est antérieur. # # Le montant forfaitaire majoré peut être accordé pendant 12 mois, continus ou discontinus, au cours # d’une période de 18 mois suivant l’événement. # Si votre plus jeune enfant à charge a moins de 3 ans, le montant forfaitaire majoré vous est accordé # jusqu'à ses 3 ans. benjamin = age_en_mois_benjamin(age_en_mois) enceinte = (benjamin < 0) * (benjamin > -6) # TODO: quel mois mettre ? # TODO: pas complètement exact # L'allocataire perçoit l'API : # jusqu'�� ce que le plus jeune enfant ait 3 ans, # ou pendant 12 mois consécutifs si les enfants sont âgés de plus de 3 ans # et s'il a présenté sa demande dans les 6 mois à partir du moment où il # assure seul la charge de l'enfant. # TODO: API courte gens pour les gens qui ont divorcés dans l'année # Le droit à l'allocation est réétudié tous les 3 mois. # # Calcul de l'année et mois de naissance du benjamin condition = (floor(benjamin / 12) <= api.age - 1) eligib = isol * ((enceinte != 0) | (nb_enf(age, smic55, 0, api.age - 1) > 0)) * condition # moins de 20 ans avant inclusion dans rsa # moins de 25 ans après inclusion dans rsa api1 = eligib * af.bmaf * (api.base + api.enf_sup * nb_enf(age, smic55, af.age1, api.age_pac - 1)) rsa = (api.age_pac >= 25) # dummy passage au rsa majoré br_api = br_rmi + af_majo * not_(rsa) # On pourrait mensualiser RMI, BRrmi et forfait logement api = max_(0, api1 - rsa_forfait_logement / 12 - br_api / 12 - rsa / 12) # L'API est exonérée de CRDS return period, api # annualisé # TODO API: temps partiel qui modifie la base ressource # Cumul # Cumul avec un revenu # Si l'allocataire reprend une activité ou suit une formation professionnelle rémunérée, les revenus sont # cumulables intégralement au cours des 3 premiers mois de reprise d'activité. # Du 4e au 12e mois qui suit, le montant de l'allocation varie en fonction de la durée de l'activité # ou de la formation. # Durée d'activité de 78 heures ou plus par mois ou activité non salariée # Lorsque la durée d'activité est de 78 heures minimum par mois, le montant de l'API perçu par l'allocataire est # diminué de la totalité du salaire. Tous les revenus d'activité sont pris en compte pour le calcul de l'API, # sauf si l'allocataire perçoit des revenus issus d'un contrat insertion-revenu minimum d'activité (CIRMA) # ou d'un contrat d'avenir (CAV). # L'allocataire peut bénéficier, sous certaines conditions : # • de la prime de retour à l'emploi si son activité est d'une durée d'au moins 4 mois consécutifs, # sauf s'il effectue un stage de formation professionnelle, # • de la prime forfaitaire pendant 9 mois, sauf s'il exerce une activité salariée dans le cadre d'un CIRMA # ou d'un CAV. # Durée d'activité de moins de 78 heures par mois # Lorsque la durée d'activité est inférieure à 78 heures par mois, le montant de l'API perçu par l'allocataire # est diminué de la moitié du salaire. # Si l'allocataire exerce une activité dans le cadre d'un CIRMA ou d'un CAV, ses revenus d'activité ne sont pas # pris en compte pour le calcul de son API. @reference_formula class br_rmi(DatedFormulaColumn): column = FloatCol label = u"Base ressources du Rmi ou du Rsa" entity_class = Familles @dated_function(stop = date(2009, 5, 31)) def function_rmi(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') br_rmi_pf = simulation.calculate('br_rmi_pf', period) br_rmi_ms = simulation.calculate('br_rmi_ms', period) br_rmi_i_holder = simulation.compute('br_rmi_i', period) br_rmi_i_total = self.sum_by_entity(br_rmi_i_holder) return period, br_rmi_pf + br_rmi_ms + br_rmi_i_total @dated_function(start = date(2009, 6, 1)) def function_rsa(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') br_rmi_pf = simulation.calculate('br_rmi_pf', period) br_rmi_ms = simulation.calculate('br_rmi_ms', period) br_rmi_i_holder = simulation.compute('br_rmi_i', period) ra_rsa_i_holder = simulation.compute('ra_rsa_i', period) br_rmi_i_total = self.sum_by_entity(br_rmi_i_holder) ra_rsa_i_total = self.sum_by_entity(ra_rsa_i_holder) return period, br_rmi_pf + br_rmi_ms + br_rmi_i_total + ra_rsa_i_total @reference_formula class br_rmi_i(SimpleFormulaColumn): column = FloatCol label = u"Base ressource individuelle du RSA/RMI (hors revenus d'actvité)" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') three_previous_months = period.start.period('month', 3).offset(-3) r = rsa_ressource_calculator(simulation, period) # Ressources professionelles chonet = r.calcule_ressource('chonet', revenu_pro = True) rstnet = r.calcule_ressource('rstnet', revenu_pro = True) pensions_alimentaires_percues = r.calcule_ressource('pensions_alimentaires_percues') allocation_aide_retour_emploi = r.calcule_ressource('allocation_aide_retour_emploi') allocation_securisation_professionnelle = r.calcule_ressource('allocation_securisation_professionnelle') prestation_compensatoire = r.calcule_ressource('prestation_compensatoire') rto_declarant1 = r.calcule_ressource('rto_declarant1') rfon_ms = r.calcule_ressource('rfon_ms') div_ms = r.calcule_ressource('div_ms') gains_exceptionnels = r.calcule_ressource('gains_exceptionnels') dedommagement_victime_amiante = r.calcule_ressource('dedommagement_victime_amiante') pensions_invalidite = r.calcule_ressource('pensions_invalidite') rsa_base_ressources_patrimoine_i = r.calcule_ressource('rsa_base_ressources_patrimoine_i') rev_cap_bar_holder = simulation.compute_add('rev_cap_bar', three_previous_months) rev_cap_lib_holder = simulation.compute_add('rev_cap_lib', three_previous_months) rev_cap_bar = self.cast_from_entity_to_role(rev_cap_bar_holder, role = VOUS) rev_cap_lib = self.cast_from_entity_to_role(rev_cap_lib_holder, role = VOUS) result = ( chonet + rstnet + pensions_alimentaires_percues + rto_declarant1 + rev_cap_bar + rev_cap_lib + rfon_ms + div_ms + gains_exceptionnels + dedommagement_victime_amiante + pensions_invalidite + allocation_aide_retour_emploi + allocation_securisation_professionnelle + prestation_compensatoire + rsa_base_ressources_patrimoine_i ) / 3 return period, result @reference_formula class br_rmi_ms(SimpleFormulaColumn): column = FloatCol label = u"Minima sociaux inclus dans la base ressource RSA/RMI" entity_class = Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') three_previous_months = period.start.period('month', 3).offset(-3) aspa = simulation.calculate('aspa', period) asi = simulation.calculate('asi', period) ass = simulation.calculate('ass', period) aah_holder = simulation.compute_add('aah', three_previous_months) caah_holder = simulation.compute_add('caah', three_previous_months) aah = self.sum_by_entity(aah_holder) / 3 caah = self.sum_by_entity(caah_holder) / 3 return period, aspa + asi + ass + aah + caah @reference_formula class br_rmi_pf(DatedFormulaColumn): column = FloatCol entity_class = Familles label = u"Prestations familiales inclues dans la base ressource RSA/RMI" @dated_function(date(2002, 1, 1), date(2003, 12, 31)) def function_2002(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') af_base = simulation.calculate('af_base', period) cf = simulation.calculate_divide('cf', period) asf = simulation.calculate('asf', period) apje = simulation.calculate_divide('apje', period) ape = simulation.calculate_divide('ape', period) P = simulation.legislation_at(period.start).minim return period, P.rmi.pfInBRrmi * (af_base + cf + asf + apje + ape) @dated_function(start = date(2004, 1, 1), stop = date(2014, 3, 31)) def function_2003(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') af_base = simulation.calculate('af_base', period) cf = simulation.calculate_divide('cf', period) asf = simulation.calculate_divide('asf', period) paje_base = simulation.calculate_divide('paje_base', period) paje_clca = simulation.calculate_divide('paje_clca', period) paje_prepare = simulation.calculate_divide('paje_prepare', period) paje_colca = simulation.calculate_divide('paje_colca', period) P = simulation.legislation_at(period.start).minim return period, P.rmi.pfInBRrmi * (af_base + cf + asf + paje_base + paje_clca + paje_prepare + paje_colca) @dated_function(start = date(2014, 4, 1)) def function_2014(self, simulation, period): # TODO : Neutraliser les ressources de type prestations familiales quand elles sont interrompues period = period.start.offset('first-of', 'month').period('month') af_base = simulation.calculate('af_base', period) cf_non_majore_avant_cumul = simulation.calculate('cf_non_majore_avant_cumul', period) cf = simulation.calculate('cf', period) rsa_forfait_asf = simulation.calculate('rsa_forfait_asf', period) paje_base = simulation.calculate_divide('paje_base', period) paje_clca = simulation.calculate_divide('paje_clca', period) paje_prepare = simulation.calculate_divide('paje_prepare', period) paje_colca = simulation.calculate_divide('paje_colca', period) P = simulation.legislation_at(period.start).minim # Seul le montant non majoré est pris en compte dans la base de ressources du RSA cf_non_majore = (cf > 0) * cf_non_majore_avant_cumul return period, P.rmi.pfInBRrmi * (af_base + rsa_forfait_asf + cf_non_majore + paje_base + paje_clca + paje_prepare + paje_colca) @reference_formula class crds_mini(DatedFormulaColumn): column = FloatCol entity_class = Familles label = u"CRDS versée sur les minimas sociaux" @dated_function(start = date(2009, 6, 1)) def function_2009_(self, simulation, period): """ CRDS sur les minima sociaux """ period = period.start.offset('first-of', 'month').period('month') rsa_act = simulation.calculate('rsa_act', period) taux_crds = simulation.legislation_at(period.start).fam.af.crds return period, - taux_crds * rsa_act @reference_formula class div_ms(SimpleFormulaColumn): column = FloatCol entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') period_declaration = period.start.offset('first-of', 'year').period('year') f3vc_holder = simulation.compute('f3vc', period_declaration) f3ve_holder = simulation.compute('f3ve', period_declaration) f3vg_holder = simulation.compute('f3vg', period_declaration) f3vl_holder = simulation.compute('f3vl', period_declaration) f3vm_holder = simulation.compute('f3vm', period_declaration) f3vc = self.cast_from_entity_to_role(f3vc_holder, role = VOUS) f3ve = self.cast_from_entity_to_role(f3ve_holder, role = VOUS) f3vg = self.cast_from_entity_to_role(f3vg_holder, role = VOUS) f3vl = self.cast_from_entity_to_role(f3vl_holder, role = VOUS) f3vm = self.cast_from_entity_to_role(f3vm_holder, role = VOUS) return period, (f3vc + f3ve + f3vg + f3vl + f3vm) / 12 @reference_formula class enceinte_fam(SimpleFormulaColumn): column = BoolCol entity_class = Familles def function(self, simulation, period): period = period age_en_mois_holder = simulation.compute('age_en_mois', period) enceinte_holder = simulation.compute('enceinte', period) age_en_mois_enf = self.split_by_roles(age_en_mois_holder, roles = ENFS) enceinte = self.split_by_roles(enceinte_holder, roles = [CHEF, PART]) benjamin = age_en_mois_benjamin(age_en_mois_enf) enceinte_compat = and_(benjamin < 0, benjamin > -6) return period, or_(or_(enceinte_compat, enceinte[CHEF]), enceinte[PART]) @reference_formula class nb_enfant_rsa(SimpleFormulaColumn): column = IntCol entity_class = Familles label = u"Nombre d'enfants pris en compte pour le calcul du RSA" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') rmi = simulation.legislation_at(period.start).minim.rmi age_holder = simulation.compute('age', period) smic55_holder = simulation.compute('smic55', period) age_enf = self.split_by_roles(age_holder, roles = ENFS) smic55_enf = self.split_by_roles(smic55_holder, roles = ENFS) nbenf = nb_enf(age_enf, smic55_enf, 0, rmi.age_pac) return period, nbenf @reference_formula class psa(DatedFormulaColumn): column = FloatCol entity_class = Familles label = u"Prime de solidarité active" url = u"http://www.service-public.fr/actualites/001077.html" @dated_function(start = date(2009, 4, 1), stop = date(2009, 4, 30)) def function_2009(self, simulation, period): ''' Prime de solidarité active (exceptionnelle, 200€ versés une fois en avril 2009) Versement en avril 2009 d’une prime de solidarité active (Psa) aux familles modestes qui ont bénéficié en janvier, février ou mars 2009 du Rmi, de l’Api (du Rsa expérimental, du Cav ou du Rma pour les ex-bénéficiaires du Rmi ou de l’Api), de la prime forfaitaire mensuelle au titre du Rmi ou de l’Api ou enfin d’une aide au logement (à condition d’exercer une activité professionnelle et d’être âgé de plus de 25 ans ou d’avoir au moins un enfant à charge). La Psa, prime exceptionnelle, s’élève à 200 euros par foyer bénéficiaire. ''' period = period.start.offset('first-of', 'month').period('month') api = simulation.calculate('api', period) rsa = simulation.calculate('rsa', period) activite_holder = simulation.compute('activite', period) af_nbenf = simulation.calculate('af_nbenf', period) aide_logement = simulation.calculate('aide_logement', period) P = simulation.legislation_at(period.start).minim.rmi activite = self.split_by_roles(activite_holder, roles = [CHEF, PART]) dummy_api = api > 0 dummy_rmi = rsa > 0 dummy_al = and_(aide_logement > 0, or_(af_nbenf > 0, or_(activite[CHEF] == 0, activite[PART] == 0))) condition = (dummy_api + dummy_rmi + dummy_al > 0) psa = condition * P.psa return period, psa @reference_formula class ra_rsa(SimpleFormulaColumn): column = FloatCol label = u"Revenus d'activité du RSA" entity_class = Familles start_date = date(2009, 6, 1) def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') ra_rsa_i_holder = simulation.compute('ra_rsa_i', period) ra_rsa = self.sum_by_entity(ra_rsa_i_holder) return period, ra_rsa @reference_formula class ra_rsa_i(SimpleFormulaColumn): column = FloatCol label = u"Revenus d'activité du Rsa - Individuel" entity_class = Individus start_date = date(2009, 6, 1) def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') r = rsa_ressource_calculator(simulation, period) salaire_net = r.calcule_ressource('salaire_net', revenu_pro = True) indemnites_journalieres = r.calcule_ressource('indemnites_journalieres', revenu_pro = True) indemnites_chomage_partiel = r.calcule_ressource('indemnites_chomage_partiel', revenu_pro = True) indemnites_volontariat = r.calcule_ressource('indemnites_volontariat', revenu_pro = True) revenus_stage_formation_pro = r.calcule_ressource('revenus_stage_formation_pro', revenu_pro = True) indemnites_stage = r.calcule_ressource('indemnites_stage', revenu_pro = True) bourse_recherche = r.calcule_ressource('bourse_recherche', revenu_pro = True) hsup = r.calcule_ressource('hsup', revenu_pro = True) etr = r.calcule_ressource('etr', revenu_pro = True) # Ressources TNS # WARNING : D'après les caisses, le revenu pris en compte pour les AE pour le RSA ne prend en compte que # l'abattement standard sur le CA, mais pas les cotisations pour charges sociales. Dans l'attente d'une # éventuelle correction, nous implémentons selon leurs instructions. Si changement, il suffira de remplacer le # tns_auto_entrepreneur_benefice par tns_auto_entrepreneur_revenus_net tns_auto_entrepreneur_revenus_rsa = r.calcule_ressource('tns_auto_entrepreneur_benefice', revenu_pro = True) result = ( salaire_net + indemnites_journalieres + indemnites_chomage_partiel + indemnites_volontariat + revenus_stage_formation_pro + indemnites_stage + bourse_recherche + hsup + etr + tns_auto_entrepreneur_revenus_rsa ) / 3 return period, result @reference_formula class rfon_ms(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Revenus fonciers pour la base ressource du rmi/rsa" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') period_declaration = period.start.offset('first-of', 'year').period('year') f4ba_holder = simulation.compute('f4ba', period_declaration) f4be_holder = simulation.compute('f4be', period_declaration) f4ba = self.cast_from_entity_to_role(f4ba_holder, role = VOUS) f4be = self.cast_from_entity_to_role(f4be_holder, role = VOUS) return period, (f4ba + f4be) / 12 @reference_formula class rmi(DatedFormulaColumn): column = FloatCol entity_class = Familles label = u"Revenu Minimum d'Insertion" @dated_function(start = date(1988, 12, 1), stop = date(2009, 5, 31)) def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') activite = simulation.calculate('activite', period) br_rmi = simulation.calculate('br_rmi', period) rsa_socle = simulation.calculate('rsa_socle', period) rsa_forfait_logement = simulation.calculate('rsa_forfait_logement', period) return period, (activite != 0) * (activite != 2) * (activite != 3) * ( max_(0, rsa_socle - rsa_forfait_logement - br_rmi)) # TODO: Migré lors de la mensualisation. Probablement faux @reference_formula class rmi_nbp(SimpleFormulaColumn): column = IntCol entity_class = Familles label = u"Nombre de personne à charge au sens du Rmi/Rsa" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age_holder = simulation.compute('age', period) smic55_holder = simulation.compute('smic55', period) nb_par = simulation.calculate('nb_par', period) P = simulation.legislation_at(period.start).minim.rmi age = self.split_by_roles(age_holder, roles = ENFS) smic55 = self.split_by_roles(smic55_holder, roles = ENFS) return period, nb_par + nb_enf(age, smic55, 0, P.age_pac - 1) # TODO: check limite d'âge in legislation @reference_formula class rsa(DatedFormulaColumn): calculate_output = calculate_output_add column = FloatCol label = u"Revenu de solidarité active" entity_class = Familles @dated_function(start = date(2009, 06, 1)) def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') rsa_majore = simulation.calculate('rsa_majore', period) rsa_non_majore = simulation.calculate('rsa_non_majore', period) rsa_non_calculable = simulation.calculate('rsa_non_calculable', period) rsa = (1 - rsa_non_calculable) * max_(rsa_majore, rsa_non_majore) return period, rsa @reference_formula class rsa_act(DatedFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Familles label = u"Revenu de solidarité active - activité" start_date = date(2009, 6, 1) @dated_function(start = date(2009, 6, 1)) def function_2009(self, simulation, period): ''' Calcule le montant du RSA activité Note: le partage en moitié est un point de législation, pas un choix arbitraire ''' period = period rsa = simulation.calculate('rsa', period) rmi = simulation.calculate('rmi', period) return period, max_(rsa - rmi, 0) @reference_formula class rsa_act_i(DatedFormulaColumn): column = FloatCol entity_class = Individus label = u"Revenu de solidarité active - activité au niveau de l'individu" start_date = date(2009, 6, 1) @dated_function(start = date(2009, 6, 1)) def function_2009_(self, simulation, period): period = period # TODO: rentre dans le calcul de la PPE check period !!! rsa_act_holder = simulation.compute('rsa_act', period) concub_holder = simulation.compute('concub', period) maries_holder = simulation.compute('maries', period) quifam = simulation.calculate('quifam', period) concub = self.cast_from_entity_to_roles(concub_holder) maries = self.cast_from_entity_to_roles(maries_holder) rsa_act = self.cast_from_entity_to_roles(rsa_act_holder) conj = or_(concub, maries) rsa_act_i = 0 * quifam # TODO Generate an array of float for rsa_act_i, add method self.zeros(). chef_filter = quifam == 0 rsa_act_i[chef_filter] = rsa_act[chef_filter] / (1 + conj[chef_filter]) partenaire_filter = quifam == 1 rsa_act_i[partenaire_filter] = rsa_act[partenaire_filter] * conj[partenaire_filter] / 2 return period, rsa_act_i @reference_formula class rsa_base_ressources_patrimoine_i(DatedFormulaColumn): column = FloatCol label = u"Base de ressources des revenus du patrimoine du RSA" entity_class = Individus start_date = date(2009, 6, 1) @dated_function(start = date(2009, 6, 1)) def function_2009_(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') interets_epargne_sur_livrets = simulation.calculate('interets_epargne_sur_livrets', period) epargne_non_remuneree = simulation.calculate('epargne_non_remuneree', period) revenus_capital = simulation.calculate_divide('revenus_capital', period) valeur_locative_immo_non_loue = simulation.calculate('valeur_locative_immo_non_loue', period) valeur_locative_terrains_non_loue = simulation.calculate('valeur_locative_terrains_non_loue', period) revenus_locatifs = simulation.calculate_divide('revenus_locatifs', period) rsa = simulation.legislation_at(period.start).minim.rmi return period, ( interets_epargne_sur_livrets / 12 + epargne_non_remuneree * rsa.patrimoine.taux_interet_forfaitaire_epargne_non_remunere / 12 + revenus_capital + valeur_locative_immo_non_loue * rsa.patrimoine.abattement_valeur_locative_immo_non_loue + valeur_locative_terrains_non_loue * rsa.patrimoine.abattement_valeur_locative_terrains_non_loue + revenus_locatifs ) @reference_formula class rsa_eligibilite(SimpleFormulaColumn): column = BoolCol entity_class = Familles label = u"Eligibilité au RSA" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') age_holder = simulation.compute('age', period) age_parents = self.split_by_roles(age_holder, roles = [CHEF, PART]) activite_holder = simulation.compute('activite', period) activite_parents = self.split_by_roles(activite_holder, roles = [CHEF, PART]) rsa_eligibilite_tns = simulation.calculate('rsa_eligibilite_tns', period) rmi = simulation.legislation_at(period.start).minim.rmi eligib = ( (age_parents[CHEF] >= rmi.age_pac) * not_(activite_parents[CHEF] == 2) + (age_parents[PART] >= rmi.age_pac) * not_(activite_parents[PART] == 2) ) eligib = eligib * rsa_eligibilite_tns return period, eligib @reference_formula class rsa_eligibilite_tns(SimpleFormulaColumn): column = BoolCol entity_class = Familles label = u"Eligibilité au RSA pour un travailleur non salarié" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') tns_benefice_exploitant_agricole_holder = simulation.compute('tns_benefice_exploitant_agricole', period) tns_benefice_exploitant_agricole = self.sum_by_entity(tns_benefice_exploitant_agricole_holder) tns_employe_holder = simulation.compute('tns_employe', period) tns_employe = self.any_by_roles(tns_employe_holder) tns_autres_revenus_chiffre_affaires_holder = simulation.compute('tns_autres_revenus_chiffre_affaires', period) tns_autres_revenus_chiffre_affaires = self.split_by_roles(tns_autres_revenus_chiffre_affaires_holder) tns_autres_revenus_type_activite_holder = simulation.compute('tns_autres_revenus_type_activite', period) tns_autres_revenus_type_activite = self.split_by_roles(tns_autres_revenus_type_activite_holder) has_conjoint = simulation.calculate('nb_par', period) > 1 nb_enfant_rsa = simulation.calculate('nb_enfant_rsa', period) P = simulation.legislation_at(period.start) P_agr = P.tns.exploitant_agricole P_micro = P.ir.rpns.microentreprise maj_2p = P_agr.maj_2p maj_1e_2ad = P_agr.maj_1e_2ad maj_e_sup = P_agr.maj_e_sup def eligibilite_agricole(has_conjoint, nb_enfant_rsa, tns_benefice_exploitant_agricole, P_agr): plafond_benefice_agricole = P_agr.plafond_rsa * P.cotsoc.gen.smic_h_b taux_avec_conjoint = 1 + maj_2p + maj_1e_2ad * (nb_enfant_rsa > 0) + maj_e_sup * max_(nb_enfant_rsa - 1, 0) taux_sans_conjoint = 1 + maj_2p * (nb_enfant_rsa > 0) + maj_e_sup * max_(nb_enfant_rsa - 1, 0) taux_majoration = has_conjoint * taux_avec_conjoint + (1 - has_conjoint) * taux_sans_conjoint plafond_benefice_agricole_majore = taux_majoration * plafond_benefice_agricole return tns_benefice_exploitant_agricole < plafond_benefice_agricole_majore def eligibilite_chiffre_affaire(ca, type_activite, P_micro): plaf_vente = P_micro.vente.max plaf_service = P_micro.servi.max return ((type_activite == 0) * (ca <= plaf_vente)) + ((type_activite >= 1) * (ca <= plaf_service)) eligibilite_agricole = eligibilite_agricole( has_conjoint, nb_enfant_rsa, tns_benefice_exploitant_agricole, P_agr ) eligibilite_chiffre_affaire = ( eligibilite_chiffre_affaire( tns_autres_revenus_chiffre_affaires[CHEF], tns_autres_revenus_type_activite[CHEF], P_micro ) * eligibilite_chiffre_affaire( tns_autres_revenus_chiffre_affaires[PART], tns_autres_revenus_type_activite[PART], P_micro ) ) return period, eligibilite_agricole * (1 - tns_employe) * eligibilite_chiffre_affaire @reference_formula class rsa_forfait_asf(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Familles label = u"Allocation de soutien familial forfaitisée pour le RSA" start_date = date(2014, 4, 1) def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') asf_elig = simulation.calculate('asf_elig', period) rsa_forfait_asf_i_holder = simulation.compute('rsa_forfait_asf_i', period) montant = self.sum_by_entity(rsa_forfait_asf_i_holder, roles = ENFS) return period, asf_elig * montant @reference_formula class rsa_forfait_asf_i(SimpleFormulaColumn): column = FloatCol(default = 0) entity_class = Individus label = u"RSA - Montant individuel de forfait ASF" start_date = date(2014, 4, 1) def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') asf_elig_i = simulation.calculate('asf_elig_i', period) pfam = simulation.legislation_at(period.start).fam minim = simulation.legislation_at(period.start).minim return period, asf_elig_i * pfam.af.bmaf * minim.rmi.forfait_asf.taux1 @reference_formula class rsa_forfait_logement(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Forfait logement intervenant dans le calcul du Rmi ou du Rsa" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') forf_logement = simulation.legislation_at(period.start).minim.rmi.forfait_logement rmi = simulation.legislation_at(period.start).minim.rmi.rmi rmi_nbp = simulation.calculate('rmi_nbp', period) statut_occupation_holder = simulation.compute('statut_occupation', period) aide_logement = simulation.calculate('aide_logement', period) statut_occupation = self.cast_from_entity_to_roles(statut_occupation_holder) statut_occupation = self.filter_role(statut_occupation, role = CHEF) avantage_nature = or_(statut_occupation == 2, statut_occupation == 6) avantage_al = aide_logement > 0 montant_forfait = rmi * ( (rmi_nbp == 1) * forf_logement.taux1 + (rmi_nbp == 2) * forf_logement.taux2 + (rmi_nbp >= 3) * forf_logement.taux3 ) montant_al = avantage_al * min_(aide_logement, montant_forfait) montant_nature = avantage_nature * montant_forfait return period, max_(montant_al, montant_nature) @reference_formula class rsa_majore(DatedFormulaColumn): column = FloatCol label = u"Revenu de solidarité active - majoré" entity_class = Familles @dated_function(start = date(2009, 06, 1)) def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') rsa_socle_majore = simulation.calculate('rsa_socle_majore', period) ra_rsa = simulation.calculate('ra_rsa', period) rsa_forfait_logement = simulation.calculate('rsa_forfait_logement', period) br_rmi = simulation.calculate('br_rmi', period) P = simulation.legislation_at(period.start).minim.rmi base_normalise = max_(rsa_socle_majore - rsa_forfait_logement - br_rmi + P.pente * ra_rsa, 0) return period, base_normalise * (base_normalise >= P.rsa_nv) @reference_formula class rsa_majore_eligibilite(SimpleFormulaColumn): column = BoolCol entity_class = Familles label = u"Eligibilité au RSA majoré pour parent isolé" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') isol = simulation.calculate('isol', period) enceinte_fam = simulation.calculate('enceinte_fam', period) nbenf = simulation.calculate('nb_enfant_rsa', period) rsa_eligibilite_tns = simulation.calculate('rsa_eligibilite_tns', period) eligib = isol * (enceinte_fam | (nbenf > 0)) * rsa_eligibilite_tns return period, eligib @reference_formula class rsa_non_calculable(SimpleFormulaColumn): column = EnumCol( enum = Enum([ u"", u"tns", u"conjoint_tns" ]), default = 0 ) entity_class = Familles label = u"RSA non calculable pour la Famille (voir rsa_non_calculable_i)" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') eligible_rsa = ( simulation.calculate('rsa_eligibilite', period) + simulation.calculate('rsa_majore_eligibilite', period) ) non_calculable_tns_holder = simulation.compute('rsa_non_calculable_tns_i', period) non_calculable_tns_parents = self.split_by_roles(non_calculable_tns_holder, roles = [CHEF, PART]) non_calculable = ( (non_calculable_tns_parents[CHEF] > 0) * 1 + ((1 - non_calculable_tns_parents[CHEF]) * non_calculable_tns_parents[PART] > 0) * 2 ) non_calculable = eligible_rsa * non_calculable return period, non_calculable @reference_formula class rsa_non_calculable_tns_i(SimpleFormulaColumn): column = BoolCol entity_class = Individus label = u"RSA non calculable du fait de la situation de l'individu. Dans le cas des TNS, l'utilisateur est renvoyé vers son PCG" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') tns_benefice_exploitant_agricole = simulation.calculate('tns_benefice_exploitant_agricole', period) tns_micro_entreprise_chiffre_affaires = simulation.calculate('tns_micro_entreprise_chiffre_affaires', period) tns_autres_revenus = simulation.calculate('tns_autres_revenus', period) return period, ( (tns_benefice_exploitant_agricole > 0) + (tns_micro_entreprise_chiffre_affaires > 0) + (tns_autres_revenus > 0) ) @reference_formula class rsa_non_majore(DatedFormulaColumn): column = FloatCol label = u"Revenu de solidarité active - non majoré" entity_class = Familles @dated_function(start = date(2009, 06, 1)) def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') rsa_socle = simulation.calculate('rsa_socle', period) ra_rsa = simulation.calculate('ra_rsa', period) rsa_forfait_logement = simulation.calculate('rsa_forfait_logement', period) br_rmi = simulation.calculate('br_rmi', period) P = simulation.legislation_at(period.start).minim.rmi base_normalise = max_(rsa_socle - rsa_forfait_logement - br_rmi + P.pente * ra_rsa, 0) return period, base_normalise * (base_normalise >= P.rsa_nv) class rsa_ressource_calculator: def __init__(self, simulation, period): self.period = period self.simulation = simulation self.three_previous_months = self.period.start.period('month', 3).offset(-3) self.last_month = period.start.period('month').offset(-1) self.has_ressources_substitution = ( simulation.calculate('chonet', period) + simulation.calculate('indemnites_journalieres', period) + simulation.calculate('rstnet', period) # + # simulation.calculate('ass', last_month) ) > 0 self.neutral_max_forfaitaire = 3 * simulation.legislation_at(period.start).minim.rmi.rmi def calcule_ressource(self, variable_name, revenu_pro = False): ressource_trois_derniers_mois = self.simulation.calculate_add(variable_name, self.three_previous_months) ressource_mois_courant = self.simulation.calculate(variable_name, self.period) ressource_last_month = self.simulation.calculate(variable_name, self.last_month) if revenu_pro: condition = ( (ressource_mois_courant == 0) * (ressource_last_month > 0) * not_(self.has_ressources_substitution) ) return (1 - condition) * ressource_trois_derniers_mois else: condition = ( (ressource_mois_courant == 0) * (ressource_last_month > 0) ) return max_(0, ressource_trois_derniers_mois - condition * self.neutral_max_forfaitaire) @reference_formula class rsa_socle(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = "RSA socle" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') nb_par = simulation.calculate('nb_par', period) eligib = simulation.calculate('rsa_eligibilite', period) nb_enfant_rsa = simulation.calculate('nb_enfant_rsa', period) rmi = simulation.legislation_at(period.start).minim.rmi nbp = nb_par + nb_enfant_rsa taux = ( 1 + (nbp >= 2) * rmi.txp2 + (nbp >= 3) * rmi.txp3 + (nbp >= 4) * ((nb_par == 1) * rmi.txps + (nb_par != 1) * rmi.txp3) + max_(nbp - 4, 0) * rmi.txps ) return period, eligib * rmi.rmi * taux @reference_formula class rsa_socle_majore(SimpleFormulaColumn): column = FloatCol entity_class = Familles label = u"Majoration pour parent isolé du Revenu de solidarité active socle" start_date = date(2009, 6, 1) def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') rmi = simulation.legislation_at(period.start).minim.rmi eligib = simulation.calculate('rsa_majore_eligibilite', period) nbenf = simulation.calculate('nb_enfant_rsa', period) taux = rmi.majo_rsa.pac0 + rmi.majo_rsa.pac_enf_sup * nbenf return period, eligib * rmi.rmi * taux PKF*openfisca_france/model/revenus/__init__.pyPK'G}+(openfisca_france/model/revenus/autres.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from ..base import * # noqa analysis:ignore build_column('pensions_alimentaires_percues', FloatCol(entity = 'ind', label = u"Pensions alimentaires perçues", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"1AO", QUIFOY['conj']: u"1BO", QUIFOY['pac1']: u"1CO", QUIFOY['pac2']: u"1DO", QUIFOY['pac3']: u"1EO", })) # (f1ao, f1bo, f1co, f1do, f1eo) build_column('pensions_alimentaires_percues_decl', BoolCol(label = u"Pension déclarée", default = True)) build_column('pensions_alimentaires_versees_individu', FloatCol(entity = 'ind', label = u"Pensions alimentaires versées pour un individu")) build_column('gains_exceptionnels', FloatCol(entity = 'ind', label = u"Gains exceptionnels")) build_column('allocation_aide_retour_emploi', FloatCol(entity = 'ind', label = u"Allocation d'aide au retour à l'emploi")) build_column('allocation_securisation_professionnelle', FloatCol(entity = 'ind', label = u"Allocation de sécurisation professionnelle")) build_column('prime_forfaitaire_mensuelle_reprise_activite', FloatCol(entity = 'ind', label = u"Prime forfaitaire mensuelle pour la reprise d'activité")) build_column('indemnites_volontariat', FloatCol(entity = 'ind', label = u"Indemnités de volontariat")) build_column('dedommagement_victime_amiante', FloatCol(entity = 'ind', label = u"Dédommagement versé aux victimes de l'amiante")) build_column('prestation_compensatoire', FloatCol(entity = 'ind', label = u"Dédommagement versé aux victimes de l'amiante")) build_column('pensions_invalidite', FloatCol(entity = 'ind', label = u"Pensions d'invalidité")) build_column('bourse_enseignement_sup', FloatCol(entity = 'ind', label = u"Bourse de l'enseignement supérieur")) # Avoir fiscaux et crédits d'impôt # f2ab déjà disponible build_column('f8ta', IntCol(entity = 'foy', label = u"Retenue à la source en France ou impôt payé à l'étranger", val_type = "monetary", cerfa_field = u'8TA')) build_column('f8th', IntCol(entity = 'foy', label = u"Retenue à la source élus locaux", val_type = "monetary", cerfa_field = u'8TH')) build_column('f8td_2002_2005', IntCol(entity = 'foy', start = date(2002, 1, 1), end = date(2005, 12, 31), label = u"Contribution exceptionnelle sur les hauts revenus", cerfa_field = u'8TD')) build_column('f8td', BoolCol(entity = 'foy', start = date(2011, 1, 1), # 2011 ou 2013 ? end = date(2014, 12, 31), label = u"Revenus non imposables dépassent la moitié du RFR", cerfa_field = u'8TD')) build_column('f8ti', IntCol(entity = 'foy', label = u"Revenus de l'étranger exonérés d'impôt", val_type = "monetary", cerfa_field = u'8TK')) build_column('f8tk', IntCol(entity = 'foy', label = u"Revenus de l'étranger imposables", val_type = "monetary", cerfa_field = u'8TK')) # Auto-entrepreneur : versements libératoires d’impôt sur le revenu build_column('f8uy', IntCol(entity = 'foy', label = u"Auto-entrepreneur : versements libératoires d’impôt sur le revenu dont le remboursement est demandé", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = u'8UY')) PK'GQ||2openfisca_france/model/revenus/activite/salarie.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from functools import partial from numpy import ( busday_count as original_busday_count, datetime64, maximum as max_, minimum as min_, timedelta64, zeros, ) from ...base import * # noqa analysis:ignore from ...prestations.prestations_familiales.base_ressource import nb_enf build_column('indemnites_stage', FloatCol(entity = 'ind', label = u"Indemnités de stage")) build_column('revenus_stage_formation_pro', FloatCol(entity = 'ind', label = u"Revenus de stage de formation professionnelle")) build_column('bourse_recherche', FloatCol(entity = 'ind', label = u"Bourse de recherche")) build_column('sal_pen_exo_etr', IntCol( entity = 'ind', label = u"Salaires et pensions exonérés de source étrangère retenus pour le calcul du taux effectif", val_type = "monetary", cerfa_field = { QUIFOY['vous']: u"1AC", QUIFOY['conj']: u"1BC", QUIFOY['pac1']: u"1CC", QUIFOY['pac2']: u"1DC", }, start = date(2013, 1, 1), )) build_column('fra', IntCol(label = u"Frais réels", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"1AK", QUIFOY['conj']: u"1BK", QUIFOY['pac1']: u"1CK", QUIFOY['pac2']: u"1DK", QUIFOY['pac3']: u"1EK", })) # (f1ak, f1bk, f1ck, f1dk, f1ek) build_column('hsup', IntCol(label = u"Heures supplémentaires : revenus exonérés connus", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"1AU", QUIFOY['conj']: u"1BU", QUIFOY['pac1']: u"1CU", QUIFOY['pac2']: u"1DU", })) # (f1au, f1bu, f1cu, f1du, f1eu) build_column('ppe_du_sa', IntCol(label = u"Prime pour l'emploi des salariés: nombre d'heures payées dans l'année", cerfa_field = {QUIFOY['vous']: u"1AV", QUIFOY['conj']: u"1BV", QUIFOY['pac1']: u"1CV", QUIFOY['pac2']: u"1DV", QUIFOY['pac3']: u"1QV", })) # (f1av, f1bv, f1cv, f1dv, f1qv) build_column( 'ppe_tp_sa', BoolCol( label = u"Prime pour l'emploi des salariés: indicateur de travail à temps plein sur l'année entière", cerfa_field = { QUIFOY['vous']: u"1AX", QUIFOY['conj']: u"1BX", QUIFOY['pac1']: u"1CX", QUIFOY['pac2']: u"1DX", QUIFOY['pac3']: u"1QX", } ) ) # (f1ax, f1bx, f1cx, f1dx, f1qx) build_column( 'nbsala', EnumCol( label = u"Nombre de salariés dans l'établissement de l'emploi actuel", enum = Enum([ u"Sans objet", u"Aucun salarié", u"1 à 4 salariés", u"5 à 9 salariés", u"10 à 19 salariés", u"20 à 49 salariés", u"50 à 199 salariés", u"200 à 499 salariés", u"500 à 999 salariés", u"1000 salariés ou plus", u"Ne sait pas", ]) ) ) build_column('tva_ent', BoolCol(label = u"L'entreprise employant le salarié paye de la TVA", default = True)) # build_column('code_risque', EnumCol(label = u"Code risque pour les accidents du travail")) # TODO: Complete label, add enum and relevant default. build_column( 'exposition_accident', EnumCol( label = u"Exposition au risque pour les accidents du travail", enum = Enum([ u"Faible", u"Moyen", u"Élevé", u"Très élevé", ]) ) ) reference_input_variable( column = EnumCol( enum = Enum( [ u"fin_d_annee", u"anticipe_regularisation_fin_de_periode", u"progressif", ], ), ), entity_class = Individus, label = u"Mode de recouvrement des allègements Fillon", name = 'allegement_fillon_mode_recouvrement', ) reference_input_variable( column = DateCol(), entity_class = Individus, label = u"Date de début du contrat d'apprentissage", name = 'apprentissage_contrat_debut', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Taux ARRCO tranche A employeur) propre à l'entreprise", name = 'arrco_tranche_a_taux_employeur', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Taux ARRCO tranche A salarié) propre à l'entreprise", name = 'arrco_tranche_a_taux_salarie', ) reference_input_variable( column = BoolCol(), entity_class = Individus, label = u"Entreprise assujettie à la taxe sur les salaires", name = 'assujettie_taxe_salaires', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Avantages en nature (Valeur réelle)", name = 'avantage_en_nature_valeur_reelle', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"indemnites_compensatrices_conges_payes", name = 'indemnites_compensatrices_conges_payes', ) reference_input_variable( column = EnumCol( enum = Enum( [ u"temps_plein", u"temps_partiel", u"forfait_heures_semaines", u"forfait_heures_mois", u"forfait_heures_annee", u"forfait_jours_annee", ], ), ), entity_class = Individus, label = u"Type contrat de travail", name = 'contrat_de_travail', ) reference_input_variable( column = DateCol(default = date(1870, 1, 1)), entity_class = Individus, label = u"Date d'arrivée dans l'entreprise", name = 'contrat_de_travail_debut', # debut ) reference_input_variable( column = DateCol(default = date(2099, 12, 31)), entity_class = Individus, label = u"Date de départ de l'entreprise", name = 'contrat_de_travail_fin', # fin ) reference_input_variable( column = EnumCol( enum = Enum([ u"cdi", u"cdd", ]), ), entity_class = Individus, label = u"Type (durée determinée ou indéterminée) du contrat de travail", name = 'contrat_de_travail_duree', ) reference_input_variable( column = EnumCol( enum = Enum([ u"Mensuel avec régularisation en fin d'année", u"Annuel", ]), ), entity_class = Individus, label = u"Mode de recouvrement des cotisations sociales", name = 'cotisation_sociale_mode_recouvrement', ) reference_input_variable( column = FixedStrCol(max_length = 5), entity_class = Individus, label = u"Localisation entreprise (depcom)", name = 'depcom_entreprise', ) reference_input_variable( column = FixedStrCol(max_length = 5), entity_class = Individus, label = u"Localisation entreprise (Code postal)", name = 'code_postal_entreprise', ) reference_input_variable( column = IntCol(), entity_class = Individus, base_function = requested_period_last_value, label = u"Effectif de l'entreprise", name = 'effectif_entreprise', set_input = set_input_dispatch_by_period, ) reference_input_variable( column = BoolCol(), entity_class = Individus, label = u"Entreprise assujettie à la contribution économique territoriale", name = 'entreprise_assujettie_cet', ) reference_input_variable( column = BoolCol(), entity_class = Individus, label = u"Entreprise assujettie à l'impôt sur les sociétés (IS)", name = 'entreprise_assujettie_is', ) reference_input_variable( column = BoolCol(), entity_class = Individus, label = u"Entreprise assujettie à la TVA", name = 'entreprise_assujettie_tva', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Bénéfice de l'entreprise", name = 'entreprise_benefice', set_input = set_input_divide_by_period, ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Bilan de l'entreprise", name = 'entreprise_bilan', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Chiffre d'affaire de l'entreprise", name = 'entreprise_chiffre_affaire', ) reference_input_variable( column = DateCol(), entity_class = Individus, label = u"Date de création de l'entreprise", name = 'entreprise_creation', ) reference_input_variable( base_function = requested_period_last_value, column = IntCol(), entity_class = Individus, label = u"Nombre de tickets restaurant", name = 'nombre_tickets_restaurant', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Nouvelle bonification indicaire", name = 'nouvelle_bonification_indiciaire', ) reference_input_variable( base_function = requested_period_last_value, column = FloatCol(default = 0.015), # 1.5% est le minimum en 2014 entity_class = Individus, label = u"Taux de cotisation employeur pour la prévoyance obligatoire des cadres", name = 'prevoyance_obligatoire_cadre_taux_employe', ) reference_input_variable( base_function = requested_period_last_value, column = FloatCol(default = 0.015), # 1.5% est le minimum en 2014 entity_class = Individus, label = u"Taux de cotisation employeur pour la prévoyance obligatoire des cadres", name = 'prevoyance_obligatoire_cadre_taux_employeur', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Indemnités, primes et avantages en argent", name = 'primes_salaires', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Part salariale des cotisations de prévoyance complémentaire prise en charge par l'employeur", name = 'prise_en_charge_employeur_prevoyance_complementaire', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Part salariale des cotisations de retraite complémentaire prise en charge par l'employeur", name = 'prise_en_charge_employeur_retraite_complementaire', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Part salariale des cotisations de retraite supplémentaire prise en charge par l'employeur", name = 'prise_en_charge_employeur_retraite_supplementaire', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Ratio d'alternants dans l'effectif moyen", name = 'ratio_alternants', ) reference_input_variable( column = BoolCol(default = True), entity_class = Individus, label = u"Entreprise redevable de la taxe d'apprentissage", name = 'redevable_taxe_apprentissage', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Base pour le calcul du remboursement des frais de transport", name = 'remboursement_transport_base', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Indemnités forfaitaires (transport, nourriture)", name = 'indemnites_forfaitaires', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Salaire de base, en général appelé salaire brut, la 1ère ligne sur la fiche de paie", name = 'salaire_de_base', set_input = set_input_divide_by_period, url = u'http://www.insee.fr/fr/methodes/default.asp?page=definitions/salaire-mensuel-base-smb.htm', ) reference_input_variable( column = FloatCol(default = 0.5), entity_class = Individus, label = u"Taux de participation de l'employeur au titre restaurant", name = 'titre_restaurant_taux_employeur', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Valeur faciale unitaire du titre restaurant", name = 'titre_restaurant_valeur_unitaire', ) reference_input_variable( column = IntCol(), entity_class = Individus, label = u"Volume des titres restaurant", name = 'titre_restaurant_volume', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Traitement indiciaire brut (TIB)", name = 'traitement_indiciaire_brut', ) reference_input_variable( column = EnumCol( enum = Enum( [ u"prive_non_cadre", u"prive_cadre", u"public_titulaire_etat", u"public_titulaire_militaire", u"public_titulaire_territoriale", u"public_titulaire_hospitaliere", u"public_non_titulaire", ], ), ), entity_class = Individus, label = u"Catégorie de salarié", name = 'type_sal', ) reference_input_variable( column = IntCol(), # TODO default la valeur de la durée légale ? entity_class = Individus, label = u"Durée mensuelle collective dans l'entreprise (heures, temps plein)", name = 'heures_duree_collective_entreprise', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Volume des heures non rémunérées (convenance personnelle hors contrat/forfait)", name = 'heures_non_remunerees_volume', ) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Volume des heures rémunérées contractuellement (heures/mois, temps partiel)", name = 'heures_remunerees_volume', ) reference_input_variable( column = IntCol(), entity_class = Individus, label = u"Volume des heures rémunérées à un forfait heures", name = 'forfait_heures_remunerees_volume', ) reference_input_variable( column = IntCol(), entity_class = Individus, label = u"Volume des heures rémunérées à forfait jours", name = 'forfait_jours_remuneres_volume', ) reference_input_variable( column = IntCol(), entity_class = Individus, label = u"Volume des jours pour lesquels sont versés une idemnité journalière par la sécurité sociale", name = 'volume_jours_ijss', ) @reference_formula class avantage_en_nature(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Avantages en nature" def function(self, simulation, period): period = period avantage_en_nature_valeur_reelle = simulation.calculate('avantage_en_nature_valeur_reelle', period) avantage_en_nature_valeur_forfaitaire = simulation.calculate('avantage_en_nature_valeur_forfaitaire', period) return period, avantage_en_nature_valeur_reelle + avantage_en_nature_valeur_forfaitaire @reference_formula class avantage_en_nature_valeur_forfaitaire(SimpleFormulaColumn): # base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Evaluation fofaitaire des avantages en nature " # TODO: coplete this function def function(self, simulation, period): period = period avantage_en_nature_valeur_reelle = simulation.calculate('avantage_en_nature_valeur_reelle', period) return period, avantage_en_nature_valeur_reelle * 0 @reference_formula class depense_cantine_titre_restaurant_employe(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Dépense de cantine et de titre restaurant à charge de l'employe" def function(self, simulation, period): period = period valeur_unitaire = simulation.calculate("titre_restaurant_valeur_unitaire", period) volume = simulation.calculate("titre_restaurant_volume", period) taux_employeur = simulation.calculate('titre_restaurant_taux_employeur', period) return period, - valeur_unitaire * volume * (1 - taux_employeur) @reference_formula class depense_cantine_titre_restaurant_employeur(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Dépense de cantine et de titre restaurant à charge de l'employeur" def function(self, simulation, period): period = period valeur_unitaire = simulation.calculate("titre_restaurant_valeur_unitaire", period) volume = simulation.calculate("titre_restaurant_volume", period) # Compute with jours ouvrables ? taux_employeur = simulation.calculate('titre_restaurant_taux_employeur', period) return period, valeur_unitaire * volume * taux_employeur @reference_formula class nombre_jours_calendaires(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Nombre de jours calendaires travaillés" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period(u'month') contrat_de_travail_debut = simulation.calculate('contrat_de_travail_debut', period) contrat_de_travail_fin = simulation.calculate('contrat_de_travail_fin', period) busday_count = partial(original_busday_count, weekmask = "1" * 7) debut_mois = datetime64(period.start.offset('first-of', 'month')) fin_mois = datetime64(period.start.offset('last-of', 'month')) jours_travailles = max_( busday_count( max_(contrat_de_travail_debut, debut_mois), min_(contrat_de_travail_fin, fin_mois) + timedelta64(1, 'D') ), 0, ) return period, jours_travailles @reference_formula class remboursement_transport(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Remboursement partiel des frais de transport par l'employeur" def function(self, simulation, period): remboursement_transport_base = simulation.calculate('remboursement_transport_base', period) # TODO: paramètres en dur dans le code return period, - .5 * remboursement_transport_base # Fonction publique @reference_formula class gipa(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Indemnité de garantie individuelle du pouvoir d'achat" # TODO: à coder def function(self, simulation, period): period = period.start.period(u'year').offset('first-of') type_sal = simulation.calculate('type_sal', period) return period, zeros(len(type_sal)) @reference_formula class indemnite_residence(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Indemnité de résidence des fonctionnaires" def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') traitement_indiciaire_brut = simulation.calculate('traitement_indiciaire_brut', period) salaire_de_base = simulation.calculate('salaire_de_base', period) type_sal = simulation.calculate('type_sal', period) zone_apl_individu = simulation.calculate('zone_apl_individu', period) _P = simulation.legislation_at(period.start) zone_apl = zone_apl_individu # TODO: ces zones ne correpondent pas aux zones APL P = _P.fonc.indem_resid min_zone_1, min_zone_2, min_zone_3 = P.min * P.taux.zone1, P.min * P.taux.zone2, P.min * P.taux.zone3 taux = P.taux.zone1 * (zone_apl == 1) + P.taux.zone2 * (zone_apl == 2) + P.taux.zone3 * (zone_apl == 3) plancher = min_zone_1 * (zone_apl == 1) + min_zone_2 * (zone_apl == 2) + min_zone_3 * (zone_apl == 3) return period, max_( plancher, taux * (traitement_indiciaire_brut + salaire_de_base) ) * (type_sal >= 2) @reference_formula class indice_majore(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Indice majoré" def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') type_sal = simulation.calculate('type_sal', period) traitement_indiciaire_brut = simulation.calculate('traitement_indiciaire_brut', period) _P = simulation.legislation_at(period.start) traitement_annuel_brut = _P.fonc.IM_100 return period, (traitement_indiciaire_brut * 100 * 12 / traitement_annuel_brut) * (type_sal >= 2) @reference_formula class primes_fonction_publique(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Calcul des primes pour les fonctionnaries" url = u"http://vosdroits.service-public.fr/particuliers/F465.xhtml" def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') type_sal = simulation.calculate('type_sal', period) traitement_indiciaire_brut = simulation.calculate('traitement_indiciaire_brut', period) public = ( (type_sal == CAT['public_titulaire_etat']) + (type_sal == CAT['public_titulaire_territoriale']) + (type_sal == CAT['public_titulaire_hospitaliere']) ) return period, TAUX_DE_PRIME * traitement_indiciaire_brut * public @reference_formula class af_nbenf_fonc(SimpleFormulaColumn): column = IntCol entity_class = Familles label = u"Nombre d'enfants dans la famille au sens des allocations familiales pour le fonctionnaires" # Hack pour éviter une boucle infinie def function(self, simulation, period): # Note : Cette variable est "instantanée" : quelque soit la période demandée, elle retourne la valeur au premier # jour, sans changer la période. age_holder = simulation.compute('age', period) salaire_de_base = simulation.calculate_add('salaire_de_base', period.start.period('month', 6).offset(-6)) law = simulation.legislation_at(period.start) nbh_travaillees = 169 smic_mensuel_brut = law.cotsoc.gen.smic_h_b * nbh_travaillees smic55_holder = (salaire_de_base / 6) >= (law.fam.af.seuil_rev_taux * smic_mensuel_brut) age = self.split_by_roles(age_holder, roles = ENFS) smic55 = self.split_by_roles(smic55_holder, roles = ENFS) af_nbenf = nb_enf(age, smic55, law.fam.af.age1, law.fam.af.age2) return period, af_nbenf @reference_formula class supp_familial_traitement(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Supplément familial de traitement" # Attention : par hypothèse ne peut êre attribué qu'à la tête du ménage # TODO: gérer le cas encore problématique du conjoint fonctionnaire def function(self, simulation, period): period = period.start.period(u'month').offset('first-of') type_sal = simulation.calculate('type_sal', period) traitement_indiciaire_brut = simulation.calculate('traitement_indiciaire_brut', period) af_nbenf_fonc_holder = simulation.compute('af_nbenf_fonc', period) _P = simulation.legislation_at(period.start) fonc_nbenf = self.cast_from_entity_to_role(af_nbenf_fonc_holder, role = CHEF) P = _P.fonc.supp_fam part_fixe_1 = P.fixe.enf1 part_fixe_2 = P.fixe.enf2 part_fixe_supp = P.fixe.enfsupp part_fixe = ( part_fixe_1 * (fonc_nbenf == 1) + part_fixe_2 * (fonc_nbenf == 2) + part_fixe_supp * max_(0, fonc_nbenf - 2) ) # pct_variable_1 = 0 pct_variable_2 = P.prop.enf2 pct_variable_3 = P.prop.enf3 pct_variable_supp = P.prop.enfsupp pct_variable = ( pct_variable_2 * (fonc_nbenf == 2) + (pct_variable_3) * (fonc_nbenf == 3) + pct_variable_supp * max_(0, fonc_nbenf - 3)) indice_maj_min = P.IM_min indice_maj_max = P.IM_max traitement_brut_mensuel_min = _traitement_brut_mensuel(indice_maj_min, _P) plancher_mensuel_1 = part_fixe plancher_mensuel_2 = part_fixe + traitement_brut_mensuel_min * pct_variable_2 plancher_mensuel_3 = part_fixe + traitement_brut_mensuel_min * pct_variable_3 plancher_mensuel_supp = traitement_brut_mensuel_min * pct_variable_supp plancher = (plancher_mensuel_1 * (fonc_nbenf == 1) + plancher_mensuel_2 * (fonc_nbenf == 2) + plancher_mensuel_3 * (fonc_nbenf >= 3) + plancher_mensuel_supp * max_(0, fonc_nbenf - 3)) traitement_brut_mensuel_max = _traitement_brut_mensuel(indice_maj_max, _P) plafond_mensuel_1 = part_fixe plafond_mensuel_2 = part_fixe + traitement_brut_mensuel_max * pct_variable_2 plafond_mensuel_3 = part_fixe + traitement_brut_mensuel_max * pct_variable_3 plafond_mensuel_supp = traitement_brut_mensuel_max * pct_variable_supp plafond = (plafond_mensuel_1 * (fonc_nbenf == 1) + plafond_mensuel_2 * (fonc_nbenf == 2) + plafond_mensuel_3 * (fonc_nbenf == 3) + plafond_mensuel_supp * max_(0, fonc_nbenf - 3)) sft = min_(max_(part_fixe + pct_variable * traitement_indiciaire_brut, plancher), plafond) * (type_sal >= 2) # Nota Bene: # type_sal is an EnumCol which enum is: # CAT = Enum(['prive_non_cadre', # 'prive_cadre', # 'public_titulaire_etat', # 'public_titulaire_militaire', # 'public_titulaire_territoriale', # 'public_titulaire_hospitaliere', # 'public_non_titulaire']) return period, sft def _traitement_brut_mensuel(indice_maj, law): Indice_majore_100_annuel = law.fonc.IM_100 traitement_brut = Indice_majore_100_annuel * indice_maj / 100 / 12 return traitement_brut @reference_formula class remuneration_principale(SimpleFormulaColumn): column = FloatCol entity_class = Individus label = u"Rémunération principale des agents titulaires de la fonction publique" def function(self, simulation, period): traitement_indiciaire_brut = simulation.calculate('traitement_indiciaire_brut', period) nouvelle_bonification_indiciaire = simulation.calculate('nouvelle_bonification_indiciaire', period) type_sal = simulation.calculate('type_sal', period) return period, ( (type_sal >= 2) * (type_sal <= 5) * ( traitement_indiciaire_brut + nouvelle_bonification_indiciaire ) ) @reference_formula class salaire_net_a_payer(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Salaire net à payer (fiche de paie)" set_input = set_input_divide_by_period def function(self, simulation, period): ''' Calcul du salaire net à payer après déduction des sommes dues par les salarié avancées par l'employeur ''' period = period salaire_net = simulation.calculate_add('salaire_net', period) depense_cantine_titre_restaurant_employe = simulation.calculate( 'depense_cantine_titre_restaurant_employe') indemnites_forfaitaires = simulation.calculate('indemnites_forfaitaires', period) remuneration_apprenti = simulation.calculate('remuneration_apprenti', period) stage_gratification = simulation.calculate('stage_gratification', period) salaire_net_a_payer = ( salaire_net + remuneration_apprenti + stage_gratification + depense_cantine_titre_restaurant_employe + indemnites_forfaitaires ) return period, salaire_net_a_payer @reference_formula class salsuperbrut(SimpleFormulaColumn): base_function = requested_period_added_value column = FloatCol entity_class = Individus label = u"Salaires superbruts/coût du travail" set_input = set_input_divide_by_period def function(self, simulation, period): period = period remuneration_apprenti = simulation.calculate_add('remuneration_apprenti', period) salaire_de_base = simulation.calculate('salaire_de_base', period) primes_fonction_publique = simulation.calculate_add('primes_fonction_publique', period) indemnite_residence = simulation.calculate_add('indemnite_residence', period) supp_familial_traitement = simulation.calculate_add('supp_familial_traitement', period) cotisations_employeur = simulation.calculate('cotisations_employeur', period) depense_cantine_titre_restaurant_employeur = simulation.calculate( 'depense_cantine_titre_restaurant_employeur', period) exoneration_cotisations_employeur_apprenti = simulation.calculate_add( 'exoneration_cotisations_employeur_apprenti', period) exoneration_cotisations_employeur_geographiques = simulation.calculate( 'exoneration_cotisations_employeur_geographiques', period) exoneration_cotisations_employeur_jei = simulation.calculate_add( 'exoneration_cotisations_employeur_jei', period) exoneration_cotisations_employeur_stagiaire = simulation.calculate_add( 'exoneration_cotisations_employeur_stagiaire', period) allegement_fillon = simulation.calculate_add('allegement_fillon', period) credit_impot_competitivite_emploi = simulation.calculate_add('credit_impot_competitivite_emploi', period) reintegration_titre_restaurant_employeur = simulation.calculate( 'reintegration_titre_restaurant_employeur', period) remuneration_principale = simulation.calculate('remuneration_principale', period) tehr = simulation.calculate_divide('tehr', period) salsuperbrut = ( remuneration_apprenti + salaire_de_base + depense_cantine_titre_restaurant_employeur - reintegration_titre_restaurant_employeur + remuneration_principale + primes_fonction_publique + indemnite_residence + supp_familial_traitement - cotisations_employeur - allegement_fillon - exoneration_cotisations_employeur_geographiques - exoneration_cotisations_employeur_jei - exoneration_cotisations_employeur_apprenti - exoneration_cotisations_employeur_stagiaire - credit_impot_competitivite_emploi - tehr ) return period, salsuperbrut PKF3openfisca_france/model/revenus/activite/__init__.pyPK'G:_B6openfisca_france/model/revenus/activite/non_salarie.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from ...base import * # noqa # TODO: 5QL # Nomenclature : # première lettre : # e : auto-entrepreneur # m : micro entreprise, déclaratif spécial # n : bénéfice réel sans CGA # a : bénéfice réel avec CGA ou viseur # f : forfait # c : déclaration contrôlée) # trois lettres suivantes, catégorie du revenu : # rag : agricole # bic : industriel et commercial pro # bnc : non commercial pro # acc : industriel et commercial non pro # ncn : non commercial non pro # après l'underscore : abbréviation du label de la case build_column('f5qm', IntCol(entity = 'ind', label = u"Agents généraux d’assurances: indemnités de cessation d’activité", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5QM", QUIFOY['conj']: u"5RM", })) # (f5qm, f5rm ) # Revenus des professions non salariées build_column('ppe_du_ns', IntCol(entity = 'ind', label = u"Prime pour l'emploi des non-salariés: nombre de jours travaillés dans l'année", end = date(2006, 12, 31), cerfa_field = {QUIFOY['vous']: u"5NV", QUIFOY['conj']: u"5OV", QUIFOY['pac1']: u"5PV", })) # (f5nv, f5ov, f5pv) build_column('ppe_tp_ns', BoolCol(entity = 'ind', label = u"Prime pour l'emploi des non-salariés: indicateur de travail à temps plein sur l'année entière", end = date(2006, 12, 31), cerfa_field = {QUIFOY['vous']: u"5NW", QUIFOY['conj']: u"5OW", QUIFOY['pac1']: u"5PW", })) # (f5nw, f5ow, f5pw) build_column('frag_exon', IntCol(entity = 'ind', label = u"Revenus agricoles exonérés (régime du forfait)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HN", QUIFOY['conj']: u"5IN", QUIFOY['pac1']: u"5JN", })) # (f5hn, f5in, f5jn)) build_column('frag_impo', IntCol(entity = 'ind', label = u"Revenus agricoles imposables (régime du forfait)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HO", QUIFOY['conj']: u"5IO", QUIFOY['pac1']: u"5JO", })) # (f5ho, f5io, f5jo)) build_column('arag_exon', IntCol(entity = 'ind', label = u"Revenus agricoles exonérés yc plus-values (Régime du bénéfice réel, revenus bénéficiant de l'abattement CGA ou viseur), activités exercées en Corse", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HB", QUIFOY['conj']: u"5IB", QUIFOY['pac1']: u"5JB", })) # (f5hb, f5ib, f5jb)) build_column('arag_impg', IntCol(entity = 'ind', label = u"Revenus agricoles imposables, cas général moyenne triennale (Régime du bénéfice réel, revenus bénéficiant de l'abattement CGA ou viseur)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HC", QUIFOY['conj']: u"5IC", QUIFOY['pac1']: u"5JC", })) # (f5hc, f5ic, f5jc)) build_column('arag_defi', IntCol(entity = 'ind', label = u"Déficits agricoles (Régime du bénéfice réel, revenus bénéficiant de l'abattement CGA ou viseur)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HF", QUIFOY['conj']: u"5IF", QUIFOY['pac1']: u"5JF", })) # (f5hf, f5if, f5jf)) build_column('nrag_exon', IntCol(entity = 'ind', label = u"Revenus agricoles exonérés yc plus-values (Régime du bénéfice réel, revenus ne bénéficiant pas de l'abattement CGA ou viseur), activités exercées en Corse", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HH", QUIFOY['conj']: u"5IH", QUIFOY['pac1']: u"5JH", })) # (f5hh, f5ih, f5jh)) build_column('nrag_impg', IntCol(entity = 'ind', label = u"Revenus agricoles imposables, cas général moyenne triennale (Régime du bénéfice réel, revenus ne bénéficiant pas de l'abattement CGA ou viseur)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HI", QUIFOY['conj']: u"5II", QUIFOY['pac1']: u"5JI", })) # (f5hi, f5ii, f5ji)) build_column('nrag_defi', IntCol(entity = 'ind', label = u"Déficits agricoles (Régime du bénéfice réel, revenus ne bénéficiant pas de l'abattement CGA ou viseur)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HL", QUIFOY['conj']: u"5IL", QUIFOY['pac1']: u"5JL", })) # (f5hl, f5il, f5jl)) build_column('nrag_ajag', IntCol(entity = 'ind', label = u"Jeunes agriculteurs, Abattement de 50% ou 100% (Régime du bénéfice réel, revenus bénéficiant de l'abattement CGA ou viseur)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HM", QUIFOY['conj']: u"5IM", QUIFOY['pac1']: u"5JM", })) # (f5hm, f5im, f5jm)) # Autoentrepreneur build_column('ebic_impv', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux professionnels imposables: vente de marchandises et assimilées (régime auto-entrepreneur)", val_type = "monetary", start = date(2009, 1, 1), end = date(2009, 12, 31), cerfa_field = {QUIFOY['vous']: u"5TA", QUIFOY['conj']: u"5UA", QUIFOY['pac1']: u"5VA", })) # (f5ta, f5ua, f5va)) build_column('ebic_imps', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux professionnels imposables: prestations de services et locations meublées (régime auto-entrepreneur)", val_type = "monetary", start = date(2009, 1, 1), end = date(2009, 12, 31), cerfa_field = {QUIFOY['vous']: u"5TB", QUIFOY['conj']: u"5UB", QUIFOY['pac1']: u"5VB", })) # (f5tb, f5ub, f5vb)) build_column('ebnc_impo', IntCol(entity = 'ind', label = u"Revenus non commerciaux (régime auto-entrepreneur ayant opté pour le versement libératoire)", val_type = "monetary", start = date(2009, 1, 1), end = date(2009, 12, 31), cerfa_field = {QUIFOY['vous']: u"5TE", QUIFOY['conj']: u"5UE", QUIFOY['pac1']: u"5VE", })) # (f5te, f5ue, f5ve)) build_column('mbic_exon', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux professionnels nets exonérés (régime micro entreprise)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KN", QUIFOY['conj']: u"5LN", QUIFOY['pac1']: u"5MN", })) # (f5kn, f5ln, f5mn)) build_column('abic_exon', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux nets exonérés yc plus-values avec CGA ou viseur (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KB", QUIFOY['conj']: u"5LB", QUIFOY['pac1']: u"5MB", })) # (f5kb, f5lb, f5mb)) build_column('nbic_exon', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux nets exonérés yc plus-values sans CGA (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KH", QUIFOY['conj']: u"5LH", QUIFOY['pac1']: u"5MH", })) # (f5kh, f5lh, f5mh)) build_column('mbic_impv', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux professionnels imposables: vente de marchandises (régime micro entreprise)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KO", QUIFOY['conj']: u"5LO", QUIFOY['pac1']: u"5MO", })) # (f5ko, f5lo, f5mo)) build_column('mbic_imps', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux professionnels imposables: prestations de services et locations meublées (régime micro entreprise)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KP", QUIFOY['conj']: u"5LP", QUIFOY['pac1']: u"5MP", })) # (f5kp, f5lp, f5mp)) build_column('abic_impn', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux imposables: régime normal ou simplifié avec CGA ou viseur (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KC", QUIFOY['conj']: u"5LC", QUIFOY['pac1']: u"5MC", })) # (f5kc, f5lc, f5mc)) build_column('abic_imps', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux imposables: régime simplifié avec CGA ou viseur (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KD", QUIFOY['conj']: u"5LD", QUIFOY['pac1']: u"5MD", }, end = date(2009, 12, 31))) # (f5kd, f5ld, f5md)) build_column('nbic_impn', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux professionnels imposables: régime normal ou simplifié sans CGA (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KI", QUIFOY['conj']: u"5LI", QUIFOY['pac1']: u"5MI", } )) # (f5ki, f5li, f5mi)) # """ # réutilisation cases 2013 # """ build_column('nbic_imps', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux professionnels imposables: régime simplifié sans CGA (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KJ", QUIFOY['conj']: u"5LJ", QUIFOY['pac1']: u"5MJ", }, end = date(2009, 12, 31))) # TODO: c'est 5HU pour les années anciennes build_column('nbic_mvct', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux professionnels moins-values nettes à court terme", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KJ", QUIFOY['conj']: u"5LJ", QUIFOY['pac1']: u"5MJ", }, start = date(2012, 1, 1))) # (f5kj, f5lj, f5mj)) # vérifier date début #####à intégrer dans OF####### build_column('abic_defn', IntCol(entity = 'ind', label = u"Déficits industriels et commerciaux: régime normal ou simplifié avec CGA ou viseur (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KF", QUIFOY['conj']: u"5LF", QUIFOY['pac1']: u"5MF", })) # (f5kf, f5lf, f5mf)) build_column('abic_defs', IntCol(entity = 'ind', label = u"Déficits industriels et commerciaux: simplifié avec CGA ou viseur (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KG", QUIFOY['conj']: u"5LG", QUIFOY['pac1']: u"5MG", }, end = date(2009, 12, 1))) # (f5kg, f5lg, f5mg)) # vérif <=2012 build_column('nbic_defn', IntCol(entity = 'ind', label = u"Déficits industriels et commerciaux: régime normal ou simplifié sans CGA (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KL", QUIFOY['conj']: u"5LL", QUIFOY['pac1']: u"5ML", })) # (f5kl, f5ll, f5ml)) build_column('nbic_defs', IntCol(entity = 'ind', label = u"Locations déjà soumises aux prélèvements sociaux sans CGA (régime du bénéfice réel)", val_type = "monetary", end = date(2009, 12, 31), cerfa_field = {QUIFOY['vous']: u"5KL", QUIFOY['conj']: u"5LM", QUIFOY['pac1']: u"5MM", })) # (f5km, f5lm, f5mm)) build_column('nbic_apch', IntCol(entity = 'ind', label = u"Artisans pêcheurs : abattement 50% avec CGA ou viseur (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KS", QUIFOY['conj']: u"5LS", QUIFOY['pac1']: u"5MS", })) # (f5ks, f5ls, f5ms)) build_column('macc_exon', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux non professionnels nets exonérés (régime micro entreprise)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5NN", QUIFOY['conj']: u"5ON", QUIFOY['pac1']: u"5PN", })) # (f5nn, f5on, f5pn)) build_column('aacc_exon', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux non professionnels exonérés yc plus-values avec CGA ou viseur (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5NB", QUIFOY['conj']: u"5OB", QUIFOY['pac1']: u"5PB", })) # (f5nb, f5ob, f5pb)) build_column('nacc_exon', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux non professionnels exonérés yc plus-values sans CGA (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5NH", QUIFOY['conj']: u"5OH", QUIFOY['pac1']: u"5PH", })) # (f5nh, f5oh, f5ph)) build_column('macc_impv', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux non professionnels imposables: vente de marchandises et assimilées (régime micro entreprise)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5NO", QUIFOY['conj']: u"5OO", QUIFOY['pac1']: u"5PO", })) # (f5no, f5oo, f5po)) build_column('macc_imps', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux non professionnels imposables: prestations de services (régime micro entreprise)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5NP", QUIFOY['conj']: u"5OP", QUIFOY['pac1']: u"5PP", })) # (f5np, f5op, f5pp)) build_column('aacc_impn', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux non professionnels imposables: régime normal ou simplifié avec CGA ou viseur (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5NC", QUIFOY['conj']: u"5OC", QUIFOY['pac1']: u"5PC", })) # (f5nc, f5oc, f5pc)) build_column('aacc_imps', IntCol(entity = 'ind', label = u"Locations meublées non professionnelles (régime micro entreprise)", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = {QUIFOY['vous']: u"5ND", QUIFOY['conj']: u"5OD", QUIFOY['pac1']: u"5PD", })) # (f5nd, f5od, f5pd)) #TODO: avant 2010 build_column('aacc_defn', IntCol(entity = 'ind', label = u"Déficits industriels et commerciaux non professionnels: régime normal ou simplifié avec CGA ou viseur (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5NF", QUIFOY['conj']: u"5OF", QUIFOY['pac1']: u"5PF", })) # (f5nf, f5of, f5pf)) build_column('aacc_gits', IntCol(entity = 'ind', label = u"Location de gîtes ruraux, chambres d'hôtes et meublés de tourisme (régime micro entreprise)", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = {QUIFOY['vous']: u"5NG", QUIFOY['conj']: u"5OG", QUIFOY['pac1']: u"5PG", })) # (f5ng, f5og, f5pg)) build_column('nacc_impn', IntCol(entity = 'ind', label = u"Revenus industriels et commerciaux non professionnels imposables: régime normal ou simplifié sans CGA (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5NI", QUIFOY['conj']: u"5OI", QUIFOY['pac1']: u"5PI", })) # (f5ni, f5oi, f5pi)) build_column('aacc_defs', IntCol(entity = 'ind', label = u"Déficits de revenus industriels et commerciaux non professionnels avec CGA (régime simplifié du bénéfice réel)", val_type = "monetary", end = date(2009, 12, 31), cerfa_field = {QUIFOY['vous']: u"5NG", QUIFOY['conj']: u"5OG", QUIFOY['pac1']: u"5PG", })) build_column('nacc_meup', IntCol(entity = 'ind', label = u"Locations meublées non professionnelles: Locations déjà soumises aux prélèvements sociaux (régime micro entreprise)", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = {QUIFOY['vous']: u"5NJ", QUIFOY['conj']: u"5OJ", QUIFOY['pac1']: u"5PJ", })) # (f5nj, f5oj, f5pj)) #TODO: dates 5PJ, 5PG, 5PD, 5OM build_column('nacc_defn', IntCol(entity = 'ind', label = u"Déficits industriels et commerciaux non professionnels: régime normal ou simplifié sans CGA (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5NL", QUIFOY['conj']: u"5OL", QUIFOY['pac1']: u"5PL", })) # (f5nl, f5ol, f5pl)) build_column('nacc_defs', IntCol(entity = 'ind', label = u"Locations meublées non professionnelles: Gîtes ruraux et chambres d'hôtes déjà soumis aux prélèvements sociaux avec CGA (régime du bénéfice réel)", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = {QUIFOY['vous']: u"5NM", QUIFOY['conj']: u"5OM", QUIFOY['pac1']: u"5PM", })) # (f5nm, f5om, f5pm)) #TODO autres 5NM build_column('mncn_impo', IntCol(entity = 'ind', label = u"Revenus non commerciaux non professionnels imposables (régime déclaratif spécial ou micro BNC)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KU", QUIFOY['conj']: u"5LU", QUIFOY['pac1']: u"5MU", })) # (f5ku, f5lu, f5mu)) build_column('cncn_bene', IntCol(entity = 'ind', label = u"Revenus non commerciaux non professionnels imposables sans AA (régime de la déclaration controlée)", val_type = "monetary", start = date(2006, 1, 1), cerfa_field = {QUIFOY['vous']: u"5SN", QUIFOY['conj']: u"5NS", QUIFOY['pac1']: u"5OS", })) # (f5sn, f5ns, f5os)) build_column('cncn_defi', IntCol(entity = 'ind', label = u"Déficits non commerciaux non professionnels sans AA (régime de la déclaration controlée)", val_type = "monetary", start = date(2006, 1, 1), cerfa_field = {QUIFOY['vous']: u"5SP", QUIFOY['conj']: u"5NU", QUIFOY['pac1']: u"5OU", })) # (f5sp, f5nu, f5ou, f5sr)) # pas de f5sr en 2013 build_column('mbnc_exon', IntCol(entity = 'ind', label = u"Revenus non commerciaux professionnels nets exonérés (régime déclaratif spécial ou micro BNC)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5HP", QUIFOY['conj']: u"5IP", QUIFOY['pac1']: u"5JP", })) # (f5hp, f5ip, f5jp)) build_column('abnc_exon', IntCol(entity = 'ind', label = u"Revenus non commerciaux professionnels exonérés (yc compris plus-values) (régime de la déclaration controlée, revenus bénéficiant de l'abattement association agrée ou viseur)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5QB", QUIFOY['conj']: u"5RB", QUIFOY['pac1']: u"5SB", })) # (f5qb, f5rb, f5sb)) build_column('nbnc_exon', IntCol(entity = 'ind', label = u"Revenus non commerciaux professionnels exonérés (yc compris plus-values) (régime de la déclaration controlée, revenus ne bénéficiant pas de l'abattement association agrée)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5QH", QUIFOY['conj']: u"5RH", QUIFOY['pac1']: u"5SH", })) # (f5qh, f5rh, f5sh)) build_column('mbnc_impo', IntCol(entity = 'ind', label = u"Revenus non commerciaux professionnels imposables (régime déclaratif spécial ou micro BNC)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5HQ", QUIFOY['conj']: u"5IQ", QUIFOY['pac1']: u"5JQ", })) # (f5hq, f5iq, f5jq)) build_column('abnc_impo', IntCol(entity = 'ind', label = u"Revenus non commerciaux professionnels imposables (régime de la déclaration controlée, revenus bénéficiant de l'abattement association agrée ou viseur)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5QC", QUIFOY['conj']: u"5RC", QUIFOY['pac1']: u"5SC", })) # (f5qc, f5rc, f5sc)) build_column('abnc_defi', IntCol(entity = 'ind', label = u"Déficits non commerciaux professionnels (régime de la déclaration controlée, revenus bénéficiant de l'abattement association agrée ou viseur)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5QE", QUIFOY['conj']: u"5RE", QUIFOY['pac1']: u"5SE", })) # (f5qe, f5re, f5se)) build_column('nbnc_impo', IntCol(entity = 'ind', label = u"Revenus non commerciaux professionnels imposables (régime de la déclaration controlée, revenus ne bénéficiant pas de l'abattement association agrée)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5QI", QUIFOY['conj']: u"5RI", QUIFOY['pac1']: u"5SI", })) # (f5qi, f5ri, f5si)) build_column('nbnc_defi', IntCol(entity = 'ind', label = u"Déficits non commerciaux professionnels (régime de la déclaration controlée, revenus ne bénéficiant pas de l'abattement association agrée)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5QK", QUIFOY['conj']: u"5RK", QUIFOY['pac1']: u"5SK", })) # (f5qk, f5rk, f5sk)) build_column('mbic_mvct', IntCol(entity = 'foy', label = u"Moins-values industrielles et commerciales nettes à court terme du foyer (régime micro entreprise)", val_type = "monetary", cerfa_field = u'5HU', end = date(2011, 12, 31))) # (f5hu)) # vérif <=2012 build_column('macc_mvct', IntCol(entity = 'foy', label = u"Moins-values industrielles et commerciales non professionnelles nettes à court terme du foyer (régime micro entreprise)", val_type = "monetary", cerfa_field = u'5IU')) # (f5iu)) build_column('mncn_mvct', IntCol(entity = 'foy', label = u"Moins-values non commerciales non professionnelles nettes à court terme du foyer (régime déclaratif spécial ou micro BNC)", val_type = "monetary", cerfa_field = u'JU')) # (f5ju)) build_column('mbnc_mvct', IntCol(entity = 'ind', label = u"Moins-values non commerciales professionnelles nettes à court terme (régime déclaratif spécial ou micro BNC)", val_type = "monetary", start = date(2012, 1, 1), cerfa_field = {QUIFOY['vous']: u"5KZ", #TODO: pb cerfa field QUIFOY['conj']: u"5LZ", QUIFOY['pac1']: u"5MZ", })) # (f5kz, f5lz , f5mz), f5lz , f5mz sont présentent en 2013 build_column('frag_pvct', IntCol(entity = 'ind', label = u"Plus-values agricoles à court terme (régime du forfait)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HW", QUIFOY['conj']: u"5IW", QUIFOY['pac1']: u"5JW", })) # (f5hw, f5iw, f5jw)) build_column('mbic_pvct', IntCol(entity = 'ind', label = u"Plus-values industrielles et commerciales professionnels imposables: plus-values nettes à court terme (régime micro entreprise)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KX", QUIFOY['conj']: u"5LX", QUIFOY['pac1']: u"5MX", })) # (f5kx, f5lx, f5mx)) build_column('macc_pvct', IntCol(entity = 'ind', label = u"Plus-values industrielles et commerciales non professionnelles imposables: plus-values nettes à court terme (régime micro entreprise)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5NX", QUIFOY['conj']: u"5OX", QUIFOY['pac1']: u"5PX", })) # (f5nx, f5ox, f5px)) build_column('mbnc_pvct', IntCol(entity = 'ind', label = u"Plus-values non commerciales professionnelles imposables et Plus-values nettes à court terme (régime déclaratif spécial ou micro BNC)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5HV", QUIFOY['conj']: u"5IV", QUIFOY['pac1']: u"5JV", })) # (f5hv, f5iv, f5jv)) build_column('mncn_pvct', IntCol(entity = 'ind', label = u"Plus-values non commerciales non professionnelles imposables et plus-values nettes à court terme (régime déclaratif spécial ou micro BNC)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KY", QUIFOY['conj']: u"5LY", QUIFOY['pac1']: u"5MY", })) # (f5ky, f5ly, f5my)) build_column('mbic_mvlt', IntCol(entity = 'ind', label = u"Moins-values industrielles et commerciales professionnels à long terme (régime micro entreprise)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KR", QUIFOY['conj']: u"5LR", QUIFOY['pac1']: u"5MR", })) # (f5kr, f5lr, f5mr)) build_column('macc_mvlt', IntCol(entity = 'ind', label = u"Moins-values industrielles et commerciales non professionnelles à long terme (régime micro entreprise)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5NR", QUIFOY['conj']: u"5OR", QUIFOY['pac1']: u"5PR", })) # (f5nr, f5or, f5pr)) build_column('mncn_mvlt', IntCol(entity = 'ind', label = u"Moins-values non commerciales non professionnelles à long terme (régime déclaratif spécial ou micro BNC)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KW", QUIFOY['conj']: u"5LW", QUIFOY['pac1']: u"5MW", })) # (f5kw, f5lw, f5mw)) build_column('mbnc_mvlt', IntCol(entity = 'ind', label = u"Moins-values non commerciales professionnelles à long terme (régime déclaratif spécial ou micro BNC)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5HS", QUIFOY['conj']: u"5IS", QUIFOY['pac1']: u"5JS", })) # (f5hs, f5is, f5js)) build_column('frag_pvce', IntCol(entity = 'ind', label = u"Plus-values agricoles de cession taxables à 16% (régime du forfait)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HX", QUIFOY['conj']: u"5IX", QUIFOY['pac1']: u"5JX", })) # (f5hx, f5ix, f5jx)) build_column('arag_pvce', IntCol(entity = 'ind', label = u"Plus-values agricoles de cession taxables à 16% (Régime du bénéfice réel, revenus bénéficiant de l'abattement CGA ou viseur)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HE", QUIFOY['conj']: u"5IE", QUIFOY['pac1']: u"5JE", })) # (f5he, f5ie, f5je)) build_column('nrag_pvce', IntCol(entity = 'ind', label = u"Plus-values agricoles de cession taxables à 16% (Régime du bénéfice réel, revenus ne bénéficiant pas de l'abattement CGA ou viseur)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5HK", QUIFOY['conj']: u"5LK", QUIFOY['pac1']: u"5JK", }, end = date(2006, 12, 31))) # TODO: vérif <=2012)) # (f5hk, f5lk, f5jk) codent autre chose sur d'autres années), build_column('mbic_pvce', IntCol(entity = 'ind', label = u"Plus-values industrielles et commerciales professionnelles imposables: plus-values de cession taxables à 16% (régime micro entreprise)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KQ", QUIFOY['conj']: u"5LQ", QUIFOY['pac1']: u"5MQ", })) # (f5kq, f5lq, f5mq)) build_column('abic_pvce', IntCol(entity = 'ind', label = u"Plus-values industrielles et commerciales de cession taxables à 16% avec CGA ou viseur (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KE", QUIFOY['conj']: u"5LE", QUIFOY['pac1']: u"5ME", })) # (f5ke, f5le, f5me)) build_column('nbic_pvce', IntCol(entity = 'ind', label = u"Revenus non commerciaux non professionnels exonérés sans AA (régime de la déclaration controlée)", val_type = "monetary", start = date(2008, 1, 1), cerfa_field = {QUIFOY['vous']: u"5IK", QUIFOY['conj']: u"5KK", QUIFOY['pac1']: u"5MK", })) # (f5kk, f5ik, f5mk)) TODO: autre 5KK 2005/20006 build_column('macc_pvce', IntCol(entity = 'ind', label = u"Plus-values industrielles et commerciales non professionnelles imposables: plus-values de cession taxables à 16% (régime micro entreprise)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5NQ", QUIFOY['conj']: u"5OQ", QUIFOY['pac1']: u"5PQ", })) # (f5nq, f5oq, f5pq)) build_column('aacc_pvce', IntCol(entity = 'ind', label = u"Plus-values industrielles et commerciales non professionnelles de cession taxables à 16% avec CGA ou viseur (régime du bénéfice réel)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5NE", QUIFOY['conj']: u"5OE", QUIFOY['pac1']: u"5PE", })) # (f5ne, f5oe, f5pe)) build_column('nacc_pvce', IntCol(entity = 'ind', label = u"Locations meublées non professionnelles: Revenus imposables sans CGA (régime du bénéfice réel)", val_type = "monetary", start = date(2009, 1, 1), end = date(2010, 12, 31), cerfa_field = {QUIFOY['vous']: u"5NK", QUIFOY['conj']: u"5OK", QUIFOY['pac1']: u"5PK", })) # (f5nk, f5ok, f5pk)) TODO: 5NK 2005/2006 build_column('mncn_pvce', IntCol(entity = 'ind', label = u"Plus-values non commerciales non professionnelles de cession taxables à 16% (régime déclaratif spécial ou micro BNC)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5KV", QUIFOY['conj']: u"5LV", QUIFOY['pac1']: u"5MV", })) # (f5kv, f5lv, f5mv)) build_column('cncn_pvce', IntCol(entity = 'ind', label = u"Plus-values non commerciales non professionnelles taxables à 16% avec AA ou viseur (régime de la déclaration controlée)", val_type = "monetary", start = date(2006, 1, 1), cerfa_field = {QUIFOY['vous']: u"5SO", QUIFOY['conj']: u"5NT", QUIFOY['pac1']: u"5OT", })) # (f5so, f5nt, f5ot)) build_column('mbnc_pvce', IntCol(entity = 'ind', label = u"Plus-values non commerciales professionnelles de cession taxables à 16% (régime déclaratif spécial ou micro BNC)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5HR", QUIFOY['conj']: u"5IR", QUIFOY['pac1']: u"5JR", })) # (f5hr, f5ir, f5jr)) build_column('abnc_pvce', IntCol(entity = 'ind', label = u"Plus-values non commerciaux professionnels de cession taxables à 16% (régime de la déclaration controlée, revenus bénéficiant de l'abattement association agrée ou viseur)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5QD", QUIFOY['conj']: u"5RD", QUIFOY['pac1']: u"5SD", })) # (f5qd, f5rd, f5sd)) build_column('nbnc_pvce', IntCol(entity = 'ind', label = u"Déficits industriels et commerciaux: locations meublées sans CGA (régime du bénéfice réel)", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = {QUIFOY['vous']: u"5QJ", QUIFOY['conj']: u"5RJ", QUIFOY['pac1']: u"5SJ", })) # (f5qj, f5rj, f5sj)) #TODO 5*J 2005/2006 (qui se transforme en 5*D...) build_column('frag_fore', IntCol(entity = 'ind', label = u"Revenus des exploitants forestiers (régime du forfait)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HD", QUIFOY['conj']: u"5ID", QUIFOY['pac1']: u"5JD", })) build_column('arag_sjag', IntCol(entity = 'ind', label = u"Abattement pour les jeunes agriculteurs des revenus agricoles sans CGA (régime du bénéfice réel)", val_type = "monetary", start = date(2011, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HZ", QUIFOY['conj']: u"5IZ", QUIFOY['pac1']: u"5JZ", })) build_column('abic_impm', IntCol(entity = 'ind', label = u"Locations meublées imposables avec CGA ou viseur (régime du bénéfice réel pour les revenus industriels et commerciaux professionnels)", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HA", QUIFOY['conj']: u"5IA", QUIFOY['pac1']: u"5JA", })) build_column('nbic_impm', IntCol(entity = 'ind', label = u"Locations meublées imposables sans CGA (régime du bénéfice réel)", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = {QUIFOY['vous']: u"5KA", QUIFOY['conj']: u"5LA", QUIFOY['pac1']: u"5MA", })) build_column('abic_defm', IntCol(entity = 'ind', label = u"Déficits de locations meubléesavec CGA ou viseur (régime du bénéfice réel pour les revenus industriels et commerciaux professionnels)", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = {QUIFOY['vous']: u"5QA", QUIFOY['conj']: u"5RA", QUIFOY['pac1']: u"5SA", })) build_column('alnp_imps', IntCol(entity = 'ind', label = u"Locations meublées non professionnelles imposables avec CGA ou viseur (régime du bénéfice réel)", val_type = "monetary", start = date(2009, 1, 1), end = date(2010, 12, 31), cerfa_field = {QUIFOY['vous']: u"5NA", QUIFOY['conj']: u"5OA", QUIFOY['pac1']: u"5PA", })) build_column('alnp_defs', IntCol(entity = 'ind', label = u"Déficits de locations meublées non professionnelles avec CGA ou viseur (régime du bénéfice réel)", val_type = "monetary", start = date(2009, 1, 1), end = date(2010, 12, 31), cerfa_field = {QUIFOY['vous']: u"5NY", QUIFOY['conj']: u"5OY", QUIFOY['pac1']: u"5PY", })) build_column('nlnp_defs', IntCol(entity = 'ind', label = u"Déficits de locations meublées non professionnelles imposables sans CGA (régime du bénéfice réel)", val_type = "monetary", start = date(2009, 1, 1), end = date(2010, 12, 31), cerfa_field = {QUIFOY['vous']: u"5NZ", QUIFOY['conj']: u"5OZ", QUIFOY['pac1']: u"5PZ", })) build_column('cbnc_assc', IntCol(entity = 'ind', label = u"Agents généraux d'assurances : indemnités de cessation d'activité (revenus non commerciaux professionnels, régime de la déclaration contrôlée)", val_type = "monetary", start = date(2006, 1, 1), cerfa_field = {QUIFOY['vous']: u"5QM", QUIFOY['conj']: u"5RM", })) build_column('abnc_proc', IntCol(entity = 'ind', label = u"Honoraires de prospection commerciale exonérés avec CGA ou viseur (revenus non commerciaux professionnels, régime de la déclaration contrôlée)", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = {QUIFOY['vous']: u"5TF", QUIFOY['conj']: u"5UF", QUIFOY['pac1']: u"5VF", })) build_column('nbnc_proc', IntCol(entity = 'ind', label = u"Honoraires de prospection commerciale exonérés sans CGA (revenus non commerciaux professionnels, régime de la déclaration contrôlée)", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = {QUIFOY['vous']: u"5TI", QUIFOY['conj']: u"5UI", QUIFOY['pac1']: u"5VI", })) build_column('mncn_exon', IntCol(entity = 'ind', label = u"Revenus nets exonérés non commerciaux non professionnels (régime déclaratif spécial ou micro BNC)", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = {QUIFOY['vous']: u"5TH", QUIFOY['conj']: u"5UH", QUIFOY['pac1']: u"5VH", })) build_column('cncn_exon', IntCol(entity = 'ind', label = u"Revenus nets exonérés non commerciaux non professionnels (régime de la déclaration contrôlée)", val_type = "monetary", start = date(2008, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HK", QUIFOY['conj']: u"5JK", QUIFOY['pac1']: u"5LK", })) build_column('cncn_aimp', IntCol(entity = 'ind', label = u"Revenus imposables non commerciaux non professionnels avec CGA (régime de la déclaration contrôlée)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"5JG", QUIFOY['conj']: u"5RF", QUIFOY['pac1']: u"5SF", })) build_column('cncn_adef', IntCol(entity = 'ind', label = u"Déficits non commerciaux non professionnels avec CGA (régime de la déclaration contrôlée)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = {QUIFOY['vous']: u"5JJ", QUIFOY['conj']: u"5RG", QUIFOY['pac1']: u"5SG", })) build_column('cncn_info', IntCol(entity = 'ind', label = u"Inventeurs et auteurs de logiciels : produits taxables à 16%, revenus non commerciaux non professionnels avec CGA (régime de la déclaration contrôlée)", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = {QUIFOY['vous']: u"5TC", QUIFOY['conj']: u"5UC", QUIFOY['pac1']: u"5VC", })) build_column('cncn_jcre', IntCol(entity = 'ind', label = u"Jeunes créateurs : abattement de 50%, revenus non commerciaux non professionnels avec CGA (régime de la déclaration contrôlée)", val_type = "monetary", start = date(2006, 1, 1), cerfa_field = {QUIFOY['vous']: u"5SV", QUIFOY['conj']: u"5SW", QUIFOY['pac1']: u"5SX", })) build_column('revimpres', IntCol(entity = 'ind', label = u"Revenus nets à imposer aux prélèvements sociaux", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"5HY", QUIFOY['conj']: u"5IY", QUIFOY['pac1']: u"5JY", })) build_column('pveximpres', IntCol(entity = 'ind', label = u"Plus-values à long terme exonérées en cas de départ à la retraite à imposer aux prélèvements sociaux", start = date(2006, 1, 1), cerfa_field = {QUIFOY['vous']: u"5HG", QUIFOY['conj']: u"5IG", })) build_column('pvtaimpres', IntCol(entity = 'ind', label = u"Plus-values à long terme taxables à 16% à la retraite à imposer aux prélèvements sociaux", end = date(2009, 12, 31), cerfa_field = {QUIFOY['vous']: u"5HZ", QUIFOY['conj']: u"5IZ", QUIFOY['pac1']: u"5JZ", })) build_column('f5qf', IntCol(entity = 'foy', label = u"Déficits des revenus agricoles des années antérieures non encore déduits (n-6)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'5QF')) build_column('f5qg', IntCol(entity = 'foy', label = u"Déficits des revenus agricoles des années antérieures non encore déduits (n-5)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'5QG')) build_column('f5qn', IntCol(entity = 'foy', label = u"Déficits des revenus agricoles des années antérieures non encore déduits (n-4)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'5QN')) build_column('f5qo', IntCol(entity = 'foy', label = u"Déficits des revenus agricoles des années antérieures non encore déduits (n-3)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'5QO')) build_column('f5qp', IntCol(entity = 'foy', label = u"Déficits des revenus agricoles des années antérieures non encore déduits (n-2)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'5QP')) build_column('f5qq', IntCol(entity = 'foy', label = u"Déficits des revenus agricoles des années antérieures non encore déduits (n-1)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'5QQ')) build_column('f5ga', IntCol(entity = 'foy', label = u"Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-10)", val_type = "monetary", start = date(2010, 1, 1), end = date(2010, 12, 31), cerfa_field = u'5GA')) build_column('f5gb', IntCol(entity = 'foy', label = u"Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-9)", val_type = "monetary", start = date(2010, 1, 1), end = date(2010, 12, 31), cerfa_field = u'5GB')) build_column('f5gc', IntCol(entity = 'foy', label = u"Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-8)", val_type = "monetary", start = date(2010, 1, 1), end = date(2010, 12, 31), cerfa_field = u'5GC')) build_column('f5gd', IntCol(entity = 'foy', label = u"Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-7)", val_type = "monetary", start = date(2010, 1, 1), end = date(2010, 12, 31), cerfa_field = u'5GD')) build_column('f5ge', IntCol(entity = 'foy', label = u"Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-6)", val_type = "monetary", start = date(2010, 1, 1), end = date(2010, 12, 31), cerfa_field = u'5GE')) build_column('f5gf', IntCol(entity = 'foy', label = u"Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-5)", val_type = "monetary", start = date(2010, 1, 1), end = date(2010, 12, 31), cerfa_field = u'5GF')) build_column('f5gg', IntCol(entity = 'foy', label = u"Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-4)", val_type = "monetary", start = date(2010, 1, 1), end = date(2010, 12, 31), cerfa_field = u'5GG')) build_column('f5gh', IntCol(entity = 'foy', label = u"Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-3)", val_type = "monetary", start = date(2010, 1, 1), end = date(2010, 12, 31), cerfa_field = u'5GH')) build_column('f5gi', IntCol(entity = 'foy', label = u"Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-2)", val_type = "monetary", start = date(2010, 1, 1), end = date(2010, 12, 31), cerfa_field = u'5GI')) build_column('f5gj', IntCol(entity = 'foy', label = u"Déficits des revenus de locations meublées non professionnelles années antérieures non encore déduits (n-1)", val_type = "monetary", start = date(2010, 1, 1), end = date(2010, 12, 31), cerfa_field = u'5GJ')) build_column('f5rn', IntCol(entity = 'foy', label = u"Déficits des revenus industriels et commerciaux non professionnelles années antérieures non encore déduits (n-6)", val_type = "monetary", start = date(2010, 1, 1), end = date(2010, 12, 31), cerfa_field = u'5RN')) build_column('f5ro', IntCol(entity = 'foy', label = u"Déficits des revenus industriels et commerciaux non professionnelles années antérieures non encore déduits (n-5)", val_type = "monetary", cerfa_field = u'5RO')) build_column('f5rp', IntCol(entity = 'foy', label = u"Déficits des revenus industriels et commerciaux non professionnelles années antérieures non encore déduits (n-4)", val_type = "monetary", cerfa_field = u'5RP')) build_column('f5rq', IntCol(entity = 'foy', label = u"Déficits des revenus industriels et commerciaux non professionnelles années antérieures non encore déduits (n-3)", val_type = "monetary", cerfa_field = u'5RQ')) build_column('f5rr', IntCol(entity = 'foy', label = u"Déficits des revenus industriels et commerciaux non professionnelles années antérieures non encore déduits (n-2)", val_type = "monetary", cerfa_field = u'5RR')) build_column('f5rw', IntCol(entity = 'foy', label = u"Déficits des revenus industriels et commerciaux non professionnelles années antérieures non encore déduits (n-1)", val_type = "monetary", cerfa_field = u'5RW')) build_column('f5ht', IntCol(entity = 'foy', label = u"Déficits des revenus non commerciaux non professionnelles années antérieures non encore déduits (n-6)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'5HT')) build_column('f5it', IntCol(entity = 'foy', label = u"Déficits des revenus non commerciaux non professionnelles années antérieures non encore déduits (n-5)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'5IT')) build_column('f5jt', IntCol(entity = 'foy', label = u"Déficits des revenus non commerciaux non professionnelles années antérieures non encore déduits (n-4)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'5JT')) build_column('f5kt', IntCol(entity = 'foy', label = u"Déficits des revenus non commerciaux non professionnelles années antérieures non encore déduits (n-3)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'5KT')) build_column('f5lt', IntCol(entity = 'foy', label = u"Déficits des revenus non commerciaux non professionnelles années antérieures non encore déduits (n-2)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'5LT')) build_column('f5mt', IntCol(entity = 'foy', label = u"Déficits des revenus non commerciaux non professionnelles années antérieures non encore déduits (n-1)", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'5MT')) build_column('f5sq', IntCol()) # TODO: Introduit par mes aides à consolider # Input variables reference_input_variable( name ='tns_auto_entrepreneur_chiffre_affaires', column = FloatCol, entity_class = Individus, label = u"Chiffre d'affaires en tant qu'auto-entrepreneur", set_input = set_input_divide_by_period) reference_input_variable( name ='tns_micro_entreprise_chiffre_affaires', column = FloatCol, entity_class = Individus, label = u"Chiffre d'affaires en de micro-entreprise", set_input = set_input_divide_by_period) enum_tns_type_activite = Enum([u'achat_revente', u'bic', u'bnc']) reference_input_variable( name='tns_auto_entrepreneur_type_activite', column = EnumCol(enum = enum_tns_type_activite), entity_class = Individus, is_permanent = True, label = u"Type d'activité de l'auto-entrepreneur") reference_input_variable( name='tns_micro_entreprise_type_activite', column = EnumCol(enum = enum_tns_type_activite), entity_class = Individus, is_permanent = True, label = u"Type d'activité de la micro-entreprise") reference_input_variable( name ='tns_autres_revenus', column = FloatCol, entity_class = Individus, label = u"Autres revenus non salariés", set_input = set_input_divide_by_period) reference_input_variable( name ='tns_autres_revenus_chiffre_affaires', column = FloatCol, entity_class = Individus, label = u"Chiffre d'affaire pour les TNS non agricoles autres que les AE et ME", set_input = set_input_divide_by_period) reference_input_variable( name='tns_autres_revenus_type_activite', column = EnumCol(enum = enum_tns_type_activite), entity_class = Individus, is_permanent = True, label = u"Type d'activité de l'entreprise non AE ni ME") reference_input_variable( name ='tns_employe', column = BoolCol, entity_class = Individus, label = u"Le TNS a au moins un employé. Ne s'applique pas pour les agricoles ni auto-entrepreneurs ni micro entreprise", set_input = set_input_dispatch_by_period) reference_input_variable( name = 'tns_benefice_exploitant_agricole', column = FloatCol, entity_class = Individus, label = u"Dernier bénéfice agricole", set_input = set_input_dispatch_by_period) # Computed variables @reference_formula class travailleur_non_salarie(SimpleFormulaColumn): label = u"L'individu a une activité professionnelle non salariée" column = BoolCol entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') tns_auto_entrepreneur_chiffre_affaires = simulation.calculate('tns_auto_entrepreneur_chiffre_affaires', period) != 0 tns_micro_entreprise_chiffre_affaires = simulation.calculate('tns_micro_entreprise_chiffre_affaires', period) != 0 tns_autres_revenus = simulation.calculate('tns_autres_revenus', period) != 0 tns_benefice_exploitant_agricole = simulation.calculate('tns_benefice_exploitant_agricole', period) != 0 tns_autres_revenus_chiffre_affaires = simulation.calculate('tns_autres_revenus_chiffre_affaires', period) != 0 result = ( tns_auto_entrepreneur_chiffre_affaires + tns_micro_entreprise_chiffre_affaires + tns_autres_revenus + tns_benefice_exploitant_agricole + tns_autres_revenus_chiffre_affaires ) return period, result # Auxiliary function def compute_benefice_auto_entrepreneur_micro_entreprise(bareme, type_activite, chiffre_affaire): abatt_fp_me = bareme.micro_entreprise.abattement_forfaitaire_fp benefice = chiffre_affaire * ( 1 - (type_activite == 0) * abatt_fp_me.achat_revente - (type_activite == 1) * abatt_fp_me.bic - (type_activite == 2) * abatt_fp_me.bnc) return benefice @reference_formula class tns_auto_entrepreneur_benefice(SimpleFormulaColumn): column = FloatCol label = u"Bénéfice en tant qu'auto-entrepreneur" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') tns_auto_entrepreneur_type_activite = simulation.calculate('tns_auto_entrepreneur_type_activite', period) tns_auto_entrepreneur_chiffre_affaires = simulation.calculate('tns_auto_entrepreneur_chiffre_affaires', period) bareme = simulation.legislation_at(period.start).tns benefice = compute_benefice_auto_entrepreneur_micro_entreprise(bareme, tns_auto_entrepreneur_type_activite, tns_auto_entrepreneur_chiffre_affaires) return period, benefice @reference_formula class tns_micro_entreprise_benefice(SimpleFormulaColumn) : column = FloatCol label = u"Bénéfice de la micro entreprise" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') tns_micro_entreprise_type_activite = simulation.calculate('tns_micro_entreprise_type_activite', period) tns_micro_entreprise_chiffre_affaires = simulation.calculate('tns_micro_entreprise_chiffre_affaires', period) bareme = simulation.legislation_at(period.start).tns benefice = compute_benefice_auto_entrepreneur_micro_entreprise(bareme, tns_micro_entreprise_type_activite, tns_micro_entreprise_chiffre_affaires) return period, benefice @reference_formula class tns_auto_entrepreneur_revenus_net(SimpleFormulaColumn) : column = FloatCol label = u"Revenu d'un auto-entrepreneur" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') tns_auto_entrepreneur_benefice = simulation.calculate('tns_auto_entrepreneur_benefice', period) tns_auto_entrepreneur_type_activite = simulation.calculate('tns_auto_entrepreneur_type_activite', period) tns_auto_entrepreneur_chiffre_affaires = simulation.calculate('tns_auto_entrepreneur_chiffre_affaires', period) bareme_cs_ae = simulation.legislation_at(period.start).tns.auto_entrepreneur taux_cotisations_sociales_sur_CA = ( (tns_auto_entrepreneur_type_activite == 0) * bareme_cs_ae.achat_revente + (tns_auto_entrepreneur_type_activite == 1) * bareme_cs_ae.bic + (tns_auto_entrepreneur_type_activite == 2) * bareme_cs_ae.bnc) tns_auto_entrepreneur_charges_sociales = taux_cotisations_sociales_sur_CA * tns_auto_entrepreneur_chiffre_affaires revenus = tns_auto_entrepreneur_benefice - tns_auto_entrepreneur_charges_sociales return period, revenus @reference_formula class tns_micro_entreprise_revenus_net(SimpleFormulaColumn) : column = FloatCol label = u"Revenu d'un TNS dans une micro-entreprise" entity_class = Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') tns_micro_entreprise_benefice = simulation.calculate('tns_micro_entreprise_benefice', period) taux_cotisations_sociales = simulation.legislation_at(period.start).tns.micro_entreprise.cotisations_sociales tns_micro_entreprise_charges_sociales = tns_micro_entreprise_benefice * taux_cotisations_sociales revenus = tns_micro_entreprise_benefice - tns_micro_entreprise_charges_sociales return period, revenus @reference_formula class tns_total_revenus_net(DatedFormulaColumn): column = FloatCol label = u"Total des revenus non salariés" entity_class = Individus # start = "2008-01-01" @dated_function(date(2008, 1, 1)) def function_2008__(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') tns_auto_entrepreneur_revenus_net = simulation.calculate('tns_auto_entrepreneur_revenus_net', period) tns_micro_entreprise_revenus_net = simulation.calculate('tns_micro_entreprise_revenus_net', period) tns_autres_revenus = simulation.calculate('tns_autres_revenus', period) total_revenus = tns_autres_revenus + tns_auto_entrepreneur_revenus_net + tns_micro_entreprise_revenus_net return period, total_revenus PKF7openfisca_france/model/revenus/remplacement/__init__.pyPKF{9117openfisca_france/model/revenus/remplacement/retraite.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from ...base import * # noqa analysis:ignore build_column('rsti', IntCol(label = u"Pensions, retraites, rentes connues imposables", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"1AS", QUIFOY['conj']: u"1BS", QUIFOY['pac1']: u"1CS", QUIFOY['pac2']: u"1DS", QUIFOY['pac3']: u"1ES", })) # (f1as, f1bs, f1cs, f1ds, f1es) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Retraite brute", name = 'rstbrut', ) # L'AER est remplacée depuis le 1er juillet 2011 par l'allocation transitoire de solidarité (ATS). build_column('aer', IntCol(label = u"Allocation équivalent retraite (AER)")) build_column('retraite_combattant', FloatCol(entity = 'ind', label = u"Retraite du combattant")) PK'GvWopenfisca_france/model/revenus/remplacement/indemnites_journalieres_securite_sociale.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from ...base import * # noqa analysis:ignore build_column('indemnites_journalieres_maternite', FloatCol(entity = 'ind', label = u"Indemnités journalières de maternité")) build_column('indemnites_journalieres_paternite', FloatCol(entity = 'ind', label = u"Indemnités journalières de paternité")) build_column('indemnites_journalieres_adoption', FloatCol(entity = 'ind', label = u"Indemnités journalières d'adoption")) build_column('indemnites_journalieres_maladie', FloatCol(entity = 'ind', label = u"Indemnités journalières de maladie")) build_column('indemnites_journalieres_accident_travail', FloatCol(entity = 'ind', label = u"Indemnités journalières d'accident du travail")) build_column('indemnites_journalieres_maladie_professionnelle', FloatCol(entity = 'ind', label = u"Indemnités journalières de maladie professionnelle")) @reference_formula class indemnites_journalieres(SimpleFormulaColumn): column = FloatCol label = u"Total des indemnités journalières" entity_class = Individus def function(self, simulation, period): indemnites_journalieres_maternite = simulation.calculate('indemnites_journalieres_maternite', period) indemnites_journalieres_paternite = simulation.calculate('indemnites_journalieres_paternite', period) indemnites_journalieres_adoption = simulation.calculate('indemnites_journalieres_adoption', period) indemnites_journalieres_maladie = simulation.calculate('indemnites_journalieres_maladie', period) indemnites_journalieres_accident_travail = simulation.calculate('indemnites_journalieres_accident_travail', period) indemnites_journalieres_maladie_professionnelle = simulation.calculate('indemnites_journalieres_accident_travail', period) result = indemnites_journalieres_maternite + indemnites_journalieres_paternite + indemnites_journalieres_adoption + indemnites_journalieres_maladie + indemnites_journalieres_accident_travail + indemnites_journalieres_maladie_professionnelle return period, result @reference_formula class indemnites_journalieres_imposables(SimpleFormulaColumn): column = FloatCol label = u"Total des indemnités journalières imposables" entity_class = Individus url = "http://vosdroits.service-public.fr/particuliers/F3152.xhtml" def function(self, simulation, period): indemnites_journalieres = simulation.calculate('indemnites_journalieres', period) indemnites_journalieres_accident_travail = simulation.calculate('indemnites_journalieres_accident_travail', period) indemnites_journalieres_maladie_professionnelle = simulation.calculate('indemnites_journalieres_accident_travail', period) result = indemnites_journalieres - 0.5 * ( indemnites_journalieres_accident_travail + indemnites_journalieres_maladie_professionnelle ) return period, result PK"G|*6openfisca_france/model/revenus/remplacement/chomage.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from ...base import * # noqa analysis:ignore build_column('cho_ld', BoolCol(label = u"Demandeur d'emploi inscrit depuis plus d'un an", cerfa_field = {QUIFOY['vous']: u"1AI", QUIFOY['conj']: u"1BI", QUIFOY['pac1']: u"1CI", QUIFOY['pac2']: u"1DI", QUIFOY['pac3']: u"1EI", })) # Pour toutes les variables de ce type, les pac3 ne sont plus proposés après 2007 build_column('choi', IntCol(label = u"Autres revenus imposables (chômage, préretraite)", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"1AP", QUIFOY['conj']: u"1BP", QUIFOY['pac1']: u"1CP", QUIFOY['pac2']: u"1DP", QUIFOY['pac3']: u"1EP", })) # (f1ap, f1bp, f1cp, f1dp, f1ep) reference_input_variable( column = FloatCol(), entity_class = Individus, label = u"Chômage brut", name = 'chobrut', ) build_column('indemnites_chomage_partiel', FloatCol(entity = 'ind', label = u"Indemnités de chômage partiel")) PKF2openfisca_france/model/revenus/capital/__init__.pyPKF| | 3openfisca_france/model/revenus/capital/financier.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from ...base import * # noqa # RVCM # revenus au prélèvement libératoire build_column('f2da', IntCol(label = u"Revenus des actions et parts soumis au prélèvement libératoire de 21 %", entity = 'foy', val_type = "monetary", cerfa_field = u'2DA', start = date(2008, 1, 1), end = date(2012, 12, 31))) # à vérifier sur la nouvelle déclaration des revenus 2013 build_column('f2dh', IntCol(label = u"Produits d’assurance-vie et de capitalisation soumis au prélèvement libératoire de 7.5 %", entity = 'foy', val_type = "monetary", cerfa_field = u'2DH')) build_column('f2ee', IntCol(label = u"Autres produits de placement soumis aux prélèvements libératoires", entity = 'foy', val_type = "monetary", cerfa_field = u'2EE')) # revenus des valeurs et capitaux mobiliers ouvrant droit à abattement build_column('f2dc', IntCol(entity = 'foy', label = u"Revenus des actions et parts donnant droit à abattement", val_type = "monetary", cerfa_field = u'2DC')) build_column('f2fu', IntCol(entity = 'foy', label = u"Revenus imposables des titres non côtés détenus dans le PEA et distributions perçues via votre entreprise donnant droit à abattement", val_type = "monetary", cerfa_field = u'2FU')) build_column('f2ch', IntCol(entity = 'foy', label = u"Produits des contrats d'assurance-vie et de capitalisation d'une durée d'au moins 6 ou 8 ans donnant droit à abattement", val_type = "monetary", cerfa_field = u'2CH')) # Revenus des valeurs et capitaux mobiliers n'ouvrant pas droit à abattement build_column('f2ts', IntCol(entity = 'foy', label = u"Revenus de valeurs mobilières, produits des contrats d'assurance-vie d'une durée inférieure à 8 ans et distributions (n'ouvrant pas droit à abattement)", val_type = "monetary", cerfa_field = u'2TS')) build_column('f2go', IntCol(entity = 'foy', label = u"Autres revenus distribués et revenus des structures soumises hors de France à un régime fiscal privilégié (n'ouvrant pas droit à abattement)", val_type = "monetary", cerfa_field = u'2GO')) build_column('f2tr', IntCol(entity = 'foy', label = u"Produits de placements à revenu fixe, intérêts et autres revenus assimilés (n'ouvrant pas droit à abattement)", val_type = "monetary", cerfa_field = u'2TR')) # Autres revenus des valeurs et capitaux mobiliers build_column('f2cg', IntCol(entity = 'foy', label = u"Revenus des lignes 2DC, 2CH, 2TS, 2TR déjà soumis au prélèvement sociaux sans CSG déductible", val_type = "monetary", cerfa_field = u'2CG')) build_column('f2bh', IntCol(entity = 'foy', label = u"Revenus des lignes 2DC, 2CH, 2TS, 2TR déjà soumis au prélèvement sociaux avec CSG déductible", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'2BH')) build_column('f2ca', IntCol(entity = 'foy', label = u"Frais et charges déductibles", val_type = "monetary", cerfa_field = u'2CA')) build_column('f2ck', IntCol(entity = 'foy', label = u"Crédit d'impôt égal au prélèvement forfaitaire déjà versé", val_type = "monetary", cerfa_field = u'2CK', start = date(2013, 1, 1))) # TODO: nouvelle case à créer où c'est nécessaire, vérifier sur la déclaration des revenus 2013 build_column('f2ab', IntCol(entity = 'foy', label = u"Crédits d'impôt sur valeurs étrangères", val_type = "monetary", cerfa_field = u'2AB')) build_column('f2bg', IntCol(entity = 'foy', label = u"Crédits d'impôt 'directive épargne' et autres crédits d'impôt restituables", val_type = "monetary", cerfa_field = u'2BG')) build_column('f2aa', IntCol(entity = 'foy', label = u"Déficits des années antérieures non encore déduits", val_type = "monetary", start = date(2007, 1, 1), cerfa_field = u'2AA')) build_column('f2al', IntCol(entity = 'foy', label = u"Déficits des années antérieures non encore déduits", val_type = "monetary", start = date(2008, 1, 1), cerfa_field = u'2AL')) build_column('f2am', IntCol(entity = 'foy', label = u"Déficits des années antérieures non encore déduits", val_type = "monetary", start = date(2009, 1, 1), cerfa_field = u'2AM')) build_column('f2an', IntCol(entity = 'foy', label = u"Déficits des années antérieures non encore déduits", val_type = "monetary", cerfa_field = u'2AN', start = date(2010, 1, 1))) build_column('f2aq', IntCol(entity = 'foy', label = u"Déficits des années antérieures non encore déduits", val_type = "monetary", cerfa_field = u'2AQ', start = date(2011, 1, 1))) build_column('f2ar', IntCol(entity = 'foy', label = u"Déficits des années antérieures non encore déduits", val_type = "monetary", cerfa_field = u'2AR', start = date(2012, 1, 1))) # je ne sais pas d'ou sort f2as...! probablement une ancienne année à laquelle je ne suis pas encore arrivé # build_column('f2as', IntCol(entity = 'foy', label = u"Déficits des années antérieures non encore déduits: année 2012", val_type = "monetary", end = date(2011, 12, 31))) # TODO: vérifier existence <=2011 build_column('f2dm', IntCol(entity = 'foy', label = u"Impatriés: revenus de capitaux mobiliers perçus à l'étranger, abattement de 50 %", val_type = "monetary", cerfa_field = u'2DM', start = date(2008, 1, 1))) # TODO: nouvelle case à utiliser où c'est nécessaire # TODO: vérifier existence avant 2012 build_column('f2gr', IntCol(entity = 'foy', label = u"Revenus distribués dans le PEA (pour le calcul du crédit d'impôt de 50 %)", val_type = "monetary", cerfa_field = u'2GR', start = date(2005, 1, 1), end = date(2009, 12, 31))) # TODO: vérifier existence à partir de 2011 # Utilisés par mes aides. TODO: à consolider reference_input_variable(base_function = requested_period_last_value, column = FloatCol, entity_class = Individus, label = u"Épargne non rémunérée", name = 'epargne_non_remuneree') reference_input_variable(base_function = requested_period_last_value, column = FloatCol, entity_class = Individus, label = u"Intérêts versés pour l'épargne sur livret", name = 'interets_epargne_sur_livrets') reference_input_variable(column = FloatCol, entity_class = Individus, label = u"Revenus du capital", name = 'revenus_capital') PKFY1openfisca_france/model/revenus/capital/foncier.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from ...base import * # noqa # Rentes viagères build_column('f1aw', IntCol(label = u"Rentes viagères à titre onéreux perçues par le foyer par âge d'entrée en jouissance : Moins de 50 ans", entity = 'foy', val_type = "monetary", cerfa_field = u'1AW')) build_column('f1bw', IntCol(label = u"Rentes viagères à titre onéreux perçues par le foyer par âge d'entrée en jouissance : De 50 à 59 ans", entity = 'foy', val_type = "monetary", cerfa_field = u'1BW')) build_column('f1cw', IntCol(label = u"Rentes viagères à titre onéreux perçues par le foyer par âge d'entrée en jouissance : De 60 à 69 ans", entity = 'foy', val_type = "monetary", cerfa_field = u'1CW')) build_column('f1dw', IntCol(label = u"Rentes viagères à titre onéreux perçues par le foyer par âge d'entrée en jouissance : A partir de 70 ans", entity = 'foy', val_type = "monetary", cerfa_field = u'1DW')) # Revenus fonciers build_column('f4ba', IntCol(entity = 'foy', label = u"Revenus fonciers imposables", val_type = "monetary", cerfa_field = u'4BA')) build_column('f4bb', IntCol(entity = 'foy', label = u"Déficit imputable sur les revenus fonciers", val_type = "monetary", cerfa_field = u'4BB')) build_column('f4bc', IntCol(entity = 'foy', label = u"Déficit imputable sur le revenu global", val_type = "monetary", cerfa_field = u'4BC')) build_column('f4bd', IntCol(entity = 'foy', label = u"Déficits antérieurs non encore imputés", val_type = "monetary", cerfa_field = u'4BD')) build_column('f4be', IntCol(entity = 'foy', label = u"Micro foncier: recettes brutes sans abattement", val_type = "monetary", cerfa_field = u'4BE')) # Prime d'assurance loyers impayés build_column('f4bf', IntCol(entity = 'foy', label = u"Primes d'assurance pour loyers impayés des locations conventionnées", val_type = "monetary", cerfa_field = u'4BF')) build_column('f4bl', IntCol(entity = 'foy', label = u"", end = date(2009, 12, 31))) # TODO: cf 2010 2011 # Variables utilisées par mes aides TODO: consolider reference_input_variable(column = FloatCol, entity_class = Individus, label = u"Revenus locatifs", name = 'revenus_locatifs') reference_input_variable(base_function = requested_period_last_value, column = FloatCol, entity_class = Individus, label = u"Valeur locative des biens immobiliers possédés et non loués", name = 'valeur_locative_immo_non_loue') reference_input_variable(base_function = requested_period_last_value, column = FloatCol, entity_class = Individus, label = u"Valeur locative des terrains possédés et non loués", name = 'valeur_locative_terrains_non_loue') PK'Goiē%%4openfisca_france/model/revenus/capital/plus_value.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from ...base import * # noqa analysis:ignore # Gain de levée d'options # Bouvard: j'ai changé là mais pas dans le code, il faut chercher les f1uv # et les mettre en f1tvm comme pour salaire_imposable # Il faut aussi le faire en amont dans les tables # là je ne comprends pas pourquoi il faut changer les f1uv en f1tvm.... # du coups je n'ai pas changé et j'ai fait un dico comme pour salaire_imposable build_column('f1tv', IntCol(label = u"Gains de levée d'options sur titres en cas de cession ou de conversion au porteur dans le délai d'indisponibilité: entre 1 et 2 ans", entity = 'ind', val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"1TV", QUIFOY['conj']: u"1UV", })) # (f1tv,f1uv)) build_column('f1tw', IntCol(label = u"Gains de levée d'options sur titres en cas de cession ou de conversion au porteur dans le délai d'indisponibilité: entre 2 et 3 ans", entity = 'ind', val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"1TW", QUIFOY['conj']: u"1UW", })) # (f1tw,f1uw)) build_column('f1tx', IntCol(label = u"Gains de levée d'options sur titres en cas de cession ou de conversion au porteur dans le délai d'indisponibilité: entre 3 et 4 ans", entity = 'ind', val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"1TX", QUIFOY['conj']: u"1UX", })) # (f1tx,f1ux)) build_column('f3si', IntCol(entity = 'foy', start = date(2012, 1, 1))) # TODO: parmi ces cas créer des valeurs individuelles # # correspond à autre chose en 2009, vérifier 2011,2010 build_column('f3sa', IntCol(entity = 'foy', end = date(2009, 12, 31))) # TODO: n'existe pas en 2013 et 2012 vérifier 2011 et 2010 build_column('f3sf', IntCol(entity = 'foy', start = date(2012, 1, 1))) # TODO: déjà définit plus haut, vérifier si 2009, 2010, 2011 correspondent à la même chose que 12 et 13 build_column('f3sd', IntCol(entity = 'foy', start = date(2012, 1, 1))) # TODO: déjà définit plus haut, vérifier si 2009, 2010, 2011 correspondent à la même chose que 12 et 13 build_column('f3vc', IntCol(entity = 'foy', label = u"Produits et plus-values exonérés provenant de structure de capital-risque", val_type = "monetary", start = date(2006, 1, 1), cerfa_field = u'3VC')) build_column('f3vd', IntCol(entity = 'ind', label = u"Gains de levée d'options sur titres et gains d'acquisition d'actions taxables à 18 %", val_type = "monetary", start = date(2008, 1, 1), cerfa_field = {QUIFOY['vous']: u"3VD", QUIFOY['conj']: u"3SD", })) # (f3vd, f3sd) build_column('f3ve', IntCol(entity = 'foy', label = u"Plus-values réalisées par les non-résidents pour lesquelles vous demandez le remboursement de l'excédent du prélèvement de 45 %", val_type = "monetary", cerfa_field = u'3VE')) # """ # réutilisation case 3VE en 2013 # build_column('f3ve', IntCol(entity = 'foy', # label = u"Plus-values de cession de droits sociaux réalisées par des personnes domiciliées dans les DOM", # val_type = "monetary", # cerfa_field = u'3VE', # end =date.datetime (2012, 12, 31))) # """ build_column('f3vf', IntCol(entity = 'ind', label = u"Gains de levée d'options sur titres et gains d'acquisition d'actions taxables à 41 %", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"3VF", QUIFOY['conj']: u"3SF", })) # (f3vf, f3sf) # comment gérer les cases qui ont le même nom mais qui ne correspondent pas tout à fait à la même chose ? # peut-ont garder le même nom et l'encadrer par des start-end ? ou avec un truc genre if sur l'année ?(pour ne pas avoir à changer le nom de la variable) # si on garde le même nom avec des start-end, et si on intégre la variable partout où elle doit être (dans les différents calculs), est-on sûr que lors des calculs les start-end seront bien pris en compte ? # ça rendra le modéle un peu moins clair parce qu'il y aura le même nom de variable pour des choses différentes et dans des calculs ne se rapportant pas aux mêmes choses, # mais si les start-end fonctionne ça ne devrait pas avoir d'impact sur les calculs ? qu'en penses-tu ? # ## build_column('f3vl', IntCol(entity = 'foy', # ## label = u"Distributions par des sociétés de capital-risque taxables à 24 %", # ## val_type = "monetary", # ## cerfa_field = u'3VL' # ## start = date(2009, 1, 1), # ## end = date(2009, 12, 31)))#vérifier avant 2009 build_column('f3vl', IntCol(entity = 'foy', label = u"Distributions par des sociétés de capital-risque taxables à 19 %", val_type = "monetary", cerfa_field = u'3VL')) # vérifier pour 2011 et 2010 build_column('f3vi', IntCol(entity = 'ind', label = u"Gains de levée d'options sur titres et gains d'acquisition d'actions taxables à 30 %", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"3VI", QUIFOY['conj']: u"3SI", })) # (f3vi, f3si ) build_column('f3vm', IntCol(entity = 'foy', label = u"Clôture du PEA avant l'expiration de la 2e année: gains taxables à 22.5 %", val_type = "monetary", cerfa_field = u'3VM')) build_column('f3vt', IntCol(entity = 'foy', label = u"Clôture du PEA entre la 2e et la 5e année: gains taxables à 19 %", val_type = "monetary", start = date(2010, 1, 1), cerfa_field = u'3VT')) build_column('f3vj', IntCol(entity = 'ind', label = u"Gains imposables sur option dans la catégorie des salaires", val_type = "monetary", cerfa_field = {QUIFOY['vous']: u"3VJ", QUIFOY['conj']: u"3VK", })) # (f3vj, f3vk ) build_column('f3va', IntCol(entity = 'ind', label = u"Abattement pour durée de détention des titres en cas de départ à la retraite d'un dirigeant appliqué sur des plus-values", val_type = "monetary", start = date(2006, 1, 1), cerfa_field = {QUIFOY['vous']: u"3VA", QUIFOY['conj']: u"3VB", })) # (f3va, f3vb ))) # Plus values et gains taxables à des taux forfaitaires build_column('f3vg', IntCol(entity = 'foy', label = u"Plus-value imposable sur gains de cession de valeurs mobilières, de droits sociaux et gains assimilés", val_type = "monetary", cerfa_field = u'3VG')) build_column('f3vh', IntCol(entity = 'foy', label = u"Perte de l'année de perception des revenus", val_type = "monetary", cerfa_field = u'3VH')) build_column('f3vu', IntCol(entity = 'foy', end = date(2009, 12, 31))) # TODO: vérifier pour 2010 et 2011 build_column('f3vv', IntCol(entity = 'foy', label = u"Plus-values réalisées par les non-résidents: montant du prélèvement de 45 % déjà versé", val_type = "monetary", start = date(2013, 1, 1), cerfa_field = u'3VV')) # TODO: à revoir :ok pour 2013, pas de 3vv pour 2012, et correspond à autre chose en 2009, vérifier 2010 et 2011 build_column('f3vv_end_2010', IntCol(entity = 'foy', start = date(2010, 1, 1), end = date(2010, 12, 31), label = u"Pertes ouvrant droit au crédit d’impôt de 19 % ", val_type = "monetary", cerfa_field = u'3VV')) build_column('f3vz', IntCol(entity = 'foy', label = u"Plus-values imposables sur cessions d’immeubles ou de biens meubles", val_type = "monetary", cerfa_field = u'3VZ', start = date(2011, 1, 1))) # TODO: vérifier avant 2012 PKxIE"openfisca_france/param/__init__.pyPKYcE$openfisca_france/reforms/__init__.pyPK'G0RR=openfisca_france/reforms/allocations_familiales_imposables.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import maximum as max_ from openfisca_core import columns, formulas, reforms from .. import entities from ..model.base import QUIFOY from ..model.prelevements_obligatoires.impot_revenu import ir def build_reform(tax_benefit_system): Reform = reforms.make_reform( key = 'allocations_familiales_imposables', name = u'Allocations familiales imposables', reference = tax_benefit_system, ) @Reform.formula class rbg(formulas.SimpleFormulaColumn): label = u"Nouveau revenu brut global intégrant les allocations familiales" reference = ir.rbg def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') allocations_familiales_imposables = simulation.calculate_add('allocations_familiales_imposables', period) deficit_ante = simulation.calculate('deficit_ante', period) f6gh = simulation.calculate('f6gh', period) nacc_pvce_holder = simulation.calculate('nacc_pvce', period) nbic_impm_holder = simulation.calculate('nbic_impm', period) rev_cat = simulation.calculate('rev_cat', period) cga = simulation.legislation_at(period.start).ir.rpns.cga_taux2 nacc_pvce = self.sum_by_entity(nacc_pvce_holder) return period, max_( 0, allocations_familiales_imposables + rev_cat + f6gh + (self.sum_by_entity(nbic_impm_holder) + nacc_pvce) * (1 + cga) - deficit_ante ) @Reform.formula class rfr(formulas.SimpleFormulaColumn): label = u"Nouveau revenu fiscal de référence intégrant les allocations familiales" reference = ir.rfr def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') allocations_familiales_imposables = simulation.calculate('allocations_familiales_imposables') f3va_holder = simulation.calculate('f3va') f3vi_holder = simulation.calculate('f3vi') f3vz = simulation.calculate('f3vz') rfr_cd = simulation.calculate('rfr_cd') rfr_rvcm = simulation.calculate('rfr_rvcm') rni = simulation.calculate('rni') rpns_exon_holder = simulation.calculate('rpns_exon') rpns_pvce_holder = simulation.calculate('rpns_pvce') rev_cap_lib = simulation.calculate_add('rev_cap_lib') microentreprise = simulation.calculate('microentreprise') f3va = self.sum_by_entity(f3va_holder) f3vi = self.sum_by_entity(f3vi_holder) rpns_exon = self.sum_by_entity(rpns_exon_holder) rpns_pvce = self.sum_by_entity(rpns_pvce_holder) return period, ( max_(0, rni - allocations_familiales_imposables) + rfr_cd + rfr_rvcm + rev_cap_lib + f3vi + rpns_exon + rpns_pvce + f3va + f3vz + microentreprise ) @Reform.formula class allocations_familiales_imposables(formulas.SimpleFormulaColumn): column = columns.FloatCol entity_class = entities.FoyersFiscaux label = u"Allocations familiales imposables" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') af_holder = simulation.calculate_add('af') imposition = simulation.legislation_at(period.start).allocations_familiales_imposables.imposition af = self.cast_from_entity_to_role(af_holder, entity= "famille", role = QUIFOY['vous']) af = self.sum_by_entity(af) return period, af * imposition reform = Reform() reform.modify_legislation_json(modifier_function = modify_legislation_json) return reform def modify_legislation_json(reference_legislation_json_copy): reform_legislation_subtree = { "@type": "Node", "description": "Intégration au revenu imposable des allocations familiales", "children": { "imposition": { "@type": "Parameter", "description": "Indicatrice d'imposition", "format": "boolean", "values": [{'start': u'2000-01-01', 'stop': u'2014-12-31', 'value': True}], }, }, } reference_legislation_json_copy['children']['allocations_familiales_imposables'] = reform_legislation_subtree return reference_legislation_json_copy PK'GK6666-openfisca_france/reforms/inversion_revenus.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division # import logging from openfisca_core import columns, formulas, reforms # from openfisca_core.taxscales import MarginalRateTaxScale from scipy.optimize import fsolve from .. import entities # log = logging.getLogger(__name__) def brut_to_target(target_name = None, period = None, simulation = None, **input_array_by_name): simulation = simulation.clone(debug = simulation.debug, debug_all = simulation.debug_all, trace = simulation.trace) simulation.get_or_new_holder(target_name).delete_arrays() for variable_name, array in input_array_by_name.iteritems(): simulation.get_or_new_holder(variable_name).set_array(period, array) return simulation.calculate_add(target_name) def build_reform(tax_benefit_system): Reform = reforms.make_reform( key = 'inversion_revenus', name = u'Inversion des revenus', reference = tax_benefit_system, ) Reform.input_variable( column = columns.FloatCol, entity_class = entities.Individus, label = u'Salaire imposable utilisé pour remonter au salaire brut', name = 'salaire_imposable_pour_inversion', ) @Reform.formula class salaire_de_base(formulas.SimpleFormulaColumn): column = columns.FloatCol entity_class = entities.Individus label = u"Salaire brut ou traitement indiciaire brut" reference = tax_benefit_system.column_by_name["salaire_de_base"] url = u"http://www.trader-finance.fr/lexique-finance/definition-lettre-S/Salaire-brut.html" def function(self, simulation, period): """Calcule le salaire brut à partir du salaire imposable ou sinon du salaire net. Sauf pour les fonctionnaires où il renvoie le traitement indiciaire brut Note : le supplément familial de traitement est imposable. """ # period = period.start.offset('first-of', 'month').period('month') # Get value for year and divide below. salaire_imposable_pour_inversion = simulation.get_array('salaire_imposable_pour_inversion', period.start.offset('first-of', 'year').period('year')) if salaire_imposable_pour_inversion is None: salaire_net = simulation.get_array('salaire_net', period) if salaire_net is not None: # Calcule le salaire brut à partir du salaire net par inversion numérique. if (salaire_net == 0).all(): # Quick path to avoid fsolve when using default value of input variables. return period, salaire_net simulation = self.holder.entity.simulation def solve_function(salaire_de_base): return brut_to_target( target_name = 'salaire_net', period = period, salaire_de_base = salaire_de_base, simulation = simulation, ) - salaire_net return period, fsolve(solve_function, salaire_net) salaire_imposable_pour_inversion = simulation.calculate_add_divide('salaire_imposable_pour_inversion', period) # Calcule le salaire brut à partir du salaire imposable par inversion numérique. if (salaire_imposable_pour_inversion == 0).all(): # Quick path to avoid fsolve when using default value of input variables. return period, salaire_imposable_pour_inversion simulation = self.holder.entity.simulation def solve_function(salaire_de_base): return brut_to_target( target_name = 'salaire_imposable', period = period, salaire_de_base = salaire_de_base, simulation = simulation, ) - salaire_imposable_pour_inversion return period, fsolve(solve_function, salaire_imposable_pour_inversion) # TODO: inclure un taux de prime et calculer les primes en même temps que salaire_de_base # # Calcule le salaire brut à partir du salaire imposable. # # Sauf pour les fonctionnaires où il renvoie le traitement indiciaire brut # # Note : le supplément familial de traitement est imposable. # # hsup = simulation.calculate('hsup', period) # type_sal = simulation.calculate('type_sal', period) # P = simulation.legislation_at(period.start) # # plafond_securite_sociale = P.cotsoc.gen.plafond_securite_sociale # # salarie = P.cotsoc.sal.scale_tax_scales(plafond_securite_sociale) # csg = P.csg.scale_tax_scales(plafond_securite_sociale) # # salarie['noncadre'].update(salarie['commun']) # salarie['cadre'].update(salarie['commun']) # # # log.info( # # "Le dictionnaire des barèmes des cotisations salariés des titulaires de l'Etat contient : \n %s", # # salarie['fonc']["etat"], # # ) # # # Salariés du privé # # noncadre = salarie['noncadre'].combine_tax_scales() # cadre = salarie['cadre'].combine_tax_scales() # # # On ajoute la CSG deductible # noncadre.add_tax_scale(csg['activite']['deductible']) # cadre.add_tax_scale(csg['activite']['deductible']) # # nca = noncadre.inverse() # cad = cadre.inverse() # brut_nca = nca.calc(salaire_imposable_pour_inversion) # brut_cad = cad.calc(salaire_imposable_pour_inversion) # salbrut = brut_nca * (type_sal == CAT['prive_non_cadre']) # salbrut += brut_cad * (type_sal == CAT['prive_cadre']) # # # public etat # # TODO: modifier la contribution exceptionelle de solidarité # # en fixant son seuil de non imposition dans le barème (à corriger dans param.xml # # et en tenant compte des éléments de l'assiette # salarie['fonc']['etat']['excep_solidarite'] = salarie['fonc']['commun']['solidarite'] # # public_etat = salarie['fonc']['etat']['pension'] # # public_colloc = salarie['fonc']["colloc"].combine_tax_scales() TODO # # # Pour a fonction publique la csg est calculée sur l'ensemble salbrut(=TIB) + primes # # Imposable = TIB - csg( (1+taux_prime)*TIB ) - pension(TIB) + taux_prime*TIB # bareme_csg_titulaire_etat = csg['act']['deduc'].multiply_rates(1 + TAUX_DE_PRIME, inplace = False, # new_name = "csg deduc titutaire etat") # public_etat.add_tax_scale(bareme_csg_titulaire_etat) # bareme_prime = MarginalRateTaxScale(name = "taux de prime") # bareme_prime.add_bracket(0, -TAUX_DE_PRIME) # barème équivalent à taux_prime*TIB # public_etat.add_tax_scale(bareme_prime) # # etat = public_etat.inverse() # # # TODO: complete this to deal with the fonctionnaire # # supp_familial_traitement = 0 # TODO: dépend de salbrut # # indemnite_residence = 0 # TODO: fix bug # # # print 'salaire_imposable_pour_inversion', salaire_imposable_pour_inversion # brut_etat = etat.calc(salaire_imposable_pour_inversion) # # print 'brut_etat', brut_etat # # print 'impot', public_etat.calc(brut_etat) # # print 'brut_etat', brut_etat # salbrut_etat = (brut_etat) # # TODO: fonctionnaire # # print 'salbrut_etat', salbrut_etat # salbrut += salbrut_etat * (type_sal == CAT['public_titulaire_etat']) # # # # # # return period, salbrut + hsup @Reform.formula class chobrut(formulas.SimpleFormulaColumn): column = columns.FloatCol entity_class = entities.Individus label = u"Allocations chômage brutes" url = u"http://vosdroits.service-public.fr/particuliers/N549.xhtml" def function(self, simulation, period): """"Calcule les allocations chômage brutes à partir des allocations imposables ou sinon des allocations nettes. """ # Get value for year and divide below. choi = simulation.get_array('choi', period.start.offset('first-of', 'year').period('year')) if choi is None: chonet = simulation.get_array('chonet', period) if chonet is not None: # Calcule les allocations chomage brutes à partir des allocations nettes par inversion numérique. if (chonet == 0).all(): # Quick path to avoid fsolve when using default value of input variables. return period, chonet simulation = self.holder.entity.simulation def solve_function(chobrut): return brut_to_target( chobrut = chobrut, target_name = 'chonet', period = period, simulation = simulation, ) - chonet return period, fsolve(solve_function, chonet) choi = simulation.calculate_add_divide('choi', period) # Calcule les allocations chômage brutes à partir des allocations imposables. # taux_csg_remplacement = simulation.calculate('taux_csg_remplacement', period) if (choi == 0).all(): # Quick path to avoid fsolve when using default value of input variables. return period, choi simulation = self.holder.entity.simulation def solve_function(chobrut): return brut_to_target( chobrut = chobrut, # taux_csg_remplacement = taux_csg_remplacement, target_name = 'cho', period = period, simulation = simulation, ) - choi return period, fsolve(solve_function, choi) @Reform.formula class rstbrut(formulas.SimpleFormulaColumn): column = columns.FloatCol entity_class = entities.Individus label = u"Pensions de retraite brutes" url = u"http://vosdroits.service-public.fr/particuliers/N20166.xhtml" def function(self, simulation, period): """"Calcule les pensions de retraite brutes à partir des pensions imposables ou sinon des pensions nettes. """ # period = period.start.offset('first-of', 'month').period('month') # Get value for year and divide below. rsti = simulation.get_array('rsti', period.start.offset('first-of', 'year').period('year')) if rsti is None: rstnet = simulation.get_array('rstnet', period) if rstnet is not None: # Calcule les pensions de retraite brutes à partir des pensions nettes par inversion numérique. if (rstnet == 0).all(): # Quick path to avoid fsolve when using default value of input variables. return period, rstnet simulation = self.holder.entity.simulation def solve_function(rstbrut): return brut_to_target( target_name = 'rstnet', period = period, rstbrut = rstbrut, simulation = simulation, ) - rstnet return period, fsolve(solve_function, rstnet) rsti = simulation.calculate_add_divide('rsti', period) # Calcule les pensions de retraite brutes à partir des pensions imposables. taux_csg_remplacement = simulation.calculate('taux_csg_remplacement', period) if (rsti == 0).all(): # Quick path to avoid fsolve when using default value of input variables. return period, rsti simulation = self.holder.entity.simulation def solve_function(rstbrut): return brut_to_target( rstbrut = rstbrut, taux_csg_remplacement = taux_csg_remplacement, target_name = 'rst', period = period, simulation = simulation, ) - rsti return period, fsolve(solve_function, rsti) return Reform() PK'G77#openfisca_france/reforms/plf2015.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # TODO switch to to average tax rates from __future__ import division from openfisca_core import formulas, periods, reforms from ..model.prelevements_obligatoires.impot_revenu import ir def build_reform(tax_benefit_system): Reform = reforms.make_reform( key = 'plf2015', name = u'Projet de Loi de Finances 2015', reference = tax_benefit_system, ) @Reform.formula class decote(formulas.SimpleFormulaColumn): label = u"Nouvelle décote 2015" reference = ir.decote def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') ir_plaf_qf = simulation.calculate('ir_plaf_qf', period) nb_adult = simulation.calculate('nb_adult', period) plf = simulation.legislation_at(period.start).plf2015 decote_celib = (ir_plaf_qf < plf.decote_seuil_celib) * (plf.decote_seuil_celib - ir_plaf_qf) decote_couple = (ir_plaf_qf < plf.decote_seuil_couple) * (plf.decote_seuil_couple - ir_plaf_qf) return period, (nb_adult == 1) * decote_celib + (nb_adult == 2) * decote_couple reform = Reform() reform.modify_legislation_json(modifier_function = modify_legislation_json) return reform def modify_legislation_json(reference_legislation_json_copy): reform_legislation_subtree = { "@type": "Node", "description": "PLF 2015", "children": { "decote_seuil_celib": { "@type": "Parameter", "description": "Seuil de la décôte pour un célibataire", "format": "integer", "unit": "currency", "values": [{'start': u'2013-01-01', 'stop': u'2014-12-31', 'value': 1135}], }, "decote_seuil_couple": { "@type": "Parameter", "description": "Seuil de la décôte pour un couple", "format": "integer", "unit": "currency", "values": [{'start': u'2013-01-01', 'stop': u'2014-12-31', 'value': 1870}], }, }, } reform_year = 2014 reform_period = periods.period('year', reform_year) # FIXME update_legislation is deprecated. reference_legislation_json_copy = reforms.update_legislation( legislation_json = reference_legislation_json_copy, path = ('children', 'ir', 'children', 'bareme', 'brackets', 1, 'rate'), period = reform_period, value = 0, ) # FIXME update_legislation is deprecated. reference_legislation_json_copy = reforms.update_legislation( legislation_json = reference_legislation_json_copy, path = ('children', 'ir', 'children', 'bareme', 'brackets', 2, 'threshold'), period = reform_period, value = 9690, ) reference_legislation_json_copy['children']['plf2015'] = reform_legislation_subtree return reference_legislation_json_copy PK'GPy??$openfisca_france/reforms/plfr2014.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from datetime import date from numpy import maximum as max_, minimum as min_ from openfisca_core import columns, formulas, reforms from .. import entities from ..model.base import dated_function from ..model.prelevements_obligatoires.impot_revenu import reductions_impot # TODO: les baisses de charges n'ont pas été codées car annulées (toute ou en partie ?) # par le Conseil constitutionnel def build_reform(tax_benefit_system): Reform = reforms.make_reform( key = u'plfr2014', name = u'Projet de Loi de Finances Rectificative 2014', reference = tax_benefit_system, ) @Reform.formula class reduction_impot_exceptionnelle(formulas.SimpleFormulaColumn): column = columns.FloatCol entity_class = entities.FoyersFiscaux label = u"Réduction d'impôt exceptionnelle" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') nb_adult = simulation.calculate('nb_adult') nb_par = simulation.calculate('nb_par') rfr = simulation.calculate('rfr') params = simulation.legislation_at(period.start).plfr2014.reduction_impot_exceptionnelle plafond = params.seuil * nb_adult + (nb_par - nb_adult) * 2 * params.majoration_seuil montant = params.montant_plafond * nb_adult return period, min_(max_(plafond + montant - rfr, 0), montant) @Reform.formula class reductions(formulas.DatedFormulaColumn): label = u"Somme des réductions d'impôt à intégrer pour l'année 2013" reference = reductions_impot.reductions @dated_function(start = date(2013, 1, 1), stop = date(2013, 12, 31)) def function_20130101_20131231(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') accult = simulation.calculate('accult') adhcga = simulation.calculate('adhcga') cappme = simulation.calculate('cappme') creaen = simulation.calculate('creaen') daepad = simulation.calculate('daepad') deffor = simulation.calculate('deffor') dfppce = simulation.calculate('dfppce') doment = simulation.calculate('doment') domlog = simulation.calculate('domlog') donapd = simulation.calculate('donapd') duflot = simulation.calculate('duflot') ecpess = simulation.calculate('ecpess') garext = simulation.calculate('garext') intagr = simulation.calculate('intagr') invfor = simulation.calculate('invfor') invlst = simulation.calculate('invlst') ip_net = simulation.calculate('ip_net') locmeu = simulation.calculate('locmeu') mecena = simulation.calculate('mecena') mohist = simulation.calculate('mohist') patnat = simulation.calculate('patnat') prcomp = simulation.calculate('prcomp') reduction_impot_exceptionnelle = simulation.calculate('reduction_impot_exceptionnelle') repsoc = simulation.calculate('repsoc') resimm = simulation.calculate('resimm') rsceha = simulation.calculate('rsceha') saldom = simulation.calculate('saldom') scelli = simulation.calculate('scelli') sofica = simulation.calculate('sofica') spfcpi = simulation.calculate('spfcpi') total_reductions = accult + adhcga + cappme + creaen + daepad + deffor + dfppce + doment + domlog + \ donapd + duflot + ecpess + garext + intagr + invfor + invlst + locmeu + mecena + mohist + patnat + \ prcomp + repsoc + resimm + rsceha + saldom + scelli + sofica + spfcpi + reduction_impot_exceptionnelle return period, min_(ip_net, total_reductions) reform = Reform() reform.modify_legislation_json(modifier_function = modify_legislation_json) return reform def modify_legislation_json(reference_legislation_json_copy): plfr2014_legislation_subtree = { "@type": "Node", "description": "Projet de loi de finance rectificative 2014", "children": { "reduction_impot_exceptionnelle": { "@type": "Node", "description": "Réduction d'impôt exceptionnelle", "children": { "montant_plafond": { "@type": "Parameter", "description": "Montant plafond par part pour les deux premières parts", "format": "integer", "unit": "currency", "values": [{'start': u'2013-01-01', 'stop': u'2014-12-31', 'value': 350}], }, "seuil": { "@type": "Parameter", "description": "Seuil (à partir duquel la réduction décroît) par part pour les deux " "premières parts", "format": "integer", "unit": "currency", "values": [{'start': u'2013-01-01', 'stop': u'2014-12-31', 'value': 13795}], }, "majoration_seuil": { "@type": "Parameter", "description": "Majoration du seuil par demi-part supplémentaire", "format": "integer", "unit": "currency", "values": [{'start': u'2013-01-01', 'stop': u'2014-12-31', 'value': 3536}], }, }, }, }, } plfrss2014_legislation_subtree = { "@type": "Node", "description": "Projet de loi de financement de la sécurité sociale rectificative 2014", "children": { "exonerations_bas_salaires": { "@type": "Node", "description": "Exonérations de cotisations salariées sur les bas salaires", "children": { "prive": { "@type": "Node", "description": "Salariés du secteur privé", "children": { "taux": { "@type": "Parameter", "description": "Taux", "format": "rate", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 0.03}], }, "seuil": { "@type": "Parameter", "description": "Seuil (en SMIC)", "format": "rate", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 1.3}], }, }, }, "public": { "@type": "Node", "description": "Salariés du secteur public", "children": { "taux_1": { "@type": "Parameter", "description": "Taux", "format": "rate", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 0.02}], }, "seuil_1": { "@type": "Parameter", "description": "Indice majoré plafond", "format": "integer", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 312}], }, "taux_2": { "@type": "Parameter", "description": "Taux", "format": "rate", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 0.018}], }, "seuil_2": { "@type": "Parameter", "description": "Indice majoré plafond", "format": "integer", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 328}], }, "taux_3": { "@type": "Parameter", "description": "Taux", "format": "rate", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 0.016}], }, "seuil_3": { "@type": "Parameter", "description": "Indice majoré plafond", "format": "integer", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 343}], }, "taux_4": { "@type": "Parameter", "description": "Taux", "format": "rate", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 0.014}], }, "seuil_4": { "@type": "Parameter", "description": "Indice majoré plafond", "format": "integer", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 359}], }, "taux_5": { "@type": "Parameter", "description": "Taux", "format": "rate", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 0.012}], }, "seuil_5": { "@type": "Parameter", "description": "Indice majoré plafond", "format": "integer", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 375}], }, "taux_6": { "@type": "Parameter", "description": "Taux", "format": "rate", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 0.01}], }, "seuil_6": { "@type": "Parameter", "description": "Indice majoré plafond", "format": "integer", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 390}], }, "taux_7": { "@type": "Parameter", "description": "Taux", "format": "rate", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 0.008}], }, "seuil_7": { "@type": "Parameter", "description": "Indice majoré plafond", "format": "integer", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 406}], }, "taux_8": { "@type": "Parameter", "description": "Taux", "format": "rate", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 0.007}], }, "seuil_8": { "@type": "Parameter", "description": "Indice majoré plafond", "format": "integer", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 421}], }, "taux_9": { "@type": "Parameter", "description": "Taux", "format": "rate", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 0.006}], }, "seuil_9": { "@type": "Parameter", "description": "Indice majoré plafond", "format": "integer", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 437}], }, "taux_10": { "@type": "Parameter", "description": "Taux", "format": "rate", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 0.005}], }, "seuil_10": { "@type": "Parameter", "description": "Indice majoré plafond", "format": "integer", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 453}], }, "taux_11": { "@type": "Parameter", "description": "Taux", "format": "rate", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 0.002}], }, "seuil_11": { "@type": "Parameter", "description": "Indice majoré plafond", "format": "integer", "values": [{'start': u'2014-01-01', 'stop': u'2014-12-31', 'value': 468}], }, }, }, }, }, }, } reference_legislation_json_copy['children']['plfr2014'] = plfr2014_legislation_subtree reference_legislation_json_copy['children']['plfrss2014'] = plfrss2014_legislation_subtree return reference_legislation_json_copy PK'G0*openfisca_france/reforms/trannoy_wasmer.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # TODO switch to to average tax rates from __future__ import division from numpy import logical_not as not_, minimum as min_ from openfisca_core import columns, formulas, reforms from .. import entities from ..model.base import PREF from ..model.prelevements_obligatoires.impot_revenu import charges_deductibles def build_reform(tax_benefit_system): Reform = reforms.make_reform( key = 'trannoy_wasmer', name = u'Loyer comme charge déductible (Trannoy-Wasmer)', reference = tax_benefit_system, ) @Reform.formula class charges_deduc(formulas.SimpleFormulaColumn): label = u"Charge déductibles intégrant la charge pour loyer (Trannoy-Wasmer)" reference = charges_deductibles.charges_deduc def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') cd1 = simulation.calculate('cd1', period) cd2 = simulation.calculate('cd2', period) charge_loyer = simulation.calculate('charge_loyer', period) return period, cd1 + cd2 + charge_loyer @Reform.formula class charge_loyer(formulas.SimpleFormulaColumn): column = columns.FloatCol entity_class = entities.FoyersFiscaux label = u"Charge déductible pour paiement d'un loyer" def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') loyer_holder = simulation.calculate('loyer', period) nbptr = simulation.calculate('nbptr', period) loyer = self.cast_from_entity_to_role(loyer_holder, entity = "menage", role = PREF) loyer = self.sum_by_entity(loyer) charge_loyer = simulation.legislation_at(period.start).charge_loyer plaf = charge_loyer.plaf plaf_nbp = charge_loyer.plaf_nbp plafond = plaf * (not_(plaf_nbp) + plaf * nbptr * plaf_nbp) return period, 12 * min_(loyer / 12, plafond) reform = Reform() reform.modify_legislation_json(modifier_function = modify_legislation_json) return reform def modify_legislation_json(reference_legislation_json_copy): reform_legislation_subtree = { "@type": "Node", "description": "Charge de loyer", "children": { "active": { "@type": "Parameter", "description": u"Activation de la charge", "format": "boolean", "values": [{'start': u'2002-01-01', 'stop': '2013-12-31', 'value': 1}], }, "plaf": { "@type": "Parameter", "description": u'Plafond mensuel', "format": 'integer', "unit": 'currency', "values": [{'start': '2002-01-01', 'stop': '2013-12-31', 'value': 1000}], }, "plaf_nbp": { "@type": "Parameter", "description": u'Ajuster le plafond au nombre de part', "format": 'boolean', "values": [{'start': '2002-01-01', 'stop': '2013-12-31', 'value': 0}], }, }, } reference_legislation_json_copy['children']['charge_loyer'] = reform_legislation_subtree return reference_legislation_json_copy PK'GQ@@!openfisca_france/reforms/paris.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public Licensegk # along with this program. If not, see . from __future__ import division from openfisca_core import columns, formulas, reforms from numpy import absolute as abs_, minimum as min_, maximum as max_ from .. import entities def build_reform(tax_benefit_system): Reform = reforms.make_reform( key = 'aides_ville_paris', name = u'Aides de la ville de Paris', reference = tax_benefit_system, ) Reform.input_variable( column = columns.BoolCol, entity_class = entities.Menages, name ='parisien', label = u"Résidant à Paris au moins 3 ans dans les 5 dernières années", ) Reform.input_variable( name ='a_charge_fiscale', column = columns.BoolCol, entity_class = entities.Individus, label = u"Enfant à charge fiscale du demandeur", ) Reform.input_variable( name ='enfant_place', column = columns.BoolCol, entity_class = entities.Individus, label = u"Enfant placé en structure spécialisée ou famille d'accueil", ) @Reform.formula class paris_logement_familles_elig(formulas.SimpleFormulaColumn): column = columns.BoolCol label = u"Eligibilité à Paris-Logement-Familles" entity_class = entities.Familles def function(self, simulation, period): parisien = simulation.calculate('parisien', period) statut_occupation = simulation.calculate('statut_occupation', period) charge_logement = ( (statut_occupation == 1) + (statut_occupation == 2) + (statut_occupation == 3) + (statut_occupation == 4) + (statut_occupation == 5) + (statut_occupation == 7) ) result = parisien * charge_logement return period, result @Reform.formula class paris_logement_familles_br_i(formulas.SimpleFormulaColumn): column = columns.FloatCol label = u"Base de ressources individuelle pour Paris Logement Famille" entity_class = entities.Individus def function(self, simulation, period): salaire_net = simulation.calculate('salaire_net', period) chonet = simulation.calculate('chonet', period) rstnet = simulation.calculate('rstnet', period) pensions_alimentaires_percues = simulation.calculate('pensions_alimentaires_percues', period) pensions_alimentaires_versees_individu = simulation.calculate( 'pensions_alimentaires_versees_individu', period) rsa_base_ressources_patrimoine_i = simulation.calculate_add('rsa_base_ressources_patrimoine_i', period) indemnites_journalieres_imposables = simulation.calculate('indemnites_journalieres_imposables', period) indemnites_stage = simulation.calculate('indemnites_stage', period) revenus_stage_formation_pro = simulation.calculate('revenus_stage_formation_pro', period) allocation_securisation_professionnelle = simulation.calculate( 'allocation_securisation_professionnelle', period) prestation_compensatoire = simulation.calculate('prestation_compensatoire', period) pensions_invalidite = simulation.calculate('pensions_invalidite', period) indemnites_chomage_partiel = simulation.calculate('indemnites_chomage_partiel', period) bourse_recherche = simulation.calculate('bourse_recherche', period) gains_exceptionnels = simulation.calculate('gains_exceptionnels', period) tns_total_revenus_net = simulation.calculate_add('tns_total_revenus_net', period) result = ( salaire_net + indemnites_chomage_partiel + indemnites_stage + chonet + rstnet + pensions_alimentaires_percues - abs_(pensions_alimentaires_versees_individu) + rsa_base_ressources_patrimoine_i + allocation_securisation_professionnelle + indemnites_journalieres_imposables + prestation_compensatoire + pensions_invalidite + bourse_recherche + gains_exceptionnels + tns_total_revenus_net + revenus_stage_formation_pro ) return period, result @Reform.formula class paris_logement_familles_br(formulas.SimpleFormulaColumn): column = columns.FloatCol label = u"Base de ressource pour Paris Logement Famille" entity_class = entities.Familles def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') paris_logement_familles_br_i_holder = simulation.compute('paris_logement_familles_br_i', period) paris_logement_familles_br = self.sum_by_entity(paris_logement_familles_br_i_holder) result = paris_logement_familles_br return period, result @Reform.formula class plf_enfant_handicape(formulas.SimpleFormulaColumn): column = columns.BoolCol label = u"Enfant handicapé au sens de la mairie de Paris" entity_class = entities.Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') invalide = simulation.calculate('invalide', period) plf_enfant = simulation.calculate('plf_enfant', period) return period, plf_enfant * invalide @Reform.formula class plf_enfant(formulas.SimpleFormulaColumn): column = columns.BoolCol label = u"Enfant pris en compte par la mairie de Paris pour PLF" entity_class = entities.Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') est_enfant_dans_famille = simulation.calculate('est_enfant_dans_famille', period) enfant_place = simulation.calculate('enfant_place', period) a_charge_fiscale = simulation.calculate('a_charge_fiscale', period) return period, est_enfant_dans_famille * (1 - enfant_place) * a_charge_fiscale @Reform.formula class plf_enfant_garde_alternee(formulas.SimpleFormulaColumn): column = columns.BoolCol label = u"Enfant en garde alternée pris en compte par la mairie de Paris pour PLF" entity_class = entities.Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') alt = simulation.calculate('alt', period) plf_enfant = simulation.calculate('plf_enfant', period) return period, alt * plf_enfant @Reform.formula class plf_enfant_handicape_garde_alternee(formulas.SimpleFormulaColumn): column = columns.BoolCol label = u"Enfant handicapé en garde alternée pris en compte par la mairie de Paris pour PLF" entity_class = entities.Individus def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') alt = simulation.calculate('alt', period) plf_enfant_handicape = simulation.calculate('plf_enfant_handicape', period) return period, alt * plf_enfant_handicape @Reform.formula class plf_handicap(formulas.SimpleFormulaColumn): column = columns.FloatCol entity_class = entities.Familles label = u"Allocation Paris-Logement-Familles en cas d'enfant handicapé" def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') plf_enfant_handicape = simulation.compute('plf_enfant_handicape', period) plf_enfant_handicape_garde_alternee = simulation.compute('plf_enfant_handicape_garde_alternee', period) br = simulation.calculate('paris_logement_familles_br', period) nb_enf_handicape = self.sum_by_entity(plf_enfant_handicape) nb_enf_handicape_garde_alternee = self.sum_by_entity(plf_enfant_handicape_garde_alternee) P = simulation.legislation_at(period.start).aides_locales.paris.paris_logement_familles plafond = P.plafond_haut_3enf montant = P.montant_haut_3enf plf_handicap = (nb_enf_handicape > 0) * (br <= plafond) * montant # Si tous les enfants handicapés sont en garde alternée garde_alternee = nb_enf_handicape - nb_enf_handicape_garde_alternee == 0 deduction_garde_alternee = garde_alternee * 0.5 * plf_handicap plf_handicap = plf_handicap - deduction_garde_alternee return period, plf_handicap @Reform.formula class paris_logement_familles(formulas.SimpleFormulaColumn): column = columns.FloatCol label = u"Allocation Paris Logement Familles" entity_class = entities.Familles url = "http://www.paris.fr/pratique/toutes-les-aides-et-allocations/aides-sociales/paris-logement-familles-prestation-ville-de-paris/rub_9737_stand_88805_port_24193" # noqa def function(self, simulation, period): period = period.start.offset('first-of', 'month').period('month') elig = simulation.calculate('paris_logement_familles_elig', period) br = simulation.calculate('paris_logement_familles_br', period) plf_enfant = simulation.compute('plf_enfant', period) nbenf = self.sum_by_entity(plf_enfant) plf_enfant_garde_alternee = simulation.compute('plf_enfant_garde_alternee', period) nbenf_garde_alternee = self.sum_by_entity(plf_enfant_garde_alternee) plf_handicap = simulation.calculate('plf_handicap', period) loyer = simulation.calculate('loyer', period) + simulation.calculate('charges_locatives', period) P = simulation.legislation_at(period.start).aides_locales.paris.paris_logement_familles ressources_sous_plaf_bas = (br <= P.plafond_bas_3enf) ressources_sous_plaf_haut = (br <= P.plafond_haut_3enf) * (br > P.plafond_bas_3enf) montant_base_3enfs = (nbenf >= 3) * ( ressources_sous_plaf_bas * P.montant_haut_3enf + ressources_sous_plaf_haut * P.montant_bas_3enf ) montant_enf_sup = ( ressources_sous_plaf_bas * P.montant_haut_enf_sup + ressources_sous_plaf_haut * P.montant_bas_enf_sup ) montant_3enfs = montant_base_3enfs + montant_enf_sup * max_(nbenf - 3, 0) montant_2enfs = (nbenf == 2) * (br <= P.plafond_2enf) * P.montant_2enf plf = montant_2enfs + montant_3enfs deduction_garde_alternee = (nbenf_garde_alternee > 0) * ( (nbenf - nbenf_garde_alternee < 3) * 0.5 * plf + (nbenf - nbenf_garde_alternee >= 3) * nbenf_garde_alternee * 0.5 * montant_enf_sup ) plf = plf - deduction_garde_alternee plf = max_(plf, plf_handicap) plf = elig * plf plf = min_(plf, loyer) return period, plf reform = Reform() reform.modify_legislation_json(modifier_function = modify_legislation_json) return reform def modify_legislation_json(reference_legislation_json_copy): reform_legislation_subtree = { "@type": "Node", "description": "Aides locales", "children": { "paris": { "@type": "Node", "description": "Aides de la ville de Paris", "children": { "paris_logement_familles": { "@type": "Node", "description": "Paris Logement Famille", "children": { "plafond_haut_3enf": { "@type": "Parameter", "description": "Plafond haut de PLF pour les familles à 3 enfants, aussi plafond de PLF avec enfant handicapé", # noqa "unit": "currency", "format": "float", "values": [{'start': u'2014-01-01', 'stop': u'2015-12-31', 'value': 5000}], }, "plafond_bas_3enf": { "@type": "Parameter", "description": "Plafond bas de PLF pour les familles à 3 enfants", "unit": "currency", "format": "float", "values": [{'start': u'2014-01-01', 'stop': u'2015-12-31', 'value': 3000}], }, "plafond_2enf": { "@type": "Parameter", "description": "Plafond de PLF pour les familles à deux enfants.", "unit": "currency", "format": "float", "values": [{'start': u'2014-01-01', 'stop': u'2015-12-31', 'value': 2000}], }, "montant_haut_3enf": { "@type": "Parameter", "description": "Montant haut PLF pour famille à 3 enfants", "unit": "currency", "format": "float", "values": [{'start': u'2014-01-01', 'stop': u'2015-12-31', 'value': 128}], }, "montant_bas_3enf": { "@type": "Parameter", "description": "Montant bas PLF pour famille à 3 enfants.", "unit": "currency", "format": "float", "values": [{'start': u'2014-01-01', 'stop': u'2015-12-31', 'value': 84}], }, "montant_2enf": { "@type": "Parameter", "description": "Montant PLF pour les familles à deux enfants.", "unit": "currency", "format": "float", "values": [{'start': u'2014-01-01', 'stop': u'2015-12-31', 'value': 116}], }, "montant_haut_enf_sup": { "@type": "Parameter", "description": "Montant haut sup par enfant", "unit": "currency", "format": "float", "values": [{'start': u'2014-01-01', 'stop': u'2015-12-31', 'value': 41}], }, "montant_bas_enf_sup": { "@type": "Parameter", "description": "Montant bas sup par enfant.", "unit": "currency", "format": "float", "values": [{'start': u'2014-01-01', 'stop': u'2015-12-31', 'value': 21}], }, } } } }, }, } reference_legislation_json_copy['children']['aides_locales'] = reform_legislation_subtree return reference_legislation_json_copy PK'GKKWW-openfisca_france/reforms/cesthra_invalidee.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division from numpy import maximum as max_ from openfisca_core import columns, formulas, reforms from .. import entities from ..model.prelevements_obligatoires.impot_revenu import ir def build_reform(tax_benefit_system): Reform = reforms.make_reform( key = 'cesthra_invalidee', name = u"Contribution execptionnelle sur les très hauts revenus d'activité (invalidée par le CC)", reference = tax_benefit_system, ) @Reform.formula class cesthra(formulas.SimpleFormulaColumn): column = columns.FloatCol entity_class = entities.FoyersFiscaux label = u"Contribution exceptionnelle de solidarité sur les très hauts revenus d'activité" # PLF 2013 (rejeté) : 'taxe à 75%' def function(self, simulation, period): period = period.start.offset('first-of', 'year').period('year') salaire_imposable_holder = simulation.calculate("salaire_imposable", period) law_cesthra = simulation.legislation_at(period.start).cesthra salaire_imposable = self.split_by_roles(salaire_imposable_holder) cesthra = 0 for rev in salaire_imposable.itervalues(): cesthra += max_(rev - law_cesthra.seuil, 0) * law_cesthra.taux return period, cesthra @Reform.formula class irpp(formulas.SimpleFormulaColumn): label = u"Impôt sur le revenu des personnes physiques (réformée pour intégrer la cesthra)" reference = ir.irpp def function(self, simulation, period): ''' Montant après seuil de recouvrement (hors ppe) ''' period = period.start.offset('first-of', 'year').period('year') iai = simulation.calculate('iai', period) credits_impot = simulation.calculate('credits_impot', period) cehr = simulation.calculate('cehr', period) cesthra = simulation.calculate('cesthra', period = period) P = simulation.legislation_at(period.start).ir.recouvrement pre_result = iai - credits_impot + cehr + cesthra return period, ((iai > P.seuil) * ((pre_result < P.min) * (pre_result > 0) * iai * 0 + ((pre_result <= 0) + (pre_result >= P.min)) * (- pre_result)) + (iai <= P.seuil) * ((pre_result < 0) * (-pre_result) + (pre_result >= 0) * 0 * iai)) reform = Reform() reform.modify_legislation_json(modifier_function = modify_legislation_json) return reform def modify_legislation_json(reference_legislation_json_copy): reform_legislation_subtree = { "@type": "Node", "description": "Contribution execptionnelle sur les très hauts revenus d'activité", "children": { "seuil": { "@type": "Parameter", "description": "Seuil", "format": "integer", "unit": "currency", "values": [{'start': u'2012-01-01', 'stop': u'2013-12-31', 'value': 1000000}], }, "taux": { "@type": "Parameter", "description": "Taux", "format": "rate", "unit": "currency", "values": [{'start': u'2012-01-01', 'stop': u'2013-12-31', 'value': .75}], }, }, } reference_legislation_json_copy['children']['cesthra'] = reform_legislation_subtree return reference_legislation_json_copy PK'GLF%2!2!0openfisca_france/tests/test_allegement_fillon.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import datetime from openfisca_core import periods, reforms from openfisca_france.tests.base import tax_benefit_system test_case_by_employee_type = dict( annuel = dict( input_variables = dict( allegement_fillon_mode_recouvrement = 0, effectif_entreprise = 3000, code_postal_entreprise = "75001", salaire_de_base = { # 9 smic horaire 2011 "2011-01": 35 * 52 / 12 * 9, "2011-02": 35 * 52 / 12 * 9, "2011-03": 35 * 52 / 12 * 9, "2011-04": 35 * 52 / 12 * 9, "2011-05": 35 * 52 / 12 * 9, "2011-06": 35 * 52 / 12 * 9, "2011-07": 35 * 52 / 12 * 9, "2011-08": 35 * 52 / 12 * 9, "2011-09": 35 * 52 / 12 * 9 + 1000, "2011-10": 35 * 52 / 12 * 9, "2011-11": 35 * 52 / 12 * 9, "2011-12": 35 * 52 / 12 * 9 * 2, }, type_sal = 0, ), output_variables = dict( allegement_fillon = { "2011": 3233.51, }, ), ), circulaire_acoss_2011_regularisation_fin_de_periode = dict( input_variables = dict( allegement_fillon_mode_recouvrement = 1, effectif_entreprise = 3000, code_postal_entreprise = "75001", salaire_de_base = { # 9 smic horaire 2011 "2011-01": 35 * 52 / 12 * 9, "2011-02": 35 * 52 / 12 * 9, "2011-03": 35 * 52 / 12 * 9, "2011-04": 35 * 52 / 12 * 9, "2011-05": 35 * 52 / 12 * 9, "2011-06": 35 * 52 / 12 * 9, "2011-07": 35 * 52 / 12 * 9, "2011-08": 35 * 52 / 12 * 9, "2011-09": 35 * 52 / 12 * 9 + 1000, "2011-10": 35 * 52 / 12 * 9, "2011-11": 35 * 52 / 12 * 9, "2011-12": 35 * 52 / 12 * 9 * 2, }, type_sal = 0, ), output_variables = dict( allegement_fillon = { "2011-01": 354.9, "2011-02": 354.9, "2011-03": 354.9, "2011-04": 354.9, "2011-05": 354.9, "2011-06": 354.9, "2011-07": 354.9, "2011-08": 354.9, "2011-09": 0, "2011-10": 354.9, "2011-11": 354.9, "2011-12": -315.49, # employeur est redevable "2011": 3233.51, }, ), ), circulaire_acoss_2011_progressif = dict( input_variables = dict( allegement_fillon_mode_recouvrement = 2, effectif_entreprise = 3000, code_postal_entreprise = "75001", salaire_de_base = { # 9 smic horaire 2011 "2011-01": 35 * 52 / 12 * 9, "2011-02": 35 * 52 / 12 * 9, "2011-03": 35 * 52 / 12 * 9, "2011-04": 35 * 52 / 12 * 9, "2011-05": 35 * 52 / 12 * 9, "2011-06": 35 * 52 / 12 * 9, "2011-07": 35 * 52 / 12 * 9, "2011-08": 35 * 52 / 12 * 9, "2011-09": 35 * 52 / 12 * 9 + 1000, "2011-10": 35 * 52 / 12 * 9, "2011-11": 35 * 52 / 12 * 9, "2011-12": 35 * 52 / 12 * 9 * 2, }, type_sal = 0, ), output_variables = dict( allegement_fillon = { "2011-01": 354.9, "2011-02": 354.9, "2011-03": 354.9, "2011-04": 354.9, "2011-05": 354.9, "2011-06": 354.9, "2011-07": 354.9, "2011-08": 354.9, "2011-09": -78.58, "2011-10": 355.44, "2011-11": 354.39, "2011-12": -236.94, # "2011": 10 * 354.9 - 78.58 - 236.94, }, ), ), salarie_2015_5000_euros = dict( input_variables = dict( allegement_fillon_mode_recouvrement = 2, effectif_entreprise = 1, code_postal_entreprise = "75001", contrat_de_travail_debut = "2015-01-01", salaire_de_base = { "2015-01": 5000, "2015-02": 5000, "2015-03": 5000, "2015-04": 5000, "2015-05": 5000, "2015-06": 5000, "2015-07": 5000, "2015-08": 5000, "2015-09": 5000, "2015-10": 5000, "2015-11": 5000, "2015-12": 5000, }, type_sal = 0, ), output_variables = dict( allegement_fillon = { "2015-01": 0, "2015-02": 0, "2015-03": 0, "2015-04": 0, "2015-05": 0, "2015-06": 0, "2015-07": 0, "2015-08": 0, "2015-09": 0, "2015-10": 0, "2015-11": 0, "2015-12": 0, }, ), ), ) def test_check(): for employee_type, test_parameters in test_case_by_employee_type.iteritems(): Reform = reforms.make_reform( key = u'smic_h_b_9_euros', name = u"Réforme pour simulation ACOSS SMIC horaire brut fixe à 9 euros", reference = tax_benefit_system, ) reform = Reform() reform.modify_legislation_json(modifier_function = modify_legislation_json) simulation_period = 2011 parent1 = dict( birth = datetime.date(periods.period(simulation_period).start.year - 40, 1, 1), ) parent1.update(test_parameters['input_variables']) simulation = reform.new_scenario().init_single_entity( period = simulation_period, parent1 = parent1, ).new_simulation(debug = True) for variable, amounts in test_parameters['output_variables'].iteritems(): if isinstance(amounts, dict): for period_str, amount in sorted(amounts.iteritems()): output = simulation.calculate_add_divide(variable, period = periods.period(period_str)) variable_message = "{} at {}".format(variable, period_str) yield assert_variable, variable_message, employee_type, amount, output else: output = simulation.calculate(variable) variable_message = variable amount = amounts yield assert_variable, variable_message, employee_type, amount, output def assert_variable(variable_message, employee_type, amount, output): # TODO Use assert_near. assert abs(output - amount) < 0.01, \ "error for {} ({}) : should be {} instead of {} ".format(variable_message, employee_type, amount, output) def modify_legislation_json(reference_legislation_json_copy): # FIXME update_legislation is deprecated. reform_legislation_json = reforms.update_legislation( legislation_json = reference_legislation_json_copy, path = ('children', 'cotsoc', 'children', 'gen', 'children', 'smic_h_b', 'values'), period = periods.period("year", "2011"), value = 9, ) return reform_legislation_json PKxIE"openfisca_france/tests/__init__.pyPKFZ*openfisca_france/tests/test_from_taxipp.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import os import pkg_resources import sys from nose.tools import assert_equal from .ipp.taxipp_utils import build_ipp2of_variables, run_OF, compare openfisca_france_location = pkg_resources.get_distribution('openfisca-france').location ipp_dir = os.path.join(openfisca_france_location, 'openfisca_france', 'tests', 'ipp') def list_dta(selection): if selection is None: selection = "" input = [] output = [] for filename in os.listdir(os.path.join(ipp_dir, "base_IPP")): file_path = os.path.join(ipp_dir, 'base_IPP', filename) if filename.startswith("base_IPP_input") and filename.endswith(selection + ".dta"): input.append(file_path) elif filename.startswith("base_IPP_output") and filename.endswith(selection + ".dta"): output.append(file_path) return input, output def comparison_taxipp(selection = None, threshold = 2, verbose = False): assert selection is not None, "selection should be not None" list_input, list_output = list_dta(selection) ipp2of_input_variables, ipp2of_output_variables = build_ipp2of_variables() last_param_scenario = "rien" for input_file_path, output_file_path in zip(list_input, list_output): print input_file_path check_comparison(ipp2of_input_variables, input_file_path, output_file_path, ipp2of_output_variables, last_param_scenario, threshold, verbose) def test_from_taxipp(threshold = 2, list_input = None, list_output = None, verbose = False): # selection : dernier mot avant le .dta : "actif-chomeur", "ISF", "famille_modeste" if list_input is None: list_input, list_output = list_dta(selection = None) elif list_output is None: list_output = [ file_path.replace('input', 'output') for file_path in list_input ] ipp2of_input_variables, ipp2of_output_variables = build_ipp2of_variables() last_param_scenario = "rien" for input_file_path, output_file_path in zip(list_input, list_output): yield check_comparison, ipp2of_input_variables, input_file_path, output_file_path, ipp2of_output_variables, \ last_param_scenario, threshold, verbose def check_comparison(ipp2of_input_variables, input_file_path, output_file_path, ipp2of_output_variables, last_param_scenario = "rien", threshold = 1, verbose = False): simulation, param_scenario = run_OF(ipp2of_input_variables, path_dta_input = input_file_path, option = 'list_dta') if str(param_scenario) != str(last_param_scenario): pbs = compare(output_file_path, ipp2of_output_variables, param_scenario, simulation, threshold, verbose = verbose) assert_equal(len(pbs), 0, u"input_file_path={!r}, threshold={!r}, pbs={!r}".format( input_file_path, threshold, pbs)) last_param_scenario = param_scenario if __name__ == '__main__': import logging logging.basicConfig(level = logging.DEBUG, stream = sys.stdout) comparison_taxipp(selection = "_marie_actif-chomeur", verbose = True) PK'Gmo *openfisca_france/tests/test_suggestions.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import datetime import json from nose.tools import assert_equal from . import base def test_birth(): year = 2013 scenario = base.tax_benefit_system.new_scenario().init_single_entity( period = year, parent1 = dict(), enfants = [ dict(), dict(birth = datetime.date(year - 12, 1, 1)), dict(birth = datetime.date(year - 18, 1, 1)), ], ) scenario.suggest() json.dumps(scenario.to_json(), encoding = 'utf-8', ensure_ascii = False, indent = 2) simulation = scenario.new_simulation(debug = True) assert_equal( simulation.calculate('birth').tolist(), [ datetime.date(year - 40, 1, 1), datetime.date(year - 10, 1, 1), datetime.date(year - 12, 1, 1), datetime.date(year - 18, 1, 1), ], ) assert_equal( simulation.calculate('activite').tolist(), [ 4, 2, 2, 4, ], ) assert_equal( simulation.calculate('age').tolist(), [ 40, 10, 12, 18, ], ) assert_equal( simulation.calculate('age_en_mois').tolist(), [ 40 * 12, 10 * 12, 12 * 12, 18 * 12, ], ) if __name__ == '__main__': import logging import sys logging.basicConfig(level = logging.ERROR, stream = sys.stdout) test_birth() PKFL_vs  ;openfisca_france/tests/test_decomposition_fiches_de_paie.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import json import os from openfisca_core import decompositions from openfisca_france.tests.base import tax_benefit_system def test_decomposition(print_decomposition = False): simulation = tax_benefit_system.new_scenario().init_single_entity( period = "2013-01", parent1 = dict( effectif_entreprise = 3000, exposition_accident = 3, code_postal_entreprise = "75001", ratio_alternants = .025, salaire_de_base = {"2013": 12 * 3000}, taille_entreprise = 3, type_sal = 0, ), menage = dict( zone_apl = 1, ), ).new_simulation(debug = True) xml_file_path = os.path.join( tax_benefit_system.DECOMP_DIR, "fiche_de_paie_decomposition.xml" ) decomposition_json = decompositions.get_decomposition_json(tax_benefit_system, xml_file_path = xml_file_path) simulations = [simulation] response = decompositions.calculate(simulations, decomposition_json) if print_decomposition: print unicode( json.dumps(response, encoding = 'utf-8', ensure_ascii = False, indent = 2) ) if __name__ == '__main__': import argparse import logging import sys parser = argparse.ArgumentParser(description = __doc__) parser.add_argument('-v', '--verbose', action = 'store_true', default = False, help = "increase output verbosity") args = parser.parse_args() logging.basicConfig(level = logging.DEBUG if args.verbose else logging.WARNING, stream = sys.stdout) # test_decomposition(print_decomposition = True) PK'GmBB*openfisca_france/tests/test_cotsoc_fonc.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import datetime from ..model.base import CAT from . import base def check_simulation_monthly_variable(description, simulation, variable, expected_value, error_margin): calculated_value = (simulation.calculate(variable)).sum() # monthly values assert abs(calculated_value - expected_value) < error_margin, u'Variable "{} = {}. Expected: {}'.format( variable, calculated_value, expected_value) def test(): # Comparaison avec la fiche de paie IPP calculée avec une cotisation transport correspondant à Paris ((.026) # alors qu'Openfisca la caclule pour Lyon (.0175) tests_infos = [ dict( period = "2012-01", description = u"Célibataire public_titulaire_etat", parent1 = dict( birth = datetime.date(1972, 1, 1), depcom_entreprise = "69381", primes_fonction_publique = 500, traitement_indiciaire_brut = 2000, taille_entreprise = 3, # TODO fix this type_sal = CAT['public_titulaire_etat'], ), menage = dict( zone_apl = 1, ), error_margin = 1, expected_values = dict( fnal = -8 - 2, versement_transport = -2000 * 0.0175, # = 35 cotisations_employeur_main_d_oeuvre = -45, allocations_temporaires_invalidite = -6.6, mmid_employeur = -194, famille = -108, contribution_solidarite_autonomie = - 6, cotisations_employeur_non_contributives = -314.6, # mmid_employeur, famille, fnal, versement_transport, # allocations_temporaires_invalidite contribution_solidarite_autonomie rafp_employeur = -20, pension_civile_employeur = -1371.80, cotisations_employeur_contributives = - 1371.80 - 20, # pension_civile_employeur, rafp_employeur cotisations_employeur = -(1371.80 + 6.6 + 20 + 194 + 108 + 2 + 8 + 2000 * 0.0175 + 6), # pension, ati, rafp, maladie, famille, fnal1, fnal2, transport csa, pension_civile_salarie = -167.80, rafp_salarie = -20, cotisations_salariales_contributives = - (167.80 + 20), # pension rafp contribution_exceptionnelle_solidarite = - 23.72, cotisations_salariales_non_contributives = - 23.72, cotisations_salariales = -(167.80 + 20 + 23.72), # pension, rafp, cotisation exceptionnelle de solidarité csg_deductible_salaire = -128.28, csg_imposable_salaire = -60.36, crds_salaire = -12.58, indemnite_residence = 60, salaire_net = 2147.26, salsuperbrut = 4328.40 + 2000 * (0.0175 - 0.026), # Correction transport ), ), dict( period = "2012-01", description = u"Célibataire public_titulaire_territoriale", parent1 = dict( birth = datetime.date(1972, 1, 1), depcom_entreprise = "69381", primes_fonction_publique = 500, traitement_indiciaire_brut = 2000, taille_entreprise = 3, # TODO fix this type_sal = CAT['public_titulaire_territoriale'], ), menage = dict( zone_apl = 1, ), error_margin = 1, expected_values = dict( fnal = -8 -2 , versement_transport = -2000 * 0.0175, cotisations_employeur_main_d_oeuvre = -45, allocations_temporaires_invalidite = -10, mmid_employeur = -230, famille = -108, contribution_solidarite_autonomie = - 6, cotisations_employeur_non_contributives = -( 230 + 108 + 10 + 6), pension_civile_employeur = -546, rafp_employeur = -20, cotisations_employeur_contributives = -(546 + 20), cotisations_employeur = -(546 + 10 + 20 + 230 + 108 + 2 + 8 + 2000 * 0.0175 + 6), # pension, ati, rafp, maladie, famille, fnal1, fnal2, csa, pension_civile_salarie = -167.80, rafp_salarie = -20, cotisations_salariales_contributives = - (167.80 + 20), # pension rafp contribution_exceptionnelle_solidarite = -23.72, cotisations_salariales_non_contributives = - 23.72, cotisations_salariales = -(167.80 + 20 + 23.72), csg_deductible_salaire = -128.28, csg_imposable_salaire = -60.36, crds_salaire = -12.58, indemnite_residence = 60, salaire_net = 2147.26, salsuperbrut = 3542 + 2000 * (0.0175 - 0.026), ), ), dict( period = "2012-01", description = u"Célibataire public_titulaire_hospitaliere", parent1 = dict( birth = datetime.date(1972, 1, 1), depcom_entreprise = "69381", primes_fonction_publique = 500, traitement_indiciaire_brut = 2000, taille_entreprise = 3, # TODO fix this type_sal = CAT['public_titulaire_hospitaliere'], ), menage = dict( zone_apl = 1, ), error_margin = 1, expected_values = dict( fnal = -8 - 2, versement_transport = -2000 * 0.0175, cotisations_employeur_main_d_oeuvre = -45, allocations_temporaires_invalidite = -10, mmid_employeur = -230, famille = -108, contribution_solidarite_autonomie = - 6, cotisations_employeur_non_contributives = -354, # cotisations_employeur_non_contributives = -(10 + 230 + 108 + 2 + 8 + 2000 * 0.0175 + 6), # pension, ati, rafp, maladie, famille, feh, fnal1, fnal2, transport, csa pension_civile_employeur = -546, fonds_emploi_hospitalier = -20, rafp_employeur = -20, cotisations_employeur_contributives = -(546 + 20 + 20), # pension, rafp, feh cotisations_employeur = -(546 + 10 + 20 + 230 + 108 + 20 + 2 + 8 + 2000 * 0.0175 + 6), pension_civile_salarie = -167.80, rafp_salarie = -20, cotisations_salariales_contributives = - (167.80 + 20), contribution_exceptionnelle_solidarite = - 23.72, cotisations_salariales_non_contributives = - 23.72, cotisations_salariales = -(167.80 + 20 + 23.72), csg_deductible_salaire = -128.28, csg_imposable_salaire = -60.36, crds_salaire = -12.58, indemnite_residence = 60, salaire_net = 2147.26, salsuperbrut = 3562 + 2000 * (0.0175 - 0.026), ), ), dict( period = "2012-01", description = u"Célibataire public_non_titulaire", parent1 = dict( birth = datetime.date(1972, 1, 1), depcom_entreprise = "69381", primes_fonction_publique = 500, salaire_de_base = 2000, taille_entreprise = 3, # TODO fix this type_sal = CAT['public_non_titulaire'], ), menage = dict( zone_apl = 1, ), error_margin = 1, expected_values = dict( fnal = - 10.24 - 2.56, versement_transport = -2560 * 0.0175, cotisations_employeur_main_d_oeuvre = - 10.24 - 2.56 - 2560 * 0.0175, vieillesse_deplafonnee_employeur = -40.96, vieillesse_plafonnee_employeur = -212.48, pension_civile_employeur = 0, rafp_employeur = 0, ircantec_employeur = -90.24, # TODO: Trouver source extérieur site IPP buggé contribution_solidarite_autonomie = - 7.68, cotisations_employeur_contributives = -343.68, # -40.96 -212.48 -90.24 - 7.68 cotisations_employeur_non_contributives = -465.92 - 7.68, cotisations_employeur = -( 212.48 + 40.96 + 90.24 + 327.68 + 138.24 + 2.56 + 10.24 + 2560 * 0.0175 + 7.68 ), pension_civile_salarie = 0, rafp_salarie = 0, ircantec_salarie = - 60.16, # TODO: Trouver source extérieur site IPP buggé vieillesse_deplafonnee_salarie = -2.56, vieillesse_plafonnee_salarie = -170.24, cotisations_salariales_contributives = -232.96, contribution_exceptionnelle_solidarite = -23.16, mmid_salarie = -19.20, cotisations_salariales_non_contributives = - 23.16 - 19.20, cotisations_salariales = -(170.24 + 2.56 + 60.16 + 19.20 + 23.16), # viel_plaf viel_deplaf ircantecA maladie, cot excep de solidarite # cotisations_salariales_contributives = -(170.24 + 2.56 + 58.24), # viel_plaf viel_deplaf ircantecA csg_deductible_salaire = -128.28, csg_imposable_salaire = -60.36, crds_salaire = -12.58, indemnite_residence = 60, # salaire_net = 2091.20, # TODO: Trouver source extérieur site IPP buggé # salsuperbrut = 3367.36 + 2560 * (0.0175 - 0.026), ), ), dict( period = "2012-01", description = u"Couple 1 fonctionnaire public_titulaire_etat 2 enfants", parent1 = dict( birth = datetime.date(1972, 1, 1), depcom_entreprise = "69381", primes_fonction_publique = 500, traitement_indiciaire_brut = 2000, taille_entreprise = 3, # TODO fix this type_sal = CAT['public_titulaire_etat'], ), parent2 = dict( birth = datetime.date(1972, 1, 1), ), enfants = [ dict(birth = datetime.date(2000, 1, 1)), dict(birth = datetime.date(2009, 1, 1)), ], menage = dict( zone_apl = 1, ), error_margin = 2, expected_values = dict( fnal = -8 - 2, versement_transport = -2000 * 0.0175, # = 35 cotisations_employeur_main_d_oeuvre = -45, allocations_temporaires_invalidite = -6.6, mmid_employeur = -194, famille = -108, contribution_solidarite_autonomie = - 6, cotisations_employeur_non_contributives = -314.6, pension_civile_employeur = -1371.80, rafp_employeur = -20, cotisations_employeur_contributives = - 1371.80 - 20, cotisations_employeur = -(1371.80 + 6.6 + 20 + 194 + 108 + 2 + 8 + 2000 * 0.0175 + 6), # pension, ati, rafp, maladie, famille, fnal1, fnal2, csa, pension_civile_salarie = -167.80, rafp_salarie = -20, cotisations_salariales_contributives = -187.8, contribution_exceptionnelle_solidarite = - 23.72, cotisations_salariales_non_contributives = -23.72, cotisations_salariales = -(167.80 + 20 + 23.72), crds_salaire = -12.93, csg_deductible_salaire = -131.94, csg_imposable_salaire = -62.09, indemnite_residence = 60, # salaire_net = 2213.83, salsuperbrut = 4401.44 + 2000 * (.0175 - .026), supp_familial_traitement = 73.04, ), ), dict( period = "2012-01", description = u"Couple 2 fonctionnaires public_titulaire_etat 2 enfants", parent1 = dict( birth = datetime.date(1972, 1, 1), depcom_entreprise = "69381", primes_fonction_publique = 500, traitement_indiciaire_brut = 2000, taille_entreprise = 3, # TODO fix this type_sal = CAT['public_titulaire_etat'], ), parent2 = dict( birth = datetime.date(1972, 1, 1), depcom_entreprise = "69381", primes_fonction_publique = 500, traitement_indiciaire_brut = 2000, taille_entreprise = 3, # TODO fix this type_sal = CAT['public_titulaire_etat'], ), enfants = [ dict(birth = datetime.date(2000, 1, 1)), dict(birth = datetime.date(2009, 1, 1)), ], menage = dict( zone_apl = 2, ), error_margin = 2, expected_values = dict( # pension, ati, rafp, maladie, famille, fnal1, fnal2, csa, fnal = - 8 * 2 - 2 * 2, versement_transport = -2000 * 0.0175 * 2, # = 35 cotisations_employeur_main_d_oeuvre = -45 * 2, pension_civile_employeur = -1371.80 * 2, rafp_employeur = -20 * 2, cotisations_employeur_contributives = -2783.6, allocations_temporaires_invalidite = -6.6 * 2, mmid_employeur = -194 * 2, famille = -108 * 2, contribution_solidarite_autonomie = - 6 * 2, cotisations_employeur_non_contributives = -617.2 - 6 * 2, cotisations_employeur = -(1371.80 + 6.6 + 20 + 194 + 108 + 2 + 8 + 2000 * 0.0175 + 6) * 2, pension_civile_salarie = -167.80 * 2, rafp_salarie = -20 * 2, cotisations_salariales_contributives = -375.6, contribution_exceptionnelle_solidarite = -23.72 * 2, cotisations_salariales_non_contributives = -23.72 * 2, cotisations_salariales = -422.24, crds_salaire = -12.93 * 2, # csg_deductible_salaire = -131.94 * 2, # TODO: Gérer un seulf sft # csg_imposable_salaire = -62.09 * 2, # # TODO: Gérer un seulf sft indemnite_residence = 240 * 2 / 12, salsuperbrut = (2000 + 500 + 20 + 1751.4) * 2 + 73.04, supp_familial_traitement = 73.04, ), ), ] for test_infos in tests_infos: scenario_arguments = test_infos.copy() description = scenario_arguments.pop('description') error_margin = scenario_arguments.pop('error_margin') expected_values = scenario_arguments.pop('expected_values') simulation = base.tax_benefit_system.new_scenario().init_single_entity(**scenario_arguments).new_simulation( debug = True) for variable, expected_value in expected_values.iteritems(): yield check_simulation_monthly_variable, description, simulation, variable, expected_value, error_margin if __name__ == '__main__': import logging import sys logging.basicConfig(level = logging.ERROR, stream = sys.stdout) import nose nose.core.runmodule(argv = [__file__, '-v', '-i test_cotsoc_fonc.py']) # nose.core.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'], exit=False) PK'Gbok; openfisca_france/tests/base.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from openfisca_core import reforms from openfisca_core.tools import assert_near from .. import init_country from ..reforms import ( allocations_familiales_imposables, cesthra_invalidee, inversion_revenus, plf2015, plfr2014, trannoy_wasmer, ) __all__ = [ 'assert_near', 'get_cached_composed_reform', 'get_cached_reform', 'tax_benefit_system', 'TaxBenefitSystem', ] # Initialize a tax_benefit_system TaxBenefitSystem = init_country() tax_benefit_system = TaxBenefitSystem() # Initialize reforms caches build_reform_functions = [ allocations_familiales_imposables.build_reform, cesthra_invalidee.build_reform, inversion_revenus.build_reform, plf2015.build_reform, plfr2014.build_reform, trannoy_wasmer.build_reform, ] known_reforms = [ build_reform(tax_benefit_system) for build_reform in build_reform_functions ] build_reform_function_by_key = { reform.key: build_reform for build_reform, reform in zip(build_reform_functions, known_reforms) } reform_by_full_key = { reform.full_key: reform for reform in known_reforms } def get_cached_composed_reform(reform_keys, tax_benefit_system): full_key = '.'.join( [tax_benefit_system.full_key] + reform_keys if isinstance(tax_benefit_system, reforms.AbstractReform) else reform_keys ) composed_reform = reform_by_full_key.get(full_key) if composed_reform is None: build_reform_functions = [build_reform_function_by_key[reform_key] for reform_key in reform_keys] composed_reform = reforms.compose_reforms( build_functions_and_keys = zip(build_reform_functions, reform_keys), tax_benefit_system = tax_benefit_system, ) assert full_key == composed_reform.full_key reform_by_full_key[full_key] = composed_reform return composed_reform def get_cached_reform(reform_key, tax_benefit_system): return get_cached_composed_reform([reform_key], tax_benefit_system) PK'G 9Y (openfisca_france/tests/test_tax_rates.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from openfisca_core.rates import average_rate, marginal_rate from openfisca_france.tests import base def test_average_tax_rate(): year = 2013 simulation = base.tax_benefit_system.new_scenario().init_single_entity( axes = [ dict( count = 100, name = 'salaire_imposable', max = 24000, min = 0, ), ], period = year, parent1 = dict(age_en_mois = 40 * 12 + 6), ).new_simulation() # Remove debug = True, because logging is too slow. assert (average_rate( target = simulation.calculate('revdisp'), varying = simulation.calculate('revdisp'), ) == 0).all() def test_marginal_tax_rate(): year = 2013 simulation = base.tax_benefit_system.new_scenario().init_single_entity( axes = [ dict( count = 10000, name = 'salaire_imposable', max = 1000000, min = 0, ), ], period = year, parent1 = dict(age_en_mois = 40 * 12 + 6), ).new_simulation() # Remove debug = True, because logging is too slow. assert (marginal_rate( target = simulation.calculate('revdisp'), varying = simulation.calculate('revdisp'), ) == 0).all() if __name__ == '__main__': import logging import sys logging.basicConfig(level = logging.ERROR, stream = sys.stdout) test_marginal_tax_rate() test_average_tax_rate() PK'G@100&openfisca_france/tests/test_repairs.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import datetime import json from nose.tools import assert_equal from . import base def test_2_parents_2_enfants(): year = 2013 scenario = base.tax_benefit_system.new_scenario().init_from_attributes( test_case = dict( individus = [ dict(), dict(birth = datetime.date(year - 30, 1, 1)), dict(), dict(birth = datetime.date(year - 18, 1, 1)), ], ), repair = True, year = year, ) scenario.suggest() json.dumps(scenario.to_json(), encoding = 'utf-8', ensure_ascii = False, indent = 2) simulation = scenario.new_simulation(debug = True) assert_equal( simulation.calculate('birth').tolist(), [ datetime.date(year - 40, 1, 1), datetime.date(year - 30, 1, 1), datetime.date(year - 10, 1, 1), datetime.date(year - 18, 1, 1), ], ) assert_equal( simulation.calculate('activite').tolist(), [ 4, 4, 2, 4, ], ) assert_equal( simulation.calculate('age').tolist(), [ 40, 30, 10, 18, ], ) assert_equal( simulation.calculate('age_en_mois').tolist(), [ 40 * 12, 30 * 12, 10 * 12, 18 * 12, ], ) def test_famille_1_parent_3_enfants(): year = 2013 scenario = base.tax_benefit_system.new_scenario().init_from_attributes( test_case = dict( familles = [ dict( parents = [0], enfants = [1, 2, 3], ), ], individus = [ dict(), dict(), dict(birth = datetime.date(year - 12, 1, 1)), dict(birth = datetime.date(year - 18, 1, 1)), ], ), repair = True, year = year, ) scenario.suggest() json.dumps(scenario.to_json(), encoding = 'utf-8', ensure_ascii = False, indent = 2) simulation = scenario.new_simulation(debug = True) assert_equal( simulation.calculate('birth').tolist(), [ datetime.date(year - 40, 1, 1), datetime.date(year - 10, 1, 1), datetime.date(year - 12, 1, 1), datetime.date(year - 18, 1, 1), ], ) assert_equal( simulation.calculate('activite').tolist(), [ 4, 2, 2, 4, ], ) assert_equal( simulation.calculate('age').tolist(), [ 40, 10, 12, 18, ], ) assert_equal( simulation.calculate('age_en_mois').tolist(), [ 40 * 12, 10 * 12, 12 * 12, 18 * 12, ], ) def test_famille_2_parents_2_enfants(): year = 2013 scenario = base.tax_benefit_system.new_scenario().init_from_attributes( test_case = dict( familles = [ dict( parents = [0, 1], enfants = [2, 3], ), ], individus = [ dict(), dict(birth = datetime.date(year - 30, 1, 1)), dict(), dict(birth = datetime.date(year - 18, 1, 1)), ], ), repair = True, year = year, ) scenario.suggest() json.dumps(scenario.to_json(), encoding = 'utf-8', ensure_ascii = False, indent = 2) simulation = scenario.new_simulation(debug = True) assert_equal( simulation.calculate('birth').tolist(), [ datetime.date(year - 40, 1, 1), datetime.date(year - 30, 1, 1), datetime.date(year - 10, 1, 1), datetime.date(year - 18, 1, 1), ], ) assert_equal( simulation.calculate('activite').tolist(), [ 4, 4, 2, 4, ], ) assert_equal( simulation.calculate('age').tolist(), [ 40, 30, 10, 18, ], ) assert_equal( simulation.calculate('age_en_mois').tolist(), [ 40 * 12, 30 * 12, 10 * 12, 18 * 12, ], ) def test_foyer_fiscal_1_declarant_3_personnes_a_charge(): year = 2013 scenario = base.tax_benefit_system.new_scenario().init_from_attributes( test_case = dict( foyers_fiscaux = [ dict( declarants = [0], personnes_a_charge = [1, 2, 3], ), ], individus = [ dict(), dict(), dict(birth = datetime.date(year - 12, 1, 1)), dict(birth = datetime.date(year - 18, 1, 1)), ], ), repair = True, year = year, ) scenario.suggest() json.dumps(scenario.to_json(), encoding = 'utf-8', ensure_ascii = False, indent = 2) simulation = scenario.new_simulation(debug = True) assert_equal( simulation.calculate('birth').tolist(), [ datetime.date(year - 40, 1, 1), datetime.date(year - 10, 1, 1), datetime.date(year - 12, 1, 1), datetime.date(year - 18, 1, 1), ], ) assert_equal( simulation.calculate('activite').tolist(), [ 4, 2, 2, 4, ], ) assert_equal( simulation.calculate('age').tolist(), [ 40, 10, 12, 18, ], ) assert_equal( simulation.calculate('age_en_mois').tolist(), [ 40 * 12, 10 * 12, 12 * 12, 18 * 12, ], ) def test_foyer_fiscal_2_declarants_2_personnes_a_charge(): year = 2013 scenario = base.tax_benefit_system.new_scenario().init_from_attributes( test_case = dict( foyers_fiscaux = [ dict( declarants = [0, 1], personnes_a_charge = [2, 3], ), ], individus = [ dict(), dict(birth = datetime.date(year - 30, 1, 1)), dict(), dict(birth = datetime.date(year - 18, 1, 1)), ], ), repair = True, year = year, ) scenario.suggest() json.dumps(scenario.to_json(), encoding = 'utf-8', ensure_ascii = False, indent = 2) simulation = scenario.new_simulation(debug = True) assert_equal( simulation.calculate('birth').tolist(), [ datetime.date(year - 40, 1, 1), datetime.date(year - 30, 1, 1), datetime.date(year - 10, 1, 1), datetime.date(year - 18, 1, 1), ], ) assert_equal( simulation.calculate('activite').tolist(), [ 4, 4, 2, 4, ], ) assert_equal( simulation.calculate('age').tolist(), [ 40, 30, 10, 18, ], ) assert_equal( simulation.calculate('age_en_mois').tolist(), [ 40 * 12, 30 * 12, 10 * 12, 18 * 12, ], ) def test_menage_1_personne_de_reference_3_enfants(): year = 2013 scenario = base.tax_benefit_system.new_scenario().init_from_attributes( test_case = dict( individus = [ dict(), dict(), dict(birth = datetime.date(year - 12, 1, 1)), dict(birth = datetime.date(year - 18, 1, 1)), ], menages = [ dict( personne_de_reference = 0, enfants = [1, 2, 3], ), ], ), repair = True, year = year, ) scenario.suggest() json.dumps(scenario.to_json(), encoding = 'utf-8', ensure_ascii = False, indent = 2) simulation = scenario.new_simulation(debug = True) assert_equal( simulation.calculate('birth').tolist(), [ datetime.date(year - 40, 1, 1), datetime.date(year - 10, 1, 1), datetime.date(year - 12, 1, 1), datetime.date(year - 18, 1, 1), ], ) assert_equal( simulation.calculate('activite').tolist(), [ 4, 2, 2, 4, ], ) assert_equal( simulation.calculate('age').tolist(), [ 40, 10, 12, 18, ], ) assert_equal( simulation.calculate('age_en_mois').tolist(), [ 40 * 12, 10 * 12, 12 * 12, 18 * 12, ], ) def test_menage_1_personne_de_reference_1_conjoint_2_enfants(): year = 2013 scenario = base.tax_benefit_system.new_scenario().init_from_attributes( test_case = dict( individus = [ dict(), dict(birth = datetime.date(year - 30, 1, 1)), dict(), dict(birth = datetime.date(year - 18, 1, 1)), ], menages = [ dict( personne_de_reference = 0, conjoint = 1, enfants = [2, 3], ), ], ), repair = True, year = year, ) scenario.suggest() json.dumps(scenario.to_json(), encoding = 'utf-8', ensure_ascii = False, indent = 2) simulation = scenario.new_simulation(debug = True) assert_equal( simulation.calculate('birth').tolist(), [ datetime.date(year - 40, 1, 1), datetime.date(year - 30, 1, 1), datetime.date(year - 10, 1, 1), datetime.date(year - 18, 1, 1), ], ) assert_equal( simulation.calculate('activite').tolist(), [ 4, 4, 2, 4, ], ) assert_equal( simulation.calculate('age').tolist(), [ 40, 30, 10, 18, ], ) assert_equal( simulation.calculate('age_en_mois').tolist(), [ 40 * 12, 30 * 12, 10 * 12, 18 * 12, ], ) if __name__ == '__main__': import logging import sys logging.basicConfig(level = logging.ERROR, stream = sys.stdout) test_2_parents_2_enfants() test_famille_1_parent_3_enfants() # test_famille_2_parent_2_enfants() test_foyer_fiscal_1_declarant_3_personnes_a_charge() test_foyer_fiscal_2_declarants_2_personnes_a_charge() test_menage_1_personne_de_reference_3_enfants() test_menage_1_personne_de_reference_1_conjoint_2_enfants() PKF'%openfisca_france/tests/test_basics.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import datetime from ..model.base import CAT from . import base tests_infos = [ dict( period = year, parent1 = dict( birth = datetime.date(1972, 1, 1), salaire_de_base = 2000, effectif_entreprise = 25, type_sal = CAT['prive_non_cadre'], ), menage = dict( zone_apl = 1, ), ) for year in range(2015, 2002, -1) ] def check_run(simulation, period): assert simulation.calculate('revdisp') is not None, "Can't compute revdisp on period {}".format(period) assert simulation.calculate('salsuperbrut') is not None, "Can't compute salsuperbrut on period {}".format(period) def test(): for scenario_arguments in tests_infos: simulation = base.tax_benefit_system.new_scenario().init_single_entity(**scenario_arguments).new_simulation( debug = False) period = scenario_arguments['period'] yield check_run, simulation, period if __name__ == '__main__': import logging import sys logging.basicConfig(level = logging.ERROR, stream = sys.stdout) test() PKFAG  $openfisca_france/tests/test_jsons.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . """Teste tous les fichiers .json créés par un script""" import datetime import json import logging import os import sys from biryani.baseconv import check from nose.tools import assert_equal from .base import assert_near, tax_benefit_system json_dir_path = os.path.join(os.path.dirname(__file__), 'json') log = logging.getLogger(__name__) def check_variable(args): scenario = args['scenario'] simulation = scenario.new_simulation(debug = True) code = args['code'] openfisca_value = None if code == 'IAVIM': openfisca_name = 'iai' elif code == 'IDEC': openfisca_name = 'decote' elif code == 'IDRS2': openfisca_name = 'ir_plaf_qf' elif code == 'IINETIR' or code == 'IRESTIR': openfisca_name = 'irpp' elif code == 'ITRED': openfisca_name = 'reductions' elif code == 'NBPT' or code == 'NBP': openfisca_name = 'nbptr' elif code == 'PPETOT': openfisca_name = 'ppe' elif code == 'REVKIRE': openfisca_name = 'rfr' elif code == 'RNICOL': openfisca_name = 'rni' elif code == 'RRBG': openfisca_name = 'rbg' # TODO: Checker si le montant net CSG/CRDS correspond à NAPCS, NAPRDS, checker IINET elif code == 'TOTPAC': openfisca_name = "len(args['totpac'] or [])" openfisca_value = len(args['totpac'] or []) # Codes ignorés pour la comparaison elif code in ('AVFISCOPTER', 'BCSG', 'BPRS', 'BRDS', 'CIADCRE', 'CICA', 'CICORSE', 'CIDEPENV', 'CIDEVDUR', 'CIGARD', 'CIGE', 'CIHABPRIN', 'CIMOBIL', 'CIPERT', 'CIPRETUD', 'RILMIA', 'IINET', 'CIRCM', 'CIRELANCE', 'CITEC', 'IAVF2', 'I2DH', 'IREST', 'IRESTIR', 'RILMIH', 'IRETS', 'ITRED', 'NAPCR', 'NAPCRP', 'NAPCS', 'RRIRENOV', 'RCELHL', 'RLOCIDEFG', 'NAPPS', 'NAPRD', 'PERPPLAFTC', 'PERPPLAFTV', 'RAH', 'RCEL', 'RCELREPGX', 'RCELREPGW', 'RDONS', 'RCELHJK', 'RCELREPHR', 'RCELRREDLA', 'RRESIVIEU', 'RMEUBLE', 'RREDMEUB', 'RSOCREPR', 'RRPRESCOMP', 'RCONS', 'RPECHE', 'RCELREPGS', 'RCELREPGU', 'RCELREPGT', 'RPATNAT', 'RPATNATOT', 'RPRESCOMPREP', 'RDIFAGRI', 'REI', 'RFOR', 'RTELEIR', 'RTOURREP', 'RTOUREPA', 'RTOUHOTR', 'RRESINEUV', 'RFORET', 'RHEBE', 'RILMIC', 'RILMIB', 'RRESIMEUB', 'RREPMEU', 'RREPNPRO', 'TEFF', 'RPROREP', 'RINVRED', 'RREDREP', 'RILMIX', 'PERPPLAFTP', 'RILMIZ', 'RILMJI', 'RILMJS', 'RCODJT', 'RCODJU', 'RCODJV', 'RCODJW', 'RCODJX', 'RIDOMENT', 'RIDOMPROE1', 'RIDOMPROE2', 'RLOGDOM', 'RREPA', 'RDUFLOGIH', 'IPROP', 'RIDOMPROE3', 'RIDOMPROE4', 'RIDOMPROE5', 'RTITPRISE', 'RRDOM', 'RINVDOMTOMLG', 'RCOTFOR', 'RNI', 'RNOUV', 'RRESTIMO', 'RTOUR', 'RCELRREDLC', 'RCELRREDLB', 'RCELNBGL', 'RCELFD', 'RCELLIER', 'RCELHNO', 'RCELHM', 'RCELHR', 'RCELRREDLS', 'RCELRREDLZ', 'RCELFABC', 'RCELREPHS', 'RCELNBGL', 'RCELCOM', 'RCELNQ', 'RCELRREDLD', 'RCELRREDLE', 'RCELRREDLF', 'RTOURHOT', 'RTOURES', 'RTOURNEUF', 'RCELREPHR', 'RCINE', 'RFCPI', 'RINNO', 'RAA', 'RCELREPGJ', 'RCELREPGK', 'RCELREPGL', 'RCELREPGP', 'RSOUFIP', 'RCODELOP', 'RTOURTRA', 'TXMARJ', 'RSURV', 'RAIDE', 'RCELREPHA', 'RCELREPHB', 'RCELJP', 'RCELJOQR', 'RCELREPHD', 'RCELREPHE', 'RCELREPHF', 'RCELREPHH', 'RCEL2012', 'RCELJBGL', 'RCOLENT', 'RCELREPHT', 'RCELREPHU', 'RCELREPHV', 'RCELREPHW', 'RCELREPHX', 'RCELREPHZ', 'RCELRRED09', 'TXMOYIMP', 'RFIPC', 'RILMJX', 'RILMJV', 'RCELREPGV', 'RCELRREDLM', 'RCELRREDMG', 'RILMJW', 'RCELREPHG'): return else: raise ValueError(u'"code" inconnu') log.info(u'Comparing impôts.gouv.fr variable {} with OpenFisca variable {}'.format(code, openfisca_name)) log.info(u'Scenario:\n{}'.format(json.dumps(scenario.to_json(), encoding = 'utf_8', ensure_ascii = False, indent = 2))) if openfisca_value is None: openfisca_array = simulation.calculate(openfisca_name) assert_equal(openfisca_array.shape, (1,)) openfisca_value = openfisca_array[0] assert_near(abs(openfisca_value), args['field']['value'], absolute_error_margin = 2) def test_jsons(): for json_file_name in os.listdir(json_dir_path): with open(os.path.join(json_dir_path, json_file_name)) as json_file: content = json.load(json_file) scenario_json = content['scenario'] scenario = check(tax_benefit_system.Scenario.make_json_to_instance(tax_benefit_system = tax_benefit_system))( scenario_json) if 'year' in scenario_json: year = scenario_json['year'] else: date = datetime.datetime.strptime(scenario_json['date'], "%Y-%m-%d") year = date.year totpac = scenario.test_case['foyers_fiscaux'].values()[0].get('personnes_a_charge') for code, field in content['resultat_officiel'].iteritems(): yield check_variable, { 'code': code, 'field': field, 'json_file_name': json_file_name, 'scenario': scenario, 'totpac': totpac, 'year': year, } if __name__ == "__main__": sys.exit(test_jsons()) PK'G"{{+openfisca_france/tests/test_legislations.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import datetime import json import xml.etree.ElementTree from openfisca_core import conv, legislations, legislationsxml from openfisca_france import init_country TaxBenefitSystem = init_country() def check_legislation_xml_file(year): legislation_tree = xml.etree.ElementTree.parse(TaxBenefitSystem.legislation_xml_file_path) legislation_xml_json = conv.check(legislationsxml.xml_legislation_to_json)(legislation_tree.getroot(), state = conv.default_state) legislation_xml_json, errors = legislationsxml.validate_legislation_xml_json(legislation_xml_json, state = conv.default_state) if errors is not None: errors = conv.embed_error(legislation_xml_json, 'errors', errors) if errors is None: raise ValueError(unicode(json.dumps(legislation_xml_json, ensure_ascii = False, indent = 2)).encode('utf-8')) raise ValueError(u'{0} for: {1}'.format( unicode(json.dumps(errors, ensure_ascii = False, indent = 2, sort_keys = True)), unicode(json.dumps(legislation_xml_json, ensure_ascii = False, indent = 2)), ).encode('utf-8')) _, legislation_json = legislationsxml.transform_node_xml_json_to_json(legislation_xml_json) legislation_json, errors = legislations.validate_legislation_json(legislation_json, state = conv.default_state) if errors is not None: errors = conv.embed_error(legislation_json, 'errors', errors) if errors is None: raise ValueError(unicode(json.dumps(legislation_json, ensure_ascii = False, indent = 2)).encode('utf-8')) raise ValueError(u'{0} for: {1}'.format( unicode(json.dumps(errors, ensure_ascii = False, indent = 2, sort_keys = True)), unicode(json.dumps(legislation_json, ensure_ascii = False, indent = 2)), ).encode('utf-8')) # Create tax_benefit system only now, to be able to debug XML validation errors in above code. tax_benefit_system = TaxBenefitSystem() if tax_benefit_system.preprocess_legislation is not None: tax_benefit_system.preprocess_legislation(legislation_json) legislation_json = legislations.generate_dated_legislation_json(legislation_json, year) legislation_json, errors = legislations.validate_dated_legislation_json(legislation_json, state = conv.default_state) if errors is not None: errors = conv.embed_error(legislation_json, 'errors', errors) if errors is None: raise ValueError(unicode(json.dumps(legislation_json, ensure_ascii = False, indent = 2)).encode( 'utf-8')) raise ValueError(u'{0} for: {1}'.format( unicode(json.dumps(errors, ensure_ascii = False, indent = 2, sort_keys = True)), unicode(json.dumps(legislation_json, ensure_ascii = False, indent = 2)), ).encode('utf-8')) compact_legislation = legislations.compact_dated_node_json(legislation_json) assert compact_legislation is not None def test_legislation_xml_file(): for year in range(2006, datetime.date.today().year + 1): yield check_legislation_xml_file, year if __name__ == '__main__': test_legislation_xml_file() import nose nose.core.runmodule(argv = [__file__, '-v', 'test_legislations:test_legislation_xml_file']) PK'Gc79;9;-openfisca_france/tests/test_cotsoc_sal_cap.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import datetime from openfisca_core import periods from openfisca_france.tests.base import tax_benefit_system tests = [ dict( # test sur un revenu des actions soumises à un prélèvement libératoire de # 21 % (2DA) name = "f2da_2012", period = "2012", input_variables = dict( f2da = 20000, ), output_variables = dict( prelsoc_cap_lib = - (4.5 + 2 + 0.3) * 0.01 * 20000, csg_cap_lib = - .082 * 20000, crds_cap_lib = - .005 * 20000, ), ), dict( name = "f2da_2011", period = "2011", input_variables = dict( f2da = 20000, ), output_variables = dict( prelsoc_cap_lib = - (3.4 + 1.1 + 0.3) * 0.01 * 20000, csg_cap_lib = - .082 * 20000, crds_cap_lib = - .005 * 20000, ), ), dict( name = "f2da_2010", period = "2010", input_variables = dict( f2da = 20000, ), output_variables = dict( prelsoc_cap_lib = - (2.2 + 1.1 + 0.3) * 0.01 * 20000, csg_cap_lib = - .082 * 20000, crds_cap_lib = - .005 * 20000, ), ), # Célibataire sans enfant # test sur un revenu des actions et parts (2DC) dict( name = "f2dc_2013", period = "2013", input_variables = dict( f2dc = 20000, ), output_variables = dict( prelsoc_cap_bar = - 1360, csg_cap_bar = - 1640, crds_cap_bar = - 100, ir_plaf_qf = 330, irpp = - 0, ), ), dict( name = "f2dc_2012", period = "2012", input_variables = dict( f2dc = 20000, ), output_variables = dict( prelsoc_cap_bar = - (4.5 + 2 + 0.3) * 0.01 * 20000, csg_cap_bar = - .082 * 20000, crds_cap_bar = - .005 * 20000, ), ), dict( name = "f2dc_2011", period = "2011", input_variables = dict( f2dc = 20000, ), output_variables = dict( prelsoc_cap_bar = - (3.4 + 1.1 + 0.3) * 0.01 * 20000, csg_cap_bar = - .082 * 20000, crds_cap_bar = - .005 * 20000, ), ), dict( name = "f2dc_2010", period = "2010", input_variables = dict( f2dc = 20000, ), output_variables = dict( prelsoc_cap_bar = - (2.2 + 1.1 + 0.3) * 0.01 * 20000, csg_cap_bar = - .082 * 20000, crds_cap_bar = - .005 * 20000, ) ), # test sur le Revenus imposables des titres non côtés détenus dans le PEA et distributions perçues via # votre entreprise donnant droit à abattement (2fu) dict( name = "f2fu_2013", period = "2013", input_variables = dict( f2fu = 20000, ), output_variables = dict( prelsoc_cap_bar = - 1360, csg_cap_bar = - 1640, crds_cap_bar = - 100, ir_plaf_qf = 330, irpp = 0, ), ), # Autres revenus distribués et revenus des structures soumises hors de # France à un régime fiscal privilégié (2Go) dict( name = "f2go_2013", period = "2013", input_variables = dict( f2go = 20000, ), output_variables = dict( rev_cat_rvcm = 25000, prelsoc_cap_bar = - 1700, csg_cap_bar = - 2050, crds_cap_bar = - 125, ir_plaf_qf = 2150, irpp = - 2150, ), ), dict( name = "f2ts_2013", period = "2013", input_variables = dict( f2ts = 20000, ), output_variables = dict( rev_cat_rvcm = 20000, prelsoc_cap_bar = - 1360, csg_cap_bar = - 1640, crds_cap_bar = - 100, ir_plaf_qf = 1450, irpp = - 1450, ), ), dict( name = "f2ts_2012", period = "2012", input_variables = dict( f2ts = 20000, ), output_variables = dict( prelsoc_cap_bar = - (4.5 + 2 + 0.3) * 0.01 * 20000, csg_cap_bar = - .082 * 20000, crds_cap_bar = - .005 * 20000, ), ), dict( name = "f2ts_2011", period = "2011", input_variables = dict( f2ts = 20000, ), output_variables = dict( prelsoc_cap_bar = - (3.4 + 1.1 + 0.3) * 0.01 * 20000, csg_cap_bar = - .082 * 20000, crds_cap_bar = - .005 * 20000, ), ), dict( name = "f2ts_2010", period = "2010", input_variables = dict( f2ts = 20000, ), output_variables = dict( prelsoc_cap_bar = - (2.2 + 1.1 + 0.3) * 0.01 * 20000, csg_cap_bar = - .082 * 20000, crds_cap_bar = - .005 * 20000, ), ), # test sur les intérêts (2TR) dict( name = "f2ts_2013", period = "2013", input_variables = dict( f2ts = 20000, ), output_variables = dict( prelsoc_cap_bar = - 1360, csg_cap_bar = - 1640, crds_cap_bar = - 100, ir_plaf_qf = 1450, irpp = - 1450, ), ), dict( name = "f2ts_2012", period = "2012", input_variables = dict( f2ts = 20000, ), output_variables = dict( prelsoc_cap_bar = - (4.5 + 2 + 0.3) * 0.01 * 20000, csg_cap_bar = - .082 * 20000, crds_cap_bar = - .005 * 20000, ), ), dict( name = "f2ts_2011", period = "2011", input_variables = dict( f2ts = 20000, ), output_variables = dict( prelsoc_cap_bar = - (3.4 + 1.1 + 0.3) * 0.01 * 20000, csg_cap_bar = - .082 * 20000, crds_cap_bar = - .005 * 20000, ), ), dict( name = "f2ts_2010", period = "2010", input_variables = dict( f2ts = 20000, ), output_variables = dict( prelsoc_cap_bar = - (2.2 + 1.1 + 0.3) * 0.01 * 20000, csg_cap_bar = - .082 * 20000, crds_cap_bar = - .005 * 20000, ), ), # test sur les revenus fonciers (4BA) dict( name = "f4ba_2013", period = "2013", input_variables = dict( f4ba = 20000, ), output_variables = dict( prelsoc_fon = - 1360, csg_fon = - 1640, crds_fon = - 100, ir_plaf_qf = 1450, irpp = - 1450, ), ), dict( name = "f4ba_2012", period = "2012", input_variables = dict( f4ba = 20000, ), output_variables = dict( prelsoc_fon = - (4.5 + 2 + 0.3) * 0.01 * 20000, csg_fon = - .082 * 20000, crds_fon = - .005 * 20000, irpp = - 1461, ), ), dict( name = "f4ba_2011", period = "2011", input_variables = dict( f4ba = 20000, ), output_variables = dict( prelsoc_fon = - (3.4 + 1.1 + 0.3) * 0.01 * 20000, csg_fon = - .082 * 20000, crds_fon = - .005 * 20000, ), ), dict( name = "f4ba_2010", period = "2010", input_variables = dict( f4ba = 20000, ), output_variables = dict( prelsoc_fon = - (2.2 + 1.1 + 0.3) * 0.01 * 20000, csg_fon = - .082 * 20000, crds_fon = - .005 * 20000, ), ), # test (3VG) Plus-values de cession de valeurs mobilières, droits # sociaux et gains assimilés dict( name = "f3vg _2013", period = "2013", input_variables = dict( f3vg = 20000, ), output_variables = dict( prelsoc_pv_mo = - 1360, csg_pv_mo = - 1640, crds_pv_mo = - 100, ir_plaf_qf = 1450, irpp = - 1450, ), ), dict( name = "f3vg _2012", period = "2012", input_variables = dict( f3vg = 20000, ), output_variables = dict( prelsoc_pv_mo = - (4.5 + 2 + 0.3) * 0.01 * 20000, csg_pv_mo = - .082 * 20000, crds_pv_mo = - .005 * 20000, ), ), dict( name = "f3vg _2011", period = "2011", input_variables = dict( f3vg = 20000, ), output_variables = dict( prelsoc_pv_mo = - (3.4 + 1.1 + 0.3) * 0.01 * 20000, csg_pv_mo = - .082 * 20000, crds_pv_mo = - .005 * 20000, ), ), dict( name = "f3vg _2010", period = "2010", input_variables = dict( f3vg = 20000, ), output_variables = dict( prelsoc_pv_mo = - (2.2 + 1.1 + 0.3) * 0.01 * 20000, csg_pv_mo = - .082 * 20000, crds_pv_mo = - .005 * 20000, ), ), dict( name = "f3vg _2006", period = "2006", input_variables = dict( f3vg = 20000, ), output_variables = dict( prelsoc_pv_mo = - 460, csg_pv_mo = - 1640, crds_pv_mo = - 100, ), ), # test sur les plus-values immobilières (3VZ) dict( name = "f3vz_2012", period = "2012", input_variables = dict( f3vz = 20000, ), output_variables = dict( prelsoc_pv_immo = - (4.5 + 2 + 0.3) * 0.01 * 20000, csg_pv_immo = - .082 * 20000, crds_pv_immo = - .005 * 20000, ), ), dict( name = "f3vz_2011", period = "2011", input_variables = dict( f3vz = 20000, ), output_variables = dict( prelsoc_pv_immo = - (3.4 + 1.1 + 0.3) * 0.01 * 20000, csg_pv_immo = - .082 * 20000, crds_pv_immo = - .005 * 20000, ), ), dict( name = "f3vz_2010", period = "2010", input_variables = dict( f3vz = 20000, ), output_variables = dict( prelsoc_pv_immo = - (2.2 + 1.1 + 0.3) * 0.01 * 20000, csg_pv_immo = - .082 * 20000, crds_pv_immo = - .005 * 20000, ), ), dict( name = "f2dc_f2ca_2013", period = "2013", input_variables = dict( f2dc = 20000, f2ca = 5000, ), output_variables = dict( csg_cap_bar = - 1640, crds_cap_bar = - 100, prelsoc_cap_bar = - 1360, rev_cat_rvcm = 7000, irpp = 0, ), ), # Revenus fonciers dict( name = "f4ba_2013", period = "2013", input_variables = dict( f4ba = 20000, ), output_variables = dict( csg_fon = - 1640, crds_fon = - 100, prelsoc_fon = - 1360, ir_plaf_qf = 1450, rev_cat_rfon = 20000, irpp = - 1450, ), ), dict( name = "f4babcd_2013", period = 2013, input_variables = dict( f4ba = 20000, f4bb = 1000, f4bc = 1000, f4bd = 1000, ), output_variables = dict( csg_fon = - 1394, crds_fon = - 85, prelsoc_fon = - 1156, ir_plaf_qf = 1030, rev_cat_rfon = 17000, irpp = - 1030, ), ), dict( name = "f4babcd_2013", period = 2006, input_variables = dict( f4ba = 20000, f4bb = 1000, f4bc = 1000, f4bd = 1000, ), output_variables = dict( csg_fon = - 1394, crds_fon = - 85, prelsoc_fon = - 391, rev_cat_rfon = 17000, irpp = - 1119, ), ), dict( name = "f4be_2013", period = 2013, input_variables = dict( f4be = 10000, ), output_variables = dict( csg_fon = - 574, crds_fon = - 35, prelsoc_fon = - 476, rev_cat_rfon = 7000, irpp = 0, ), ), ] def assert_variable(variable, name, monthly_amount, output): assert abs(output - monthly_amount) < 1, \ "error for {} ({}) : should be {} instead of {} ".format(variable, name, monthly_amount, output) def test_check(): for test_parameters in tests: name = test_parameters["name"] period = test_parameters["period"] parent1 = dict( birth = datetime.date(periods.period(period).start.year - 40, 1, 1), ) foyer_fiscal = dict() foyer_fiscal.update(test_parameters['input_variables']) simulation = tax_benefit_system.new_scenario().init_single_entity( period = period, parent1 = parent1, foyer_fiscal = foyer_fiscal, ).new_simulation(debug = True) for variable, monthly_amount in test_parameters['output_variables'].iteritems(): output = simulation.calculate_add(variable) yield assert_variable, variable, name, monthly_amount, output if __name__ == '__main__': import logging import sys logging.basicConfig(level = logging.ERROR, stream = sys.stdout) import nose nose.core.runmodule(argv = [__file__, '-v', 'test_cotsoc_sal_cap.py']) # nose.core.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'], exit=False) PK'GݤG::#openfisca_france/tests/test_yaml.py#! /usr/bin/env python # -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . """Test YAML files.""" from __future__ import division import collections import copy import logging import os from openfisca_core import conv, periods, scenarios from openfisca_core.tools import assert_near import numpy as np import yaml from . import base log = logging.getLogger(__name__) options_by_dir = collections.OrderedDict(( ( os.path.abspath(os.path.join(os.path.dirname(__file__), 'calculateur_impots')), dict( calculate_output = False, default_absolute_error_margin = 0.5, ignore = True, # TODO: Remove reforms = ['inversion_revenus'], ), ), ( os.path.abspath(os.path.join(os.path.dirname(__file__), 'fiches_de_paie')), dict( calculate_output = False, default_absolute_error_margin = 0.005, ), ), ( os.path.abspath(os.path.join(os.path.dirname(__file__), 'formulas')), dict( calculate_output = False, default_absolute_error_margin = 0.005, ), ), ( os.path.abspath(os.path.join(os.path.dirname(__file__), 'formulas_mes_aides')), dict( calculate_output = False, default_absolute_error_margin = 0.005, ), ), ( os.path.abspath(os.path.join(os.path.dirname(__file__), 'mes-aides.gouv.fr')), dict( calculate_output = True, default_absolute_error_margin = 0.007, ), ), ( os.path.abspath(os.path.join(os.path.dirname(__file__), 'ui.openfisca.fr')), dict( calculate_output = False, default_absolute_error_margin = 0.005, ), ), )) # YAML configuration class folded_unicode(unicode): pass class literal_unicode(unicode): pass def dict_constructor(loader, node): return collections.OrderedDict(loader.construct_pairs(node)) yaml.add_constructor(yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, dict_constructor) yaml.add_representer(collections.OrderedDict, lambda dumper, data: dumper.represent_dict( (copy.deepcopy(key), value) for key, value in data.iteritems() )) yaml.add_representer(dict, lambda dumper, data: dumper.represent_dict( (copy.deepcopy(key), value) for key, value in data.iteritems() )) yaml.add_representer(folded_unicode, lambda dumper, data: dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='>')) yaml.add_representer(literal_unicode, lambda dumper, data: dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='|')) yaml.add_representer(np.ndarray, lambda dumper, data: dumper.represent_list(data.tolist())) yaml.add_representer(periods.Instant, lambda dumper, data: dumper.represent_scalar(u'tag:yaml.org,2002:str', str(data))) yaml.add_representer(periods.Period, lambda dumper, data: dumper.represent_scalar(u'tag:yaml.org,2002:str', str(data))) yaml.add_representer(tuple, lambda dumper, data: dumper.represent_list(data)) yaml.add_representer(unicode, lambda dumper, data: dumper.represent_scalar(u'tag:yaml.org,2002:str', data)) # Functions def assert_near_calculate_output(value, target_value, absolute_error_margin = 0, message = '', relative_error_margin = None): # Redefinition of assert_near that accepts to compare monthy values with yearly values. assert absolute_error_margin is not None or relative_error_margin is not None if isinstance(value, (list, tuple)): value = np.array(value) if isinstance(target_value, (list, tuple)): target_value = np.array(target_value) if isinstance(message, unicode): message = message.encode('utf-8') if isinstance(value, np.ndarray): if absolute_error_margin is not None: assert (abs(target_value - value) <= absolute_error_margin).all() \ or (abs(target_value - value * 12) <= absolute_error_margin).all() \ or (abs(target_value - value / 12) <= absolute_error_margin).all(), \ '{}{} differs from {} with an absolute margin {} > {}'.format(message, value, target_value, abs(target_value - value), absolute_error_margin) if relative_error_margin is not None: assert (abs(target_value - value) <= abs(relative_error_margin * target_value)).all() \ or (abs(target_value - value * 12) <= abs(relative_error_margin * target_value)).all() \ or (abs(target_value - value / 12) <= abs(relative_error_margin * target_value)).all(), \ '{}{} differs from {} with a relative margin {} > {}'.format(message, value, target_value, abs(target_value - value), abs(relative_error_margin * target_value)) else: if absolute_error_margin is not None: assert abs(target_value - value) <= absolute_error_margin \ or abs(target_value - value * 12) <= absolute_error_margin \ or abs(target_value - value / 12) <= absolute_error_margin, \ '{}{} differs from {} with an absolute margin {} > {}'.format(message, value, target_value, abs(target_value - value), absolute_error_margin) if relative_error_margin is not None: assert abs(target_value - value) <= abs(relative_error_margin * target_value) \ or abs(target_value - value * 12) <= abs(relative_error_margin * target_value) \ or abs(target_value - value / 12) <= abs(relative_error_margin * target_value), \ '{}{} differs from {} with a relative margin {} > {}'.format(message, value, target_value, abs(target_value - value), abs(relative_error_margin * target_value)) def check(name, period_str, test, force): scenario = test['scenario'] scenario.suggest() simulation = scenario.new_simulation(debug = True) output_variables = test.get(u'output_variables') if output_variables is not None: output_variables_name_to_ignore = test.get(u'output_variables_name_to_ignore') or set() for variable_name, expected_value in output_variables.iteritems(): if not force and variable_name in output_variables_name_to_ignore: continue if isinstance(expected_value, dict): for requested_period, expected_value_at_period in expected_value.iteritems(): assert_near( simulation.calculate(variable_name, requested_period), expected_value_at_period, absolute_error_margin = test.get('absolute_error_margin'), message = u'{}@{}: '.format(variable_name, requested_period), relative_error_margin = test.get('relative_error_margin'), ) else: assert_near( simulation.calculate(variable_name), expected_value, absolute_error_margin = test.get('absolute_error_margin'), message = u'{}@{}: '.format(variable_name, period_str), relative_error_margin = test.get('relative_error_margin'), ) def check_calculate_output(name, period_str, test, force): scenario = test['scenario'] scenario.suggest() simulation = scenario.new_simulation(debug = True) output_variables = test.get(u'output_variables') if output_variables is not None: output_variables_name_to_ignore = test.get(u'output_variables_name_to_ignore') or set() for variable_name, expected_value in output_variables.iteritems(): if not force and variable_name in output_variables_name_to_ignore: continue if isinstance(expected_value, dict): for requested_period, expected_value_at_period in expected_value.iteritems(): assert_near_calculate_output( simulation.calculate_output(variable_name, requested_period), expected_value_at_period, absolute_error_margin = test.get('absolute_error_margin'), message = u'{}@{}: '.format(variable_name, requested_period), relative_error_margin = test.get('relative_error_margin'), ) else: assert_near_calculate_output( simulation.calculate_output(variable_name), expected_value, absolute_error_margin = test.get('absolute_error_margin'), message = u'{}@{}: '.format(variable_name, period_str), relative_error_margin = test.get('relative_error_margin'), ) def test(force = False, name_filter = None, options_by_path = None): if isinstance(name_filter, str): name_filter = name_filter.decode('utf-8') if options_by_path is None: options_by_path = options_by_dir for path, options in options_by_path.iteritems(): if not force and options.get('ignore', False): log.info(u'Ignoring {}'.format(path)) continue if not os.path.exists(path): log.warning(u'Skipping missing {}'.format(path)) continue if os.path.isdir(path): yaml_paths = [ os.path.join(path, filename) for filename in sorted(os.listdir(path)) if filename.endswith('.yaml') ] else: yaml_paths = [path] reform_keys = options.get('reforms') tax_benefit_system_for_path = base.get_cached_composed_reform( reform_keys = reform_keys, tax_benefit_system = base.tax_benefit_system, ) if reform_keys is not None else base.tax_benefit_system for yaml_path in yaml_paths: filename_core = os.path.splitext(os.path.basename(yaml_path))[0] with open(yaml_path) as yaml_file: tests = yaml.load(yaml_file) tests, error = conv.pipe( conv.make_item_to_singleton(), conv.uniform_sequence( conv.noop, drop_none_items = True, ), )(tests) if error is not None: embedding_error = conv.embed_error(tests, u'errors', error) assert embedding_error is None, embedding_error raise ValueError("Error in test {}:\n{}".format(yaml_path, yaml.dump(tests, allow_unicode = True, default_flow_style = False, indent = 2, width = 120))) for test in tests: test, error = scenarios.make_json_or_python_to_test( tax_benefit_system = tax_benefit_system_for_path, default_absolute_error_margin = options['default_absolute_error_margin'], )(test) if error is not None: embedding_error = conv.embed_error(test, u'errors', error) assert embedding_error is None, embedding_error raise ValueError("Error in test {}:\n{}".format(yaml_path, yaml.dump(test, allow_unicode = True, default_flow_style = False, indent = 2, width = 120))) if not force and test.get(u'ignore', False): continue if name_filter is not None and name_filter not in filename_core \ and name_filter not in (test.get('name', u'')) \ and name_filter not in (test.get('keywords', [])): continue checker = check_calculate_output if options['calculate_output'] else check yield checker, test.get('name') or filename_core, unicode(test['scenario'].period), test, force if __name__ == "__main__": import argparse import logging import sys parser = argparse.ArgumentParser(description = __doc__) parser.add_argument('paths', help = "path (file or directory) of tests to execute", metavar = 'PATH', nargs = '*') parser.add_argument('-f', '--force', action = 'store_true', default = False, help = 'force testing of tests with "ignore" flag and formulas belonging to "ignore_output_variables" list') parser.add_argument('-n', '--name', default = None, help = "partial name of tests to execute") parser.add_argument('-v', '--verbose', action = 'store_true', default = False, help = "increase output verbosity") args = parser.parse_args() logging.basicConfig(level = logging.DEBUG if args.verbose else logging.WARNING, stream = sys.stdout) if args.paths: options_by_path = collections.OrderedDict() for path in args.paths: path = os.path.abspath(path).rstrip(os.sep) dir = path if os.path.isdir(path) else os.path.dirname(path) options = options_by_dir.get(dir) if options is None: options = dict( calculate_output = False, default_absolute_error_margin = 0.005, ) options_by_path[path] = options else: options_by_path = None tests_found = False for test_index, (function, name, period_str, test, force) in enumerate( test( force = args.force, name_filter = args.name, options_by_path = options_by_path, ), 1): keywords = test.get('keywords', []) title = "Test {}: {}{} - {}".format( test_index, u'[{}] '.format(u', '.join(keywords)).encode('utf-8') if keywords else '', name.encode('utf-8'), period_str, ) print("=" * len(title)) print(title) print("=" * len(title)) function(name, period_str, test, force) tests_found = True if not tests_found: print("No test found!") sys.exit(1) sys.exit(0) PKF>#'UUopenfisca_france/tests/utils.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import datetime from openfisca_core import periods from openfisca_core.tools import assert_near from . import base def check_calculation(variable, calculated_value, expected_value, error_margin): assert_near(calculated_value, expected_value, absolute_error_margin = error_margin) def process_tests_list(tests_list, monthly_amount = False, default_error_margin = 1, forced_error_margin = None): for test in tests_list: error_margin = forced_error_margin if forced_error_margin else test.pop("error_margin", default_error_margin) simulation = simulation_from_test(test) for variable, expected_value in test['output_vars'].iteritems(): calculated_value = simulation.calculate(variable).sum() / (1 * (not monthly_amount) + 12 * monthly_amount) yield check_calculation, variable, calculated_value, expected_value, error_margin def simulation_from_test(test, monthly_amount = False, default_error_margin = 1, forced_error_margin = None): year = test["year"] parent1 = dict(birth = datetime.date(year - 40, 1, 1)) menage = dict() foyer_fiscal = dict() for variable, value in test['input_vars'].iteritems(): if variable == "age": parent1['birth'] = datetime.date(year - value, 1, 1) elif base.tax_benefit_system.column_by_name[variable].entity == 'men': menage[variable] = value elif base.tax_benefit_system.column_by_name[variable].entity == 'ind': parent1[variable] = value # TODO: if the person is a child elif base.tax_benefit_system.column_by_name[variable].entity == 'foy': foyer_fiscal[variable] = value simulation = base.tax_benefit_system.new_scenario().init_single_entity( period = year, parent1 = parent1, menage = menage, foyer_fiscal = foyer_fiscal, ).new_simulation(debug = True) return simulation def check_simulation_variable(description, simulation, variable, expected_value, error_margin): calculated_value = simulation.calculate(variable).sum() yield check_calculation, variable, calculated_value, expected_value, error_margin def is_number(s): try: float(s) return True except ValueError: return False def zip_period_with_values(period_str, values): period = periods.period(period_str) size = period.size if not isinstance(values, list): assert is_number(values) casted_values = [values / size] * size else: if size < len(values) and size == 1: size = len(values) casted_values = values period_list = [str(period.start.period(period.unit).offset(index)) for index in range(size)] return dict(zip(period_list, casted_values)) PKF` ` -openfisca_france/tests/test_decompositions.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import json import os import xml.etree.ElementTree from openfisca_core import conv, decompositions, decompositionsxml from openfisca_france.tests import base def check_decomposition_xml_file(file_path): decomposition_tree = xml.etree.ElementTree.parse(os.path.join(file_path)) decomposition_xml_json = conv.check(decompositionsxml.xml_decomposition_to_json)(decomposition_tree.getroot(), state = conv.default_state) decomposition_xml_json, errors = decompositionsxml.make_validate_node_xml_json(base.tax_benefit_system)( decomposition_xml_json, state = conv.default_state) if errors is not None: errors = conv.embed_error(decomposition_xml_json, 'errors', errors) if errors is None: raise ValueError(unicode(json.dumps(decomposition_xml_json, ensure_ascii = False, indent = 2)).encode('utf-8')) raise ValueError(u'{0} for: {1}'.format( unicode(json.dumps(errors, ensure_ascii = False, indent = 2, sort_keys = True)), unicode(json.dumps(decomposition_xml_json, ensure_ascii = False, indent = 2)), ).encode('utf-8')) decomposition_json = decompositionsxml.transform_node_xml_json_to_json(decomposition_xml_json) decomposition_json, errors = decompositions.make_validate_node_json(base.tax_benefit_system)( decomposition_json, state = conv.default_state) if errors is not None: errors = conv.embed_error(decomposition_json, 'errors', errors) if errors is None: raise ValueError(unicode(json.dumps(decomposition_json, ensure_ascii = False, indent = 2)).encode('utf-8')) raise ValueError(u'{0} for: {1}'.format( unicode(json.dumps(errors, ensure_ascii = False, indent = 2, sort_keys = True)), unicode(json.dumps(decomposition_json, ensure_ascii = False, indent = 2)), ).encode('utf-8')) def test_decomposition_xml_files(): decompositions_directory = base.tax_benefit_system.DECOMP_DIR files_path = [ os.path.join( decompositions_directory, base.tax_benefit_system.DEFAULT_DECOMP_FILE, ), os.path.join( decompositions_directory, 'fiche_de_paie_decomposition.xml', ) ] for file_path in files_path: yield check_decomposition_xml_file, file_path if __name__ == '__main__': import nose nose.core.runmodule(argv = [__file__, '-v', 'test_decompositions:test_decomposition_xml_files']) PKxIE&openfisca_france/tests/ipp/__init__.pyPK'GρBB*openfisca_france/tests/ipp/taxipp_utils.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import os import pdb from numpy import array from pandas import DataFrame, ExcelFile, read_stata, Series from ... import init_country from ...surveys import SurveyScenario current_dir = os.path.dirname(os.path.realpath(__file__)) variables_corresp = os.path.join(current_dir, 'correspondances_variables.xlsx') def build_ipp2of_variables(): ''' Création du dictionnaire dont les clefs sont les noms des variables IPP et les arguments ceux des variables OF ''' def _dic_corresp(onglet): names = ExcelFile(variables_corresp).parse(onglet) return dict(array(names.loc[names['equivalence'].isin([1, 5, 8]), ['var_TAXIPP', 'var_OF']])) ipp2of_input_variables = _dic_corresp('input') ipp2of_output_variables = _dic_corresp('output') return ipp2of_input_variables, ipp2of_output_variables def compare(path_dta_output, ipp2of_output_variables, param_scenario, simulation, threshold = 1.5, verbose = True): ''' Fonction qui comparent les calculs d'OF et et de TaxIPP Gestion des outputs ''' ipp_output = read_stata(path_dta_output).sort(['id_foyf', 'id_indiv'], ascending = [True, False]).reset_index() if 'salbrut' in param_scenario.items(): if param_scenario['option'] == 'brut': del ipp2of_output_variables['sal_brut'] del ipp2of_output_variables['chom_brut'] del ipp2of_output_variables['rst_brut'] scenario = param_scenario['scenario'] if 'activite' in param_scenario: act = param_scenario['activite'] else: act = 0 if 'activite_C' in param_scenario: act_conj = param_scenario['activite_C'] else: act_conj = 0 check_list_commun = ['isf_foy', 'irpp_tot_foy', 'irpp_bar_foy', 'ppe_brut_foy', 'ppe_net_foy', 'irpp_ds_foy', 'taxe_HR_foy'] # # 'decote_irpp_foy', check_list_minima = ['rsa_foys', 'rsa_act_foys', 'mv_foys', 'rsa_logt'] # , 'y_rmi_rsa' check_list_af = [ 'paje_foys', 'paje_base_foys', 'paje_clca_foys', 'af_foys', 'nenf_prest', 'biact_or_isole', 'alf_foys', 'ars_foys', 'asf_foys', 'api', 'apje_foys', # 'af_diff', 'af_maj', ] check_list_sal = [ 'csp_exo', 'csg_sal_ded', 'css', 'css_co', 'css_nco', 'crds_sal', 'csg_sal_nonded', 'sal_irpp', 'sal_brut', 'csp_mo_vt', 'csp_nco', 'csp_co', 'vtmo', 'sal_superbrut', 'sal_net', 'ts', 'tehr', # 'csg_sal_ded'] #, 'irpp_net_foy', 'af_foys']- cotisations salariales : 'css', 'css_nco', 'css_co', # 'sal_superbrut' 'csp', ] # 'decote_irpp_foy' : remarque par d'équivalence Taxipp check_list_chom = ['csg_chom_ded', 'chom_irpp', 'chom_brut', 'csg_chom_nonded', 'crds_chom'] check_list_ret = ['csg_pens_ded', 'pension_irpp', 'pension_net', 'csg_pens_nonded', 'crds_pens'] check_list_cap = ['isf_foy', 'isf_brut_foy', 'isf_net_foy', 'csg_patr_foy', 'crds_patr_foy', 'csk_patr_foy', 'csg_plac_foy', 'crds_plac_foy', 'csk_plac_foy'] if 'salbrut' in param_scenario.items(): if param_scenario['option'] == 'brut': check_list_sal.remove('sal_brut') check_list_chom.remove('chom_brut') id_list = act + act_conj lists = { 0: check_list_sal, 1: check_list_sal + check_list_chom, 2: check_list_chom, 3: check_list_sal + check_list_ret, 4: check_list_chom + check_list_ret, 6: check_list_ret, } check_list = lists[id_list] if (scenario == 'celib') & (act == 3): check_list = check_list_ret check_list += check_list_minima + check_list_commun + check_list_af + check_list_cap def _relevant_input_variables(simulation): input_variables = {'ind': list(), 'foy': list(), 'men': list()} len_indiv = simulation.entity_by_key_plural['individus'].count len_men = simulation.entity_by_key_plural['menages'].count for name, col in simulation.tax_benefit_system.column_by_name.iteritems(): # print name, col holder = simulation.get_holder(name, default = None) if holder is not None and holder.array is not None: if not all(holder.array == col.default): if len(holder.array) == len_indiv: input_variables['ind'].append(name) elif len(holder.array) == len_men: input_variables['men'].append(name) else: input_variables['foy'].append(name) return input_variables def _conflict_by_entity(simulation, of_var_holder, ipp_var, pb_calcul, ipp_output = ipp_output): of_var_series = Series(of_var_holder.array) entity = of_var_holder.entity if entity.is_persons_entity: quimen_series = Series(simulation.get_holder('quimen').array) of_var_series = of_var_series[quimen_series.isin([0, 1])].reset_index(drop = True) ipp_var_series = ipp_output[ipp_var] # print ipp_var # print ipp_var_series # print of_var_series # print "\n" else: quient_series = Series(simulation.get_holder('qui' + entity.symbol).array) quient_0 = quient_series[quient_series == 0] quient_1 = quient_series[quient_series == 1] long = range(len(quient_0)) if len(quient_1) > 0: long = [2 * x for x in long] ipp_var_series = ipp_output.loc[long, ipp_var].reset_index(drop = True) conflict = ((ipp_var_series.abs() - of_var_series.abs()).abs() > threshold) idmen = simulation.get_holder('idmen').array conflict_selection = DataFrame({'idmen': idmen, 'idfoy': simulation.get_holder('idfoy').array}) conflict_men = conflict_selection.loc[conflict[conflict == True].index, 'idmen'].drop_duplicates().values # noqa conflict_foy = conflict_selection.loc[conflict[conflict == True].index, 'idfoy'].drop_duplicates().values # noqa if (len(ipp_var_series[conflict]) != 0): if verbose: print u"Le calcul de {} pose problème : ".format(of_var) print DataFrame({ "IPP": ipp_var_series[conflict], "OF": of_var_series[conflict], "diff.": ipp_var_series[conflict].abs() - of_var_series[conflict].abs(), }).to_string() relevant_variables = _relevant_input_variables(simulation) print relevant_variables input = {} for entity in ['ind', 'men', 'foy']: dic = {} for variable in relevant_variables[entity]: dic[variable] = simulation.get_holder(variable).array input[entity] = DataFrame(dic) print "Variables individuelles associées à ce ménage:" print input['ind'].loc[input['ind']['idmen'].isin(conflict_men)].to_string() # .loc[conflict[conflict == True].index].to_string() if not input['men'].empty: print "Variables associées au ménage:" print input['men'].loc[conflict_men].to_string() if not input['foy'].empty: print "Variables associées au foyer fiscal:" print input['foy'].loc[conflict_foy].to_string() pb_calcul += [of_var] # if of_var == 'taxes_sal': # print "taxes_sal", output1.to_string # pdb.set_trace() pb_calcul = [] for ipp_var in check_list: # in ipp2of_output_variables.keys(): of_var = ipp2of_output_variables[ipp_var] of_var_holder = simulation.compute(of_var) _conflict_by_entity(simulation, of_var_holder, ipp_var, pb_calcul) if verbose: print pb_calcul return pb_calcul def run_OF(ipp2of_input_variables, path_dta_input, param_scenario = None, dic = None, datesim = None, option = 'test_dta'): ''' Lance le calculs sur OF à partir des cas-types issues de TaxIPP input : base .dta issue de l'étape précédente ''' def _test_of_dta(dta_input, dic): ''' Cette fonction teste que la table .dta trouvée correspond au bon scénario ''' data = read_stata(dta_input) dic_dta = data.loc[0, 'dic_scenar'] if str(dic) != str(dic_dta): print "La base .dta permettant de lancer la simulation OF est absente " print "La base s'en rapprochant le plus a été construite avec les paramètres : ", dic_dta pdb.set_trace() else: data = data.drop('dic_scenar', 1).sort(['id_foyf', 'id_indiv'], ascending = [True, False]) return data def _scenar_dta(dta_input): ''' cette fonction identifie le scenario enregistré dans la table d'input ''' data = read_stata(dta_input) dic_dta = data.loc[0, 'dic_scenar'] data = data.drop('dic_scenar', 1).sort(['id_foyf', 'id_indiv'], ascending = [True, False]) return dic_dta, data if option == 'test_dta': data_IPP = _test_of_dta(path_dta_input, dic) if option == 'list_dta': dic_scenar, data_IPP = _scenar_dta(path_dta_input) dict_scenar = dict() expression = "dict_scenar.update(" + dic_scenar + ")" eval(expression) datesim = dict_scenar['datesim'] param_scenario = dict_scenar if 'option' in param_scenario.keys() and param_scenario['option'] == 'brut': TaxBenefitSystem = init_country(start_from = "brut") tax_benefit_system = TaxBenefitSystem() del ipp2of_input_variables['sal_irpp_old'] ipp2of_input_variables['sal_brut'] = 'salbrut' ipp2of_input_variables['chom_brut'] = 'chobrut' ipp2of_input_variables['pension_brut'] = 'rstbrut' else: tax_benefit_system_class = init_country() tax_benefit_system = tax_benefit_system_class() openfisca_survey = build_input_OF(data_IPP, ipp2of_input_variables, tax_benefit_system) openfisca_survey = openfisca_survey.fillna(0) # .sort(['idfoy']) # simulation = surveys.new_simulation_from_survey_data_frame( # # debug = True, # survey = openfisca_survey, # tax_benefit_system = tax_benefit_system, # year = datesim, # ) survey_scenario = SurveyScenario().init_from_data_frame( input_data_frame = openfisca_survey, tax_benefit_system_class = tax_benefit_system_class, year = datesim, ) if option == 'list_dta': return survey_scenario.new_simulation(), param_scenario else: return survey_scenario.new_simulation() def build_input_OF(data, ipp2of_input_variables, tax_benefit_system): def _qui(data, entity): qui = "qui" + entity id = "id" + entity data[qui] = 2 data.loc[data['decl'] == 1, qui] = 0 data.loc[data['conj'] == 1, qui] = 1 if entity == "men": data.loc[data['con2'] == 1, qui] = 1 j = 2 while any(data.duplicated([qui, id])): data.loc[data.duplicated([qui, id]), qui] = j + 1 j += 1 return data[qui] def _statut_occupation(data): data["statut_occupation"] = 0 data.loc[data['proprio_empr'] == 1, 'statut_occupation'] = 1 data.loc[data['proprio'] == 1, 'statut_occupation'] = 2 data.loc[data['locat'] == 1, 'statut_occupation'] = 4 data.loc[data['loge'] == 1, 'statut_occupation'] = 6 return data['statut_occupation'] def _compl(var): var = 1 - var var = var.astype(int) return var def _count_by_entity(data, var, entity, bornes): ''' Compte le nombre de 'var compris entre les 'bornes' au sein de l''entity' ''' id = 'id' + entity qui = 'qui' + entity data.index = data[id] cond = (bornes[0] <= data[var]) & (data[var] <= bornes[1]) & (data[qui] > 1) col = DataFrame(data.loc[cond, :].groupby(id).size(), index = data.index).fillna(0) col.reset_index() return col def _count_enf(data): data["f7ea"] = _count_by_entity(data, 'age', 'foy', [11, 14]) # nb enfants ff au collège (11-14) data["f7ec"] = _count_by_entity(data, 'age', 'foy', [15, 17]) # #nb enfants ff au lycée 15-17 data["f7ef"] = _count_by_entity(data, 'age', 'foy', [18, 99]) # nb enfants ff enseignement sup > 17 data = data.drop(["nenf1113", "nenf1415", "nenf1617", "nenfmaj1819", "nenfmaj20", "nenfmaj21plus", "nenfnaiss", "nenf02", "nenf35", "nenf610"], axis = 1) data.index = range(len(data)) return data def _workstate(data): # TODO: titc should be filled in to deal with civil servant data['chpub'] = 0 data.loc[data['public'] == 1, 'chpub'] = 1 data.loc[data['public'] == 0, 'chpub'] = 6 # Activité : [0'Actif occupé', 1'Chômeur', 2'Étudiant, élève', 3'Retraité', 4'Autre inactif']), default = 4) # act5 : [0"Salarié",1"Indépendant",2"Chômeur",3"Retraité",4"Inactif"] data['act5'] = 0 data.loc[(data['activite'] == 0) & (data['stat_prof'] == 1), 'act5'] = 1 data.loc[data['activite'] == 1, 'act5'] = 2 data.loc[data['activite'] == 3, 'act5'] = 3 data.loc[data['activite'].isin([2, 4]), 'act5'] = 4 data['statut'] = 8 data.loc[data['public'] == 1, 'statut'] = 11 # [0"Non renseigné/non pertinent",1"Exonéré",2"Taux réduit",3"Taux plein"] data['taux_csg_remplacement'] = 3 data.loc[data['csg_exo'] == 1, 'taux_csg_remplacement'] = 1 data.loc[data['csg_part'] == 1, 'taux_csg_remplacement'] = 2 data = data.drop(['csg_tout', 'csg_exo', 'csg_part'], axis = 1) # data['ebic_impv'] = 20000 data['exposition_accident'] = 0 return data def _var_to_ppe(data): data['ppe_du_sa'] = 0 data.loc[data['stat_prof'] == 0, 'ppe_du_sa'] = data.loc[data['stat_prof'] == 0, 'nbh'] data['ppe_du_ns'] = 0 data.loc[data['stat_prof'] == 1, 'ppe_du_ns'] = data.loc[data['stat_prof'] == 1, 'nbj'] data['ppe_tp_sa'] = 0 data.loc[(data['stat_prof'] == 0) & (data['nbh'] >= 151.67 * 12), 'ppe_tp_sa'] = 1 data['ppe_tp_ns'] = 0 data.loc[(data['stat_prof'] == 1) & (data['nbj'] >= 360), 'ppe_tp_ns'] = 1 return data def _var_to_pfam(data): data['inactif'] = 0 data.loc[(data['activite'].isin([3, 4, 5, 6])), 'inactif'] = 1 data.loc[(data['activite'] == 1) & (data['choi'] == 0), 'inactif'] = 1 data.loc[(data['activite'] == 0) & (data['salaire_imposable'] == 0), 'inactif'] = 1 data['partiel1'] = 0 data.loc[(data['nbh'] / 12 <= 77) & (data['nbh'] / 12 > 0), 'partiel1'] = 1 data['partiel2'] = 0 data.loc[(data['nbh'] / 12 <= 151) & (data['nbh'] / 12 > 77), 'partiel2'] = 1 return data data.rename(columns = ipp2of_input_variables, inplace = True) data['quifoy'] = _qui(data, 'foy') min_idfoy = data["idfoy"].min() if min_idfoy > 0: data["idfoy"] -= min_idfoy data['quimen'] = _qui(data, 'men') min_idmen = data["idmen"].min() if min_idmen > 0: data["idmen"] -= min_idmen data["idfam"] = data["idmen"] data["quifam"] = data['quimen'] # print data[['idfoy','idmen', 'quimen','quifoy', 'decl', 'conj', 'con2']].to_string() data['statut_occupation'] = _statut_occupation(data) data = _count_enf(data) data = _workstate(data) data["caseN"] = _compl(data["caseN"]) data = _var_to_ppe(data) data = _var_to_pfam(data) data['invalide'] = 0 variables_to_drop = [ variable for variable in data.columns if variable not in tax_benefit_system.column_by_name ] data = data.drop(variables_to_drop, axis = 1) # data.rename(columns = {"id_conj" : "conj"}, inplace = True) data['age_en_mois'] = data['age'] * 12 return data PKYcE*openfisca_france/tests/reforms/__init__.pyPK'G\5openfisca_france/tests/reforms/test_trannoy_wasmer.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program, If not, see . import datetime from openfisca_core import periods from openfisca_core.tools import assert_near from openfisca_france.tests import base def test_charge_loyer(): year = 2013 reform = base.get_cached_reform( reform_key = 'trannoy_wasmer', tax_benefit_system = base.tax_benefit_system, ) scenario = reform.new_scenario().init_single_entity( axes = [ dict( count = 10, max = 30000, min = 0, name = 'salaire_de_base', ), ], period = periods.period('year', year), parent1 = dict(birth = datetime.date(year - 40, 1, 1)), parent2 = dict(birth = datetime.date(year - 40, 1, 1)), enfants = [ dict(birth = datetime.date(year - 9, 1, 1)), dict(birth = datetime.date(year - 9, 1, 1)), ], menage = dict( loyer = 1000, ), ) reform_simulation = scenario.new_simulation(debug = True) absolute_error_margin = 0.01 reform_charge_loyer = reform_simulation.calculate('charge_loyer') assert_near(reform_charge_loyer, [1000] * 10, absolute_error_margin = absolute_error_margin) if __name__ == '__main__': import logging import sys logging.basicConfig(level = logging.ERROR, stream = sys.stdout) test_charge_loyer() PK'G 2 2 8openfisca_france/tests/reforms/test_parametric_reform.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import datetime from openfisca_core import periods, reforms from openfisca_france.tests.base import assert_near, tax_benefit_system def test_parametric_reform(): def modify_legislation_json(reference_legislation_json_copy): # FIXME update_legislation is deprecated. reform_legislation_json = reforms.update_legislation( legislation_json = reference_legislation_json_copy, path = ('children', 'ir', 'children', 'bareme', 'brackets', 0, 'rate'), period = simulation_period, value = 1, ) return reform_legislation_json simulation_year = 2013 simulation_period = periods.period('year', simulation_year) Reform = reforms.make_reform( key = 'ir_100_tranche_1', name = u"Imposition à 100% dès le premier euro et jusqu'à la fin de la 1ère tranche", reference = tax_benefit_system, ) reform = Reform() reform.modify_legislation_json(modifier_function = modify_legislation_json) scenario = reform.new_scenario().init_single_entity( axes = [ dict( count = 3, name = 'salaire_imposable', max = 100000, min = 0, ), ], period = simulation_period, parent1 = dict(birth = datetime.date(simulation_year - 40, 1, 1)), ) reference_simulation = scenario.new_simulation(debug = True, reference = True) assert_near(reference_simulation.calculate('impo'), [0, -7889.20019531, -23435.52929688], absolute_error_margin = .01) reform_simulation = scenario.new_simulation(debug = True) assert_near(reform_simulation.calculate('impo'), [0, -13900.20019531, -29446.52929688], absolute_error_margin = .0001) if __name__ == '__main__': import logging import sys logging.basicConfig(level = logging.ERROR, stream = sys.stdout) test_parametric_reform() PK'Gҧ .openfisca_france/tests/reforms/test_cesthra.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program, If not, see . import datetime from openfisca_core import periods from openfisca_france.tests import base def test_cesthra_invalidee(): year = 2012 period = periods.period('year', year) reform = base.get_cached_reform( reform_key = 'cesthra_invalidee', tax_benefit_system = base.tax_benefit_system, ) scenario = reform.new_scenario().init_single_entity( axes = [ dict( count = 10, max = 30000, min = 0, name = 'salaire_imposable', ), ], period = period, parent1 = dict(birth = datetime.date(year - 40, 1, 1)), parent2 = dict(birth = datetime.date(year - 40, 1, 1)), enfants = [ dict(birth = datetime.date(year - 9, 1, 1)), dict(birth = datetime.date(year - 9, 1, 1)), ], ) reference_simulation = scenario.new_simulation(debug = True, reference = True) reference_impo = reference_simulation.calculate('impo') assert reference_impo is not None reference_revdisp = reference_simulation.calculate('revdisp', period = period) assert reference_revdisp is not None reform_simulation = scenario.new_simulation(debug = True) reform_impo = reform_simulation.calculate('impo') assert reform_impo is not None reform_revdisp = reform_simulation.calculate('revdisp', period = period) assert reform_revdisp is not None if __name__ == '__main__': import logging import sys logging.basicConfig(level = logging.ERROR, stream = sys.stdout) test_cesthra_invalidee() PK'Gʔ .openfisca_france/tests/reforms/test_plf2015.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import datetime from nose.tools import assert_less from openfisca_core import periods from openfisca_france.tests import base def test(year = 2014): max_sal = 20000 count = 2 people = 1 reform = base.get_cached_reform( reform_key = 'plf2015', tax_benefit_system = base.tax_benefit_system, ) scenario = reform.new_scenario().init_single_entity( axes = [ dict( count = count, max = max_sal, min = 0, name = 'salaire_imposable', ), ], period = periods.period('year', year), parent1 = dict(birth = datetime.date(year - 40, 1, 1)), parent2 = dict(birth = datetime.date(year - 40, 1, 1)) if people >= 2 else None, enfants = [ dict(birth = datetime.date(year - 9, 1, 1)) if people >= 3 else None, dict(birth = datetime.date(year - 9, 1, 1)) if people >= 4 else None, ] if people >= 3 else None, ) reference_simulation = scenario.new_simulation(debug = True, reference = True) reform_simulation = scenario.new_simulation(debug = True) error_margin = 0.1 impo = reference_simulation.calculate('impo') reform_impo = reform_simulation.calculate('impo') print impo print reform_impo boum assert_less(max(abs(impo - reform_impo)), error_margin) if __name__ == '__main__': import logging import sys logging.basicConfig(level = logging.ERROR, stream = sys.stdout) test() PK'GD2openfisca_france/tests/reforms/test_net_to_brut.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import datetime from openfisca_core import periods from openfisca_core.tools import assert_near from openfisca_france.model.base import CAT from openfisca_france.tests import base from openfisca_france.reforms import inversion_revenus def check_chonet_to_chobrut(count, chobrut_max, chobrut_min, year): scenario_args = dict( axes = [ dict( count = count, name = 'chobrut', max = chobrut_max, min = chobrut_min, ), ], period = "{}-01".format(year), parent1 = dict( birth = datetime.date(year - 40, 1, 1), ), ) simulation = base.tax_benefit_system.new_scenario().init_single_entity( **scenario_args ).new_simulation(debug = True) chobrut = simulation.get_holder('chobrut').array chonet = simulation.calculate('chonet') inversion_reform = base.get_cached_reform( reform_key = 'inversion_revenus', tax_benefit_system = base.tax_benefit_system, ) inverse_simulation = inversion_reform.new_scenario().init_single_entity( **scenario_args ).new_simulation(debug = True) inverse_simulation.get_holder('chobrut').delete_arrays() inverse_simulation.get_or_new_holder('chonet').array = chonet new_chobrut = inverse_simulation.calculate('chobrut') assert_near(new_chobrut, chobrut, absolute_error_margin = 0.1) def test_chonet_to_chobrut(): count = 101 chobrut_max = 5000 chobrut_min = 2000 for year in range(2006, 2015): yield check_chonet_to_chobrut, count, chobrut_max, chobrut_min, year def check_rstnet_to_rstbrut(count, rstbrut_max, rstbrut_min, year): scenario_args = dict( axes = [ dict( count = count, name = 'rstbrut', max = rstbrut_max, min = rstbrut_min, ), ], period = "{}-01".format(year), parent1 = dict( birth = datetime.date(year - 40, 1, 1), ), ) simulation = base.tax_benefit_system.new_scenario().init_single_entity( **scenario_args ).new_simulation(debug = True) rstbrut = simulation.get_holder('rstbrut').array rstnet = simulation.calculate('rstnet') inversion_reform = base.get_cached_reform( reform_key = 'inversion_revenus', tax_benefit_system = base.tax_benefit_system, ) inverse_simulation = inversion_reform.new_scenario().init_single_entity( **scenario_args ).new_simulation(debug = True) inverse_simulation.get_holder('rstbrut').delete_arrays() inverse_simulation.get_or_new_holder('rstnet').array = rstnet new_rstbrut = inverse_simulation.calculate('rstbrut') assert_near(new_rstbrut, rstbrut, absolute_error_margin = 0.1) def test_rstnet_to_rstbrut(): count = 101 rstbrut_max = 5000 rstbrut_min = 0 for year in range(2006, 2015): yield check_rstnet_to_rstbrut, count, rstbrut_max, rstbrut_min, year def check_salaire_net_to_salaire_de_base(count, salaire_de_base_max, salaire_de_base_min, type_sal, year): period = periods.period("{}-01".format(year)) scenario_args = dict( axes = [ dict( count = count, name = 'salaire_de_base', max = salaire_de_base_max, min = salaire_de_base_min, ), ], period = period, parent1 = dict( birth = datetime.date(year - 40, 1, 1), type_sal = type_sal, ), ) simulation = base.tax_benefit_system.new_scenario().init_single_entity( **scenario_args ).new_simulation() salaire_de_base = simulation.get_holder('salaire_de_base').array smic_horaire = simulation.legislation_at(period.start).cotsoc.gen.smic_h_b smic_mensuel = smic_horaire * 35 * 52 / 12 brut = simulation.get_holder('salaire_de_base').array simulation.get_or_new_holder('contrat_de_travail').array = brut < smic_mensuel # temps plein ou temps partiel simulation.get_or_new_holder('heures_remunerees_volume').array = brut // smic_horaire # temps plein / partiel salaire_net = simulation.calculate('salaire_net') inversion_reform = base.get_cached_reform( reform_key = 'inversion_revenus', tax_benefit_system = base.tax_benefit_system, ) inverse_simulation = inversion_reform.new_scenario().init_single_entity( **scenario_args ).new_simulation() inverse_simulation.get_holder('salaire_de_base').delete_arrays() inverse_simulation.get_or_new_holder('salaire_net').array = salaire_net inverse_simulation.get_or_new_holder('contrat_de_travail').array = brut < smic_mensuel # temps plein / partiel inverse_simulation.get_or_new_holder('heures_remunerees_volume').array = ( (brut // smic_horaire) * (brut < smic_mensuel) ) new_salaire_de_base = inverse_simulation.calculate('salaire_de_base') assert_near(new_salaire_de_base, salaire_de_base, absolute_error_margin = 0.1, message = 'Failing test for type_sal={}'.format(type_sal)) def test_salaire_net_to_salaire_de_base(): count = 101 salaire_de_base_max = 5000 salaire_de_base_min = 0 for year in range(2006, 2015): for type_sal in [0, 1]: # CAT._vars: TODO: work on other categories of employee yield check_salaire_net_to_salaire_de_base, count, salaire_de_base_max, salaire_de_base_min, type_sal, year if __name__ == '__main__': import logging import sys logging.basicConfig(level = logging.ERROR, stream = sys.stdout) for test in (test_chonet_to_chobrut, test_rstnet_to_rstbrut, test_salaire_net_to_salaire_de_base): # TOD0 test_chonet_to_chobrut, for function_and_arguments in test(): function_and_arguments[0](*function_and_arguments[1:]) PK'GV V /openfisca_france/tests/reforms/test_plfr2014.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program, If not, see . import datetime from openfisca_core.tools import assert_near from openfisca_france.tests import base def test_plfr2014(): year = 2013 reform = base.get_cached_reform( reform_key = 'plfr2014', tax_benefit_system = base.tax_benefit_system, ) scenario = reform.new_scenario().init_single_entity( axes = [ dict( count = 10, max = 13795 * (1 + .1) * (1 + .03), min = 13795 * (1 + .1) * (1 - .03), name = 'salaire_imposable', ), ], period = year, parent1 = dict(birth = datetime.date(year - 40, 1, 1)), ) reference_simulation = scenario.new_simulation(debug = True, reference = True) absolute_error_margin = 1 rfr = reference_simulation.calculate('rfr') expected_rfr = [13247, 13338, 13429, 13520, 13611, 13703, 13793, 13884, 13975, 14066] assert_near(expected_rfr, rfr, absolute_error_margin = absolute_error_margin) impo = reference_simulation.calculate('impo') expected_impo = [-249.11, -268.22, -287.33, -306.44, -325.55, -344.87, -363.77, -382.88, -401.99, -421.1] assert_near(expected_impo, impo, absolute_error_margin = absolute_error_margin) reform_simulation = scenario.new_simulation(debug = True) reform_reduction_impot_exceptionnelle = reform_simulation.calculate('reduction_impot_exceptionnelle') expected_reform_reduction_impot_exceptionnelle = [350, 350, 350, 350, 350, 350, 350, 261, 170, 79] assert_near(expected_reform_reduction_impot_exceptionnelle, reform_reduction_impot_exceptionnelle, absolute_error_margin = absolute_error_margin) reform_rfr = reform_simulation.calculate('rfr') # rfr must be the same than before reform. assert_near(expected_rfr, reform_rfr, absolute_error_margin = absolute_error_margin) reform_impo = reform_simulation.calculate('impo') expected_reform_impo = [0, 0, 0, 0, 0, 0, 0, -121.88, -231.99, -342.1] assert_near(expected_reform_impo, reform_impo, absolute_error_margin = absolute_error_margin) if __name__ == '__main__': import logging import sys logging.basicConfig(level = logging.ERROR, stream = sys.stdout) test_plfr2014() PK'G I I Iopenfisca_france/tests/reforms/test_allocations_familliales_imposables.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program, If not, see . import datetime from openfisca_core import periods from openfisca_core.tools import assert_near from openfisca_france.tests import base def test_allocations_familiales_imposables(): year = 2012 reform = base.get_cached_reform( reform_key = 'allocations_familiales_imposables', tax_benefit_system = base.tax_benefit_system, ) scenario = reform.new_scenario().init_single_entity( axes = [ dict( count = 10, max = 30000, min = 0, name = 'salaire_imposable', ), ], period = periods.period('year', year), parent1 = dict(birth = datetime.date(year - 40, 1, 1)), parent2 = dict(birth = datetime.date(year - 40, 1, 1)), enfants = [ dict(birth = datetime.date(year - 9, 1, 1)), dict(birth = datetime.date(year - 9, 1, 1)), ], ) reference_simulation = scenario.new_simulation(debug = True, reference = True) absolute_error_margin = 0.01 af = reference_simulation.calculate_add('af') expected_af = [1528.35] * 10 assert_near(expected_af, af, absolute_error_margin = absolute_error_margin) rbg = reference_simulation.calculate('rbg') reform_simulation = scenario.new_simulation(debug = True) reform_af = reform_simulation.calculate_add('af') assert_near(expected_af, reform_af, absolute_error_margin = absolute_error_margin) reform_af_imposables = reform_simulation.calculate('allocations_familiales_imposables') assert_near(expected_af, reform_af_imposables, absolute_error_margin = absolute_error_margin) reform_rbg = reform_simulation.calculate('rbg') assert_near(reform_rbg, rbg + af, absolute_error_margin = absolute_error_margin) if __name__ == '__main__': import logging import sys logging.basicConfig(level = logging.ERROR, stream = sys.stdout) test_allocations_familiales_imposables() PK'G8openfisca_france/tests/reforms/test_imposable_to_brut.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from __future__ import division import datetime from openfisca_core import periods from openfisca_france.reforms import inversion_revenus from openfisca_france.model.base import CAT from openfisca_france.tests.base import assert_near, get_cached_reform, tax_benefit_system def test_cho(year = 2014): period = periods.period("{}-01".format(year)) single_entity_kwargs = dict( axes = [dict(count = 101, max = 2000, min = 0, name = 'chobrut')], period = period, parent1 = dict( birth = datetime.date(year - 40, 1, 1), ), ) simulation = tax_benefit_system.new_scenario().init_single_entity( **single_entity_kwargs).new_simulation(debug = True) brut = simulation.get_holder('chobrut').array imposable = simulation.calculate('cho') inversion_reform = get_cached_reform( reform_key = 'inversion_revenus', tax_benefit_system = tax_benefit_system, ) inverse_simulation = inversion_reform.new_scenario().init_single_entity( **single_entity_kwargs).new_simulation(debug = True) inverse_simulation.get_holder('chobrut').delete_arrays() inverse_simulation.get_or_new_holder('choi').array = imposable.copy() new_brut = inverse_simulation.calculate('chobrut') assert_near(new_brut, brut, absolute_error_margin = 1) def test_rst(year = 2014): period = periods.period("{}-01".format(year)) single_entity_kwargs = dict( axes = [dict(count = 101, max = 2000, min = 0, name = 'rstbrut')], period = period, parent1 = dict( birth = datetime.date(year - 40, 1, 1), ), ) simulation = tax_benefit_system.new_scenario().init_single_entity( **single_entity_kwargs ).new_simulation(debug = True) brut = simulation.get_holder('rstbrut').array imposable = simulation.calculate('rst') inversion_reform = get_cached_reform( reform_key = 'inversion_revenus', tax_benefit_system = tax_benefit_system, ) inverse_simulation = inversion_reform.new_scenario().init_single_entity( **single_entity_kwargs).new_simulation(debug = True) inverse_simulation.get_holder('rstbrut').delete_arrays() inverse_simulation.get_or_new_holder('rsti').array = imposable.copy() new_brut = inverse_simulation.calculate('rstbrut') assert_near(new_brut, brut, absolute_error_margin = 1) def check_sal(type_sal, year = 2014): period = periods.period("{}-01".format(year)) single_entity_kwargs = dict( axes = [dict(count = 101, max = 2000, min = 40, name = 'salaire_de_base')], # TODO: min = 0 period = period, parent1 = dict( birth = datetime.date(year - 40, 1, 1), type_sal = type_sal, ), ) simulation = tax_benefit_system.new_scenario().init_single_entity( **single_entity_kwargs ).new_simulation(debug = False) brut = simulation.get_holder('salaire_de_base').array smic_horaire = simulation.legislation_at(period.start).cotsoc.gen.smic_h_b smic_mensuel = smic_horaire * 35 * 52 / 12 brut = simulation.get_holder('salaire_de_base').array simulation.get_or_new_holder('contrat_de_travail').array = brut < smic_mensuel # temps plein ou temps partiel simulation.get_or_new_holder('heures_remunerees_volume').array = brut // smic_horaire # temps plein ou partiel imposable = simulation.calculate('salaire_imposable') inversion_reform = get_cached_reform( reform_key = 'inversion_revenus', tax_benefit_system = tax_benefit_system, ) inverse_simulation = inversion_reform.new_scenario().init_single_entity( **single_entity_kwargs).new_simulation(debug = True) inverse_simulation.get_holder('salaire_de_base').delete_arrays() inverse_simulation.get_or_new_holder('salaire_imposable_pour_inversion').array = imposable.copy() inverse_simulation.get_or_new_holder('contrat_de_travail').array = brut < smic_mensuel # temps plein ou partiel inverse_simulation.get_or_new_holder('heures_remunerees_volume').array = ( (brut // smic_horaire) * (brut < smic_mensuel) ) new_brut = inverse_simulation.calculate('salaire_de_base') assert_near(new_brut, brut, absolute_error_margin = 1) def test_sal(year = 2014): for type_sal_category in ('prive_non_cadre', 'prive_cadre'): # , 'public_titulaire_etat'): yield check_sal, CAT[type_sal_category], year if __name__ == '__main__': import logging import sys logging.basicConfig(level = logging.ERROR, stream = sys.stdout) test_cho() test_rst() for function, type_sal, year in test_sal(): function(type_sal, year) PKxIE$openfisca_france/widgets/__init__.pyPK'GBX:}:}'openfisca_france/widgets/Composition.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from datetime import date, datetime import os import pickle #from openfisca_core import model from openfisca_qt.gui.qt.QtGui import ( QApplication, QComboBox, QDateEdit, QDialog, QDialogButtonBox, QDockWidget, QDoubleSpinBox, QFileDialog, QLabel, QMessageBox, QPushButton, QSpinBox, ) from openfisca_qt.gui.qt.QtCore import QObject, SIGNAL, SLOT, QDate, Qt, Signal from openfisca_qt.gui.qt.compat import to_qvariant from openfisca_qt.gui.views.ui_composition import Ui_Menage from openfisca_qt.gui.views.ui_logement import Ui_Logement from openfisca_qt.widgets.InfoComp import InfoComp from openfisca_qt.widgets.Declaration import Declaration from openfisca_qt.gui.utils.qthelpers import create_action from openfisca_qt.gui.config import CONF, get_icon from openfisca_qt.plugins import OpenfiscaPluginWidget from openfisca_qt.plugins.scenario import CompositionConfigPage from openfisca_qt.gui.baseconfig import get_translation from openfisca_france import CURRENCY # , DATA_DIR _ = get_translation('openfisca_qt') class S: name = 0 birth = 1 decnum = 2 decpos = 3 decbtn = 4 famnum = 5 fampos = 6 class CompositionWidget(OpenfiscaPluginWidget, Ui_Menage): """ Scenario Graph Widget """ CONF_SECTION = 'composition' CONFIGWIDGET_CLASS = CompositionConfigPage FEATURES = QDockWidget.DockWidgetClosable | \ QDockWidget.DockWidgetFloatable | \ QDockWidget.DockWidgetMovable DISABLE_ACTIONS_WHEN_HIDDEN = False sig_option_changed = Signal(str, object) XAXIS_PROPERTIES = { 'salaire_imposable': { 'name': 'salaire_imposable', 'typ_tot': { 'salsuperbrut': 'Salaire super brut', 'salbrut': 'Salaire brut', 'salaire_imposable': 'Salaire imposable', 'salaire_net': 'Salaire net' }, 'typ_tot_default': 'salaire_imposable', }, 'choi': { 'name': 'cho', 'col_name': 'choi', 'typ_tot': { 'chobrut': u"Chômage brut", 'cho': u"Chômage", 'chonet': u"Chômage net", }, 'typ_tot_default': 'cho' }, 'rsti': { 'name': 'rst', 'col_name': 'rsti', 'typ_tot': { 'rstbrut': u"Retraite brut", 'rst': u"Retraite", 'rstnet': u"Retraite net" }, 'typ_tot_default': 'rst' }, 'f2da': { 'name': 'divpfl', 'col_name': 'f2da', 'typ_tot': { 'rev_cap_brut': u"Revenus des capitaux", 'rev_cap_net': u"Revenus des capitaux nets" }, 'typ_tot_default': 'rev_cap_brut', }, 'f2ee': { 'name': 'intpfl', 'col_name': 'f2ee', 'typ_tot': { 'rev_cap_brut': "Revenus des capitaux", 'rev_cap_net': "Revenus des capitaux nets", }, 'typ_tot_default': 'rev_cap_brut' }, 'f2dc': { 'name': 'divb', 'col_name': 'f2dc', 'typ_tot': { 'rev_cap_brut': "Revenus des capitaux", 'rev_cap_net': "Revenus des capitaux nets" }, 'typ_tot_default': 'rev_cap_brut' }, 'f2tr': { 'name': 'intb', 'col_name': 'f2tr', 'typ_tot': { 'rev_cap_brut': "Revenus des capitaux", 'rev_cap_net': "Revenus des capitaux nets" }, 'typ_tot_default': 'rev_cap_brut' }, 'pensions_alimentaires_percues': { 'name': 'pensions_alimentaires_percues', 'col_name': 'pensions_alimentaires_percues', 'typ_tot': { 'pen': "Pensions" }, 'typ_tot_default': 'pen' }, 'f6gu': { 'name': 'f6gu', 'col_name': 'f6gu', 'typ_tot': { 'pen': "Pensions" }, 'typ_tot_default': 'pen'}, 'f4ba': { 'name': 'f4ba', 'col_name': 'f4ba', 'typ_tot': { 'fon': "Revenus fonciers" }, 'typ_tot_default': 'fon' }, } def __init__(self, scenario = None, parent = None): super(CompositionWidget, self).__init__(parent) self.setupUi(self) if parent is not None: self.parent = parent self.setLayout(self.verticalLayout) # Initialize xaxes x_axis = self.get_option('x_axis') axes_names = [] for col, axe in self.XAXIS_PROPERTIES.iteritems(): self.x_axis_box.addItem(col, to_qvariant(axe["name"])) # convert col to label by using tax_benefit_system # self.x_axis_box.addItem(axe.label, to_qvariant(axe.name)) axes_names.append(axe["name"]) self.x_axis_box.setCurrentIndex(axes_names.index(x_axis)) self.initialize_plugin() # Initialize maxrev # make it country dependant self.maxrev_box.setMinimum(0) self.maxrev_box.setMaximum(100000000) self.maxrev_box.setSingleStep(1000) self.maxrev_box.setSuffix(CURRENCY) maxrev = self.get_option('maxrev') self.maxrev_box.setValue(maxrev) self.maxrev = maxrev if scenario is not None: self.set_scenario(scenario) self.connect(self.open_btn, SIGNAL('clicked()'), self.load) self.connect(self.save_btn, SIGNAL('clicked()'), self.save) self.connect(self.add_btn, SIGNAL('clicked()'), self.addPerson) self.connect(self.rmv_btn, SIGNAL('clicked()'), self.rmvPerson) self.connect(self.lgt_btn, SIGNAL('clicked()'), self.openLogement) self.connect(self.inf_btn, SIGNAL('clicked()'), self.openInfoComp) self.connect(self.reset_btn, SIGNAL('clicked()'), self.resetScenario) self.connect(self.x_axis_box, SIGNAL('currentIndexChanged(int)'), self.set_x_axis) self.connect(self.maxrev_box, SIGNAL('valueChanged(int)'), self.set_maxrev) self.connect(self, SIGNAL('compoChanged()'), self.changed) self._listPerson = [] self.addPref() self.rmv_btn.setEnabled(False) self.emit(SIGNAL("ok()")) #------ Public API --------------------------------------------- def set_scenario(self, scenario): """ Set scenario_simualtion """ # TODO fix this x_axis = self.get_option('x_axis') maxrev = self.maxrev nmen = self.get_option('nmen') self.nmen = nmen value = CONF.get('parameters', 'datesim') datesim = datetime.strptime(value, "%Y-%m-%d").date() self.scenario = scenario self.scenario.year = datesim.year def set_x_axis(self): ''' Sets the varying variable of the scenario ''' widget = self.x_axis_box if isinstance(widget, QComboBox): data = widget.itemData(widget.currentIndex()) x_axis = unicode(data) self.scenario.x_axis = x_axis self.set_option('x_axis', x_axis) self.emit(SIGNAL('compoChanged()')) def set_maxrev(self): ''' Sets the varying variable of the scenario ''' widget = self.maxrev_box if isinstance(widget, QSpinBox) or isinstance(widget, QDoubleSpinBox): maxrev = widget.value() print "in set_maxrev :", maxrev self.scenario.maxrev = maxrev self.set_option('maxrev', maxrev) self.maxrev = maxrev self.emit(SIGNAL('compoChanged()')) def changed(self): self.disconnectAll() # self.scenario.genNbEnf() self.populate() self.action_compute.setEnabled(True) self.emit(SIGNAL('changed()')) self.connectAll() def nbRow(self): return self.scenario.nbIndiv() def populate(self): self.populateBirth() self.populateQuifoyCombo() self.populateFoyerCombo() self.populateQuifamCombo() self.populateFamilleCombo() def populateBirth(self): for noi, vals in self.scenario.indiv.iteritems(): birth = QDate(vals['birth']) self._listPerson[noi][S.birth].setDate(birth) def populateFoyerCombo(self): declarKeys = self.scenario.declar.keys() for noi, vals in self.scenario.indiv.iteritems(): noidec = vals['noidec'] box = self._listPerson[noi][S.decnum] box.clear() button = self._listPerson[noi][S.decbtn] button.setText('Foyer %d' % (noidec + 1)) if vals['quifoy'] == 'vous': box.addItems(['%d' % (noidec + 1)]) button.setEnabled(True) else: box.addItems(['%d' % (k + 1) for k in declarKeys]) button.setEnabled(False) box.setCurrentIndex(declarKeys.index(noidec)) def populateQuifoyCombo(self): for noi, vals in self.scenario.indiv.iteritems(): quifoy = vals['quifoy'] # retrieve the foyer combobox of individu number noi box = self._listPerson[noi][S.decpos] # set the combobox to 'vous' 'conj' or 'pac' if quifoy == 'vous': box.setCurrentIndex(0) elif quifoy == 'conj': box.setCurrentIndex(1) elif quifoy[:3] == 'pac': box.setCurrentIndex(2) def populateFamilleCombo(self): familleKeys = self.scenario.famille.keys() for noi, vals in self.scenario.indiv.iteritems(): noichef = vals['noichef'] box = self._listPerson[noi][S.famnum] box.clear() if vals['quifam'] == 'parent 1': box.addItems(['%d' % (noichef + 1)]) else: box.addItems(['%d' % (k + 1) for k in familleKeys]) box.setCurrentIndex(familleKeys.index(noichef)) def populateQuifamCombo(self): for noi, vals in self.scenario.indiv.iteritems(): quifam = vals['quifam'] # retrieve the foyer combobox of individu number noi box = self._listPerson[noi][S.fampos] # set the combobox to 'parent 1' 'parent 2' or 'enfant' if quifam == 'chef': box.setCurrentIndex(0) elif quifam == 'part': box.setCurrentIndex(1) elif quifam[:3] == 'enf': box.setCurrentIndex(2) def birthChanged(self, date): senderNoi = int(self.sender().objectName()[3]) self.scenario.indiv[senderNoi].update({'birth': date.toPyDate()}) self.emit(SIGNAL('compoChanged()')) def foyerChanged(self): sender = self.sender() noi = int(sender.objectName()[3]) newfoyer = int(sender.currentText()[-1]) - 1 self.scenario.modify(noi, newFoyer = newfoyer) self.emit(SIGNAL('compoChanged()')) def quifoyChanged(self, newQuifoy): senderNoi = int(self.sender().objectName()[3]) self.scenario.modify(senderNoi, newQuifoy = newQuifoy) self.emit(SIGNAL('compoChanged()')) def familleChanged(self): sender = self.sender() noi = int(sender.objectName()[3]) newfamille = int(sender.currentText()[-1]) - 1 self.scenario.modifyFam(noi, newFamille = newfamille) self.emit(SIGNAL('compoChanged()')) def quifamChanged(self, newFam): if newFam == 'parent 1': qui = 'chef' elif newFam == 'parent 2': qui = 'part' elif newFam == 'enfant': qui = 'enf' senderNoi = int(self.sender().objectName()[3]) self.scenario.modifyFam(senderNoi, newQuifam = qui) self.emit(SIGNAL('compoChanged()')) def addPref(self): noi = 0 self._listPerson.append([QLabel('%d' % (noi + 1), self), QDateEdit(self), QComboBox(self), QComboBox(self), QPushButton(self), QComboBox(self), QComboBox(self)]) temp = self._listPerson[0] temp[S.birth].setDisplayFormat(QApplication.translate("Page01", "dd MMM yyyy", None, QApplication.UnicodeUTF8)) temp[S.birth].setObjectName('Bir%d' % noi) temp[S.birth].setCurrentSection(QDateEdit.YearSection) temp[S.decpos].setObjectName('Dec%d' % noi) temp[S.decpos].addItems(['vous']) temp[S.decpos].setEnabled(False) temp[S.decnum].setObjectName('Foy%d' % noi) temp[S.decnum].setEnabled(False) temp[S.fampos].addItems(['parent 1']) temp[S.fampos].setObjectName('Fam%d' % noi) temp[S.fampos].setEnabled(False) temp[S.famnum].setObjectName('Fam%d' % noi) temp[S.famnum].setEnabled(False) temp[S.decbtn].setObjectName('But%d' % noi) for i in xrange(7): self.gridLayout.addWidget(temp[i], noi + 2, i) self.gridLayout.setAlignment(temp[i], Qt.AlignCenter) self.emit(SIGNAL('compoChanged()')) def addPerson(self): noi = self.nbRow() self.addRow() if noi == 1: self.scenario.addIndiv(noi, birth = date(1975, 1, 1), quifoy = 'conj', quifam = 'part') else: self.scenario.addIndiv(noi, birth = date(2000, 1, 1), quifoy = 'pac', quifam = 'enf') self.emit(SIGNAL('compoChanged()')) def addRow(self): noi = len(self._listPerson) self._listPerson.append( [ QLabel('%d' % (noi + 1), self), QDateEdit(self), QComboBox(self), QComboBox(self), QPushButton(self), QComboBox(self), QComboBox(self) ] ) temp = self._listPerson[-1] temp[S.birth].setDisplayFormat(QApplication.translate("Page01", "dd MMM yyyy", None, QApplication.UnicodeUTF8)) temp[S.birth].setObjectName('Bir%d' % noi) temp[S.birth].setCurrentSection(QDateEdit.YearSection) temp[S.decpos].setObjectName('Dec%d' % noi) temp[S.decpos].addItems(['vous', 'conj', 'pac']) temp[S.decnum].setObjectName('Foy%d' % noi) temp[S.fampos].setObjectName('Fam%d' % noi) temp[S.fampos].addItems(['parent 1', 'parent 2', 'enfant']) temp[S.famnum].setObjectName('Fam%d' % noi) temp[S.decbtn].setObjectName('But%d' % noi) for i in xrange(7): self.gridLayout.addWidget(temp[i], noi + 2, i) self.gridLayout.setAlignment(temp[i], Qt.AlignCenter) self.rmv_btn.setEnabled(True) if len(self.scenario.indiv) == 9: self.add_btn.setEnabled(False) def rmvPerson(self, noi = None): if noi is None: noi = self.nbRow() - 1 self.scenario.rmvIndiv(noi) self.rmvRow() self.add_btn.setEnabled(True) self.emit(SIGNAL('compoChanged()')) def rmvRow(self): ''' Enlève le dernier individu et l'efface dans le foyer ''' toDel = self._listPerson.pop() for widget in toDel: widget.setParent(None) if len(self.scenario.indiv) == 1: self.rmv_btn.setEnabled(False) def resetScenario(self): ''' Resets scenario ''' while self.nbRow() > 1: self.rmvPerson() self.simulation.reset_scenario self.emit(SIGNAL('compoChanged()')) def openDeclaration(self): """ Open the declaration widget """ noi = int(self.sender().objectName()[3]) self.scenario.genNbEnf() msg = self.scenario.check_consistency() if msg: QMessageBox.critical(self, u"Ménage non valide", msg, QMessageBox.Ok, QMessageBox.NoButton) return False self._declaration = Declaration(self, noi) self._declaration.exec_() self.emit(SIGNAL('compoChanged()')) def openLogement(self): self._logement = Logement(self.scenario, self) self._logement.exec_() self.emit(SIGNAL('compoChanged()')) def openInfoComp(self): self._infocomp = InfoComp(self.scenario, self) self._infocomp.exec_() self.emit(SIGNAL('compoChanged()')) def disconnectAll(self): for person in self._listPerson: QObject.disconnect(person[S.birth], SIGNAL('dateChanged(QDate)'), self.birthChanged) QObject.disconnect(person[S.decpos], SIGNAL('currentIndexChanged(QString)'), self.quifoyChanged) QObject.disconnect(person[S.decnum], SIGNAL('currentIndexChanged(int)'), self.foyerChanged) QObject.disconnect(person[S.fampos], SIGNAL('currentIndexChanged(QString)'), self.quifamChanged) QObject.disconnect(person[S.famnum], SIGNAL('currentIndexChanged(int)'), self.familleChanged) QObject.disconnect(person[S.decbtn], SIGNAL('clicked()'), self.openDeclaration) def connectAll(self): for person in self._listPerson: QObject.connect(person[S.birth], SIGNAL('dateChanged(QDate)'), self.birthChanged) QObject.connect(person[S.decpos], SIGNAL('currentIndexChanged(QString)'), self.quifoyChanged) QObject.connect(person[S.decnum], SIGNAL('currentIndexChanged(int)'), self.foyerChanged) QObject.connect(person[S.fampos], SIGNAL('currentIndexChanged(QString)'), self.quifamChanged) QObject.connect(person[S.famnum], SIGNAL('currentIndexChanged(int)'), self.familleChanged) QObject.connect(person[S.decbtn], SIGNAL('clicked()'), self.openDeclaration) def load(self): cas_type_dir = self.get_option('import_dir') fileName = QFileDialog.getOpenFileName(self, _("Open a test case"), cas_type_dir, u"Cas type OpenFisca (*.ofct)") if not fileName == '': n = len(self.scenario.indiv) try: self.scenario.openFile(fileName) while n < self.nbRow(): self.addRow() n += 1 while n > self.nbRow(): self.rmvRow() n -= 1 self.emit(SIGNAL('compoChanged()')) self.emit(SIGNAL("ok()")) except Exception, e: QMessageBox.critical( self, "Erreur", u"Erreur lors de l'ouverture du fichier : le fichier n'est pas reconnu : \n " + e, QMessageBox.Ok, QMessageBox.NoButton) def save(self): cas_type_dir = self.get_option('export_dir') default_fileName = os.path.join(cas_type_dir, 'sans-titre') fileName = QFileDialog.getSaveFileName(self, _("Save a test case"), default_fileName, u"Cas type OpenFisca (*.ofct)") if not fileName == '': self.scenario.saveFile(fileName) def compute(self): """ Computing the test case """ self.starting_long_process(_("Computing test case ...")) # TODO # Consistency check on scenario # msg = self.scenario.check_consistency() # if msg: # QMessageBox.critical(self, u"Ménage non valide", # msg, # QMessageBox.Ok, QMessageBox.NoButton) # return False # If it is consistent starts the computation self.action_compute.setEnabled(False) # P, P_default = self.main.parameters.getParam(), self.main.parameters.getParam(defaut = True) # self.simulation.set_param(P, P_default) import openfisca_france TaxBenefitSystem = openfisca_france.init_country() tax_benefit_system = TaxBenefitSystem() axes = [ dict( count = self.nmen, name = 'salaire_imposable', max = self.maxrev, min = 0, ), ] test_case = { "familles": { "fam0": { "parents": ['ind0'], "enfants": [], }, }, "foyers_fiscaux": { "foy0": { "declarants": ['ind0'], "personnes_a_charge": [], } }, "individus": { "ind0": { "activite": 0, "birth": '1970-01-01', "statmarit": 2, }, }, "menages": { "men0": { "personne_de_reference": 'ind0', "conjoint": None, "enfants": [], "autres": [], }, } } self.scenario = tax_benefit_system.new_scenario().init_from_attributes( axes = axes, test_case = test_case, year = 2013, ) print self.scenario.test_case self.scenario.simulation = self.scenario.new_simulation(debug = True) self.scenario.simulation.compute('revdisp') self.main.scenario = self.scenario self.main.refresh_test_case_plugins() self.ending_long_process(_("Test case results are updated")) def set_reform(self, reform): ''' Toggle reform mode for test case # TODO should be in another widget ''' if (not reform) and self.action_set_reform.isChecked(): self.action_set_reform.toggle() if (not self.action_set_reform.isChecked()) and reform: self.action_set_reform.toggle() self.scenario.set_config(reforme = reform, maxrev=self.maxrev) self.action_compute.setEnabled(True) def set_single(self, is_single = True): if is_single: self.scenario.set_config(nmen = 1, mode = 'castype') # TODO: this might be removed ?? self.action_compute.setEnabled(True) self.action_set_bareme.setChecked(False) else: self.action_set_bareme.setChecked(True) self.set_bareme() self.action_compute.setEnabled(True) def set_bareme(self, is_bareme = True): if is_bareme: nmen = self.get_option('nmen') self.scenario.set_config(nmen = nmen, mode = 'bareme') # # TODO: this might be removed ?? self.action_compute.setEnabled(True) self.action_set_single.setChecked(False) else: self.action_set_single.setChecked(True) self.set_single() self.action_compute.setEnabled(True) #------ OpenfiscaPluginMixin API --------------------------------------------- def apply_plugin_settings(self, options): """ Apply configuration file's plugin settings """ if 'maxrev' in options: maxrev = self.get_option('maxrev') self.maxrev_box.setValue(maxrev) self.maxrev = maxrev print "in apply setting :", self.maxrev if 'x_axis' in options: x_axis = self.get_option('x_axis') axes_names = [ axe.name for axe in self.XAXIS_PROPERTIES.itervalues() ] self.x_axis_box.setCurrentIndex(axes_names.index(x_axis)) #------ OpenfiscaPluginWidget API --------------------------------------------- def get_plugin_title(self): """ Return plugin title Note: after some thinking, it appears that using a method is more flexible here than using a class attribute """ return _("Composer") def get_plugin_icon(self): """ Return plugin icon (QIcon instance) Note: this is required for plugins creating a main window (see OpenfiscaPluginMixin.create_mainwindow) and for configuration dialog widgets creation """ return get_icon('OpenFisca22.png') def get_plugin_actions(self): """ Return a list of actions related to plugin Note: these actions will be enabled when plugin's dockwidget is visible and they will be disabled when it's hidden """ for index, (qobject, context, name, default) in enumerate(self.main.shortcut_data): if context == "Composer": self.main.shortcut_data.pop(index) qobject.deleteLater() del name, default # File menu actions and shortcuts self.open_action = create_action( self, _("&Open composition..."), icon='fileopen.png', tip =_("Open composition file"), triggered=self.load ) self.register_shortcut( self.open_action, context = "Composer", name = _("Open composition file"), default="Ctrl+O" ) self.save_action = create_action( self, _("&Save composition"), icon='filesave.png', tip=_("Save current composition"), triggered=self.save ) self.register_shortcut( self.save_action, context="Composer", name=_("Save current composition"), default="Ctrl+S" ) self.file_menu_actions = [self.open_action, self.save_action] self.main.file_menu_actions += self.file_menu_actions self.action_compute = create_action( self, _('Compute test case'), icon = 'calculator_green.png', triggered = self.compute ) self.register_shortcut( self.action_compute, context = 'Composer', name = _('Compute test case'), default = 'F9' ) self.action_set_bareme = create_action( self, _('Varying revenues'), icon = 'bareme22.png', toggled = self.set_bareme ) self.action_set_single = create_action( self, _('Single test case'), icon = 'castype22.png', toggled = self.set_single ) self.action_set_reform = create_action( self, _('Reform mode'), icon = 'comparison22.png', toggled = self.set_reform, tip = u"Différence entre la situation simulée et la situation actuelle" ) self.run_menu_actions = [self.action_compute, self.action_set_bareme, self.action_set_single, self.action_set_reform, None] self.main.run_menu_actions += self.run_menu_actions self.main.test_case_toolbar_actions += self.run_menu_actions return self.file_menu_actions + self.run_menu_actions def register_plugin(self): """ Register plugin in OpenFisca's main window """ self.main.add_dockwidget(self) self.action_set_bareme.trigger() def refresh_plugin(self): ''' Update Scenario Table ''' pass def closing_plugin(self, cancelable=False): """ Perform actions before parent main window is closed Return True or False whether the plugin may be closed immediately or not Note: returned value is ignored if *cancelable* is False """ return True # # OpenfiscaPluginWidget.visibility_changed(self, enable) # if self.dockwidget.isWindow(): # self.dock_toolbar.show() # else: # self.dock_toolbar.hide() # if enable: # self.refresh_plugin() def get_zone(code, filename = None): ''' Gets commune name and zone apl from postal code ''' if filename is None: code_file = open(os.path.join(DATA_DIR, 'code_apl'), 'r') else: code_file = open(filename, 'r') code_dict = pickle.load(code_file) code_file.close() if str(code) in code_dict: commune = code_dict[str(code)] return commune else: return None class Logement(QDialog, Ui_Logement): def __init__(self, scenario, parent = None): super(Logement, self).__init__(parent) self.setupUi(self) self.parent = parent self.scenario = scenario self.spinCP.setValue(scenario.menage[0]['code_postal']) self.spinLoyer.setValue(scenario.menage[0]['loyer']) self.comboSo.setCurrentIndex(scenario.menage[0]['statut_occupation'] - 1) # -1 because 0 is "non renseigné" self.spinTH.setValue(scenario.menage[0]['taxe_habitation']) # -1 because 0 is "non renseigné" def update_ville(code): commune = get_zone(code) if commune is not None: self.bbox.button(QDialogButtonBox.Ok).setEnabled(True) else: commune = ("Ce code postal n'est pas reconnu", '2') self.bbox.button(QDialogButtonBox.Ok).setEnabled(False) self.commune.setText(commune[0]) self.spinZone.setValue(int(commune[1])) update_ville(self.spinCP.value()) self.connect(self.spinCP, SIGNAL('valueChanged(int)'), update_ville) def update_th(value): self.spinTH.setValue(int(value)) self.connect(self.spinTH, SIGNAL('valueChanged(int)'), update_th) def so_changed(value): if value in (0, 1): self.spinLoyer.setValue(0) self.spinLoyer.setEnabled(False) else: self.spinLoyer.setValue(500) self.spinLoyer.setEnabled(True) self.connect(self.comboSo, SIGNAL('currentIndexChanged(int)'), so_changed) self.connect(self.bbox, SIGNAL("accepted()"), SLOT("accept()")) self.connect(self.bbox, SIGNAL("rejected()"), SLOT("reject()")) def accept(self): self.scenario.menage[0].update({ 'loyer': int(self.spinLoyer.value()), 'statut_occupation': int(self.comboSo.currentIndex() + 1), # +1 because 0 is "non renseigné" 'zone_apl': int(self.spinZone.value()), 'code_postal': int(self.spinCP.value()), 'taxe_habitation': int(self.spinTH.value()) }) QDialog.accept(self) PKFxhcc%openfisca_france/widgets/InfoIndiv.py# -*- coding: utf-8 -*- # OpenFisca -- A versatile microsimulation software # By: OpenFisca Team # # Copyright (C) 2011, 2012, 2013, 2014, 2015 OpenFisca Team # https://github.com/openfisca # # This file is part of OpenFisca. # # OpenFisca is free software; you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # OpenFisca is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from openfisca_core.columns import IntCol, FloatCol, BoolCol, EnumCol from openfisca_qt.gui.qt.QtGui import QDockWidget from openfisca_qt.gui.qthelpers import MyDoubleSpinBox, MyComboBox class S: name = 0 birth = 1 decnum = 2 decpos = 3 decbtn = 4 famnum = 5 fampos = 6 def BoxFromCol(col): if col in [IntCol, FloatCol]: MyDoubleSpinBox(prefix = col.label) elif col in [EnumCol]: MyComboBox(prefix= col.label, choices = col.enum._vars.keys() ) class InfoIndivWidget(QDockWidget): def __init__(self, parent = None): super(InfoIndivWidget, self).__init__(parent) input_cols = [] # for var in input_cols: # BoxFromCol() TODO: finish here PKxIEV""+openfisca_france/decompositions/__init__.pyDEFAULT_DECOMP_FILE = "decomp.xml"PK 'G]POpenFisca_France-0.5.1.data/data/share/locale/fr/LC_MESSAGES/openfisca-france.mo<=AV)h1& <HYrPTk(0 5 H iw#+ & &Open composition...&Save compositionA "famille" must have at most 2 "parents"A "foyer_fiscal" must have at most 2 "declarants"ComposerCompute test caseComputing test case ...Individual is missing from {}Open a test caseOpen composition fileReform modeSave a test caseSave current compositionSingle test caseTest case results are updatedVarying revenuesProject-Id-Version: OpenFisca-France 0.5.dev0 Report-Msgid-Bugs-To: contact@openfisca.fr POT-Creation-Date: 2015-09-07 18:56+0200 PO-Revision-Date: 2014-05-23 09:50+0100 Last-Translator: Emmanuel Raviart Language-Team: fr Plural-Forms: nplurals=2; plural=(n > 1) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 1.3 & &Ouvrir composition...&Enregistrer compositionUne famille doit avoir au plus 2 parentsUn foyer fiscal doit avoir au plus 2 déclarantsComposeurCalculer le cas typeComputing test case ...L'individu est manquant dans {}Ouvrir un cas typeOuvrir le fichier de compositionMode réformeEnregistrer un cas typeEnregistrer la composition actuelleCas type uniqueLes résultats du cas type sont mis à jourVariation des revenusPK'G^- 0OpenFisca_France-0.5.1.dist-info/DESCRIPTION.rstUNKNOWN PK'G֫.OpenFisca_France-0.5.1.dist-info/metadata.json{"classifiers": ["Development Status :: 2 - Pre-Alpha", "License :: OSI Approved :: GNU Affero General Public License v3", "Operating System :: POSIX", "Programming Language :: Python", "Topic :: Scientific/Engineering :: Information Analysis"], "extensions": {"python.details": {"contacts": [{"email": "contact@openfisca.fr", "name": "OpenFisca Team", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/openfisca/openfisca-france"}}}, "extras": [], "generator": "bdist_wheel (0.24.0)", "keywords": ["benefit", "france", "microsimulation", "social", "tax"], "license": "http://www.fsf.org/licensing/licenses/agpl-3.0.html", "metadata_version": "2.0", "name": "OpenFisca-France", "run_requires": [{"requires": ["Babel (>=0.9.4)", "Biryani (>=0.10.4)", "numpy", "OpenFisca-Core (>=0.5dev)", "PyYAML"]}], "summary": "France specific model for OpenFisca", "version": "0.5.1"}PK'G//)OpenFisca_France-0.5.1.dist-info/pbr.json{"is_release": false, "git_version": "8d36a21"}PK'Gw.OpenFisca_France-0.5.1.dist-info/top_level.txtopenfisca_france PK'G4\\&OpenFisca_France-0.5.1.dist-info/WHEELWheel-Version: 1.0 Generator: bdist_wheel (0.24.0) Root-Is-Purelib: true Tag: py2-none-any PK'G)OpenFisca_France-0.5.1.dist-info/METADATAMetadata-Version: 2.0 Name: OpenFisca-France Version: 0.5.1 Summary: France specific model for OpenFisca Home-page: https://github.com/openfisca/openfisca-france Author: OpenFisca Team Author-email: contact@openfisca.fr License: http://www.fsf.org/licensing/licenses/agpl-3.0.html Keywords: benefit france microsimulation social tax Platform: UNKNOWN Classifier: Development Status :: 2 - Pre-Alpha Classifier: License :: OSI Approved :: GNU Affero General Public License v3 Classifier: Operating System :: POSIX Classifier: Programming Language :: Python Classifier: Topic :: Scientific/Engineering :: Information Analysis Requires-Dist: Babel (>=0.9.4) Requires-Dist: Biryani (>=0.10.4) Requires-Dist: numpy Requires-Dist: OpenFisca-Core (>=0.5dev) Requires-Dist: PyYAML UNKNOWN PK'G u@u@'OpenFisca_France-0.5.1.dist-info/RECORDopenfisca_france/__init__.py,sha256=lMnkOlGFjhfzOSnbS_Rv0sotlnAT98SFXJOUfzWson4,4805 openfisca_france/scenarios.py,sha256=GSWjYLiopRIB4joscBS-CLIJiks7R1p5l-PH6qPpS9A,54889 openfisca_france/entities.py,sha256=Qa6h7LF-MuLCfKSgzETFntOnegQ7su2ktsq3iVzL1Ew,5729 openfisca_france/scripts/merge_ipp_tax_and_benefit_tables_with_parameters.py,sha256=K5MJiPiRejVU88GXok0iUnf4Hbt6r5AqMyY62_Ud5G8,23276 openfisca_france/scripts/generate_columns_tree.py,sha256=rnS39AjSqPD1-6ZQkas8JsRSON7LcEO_n5arDHVeXMo,8155 openfisca_france/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/scripts/holidays_generator.py,sha256=Se8jh6kIz3i_QzkSsXxLqJRQHqO6vwP5d98UYB0oIaQ,2465 openfisca_france/scripts/link_ipp_tax_and_benefit_tables_to_parameters.py,sha256=zY63gMPmVFR87w8eSaqOhdZzr2ofMCoO3-cNzZ3WQ88,12497 openfisca_france/scripts/web_trace.py,sha256=fbrpIhXt9ucb1cLB87wkD3aFkWE4zvIw_YaMOwm8FxI,2531 openfisca_france/scripts/date_variables.py,sha256=jjEXYwzxBPghM1jbQldUJRkiGsk04kNJpay5BrWOrAM,4390 openfisca_france/scripts/rattachement.py,sha256=-yjSw5RpDkvVd3W4B4seWMXhou282-iPQaSLjUaWl3k,6007 openfisca_france/scripts/inspect_dgfip_variable.py,sha256=7HtxXswNoEiQlUlZngwjnGOPo4qee2d1bTzTo8a1_UU,3921 openfisca_france/scripts/reindent_xml_files.py,sha256=xG1ZAkCkMCeFtpxkWrfl-_MxHnnETPkgaRioKgHIgQk,2829 openfisca_france/scripts/measure_performances.py,sha256=Z8zy9jUpT3JZRmpVD-LQhiTy2rNQo6HkuRI1Yyi1oyo,11233 openfisca_france/scripts/calculate_all_columns.py,sha256=WU63SmJXK4A--Pz8rgFOh0CiZQtY4LGPKY5O-lU6Qtg,4384 openfisca_france/scripts/calculateur_impots/extraction_champs_impots.py,sha256=QnJfRisI4n1-EfmcmW3aIOZd04SxEYpvso8owRfq3Ic,3936 openfisca_france/scripts/calculateur_impots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/scripts/calculateur_impots/generate_json.py,sha256=pnR8hbtq46KLcJTl_zHrsiE-_eLu8ffkQCZCatQFe64,3705 openfisca_france/scripts/calculateur_impots/base.py,sha256=D6HgirQO-I-ZUQQD8nvD_5cSaPId9oZC_00qLrQ5YfM,9491 openfisca_france/scripts/calculateur_impots/request_impots.py,sha256=OdaFrmjwhdwAvfXn0_UVYiSXhPB5Z0nZySy5RYJwIZA,11340 openfisca_france/scripts/calculateur_impots/calcul_impots.py,sha256=nrTNN6nNyyemP-NJq80jIP6t4BlqPLfkn-5b9zgpETU,5488 openfisca_france/scripts/calculateur_impots/convert_json_to_yaml.py,sha256=Mxszkd724yjNDYsSj2EG2gx7eLAvjLmcb1fW4UDZzt8,14928 openfisca_france/scripts/calculateur_impots/compare_openfisca_impots.py,sha256=2G65fKF3gT295-KDOIpyaaCntdiaDYKtIl0NN1fbv-Y,12395 openfisca_france/scripts/calculateur_impots/create_json_then_test.py,sha256=Um_aZ8K36GT-6H7q0d8f6W-PDpw3jjFS4cSRIZLNRhE,4876 openfisca_france/assets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/assets/holidays.py,sha256=gewjR855fYWmGFNmGqQpG7oSjD5JzGNnGIcNhiO2DI8,25129 openfisca_france/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/base.py,sha256=OsohDyzq5S7N7d9HKkPeNnqL9XYI-peWIUO-JiAEBC0,3995 openfisca_france/model/mesures.py,sha256=L4frwiYL1nWGtTQkml0_aGJovhqikrj28dnmtJpqdts,25349 openfisca_france/model/datatrees.py,sha256=s54W9vlN_Un7tQ_mPFQCaeq5cZN90_yJODKFPzB_pTg,146818 openfisca_france/model/model.py,sha256=EXoK6ZuAPRXWNs0nt1DX8bmwdmFAkFOUqjVJIf5IVIQ,2679 openfisca_france/model/prelevements_obligatoires/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/prelevements_obligatoires/taxe_habitation.py,sha256=uxM2qhzztim8qikl_PAVw2VeWmwc0X0ygYq-i4khPRw,9730 openfisca_france/model/prelevements_obligatoires/isf.py,sha256=ngmoM-IwaO2rqiEOea89cGaXasCkH3JKiKwrA6-zOpE,30637 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/taxes_salaires_main_oeuvre.py,sha256=1AUdM67ea8a4Dnb4js0GlfrMYDrx27A5VMQhgz71btA,15362 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/penalites.py,sha256=vEjy_0wFXi4hmsbriFx7hLQHxEdheGfdpsyy6pcLpRw,4692 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/apprentissage.py,sha256=6EFz3XI7L5kAoCxh8luVpGgepmRzMwj_xdehiluz6Dg,12521 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/stage.py,sha256=0kmfPKoLdlIaWPkhoIwd47Q1W9ymiifU3VTuNL-ottc,7453 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/travail_totaux.py,sha256=0E2wElBpH_L2UX8NYYelXOJZkd-x-zvv730K0pZWhvA,9347 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/allegements.py,sha256=KpyHIB-jKEGlwzBBdsogHAdzIFfGU1mTNsKMkUy_a2s,11651 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/travail_prive.py,sha256=PX0_vTG00tpf2ZZTVrwClkMul7xpkOLVjv4heOeV5Nc,27837 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/travail_fonction_publique.py,sha256=tno523jT_8ljao8QmMLlirDABulRNhRf8wEyRV-kgwo,14911 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/base.py,sha256=pPezfjym3Z5a-Y29VIcaBSDREwxn79OjV-Rg0JkakbI,5163 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/contrat_professionnalisation.py,sha256=nHwlGD8Dqm0rABzWp8g1UujEOkTrvt4XvopIFWb6Jy4,7511 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/preprocessing.py,sha256=G5Tk9YsucOYHqUdmbR3gduT-S5qEU5zlAy-c8xR8zSA,7398 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/exonerations.py,sha256=M_Ih1JFsEu6ktykEfvgtnB1qa2ceFJQyOUTjEEJBMwo,26013 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/contributions_sociales/capital.py,sha256=Dxh8udP1HSInUZ23grI-2lcxFXoGCR3mAOJa-d_w4xQ,19570 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/contributions_sociales/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/contributions_sociales/base.py,sha256=WfDvRWvc_shiYFMVScYLhuhduYJ41Athj1HJ1hnZS14,1793 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/contributions_sociales/activite.py,sha256=PAg8CPprumRbBxbSm8c3E-jFCSxaxIGrIEOYi077uDU,12334 openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/contributions_sociales/remplacement.py,sha256=UWi8SOZ5BxGTgTrToOl7hL__3EI14X56m6tpll7HFQc,13522 openfisca_france/model/prelevements_obligatoires/impot_revenu/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/prelevements_obligatoires/impot_revenu/ir.py,sha256=SyRMtwT3GqkuehhmIAtLdtAEvreAnogHwyRg7OTthhk,128910 openfisca_france/model/prelevements_obligatoires/impot_revenu/charges_deductibles.py,sha256=EurbmnT4ZwR9n0ssCkIuFOBb7lV3OZjLQNRX0P128gw,27855 openfisca_france/model/prelevements_obligatoires/impot_revenu/variables_reductions_credits.py,sha256=HyECWvaHXdJIIuYsF0HWGzbWjrFlwYyrfIa2zlxS9Z4,169686 openfisca_france/model/prelevements_obligatoires/impot_revenu/plus_values_immobilieres.py,sha256=trT8S2BYUUk4JB8lXe5ej60VY_uGrv_T9jei08eJzoU,6829 openfisca_france/model/prelevements_obligatoires/impot_revenu/reductions_impot.py,sha256=J2FE4RaxU3R9rJSCY3cXjy_iZDhaVWhXoQ-yM6xi-Jo,145488 openfisca_france/model/prelevements_obligatoires/impot_revenu/credits_impot.py,sha256=fB6vq--VlWLXacfl0EbQqjl0ceIW-mL56uCuhuFQwsQ,77495 openfisca_france/model/consommation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/patrimoine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/caracteristiques_socio_demographiques/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/caracteristiques_socio_demographiques/logement.py,sha256=PYGrvFprZhaw8_O-RHTf2Ed-8BpAn9sluS7gGQOB_cI,5444 openfisca_france/model/caracteristiques_socio_demographiques/demographie.py,sha256=-8i5WpPU3TkA-f9THgi3ZJPBIk18OiiFOUQnWmZTJXc,9844 openfisca_france/model/prestations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/prestations/education.py,sha256=2WTp_jXypnLovUtH6yAeo4bvEMe8DEeQfeNTmxUtHeM,7919 openfisca_france/model/prestations/aides_logement.py,sha256=MxU3nzzXq7PB6a33Z2rcQBoTAySnP_i-PEINLrdQB2Q,26248 openfisca_france/model/prestations/prestations_familiales/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/prestations/prestations_familiales/af.py,sha256=jDQ-8mMgMdF9OM18v0vl0mory65RKogE3ICA5kXnAkg,16234 openfisca_france/model/prestations/prestations_familiales/ars.py,sha256=ACf-TDyeN3ZyG2srQP8AXPVMLt6wu5yNYbDqF3EMNsY,3775 openfisca_france/model/prestations/prestations_familiales/base_ressource.py,sha256=NKJcOitap-OrIYRnVAo3rZ_iPHtPDKiLujMau_z_MdM,10968 openfisca_france/model/prestations/prestations_familiales/cf.py,sha256=hxc9q0w81DkDQtXrvMzDtg3rO1XnnUrCCkpo-Up3fJE,13227 openfisca_france/model/prestations/prestations_familiales/aeeh.py,sha256=nTWIbGvnYdLI5DGVXkBj9BesbvELAPkfV2a440NfnEY,6387 openfisca_france/model/prestations/prestations_familiales/paje.py,sha256=dZ5wrtxvG5q1nFFzwQRn622rIPjJCRtQUhc2s5F2r08,33424 openfisca_france/model/prestations/prestations_familiales/asf.py,sha256=NOE07elWIS8jZlhM9KtBkenfAAplbvSnAM-P3mFXoyA,3545 openfisca_france/model/prestations/minima_sociaux/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/prestations/minima_sociaux/aah.py,sha256=5niaUakcnQMU0QsSuuxE8k_K62LXTDXNsBbd79lCIEM,13230 openfisca_france/model/prestations/minima_sociaux/ass.py,sha256=M5-TUvo623whZezMJEIH0sR_HElfMACQUBpkf70mgOA,9535 openfisca_france/model/prestations/minima_sociaux/cmu.py,sha256=01OU9Nr2edH383GxGKU9SwJfY-qof2w5Pkz1fU0JG9M,17705 openfisca_france/model/prestations/minima_sociaux/asi_aspa.py,sha256=0FbMnjQYEPFUTtQXvgu-kLSovauoRgLrfVvCTYx5SW0,15693 openfisca_france/model/prestations/minima_sociaux/rsa.py,sha256=QEv2halF8dFxwvrfFQhCRaXk9d1GI2DJLlU3sMwEraY,48079 openfisca_france/model/revenus/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/revenus/autres.py,sha256=lD_ZcGyLZHoNZA3Wx_WllPuH9lJGgOmrzvhlPu-230s,4513 openfisca_france/model/revenus/activite/salarie.py,sha256=ItlAvqOmpz2q8q_0vozSN51qyL_NbiWff3m6pNhfX8w,31929 openfisca_france/model/revenus/activite/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/revenus/activite/non_salarie.py,sha256=WPIwXVFC6DcNVPYUe3zOQtnmStdIX2PbOju36ltCsJE,66582 openfisca_france/model/revenus/remplacement/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/revenus/remplacement/retraite.py,sha256=7gGoSMjDukEiQS-RExzoldoVLvXHCtNwrHQw7Jj-t6Q,1841 openfisca_france/model/revenus/remplacement/indemnites_journalieres_securite_sociale.py,sha256=7RWP3mLG7BOf9QXyqxyWwZRrEq_nmdOJ8P5xXubHTF8,3795 openfisca_france/model/revenus/remplacement/chomage.py,sha256=_zIg84a5j5JX0joUS8BX0F66wFUjLQiZWKvEjyougoI,2183 openfisca_france/model/revenus/capital/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/model/revenus/capital/financier.py,sha256=5dfSfYnXu1YUoWlhQMfnTa8gXlg16FpO_z5NjResg2s,8316 openfisca_france/model/revenus/capital/foncier.py,sha256=xRTNObM_Fknb_8586-Tc2tlu3lqLEZGO64PhMCJxK6M,3769 openfisca_france/model/revenus/capital/plus_value.py,sha256=dcP3HrCg8FBn2ZjvzCQ6JD7NPOS_L1mmlqkPf1Mc5kk,9619 openfisca_france/param/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/reforms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/reforms/allocations_familiales_imposables.py,sha256=6ilV-rC1HG_cPKtkCUA_ySjA0w41vffXp4LTqgSda2o,5458 openfisca_france/reforms/inversion_revenus.py,sha256=onqsIMes2ZoWO6FQTm5yfp7xPHONItzXzMCo1KPnKII,13878 openfisca_france/reforms/plf2015.py,sha256=gXYl9wkYbeEsmzFKjImArbYmqgfgbzVBD1pzJJqX38E,3895 openfisca_france/reforms/plfr2014.py,sha256=9tBge7KhvU41kxCm0GeN6Ruk1PSHpxlWuNMIuHZgqkA,16293 openfisca_france/reforms/trannoy_wasmer.py,sha256=ThJT23C2PPpJJocwKiJMAHqmkxz3Xrlsx4vnrx_mAs4,4227 openfisca_france/reforms/paris.py,sha256=Qk5PkoxHtxmk3M15fmtzrXJyPXy-AyMyst06szrXxbA,16555 openfisca_france/reforms/cesthra_invalidee.py,sha256=FWdh3Szj3RyI9IyQilNjlB01Dc1hApgOJYblHiwRiZ8,4439 openfisca_france/tests/test_allegement_fillon.py,sha256=0srwq5asZGvVBW8DlziZvjc8tSfqjubG9HSVY6cxRJo,8498 openfisca_france/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/tests/test_from_taxipp.py,sha256=6Aqdl9MO7MLrzk3KHCtGe_s35nCnvja3BTn_3anXlnU,4003 openfisca_france/tests/test_suggestions.py,sha256=qG7_J5wxEQjU7YK6n6xji8WVnZT5Gx8Ga9XZG_JYtZk,2440 openfisca_france/tests/test_decomposition_fiches_de_paie.py,sha256=EWt-hk2oofHAT3ih49LSfgdmjkR4weF4lGBMi0BHM9k,2578 openfisca_france/tests/test_cotsoc_fonc.py,sha256=vvOWZpxDZF69zzjOklK21QCb4WeP02XaOYWsfxft50A,16923 openfisca_france/tests/base.py,sha256=L2YPUWqrTO_tcksIsMm4FVg3jbo7HFDMmJI-ZnpbrTA,2948 openfisca_france/tests/test_tax_rates.py,sha256=pFVwiBWti_z0i_GGxTU231A3EEcFQOHd1UlgAr2fY_Y,2443 openfisca_france/tests/test_repairs.py,sha256=9Wg9jw35mcgceezQWqyYvellFmSVYHCc5Gu73pJ67YU,12464 openfisca_france/tests/test_basics.py,sha256=7HqE5ZLLqCrYZMpgFsFaT3ofp3aEMTrxyOUsszXnRfU,2071 openfisca_france/tests/test_jsons.py,sha256=bphmvUdN63OSnIlvXDEMyHC8zaFOrQKhhvJijpRtfKk,6156 openfisca_france/tests/test_legislations.py,sha256=_ksJfz6bfylhVOh-oNwh4zcN0mMJfzqBbO-qu-IzC3w,4219 openfisca_france/tests/test_cotsoc_sal_cap.py,sha256=mzigjtZdXOsH5UFmcDt3WFRu1ZTVfWUHEio17YRWzhs,15161 openfisca_france/tests/test_yaml.py,sha256=zc8r2TGNkVyU944xVAiLYP_OuMx3sq-E7qn7GC6bNa4,15075 openfisca_france/tests/utils.py,sha256=1PIANZwYlBnR2Q2CTvUG0vLOomW6VhQX2fhtCeA4MrA,3669 openfisca_france/tests/test_decompositions.py,sha256=7JtheeRD0khhBZY4Th-tjBqg3zjq0-Xz25ZUu52PHrA,3424 openfisca_france/tests/ipp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/tests/ipp/taxipp_utils.py,sha256=lx2LneFnKyx1vS5n13P3CXVllyW-ErFMEeGckbnKrfI,17052 openfisca_france/tests/reforms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/tests/reforms/test_trannoy_wasmer.py,sha256=LFtKoG_KwPVZve3_m8ujlwJFxO2d1u3tWWFxiZBSzSk,2291 openfisca_france/tests/reforms/test_parametric_reform.py,sha256=IfvV7SpyWxEiWNwv8kYv6g-ubUgMHs0UHVflmsZBzYU,2866 openfisca_france/tests/reforms/test_cesthra.py,sha256=1Y9xwq0Cqq1Ih2dxMF7nhCjVP1IZYRhcjVr6S5oNJEY,2527 openfisca_france/tests/reforms/test_plf2015.py,sha256=KqyHeuWGOYfBP8zCILvX-LYrJYLSP335dXr0NQbucDg,2452 openfisca_france/tests/reforms/test_net_to_brut.py,sha256=QBw0MOx3-QLGXtF1PYdRTVYo3BLKasr3yG9eZk28qUI,6899 openfisca_france/tests/reforms/test_plfr2014.py,sha256=1LgfVXjOlXiJY3r37mvlBvtDwoQxuypj8cSkfy_Zy7M,3158 openfisca_france/tests/reforms/test_allocations_familliales_imposables.py,sha256=ivTOxsOuwVR6VcbfwF5v0pBXb_j_3c4iTAZuAtTP0fc,2889 openfisca_france/tests/reforms/test_imposable_to_brut.py,sha256=iEnfkIa1bEFoRYIovmbxRWzAKeYA9q-D1uNACSMeZGo,5649 openfisca_france/widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 openfisca_france/widgets/Composition.py,sha256=7MhgdPlfHT2OBfL4iRcHafm7vM9MQtlvcajaenqSHEI,32058 openfisca_france/widgets/InfoIndiv.py,sha256=Mj8dX32PeMXLTIlO-6E6sDBotXHXMHbY_4PR2b33Qt8,1635 openfisca_france/decompositions/__init__.py,sha256=8CikRbX7Pg23XctSPVzPvh1_4FYAHsImXGDf5r7BH8c,34 OpenFisca_France-0.5.1.data/data/share/locale/fr/LC_MESSAGES/openfisca-france.mo,sha256=8c4V7YnWzB-_09YczEEAelx7Dvp5mWjYINI12x4CIYg,1541 OpenFisca_France-0.5.1.dist-info/RECORD,, OpenFisca_France-0.5.1.dist-info/WHEEL,sha256=54bVun1KfEBTJ68SHUmbxNPj80VxlQ0sHi4gZdGZXEY,92 OpenFisca_France-0.5.1.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10 OpenFisca_France-0.5.1.dist-info/pbr.json,sha256=2VlikFXigWth4UWoDzlSL-mE4UxIUBo36yXgqxKGMEw,47 OpenFisca_France-0.5.1.dist-info/METADATA,sha256=ybmtr-b1k8YPn1ujFMbzZdsuk7PD0w4KAwbcr-9LGIw,784 OpenFisca_France-0.5.1.dist-info/top_level.txt,sha256=1LbD6QJWehKGIcjtaJ45tbQOSDiFEXOlIdgWRI_jaHU,17 OpenFisca_France-0.5.1.dist-info/metadata.json,sha256=nLO7KrUwMtSIMIc3d76fFfHR6uFjgSDyzjTLnAcxQNw,939 PK'G}openfisca_france/__init__.pyPK'G4́iiopenfisca_france/scenarios.pyPK'G=aaopenfisca_france/entities.pyPK'G;}_ZZL>openfisca_france/scripts/merge_ipp_tax_and_benefit_tables_with_parameters.pyPK'G`qU1[openfisca_france/scripts/generate_columns_tree.pyPKxIE${openfisca_france/scripts/__init__.pyPKF4 .|openfisca_france/scripts/holidays_generator.pyPK'G"C00Iopenfisca_france/scripts/link_ipp_tax_and_benefit_tables_to_parameters.pyPKF+oP %%openfisca_france/scripts/web_trace.pyPKF}d&&*Kopenfisca_france/scripts/date_variables.pyPK'Gbww(openfisca_france/scripts/rattachement.pyPKF.kQQ2vopenfisca_france/scripts/inspect_dgfip_variable.pyPKF; .openfisca_france/scripts/reindent_xml_files.pyPK'G+++0popenfisca_france/scripts/measure_performances.pyPK'G~*  11openfisca_france/scripts/calculate_all_columns.pyPKF``GCopenfisca_france/scripts/calculateur_impots/extraction_champs_impots.pyPKF7Ropenfisca_france/scripts/calculateur_impots/__init__.pyPK'Gˍyy<(Sopenfisca_france/scripts/calculateur_impots/generate_json.pyPKFw1p%%3aopenfisca_france/scripts/calculateur_impots/base.pyPKFπSL,L,=_openfisca_france/scripts/calculateur_impots/request_impots.pyPKFpp<openfisca_france/scripts/calculateur_impots/calcul_impots.pyPKF{P:P:Copenfisca_france/scripts/calculateur_impots/convert_json_to_yaml.pyPK'Gv)k0k0Gopenfisca_france/scripts/calculateur_impots/compare_openfisca_impots.pyPK'Ge!  DQ5openfisca_france/scripts/calculateur_impots/create_json_then_test.pyPKF#Hopenfisca_france/assets/__init__.pyPKFI:)b)b#Iopenfisca_france/assets/holidays.pyPK]ME"jopenfisca_france/model/__init__.pyPK'G|Copenfisca_france/model/base.pyPK'Ghcc!openfisca_france/model/mesures.pyPK'Gd==#openfisca_france/model/datatrees.pyPK'G!Ow w \openfisca_france/model/model.pyPKF<#'UUopenfisca_france/tests/utils.pyPKF` ` -openfisca_france/tests/test_decompositions.pyPKxIE&Qopenfisca_france/tests/ipp/__init__.pyPK'GρBB*openfisca_france/tests/ipp/taxipp_utils.pyPKYcE*y'openfisca_france/tests/reforms/__init__.pyPK'G\5'openfisca_france/tests/reforms/test_trannoy_wasmer.pyPK'G 2 2 81openfisca_france/tests/reforms/test_parametric_reform.pyPK'Gҧ .<openfisca_france/tests/reforms/test_cesthra.pyPK'Gʔ .Fopenfisca_france/tests/reforms/test_plf2015.pyPK'GD2Popenfisca_france/tests/reforms/test_net_to_brut.pyPK'GV V /kopenfisca_france/tests/reforms/test_plfr2014.pyPK'G I I Ixopenfisca_france/tests/reforms/test_allocations_familliales_imposables.pyPK'G80openfisca_france/tests/reforms/test_imposable_to_brut.pyPKxIE$openfisca_france/widgets/__init__.pyPK'GBX:}:}'ٚopenfisca_france/widgets/Composition.pyPKFxhcc%Xopenfisca_france/widgets/InfoIndiv.pyPKxIEV""+openfisca_france/decompositions/__init__.pyPK 'G]PiOpenFisca_France-0.5.1.data/data/share/locale/fr/LC_MESSAGES/openfisca-france.moPK'G^- 0%OpenFisca_France-0.5.1.dist-info/DESCRIPTION.rstPK'G֫.4&OpenFisca_France-0.5.1.dist-info/metadata.jsonPK'G//)+*OpenFisca_France-0.5.1.dist-info/pbr.jsonPK'Gw.*OpenFisca_France-0.5.1.dist-info/top_level.txtPK'G4\\&*OpenFisca_France-0.5.1.dist-info/WHEELPK'G)+OpenFisca_France-0.5.1.dist-info/METADATAPK'G u@u@'.OpenFisca_France-0.5.1.dist-info/RECORDPK:o