Spaces:
Build error
Build error
| # 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']) | |