*** empty log message ***
[thera-pi.git] / Reha / src / abrechnung / AbrechnungGKV.java
blob9dc68f70944be742386e31f61975bd1c7c67b54d
1 package abrechnung;
3 import hauptFenster.AktiveFenster;
4 import hauptFenster.Reha;
5 import hauptFenster.UIFSplitPane;
7 import java.awt.BorderLayout;
8 import java.awt.Color;
9 import java.awt.Component;
10 import java.awt.Dimension;
11 import java.awt.MouseInfo;
12 import java.awt.Point;
13 import java.awt.PointerInfo;
14 import java.awt.event.ActionEvent;
15 import java.awt.event.ActionListener;
16 import java.awt.event.MouseEvent;
17 import java.awt.event.MouseListener;
18 import java.io.BufferedWriter;
19 import java.io.File;
20 import java.io.FileWriter;
21 import java.io.IOException;
22 import java.math.BigDecimal;
23 import java.security.cert.X509Certificate;
24 import java.sql.SQLException;
25 import java.text.DecimalFormat;
26 import java.util.ArrayList;
27 import java.util.Arrays;
28 import java.util.Date;
29 import java.util.HashMap;
30 import java.util.Vector;
32 import javax.swing.ButtonGroup;
33 import javax.swing.Icon;
34 import javax.swing.JButton;
35 import javax.swing.JComponent;
36 import javax.swing.JEditorPane;
37 import javax.swing.JOptionPane;
38 import javax.swing.JScrollPane;
39 import javax.swing.JSplitPane;
40 import javax.swing.JTree;
41 import javax.swing.SwingUtilities;
42 import javax.swing.event.TreeSelectionEvent;
43 import javax.swing.event.TreeSelectionListener;
44 import javax.swing.tree.DefaultMutableTreeNode;
45 import javax.swing.tree.DefaultTreeCellRenderer;
46 import javax.swing.tree.DefaultTreeModel;
47 import javax.swing.tree.TreeNode;
48 import javax.swing.tree.TreePath;
50 import org.jdesktop.swingworker.SwingWorker;
51 import org.jdesktop.swingx.JXPanel;
52 import org.jdesktop.swingx.JXTree;
53 import org.thera_pi.nebraska.crypto.NebraskaCryptoException;
54 import org.thera_pi.nebraska.crypto.NebraskaEncryptor;
55 import org.thera_pi.nebraska.crypto.NebraskaFileException;
56 import org.thera_pi.nebraska.crypto.NebraskaKeystore;
57 import org.thera_pi.nebraska.crypto.NebraskaNotInitializedException;
59 import rehaInternalFrame.JAbrechnungInternal;
60 import CommonTools.SqlInfo;
61 import stammDatenTools.RezTools;
62 import systemEinstellungen.SystemConfig;
63 import systemEinstellungen.SystemPreislisten;
64 import CommonTools.JCompTools;
65 import CommonTools.JRtaCheckBox;
66 import CommonTools.JRtaComboBox;
67 import CommonTools.JRtaRadioButton;
68 import CommonTools.StringTools;
69 import terminKalender.DatFunk;
71 import com.jgoodies.forms.builder.PanelBuilder;
72 import com.jgoodies.forms.layout.CellConstraints;
73 import com.jgoodies.forms.layout.FormLayout;
74 import com.mysql.jdbc.PreparedStatement;
76 import emailHandling.EmailSendenExtern;
77 import events.PatStammEvent;
78 import events.PatStammEventClass;
79 import events.PatStammEventListener;
81 public class AbrechnungGKV extends JXPanel implements PatStammEventListener,ActionListener,TreeSelectionListener, MouseListener{
82 /**
85 private static final long serialVersionUID = -3580427603080353812L;
86 private JAbrechnungInternal jry;
87 private UIFSplitPane jSplitLR = null;
89 final String plus = "+";
90 final String EOL = "'"+System.getProperty("line.separator");
91 final String SOZ = "?";
92 public String abzurechnendeKassenID = "";
93 String ik_kasse,ik_kostent,ik_nutzer,ik_physika,ik_papier,ik_email,ik_preisgruppe;
94 String name_kostent;
95 String aktEsol;
96 String aktDfue;
97 String aktRechnung;
98 String aktDisziplin = "";
99 String[] diszis = {"KG","MA","ER","LO","PO"};
101 boolean annahmeAdresseOk = false;
102 /*******Controls für die linke Seite*********/
103 ButtonGroup bg = new ButtonGroup();
104 JRtaRadioButton[] rbLinks = {null,null,null,null};
105 JButton[] butLinks = {null,null,null,null};
106 public JRtaComboBox cmbDiszi = null;
107 JXTree treeKasse = null;
108 File f;
109 FileWriter fw;
110 BufferedWriter bw;
111 AbrechnungDlg abrDlg = null;
113 // public DefaultMutableTreeNode rootKasse;
114 // public DefaultTreeModel treeModelKasse;
116 public JXTTreeNode rootKasse;
117 public KassenTreeModel treeModelKasse;
118 public JXTTreeNode aktuellerKnoten;
119 public JXTTreeNode aktuellerKassenKnoten;
120 public int kontrollierteRezepte;
122 public StringBuffer positionenBuf = new StringBuffer();
123 public StringBuffer unbBuf = new StringBuffer();
124 public StringBuffer unzBuf = new StringBuffer();
125 public StringBuffer gesamtBuf = new StringBuffer();
126 public StringBuffer auftragsBuf = new StringBuffer();
127 public StringBuffer buf = new StringBuffer();
128 public StringBuffer htmlBuf = new StringBuffer();
129 public StringBuffer rechnungBuf = new StringBuffer();
130 public StringBuffer historieBuf = new StringBuffer();
131 public int positionenAnzahl = 0;
132 public String abrDateiName = "";
133 JEditorPane htmlPane = null;
135 Double[] preis00 = {0.00,0.00,0.00};
136 Double[] preis11 = {0.00,0.00,0.00};
137 Double[] preis31 = {0.00,0.00,0.00};
138 Double[] preis51 = {0.00,0.00,0.00};
140 Double[] kassenUmsatz = {0.00,0.00};
141 DecimalFormat dfx = new DecimalFormat( "0.00" );
143 Vector<String> existiertschon = new Vector<String>();
144 Vector<Vector<String>> kassenIKs = new Vector<Vector<String>>();
145 /*******Controls für die rechte Seite*********/
146 AbrechnungRezept abrRez = null;
147 AbrechnungDrucken abrDruck = null;
148 Vector<String> abgerechneteRezepte = new Vector<String>();
149 Vector<String> abgerechnetePatienten = new Vector<String>();
150 Vector<Vector<String>> preisVector = null;
151 HashMap<String,String> hmAnnahme = null;
152 HashMap<String,String> hmKostentraeger = new HashMap<String,String>();
153 int abrechnungRezepte = 0;
154 public String aktuellerPat = "";
157 String rlistekasse;
158 String rlisteesol;
160 JRtaCheckBox soll302 = null;
161 HashMap<String,String> hmAlternativeKasse = new HashMap<String,String>();
162 JButton alternativeKK = null;
164 public String abrechnungsModus = "abrechnung302";
165 final String ABR_MODE_302 = "abrechnung302";
166 final String ABR_MODE_IV = "abrechnungIV";
167 public String SlgaVersion = null;
168 public String SllaVersion = null;
169 public boolean zuzahlModusDefault = true;
171 public AbrechnungGKV(JAbrechnungInternal xjry){
172 super();
173 this.setJry(xjry);
174 setLayout(new BorderLayout());
175 jSplitLR = UIFSplitPane.createStrippedSplitPane(JSplitPane.HORIZONTAL_SPLIT,
176 getLeft(),
177 getRight());
178 jSplitLR.setDividerSize(7);
179 jSplitLR.setDividerBorderVisible(true);
180 jSplitLR.setName("BrowserSplitLinksRechts");
181 jSplitLR.setOneTouchExpandable(true);
182 jSplitLR.setDividerLocation(230);
183 add(jSplitLR,BorderLayout.CENTER);
184 mandantenCheck();
185 SlgaVersion = ( DatFunk.TageDifferenz("30.09.2013",DatFunk.sHeute()) <= 0 ? "08" : "09");
186 SllaVersion = ( DatFunk.TageDifferenz("30.09.2013",DatFunk.sHeute()) <= 0 ? "08" : "09");
187 new SwingWorker<Void,Void>(){
188 @Override
189 protected Void doInBackground() throws Exception {
190 SystemConfig.certState = checkCert("IK"+Reha.aktIK);
191 if(SystemConfig.certState > 0){
192 abrRez.tbbuts[3].setEnabled(false);
194 return null;
196 }.execute();
198 public static int checkCert(String alias){
199 try{
200 String keystore = Reha.proghome+"keystore/"+Reha.aktIK+"/"+Reha.aktIK+".p12";
201 NebraskaKeystore store = new NebraskaKeystore(keystore, SystemConfig.hmAbrechnung.get("hmkeystorepw"),"123456", Reha.aktIK);
202 Vector<X509Certificate> certs = store.getAllCerts();
203 String[] dn = null;
204 String ik;
205 for(int i = 0; i < certs.size();i++){
206 dn=certs.get(i).getSubjectDN().toString().split(",");
207 if(dn.length==5){
208 ik = (String)dn[3].split("=")[1];
209 if(ik.equals(alias)){
210 String verfall = certs.get(i).getNotAfter().toLocaleString().split(" ")[0].trim();
211 long tage = DatFunk.TageDifferenz(DatFunk.sHeute(),verfall);
212 if( tage <= 0){
213 JOptionPane.showMessageDialog(null,"Ihr Zertifikat ist abgelaufen.\nEine Verschlüsselung mit diesem Zertifikat ist nicht mehr möglich");
214 return SystemConfig.certIsExpired;
215 }else if(tage <= 30){
216 JOptionPane.showMessageDialog(null,"Achtung!!!\nIhr Zertifikat läuft in "+Long.toString(tage)+" Tage(n) ab.\nBitte rechtzeitig neues Zertifikat beantragen");
218 return SystemConfig.certOK;
222 }catch(Exception ex){
223 return SystemConfig.certNotFound;
225 return SystemConfig.certNotFound;
227 /**********
231 * Linke Seite
233 private void mandantenCheck(){
234 if(SystemConfig.hmFirmenDaten.get("Steuernummer").trim().equals("")){
235 String msg = "Achtung(!!!!!!) für diesen Mandant wurde keine Steuernummer angegeben!\n\n"+
236 "Eine Abrechnung ohne Steuernummer wird von der GKV nicht(!!!!) akzeptiert\n\"+" +
237 "Schließen Sie die Abrechnung starten Sie die System-Initialisierung -> Mandanten Datenbank -> Firmenangaben...\n"+
238 "und tragen Sie hier im Feld Steuernummer die vom Finanzamt vergebene Steuernummer ein.";
239 JOptionPane.showMessageDialog(null,msg);
241 if(SystemConfig.hmFirmenDaten.get("Ikbezeichnung").trim().equals("")){
242 String msg = "Achtung(!!!!!!) für diesen Mandant wurde keine Firmenbezeichnung angegeben!\n\n"+
243 "Schließen Sie die Abrechnung starten Sie die System-Initialisierung -> Mandanten Datenbank -> Firmenangaben...\n"+
244 "und tragen Sie hier im Feld 'Mandanten-Bezeichnung' eine Kurzfassung Ihres Firmennamens ein (max 30 Zeichen)";
245 JOptionPane.showMessageDialog(null,msg);
247 if(SystemConfig.hmFirmenDaten.get("Ikbezeichnung").length() > 30){
248 String msg = "Achtung(!!!!!!) für diesen Mandant wurde eine zu lange Firmenbezeichnung angegeben.\n\n"+
249 "Schließen Sie die Abrechnung starten Sie die System-Initialisierung -> Mandanten Datenbank -> Firmenangaben...\n"+
250 "und tragen Sie hier im Feld 'Mandanten-Bezeichnung' eine Kurzfassung Ihres Firmennamens ein (max 30 Zeichen)";
251 JOptionPane.showMessageDialog(null,msg);
254 private JScrollPane getLeft(){
255 FormLayout lay = new FormLayout("5dlu,fill:0:grow(1.0),5dlu",
256 //1 2 3 4 5 6 7 8 9 10 11
257 "5dlu,p,5dlu,p,15dlu,p,20dlu,p,15dlu,fill:0:grow(1.0),5dlu");
258 PanelBuilder pb = new PanelBuilder(lay);
259 CellConstraints cc = new CellConstraints();
260 pb.getPanel().setBackground(Color.WHITE);
261 //pb.add(getIVPanel(),cc.xy(2,1));
262 pb.addLabel("Heilmittel auswählen",cc.xy(2,2));
263 cmbDiszi = new JRtaComboBox(new String[] {"Physio-Rezept","Massage/Lymphdrainage-Rezept","Ergotherapie-Rezept","Logopädie-Rezept","Podologie-Rezept"});
264 cmbDiszi.setSelectedItem(SystemConfig.initRezeptKlasse);
265 cmbDiszi.setActionCommand("einlesen");
267 pb.add(cmbDiszi,cc.xy(2,4));
269 butLinks[0] = new JButton("Abrechnungsdaten einlesen");
270 butLinks[0].setActionCommand("einlesen");
271 butLinks[0].addActionListener(this);
272 pb.addLabel("",cc.xy(2,6));
273 pb.add(butLinks[0],cc.xy(2,8));
275 //rootKasse = new DefaultMutableTreeNode( "Abrechnung für Kasse..." );
276 //rootKasse = new DefaultMutableTreeNode( "Abrechnung für Kasse..." );
277 rootKasse = new JXTTreeNode(new KnotenObjekt("Abrechnung für Kasse...","",false,"",""),true);
278 treeModelKasse = new KassenTreeModel((JXTTreeNode) rootKasse);
280 treeKasse = new JXTree(treeModelKasse);
281 treeKasse.setModel(treeModelKasse);
282 treeKasse.setName("kassentree");
283 treeKasse.getSelectionModel().addTreeSelectionListener(this);
284 treeKasse.setCellRenderer(new MyRenderer(SystemConfig.hmSysIcons.get("zuzahlok")));
285 treeKasse.addMouseListener(this);
286 JScrollPane jscrk = JCompTools.getTransparentScrollPane(treeKasse);
287 jscrk.validate();
288 pb.add(jscrk,cc.xy(2, 6));
289 new SwingWorker<Void,Void>(){
290 @Override
291 protected Void doInBackground() throws Exception {
292 Reha.thisFrame.setCursor(Reha.thisClass.wartenCursor);
293 return null;
296 }.execute();
298 doEinlesen(null);
300 htmlPane = new JEditorPane(/*initialURL*/);
301 htmlPane.setContentType("text/html");
302 htmlPane.setEditable(false);
303 htmlPane.setOpaque(false);
304 jscrk = JCompTools.getTransparentScrollPane(htmlPane);
305 jscrk.validate();
306 pb.add(jscrk,cc.xy(2,10));
308 pb.getPanel().validate();
310 JScrollPane jscr = JCompTools.getTransparentScrollPane(pb.getPanel());
311 jscr.validate();
312 cmbDiszi.addActionListener(this);
313 return jscr;
316 private JXPanel getIVPanel(){
317 JXPanel jpan = new JXPanel();
318 jpan.setOpaque(false);
319 String xwerte = "0dlu,fill:0:grow(1.0),0dlu";
320 // 1 2 3 4 5 6 7
321 String ywerte = "5dlu,p,3dlu,p,25dlu";
322 FormLayout lay = new FormLayout(xwerte,ywerte);
323 CellConstraints cc = new CellConstraints();
324 jpan.setLayout(lay);
325 soll302 = new JRtaCheckBox("Abrechnung nach §302 erstellen");
326 soll302.setSelected(true);
327 soll302.setOpaque(false);
328 jpan.add(soll302,cc.xy(2,2));
329 alternativeKK = new JButton("Adresse...");
330 alternativeKK.setActionCommand("alternativeadresse");
331 alternativeKK.addActionListener(this);
332 Image img = new ImageIcon(Reha.proghome+"icons/krankenkasse.png").getImage().getScaledInstance(22, 22, Image.SCALE_SMOOTH);
333 alternativeKK.setIcon(new ImageIcon(img));
334 jpan.add(alternativeKK,cc.xy(2,4));
335 return jpan;
338 private JXPanel getRight(){
339 this.abrRez = new AbrechnungRezept(this);
340 this.abrRez.setRechtsAufNull();
341 return abrRez;
343 public boolean getTageDrucken(){
344 return this.abrRez.getTageDrucken();
346 @Override
347 public void patStammEventOccurred(PatStammEvent evt) {
348 // TODO Auto-generated method stub
352 public void setJry(JAbrechnungInternal jry) {
353 this.jry = jry;
356 public JAbrechnungInternal getJry() {
357 return jry;
359 public JXTTreeNode getaktuellerKassenKnoten(){
360 return aktuellerKassenKnoten;
362 @Override
363 public void actionPerformed(ActionEvent arg0) {
364 String cmd = arg0.getActionCommand();
365 if(cmd.equals("einlesen")){
366 //rootKasse.removeAllChildren();
367 //String[] reznr = {"KG","MA","ER","LO"};
368 String[] diszis = {"Physio","Massage","Ergo","Logo","Podo"};
369 aktDisziplin = diszis[cmbDiszi.getSelectedIndex()];
370 //abrRez.setKuerzelVec(reznr[cmbDiszi.getSelectedIndex()]);
371 if(abrRez.rezeptSichtbar){
372 abrRez.setRechtsAufNull();
373 aktuellerPat = "";
375 doEinlesen(null);
376 //setPreisVec(cmbDiszi.getSelectedIndex());
378 if(cmd.equals("alternativeadresse")){
382 private String getDiszis(){
383 String[] diszis = {"Physio","Massage","Ergo","Logo","Podo"};
384 return String.valueOf(diszis[cmbDiszi.getSelectedIndex()]);
386 public void einlesenErneuern(){
387 String[] diszis = {"Physio","Massage","Ergo","Logo","Podo"};
388 aktDisziplin = diszis[cmbDiszi.getSelectedIndex()];
389 //abrRez.setKuerzelVec(reznr[cmbDiszi.getSelectedIndex()]);
390 if(abrRez.rezeptSichtbar){
391 abrRez.setRechtsAufNull();
392 aktuellerPat = "";
394 doEinlesen(null);
397 private void setPreisVec(int pos){
398 String[] reznr = {"KG","MA","ER","LO"};
399 //abrRez.setPreisVec(reznr[pos]);
400 JOptionPane.showMessageDialog(null, "Aufruf von setPreisVec in AbrechnungGKV");
404 /*********
405 * Einlesen der abrechnungsdaten
407 public void doEinlesen(JXTTreeNode aktKassenNode ){
408 //final JXTTreeNode xaktKassenNode = aktKassenNode;
409 new SwingWorker<Void,Void>(){
410 @Override
411 protected Void doInBackground() throws Exception {
412 try{
413 new SwingWorker<Void,Void>(){
414 @Override
415 protected Void doInBackground() throws Exception {
416 Reha.thisClass.progressStarten(true);
417 return null;
419 }.execute();
420 existiertschon.clear();
421 String dsz = diszis[cmbDiszi.getSelectedIndex()];
423 String cmd = "select name1,ikktraeger,ikkasse,id from fertige where rezklasse='"+dsz+"' ORDER BY ikktraeger , id";
425 Vector <Vector<String>> vecKassen = SqlInfo.holeFelder(cmd);
427 if(vecKassen.size() <= 0){
428 kassenBaumLoeschen();
429 Reha.thisClass.progressStarten(false);
430 return null;
432 kassenBaumLoeschen();
433 treeKasse.setEnabled(true);
434 String kas = vecKassen.get(0).get(0).trim().toUpperCase();
435 String ktraeger = vecKassen.get(0).get(1).trim();
436 String ikkasse = vecKassen.get(0).get(2).trim();
437 existiertschon.add(ktraeger);
439 int aeste = 0;
440 astAnhaengen(kas,ktraeger,ikkasse);
441 rezepteAnhaengen(0);
442 aeste++;
448 for(int i = 0; i < vecKassen.size();i++){
449 if(! existiertschon.contains(vecKassen.get(i).get(1).trim().toUpperCase())){
450 kas = vecKassen.get(i).get(0).trim().toUpperCase();
451 ktraeger = vecKassen.get(i).get(1);
452 ikkasse = vecKassen.get(i).get(2);
453 existiertschon.add(ktraeger);
454 astAnhaengen(kas,ktraeger,ikkasse);
455 rezepteAnhaengen(aeste);
456 aeste++;
458 treeKasse.repaint();
461 treeKasse.validate();
462 treeKasse.setRootVisible(true);
464 treeKasse.expandRow(0);
467 treeKasse.repaint();
468 }catch(Exception ex){
469 ex.printStackTrace();
471 Reha.thisFrame.setCursor(Reha.thisClass.cdefault);
472 Reha.thisClass.progressStarten(false);
473 return null;
475 }.execute();
477 private void rezepteAnhaengen(int knoten){
478 String ktraeger = ((JXTTreeNode)rootKasse.getChildAt(knoten)).knotenObjekt.ktraeger;
479 String dsz = diszis[cmbDiszi.getSelectedIndex()];
480 String cmd = "select rez_nr,pat_intern,ediok,ikkasse from fertige where rezklasse='"+dsz+"' AND ikktraeger='"+
481 ktraeger+"' ORDER BY id,pat_intern";
483 Vector <Vector<String>> vecKassen = SqlInfo.holeFelder(cmd);
485 JXTTreeNode node = (JXTTreeNode) rootKasse.getChildAt(knoten);
486 //JXTTreeNode treeitem = null;
488 JXTTreeNode meinitem = null;
489 for(int i = 0;i<vecKassen.size();i++){
490 try{
491 cmd = "select n_name from pat5 where pat_intern='"+
492 vecKassen.get(i).get(1)+"' LIMIT 1";
494 String name = SqlInfo.holeFelder(cmd).get(0).get(0);
495 cmd = "select preisgruppe from verordn where rez_nr='"+vecKassen.get(i).get(0)+"' LIMIT 1";;
496 ////System.out.println(cmd);
497 String preisgr = SqlInfo.holeEinzelFeld(cmd);
498 ////System.out.println("Preisgruppe="+preisgr);
500 KnotenObjekt rezeptknoten = new KnotenObjekt(vecKassen.get(i).get(0)+"-"+name,
501 vecKassen.get(i).get(0),
502 (vecKassen.get(i).get(2).equals("T")? true : false),
503 vecKassen.get(i).get(3),
504 preisgr);
505 rezeptknoten.ktraeger = ktraeger;
506 rezeptknoten.pat_intern = vecKassen.get(i).get(1);
507 meinitem = new JXTTreeNode(rezeptknoten,true);
509 treeModelKasse.insertNodeInto(meinitem,node,node.getChildCount());
510 treeKasse.validate();
511 }catch(Exception ex){
517 private void astAnhaengen(String ast,String ktraeger,String ikkasse){
518 KnotenObjekt knoten = new KnotenObjekt(ast,"",false,"","");
519 knoten.ktraeger = ktraeger;
520 knoten.ikkasse = ikkasse;
521 JXTTreeNode node = new JXTTreeNode(knoten,true);
522 treeModelKasse.insertNodeInto(node, rootKasse, rootKasse.getChildCount());
523 treeKasse.validate();
525 private void kassenBaumLoeschen(){
526 try{
528 while( (rootKasse.getChildCount()) > 0){
529 treeModelKasse.removeNodeFromParent((JXTTreeNode) ((JXTTreeNode) treeModelKasse.getRoot()).getChildAt(0));
531 treeKasse.validate();
532 treeKasse.repaint();
533 }catch(Exception ex){
534 ex.printStackTrace();
537 /*******************************************/
538 private void doKassenTreeAuswerten(KnotenObjekt node){
539 //Rezept ausgewählt
540 setCursor(Reha.thisClass.wartenCursor);
541 Reha.thisClass.progressStarten(true);
542 try{
543 if(! this.abrRez.setNewRez(node.rez_num,node.fertig,aktDisziplin) ){
544 Reha.thisClass.progressStarten(false);
545 setCursor(Reha.thisClass.normalCursor);
546 JOptionPane.showMessageDialog(null,"Rezept konnte nicht ausgewertet werden");
547 return;
549 }catch(Exception ex){
550 ex.printStackTrace();
552 ////System.out.println("Rezept "+node.rez_num+" fertig eingestellt");
553 setCursor(Reha.thisClass.normalCursor);
554 SwingUtilities.invokeLater(new Runnable(){
555 public void run(){
556 Reha.thisClass.progressStarten(false);
561 return;
564 /*******************************************/
566 private void doAufraeumen(){
567 butLinks[0].removeActionListener(this);
568 cmbDiszi.removeActionListener(this);
569 treeKasse.getSelectionModel().removeTreeSelectionListener(this);
572 public void loescheKnoten(){
573 //rezept aus fertige löschen
574 //Verschluß des Rezeptes aufheben
575 //Knoten löschen
576 //wenn einziger Knoten den kassenKnoten löschen
577 String rez_nr = this.aktuellerKnoten.knotenObjekt.rez_num;
578 String cmd = "delete from fertige where rez_nr='"+rez_nr+"' LIMIT 1";
579 SqlInfo.sqlAusfuehren(cmd);
580 cmd = "update verordn set abschluss='F' where rez_nr='"+rez_nr+"' LIMIT 1";
581 SqlInfo.sqlAusfuehren(cmd);
582 try{
583 treeModelKasse.removeNodeFromParent(this.aktuellerKnoten);
584 }catch(Exception ex){
585 JOptionPane.showMessageDialog(null, "Kritische Situation bei Aktion aufschließen des Rezeptes");
587 this.aktuellerKassenKnoten.getNextNode();
588 int anzahlrez = this.aktuellerKassenKnoten.getChildCount();
589 if(anzahlrez==0){
590 treeModelKasse.removeNodeFromParent(this.aktuellerKassenKnoten);
591 }else{
592 this.rechneKasse(this.aktuellerKassenKnoten);
594 this.abrRez.setRechtsAufNull();
596 @Override
597 public void valueChanged(TreeSelectionEvent arg0) {
598 //TreePath path = arg0.getNewLeadSelectionPath();
599 TreePath tp = treeKasse.getSelectionPath();
600 kontrollierteRezepte = 0;
601 if(tp==null){
603 return;
605 JXTTreeNode node = (JXTTreeNode) tp.getLastPathComponent();
606 String rez_nr = ((JXTTreeNode)node).knotenObjekt.rez_num;
607 if(!rez_nr.trim().equals("")){
608 aktuellerKnoten = node;
609 doKassenTreeAuswerten(node.knotenObjekt);
610 aktuellerPat = node.knotenObjekt.pat_intern;
611 aktuellerKassenKnoten =(JXTTreeNode) ((JXTTreeNode)aktuellerKnoten).getParent();
612 int pgr = -1;
613 if(! ((JXTTreeNode)node).knotenObjekt.preisgruppe.trim().equals("")){
614 ////System.out.println("Aktuelle Disziplin = "+getDiszis()+" / Aktuelle Preisgruppe = "+pgr);
615 pgr = Integer.parseInt(((JXTTreeNode)node).knotenObjekt.preisgruppe.trim());
616 zuzahlModusDefault = (SystemPreislisten.hmZuzahlModus.get(getDiszis()).get(pgr-1)==1 ? true : false);
618 if(pgr < 0){
619 JOptionPane.showMessageDialog(null,"Achtung Preisgruppe kann nicht ermittelt werden!\nBitte dieses Rezept nicht abrechnen!");
621 ////System.out.println("Preisguppe = "+Integer.toString(pgr)+"\nZuhahlmodus = "+(zuzahlModusDefault ? "Normal" : "Bayrisch"));
623 }else{
624 abrRez.setRechtsAufNull();
625 aktuellerKnoten = (JXTTreeNode)node;
626 if(aktuellerKnoten.getParent() != null){
627 if(((JXTTreeNode)aktuellerKnoten.getParent()).isRoot()){
628 aktuellerKassenKnoten =(JXTTreeNode) ((JXTTreeNode)aktuellerKnoten);
629 //////System.out.println("Aktueller Knoten ist Root");
630 }else{
631 //////System.out.println("Aktueller Knoten ungleich Root");
633 //////System.out.println("Pfad zu Parent = "+new TreePath(aktuellerKnoten.getParent()).toString());
634 }else{
635 aktuellerKassenKnoten = null;
637 aktuellerPat = "";
640 kassenUmsatz[0] = 0.00;
641 kassenUmsatz[1] = 0.00;
642 if(aktuellerKassenKnoten != null){
643 rechneKasse(aktuellerKassenKnoten);
647 public void setKassenUmsatzNeu(){
648 kassenUmsatz[0] = 0.00;
649 kassenUmsatz[1] = 0.00;
650 if(aktuellerKassenKnoten != null){
651 rechneKasse(aktuellerKassenKnoten);
654 public String getAbrechnungKasse(){
655 ////System.out.println(((JXTTreeNode)aktuellerKnoten).knotenObjekt.ktraeger);
656 return ((JXTTreeNode)aktuellerKnoten).knotenObjekt.ktraeger;
658 public void rechneKasse(JXTTreeNode aktKasse){
659 kontrollierteRezepte = 0;
660 final JXTTreeNode xaktKasse = aktKasse;
661 new SwingWorker<Void,Void>(){
662 @Override
663 protected Void doInBackground() throws Exception {
664 try{
665 int lang = xaktKasse.getChildCount();
666 Reha.thisClass.progressStarten(true);
667 getInstance().setCursor(Reha.thisClass.wartenCursor);
668 for(int i = 0; i < lang;i++){
669 if( ((JXTTreeNode)xaktKasse.getChildAt(i)).knotenObjekt.fertig ){
670 kontrollierteRezepte++;
671 holeUmsaetze(((JXTTreeNode)xaktKasse.getChildAt(i)).knotenObjekt.rez_num);
674 setHtmlLinksUnten(lang,kontrollierteRezepte);
675 Reha.thisClass.progressStarten(false);
676 getInstance().setCursor(Reha.thisClass.cdefault);
677 }catch(Exception ex){
678 ex.printStackTrace();
680 return null;
682 }.execute();
684 public void setHtmlLinksUnten(int gesamt,int gut){
685 htmlBuf.setLength(0);
686 htmlBuf.trimToSize();
687 htmlBuf.append("<html><head>");
688 htmlBuf.append("<STYLE TYPE=\"text/css\">");
689 htmlBuf.append("<!--");
690 htmlBuf.append("A{text-decoration:none;background-color:transparent;border:none}");
691 htmlBuf.append("TD{font-family: Tahoma; font-size: 11pt; padding-left:5px;padding-right:30px}");
692 htmlBuf.append(".spalte1{color:#0000FF;}");
693 htmlBuf.append(".spalte2{color:#FF0000;}");
694 htmlBuf.append(".spalte3{color:#333333;}");
695 htmlBuf.append("--->");
696 htmlBuf.append("</STYLE>");
697 htmlBuf.append("</head>");
698 htmlBuf.append("<div style=margin-left:0px;>");
699 htmlBuf.append("<font face=\"Tahoma\"><style=margin-left=0px;>");
700 htmlBuf.append("<br>");
701 htmlBuf.append("<table>");
702 htmlBuf.append("<tr><td>fertige Rezepte:</td>");
703 htmlBuf.append("<td class=\"spalte1\" align=\"right\"><b>"+gesamt+"</b></td></tr>");
704 htmlBuf.append("<tr><td>abrechnungsfähig:</td>");
705 htmlBuf.append((gesamt != gut ? "<td class=\"spalte2\" align=\"right\">" : "<td class=\"spalte1\" align=\"right\">" )+
706 "<b>"+gut+"</b></td></tr>");
707 htmlBuf.append("<tr><td>Umsatz:</td>");
708 htmlBuf.append("<td class=\"spalte1\" align=\"right\">"+dfx.format(kassenUmsatz[0])+"</td></tr>");
709 htmlBuf.append("<tr><td>enth. Rezeptgeb.: </td>");
710 htmlBuf.append("<td class=\"spalte1\" align=\"right\">"+dfx.format(kassenUmsatz[1])+"</td></tr>");
711 htmlBuf.append("</table>");
712 htmlBuf.append("</div>");
713 htmlBuf.append("</html>");
714 htmlPane.setText(htmlBuf.toString());
716 public void holeUmsaetze(String rez_nr){
717 buf.setLength(0);
718 buf.trimToSize();
719 try{
720 buf.append(SqlInfo.holeFelder("select edifact from fertige where rez_nr='"+rez_nr+"'").get(0).get(0));
721 }catch(Exception ex){}
722 if(buf.length()<=0){
723 JOptionPane.showMessageDialog(null,"Kassenumsatz für Rezept + "+rez_nr+" kann nicht abgeholt werden. Modul holeUmsatz() (Edifact)");
725 //////System.out.println(buf.toString());
726 String[] zeilen = buf.toString().split("\n");
727 String[] positionen = zeilen[0].split(":");
728 //PG=1:PATINTERN=16961:REZNUM=KG57747:GESAMT=102,30:REZGEB=20,26:REZANTEIL=10,26:REZPAUSCHL=10,00:KASSENID=116
729 kassenUmsatz[0] = kassenUmsatz[0]+ Double.valueOf(positionen[3].split("=")[1].replace(",", "."));
730 kassenUmsatz[1] = kassenUmsatz[1]+ Double.valueOf(positionen[4].split("=")[1].replace(",", "."));
732 /**************************************************/
734 public void starteAbrechnung(){
735 try{
736 hmKostentraeger.clear();
737 if(!Reha.officeapplication.isActive()){
738 try{
739 Reha.starteOfficeApplication();
740 if(!Reha.officeapplication.isActive()){
741 doDlgAbort();
742 JOptionPane.showMessageDialog(null, "Das OpenOffice-System reagiert nicht korrekt!\nAbrechnung wird nicht gestartet");
743 return;
745 }catch(Exception ex){
746 doDlgAbort();
747 JOptionPane.showMessageDialog(null, "Das OpenOffice-System reagiert nicht korrekt!\nAbrechnung wird nicht gestartet");
748 return;
752 if(aktuellerKassenKnoten==null){
753 abrDlg.setVisible(false);
754 abrDlg.dispose();
755 abrDlg = null;
756 Reha.thisClass.progressStarten(false);
757 JOptionPane.showMessageDialog(null, "Keine Kasse für die Abrechnung ausgewählt!");
758 return;
760 if(kontrollierteRezepte <=0){
761 abrDlg.setVisible(false);
762 abrDlg.dispose();
763 abrDlg = null;
764 Reha.thisClass.progressStarten(false);
765 JOptionPane.showMessageDialog(null, "Für die ausgewählte Kasse sind keine Rezepte zur Abrechnung freigegeben!");
766 return;
770 abgerechneteRezepte.clear();
771 abgerechnetePatienten.clear();
772 abrechnungRezepte = 0;
773 preis00 = setzePreiseAufNull(preis00);
774 preis11 = setzePreiseAufNull(preis11);
775 preis31 = setzePreiseAufNull(preis31);
776 preis51 = setzePreiseAufNull(preis51);
777 positionenBuf.setLength(0);positionenBuf.trimToSize();
778 unbBuf.setLength(0);unbBuf.trimToSize();
779 unzBuf.setLength(0);unzBuf.trimToSize();
780 gesamtBuf.setLength(0);gesamtBuf.trimToSize();
781 auftragsBuf.setLength(0);auftragsBuf.trimToSize();
782 positionenAnzahl = 0;
783 abrDateiName = "";
784 annahmeAdresseOk = false;
785 /**********************************/
787 abzurechnendeKassenID = getAktKTraeger();
788 String preisgr = getPreisgruppenKuerzel(aktDisziplin);
789 String cmd = "select ik_kasse,ik_kostent,ik_nutzer,ik_physika,ik_papier,"+preisgr+" from kass_adr where ik_kasse='"+abzurechnendeKassenID+"' LIMIT 1";
790 kassenIKs.clear();
791 kassenIKs = SqlInfo.holeFelder(cmd);
792 ////System.out.println(cmd);
793 if(kassenIKs.size()<=0){
794 Reha.thisClass.progressStarten(false);
795 abrDlg.setVisible(false);
796 abrDlg.dispose();
797 abrDlg = null;
798 JOptionPane.showMessageDialog(null, "Fehler - Daten der Krankenkasse konnten nicht ermittelt werden");
799 SqlInfo.sqlAusfuehren("update nummern set rnr='"+aktRechnung+"' where mandant='"+Reha.aktIK+"' LIMIT 1");
800 return;
803 public String abrechnungsModus = "abrechnung302";
804 final String ABR_MODE_302 = "abrechnung302";
805 final String ABR_MODE_IV = "abrechnungIV";
808 ik_kasse = kassenIKs.get(0).get(0);
809 ik_kostent = kassenIKs.get(0).get(1);
810 ik_nutzer = kassenIKs.get(0).get(2);
811 ik_physika = kassenIKs.get(0).get(3);
812 ik_papier = kassenIKs.get(0).get(4);
813 ik_email = SqlInfo.holeEinzelFeld("select email from ktraeger where ikkasse='"+ik_physika+"' LIMIT 1");
815 //System.out.println(" kasse = "+ik_kasse);
816 //System.out.println("kostent = "+ik_kostent);
817 //System.out.println(" nutzer = "+ik_nutzer);
818 //System.out.println("physika = "+ik_physika);
819 //System.out.println(" email = "+ik_email);
822 if(abrechnungsModus.equals(ABR_MODE_302)){
823 if(ik_email.equals("")){
824 ik_email = SqlInfo.holeEinzelFeld("select email1 from kass_adr where ik_kasse='"+ik_physika+"' LIMIT 1");
826 if(ik_email.equals("")){
827 ik_email = SqlInfo.holeEinzelFeld("select email from ktraeger where ikkasse='"+ik_kasse+"' LIMIT 1");
829 if(ik_email.equals("")){
830 ik_email = SqlInfo.holeEinzelFeld("select email from ktraeger where ikkasse='"+ik_kostent+"' LIMIT 1");
832 if(ik_email.equals("")){
833 ik_email = SqlInfo.holeEinzelFeld("select email from ktraeger where ikkasse='"+ik_physika+"' LIMIT 1");
836 if(ik_email.trim().equals("")){
837 JOptionPane.showMessageDialog(null,"Emailadresse ist weder der Datenannahmestelle noch dem Kostenträger\noder der Kasse selbst zugeordnet."+
838 "\n\n Bitte geben Sie die Emailadresse von Hand ein");
839 Object ret = JOptionPane.showInputDialog(null, "Geben Sie bitte die Emailadresse der Datenannahmestelle ein","");
840 if(ret == null){
841 Reha.thisClass.progressStarten(false);
842 abrDlg.setVisible(false);
843 abrDlg.dispose();
844 abrDlg = null;
845 JOptionPane.showMessageDialog(null, "Fehler - keine Emailadresse eingegeben");
846 SqlInfo.sqlAusfuehren("update nummern set rnr='"+aktRechnung+"' where mandant='"+Reha.aktIK+"' LIMIT 1");
847 return;
849 ik_email = String.valueOf(ret);
852 preisVector = RezTools.holePreisVector(diszis[cmbDiszi.getSelectedIndex()],Integer.parseInt(kassenIKs.get(0).get(5))-1);
853 name_kostent = holeNameKostentraeger();
855 String test = "";
856 if(abrechnungsModus.equals(ABR_MODE_302)){
857 test = "IK der Krankenkasse: "+ik_kasse+"\n"+
858 "IK des Kostenträgers: "+ik_kostent+"\n"+
859 "IK des Nutzer mit EntschlüsselungsbefungnisKostenträgers: "+ik_nutzer+"\n"+
860 "IK der Datenannahmestelle: "+ik_physika+"\n"+
861 "IK der Papierannahmestelle: "+ik_papier+"\n"+
862 "Emailadresse der Datenannahmestelle: "+ik_email+"\n"+
863 "Name des Kostenträgers: "+name_kostent;
865 /************************************************/
866 hmKostentraeger.put("name1",String.valueOf(name_kostent));
867 /************************************************/
868 }else{
869 test = "IK der Krankenkasse: "+ik_kasse+"\n"+
870 "Keine Abrechnung nach § 302!!!\n\n"+
871 "Rechnungsanschrift:\n"+
872 hmAlternativeKasse.get("<Ivnam1>")+"\n"+
873 hmAlternativeKasse.get("<Ivnam2>")+"\n"+
874 hmAlternativeKasse.get("<Ivstrasse>")+"\n"+
875 hmAlternativeKasse.get("<Ivplz>")+" "+
876 hmAlternativeKasse.get("<Ivort>");
877 //hmAlternativeKasse.get("<Ivid>");
878 hmKostentraeger.put("name1",String.valueOf(hmAlternativeKasse.get("<Ivnam1>")));
880 int anfrage = JOptionPane.showConfirmDialog(null,test , "Die Abrechnung mit diesen Parametern starten?", JOptionPane.YES_NO_OPTION);
881 if(anfrage != JOptionPane.YES_OPTION){
882 doDlgAbort();
883 //SqlInfo.sqlAusfuehren("update nummern set rnr='"+aktRechnung+"' where mandant='"+Reha.aktIK+"' LIMIT 1");
884 return;
886 /***********hier erst die Nummer erzeugen **************/
887 aktRechnung = Integer.toString(SqlInfo.erzeugeNummer("rnr"));
888 if(abrechnungsModus.equals(ABR_MODE_302)){
889 aktEsol = StringTools.fuelleMitZeichen(Integer.toString(SqlInfo.erzeugeNummerMitMax("esol", 999)), "0", true, 3);
891 /************************************************/
892 hmKostentraeger.put("aktesol",String.valueOf(aktEsol));
893 /************************************************/
894 aktDfue = StringTools.fuelleMitZeichen(Integer.toString(SqlInfo.erzeugeNummerMitMax("dfue", 99999)), "0", true, 5);
895 if(aktRechnung.equals("-1")){
896 Reha.thisClass.progressStarten(false);
897 abrDlg.setVisible(false);
898 abrDlg.dispose();
899 abrDlg = null;
900 JOptionPane.showMessageDialog(null, "Fehler - Rechnungsnummer kann nicht bezogen werden");
901 return;
905 /*****************************************/
906 if(abrechnungsModus.equals(ABR_MODE_302)){
907 if(ik_email.trim().equals("")){
908 JOptionPane.showMessageDialog(null, "Dieser Kasse ist keine Emailadresse zugewiesen\n"+
909 "Abrechnung nach §302 ist nicht möglich!");
910 doDlgAbort();
911 SqlInfo.sqlAusfuehren("update nummern set rnr='"+aktRechnung+"' where mandant='"+Reha.aktIK+"' LIMIT 1");
912 return;
914 if(ik_papier.trim().equals("")){
915 JOptionPane.showMessageDialog(null, "Dieser Kasse ist keine Papierannahmestelle zugewiesen\n"+
916 "Abrechnung nach §302 ist nicht möglich!");
917 doDlgAbort();
918 SqlInfo.sqlAusfuehren("update nummern set rnr='"+aktRechnung+"' where mandant='"+Reha.aktIK+"' LIMIT 1");
919 return;
921 if(ik_nutzer.trim().equals("")){
922 JOptionPane.showMessageDialog(null, "Dieser Kasse ist keine Nutzer mit Entschlüsselungsbefugnis zugewiesen\n"+
923 "Abrechnung nach §302 ist nicht möglich!");
924 SqlInfo.sqlAusfuehren("update nummern set rnr='"+aktRechnung+"' where mandant='"+Reha.aktIK+"' LIMIT 1");
925 doDlgAbort();
926 return;
928 if(ik_physika.trim().equals("")){
929 JOptionPane.showMessageDialog(null, "Dieser Kasse ist keine Empfänger der Abrechnungsdaten zugewiesen\n"+
930 "Abrechnung nach §302 ist nicht möglich!");
931 SqlInfo.sqlAusfuehren("update nummern set rnr='"+aktRechnung+"' where mandant='"+Reha.aktIK+"' LIMIT 1");
932 doDlgAbort();
933 return;
935 hmAnnahme = holeAdresseAnnahmestelle(true);
936 annahmeAdresseOk = true;
937 }else{
938 hmAnnahme = holeAdresseAnnahmestelle(false);
939 annahmeAdresseOk = true;
942 /********
946 abrDlg.setVisible(true);
948 holeEdifact();
949 macheKopfDaten();
950 macheEndeDaten();
951 /********
955 gesamtBuf.append(unbBuf.toString());
956 gesamtBuf.append(positionenBuf.toString());
957 gesamtBuf.append(unzBuf.toString());
958 abrDlg.setzeLabel("übertrage EDIFACT in Datenbank");
960 if(Reha.vollbetrieb && abrechnungsModus.equals(ABR_MODE_302)){
961 PreparedStatement ps = null;
962 try {
963 ps = (PreparedStatement) Reha.thisClass.conn.prepareStatement(
964 "insert into edifact (r_nummer, r_datum,r_edifact) VALUES (?,?,?)");
965 ps.setString(1, aktRechnung);
966 ps.setString(2, DatFunk.sDatInSQL(DatFunk.sHeute()));
967 ps.setBytes(3, gesamtBuf.toString().getBytes());
968 ps.executeUpdate();
969 ps.close();
970 ps = null;
971 } catch (SQLException e1) {
972 e1.printStackTrace();
974 finally{
975 if(ps != null){
976 try {
977 ps.close();
978 } catch (SQLException e) {
979 e.printStackTrace();
981 ps = null;
986 if(abrechnungsModus.equals(ABR_MODE_302)){
987 try {
989 f = new File(Reha.proghome+"edifact/"+Reha.aktIK+"/"+"esol0"+aktEsol+".org");
990 fw = new FileWriter(f);
991 bw = new BufferedWriter(fw);
992 bw.write(gesamtBuf.toString());
993 bw.flush();
995 bw.close();
996 fw.close();
999 abrDlg.setzeLabel("Rechnungsdatei verschlüsseln");
1000 int originalSize = Integer.parseInt(Long.toString(f.length()));
1001 int encryptedSize = originalSize;
1002 String skeystore = Reha.proghome+"keystore/"+Reha.aktIK+"/"+Reha.aktIK+".p12";
1003 File fkeystore = new File(skeystore);
1004 if(! fkeystore.exists()){
1005 abrDlg.setzeLabel("Rechnungsdatei verschlüsseln - fehlgeschlagen!!!");
1006 String message = "<html>Auf Ihrem System ist keine (ITSG) Zertifikatsdatenbank vorhanden.<br>"+
1007 "Eine Verschlüsselung gemäß §302 SGB V kann daher nicht durchgeführt werden.<br><br>"+
1008 "Melden Sie sich im Forum <a href='http://www.thera-pi.org'>www.Thera-Pi.org</a> und fragen Sie nach dem<br>Verschlüsseler <b>'Nebraska'</b></html>";
1009 Reha.thisClass.progressStarten(false);
1010 JOptionPane.showMessageDialog(null, message);
1012 }else{
1014 encryptedSize = doVerschluesseln(aktEsol+".org");
1018 if(encryptedSize < 0){
1019 JOptionPane.showMessageDialog(null, "Es ist ein Fehler in der Verschlüsselung aufgetreten!");
1020 Reha.thisClass.progressStarten(false);
1021 abrDlg.setVisible(false);
1022 abrDlg.dispose();
1023 abrDlg = null;
1024 return;
1027 doAuftragsDatei(originalSize,encryptedSize);
1030 f = new File(Reha.proghome+"edifact/"+Reha.aktIK+"/"+"esol0"+aktEsol+".auf");
1031 fw = new FileWriter(f);
1032 bw = new BufferedWriter(fw);
1033 bw.write(auftragsBuf.toString());
1034 bw.close();
1035 fw.close();
1037 } catch (IOException e) {
1038 e.printStackTrace();
1040 abrDlg.setzeLabel("erstelle Email an: "+ik_email);
1043 try{
1044 if("1".equals(SystemConfig.hmAbrechnung.get("hmaskforemail"))){
1045 int frage = JOptionPane.showConfirmDialog(null,"Wollen Sie die Abrechnungsdatei esol0"+aktEsol+" an die Adresse\n"+
1046 "--> "+ik_email+" <-- versenden?","Benutzeranfrage",JOptionPane.YES_NO_OPTION);
1047 if(frage==JOptionPane.YES_OPTION){
1048 doEmail();
1050 }else{
1051 doEmail();
1055 String meldung = "Die Dateien "+"esol0"+aktEsol+".auf und "+"esol0"+aktEsol+" wurden erfolgreich\n"+
1056 "an die Adresse "+ik_email+" versandt.\n";
1057 JOptionPane.showMessageDialog(null, meldung);
1060 }catch(Exception ex){
1061 String meldung = "Die Dateien "+"esol0"+aktEsol+".auf und "+"esol0"+aktEsol+" sollten an die"+
1062 "Adresse "+ik_email+" gesendet werden.\n\n"+
1063 "Versand ist fehlgeschlagen, bitte von Hand erneut senden";
1064 JOptionPane.showMessageDialog(null, meldung);
1069 /*********************************************/
1071 abrDlg.setzeLabel("übertrage Rezepte in Historie");
1072 if(Reha.vollbetrieb){
1073 doUebertragen();
1074 abrDlg.setzeLabel("organisiere Abrechnungsprogramm");
1076 doLoescheRezepteAusTree();
1077 Reha.thisClass.progressStarten(false);
1078 abrDlg.setVisible(false);
1079 abrDlg.dispose();
1080 abrDlg = null;
1081 }catch(Exception ex){
1082 if(abrDlg != null){
1083 Reha.thisClass.progressStarten(false);
1084 abrDlg.setVisible(false);
1085 abrDlg.dispose();
1086 abrDlg = null;
1088 JOptionPane.showMessageDialog(null,"Fehler beim Abrechnungsvorgang:\n"+ex.getMessage());
1089 ex.printStackTrace();
1091 this.abrRez.setRechtsAufNull();
1093 /********************************************************************/
1094 private void doDlgAbort(){
1095 if(abrDlg != null){
1096 Reha.thisClass.progressStarten(false);
1097 abrDlg.setVisible(false);
1098 abrDlg.dispose();
1099 abrDlg = null;
1102 private void doEmail(){
1103 try{
1104 ////System.out.println("Erstelle Emailparameter.....");
1105 String smtphost = SystemConfig.hmEmailExtern.get("SmtpHost");
1106 //String pophost = SystemConfig.hmEmailExtern.get("Pop3Host");
1107 String authent = SystemConfig.hmEmailExtern.get("SmtpAuth");
1108 String benutzer = SystemConfig.hmEmailExtern.get("Username") ;
1109 String pass1 = SystemConfig.hmEmailExtern.get("Password");
1110 String sender = SystemConfig.hmEmailExtern.get("SenderAdresse");
1111 String secure = SystemConfig.hmEmailExtern.get("SmtpSecure");
1112 String useport = SystemConfig.hmEmailExtern.get("SmtpPort");
1113 //String recipient = "m.schuchmann@rta.de"+","+SystemConfig.hmEmailExtern.get("SenderAdresse");
1114 String recipient = ik_email+","+SystemConfig.hmEmailExtern.get("SenderAdresse");
1115 String text = "";
1116 boolean authx = (authent.equals("0") ? false : true);
1117 boolean bestaetigen = false;
1118 String[] encodedDat = {Reha.proghome+"edifact/"+Reha.aktIK+"/"+"esol0"+aktEsol,"esol0"+aktEsol};
1119 //String[] encodedDat = {Reha.proghome+"edifact/"+Reha.aktIK+"/"+"esol0"+aktEsol+".org","esol0"+aktEsol+".org"};
1120 String[] aufDat = {Reha.proghome+"edifact/"+Reha.aktIK+"/"+"esol0"+aktEsol+".auf","esol0"+aktEsol+".auf"};
1121 ArrayList<String[]> attachments = new ArrayList<String[]>();
1122 attachments.add(encodedDat);
1123 attachments.add(aufDat);
1124 EmailSendenExtern oMail = new EmailSendenExtern();
1125 try{
1126 ////System.out.println("Starte Emailversand.....");
1127 oMail.sendMail(smtphost, benutzer, pass1, sender, recipient, Reha.aktIK, text,attachments,authx,bestaetigen,secure,useport);
1128 oMail = null;
1129 ////System.out.println("Emailversand beendet.....");
1131 }catch(Exception e){
1132 e.printStackTrace( );
1133 JOptionPane.showMessageDialog(null, "Emailversand fehlgeschlagen\n\n"+
1134 "Mögliche Ursachen:\n"+
1135 "- falsche Angaben zu Ihrem Emailpostfach und/oder dem Provider\n"+
1136 "- Sie haben keinen Kontakt zum Internet");
1138 }catch(Exception ex){
1139 ex.printStackTrace();
1140 JOptionPane.showMessageDialog(null, "Emailversand fehlgeschlagen\n\n"+
1141 "Mögliche Ursachen:\n"+
1142 "- falsche Angaben zu Ihrem Emailpostfach und/oder dem Provider\n"+
1143 "- Sie haben keinen Kontakt zum Internet - Fehlermeldung:\n"+ex.getMessage());
1146 /********************************************************************/
1147 private void doLoescheRezepteAusTree(){
1148 try{
1149 int lang = aktuellerKassenKnoten.getChildCount();
1150 JXTTreeNode node;
1151 for(int i = (lang-1); i >= 0;i--){
1152 node = (JXTTreeNode) aktuellerKassenKnoten.getChildAt(i);
1153 if(node.knotenObjekt.fertig){
1154 //////System.out.println("Lösche KindKnoten an "+i);
1155 //aktuellerKassenKnoten.remove(node);
1156 treeModelKasse.removeNodeFromParent(node);
1159 if(aktuellerKassenKnoten.getChildCount() <= 0){
1160 //rootKasse.remove(aktuellerKassenKnoten);
1161 treeModelKasse.removeNodeFromParent(aktuellerKassenKnoten);
1163 treeKasse.validate();
1164 this.treeKasse.repaint();
1165 }catch(Exception ex){
1166 ex.printStackTrace();
1169 /***************************************************************/
1170 private void doUebertragen(){
1171 try{
1172 String aktiverPatient = "";
1173 JComponent patient = AktiveFenster.getFensterAlle("PatientenVerwaltung");
1174 if(patient != null){
1175 aktiverPatient = Reha.thisClass.patpanel.aktPatID;
1178 Vector<String> feldNamen = SqlInfo.holeFeldNamen("verordn",true,Arrays.asList(new String[] {"id"}) );
1179 ////System.out.println(feldNamen);
1181 rechnungBuf.setLength(0);
1182 rechnungBuf.trimToSize();
1183 rechnungBuf.append("select ");
1185 int rezepte = 0;
1186 int rezeptFelder = 0;
1187 for(int i = 0; i < feldNamen.size();i++){
1188 if(i > 0){
1189 rechnungBuf.append(","+feldNamen.get(i));
1190 }else{
1191 rechnungBuf.append(feldNamen.get(i));
1194 rechnungBuf.append(" from verordn where rez_nr='");
1195 Vector<Vector<String>> vec = null;
1196 rezepte = abgerechneteRezepte.size();
1197 for(int i2 = 0; i2 < rezepte;i2++){
1198 abrDlg.setzeLabel("übertrage Rezepte in Historie, übertrage Rezept: "+abgerechneteRezepte.get(i2));
1199 vec = SqlInfo.holeFelder(rechnungBuf.toString()+abgerechneteRezepte.get(i2)+"'");
1200 rezeptFelder = vec.get(0).size();
1201 historieBuf.setLength(0);
1202 historieBuf.trimToSize();
1203 historieBuf.append("insert into lza set ");
1204 for(int i3 = 0; i3 < rezeptFelder;i3++){
1205 if(!vec.get(0).get(i3).equals("")){
1206 if(i3 > 0){
1207 historieBuf.append(","+feldNamen.get(i3)+"='"+StringTools.Escaped(vec.get(0).get(i3))+"'");
1208 }else{
1209 historieBuf.append(feldNamen.get(i3)+"='"+StringTools.Escaped(vec.get(0).get(i3))+"'");
1213 //////System.out.println(historieBuf.toString());
1214 //////System.out.println("Übertrage Rezept "+abgerechneteRezepte.get(i2)+" in Langzeitarchiv = Historie");
1216 SqlInfo.sqlAusfuehren(historieBuf.toString());
1219 /***
1222 * In der Echtfunktion muß das Löschen in der rezept-Datenbank eingeschaltet werden
1223 * und das sofortige Löschen aus der Historie auscheschaltet werden
1228 //SqlInfo.sqlAusfuehren("delete from lza where rez_nr='"+abgerechneteRezepte.get(i2)+"' LIMIT 1");
1229 String delrez = String.valueOf(abgerechneteRezepte.get(i2));
1230 SqlInfo.sqlAusfuehren("delete from fertige where rez_nr='"+delrez+"' LIMIT 1");
1231 SqlInfo.sqlAusfuehren("delete from verordn where rez_nr='"+delrez+"' LIMIT 1");
1232 SqlInfo.sqlAusfuehren("delete from volle where rez_nr='"+delrez+"'");
1233 if(aktiverPatient.equals(abgerechnetePatienten.get(i2)) ){
1234 posteAktualisierung(aktiverPatient.toString());
1235 //Reha.thisClass.patpanel.aktRezept.setzeKarteiLasche();
1240 }catch(Exception ex){
1241 ex.printStackTrace();
1244 private void posteAktualisierung(String patid){
1245 final String xpatid = patid;
1246 new SwingWorker<Void,Void>(){
1247 @Override
1248 protected Void doInBackground() throws Exception {
1249 String s1 = String.valueOf("#PATSUCHEN");
1250 String s2 = xpatid;
1251 PatStammEvent pEvt = new PatStammEvent(getInstance());
1252 pEvt.setPatStammEvent("PatSuchen");
1253 pEvt.setDetails(s1,s2,"") ;
1254 PatStammEventClass.firePatStammEvent(pEvt);
1255 return null;
1258 }.execute();
1260 /***************************************************************/
1261 private int doVerschluesseln(String datei){
1262 try {
1263 String keystore = Reha.proghome+"keystore/"+Reha.aktIK+"/"+Reha.aktIK+".p12";
1265 NebraskaKeystore store = new NebraskaKeystore(keystore, SystemConfig.hmAbrechnung.get("hmkeystorepw"),"123456", Reha.aktIK);
1266 //NebraskaKeystore store = new NebraskaKeystore(keystore, "123456","123456", Reha.aktIK);
1267 NebraskaEncryptor encryptor = store.getEncryptor(ik_nutzer);
1268 String inFile = Reha.proghome+"edifact/"+Reha.aktIK+"/"+"esol0"+aktEsol+".org";
1269 long size = encryptor.encrypt(inFile, inFile.replace(".org", ""));
1270 return Integer.parseInt(Long.toString(size));
1271 } catch (NebraskaCryptoException e) {
1272 e.printStackTrace();
1273 } catch (NebraskaFileException e) {
1274 e.printStackTrace();
1275 } catch (NebraskaNotInitializedException e) {
1276 e.printStackTrace();
1278 return -1;
1280 /***************************************************************/
1281 private void doAuftragsDatei(int originalSize,int encryptedSize){
1282 auftragsBuf.append("500000"+"01"+"00000348"+"000");
1283 auftragsBuf.append("ESOL0"+aktEsol);
1284 auftragsBuf.append(" ");
1285 auftragsBuf.append(StringTools.fuelleMitZeichen(Reha.aktIK, " ", false, 15));
1286 auftragsBuf.append(StringTools.fuelleMitZeichen(Reha.aktIK, " ", false, 15));
1287 auftragsBuf.append(StringTools.fuelleMitZeichen(ik_nutzer, " ", false, 15));
1288 auftragsBuf.append(StringTools.fuelleMitZeichen(ik_physika, " ", false, 15));
1289 auftragsBuf.append("000000");
1290 auftragsBuf.append("000000");
1291 auftragsBuf.append(abrDateiName);
1292 auftragsBuf.append(getEdiDatumFromDeutsch(DatFunk.sHeute())+getEdiTimeString(true));
1293 auftragsBuf.append(StringTools.fuelleMitZeichen("0", "0", false, 14));
1294 auftragsBuf.append(StringTools.fuelleMitZeichen("0", "0", false, 14));
1295 auftragsBuf.append(StringTools.fuelleMitZeichen("0", "0", false, 14));
1296 auftragsBuf.append("000000");
1297 auftragsBuf.append("0");
1298 auftragsBuf.append(StringTools.fuelleMitZeichen(Integer.toString(originalSize), "0", true, 12) );
1299 auftragsBuf.append(StringTools.fuelleMitZeichen(Integer.toString(encryptedSize), "0", true, 12) );
1300 auftragsBuf.append("I800");
1301 auftragsBuf.append("0303");
1302 auftragsBuf.append(" ");
1303 auftragsBuf.append(StringTools.fuelleMitZeichen("0", "0", true, 5) );
1304 auftragsBuf.append(StringTools.fuelleMitZeichen("0", "0", true, 8) );
1305 auftragsBuf.append("0");
1306 auftragsBuf.append("00");
1307 auftragsBuf.append("0");
1308 auftragsBuf.append(StringTools.fuelleMitZeichen("0", "0", true, 10) );
1309 auftragsBuf.append(StringTools.fuelleMitZeichen("0", "0", true, 6) );
1310 auftragsBuf.append(StringTools.fuelleMitZeichen(" ", " ", true, 28) );
1311 auftragsBuf.append(StringTools.fuelleMitZeichen(" ", " ", true, 44) );
1312 auftragsBuf.append(StringTools.fuelleMitZeichen(" ", " ", true, 30) );
1313 rlisteesol = String.valueOf(aktEsol); //aktEsol.toString();
1314 rlistekasse = String.valueOf(getAbrechnungKasse());
1316 /*************************************************/
1317 private void macheEndeDaten(){
1318 String zeilenzahl = StringTools.fuelleMitZeichen(Integer.toString(positionenAnzahl+4), "0", true, 6);
1319 unzBuf.append("UNT"+plus+zeilenzahl+plus+"00002"+EOL);
1320 unzBuf.append("UNZ"+plus+"000002"+plus+aktDfue+EOL);
1323 /***************************************************************/
1325 private void macheKopfDaten(){
1326 //aktRechnung = Integer.toString(SqlInfo.erzeugeNummer("rnr"));
1327 new SwingWorker<Void,Void>(){
1328 @Override
1329 protected Void doInBackground() throws Exception {
1330 //hmAnnahme = holeAdresseAnnahmestelle();
1331 if(!annahmeAdresseOk){
1332 long zeit = System.currentTimeMillis();
1333 while(!annahmeAdresseOk){
1334 Thread.sleep(50);
1335 if(System.currentTimeMillis()-zeit > 5000){
1336 JOptionPane.showMessageDialog(null,"Adresse der Annahmestelle konnte nicht ermittelt werden");
1337 break;
1342 if(abrDruck != null){
1343 abrDruck.setIKundRnr(ik_papier, aktRechnung,hmAnnahme);
1344 abrDruck = null;
1345 }else{
1346 JOptionPane.showMessageDialog(null, "Fehler im Rechnungsdruck - Fehler = abrDruck==null");
1348 try{
1349 rezepteUebertragen();
1350 rechnungAnlegen();
1351 }catch(Exception ex){
1352 ex.printStackTrace();
1353 JOptionPane.showMessageDialog(null, "Fehler im Modul Rezept übertragen und Rechnung anlegen\n"+ex.getMessage());
1355 if(abrechnungsModus.equals(ABR_MODE_302)){
1356 try{
1357 Thread.sleep(100);
1358 new BegleitzettelDrucken(getInstance(),abrechnungRezepte,ik_kostent,name_kostent,hmAnnahme, aktRechnung,Reha.proghome+"vorlagen/"+Reha.aktIK+"/"+SystemConfig.hmAbrechnung.get("hmgkvbegleitzettel"));
1359 }catch(Exception ex){
1360 JOptionPane.showMessageDialog(null, "Fehler im Modul BegleitzettlDrucken - Fehler-Exception: ex\n"+ex.getMessage());
1363 return null;
1365 }.execute();
1366 //////System.out.println(aktEsol + " - "+aktDfue);
1367 unbBuf.append("UNB+UNOC:3+"+Reha.aktIK+plus+ik_nutzer+plus);
1368 unbBuf.append(getEdiDatumFromDeutsch(DatFunk.sHeute())+":"+getEdiTimeString(false)+plus);
1369 unbBuf.append(aktDfue+plus+"B"+plus);
1370 abrDateiName = "SL"+Reha.aktIK.substring(2,8)+"S"+getEdiMonat();
1371 unbBuf.append(abrDateiName+plus);
1372 unbBuf.append("2"+EOL);
1373 //unbBuf.append(aktDfue+plus+"B"+plus+"SL"+Reha.aktIK.substring(2,8)+"S"+getEdiMonat()+plus+"2"+EOL);
1375 unbBuf.append("UNH+00001+SLGA:"+SlgaVersion+":0:0"+EOL);
1376 unbBuf.append("FKT+01"+plus+plus+Reha.aktIK+plus+ik_kostent+plus+ik_kasse+plus+Reha.aktIK+EOL);
1377 unbBuf.append("REC"+plus+aktRechnung+":0"+plus+getEdiDatumFromDeutsch(DatFunk.sHeute())+plus+"1"+EOL);
1378 unbBuf.append("UST"+plus+SystemConfig.hmFirmenDaten.get("Steuernummer")+plus+"J"+EOL);
1379 unbBuf.append("GES"+plus+"00"+plus+dfx.format(preis00[0])+plus+dfx.format(preis00[1])+plus+dfx.format(preis00[2])+EOL);
1380 unbBuf.append("GES"+plus+"11"+plus+dfx.format(preis11[0])+plus+dfx.format(preis11[1])+plus+dfx.format(preis11[2])+EOL);
1381 unbBuf.append("GES"+plus+"31"+plus+dfx.format(preis31[0])+plus+dfx.format(preis31[1])+plus+dfx.format(preis31[2])+EOL);
1382 unbBuf.append("GES"+plus+"51"+plus+dfx.format(preis51[0])+plus+dfx.format(preis51[1])+plus+dfx.format(preis51[2])+EOL);
1383 unbBuf.append("NAM"+plus+
1384 (SystemConfig.hmFirmenDaten.get("Ikbezeichnung").length() > 30 ?
1385 SystemConfig.hmFirmenDaten.get("Ikbezeichnung").substring(0,30) :
1386 SystemConfig.hmFirmenDaten.get("Ikbezeichnung") )+plus+
1387 SystemConfig.hmFirmenDaten.get("Anrede").trim()+" "+
1388 (SystemConfig.hmFirmenDaten.get("Nachname").trim().length() > 25 ?
1389 SystemConfig.hmFirmenDaten.get("Nachname").trim().substring(0,25) :
1390 SystemConfig.hmFirmenDaten.get("Nachname").trim() )+
1391 plus+SystemConfig.hmFirmenDaten.get("Telefon")+EOL);
1392 unbBuf.append("UNT+000010+00001"+EOL);
1393 unbBuf.append("UNH+00002+SLLA:"+SllaVersion+":0:0"+EOL);
1394 unbBuf.append("FKT+01"+plus+plus+Reha.aktIK+plus+ik_kostent+plus+ik_kasse+EOL);
1395 unbBuf.append("REC"+plus+aktRechnung+":0"+plus+getEdiDatumFromDeutsch(DatFunk.sHeute())+plus+"1"+EOL);
1396 getEdiTimeString(false);
1399 /***************************************************************/
1401 AbrechnungGKV getInstance(){
1402 return this;
1405 /***************************************************************/
1407 private String holeNameKostentraeger(){
1408 Vector<Vector<String>> vec = SqlInfo.holeFelder("select name1 from ktraeger where ikkasse ='"+ik_kostent+"' LIMIT 1");
1409 if(vec.size()==0){
1410 return "";
1412 return vec.get(0).get(0);
1415 private void holeAlleKostentraegerDaten(){
1416 abzurechnendeKassenID = getAktKTraeger();
1417 String preisgr = getPreisgruppenKuerzel(aktDisziplin);
1418 String cmd = "select ik_kasse,ik_kostent,ik_nutzer,ik_physika,ik_papier,"+preisgr+" from kass_adr where ik_kasse='"+abzurechnendeKassenID+"' LIMIT 1";
1419 kassenIKs.clear();
1420 kassenIKs = SqlInfo.holeFelder(cmd);
1421 ////System.out.println(cmd);
1422 if(kassenIKs.size()<=0){
1423 Reha.thisClass.progressStarten(false);
1424 abrDlg.setVisible(false);
1425 abrDlg.dispose();
1426 abrDlg = null;
1427 JOptionPane.showMessageDialog(null, "Fehler - Daten der Krankenkasse konnten nicht ermittelt werden");
1428 return;
1430 ik_kasse = kassenIKs.get(0).get(0);
1431 ik_kostent = kassenIKs.get(0).get(1);
1432 ik_nutzer = kassenIKs.get(0).get(2);
1433 ik_physika = kassenIKs.get(0).get(3);
1434 ik_papier = kassenIKs.get(0).get(4);
1435 ik_email = SqlInfo.holeEinzelFeld("select email from ktraeger where ikkasse='"+ik_physika+"' LIMIT 1");
1436 preisVector = RezTools.holePreisVector(diszis[cmbDiszi.getSelectedIndex()],Integer.parseInt(kassenIKs.get(0).get(5))-1);
1437 name_kostent = holeNameKostentraeger();
1438 String test = "IK der Krankenkasse: "+ik_kasse+"\n"+
1439 "IK des Kostenträgers: "+ik_kostent+"\n"+
1440 "IK des Nutzer mit EntschlüsselungsbefungnisKostenträgers: "+ik_nutzer+"\n"+
1441 "IK der Datenannahmestelle: "+ik_physika+"\n"+
1442 "IK der Papierannahmestelle: "+ik_papier+"\n"+
1443 "Emailadresse der Datenannahmestelle: "+ik_email+"\n"+
1444 "Name des Kostenträgers: "+name_kostent;
1447 /***************************************************************/
1449 private HashMap<String,String> holeAdresseAnnahmestelle(boolean nach302){
1450 HashMap<String,String> hmAdresse = new HashMap<String,String>();
1451 String[] hmKeys = {"<gkv1>","<gkv2>","<gkv3>","<gkv4>","<gkv5>","<gkv6>"};
1452 if(nach302){
1453 Vector<Vector<String>> vec = SqlInfo.holeFelder("select kassen_nam1,kassen_nam2,strasse,plz,ort from kass_adr where ik_kasse ='"+ik_papier+"' LIMIT 1");
1454 if(vec.size()==0){
1455 vec = SqlInfo.holeFelder("select name1,name2,adresse3,adresse1,adresse2 from ktraeger where ikkasse ='"+ik_papier+"' LIMIT 1");
1456 if(vec.size()==0){
1457 for(int i = 0; i < hmKeys.length-1;i++){
1458 hmAdresse.put(hmKeys[i], "");
1460 hmAdresse.put(hmKeys[5],aktRechnung);
1461 JOptionPane.showMessageDialog(null,"Achtung Daten für die Papierannahmestelle konnt nicht ermittelt werden (vermutlich wieder mal AOK....)!\n\nBitte die Daten von Hand auf den Ausdrucken eintragen");
1462 return hmAdresse;
1465 hmAdresse.put(hmKeys[0],vec.get(0).get(0) );
1466 hmAdresse.put(hmKeys[1],vec.get(0).get(1) );
1467 hmAdresse.put(hmKeys[2],vec.get(0).get(2) );
1468 hmAdresse.put(hmKeys[3],vec.get(0).get(3)+" "+vec.get(0).get(4));
1469 hmAdresse.put(hmKeys[4],"");
1470 hmAdresse.put(hmKeys[5],aktRechnung);
1471 return hmAdresse;
1472 }else{
1473 hmAdresse.put(hmKeys[0],hmAlternativeKasse.get("<Ivnam1>") );
1474 hmAdresse.put(hmKeys[1],hmAlternativeKasse.get("<Ivnam2>") );
1475 hmAdresse.put(hmKeys[2],hmAlternativeKasse.get("<Ivstrasse>") );
1476 hmAdresse.put(hmKeys[3],hmAlternativeKasse.get("<Ivplz>")+" "+hmAlternativeKasse.get("<Ivort>"));
1477 hmAdresse.put(hmKeys[4],"");
1478 hmAdresse.put(hmKeys[5],aktRechnung);
1480 return hmAdresse;
1483 /***************************************************************/
1485 private Double[] setzePreiseAufNull(Double[] preis){
1486 preis[0] = 0.00;
1487 preis[1] = 0.00;
1488 preis[2] = 0.00;
1489 return preis;
1491 private String getEdiMonat(){
1492 String tag = DatFunk.sHeute();
1493 return tag.substring(3,5);
1495 private String getEdiDatumFromDeutsch(String deutschDat){
1496 if(deutschDat.trim().length()<10){
1497 return "";
1499 return deutschDat.substring(6)+deutschDat.substring(3,5)+deutschDat.substring(0,2);
1501 private String getEdiTimeString(boolean mitsekunden){
1502 Date date = new Date();
1503 String[] datesplit = date.toString().split(" ");
1504 //////System.out.println(date.toString());
1505 if(mitsekunden){
1506 //////System.out.println("Zeit mit Sekunden"+datesplit[3].substring(0,2)+datesplit[3].substring(3,5)+datesplit[3].substring(6,8));
1507 return datesplit[3].substring(0,2)+datesplit[3].substring(3,5)+datesplit[3].substring(6,8);
1509 return datesplit[3].substring(0,2)+datesplit[3].substring(3,5);
1513 /***************************************************************/
1515 private void holeEdifact(){
1516 try {
1517 if(SystemConfig.hmAbrechnung.get("hmgkvrauchdrucken").equals("1")){
1518 abrDruck = new AbrechnungDrucken(this,Reha.proghome+
1519 "vorlagen/"+
1520 Reha.aktIK+
1521 "/"+
1522 SystemConfig.hmAbrechnung.get("hmgkvformular"));
1525 } catch (Exception e) {
1526 JOptionPane.showMessageDialog(null,"Fehler im Modul Rechnungdruck in AbrechnungGKV.java");
1527 abrDruck = null;
1528 e.printStackTrace();
1530 int lang = aktuellerKassenKnoten.getChildCount();
1531 JXTTreeNode node;
1532 Vector<Vector<String>> vec;
1533 for(int i = 0; i < lang;i++){
1534 node = (JXTTreeNode) aktuellerKassenKnoten.getChildAt(i);
1535 if(node.knotenObjekt.fertig){
1536 vec = SqlInfo.holeFelder("select edifact from fertige where rez_nr='"+(String) node.knotenObjekt.rez_num+"'");
1537 //abrDlg.setzeLabel("Edifact-Daten holen von Rezept:"+(String) node.knotenObjekt.rez_num);
1538 try{
1539 if(!annahmeAdresseOk){
1540 long zeit = System.currentTimeMillis();
1541 while(!annahmeAdresseOk){
1542 Thread.sleep(50);
1543 if(System.currentTimeMillis()-zeit > 5000){
1544 JOptionPane.showMessageDialog(null,"Adresse der Annahmestelle konnte nicht ermittelt werden");
1545 break;
1549 Thread.sleep(75);
1550 //abzurechnendeKassenID = holeAbrechnungsKasse(vec.get(0).get(0));
1551 abgerechneteRezepte.add((String) node.knotenObjekt.rez_num);
1552 abgerechnetePatienten.add((String) node.knotenObjekt.pat_intern);
1553 //hier den Edifact-Code analysieren und die Rechnungsdatei erstellen;
1554 try{
1555 analysierenEdifact(vec.get(0).get(0),(String) node.knotenObjekt.rez_num);
1556 }catch(Exception ex){
1557 ex.printStackTrace();
1558 JOptionPane.showMessageDialog(null,"Unbekannter Fehler bei Edifact analysierenEdifact()\n"+ex.getLocalizedMessage());
1561 try{
1562 anhaengenEdifact(vec.get(0).get(0));
1563 }catch(Exception ex){
1564 JOptionPane.showMessageDialog(null,"Unbekannter Fehler bei Edifact anhaengenEdifact()\n"+ex.getLocalizedMessage());
1567 }catch(Exception ex){
1568 JOptionPane.showMessageDialog(null,"Unbekannter Fehler bei Edifact anhängen");
1572 if(abgerechneteRezepte.size() > 0){
1573 /**************Hier den offenen Posten anlegen***************/
1574 abrDlg.setzeLabel("Offene Posten anlegen für Rechnung Nr.: "+aktRechnung );
1575 ////System.out.println(" abgerechnete Rezepte = "+abgerechneteRezepte);
1576 ////System.out.println("abgerechnete Patienten = "+abgerechnetePatienten);
1577 ////System.out.println("abger. Bruttovolumen = "+preis00[1]);
1578 ////System.out.println(" abger. Rezeptanteil = "+preis00[2]);
1579 ////System.out.println(" abger. Nettovolumen = "+preis00[0]);
1580 ////System.out.println("Name der abger. Kasse = "+name_kostent);
1581 ////System.out.println(" IK-Kostenträger = "+ik_kostent);
1582 ////System.out.println(" Disziplin = "+diszis[cmbDiszi.getSelectedIndex()]);
1583 ////System.out.println(" Rechnung Nr. = "+aktRechnung);
1584 if(Reha.vollbetrieb){
1585 anlegenOP();
1591 /***************************************************************/
1593 private void anlegenOP(){
1594 /************************************************/
1595 rechnungBuf.setLength(0);
1596 rechnungBuf.trimToSize();
1597 rechnungBuf.append("insert into rliste set ");
1598 rechnungBuf.append("r_nummer='"+aktRechnung+"', ");
1599 rechnungBuf.append("r_datum='"+DatFunk.sDatInSQL(DatFunk.sHeute())+"', ");
1600 rechnungBuf.append("r_kasse='"+hmKostentraeger.get("name1")+", "+"esol0"+hmKostentraeger.get("aktesol")+"', ");
1601 rechnungBuf.append("r_klasse='"+diszis[cmbDiszi.getSelectedIndex()]+"', ");
1602 rechnungBuf.append("r_betrag='"+dfx.format(preis00[0]).replace(",", ".")+"', ");
1603 rechnungBuf.append("r_offen='"+dfx.format(preis00[0]).replace(",", ".")+"', ");
1604 rechnungBuf.append("r_zuzahl='"+dfx.format(preis00[2]).replace(",", ".")+"', ");
1605 rechnungBuf.append("ikktraeger='"+ik_kostent+"',");
1606 rechnungBuf.append("ik='"+Reha.aktIK+"'");
1607 SqlInfo.sqlAusfuehren(rechnungBuf.toString());
1610 /***************************************************************/
1612 private void analysierenEdifact(String edifact,String rez_num){
1613 //////System.out.println(edifact);
1614 Vector<String> position = new Vector<String>();
1615 Vector<BigDecimal>anzahl = new Vector<BigDecimal>();
1616 Vector<BigDecimal>preis = new Vector<BigDecimal>();
1617 Vector<BigDecimal>einzelpreis = new Vector<BigDecimal>();
1618 Vector<BigDecimal>einzelzuzahlung = new Vector<BigDecimal>();
1619 Vector<BigDecimal>rezgeb = new Vector<BigDecimal>();
1620 Vector<BigDecimal>abrtage = new Vector<BigDecimal>();
1621 BigDecimal bdAnzahl = null;
1622 BigDecimal einzelPreisTest = null;
1623 //BigDecimal zuzahlTest = null;
1624 String[] zeilen = edifact.split("\n");
1625 boolean preisUmstellung = false;
1626 boolean zuzahlUmstellung = false;
1627 String[] woerter;
1628 String dummy;
1629 int pos = 0;
1630 for(int i = 0; i < zeilen.length;i++){
1631 if(zeilen[i].startsWith("EHE+")){
1632 woerter = zeilen[i].split("\\+");
1633 if(!position.contains(woerter[2])){
1634 position.add(woerter[2]);
1635 bdAnzahl = BigDecimal.valueOf(Double.valueOf(woerter[3].replace(",", ".")));
1636 anzahl.add(bdAnzahl);
1637 abrtage.add(BigDecimal.valueOf(Double.valueOf("1.00")));
1638 preis.add(BigDecimal.valueOf(Double.valueOf(woerter[4].replace(",", "."))).multiply(
1639 bdAnzahl ));
1640 if(woerter.length==7){
1641 //Einstieg2 für Kilometer
1642 dummy = woerter[6].replace("'", "").replace(",", ".");
1643 if(zuzahlModusDefault){
1644 rezgeb.add(BigDecimal.valueOf(Double.valueOf(dummy)));
1645 einzelzuzahlung.add(BigDecimal.valueOf(Double.valueOf(dummy)));
1646 }else{
1648 System.out.println("Dummy = "+dummy);
1649 System.out.println("Muliplikator = "+bdAnzahl);
1651 //Herr Lehmann: nächste Zeile muß freigeschaltet werden für Einzelkilometer
1652 rezgeb.add(BigDecimal.valueOf(Double.valueOf(dummy)).multiply(bdAnzahl));
1653 //Herr Lehmann: nächste Zeile muß freigeschaltet werden für Einzelkilometer
1654 einzelzuzahlung.add(BigDecimal.valueOf(Double.valueOf(dummy)).multiply(bdAnzahl));
1656 }else{
1657 rezgeb.add(BigDecimal.valueOf(Double.valueOf("0.00")));
1658 einzelzuzahlung.add(BigDecimal.valueOf(Double.valueOf("0.00")));
1661 einzelpreis.add(BigDecimal.valueOf(Double.valueOf(woerter[4].replace(",", "."))));
1663 }else{
1664 pos = position.indexOf(woerter[2]);
1665 einzelPreisTest = BigDecimal.valueOf(Double.valueOf(woerter[4].replace(",", ".")));
1666 if(!einzelPreisTest.equals(einzelpreis.get(pos))){
1667 preisUmstellung = true;
1669 bdAnzahl = BigDecimal.valueOf(Double.valueOf(woerter[3].replace(",", ".")));
1670 anzahl.set(pos, anzahl.get(pos).add(BigDecimal.valueOf(Double.valueOf(woerter[3].replace(",", ".")))));
1671 preis.set(pos, preis.get(pos).add(BigDecimal.valueOf(Double.valueOf(woerter[4].replace(",", "."))).multiply(
1672 bdAnzahl)));
1673 abrtage.set(pos,abrtage.get(pos).add(BigDecimal.valueOf(Double.valueOf("1.00"))));
1674 if(woerter.length==7){
1675 //Einstieg3 für Kilometer
1676 dummy = woerter[6].replace("'", "").replace(",", ".");
1677 if(zuzahlModusDefault){
1678 rezgeb.set(pos,rezgeb.get(pos).add(BigDecimal.valueOf(Double.valueOf(dummy))));
1679 if(! BigDecimal.valueOf(Double.valueOf(dummy)).equals(einzelzuzahlung.get(pos))){
1680 zuzahlUmstellung = true;
1682 }else{
1683 //Herr Lehmann: nächste Zeile muß freigeschaltet werden für Einzelkilometer
1685 System.out.println("Dummy = "+dummy);
1686 System.out.println("Muliplikator (falsch) = "+anzahl.get(pos));
1687 System.out.println("Muliplikator (richtig) = "+bdAnzahl);
1689 rezgeb.set(pos,rezgeb.get(pos).add(BigDecimal.valueOf(Double.valueOf(dummy)).multiply(bdAnzahl)));
1690 //Herr Lehmann: nächste Zeile muß freigeschaltet werden für Einzelkilometer
1691 if(! BigDecimal.valueOf(Double.valueOf(dummy)).multiply(bdAnzahl).equals(einzelzuzahlung.get(pos))){
1692 zuzahlUmstellung = true;
1695 rezgeb.set(pos,rezgeb.get(pos).add(BigDecimal.valueOf(Double.valueOf(dummy)).multiply(anzahl.get(pos))));
1696 if(! BigDecimal.valueOf(Double.valueOf(dummy)).multiply(bdAnzahl).equals(einzelzuzahlung.get(pos))){
1697 zuzahlUmstellung = true;
1701 }else{
1702 //System.out.println("Keine Zuzahlung Dummy = ");
1703 //System.out.println("Keine Zuzahlung Muliplikator = "+anzahl.get(pos));
1704 rezgeb.set(pos,rezgeb.get(pos).add(BigDecimal.valueOf(Double.valueOf("0.00"))));
1705 if(!BigDecimal.valueOf(Double.valueOf("0.00")).equals(einzelzuzahlung.get(pos))){
1706 //////System.out.println("Einzelzuzahlung = "+einzelzuzahlung.get(pos));
1707 //////System.out.println("Vergleichswert = 0.00 ");
1708 zuzahlUmstellung = true;
1709 //System.out.println("Umstellung der Zuzahlung = "+zuzahlUmstellung);
1714 try {
1715 Thread.sleep(15);
1716 } catch (InterruptedException e) {
1717 e.printStackTrace();
1718 JOptionPane.showMessageDialog(null,"Fehler in Thread.sleep(25) analysierenEdifact\n"+e.getMessage());
1721 String[] splits = zeilen[0].split(":");
1723 try {
1724 abrechnungRezepte++;
1725 if(abrDruck != null){
1726 abrDruck.setDaten(splits[9].split("=")[1],
1727 splits[10].split("=")[1],
1728 splits[2].split("=")[1],
1729 position,
1730 anzahl,
1731 abrtage,
1732 einzelpreis,
1733 preis,
1734 rezgeb,
1735 (splits[6].split("=")[1].equals("10,00") ? true : false));
1738 ////System.out.println(" Rezept Nr. ="+abrechnungRezepte+" ********Abrechnungsposition Anfang********");
1739 ////System.out.println(" Name = "+splits[9].split("=")[1]);
1740 ////System.out.println(" Status = "+splits[10].split("=")[1]);
1741 ////System.out.println(" RezeptNr. = "+splits[2].split("=")[1]);
1742 ////System.out.println(" Positionen Vector = "+position);
1743 ////System.out.println(" Anzahl Vector = "+anzahl);
1744 ////System.out.println(" Abr.tage Vector = "+abrtage);
1745 ////System.out.println(" Einzelpreis Vector = "+einzelpreis);
1746 ////System.out.println(" Kummulierte Preise = "+preis);
1747 ////System.out.println(" Kummulierte Zuzahl.= "+rezgeb);
1748 ////System.out.println(" Zuzahlungen einzel = "+einzelzuzahlung);
1749 ////System.out.println(" mit Pauschale = "+(splits[6].split("=")[1].equals("10,00") ? true : false));
1750 ////System.out.println("mit Preisumstellung = "+preisUmstellung);
1751 ////System.out.println(" mit Zuzahlwechsel = "+zuzahlUmstellung);
1752 ////System.out.println("bislang abgerechnet = "+abgerechneteRezepte);
1753 ////System.out.println(" Rechnungsadresse = "+hmAnnahme);
1754 ////System.out.println("Rezept Nr. ="+abrechnungRezepte+" ********Abrechnungsposition Ende********");
1756 /////////////////Hier die Sätze in der Rechnungsdatei anlegen///////////////
1757 if(Reha.vollbetrieb){
1758 schreibeInRechnungDB(
1759 splits,
1760 position,
1761 anzahl,
1762 abrtage,
1763 einzelpreis,
1764 preis,
1765 rezgeb,
1766 preisUmstellung,
1767 zuzahlUmstellung);
1770 } catch (Exception e) {
1771 e.printStackTrace();
1775 /***************************************************************/
1777 private void schreibeInRechnungDB(
1778 String[] kopf,
1779 Vector<String> positionen,
1780 Vector<BigDecimal>anzahl,
1781 Vector<BigDecimal>abrtage,
1782 Vector<BigDecimal>einzelpreis,
1783 Vector<BigDecimal>preis,
1784 Vector<BigDecimal>rezgeb,
1785 boolean preisUmstellung,
1786 boolean zuzahlUmstellung){
1787 try{
1788 if(hmAnnahme.get("<gkv1>").trim().equals("")){
1789 holeAdresseAnnahmestelle(true);
1791 }catch(Exception ex){
1792 holeAdresseAnnahmestelle(true);
1794 abrDlg.setzeLabel("Rechnungssatz erstellen für Rezept: "+kopf[2].split("=")[1]);
1795 String cmdKopf = "insert into faktura set ";
1796 for(int i = 0; i< positionen.size();i++){
1797 rechnungBuf.setLength(0);
1798 rechnungBuf.trimToSize();
1799 rechnungBuf.append(cmdKopf);
1800 if(i==0){
1801 rechnungBuf.append("kassen_nam='"+hmAnnahme.get("<gkv1>")+"', ");
1802 rechnungBuf.append("kassen_na2='"+hmAnnahme.get("<gkv2>")+"', ");
1803 rechnungBuf.append("strasse='"+hmAnnahme.get("<gkv3>")+"', ");
1804 try{
1805 rechnungBuf.append("plz='"+hmAnnahme.get("<gkv4>").split(" ")[0]+"', ");
1806 rechnungBuf.append("ort='"+hmAnnahme.get("<gkv4>").split(" ")[1]+"', ");
1807 rechnungBuf.append("name='"+kopf[9].split("=")[1]+"', ");
1808 }catch(Exception ex){
1809 JOptionPane.showMessageDialog(null, "Fehler in der Adressaufbereitung - Tabelle=Faktura");
1810 ex.printStackTrace();
1813 rechnungBuf.append("lfnr='"+Integer.toString(i)+"', ");
1814 rechnungBuf.append("status='"+ kopf[10].split("=")[1]+"', ");
1815 rechnungBuf.append("pos_kas='"+ positionen.get(i) +"', ");
1816 rechnungBuf.append("pos_int='"+ RezTools.getIDFromPos(positionen.get(i),kopf[0].split("=")[1] ,preisVector) +"', ");
1817 rechnungBuf.append("anzahl='"+ Integer.toString(anzahl.get(i).intValue()) +"', ");
1818 rechnungBuf.append("anzahltage='"+ Integer.toString(abrtage.get(i).intValue()) +"', ");
1819 rechnungBuf.append("preis='"+ dfx.format(einzelpreis.get(i).doubleValue()).replace(",", ".") +"', ");
1820 rechnungBuf.append("gesamt='"+ dfx.format(preis.get(i).doubleValue()).replace(",", ".") +"', ");
1821 rechnungBuf.append("zzbetrag='"+ dfx.format(rezgeb.get(i).doubleValue()).replace(",", ".") +"', ");
1822 rechnungBuf.append("netto='"+ dfx.format((preis.get(i).subtract(rezgeb.get(i))).doubleValue()).replace(",", ".") +"', ");
1823 rechnungBuf.append("pauschale='"+ kopf[6].split("=")[1].replace(",", ".") +"', ");
1824 rechnungBuf.append("rez_nr='"+ kopf[2].split("=")[1] +"', ");
1825 if(! anzahl.get(i).equals(abrtage.get(i))){
1826 rechnungBuf.append("kilometer='"+ dfx.format((anzahl.get(i).divide(abrtage.get(i)).doubleValue())).replace(",",".") +"', ");
1828 rechnungBuf.append("rezeptart='0', ");
1829 rechnungBuf.append("pat_intern='"+kopf[1].split("=")[1]+"', ");
1830 rechnungBuf.append("rnummer='"+ aktRechnung +"', ");
1831 rechnungBuf.append("kassid='"+kopf[7].split("=")[1]+"', ");
1832 rechnungBuf.append("arztid='"+kopf[8].split("=")[1]+"', ");
1833 rechnungBuf.append("zzindex='"+ kopf[12].split("=")[1] +"', ");
1834 rechnungBuf.append("preisdiff='"+ (preisUmstellung ? "T" : "F") +"', ");
1835 rechnungBuf.append("zuzahldiff='"+ (zuzahlUmstellung ? "T" : "F") +"', ");
1836 rechnungBuf.append("disziplin='"+ kopf[2].split("=")[1].subSequence(0, 2) +"', ");
1837 rechnungBuf.append("rdatum='"+ DatFunk.sDatInSQL(DatFunk.sHeute()) +"',");
1838 rechnungBuf.append("ik='"+ Reha.aktIK +"'");
1839 SqlInfo.sqlAusfuehren(rechnungBuf.toString());
1844 /***************************************************************/
1846 private String holeAbrechnungsKasse(String edifact){
1847 String[] komplett = edifact.split("\n");
1848 String[] zeile1 = komplett[0].split(":");
1849 return zeile1[7].split("=")[1];
1852 /*************************************************/
1853 private void anhaengenEdifact(String string){
1854 String[] edi = string.split("\n");
1855 //String[] preise = edi[0].split(":");
1856 String status = "";
1857 try{
1858 status = edi[4].split("\\+")[2];
1859 }catch(Exception ex){
1860 status = "10001";
1862 for(int i = 4; i < edi.length;i++){
1863 positionenBuf.append(edi[i]+System.getProperty("line.separator") );
1864 positionenAnzahl++;
1866 try {
1867 Thread.sleep(50);
1868 } catch (InterruptedException e) {
1869 e.printStackTrace();
1871 if(status.startsWith("1")){
1872 preis11 = addierePreise(preis11,edi[edi.length-1]);
1873 }else if(status.startsWith("3")){
1874 preis31 = addierePreise(preis31,edi[edi.length-1]);
1875 }else if(status.startsWith("5")){
1876 preis51 = addierePreise(preis51,edi[edi.length-1]);
1879 /*************************************************/
1880 private Double[] addierePreise(Double[] preis,String zeile){
1881 String[] zahlen = zeile.split("\\+");
1882 Double brutto = Double.parseDouble(zahlen[1].replace(",", "."));
1883 Double zuzahl = Double.parseDouble(zahlen[2].replace(",", "."));
1884 preis[1] = preis[1]+ brutto;
1885 preis[2] = preis[2]+ zuzahl;
1886 preis[0] = preis[0] + (brutto-zuzahl);
1887 preis00[0] = preis00[0] + (brutto-zuzahl);
1888 preis00[1] = preis00[1] + (brutto);
1889 preis00[2] = preis00[2] + (zuzahl);
1890 return preis;
1892 /*************************************************/
1893 public boolean isRezeptSelected(){
1894 if(treeKasse.getSelectionCount()<=0){
1895 return false;
1897 TreePath path = treeKasse.getSelectionPath();
1898 return (path.getPathCount()>=3);
1900 String getAktKTraeger(){
1901 TreePath path = treeKasse.getSelectionPath();
1902 JXTTreeNode node = (JXTTreeNode) path.getLastPathComponent();
1903 return ((KnotenObjekt)node.getUserObject()).ikkasse;
1905 public void setRezeptOk(boolean ok){
1907 treeKasse.getSelectionCount();
1908 TreePath path = treeKasse.getSelectionPath();
1909 JXTTreeNode node = (JXTTreeNode) path.getLastPathComponent();
1910 ((KnotenObjekt)node.getUserObject()).fertig = ok;
1911 if(ok){
1912 kontrollierteRezepte++;
1913 }else{
1914 kontrollierteRezepte--;
1916 treeKasse.repaint();
1918 public String getPreisgruppenKuerzel(String disziplin){
1919 if(disziplin.equals("Physio")){
1920 return "pgkg";
1921 }else if(disziplin.equals("Massage")){
1922 return "pgma";
1923 }else if(disziplin.equals("Ergo")){
1924 return "pger";
1925 }else if(disziplin.equals("Logo")){
1926 return "pglo";
1927 }else if(disziplin.equals("Reha")){
1928 return "pgrh";
1929 }else if(disziplin.equals("Podo")){
1930 return "pgpo";
1931 }else{
1932 return "pgkg";
1935 /***************************************/
1937 private static class JXTTreeNode extends DefaultMutableTreeNode {
1941 private static final long serialVersionUID = 2195590211796817012L;
1942 @SuppressWarnings("unused")
1943 public boolean enabled = false;
1944 private KnotenObjekt knotenObjekt = null;
1945 public JXTTreeNode(KnotenObjekt obj,boolean enabled){
1946 super();
1947 this.enabled = enabled;
1948 this.knotenObjekt = obj;
1949 if(obj != null){
1950 this.setUserObject(obj);
1954 public boolean isEnabled() {
1955 return enabled;
1959 public KnotenObjekt getObject(){
1960 return knotenObjekt;
1964 /***************************************/
1965 class KnotenObjekt{
1966 public String titel;
1967 public boolean fertig;
1968 public String rez_num;
1969 public String ktraeger;
1970 public String pat_intern;
1971 public String entschluessel;
1972 public String ikkasse;
1973 public String preisgruppe;
1974 public String ohnepauschale;
1975 public boolean langfrist;
1976 public String langfristaz;
1978 public KnotenObjekt(String titel,String rez_num,boolean fertig,String ikkasse,String preisgruppe){
1979 this.titel = titel;
1980 this.fertig = fertig;
1981 this.rez_num = rez_num;
1982 this.ikkasse = ikkasse;
1983 this.preisgruppe = preisgruppe;
1986 /*************************************/
1987 private class KassenTreeModel extends DefaultTreeModel {
1991 private static final long serialVersionUID = 6391618556224740611L;
1992 public KassenTreeModel(JXTTreeNode node) {
1993 super((TreeNode) node);
1995 @SuppressWarnings("unused")
1996 public Object getValueAt(Object node, int column) {
1997 JXTTreeNode jXnode = (JXTTreeNode) node;
1999 KnotenObjekt o = null;
2000 o = (KnotenObjekt) jXnode.getUserObject();
2001 switch (column) {
2002 case 0:
2003 return o.titel;
2004 case 1:
2005 return o.fertig;
2008 return jXnode.getObject().titel;
2010 @SuppressWarnings("unused")
2011 public int getColumnCount() {
2012 return 3;
2014 @SuppressWarnings("unused")
2015 public void setValueAt(Object value, Object node, int column){
2016 JXTTreeNode jXnode = (JXTTreeNode) node;
2017 KnotenObjekt o;
2018 o = jXnode.getObject();
2019 switch (column) {
2020 case 0:
2021 o.titel =((String) value) ;
2022 break;
2023 case 1:
2024 o.fertig =((Boolean) value) ;
2025 break;
2028 @SuppressWarnings("unused")
2029 public Class<?> getColumnClass(int column) {
2030 switch (column) {
2031 case 0:
2032 return String.class;
2033 case 1:
2034 return Boolean.class;
2036 return Object.class;
2039 /*****************************************/
2040 private class MyRenderer extends DefaultTreeCellRenderer {
2044 private static final long serialVersionUID = 2333990367290526356L;
2045 Icon fertigIcon;
2047 public MyRenderer(Icon icon) {
2048 fertigIcon = icon;
2051 public Component getTreeCellRendererComponent(
2052 JTree tree,
2053 Object value,
2054 boolean sel,
2055 boolean expanded,
2056 boolean leaf,
2057 int row,
2058 boolean hasFocus) {
2060 super.getTreeCellRendererComponent(
2061 tree, value, sel,
2062 expanded, leaf, row,
2063 hasFocus);
2064 KnotenObjekt o = ((JXTTreeNode)value).knotenObjekt;
2065 if (leaf && istFertig(value)) {
2066 setIcon(fertigIcon);
2067 this.setText(o.titel);
2068 setToolTipText("Verordnung "+o.rez_num+" kann dirket abgerechnet werden.");
2069 } else {
2070 setToolTipText(null);
2071 this.setText(o.titel);
2073 return this;
2077 protected boolean istFertig(Object value) {
2078 DefaultMutableTreeNode node =
2079 (DefaultMutableTreeNode)value;
2080 KnotenObjekt fertig =
2081 (KnotenObjekt)(node.getUserObject());
2082 boolean istfertig = fertig.fertig;
2083 if(istfertig){
2084 return true;
2086 return false;
2088 private void rezepteUebertragen(){
2091 private void rechnungAnlegen(){
2094 @Override
2095 public void mouseClicked(MouseEvent e) {
2096 // TODO Auto-generated method stub
2099 @Override
2100 public void mousePressed(MouseEvent e) {
2101 if(e.getButton()==3){
2102 TreePath tp = treeKasse.getSelectionPath();
2104 kontrollierteRezepte = 0;
2105 if(tp==null){
2106 return;
2108 JXTTreeNode node = (JXTTreeNode) tp.getLastPathComponent();
2109 String rez_nr = ((JXTTreeNode)node).knotenObjekt.rez_num;
2110 if(!rez_nr.trim().equals("")){
2111 if(node.knotenObjekt.fertig){
2112 String msg = "<html>Achtung Sie editieren im Anschluß den EDIFACT-Code!<br>"+
2113 "Wenn Sie den Code in unzulässiger Weise manipulieren<br>wird <b>der gesamte Abrechnungslauf unbrauchbar</b><br><br>"+
2114 "<b>Rufen Sie diese Funktion nur dann auf wenn Sie genau wissen was Sie tun!!!</b><br><br>"+
2115 "Soll die Funktion jetzt aufgerufen werden?<br></html>";
2116 int frage = JOptionPane.showConfirmDialog(null,msg,"Achtung wichtige Benutzeranfrage",JOptionPane.YES_NO_OPTION);
2117 if(frage != JOptionPane.YES_OPTION){
2118 return;
2120 PointerInfo info = MouseInfo.getPointerInfo();
2121 Point location = info.getLocation();
2122 EditEdifact editEdifact = new EditEdifact(Reha.thisFrame,"EDIFACT - editieren",rez_nr.trim());
2123 editEdifact.getContentPane().setPreferredSize(new Dimension(600,500));
2124 editEdifact.setLocation(e.getXOnScreen()-50,e.getYOnScreen()-50);
2125 //editEdifact.setLocation(location.x-50,location.y-50);
2126 editEdifact.pack();
2127 editEdifact.setVisible(true);
2128 this.abrRez.setNewRez(rez_nr,node.knotenObjekt.fertig,aktDisziplin);
2129 }else{
2130 JOptionPane.showMessageDialog(null,"Abrechnungsdaten im Edifact-Format kann nur\nbei bereits markierten Rezepten manipuliert werden!");
2137 @Override
2138 public void mouseReleased(MouseEvent e) {
2139 // TODO Auto-generated method stub
2142 @Override
2143 public void mouseEntered(MouseEvent e) {
2144 // TODO Auto-generated method stub
2147 @Override
2148 public void mouseExited(MouseEvent e) {
2149 // TODO Auto-generated method stub