diff --git a/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/allegements.py b/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/allegements.py index a57f9b5740..0e7881b2c0 100644 --- a/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/allegements.py +++ b/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/allegements.py @@ -147,12 +147,12 @@ def formula_2013_01_01(individu, period, parameters): # Taux de CICE taux_cice = np.where(dep_drom, cice.taux_om, cice.taux) # Calcul du taux applicable - taux_applicable_cice = ((assiette_allegement/(smic_proratise+1e-16)) <= cice.plafond_smic) * taux_cice + taux_applicable_cice = ((assiette_allegement/(smic_proratise + 1e-16)) <= cice.plafond_smic) * taux_cice # Calcul du montant du crédit d'impôt credit_impot_competitivite_emploi = taux_applicable_cice * assiette_allegement return credit_impot_competitivite_emploi * not_(stagiaire) * not_(association) - + class aide_premier_salarie(Variable): value_type = float @@ -338,7 +338,7 @@ def formula_2005_07_01(individu, period, parameters): exoneration_cotisations_employeur_jei = individu('exoneration_cotisations_employeur_jei', period) exoneration_cotisations_employeur_tode = individu('exoneration_cotisations_employeur_tode', period) exoneration_lodeom = individu('exoneration_lodeom', period) - non_cumulee = not_(exoneration_cotisations_employeur_jei+exoneration_cotisations_employeur_tode+exoneration_lodeom) + non_cumulee = not_(exoneration_cotisations_employeur_jei + exoneration_cotisations_employeur_tode + exoneration_lodeom) # switch on 3 possible payment options allegement = switch_on_allegement_mode( diff --git a/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/exonerations.py b/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/exonerations.py index e442148592..b83d7401b7 100644 --- a/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/exonerations.py +++ b/openfisca_france/model/prelevements_obligatoires/prelevements_sociaux/cotisations_sociales/exonerations.py @@ -158,7 +158,7 @@ def formula(individu, period, parameters): + exoneration_cotisations_employeur_zrd + exoneration_cotisations_employeur_zrr + exoneration_lodeom - ) + ) return exonerations_geographiques @@ -600,7 +600,7 @@ class exoneration_is_creation_zrr(Variable): definition_period = YEAR calculate_output = calculate_output_divide - def formula(individu, period, parameters): + def formula(individu, period): decembre = period.first_month.offset(11, 'month') effectif_entreprise = individu('effectif_entreprise', decembre) entreprise_benefice = individu('entreprise_benefice', period, options = [ADD]) @@ -663,7 +663,7 @@ class jeune_entreprise_innovante(Variable): definition_period = MONTH set_input = set_input_dispatch_by_period - def formula(individu, period, parameters): + def formula(individu, 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 : # @@ -728,7 +728,7 @@ class bassin_emploi_redynamiser(Variable): definition_period = MONTH set_input = set_input_dispatch_by_period - def formula(individu, period, parameters): + def formula(individu, period): effectif_entreprise = individu('effectif_entreprise', period) return (effectif_entreprise >= 1) * False @@ -741,7 +741,7 @@ class zone_restructuration_defense(Variable): definition_period = MONTH set_input = set_input_dispatch_by_period - def formula(individu, period, parameters): + def formula(individu, period): effectif_entreprise = individu('effectif_entreprise', period) return (effectif_entreprise >= 1) * False @@ -753,7 +753,7 @@ class zone_franche_urbaine(Variable): definition_period = MONTH set_input = set_input_dispatch_by_period - def formula(individu, period, parameters): + def formula(individu, period): effectif_entreprise = individu('effectif_entreprise', period) return (effectif_entreprise >= 1) * False @@ -765,7 +765,7 @@ class zone_revitalisation_rurale(Variable): definition_period = MONTH set_input = set_input_dispatch_by_period - def formula(individu, period, parameters): + def formula(individu, period): effectif_entreprise = individu('effectif_entreprise', period) return (effectif_entreprise >= 1) * False @@ -785,78 +785,78 @@ def exoneration_relative_year(period, other_date): return (datetime64(period.start) + timedelta64(1, 'D') - other_date).astype('timedelta64[Y]') - # Pour la Guadeloupe, la Guyane, la Martinique et la Réunion -## Dispositif de compétitivité - +# Dispositif de compétitivité # Types de bénéficiaire du régime de perfectionnement actif class TypesPerfectionnementActif(Enum): __order__ = 'non_renseigne beneficiaire non_beneficiaire' non_renseigne = 'Non renseigné' - beneficiaire = "Bénéficiaire du régime de perfectionnement actif" - non_beneficiaire = "Non bénéficiaire du régime de perfectionnement actif" + beneficiaire = 'Bénéficiaire du régime de perfectionnement actif' + non_beneficiaire = 'Non bénéficiaire du régime de perfectionnement actif' # Bénéficiaire du régime de perfectionnement actif -class perfectionnement_actif(Variable) : - value_type=Enum +class perfectionnement_actif(Variable): + value_type = Enum possible_values = TypesPerfectionnementActif default_value = TypesPerfectionnementActif.non_renseigne - entity=Individu - label="Bénéficiaire du régime de perfectionnement actif" - reference='' - definition_period=MONTH - set_input=set_input_dispatch_by_period + entity = Individu + label = 'Bénéficiaire du régime de perfectionnement actif' + reference = '' + definition_period = MONTH + set_input = set_input_dispatch_by_period # Types de secteurs d'activité de l'employeur # Peut peut-être être fusionné avec TypeSecteurActivite dans openfisca_france.model.base -class TypesSecteurActiviteLODEOM(Enum) : +class TypesSecteurActiviteLODEOM(Enum): __order__ = 'non_renseigne batiment transport_aerien desserte_maritime compta_conseil presse audiovisuel divers autre_secteur' non_renseigne = 'Non renseigné' batiment = 'Bâtiment, Travaux publics' transport_aerien = 'Transport aérien' desserte_maritime = 'Desserte maritime' - compta_conseil = "Comptabilité, Conseil aux entreprises, Ingénierie, Etudes techniques" + compta_conseil = 'Comptabilité, Conseil aux entreprises, Ingénierie, Etudes techniques' presse = 'Presse' audiovisuel = 'Production audiovisuelle' divers = "Industrie, Restauration, Environnement, Agronutrition, Energies renouvelables, NTIC, Centres d'appel, Pêche, Cultures marines, Aquaculture, Agriculture, Nautisme, Hôtellerie, Recherche et développement" - autre_secteur = "Autre secteur" + autre_secteur = 'Autre secteur' # Secteur d'activité de l'employeur class secteur_activite_employeur_lodeom(Variable): - value_type=Enum + value_type = Enum possible_values = TypesSecteurActiviteLODEOM default_value = TypesSecteurActiviteLODEOM.non_renseigne - entity=Individu - label="Eligibilité au dispositif compétitivité de LODEOM" - reference='' - definition_period=MONTH - set_input=set_input_dispatch_by_period + entity = Individu + label = 'Eligibilité au dispositif compétitivité de LODEOM' + reference = '' + definition_period = MONTH + set_input = set_input_dispatch_by_period + # Effectif de l'entreprise dans les DROM class effectif_entreprise_drom(Variable): - entity=Individu - value_type=int - label="Effectif de l'entreprise dans le DROM" - set_input=set_input_dispatch_by_period - #is_period_size_independant = True + entity = Individu + value_type = int + label = "Effectif de l'entreprise dans le DROM" + set_input = set_input_dispatch_by_period + # is_period_size_independant = True definition_period = MONTH + # Définition de la classe d'éligibilité au dispositif compétitivité -class eligibilite_lodeom_competitivite(Variable) : - value_type=bool - entity=Individu - label="Eligibilité au dispositif compétitivité de LODEOM" - reference='https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042683758' - definition_period=MONTH - set_input=set_input_dispatch_by_period +class eligibilite_lodeom_competitivite(Variable): + value_type = bool + entity = Individu + label = 'Eligibilité au dispositif compétitivité de LODEOM' + reference ='https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042683758' + definition_period = MONTH + set_input = set_input_dispatch_by_period # Sont concernés : # - les employeurs de moins de 11 salariés # - les employeurs des secteurs du bâtiment, des travaux publics, des transports aériens pour certaines liaisons et ceux assurant la desserte maritime entre certains points - def formula_2009_01_01(individu, period, parameters) : + def formula_2009_01_01(individu, period): # Extraction des variables d'intérêt depcom_entreprise = individu('depcom_entreprise', period) effectif_entreprise_drom = individu('effectif_entreprise_drom', period) @@ -866,7 +866,7 @@ def formula_2009_01_01(individu, period, parameters) : dep_drom = np.array([depcom_cell[:3] in ['971', '972', '973', '974'] if isinstance(depcom_cell, str) else depcom_cell.decode('utf-8')[:3] in ['971', '972', '973', '974'] for depcom_cell in depcom_entreprise]) # Définition de l'éligibilité suivant l'effectif de l'entreprise - effectif_moins_11_salaries = effectif_entreprise_drom < 11 # Ajouter dans les paramètres + effectif_moins_11_salaries = effectif_entreprise_drom < 11 # Ajouter dans les paramètres # Définition de l'appartenance à certains secteurs secteur_batiment = secteur_activite_employeur_lodeom == TypesSecteurActiviteLODEOM.batiment secteur_aerien = secteur_activite_employeur_lodeom == TypesSecteurActiviteLODEOM.transport_aerien @@ -883,8 +883,8 @@ def formula_2009_01_01(individu, period, parameters) : eligibilite = dep_drom * (effectif_moins_11_salaries + secteur_batiment + secteur_aerien + secteur_maritime + secteur_presse + secteur_audiovisuel + secteur_divers_eligible) return eligibilite - - def formula_2019_01_01(individu, period, parameters) : + + def formula_2019_01_01(individu, period): # Extraction des variables d'intérêt depcom_entreprise = individu('depcom_entreprise', period) effectif_entreprise_drom = individu('effectif_entreprise_drom', period) @@ -894,7 +894,7 @@ def formula_2019_01_01(individu, period, parameters) : dep_drom = np.array([depcom_cell[:3] in ['971', '972', '973', '974'] if isinstance(depcom_cell, str) else depcom_cell.decode('utf-8')[:3] in ['971', '972', '973', '974'] for depcom_cell in depcom_entreprise]) # Définition de l'éligibilité suivant l'effectif de l'entreprise - effectif_moins_11_salaries = effectif_entreprise_drom < 11 # Ajouter dans les paramètres + effectif_moins_11_salaries = effectif_entreprise_drom < 11 # Ajouter dans les paramètres # Définition de l'appartenance à certains secteurs secteur_batiment = secteur_activite_employeur_lodeom == TypesSecteurActiviteLODEOM.batiment secteur_aerien = secteur_activite_employeur_lodeom == TypesSecteurActiviteLODEOM.transport_aerien @@ -905,30 +905,29 @@ def formula_2019_01_01(individu, period, parameters) : # Définition de l'éligibilité au régime de perfectionnement actif beneficiaire_perfectionnement_actif = perfectionnement_actif == TypesPerfectionnementActif.beneficiaire - + # Définition de l'éligibilité eligibilite = dep_drom * (effectif_moins_11_salaries + secteur_batiment + secteur_aerien + secteur_maritime + beneficiaire_perfectionnement_actif) return eligibilite - # /!\ Revoir si la formule est bonne pour toutes les dates depuis 2009 # Définition de la classe définissant le montant associé au dispositif de compétitivité -class exoneration_lodeom_competitivite(Variable) : - value_type=float - entity=Individu - label="Montant d'exonération associé au dispositif compétitivité de LODEOM" - reference='https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000041404691' - definition_period=MONTH - set_input=set_input_divide_by_period - - def formula_2009_01_01(individu, period, parameters) : +class exoneration_lodeom_competitivite(Variable): + value_type = float + entity = Individu + label = "Montant d'exonération associé au dispositif compétitivité de LODEOM" + reference = 'https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000041404691' + definition_period = MONTH + set_input = set_input_divide_by_period + + def formula_2009_01_01(individu, period, parameters): # Extraction des variables d'intérêt eligibilite_lodeom_competitivite = individu('eligibilite_lodeom_competitivite', period) effectif_entreprise_drom = individu('effectif_entreprise_drom', period) smic_proratise = individu('smic_proratise', period) - assiette_allegement = individu('assiette_allegement', period) # individu('salaire_de_base', period) + assiette_allegement = individu('assiette_allegement', period) # Extraction des paramètres d'intérêt lodeom_competitivite = parameters(period).prelevements_sociaux.reductions_cotisations_sociales.exonerations_geographiques_cotis.lodeom_competitivite @@ -950,17 +949,17 @@ def formula_2009_01_01(individu, period, parameters) : seuil = ( seuil_11_salaries_et_plus * not_(petite_entreprise) + seuil_moins_de_11_salaries * petite_entreprise - ) + ) plafond = ( plafond_11_salaries_et_plus * not_(petite_entreprise) + plafond_moins_de_11_salaries * petite_entreprise - ) + ) pente = ( pente_11_salaries_et_plus * not_(petite_entreprise) + pente_moins_de_11_salaries * petite_entreprise - ) + ) # Ratio smic/salaire - ratio_smic_salaire = smic_proratise/(assiette_allegement+1e-16) + ratio_smic_salaire = smic_proratise / (assiette_allegement + 1e-16) # Formule de calcul du taux d'exonération # Règle d'arrondi : 4 décimales la plus proche @@ -968,18 +967,18 @@ def formula_2009_01_01(individu, period, parameters) : return eligibilite_lodeom_competitivite * taux_exoneration * assiette_allegement - def formula_2009_05_01(individu, period, parameters) : + def formula_2009_05_01(individu, period, parameters): # Extraction des variables d'intérêt eligibilite_lodeom_competitivite = individu('eligibilite_lodeom_competitivite', period) effectif_entreprise_drom = individu('effectif_entreprise_drom', period) smic_proratise = individu('smic_proratise', period) - assiette_allegement = individu('assiette_allegement', period) # individu('salaire_de_base', period) + assiette_allegement = individu('assiette_allegement', period) # Extraction des paramètres d'intérêt lodeom_competitivite = parameters(period).prelevements_sociaux.reductions_cotisations_sociales.exonerations_geographiques_cotis.lodeom_competitivite # Extraction des variables d'intérêt # Ratio smic/salaire - ratio_smic_salaire = smic_proratise/(assiette_allegement+1e-16) + ratio_smic_salaire = smic_proratise / (assiette_allegement + 1e-16) # Distinction suivant l'effectif de l'entreprise # Valorisation des paramètres d'intérêt # Moins de 11 salariés @@ -993,14 +992,14 @@ def formula_2009_05_01(individu, period, parameters) : plafond_11_salaries_et_plus = lodeom_competitivite.plafond_entreprises_de_11_salaries_et_plus # Communs taux = lodeom_competitivite.taux - + # Calculs moins de 11 salariés # Calcul du taux d'exonération entre le seuil intermédiaire et le plafond taux_exoneration_intermediaire_plafond = round_(taux * min_(1, seuil_moins_de_11_salaries / pente_moins_de_11_salaries * max_(plafond_moins_de_11_salaries * ratio_smic_salaire - 1, 0)), 4) # Calcul des montants d'exonération montant_exoneration_moins_de_11_salaries = np.where((assiette_allegement/smic_proratise >= seuil_moins_de_11_salaries), taux * seuil_moins_de_11_salaries * smic_proratise, taux * assiette_allegement) montant_exoneration_moins_de_11_salaries = np.where((assiette_allegement/smic_proratise >= seuil_intermediaire_moins_de_11_salaries), taux_exoneration_intermediaire_plafond * assiette_allegement, montant_exoneration_moins_de_11_salaries) - + # Calculs plus de 11 salariés # Calcul du taux d'exonération taux_exoneration = round_(taux * min_(1, seuil_11_salaries_et_plus / pente_11_salaries_et_plus * max_(plafond_11_salaries_et_plus * ratio_smic_salaire - 1, 0)), 4) @@ -1012,12 +1011,12 @@ def formula_2009_05_01(individu, period, parameters) : return eligibilite_lodeom_competitivite * montant_exoneration - def formula_2019_01_01(individu, period, parameters) : + def formula_2019_01_01(individu, period, parameters): # Extraction des variables d'intérêt eligibilite_lodeom_competitivite = individu('eligibilite_lodeom_competitivite', period) effectif_entreprise_drom = individu('effectif_entreprise_drom', period) smic_proratise = individu('smic_proratise', period) - assiette_allegement = individu('assiette_allegement', period) # individu('salaire_de_base', period) + assiette_allegement = individu('assiette_allegement', period) # Extraction des paramètres d'intérêt lodeom_competitivite = parameters(period).prelevements_sociaux.reductions_cotisations_sociales.exonerations_geographiques_cotis.lodeom_competitivite @@ -1030,9 +1029,9 @@ def formula_2019_01_01(individu, period, parameters) : tx_max = ( lodeom_competitivite.entreprises_de_50_salaries_et_plus * not_(petite_entreprise) + lodeom_competitivite.entreprises_de_moins_de_50_salaries * petite_entreprise - ) + ) # Ratio smic/salaire - ratio_smic_salaire = smic_proratise/(assiette_allegement+1e-16) + ratio_smic_salaire = smic_proratise / (assiette_allegement + 1e-16) # Formule de calcul du taux d'exonération # Règle d'arrondi : 4 décimales la plus proche @@ -1043,7 +1042,7 @@ def formula_2019_01_01(individu, period, parameters) : # Types de secteurs d'activité de l'employeur # Peut peut-être être fusionné avec TypeSecteurActivite dans openfisca_france.model.base -class TypesSecteurActivite199UndeciesBCGI(Enum) : +class TypesSecteurActivite199UndeciesBCGI(Enum): __order__ = 'non_renseigne commerce tabac cafes_restaurants conseil_expertise education sante_social immobilier_location navigation services_entreprises loisirs associations poste autre_secteur' non_renseigne = 'Non renseigné' commerce = 'Commerce et réparation automobile' @@ -1052,44 +1051,44 @@ class TypesSecteurActivite199UndeciesBCGI(Enum) : conseil_expertise = "Conseils et expertise" education = 'Education' sante_social = 'Santé-social' - immobilier_location = "Activités immobilières et les activités de location de meublés de tourisme" - navigation = "Navigation de croisière, location sans opérateurs" + immobilier_location = 'Activités immobilières et les activités de location de meublés de tourisme' + navigation = 'Navigation de croisière, location sans opérateurs' services_entreprises = "Services aux entreprises à l'exception de la maintenance, des activités de nettoyage et de conditionnement et des centres d'appel" loisirs = "Loisirs sportifs et culturels à l'exception des jeux de hasard et de la production audiovisuelle et cinématographique" - associations = "Associations" - poste = "Activités postales" - autre_secteur = "Autre secteur" + associations = 'Associations' + poste = 'Activités postales' + autre_secteur = 'Autre secteur' # Secteur d'activité de l'employeur class secteur_activite_employeur_199undeciesBCGI(Variable): - value_type=Enum + value_type = Enum possible_values = TypesSecteurActivite199UndeciesBCGI default_value = TypesSecteurActivite199UndeciesBCGI.non_renseigne - entity=Individu - label="Secteurs d'activité définissant l'éligibilité à la réduction d'impôt au titre d'investissements réalisés en outre-mer" - reference='https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000041524650' - definition_period=MONTH - set_input=set_input_dispatch_by_period + entity = Individu + label = "Secteurs d'activité définissant l'éligibilité à la réduction d'impôt au titre d'investissements réalisés en outre-mer" + reference ='https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000041524650' + definition_period = MONTH + set_input = set_input_dispatch_by_period # Définition de la classe d'éligibilité à la réduction d'impôt révue à l'article 199 undecies B du CGI class eligibilite_199undeciesBCGI(Variable): - value_type=bool - entity=Individu - label="Eligibilité à la réduction d'impôt révue à l'article 199 undecies B du CGI" - reference='https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000041524650' - definition_period=MONTH - set_input=set_input_dispatch_by_period - - def formula_2009_01_01(individu, period, parameters) : + value_type = bool + entity = Individu + label = "Eligibilité à la réduction d'impôt révue à l'article 199 undecies B du CGI" + reference = 'https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000041524650' + definition_period = MONTH + set_input = set_input_dispatch_by_period + + def formula_2009_01_01(individu, period): # Extraction des variables d'intérêt secteur_activite_employeur_199undeciesBCGI = individu('secteur_activite_employeur_199undeciesBCGI', period) depcom_entreprise = individu('depcom_entreprise', period) # Définition de l'appartenance à la Guadeloupe, la Guyane, la Martinique et la Réunion, à Mayotte, à Saint-Pierre et Miquelon, en Nouvelle-Calédonie, En Polynésie Française, à Saint Martin, à Saint Barthélémy, à Wallis-et-Futuna, dans les Terres australes et antarctiques françaises dep_eligible = np.array([depcom_cell[:3] in ['971', '972', '973', '974', '975', '976', '977', '978', '984', '986', '987', '988'] if isinstance(depcom_cell, str) else depcom_cell.decode('utf-8')[:3] in ['971', '972', '973', '974', '975', '976', '977', '978', '984', '986', '987', '988'] for depcom_cell in depcom_entreprise]) - + # Critère sur le secteur d'activité secteur_eligible = secteur_activite_employeur_199undeciesBCGI == TypesSecteurActivite199UndeciesBCGI.autre_secteur @@ -1098,14 +1097,14 @@ def formula_2009_01_01(individu, period, parameters) : return eligibilite - def formula_2014_07_01(individu, period, parameters) : + def formula_2014_07_01(individu, period, parameters): # Extraction des variables d'intérêt secteur_activite_employeur_199undeciesBCGI = individu('secteur_activite_employeur_199undeciesBCGI', period) depcom_entreprise = individu('depcom_entreprise', period) # Définition de l'appartenance à la Guadeloupe, la Guyane, la Martinique et la Réunion, à Mayotte, à Saint-Pierre et Miquelon, en Nouvelle-Calédonie, En Polynésie Française, à Saint Martin, à Saint Barthélémy, à Wallis-et-Futuna, dans les Terres australes et antarctiques françaises dep_eligible = np.array([depcom_cell[:3] in ['971', '972', '973', '974', '975', '976', '977', '978', '984', '986', '987', '988'] if isinstance(depcom_cell, str) else depcom_cell.decode('utf-8')[:3] in ['971', '972', '973', '974', '975', '976', '977', '978', '984', '986', '987', '988'] for depcom_cell in depcom_entreprise]) - + # Critère sur le secteur d'activité secteur_eligible = secteur_activite_employeur_199undeciesBCGI == TypesSecteurActivite199UndeciesBCGI.autre_secteur @@ -1122,33 +1121,33 @@ def formula_2014_07_01(individu, period, parameters) : chiffre_affaires_inferieur_seuil = entreprise_chiffre_affaire < seuil # Eligibilité eligibilite = not_(dep_drom) * eligibilite + dep_drom*chiffre_affaires_inferieur_seuil - - return eligibilite + + return eligibilite # Définition de la classe d'éligibilité au dispositif compétitivité -class eligibilite_lodeom_competitivite_renforcee(Variable) : - value_type=bool - entity=Individu - label="Eligibilité au dispositif compétitivité renforcée de LODEOM" - reference='https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042683758' - definition_period=MONTH - set_input=set_input_dispatch_by_period +class eligibilite_lodeom_competitivite_renforcee(Variable): + value_type = bool + entity = Individu + label = "Eligibilité au dispositif compétitivité renforcée de LODEOM" + reference = 'https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042683758' + definition_period = MONTH + set_input = set_input_dispatch_by_period # Sont concernés : # - les employeurs de moins de 250 salariés au chiffre d'affaire annuel inférieur à 50 millions d'euros # - les employeurs des secteurs du bâtiment, des travaux publics, des transports aériens pour certaines liaisons et ceux assurant la desserte maritime entre certains points - def formula_2009_01_01(individu, period, parameters) : + def formula_2009_01_01(individu, period): # Extraction des variables d'intérêt effectif_entreprise_drom = individu('effectif_entreprise_drom', period) entreprise_chiffre_affaire = individu('entreprise_chiffre_affaire', period) secteur_activite_employeur_lodeom = individu('secteur_activite_employeur_lodeom', period) depcom_entreprise = individu('depcom_entreprise', period) eligibilite_199undeciesBCGI = individu('eligibilite_199undeciesBCGI', period) - + # Définition de l'appartenance à la Guadeloupe, la Guyane, la Martinique et la Réunion dep_drom = np.array([depcom_cell[:3] in ['971', '972', '973', '974'] if isinstance(depcom_cell, str) else depcom_cell.decode('utf-8')[:3] in ['971', '972', '973', '974'] for depcom_cell in depcom_entreprise]) - + # Définition de l'éligibilité suivant l'effectif de l'entreprise effectif_moins_250_salaries = effectif_entreprise_drom < 250 chiffre_affaire_inferieur_50m = entreprise_chiffre_affaire < 50000000 @@ -1156,24 +1155,24 @@ def formula_2009_01_01(individu, period, parameters) : secteur_divers_eligible = secteur_activite_employeur_lodeom == TypesSecteurActiviteLODEOM.divers beneficiaire_perfectionnement_actif = perfectionnement_actif == TypesPerfectionnementActif.beneficiaire # Définition de l'éligibilité - eligibilite = dep_drom * effectif_moins_250_salaries * chiffre_affaire_inferieur_50m *(secteur_divers_eligible + beneficiaire_perfectionnement_actif) + eligibilite = dep_drom * effectif_moins_250_salaries * chiffre_affaire_inferieur_50m * (secteur_divers_eligible + beneficiaire_perfectionnement_actif) # Ajout de l'éligibilité si éligible au 199 undecies B eligibilite += dep_drom * effectif_moins_250_salaries * chiffre_affaire_inferieur_50m * eligibilite_199undeciesBCGI return eligibilite - - def formula_2019_01_01(individu, period, parameters) : + + def formula_2019_01_01(individu, period): # Extraction des variables d'intérêt effectif_entreprise_drom = individu('effectif_entreprise_drom', period) entreprise_chiffre_affaire = individu('entreprise_chiffre_affaire', period) secteur_activite_employeur_lodeom = individu('secteur_activite_employeur_lodeom', period) depcom_entreprise = individu('depcom_entreprise', period) eligibilite_199undeciesBCGI = individu('eligibilite_199undeciesBCGI', period) - + # Définition de l'appartenance à la Guadeloupe, la Guyane, la Martinique et la Réunion dep_drom = np.array([depcom_cell[:3] in ['971', '972', '973', '974'] if isinstance(depcom_cell, str) else depcom_cell.decode('utf-8')[:3] in ['971', '972', '973', '974'] for depcom_cell in depcom_entreprise]) - + # Définition de l'éligibilité suivant l'effectif de l'entreprise effectif_moins_250_salaries = effectif_entreprise_drom < 250 chiffre_affaire_inferieur_50m = entreprise_chiffre_affaire < 50000000 @@ -1181,7 +1180,7 @@ def formula_2019_01_01(individu, period, parameters) : secteur_divers_eligible = secteur_activite_employeur_lodeom == TypesSecteurActiviteLODEOM.divers beneficiaire_perfectionnement_actif = perfectionnement_actif == TypesPerfectionnementActif.beneficiaire # Définition de l'éligibilité - eligibilite = dep_drom * effectif_moins_250_salaries * chiffre_affaire_inferieur_50m *(secteur_divers_eligible + beneficiaire_perfectionnement_actif) + eligibilite = dep_drom * effectif_moins_250_salaries * chiffre_affaire_inferieur_50m * (secteur_divers_eligible + beneficiaire_perfectionnement_actif) # Appartenance au département de la Guyane dep_guyane = np.array([depcom_cell[:3] == '973' if isinstance(depcom_cell, str) else depcom_cell.decode('utf-8')[:3] == '973' for depcom_cell in depcom_entreprise]) @@ -1192,17 +1191,17 @@ def formula_2019_01_01(individu, period, parameters) : return eligibilite - def formula_2020_01_01(individu, period, parameters) : + def formula_2020_01_01(individu, period): # Extraction des variables d'intérêt effectif_entreprise_drom = individu('effectif_entreprise_drom', period) entreprise_chiffre_affaire = individu('entreprise_chiffre_affaire', period) secteur_activite_employeur_lodeom = individu('secteur_activite_employeur_lodeom', period) depcom_entreprise = individu('depcom_entreprise', period) eligibilite_199undeciesBCGI = individu('eligibilite_199undeciesBCGI', period) - + # Définition de l'appartenance à la Guadeloupe, la Guyane, la Martinique et la Réunion dep_drom = np.array([depcom_cell[:3] in ['971', '972', '973', '974'] if isinstance(depcom_cell, str) else depcom_cell.decode('utf-8')[:3] in ['971', '972', '973', '974'] for depcom_cell in depcom_entreprise]) - + # Définition de l'éligibilité suivant l'effectif de l'entreprise effectif_moins_250_salaries = effectif_entreprise_drom < 250 chiffre_affaire_inferieur_50m = entreprise_chiffre_affaire < 50000000 @@ -1210,7 +1209,7 @@ def formula_2020_01_01(individu, period, parameters) : secteur_divers_eligible = secteur_activite_employeur_lodeom == TypesSecteurActiviteLODEOM.divers beneficiaire_perfectionnement_actif = perfectionnement_actif == TypesPerfectionnementActif.beneficiaire # Définition de l'éligibilité - eligibilite = dep_drom * effectif_moins_250_salaries * chiffre_affaire_inferieur_50m *(secteur_divers_eligible + beneficiaire_perfectionnement_actif) + eligibilite = dep_drom * effectif_moins_250_salaries * chiffre_affaire_inferieur_50m * (secteur_divers_eligible + beneficiaire_perfectionnement_actif) # Appartenance au département de la Guyane dep_guyane = np.array([depcom_cell[:3] == '973' if isinstance(depcom_cell, str) else depcom_cell.decode('utf-8')[:3] == '973' for depcom_cell in depcom_entreprise]) @@ -1223,17 +1222,17 @@ def formula_2020_01_01(individu, period, parameters) : return eligibilite - def formula_2021_01_01(individu, period, parameters) : + def formula_2021_01_01(individu, period): # Extraction des variables d'intérêt effectif_entreprise_drom = individu('effectif_entreprise_drom', period) entreprise_chiffre_affaire = individu('entreprise_chiffre_affaire', period) secteur_activite_employeur_lodeom = individu('secteur_activite_employeur_lodeom', period) depcom_entreprise = individu('depcom_entreprise', period) eligibilite_199undeciesBCGI = individu('eligibilite_199undeciesBCGI', period) - + # Définition de l'appartenance à la Guadeloupe, la Guyane, la Martinique et la Réunion dep_drom = np.array([depcom_cell[:3] in ['971', '972', '973', '974'] if isinstance(depcom_cell, str) else depcom_cell.decode('utf-8')[:3] in ['971', '972', '973', '974'] for depcom_cell in depcom_entreprise]) - + # Définition de l'éligibilité suivant l'effectif de l'entreprise effectif_moins_250_salaries = effectif_entreprise_drom < 250 chiffre_affaire_inferieur_50m = entreprise_chiffre_affaire < 50000000 @@ -1241,7 +1240,7 @@ def formula_2021_01_01(individu, period, parameters) : secteur_divers_eligible = secteur_activite_employeur_lodeom == TypesSecteurActiviteLODEOM.divers beneficiaire_perfectionnement_actif = perfectionnement_actif == TypesPerfectionnementActif.beneficiaire # Définition de l'éligibilité - eligibilite = dep_drom * effectif_moins_250_salaries * chiffre_affaire_inferieur_50m *(secteur_divers_eligible + beneficiaire_perfectionnement_actif) + eligibilite = dep_drom * effectif_moins_250_salaries * chiffre_affaire_inferieur_50m * (secteur_divers_eligible + beneficiaire_perfectionnement_actif) # Appartenance au département de la Guyane dep_guyane = np.array([depcom_cell[:3] == '973' if isinstance(depcom_cell, str) else depcom_cell.decode('utf-8')[:3] == '973' for depcom_cell in depcom_entreprise]) @@ -1253,43 +1252,43 @@ def formula_2021_01_01(individu, period, parameters) : secteur_presse = secteur_activite_employeur_lodeom == TypesSecteurActiviteLODEOM.presse # Ajout du secteur audiovisuel parmi les secteurs éligibles eligibilite += dep_drom * effectif_moins_250_salaries * chiffre_affaire_inferieur_50m * (secteur_audiovisuel + secteur_presse + dep_guyane * (secteur_compta_conseil + eligibilite_199undeciesBCGI)) - + return eligibilite # /!\ Revoir si la formule est bonne pour toutes les dates depuis 2009 # Définition de la classe définissant le montant associé au dispositif de compétitivité renforcée -class exoneration_lodeom_competitivite_renforcee(Variable) : - value_type=float - entity=Individu - label="Montant d'exonération associé au dispositif compétitivité renforcée de LODEOM" - reference='https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000041404691' - definition_period=MONTH - set_input=set_input_divide_by_period - - def formula_2009_01_01(individu, period, parameters) : +class exoneration_lodeom_competitivite_renforcee(Variable): + value_type = float + entity = Individu + label = "Montant d'exonération associé au dispositif compétitivité renforcée de LODEOM" + reference = 'https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000041404691' + definition_period = MONTH + set_input = set_input_divide_by_period + + def formula_2009_01_01(individu, period, parameters): # Extraction des variables d'intérêt eligibilite_lodeom_competitivite_renforcee = individu('eligibilite_lodeom_competitivite_renforcee', period) smic_proratise = individu('smic_proratise', period) assiette_allegement = individu('assiette_allegement', period) # Extraction des paramètres d'intérêt lodeom_competitivite_renforcee = parameters(period).prelevements_sociaux.reductions_cotisations_sociales.exonerations_geographiques_cotis.lodeom_competitivite_renforcee - + # Valorisation des paramètres d'intérêt seuil = lodeom_competitivite_renforcee.seuil plafond = lodeom_competitivite_renforcee.plafond taux = lodeom_competitivite_renforcee.taux # Ratio smic/salaire - ratio_smic_salaire = smic_proratise/(assiette_allegement+1e-16) + ratio_smic_salaire = smic_proratise / (assiette_allegement + 1e-16) # Formule de calcul du taux d'exonération # Règle d'arrondi : 4 décimales la plus proche taux_exoneration = round_(taux * min_(1, seuil / (plafond-seuil) * max_(plafond * ratio_smic_salaire - 1, 0)), 4) return eligibilite_lodeom_competitivite_renforcee * taux_exoneration * assiette_allegement - - def formula_2009_05_01(individu, period, parameters) : + + def formula_2009_05_01(individu, period, parameters): # Extraction des variables d'intérêt eligibilite_lodeom_competitivite_renforcee = individu('eligibilite_lodeom_competitivite_renforcee', period) smic_proratise = individu('smic_proratise', period) @@ -1298,7 +1297,7 @@ def formula_2009_05_01(individu, period, parameters) : lodeom_competitivite_renforcee = parameters(period).prelevements_sociaux.reductions_cotisations_sociales.exonerations_geographiques_cotis.lodeom_competitivite_renforcee # Ratio smic/salaire - ratio_smic_salaire = smic_proratise/(assiette_allegement+1e-16) + ratio_smic_salaire = smic_proratise / (assiette_allegement + 1e-16) # Valorisation des paramètres seuil = lodeom_competitivite_renforcee.seuil seuil_intermediaire = lodeom_competitivite_renforcee.seuil_intermediaire @@ -1309,10 +1308,10 @@ def formula_2009_05_01(individu, period, parameters) : # Calcul du montant d'exonération montant_exoneration = np.where((assiette_allegement/smic_proratise >= seuil), taux * seuil * smic_proratise, taux * assiette_allegement) montant_exoneration = np.where((assiette_allegement/smic_proratise >= seuil_intermediaire), taux_exoneration_intermediaire_plafond * assiette_allegement, montant_exoneration) - + return eligibilite_lodeom_competitivite_renforcee * montant_exoneration - - def formula_2014_01_01(individu, period, parameters) : + + def formula_2014_01_01(individu, period, parameters): # Extraction des variables d'intérêt eligibilite_lodeom_competitivite_renforcee = individu('eligibilite_lodeom_competitivite_renforcee', period) smic_proratise = individu('smic_proratise', period) @@ -1321,7 +1320,7 @@ def formula_2014_01_01(individu, period, parameters) : lodeom_competitivite_renforcee = parameters(period).prelevements_sociaux.reductions_cotisations_sociales.exonerations_geographiques_cotis.lodeom_competitivite_renforcee # Ratio smic/salaire - ratio_smic_salaire = smic_proratise/(assiette_allegement+1e-16) + ratio_smic_salaire = smic_proratise / (assiette_allegement + 1e-16) # Valorisation des paramètres seuil = lodeom_competitivite_renforcee.seuil seuil_intermediaire = lodeom_competitivite_renforcee.seuil_intermediaire @@ -1332,10 +1331,10 @@ def formula_2014_01_01(individu, period, parameters) : # Calcul du montant d'exonération montant_exoneration = np.where((assiette_allegement/smic_proratise >= seuil), taux * seuil * smic_proratise, taux * assiette_allegement) montant_exoneration = np.where((assiette_allegement/smic_proratise >= seuil_intermediaire), taux_exoneration_intermediaire_plafond * assiette_allegement, montant_exoneration) - + return eligibilite_lodeom_competitivite_renforcee * montant_exoneration - - def formula_2019_01_01(individu, period, parameters) : + + def formula_2019_01_01(individu, period, parameters): # Extraction des variables d'intérêt eligibilite_lodeom_competitivite_renforcee = individu('eligibilite_lodeom_competitivite_renforcee', period) smic_proratise = individu('smic_proratise', period) @@ -1352,9 +1351,9 @@ def formula_2019_01_01(individu, period, parameters) : tx_max = ( lodeom_competitivite_renforcee.entreprises_de_50_salaries_et_plus * not_(petite_entreprise) + lodeom_competitivite_renforcee.entreprises_de_moins_de_50_salaries * petite_entreprise - ) + ) # Ratio smic/salaire - ratio_smic_salaire = smic_proratise/(assiette_allegement+1e-16) + ratio_smic_salaire = smic_proratise / (assiette_allegement + 1e-16) # Formule de calcul du taux d'exonération # Règle d'arrondi : 4 décimales la plus proche @@ -1364,39 +1363,39 @@ def formula_2019_01_01(individu, period, parameters) : # Définition des types d'occupation de salariés -class TypesOccupationSalarieLODEOM(Enum) : +class TypesOccupationSalarieLODEOM(Enum): __order__ = 'non_renseigne telecommunication informatique infographie conception_objets_connectes autre_occupation' non_renseigne = 'Non renseignée' telecommunication = 'Télécommunication' informatique = 'Informatique' infographie = 'Infographie' conception_objets_connectes = "Conception d'objets connectés" - autre_occupation = "Autre occupation" + autre_occupation = 'Autre occupation' # Définition de l'occupation d'un poste pour le salarié (découpée dans le cadre de LODEOM) -class occupation_salarie_lodeom(Variable) : - value_type=Enum +class occupation_salarie_lodeom(Variable): + value_type = Enum possible_values = TypesOccupationSalarieLODEOM default_value = TypesOccupationSalarieLODEOM.non_renseigne - entity=Individu - label="Occupation du salarié (découpée pour être compatible avec les activités éligibles à LODEOM innovation et croissance)" - reference='' - definition_period=MONTH - set_input=set_input_dispatch_by_period + entity = Individu + label = "Occupation du salarié (découpée pour être compatible avec les activités éligibles à LODEOM innovation et croissance)" + reference = '' + definition_period = MONTH + set_input = set_input_dispatch_by_period # Définition de l'éligibilité à LODEOM innovation et croissance -class eligibilite_lodeom_innovation_croissance(Variable) : - value_type=bool - entity=Individu - label="Eligibilité au dispositif innovation et croissance de LODEOM" - reference='https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042683758' - definition_period=MONTH - set_input=set_input_dispatch_by_period +class eligibilite_lodeom_innovation_croissance(Variable): + value_type = bool + entity = Individu + label = "Eligibilité au dispositif innovation et croissance de LODEOM" + reference = 'https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000042683758' + definition_period = MONTH + set_input = set_input_dispatch_by_period # Sont concernés - def formula(individu, period, parameters) : + def formula(individu, period): # Extraction des variables d'intérêt depcom_entreprise = individu('depcom_entreprise', period) effectif_entreprise_drom = individu('effectif_entreprise_drom', period) @@ -1406,7 +1405,7 @@ def formula(individu, period, parameters) : # Définition de l'appartenance à la Guadeloupe, la Guyane, la Martinique et la Réunion # dep_drom = depcom_entreprise[:3] in ['971', '972', '973', '974'] dep_drom = np.array([depcom_cell[:3] in ['971', '972', '973', '974'] if isinstance(depcom_cell, str) else depcom_cell.decode('utf-8')[:3] in ['971', '972', '973', '974'] for depcom_cell in depcom_entreprise]) - + # Définition de l'éligibilité suivant l'effectif de l'entreprise effectif_moins_250_salaries = effectif_entreprise_drom < 250 chiffre_affaire_inferieur_50m = entreprise_chiffre_affaire < 50000000 @@ -1415,7 +1414,7 @@ def formula(individu, period, parameters) : occupation_informatique = occupation_salarie_lodeom == TypesOccupationSalarieLODEOM.informatique occupation_infographie = occupation_salarie_lodeom == TypesOccupationSalarieLODEOM.infographie occupation_conception_objets_connectes = occupation_salarie_lodeom == TypesOccupationSalarieLODEOM.conception_objets_connectes - + # Définition de l'éligibilité eligibilite = dep_drom * effectif_moins_250_salaries * chiffre_affaire_inferieur_50m * (occupation_telecommunication + occupation_informatique + occupation_infographie + occupation_conception_objets_connectes) @@ -1423,15 +1422,15 @@ def formula(individu, period, parameters) : # Définition du montant d'exonération associé à LODEOM innovation et croissance -class exoneration_lodeom_innovation_croissance(Variable) : - value_type=float - entity=Individu - label="Montant d'exonération associé au dispositif innovation et croissance de LODEOM" - reference='https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000041404691' - definition_period=MONTH - set_input=set_input_divide_by_period - - def formula_2019_01_01(individu, period, parameters) : +class exoneration_lodeom_innovation_croissance(Variable): + value_type = float + entity = Individu + label = "Montant d'exonération associé au dispositif innovation et croissance de LODEOM" + reference = 'https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000041404691' + definition_period = MONTH + set_input = set_input_divide_by_period + + def formula_2019_01_01(individu, period, parameters): # Extraction des variables d'intérêt eligibilite_lodeom_innovation_croissance = individu('eligibilite_lodeom_innovation_croissance', period) effectif_entreprise_drom = individu('effectif_entreprise_drom', period) @@ -1447,35 +1446,35 @@ def formula_2019_01_01(individu, period, parameters) : tx_max = ( lodeom_innovation_croissance.entreprises_de_50_salaries_et_plus * not_(petite_entreprise) + lodeom_innovation_croissance.entreprises_de_moins_de_50_salaries * petite_entreprise - ) + ) # Ratio smic/salaire - ratio_smic_salaire = smic_proratise/(assiette_allegement+1e-16) - + ratio_smic_salaire = smic_proratise / (assiette_allegement + 1e-16) + # Formule de calcul du taux d'exonération # Règle d'arrondi : 4 décimales la plus proche # Calcul du taux d'exonération entre le seuil et le seuil intermédiaire taux_exoneration_seuil_intermediaire = round_(tx_max * seuil / seuil_intermediaire, 4) - + # Taux d'exonération entre le seuil intermédiaire et le plafond taux_exoneration = round_(taux_exoneration_seuil_intermediaire * min_(1, seuil_intermediaire / (plafond-seuil_intermediaire) * max_(plafond * ratio_smic_salaire - 1, 0)), 4) # Calculant du montant d'exonération - montant_exoneration = np.where((assiette_allegement/smic_proratise >= seuil), tx_max * seuil * smic_proratise, tx_max * assiette_allegement) - montant_exoneration = np.where((assiette_allegement/smic_proratise >= seuil_intermediaire), taux_exoneration * assiette_allegement, montant_exoneration) - + montant_exoneration = np.where((assiette_allegement / smic_proratise >= seuil), tx_max * seuil * smic_proratise, tx_max * assiette_allegement) + montant_exoneration = np.where((assiette_allegement / smic_proratise >= seuil_intermediaire), taux_exoneration * assiette_allegement, montant_exoneration) + return eligibilite_lodeom_innovation_croissance * montant_exoneration # Définition du montant d'exonération LODEOM quelque soit le dispositif class exoneration_lodeom(Variable): - value_type=float - entity=Individu - label="Montant d'exonération LODEOM" - reference='https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000041404691' - definition_period=MONTH - set_input=set_input_divide_by_period - - def formula(individu, period, parameters) : + value_type = float + entity = Individu + label = "Montant d'exonération LODEOM" + reference = 'https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000041404691' + definition_period = MONTH + set_input = set_input_divide_by_period + + def formula(individu, period): # Extraction des différents allègements LODEOM exoneration_lodeom_competitivite = individu('exoneration_lodeom_competitivite', period) exoneration_lodeom_competitivite_renforcee = individu('exoneration_lodeom_competitivite_renforcee', period) @@ -1484,4 +1483,3 @@ def formula(individu, period, parameters) : # Hiérachie des barèmes les plus favorables # exoneration_lodeom_innovation_croissance > exoneration_lodeom_competitivite_renforcee > exoneration_lodeom_competitivite return exoneration_lodeom_innovation_croissance + not_(exoneration_lodeom_innovation_croissance) * exoneration_lodeom_competitivite_renforcee + not_(exoneration_lodeom_innovation_croissance + exoneration_lodeom_competitivite_renforcee) * exoneration_lodeom_competitivite - \ No newline at end of file