# Importer biblioteker import pandas as pd import numpy as np import streamlit as st from duckduckgo_search import DDGS import locale from datetime import date # sidekonfiguration st.set_page_config( page_icon="🤖", layout="wide" ) # Sidebar menu navigation menu = st.sidebar.radio("Vælg en side", ["Forside", "Kundeindsigt", "Regnskabsanalyse", "Lønkommentering", 'Skat & Rådighed', 'Indstillingspåtegning']) # Forsiden if menu == "Forside": st.title("AI-Assistent") st.write(""" Formålet med appen er at understøtte rådgivere og studentermedhjælpere, der arbejder med kunder i "hvide kitler"-segmentet, ved at levere både hurtige og præcise analyser. Appen er designet til at reducere behovet for manuel opsætning af regnskabskommenteringer og privatøkonomiske vurderinger, idet appen tilpasses skabeloner, så analyser og vurderinger følger gældende standarder jf. forretningsgang, hvilket sparer tid og sikrer høj kvalitet. """) st.write("**Indtast oplysninger om kunden, som gemmes automatisk og bruges på tværs af appens funktioner:**") # Indtast kundens navn som herefter gemmes i variablen kunde_navn kunde_navn = st.text_input("Kundens navn", "John Doe") # Indtast Segment for kunden som herefter gemmes i variablen guideline guideline = st.selectbox( 'Vælg Segment', ['Speciallæge','Læge', 'Speciallæge', 'Fysioterapeut', 'Tandlæge', 'Kiropraktor'] ) # Har kunden en VSO eller ApS? Eller Begge to. Herefter indtast navn for VSO, ApS eller begge to valg = st.selectbox("Virksomhedstype", ["VSO", "ApS", "Begge to"]) # Hvis brugeren vælger "VSO" if valg == "VSO": virksomhed_navn = st.text_input("Indtast navn på VSO", "Lægepraksis v. John Doe") # Hvis brugeren vælger "ApS" elif valg == "ApS": virksomhed_navn = st.text_input("Indtast navn på ApS", "") # Hvis brugeren vælger "Begge to" elif valg == "Begge to": virksomhed_navn_vso = st.text_input("Indtast navn på VSO", "") virksomhed_navn_aps = st.text_input("Indtast navn på ApS", "") if menu == "Lønkommentering": st.title("Lønkommentering") st.write("For at der kan udarbejdes beregninger på nuværende og fremtidigt budget i Skat og Rådighed, skal du give information om:") st.write("- Indkomst fra erhverv til nuværende budget") st.write("- Indkomst fra erhverv til fremtidigt budget") st.write("Hvis der allerede er en lønkommentering på kunden, skal du vurdere, om du fortsat kan anvende den, eller om du skal udarbejde en ny") st.write("Der henvises til Privatøkonomi - Erhverv - Arbejdsbeskrivelse for yderligere information om lønkommentering") # Indkomst sektion st.subheader("Indkomst") løn_virksomhed = st.number_input("Lønudtræk fra egen virksomhed", min_value=0, value=1161, step=1) udbytte = st.number_input("Udbytte - ikke aktuelt med VSO", min_value=0, value=0, step=1) samlet_indkomst = løn_virksomhed + udbytte st.write(f"**Samlet årlig lønudtræk: {samlet_indkomst}**") # Dropdown-menu for hvordan indkomsten er fastlagt indkomst_fastlagt = st.selectbox("Hvordan er lønudtræk fastlagt?", ["Kundens regnskab", "Dialog med kunden" "eSKAT"]) øvrig_indkomst = st.text_area("Øvrig information om indkomstforhold", "John Doe er speciallæge og ejer VSO'en Lægepraksis v. John Doe") # Virksomhedens performance sektion st.subheader("Virksomhedens performance") overskud_2023 = st.number_input("Nuværende Regnskabs resultat efter skat", min_value=0, value=3000, step=1) likviditet = st.number_input("Likvid beholding indestående i seneste regnskab", min_value=0, value=1500, step=1) gæld_i_virksomhed = st.selectbox("Er der gæld i virksomheden?", ["Ja", "Nej"]) gældens_størrelse = st.number_input("Gældens størrelse", min_value=0, value=1000, step=1, key="gældens_størrelse") Øvrig_performance = st.text_area("Øvrig information om virksomhedens performance", "Klinikken har kontinuerligt opnået et højere resultat efter skat siden stiftelsen, og har senest haft rekordresultat. Der er restgæld på erhvervslån optaget i forbindelse med opkøb af klinikken og som serviceres anmærkningsfrit.") # Fremtidig indkomst fra Erhverv sektion st.subheader("Fremtidig Indkomst fra Erhverv:") indkomst_fastlagt_fremtidig = st.selectbox("Hvordan er fremtidig lønudtræk fastlagt?", ["Dialog med kunden", "Kundens budget"]) fremtidig_løn = st.number_input("Fremtidig forventet lønudtræk", min_value=0, value=1750, step=1) fremtidig_udbytte = st.number_input("Fremtidig forventet udbytte - ikke aktuelt med VSO", min_value=0, value=0, step=1) # Menu hvor man vurderer om at virksomhedens indtjening og cash-flow kan indeholde kundens forventede indkomst vurdering_fremtidigt_udtræk = st.selectbox("Vurderer du at virksomhedens indtjening og cash-flow kan indeholde kundens forventede fremtidige lønudtræk", ["Ja", "Nej"]) Øvrig_fremtidig_indkomst = st.text_area("Øvrig information om fremtidig lønudtræk", "John udtryk, at han kommer til at øge sit fremtidige lønudtræk grundet et ønske om et højere rådighedsbeløb idet han snarligt påtænker at renovereee sit rsommerhu samt bilkø") # Formue fra Erhverv sektion st.subheader("Formue fra Erhverv, inkl. Udskudt Skat:") # Her kan bruger vælge at indtaste formue i VSO eller ApS eller for begge # Dropdown-menu for at vælge type af egenkapital # Hvis brugeren vælger "Egenkapital i VSO" # Brugervalg valg = st.selectbox("Vælg type af egenkapital", ["Egenkapital i VSO", "Egenkapital i ApS", "Begge to"]) # Variabler for skat og formue formue_vso, formue_aps = 0, 0 # Standardværdier skatte_procent_vso, skatte_procent_aps = 50, 42 # Skatteprocenter # Hvis brugeren vælger "Egenkapital i VSO" if valg == "Egenkapital i VSO": formue_vso = st.number_input("Indtast egenkapital i VSO", min_value=0, value=4000, step=1, key="formue_vso") samlet_formue_før_skat = formue_vso samlet_formue_efter_skat = formue_vso * (1 - skatte_procent_vso / 100) # Hvis brugeren vælger "Egenkapital i ApS" elif valg == "Egenkapital i ApS": formue_aps = st.number_input("Indtast egenkapital i ApS", min_value=0, step=1, key="formue_aps") samlet_formue_før_skat = formue_aps samlet_formue_efter_skat = formue_aps * (1 - skatte_procent_aps / 100) # Hvis brugeren vælger "Begge to" elif valg == "Begge to": formue_vso = st.number_input("Indtast egenkapital i VSO", min_value=0, step=1, key="formue_vso") formue_aps = st.number_input("Indtast egenkapital i ApS", min_value=0, step=1, key="formue_aps") samlet_formue_før_skat = formue_vso + formue_aps samlet_formue_efter_skat = (formue_vso * (1 - skatte_procent_vso / 100)) + (formue_aps * (1 - skatte_procent_aps / 100)) # Resultater st.write(f"**Samlet formue før skat: {samlet_formue_før_skat} tkr.**") st.write(f"**Samlet formue efter skat: {samlet_formue_efter_skat:.2f} tkr.**") # Tilføj tekstboks til kvalitative informationer Øvrige_formue = st.text_area("Hvad består erhvervsformuen af", "Formuen består af opsparet overskud fra klinikkens drift samt inventar og udstyr, der er finansieret uden gæld.") # Skriv der viser Tilføjet den dd.mm.åååå af Navn Efternavn. Vigtigt den viser dagsdato Tilføjet_af = st.text_input("Tilføjet af", "Navn Efternavn") # Dags dato today = date.today() korrekt_today = today.strftime("%d-%m-%Y") # Tilføj en knap til at generere AI lønkommentering if st.button('Generér lønkommentering'): with st.expander("AI's lønkommentering"): # Lav en brugerdefineret prompt til AI baseret på den nye skabelon user_input = ( f"Du er en erhvervsbankrådgiver som skal lave en lønkommentering, som er en kommentering af forholdet mellem kundens private og erhvervsmæssige indkomst og formue." f"Du skal ikke kommentere på feks. om du mener at indkomst er en vigtig faktor i vurderingen af kundens økonmiske situation. Hold dig til information du modtager omkring lønudtræk" f"Primære formål er at belyse muligt udtræk til privat regi.\n\n" f"INDKOMST FRA ERHVERV TIL NUVÆRENDE BUDGET:\n" f"Kunden har lønindkomst fra sit VSO.\n" f"De seneste 12 måneder er der blevet hævet {løn_virksomhed} tkr. i løn.\n" f"Lønudtræk er fastlagt ud fra {indkomst_fastlagt}. Ikke skriv mere herefter.\n\n" # f"Kunden har udbytte fra sine selskaber.\n" # f"De seneste 12 måneder er der blevet hævet {udbytte} tkr. i udbytte.\n" # f"Udbytte er fastlagt ud fra kundens regnskaber.\n\n" f"Start med at beskrive i indkomstforholdene den øvrig information om indkomstforhold: {øvrig_indkomst}\n\n" f"INDKOMST FRA ERHVERV TIL FREMTIDIGT BUDGET:\n" f"Kommenterer meget præcist og kort på senste årsrestultat efter skat i {overskud_2023} den likvide beholdning i VSO'et{likviditet} at der er gæld i virksomheden{gæld_i_virksomhed} gældens størrelse {gældens_størrelse} og eventuelt øvrig information{Øvrig_performance}. Denne information skal flettes sammen med øvrige info " f"Fremtidig lønudtræk er fastlagt ud fra {indkomst_fastlagt_fremtidig}" f"Kunden vil i fremtiden udtrække løn for {fremtidig_løn} tkr.\n\n" f"Tilføj information fra {Øvrig_fremtidig_indkomst} så det passer ind i resten af teksten" # f"Kunden vil i fremtiden tage udbytte for {fremtidig_udbytte} tkr.\n\n" f"FORMUE FRA ERHVERV, HERUNDER UDSKUDT SKAT:\n" f"Formuen fra erhverv er taget fra kundens seneste regnskab.\n\n" f"Formuen i selskabsregi er {formue_vso} tkr. i VSO \n" f"Egenkapital medregnes i privat til {samlet_formue_efter_skat} da den beskattes med 50%." f"Formuen fra erhverv er taget fra kundens seneste indleveret regnskab.\n\n" f"tilføj information fra formue {Øvrige_formue} så det passer ind i resten af teksten\n\n" f"VURDERING:\n" f"{Tilføjet_af}\n" f"Forhold dig til nuværende indkomst versus fremtidig indkomst.\n" f"På baggrund af følgende svar (det kan være ja eller nej) {vurdering_fremtidigt_udtræk} vurderes det at kundens fremtidige lønudtræk kan indeholdes i virksomhedens indtjening og cash-flow.\n\n" f"INDKOMST FRA ERHVERV TIL NUVÆRENDE BUDGET, INDKOMST FRA ERHVERV TIL FREMTIDIGT BUDGET, FORMUE FRA ERHVERV, HERUNDER UDSKUDT SKAT, samt VURDERING er overskifterne. De skal være fede men samme størrelse som øvrig skrift" f"efter en overskrift skal teksten stå lige under overskriften og ikke i samme linje som overskriften. I bunden af dokumentet skal der stå Tilføjet den {korrekt_today} af {Tilføjet_af}" ) # Indsætter information til AI assistenten for at kommentere på regnskab og udvikling try: ai_response = DDGS().chat(user_input, model='gpt-4o-mini') st.markdown(ai_response) except Exception as e: st.error(f"AI forespørgslen mislykkedes: {e}. Prøv venligst igen senere.") elif menu == "Regnskabsanalyse": # Tilføj dropdown-menu til valg af Guidelines st.title("Regnskabsanalyse") # Dropdown-menu med Guidelines for specifikke erhverv guideline = st.selectbox( 'Vælg Segment:', ['Speciallæge', 'Læge', 'Fysioterapeut', 'Tandlæge', 'Kiropraktor'] ) # Vis det valgte guideline med de tilhørende krav if guideline in ['Læge', 'Fysioterapeut', 'Tandlæge', 'Kiropraktor', 'Speciallæge']: st.write(f"Du har valgt: **{guideline}**") st.write("**Gearing**: < 4") st.write("**Soliditet**: > 20 %") st.write("**Likviditetsgrad**: > 100 %") # Indtast regnskabstal for 2022 st.subheader("Resultatsopgørelse 2022") col1, col2, col3 = st.columns(3) with col1: nettoomsætning_2022 = st.number_input('Nettoomsætning 2022', min_value=0, value=3500, step=100) with col2: variable_omkostninger_2022 = -abs(st.number_input('Variable omkostninger 2022', min_value=-1000000, value=300, step=100)) with col3: kapacitetsomkostninger_2022 = -abs(st.number_input('Kapacitetsomkostninger 2022', min_value=-1000000, value=500, step=100)) col4, col5, col6 = st.columns(3) with col4: afskrivninger_2022 = -abs(st.number_input('Afskrivninger 2022', min_value=-1000000, value=100, step=100)) with col5: sekundære_poster_2022 = -abs(st.number_input('Sekundære poster 2022', min_value=-1000000, value=0, step=100)) with col6: finansieringsudgifter_2022 = -abs(st.number_input('Finansieringsudgifter 2022', min_value=-1000000, value=50, step=100)) col7, col8, col9 = st.columns(3) with col7: finansieringsindtægter_2022 = st.number_input('Finansieringsindtægter 2022', min_value=0, value=10, step=100) with col8: kapitalandele_2022 = st.number_input('Indtægter fra kapitalandele 2022', min_value=-100000, value=0, step=100) with col9: skat_2022 = (st.number_input('Skat 2022', min_value=-10000, value=-145, step=100)) # Beregninger for regnskab 2022 EBITDA_2022 = nettoomsætning_2022 + variable_omkostninger_2022 + kapacitetsomkostninger_2022 EBIT_2022 = EBITDA_2022 + afskrivninger_2022 resultat_før_renter_2022 = EBIT_2022 + sekundære_poster_2022 ordinært_resultat_2022 = resultat_før_renter_2022 + finansieringsindtægter_2022 + kapitalandele_2022 + finansieringsudgifter_2022 resultat_før_skat_2022 = ordinært_resultat_2022 resultat_efter_skat_2022 = resultat_før_skat_2022 + skat_2022 udbytte_2022 = -abs(st.number_input('Udbytte 2022', min_value=0, value=0, step=100)) konsolidering_2022 = resultat_efter_skat_2022 + udbytte_2022 # Indtast regnskabstal for 2023 st.subheader("Resultatsopgørelse 2023") col10, col11, col12 = st.columns(3) with col10: nettoomsætning_2023 = st.number_input('Nettoomsætning 2023', min_value=0, value=4200, step=100) with col11: variable_omkostninger_2023 = -abs(st.number_input('Variable omkostninger 2023', min_value=-1000000, value=300, step=100)) with col12: kapacitetsomkostninger_2023 = -abs(st.number_input('Kapacitetsomkostninger 2023', min_value=-1000000, value=500, step=100)) col13, col14, col15 = st.columns(3) with col13: afskrivninger_2023 = -abs(st.number_input('Afskrivninger 2023', min_value=-1000000, value=150, step=100)) with col14: sekundære_poster_2023 = -abs(st.number_input('Sekundære poster 2023', min_value=-1000000, value=0, step=100)) with col15: finansieringsudgifter_2023 = -abs(st.number_input('Finansieringsudgifter 2023', min_value=-1000000, value=75, step=100)) col16, col17, col18 = st.columns(3) with col16: finansieringsindtægter_2023 = st.number_input('Finansieringsindtægter 2023', min_value=0, value=25, step=100) with col17: kapitalandele_2023 = st.number_input('Indtægter fra kapitalandele 2023', min_value=-10000, value=0, step=100) with col18: skat_2023 = (st.number_input('Skat 2023', min_value=-10000, value=-200, step=100)) # Beregninger for regnskab 2023 EBITDA_2023 = nettoomsætning_2023 + variable_omkostninger_2023 + kapacitetsomkostninger_2023 EBIT_2023 = EBITDA_2023 + afskrivninger_2023 resultat_før_renter_2023 = EBIT_2023 + sekundære_poster_2023 ordinært_resultat_2023 = resultat_før_renter_2023 + finansieringsindtægter_2023 + kapitalandele_2023 + finansieringsudgifter_2023 resultat_før_skat_2023 = ordinært_resultat_2023 resultat_efter_skat_2023 = resultat_før_skat_2023 + skat_2023 udbytte_2023 = -abs(st.number_input('Udbytte 2023', min_value=0, value=0, step=100)) konsolidering_2023 = resultat_efter_skat_2023 + udbytte_2023 # Opret dataframe for resultatopgørelsen med Nettoomsætning tilføjet data_resultat = { 'Resultatopgørelse 2022': [ nettoomsætning_2022 * 1000, EBITDA_2022 * 1000, EBIT_2022 * 1000, resultat_før_renter_2022 * 1000, ordinært_resultat_2022 * 1000, resultat_før_skat_2022 * 1000, resultat_efter_skat_2022 * 1000, konsolidering_2022 * 1000 ], 'Resultatopgørelse 2023': [ nettoomsætning_2023 * 1000, EBITDA_2023 * 1000, EBIT_2023 * 1000, resultat_før_renter_2023 * 1000, ordinært_resultat_2023 * 1000, resultat_før_skat_2023 * 1000, resultat_efter_skat_2023 * 1000, konsolidering_2023 * 1000 ] } df_resultat = pd.DataFrame(data_resultat, index=['Nettoomsætning', 'EBITDA', 'EBIT', 'Resultat før renter', 'Ordinært resultat', 'Resultat før skat', 'Resultat efter skat', 'Konsolidering']) # Formater tal i resultatopgørelsen df_resultat = df_resultat.applymap(lambda x: f"{x:,.0f}".replace(",", ".")) # Vis resultatopgørelse, og gør tabellen bred st.write(df_resultat.style.set_properties(**{'width': '200%'}).applymap(lambda x: 'font-weight: bold')) # Aktiver og Passiver for 2022 st.subheader("Aktiver og Passiver 2022") col1, col2, col3 = st.columns(3) # Aktiver 2022 with col1: immaterielle_aktiver_2022 = st.number_input('Immatrielle aktiver 2022', min_value=0, value=0, step=100) with col2: materielle_anlægsaktiver_2022 = st.number_input('Materielle anlægsaktiver 2022', min_value=0, value=2200, step=100) with col3: finansielle_anlægsaktiver_2022 = st.number_input('Finansielle anlægsaktiver 2022', min_value=0, value=0, step=100) col4, col5, col6 = st.columns(3) with col4: varelager_2022 = st.number_input('Varelager 2022', min_value=0, value=200, step=100) with col5: varedebitorer_2022 = st.number_input('Varedebitorer 2022', min_value=0, value=400, step=100) with col6: værdipapirer_2022 = st.number_input('Værdipapirer 2022', min_value=0, value=0, step=100) col7, col8, col9 = st.columns(3) with col7: øvrige_omsætningsaktiver_2022 = st.number_input('Øvrige omsætningsaktiver 2022', min_value=0, value=100, step=100) with col8: likvide_midler_2022 = st.number_input('Likvide midler 2022', min_value=0, value=800, step=100) # Saml aktiverne for 2022 anlægsaktiver_2022 = immaterielle_aktiver_2022 + materielle_anlægsaktiver_2022 + finansielle_anlægsaktiver_2022 omsætningsaktiver_2022 = varelager_2022 + varedebitorer_2022 + værdipapirer_2022 + øvrige_omsætningsaktiver_2022 + likvide_midler_2022 aktiver_i_alt_2022 = anlægsaktiver_2022 + omsætningsaktiver_2022 # Passiver 2022 col1, col2, col3 = st.columns(3) with col1: udskudt_skat_2022 = st.number_input('Udskudt skat 2022', min_value=0, value=0, step=100) with col2: øvrig_langfristet_gæld_2022 = st.number_input('Øvrig langfristet gæld 2022', min_value=0, value=0, step=100) with col3: langfristet_rentebærende_gæld_2022 = st.number_input('Langfristet rentebærende gæld 2022', min_value=0, value=1200, step=100) col4, col5, col6 = st.columns(3) with col4: øvrig_kortfristet_gæld_2022 = st.number_input('Øvrig kortfristet gæld 2022', min_value=0, value=200, step=100) with col5: kortfristet_rentebærende_gæld_2022 = st.number_input('Kortfristet rentebærende gæld 2022', min_value=0, value=100, step=100) # Saml passiverne for 2022 langfristet_gæld_i_alt_2022 = øvrig_langfristet_gæld_2022 + langfristet_rentebærende_gæld_2022 kortfristet_gæld_i_alt_2022 = øvrig_kortfristet_gæld_2022 + kortfristet_rentebærende_gæld_2022 passiver_i_alt_2022 = udskudt_skat_2022 + langfristet_gæld_i_alt_2022 + kortfristet_gæld_i_alt_2022 # Beregn automatisk egenkapital 2022 egenkapital_2022 = aktiver_i_alt_2022 - passiver_i_alt_2022 # Genberegn passiver i alt for 2022 passiver_i_alt_2022 = udskudt_skat_2022 + langfristet_gæld_i_alt_2022 + kortfristet_gæld_i_alt_2022 + egenkapital_2022 # Aktiver og Passiver for 2023 st.subheader("Aktiver og Passiver 2023") col10, col11, col12 = st.columns(3) # Aktiver 2023 with col10: immaterielle_aktiver_2023 = st.number_input('Immatrielle aktiver 2023', min_value=0, value=0, step=100) with col11: materielle_anlægsaktiver_2023 = st.number_input('Materielle anlægsaktiver 2023', min_value=0, value=2500, step=100) with col12: finansielle_anlægsaktiver_2023 = st.number_input('Finansielle anlægsaktiver 2023', min_value=0, value=400, step=100) col13, col14, col15 = st.columns(3) with col13: varelager_2023 = st.number_input('Varelager 2023', min_value=0, value=400, step=100) with col14: varedebitorer_2023 = st.number_input('Varedebitorer 2023', min_value=0, value=600, step=100) with col15: værdipapirer_2023 = st.number_input('Værdipapirer 2023', min_value=0, value=0, step=100) col16, col17, col18 = st.columns(3) with col16: øvrige_omsætningsaktiver_2023 = st.number_input('Øvrige omsætningsaktiver 2023', min_value=0, value=120, step=100) with col17: likvide_midler_2023 = st.number_input('Likvide midler 2023', min_value=0, value=1500, step=100) # Saml aktiverne for 2023 anlægsaktiver_2023 = immaterielle_aktiver_2023 + materielle_anlægsaktiver_2023 + finansielle_anlægsaktiver_2023 omsætningsaktiver_2023 = varelager_2023 + varedebitorer_2023 + værdipapirer_2023 + øvrige_omsætningsaktiver_2023 + likvide_midler_2023 aktiver_i_alt_2023 = anlægsaktiver_2023 + omsætningsaktiver_2023 # Passiver 2023 col7, col8, col9 = st.columns(3) with col7: udskudt_skat_2023 = st.number_input('Udskudt skat 2023', min_value=0, value=0, step=100) with col8: øvrig_langfristet_gæld_2023 = st.number_input('Øvrig langfristet gæld 2023', min_value=0, value=360, step=100) with col9: langfristet_rentebærende_gæld_2023 = st.number_input('Langfristet rentebærende gæld 2023', min_value=0, value=1000, step=100) col10, col11, col12 = st.columns(3) with col10: øvrig_kortfristet_gæld_2023 = st.number_input('Øvrig kortfristet gæld 2023', min_value=0, value=80, step=100) with col11: kortfristet_rentebærende_gæld_2023 = st.number_input('Kortfristet rentebærende gæld 2023', min_value=0, value=80, step=100) # Saml passiverne for 2023 langfristet_gæld_i_alt_2023 = øvrig_langfristet_gæld_2023 + langfristet_rentebærende_gæld_2023 kortfristet_gæld_i_alt_2023 = øvrig_kortfristet_gæld_2023 + kortfristet_rentebærende_gæld_2023 passiver_i_alt_2023 = udskudt_skat_2023 + langfristet_gæld_i_alt_2023 + kortfristet_gæld_i_alt_2023 # Beregn automatisk egenkapital 2023 egenkapital_2023 = aktiver_i_alt_2023 - passiver_i_alt_2023 # Genberegn passiver i alt for 2023 passiver_i_alt_2023 = udskudt_skat_2023 + langfristet_gæld_i_alt_2023 + kortfristet_gæld_i_alt_2023 + egenkapital_2023 # Opret en samlet tabel for både aktiver og passiver under Balance 2022 og Balance 2023 data_balance = { 'Balance 2022': [ anlægsaktiver_2022 * 1000, omsætningsaktiver_2022 * 1000, aktiver_i_alt_2022 * 1000, egenkapital_2022 * 1000, udskudt_skat_2022 * 1000, langfristet_gæld_i_alt_2022 * 1000, kortfristet_gæld_i_alt_2022 * 1000, passiver_i_alt_2022 * 1000 ], 'Balance 2023': [ anlægsaktiver_2023 * 1000, omsætningsaktiver_2023 * 1000, aktiver_i_alt_2023 * 1000, egenkapital_2023 * 1000, udskudt_skat_2023 * 1000, langfristet_gæld_i_alt_2023 * 1000, kortfristet_gæld_i_alt_2023 * 1000, passiver_i_alt_2023 * 1000 ] } # Opret en samlet dataframe df_balance = pd.DataFrame( data_balance, index=[ 'Anlægsaktiver', 'Omsætningsaktiver', 'Aktiver i alt', 'Egenkapital', 'Udskudt skat', 'Langfristet gæld', 'Kortfristet gæld', 'Passiver i alt' ] ) # Formater tallene til 'xxx.xxx' df_balance = df_balance.applymap(lambda x: f"{x:,.0f}".replace(",", ".") if pd.notnull(x) else '') # Vis den samlede Balance tabel st.write(df_balance.style.applymap(lambda x: 'font-weight: bold')) # Beregn og vis nøgletal # Definer nøgletalsvariabler som None, så vi kan tjekke, om de er beregnet senere gearing, soliditet, likviditetsgrad, nulpunktsrente, gældsserviceringsgrad = None, None, None, None, None if guideline in ['Læge', 'Fysioterapeut', 'Tandlæge', 'Speciallæge', 'Kiropraktor']: if EBITDA_2023 != 0: gearing = (langfristet_gæld_i_alt_2023 + kortfristet_gæld_i_alt_2023 - likvide_midler_2023 - værdipapirer_2023) / EBITDA_2023 if passiver_i_alt_2023 != 0: soliditet = (egenkapital_2023 / passiver_i_alt_2023) * 100 if kortfristet_gæld_i_alt_2023 != 0: likviditetsgrad = (omsætningsaktiver_2023 / kortfristet_gæld_i_alt_2023) * 100 # Nøgletal er nu gemt, men ikke vist. # Beregn simple cashflow elementer baseret på input fra balancer og resultatopgørelser def simple_cashflow_analysis_2023(EBITDA_2023, omsætningsaktiver_2023, kortfristet_gæld_i_alt_2023, anlægsaktiver_2023, egenkapital_2023, langfristet_rentebærende_gæld_2023): # Beregn cashflow fra drift som EBITDA cashflow_drift_2023 = EBITDA_2023 # Beregn cashflow fra investeringer som ændring i anlægsaktiver (negativ, da investeringer reducerer likviditeten) cashflow_investeringer_2023 = -anlægsaktiver_2023 # Beregn cashflow fra finansiering som ændring i gæld (langfristet og kortfristet) cashflow_finansiering_2023 = (kortfristet_gæld_i_alt_2023 + langfristet_rentebærende_gæld_2023) # Beregn samlet ændring i likvide midler ændring_likvide_midler_2023 = cashflow_drift_2023 + cashflow_investeringer_2023 + cashflow_finansiering_2023 # Opstil cashflow-analyse i tekstformat for 2023 cashflow = f""" **Cashflow 2023:** - Cashflow fra drift: {cashflow_drift_2023:,.2f} DKK - Cashflow fra investeringer: {cashflow_investeringer_2023:,.2f} DKK - Cashflow fra finansiering: {cashflow_finansiering_2023:,.2f} DKK - Ændring i likvide midler: {ændring_likvide_midler_2023:,.2f} DKK """ return cashflow #Sammenlign om beregnet gearing overholder guideline og vis dem st.write(f"**{guideline}**") st.write(f"**Gearing**: {gearing:.1f}" + " < 4") st.write(f"**Soliditet**: {soliditet:.1f}% > 20%") st.write(f"**Likviditetsgrad**: {likviditetsgrad:.1f}% > 100%") # Tilføj tekstfelt til supplerende information og AI-analyse supplerende_info = st.text_area( 'Tilføj supplerende information, som AI skal tage højde for:', 'Information om kunden: Lægepraksis v. John Doe \n\n\nIndkomstforhold: Praksissen har oplevet en betydelig stigning i omsætningen, primært som resultat af tilgangen af et ydernummer. Denne udvikling afspejler en positiv vækst i indtjeningsevnen og den stigende omsætning skaber et solidt fundament for fremtidige investeringer og yderligere vækst. \n\n\nKapitalforhold: Kapitalforholdene viser en markant forbedring, hvor soliditeten er steget støt som følge af opsparet overskud over tid. Denne udvikling har resulteret i en sund gældsfaktor og øget finansiel robusthed, hvilket styrker praksissens evne til at håndtere økonomiske udsving og skabe et stabilt fundament for fremtidige muligheder. Den forbedrede kapitalstruktur giver også plads til strategiske investeringer og udvikling.\n\n\nLikviditetsforhold: Praksissen har stærke likviditets- og cashflow-forhold, hvilket sikrer en stabil og sund drift. Den solide likviditet giver fleksibilitet til at håndtere både kortsigtede forpligtelser og potentielle investeringer. Med et stabilt cashflow har praksissen mulighed for at udvide sine aktiviteter og reagere hurtigt på ændringer i markedet ', height=250 # Juster højden som ønsket ) # Initial default values indkomst_vurdering = "" kapital_vurdering = "" likviditet_vurdering = "" # Tilføj en knap til at generere AI analyse if st.button('Generér AI analyse'): with st.expander("AI's analyse af regnskab og udvikling"): # Evaluering af tilfredsstillende/ utilfredsstillende for nøgletal baseret på den valgte guideline if guideline == ['Læge', 'Fysioterapeut', 'Tandlæge', 'Speciallæge', 'Kiropraktor']: indkomst_vurdering = "Tilfredsstillende" if gearing is not None and gearing < 4 else "Utilfredsstillende" kapital_vurdering = "Tilfredsstillende" if soliditet is not None and soliditet > 20 else "Utilfredsstillende" likviditet_vurdering = "Tilfredsstillende" if likviditetsgrad is not None and likviditetsgrad > 100 else "Utilfredsstillende" # Lav en brugerdefineret prompt baseret på skabelonen og de beregnede nøgletal user_input = ( f"Aktivitet:\n" f"Her skal aktivitet stå med fed skrift og der beskrives hvilken aktivitet virksomheden beskæftiger sig med\n" f"Informationen herfra skal bruges til at supplere indkomstforhold, kapitalforhold og likviditetesforhold{supplerende_info}\n\n" # Her tilføjes information fra supplerende_info ) # Tilføj nøgletal til prompten, når de er blevet beregnet baseret på valgte guideline if guideline in ['Læge', 'Fysioterapeut', 'Tandlæge', 'Speciallæge', 'Kiropraktor']: if gearing is not None: user_input += f"Gearing: {gearing:.2f}% (krav: <5)\n" if soliditet is not None: user_input += f"Soliditet: {soliditet:.2f}% (krav: >20%)\n" if likviditetsgrad is not None: user_input += f"Likviditetsgrad: {likviditetsgrad:.2f}% (krav: >125%)\n" # Indkomstforhold user_input += f"\nIndkomstforhold: {indkomst_vurdering}\n" user_input += "Det er vigtigt at formatet er Indkomstforhold: Tilfredsstillende eller utilfredsstillende med fed skrift\n" user_input += "Heri skal der kommenteres på udviklingen i omsætning, EBITDA og indtjening mm. " # Kapitalforhold user_input += f"Kapitalforhold: {kapital_vurdering}\n" user_input += f"Det er vigtigt at formatet er Kapitalforhold: Tilfredsstillende eller utilfredsstillende med fed skrift\n" user_input += f"Her skal der kommenteres på soliditetsgraden i virksomheden.\n\n" # Eksempel på hvordan du tilføjer cashflow-analysen for 2023 til likviditetsvurderingen: user_input += f"Likviditetsforhold: **{likviditet_vurdering}**\n" user_input += f"Det er vigtigt at formatet er Likviditetsforhold: **Tilfredsstillende** eller **Utilfredsstillende** med fed skrift.\n" # Cashflow-analyse opstillet i punktform user_input += "Cashflow 2023:\n" user_input += " - Cashflow fra drift: {:.2f} DKK\n".format(EBITDA_2023) user_input += " - Cashflow fra investeringer: {:.2f} DKK\n".format(-anlægsaktiver_2023) # Negativ fordi investeringer trækker på likviditeten user_input += " - Cashflow fra finansiering: {:.2f} DKK\n".format(kortfristet_gæld_i_alt_2023 + langfristet_rentebærende_gæld_2023) # Beregn den samlede ændring i likvide midler ændring_likvide_midler_2023 = EBITDA_2023 + (-anlægsaktiver_2023) + (kortfristet_gæld_i_alt_2023 + langfristet_rentebærende_gæld_2023) user_input += " - Ændring i likvide midler: {:.2f} DKK\n".format(ændring_likvide_midler_2023) # Kommentar på likviditeten user_input += "Kommenter på om likviditeten er stærk i virksomheden. Ikke nævn cashflow-analysen" # Tilføj nøgletal til prompten baseret på valgt guideline user_input += f"Nøgletal: ({guideline})\n" # Indsæt eksempel på god kommentering med neutrale tal og guideline i user_input user_input += ''' eksempel på god kommenterings skabelon: Aktivitet: Indkomstforhold: Tilfredsstillende eller ikke tilfredsstillende Kapitalforhold: Tilfredsstillende eller ikke tilfredsstillende Likviditetsforhold: Tilfredsstillende eller ikke tilfredsstillende Cashflow: Nøgletal: ({guideline}) Gearing/Nulpunksrente: (krav: <) Soliditet: % (krav: >%) Likviditetsgrad: % (krav: >%) Sammenfattende viser nøgletallene... ''' # Generer AI's kommentar ved hjælp af duckduckgo_search's chat API try: ai_response = DDGS().chat(user_input, model='gpt-4o-mini') st.markdown(ai_response) except Exception as e: st.error(f"AI forespørgslen mislykkedes: {e}. Prøv venligst igen senere.") ### SKAT OG RÅDIGHED elif menu == "Skat & Rådighed": st.title("Skat & Rådighed") st.subheader("KUNDE- OG FAMILIEFORHOLD") # Indtast kundens adresse kunde_adresse = st.text_input("Kundens adresse:", "Samsøgade 12") # Vælg boligtype boligtype = st.selectbox("Boligtype", ["Ejerbolig", "Andelsbolig", "Lejebolig"]) # Variabler for boligrelaterede oplysninger seneste_vurdering, vurderingsdato, vurderingstype, gæld_i_ejendom, ltv = None, None, None, None, None if boligtype != "Lejebolig": # Indtast vurdering med format i punktum og komma (2.000.000,00) seneste_vurdering = st.number_input("Seneste vurdering (DKK):", min_value=0.0, step=1000.0, value=1000000.0, format="%.0f") vurderingsdato = st.date_input("Vurderingsdato") # Vælg vurderingstype vurderingstype = st.selectbox("Vurderingstype", ["Skrivebordsvurdering", "Statistisk Vurdering", "Vurdering Med Besigtigelse", "Offentlig vurdering", "Handelsværdi"]) # Indtast gæld i ejendom med format 2.000.000,00 gæld_i_ejendom = st.number_input("Gæld i ejendom (DKK):", min_value=0.0, step=1000.0, value=500000.0, format="%.0f") # Beregn LTV ud fra seneste vurdering og gæld i ejendom, men kun hvis seneste vurdering ikke er nul if seneste_vurdering > 0: ltv = (gæld_i_ejendom / seneste_vurdering) * 100 st.markdown(f"**LTV: {ltv:.2f}%**") # LTV i fed skrift else: st.write("LTV kan ikke beregnes, da vurderingen er 0 eller mangler.") else: st.write("Vurdering og gæld i ejendom er ikke relevant for lejeboliger.") # Civilstatus og kundens navn og alder civilstatus = st.selectbox("Civilstatus", ["Single", "Gift", "Samlever"]) # Indtast kundens navn og alder kunde_navn = st.text_input("Kundens navn:", "John Doe") kunde_alder = st.number_input("Kundens alder:", min_value=0, max_value=120, value=35, step=1) # A-kasse for kunden (flyttet under kundens alder) a_kasse = st.selectbox("Er kunden medlem af A-kasse?", ["Ja", "Nej"]) # Ægtefælle/samlever afhængig af civilstatus if civilstatus == "Gift": ægtefælle_navn = st.text_input("Ægtefælles navn:") ægtefælle_alder = st.number_input("Ægtefælles alder:", min_value=0, max_value=120, step=1) ægtefælle_a_kasse = st.selectbox("Er ægtefællen medlem af A-kasse?", ["Ja", "Nej"]) elif civilstatus == "Samlever": samlever_navn = st.text_input("Samlevers navn:") samlever_alder = st.number_input("Samlevers alder:", min_value=0, max_value=120, step=1) samlever_a_kasse = st.selectbox("Er samleveren medlem af A-kasse?", ["Ja", "Nej"]) # Indtast profession og arbejdsplads (flyttet arbejdsplads under profession) kunde_profession = st.text_input("Kundens profession:") kunde_arbejdsplads = st.text_input("Kundens arbejdsplads:") if civilstatus == "Gift": ægtefælle_profession = st.text_input("Ægtefælles profession:") ægtefælle_arbejdsplads = st.text_input("Ægtefælles arbejdsplads:") elif civilstatus == "Samlever": samlever_profession = st.text_input("Samlevers profession:") samlever_arbejdsplads = st.text_input("Samlevers arbejdsplads:") # Børn: Flyt muligheden for at vælge antal børn nederst har_børn = st.selectbox("Har kunden børn?", ["Nej", "Ja"]) børn = [] if har_børn == "Ja": antal_børn = st.slider("Antal børn:", min_value=0, max_value=5) # Dynamisk tilføjelse af felter til hvert barn baseret på antal børn if antal_børn > 0: for i in range(antal_børn): Barn_navn = st.text_input(f"Barn {i+1} navn:") Barn_alder = st.number_input(f"Barn {i+1} alder:", min_value=0, max_value=120, step=1) # Tilføj hvert barns data som en ordbog til listen børn.append({"navn": Barn_navn, "alder": Barn_alder}) Kunde_og_familie = st.text_area("Indtast yderligere information til Kunde- og familieforhold:") st.subheader("INDKOMSTFORHOLD") # Brug det tidligere indtastede navn fra kunde- og familieoplysninger st.text(f"Kundens navn: {kunde_navn}") # Dropdown for valg af oplysninger fra e-skat, Lønseddel, Regnskab oplysninger_fra_kunde = st.selectbox("Oplysninger fra (kunde):", ["e-skat", "Lønseddel", "Regnskab"]) # Nuværende årsindkomst for kunden (i format 950.000,00 kr.) nuværende_årsindkomst_kunde = st.number_input("Nuværende årsindkomst (DKK):", min_value=0.0, step=1000.0, format="%.0f") # Fremtidig årsindkomst for kunden (i format 1.100.000,00 kr.) fremtidig_årsindkomst_kunde = st.number_input("Fremtidig årsindkomst (DKK):", min_value=0.0, step=1000.0, format="%.0f") # Hvis der er en ægtefælle eller samlever, brug det tidligere indtastede navn if civilstatus == "Gift": st.text(f"Ægtefælles navn: {ægtefælle_navn}") elif civilstatus == "Samlever": st.text(f"Samlevers navn: {samlever_navn}") # Dropdown for valg af oplysninger fra e-skat, Lønseddel, Regnskab for ægtefælle/samlever oplysninger_fra_ægtefælle = st.selectbox("Oplysninger fra (ægtefælle/samlever):", ["e-skat", "Lønseddel", "Regnskab"]) # Nuværende årsindkomst for ægtefælle/samlever nuværende_årsindkomst_ægtefælle = st.number_input("Nuværende årsindkomst (DKK) (ægtefælle/samlever):", min_value=0.0, step=1000.0, format="%.0f") # Fremtidig årsindkomst for ægtefælle/samlever fremtidig_årsindkomst_ægtefælle = st.number_input("Fremtidig årsindkomst (DKK) (ægtefælle/samlever):", min_value=0.0, step=1000.0, format="%.0f") # Tilføj en tekstboks til supplerende information supplerende_info_indkomst = st.text_area("Indtastet yderligere information til indkomstforhold:") st.subheader("LÅN OG ANDEN GÆLD/HÆFTELSE UDENFOR ") # Vælg om der er gæld udenfor gæld_udenfor = st.radio("Er der gæld udenfor?", ["Ja", "Nej"]) # Initialiser en liste til at gemme gældsposterne gældsposter = [] if gæld_udenfor == "Ja": # Vælg antal gældsposter antal_gæld = st.slider("Hvor mange gældsposter er der?", 1, 3) # Indsaml information om hver gældspost for i in range(1, antal_gæld + 1): st.text(f"Gældsinformation {i}") gældsinstitut = st.text_input(f"Gældsinstitut {i}", key=f"gældsinstitut_{i}") gældstype = st.text_input(f"Gældstype {i}", key=f"gældstype_{i}") gældsbeløb = st.number_input(f"Gældsbeløb {i} (DKK):", min_value=0.0, step=1000.0, format="%.2f", key=f"gældsbeløb_{i}") # Tilføj hver gældspost som en ordbog til listen gældsposter.append({ "institut": gældsinstitut, "type": gældstype, "beløb": gældsbeløb }) # Valg om der er lønindhold lønindhold = st.radio("Er der lønindhold?", ["Ja", "Nej"]) if lønindhold == "Ja": st.write("Kunden har lønindhold. Rådgiver skal indhente dokumentation på dette") # Valg om der er restskat restskat = st.radio("Er der restskat?", ["Ja", "Nej"]) if restskat == "Ja": st.write("Kunden har restskat til betaling. Rådgiver skal indhente dokumentation på dette.") lån_anden_gæld = st.text_area("Indtast information om lån og anden gæld/hæftelse udenfor:") st.subheader("FORBRUGSUDGIFTER") # Forbrugsudgangspunkt forbrugsudgangspunkt = st.selectbox("Forbrugsudgangspunkt:", ["Energiberegner", "Kundens eget budget"]) if forbrugsudgangspunkt == "Energiberegner": st.write("Forbrugsudgifterne er indhentet fra SparEnergi beregnerne, da disse udgifter er højere end de udgifter kunderne selv har oplyst i budgettet. Derfor medtages disse af forsigtighedsprincip. Screenshots fra beregnerne er arkiveret på kunderne.") else: st.write("Forbrugsudgifterne er medtaget fra kundens eget budget. Det skyldes at disse udgifter er højere end Energiberegnernes udgifter, og derfor anvendes disse af forsigtighedsprincip.") forbrugsudgifter = st.text_area("Indtast yderligere information om forbrugsudgifter:") st.subheader("BIL/BILER") # Initialiser en liste til at gemme gældsposterne # Valg om kunden har en bil eller flere biler har_bil = st.radio("Har kunden en bil/biler?", ["Ja", "Nej"]) # Initialiser listen udenfor if-blokken, så den ikke bliver overskrevet Biler = [] if har_bil == "Ja": # Vælg antal biler antal_biler = st.slider("Hvor mange biler", 1, 3) # Indsaml information om hver bil for i in range(1, antal_biler + 1): st.text(f"Information om bil {i}") # Tilføj unikke nøgler til hver input for at sikre, at Streamlit genkender hver bil korrekt bil_model = st.text_input(f"Bilmodel {i}", key=f"Bilmodel_{i}") bil_årgang = st.text_input(f"Bilårgang {i}", key=f"Bilårgang_{i}") bil_værdi = st.number_input(f"Værdi {i} (DKK):", min_value=0.0, step=1000.0, format="%.2f", key=f"Værdi_{i}") # Tilføj bilens data til listen, selvom input er tomme (så de bliver husket af Streamlit) Biler.append({ "model": bil_model, "årgang": bil_årgang, "værdi": bil_værdi }) biler = st.text_area("Indtast yderligere information om kundens bil eller biler:") st.subheader("FORMUE") formue_tal = st.number_input('Indtast størrelse på formue (DKK):', min_value=0, value=0, step=1000) formue = st.text_area("Indtast information om formue:") st.subheader("GÆLDSFAKTOR") gældsfaktor_tal = st.number_input('Indtast GF', min_value=-10.1, value=0.0, step=0.1) gældsfaktor = st.text_area("Indtast yderligere information til GF:") st.subheader("RÅDIGHEDSBELØB") nuværende_rb = st.number_input('Nuværende rådighedsbeløb (DKK):', min_value=0, value=0, step=1000) fremtidigt_rb = st.number_input('Fremtidigt rådighedsbeløb (DKK):', min_value=0, value=0, step=1000) stresset_rb = st.number_input('Fremtidigt stresset rådighedsbeløb (DKK):', min_value=0, value=0, step=1000) # Ændring i % mellem nuværende og stresset rådighedsbeløb i fed skrift. Hvis nuværende er 0, vises 0% ændring_rådighedsbeløb = st.write(f"**Ændring i rådighedsbeløb:** **{((stresset_rb - nuværende_rb) / nuværende_rb * 100):.2f}%**" if nuværende_rb != 0 else "Ændring i rådighedsbeløb: **0%**") rådighedsbeløb = st.text_area("Indtast yderligere information om rådighedsbeløb:") st.subheader("PENSIONS- OG FORSIKRINGSFORHOLD") pension = st.text_area("Indtast information om pensions- og forsikringsforhold:") st.subheader("FREMTID/DRØMME") fremtid_drømme = st.text_area("Indtast information om fremtid/drømme:") # Display the entered information as a document if st.button("Udarbejd Skat og Rådighed"): document = f""" """ if boligtype != "Lejebolig": document += f""" Seneste vurdering: {seneste_vurdering:,.2f} DKK Vurderingsdato: {vurderingsdato} Vurderingstype: {vurderingstype} Gæld i ejendom: {gæld_i_ejendom:,.2f} DKK LTV: {ltv:.2f}% """ document = f""" KUNDE- OG FAMILIEFORHOLD: Kunde: {kunde_navn} på {kunde_alder} Kundens profession: {kunde_profession} Kundens arbejdsplads: {kunde_arbejdsplads} A-kasse: {a_kasse} Civilstatus: {civilstatus} """ if civilstatus == "Gift": document += f"Ægtefælle: {ægtefælle_navn} på {ægtefælle_alder}\n" document += f"Ægtefælle profession: {ægtefælle_profession}\n" document += f"Ægtefælle arbejdsplads: {ægtefælle_arbejdsplads}\n" document += f"Ægtefælle A-kasse: {ægtefælle_a_kasse}\n" elif civilstatus == "Samlever": document += f"Samlever: {samlever_navn} på {samlever_alder}\n" document += f"Samlever profession: {samlever_profession}\n" document += f"Samlever arbejdsplads: {samlever_arbejdsplads}\n" document += f"Samlever A-kasse: {samlever_a_kasse}\n\n\n" # Tilføj information om antal børn document += f"Antal børn: {antal_børn if har_børn == 'Ja' else 'Ingen'}\n" # Tilføj børnenes information, hvis der er nogen if antal_børn > 0: for index, barn in enumerate(børn, start=1): document += f"{barn['navn']} på {barn['alder']} år\n" document += f""" Adresse: {kunde_adresse} Boligtype: {boligtype} LTV: {ltv:.2f}% """ document += Kunde_og_familie document += f""" INDKOMSTFORHOLD (E-SKAT OG ELLER REGNSKAB GENERELT): {kunde_navn} Oplysninger fra {oplysninger_fra_kunde}: Nuværende årsindkomst (DKK): {nuværende_årsindkomst_kunde:,.2f} Fremtidig årsindkomst (DKK): {fremtidig_årsindkomst_kunde:,.2f} """ if civilstatus in ["Gift", "Samlever"]: document += f""" {ægtefælle_navn if civilstatus == 'Gift' else samlever_navn} Oplysninger fra {oplysninger_fra_ægtefælle} Nuværende årsindkomst (DKK): {nuværende_årsindkomst_ægtefælle:,.2f} Fremtidig årsindkomst (DKK): {fremtidig_årsindkomst_ægtefælle:,.2f} """ document += f""" Supplerende information til indkomstforhold: {supplerende_info_indkomst} """ # Tilføj information om gæld udenfor document += f"LÅN OG ANDEN GÆLD/HÆFTELSE UDENFOR :\n" document += f"Gæld udenfor: {'Ja' if gæld_udenfor == 'Ja' else 'Nej'}\n" # Tilføj gældsposterne til dokumentet if gæld_udenfor == "Ja" and gældsposter: for index, gæld in enumerate(gældsposter, start=1): document += f"Gældsinstitut {index}: {gæld['institut']}, Gældstype: {gæld['type']}, Gældsbeløb: {gæld['beløb']:,.2f} DKK\n" else: document += "Ingen gæld udenfor.\n" # Tilføj information om lønindhold og restskat if lønindhold == "Ja": document += "Bemærk: Kunden har lønindhold. Rådgiver skal indhente dokumentation på dette.\n" if restskat == "Ja": document += "Bemærk: Kunden har restskat til betaling. Rådgiver skal indhente dokumentation på dette.\n" # Tilføj ekstra kommentarer document += f"{lån_anden_gæld}\n\n" # Tilføj forbrugsudgifter til dokumentet baseret på valg document += "FORBRUGSUDGIFTER:\n" # Tilføj specifik tekst baseret på valget if forbrugsudgangspunkt == "Energiberegner": document += ( "Forbrugsudgifterne er indhentet fra SparEnergi beregnerne, da disse udgifter er højere " "end de udgifter kunderne selv har oplyst i budgettet. Derfor medtages disse af forsigtighedsprincip. " "Screenshots fra beregnerne er arkiveret på kunderne.\n" ) elif forbrugsudgangspunkt == "Kundens eget budget": document += ( "Forbrugsudgifterne er medtaget fra kundens eget budget. Det skyldes, at disse udgifter er højere end " "Energiberegnernes udgifter, og derfor anvendes disse af forsigtighedsprincip.\n" ) document += f"{forbrugsudgifter}\n\n" document += "BIL/BILER:\n" document += f"Har kunden en bil?: {'Ja' if har_bil == 'Ja' else 'Nej'}\n" # Hvis kunden har biler, tilføjes de til dokumentet. Alle biler fremvises if har_bil == "Ja" and Biler: for index, bil in enumerate(Biler, start=1): document += f"Bil {index}: {bil['model']} ({bil['årgang']}), Ca. Værdi: {bil['værdi']:,.2f} DKK\n" else: document += "Ingen bil/biler.\n" document += f""" FORMUE: Formue: {formue_tal:,.2f} DKK {formue} GÆLDSFAKTOR: GF: {gældsfaktor_tal:.1f} {gældsfaktor} RÅDIGHEDSBELØB: Nuværende rådighedsbeløb: {nuværende_rb:,.2f} DKK Fremtidigt rådighedsbeløb: {fremtidigt_rb:,.2f} DKK Fremtidigt stresset rådighedsbeløb: {stresset_rb:,.2f} DKK Ændring i rådighedsbeløb: {((stresset_rb - nuværende_rb) / nuværende_rb * 100):.2f}% {rådighedsbeløb} PENSIONS- OG FORSIKRINGSFORHOLD: {pension} FREMTID/DRØMME: {fremtid_drømme} """ # vis dokument # st.text_area("Dokument", document, height=600) user_input = """Nedstående er en inspiration. Ret tilpasset til kundens situation baseret på document variablen. Overskrift skal alle være i store bogstaver og tekst skal stå under den korrekte overskrift.: KUNDE- OG FAMILIEFORHOLD Familiesituation, boligsituation, særlige forhold. INDKOMSTFORHOLD (E-SKAT DATA/REGNSKAB GENERELT) Beskriv her indkomstforhold og fremtidig indkomst samt hvordan denne indkomst er dokumenteret og vurderet. LÅN OG ANDEN GÆLD/HÆFTELSE UDENFOR Gældstyper, beløb, renter, og afdragsforpligtelser. FORBRUGSUDGIFTER Månedlige faste og variable udgifter. BIL/BILER Antal, type, udgifter, og nødvendighed. FORMUE Opsparing, ejendomme, og øvrige værdier. GÆLDSFAKTOR Forhold mellem gæld og indkomst. RÅDIGHEDSBELØB Beløb efter faste udgifter og afdrag. PENSIONS- OG FORSIKRINGSFORHOLD Pension, forsikringer, og dækning. FREMTID/DRØMME Økonomiske mål og planer. """ prompt = f""" Her er dokumentet: {document} Brugerinput: {user_input} Svar på følgende baseret på ovenstående information: """ # Optionally: Call duckduckgo_search API (if configured in a real environment) try: ai_response = DDGS().chat(prompt, model='gpt-4o-mini') st.write("**Teksten kan kopieres og indsættes**") st.markdown(ai_response) except Exception as e: st.error(f"AI forespørgslen mislykkedes: {e}. Prøv venligst igen senere.") # Indstillingspåtegning menur elif menu == "Indstillingspåtegning": st.title("Indstillingspåtegning") st.subheader("Vælg den skabelon, der passer til din kundes lånesag") st.write("Du skal altid anvende skabelonen ”Nybevilling”, når der er krav om, at debitor overholder guidelies. Debitor skal overholde guidelines, når du ansøger om ændringer i engagement eller sikkerheder, der forøger kreditrisikoen væsentligt.") # Genforhandling eller Nybevilling st.selectbox("Genforhandling eller Nybevilling:", ["Genforhandling", "Nybevilling"]) # Liste med kundetyper kundetyper = [ "(Vælg kundetype)", "Handel", "Industri", "Entreprenører", "Service og liberale erhverv", "Ejendomsudlejning", "Ejendomsudvikling, investeringsprojekt", "Landbrug", "Landbrug, forpagtning", "Andelsboligforeninger", "Almene boligorganisationer", "Ejerforeninger", "Hoteller (ej bortforpagtet)", "Statseje. skoler og gymnasier", "Privatskoler og private gymnasier", "Uregulerede skoler", "Flerstrenget idrætsanlæg", "Enkeltstrenget idrætsanlæg", "Golfklubber", "Kulturelle institutioner", "Sociale institutioner" ] # Selectbox til valg af kundetype valgt_kundetype = st.selectbox("Kundetype:", kundetyper) # Knap til indtastning af Kundenavn/Debitor Navn = st.text_input("Kundenavn/Debitor:") # Checkbox eller selectbox til valg af metode guideline_valg = st.selectbox("Vælg hvordan guidelines er beregnet:", ["Regnskab", "Budget"]) # Tekst til radio-knap st.write('Vurderer du, at lånesagen fraviger krav i forretningsange?') # Opret en radio-knap til valg mellem "Ja" og "Nej" valg = st.radio("Fravigelse af guidelines:", ['Nej', 'Ja'])