def test_round_marginal_tax_scale(): base = np.array([200, 200.2, 200.002, 200.6, 200.006, 200.5, 200.005]) marginal_tax_scale = MarginalRateTaxScale() marginal_tax_scale.add_bracket(0, 0) marginal_tax_scale.add_bracket(100, 0.1) assert_near( marginal_tax_scale.calc(base), [10, 10.02, 10.0002, 10.06, 10.0006, 10.05, 10.0005], absolute_error_margin = 1e-10, ) assert_near( marginal_tax_scale.calc(base, round_base_decimals = 1), [10, 10., 10., 10.1, 10., 10, 10.], absolute_error_margin = 1e-10, ) assert_near( marginal_tax_scale.calc(base, round_base_decimals = 2), [10, 10.02, 10., 10.06, 10.00, 10.05, 10], absolute_error_margin = 1e-10, ) assert_near( marginal_tax_scale.calc(base, round_base_decimals = 3), [10, 10.02, 10., 10.06, 10.001, 10.05, 10], absolute_error_margin = 1e-10, )
def test_round_marginal_tax_scale(): base = np.array([200, 200.2, 200.002, 200.6, 200.006, 200.5, 200.005]) marginal_tax_scale = MarginalRateTaxScale() marginal_tax_scale.add_bracket(0, 0) marginal_tax_scale.add_bracket(100, 0.1) assert_near( marginal_tax_scale.calc(base), [10, 10.02, 10.0002, 10.06, 10.0006, 10.05, 10.0005], absolute_error_margin=1e-10, ) assert_near( marginal_tax_scale.calc(base, round_base_decimals=1), [10, 10., 10., 10.1, 10., 10, 10.], absolute_error_margin=1e-10, ) assert_near( marginal_tax_scale.calc(base, round_base_decimals=2), [10, 10.02, 10., 10.06, 10.00, 10.05, 10], absolute_error_margin=1e-10, ) assert_near( marginal_tax_scale.calc(base, round_base_decimals=3), [10, 10.02, 10., 10.06, 10.001, 10.05, 10], absolute_error_margin=1e-10, )
def test_inverse_marginal_tax_scale(): marginal_tax_scale = MarginalRateTaxScale() marginal_tax_scale.add_bracket(0, 0) marginal_tax_scale.add_bracket(1, 0.1) marginal_tax_scale.add_bracket(3, 0.05) brut = np.array([1, 2, 3, 4, 5, 3.28976, 8764]) net = brut - marginal_tax_scale.calc(brut) inverse = marginal_tax_scale.inverse() assert_near(brut, inverse.calc(net), 1e-15) marginal_tax_scale.add_bracket(4, 0) net = brut - marginal_tax_scale.calc(brut) inverse = marginal_tax_scale.inverse() assert_near(brut, inverse.calc(net), 1e-15)
def formula(individu, period, parameters): plafond_securite_sociale_annuel = parameters(period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name = 'maladie_maternite') bareme.add_bracket(0, 0) bareme.add_bracket(1.1, .065) # TODO parsing des paramèters IPP pas à jour bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( (categorie_non_salarie == TypesCategorieNonSalarie.profession_liberale) * individu('rpns_individu', period) ) taux = ( .015 + (.065 - .015) * min_( max_( assiette / plafond_securite_sociale_annuel, 0 ), 1.1 ) / 1.1 ) return - ( taux * assiette * (assiette < 1.1 * plafond_securite_sociale_annuel) + bareme.calc(assiette) )
def test_linear_average_rate_tax_scale(): base = np.array([1, 1.5, 2, 2.5]) marginal_tax_scale = MarginalRateTaxScale() marginal_tax_scale.add_bracket(0, 0) marginal_tax_scale.add_bracket(1, 0.1) marginal_tax_scale.add_bracket(2, 0.2) assert_near(marginal_tax_scale.calc(base), [0, .05, .1, .2], absolute_error_margin=1e-16) average_tax_scale = marginal_tax_scale.to_average() # Note: assert_near doesn't work for inf. # assert_near(average_tax_scale.thresholds, [0, 1, 2, np.inf], absolute_error_margin = 0) assert average_tax_scale.thresholds == [0, 1, 2, np.inf] assert_near(average_tax_scale.rates, [0, 0, 0.05, 0.2], absolute_error_margin=0) assert_near(average_tax_scale.calc(base), [0, 0.0375, 0.1, 0.125], absolute_error_margin=1e-10) new_marginal_tax_scale = average_tax_scale.to_marginal() assert_near(new_marginal_tax_scale.thresholds, marginal_tax_scale.thresholds, absolute_error_margin=0) assert_near(new_marginal_tax_scale.rates, marginal_tax_scale.rates, absolute_error_margin=0) assert_near(average_tax_scale.rates, [0, 0, 0.05, 0.2], absolute_error_margin=0)
def formula_2015(individu, period, parameters): plafond_securite_sociale_annuel = parameters(period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name = 'famille') bareme.add_bracket(0, 0) bareme.add_bracket(1.4, .031) # TODO parsing des paramèters pas à jour bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( (categorie_non_salarie == TypesCategorieNonSalarie.artisan) + (categorie_non_salarie == TypesCategorieNonSalarie.commercant) + (categorie_non_salarie == TypesCategorieNonSalarie.profession_liberale) ) * individu('rpns_individu', period) taux = ( 0 + (.031) * min_( max_( assiette / plafond_securite_sociale_annuel - 1.1, 0 ), (1.4 - 1.1) ) / (1.4 - 1.1) ) return - ( taux * assiette * (assiette < 1.4 * plafond_securite_sociale_annuel) + bareme.calc(assiette) )
def formula_2015(individu, period, parameters): plafond_securite_sociale_annuel = parameters(period).cotsoc.gen.plafond_securite_sociale * 12 formation = parameters(period).prelevements_sociaux.formation_ac # Artisan bareme_artisan = MarginalRateTaxScale(name = 'formation_artisan') bareme_artisan.add_bracket(0, formation.artisans_sous_pss) bareme_artisan.add_bracket(1, 0) bareme_artisan.multiply_thresholds(plafond_securite_sociale_annuel) # Comemrcant bareme_commercant = MarginalRateTaxScale(name = 'formation_commercant') bareme_commercant.add_bracket(0, formation.commercants_industriels.sous_pss) bareme_commercant.add_bracket(1, 0) bareme_commercant.multiply_thresholds(plafond_securite_sociale_annuel) assiette = individu('rpns_individu', period) categorie_non_salarie = individu('categorie_non_salarie', period) artisan = (categorie_non_salarie == TypesCategorieNonSalarie.artisan) commercant = (categorie_non_salarie == TypesCategorieNonSalarie.commercant) return -bareme_artisan.calc(assiette * artisan) - bareme_commercant.calc(assiette * commercant)
def test_simple_linear_average_rate_tax_scale(): base = np.array([1, 1.5, 2, 2.5, 3.0, 4.0]) marginal_tax_scale = MarginalRateTaxScale() marginal_tax_scale.add_bracket(0, 0) marginal_tax_scale.add_bracket(1, 0.1) marginal_tax_scale.add_bracket(2, 0.2) marginal_tax_scale.add_bracket(3, 0) assert_near(marginal_tax_scale.calc(base), [0, .05, .1, .2, .3, .3], absolute_error_margin = 1e-10)
def test_simple_linear_average_rate_tax_scale(): base = np.array([1, 1.5, 2, 2.5, 3.0, 4.0]) marginal_tax_scale = MarginalRateTaxScale() marginal_tax_scale.add_bracket(0, 0) marginal_tax_scale.add_bracket(1, 0.1) marginal_tax_scale.add_bracket(2, 0.2) marginal_tax_scale.add_bracket(3, 0) assert_near(marginal_tax_scale.calc(base), [0, .05, .1, .2, .3, .3], absolute_error_margin = 1e-10)
def formula_2013(individu, period, parameters): plafond_securite_sociale_annuel = parameters( period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name='retraite_complementaire') bareme.add_bracket(0, .09) # TODO taux à la louche car hétérogène bareme.add_bracket(5, 0) bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = (+(categorie_non_salarie == TypesCategorieNonSalarie. profession_liberale)) * individu('rpns_individu', period) return -bareme.calc(assiette)
def formula_2013(individu, period, parameters): plafond_securite_sociale_annuel = parameters(period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name = 'retraite_complementaire') bareme.add_bracket(0, .09) # TODO taux à la louche car hétérogène bareme.add_bracket(5, 0) bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( + (categorie_non_salarie == TypesCategorieNonSalarie.profession_liberale) ) * individu('rpns_individu', period) return -bareme.calc(assiette)
def formula(individu, period, parameters): plafond_securite_sociale_annuel = parameters(period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name = 'formation_profession_liberale') taux = parameters(period).prelevements_sociaux.formation_pl.formation_professionnelle.sous_pss bareme.add_bracket(0, taux) bareme.add_bracket(1, 0) bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( + (categorie_non_salarie == TypesCategorieNonSalarie.profession_liberale) ) * individu('rpns_individu', period) return -bareme.calc(assiette)
def formula_2015(individu, period, parameters): plafond_securite_sociale_annuel = parameters(period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name = 'vieillesse') assurance_vieillesse = parameters(period).prelevements_sociaux.ret_pl.assurance_vieillesse bareme.add_bracket(0, assurance_vieillesse.sous_1_pss) bareme.add_bracket(1, assurance_vieillesse.entre_1_et_5_pss) bareme.add_bracket(5, 0) bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( + (categorie_non_salarie == TypesCategorieNonSalarie.profession_liberale) ) * individu('rpns_individu', period) return -bareme.calc(assiette)
def formula_2015(individu, period, parameters): plafond_securite_sociale_annuel = parameters( period).cotsoc.gen.plafond_securite_sociale * 12 formation = parameters(period).prelevements_sociaux.formation_ac # Artisan bareme_artisan = MarginalRateTaxScale(name='formation_artisan') bareme_artisan.add_bracket(0, formation.artisans_sous_pss) bareme_artisan.add_bracket(1, 0) bareme_artisan.multiply_thresholds(plafond_securite_sociale_annuel) # Comemrcant bareme_commercant = MarginalRateTaxScale(name='formation_commercant') bareme_commercant.add_bracket( 0, formation.commercants_industriels.sous_pss) bareme_commercant.add_bracket(1, 0) bareme_commercant.multiply_thresholds(plafond_securite_sociale_annuel) assiette = individu('rpns_individu', period) categorie_non_salarie = individu('categorie_non_salarie', period) artisan = (categorie_non_salarie == TypesCategorieNonSalarie.artisan) commercant = ( categorie_non_salarie == TypesCategorieNonSalarie.commercant) return -bareme_artisan.calc( assiette * artisan) - bareme_commercant.calc(assiette * commercant)
def formula_2014(individu, period, parameters): plafond_securite_sociale_annuel = parameters(period).cotsoc.gen.plafond_securite_sociale * 12 vieillesse_artisan_commercant = parameters(period).prelevements_sociaux.ret_ac bareme = MarginalRateTaxScale(name = 'vieillesse') bareme.add_bracket(0, vieillesse_artisan_commercant.artisans.sous_pss + vieillesse_artisan_commercant.tous_independants.tout_salaire) bareme.add_bracket(1, vieillesse_artisan_commercant.tous_independants.tout_salaire) bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( (categorie_non_salarie == TypesCategorieNonSalarie.artisan) + (categorie_non_salarie == TypesCategorieNonSalarie.commercant) ) * individu('rpns_individu', period) return -bareme.calc(assiette)
def formula_2015(individu, period, parameters): plafond_securite_sociale_annuel = parameters( period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name='vieillesse') assurance_vieillesse = parameters( period).prelevements_sociaux.ret_pl.assurance_vieillesse bareme.add_bracket(0, assurance_vieillesse.sous_1_pss) bareme.add_bracket(1, assurance_vieillesse.entre_1_et_5_pss) bareme.add_bracket(5, 0) bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = (+(categorie_non_salarie == TypesCategorieNonSalarie. profession_liberale)) * individu('rpns_individu', period) return -bareme.calc(assiette)
def formula_2015(individu, period, parameters): plafond_securite_sociale_annuel = parameters(period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name = 'deces') deces = parameters(period).prelevements_sociaux.deces_ac.artisans bareme.add_bracket(0, deces.sous_pss) bareme.add_bracket(1, 0) bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( (categorie_non_salarie == TypesCategorieNonSalarie.artisan) + (categorie_non_salarie == TypesCategorieNonSalarie.commercant) ) * individu('rpns_individu', period) return -bareme.calc(assiette)
def formula(individu, period, parameters): plafond_securite_sociale_annuel = parameters( period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name='formation_profession_liberale') taux = parameters( period ).prelevements_sociaux.formation_pl.formation_professionnelle.sous_pss bareme.add_bracket(0, taux) bareme.add_bracket(1, 0) bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = (+(categorie_non_salarie == TypesCategorieNonSalarie. profession_liberale)) * individu('rpns_individu', period) return -bareme.calc(assiette)
def formula_2013(individu, period, parameters): plafond_securite_sociale_annuel = parameters(period).cotsoc.gen.plafond_securite_sociale * 12 retraite_complementaire = parameters(period).prelevements_sociaux.ret_comp_ac.artisans_industriels_commercants montant_du_plafond_rci = retraite_complementaire.montant_du_plafond_rci bareme = MarginalRateTaxScale(name = 'retraite_complementaire') bareme.add_bracket(0, retraite_complementaire.sous_plafond_rci) bareme.add_bracket(montant_du_plafond_rci, retraite_complementaire.entre_1_plafond_rci_et_4_plafonds_pss) bareme.add_bracket(4 * plafond_securite_sociale_annuel, 0) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( (categorie_non_salarie == TypesCategorieNonSalarie.artisan) + (categorie_non_salarie == TypesCategorieNonSalarie.commercant) ) * individu('rpns_individu', period) return -bareme.calc(assiette)
def formula_2015(individu, period, parameters): plafond_securite_sociale_annuel = parameters( period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name='deces') deces = parameters(period).prelevements_sociaux.deces_ac.artisans bareme.add_bracket(0, deces.sous_pss) bareme.add_bracket(1, 0) bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( (categorie_non_salarie == TypesCategorieNonSalarie.artisan) + (categorie_non_salarie == TypesCategorieNonSalarie.commercant) ) * individu('rpns_individu', period) return -bareme.calc(assiette)
def formula(individu, period, parameters): plafond_securite_sociale_annuel = parameters( period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name='maladie_maternite') bareme.add_bracket(0, 0) bareme.add_bracket(1.1, .065) # TODO parsing des paramèters IPP pas à jour bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ((categorie_non_salarie == TypesCategorieNonSalarie.profession_liberale) * individu('rpns_individu', period)) taux = (.015 + (.065 - .015) * min_( max_(assiette / plafond_securite_sociale_annuel, 0), 1.1) / 1.1) return -(taux * assiette * (assiette < 1.1 * plafond_securite_sociale_annuel) + bareme.calc(assiette))
def formula_2014(individu, period, parameters): plafond_securite_sociale_annuel = parameters( period).cotsoc.gen.plafond_securite_sociale * 12 vieillesse_artisan_commercant = parameters( period).prelevements_sociaux.ret_ac bareme = MarginalRateTaxScale(name='vieillesse') bareme.add_bracket( 0, vieillesse_artisan_commercant.artisans.sous_pss + vieillesse_artisan_commercant.tous_independants.tout_salaire) bareme.add_bracket( 1, vieillesse_artisan_commercant.tous_independants.tout_salaire) bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( (categorie_non_salarie == TypesCategorieNonSalarie.artisan) + (categorie_non_salarie == TypesCategorieNonSalarie.commercant) ) * individu('rpns_individu', period) return -bareme.calc(assiette)
def formula_2017(individu, period, parameters): plafond_securite_sociale_annuel = parameters(period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name = 'famille') bareme.add_bracket(0, 0) bareme.add_bracket(.7, .065) bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( (categorie_non_salarie == TypesCategorieNonSalarie.artisan) + (categorie_non_salarie == TypesCategorieNonSalarie.commercant) ) * individu('rpns_individu', period) cotisation_sous_1_1_pss = assiette * ( (assiette < .7 * plafond_securite_sociale_annuel) * ( (.065 - .035) * assiette / (.7 * plafond_securite_sociale_annuel) + .035 # TODO check taux non nul à assiette quasi nulle ) ) return -(cotisation_sous_1_1_pss + bareme.calc(assiette))
def formula_2013(individu, period, parameters): plafond_securite_sociale_annuel = parameters( period).cotsoc.gen.plafond_securite_sociale * 12 retraite_complementaire = parameters( period ).prelevements_sociaux.ret_comp_ac.artisans_industriels_commercants montant_du_plafond_rci = retraite_complementaire.montant_du_plafond_rci bareme = MarginalRateTaxScale(name='retraite_complementaire') bareme.add_bracket(0, retraite_complementaire.sous_plafond_rci) bareme.add_bracket( montant_du_plafond_rci, retraite_complementaire.entre_1_plafond_rci_et_4_plafonds_pss) bareme.add_bracket(4 * plafond_securite_sociale_annuel, 0) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( (categorie_non_salarie == TypesCategorieNonSalarie.artisan) + (categorie_non_salarie == TypesCategorieNonSalarie.commercant) ) * individu('rpns_individu', period) return -bareme.calc(assiette)
def formula_2017(individu, period, parameters): plafond_securite_sociale_annuel = parameters( period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name='famille') bareme.add_bracket(0, 0) bareme.add_bracket(.7, .065) bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( (categorie_non_salarie == TypesCategorieNonSalarie.artisan) + (categorie_non_salarie == TypesCategorieNonSalarie.commercant) ) * individu('rpns_individu', period) cotisation_sous_1_1_pss = assiette * ( (assiette < .7 * plafond_securite_sociale_annuel) * ((.065 - .035) * assiette / (.7 * plafond_securite_sociale_annuel) + .035 # TODO check taux non nul à assiette quasi nulle )) return -(cotisation_sous_1_1_pss + bareme.calc(assiette))
def formula_2015(individu, period, parameters): plafond_securite_sociale_annuel = parameters( period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name='famille') bareme.add_bracket(0, 0) bareme.add_bracket(1.4, .031) # TODO parsing des paramèters pas à jour bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( (categorie_non_salarie == TypesCategorieNonSalarie.artisan) + (categorie_non_salarie == TypesCategorieNonSalarie.commercant) + (categorie_non_salarie == TypesCategorieNonSalarie.profession_liberale)) * individu( 'rpns_individu', period) taux = (0 + (.031) * min_(max_(assiette / plafond_securite_sociale_annuel - 1.1, 0), (1.4 - 1.1)) / (1.4 - 1.1)) return -(taux * assiette * (assiette < 1.4 * plafond_securite_sociale_annuel) + bareme.calc(assiette))
def test_linear_average_rate_tax_scale(): base = np.array([1, 1.5, 2, 2.5]) marginal_tax_scale = MarginalRateTaxScale() marginal_tax_scale.add_bracket(0, 0) marginal_tax_scale.add_bracket(1, 0.1) marginal_tax_scale.add_bracket(2, 0.2) assert_near(marginal_tax_scale.calc(base), [0, .05, .1, .2], absolute_error_margin = 0) average_tax_scale = marginal_tax_scale.to_average() # Note: assert_near doesn't work for inf. # assert_near(average_tax_scale.thresholds, [0, 1, 2, np.inf], absolute_error_margin = 0) assert average_tax_scale.thresholds == [0, 1, 2, np.inf] assert_near(average_tax_scale.rates, [0, 0, 0.05, 0.2], absolute_error_margin = 0) assert_near(average_tax_scale.calc(base), [0, 0.0375, 0.1, 0.125], absolute_error_margin = 1e-10) new_marginal_tax_scale = average_tax_scale.to_marginal() assert_near(new_marginal_tax_scale.thresholds, marginal_tax_scale.thresholds, absolute_error_margin = 0) assert_near(new_marginal_tax_scale.rates, marginal_tax_scale.rates, absolute_error_margin = 0) assert_near(average_tax_scale.rates, [0, 0, 0.05, 0.2], absolute_error_margin = 0)
def formula_2018(individu, period, parameters): plafond_securite_sociale_annuel = parameters( period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name='famille') bareme.add_bracket(0, 0) bareme.add_bracket(1.1, .072) bareme.add_bracket(5, .065) bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( (categorie_non_salarie == TypesCategorieNonSalarie.artisan) + (categorie_non_salarie == TypesCategorieNonSalarie.commercant) ) * individu('rpns_individu', period) cotisation_sous_1_1_pss = assiette * ( (assiette > .4 * plafond_securite_sociale_annuel) * (assiette <= 1.1 * plafond_securite_sociale_annuel) * ((.072 - .022) * assiette / (1.1 * plafond_securite_sociale_annuel) + .022) + (assiette <= .4 * plafond_securite_sociale_annuel) * ((.022 - .085) * assiette / (0.4 * plafond_securite_sociale_annuel) + .085)) return -(cotisation_sous_1_1_pss + bareme.calc(assiette))
def formula_2018(individu, period, parameters): plafond_securite_sociale_annuel = parameters(period).cotsoc.gen.plafond_securite_sociale * 12 bareme = MarginalRateTaxScale(name = 'famille') bareme.add_bracket(0, 0) bareme.add_bracket(1.1, .072) bareme.add_bracket(5, .065) bareme.multiply_thresholds(plafond_securite_sociale_annuel) categorie_non_salarie = individu('categorie_non_salarie', period) assiette = ( (categorie_non_salarie == TypesCategorieNonSalarie.artisan) + (categorie_non_salarie == TypesCategorieNonSalarie.commercant) ) * individu('rpns_individu', period) cotisation_sous_1_1_pss = assiette * ( (assiette > .4 * plafond_securite_sociale_annuel) * (assiette <= 1.1 * plafond_securite_sociale_annuel) * ( (.072 - .022) * assiette / (1.1 * plafond_securite_sociale_annuel) + .022 ) + (assiette <= .4 * plafond_securite_sociale_annuel) * ( (.022 - .085) * assiette / (0.4 * plafond_securite_sociale_annuel) + .085 ) ) return - (cotisation_sous_1_1_pss + bareme.calc(assiette))
def test_inverse_scaled_marginal_tax_scale(): marginal_tax_scale = MarginalRateTaxScale() marginal_tax_scale.add_bracket(0, 0) marginal_tax_scale.add_bracket(1, 0.1) marginal_tax_scale.add_bracket(3, 0.05) brut = np.array([1, 2, 3, 4, 5, 6]) net = brut - marginal_tax_scale.calc(brut) inverse = marginal_tax_scale.inverse() assert_near(brut, inverse.calc(net), 1e-15) brut = np.array([1, 2, 3, 4, 5, 6]) brut_scale = 12.345 brut_scaled = brut * brut_scale scaled_marginal_tax_scale = marginal_tax_scale.scale_tax_scales(brut_scale) net_scaled = (brut_scaled - scaled_marginal_tax_scale.calc(brut_scaled)) scaled_inverse = scaled_marginal_tax_scale.inverse() assert_near(brut_scaled, scaled_inverse.calc(net_scaled), 1e-13) inverse = marginal_tax_scale.inverse() inversed_net = inverse.calc(net) net_scale = brut_scale inversed_net_scaled = inversed_net * net_scale assert_near(brut_scaled, inversed_net_scaled, 1e-13)