from sqlalchemy import create_engine, types
import pandas as pd
import numpy as np
print(f"Pandas version: {pd.__version__} (pandas version used: 2.1.4)")
print(f"Numpy version: {np.__version__} (numpy version used: 2.0.25)")

def create_connection():
    engine = create_engine(
        'mysql+pymysql://qvanderlinden:XEMFj9Y8ErKyyY6df2MK@dev.kurtosis.nl/venster_voor_waterschappen'
    )
    return engine

# Add calculations into new table

def add_calculated_columns():
    engine = create_connection()
    table_name = 'VVW_vragenlijst'

    # Loading data from VVW_vragenlijst table into Pandas DataFrame
    query = f"SELECT * FROM {table_name}"
    df = pd.read_sql(query, engine)

    # Load all data from VVW_waves without filtering by year
    query = f"SELECT * FROM VVW_waves"
    waves = pd.read_sql(query, engine)

    # Merge both tables based on VVW_id and year
    df = pd.merge(df, waves, on=['VVW_id', 'year'], how='left')
    
    #######################################################
    #   VRAGENLIJST VOORBEREKENINGEN
    #######################################################

    # Calculate total FTE for overhead
    df['v_totaal_fte_overhead'] = (
        df[
            [
                'formatieve_omvang_leidinggevenden_hele_organisatie',
                'formatieve_omvang_financien_toezicht_controle',
                'formatieve_omvang_p_o_hrm',
                'formatieve_omvang_inkoopfunctie',
                'formatieve_omvang_communicatiefunctie',
                'formatieve_omvang_juridische_zaken',
                'formatieve_omvang_bestuurszaken',
                'formatieve_omvang_ict',
                'formatieve_omvang_facilitaire_zaken',
                'formatieve_omvang_managementondersteuning_hele_organisatie',
                'formatieve_omvang_div'
            ]
        ].fillna(0).sum(axis=1) - 
        df[
            [
                'formatieve_omvang_leidinggevenden_bedrijfsvoering',
                'formatieve_omvang_managementondersteuning_bedrijfsvoering'
            ]
        ].fillna(0).sum(axis=1)
    ).round(4)

    #######################################################

    # Calculate percentage overhead formation
    df['v_percentage_overheadformatie'] = (
        (df['v_totaal_fte_overhead'] / df['formatieve_omvang'])
    ).round(4)

    #######################################################

    # Calculate total FTE for business operations
    df['v_totaal_fte_bedrijfsvoering'] = (
        df[
            [
                'formatieve_omvang_financien_toezicht_controle',
                'formatieve_omvang_p_o_hrm',
                'formatieve_omvang_inkoopfunctie',
                'formatieve_omvang_communicatiefunctie',
                'formatieve_omvang_juridische_zaken',
                'formatieve_omvang_ict',
                'formatieve_omvang_facilitaire_zaken',
                'formatieve_omvang_div'
            ]
        ].fillna(0).sum(axis=1)
    ).round(4)

    #######################################################

    # Calculate percentage business operations
    df['v_percentage_bedrijfsvoering'] = (
        (df['v_totaal_fte_bedrijfsvoering'].fillna(0) / df['formatieve_omvang'].fillna(0))
    ).round(4)

    #######################################################

    # Calculate percentage of temporary employment contracts
    df['v_percentage_aanstellingen_bepaalde_tijd'] = (
        (df['aantal_fte_bepaalde_tijd'].fillna(0) / df['werkelijke_bezetting'].fillna(0))
    ).round(4)

    #######################################################

    # Calculate organization flexibility
    df['v_flexibiliteit_organisatie'] = (
        (
            df['aantal_fte_bepaalde_tijd'].fillna(0) + df['aantal_externe_inhuur_fte'].fillna(0)
        ) / 
        (
            df['werkelijke_bezetting'].fillna(0) + df['aantal_externe_inhuur_fte'].fillna(0)
        )
    ).round(4)

    #######################################################

    # Calculate percentage inflow of employees
    df['v_percentage_instroom'] = (
        (df['medewerkers_in_dienst'].fillna(0) / df['totaal_medewerkers'].fillna(0))
    ).round(4)

    #######################################################

    # Calculate percentage outflow of employees
    df['v_percentage_uitstroom'] = (
        (df['medewerkers_vertrokken'].fillna(0) / df['totaal_medewerkers'].fillna(0))
    ).round(4)

    #######################################################

    # Calculate average salary per FTE
    df['v_gemiddelde_loonsom_per_fte'] = (
        df['totale_loonsom'].fillna(0) / df['werkelijke_bezetting'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate workplace index
    df['v_werkplekindex'] = (
        df['beschikbare_werkplekken'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage of external hiring costs
    df['v_percentage_externe_inhuur'] = (
        df['totale_kosten_inhuur'].fillna(0) /
        (df['totale_loonsom'].fillna(0) + df['totale_kosten_inhuur'].fillna(0))
    ).round(4)

    #######################################################

    # Calculate costs of tax collection
    df['v_kosten_invordering'] = (
        df['kosten_invordering_waterschapsbelastingen'].fillna(0) / df['totaal_aanslagbiljetten'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate office space per FTE
    df['v_ruimtebeslag_kantoorruimte_per_fte'] = (
        df['verhuurbaar_vloeroppervlak'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate total employees by age category
    df['v_som_medewerkers_leeftijdscategorie'] = (
        df[
            [
                'medewerkers_tot_35_jaar',
                'medewerkers_35_45_jaar',
                'medewerkers_45_55_jaar',
                'medewerkers_55_ouder'
            ]
        ].fillna(0).sum(axis=1)
    ).round(4)

    #######################################################

    # Calculate net costs for tax collection
    df['v_saldo_kosten_opbrengsten_belastinginning'] = (
        df['kosten_invordering_waterschapsbelastingen'].fillna(0) - df['invorderingsopbrengsten'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage occupancy
    df['v_percentage_bezetting'] = (
        (df['werkelijke_bezetting'].fillna(0) / df['formatieve_omvang'].fillna(0))
    ).round(4)

    #######################################################

    # Calculate total net costs per tax assessment line
    df['v_totale_nettokosten_aanslagregel'] = (
        (
            df['kosten_heffing_waterschapsbelastingen'].fillna(0) +
            df['kosten_invordering_waterschapsbelastingen'].fillna(0) +
            (df['kosten_invordering_waterschapsbelastingen'].fillna(0) - df['invorderingsopbrengsten'].fillna(0))
        ) / df['totaal_aanslagregels'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage expenditure on training and development
    df['v_percentage_uitgaven_opleiding_ontwikkeling'] = (
        (df['uitgaven_opleiding_ontwikkeling'].fillna(0) / df['totale_loonsom'].fillna(0))
    ).round(4)

    #######################################################

    # Calculate total ICT costs across categories
    df['v_totale_ict_kosten_categorien'] = (
        df[
            [
                'ict_kosten_personeelskosten',
                'ict_kosten_inhuur_uitbesteding',
                'ict_kosten_software',
                'ict_kosten_hardware',
                'ict_kosten_afschrijvingen',
                'ict_kosten_telefonie_datacommunicatie'
            ]
        ].fillna(0).sum(axis=1)
    ).round(4)

    #######################################################

    # Calculate ICT cost per employee
    df['v_ict_kosten_per_medewerker'] = (
        df['totale_ict_kosten'].fillna(0) /
        (df['totaal_medewerkers'].fillna(0) + df['aantal_externe_inhuur_personen'].fillna(0))
    ).round(4)

    #######################################################

    # Calculate total employees to be serviced
    df['v_te_servicen_medewerkers'] = (
        df['totaal_medewerkers'].fillna(0) + df['aantal_externe_inhuur_personen'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate workspaces per serviced employee
    df['v_werkplekken_per_te_servicen_medewerker'] = (
        df['beschikbare_werkplekken'].fillna(0) /
        (df['totaal_medewerkers'].fillna(0) + df['aantal_externe_inhuur_personen'].fillna(0))
    ).round(4)

    #######################################################

    # Calculate other ICT costs
    df['v_overige_ict_kosten'] = (
        df['totale_ict_kosten'].fillna(0) -
        df[
            [
                'ict_kosten_personeelskosten',
                'ict_kosten_inhuur_uitbesteding',
                'ict_kosten_software',
                'ict_kosten_hardware',
                'ict_kosten_telefonie_datacommunicatie',
                'ict_kosten_afschrijvingen'
            ]
        ].fillna(0).sum(axis=1)
    ).round(4)

    #######################################################

    # Calculate control calculation for apparatus costs
    df['v_controleberekening_apparaatskosten'] = (
        (
            df[
                [
                    'totale_ict_kosten',
                    'totale_kosten_inhuur',
                    'totale_loonsom',
                    'huisvestingskosten_kantoorruimte',
                    'uitgaven_opleiding_ontwikkeling'
                ]
            ].fillna(0).sum(axis=1) - 
            df[
                [
                    'ict_kosten_personeelskosten',
                    'ict_kosten_inhuur_uitbesteding'
                ]
            ].fillna(0).sum(axis=1)
        )
    ).round(4)

    #######################################################

    # Calculate total FTE for salary scales
    df['v_optelsom_fte_salarisschalen'] = (
        df[
            [
                'aantal_fte_salarisschaal_1_6',
                'aantal_fte_salarisschaal_7_9',
                'aantal_fte_salarisschaal_10_12',
                'aantal_fte_salarisschaal_13_hoger',
                'aantal_fte_salarisschaal_onbekend'
            ]
        ].fillna(0).sum(axis=1)
    ).round(4)

    #######################################################

    # Calculate percentage of apparatus costs
    df['v_percentage_apparaatskosten'] = (
        (df['werkelijke_apparaatskosten'].fillna(0) / df['totaal_exploitatierekening'].fillna(0))
    ).round(4)

    #######################################################

    # Calculate percentage of data function
    df['v_percentage_datafunctie'] = (
        (df['formatieve_omvang_datafuncties'].fillna(0) / df['formatieve_omvang'].fillna(0))
    ).round(4)

    #######################################################

    # Calculate percentage ICT costs excluding process automation
    df['v_percentage_ict_kosten_exclusief_procesautomatisering'] = (
        (df['totale_ict_kosten'].fillna(0) / df['werkelijke_apparaatskosten'].fillna(0))
    ).round(4)

    #######################################################

    # Calculate percentage ICT costs excluding process automation
    df['v_percentage_ict_kosten_inclusief_procesautomatisering'] = (
        (df['totale_ict_kosten_inclusief_procesautomatisering'].fillna(0) / df['werkelijke_apparaatskosten'].fillna(0))
    ).round(4)

    #######################################################

    # Calculate total overhead costs excluding ICT
    df['v_totale_overheadkosten_excl_ict'] = (
        (
            df[
                [
                    'formatieve_omvang_leidinggevenden_hele_organisatie',
                    'formatieve_omvang_financien_toezicht_controle',
                    'formatieve_omvang_p_o_hrm',
                    'formatieve_omvang_inkoopfunctie',
                    'formatieve_omvang_communicatiefunctie',
                    'formatieve_omvang_juridische_zaken',
                    'formatieve_omvang_bestuurszaken',
                    'formatieve_omvang_facilitaire_zaken',
                    'formatieve_omvang_managementondersteuning_hele_organisatie',
                    'formatieve_omvang_div'
                ]
            ].fillna(0).sum(axis=1) - 
            df[
                [
                    'formatieve_omvang_leidinggevenden_bedrijfsvoering',
                    'formatieve_omvang_managementondersteuning_bedrijfsvoering'
                ]
            ].fillna(0).sum(axis=1)
        ) * 
        (df['totale_loonsom'].fillna(0) / df['werkelijke_bezetting'].fillna(0)) + df['kosten_inhuur_uitbesteding_overhead'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage overhead costs excluding ICT
    df['v_percentage_overheadkosten_excl_ict'] = (
        (
            (
                df[
                    [
                        'formatieve_omvang_leidinggevenden_hele_organisatie',
                        'formatieve_omvang_financien_toezicht_controle',
                        'formatieve_omvang_p_o_hrm',
                        'formatieve_omvang_inkoopfunctie',
                        'formatieve_omvang_communicatiefunctie',
                        'formatieve_omvang_juridische_zaken',
                        'formatieve_omvang_bestuurszaken',
                        'formatieve_omvang_facilitaire_zaken',
                        'formatieve_omvang_managementondersteuning_hele_organisatie',
                        'formatieve_omvang_div'
                    ]
                ].fillna(0).sum(axis=1) - 
                df[
                    [
                        'formatieve_omvang_leidinggevenden_bedrijfsvoering',
                        'formatieve_omvang_managementondersteuning_bedrijfsvoering'
                    ]
                ].fillna(0).sum(axis=1)
            ) * 
            (df['totale_loonsom'].fillna(0) / df['werkelijke_bezetting'].fillna(0)) + 
            df['kosten_inhuur_uitbesteding_overhead'].fillna(0)
        ) / df['werkelijke_apparaatskosten'].fillna(0) # part of different formula for 163224 --> which is correct!
    ).round(4)

    #######################################################

    # Calculate costs for tax assessment
    df['v_kosten_belastingheffing'] = (
        df['kosten_heffing_waterschapsbelastingen'].fillna(0) / df['totaal_aanslagregels'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage housing costs
    df['v_percentage_huisvestingskosten'] = (
        df['huisvestingskosten_kantoorruimte'].fillna(0) / df['werkelijke_apparaatskosten'].fillna(0)
    ).round(4)

    #######################################################
    #   DASHBOARD VOORBEREKENINGEN
    #######################################################

    # Map sustainability criterion to numerical values
    def duurzaamheid_gunningscriterium_mapping(row):
        if row['percentage_duurzaamheid_gunningscriterium'] in [1]:
            return 1
        elif row['percentage_duurzaamheid_gunningscriterium'] in [2, 25]:
            return 2
        elif row['percentage_duurzaamheid_gunningscriterium'] in [3, 50]:
            return 3
        elif row['percentage_duurzaamheid_gunningscriterium'] in [4, 75]:
            return 4
        else:
            return np.nan

    df['d_duurzaamheid_gunningscriterium'] = df.apply(duurzaamheid_gunningscriterium_mapping, axis=1)

    #######################################################

    # Calculate communication percentage
    df['d_communicatie'] = (
        df['formatieve_omvang_communicatiefunctie'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate control apparatus costs per FTE
    df['d_controle_apparaatslasten_per_fte'] = (
        df['v_controleberekening_apparaatskosten'].fillna(0) / df['werkelijke_bezetting'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate DIV percentage
    df['d_div'] = (
        df['formatieve_omvang_div'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate exploitation realization percentage
    df['d_exploitatierealisatie'] = (
        df['w_netto_exploitatiekosten_realisatie'].fillna(0) / df['w_netto_exploitatiekosten_raming'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate facility management housing percentage
    df['d_facilitaire_zaken_huisvesting'] = (
        df['formatieve_omvang_facilitaire_zaken'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate finance, supervision, and control percentage
    df['d_financien_toezicht_controle'] = (
        df['formatieve_omvang_financien_toezicht_controle'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage objections resolved within 6 weeks
    df['d_percentage_bezwaren_6wk'] = (
        df['w_perc_bezwaren_6wk'].fillna((df['percentage_bezwaren_afgerond_6_weken']/100))
    ).round(4)

    #######################################################

    # Calculate housing costs per square meter
    df['d_huisvestingskosten_per_m2'] = (
        df['huisvestingskosten_kantoorruimte'].fillna(0) / df['verhuurbaar_vloeroppervlak'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate housing costs per FTE
    df['d_huisvestingskosten_per_fte'] = (
        df['huisvestingskosten_kantoorruimte'].fillna(0) / df['werkelijke_bezetting'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate housing costs relative to apparatus costs
    df['d_huisvestingskosten_tov_apparaatslasten'] = (
        df['huisvestingskosten_kantoorruimte'].fillna(0) / df['werkelijke_apparaatskosten'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage for salary scale 1-6
    df['d_percentage_salarisschaal_1_6'] = (
        df['aantal_fte_salarisschaal_1_6'].fillna(0) / df['v_optelsom_fte_salarisschalen'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage for salary scale 7-9
    df['d_percentage_salarisschaal_7_9'] = (
        df['aantal_fte_salarisschaal_7_9'].fillna(0) / df['v_optelsom_fte_salarisschalen'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage for salary scale 10-12
    df['d_percentage_salarisschaal_10_12'] = (
        df['aantal_fte_salarisschaal_10_12'].fillna(0) / df['v_optelsom_fte_salarisschalen'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage for salary scale 13 and higher
    df['d_percentage_salarisschaal_13_hoger'] = (
        df['aantal_fte_salarisschaal_13_hoger'].fillna(0) / df['v_optelsom_fte_salarisschalen'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage for unknown salary scale
    df['d_pecentage_salarisschaal_onbekend'] = (
        df['aantal_fte_salarisschaal_onbekend'].fillna(0) / df['v_optelsom_fte_salarisschalen'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage of employees with a contract shorter than 3 years
    df['d_percentage_dienstverband_korter3jaar'] = (
        df['dienstverband_korter_dan_3_jaar'].fillna(0) / df['totaal_medewerkers'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage of employees with a contract longer than 10 years
    df['d_percentage_dienstverband_langer10jaar'] = (
        df['dienstverband_10_jaar_of_langer'].fillna(0) / df['totaal_medewerkers'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage of other types of contracts
    df['d_percentage_dienstverband_overig'] = (
        1 - (
            (df['dienstverband_korter_dan_3_jaar'].fillna(0) / df['totaal_medewerkers'].fillna(0)) +
            (df['dienstverband_10_jaar_of_langer'].fillna(0) / df['totaal_medewerkers'].fillna(0))
        )
    ).round(4)

    #######################################################

    # Calculate ICT percentage
    df['d_ict'] = (
        df['formatieve_omvang_ict'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate ICT costs relative to apparatus costs
    df['d_ict_tov_apparaatskosten'] = (
        df['totale_ict_kosten_inclusief_procesautomatisering'].fillna(
            df['v_percentage_ict_kosten_inclusief_procesautomatisering'].fillna(0)
        ) / df['werkelijke_apparaatskosten'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate purchasing percentage
    df['d_inkoop'] = (
        df['formatieve_omvang_inkoopfunctie'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate legal affairs percentage
    df['d_juridische_zaken'] = (
        df['formatieve_omvang_juridische_zaken'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate HRM percentage
    df['d_po_hrm'] = (
        df['formatieve_omvang_p_o_hrm'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate part-time factor
    df['d_partime_factor'] = (
        df['werkelijke_bezetting'].fillna(0) / df['totaal_medewerkers'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage for board affairs and support
    df['d_percentage_bestuurszaken_en_bestuursondersteuning'] = (
        df['formatieve_omvang_bestuurszaken'].fillna(0) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate percentage of payments within legal term
    df['d_percentage_betaling_wettelijke_termijn'] = ((
        df['percentage_tijdige_betalingen'].fillna(df['percentage_e_facturen'].fillna(0))
    /100)).round(4)

    #######################################################

    # Calculate percentage of line managers
    df['d_percentage_lijnmanagers'] = (
        (
            (df['formatieve_omvang_leidinggevenden_hele_organisatie'].fillna(0) -
            df['formatieve_omvang_leidinggevenden_bedrijfsvoering'].fillna(0)) /
            df['formatieve_omvang'].fillna(0)
        )
    ).round(4)

    #######################################################

    # Calculate percentage of management support in primary process
    df['d_percentage_managementondersteuning_primair_process'] = (
        (
            df['formatieve_omvang_managementondersteuning_hele_organisatie'].fillna(0) -
            df['formatieve_omvang_managementondersteuning_bedrijfsvoering'].fillna(0)
        ) / df['formatieve_omvang'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate project realization percentage
    df['d_projectrealisatie'] = (
        df['w_bruto_investeringsuitgaven_realisatie'].fillna(0) / df['w_bruto_investeringsuitgaven_raming'].fillna(0)
    ).round(4)

    #######################################################

    # Calculate span of control
    df['d_span_of_control'] = (
        (
            df['totaal_medewerkers'].fillna(0) /
            df['formatieve_omvang_leidinggevenden_hele_organisatie'].fillna(0)
        ) - 1 #lijnmanager zit zelf ook in die organisatie (lijnmanager managed niet zichzelf)
    ).round(4)

    #######################################################

    # Calculate apparaatslasten tov begroting (we dont know 104786???)
    # df['d_apparaatslasten_tov_begroting'] = (
    #    (df['werkelijke_apparaatskosten'] / df['104786']).fillna(df['163212'] / 100)
    #).round(4)


    #######################################################
    #   SPECIAL TRANSFORMATIONS FOR BOTH TYPES OF CALCULATIONS
    #######################################################

    # Multiply the 'd_percentage_betaling_wettelijke_termijn' column by 100 where 'year' is not 2023
    # df.loc[df['year'] != 2023, 'd_percentage_betaling_wettelijke_termijn'] *= 100
    df['d_percentage_betaling_wettelijke_termijn'] *= 100


    #######################################################
    #   FINAL EDITS FOR BOTH TYPES OF CALCULATIONS
    #######################################################

    # Sanity Check: Replace infinity values with NaN
    df = df.replace([np.inf, -np.inf], np.nan)

    # Create a subset of columns to include in the VVW_calculations table
    df_subset = df[['VVW_id', 'year', 
                    'd_pecentage_salarisschaal_onbekend', 
                    'd_percentage_dienstverband_korter3jaar', 
                    'd_percentage_dienstverband_langer10jaar', 
                    'd_percentage_dienstverband_overig', 
                    'd_ict', 
                    'd_ict_tov_apparaatskosten', 
                    'd_inkoop', 
                    'd_juridische_zaken', 
                    'd_po_hrm', 
                    'd_partime_factor', 
                    'd_percentage_bestuurszaken_en_bestuursondersteuning', 
                    'd_percentage_betaling_wettelijke_termijn', 
                    'd_percentage_lijnmanagers', 
                    'd_percentage_managementondersteuning_primair_process', 
                    'd_projectrealisatie', 
                    'd_span_of_control', 
                    'd_communicatie', 
                    'd_controle_apparaatslasten_per_fte', 
                    'd_div', 
                    'd_duurzaamheid_gunningscriterium', 
                    'd_exploitatierealisatie', 
                    'd_facilitaire_zaken_huisvesting', 
                    'd_financien_toezicht_controle', 
                    'd_percentage_bezwaren_6wk', 
                    'd_huisvestingskosten_per_m2', 
                    'd_huisvestingskosten_per_fte', 
                    'd_huisvestingskosten_tov_apparaatslasten', 
                    'd_percentage_salarisschaal_1_6', 
                    'd_percentage_salarisschaal_7_9', 
                    'd_percentage_salarisschaal_10_12', 
                    'd_percentage_salarisschaal_13_hoger', 
                    'v_totaal_fte_overhead', 
                    'v_percentage_overheadformatie', 
                    'v_totaal_fte_bedrijfsvoering', 
                    'v_percentage_bedrijfsvoering', 
                    'v_percentage_aanstellingen_bepaalde_tijd', 
                    'v_flexibiliteit_organisatie', 
                    'v_percentage_instroom', 
                    'v_percentage_uitstroom', 
                    'v_gemiddelde_loonsom_per_fte', 
                    'v_werkplekindex', 
                    'v_percentage_externe_inhuur', 
                    'v_kosten_invordering', 
                    'v_ruimtebeslag_kantoorruimte_per_fte', 
                    'v_som_medewerkers_leeftijdscategorie', 
                    'v_saldo_kosten_opbrengsten_belastinginning', 
                    'v_percentage_bezetting', 
                    'v_totale_nettokosten_aanslagregel', 
                    'v_percentage_uitgaven_opleiding_ontwikkeling', 
                    'v_totale_ict_kosten_categorien', 
                    'v_ict_kosten_per_medewerker', 
                    'v_te_servicen_medewerkers', 
                    'v_werkplekken_per_te_servicen_medewerker', 
                    'v_overige_ict_kosten', 
                    'v_controleberekening_apparaatskosten', 
                    'v_optelsom_fte_salarisschalen', 
                    'v_percentage_apparaatskosten', 
                    'v_percentage_datafunctie', 
                    'v_percentage_ict_kosten_inclusief_procesautomatisering', 
                    'v_percentage_ict_kosten_exclusief_procesautomatisering', 
                    'v_totale_overheadkosten_excl_ict', 
                    'v_percentage_overheadkosten_excl_ict', 
                    'v_kosten_belastingheffing', 
                    'v_percentage_huisvestingskosten']]

    column_names = list(df_subset.columns)

    # Create dtype dictionary
    dtype = {col: types.FLOAT for col in column_names}
    # Update columns that use a different datatype
    dtype['VVW_id'] = types.INTEGER
    dtype['year'] = types.INTEGER
    dtype['d_duurzaamheid_gunningscriterium'] = types.INTEGER
    
    # Saving the updated DataFrame back to the database
    df_subset.to_sql(name='VVW_calculations', con=engine, if_exists='replace', index=False, dtype=dtype)

    pd.set_option('display.max_columns', None)  # Show all columns
    pd.set_option('display.width', None)        # Adjust the width to fit the content

    # Filter the DataFrame for the specified conditions
    filtered_df = df[(df['year'] == 2023)] #& (df['VVB_id'] == 6036)

    # Specify the columns you want to display
    columns_to_display2 = ['dienstverband_korter_dan_3_jaar', 'dienstverband_10_jaar_of_langer', 'totaal_medewerkers']

    # Display the filtered rows with the specified columns
    #print(filtered_df[columns_to_display2])

if __name__ == '__main__':
    add_calculated_columns()
