*** empty log message ***
[thera-pi.git] / Reha / src / abrechnung / AbrechnungGKV.java
blob94a26cfbbdc355436746a10f96b89e08367a02d1
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","RS","FT"};
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 static String zertifikatVon = SystemConfig.hmAbrechnung.get("hmkeystoreusecertof");
172 public static String originalTitel = "";
173 public static boolean lOwnCert = (SystemConfig.hmAbrechnung.get("hmkeystoreusecertof").equals(SystemConfig.hmAbrechnung.get("hmkeystorealias")) ? true : false);
175 public AbrechnungGKV(JAbrechnungInternal xjry){
176 super();
177 this.setJry(xjry);
178 setLayout(new BorderLayout());
179 jSplitLR = UIFSplitPane.createStrippedSplitPane(JSplitPane.HORIZONTAL_SPLIT,
180 getLeft(),
181 getRight());
182 jSplitLR.setDividerSize(7);
183 jSplitLR.setDividerBorderVisible(true);
184 jSplitLR.setName("BrowserSplitLinksRechts");
185 jSplitLR.setOneTouchExpandable(true);
186 jSplitLR.setDividerLocation(230);
187 add(jSplitLR,BorderLayout.CENTER);
188 mandantenCheck();
189 SlgaVersion = ( DatFunk.TageDifferenz("30.09.2013",DatFunk.sHeute()) <= 0 ? "08" : "09");
190 SllaVersion = ( DatFunk.TageDifferenz("30.09.2013",DatFunk.sHeute()) <= 0 ? "08" : "09");
192 new SwingWorker<Void,Void>(){
193 @Override
194 protected Void doInBackground() throws Exception {
195 SystemConfig.certState = checkCert(zertifikatVon/*"IK"+Reha.aktIK*/);
196 if(SystemConfig.certState > 0){
197 abrRez.tbbuts[3].setEnabled(false);
199 //System.out.println(SystemConfig.hmAbrechnung);
200 //System.out.println("CertState = "+SystemConfig.certState);
201 return null;
203 }.execute();
204 originalTitel = this.jry.getTitel();
205 setEncryptTitle();
206 cmbDiszi.setSelectedItem(SystemConfig.initRezeptKlasse);
209 public void setEncryptTitle(){
210 this.jry.setzeTitel(originalTitel+ " [Abrechnung für IK: "+Reha.aktIK+" - Zertifikat von IK: "+zertifikatVon.replace("IK","")+"]");
211 this.jry.repaint();
213 public static int checkCert(String alias){
214 try{
215 String keystore = SystemConfig.hmAbrechnung.get("hmkeystorefile");//Reha.proghome+"keystore/"+Reha.aktIK+"/"+Reha.aktIK+".p12";
216 //NebraskaKeystore store = new NebraskaKeystore(keystore, SystemConfig.hmAbrechnung.get("hmkeystorepw"),"123456", Reha.aktIK);
217 NebraskaKeystore store = new NebraskaKeystore(keystore, SystemConfig.hmAbrechnung.get("hmkeystorepw"),"123456", SystemConfig.hmAbrechnung.get("hmkeystoreusecertof").replace("IK", ""));
218 Vector<X509Certificate> certs = store.getAllCerts();
219 String[] dn = null;
220 String ik;
221 long tage;
222 for(int i = 0; i < certs.size();i++){
223 dn=certs.get(i).getSubjectDN().toString().split(",");
224 if(dn.length==5){
225 ik = (String)dn[3].split("=")[1];
226 if(ik.equals(alias)){
227 String verfall = certs.get(i).getNotAfter().toLocaleString().split(" ")[0].trim();
228 tage = DatFunk.TageDifferenz(DatFunk.sHeute(),verfall);
229 if( tage <= 0){
230 JOptionPane.showMessageDialog(null,"Ihr Zertifikat ist abgelaufen.\nEine Verschlüsselung mit diesem Zertifikat ist nicht mehr möglich");
231 return SystemConfig.certIsExpired;
232 }else if(tage <= 30){
233 JOptionPane.showMessageDialog(null,"Achtung!!!\nIhr Zertifikat läuft in "+Long.toString(tage)+" Tage(n) ab.\nBitte rechtzeitig neues Zertifikat beantragen");
235 return SystemConfig.certOK;
236 }else{
237 String verfall = certs.get(i).getNotAfter().toLocaleString().split(" ")[0].trim();
238 tage = DatFunk.TageDifferenz(DatFunk.sHeute(),verfall);
239 if( tage <= 0){
240 JOptionPane.showMessageDialog(null,"Mindestens ein Zertifikat im Keystore ist abgelaufen.\nVerschlüsselung und damit die 302-er Abrechnung wird daher gesperrt");
241 return SystemConfig.certIsExpired;
246 }catch(Exception ex){
247 return SystemConfig.certNotFound;
249 return SystemConfig.certNotFound;
251 /**********
255 * Linke Seite
257 private void mandantenCheck(){
258 if(SystemConfig.hmFirmenDaten.get("Steuernummer").trim().equals("")){
259 String msg = "Achtung(!!!!!!) für diesen Mandant wurde keine Steuernummer angegeben!\n\n"+
260 "Eine Abrechnung ohne Steuernummer wird von der GKV nicht(!!!!) akzeptiert\n\"+" +
261 "Schließen Sie die Abrechnung starten Sie die System-Initialisierung -> Mandanten Datenbank -> Firmenangaben...\n"+
262 "und tragen Sie hier im Feld Steuernummer die vom Finanzamt vergebene Steuernummer ein.";
263 JOptionPane.showMessageDialog(null,msg);
265 if(SystemConfig.hmFirmenDaten.get("Ikbezeichnung").trim().equals("")){
266 String msg = "Achtung(!!!!!!) für diesen Mandant wurde keine Firmenbezeichnung angegeben!\n\n"+
267 "Schließen Sie die Abrechnung starten Sie die System-Initialisierung -> Mandanten Datenbank -> Firmenangaben...\n"+
268 "und tragen Sie hier im Feld 'Mandanten-Bezeichnung' eine Kurzfassung Ihres Firmennamens ein (max 30 Zeichen)";
269 JOptionPane.showMessageDialog(null,msg);
271 if(SystemConfig.hmFirmenDaten.get("Ikbezeichnung").length() > 30){
272 String msg = "Achtung(!!!!!!) für diesen Mandant wurde eine zu lange Firmenbezeichnung angegeben.\n\n"+
273 "Schließen Sie die Abrechnung starten Sie die System-Initialisierung -> Mandanten Datenbank -> Firmenangaben...\n"+
274 "und tragen Sie hier im Feld 'Mandanten-Bezeichnung' eine Kurzfassung Ihres Firmennamens ein (max 30 Zeichen)";
275 JOptionPane.showMessageDialog(null,msg);
278 private JScrollPane getLeft(){
279 FormLayout lay = new FormLayout("5dlu,fill:0:grow(1.0),5dlu",
280 //1 2 3 4 5 6 7 8 9 10 11
281 "5dlu,p,5dlu,p,15dlu,p,20dlu,p,15dlu,fill:0:grow(1.0),5dlu");
282 PanelBuilder pb = new PanelBuilder(lay);
283 CellConstraints cc = new CellConstraints();
284 pb.getPanel().setBackground(Color.WHITE);
285 //pb.add(getIVPanel(),cc.xy(2,1));
286 pb.addLabel("Heilmittel auswählen",cc.xy(2,2));
287 if(SystemConfig.mitRs){
288 cmbDiszi = new JRtaComboBox(new String[] {"Physio-Rezept","Massage/Lymphdrainage-Rezept","Ergotherapie-Rezept","Logopädie-Rezept","Podologie-Rezept","Rehasport-Rezept","Funktionstraining-Rezept"});
289 }else{
290 cmbDiszi = new JRtaComboBox(new String[] {"Physio-Rezept","Massage/Lymphdrainage-Rezept","Ergotherapie-Rezept","Logopädie-Rezept","Podologie-Rezept"});
293 cmbDiszi.setActionCommand("einlesen");
294 cmbDiszi.setSelectedItem(SystemConfig.initRezeptKlasse);
296 pb.add(cmbDiszi,cc.xy(2,4));
298 butLinks[0] = new JButton("Abrechnungsdaten einlesen");
299 butLinks[0].setActionCommand("einlesen");
300 butLinks[0].addActionListener(this);
301 pb.addLabel("",cc.xy(2,6));
302 pb.add(butLinks[0],cc.xy(2,8));
304 //rootKasse = new DefaultMutableTreeNode( "Abrechnung für Kasse..." );
305 //rootKasse = new DefaultMutableTreeNode( "Abrechnung für Kasse..." );
306 rootKasse = new JXTTreeNode(new KnotenObjekt("Abrechnung für Kasse...","",false,"",""),true);
307 treeModelKasse = new KassenTreeModel((JXTTreeNode) rootKasse);
309 treeKasse = new JXTree(treeModelKasse);
310 treeKasse.setModel(treeModelKasse);
311 treeKasse.setName("kassentree");
312 treeKasse.getSelectionModel().addTreeSelectionListener(this);
313 treeKasse.setCellRenderer(new MyRenderer(SystemConfig.hmSysIcons.get("zuzahlok")));
314 treeKasse.addMouseListener(this);
315 JScrollPane jscrk = JCompTools.getTransparentScrollPane(treeKasse);
316 jscrk.validate();
317 pb.add(jscrk,cc.xy(2, 6));
318 new SwingWorker<Void,Void>(){
319 @Override
320 protected Void doInBackground() throws Exception {
321 Reha.thisFrame.setCursor(Reha.thisClass.wartenCursor);
322 return null;
325 }.execute();
327 //doEinlesen(null);
329 htmlPane = new JEditorPane(/*initialURL*/);
330 htmlPane.setContentType("text/html");
331 htmlPane.setEditable(false);
332 htmlPane.setOpaque(false);
333 jscrk = JCompTools.getTransparentScrollPane(htmlPane);
334 jscrk.validate();
335 pb.add(jscrk,cc.xy(2,10));
337 pb.getPanel().validate();
339 JScrollPane jscr = JCompTools.getTransparentScrollPane(pb.getPanel());
340 jscr.validate();
341 cmbDiszi.addActionListener(this);
344 //cmbDiszi.setSelectedIndex(cmbDiszi.getSelectedIndex());
345 return jscr;
348 private JXPanel getIVPanel(){
349 JXPanel jpan = new JXPanel();
350 jpan.setOpaque(false);
351 String xwerte = "0dlu,fill:0:grow(1.0),0dlu";
352 // 1 2 3 4 5 6 7
353 String ywerte = "5dlu,p,3dlu,p,25dlu";
354 FormLayout lay = new FormLayout(xwerte,ywerte);
355 CellConstraints cc = new CellConstraints();
356 jpan.setLayout(lay);
357 soll302 = new JRtaCheckBox("Abrechnung nach §302 erstellen");
358 soll302.setSelected(true);
359 soll302.setOpaque(false);
360 jpan.add(soll302,cc.xy(2,2));
361 alternativeKK = new JButton("Adresse...");
362 alternativeKK.setActionCommand("alternativeadresse");
363 alternativeKK.addActionListener(this);
364 Image img = new ImageIcon(Reha.proghome+"icons/krankenkasse.png").getImage().getScaledInstance(22, 22, Image.SCALE_SMOOTH);
365 alternativeKK.setIcon(new ImageIcon(img));
366 jpan.add(alternativeKK,cc.xy(2,4));
367 return jpan;
370 private JXPanel getRight(){
371 this.abrRez = new AbrechnungRezept(this);
372 this.abrRez.setRechtsAufNull();
373 return abrRez;
375 public boolean getTageDrucken(){
376 return this.abrRez.getTageDrucken();
378 @Override
379 public void patStammEventOccurred(PatStammEvent evt) {
380 // TODO Auto-generated method stub
384 public void setJry(JAbrechnungInternal jry) {
385 this.jry = jry;
388 public JAbrechnungInternal getJry() {
389 return jry;
391 public JXTTreeNode getaktuellerKassenKnoten(){
392 return aktuellerKassenKnoten;
394 @Override
395 public void actionPerformed(ActionEvent arg0) {
396 String cmd = arg0.getActionCommand();
397 if(cmd.equals("einlesen")){
398 //rootKasse.removeAllChildren();
399 //String[] reznr = {"KG","MA","ER","LO"};
400 String[] diszis = null;
401 if(SystemConfig.mitRs){
402 diszis = new String[] {"Physio","Massage","Ergo","Logo","Podo","Rsport","Ftrain"};
403 }else{
404 diszis = new String[] {"Physio","Massage","Ergo","Logo","Podo"};
407 aktDisziplin = diszis[cmbDiszi.getSelectedIndex()];
408 //System.out.println("aktDisziplin = "+aktDisziplin);
409 //abrRez.setKuerzelVec(reznr[cmbDiszi.getSelectedIndex()]);
410 if(abrRez.rezeptSichtbar){
411 abrRez.setRechtsAufNull();
412 aktuellerPat = "";
414 this.jry.setzeTitel(originalTitel+ " [Abrechnung für IK: "+Reha.aktIK+" - Zertifikat von IK: "+zertifikatVon.replace("IK","")+"] [Disziplin: "+aktDisziplin+"]");
415 doEinlesen(null);
416 //setPreisVec(cmbDiszi.getSelectedIndex());
418 if(cmd.equals("alternativeadresse")){
422 private String getDiszis(){
423 String[] diszis = null;
424 if(SystemConfig.mitRs){
425 diszis = new String[] {"Physio","Massage","Ergo","Logo","Podo","Rsport","Ftrain"};
426 }else{
427 diszis = new String[] {"Physio","Massage","Ergo","Logo","Podo"};
430 return String.valueOf(diszis[cmbDiszi.getSelectedIndex()]);
432 public void einlesenErneuern(){
433 String[] diszis = null;
434 if(SystemConfig.mitRs){
435 diszis = new String[] {"Physio","Massage","Ergo","Logo","Podo","Rsport","Ftrain"};
436 }else{
437 diszis = new String[] {"Physio","Massage","Ergo","Logo","Podo"};
440 aktDisziplin = diszis[cmbDiszi.getSelectedIndex()];
441 //abrRez.setKuerzelVec(reznr[cmbDiszi.getSelectedIndex()]);
442 if(abrRez.rezeptSichtbar){
443 abrRez.setRechtsAufNull();
444 aktuellerPat = "";
446 doEinlesen(null);
449 private void setPreisVec(int pos){
450 String[] reznr = {"KG","MA","ER","LO"};
451 //abrRez.setPreisVec(reznr[pos]);
452 JOptionPane.showMessageDialog(null, "Aufruf von setPreisVec in AbrechnungGKV");
456 /*********
457 * Einlesen der abrechnungsdaten
459 public void doEinlesen(JXTTreeNode aktKassenNode ){
460 //final JXTTreeNode xaktKassenNode = aktKassenNode;
461 new SwingWorker<Void,Void>(){
462 @Override
463 protected Void doInBackground() throws Exception {
464 try{
465 new SwingWorker<Void,Void>(){
466 @Override
467 protected Void doInBackground() throws Exception {
468 Reha.thisClass.progressStarten(true);
469 return null;
471 }.execute();
472 existiertschon.clear();
473 String dsz = diszis[cmbDiszi.getSelectedIndex()];
475 String cmd = "select name1,ikktraeger,ikkasse,id from fertige where rezklasse='"+dsz+"' ORDER BY ikktraeger , id";
477 Vector <Vector<String>> vecKassen = SqlInfo.holeFelder(cmd);
479 if(vecKassen.size() <= 0){
480 kassenBaumLoeschen();
481 Reha.thisClass.progressStarten(false);
482 return null;
484 kassenBaumLoeschen();
485 treeKasse.setEnabled(true);
486 String kas = vecKassen.get(0).get(0).trim().toUpperCase();
487 String ktraeger = vecKassen.get(0).get(1).trim();
488 String ikkasse = vecKassen.get(0).get(2).trim();
489 existiertschon.add(ktraeger);
491 int aeste = 0;
492 astAnhaengen(kas,ktraeger,ikkasse);
493 rezepteAnhaengen(0);
494 aeste++;
500 for(int i = 0; i < vecKassen.size();i++){
501 if(! existiertschon.contains(vecKassen.get(i).get(1).trim().toUpperCase())){
502 kas = vecKassen.get(i).get(0).trim().toUpperCase();
503 ktraeger = vecKassen.get(i).get(1);
504 ikkasse = vecKassen.get(i).get(2);
505 existiertschon.add(ktraeger);
506 astAnhaengen(kas,ktraeger,ikkasse);
507 rezepteAnhaengen(aeste);
508 aeste++;
510 treeKasse.repaint();
513 treeKasse.validate();
514 treeKasse.setRootVisible(true);
516 treeKasse.expandRow(0);
519 treeKasse.repaint();
520 }catch(Exception ex){
521 ex.printStackTrace();
523 Reha.thisFrame.setCursor(Reha.thisClass.cdefault);
524 Reha.thisClass.progressStarten(false);
525 return null;
527 }.execute();
529 private void rezepteAnhaengen(int knoten){
530 String ktraeger = ((JXTTreeNode)rootKasse.getChildAt(knoten)).knotenObjekt.ktraeger;
531 String dsz = diszis[cmbDiszi.getSelectedIndex()];
532 String cmd = "select rez_nr,pat_intern,ediok,ikkasse from fertige where rezklasse='"+dsz+"' AND ikktraeger='"+
533 ktraeger+"' ORDER BY id,pat_intern";
535 Vector <Vector<String>> vecKassen = SqlInfo.holeFelder(cmd);
537 JXTTreeNode node = (JXTTreeNode) rootKasse.getChildAt(knoten);
538 //JXTTreeNode treeitem = null;
540 JXTTreeNode meinitem = null;
541 for(int i = 0;i<vecKassen.size();i++){
542 try{
543 cmd = "select n_name from pat5 where pat_intern='"+
544 vecKassen.get(i).get(1)+"' LIMIT 1";
546 String name = SqlInfo.holeFelder(cmd).get(0).get(0);
547 cmd = "select preisgruppe from verordn where rez_nr='"+vecKassen.get(i).get(0)+"' LIMIT 1";;
548 ////System.out.println(cmd);
549 String preisgr = SqlInfo.holeEinzelFeld(cmd);
550 ////System.out.println("Preisgruppe="+preisgr);
552 KnotenObjekt rezeptknoten = new KnotenObjekt(vecKassen.get(i).get(0)+"-"+name,
553 vecKassen.get(i).get(0),
554 (vecKassen.get(i).get(2).equals("T")? true : false),
555 vecKassen.get(i).get(3),
556 preisgr);
557 rezeptknoten.ktraeger = ktraeger;
558 rezeptknoten.pat_intern = vecKassen.get(i).get(1);
559 meinitem = new JXTTreeNode(rezeptknoten,true);
561 treeModelKasse.insertNodeInto(meinitem,node,node.getChildCount());
562 treeKasse.validate();
563 }catch(Exception ex){
569 private void astAnhaengen(String ast,String ktraeger,String ikkasse){
570 KnotenObjekt knoten = new KnotenObjekt(ast,"",false,"","");
571 knoten.ktraeger = ktraeger;
572 knoten.ikkasse = ikkasse;
573 JXTTreeNode node = new JXTTreeNode(knoten,true);
574 treeModelKasse.insertNodeInto(node, rootKasse, rootKasse.getChildCount());
575 treeKasse.validate();
577 private void kassenBaumLoeschen(){
578 try{
580 while( (rootKasse.getChildCount()) > 0){
581 treeModelKasse.removeNodeFromParent((JXTTreeNode) ((JXTTreeNode) treeModelKasse.getRoot()).getChildAt(0));
583 treeKasse.validate();
584 treeKasse.repaint();
585 }catch(Exception ex){
586 ex.printStackTrace();
589 /*******************************************/
590 private void doKassenTreeAuswerten(KnotenObjekt node){
591 //Rezept ausgewählt
592 setCursor(Reha.thisClass.wartenCursor);
593 Reha.thisClass.progressStarten(true);
594 try{
595 if(! this.abrRez.setNewRez(node.rez_num,node.fertig,aktDisziplin) ){
596 Reha.thisClass.progressStarten(false);
597 setCursor(Reha.thisClass.normalCursor);
598 JOptionPane.showMessageDialog(null,"Rezept konnte nicht ausgewertet werden");
599 return;
601 }catch(Exception ex){
602 ex.printStackTrace();
604 ////System.out.println("Rezept "+node.rez_num+" fertig eingestellt");
605 setCursor(Reha.thisClass.normalCursor);
606 SwingUtilities.invokeLater(new Runnable(){
607 public void run(){
608 Reha.thisClass.progressStarten(false);
613 return;
616 /*******************************************/
618 private void doAufraeumen(){
619 butLinks[0].removeActionListener(this);
620 cmbDiszi.removeActionListener(this);
621 treeKasse.getSelectionModel().removeTreeSelectionListener(this);
624 public void loescheKnoten(){
625 //rezept aus fertige löschen
626 //Verschluß des Rezeptes aufheben
627 //Knoten löschen
628 //wenn einziger Knoten den kassenKnoten löschen
629 String rez_nr = this.aktuellerKnoten.knotenObjekt.rez_num;
630 String cmd = "delete from fertige where rez_nr='"+rez_nr+"' LIMIT 1";
631 SqlInfo.sqlAusfuehren(cmd);
632 cmd = "update verordn set abschluss='F' where rez_nr='"+rez_nr+"' LIMIT 1";
633 SqlInfo.sqlAusfuehren(cmd);
634 try{
635 treeModelKasse.removeNodeFromParent(this.aktuellerKnoten);
636 }catch(Exception ex){
637 JOptionPane.showMessageDialog(null, "Kritische Situation bei Aktion aufschließen des Rezeptes");
639 this.aktuellerKassenKnoten.getNextNode();
640 int anzahlrez = this.aktuellerKassenKnoten.getChildCount();
641 if(anzahlrez==0){
642 treeModelKasse.removeNodeFromParent(this.aktuellerKassenKnoten);
643 }else{
644 this.rechneKasse(this.aktuellerKassenKnoten);
646 this.abrRez.setRechtsAufNull();
648 @Override
649 public void valueChanged(TreeSelectionEvent arg0) {
650 //TreePath path = arg0.getNewLeadSelectionPath();
651 TreePath tp = treeKasse.getSelectionPath();
652 kontrollierteRezepte = 0;
653 if(tp==null){
655 return;
657 JXTTreeNode node = (JXTTreeNode) tp.getLastPathComponent();
658 String rez_nr = ((JXTTreeNode)node).knotenObjekt.rez_num;
659 if(!rez_nr.trim().equals("")){
660 aktuellerKnoten = node;
661 doKassenTreeAuswerten(node.knotenObjekt);
662 aktuellerPat = node.knotenObjekt.pat_intern;
663 aktuellerKassenKnoten =(JXTTreeNode) ((JXTTreeNode)aktuellerKnoten).getParent();
664 int pgr = -1;
665 if(! ((JXTTreeNode)node).knotenObjekt.preisgruppe.trim().equals("")){
666 ////System.out.println("Aktuelle Disziplin = "+getDiszis()+" / Aktuelle Preisgruppe = "+pgr);
667 pgr = Integer.parseInt(((JXTTreeNode)node).knotenObjekt.preisgruppe.trim());
668 zuzahlModusDefault = (SystemPreislisten.hmZuzahlModus.get(getDiszis()).get(pgr-1)==1 ? true : false);
670 if(pgr < 0){
671 JOptionPane.showMessageDialog(null,"Achtung Preisgruppe kann nicht ermittelt werden!\nBitte dieses Rezept nicht abrechnen!");
673 ////System.out.println("Preisguppe = "+Integer.toString(pgr)+"\nZuhahlmodus = "+(zuzahlModusDefault ? "Normal" : "Bayrisch"));
675 }else{
676 abrRez.setRechtsAufNull();
677 aktuellerKnoten = (JXTTreeNode)node;
678 if(aktuellerKnoten.getParent() != null){
679 if(((JXTTreeNode)aktuellerKnoten.getParent()).isRoot()){
680 aktuellerKassenKnoten =(JXTTreeNode) ((JXTTreeNode)aktuellerKnoten);
681 //////System.out.println("Aktueller Knoten ist Root");
682 }else{
683 //////System.out.println("Aktueller Knoten ungleich Root");
685 //////System.out.println("Pfad zu Parent = "+new TreePath(aktuellerKnoten.getParent()).toString());
686 }else{
687 aktuellerKassenKnoten = null;
689 aktuellerPat = "";
692 kassenUmsatz[0] = 0.00;
693 kassenUmsatz[1] = 0.00;
694 if(aktuellerKassenKnoten != null){
695 rechneKasse(aktuellerKassenKnoten);
699 public void setKassenUmsatzNeu(){
700 kassenUmsatz[0] = 0.00;
701 kassenUmsatz[1] = 0.00;
702 if(aktuellerKassenKnoten != null){
703 rechneKasse(aktuellerKassenKnoten);
706 public String getAbrechnungKasse(){
707 ////System.out.println(((JXTTreeNode)aktuellerKnoten).knotenObjekt.ktraeger);
708 return ((JXTTreeNode)aktuellerKnoten).knotenObjekt.ktraeger;
710 public void rechneKasse(JXTTreeNode aktKasse){
711 kontrollierteRezepte = 0;
712 final JXTTreeNode xaktKasse = aktKasse;
713 new SwingWorker<Void,Void>(){
714 @Override
715 protected Void doInBackground() throws Exception {
716 try{
717 int lang = xaktKasse.getChildCount();
718 Reha.thisClass.progressStarten(true);
719 getInstance().setCursor(Reha.thisClass.wartenCursor);
720 for(int i = 0; i < lang;i++){
721 if( ((JXTTreeNode)xaktKasse.getChildAt(i)).knotenObjekt.fertig ){
722 kontrollierteRezepte++;
723 holeUmsaetze(((JXTTreeNode)xaktKasse.getChildAt(i)).knotenObjekt.rez_num);
726 setHtmlLinksUnten(lang,kontrollierteRezepte);
727 Reha.thisClass.progressStarten(false);
728 getInstance().setCursor(Reha.thisClass.cdefault);
729 }catch(Exception ex){
730 ex.printStackTrace();
732 return null;
734 }.execute();
736 public void setHtmlLinksUnten(int gesamt,int gut){
737 htmlBuf.setLength(0);
738 htmlBuf.trimToSize();
739 htmlBuf.append("<html><head>");
740 htmlBuf.append("<STYLE TYPE=\"text/css\">");
741 htmlBuf.append("<!--");
742 htmlBuf.append("A{text-decoration:none;background-color:transparent;border:none}");
743 htmlBuf.append("TD{font-family: Tahoma; font-size: 11pt; padding-left:5px;padding-right:30px}");
744 htmlBuf.append(".spalte1{color:#0000FF;}");
745 htmlBuf.append(".spalte2{color:#FF0000;}");
746 htmlBuf.append(".spalte3{color:#333333;}");
747 htmlBuf.append("--->");
748 htmlBuf.append("</STYLE>");
749 htmlBuf.append("</head>");
750 htmlBuf.append("<div style=margin-left:0px;>");
751 htmlBuf.append("<font face=\"Tahoma\"><style=margin-left=0px;>");
752 htmlBuf.append("<br>");
753 htmlBuf.append("<table>");
754 htmlBuf.append("<tr><td>fertige Rezepte:</td>");
755 htmlBuf.append("<td class=\"spalte1\" align=\"right\"><b>"+gesamt+"</b></td></tr>");
756 htmlBuf.append("<tr><td>abrechnungsfähig:</td>");
757 htmlBuf.append((gesamt != gut ? "<td class=\"spalte2\" align=\"right\">" : "<td class=\"spalte1\" align=\"right\">" )+
758 "<b>"+gut+"</b></td></tr>");
759 htmlBuf.append("<tr><td>Umsatz:</td>");
760 htmlBuf.append("<td class=\"spalte1\" align=\"right\">"+dfx.format(kassenUmsatz[0])+"</td></tr>");
761 htmlBuf.append("<tr><td>enth. Rezeptgeb.: </td>");
762 htmlBuf.append("<td class=\"spalte1\" align=\"right\">"+dfx.format(kassenUmsatz[1])+"</td></tr>");
763 htmlBuf.append("</table>");
764 htmlBuf.append("</div>");
765 htmlBuf.append("</html>");
766 htmlPane.setText(htmlBuf.toString());
768 public void holeUmsaetze(String rez_nr){
769 buf.setLength(0);
770 buf.trimToSize();
771 try{
772 buf.append(SqlInfo.holeFelder("select edifact from fertige where rez_nr='"+rez_nr+"'").get(0).get(0));
773 }catch(Exception ex){}
774 if(buf.length()<=0){
775 JOptionPane.showMessageDialog(null,"Kassenumsatz für Rezept + "+rez_nr+" kann nicht abgeholt werden. Modul holeUmsatz() (Edifact)");
777 //////System.out.println(buf.toString());
778 String[] zeilen = buf.toString().split("\n");
779 String[] positionen = zeilen[0].split(":");
780 //PG=1:PATINTERN=16961:REZNUM=KG57747:GESAMT=102,30:REZGEB=20,26:REZANTEIL=10,26:REZPAUSCHL=10,00:KASSENID=116
781 kassenUmsatz[0] = kassenUmsatz[0]+ Double.valueOf(positionen[3].split("=")[1].replace(",", "."));
782 kassenUmsatz[1] = kassenUmsatz[1]+ Double.valueOf(positionen[4].split("=")[1].replace(",", "."));
784 /**************************************************/
786 public void starteAbrechnung(){
787 try{
788 hmKostentraeger.clear();
789 if(!Reha.officeapplication.isActive()){
790 try{
791 Reha.starteOfficeApplication();
792 if(!Reha.officeapplication.isActive()){
793 doDlgAbort();
794 JOptionPane.showMessageDialog(null, "Das OpenOffice-System reagiert nicht korrekt!\nAbrechnung wird nicht gestartet");
795 return;
797 }catch(Exception ex){
798 doDlgAbort();
799 JOptionPane.showMessageDialog(null, "Das OpenOffice-System reagiert nicht korrekt!\nAbrechnung wird nicht gestartet");
800 return;
804 if(aktuellerKassenKnoten==null){
805 abrDlg.setVisible(false);
806 abrDlg.dispose();
807 abrDlg = null;
808 Reha.thisClass.progressStarten(false);
809 JOptionPane.showMessageDialog(null, "Keine Kasse für die Abrechnung ausgewählt!");
810 return;
812 if(kontrollierteRezepte <=0){
813 abrDlg.setVisible(false);
814 abrDlg.dispose();
815 abrDlg = null;
816 Reha.thisClass.progressStarten(false);
817 JOptionPane.showMessageDialog(null, "Für die ausgewählte Kasse sind keine Rezepte zur Abrechnung freigegeben!");
818 return;
822 abgerechneteRezepte.clear();
823 abgerechnetePatienten.clear();
824 abrechnungRezepte = 0;
825 preis00 = setzePreiseAufNull(preis00);
826 preis11 = setzePreiseAufNull(preis11);
827 preis31 = setzePreiseAufNull(preis31);
828 preis51 = setzePreiseAufNull(preis51);
829 positionenBuf.setLength(0);positionenBuf.trimToSize();
830 unbBuf.setLength(0);unbBuf.trimToSize();
831 unzBuf.setLength(0);unzBuf.trimToSize();
832 gesamtBuf.setLength(0);gesamtBuf.trimToSize();
833 auftragsBuf.setLength(0);auftragsBuf.trimToSize();
834 positionenAnzahl = 0;
835 abrDateiName = "";
836 annahmeAdresseOk = false;
837 /**********************************/
839 abzurechnendeKassenID = getAktKTraeger();
840 String preisgr = getPreisgruppenKuerzel(aktDisziplin);
841 String cmd = "select ik_kasse,ik_kostent,ik_nutzer,ik_physika,ik_papier,"+preisgr+" from kass_adr where ik_kasse='"+abzurechnendeKassenID+"' LIMIT 1";
842 kassenIKs.clear();
843 kassenIKs = SqlInfo.holeFelder(cmd);
844 ////System.out.println(cmd);
845 if(kassenIKs.size()<=0){
846 Reha.thisClass.progressStarten(false);
847 abrDlg.setVisible(false);
848 abrDlg.dispose();
849 abrDlg = null;
850 JOptionPane.showMessageDialog(null, "Fehler - Daten der Krankenkasse konnten nicht ermittelt werden");
851 SqlInfo.sqlAusfuehren("update nummern set rnr='"+aktRechnung+"' where mandant='"+Reha.aktIK+"' LIMIT 1");
852 return;
855 public String abrechnungsModus = "abrechnung302";
856 final String ABR_MODE_302 = "abrechnung302";
857 final String ABR_MODE_IV = "abrechnungIV";
860 ik_kasse = kassenIKs.get(0).get(0);
861 ik_kostent = kassenIKs.get(0).get(1);
862 ik_nutzer = kassenIKs.get(0).get(2);
863 ik_physika = kassenIKs.get(0).get(3);
864 ik_papier = kassenIKs.get(0).get(4);
865 ik_email = SqlInfo.holeEinzelFeld("select email from ktraeger where ikkasse='"+ik_physika+"' LIMIT 1");
867 //System.out.println(" kasse = "+ik_kasse);
868 //System.out.println("kostent = "+ik_kostent);
869 //System.out.println(" nutzer = "+ik_nutzer);
870 //System.out.println("physika = "+ik_physika);
871 //System.out.println(" email = "+ik_email);
874 if(abrechnungsModus.equals(ABR_MODE_302)){
875 if(ik_email.equals("")){
876 ik_email = SqlInfo.holeEinzelFeld("select email1 from kass_adr where ik_kasse='"+ik_physika+"' LIMIT 1");
878 if(ik_email.equals("")){
879 ik_email = SqlInfo.holeEinzelFeld("select email from ktraeger where ikkasse='"+ik_kasse+"' LIMIT 1");
881 if(ik_email.equals("")){
882 ik_email = SqlInfo.holeEinzelFeld("select email from ktraeger where ikkasse='"+ik_kostent+"' LIMIT 1");
884 if(ik_email.equals("")){
885 ik_email = SqlInfo.holeEinzelFeld("select email from ktraeger where ikkasse='"+ik_physika+"' LIMIT 1");
888 if(ik_email.trim().equals("")){
889 JOptionPane.showMessageDialog(null,"Emailadresse ist weder der Datenannahmestelle noch dem Kostenträger\noder der Kasse selbst zugeordnet."+
890 "\n\n Bitte geben Sie die Emailadresse von Hand ein");
891 Object ret = JOptionPane.showInputDialog(null, "Geben Sie bitte die Emailadresse der Datenannahmestelle ein","");
892 if(ret == null){
893 Reha.thisClass.progressStarten(false);
894 abrDlg.setVisible(false);
895 abrDlg.dispose();
896 abrDlg = null;
897 JOptionPane.showMessageDialog(null, "Fehler - keine Emailadresse eingegeben");
898 SqlInfo.sqlAusfuehren("update nummern set rnr='"+aktRechnung+"' where mandant='"+Reha.aktIK+"' LIMIT 1");
899 return;
901 ik_email = String.valueOf(ret);
904 preisVector = RezTools.holePreisVector(diszis[cmbDiszi.getSelectedIndex()],Integer.parseInt(kassenIKs.get(0).get(5))-1);
905 name_kostent = holeNameKostentraeger();
907 String test = "";
908 if(abrechnungsModus.equals(ABR_MODE_302)){
909 //String keystore = Reha.proghome+"keystore/"+Reha.aktIK+"/"+Reha.aktIK+".p12";
910 //NebraskaKeystore store = new NebraskaKeystore(keystore, SystemConfig.hmAbrechnung.get("hmkeystorepw"),"123456", Reha.aktIK);
911 //Einbau Test ob Zertifikat abgelaufen
912 test = "IK der Krankenkasse: "+ik_kasse+"\n"+
913 "IK des Kostenträgers: "+ik_kostent+"\n"+
914 "IK des Nutzer mit EntschlüsselungsbefungnisKostenträgers: "+ik_nutzer+"\n"+
915 "IK der Datenannahmestelle: "+ik_physika+"\n"+
916 "IK der Papierannahmestelle: "+ik_papier+"\n"+
917 "Emailadresse der Datenannahmestelle: "+ik_email+"\n"+
918 "Name des Kostenträgers: "+name_kostent;
920 /************************************************/
921 hmKostentraeger.put("name1",String.valueOf(name_kostent));
922 /************************************************/
923 }else{
924 test = "IK der Krankenkasse: "+ik_kasse+"\n"+
925 "Keine Abrechnung nach § 302!!!\n\n"+
926 "Rechnungsanschrift:\n"+
927 hmAlternativeKasse.get("<Ivnam1>")+"\n"+
928 hmAlternativeKasse.get("<Ivnam2>")+"\n"+
929 hmAlternativeKasse.get("<Ivstrasse>")+"\n"+
930 hmAlternativeKasse.get("<Ivplz>")+" "+
931 hmAlternativeKasse.get("<Ivort>");
932 //hmAlternativeKasse.get("<Ivid>");
933 hmKostentraeger.put("name1",String.valueOf(hmAlternativeKasse.get("<Ivnam1>")));
935 int anfrage = JOptionPane.showConfirmDialog(null,test , "Die Abrechnung mit diesen Parametern starten?", JOptionPane.YES_NO_OPTION);
936 if(anfrage != JOptionPane.YES_OPTION){
937 doDlgAbort();
938 //SqlInfo.sqlAusfuehren("update nummern set rnr='"+aktRechnung+"' where mandant='"+Reha.aktIK+"' LIMIT 1");
939 return;
941 /***********hier erst die Nummer erzeugen **************/
942 aktRechnung = Integer.toString(SqlInfo.erzeugeNummer("rnr"));
943 if(abrechnungsModus.equals(ABR_MODE_302)){
944 aktEsol = StringTools.fuelleMitZeichen(Integer.toString(SqlInfo.erzeugeNummerMitMax("esol", 999)), "0", true, 3);
946 /************************************************/
947 hmKostentraeger.put("aktesol",String.valueOf(aktEsol));
948 /************************************************/
949 aktDfue = StringTools.fuelleMitZeichen(Integer.toString(SqlInfo.erzeugeNummerMitMax("dfue", 99999)), "0", true, 5);
950 if(aktRechnung.equals("-1")){
951 Reha.thisClass.progressStarten(false);
952 abrDlg.setVisible(false);
953 abrDlg.dispose();
954 abrDlg = null;
955 JOptionPane.showMessageDialog(null, "Fehler - Rechnungsnummer kann nicht bezogen werden");
956 return;
960 /*****************************************/
961 if(abrechnungsModus.equals(ABR_MODE_302)){
962 if(ik_email.trim().equals("")){
963 JOptionPane.showMessageDialog(null, "Dieser Kasse ist keine Emailadresse zugewiesen\n"+
964 "Abrechnung nach §302 ist nicht möglich!");
965 doDlgAbort();
966 SqlInfo.sqlAusfuehren("update nummern set rnr='"+aktRechnung+"' where mandant='"+Reha.aktIK+"' LIMIT 1");
967 return;
969 if(ik_papier.trim().equals("")){
970 JOptionPane.showMessageDialog(null, "Dieser Kasse ist keine Papierannahmestelle zugewiesen\n"+
971 "Abrechnung nach §302 ist nicht möglich!");
972 doDlgAbort();
973 SqlInfo.sqlAusfuehren("update nummern set rnr='"+aktRechnung+"' where mandant='"+Reha.aktIK+"' LIMIT 1");
974 return;
976 if(ik_nutzer.trim().equals("")){
977 JOptionPane.showMessageDialog(null, "Dieser Kasse ist keine Nutzer mit Entschlüsselungsbefugnis zugewiesen\n"+
978 "Abrechnung nach §302 ist nicht möglich!");
979 SqlInfo.sqlAusfuehren("update nummern set rnr='"+aktRechnung+"' where mandant='"+Reha.aktIK+"' LIMIT 1");
980 doDlgAbort();
981 return;
983 if(ik_physika.trim().equals("")){
984 JOptionPane.showMessageDialog(null, "Dieser Kasse ist keine Empfänger der Abrechnungsdaten zugewiesen\n"+
985 "Abrechnung nach §302 ist nicht möglich!");
986 SqlInfo.sqlAusfuehren("update nummern set rnr='"+aktRechnung+"' where mandant='"+Reha.aktIK+"' LIMIT 1");
987 doDlgAbort();
988 return;
990 hmAnnahme = holeAdresseAnnahmestelle(true);
991 annahmeAdresseOk = true;
992 }else{
993 hmAnnahme = holeAdresseAnnahmestelle(false);
994 annahmeAdresseOk = true;
997 /********
1001 abrDlg.setVisible(true);
1003 holeEdifact();
1004 macheKopfDaten();
1005 macheEndeDaten();
1006 /********
1010 gesamtBuf.append(unbBuf.toString());
1011 gesamtBuf.append(positionenBuf.toString());
1012 gesamtBuf.append(unzBuf.toString());
1013 abrDlg.setzeLabel("übertrage EDIFACT in Datenbank");
1015 if(Reha.vollbetrieb && abrechnungsModus.equals(ABR_MODE_302)){
1016 PreparedStatement ps = null;
1017 try {
1018 ps = (PreparedStatement) Reha.thisClass.conn.prepareStatement(
1019 "insert into edifact (r_nummer, r_datum,r_edifact) VALUES (?,?,?)");
1020 ps.setString(1, aktRechnung);
1021 ps.setString(2, DatFunk.sDatInSQL(DatFunk.sHeute()));
1022 ps.setBytes(3, gesamtBuf.toString().getBytes());
1023 ps.executeUpdate();
1024 ps.close();
1025 ps = null;
1026 } catch (SQLException e1) {
1027 e1.printStackTrace();
1029 finally{
1030 if(ps != null){
1031 try {
1032 ps.close();
1033 } catch (SQLException e) {
1034 e.printStackTrace();
1036 ps = null;
1041 if(abrechnungsModus.equals(ABR_MODE_302)){
1042 try {
1044 f = new File(Reha.proghome+"edifact/"+Reha.aktIK+"/"+"esol0"+aktEsol+".org");
1045 fw = new FileWriter(f);
1046 bw = new BufferedWriter(fw);
1047 bw.write(gesamtBuf.toString());
1048 bw.flush();
1050 bw.close();
1051 fw.close();
1054 abrDlg.setzeLabel("Rechnungsdatei verschlüsseln");
1055 int originalSize = Integer.parseInt(Long.toString(f.length()));
1056 int encryptedSize = originalSize;
1057 String skeystore = SystemConfig.hmAbrechnung.get("hmkeystorefile");
1058 //String skeystore = Reha.proghome+"keystore/"+Reha.aktIK+"/"+Reha.aktIK+".p12";
1059 File fkeystore = new File(skeystore);
1060 if(! fkeystore.exists()){
1061 abrDlg.setzeLabel("Rechnungsdatei verschlüsseln - fehlgeschlagen!!!");
1062 String message = "<html>Auf Ihrem System ist keine (ITSG) Zertifikatsdatenbank vorhanden.<br>"+
1063 "Eine Verschlüsselung gemäß §302 SGB V kann daher nicht durchgeführt werden.<br><br>"+
1064 "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>";
1065 Reha.thisClass.progressStarten(false);
1066 JOptionPane.showMessageDialog(null, message);
1068 }else{
1070 encryptedSize = doVerschluesseln(aktEsol+".org");
1074 if(encryptedSize < 0){
1075 JOptionPane.showMessageDialog(null, "Es ist ein Fehler in der Verschlüsselung aufgetreten!");
1076 Reha.thisClass.progressStarten(false);
1077 abrDlg.setVisible(false);
1078 abrDlg.dispose();
1079 abrDlg = null;
1080 return;
1083 doAuftragsDatei(originalSize,encryptedSize);
1086 f = new File(Reha.proghome+"edifact/"+Reha.aktIK+"/"+"esol0"+aktEsol+".auf");
1087 fw = new FileWriter(f);
1088 bw = new BufferedWriter(fw);
1089 bw.write(auftragsBuf.toString());
1090 bw.close();
1091 fw.close();
1093 } catch (IOException e) {
1094 e.printStackTrace();
1096 abrDlg.setzeLabel("erstelle Email an: "+ik_email);
1099 try{
1100 if("1".equals(SystemConfig.hmAbrechnung.get("hmaskforemail"))){
1101 int frage = JOptionPane.showConfirmDialog(null,"Wollen Sie die Abrechnungsdatei esol0"+aktEsol+" an die Adresse\n"+
1102 "--> "+ik_email+" <-- versenden?","Benutzeranfrage",JOptionPane.YES_NO_OPTION);
1103 if(frage==JOptionPane.YES_OPTION){
1104 doEmail();
1106 }else{
1107 doEmail();
1111 String meldung = "Die Dateien "+"esol0"+aktEsol+".auf und "+"esol0"+aktEsol+" wurden erfolgreich\n"+
1112 "an die Adresse "+ik_email+" versandt.\n";
1113 JOptionPane.showMessageDialog(null, meldung);
1116 }catch(Exception ex){
1117 String meldung = "Die Dateien "+"esol0"+aktEsol+".auf und "+"esol0"+aktEsol+" sollten an die"+
1118 "Adresse "+ik_email+" gesendet werden.\n\n"+
1119 "Versand ist fehlgeschlagen, bitte von Hand erneut senden";
1120 JOptionPane.showMessageDialog(null, meldung);
1125 /*********************************************/
1127 abrDlg.setzeLabel("übertrage Rezepte in Historie");
1128 if(Reha.vollbetrieb){
1129 doUebertragen();
1130 abrDlg.setzeLabel("organisiere Abrechnungsprogramm");
1132 doLoescheRezepteAusTree();
1133 Reha.thisClass.progressStarten(false);
1134 abrDlg.setVisible(false);
1135 abrDlg.dispose();
1136 abrDlg = null;
1137 }catch(Exception ex){
1138 if(abrDlg != null){
1139 Reha.thisClass.progressStarten(false);
1140 abrDlg.setVisible(false);
1141 abrDlg.dispose();
1142 abrDlg = null;
1144 JOptionPane.showMessageDialog(null,"Fehler beim Abrechnungsvorgang:\n"+ex.getMessage());
1145 ex.printStackTrace();
1147 this.abrRez.setRechtsAufNull();
1149 /********************************************************************/
1150 private void doDlgAbort(){
1151 if(abrDlg != null){
1152 Reha.thisClass.progressStarten(false);
1153 abrDlg.setVisible(false);
1154 abrDlg.dispose();
1155 abrDlg = null;
1158 private void doEmail(){
1159 try{
1160 ////System.out.println("Erstelle Emailparameter.....");
1161 String smtphost = SystemConfig.hmEmailExtern.get("SmtpHost");
1162 //String pophost = SystemConfig.hmEmailExtern.get("Pop3Host");
1163 String authent = SystemConfig.hmEmailExtern.get("SmtpAuth");
1164 String benutzer = SystemConfig.hmEmailExtern.get("Username") ;
1165 String pass1 = SystemConfig.hmEmailExtern.get("Password");
1166 String sender = SystemConfig.hmEmailExtern.get("SenderAdresse");
1167 String secure = SystemConfig.hmEmailExtern.get("SmtpSecure");
1168 String useport = SystemConfig.hmEmailExtern.get("SmtpPort");
1169 //String recipient = "m.schuchmann@rta.de"+","+SystemConfig.hmEmailExtern.get("SenderAdresse");
1170 String recipient = ik_email+","+SystemConfig.hmEmailExtern.get("SenderAdresse");
1171 String text = "";
1172 boolean authx = (authent.equals("0") ? false : true);
1173 boolean bestaetigen = false;
1174 String[] encodedDat = {Reha.proghome+"edifact/"+Reha.aktIK+"/"+"esol0"+aktEsol,"esol0"+aktEsol};
1175 //String[] encodedDat = {Reha.proghome+"edifact/"+Reha.aktIK+"/"+"esol0"+aktEsol+".org","esol0"+aktEsol+".org"};
1176 String[] aufDat = {Reha.proghome+"edifact/"+Reha.aktIK+"/"+"esol0"+aktEsol+".auf","esol0"+aktEsol+".auf"};
1177 ArrayList<String[]> attachments = new ArrayList<String[]>();
1178 attachments.add(encodedDat);
1179 attachments.add(aufDat);
1180 EmailSendenExtern oMail = new EmailSendenExtern();
1181 try{
1182 ////System.out.println("Starte Emailversand.....");
1183 oMail.sendMail(smtphost, benutzer, pass1, sender, recipient, zertifikatVon.replace("IK", "")/*Reha.aktIK*/, text,attachments,authx,bestaetigen,secure,useport);
1184 oMail = null;
1185 ////System.out.println("Emailversand beendet.....");
1187 }catch(Exception e){
1188 e.printStackTrace( );
1189 JOptionPane.showMessageDialog(null, "Emailversand fehlgeschlagen\n\n"+
1190 "Mögliche Ursachen:\n"+
1191 "- falsche Angaben zu Ihrem Emailpostfach und/oder dem Provider\n"+
1192 "- Sie haben keinen Kontakt zum Internet"+"\n\nFehlertext:"+e.getLocalizedMessage());
1194 }catch(Exception ex){
1195 ex.printStackTrace();
1196 JOptionPane.showMessageDialog(null, "Emailversand fehlgeschlagen\n\n"+
1197 "Mögliche Ursachen:\n"+
1198 "- falsche Angaben zu Ihrem Emailpostfach und/oder dem Provider\n"+
1199 "- Sie haben keinen Kontakt zum Internet - Fehlermeldung:\n\n"+ex.getLocalizedMessage());
1202 /********************************************************************/
1203 private void doLoescheRezepteAusTree(){
1204 try{
1205 int lang = aktuellerKassenKnoten.getChildCount();
1206 JXTTreeNode node;
1207 for(int i = (lang-1); i >= 0;i--){
1208 node = (JXTTreeNode) aktuellerKassenKnoten.getChildAt(i);
1209 if(node.knotenObjekt.fertig){
1210 //////System.out.println("Lösche KindKnoten an "+i);
1211 //aktuellerKassenKnoten.remove(node);
1212 treeModelKasse.removeNodeFromParent(node);
1215 if(aktuellerKassenKnoten.getChildCount() <= 0){
1216 //rootKasse.remove(aktuellerKassenKnoten);
1217 treeModelKasse.removeNodeFromParent(aktuellerKassenKnoten);
1219 treeKasse.validate();
1220 this.treeKasse.repaint();
1221 }catch(Exception ex){
1222 ex.printStackTrace();
1225 /***************************************************************/
1226 private void doUebertragen(){
1227 try{
1228 String aktiverPatient = "";
1229 JComponent patient = AktiveFenster.getFensterAlle("PatientenVerwaltung");
1230 if(patient != null){
1231 aktiverPatient = Reha.thisClass.patpanel.aktPatID;
1234 Vector<String> feldNamen = SqlInfo.holeFeldNamen("verordn",true,Arrays.asList(new String[] {"id"}) );
1235 ////System.out.println(feldNamen);
1237 rechnungBuf.setLength(0);
1238 rechnungBuf.trimToSize();
1239 rechnungBuf.append("select ");
1241 int rezepte = 0;
1242 int rezeptFelder = 0;
1243 for(int i = 0; i < feldNamen.size();i++){
1244 if(i > 0){
1245 rechnungBuf.append(","+feldNamen.get(i));
1246 }else{
1247 rechnungBuf.append(feldNamen.get(i));
1250 rechnungBuf.append(" from verordn where rez_nr='");
1251 Vector<Vector<String>> vec = null;
1252 rezepte = abgerechneteRezepte.size();
1253 for(int i2 = 0; i2 < rezepte;i2++){
1254 abrDlg.setzeLabel("übertrage Rezepte in Historie, übertrage Rezept: "+abgerechneteRezepte.get(i2));
1255 vec = SqlInfo.holeFelder(rechnungBuf.toString()+abgerechneteRezepte.get(i2)+"'");
1256 rezeptFelder = vec.get(0).size();
1257 historieBuf.setLength(0);
1258 historieBuf.trimToSize();
1259 historieBuf.append("insert into lza set ");
1260 for(int i3 = 0; i3 < rezeptFelder;i3++){
1261 if(!vec.get(0).get(i3).equals("")){
1262 if(i3 > 0){
1263 historieBuf.append(","+feldNamen.get(i3)+"='"+StringTools.Escaped(vec.get(0).get(i3))+"'");
1264 }else{
1265 historieBuf.append(feldNamen.get(i3)+"='"+StringTools.Escaped(vec.get(0).get(i3))+"'");
1269 //////System.out.println(historieBuf.toString());
1270 //////System.out.println("Übertrage Rezept "+abgerechneteRezepte.get(i2)+" in Langzeitarchiv = Historie");
1272 SqlInfo.sqlAusfuehren(historieBuf.toString());
1275 /***
1278 * In der Echtfunktion muß das Löschen in der rezept-Datenbank eingeschaltet werden
1279 * und das sofortige Löschen aus der Historie auscheschaltet werden
1284 //SqlInfo.sqlAusfuehren("delete from lza where rez_nr='"+abgerechneteRezepte.get(i2)+"' LIMIT 1");
1285 String delrez = String.valueOf(abgerechneteRezepte.get(i2));
1286 SqlInfo.sqlAusfuehren("delete from fertige where rez_nr='"+delrez+"' LIMIT 1");
1287 SqlInfo.sqlAusfuehren("delete from verordn where rez_nr='"+delrez+"' LIMIT 1");
1288 SqlInfo.sqlAusfuehren("delete from volle where rez_nr='"+delrez+"'");
1289 if(aktiverPatient.equals(abgerechnetePatienten.get(i2)) ){
1290 posteAktualisierung(aktiverPatient.toString());
1291 //Reha.thisClass.patpanel.aktRezept.setzeKarteiLasche();
1296 }catch(Exception ex){
1297 ex.printStackTrace();
1300 private void posteAktualisierung(String patid){
1301 final String xpatid = patid;
1302 new SwingWorker<Void,Void>(){
1303 @Override
1304 protected Void doInBackground() throws Exception {
1305 String s1 = String.valueOf("#PATSUCHEN");
1306 String s2 = xpatid;
1307 PatStammEvent pEvt = new PatStammEvent(getInstance());
1308 pEvt.setPatStammEvent("PatSuchen");
1309 pEvt.setDetails(s1,s2,"") ;
1310 PatStammEventClass.firePatStammEvent(pEvt);
1311 return null;
1314 }.execute();
1316 /***************************************************************/
1317 private int doVerschluesseln(String datei){
1318 try {
1319 String keystore = SystemConfig.hmAbrechnung.get("hmkeystorefile");
1320 //String keystore = Reha.proghome+"keystore/"+Reha.aktIK+"/"+Reha.aktIK+".p12";
1322 //NebraskaKeystore store = new NebraskaKeystore(keystore, SystemConfig.hmAbrechnung.get("hmkeystorepw"),"123456", Reha.aktIK);
1323 NebraskaKeystore store = new NebraskaKeystore(keystore, SystemConfig.hmAbrechnung.get("hmkeystorepw"),"123456", zertifikatVon.replace("IK", ""));
1325 NebraskaEncryptor encryptor = store.getEncryptor(ik_nutzer);
1326 String inFile = Reha.proghome+"edifact/"+Reha.aktIK+"/"+"esol0"+aktEsol+".org";
1327 long size = encryptor.encrypt(inFile, inFile.replace(".org", ""));
1328 return Integer.parseInt(Long.toString(size));
1329 } catch (NebraskaCryptoException e) {
1330 e.printStackTrace();
1331 } catch (NebraskaFileException e) {
1332 e.printStackTrace();
1333 } catch (NebraskaNotInitializedException e) {
1334 e.printStackTrace();
1336 return -1;
1338 /***************************************************************/
1339 private void doAuftragsDatei(int originalSize,int encryptedSize){
1340 auftragsBuf.append("500000"+"01"+"00000348"+"000");
1341 auftragsBuf.append("ESOL0"+aktEsol);
1342 auftragsBuf.append(" ");
1343 auftragsBuf.append(StringTools.fuelleMitZeichen(zertifikatVon.replace("IK", "")/*Reha.aktIK*/, " ", false, 15));
1344 auftragsBuf.append(StringTools.fuelleMitZeichen(zertifikatVon.replace("IK", "")/*Reha.aktIK*/, " ", false, 15));
1345 auftragsBuf.append(StringTools.fuelleMitZeichen(ik_nutzer, " ", false, 15));
1346 auftragsBuf.append(StringTools.fuelleMitZeichen(ik_physika, " ", false, 15));
1347 auftragsBuf.append("000000");
1348 auftragsBuf.append("000000");
1349 auftragsBuf.append(abrDateiName);
1350 auftragsBuf.append(getEdiDatumFromDeutsch(DatFunk.sHeute())+getEdiTimeString(true));
1351 auftragsBuf.append(StringTools.fuelleMitZeichen("0", "0", false, 14));
1352 auftragsBuf.append(StringTools.fuelleMitZeichen("0", "0", false, 14));
1353 auftragsBuf.append(StringTools.fuelleMitZeichen("0", "0", false, 14));
1354 auftragsBuf.append("000000");
1355 auftragsBuf.append("0");
1356 auftragsBuf.append(StringTools.fuelleMitZeichen(Integer.toString(originalSize), "0", true, 12) );
1357 auftragsBuf.append(StringTools.fuelleMitZeichen(Integer.toString(encryptedSize), "0", true, 12) );
1358 auftragsBuf.append("I800");
1359 auftragsBuf.append("0303");
1360 auftragsBuf.append(" ");
1361 auftragsBuf.append(StringTools.fuelleMitZeichen("0", "0", true, 5) );
1362 auftragsBuf.append(StringTools.fuelleMitZeichen("0", "0", true, 8) );
1363 auftragsBuf.append("0");
1364 auftragsBuf.append("00");
1365 auftragsBuf.append("0");
1366 auftragsBuf.append(StringTools.fuelleMitZeichen("0", "0", true, 10) );
1367 auftragsBuf.append(StringTools.fuelleMitZeichen("0", "0", true, 6) );
1368 auftragsBuf.append(StringTools.fuelleMitZeichen(" ", " ", true, 28) );
1369 auftragsBuf.append(StringTools.fuelleMitZeichen(" ", " ", true, 44) );
1370 auftragsBuf.append(StringTools.fuelleMitZeichen(" ", " ", true, 30) );
1371 rlisteesol = String.valueOf(aktEsol); //aktEsol.toString();
1372 rlistekasse = String.valueOf(getAbrechnungKasse());
1374 /*************************************************/
1375 private void macheEndeDaten(){
1376 String zeilenzahl = StringTools.fuelleMitZeichen(Integer.toString(positionenAnzahl+4), "0", true, 6);
1377 unzBuf.append("UNT"+plus+zeilenzahl+plus+"00002"+EOL);
1378 unzBuf.append("UNZ"+plus+"000002"+plus+aktDfue+EOL);
1381 /***************************************************************/
1383 private void macheKopfDaten(){
1384 //aktRechnung = Integer.toString(SqlInfo.erzeugeNummer("rnr"));
1385 new SwingWorker<Void,Void>(){
1386 @Override
1387 protected Void doInBackground() throws Exception {
1388 //hmAnnahme = holeAdresseAnnahmestelle();
1389 if(!annahmeAdresseOk){
1390 long zeit = System.currentTimeMillis();
1391 while(!annahmeAdresseOk){
1392 Thread.sleep(50);
1393 if(System.currentTimeMillis()-zeit > 5000){
1394 JOptionPane.showMessageDialog(null,"Adresse der Annahmestelle konnte nicht ermittelt werden");
1395 break;
1400 if(abrDruck != null){
1401 abrDruck.setIKundRnr(ik_papier, aktRechnung,hmAnnahme);
1402 abrDruck = null;
1403 }else{
1404 JOptionPane.showMessageDialog(null, "Fehler im Rechnungsdruck - Fehler = abrDruck==null");
1406 try{
1407 rezepteUebertragen();
1408 rechnungAnlegen();
1409 }catch(Exception ex){
1410 ex.printStackTrace();
1411 JOptionPane.showMessageDialog(null, "Fehler im Modul Rezept übertragen und Rechnung anlegen\n"+ex.getMessage());
1413 if(abrechnungsModus.equals(ABR_MODE_302)){
1414 try{
1415 Thread.sleep(100);
1416 new BegleitzettelDrucken(getInstance(),abrechnungRezepte,ik_kostent,name_kostent,hmAnnahme, aktRechnung,Reha.proghome+"vorlagen/"+Reha.aktIK+"/"+SystemConfig.hmAbrechnung.get("hmgkvbegleitzettel"));
1417 }catch(Exception ex){
1418 JOptionPane.showMessageDialog(null, "Fehler im Modul BegleitzettlDrucken - Fehler-Exception: ex\n"+ex.getMessage());
1421 return null;
1423 }.execute();
1424 //////System.out.println(aktEsol + " - "+aktDfue);
1425 String sgruppe = null;
1426 if(this.aktDisziplin.equals("Rsport")){
1427 sgruppe = "H";
1428 }else if(this.aktDisziplin.equals("Ftrain")){
1429 sgruppe = "I";
1430 }else{
1431 sgruppe = "B";
1434 unbBuf.append("UNB+UNOC:3+"+zertifikatVon.replace("IK", "")/*Reha.aktIK*/+plus+ik_nutzer+plus);
1435 unbBuf.append(getEdiDatumFromDeutsch(DatFunk.sHeute())+":"+getEdiTimeString(false)+plus);
1436 unbBuf.append(aktDfue+plus+sgruppe+plus);
1437 abrDateiName = "SL"+zertifikatVon.replace("IK", "").substring(2,8)/*Reha.aktIK.substring(2,8)*/+"S"+getEdiMonat();
1438 unbBuf.append(abrDateiName+plus);
1439 unbBuf.append("2"+EOL);
1440 //unbBuf.append(aktDfue+plus+"B"+plus+"SL"+Reha.aktIK.substring(2,8)+"S"+getEdiMonat()+plus+"2"+EOL);
1442 unbBuf.append("UNH+00001+SLGA:"+SlgaVersion+":0:0"+EOL);
1443 unbBuf.append("FKT+01"+plus+plus+Reha.aktIK+plus+ik_kostent+plus+ik_kasse+plus+zertifikatVon.replace("IK", "")/*Reha.aktIK*/+EOL);
1444 unbBuf.append("REC"+plus+aktRechnung+":0"+plus+getEdiDatumFromDeutsch(DatFunk.sHeute())+plus+(lOwnCert ? "1" : "2")+EOL);
1445 unbBuf.append("UST"+plus+SystemConfig.hmFirmenDaten.get("Steuernummer")+plus+"J"+EOL);
1446 unbBuf.append("GES"+plus+"00"+plus+dfx.format(preis00[0])+plus+dfx.format(preis00[1])+plus+dfx.format(preis00[2])+EOL);
1447 unbBuf.append("GES"+plus+"11"+plus+dfx.format(preis11[0])+plus+dfx.format(preis11[1])+plus+dfx.format(preis11[2])+EOL);
1448 unbBuf.append("GES"+plus+"31"+plus+dfx.format(preis31[0])+plus+dfx.format(preis31[1])+plus+dfx.format(preis31[2])+EOL);
1449 unbBuf.append("GES"+plus+"51"+plus+dfx.format(preis51[0])+plus+dfx.format(preis51[1])+plus+dfx.format(preis51[2])+EOL);
1450 unbBuf.append("NAM"+plus+
1451 (abrRez.hochKomma(SystemConfig.hmFirmenDaten.get("Ikbezeichnung")).length() > 30 ?
1452 abrRez.hochKomma(SystemConfig.hmFirmenDaten.get("Ikbezeichnung")).substring(0,30) :
1453 abrRez.hochKomma(SystemConfig.hmFirmenDaten.get("Ikbezeichnung")) )+plus+
1454 abrRez.hochKomma(SystemConfig.hmFirmenDaten.get("Anrede")).trim()+" "+
1455 (abrRez.hochKomma(SystemConfig.hmFirmenDaten.get("Nachname")).trim().length() > 25 ?
1456 abrRez.hochKomma(SystemConfig.hmFirmenDaten.get("Nachname")).trim().substring(0,25) :
1457 abrRez.hochKomma(SystemConfig.hmFirmenDaten.get("Nachname")).trim() )+
1458 plus+SystemConfig.hmFirmenDaten.get("Telefon")+EOL);
1459 unbBuf.append("UNT+000010+00001"+EOL);
1460 unbBuf.append("UNH+00002+SLLA:"+SllaVersion+":0:0"+EOL);
1461 unbBuf.append("FKT+01"+plus+plus+Reha.aktIK+plus+ik_kostent+plus+ik_kasse+EOL);
1462 unbBuf.append("REC"+plus+aktRechnung+":0"+plus+getEdiDatumFromDeutsch(DatFunk.sHeute())+plus+(lOwnCert ? "1" : "2")+EOL);
1463 getEdiTimeString(false);
1466 /***************************************************************/
1468 AbrechnungGKV getInstance(){
1469 return this;
1472 /***************************************************************/
1474 private String holeNameKostentraeger(){
1475 Vector<Vector<String>> vec = SqlInfo.holeFelder("select name1 from ktraeger where ikkasse ='"+ik_kostent+"' LIMIT 1");
1476 if(vec.size()==0){
1477 return "";
1479 return vec.get(0).get(0);
1482 private void holeAlleKostentraegerDaten(){
1483 abzurechnendeKassenID = getAktKTraeger();
1484 String preisgr = getPreisgruppenKuerzel(aktDisziplin);
1485 String cmd = "select ik_kasse,ik_kostent,ik_nutzer,ik_physika,ik_papier,"+preisgr+" from kass_adr where ik_kasse='"+abzurechnendeKassenID+"' LIMIT 1";
1486 kassenIKs.clear();
1487 kassenIKs = SqlInfo.holeFelder(cmd);
1488 ////System.out.println(cmd);
1489 if(kassenIKs.size()<=0){
1490 Reha.thisClass.progressStarten(false);
1491 abrDlg.setVisible(false);
1492 abrDlg.dispose();
1493 abrDlg = null;
1494 JOptionPane.showMessageDialog(null, "Fehler - Daten der Krankenkasse konnten nicht ermittelt werden");
1495 return;
1497 ik_kasse = kassenIKs.get(0).get(0);
1498 ik_kostent = kassenIKs.get(0).get(1);
1499 ik_nutzer = kassenIKs.get(0).get(2);
1500 ik_physika = kassenIKs.get(0).get(3);
1501 ik_papier = kassenIKs.get(0).get(4);
1502 ik_email = SqlInfo.holeEinzelFeld("select email from ktraeger where ikkasse='"+ik_physika+"' LIMIT 1");
1503 preisVector = RezTools.holePreisVector(diszis[cmbDiszi.getSelectedIndex()],Integer.parseInt(kassenIKs.get(0).get(5))-1);
1504 name_kostent = holeNameKostentraeger();
1505 String test = "IK der Krankenkasse: "+ik_kasse+"\n"+
1506 "IK des Kostenträgers: "+ik_kostent+"\n"+
1507 "IK des Nutzer mit EntschlüsselungsbefungnisKostenträgers: "+ik_nutzer+"\n"+
1508 "IK der Datenannahmestelle: "+ik_physika+"\n"+
1509 "IK der Papierannahmestelle: "+ik_papier+"\n"+
1510 "Emailadresse der Datenannahmestelle: "+ik_email+"\n"+
1511 "Name des Kostenträgers: "+name_kostent;
1514 /***************************************************************/
1516 private HashMap<String,String> holeAdresseAnnahmestelle(boolean nach302){
1517 HashMap<String,String> hmAdresse = new HashMap<String,String>();
1518 String[] hmKeys = {"<gkv1>","<gkv2>","<gkv3>","<gkv4>","<gkv5>","<gkv6>"};
1519 if(nach302){
1520 Vector<Vector<String>> vec = SqlInfo.holeFelder("select kassen_nam1,kassen_nam2,strasse,plz,ort from kass_adr where ik_kasse ='"+ik_papier+"' LIMIT 1");
1521 if(vec.size()==0){
1522 vec = SqlInfo.holeFelder("select name1,name2,adresse3,adresse1,adresse2 from ktraeger where ikkasse ='"+ik_papier+"' LIMIT 1");
1523 if(vec.size()==0){
1524 for(int i = 0; i < hmKeys.length-1;i++){
1525 hmAdresse.put(hmKeys[i], "");
1527 hmAdresse.put(hmKeys[5],aktRechnung);
1528 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");
1529 return hmAdresse;
1532 hmAdresse.put(hmKeys[0],vec.get(0).get(0) );
1533 hmAdresse.put(hmKeys[1],vec.get(0).get(1) );
1534 hmAdresse.put(hmKeys[2],vec.get(0).get(2) );
1535 hmAdresse.put(hmKeys[3],vec.get(0).get(3)+" "+vec.get(0).get(4));
1536 hmAdresse.put(hmKeys[4],"");
1537 hmAdresse.put(hmKeys[5],aktRechnung);
1538 return hmAdresse;
1539 }else{
1540 hmAdresse.put(hmKeys[0],hmAlternativeKasse.get("<Ivnam1>") );
1541 hmAdresse.put(hmKeys[1],hmAlternativeKasse.get("<Ivnam2>") );
1542 hmAdresse.put(hmKeys[2],hmAlternativeKasse.get("<Ivstrasse>") );
1543 hmAdresse.put(hmKeys[3],hmAlternativeKasse.get("<Ivplz>")+" "+hmAlternativeKasse.get("<Ivort>"));
1544 hmAdresse.put(hmKeys[4],"");
1545 hmAdresse.put(hmKeys[5],aktRechnung);
1547 return hmAdresse;
1550 /***************************************************************/
1552 private Double[] setzePreiseAufNull(Double[] preis){
1553 preis[0] = 0.00;
1554 preis[1] = 0.00;
1555 preis[2] = 0.00;
1556 return preis;
1558 private String getEdiMonat(){
1559 String tag = DatFunk.sHeute();
1560 return tag.substring(3,5);
1562 private String getEdiDatumFromDeutsch(String deutschDat){
1563 if(deutschDat.trim().length()<10){
1564 return "";
1566 return deutschDat.substring(6)+deutschDat.substring(3,5)+deutschDat.substring(0,2);
1568 private String getEdiTimeString(boolean mitsekunden){
1569 Date date = new Date();
1570 String[] datesplit = date.toString().split(" ");
1571 //////System.out.println(date.toString());
1572 if(mitsekunden){
1573 //////System.out.println("Zeit mit Sekunden"+datesplit[3].substring(0,2)+datesplit[3].substring(3,5)+datesplit[3].substring(6,8));
1574 return datesplit[3].substring(0,2)+datesplit[3].substring(3,5)+datesplit[3].substring(6,8);
1576 return datesplit[3].substring(0,2)+datesplit[3].substring(3,5);
1580 /***************************************************************/
1582 private void holeEdifact(){
1583 try {
1584 if(SystemConfig.hmAbrechnung.get("hmgkvrauchdrucken").equals("1")){
1585 abrDruck = new AbrechnungDrucken(this,Reha.proghome+
1586 "vorlagen/"+
1587 Reha.aktIK+
1588 "/"+
1589 SystemConfig.hmAbrechnung.get("hmgkvformular"));
1592 } catch (Exception e) {
1593 JOptionPane.showMessageDialog(null,"Fehler im Modul Rechnungdruck in AbrechnungGKV.java");
1594 abrDruck = null;
1595 e.printStackTrace();
1597 int lang = aktuellerKassenKnoten.getChildCount();
1598 JXTTreeNode node;
1599 Vector<Vector<String>> vec;
1600 for(int i = 0; i < lang;i++){
1601 node = (JXTTreeNode) aktuellerKassenKnoten.getChildAt(i);
1602 if(node.knotenObjekt.fertig){
1603 vec = SqlInfo.holeFelder("select edifact from fertige where rez_nr='"+(String) node.knotenObjekt.rez_num+"'");
1604 //abrDlg.setzeLabel("Edifact-Daten holen von Rezept:"+(String) node.knotenObjekt.rez_num);
1605 try{
1606 if(!annahmeAdresseOk){
1607 long zeit = System.currentTimeMillis();
1608 while(!annahmeAdresseOk){
1609 Thread.sleep(50);
1610 if(System.currentTimeMillis()-zeit > 5000){
1611 JOptionPane.showMessageDialog(null,"Adresse der Annahmestelle konnte nicht ermittelt werden");
1612 break;
1616 Thread.sleep(75);
1617 //abzurechnendeKassenID = holeAbrechnungsKasse(vec.get(0).get(0));
1618 abgerechneteRezepte.add((String) node.knotenObjekt.rez_num);
1619 abgerechnetePatienten.add((String) node.knotenObjekt.pat_intern);
1620 //hier den Edifact-Code analysieren und die Rechnungsdatei erstellen;
1621 try{
1622 analysierenEdifact(vec.get(0).get(0),(String) node.knotenObjekt.rez_num);
1623 }catch(Exception ex){
1624 ex.printStackTrace();
1625 JOptionPane.showMessageDialog(null,"Unbekannter Fehler bei Edifact analysierenEdifact()\n"+ex.getLocalizedMessage());
1628 try{
1629 anhaengenEdifact(vec.get(0).get(0));
1630 }catch(Exception ex){
1631 JOptionPane.showMessageDialog(null,"Unbekannter Fehler bei Edifact anhaengenEdifact()\n"+ex.getLocalizedMessage());
1634 }catch(Exception ex){
1635 JOptionPane.showMessageDialog(null,"Unbekannter Fehler bei Edifact anhängen");
1639 if(abgerechneteRezepte.size() > 0){
1640 /**************Hier den offenen Posten anlegen***************/
1641 abrDlg.setzeLabel("Offene Posten anlegen für Rechnung Nr.: "+aktRechnung );
1642 ////System.out.println(" abgerechnete Rezepte = "+abgerechneteRezepte);
1643 ////System.out.println("abgerechnete Patienten = "+abgerechnetePatienten);
1644 ////System.out.println("abger. Bruttovolumen = "+preis00[1]);
1645 ////System.out.println(" abger. Rezeptanteil = "+preis00[2]);
1646 ////System.out.println(" abger. Nettovolumen = "+preis00[0]);
1647 ////System.out.println("Name der abger. Kasse = "+name_kostent);
1648 ////System.out.println(" IK-Kostenträger = "+ik_kostent);
1649 ////System.out.println(" Disziplin = "+diszis[cmbDiszi.getSelectedIndex()]);
1650 ////System.out.println(" Rechnung Nr. = "+aktRechnung);
1651 if(Reha.vollbetrieb){
1652 anlegenOP();
1658 /***************************************************************/
1660 private void anlegenOP(){
1661 /************************************************/
1662 rechnungBuf.setLength(0);
1663 rechnungBuf.trimToSize();
1664 rechnungBuf.append("insert into rliste set ");
1665 rechnungBuf.append("r_nummer='"+aktRechnung+"', ");
1666 rechnungBuf.append("r_datum='"+DatFunk.sDatInSQL(DatFunk.sHeute())+"', ");
1667 rechnungBuf.append("r_kasse='"+hmKostentraeger.get("name1")+", "+"esol0"+hmKostentraeger.get("aktesol")+"', ");
1668 rechnungBuf.append("r_klasse='"+diszis[cmbDiszi.getSelectedIndex()]+"', ");
1669 rechnungBuf.append("r_betrag='"+dfx.format(preis00[0]).replace(",", ".")+"', ");
1670 rechnungBuf.append("r_offen='"+dfx.format(preis00[0]).replace(",", ".")+"', ");
1671 rechnungBuf.append("r_zuzahl='"+dfx.format(preis00[2]).replace(",", ".")+"', ");
1672 rechnungBuf.append("ikktraeger='"+ik_kostent+"',");
1673 rechnungBuf.append("ik='"+Reha.aktIK+"'");
1674 SqlInfo.sqlAusfuehren(rechnungBuf.toString());
1677 /***************************************************************/
1679 private void analysierenEdifact(String edifact,String rez_num){
1680 //////System.out.println(edifact);
1681 Vector<String> position = new Vector<String>();
1682 Vector<BigDecimal>anzahl = new Vector<BigDecimal>();
1683 Vector<BigDecimal>preis = new Vector<BigDecimal>();
1684 Vector<BigDecimal>einzelpreis = new Vector<BigDecimal>();
1685 Vector<BigDecimal>einzelzuzahlung = new Vector<BigDecimal>();
1686 Vector<BigDecimal>rezgeb = new Vector<BigDecimal>();
1687 Vector<BigDecimal>abrtage = new Vector<BigDecimal>();
1688 BigDecimal bdAnzahl = null;
1689 BigDecimal einzelPreisTest = null;
1690 //BigDecimal zuzahlTest = null;
1691 String[] zeilen = edifact.split("\n");
1692 boolean preisUmstellung = false;
1693 boolean zuzahlUmstellung = false;
1694 String[] woerter;
1695 String dummy;
1696 int pos = 0;
1697 int zugabe = 0;
1698 for(int i = 0; i < zeilen.length;i++){
1699 if(zeilen[i].startsWith("EHE+") || zeilen[i].startsWith("ENF++") ){
1700 if(zeilen[i].startsWith("ENF++")){
1701 zugabe = 1;
1703 woerter = zeilen[i].split("\\+");
1704 if(!position.contains(woerter[2+zugabe])){
1705 position.add(woerter[2+zugabe]);
1706 bdAnzahl = BigDecimal.valueOf(Double.valueOf(woerter[3+zugabe].replace(",", ".")));
1707 anzahl.add(bdAnzahl);
1708 abrtage.add(BigDecimal.valueOf(Double.valueOf("1.00")));
1709 preis.add(BigDecimal.valueOf(Double.valueOf(woerter[4+zugabe].replace(",", "."))).multiply(
1710 bdAnzahl ));
1711 if(woerter.length==(7+zugabe)){
1712 //Einstieg2 für Kilometer
1713 dummy = woerter[6+zugabe].replace("'", "").replace(",", ".");
1714 if(zuzahlModusDefault){
1715 rezgeb.add(BigDecimal.valueOf(Double.valueOf(dummy)));
1716 einzelzuzahlung.add(BigDecimal.valueOf(Double.valueOf(dummy)));
1717 }else{
1719 System.out.println("Dummy = "+dummy);
1720 System.out.println("Muliplikator = "+bdAnzahl);
1722 //Herr Lehmann: nächste Zeile muß freigeschaltet werden für Einzelkilometer
1723 rezgeb.add(BigDecimal.valueOf(Double.valueOf(dummy)).multiply(bdAnzahl));
1724 //Herr Lehmann: nächste Zeile muß freigeschaltet werden für Einzelkilometer
1725 einzelzuzahlung.add(BigDecimal.valueOf(Double.valueOf(dummy)).multiply(bdAnzahl));
1727 }else{
1728 rezgeb.add(BigDecimal.valueOf(Double.valueOf("0.00")));
1729 einzelzuzahlung.add(BigDecimal.valueOf(Double.valueOf("0.00")));
1732 einzelpreis.add(BigDecimal.valueOf(Double.valueOf(woerter[4+zugabe].replace(",", "."))));
1734 }else{
1735 pos = position.indexOf(woerter[2+zugabe]);
1736 einzelPreisTest = BigDecimal.valueOf(Double.valueOf(woerter[4+zugabe].replace(",", ".")));
1737 if(!einzelPreisTest.equals(einzelpreis.get(pos))){
1738 preisUmstellung = true;
1740 bdAnzahl = BigDecimal.valueOf(Double.valueOf(woerter[3+zugabe].replace(",", ".")));
1741 anzahl.set(pos, anzahl.get(pos).add(BigDecimal.valueOf(Double.valueOf(woerter[3+zugabe].replace(",", ".")))));
1742 preis.set(pos, preis.get(pos).add(BigDecimal.valueOf(Double.valueOf(woerter[4+zugabe].replace(",", "."))).multiply(
1743 bdAnzahl)));
1744 abrtage.set(pos,abrtage.get(pos).add(BigDecimal.valueOf(Double.valueOf("1.00"))));
1745 if(woerter.length==(7+zugabe)){
1746 //Einstieg3 für Kilometer
1747 dummy = woerter[6+zugabe].replace("'", "").replace(",", ".");
1748 if(zuzahlModusDefault){
1749 rezgeb.set(pos,rezgeb.get(pos).add(BigDecimal.valueOf(Double.valueOf(dummy))));
1750 if(! BigDecimal.valueOf(Double.valueOf(dummy)).equals(einzelzuzahlung.get(pos))){
1751 zuzahlUmstellung = true;
1753 }else{
1754 //Herr Lehmann: nächste Zeile muß freigeschaltet werden für Einzelkilometer
1756 System.out.println("Dummy = "+dummy);
1757 System.out.println("Muliplikator (falsch) = "+anzahl.get(pos));
1758 System.out.println("Muliplikator (richtig) = "+bdAnzahl);
1760 rezgeb.set(pos,rezgeb.get(pos).add(BigDecimal.valueOf(Double.valueOf(dummy)).multiply(bdAnzahl)));
1761 //Herr Lehmann: nächste Zeile muß freigeschaltet werden für Einzelkilometer
1762 if(! BigDecimal.valueOf(Double.valueOf(dummy)).multiply(bdAnzahl).equals(einzelzuzahlung.get(pos))){
1763 zuzahlUmstellung = true;
1766 rezgeb.set(pos,rezgeb.get(pos).add(BigDecimal.valueOf(Double.valueOf(dummy)).multiply(anzahl.get(pos))));
1767 if(! BigDecimal.valueOf(Double.valueOf(dummy)).multiply(bdAnzahl).equals(einzelzuzahlung.get(pos))){
1768 zuzahlUmstellung = true;
1772 }else{
1773 //System.out.println("Keine Zuzahlung Dummy = ");
1774 //System.out.println("Keine Zuzahlung Muliplikator = "+anzahl.get(pos));
1775 rezgeb.set(pos,rezgeb.get(pos).add(BigDecimal.valueOf(Double.valueOf("0.00"))));
1776 if(!BigDecimal.valueOf(Double.valueOf("0.00")).equals(einzelzuzahlung.get(pos))){
1777 //////System.out.println("Einzelzuzahlung = "+einzelzuzahlung.get(pos));
1778 //////System.out.println("Vergleichswert = 0.00 ");
1779 zuzahlUmstellung = true;
1780 //System.out.println("Umstellung der Zuzahlung = "+zuzahlUmstellung);
1785 try {
1786 Thread.sleep(15);
1787 } catch (InterruptedException e) {
1788 e.printStackTrace();
1789 JOptionPane.showMessageDialog(null,"Fehler in Thread.sleep(25) analysierenEdifact\n"+e.getMessage());
1792 String[] splits = zeilen[0].split(":");
1794 try {
1795 abrechnungRezepte++;
1796 if(abrDruck != null){
1797 abrDruck.setDaten(splits[9].split("=")[1],
1798 splits[10].split("=")[1],
1799 splits[2].split("=")[1],
1800 position,
1801 anzahl,
1802 abrtage,
1803 einzelpreis,
1804 preis,
1805 rezgeb,
1806 (splits[6].split("=")[1].equals("10,00") ? true : false));
1809 ////System.out.println(" Rezept Nr. ="+abrechnungRezepte+" ********Abrechnungsposition Anfang********");
1810 ////System.out.println(" Name = "+splits[9].split("=")[1]);
1811 ////System.out.println(" Status = "+splits[10].split("=")[1]);
1812 ////System.out.println(" RezeptNr. = "+splits[2].split("=")[1]);
1813 ////System.out.println(" Positionen Vector = "+position);
1814 ////System.out.println(" Anzahl Vector = "+anzahl);
1815 ////System.out.println(" Abr.tage Vector = "+abrtage);
1816 ////System.out.println(" Einzelpreis Vector = "+einzelpreis);
1817 ////System.out.println(" Kummulierte Preise = "+preis);
1818 ////System.out.println(" Kummulierte Zuzahl.= "+rezgeb);
1819 ////System.out.println(" Zuzahlungen einzel = "+einzelzuzahlung);
1820 ////System.out.println(" mit Pauschale = "+(splits[6].split("=")[1].equals("10,00") ? true : false));
1821 ////System.out.println("mit Preisumstellung = "+preisUmstellung);
1822 ////System.out.println(" mit Zuzahlwechsel = "+zuzahlUmstellung);
1823 ////System.out.println("bislang abgerechnet = "+abgerechneteRezepte);
1824 ////System.out.println(" Rechnungsadresse = "+hmAnnahme);
1825 ////System.out.println("Rezept Nr. ="+abrechnungRezepte+" ********Abrechnungsposition Ende********");
1827 /////////////////Hier die Sätze in der Rechnungsdatei anlegen///////////////
1828 if(Reha.vollbetrieb){
1829 schreibeInRechnungDB(
1830 splits,
1831 position,
1832 anzahl,
1833 abrtage,
1834 einzelpreis,
1835 preis,
1836 rezgeb,
1837 preisUmstellung,
1838 zuzahlUmstellung);
1841 } catch (Exception e) {
1842 e.printStackTrace();
1846 /***************************************************************/
1848 private void schreibeInRechnungDB(
1849 String[] kopf,
1850 Vector<String> positionen,
1851 Vector<BigDecimal>anzahl,
1852 Vector<BigDecimal>abrtage,
1853 Vector<BigDecimal>einzelpreis,
1854 Vector<BigDecimal>preis,
1855 Vector<BigDecimal>rezgeb,
1856 boolean preisUmstellung,
1857 boolean zuzahlUmstellung){
1858 try{
1859 if(hmAnnahme.get("<gkv1>").trim().equals("")){
1860 holeAdresseAnnahmestelle(true);
1862 }catch(Exception ex){
1863 holeAdresseAnnahmestelle(true);
1865 abrDlg.setzeLabel("Rechnungssatz erstellen für Rezept: "+kopf[2].split("=")[1]);
1866 String cmdKopf = "insert into faktura set ";
1867 for(int i = 0; i< positionen.size();i++){
1868 rechnungBuf.setLength(0);
1869 rechnungBuf.trimToSize();
1870 rechnungBuf.append(cmdKopf);
1871 if(i==0){
1872 rechnungBuf.append("kassen_nam='"+hmAnnahme.get("<gkv1>")+"', ");
1873 rechnungBuf.append("kassen_na2='"+hmAnnahme.get("<gkv2>")+"', ");
1874 rechnungBuf.append("strasse='"+hmAnnahme.get("<gkv3>")+"', ");
1875 try{
1876 rechnungBuf.append("plz='"+hmAnnahme.get("<gkv4>").split(" ")[0]+"', ");
1877 rechnungBuf.append("ort='"+hmAnnahme.get("<gkv4>").split(" ")[1]+"', ");
1878 rechnungBuf.append("name='"+kopf[9].split("=")[1]+"', ");
1879 }catch(Exception ex){
1880 JOptionPane.showMessageDialog(null, "Fehler in der Adressaufbereitung - Tabelle=Faktura");
1881 ex.printStackTrace();
1884 rechnungBuf.append("lfnr='"+Integer.toString(i)+"', ");
1885 rechnungBuf.append("status='"+ kopf[10].split("=")[1]+"', ");
1886 rechnungBuf.append("pos_kas='"+ positionen.get(i) +"', ");
1887 rechnungBuf.append("pos_int='"+ RezTools.getIDFromPos(positionen.get(i),kopf[0].split("=")[1] ,preisVector) +"', ");
1888 rechnungBuf.append("anzahl='"+ Integer.toString(anzahl.get(i).intValue()) +"', ");
1889 rechnungBuf.append("anzahltage='"+ Integer.toString(abrtage.get(i).intValue()) +"', ");
1890 rechnungBuf.append("preis='"+ dfx.format(einzelpreis.get(i).doubleValue()).replace(",", ".") +"', ");
1891 rechnungBuf.append("gesamt='"+ dfx.format(preis.get(i).doubleValue()).replace(",", ".") +"', ");
1892 rechnungBuf.append("zzbetrag='"+ dfx.format(rezgeb.get(i).doubleValue()).replace(",", ".") +"', ");
1893 rechnungBuf.append("netto='"+ dfx.format((preis.get(i).subtract(rezgeb.get(i))).doubleValue()).replace(",", ".") +"', ");
1894 rechnungBuf.append("pauschale='"+ kopf[6].split("=")[1].replace(",", ".") +"', ");
1895 rechnungBuf.append("rez_nr='"+ kopf[2].split("=")[1] +"', ");
1896 if(! anzahl.get(i).equals(abrtage.get(i))){
1897 rechnungBuf.append("kilometer='"+ dfx.format((anzahl.get(i).divide(abrtage.get(i)).doubleValue())).replace(",",".") +"', ");
1899 rechnungBuf.append("rezeptart='0', ");
1900 rechnungBuf.append("pat_intern='"+kopf[1].split("=")[1]+"', ");
1901 rechnungBuf.append("rnummer='"+ aktRechnung +"', ");
1902 rechnungBuf.append("kassid='"+kopf[7].split("=")[1]+"', ");
1903 rechnungBuf.append("arztid='"+kopf[8].split("=")[1]+"', ");
1904 rechnungBuf.append("zzindex='"+ kopf[12].split("=")[1] +"', ");
1905 rechnungBuf.append("preisdiff='"+ (preisUmstellung ? "T" : "F") +"', ");
1906 rechnungBuf.append("zuzahldiff='"+ (zuzahlUmstellung ? "T" : "F") +"', ");
1907 rechnungBuf.append("disziplin='"+ kopf[2].split("=")[1].subSequence(0, 2) +"', ");
1908 rechnungBuf.append("rdatum='"+ DatFunk.sDatInSQL(DatFunk.sHeute()) +"',");
1909 rechnungBuf.append("ik='"+ Reha.aktIK +"'");
1910 SqlInfo.sqlAusfuehren(rechnungBuf.toString());
1915 /***************************************************************/
1917 private String holeAbrechnungsKasse(String edifact){
1918 String[] komplett = edifact.split("\n");
1919 String[] zeile1 = komplett[0].split(":");
1920 return zeile1[7].split("=")[1];
1923 /*************************************************/
1924 private void anhaengenEdifact(String string){
1925 String[] edi = string.split("\n");
1926 //String[] preise = edi[0].split(":");
1927 String status = "";
1928 try{
1929 status = edi[4].split("\\+")[2];
1930 }catch(Exception ex){
1931 status = "10001";
1933 for(int i = 4; i < edi.length;i++){
1934 positionenBuf.append(edi[i]+System.getProperty("line.separator") );
1935 positionenAnzahl++;
1937 try {
1938 Thread.sleep(50);
1939 } catch (InterruptedException e) {
1940 e.printStackTrace();
1942 if(status.startsWith("1")){
1943 preis11 = addierePreise(preis11,edi[edi.length-1]);
1944 }else if(status.startsWith("3")){
1945 preis31 = addierePreise(preis31,edi[edi.length-1]);
1946 }else if(status.startsWith("5")){
1947 preis51 = addierePreise(preis51,edi[edi.length-1]);
1950 /*************************************************/
1951 private Double[] addierePreise(Double[] preis,String zeile){
1952 String[] zahlen = zeile.split("\\+");
1953 Double brutto = Double.parseDouble(zahlen[1].replace(",", "."));
1954 Double zuzahl = Double.parseDouble(zahlen[2].replace(",", "."));
1955 preis[1] = preis[1]+ brutto;
1956 preis[2] = preis[2]+ zuzahl;
1957 preis[0] = preis[0] + (brutto-zuzahl);
1958 preis00[0] = preis00[0] + (brutto-zuzahl);
1959 preis00[1] = preis00[1] + (brutto);
1960 preis00[2] = preis00[2] + (zuzahl);
1961 return preis;
1963 /*************************************************/
1964 public boolean isRezeptSelected(){
1965 if(treeKasse.getSelectionCount()<=0){
1966 return false;
1968 TreePath path = treeKasse.getSelectionPath();
1969 return (path.getPathCount()>=3);
1971 String getAktKTraeger(){
1972 TreePath path = treeKasse.getSelectionPath();
1973 JXTTreeNode node = (JXTTreeNode) path.getLastPathComponent();
1974 return ((KnotenObjekt)node.getUserObject()).ikkasse;
1976 public void setRezeptOk(boolean ok){
1978 treeKasse.getSelectionCount();
1979 TreePath path = treeKasse.getSelectionPath();
1980 JXTTreeNode node = (JXTTreeNode) path.getLastPathComponent();
1981 ((KnotenObjekt)node.getUserObject()).fertig = ok;
1982 if(ok){
1983 kontrollierteRezepte++;
1984 }else{
1985 kontrollierteRezepte--;
1987 treeKasse.repaint();
1989 public String getPreisgruppenKuerzel(String disziplin){
1990 if(disziplin.equals("Physio")){
1991 return "pgkg";
1992 }else if(disziplin.equals("Massage")){
1993 return "pgma";
1994 }else if(disziplin.equals("Ergo")){
1995 return "pger";
1996 }else if(disziplin.equals("Logo")){
1997 return "pglo";
1998 }else if(disziplin.equals("Reha")){
1999 return "pgrh";
2000 }else if(disziplin.equals("Podo")){
2001 return "pgpo";
2002 }else if(disziplin.equals("Rsport")){
2003 return "pgrs";
2004 }else if(disziplin.equals("Ftrain")){
2005 return "pgft";
2006 }else{
2007 return "pgkg";
2010 /***************************************/
2012 private static class JXTTreeNode extends DefaultMutableTreeNode {
2016 private static final long serialVersionUID = 2195590211796817012L;
2017 @SuppressWarnings("unused")
2018 public boolean enabled = false;
2019 private KnotenObjekt knotenObjekt = null;
2020 public JXTTreeNode(KnotenObjekt obj,boolean enabled){
2021 super();
2022 this.enabled = enabled;
2023 this.knotenObjekt = obj;
2024 if(obj != null){
2025 this.setUserObject(obj);
2029 public boolean isEnabled() {
2030 return enabled;
2034 public KnotenObjekt getObject(){
2035 return knotenObjekt;
2039 /***************************************/
2040 class KnotenObjekt{
2041 public String titel;
2042 public boolean fertig;
2043 public String rez_num;
2044 public String ktraeger;
2045 public String pat_intern;
2046 public String entschluessel;
2047 public String ikkasse;
2048 public String preisgruppe;
2049 public String ohnepauschale;
2050 public boolean langfrist;
2051 public String langfristaz;
2053 public KnotenObjekt(String titel,String rez_num,boolean fertig,String ikkasse,String preisgruppe){
2054 this.titel = titel;
2055 this.fertig = fertig;
2056 this.rez_num = rez_num;
2057 this.ikkasse = ikkasse;
2058 this.preisgruppe = preisgruppe;
2061 /*************************************/
2062 private class KassenTreeModel extends DefaultTreeModel {
2066 private static final long serialVersionUID = 6391618556224740611L;
2067 public KassenTreeModel(JXTTreeNode node) {
2068 super((TreeNode) node);
2070 @SuppressWarnings("unused")
2071 public Object getValueAt(Object node, int column) {
2072 JXTTreeNode jXnode = (JXTTreeNode) node;
2074 KnotenObjekt o = null;
2075 o = (KnotenObjekt) jXnode.getUserObject();
2076 switch (column) {
2077 case 0:
2078 return o.titel;
2079 case 1:
2080 return o.fertig;
2083 return jXnode.getObject().titel;
2085 @SuppressWarnings("unused")
2086 public int getColumnCount() {
2087 return 3;
2089 @SuppressWarnings("unused")
2090 public void setValueAt(Object value, Object node, int column){
2091 JXTTreeNode jXnode = (JXTTreeNode) node;
2092 KnotenObjekt o;
2093 o = jXnode.getObject();
2094 switch (column) {
2095 case 0:
2096 o.titel =((String) value) ;
2097 break;
2098 case 1:
2099 o.fertig =((Boolean) value) ;
2100 break;
2103 @SuppressWarnings("unused")
2104 public Class<?> getColumnClass(int column) {
2105 switch (column) {
2106 case 0:
2107 return String.class;
2108 case 1:
2109 return Boolean.class;
2111 return Object.class;
2114 /*****************************************/
2115 private class MyRenderer extends DefaultTreeCellRenderer {
2119 private static final long serialVersionUID = 2333990367290526356L;
2120 Icon fertigIcon;
2122 public MyRenderer(Icon icon) {
2123 fertigIcon = icon;
2126 public Component getTreeCellRendererComponent(
2127 JTree tree,
2128 Object value,
2129 boolean sel,
2130 boolean expanded,
2131 boolean leaf,
2132 int row,
2133 boolean hasFocus) {
2135 super.getTreeCellRendererComponent(
2136 tree, value, sel,
2137 expanded, leaf, row,
2138 hasFocus);
2139 KnotenObjekt o = ((JXTTreeNode)value).knotenObjekt;
2140 if (leaf && istFertig(value)) {
2141 setIcon(fertigIcon);
2142 this.setText(o.titel);
2143 setToolTipText("Verordnung "+o.rez_num+" kann dirket abgerechnet werden.");
2144 } else {
2145 setToolTipText(null);
2146 this.setText(o.titel);
2148 return this;
2152 protected boolean istFertig(Object value) {
2153 DefaultMutableTreeNode node =
2154 (DefaultMutableTreeNode)value;
2155 KnotenObjekt fertig =
2156 (KnotenObjekt)(node.getUserObject());
2157 boolean istfertig = fertig.fertig;
2158 if(istfertig){
2159 return true;
2161 return false;
2163 private void rezepteUebertragen(){
2166 private void rechnungAnlegen(){
2169 @Override
2170 public void mouseClicked(MouseEvent e) {
2171 // TODO Auto-generated method stub
2174 @Override
2175 public void mousePressed(MouseEvent e) {
2176 if(e.getButton()==3){
2177 TreePath tp = treeKasse.getSelectionPath();
2179 //kontrollierteRezepte = 0;
2180 if(tp==null){
2181 return;
2183 JXTTreeNode node = (JXTTreeNode) tp.getLastPathComponent();
2184 String rez_nr = ((JXTTreeNode)node).knotenObjekt.rez_num;
2185 if(!rez_nr.trim().equals("")){
2186 if(node.knotenObjekt.fertig){
2187 String msg = "<html>Achtung Sie editieren im Anschluß den EDIFACT-Code!<br>"+
2188 "Wenn Sie den Code in unzulässiger Weise manipulieren<br>wird <b>der gesamte Abrechnungslauf unbrauchbar</b><br><br>"+
2189 "<b>Rufen Sie diese Funktion nur dann auf wenn Sie genau wissen was Sie tun!!!</b><br><br>"+
2190 "Soll die Funktion jetzt aufgerufen werden?<br></html>";
2191 int frage = JOptionPane.showConfirmDialog(null,msg,"Achtung wichtige Benutzeranfrage",JOptionPane.YES_NO_OPTION);
2192 if(frage != JOptionPane.YES_OPTION){
2193 return;
2195 PointerInfo info = MouseInfo.getPointerInfo();
2196 Point location = info.getLocation();
2197 EditEdifact editEdifact = new EditEdifact(Reha.thisFrame,"EDIFACT - editieren",rez_nr.trim());
2198 editEdifact.getContentPane().setPreferredSize(new Dimension(600,500));
2199 editEdifact.setLocation(e.getXOnScreen()-50,e.getYOnScreen()-50);
2200 //editEdifact.setLocation(location.x-50,location.y-50);
2201 editEdifact.pack();
2202 editEdifact.setVisible(true);
2203 this.abrRez.setNewRez(rez_nr,node.knotenObjekt.fertig,aktDisziplin);
2205 //doKassenTreeAuswerten(aktuellerKnoten.knotenObjekt);
2207 }else{
2208 JOptionPane.showMessageDialog(null,"Abrechnungsdaten im Edifact-Format kann nur\nbei bereits markierten Rezepten manipuliert werden!");
2215 @Override
2216 public void mouseReleased(MouseEvent e) {
2217 // TODO Auto-generated method stub
2220 @Override
2221 public void mouseEntered(MouseEvent e) {
2222 // TODO Auto-generated method stub
2225 @Override
2226 public void mouseExited(MouseEvent e) {
2227 // TODO Auto-generated method stub