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,
        )
Ejemplo n.º 2
0
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,
    )
Ejemplo n.º 3
0
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)
         )
Ejemplo n.º 5
0
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)
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
0
 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)
Ejemplo n.º 14
0
 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)
Ejemplo n.º 16
0
 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)
Ejemplo n.º 18
0
 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)
Ejemplo n.º 20
0
    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)
Ejemplo n.º 21
0
 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))
Ejemplo n.º 22
0
 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))
Ejemplo n.º 24
0
 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)
Ejemplo n.º 25
0
 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))
Ejemplo n.º 26
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 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)
Ejemplo n.º 28
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))
Ejemplo n.º 30
0
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)