def test_run_through():
    years = [2006, 2007, 2008, 2009, 2010, 2011]
    df = get_denombrements_fiscaux_data_frame(years=years)
    index_by_variable_name = create_index_by_variable_name(
        formula_by_variable_name, level_2_formula_by_variable_name)
    variable_name = 'interets_imposes_au_prelevement_liberatoire'
    get_or_construct_value(df,
                           variable_name,
                           index_by_variable_name,
                           years=years)
    variable_name = 'dividendes_imposes_au_prelevement_liberatoire'
    get_or_construct_value(df,
                           variable_name,
                           index_by_variable_name,
                           years=years)
    variable_name = 'revenus_imposes_au_prelevement_liberatoire'
    get_or_construct_value(df,
                           variable_name,
                           index_by_variable_name,
                           years=years,
                           fill_value=0)
    variable_name = 'assurances_vie_imposees_au_prelevement_liberatoire'
    get_or_construct_value(df,
                           variable_name,
                           index_by_variable_name,
                           years=years)
    variable_name = 'f2da'
    get_or_construct_value(df,
                           variable_name,
                           index_by_variable_name,
                           years=years)
    variable_name = u'f5he'
    get_or_construct_value(df,
                           variable_name,
                           index_by_variable_name,
                           years=range(2010, 2012))
    variable_name = u'f5jr'
    get_or_construct_value(df,
                           variable_name,
                           index_by_variable_name,
                           years=range(2007, 2012),
                           fill_value=0)
    variable_name = 'plus_values_professionnelles_regime_normal'
    get_or_construct_value(df,
                           variable_name,
                           index_by_variable_name,
                           years=range(2007, 2012),
                           fill_value=0)
def test_run_through():
    years = [2006, 2007, 2008, 2009, 2010, 2011]
    df = get_denombrements_fiscaux_data_frame(years = years)
    index_by_variable_name = create_index_by_variable_name(formula_by_variable_name, level_2_formula_by_variable_name)
    variable_name = 'interets_imposes_au_prelevement_liberatoire'
    get_or_construct_value(df, variable_name, index_by_variable_name, years = years)
    variable_name = 'dividendes_imposes_au_prelevement_liberatoire'
    get_or_construct_value(df, variable_name, index_by_variable_name, years = years)
    variable_name = 'revenus_imposes_au_prelevement_liberatoire'
    get_or_construct_value(df, variable_name, index_by_variable_name, years = years, fill_value = 0)
    variable_name = 'assurances_vie_imposees_au_prelevement_liberatoire'
    get_or_construct_value(df, variable_name, index_by_variable_name, years = years)
    variable_name = 'f2da'
    get_or_construct_value(df, variable_name, index_by_variable_name, years = years)
    variable_name = u'f5he'
    get_or_construct_value(df, variable_name, index_by_variable_name, years = range(2010, 2012))
    variable_name = u'f5jr'
    get_or_construct_value(df, variable_name, index_by_variable_name, years = range(2007, 2012), fill_value = 0)
    variable_name = 'plus_values_professionnelles_regime_normal'
    get_or_construct_value(df, variable_name, index_by_variable_name, years = range(2007, 2012), fill_value = 0)
def test_corrections():
    years = range(2006, 2013)
    df = get_denombrements_fiscaux_data_frame(years=years)
    index_by_variable_name = create_index_by_variable_name(
        formula_by_variable_name, level_2_formula_by_variable_name)

    test_by_variable = dict(
        # Correction of f5io in 2008 in Agrégats IPP
        benefices_agricoles_forfait_imposables=[
            {
                'year': 2006,
                'target': 896512850
            },
            {
                'year': 2008,
                'target': 883970587
            },
        ],
        benefices_agricoles_reels_imposables=[
            {
                'year': 2006,
                'target': 5150417953
            },
            {
                'year': 2008,
                'target': 6515953706
            },
        ],
        benefices_agricoles_reels_imposables_sans_cga=[
            {
                'year': 2006,
                'target': 165830038
            },
        ],
        benefices_agricoles_reels_deficits=[
            {
                'year': 2006,
                'target': 519217942
            },
        ],
        benefices_agricoles_reels_sans_cga_deficits=[
            {
                'year': 2006,
                'target': 208934263
            },
        ],
        deficits_industriels_commerciaux_professionnels=[
            {
                'year': 2006,
                'target': 1427052021
            },
        ],
        deficits_industriels_commerciaux_non_professionnels=[
            {
                'year': 2006,
                'target': 301194784
            },
        ],
        plus_values_mobilieres_stock_options=[
            {
                'year': 2008,
                'target': 228873359
            },
            # {'year': 2010, 'target': 690459289}, TODO: check dénombremenst DGFIP vs IPP
        ],
        revenus_imposes_au_bareme=[
            {
                'year': 2010,
                'target': 18907148239
            },
        ],
        plus_values_mobilieres_regime_normal=[
            {
                'year': 2010,
                'target': 5393808406
            },
        ],
        plus_values_professionnelles_regime_normal=[
            {
                'year': 2011,
                'target': 1101248065
            },
            {
                'year': 2010,
                'target': 1083102431
            },
        ],
        # Inversion 2ch et 2gr dans dénombrements fiscax (Agrégats IPP et en ligne)
        assurances_vie_imposees_au_bareme=[
            {
                'year': 2009,
                'target': 1063726777
            },
        ],
        # Test revenus exonérés
        benefices_agricoles_forfait_exoneres=[
            {
                'year': 2011,
                'target': (5826752 + 466632 + 467)
            },
        ],
        benefices_agricoles_reels_exoneres=[
            {
                'year': 2011,
                'target': (64880784 + 15074222 + 3733)
            },
        ],
        benefices_agricoles_reels_exoneres_sans_cga=[
            {
                'year': 2011,
                'target': (10214497 + 2275427 + 171787)
            },
        ],
    )

    def assert_value_construction(variable_name, test):
        year = test['year']
        target = test['target']
        value = get_or_construct_value(df,
                                       variable_name,
                                       index_by_variable_name,
                                       years=years,
                                       fill_value=0)[0].loc[year]
        if year >= 2009:
            assert all(
                value == target), "{} for {}: got {} instead of {}".format(
                    variable_name, year, value.values, target)

    for variable_name, tests in test_by_variable.iteritems():
        for test in tests:
            yield assert_value_construction, variable_name, test
def build_irpp_tables(years=None, fill_value=numpy.NaN):
    assert years is not None
    assert isinstance(years, list)
    raw_data = get_denombrements_fiscaux_data_frame(years=years, fill_value=0)
    aggregates = build_aggregates(
        raw_data,
        formula_by_variable_name,
        level_2_formula_by_variable_name=level_2_formula_by_variable_name,
        years=years,
        fill_value=fill_value,
    )
    data_frame_by_irpp_table_name = collections.OrderedDict([
        # 1. Tableau IRPP1: Les revenus figurant dans les déclarations de revenus
        (
            'irpp_1',
            aggregates[[
                'salaires',
                'salaires_imposables',
                'heures_supplementaires',
                # TODO
                'revenus_d_activite_non_salariee',
                'benefices_agricoles',
                'benefices_industriels_commerciaux',
                'benefices_non_commerciaux',
                'revenus_activite_non_salariee_exoneres',
                'revenus_de_remplacement',
                'pensions_de_retraite',
                'allocations_chomage',
                'revenus_fonciers',
                'revenus_fonciers_regime_normal',
                'revenus_fonciers_micro_foncier',
                'revenus_financiers',
                'frais_reels',
                'pensions_alimentaires_percues',
            ]]),
        # 2. Tableau IRPP2: Détails des revenus financiers (intérêts, dividendes, plus-values) figurant dans les
        # déclations de revenus (imposition au barème, imposition au prélèvement forfaitaire libératoire (PL) et
        # plus-values)
        ('irpp_2', aggregates[[
            'revenus_imposes_au_bareme', 'dividendes_imposes_au_bareme',
            'interet_imposes_au_bareme', 'assurances_vie_imposees_au_bareme',
            'revenus_imposes_au_prelevement_liberatoire',
            'dividendes_imposes_au_prelevement_liberatoire',
            'interets_imposes_au_prelevement_liberatoire',
            'assurances_vie_imposees_au_prelevement_liberatoire',
            'plus_values', 'revenus_financiers',
            'revenus_financiers_hors_plus_values'
        ]]),
        # 3. Tableau IRPP3: Plus-values mobilières et professionnelles
        ('irpp_3', aggregates[[
            'plus_values',
            'plus_values_mobilieres',
            'plus_values_mobilieres_regime_normal',
            'plus_values_mobilieres_stock_options',
            'plus_values_mobilieres_retraite_dirigeant',
            'plus_values_professionnelles',
            'plus_values_professionnelles_regime_normal',
            'plus_values_professionnelles_retraite_dirigeant',
        ]]),
        (
            'irpp_4',
            aggregates[[
                'revenus_d_activite_non_salariee',
                'benefices_agricoles',
                'benefices_agricoles_bruts',
                'deficits_agricoles',
                'benefices_industriels_commerciaux',
                'benefices_industriels_commerciaux_bruts',
                'deficits_industriels_commerciaux',
                #    'bnc',
                'revenus_activite_non_salariee_exoneres',
            ]]),
        #        ('irpp_5_a', aggregates[[
        #            'benefices_agricoles',
        #            'benefices_agricoles_forfait_exoneres',
        #            'benefices_agricoles_forfait_imposables',
        #            'benefices_agricoles_reels_exoneres',
        #            'benefices_agricoles_reels_imposables',
        #            'benefices_agricoles_reels_deficits',
        #            'benefices_agricoles_reels_exoneres_sans_cga',
        #            'benefices_agricoles_reels_imposables_sans_cga',
        #            'benefices_agricoles_reels_sans_cga_deficits',
        #            ]])
    ])
    return data_frame_by_irpp_table_name
def test_corrections():
    years = range(2006, 2013)
    df = get_denombrements_fiscaux_data_frame(years = years)
    index_by_variable_name = create_index_by_variable_name(formula_by_variable_name, level_2_formula_by_variable_name)

    test_by_variable = dict(
        # Correction of f5io in 2008 in Agrégats IPP
        benefices_agricoles_forfait_imposables = [
            {'year': 2006, 'target': 896512850},
            {'year': 2008, 'target': 883970587},
            ],
        benefices_agricoles_reels_imposables = [
            {'year': 2006, 'target': 5150417953},
            {'year': 2008, 'target': 6515953706},
            ],
        benefices_agricoles_reels_imposables_sans_cga = [
            {'year': 2006, 'target': 165830038},
            ],
        benefices_agricoles_reels_deficits = [
            {'year': 2006, 'target': 519217942},
            ],
        benefices_agricoles_reels_sans_cga_deficits = [
            {'year': 2006, 'target': 208934263},
            ],
        deficits_industriels_commerciaux_professionnels = [
            {'year': 2006, 'target': 1427052021},
            ],
        deficits_industriels_commerciaux_non_professionnels = [
            {'year': 2006, 'target': 301194784},
            ],
        plus_values_mobilieres_stock_options = [
            {'year': 2008, 'target': 228873359},
            # {'year': 2010, 'target': 690459289}, TODO: check dénombremenst DGFIP vs IPP
            ],
        revenus_imposes_au_bareme = [
            {'year': 2010, 'target': 18907148239},
            ],
        plus_values_mobilieres_regime_normal = [
            {'year': 2010, 'target': 5393808406},
            ],
        plus_values_professionnelles_regime_normal = [
            {'year': 2011, 'target': 1101248065},
            {'year': 2010, 'target': 1083102431},
            ],
        # Inversion 2ch et 2gr dans dénombrements fiscax (Agrégats IPP et en ligne)
        assurances_vie_imposees_au_bareme = [
            {'year': 2009, 'target': 1063726777},
            ],
        # Test revenus exonérés
        benefices_agricoles_forfait_exoneres = [
            {'year': 2011, 'target': (5826752 + 466632 + 467)},
            ],
        benefices_agricoles_reels_exoneres = [
            {'year': 2011, 'target': (64880784 + 15074222 + 3733)},
            ],
        benefices_agricoles_reels_exoneres_sans_cga = [
            {'year': 2011, 'target': (10214497 + 2275427 + 171787)},
            ],
        
        )

    def assert_value_construction(variable_name, test):
        year = test['year']
        target = test['target']
        value = get_or_construct_value(
            df, variable_name, index_by_variable_name, years = years, fill_value = 0)[0].loc[year]
        if year >= 2009:
            assert all(value == target), "{} for {}: got {} instead of {}".format(
                variable_name, year, value.values, target)

    for variable_name, tests in test_by_variable.iteritems():
        for test in tests:
            yield assert_value_construction, variable_name, test
def build_irpp_tables(years = None, fill_value = numpy.NaN):
    assert years is not None
    assert isinstance(years, list)
    raw_data = get_denombrements_fiscaux_data_frame(years = years, fill_value = 0)
    aggregates = build_aggregates(
        raw_data,
        formula_by_variable_name,
        level_2_formula_by_variable_name = level_2_formula_by_variable_name,
        years = years,
        fill_value = fill_value,
        )
    data_frame_by_irpp_table_name = collections.OrderedDict([
        # 1. Tableau IRPP1: Les revenus figurant dans les déclarations de revenus
        ('irpp_1', aggregates[[
            'salaires',
            'salaires_imposables',
            'heures_supplementaires',
            # TODO
            'revenus_d_activite_non_salariee',
            'benefices_agricoles',
            'benefices_industriels_commerciaux',
            'benefices_non_commerciaux',
            'revenus_activite_non_salariee_exoneres',
            'revenus_de_remplacement',
            'pensions_de_retraite',
            'allocations_chomage',
            'revenus_fonciers',
            'revenus_fonciers_regime_normal',
            'revenus_fonciers_micro_foncier',
            'revenus_financiers',
            'frais_reels',
            'pensions_alimentaires_percues',
            ]]),
        # 2. Tableau IRPP2: Détails des revenus financiers (intérêts, dividendes, plus-values) figurant dans les
        # déclations de revenus (imposition au barème, imposition au prélèvement forfaitaire libératoire (PL) et
        # plus-values)
        ('irpp_2', aggregates[[
            'revenus_imposes_au_bareme',
            'dividendes_imposes_au_bareme',
            'interet_imposes_au_bareme',
            'assurances_vie_imposees_au_bareme',
            'revenus_imposes_au_prelevement_liberatoire',
            'dividendes_imposes_au_prelevement_liberatoire',
            'interets_imposes_au_prelevement_liberatoire',
            'assurances_vie_imposees_au_prelevement_liberatoire',
            'plus_values',
            'revenus_financiers',
            'revenus_financiers_hors_plus_values'
            ]]),
        # 3. Tableau IRPP3: Plus-values mobilières et professionnelles
        ('irpp_3', aggregates[[
            'plus_values',
            'plus_values_mobilieres',
            'plus_values_mobilieres_regime_normal',
            'plus_values_mobilieres_stock_options',
            'plus_values_mobilieres_retraite_dirigeant',
            'plus_values_professionnelles',
            'plus_values_professionnelles_regime_normal',
            'plus_values_professionnelles_retraite_dirigeant',
            ]]),
        ('irpp_4', aggregates[[
            'revenus_d_activite_non_salariee',
            'benefices_agricoles',
            'benefices_agricoles_bruts',
            'deficits_agricoles',
            'benefices_industriels_commerciaux',
            'benefices_industriels_commerciaux_bruts',
            'deficits_industriels_commerciaux',
            #    'bnc',
            'revenus_activite_non_salariee_exoneres',
            ]]),
        #        ('irpp_5_a', aggregates[[
        #            'benefices_agricoles',
        #            'benefices_agricoles_forfait_exoneres',
        #            'benefices_agricoles_forfait_imposables',
        #            'benefices_agricoles_reels_exoneres',
        #            'benefices_agricoles_reels_imposables',
        #            'benefices_agricoles_reels_deficits',
        #            'benefices_agricoles_reels_exoneres_sans_cga',
        #            'benefices_agricoles_reels_imposables_sans_cga',
        #            'benefices_agricoles_reels_sans_cga_deficits',
        #            ]])
        ])
    return data_frame_by_irpp_table_name