From 0968eea111f9e7a7595d82a8884e5e3838035057 Mon Sep 17 00:00:00 2001 From: Christian Khazanovych <3028363@stud.th-mannheim.de> Date: Wed, 24 Jun 2026 17:48:42 +0200 Subject: [PATCH] =?UTF-8?q?Gruppe=20I:=20Benutzeroberfl=C3=A4che=20hinzuge?= =?UTF-8?q?fuegt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- out/ui/DokumentePanel$1.class | Bin 0 -> 700 bytes out/ui/DokumentePanel.class | Bin 0 -> 10394 bytes out/ui/KundenPanel$1.class | Bin 0 -> 685 bytes out/ui/KundenPanel.class | Bin 0 -> 7934 bytes out/ui/MainWindow$1.class | Bin 0 -> 927 bytes out/ui/MainWindow.class | Bin 0 -> 4577 bytes out/ui/ProduktPanel$1.class | Bin 0 -> 690 bytes out/ui/ProduktPanel.class | Bin 0 -> 8899 bytes src/main/java/ui/DokumentePanel.java | 227 +++++++++++++++++++++++++++ src/main/java/ui/KundenPanel.java | 175 +++++++++++++++++++++ src/main/java/ui/MainWindow.java | 99 ++++++++++++ src/main/java/ui/ProduktPanel.java | 186 ++++++++++++++++++++++ 12 files changed, 687 insertions(+) create mode 100644 out/ui/DokumentePanel$1.class create mode 100644 out/ui/DokumentePanel.class create mode 100644 out/ui/KundenPanel$1.class create mode 100644 out/ui/KundenPanel.class create mode 100644 out/ui/MainWindow$1.class create mode 100644 out/ui/MainWindow.class create mode 100644 out/ui/ProduktPanel$1.class create mode 100644 out/ui/ProduktPanel.class create mode 100644 src/main/java/ui/DokumentePanel.java create mode 100644 src/main/java/ui/KundenPanel.java create mode 100644 src/main/java/ui/MainWindow.java create mode 100644 src/main/java/ui/ProduktPanel.java diff --git a/out/ui/DokumentePanel$1.class b/out/ui/DokumentePanel$1.class new file mode 100644 index 0000000000000000000000000000000000000000..8f2c3652203d4665a8d0bec10a1e4a74b71992ff GIT binary patch literal 700 zcmZ`%O>fgc5Ph4ZacbPuA$+%`Ev=9f5C#cOL0r-xg3?f_2t+w;l7Vj7tc7$Da_%cx;FKp5c^B7tV1(!K0eF(u>ZKpN7! zw*;#0SlQj1oE|LXJ0a>=4G>3Y;IzPwSACb-w~BS09BE4T=!Gn_d+cBKvk7r`)w{|l zcTeDa@_ezWe(Q-qJNbv$|Hzdt*A-YDC_}?yI--20CJ^tFJI*EtGM7_wl>1RB+a;}g z6E$m3U@7VMTSo%nVOHd0y00{sYW_Wj8~$1>&@*G5S-#u6Zh#Hm$HGt|Y+{SqtmjyY zxET)uYsq{EzX$a2aGYma`$=~MYD2Q_L1vvm)HjCmu9nu4#TIX=&i{glW4|Z%O8hj? zWIV%O3uRP%q3SmC12FlUXif^}TR_AIiFD~uuYYm9t;0wx}#`v3p{ literal 0 HcmV?d00001 diff --git a/out/ui/DokumentePanel.class b/out/ui/DokumentePanel.class new file mode 100644 index 0000000000000000000000000000000000000000..8167bf0919ed1dc8756ae55efc2b514c9d6903b5 GIT binary patch literal 10394 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 literal 0 HcmV?d00001 diff --git a/out/ui/KundenPanel.class b/out/ui/KundenPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..ecb08aae7dab0c0cb10f1e65300e8095cd983544 GIT binary patch literal 7934 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 literal 0 HcmV?d00001 diff --git a/out/ui/MainWindow$1.class b/out/ui/MainWindow$1.class new file mode 100644 index 0000000000000000000000000000000000000000..2f3a884bf02ba8e330ef85d913cc4b006e2f3934 GIT binary patch literal 927 zcmZuv?M@Rx6g>l#g=J~CmJbyzejscMvLXJgF%eQ@v0Y3sCH$PW6I|TR=1;{u4kQ{uIVAZXxI38YUPDY3R3jDEC9z zQ^(7j4Ay{0%N;El=9))*z)$?-IFyI}&Q_|mk~JHXn6h9yn1;hpG#o$GVdU?2jzm`{ z4Eb2RPs3OQN(N~ZF|2q)DL>*Ql+kLH{~;TB6fC$7inz|OIF#nc+7|;Mwck={BA)g5 zJ1t^{i6@~9^;3p%uhO*4#UAeIm}D}~Sy#`HtgHXd48vp~ z68%CYnmjh76!CV%lSCxAOY@kg(PXY`CX!C$^cGPje2GpKGp`1zu73erJNO1`f4_Q) znNI{Vx(>R;Xl>vgty5#b2NxhUhWmIxt5JDOB>IDe>SwSYC>^*vMSLvc_bKMS;>Nj_ zJ*2(FJeqWMc_grTCNMV=D7&jJzxsNBS?nT*hZJ!PD_EsH2M<*|8X_JxXtybV$%&r7 DAuri; literal 0 HcmV?d00001 diff --git a/out/ui/MainWindow.class b/out/ui/MainWindow.class new file mode 100644 index 0000000000000000000000000000000000000000..cd3a0f766ca2dd10f76524e3e8d9ae604d255c27 GIT binary patch literal 4577 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 literal 0 HcmV?d00001 diff --git a/out/ui/ProduktPanel.class b/out/ui/ProduktPanel.class new file mode 100644 index 0000000000000000000000000000000000000000..d35eed696c2f093041a2dd6a90f3baef685b3dd2 GIT binary patch literal 8899 zcmd5>d3+r8b$`!VX~wIuwOZN63)o(KU`eZ$YzG`{nM0B#TSAhB*9XfHGFpwKwO6~# z?yN74Kmrc;5e&8o<}d^YCmaU65*P?afIw(d+J-hQX&c(6XWFEtNz*2{-#0U>os~pC z`J>GzK6ZZdJKynr$M4O%pS<`A5w-JsUYbT_3VAdtrwS(jHhqV_t0}uPo*ZiG>eG`( zf~jInJQ+97V=Aky+oF)lw4~q2ntE~|JEAA`A!EcynoWI~)Ie^#88I?D;xVIhB%Sb* zLS@sbk~D>8Xf%_mn5uH|!c1p(C2Ox>TH5^^ZQHC+HB*gH+7wSUb#7?i6*JOiJeBm4 zk7_iUC7e{HGx4MuG40^nO>Srb436Frt;d( z&blpL5Ph0Pr_(&9=~=_H=P{jD+daO6-PdCYAk!>s7En;3Gc;OAiu z+09fP%NV+8w2!3C-S!aE88{e6Tl*Ij&~Fjx(Aq3SEz#&qT51zjSUKM&YU)LzusWuh z<7Bs`5~+-rYAGZfH$b~`u+4I#MoqMgX$Dwsh2VxVsa$dZvUag;t+&{%q!k){hR$Nr zj7-)v5((qNRCU zp#zK?`nMS|(>ZvJM&}X$SyecAlin}qi-sng9f@U9iG*Mc1Y7`i+pw_#2~<+6Mr}gA zudqu;Dl?Kx=ouB3L7sL!YeAz-Y-GJiYo4?k6}oVup>)gfD)pehb&_Rxsf#wq@;(62 zVbfwMVgjN=U`e5k5c;@^I#NkfrAM8evkix!CX^MwsT7puM;Tno2=a5ll2- z)RlClMj6Ti#sy8a=1en{WLhRtbV72rVdug*D{x7G|4%!JA!7$-I`i#sV5MY3^ z6}8Sleqr9d#<*2|)Dh zi~zlNgD%GuRJuo$Y3gP!tI)l0e-lKzc)6GM(SAYH0jAo?qQ7*q9{}nERQGH2ReAux zFl`5r>`4v45g^5-qiL-%sOJ(Ud_}^r<{^?iIMI}?Q7;{$hlQR;#4%5?m1_^1 zkViFojJ^h@ag^_8c5_jG_uX%QW9@nUiPA#K!4}2*)+b(k$PcdT1l$SMnMWzUs>oV~HC+<|z zs~Wu~0a{Cd6$fC5&TqiAx#{dGI&Lq$PH&1f-YU93o2YSM!v%fE3GW4)YfbGcxU0A6 zU0MEJc$^ZuNSb!zGImMjf9}IB{aQUO<1S z(I3$tGtII$vy2WAwXor(rO+x}Ujm=fp;FyDW2Kuz{nKcPLVx1m+wxm$BLSzBFyNCE z`YZQw<32_r;71z$HT{j9TeKwNLrF;*FO~q(A<4&&>F*T!dyW2q{t^Dz4Fu>B-qaT0 z76S*y^aLVj4$3vf{BpK*}OSq1AQiu{X4|4Kh~r7Im)6uO{P3r@CT@9Xl2 z6O>&Nt^SSaRLcj39f!E5v9&R{d{yJBRdvC7l|BZo;upga-P{wbwMLgUF1H7Nj&#m( zl`{7~F&D3~VYt?QIND%s%1Una1RU&tVQwTXKG?`0GVZ326#6whYSDdnBD)zfGG$*l zdGaJCfLmtK@Jwj9N8c46$&HA9{WOis5dPT1bab-EEdig4)&K8)mpZ2mg_2Dm9~(k! zLhB=uzy|qglpnaJ-K=RmgJ%Lm;I|_c%Vqmud zg=aYkv}~p=m&qbw<{F-(@hLnPScEf%ng@(Q_=W*{9420hMQas|a5tZ-@o9Xzow64v zyI^Zi1!+8=7bqOm_zVdTi`+(Fd+kX93?UgjAc(XfQAgIM@FI;D^Ac!XN3u}xu962j zlFga%M3dw!&6T{AYZb23xSm76hXtYWVdQCXq{%uiEX9Pr$r|o-`msZp8x?NSco{D* z7=FnVgtTEj+lyS#x;$PYD?X#~S$sCsk+iyJ6)1CO`3ip)7S%r~l`dQz6Aj;=YoGrN!E?D6S^-w#Ywzn{`neTAoC@{x*Ueet&qTy#ubCX_RSk*;#!T{ zxx?1JW$Nv5WMYZ5BtQ~Z9Qlsu=5SMMd}yr^i;w6DAYd=A*SM3rkON6}sY4V~Wvx@> zIL?-CAEa_O_F2-nY;egEp{iHo4MNpykl$krXLiCtA|K5mPll&a_#&`wiD?2|Do3D^ z<;#|Nxepe^eY{2Etqgyx;s#{K(+PNvMkn4)SX;=1Cw2=xmuP$`Uk2;6#A($CEX{X% z=~w(Yjjv!_F_ay8B4=y>#^;P1jm4znyP9REevM;-DlMLc*B{IoL;bjzF#?l!OZ&!- z&F$-2TQ;f;PvGnAY+Ju6SnL%;ifg=$w?kG)xM3f1)Kn6NKN#W>jgx`_1w_leMeHc8 z@s$kd&yw4U(W}RXUFcw1?1;v#n@JWXx;Hh>2^&g0+ltBCRR%3}t#Q*df`f0o1S3rb zBXOkllH2zUCg9mkxf~gppq|S%sx0LKSATHO7*3c9Uxg^)b`V_~tRNxxTrcn8Yc#%= zac8K`4yShZ7}+eUG;8B}A_aM^acD11p zl7PkcX}n*`0CGVWq^W$6=}gB>2Y2RBlM2cuG%*CX5*rQ<8CfUTn}EVs0q1sWRN+HR z3yS`)H#gF6WTbqdo8#3ml^=q#ZKw?aY9_9Y!AtaEfgGTh30k>ILr@ZvAhOb6Aqg>1 zl`#5^B#y-W$G%E|pMWo&!X!~SOQ7m8pf4`m^@S~|$}GlhV!y4rLdN}D%uH;ZPrUuNOC>-mIQ%36 zmZgv>rvRrDxRO%YVmO8cE^BnBJcXSvQM0jsFmD1;z4=tThS zF$5Y2QNGqx3b7%hr+W-@I5m*<@zYi1JSxf@)A$+d?L~Pzq487J+spFyipEFz8&wtj zs+V8m*A;$4<8SkuxPun)7fK_z2~+(XOT_KdQ_7WMs{&` zDz!bAb~}m^1GW5Z$-+&$(%PYz+Odj=oFfZ@^ygDrcOCTX`9suc@ zoUUaCQRAtbs8f0s}gGCh};QZGt4n;~<9Lb%5?&|ZujqDB;(n&@R(M&F_3^Z~7) zzl2PG45|JEdia=DLdK}2J2DP9nEAf1;$_+!E%VBDOJl_mBUirw!+71i`ptNSH@^jjzBb)o9; zD1Eyq!WE=JgsW*WHA5ihQ45`q62%1oV+&=em2Sa@f&H`=#kY2PlRD@fS_d)VV}T>4 zTL8uB(8o+c4XjHr_;xhp8Krmf^j^rKwbQ|6k(E9;-BW} z2NoiJSc2P`pMu+l$~^rj)L>!6S2ad|E3NvF|DW>olU_W3hUaPz8vibhay0%!8Wm{# zLK;e_xXS;_NkCNtDh~MXfGPy~Kk+TH2s{~3>%#$0pgd3!P+nxX7vMY;P%SEo^4$gl zC%TYS>W1m}z|?yI#tn21^+Dpjkn%>fHsNcM_15Gq|;jzL#=9neguI33>V~bx{fuv9(qAh$JPry4EUDgf&F2hHpa8_90(WbSO{4Y-2*!IAxPW{sow`3>_S=g^@s02xU5&;HrdN4oudIN3 z;B%s7;XJQ~gTUiFxQH5V@f5n-B4fM`9;1dY9PjHn!F|yh-Z;ve^1RuepkQruj4y{v zK}$bK(`$I(2w~k|B+tV~PF{ZuRNCQWCCxzlL2&vILdC-fCXc{+55s;R1&$u0ID+E! z^f)Ac1YZRXW9Ac>anuSe-Bj-THO*9bslwrtw39ptGWMIoEAhtj75+N@@kz+3bg;ZQ zsLqhoM-&%ywoqclAa zI3K6GVdaO>|1}yzGB)el3KDhk zcz>{lA1)I*figlo`5r%jF#MkNv{Bwc)fgFu1;?ol-tjD?c4t!x-ZTv_cqJv_L2f{X zae#94B)(t13^2b&yRgT#_;Rs_-iJ5+5Z?Ci4r~=8q=q3j7am^PfHd literal 0 HcmV?d00001 diff --git a/src/main/java/ui/DokumentePanel.java b/src/main/java/ui/DokumentePanel.java new file mode 100644 index 0000000..680b375 --- /dev/null +++ b/src/main/java/ui/DokumentePanel.java @@ -0,0 +1,227 @@ +package ui; + +import belegworkflow.*; + +import javax.swing.*; +import javax.swing.table.*; +import java.awt.*; +import java.io.IOException; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +public class DokumentePanel extends JPanel { + + private BelegworkflowService service; + private JTable tabelle; + private DefaultTableModel tabellenModell; + + public DokumentePanel() { + try { service = new BelegworkflowService(); } + catch (IOException e) { e.printStackTrace(); } + + setLayout(new BorderLayout(10, 10)); + setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); + setBackground(new Color(244, 247, 255)); + + add(erstelleKopf(), BorderLayout.NORTH); + add(erstelleTabelle(), BorderLayout.CENTER); + add(erstelleAktionen(), BorderLayout.SOUTH); + } + + private JPanel erstelleKopf() { + JPanel kopf = new JPanel(new BorderLayout()); + kopf.setBackground(new Color(244, 247, 255)); + + JLabel titel = new JLabel("Dokumentenübersicht"); + titel.setFont(new Font("Cambria", Font.BOLD, 20)); + titel.setForeground(new Color(30, 39, 97)); + kopf.add(titel, BorderLayout.WEST); + + JButton refresh = erstelleButton("Aktualisieren", new Color(74, 144, 217)); + refresh.addActionListener(e -> ladeDokumente()); + JPanel rechts = new JPanel(new FlowLayout(FlowLayout.RIGHT)); + rechts.setBackground(new Color(244, 247, 255)); + rechts.add(refresh); + kopf.add(rechts, BorderLayout.EAST); + return kopf; + } + + private JScrollPane erstelleTabelle() { + String[] spalten = {"Belegnummer", "Typ", "Kunde", "Datum", "Status", "Brutto"}; + tabellenModell = new DefaultTableModel(spalten, 0) { + public boolean isCellEditable(int r, int c) { return false; } + }; + tabelle = new JTable(tabellenModell); + tabelle.setRowHeight(28); + tabelle.setFont(new Font("Calibri", Font.PLAIN, 13)); + tabelle.getTableHeader().setFont(new Font("Calibri", Font.BOLD, 13)); + tabelle.getTableHeader().setBackground(new Color(30, 39, 97)); + tabelle.getTableHeader().setForeground(Color.WHITE); + tabelle.setSelectionBackground(new Color(202, 220, 252)); + tabelle.setGridColor(new Color(209, 217, 240)); + ladeDokumente(); + return new JScrollPane(tabelle); + } + + private JPanel erstelleAktionen() { + JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 10)); + panel.setBackground(Color.WHITE); + panel.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createLineBorder(new Color(202, 220, 252)), + BorderFactory.createEmptyBorder(10, 10, 10, 10) + )); + + JLabel aktLabel = new JLabel("Aktionen: "); + aktLabel.setFont(new Font("Calibri", Font.BOLD, 13)); + panel.add(aktLabel); + + JButton angebotBtn = erstelleButton("Neues Angebot", new Color(30, 39, 97)); + angebotBtn.addActionListener(e -> neuesAngebotDialog()); + panel.add(angebotBtn); + + JButton rechnungBtn = erstelleButton("Rechnung aus Angebot", new Color(74, 144, 217)); + rechnungBtn.addActionListener(e -> rechnungAusAngebotDialog()); + panel.add(rechnungBtn); + + JButton festschreibenBtn = erstelleButton("Rechnung festschreiben", new Color(100, 100, 100)); + festschreibenBtn.addActionListener(e -> rechnungFestschreibenDialog()); + panel.add(festschreibenBtn); + + return panel; + } + + private void neuesAngebotDialog() { + JDialog dialog = new JDialog((Frame) SwingUtilities.getWindowAncestor(this), + "Neues Angebot erstellen", true); + dialog.setSize(400, 300); + dialog.setLocationRelativeTo(this); + dialog.setLayout(new BorderLayout(10, 10)); + + JPanel form = new JPanel(new GridLayout(0, 2, 5, 5)); + form.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); + + form.add(new JLabel("Kunden-ID:")); + JTextField kundenIdField = new JTextField(); + form.add(kundenIdField); + + form.add(new JLabel("Produkt-ID:")); + JTextField produktIdField = new JTextField(); + form.add(produktIdField); + + form.add(new JLabel("Menge:")); + JTextField mengeField = new JTextField("1"); + form.add(mengeField); + + form.add(new JLabel("Gueltig bis (YYYY-MM-DD):")); + JTextField gueltigBisField = new JTextField( + LocalDate.now().plusDays(30).toString()); + form.add(gueltigBisField); + + dialog.add(form, BorderLayout.CENTER); + + JButton erstellenBtn = erstelleButton("Angebot erstellen", new Color(30, 39, 97)); + erstellenBtn.addActionListener(e -> { + try { + bestandsmanagement.ProduktServiceImpl ps = + new bestandsmanagement.ProduktServiceImpl(); + bestandsmanagement.Produkt produkt = + ps.findeProdukt(produktIdField.getText()); + if (produkt == null) { + JOptionPane.showMessageDialog(dialog, "Produkt nicht gefunden."); + return; + } + int menge = Integer.parseInt(mengeField.getText().trim()); + List positionen = new ArrayList<>(); + positionen.add(new Dokumentposition( + produkt.getProduktId(), produkt.getBezeichnung(), + menge, produkt.getNettoEinzelpreis(), produkt.getMehrwertsteuersatz() + )); + Angebot a = service.erstelleAngebot(kundenIdField.getText(), + positionen, LocalDate.parse(gueltigBisField.getText())); + if (a != null) { + JOptionPane.showMessageDialog(dialog, + "Angebot wurde erfolgreich erstellt: " + a.getBelegnummer(), + "Erfolg", JOptionPane.INFORMATION_MESSAGE); + ladeDokumente(); + dialog.dispose(); + } + } catch (Exception ex) { + JOptionPane.showMessageDialog(dialog, + "Fehler: " + ex.getMessage(), "Fehler", JOptionPane.ERROR_MESSAGE); + } + }); + + JPanel btnPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); + btnPanel.add(erstellenBtn); + btnPanel.add(erstelleButton("Abbrechen", Color.GRAY)); + dialog.add(btnPanel, BorderLayout.SOUTH); + dialog.setVisible(true); + } + + private void rechnungAusAngebotDialog() { + String angebotsNr = JOptionPane.showInputDialog(this, + "Angebotsnummer eingeben:", "Rechnung aus Angebot", + JOptionPane.QUESTION_MESSAGE); + if (angebotsNr == null || angebotsNr.isBlank()) return; + + Rechnung r = service.erstelleRechnungAusAngebot( + angebotsNr, LocalDate.now(), LocalDate.now(), + LocalDate.now().plusDays(14)); + + if (r != null) { + JOptionPane.showMessageDialog(this, + "Rechnung wurde erfolgreich erzeugt: " + r.getBelegnummer(), + "Erfolg", JOptionPane.INFORMATION_MESSAGE); + ladeDokumente(); + } else { + JOptionPane.showMessageDialog(this, + "Rechnung konnte nicht erstellt werden.", + "Fehler", JOptionPane.ERROR_MESSAGE); + } + } + + private void rechnungFestschreibenDialog() { + String rechnungsNr = JOptionPane.showInputDialog(this, + "Rechnungsnummer eingeben:", "Rechnung festschreiben", + JOptionPane.QUESTION_MESSAGE); + if (rechnungsNr == null || rechnungsNr.isBlank()) return; + service.finalisiereRechnung(rechnungsNr); + ladeDokumente(); + JOptionPane.showMessageDialog(this, + "Rechnung wurde festgeschrieben.", + "Erfolg", JOptionPane.INFORMATION_MESSAGE); + } + + private JButton erstelleButton(String text, Color farbe) { + JButton btn = new JButton(text); + btn.setBackground(farbe); + btn.setForeground(Color.WHITE); + btn.setFocusPainted(false); + btn.setBorderPainted(false); + btn.setFont(new Font("Calibri", Font.BOLD, 12)); + btn.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + return btn; + } + + private void ladeDokumente() { + tabellenModell.setRowCount(0); + if (service == null) return; + + for (Angebot a : service.alleAngebote()) { + tabellenModell.addRow(new Object[]{ + a.getBelegnummer(), "Angebot", + a.getKundenReferenz(), a.getDatum(), + a.getStatus(), String.format("%.2f EUR", a.getSummeBrutto()) + }); + } + for (Rechnung r : service.alleRechnungen()) { + tabellenModell.addRow(new Object[]{ + r.getBelegnummer(), "Rechnung", + r.getKundenReferenz(), r.getDatum(), + r.isFestgeschrieben() ? "FESTGESCHRIEBEN" : r.getStatus(), + String.format("%.2f EUR", r.getSummeBrutto()) + }); + } + } +} \ No newline at end of file diff --git a/src/main/java/ui/KundenPanel.java b/src/main/java/ui/KundenPanel.java new file mode 100644 index 0000000..478c9aa --- /dev/null +++ b/src/main/java/ui/KundenPanel.java @@ -0,0 +1,175 @@ +package ui; + +import kundenverwaltung.Kunde; +import kundenverwaltung.KundenServiceImpl; + +import javax.swing.*; +import javax.swing.table.*; +import java.awt.*; +import java.io.IOException; +import java.util.List; + +public class KundenPanel extends JPanel { + + private KundenServiceImpl service; + private JTable tabelle; + private DefaultTableModel tabellenModell; + private JTextField suchfeld; + + public KundenPanel() { + try { service = new KundenServiceImpl(); } + catch (IOException e) { e.printStackTrace(); } + + setLayout(new BorderLayout(10, 10)); + setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); + setBackground(new Color(244, 247, 255)); + + add(erstelleKopf(), BorderLayout.NORTH); + add(erstelleTabelle(), BorderLayout.CENTER); + add(erstelleFormular(), BorderLayout.EAST); + } + + private JPanel erstelleKopf() { + JPanel kopf = new JPanel(new BorderLayout()); + kopf.setBackground(new Color(244, 247, 255)); + + JLabel titel = new JLabel("Kundenverwaltung"); + titel.setFont(new Font("Cambria", Font.BOLD, 20)); + titel.setForeground(new Color(30, 39, 97)); + kopf.add(titel, BorderLayout.WEST); + + JPanel suchPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); + suchPanel.setBackground(new Color(244, 247, 255)); + suchfeld = new JTextField(15); + JButton suchenBtn = erstelleButton("Suchen", new Color(74, 144, 217)); + suchenBtn.addActionListener(e -> sucheKunden()); + JButton alleBtn = erstelleButton("Alle anzeigen", new Color(30, 39, 97)); + alleBtn.addActionListener(e -> ladeKunden()); + suchPanel.add(new JLabel("Suche: ")); + suchPanel.add(suchfeld); + suchPanel.add(suchenBtn); + suchPanel.add(alleBtn); + kopf.add(suchPanel, BorderLayout.EAST); + return kopf; + } + + private JScrollPane erstelleTabelle() { + String[] spalten = {"Kunden-ID", "Name", "PLZ", "Ort", "E-Mail", "Telefon"}; + tabellenModell = new DefaultTableModel(spalten, 0) { + public boolean isCellEditable(int r, int c) { return false; } + }; + tabelle = new JTable(tabellenModell); + tabelle.setRowHeight(28); + tabelle.setFont(new Font("Calibri", Font.PLAIN, 13)); + tabelle.getTableHeader().setFont(new Font("Calibri", Font.BOLD, 13)); + tabelle.getTableHeader().setBackground(new Color(30, 39, 97)); + tabelle.getTableHeader().setForeground(Color.WHITE); + tabelle.setSelectionBackground(new Color(202, 220, 252)); + tabelle.setGridColor(new Color(209, 217, 240)); + ladeKunden(); + return new JScrollPane(tabelle); + } + + private JPanel erstelleFormular() { + JPanel form = new JPanel(); + form.setLayout(new BoxLayout(form, BoxLayout.Y_AXIS)); + form.setBackground(Color.WHITE); + form.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createLineBorder(new Color(202, 220, 252)), + BorderFactory.createEmptyBorder(15, 15, 15, 15) + )); + form.setPreferredSize(new Dimension(280, 0)); + + JLabel formTitel = new JLabel("Neuen Kunden anlegen"); + formTitel.setFont(new Font("Cambria", Font.BOLD, 14)); + formTitel.setForeground(new Color(30, 39, 97)); + formTitel.setAlignmentX(Component.LEFT_ALIGNMENT); + form.add(formTitel); + form.add(Box.createVerticalStrut(15)); + + JTextField nameField = erstelleFeld(form, "Name / Firmenname *"); + JTextField strasseField = erstelleFeld(form, "Strasse *"); + JTextField plzField = erstelleFeld(form, "PLZ *"); + JTextField ortField = erstelleFeld(form, "Ort *"); + JTextField steuerField = erstelleFeld(form, "Steuernummer *"); + JTextField emailField = erstelleFeld(form, "E-Mail *"); + JTextField telefonField = erstelleFeld(form, "Telefon *"); + + form.add(Box.createVerticalStrut(15)); + + JButton speichernBtn = erstelleButton("Speichern", new Color(30, 39, 97)); + speichernBtn.setAlignmentX(Component.LEFT_ALIGNMENT); + speichernBtn.setMaximumSize(new Dimension(Integer.MAX_VALUE, 35)); + speichernBtn.addActionListener(e -> { + if (nameField.getText().isBlank() || strasseField.getText().isBlank() || + plzField.getText().isBlank() || ortField.getText().isBlank() || + steuerField.getText().isBlank() || emailField.getText().isBlank() || + telefonField.getText().isBlank()) { + JOptionPane.showMessageDialog(this, + "Bitte füllen Sie alle Pflichtfelder aus.", + "Pflichtfeld fehlt", JOptionPane.WARNING_MESSAGE); + return; + } + service.kundeAnlegen(nameField.getText(), strasseField.getText(), + plzField.getText(), ortField.getText(), steuerField.getText(), + emailField.getText(), telefonField.getText()); + nameField.setText(""); strasseField.setText(""); plzField.setText(""); + ortField.setText(""); steuerField.setText(""); emailField.setText(""); + telefonField.setText(""); + ladeKunden(); + JOptionPane.showMessageDialog(this, "Kunde wurde erfolgreich gespeichert.", + "Erfolg", JOptionPane.INFORMATION_MESSAGE); + }); + form.add(speichernBtn); + return form; + } + + private JTextField erstelleFeld(JPanel panel, String label) { + JLabel lbl = new JLabel(label); + lbl.setFont(new Font("Calibri", Font.PLAIN, 12)); + lbl.setAlignmentX(Component.LEFT_ALIGNMENT); + panel.add(lbl); + panel.add(Box.createVerticalStrut(3)); + JTextField feld = new JTextField(); + feld.setMaximumSize(new Dimension(Integer.MAX_VALUE, 30)); + feld.setAlignmentX(Component.LEFT_ALIGNMENT); + panel.add(feld); + panel.add(Box.createVerticalStrut(8)); + return feld; + } + + private JButton erstelleButton(String text, Color farbe) { + JButton btn = new JButton(text); + btn.setBackground(farbe); + btn.setForeground(Color.WHITE); + btn.setFocusPainted(false); + btn.setBorderPainted(false); + btn.setFont(new Font("Calibri", Font.BOLD, 12)); + btn.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + return btn; + } + + private void ladeKunden() { + tabellenModell.setRowCount(0); + if (service == null) return; + List kunden = service.alleKunden(); + for (Kunde k : kunden) { + tabellenModell.addRow(new Object[]{ + k.getKundenId(), k.getName(), k.getPlz(), + k.getOrt(), k.getEmail(), k.getTelefon() + }); + } + } + + private void sucheKunden() { + tabellenModell.setRowCount(0); + if (service == null) return; + List kunden = service.sucheNachName(suchfeld.getText()); + for (Kunde k : kunden) { + tabellenModell.addRow(new Object[]{ + k.getKundenId(), k.getName(), k.getPlz(), + k.getOrt(), k.getEmail(), k.getTelefon() + }); + } + } +} \ No newline at end of file diff --git a/src/main/java/ui/MainWindow.java b/src/main/java/ui/MainWindow.java new file mode 100644 index 0000000..7f4a00a --- /dev/null +++ b/src/main/java/ui/MainWindow.java @@ -0,0 +1,99 @@ +package ui; + +import javax.swing.*; +import java.awt.*; + +public class MainWindow extends JFrame { + + private JPanel contentPanel; + private KundenPanel kundenPanel; + private ProduktPanel produktPanel; + private DokumentePanel dokumentePanel; + + public MainWindow() { + setTitle("Fakturierungsanwendung – Team 3"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setSize(1000, 650); + setLocationRelativeTo(null); + setLayout(new BorderLayout()); + + // Navigation oben + add(erstelleNavigation(), BorderLayout.NORTH); + + // Content Bereich + contentPanel = new JPanel(new CardLayout()); + kundenPanel = new KundenPanel(); + produktPanel = new ProduktPanel(); + dokumentePanel = new DokumentePanel(); + + contentPanel.add(kundenPanel, "KUNDEN"); + contentPanel.add(produktPanel, "PRODUKTE"); + contentPanel.add(dokumentePanel, "DOKUMENTE"); + + add(contentPanel, BorderLayout.CENTER); + + // Statusleiste unten + JLabel status = new JLabel(" Fakturierungsanwendung | Team 3 | Gruppe J, K, L, I"); + status.setBorder(BorderFactory.createEtchedBorder()); + status.setFont(new Font("Calibri", Font.PLAIN, 11)); + status.setForeground(Color.GRAY); + add(status, BorderLayout.SOUTH); + + zeigePanel("KUNDEN"); + } + + private JPanel erstelleNavigation() { + JPanel nav = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); + nav.setBackground(new Color(30, 39, 97)); + nav.setBorder(BorderFactory.createEmptyBorder(8, 10, 8, 10)); + + JLabel logo = new JLabel(" Fakturierung "); + logo.setFont(new Font("Cambria", Font.BOLD, 16)); + logo.setForeground(Color.WHITE); + nav.add(logo); + + nav.add(Box.createHorizontalStrut(20)); + nav.add(erstelleNavButton("Kunden", "KUNDEN")); + nav.add(erstelleNavButton("Produkte", "PRODUKTE")); + nav.add(erstelleNavButton("Dokumente", "DOKUMENTE")); + + return nav; + } + + private JButton erstelleNavButton(String text, String panel) { + JButton btn = new JButton(text); + btn.setFont(new Font("Calibri", Font.PLAIN, 13)); + btn.setForeground(Color.WHITE); + btn.setBackground(new Color(30, 39, 97)); + btn.setBorderPainted(false); + btn.setFocusPainted(false); + btn.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + btn.setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15)); + + btn.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseEntered(java.awt.event.MouseEvent e) { + btn.setBackground(new Color(74, 144, 217)); + } + public void mouseExited(java.awt.event.MouseEvent e) { + btn.setBackground(new Color(30, 39, 97)); + } + }); + + btn.addActionListener(e -> zeigePanel(panel)); + return btn; + } + + private void zeigePanel(String name) { + CardLayout cl = (CardLayout) contentPanel.getLayout(); + cl.show(contentPanel, name); + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(() -> { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception ignored) {} + new MainWindow().setVisible(true); + }); + } +} \ No newline at end of file diff --git a/src/main/java/ui/ProduktPanel.java b/src/main/java/ui/ProduktPanel.java new file mode 100644 index 0000000..107484c --- /dev/null +++ b/src/main/java/ui/ProduktPanel.java @@ -0,0 +1,186 @@ +package ui; + +import bestandsmanagement.Produkt; +import bestandsmanagement.ProduktServiceImpl; + +import javax.swing.*; +import javax.swing.table.*; +import java.awt.*; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.List; + +public class ProduktPanel extends JPanel { + + private ProduktServiceImpl service; + private JTable tabelle; + private DefaultTableModel tabellenModell; + private JTextField suchfeld; + + public ProduktPanel() { + try { service = new ProduktServiceImpl(); } + catch (IOException e) { e.printStackTrace(); } + + setLayout(new BorderLayout(10, 10)); + setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); + setBackground(new Color(244, 247, 255)); + + add(erstelleKopf(), BorderLayout.NORTH); + add(erstelleTabelle(), BorderLayout.CENTER); + add(erstelleFormular(), BorderLayout.EAST); + } + + private JPanel erstelleKopf() { + JPanel kopf = new JPanel(new BorderLayout()); + kopf.setBackground(new Color(244, 247, 255)); + + JLabel titel = new JLabel("Bestandsmanagement"); + titel.setFont(new Font("Cambria", Font.BOLD, 20)); + titel.setForeground(new Color(30, 39, 97)); + kopf.add(titel, BorderLayout.WEST); + + JPanel suchPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); + suchPanel.setBackground(new Color(244, 247, 255)); + suchfeld = new JTextField(15); + JButton suchenBtn = erstelleButton("Suchen", new Color(74, 144, 217)); + suchenBtn.addActionListener(e -> sucheProdukte()); + JButton alleBtn = erstelleButton("Alle anzeigen", new Color(30, 39, 97)); + alleBtn.addActionListener(e -> ladeProdukte()); + suchPanel.add(new JLabel("Suche: ")); + suchPanel.add(suchfeld); + suchPanel.add(suchenBtn); + suchPanel.add(alleBtn); + kopf.add(suchPanel, BorderLayout.EAST); + return kopf; + } + + private JScrollPane erstelleTabelle() { + String[] spalten = {"Produkt-ID", "Bezeichnung", "Preis (Netto)", "MwSt", "Bestand", "Status"}; + tabellenModell = new DefaultTableModel(spalten, 0) { + public boolean isCellEditable(int r, int c) { return false; } + }; + tabelle = new JTable(tabellenModell); + tabelle.setRowHeight(28); + tabelle.setFont(new Font("Calibri", Font.PLAIN, 13)); + tabelle.getTableHeader().setFont(new Font("Calibri", Font.BOLD, 13)); + tabelle.getTableHeader().setBackground(new Color(30, 39, 97)); + tabelle.getTableHeader().setForeground(Color.WHITE); + tabelle.setSelectionBackground(new Color(202, 220, 252)); + tabelle.setGridColor(new Color(209, 217, 240)); + ladeProdukte(); + return new JScrollPane(tabelle); + } + + private JPanel erstelleFormular() { + JPanel form = new JPanel(); + form.setLayout(new BoxLayout(form, BoxLayout.Y_AXIS)); + form.setBackground(Color.WHITE); + form.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createLineBorder(new Color(202, 220, 252)), + BorderFactory.createEmptyBorder(15, 15, 15, 15) + )); + form.setPreferredSize(new Dimension(280, 0)); + + JLabel formTitel = new JLabel("Neuen Artikel anlegen"); + formTitel.setFont(new Font("Cambria", Font.BOLD, 14)); + formTitel.setForeground(new Color(30, 39, 97)); + formTitel.setAlignmentX(Component.LEFT_ALIGNMENT); + form.add(formTitel); + form.add(Box.createVerticalStrut(15)); + + JTextField bezeichnungField = erstelleFeld(form, "Bezeichnung *"); + JTextField preisField = erstelleFeld(form, "Netto-Preis (z.B. 19.99) *"); + JTextField mwstField = erstelleFeld(form, "MwSt-Satz (z.B. 0.19) *"); + JTextField bestandField = erstelleFeld(form, "Bestand *"); + JTextField beschField = erstelleFeld(form, "Beschreibung (optional)"); + + form.add(Box.createVerticalStrut(15)); + + JButton speichernBtn = erstelleButton("Speichern", new Color(30, 39, 97)); + speichernBtn.setAlignmentX(Component.LEFT_ALIGNMENT); + speichernBtn.setMaximumSize(new Dimension(Integer.MAX_VALUE, 35)); + speichernBtn.addActionListener(e -> { + try { + if (bezeichnungField.getText().isBlank() || preisField.getText().isBlank() || + mwstField.getText().isBlank() || bestandField.getText().isBlank()) { + JOptionPane.showMessageDialog(this, + "Bitte füllen Sie alle Pflichtfelder aus.", + "Pflichtfeld fehlt", JOptionPane.WARNING_MESSAGE); + return; + } + BigDecimal preis = new BigDecimal(preisField.getText().replace(",", ".")); + BigDecimal mwst = new BigDecimal(mwstField.getText().replace(",", ".")); + int bestand = Integer.parseInt(bestandField.getText().trim()); + String beschreibung = beschField.getText().isBlank() ? null : beschField.getText(); + + service.produktAnlegen(bezeichnungField.getText(), preis, mwst, bestand, beschreibung); + bezeichnungField.setText(""); preisField.setText(""); mwstField.setText(""); + bestandField.setText(""); beschField.setText(""); + ladeProdukte(); + JOptionPane.showMessageDialog(this, "Produkt wurde erfolgreich gespeichert.", + "Erfolg", JOptionPane.INFORMATION_MESSAGE); + } catch (NumberFormatException ex) { + JOptionPane.showMessageDialog(this, + "Bitte gültige Zahlen für Preis, MwSt und Bestand eingeben.", + "Ungültige Eingabe", JOptionPane.ERROR_MESSAGE); + } + }); + form.add(speichernBtn); + return form; + } + + private JTextField erstelleFeld(JPanel panel, String label) { + JLabel lbl = new JLabel(label); + lbl.setFont(new Font("Calibri", Font.PLAIN, 12)); + lbl.setAlignmentX(Component.LEFT_ALIGNMENT); + panel.add(lbl); + panel.add(Box.createVerticalStrut(3)); + JTextField feld = new JTextField(); + feld.setMaximumSize(new Dimension(Integer.MAX_VALUE, 30)); + feld.setAlignmentX(Component.LEFT_ALIGNMENT); + panel.add(feld); + panel.add(Box.createVerticalStrut(8)); + return feld; + } + + private JButton erstelleButton(String text, Color farbe) { + JButton btn = new JButton(text); + btn.setBackground(farbe); + btn.setForeground(Color.WHITE); + btn.setFocusPainted(false); + btn.setBorderPainted(false); + btn.setFont(new Font("Calibri", Font.BOLD, 12)); + btn.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + return btn; + } + + private void ladeProdukte() { + tabellenModell.setRowCount(0); + if (service == null) return; + List produkte = service.alleProdukte(); + for (Produkt p : produkte) { + tabellenModell.addRow(new Object[]{ + p.getProduktId(), p.getBezeichnung(), + String.format("%.2f EUR", p.getNettoEinzelpreis()), + String.format("%.0f%%", p.getMehrwertsteuersatz().multiply(new BigDecimal("100"))), + p.getBestand(), + p.isVerfuegbar() ? "VERFUEGBAR" : "NICHT VERFUEGBAR" + }); + } + } + + private void sucheProdukte() { + tabellenModell.setRowCount(0); + if (service == null) return; + List produkte = service.sucheNachBezeichnung(suchfeld.getText()); + for (Produkt p : produkte) { + tabellenModell.addRow(new Object[]{ + p.getProduktId(), p.getBezeichnung(), + String.format("%.2f EUR", p.getNettoEinzelpreis()), + String.format("%.0f%%", p.getMehrwertsteuersatz().multiply(new BigDecimal("100"))), + p.getBestand(), + p.isVerfuegbar() ? "VERFUEGBAR" : "NICHT VERFUEGBAR" + }); + } + } +} \ No newline at end of file