From 3d744232786bc73fb3b5f16340c0f34af1056a37 Mon Sep 17 00:00:00 2001 From: Christian Khazanovych <3028363@stud.th-mannheim.de> Date: Wed, 24 Jun 2026 17:34:16 +0200 Subject: [PATCH] Gruppe K: Belegworkflow hinzugefuegt --- out/belegworkflow/Angebot.class | Bin 0 -> 2973 bytes out/belegworkflow/AngebotStatus.class | Bin 0 -> 1057 bytes out/belegworkflow/BelegnummernGenerator.class | Bin 0 -> 2731 bytes out/belegworkflow/BelegworkflowService.class | Bin 0 -> 10150 bytes out/belegworkflow/Dokument.class | Bin 0 -> 2653 bytes out/belegworkflow/Dokumentposition.class | Bin 0 -> 1721 bytes out/belegworkflow/Rechnung.class | Bin 0 -> 3731 bytes out/belegworkflow/RechnungStatus.class | Bin 0 -> 1004 bytes out/kundenverwaltung/Main.class | Bin 10084 -> 14117 bytes src/main/java/belegworkflow/Angebot.java | 33 +++ .../java/belegworkflow/AngebotStatus.java | 7 + .../belegworkflow/BelegnummernGenerator.java | 53 +++++ .../belegworkflow/BelegworkflowService.java | 191 ++++++++++++++++++ src/main/java/belegworkflow/Dokument.java | 63 ++++++ .../java/belegworkflow/Dokumentposition.java | 39 ++++ src/main/java/belegworkflow/Rechnung.java | 50 +++++ .../java/belegworkflow/RechnungStatus.java | 6 + src/main/java/kundenverwaltung/Main.java | 123 ++++++++++- 18 files changed, 555 insertions(+), 10 deletions(-) create mode 100644 out/belegworkflow/Angebot.class create mode 100644 out/belegworkflow/AngebotStatus.class create mode 100644 out/belegworkflow/BelegnummernGenerator.class create mode 100644 out/belegworkflow/BelegworkflowService.class create mode 100644 out/belegworkflow/Dokument.class create mode 100644 out/belegworkflow/Dokumentposition.class create mode 100644 out/belegworkflow/Rechnung.class create mode 100644 out/belegworkflow/RechnungStatus.class create mode 100644 src/main/java/belegworkflow/Angebot.java create mode 100644 src/main/java/belegworkflow/AngebotStatus.java create mode 100644 src/main/java/belegworkflow/BelegnummernGenerator.java create mode 100644 src/main/java/belegworkflow/BelegworkflowService.java create mode 100644 src/main/java/belegworkflow/Dokument.java create mode 100644 src/main/java/belegworkflow/Dokumentposition.java create mode 100644 src/main/java/belegworkflow/Rechnung.java create mode 100644 src/main/java/belegworkflow/RechnungStatus.java diff --git a/out/belegworkflow/Angebot.class b/out/belegworkflow/Angebot.class new file mode 100644 index 0000000000000000000000000000000000000000..ef085b4ae6c5a5351b03f56acc9d6f7505a93bda GIT binary patch literal 2973 zcmcImjaC~)6#fQCHiV_5p#_mbQ-lhkZK_snn_A_kwAd81i?k7|PLd%k>`&a?P^nd` zeF+~!JytE}=mU6sCXaV^H)a!3)N}L@cJ9vJx%Zpz{>=RL$NsMXuHkVKUFcTOqaubl z!%#^WqI%zUb~X+Bes0m;shh&`7~)rSOZToa6s8N?e3$18ZdG%d=jc{7AIx~VDRKq7 z%#B6viE#3uTHVu)TtRoe{LFeU66jTsRM7{O;dra}Ijbs4HaSmL>%#E#>b&lfQb%vS zID!EMDHTVNW*F^gN%Oc@Clj&NrKM{t3}b~u)bbMCF%`$9y}0WyO<{o!8A!z8-+ilyo9m1 zMHm9Z&Cv8=23ZBOD$d|6S@tph_1Wjc5!@uAr)MH-T~E%+w4foMrWDJmIFFYI0I$`I zJ%*Dl`kQsDEHUJkLLuLWS8zeWt14c@>kPw9$1S!Qx=mhVxEN-m5AC3}XJbp?5(Cm; z$V-G*7^XTSo7XMw?5);>!#&&a@m*E%Cf*_v98sy41!Y9ECW0V_>EDX0%~pucFOhIn zk|H#(VgZX3l&bJF8F_2YdLZ;FIXc$B7%i(LmT+Cc4He6HyCt83@+6>}wqtTCq)Snt z!PopoB&k9aQDC7~n)*aR#Vt_T44ZsMEZA0=dv|niizKQJ%cH_-gd++sVm`Fh!8`-+ z04-Shulq{JWi#sxJqvb)SR5$mmRPBqCE={`l0h@QnqIZ2LL8DG|7Sq1w6&K;H*Hj2 z{%YsWDWUdL@WTe;cfH|8@rQl#wM%lu$D&JZc{rmeW@rL=d%bS$+BctR zWWlCWy7tWT*005ug=>4YmgD)Ke+*nkT^(E-WjOr0zzsvw=}thDe44}_9w_)sHj{@8 zlLsgX5-#X3OAS)K`TuDMyVKwF!}cvv-Y;90a25>ix`JZ;B^@OP_S7k23cjMOK3tW0 zcMx8jq8#g@1GS6(=(6NXbTy$dPKQ_wt2F-(z2)Uaj>h5a?3uG8JwJhEM`BN)WWPuM z6AXSwpBUbyXBs{9?1z7I!T^Sl!fl%Af<_u^c#oda;24c`R3euB0m`=|1k0t@-~e66 z9g^Es2isK#N$D<%q3VRc5dxo`Z9ygPqaZ9X43j1meyINl3Q54-^iWFq1FeN^&O(ggy<95*?rsunyUj^#?g%r$VwOP;X@iv(0h&k cKLW?5FKuBPChn6x3!jrllB6&22w!95PfzDVYybcN literal 0 HcmV?d00001 diff --git a/out/belegworkflow/AngebotStatus.class b/out/belegworkflow/AngebotStatus.class new file mode 100644 index 0000000000000000000000000000000000000000..7b6c88f1b5e9aa67491a0aecf32208b9bdafac51 GIT binary patch literal 1057 zcmaJ&1w9!g@B}sCX<@#HQGXNEih-*l2#9YgGWi)Fo<8||Z+vhZB+@5F~&G(Ha zMdQ|68WxabP&V7U^_F2WtbLf7LWPby3X&QYahG`YT;H=97IXRfv2|jVT+8d18r@^N z7gkiHa8JRqhBQ_v*Oi0ejRutT#BxV=%|Bmh&p)KP z7wV2@?~evuJ2rV25@UY zQ^-Rmdk$Ih&y%)6l7H$L^WSj$68aa?7z%X8qBoKJ)7XMA@fRYisN!@w()D^Cj!Otcl_dR7NeCz=RX%5O<#bDs=mb)+pI{wv z4AJaJV<=`v9#fNUa)}e9H~}{&;NlO$>g(b;9-Kjplnp6Tlt_6fM~ZrZ%`?nj@zf){ Xgn8;=n!1yva)b%ZXDAab0nh&e=n&aB literal 0 HcmV?d00001 diff --git a/out/belegworkflow/BelegnummernGenerator.class b/out/belegworkflow/BelegnummernGenerator.class new file mode 100644 index 0000000000000000000000000000000000000000..1ac625ac685bf920f55e87f9474d697e4a6e71a8 GIT binary patch literal 2731 zcmai0>vj@X6#foGhv1k*lxV!fs6hcQc&n|Vwh6{an}7{5X|z@kZ~`MRgTs(Z@7H%| zpP+yIQM=ld$*nLyeHS0D*FrHXa5Mnr06m?NqH_X~<-B?de%bDJ8G=!TSK^wI)xGsyHZ554!@+afxJ1#bF#F z=UYvom8!z*!5Q^|lT9pzaEu{5l{+6RpO0OL56RhJZns)Bj`9%~TgepN6!8D@28U)pMF& z%Qr2}(8G8K*A%>~;yqkv*xxUAmvFSmbFrbdEE-&PaP(VneBWN|X-_8}N&{&XH*t$n zW(r<*!x{J0oQ!YebVL&d;tXoiz*&q$%EEokOI_1t}az0h@7@twql*ltn+|j5+se@=T@e95=dNbcUD0d5Bn-`MMcAY(y zh03KTeWmEISV8G6!seSo?-5q0SVe_;*Se`$!X?yWU$CCK%v8Bq5YO8}FNySYEI1x8>~&eNB-;+rYhfmHFZUof+dDUqG0L&GV+CB3v-qW=Y6g zGaUB4AudRQ5U^>(uv(VMoAbh|8s%09YeZb9Jx|mOojT}*PJP*$s0evi=o9P0q~DDR z7QzNYatB$rn_E5k;obN=j4$w|g0E!pe9bUv^VGiaG=0seiBva+-FmvqB^5Ure)d+9 zBiIFekLzV>Qj>FrQENBTZzsdE(syuivnhPU9bS0uV3!YGkQrXD7l?al1~seGrJJeq zR!g)LeCO7lSKJS(f*%;h-*UfClv;1sFPxx@GC)mdfbL2S&xnjQnguXO^SWogpVsJ} zw)g19rT;FHrN;$*8#KFxAdP^rRPWMps)d;Y{QjrQB4=u6sU(CHf?W55u7hv_?l zL!_9&0C!a7Nv(vGO0N8Y;en@8O=K`h<1HMD9NqOAftBEq4#o>B19DZ4I+*-z+rSWE z0ip_z`3O0ni)I;s5{u literal 0 HcmV?d00001 diff --git a/out/belegworkflow/BelegworkflowService.class b/out/belegworkflow/BelegworkflowService.class new file mode 100644 index 0000000000000000000000000000000000000000..b6376cc3ac1ca177782fdf3ecf461ad6fc6c129a GIT binary patch literal 10150 zcmcIq33ydydVarbC%HL5xMA@kNI+CV0ukI3MkSCS8Uhjs23b70IZ2M(+#Bybm(5{x z+;H5N85Ng7VH6!l1=O%gr?%DBPOBZeO*`G4wlkf!)4d&VnD;-+&AB%Ruzj9BKHQx1 zFW>rp%l{ug`o)ps09xdD1Vt#;P@F!btWtEbG42jN5{;`Bu`huND-~ ztnJiLE~s`EWo;|buppf_wzgRrI|2>G6{v)+VU&*17$cb8Z6?gV&8hUp-b8A1Lv!%0 z!%T0o;-;XSyv**D&Bv;?VZw@LlcG0PM^q7uq|JDLGRwtD4dVpohY(L@2L{Y^a~+>)oS8m9dp&hXf?4S=i3M-;}RX0;xd6|WtwTOjSlqIRNx9+ zso^RejcCgE#MX>$4scZ}OT3PEEl3wEr-N*o+B62}$1e#kYBl>4X1cNFhHSFOOwL}i zsHVqA_tqq>c)wkfFwJyL#Fmu#s;$*4{;Q$tD2n&qjCWm~CajhXIErF+bDg0fP; zHZ0Z9u45UN`vTh5fZ5QNiW`YVbS}-2Ol=lSoay-{f4WJLSfQf>D=A8!X?K}M+A;JJ z6*ZkYR^ukYgrq^&P#({988^g~&PzPHK|pI*!>RnZ@^(hhg|#ZntP>a^26MeuAmqsS za7Ucni=%_wtZuZ})2 zh$jvh8_k8OWZbYW zhp(qn4YRiwRRd;!x+c}zYpSrS#_c-3tbjGq2bLfD9#COPR;*MCKceGNJVtC}%p5jqW}eZHwVeu} zPw043#X@y17JTEI$tYU|BCirp>3AB?(3}p6{RM*h5PKEk(O*p*7b|Mp@tlt570Xe* z%zK%5f7-OV6|)lbsua3Q$BTH0ZAivRixIH?)g_l{hZPF9W3l(ZO z8TV$Bag|_MEzBN^(QP(WVlQ6R@S2Wq<8?xHcyS&#r+3-9)Ue}B57Rt04w6D>)~<=7 z411z%llW7PJ*r{ar+~I!5DRWzm`WsAmMKzGZD$k}*rVimN5{Juq8Zp%*d{aeRlz-B z3|(|N^5lu_sCP)mVH_bqlnYy}w6fHMJi{&6S!>H773@`dKy*9^OzC5$w_MYrb&<0o$Cl5-f8OypLk#{||J0h~K2GEvl`Wx?HYI-|5L&nkKh*JOs+5k6loh89?{4-UH zl;dBRt5y5lV0g{noOouFQtsb${JS!1xt((5*YKYdBfraCMzgvwQ;qF^>-Zo1oat_J znrLu$3D$Ww&o!w|=NbUr!hR#&VcwQClW}uIM?1_RyouFt(r>WX0WMkAvL$Xhp`rTG zU+6fcn$co2O=Fx8(WOY~6rr7#nwgBz#~z{*y_%GcP_4~MZp^7Bnl9y1K_r=5SUXwD z{k)a0m3Lyu4Gt4=nwg8FQl|`~*kQ2i?OBjWaDnRX{kY6+bZq2xDNc+y-4wfT8KX;; zjAi-H3??kb#mo>$FR2YVy0D{^YF)<3cy1mv(kdS`1UKjT;dEVTMkeZVj_|OiZ88#B zb6KxoZjg%Wb~-D+N$@%kuhEG@cdN^%s>J+I{oKhPnW{^TiVM{~_@yXAc&d2YF4J{6 z-=A$W=?5M+hi5O)%`y{e=S*E{mE%>sd6Hz>35o4e$2Lvs1vQMX ze2IPjp2%wP99Dg3g``oMG?}j~&hydaGYL2h$v`F>;f4^Uu3)mPeOnI_A1xly_8ynMkHr8Z^<%%nZ&9llsh=-1`xR8MvzVdM6jQB+|MJ-(oQ zaZB^El`R`um$bETWgzi*P~{^3xX`H}O$e=MS$JLhD(-CewpDakeM#al&Dp}RoL>MO z4`5AKGxN*}lzA1xg=>9(IEzabrg{{2l@!{u1KnnNrO}<>NFAs!#W z@{sr|;M?TB7xb-#koP60MTq+N#-+xfCqeq`EDBXC^b%G4UkWkF*VMPtf@~(I^v2Ul zRG?%i)6l^}bNFoO$7(iWM#9QiJj?jQ>`CZR=al1vj?=1B<8T2Q-3i?ob{pMV=hyUH zhA*_C?+^v0(Q32LTOE(;&$``TP19?_dz$KyvOsYY#z1$EF(dD|FyrEazQzld0<7ma z)UM$fK1j$DUC{|Ucofj_6;))WdSt?_ID;AXEGsS%To#6oGiMQ2=(AF$GH2mEmk07; z`A2|b#@Xh{A<~h`rsJl%4CL9PIpkV)j>^2eV`HARGj`e-Tx#0=sh&)^+)e>KTRK-# zi9Vj!;{AMfa)#Yl!#-v^lYQZhfOz)-eI^epynLHeE_bjh`u;sVv9IzX*(a7;9YXDH zG7Zdc&hoabMx7}GRdh}jj4@?$A5XEeLzhjGsuCXbC!OYKOpkH(gKG6dx@2XbN*+-M z&;o4vT;1i5spXIBl93cQKdIinuFIed@a-w}_OvcZXKtr@dsdf(43x|Bxm%Q)Zqpj5 z>F_S2k~KUH)p#a19rJ!OXI^({8*flUmc5v}@C>8q3vDJHn!9T@GT|v z%eveq=_=XFZH49-k(V7SzNWT)TNhi>B=VhzydiID@)mE`WS?NhaH+SFn^GH1b)x5) z#=UTBHPkgV@0p$nMxD3Nh30ievWIuuGul$D-Gg2s2sSEiLUu;-Hm=+{Xof5gCbEzd zmq%hDQ)UN`B2853Kt$e_cQkodmmxVw(2h{4%}Ill*XZ>XsvHQueeeHYy)){bH|bh5 zXqvof$8Nzkw9q8%)s`grwPj(#$YjinCP(~l7$cpK?>$Y9u_YT}zC1^>r*mD6X*^&R z@uIdAlcYmdLSz-+itsbOcMiYH1guEsgCmMcog_5}B=ll7h`$9QK{#+gLj z2Z+=SVct%RI)KZg^M`P??5qC(di`N65_rQ)oZ(sTV8S8XFoYY2u&S}-D7w00B^;=$ zpM4NFHKNp)A^z4 zeAMGYH1UMqhMBktwOGqhiyxpia7P(RDl7B~&+NBQBSX6RtBm^-UIZy??3hJ$tj5w< z>4z9g3F?kuz!5<9#Y%^eJb?7euC7}~D7CGz>?pQ(#mcCZT6~B4xx0RLtfcNBb~I|S z(gS#42oF=ys+cycD3yI&DO+{~Uw4(&hLvq*cMpD{(xBA7gvhv*j=G$Vx&pItB^s#i z)tHZVdTEwvcDSj@>U?DbR5$@r~Ri%6dicVsZhOTkcIL=8|?z$4y`|F4BtS28$@q#L&)Up|EnX(Y%e5Zkv~6RxnyK6El@&@-#&`>nUj9K&6Vmm1WTD5eoG~XG#`Ff zK#AJxW)I=}L->Q}5BS69KOMrK`_Fd-#{ViXo(w#H7I^;q!1F(-=YJxB)q77p82y=- z6N&YI<>P-G!hfyai|V!m_`HsH+DC+;z_8x$xMvr!c)|mj8-*#Rh(Si)ZFGH_pJp?J zy-nC<8FiZ&b(?WJwqOUg;sI>KF2a2`NA~bT(*b@>Qc*Y=C7&az;e8Ds{T!Q5Fx&~rDbYFrR1_$ zS*%p!+XOdjMPg-c*4lgOkvy|a^30~9c|1e+1T(?Y&R;iAxaPZyIpS{4+{@^>k11>i zQ`P-6;n&bfgV}hHhI)u24>Juu!u^kv!lQT&kMZ-z6OQ@np`FA84O2fyrG^$7@g&aE zF!?0LX>#i+ra#A;X!gv>Pe`6Q(;gZ>3!stU4x(|lkH+l^jdJcV>SXdTqGU>7{Jg;U zw7~O>!1G0c^~|I`s)Z~r_7EPY8$fIX61Z7Z1R&Yd+R*QpX3EJqfX^E^0mIldpZ zyqC*)nDmxk=20I{>Nhw=d)5(Y^UCNjC%0IyXS=z9kX%m^JiU$NC`-dQZs2krW=C?w z-9E<^r{TDk9M_TKT9V+w?~8I=$K^b2hb*5GCg5r==TUy-a@-NNyc5N;nNBE@EwYt= z@5fkqotw8gzh8EKzvBGf>HOX$`?=#DxmWJ@o*s~gy{AWWV^8G9zL6VyhGUBIbI$Jz f&hIYg_a$%t9(l!kdX-OyC{2Xx56e+`53yeYNUEuh-%*))aUEJQx+q=nW zd%Ika7Ma@J2di8t$f7`3x+XT`6iq9aQi3{kbmE9W^M>J+3j#eJ%rOfxnYOb=e%f%P zi|o>IOzG>`E?XPYT9TWxD6Ksuq({eboDhiY*d^03ZA)5o!;@5Y%zQF!mK;||ua1*= zL!fh0mYkd{Ww(l^Tvu?h7NMk5I!>z?bgol)cFU5bjI!TqLq7&IoY8R>ZwYj}z7z~+ zD>-H6re)SF73CZSh?JDr1?f1pa$rbDLXq2Da>kKmS!~A$ z&TAOek;DbM?W(MLBhYF(vS>IqV|zS4ROjrRPfxXD43{)q)^P<_nSq*w3PeELGD-{b zQ>KflT~i#_b=<&BI%B!y?uzWXf=Fo?7dYKG@s%7zkivwHTewXFbJDr*=cZJ1T_9GG z9t>850iV)w2h+67*w_#ljW-Uf@A}IEQkd28u2LVRdM~IY!`V}!=XAWMM7I{odB@zz zf7XUH<~1znSj2rATubnh&3a?G&f6Q3@wz*io_(@RNUYABdQ3{mU(%7m1IjN^Gpm@K z7vpoU;&_D%sxnq|Jgim5RI$v8X~n9*CAWBP_79GZZT8PBFZF-kKfjxC4iP+fjTFHn zJl61`j*sxcH+7w9(~=A20$clmv93~L{cn0+!!2b= zG~*cA?RjIzH=u)sIi<#DWlA3IHs2?f5pf)ZYCxW-bW9)=0!InDcW5?xm0xK*HRZZ0 z+|`6I+?QV>zJ@z~S5?OtCzR?k_3gD<9l@(ZT4~b+HXHAu}Xl22Ssum3out!2%W333Qb;Mg(Efn|Ux^PeK1_*r2dk6;KIe}d| zN3MIa!Q7LZfu~MvGuDaC^6MebW}asgKR_gg_n{?5_7P2--^bBJZ+IWwiKczT5(jwm zJHiAu_)^-%-Z{V|S=5bxGY7ca{2ccV@cx2A#Lv6W z@vr~+)n)MCln(V;{fxV>ibQ;sx~yCaxvpJBl=sun&_}lhFidA|aw*fPeDL46>Hz};)PL#1sLV8iKqNk zA*zQ)gU}>F+YO~24MHyvnn%IUa=p~s8p@1GjvmhvL(TSjn(Q@{o@B*XMx|~yHkzaHBuD5uj_-B ipAlMZVqOL_t6^0anN^jg<;;&*3)(kMrZU+=c=j)^#cd}5 literal 0 HcmV?d00001 diff --git a/out/belegworkflow/Dokumentposition.class b/out/belegworkflow/Dokumentposition.class new file mode 100644 index 0000000000000000000000000000000000000000..c7339be42bc08fe7dea8950b440f9d07e637d6c3 GIT binary patch literal 1721 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 literal 0 HcmV?d00001 diff --git a/out/kundenverwaltung/Main.class b/out/kundenverwaltung/Main.class index 9266de6e1621105ff39f64f5d105403aa991884f..1ea4d40467664cf2a654f1f383153e472590a255 100644 GIT binary patch literal 14117 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 A*Z=?k literal 10084 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 diff --git a/src/main/java/belegworkflow/Angebot.java b/src/main/java/belegworkflow/Angebot.java new file mode 100644 index 0000000..783a78a --- /dev/null +++ b/src/main/java/belegworkflow/Angebot.java @@ -0,0 +1,33 @@ +package belegworkflow; + +import java.time.LocalDate; +import java.util.List; + +public class Angebot extends Dokument { + + private LocalDate gueltigBis; + private AngebotStatus status; + + public Angebot(String belegnummer, LocalDate datum, String kundenReferenz, + List positionen, LocalDate gueltigBis) { + super(belegnummer, datum, kundenReferenz, positionen); + this.gueltigBis = gueltigBis; + this.status = AngebotStatus.OFFEN; + } + + public LocalDate getGueltigBis() { return gueltigBis; } + public AngebotStatus getStatus() { return status; } + + public void setStatus(AngebotStatus status) { + this.status = status; + } + + @Override + public String toString() { + return String.format("[%s] Angebot | Kunde: %s | Datum: %s | Gueltig bis: %s | Status: %s\n%s\n%s", + belegnummer, kundenReferenz, datum, gueltigBis, status, + positionen.stream().map(Dokumentposition::toString) + .reduce("", (a, b) -> a + "\n" + b), + getSummenAnzeige()); + } +} \ No newline at end of file diff --git a/src/main/java/belegworkflow/AngebotStatus.java b/src/main/java/belegworkflow/AngebotStatus.java new file mode 100644 index 0000000..63b8a3c --- /dev/null +++ b/src/main/java/belegworkflow/AngebotStatus.java @@ -0,0 +1,7 @@ +package belegworkflow; + +public enum AngebotStatus { + OFFEN, + UEBERFUEHRT, + VERWORFEN +} \ No newline at end of file diff --git a/src/main/java/belegworkflow/BelegnummernGenerator.java b/src/main/java/belegworkflow/BelegnummernGenerator.java new file mode 100644 index 0000000..f890b06 --- /dev/null +++ b/src/main/java/belegworkflow/BelegnummernGenerator.java @@ -0,0 +1,53 @@ +package belegworkflow; + +import java.io.*; +import java.nio.file.*; + +public class BelegnummernGenerator { + + private static final String ANGEBOT_COUNTER = "data/angebot_counter.txt"; + private static final String RECHNUNG_COUNTER = "data/rechnung_counter.txt"; + + private int angebotCounter; + private int rechnungCounter; + + public BelegnummernGenerator() { + this.angebotCounter = ladeCounter(ANGEBOT_COUNTER); + this.rechnungCounter = ladeCounter(RECHNUNG_COUNTER); + } + + // Nächste lückenlose Angebotsnummer (GR-01) + public String naechsteAngebotsnummer(int jahr) { + angebotCounter++; + speichereCounter(ANGEBOT_COUNTER, angebotCounter); + return String.format("AN-%d-%06d", jahr, angebotCounter); + } + + // Nächste lückenlose Rechnungsnummer (GR-01, F-07) + public String naechsteRechnungsnummer(int jahr) { + rechnungCounter++; + speichereCounter(RECHNUNG_COUNTER, rechnungCounter); + return String.format("R-%d-%06d", jahr, rechnungCounter); + } + + private int ladeCounter(String datei) { + try { + Path path = Path.of(datei); + if (Files.exists(path)) { + return Integer.parseInt(Files.readString(path).trim()); + } + } catch (IOException e) { + System.err.println("Counter konnte nicht geladen werden: " + datei); + } + return 0; + } + + private void speichereCounter(String datei, int wert) { + try { + Files.createDirectories(Path.of("data")); + Files.writeString(Path.of(datei), String.valueOf(wert)); + } catch (IOException e) { + System.err.println("Counter konnte nicht gespeichert werden: " + datei); + } + } +} \ No newline at end of file diff --git a/src/main/java/belegworkflow/BelegworkflowService.java b/src/main/java/belegworkflow/BelegworkflowService.java new file mode 100644 index 0000000..6852208 --- /dev/null +++ b/src/main/java/belegworkflow/BelegworkflowService.java @@ -0,0 +1,191 @@ +package belegworkflow; + +import java.io.*; +import java.nio.file.*; +import java.time.LocalDate; +import java.util.*; + +public class BelegworkflowService { + + private static final String ANGEBOTE_FILE = "data/angebote.csv"; + private static final String RECHNUNGEN_FILE = "data/rechnungen.csv"; + + private List angebote; + private List rechnungen; + private BelegnummernGenerator generator; + + public BelegworkflowService() throws IOException { + this.angebote = new ArrayList<>(); + this.rechnungen = new ArrayList<>(); + this.generator = new BelegnummernGenerator(); + Files.createDirectories(Path.of("data")); + ladeAngebote(); + ladeRechnungen(); + } + + // Erstellt ein neues Angebot (F-01, F-02, F-03, F-04) + public Angebot erstelleAngebot(String kundenId, List positionen, + LocalDate gueltigBis) { + if (kundenId == null || kundenId.isBlank()) { + System.out.println("Fehler: Kunden-ID darf nicht leer sein."); + return null; + } + if (positionen == null || positionen.isEmpty()) { + System.out.println("Fehler: Mindestens eine Position erforderlich."); + return null; + } + + String nr = generator.naechsteAngebotsnummer(LocalDate.now().getYear()); + Angebot angebot = new Angebot(nr, LocalDate.now(), kundenId, positionen, gueltigBis); + angebote.add(angebot); + speichereAngebote(); + System.out.println("Angebot erfolgreich erstellt: " + nr); + return angebot; + } + + // Erstellt eine Rechnung aus einem Angebot (F-05, F-06, F-07, F-08) + public Rechnung erstelleRechnungAusAngebot(String angebotsNr, LocalDate rechnungsdatum, + LocalDate leistungsdatum, LocalDate zahlungsziel) { + Angebot angebot = findeAngebot(angebotsNr); + if (angebot == null) { + System.out.println("Fehler: Angebot " + angebotsNr + " nicht gefunden."); + return null; + } + if (angebot.getStatus() != AngebotStatus.OFFEN) { + System.out.println("Fehler: Angebot ist nicht mehr offen."); + return null; + } + + String nr = generator.naechsteRechnungsnummer(LocalDate.now().getYear()); + Rechnung rechnung = new Rechnung(nr, LocalDate.now(), angebot.getKundenReferenz(), + angebot.getPositionen(), rechnungsdatum, leistungsdatum, zahlungsziel, angebotsNr); + + // Angebot als überführt markieren (F-05) + angebot.setStatus(AngebotStatus.UEBERFUEHRT); + rechnungen.add(rechnung); + speichereAngebote(); + speichereRechnungen(); + System.out.println("Rechnung erfolgreich erstellt: " + nr); + return rechnung; + } + + // Festschreiben einer Rechnung (F-10) + public void finalisiereRechnung(String rechnungsNr) { + Rechnung rechnung = findeRechnung(rechnungsNr); + if (rechnung == null) { + System.out.println("Fehler: Rechnung " + rechnungsNr + " nicht gefunden."); + return; + } + rechnung.festschreiben(); + speichereRechnungen(); + System.out.println("Rechnung " + rechnungsNr + " wurde festgeschrieben."); + } + + // Prüft ob Kunde in einem Beleg referenziert wird (F-12) + public boolean istKundeReferenziert(String kundenId) { + return angebote.stream().anyMatch(a -> a.getKundenReferenz().equals(kundenId)) || + rechnungen.stream().anyMatch(r -> r.getKundenReferenz().equals(kundenId)); + } + + // Prüft ob Produkt in einem Beleg referenziert wird (F-12) + public boolean istProduktReferenziert(String produktId) { + return angebote.stream().anyMatch(a -> a.getPositionen().stream() + .anyMatch(p -> p.getProduktReferenz().equals(produktId))) || + rechnungen.stream().anyMatch(r -> r.getPositionen().stream() + .anyMatch(p -> p.getProduktReferenz().equals(produktId))); + } + + public List alleAngebote() { return new ArrayList<>(angebote); } + public List alleRechnungen() { return new ArrayList<>(rechnungen); } + + public Angebot findeAngebot(String nr) { + return angebote.stream().filter(a -> a.getBelegnummer().equals(nr)).findFirst().orElse(null); + } + public Rechnung findeRechnung(String nr) { + return rechnungen.stream().filter(r -> r.getBelegnummer().equals(nr)).findFirst().orElse(null); + } + + // Einfache CSV Persistenz für Angebote + private void speichereAngebote() { + try { + StringBuilder sb = new StringBuilder(); + for (Angebot a : angebote) { + sb.append(a.getBelegnummer()).append(";") + .append(a.getDatum()).append(";") + .append(a.getKundenReferenz()).append(";") + .append(a.getGueltigBis()).append(";") + .append(a.getStatus()).append(";") + .append(a.getSummeNetto()).append(";") + .append(a.getSummeSteuer()).append(";") + .append(a.getSummeBrutto()).append("\n"); + } + Files.writeString(Path.of(ANGEBOTE_FILE), sb.toString()); + } catch (IOException e) { + System.err.println("Fehler beim Speichern der Angebote: " + e.getMessage()); + } + } + + private void ladeAngebote() { + try { + Path path = Path.of(ANGEBOTE_FILE); + if (!Files.exists(path)) return; + // Vereinfachtes Laden - nur Metadaten ohne Positionen + List zeilen = Files.readAllLines(path); + for (String zeile : zeilen) { + if (zeile.isBlank()) continue; + String[] t = zeile.split(";", -1); + if (t.length < 8) continue; + Angebot a = new Angebot(t[0], LocalDate.parse(t[1]), t[2], + new ArrayList<>(), LocalDate.parse(t[3])); + a.setStatus(AngebotStatus.valueOf(t[4])); + angebote.add(a); + } + } catch (IOException e) { + System.err.println("Fehler beim Laden der Angebote: " + e.getMessage()); + } + } + + private void speichereRechnungen() { + try { + StringBuilder sb = new StringBuilder(); + for (Rechnung r : rechnungen) { + sb.append(r.getBelegnummer()).append(";") + .append(r.getDatum()).append(";") + .append(r.getKundenReferenz()).append(";") + .append(r.getRechnungsdatum()).append(";") + .append(r.getLeistungsdatum()).append(";") + .append(r.getZahlungsziel()).append(";") + .append(r.getAngebotsNr()).append(";") + .append(r.getStatus()).append(";") + .append(r.isFestgeschrieben()).append(";") + .append(r.getSummeNetto()).append(";") + .append(r.getSummeSteuer()).append(";") + .append(r.getSummeBrutto()).append("\n"); + } + Files.writeString(Path.of(RECHNUNGEN_FILE), sb.toString()); + } catch (IOException e) { + System.err.println("Fehler beim Speichern der Rechnungen: " + e.getMessage()); + } + } + + private void ladeRechnungen() { + try { + Path path = Path.of(RECHNUNGEN_FILE); + if (!Files.exists(path)) return; + List zeilen = Files.readAllLines(path); + for (String zeile : zeilen) { + if (zeile.isBlank()) continue; + String[] t = zeile.split(";", -1); + if (t.length < 12) continue; + Rechnung r = new Rechnung(t[0], LocalDate.parse(t[1]), t[2], + new ArrayList<>(), LocalDate.parse(t[3]), LocalDate.parse(t[4]), + LocalDate.parse(t[5]), t[6]); + r.setStatus(RechnungStatus.valueOf(t[7])); + if (Boolean.parseBoolean(t[8])) r.festschreiben(); + rechnungen.add(r); + } + } catch (IOException e) { + System.err.println("Fehler beim Laden der Rechnungen: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/main/java/belegworkflow/Dokument.java b/src/main/java/belegworkflow/Dokument.java new file mode 100644 index 0000000..25ea754 --- /dev/null +++ b/src/main/java/belegworkflow/Dokument.java @@ -0,0 +1,63 @@ +package belegworkflow; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.util.List; + +public abstract class Dokument { + protected String belegnummer; + protected LocalDate datum; + protected String kundenReferenz; + protected List positionen; + protected BigDecimal summeNetto; + protected BigDecimal summeSteuer; + protected BigDecimal summeBrutto; + protected boolean festgeschrieben; + + public Dokument(String belegnummer, LocalDate datum, String kundenReferenz, + List positionen) { + this.belegnummer = belegnummer; + this.datum = datum; + this.kundenReferenz = kundenReferenz; + this.positionen = positionen; + this.festgeschrieben = false; + berechnesSummen(); + } + + // Berechnet Netto-, Steuer- und Bruttosumme (F-03, F-09, GR-06) + protected void berechnesSummen() { + summeNetto = BigDecimal.ZERO; + summeSteuer = BigDecimal.ZERO; + + for (Dokumentposition pos : positionen) { + summeNetto = summeNetto.add(pos.getPositionssummeNetto()); + BigDecimal steuer = pos.getPositionssummeNetto() + .multiply(pos.getSteuersatz()) + .setScale(2, RoundingMode.HALF_UP); + summeSteuer = summeSteuer.add(steuer); + } + + summeNetto = summeNetto.setScale(2, RoundingMode.HALF_UP); + summeSteuer = summeSteuer.setScale(2, RoundingMode.HALF_UP); + summeBrutto = summeNetto.add(summeSteuer).setScale(2, RoundingMode.HALF_UP); + } + + public String getBelegnummer() { return belegnummer; } + public LocalDate getDatum() { return datum; } + public String getKundenReferenz() { return kundenReferenz; } + public List getPositionen() { return positionen; } + public BigDecimal getSummeNetto() { return summeNetto; } + public BigDecimal getSummeSteuer() { return summeSteuer; } + public BigDecimal getSummeBrutto() { return summeBrutto; } + public boolean isFestgeschrieben() { return festgeschrieben; } + + public void festschreiben() { + this.festgeschrieben = true; + } + + public String getSummenAnzeige() { + return String.format("Netto: %.2f EUR | MwSt: %.2f EUR | Brutto: %.2f EUR", + summeNetto, summeSteuer, summeBrutto); + } +} \ No newline at end of file diff --git a/src/main/java/belegworkflow/Dokumentposition.java b/src/main/java/belegworkflow/Dokumentposition.java new file mode 100644 index 0000000..16832ed --- /dev/null +++ b/src/main/java/belegworkflow/Dokumentposition.java @@ -0,0 +1,39 @@ +package belegworkflow; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class Dokumentposition { + private String produktReferenz; + private String bezeichnung; + private int menge; + private BigDecimal einzelpreisNetto; + private BigDecimal steuersatz; + private BigDecimal positionssummeNetto; + + public Dokumentposition(String produktReferenz, String bezeichnung, + int menge, BigDecimal einzelpreisNetto, BigDecimal steuersatz) { + this.produktReferenz = produktReferenz; + this.bezeichnung = bezeichnung; + this.menge = menge; + this.einzelpreisNetto = einzelpreisNetto.setScale(2, RoundingMode.HALF_UP); + this.steuersatz = steuersatz.setScale(2, RoundingMode.HALF_UP); + this.positionssummeNetto = einzelpreisNetto + .multiply(new BigDecimal(menge)) + .setScale(2, RoundingMode.HALF_UP); + } + + public String getProduktReferenz() { return produktReferenz; } + public String getBezeichnung() { return bezeichnung; } + public int getMenge() { return menge; } + public BigDecimal getEinzelpreisNetto() { return einzelpreisNetto; } + public BigDecimal getSteuersatz() { return steuersatz; } + public BigDecimal getPositionssummeNetto(){ return positionssummeNetto; } + + @Override + public String toString() { + return String.format(" %s x%d | %.2f EUR (netto) | MwSt: %.0f%%", + bezeichnung, menge, einzelpreisNetto, + steuersatz.multiply(new BigDecimal("100"))); + } +} \ No newline at end of file diff --git a/src/main/java/belegworkflow/Rechnung.java b/src/main/java/belegworkflow/Rechnung.java new file mode 100644 index 0000000..5a5d8a1 --- /dev/null +++ b/src/main/java/belegworkflow/Rechnung.java @@ -0,0 +1,50 @@ +package belegworkflow; + +import java.time.LocalDate; +import java.util.List; + +public class Rechnung extends Dokument { + + private LocalDate rechnungsdatum; + private LocalDate leistungsdatum; + private LocalDate zahlungsziel; + private String angebotsNr; + private RechnungStatus status; + + public Rechnung(String belegnummer, LocalDate datum, String kundenReferenz, + List positionen, LocalDate rechnungsdatum, + LocalDate leistungsdatum, LocalDate zahlungsziel, String angebotsNr) { + super(belegnummer, datum, kundenReferenz, positionen); + this.rechnungsdatum = rechnungsdatum; + this.leistungsdatum = leistungsdatum; + this.zahlungsziel = zahlungsziel; + this.angebotsNr = angebotsNr; + this.status = RechnungStatus.OFFEN; + } + + public LocalDate getRechnungsdatum() { return rechnungsdatum; } + public LocalDate getLeistungsdatum() { return leistungsdatum; } + public LocalDate getZahlungsziel() { return zahlungsziel; } + public String getAngebotsNr() { return angebotsNr; } + public RechnungStatus getStatus() { return status; } + + public void setStatus(RechnungStatus status) { + // Schreibschutz prüfen (F-10) + if (this.festgeschrieben) { + System.out.println("Fehler: Festgeschriebene Rechnung kann nicht geaendert werden."); + return; + } + this.status = status; + } + + @Override + public String toString() { + return String.format( + "[%s] Rechnung | Kunde: %s | Datum: %s | Leistung: %s | Zahlung bis: %s | Angebot: %s | Status: %s\n%s\n%s", + belegnummer, kundenReferenz, rechnungsdatum, leistungsdatum, + zahlungsziel, angebotsNr, status, + positionen.stream().map(Dokumentposition::toString) + .reduce("", (a, b) -> a + "\n" + b), + getSummenAnzeige()); + } +} \ No newline at end of file diff --git a/src/main/java/belegworkflow/RechnungStatus.java b/src/main/java/belegworkflow/RechnungStatus.java new file mode 100644 index 0000000..f8c0b8e --- /dev/null +++ b/src/main/java/belegworkflow/RechnungStatus.java @@ -0,0 +1,6 @@ +package belegworkflow; + +public enum RechnungStatus { + OFFEN, + BEZAHLT +} \ No newline at end of file diff --git a/src/main/java/kundenverwaltung/Main.java b/src/main/java/kundenverwaltung/Main.java index 8eee9b2..3b80514 100644 --- a/src/main/java/kundenverwaltung/Main.java +++ b/src/main/java/kundenverwaltung/Main.java @@ -2,9 +2,12 @@ package kundenverwaltung; import bestandsmanagement.Produkt; import bestandsmanagement.ProduktServiceImpl; +import belegworkflow.*; import java.io.IOException; import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; import java.util.Scanner; @@ -12,12 +15,14 @@ public class Main { private static KundenServiceImpl kundenService; private static ProduktServiceImpl produktService; + private static BelegworkflowService belegService; private static Scanner scanner = new Scanner(System.in); public static void main(String[] args) { try { kundenService = new KundenServiceImpl(); produktService = new ProduktServiceImpl(); + belegService = new BelegworkflowService(); System.out.println("==========================================="); System.out.println(" Fakturierungsanwendung - Team 3"); System.out.println("==========================================="); @@ -32,19 +37,16 @@ public class Main { System.out.println("\n=== HAUPTMENUE ==="); System.out.println("1. Kundenverwaltung"); System.out.println("2. Bestandsmanagement"); + System.out.println("3. Belegworkflow"); System.out.println("0. Beenden"); System.out.print("Auswahl: "); - String eingabe = scanner.nextLine().trim(); - - switch (eingabe) { + switch (scanner.nextLine().trim()) { case "1" -> kundenmenue(); case "2" -> produktmenue(); - case "0" -> { - System.out.println("Programm beendet."); - return; - } - default -> System.out.println("Ungueltige Eingabe."); + case "3" -> belegmenue(); + case "0" -> { System.out.println("Programm beendet."); return; } + default -> System.out.println("Ungueltige Eingabe."); } } } @@ -70,7 +72,7 @@ public class Main { case "5" -> kundeLoschen(); case "6" -> transaktionshistorie(); case "0" -> { return; } - default -> System.out.println("Ungueltige Eingabe."); + default -> System.out.println("Ungueltige Eingabe."); } } } @@ -180,7 +182,7 @@ public class Main { case "4" -> artikelBearbeiten(); case "5" -> artikelLoeschen(); case "0" -> { return; } - default -> System.out.println("Ungueltige Eingabe."); + default -> System.out.println("Ungueltige Eingabe."); } } } @@ -253,4 +255,105 @@ public class Main { System.out.print("Artikel-ID: "); produktService.produktLoeschen(scanner.nextLine()); } + + // ─── BELEGWORKFLOW ────────────────────────────────────────────── + private static void belegmenue() { + while (true) { + System.out.println("\n--- BELEGWORKFLOW ---"); + System.out.println("1. Angebot erstellen"); + System.out.println("2. Alle Angebote anzeigen"); + System.out.println("3. Rechnung aus Angebot erstellen"); + System.out.println("4. Alle Rechnungen anzeigen"); + System.out.println("5. Rechnung festschreiben"); + System.out.println("0. Zurueck"); + System.out.print("Auswahl: "); + + switch (scanner.nextLine().trim()) { + case "1" -> angebotErstellen(); + case "2" -> alleAngeboteAnzeigen(); + case "3" -> rechnungAusAngebot(); + case "4" -> alleRechnungenAnzeigen(); + case "5" -> rechnungFestschreiben(); + case "0" -> { return; } + default -> System.out.println("Ungueltige Eingabe."); + } + } + } + + private static void angebotErstellen() { + System.out.println("\n--- ANGEBOT ERSTELLEN ---"); + System.out.print("Kunden-ID: "); + String kundenId = scanner.nextLine(); + + List positionen = new ArrayList<>(); + while (true) { + System.out.println("Position hinzufuegen (Enter zum Beenden):"); + System.out.print("Produkt-ID (oder Enter zum Beenden): "); + String produktId = scanner.nextLine(); + if (produktId.isBlank()) break; + + Produkt produkt = produktService.findeProdukt(produktId); + if (produkt == null) { + System.out.println("Produkt nicht gefunden."); + continue; + } + + System.out.print("Menge: "); + int menge = Integer.parseInt(scanner.nextLine().trim()); + + positionen.add(new Dokumentposition( + produkt.getProduktId(), + produkt.getBezeichnung(), + menge, + produkt.getNettoEinzelpreis(), + produkt.getMehrwertsteuersatz() + )); + System.out.println("Position hinzugefuegt: " + produkt.getBezeichnung()); + } + + if (positionen.isEmpty()) { + System.out.println("Fehler: Mindestens eine Position erforderlich."); + return; + } + + System.out.print("Gueltig bis (YYYY-MM-DD): "); + LocalDate gueltigBis = LocalDate.parse(scanner.nextLine()); + belegService.erstelleAngebot(kundenId, positionen, gueltigBis); + } + + private static void alleAngeboteAnzeigen() { + System.out.println("\n--- ALLE ANGEBOTE ---"); + List angebote = belegService.alleAngebote(); + if (angebote.isEmpty()) { System.out.println("Keine Angebote vorhanden."); return; } + angebote.forEach(a -> System.out.println(a.getBelegnummer() + " | Kunde: " + + a.getKundenReferenz() + " | Status: " + a.getStatus())); + } + + private static void rechnungAusAngebot() { + System.out.println("\n--- RECHNUNG AUS ANGEBOT ---"); + System.out.print("Angebotsnummer: "); + String angebotsNr = scanner.nextLine(); + System.out.print("Rechnungsdatum (YYYY-MM-DD): "); + LocalDate rechnungsdatum = LocalDate.parse(scanner.nextLine()); + System.out.print("Leistungsdatum (YYYY-MM-DD): "); + LocalDate leistungsdatum = LocalDate.parse(scanner.nextLine()); + System.out.print("Zahlungsziel (YYYY-MM-DD): "); + LocalDate zahlungsziel = LocalDate.parse(scanner.nextLine()); + belegService.erstelleRechnungAusAngebot(angebotsNr, rechnungsdatum, leistungsdatum, zahlungsziel); + } + + private static void alleRechnungenAnzeigen() { + System.out.println("\n--- ALLE RECHNUNGEN ---"); + List rechnungen = belegService.alleRechnungen(); + if (rechnungen.isEmpty()) { System.out.println("Keine Rechnungen vorhanden."); return; } + rechnungen.forEach(r -> System.out.println(r.getBelegnummer() + " | Kunde: " + + r.getKundenReferenz() + " | Status: " + r.getStatus() + + " | Festgeschrieben: " + r.isFestgeschrieben())); + } + + private static void rechnungFestschreiben() { + System.out.println("\n--- RECHNUNG FESTSCHREIBEN ---"); + System.out.print("Rechnungsnummer: "); + belegService.finalisiereRechnung(scanner.nextLine()); + } } \ No newline at end of file