Spaces:
Build error
Build error
File size: 55,153 Bytes
849dd0e eaa6a66 849dd0e eaa6a66 849dd0e 6ced43c eaa6a66 849dd0e eaa6a66 849dd0e eaa6a66 849dd0e eaa6a66 849dd0e eaa6a66 849dd0e eaa6a66 849dd0e eaa6a66 849dd0e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 |
# 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'])
|