Skip to content

Commit

Permalink
Merge pull request #490 from openfisca/introduce-association
Browse files Browse the repository at this point in the history
Introduce `association à but non lucratif`
  • Loading branch information
laem authored Jun 27, 2016
2 parents 8e19dc4 + 5ee6f9b commit 8d8b10e
Show file tree
Hide file tree
Showing 9 changed files with 204 additions and 21 deletions.
9 changes: 7 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# Changelog

## 3.4.0 - [diff](https://github.com/openfisca/openfisca-france/compare/3.4.0..3.3.0)

* Introduce the `entreprise_est_association_non_lucrative` boolean input variable
* Null the CICE and taxe d'apprentissage (taxe + contribution supplémentaire) when this input is True
* Force the computing of taxe sur les salaires when this input is True
* Implement franchise, décôte and abattement associations non lucratives in Taxe sur les salaires

## 3.3.0 - [diff](https://github.com/openfisca/openfisca-france/compare/3.3.0..3.2.0)

* Add variables for `complémentaire santé`, compulsory in 2016 :
Expand All @@ -18,14 +25,12 @@ It is included in the bases of the following variables.
* Specifically, correct the proratisation of `plafond de la sécurité sociale` and `coefficient de proratisation`.
* See issue #496 for details


## 3.1.0 - [diff](https://github.com/openfisca/openfisca-france/compare/3.1.0..3.0.0)

* Update the rates of the versement transport contribution
* Introduce an history of rates
* Move its code to a new file (~ 5 functions)


## 3.0.0 - [diff](https://github.com/openfisca/openfisca-france/compare/3.0.0..2.0.0)

* Make `enfant_a_charge` usable in monthly mode so that we can re-use it in mes-aides, and broaden its definition so that in includes children in `garde_alternee`.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,9 @@ def function_2013_(self, simulation, period):
taux_cice = taux_exo_cice(assiette_allegement, smic_proratise, cotsoc)
credit_impot_competitivite_emploi = taux_cice * assiette_allegement
non_cumul = not_(stagiaire)
association = simulation.calculate('entreprise_est_association_non_lucrative', period)

return period, credit_impot_competitivite_emploi * non_cumul
return period, credit_impot_competitivite_emploi * non_cumul * not_(association)


class aide_premier_salarie(DatedVariable):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

import logging

from numpy import logical_or as or_, round as round_
from numpy import logical_or as or_, logical_and as and_, round as round_, logical_not as not_

import numpy as np

from ...base import * # noqa analysis:ignore

Expand Down Expand Up @@ -40,13 +42,27 @@ def function(self, simulation, period):
return period, cotisation


class redevable_taxe_apprentissage(Variable):
column = BoolCol
entity_class = Individus
label = u"Entreprise redevable de la taxe d'apprentissage"

def function(self, simulation, period):
# L'association a but non lucratif ne paie pas d'IS de droit commun article 206 du Code général des impôts
# -> pas de taxe d'apprentissage
association = simulation.calculate('entreprise_est_association_non_lucrative', period)

return period, not_(association)


class contribution_developpement_apprentissage(Variable):
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,
Expand All @@ -71,7 +87,7 @@ def function(self, simulation, period):
taux = simulation.legislation_at(period.start).cotsoc.contribution_supplementaire_apprentissage

if period.start.year > 2012:
taux_contribution = redevable_taxe_apprentissage * (
taux_contribution = (
(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 +
Expand All @@ -80,9 +96,9 @@ def function(self, simulation, period):
(.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
taux_contribution = (effectif_entreprise >= 250) * taux.plus_de_250
# TODO: gestion de la place dans le XML pb avec l'arbre des paramètres / preprocessing
return period, - taux_contribution * assiette_cotisations_sociales
return period, - taux_contribution * assiette_cotisations_sociales * redevable_taxe_apprentissage


class cotisations_employeur_main_d_oeuvre(Variable):
Expand Down Expand Up @@ -254,14 +270,15 @@ class taxe_apprentissage(Variable):
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
return period, cotisation * redevable_taxe_apprentissage


class taxe_salaires(Variable):
Expand All @@ -281,22 +298,60 @@ def function(self, simulation, period):
'prise_en_charge_employeur_prevoyance_complementaire', period)

law = simulation.legislation_at(period.start)
entreprise_est_association_non_lucrative = \
simulation.calculate('entreprise_est_association_non_lucrative', period)
effectif_entreprise = simulation.calculate('effectif_entreprise', period)

# impots.gouv.fr
# La taxe est due notamment par les : [...] organismes sans but lucratif
assujettissement = assujettie_taxe_salaires + entreprise_est_association_non_lucrative

bareme = law.cotsoc.taxes_sal.taux_maj
parametres = law.cotsoc.taxes_sal
bareme = parametres.taux_maj
base = assiette_cotisations_sociales - prevoyance_obligatoire_cadre
base = assiette_cotisations_sociales + (
- prevoyance_obligatoire_cadre + prise_en_charge_employeur_prevoyance_complementaire
- complementaire_sante_employeur
)

# TODO: exonérations apprentis
# TODO: modify if DOM

return period, - (
cotisation_individuelle = (
bareme.calc(
base,
factor = 1 / 12,
round_base_decimals = 2
) +
round_(law.cotsoc.taxes_sal.taux.metro * base, 2)
) * assujettie_taxe_salaires
round_(parametres.taux.metro * base, 2)
)

# Une franchise et une décôte s'appliquent à cette taxe
# Etant donné que nous n'avons pas la distribution de salaires de l'entreprise,
# elles sont estimées en prenant l'effectif de l'entreprise et
# considérant que l'unique salarié de la simulation est la moyenne.
# http://www.impots.gouv.fr/portal/dgi/public/popup?typePage=cpr02&espId=2&docOid=documentstandard_1845
estimation = cotisation_individuelle * effectif_entreprise * 12
conditions = [estimation < parametres.franchise, estimation <= parametres.decote_montant, estimation > parametres.decote_montant]
results = [0, estimation - (parametres.decote_montant - estimation) * parametres.decote_taux, estimation]

estimation_reduite = np.select(conditions, results)

# Abattement spécial de taxe sur les salaires
# Les associations à but non lucratif bénéficient d'un abattement important
estimation_abattue_negative = estimation_reduite - parametres.abattement_special
estimation_abattue = switch(
entreprise_est_association_non_lucrative,
{
0: estimation_reduite,
1: (estimation_abattue_negative >= 0) * estimation_abattue_negative,
}
)

with np.errstate(invalid='ignore'):
cotisation = switch(effectif_entreprise == 0, {
True: self.zeros(),
False: estimation_abattue / effectif_entreprise / 12
})

return period, - cotisation * assujettissement
13 changes: 6 additions & 7 deletions openfisca_france/model/revenus/activite/salarie.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ class ppe_tp_sa(Variable):
QUIFOY['pac2']: u"1DX",
QUIFOY['pac3']: u"1QX",
}

column = BoolCol
entity_class = Individus
label = u"Prime pour l'emploi des salariés: indicateur de travail à temps plein sur l'année entière"
Expand Down Expand Up @@ -268,6 +268,11 @@ class cotisation_sociale_mode_recouvrement(Variable):
entity_class = Individus
label = u"Mode de recouvrement des cotisations sociales"

class entreprise_est_association_non_lucrative(Variable):
column = BoolCol
entity_class = Individus
label = u"L'entreprise est une association à but non lucratif, par exemple loi de 1901"


class depcom_entreprise(Variable):
column = FixedStrCol(max_length = 5)
Expand Down Expand Up @@ -402,12 +407,6 @@ class ratio_alternants(Variable):
label = u"Ratio d'alternants dans l'effectif moyen"


class redevable_taxe_apprentissage(Variable):
column = BoolCol(default = True)
entity_class = Individus
label = u"Entreprise redevable de la taxe d'apprentissage"


class remboursement_transport_base(Variable):
column = FloatCol()
entity_class = Individus
Expand Down
24 changes: 24 additions & 0 deletions openfisca_france/param/param.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2870,6 +2870,30 @@
</TAUX>
</TRANCHE>
</BAREME>
<CODE code="franchise" description="La taxe sur les salaires n'est pas exigible en-dessous de ce montant">
<VALUE deb="2001-01-01" fuzzy="true" valeur="1200" />
</CODE>
<CODE code="decote_montant" description="La taxe sur les salaires est allégée entre la franchise et ce montant">
<VALUE deb="2001-01-01" fuzzy="true" valeur="2040" />
</CODE>
<CODE code="decote_taux" description="La décote se fait à ce taux">
<VALUE deb="2001-01-01" fuzzy="true" valeur="0.75" />
</CODE>
<!-- http://www.impots.gouv.fr/portal/dgi/public/popup?typePage=cpr02&espId=2&docOid=documentstandard_1851 -->
<CODE code="abattement_special" description="Abattement notamment pour les associations à but non lucratif">
<VALUE deb="2016-01-01" fuzzy="true" valeur="20283" />
<VALUE deb="2015-01-01" fin="2015-12-31" valeur="20262" />
<VALUE deb="2014-01-01" fin="2014-12-31" valeur="20161" />
<!-- Le saut est très important (?) -->
<VALUE deb="2011-01-01" fin="2013-12-31" valeur="6002" />
<VALUE deb="2010-01-01" fin="2010-12-31" valeur="5913" />
<VALUE deb="2009-01-01" fin="2009-12-31" valeur="5890" />
<VALUE deb="2008-01-01" fin="2008-12-31" valeur="5724" />
<VALUE deb="2007-01-01" fin="2007-12-31" valeur="5651" />
<VALUE deb="2002-01-01" fin="2006-12-31" valeur="5185" />
<!-- Il existe un historique plus fourni consultable sur légifrance, mais en Francs.
Code général des impôts - Article 1679 A -->
</CODE>
</NODE>
<BAREME code="tehr" description="Taxes exceptionnelles sur les hauts revenus">
<TRANCHE code="tranche0">
Expand Down
17 changes: 16 additions & 1 deletion openfisca_france/tests/formulas/cice.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

- period: "2015-11"
description:
Rien au dessus de 2.5 fois le SMIC
C'est bon en dessous de 2.5 fois le SMIC
relative_error_margin: 0.001
input_variables:
salaire_de_base: 3643.79
Expand All @@ -39,3 +39,18 @@
contrat_de_travail_duree: 0
output_variables:
credit_impot_competitivite_emploi: 0

- period: "2015-11"
description:
Pas de CICE pour les associations à but non lucratif
relative_error_margin: 0.001
input_variables:
salaire_de_base: 1467
# nécessaire pour des requêtes sur un mois de salaire :
allegement_fillon_mode_recouvrement: 1
effectif_entreprise: 0
categorie_salarie: 0 # non cadre
contrat_de_travail_duree: 0
entreprise_est_association_non_lucrative: 1
output_variables:
credit_impot_competitivite_emploi: 0
35 changes: 35 additions & 0 deletions openfisca_france/tests/formulas/taxe_apprentissage.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
- period: "2016-06"
description:
Taxe d'apprentissage / Contribution supplémentaire à l'apprentissage
relative_error_margin: 0.001
input_variables:
salaire_de_base: 1467
# nécessaire pour des requêtes sur un mois de salaire :
allegement_fillon_mode_recouvrement: 1
effectif_entreprise: 89
categorie_salarie: 0 # non cadre
contrat_de_travail_duree: 0
entreprise_est_association_non_lucrative: 0
ratio_alternants: 0.015
output_variables:
taxe_apprentissage: -.0068 * 1467
contribution_supplementaire_apprentissage: -.002 * 1467

- period: "2016-06"
description:
Taxe d'apprentissage / Contribution supplémentaire à l'apprentissage
relative_error_margin: 0.001
input_variables:
salaire_de_base: 1467
# nécessaire pour des requêtes sur un mois de salaire :
allegement_fillon_mode_recouvrement: 1
effectif_entreprise: 89
categorie_salarie: 0 # non cadre
contrat_de_travail_duree: 0
entreprise_est_association_non_lucrative: 1
ratio_alternants: 0.015
output_variables:
taxe_apprentissage: 0
contribution_supplementaire_apprentissage: 0


49 changes: 49 additions & 0 deletions openfisca_france/tests/formulas/taxe_salaires.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
- period: "2014-01"
name: Taxe sur les salaires pour les associations 1901
relative_error_margin: 0.001
input_variables:
salaire_de_base: 2300
effectif_entreprise: 80
entreprise_est_association_non_lucrative: 1
output_variables:
taxe_salaires: -199.462458333
# calcul :
# -(
# # Bareme
# .0425 * (7666/12) +
# 0.085 * ((15308−7666)/12) +
# 0.136*(2300−15308÷12)
# # Abattement spécial
# - (20283/12)/80 )

- period: "2014-01"
name: Pas de taxe sur les salaires par défaut
relative_error_margin: 0.001
input_variables:
salaire_de_base: 2300
effectif_entreprise: 80
output_variables:
taxe_salaires: 0


- period: "2014-01"
name: Taxe sur les salaires
relative_error_margin: 0.001
input_variables:
salaire_de_base: 2300
effectif_entreprise: 80
assujettie_taxe_salaires: 1
output_variables:
taxe_salaires: -220.590583333 # même calcul que pour les associations, mais sans l'abattement

#.0425*(7666/12)+0.085*((15308−7666)/12)+0.136*(2300−15308÷12)

- period: "2014-01"
name: Taxe sur les salaires (décote, franchise)
relative_error_margin: 0.001
input_variables:
salaire_de_base: 1467
effectif_entreprise: 1
assujettie_taxe_salaires: 1
output_variables:
taxe_salaires: -60.279520833 # car la décôte s'applique au montant initial de la taxe (1287.631 €)
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

setup(
name = 'OpenFisca-France',
version = '3.3.0',
version = '3.4.0',
author = 'OpenFisca Team',
author_email = '[email protected]',
classifiers = [
Expand Down

0 comments on commit 8d8b10e

Please sign in to comment.