Darwin / app.py
Bjerring98's picture
Update app.py
6ced43c verified
# 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}{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}{æ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}{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']}{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'])