*** empty log message ***
[thera-pi.git] / Reha / src / hmrCheck / HMRCheck.java
blob22c43dfb846a9ba20337ccd3e1a0b54c8982af91
1 package hmrCheck;
3 import hauptFenster.Reha;
6 import java.text.ParseException;
7 import java.text.SimpleDateFormat;
8 import java.util.Arrays;
9 import java.util.Date;
11 import java.util.Vector;
13 import javax.swing.JOptionPane;
15 import CommonTools.SqlInfo;
16 import stammDatenTools.RezTools;
17 import systemEinstellungen.SystemConfig;
18 import systemEinstellungen.SystemPreislisten;
19 import terminKalender.DatFunk;
21 public class HMRCheck {
22 Vector<Integer> anzahl = null;
23 Vector<String> positionen = null;
24 Vector<Vector<String>> preisvec = null;
25 String indischluessel = null;
26 String diszis[] = {"2","1","5","3","8","7"};
27 //RezNeuanlage rezanlage = null;
28 int disziplin;
29 int preisgruppe;
30 final String maxanzahl = "Die Höchstmenge pro Rezept bei ";
31 final String rotein = "<>";
32 boolean testok = true;
33 String fehlertext = "";
34 int rezeptart;
35 String reznummer = null;
36 String rezdatum = null;
37 String letztbeginn = null;
38 boolean AdRrezept = false;
39 boolean folgerezept = false;
40 boolean neurezept = false;
41 boolean doppelbehandlung = false;
42 boolean unter18 = false;
43 static SimpleDateFormat sdDeutsch = new SimpleDateFormat("dd.MM.yyyy");
44 static SimpleDateFormat sdSql = new SimpleDateFormat("yyyy-MM-dd");
46 String[] rezarten = {"Erstverodnung","Folgeverordnung", "außerhalb des Regelfalles"};
48 String[] keinefolgevo = {"EX1a","EX1b","EX1c","WS1a","WS1b","WS1c","WS1d","WS1e",
49 "AT1a","AT1b","AT1c","SB4","ST3"};
50 String[] nurunter18 = {"ZN1a","ZN1b","ZN1c","EN1","PS1","EX4a"};
51 String[] nurueber18 = {"ZN2a","ZN2b","ZN2c","EN2"};
53 public HMRCheck(String indi,int idiszi,Vector<Integer> vecanzahl,Vector<String>vecpositionen,
54 int xpreisgruppe,Vector<Vector<String>> xpreisvec,int xrezeptart,String xreznr,String xrezdatum,String xletztbeginn){
55 indischluessel = indi;
56 disziplin = idiszi;
57 anzahl = vecanzahl;
58 positionen = vecpositionen;
59 preisgruppe = xpreisgruppe;
60 preisvec = xpreisvec;
61 //rezanlage = xrezanlage;
62 rezeptart =xrezeptart;
63 reznummer = xreznr;
64 unter18 = DatFunk.Unter18(DatFunk.sHeute(), DatFunk.sDatInDeutsch(Reha.thisClass.patpanel.patDaten.get(4)));
65 if(reznummer.equals("")){
66 neurezept = true;
68 rezdatum = xrezdatum;
69 letztbeginn = xletztbeginn;
70 //System.out.println("IDdiszi = "+idiszi);
71 //aktualisiereHMRs();
75 * Abhängig vom Indikationsschlüssel muß geprüft werden
76 * 1. Ist die Anzahl pro Rezept o.k.
77 * 2. Ist das gewählte Heilmittel o.k.
78 * 3. ist das ergänzende Heilmittel o.k.
79 * 4.
80 * 5.
83 public boolean check(){
84 if(reznummer.startsWith("RS") || reznummer.startsWith("FT") ){
85 return true;
87 AdRrezept = (rezeptart==2);
88 folgerezept = (rezeptart==1);
90 Vector<Vector<String>> vec = SqlInfo.holeFelder("select * from hmrcheck where indischluessel='"+
91 indischluessel+"' LIMIT 1");
93 if( (vec.size() <= 0 || indischluessel.equals("")) && (!indischluessel.equals("k.A.")) ){
94 JOptionPane.showMessageDialog(null,"Indikationsschlüssel "+indischluessel+" unbekannt oder nicht angegeben!");
95 return false;
96 }else if(indischluessel.equals("k.A.")){
97 JOptionPane.showMessageDialog(null,"Indikationsschlüssel "+indischluessel+" (keine Angaben) wurde gewählt, HMR-Check wird abgebrochen.\n"+
98 "Bitte stellen Sie selbst sicher daß alle übrigen Pflichtangaben vorhanden sind");
99 return true;
101 //System.out.println(vec);
102 int maxprorezept = Integer.parseInt(vec.get(0).get(2));
103 String[] vorrangig = vec.get(0).get(3).split("@");
104 String[] ergaenzend = vec.get(0).get(5).split("@");
105 for(int i = 0; i < vorrangig.length;i++){
106 vorrangig[i] = diszis[disziplin]+vorrangig[i];
108 for(int i = 0; i < ergaenzend.length;i++){
109 ergaenzend[i] = diszis[disziplin]+ergaenzend[i];
111 //hier einbauen:
112 //testen auf WS1,Ex1 etc. hier ist keine Folgeverordnung möglich // Status:erledigt!!
113 //testen auf Doppelbehandlung und Verordnungsmenge // Status:erledigt
114 //testen auf außerhalb des Regelfalles (hebt) die Verordnungsmenge auf // Status:erledigt aber halblebig
115 //testen auf Rezdatum und Behandlungsbeginn = 0.k. // Status:ausstehend
116 //testen ob Unterbrechungen zwischen den Behandlungen o.k. // Status:ausstehend
118 // mögliche Höchstmenge pro Rezept wurde überschritten?
119 //System.out.println("Max pro Rezept="+maxprorezept);
120 //System.out.println("Anzahlen = "+anzahl);
121 for(int i = 0; i < anzahl.size();i++){
122 if( (anzahl.get(i) > maxprorezept) && (!AdRrezept) ) {
123 fehlertext = String.valueOf("<html><b>Bei Indikationsschlüssel "+indischluessel+" sind maximal<br><font color='#ff0000'>"+Integer.toString(maxprorezept)+" Behandlungen</font> pro Rezept erlaubt!!<br><br>" +
124 "Möglickeit -> Ändern der Rezeptart auf außerhalb des Regelfalles<br><br></b>");
125 testok = false;
128 //Checken ob Indischlüssel in der Liste der Schlüssel ohne Folgeverordnung enthalten ist
129 if( (Arrays.asList(keinefolgevo).contains(indischluessel)) && (rezeptart > 0) ){
130 fehlertext = fehlertext + String.valueOf( (fehlertext.length() <= 0 ? "<html>" : "")+
131 "<b>Bei Indikationsschlüssel "+indischluessel+" ist keine<br><font color='#ff0000'>"+
132 rezarten[rezeptart]+
133 "</font> erlaubt!!</b><br><br>");
134 testok = false;
136 //Hier der Check ob für Kinder ein Erwachsenen-Indischlüssel verwendet wurde z.B. ZN2a
137 if( (unter18) && (Arrays.asList(nurueber18).contains(indischluessel)) ){
138 fehlertext = fehlertext + String.valueOf( (fehlertext.length() <= 0 ? "<html>" : "")+
139 "<b>Der Indikationsschlüssel "+indischluessel+" ist nur bei <br><font color='#ff0000'>"+
140 "Erwachsenen über 18 Jahren"+
141 "</font> erlaubt!!</b><br><br>");
142 testok = false;
143 //Hier der Check ob für Erwachsene ein Kinder-Indischlüssel verwendet wurde z.B. ZN1a
144 }else if((!unter18) && (Arrays.asList(nurunter18).contains(indischluessel))){
145 fehlertext = fehlertext + String.valueOf( (fehlertext.length() <= 0 ? "<html>" : "")+
146 "<b>Der Indikationsschlüssel "+indischluessel+" ist nur bei <br><font color='#ff0000'>"+
147 "Kindern und Jugendlichen bis 18 Jahren"+
148 "</font> erlaubt!!</b><br><br>");
149 testok = false;
152 try{
153 if(positionen.size() >= 2){
154 if(positionen.get(0).equals(positionen.get(1))){
155 doppelbehandlung = true;
156 int doppelgesamt = anzahl.get(0) + anzahl.get(1);
157 if((doppelgesamt > maxprorezept) && (!AdRrezept)){
158 fehlertext = String.valueOf("<html><b>Die Doppelbehandlung bei Indikationsschlüssel "+indischluessel+
159 ", übersteigt<br>die maximal erlaubte Höchstverordnungsmenge pro Rezept von<br><font color='#ff0000'>"+Integer.toString(maxprorezept)+
160 " Behandlungen</font>!!</b><br><br>Wechsel auf -> außerhalb des Regelfalles <- ist erforderlich<br><br>");
161 testok = false;
165 // jetzt haben wir schon einmal die Doppelbehandlung
166 // dann testen ob die Positionsnummer überhaupt ein zugelassenes vorrangiges Heilmittel ist.
168 for(int i = 0; i < positionen.size();i++){
169 //Hier Doppelbehandlung einbauen start
170 if(i==0){
171 if(! Arrays.asList(vorrangig).contains(positionen.get(i))){
172 fehlertext = fehlertext+String.valueOf(
173 getDialogText(true,getHeilmittel(positionen.get(i)),positionen.get(i),vorrangig));
174 testok = false;
176 }else if(i==1 && doppelbehandlung){
178 }else{
179 if(! Arrays.asList(ergaenzend).contains(positionen.get(i))){
180 fehlertext = fehlertext+String.valueOf(
181 getDialogText(false,getHeilmittel(positionen.get(i)),positionen.get(i),ergaenzend));
182 testok = false;
185 //Hier Doppelbehandlung einbauen ende
188 //Jetzt auf Rezeptbeginn testen
189 if(neurezept){
190 long differenz = DatFunk.TageDifferenz(rezdatum,DatFunk.sHeute());
191 if(differenz < 0){
192 fehlertext = fehlertext+(fehlertext.length() <= 0 ? "<html>" : "")+"<br><b><font color='#ff0000'>Rezeptdatum ist absolut kritisch!</font><br>Spanne zwischen Behandlungsbeginn und Rezeptdatum beträgt <font color='#ff0000'>"+
193 Long.toString(differenz)+" Tag(e) </font>.<br>Behandlungsbeginn ist also <font color='#ff0000'>vor</font> dem Ausstellungsdatum!!</b><br><br>";
194 testok = false;
196 if( (differenz=DatFunk.TageDifferenz(letztbeginn,DatFunk.sHeute() )) > 0){
197 //System.out.println("Differenz 2 = "+differenz);
198 fehlertext = fehlertext+(fehlertext.length() <= 0 ? "<html>" : "")+"<br><b><font color='#ff0000'>Behandlungsbeginn ist kritisch!</font><br><br>Die Differenz zwischen <font color='#ff0000'>spätester Behandlungsbeginn</font> und 1.Behandlung<br>beträgt <font color='#ff0000'>"+
199 Long.toString(differenz)+" Tage </font><br>" +
200 "</b><br><br>";
201 testok = false;
203 }else{
204 String cmd = "select termine from verordn where rez_nr='"+reznummer+"' LIMIT 1";
205 String termine = SqlInfo.holeFeld(cmd).get(0);
206 //Keine Termine notiert
207 if(termine.trim().equals("")){
208 //LetzterBeginn abhandeln
209 long differenz = DatFunk.TageDifferenz(rezdatum,DatFunk.sHeute());
210 if(differenz < 0){
211 fehlertext = fehlertext+(fehlertext.length() <= 0 ? "<html>" : "")+"<br><b><font color='#ff0000'>Rezeptdatum ist absolut kritisch!</font><br>Spanne zwischen Behandlungsbeginn und Rezeptdatum beträgt <font color='#ff0000'>"+
212 Long.toString(differenz)+" Tag(e) </font>.<br>Behandlungsbeginn ist also <font color='#ff0000'>vor</font> dem Ausstellungsdatum!!</b><br><br>";
213 testok = false;
215 if( (differenz=DatFunk.TageDifferenz(letztbeginn,DatFunk.sHeute() )) > 0){
216 //System.out.println("Differenz 2 = "+differenz);
217 fehlertext = fehlertext+(fehlertext.length() <= 0 ? "<html>" : "")+"<br><b><font color='#ff0000'>Behandlungsbeginn ist kritisch!</font><br><br>Die Differenz zwischen <font color='#ff0000'>spätester Behandlungsbeginn</font> und 1.Behandlung<br>beträgt <font color='#ff0000'>"+
218 Long.toString(differenz)+" Tage </font><br>" +
219 "</b><br><br>";
220 testok = false;
223 }else{
224 //LetzterBeginn abhandeln
225 String erstbehandlung = RezTools.holeEinzelTermineAusRezept(null, termine).get(0);
226 long differenz = DatFunk.TageDifferenz(rezdatum,erstbehandlung);
227 if(differenz < 0){
228 fehlertext = fehlertext+(fehlertext.length() <= 0 ? "<html>" : "")+"<br><b><font color='#ff0000'>Rezeptdatum ist absolut kritisch!</font><br>Spanne zwischen Behandlungsbeginn und Rezeptdatum beträgt <font color='#ff0000'>"+
229 Long.toString(differenz)+" Tag(e) </font>.<br>Behandlungsbeginn ist also <font color='#ff0000'>vor</font> dem Ausstellungsdatum!!</b><br><br>";
230 testok = false;
232 if( (differenz=DatFunk.TageDifferenz(letztbeginn,erstbehandlung )) > 0){
233 //System.out.println("Differenz 2 = "+differenz);
234 fehlertext = fehlertext+(fehlertext.length() <= 0 ? "<html>" : "")+"<br><b><font color='#ff0000'>Behandlungsbeginn ist kritisch!</font><br><br>Die Differenz zwischen <font color='#ff0000'>spätester Behandlungsbeginn</font> und 1.Behandlung<br>beträgt <font color='#ff0000'>"+
235 Long.toString(differenz)+" Tage </font><br>" +
236 "</b><br><br>";
237 testok = false;
239 //Test auf Anregung von Michael Schütt
240 Vector<String> vtagetest = RezTools.holeEinzelTermineAusRezept(null, termine);
241 for(int i = 0; i < vtagetest.size();i++){
242 if( (differenz = DatFunk.TageDifferenz(vtagetest.get(i),DatFunk.sHeute())) < 0 ){
243 fehlertext = fehlertext+(fehlertext.length() <= 0 ? "<html>" : "")+"<br><b><font color='#ff0000'>Behandlungsdatum "+vtagetest.get(i)+" ist kritisch!</font><br><br>"+"Das Behandlungsdatum <font color='#ff0000'></font> liegt in der Zukunft<br> <font color='#ff0000'>"+
244 "um "+Long.toString(differenz*-1)+" Tage </font><br>" +
245 "</b><br><br>";
246 testok = false;
252 }catch(Exception ex){
253 ex.printStackTrace();
255 if(! testok){
256 JOptionPane.showMessageDialog(null,fehlertext+"</html>");
258 return testok;
260 private String getDialogText(boolean vorrangig,String heilmittel,String hmpos,String[] positionen){
261 String meldung = (fehlertext.length() <= 0 ? "<html>" : "")+"Bei dem Indikationsschlüssel <b><font color='#ff0000'>"+indischluessel+"</font></b> ist das "+(vorrangig ? "vorrangige " : "ergänzende")+
262 " Heilmittel<br><br>--> <b><font color='#ff0000'>"+heilmittel+"</font></b> <-- nicht erlaubt!<br><br><br>"+
263 "Mögliche "+(vorrangig ? "vorrangige " : "ergänzende")+" Heilmittel sind:<br><b><font color='#ff0000'>"+
264 getErlaubteHeilmittel(positionen)+"</font></b><br><br>";
265 return meldung;
268 /************************/
269 private String getErlaubteHeilmittel(String[] heilmittel){
270 StringBuffer buf = new StringBuffer();
271 String hm = "";
272 for(int i = 0;i < heilmittel.length;i++){
273 hm = getHeilmittel(heilmittel[i]);
274 if(!hm.equals("")){
275 buf.append(getHeilmittel(heilmittel[i])+"<br>");
278 return (buf.toString().equals("") ? "<br>keine<br>" : buf.toString());
280 /************************/
281 private String getHeilmittel(String heilmittel){
282 for(int i = 0;i < preisvec.size();i++){
283 if(preisvec.get(i).get(2).equals(heilmittel)){
284 return preisvec.get(i).get(0);
287 return "";
289 /************************/
291 public static String X_holeLetztMoeglichenTag(boolean erstebehandlung,String disziplin,int preisgruppe,String referenz){
292 int frist = (Integer)((Vector<?>)SystemPreislisten.hmFristen.get(disziplin).get((erstebehandlung ? 0 : 2))).get(preisgruppe);
293 boolean kalendertage = (Boolean) ((Vector<?>)SystemPreislisten.hmFristen.get(disziplin).get((erstebehandlung ? 1 : 3))).get(preisgruppe);
294 boolean mitsamstag = (Boolean) ((Vector<?>)SystemPreislisten.hmFristen.get(disziplin).get((erstebehandlung ? 4 : 5))).get(preisgruppe);
295 if(kalendertage){
296 return DatFunk.sDatPlusTage(referenz, frist);
298 return hmrLetztesDatum(referenz,frist,mitsamstag);
301 public static long X_hmrTageErmitteln(int preisgruppe,String reznum,String rezdatum,String testdatum,String letzter){
302 long differenz = DatFunk.TageDifferenz(rezdatum, testdatum );
303 int wotag = DatFunk.TagDerWoche(rezdatum);
304 //System.out.println("Tag der Woche der Rezeptausstellung = "+wotag);
305 //System.out.println("Preisgruppe = "+preisgruppe);
306 //System.out.println("Tage Differenz insgesamt = "+differenz);
307 if(preisgruppe != 1 && differenz > 10){
308 if(wotag >= 3){
309 differenz -= 2;
310 }else{
311 differenz -= 1;
315 return differenz;
317 @SuppressWarnings("deprecation")
318 public static int[] XX_hmrArbeitsTage(Date start,Date ende,boolean samstagWochenende,boolean checkFeiertage){
319 int[] ret = {0,0,0}; //0=Arbeitstag,1=wochenende,2=Feiertag
321 for(Date date = start; date.compareTo(ende) <= 0; date = new Date(date.getTime() + 24*60*60*1000)) {
322 if (date.getDay() % 7 == 0) {
323 ret[1] ++;
324 } else if (checkFeiertage && istFeiertag(date)) { //selber implementieren
325 ret[2] ++;
326 } else {
327 ret[0]++;
330 return ret;
332 /******************************************/
333 public static int hmrTageDifferenz(String referenzdatum,String vergleichsdatum,int differenz,boolean samstagistwerktag){
334 int ret = 1;
335 try{
336 String letztesdatum = hmrLetztesDatum(referenzdatum,differenz,samstagistwerktag);
337 ret = Integer.parseInt(Long.toString(DatFunk.TageDifferenz(letztesdatum, vergleichsdatum)));
338 }catch(Exception ex){
339 System.out.println("Fehler in der Ermittlung der Unterbrechungszeiträume");
340 ex.printStackTrace();
342 return ret;
344 /******************************************/
345 @SuppressWarnings("deprecation")
346 public static String hmrLetztesDatum(String startdatum,int differenz,boolean samstagistwerktag){
347 //SimpleDateFormat sd = new SimpleDateFormat("dd.MM.yyyy");
348 int i = 0;
349 int werktage = 0;
350 Date date = null;
351 //System.out.println("Übergabe = "+startdatum);
353 try {
354 date = sdDeutsch.parse(startdatum);
355 } catch (ParseException e) {
356 e.printStackTrace();
359 //System.out.println("geparstes Datum = "+sd.format(date));
360 while(true){
361 //System.out.println("Getestetes Datum = "+sd.format(date));
362 if( (!(date.getDay() % 7 ==0)) && (samstagistwerktag) ){
363 if(! istFeiertag(date)){
364 if(werktage==differenz){
365 return sdDeutsch.format(date);
367 werktage++;
369 }else if( (!(date.getDay() % 7 ==0)) && (!samstagistwerktag) && (!(date.getDay() % 6 ==0))){
370 if(! istFeiertag(date)){
371 if(werktage==differenz){
372 return sdDeutsch.format(date);
374 werktage++;
377 i++;
378 date = new Date(date.getTime()+ (24*60*60*1000) );
381 @SuppressWarnings("deprecation")
382 public static int XX_hmrAnzahlTageLetztesDatum(String startdatum,int differenz){
383 //SimpleDateFormat sd = new SimpleDateFormat("dd.MM.yyyy");
384 int i = 0;
385 int werktage = 0;
387 Date date = null;
388 //System.out.println("Übergabe = "+startdatum);
390 try {
391 date = sdDeutsch.parse(startdatum);
392 } catch (ParseException e) {
393 e.printStackTrace();
396 //System.out.println("geparstes Datum = "+sd.format(date));
397 while(true){
398 //System.out.println("Getestetes Datum = "+sd.format(date));
399 if(! (date.getDay() % 7 ==0) ){
400 if(! istFeiertag(date)){
401 if(werktage==differenz){
402 return Integer.valueOf(i);
404 werktage++;
407 i++;
408 date = new Date(date.getTime()+ (24*60*60*1000) );
412 public static boolean istFeiertag(Date date){
413 //SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
414 //System.out.println("*******************"+sd.format(date));
415 if( SystemConfig.vFeiertage.contains(sdSql.format(date))){
416 return true;
418 return false;
422 private void aktualisiereHMRs(){
423 Vector<Vector<String>> vec = SqlInfo.holeFelder("select ergaenzend,maxergaenzend,id from hmrcheck where ergaenzend LIKE '%1508%'");
424 String sanzahl = "";
425 String cmd = "";
426 System.out.println("Anzahl indis = "+vec.size());
427 for(int i = 0; i < vec.size();i++){
429 try{
430 sanzahl = vec.get(i).get(1).split("@")[0];
431 }catch(Exception ex){
432 sanzahl = "6";
434 cmd = "update hmrcheck set ergaenzend='"+vec.get(i).get(0)+"@1531', maxergaenzend='"+
435 vec.get(i).get(1)+"@"+sanzahl+"' where id ='"+vec.get(i).get(2)+"' LIMIT 1";
436 System.out.println(cmd);
437 SqlInfo.sqlAusfuehren(cmd);