*** empty log message ***
[thera-pi.git] / Reha / src / hmrCheck / HMRCheck.java
blobdf1427dd1fb4a07aae59ba9abbb3f24de122a235
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"};
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 //aktualisiereHMRs();
74 * Abhängig vom Indikationsschlüssel muß geprüft werden
75 * 1. Ist die Anzahl pro Rezept o.k.
76 * 2. Ist das gewählte Heilmittel o.k.
77 * 3. ist das ergänzende Heilmittel o.k.
78 * 4.
79 * 5.
82 public boolean check(){
84 AdRrezept = (rezeptart==2);
85 folgerezept = (rezeptart==1);
87 Vector<Vector<String>> vec = SqlInfo.holeFelder("select * from hmrcheck where indischluessel='"+
88 indischluessel+"' LIMIT 1");
90 if(vec.size() <= 0 || indischluessel.equals("")){
91 JOptionPane.showMessageDialog(null,"Indikationsschlüssel "+indischluessel+" unbekannt oder nicht angegeben!");
92 return false;
95 int maxprorezept = Integer.parseInt(vec.get(0).get(2));
96 String[] vorrangig = vec.get(0).get(3).split("@");
97 String[] ergaenzend = vec.get(0).get(5).split("@");
98 for(int i = 0; i < vorrangig.length;i++){
99 vorrangig[i] = diszis[disziplin]+vorrangig[i];
101 for(int i = 0; i < ergaenzend.length;i++){
102 ergaenzend[i] = diszis[disziplin]+ergaenzend[i];
104 //hier einbauen:
105 //testen auf WS1,Ex1 etc. hier ist keine Folgeverordnung möglich // Status:erledigt!!
106 //testen auf Doppelbehandlung und Verordnungsmenge // Status:erledigt
107 //testen auf außerhalb des Regelfalles (hebt) die Verordnungsmenge auf // Status:erledigt aber halblebig
108 //testen auf Rezdatum und Behandlungsbeginn = 0.k. // Status:ausstehend
109 //testen ob Unterbrechungen zwischen den Behandlungen o.k. // Status:ausstehend
111 // mögliche Höchstmenge pro Rezept wurde überschritten?
112 //System.out.println("Max pro Rezept="+maxprorezept);
113 //System.out.println("Anzahlen = "+anzahl);
114 for(int i = 0; i < anzahl.size();i++){
115 if( (anzahl.get(i) > maxprorezept) && (!AdRrezept) ) {
116 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>" +
117 "Möglickeit -> Ändern der Rezeptart auf außerhalb des Regelfalles<br><br></b>");
118 testok = false;
121 //Checken ob Indischlüssel in der Liste der Schlüssel ohne Folgeverordnung enthalten ist
122 if( (Arrays.asList(keinefolgevo).contains(indischluessel)) && (rezeptart > 0) ){
123 fehlertext = fehlertext + String.valueOf( (fehlertext.length() <= 0 ? "<html>" : "")+
124 "<b>Bei Indikationsschlüssel "+indischluessel+" ist keine<br><font color='#ff0000'>"+
125 rezarten[rezeptart]+
126 "</font> erlaubt!!</b><br><br>");
127 testok = false;
129 //Hier der Check ob für Kinder ein Erwachsenen-Indischlüssel verwendet wurde z.B. ZN2a
130 if( (unter18) && (Arrays.asList(nurueber18).contains(indischluessel)) ){
131 fehlertext = fehlertext + String.valueOf( (fehlertext.length() <= 0 ? "<html>" : "")+
132 "<b>Der Indikationsschlüssel "+indischluessel+" ist nur bei <br><font color='#ff0000'>"+
133 "Erwachsenen über 18 Jahren"+
134 "</font> erlaubt!!</b><br><br>");
135 testok = false;
136 //Hier der Check ob für Erwachsene ein Kinder-Indischlüssel verwendet wurde z.B. ZN1a
137 }else if((!unter18) && (Arrays.asList(nurunter18).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 "Kindern und Jugendlichen bis 18 Jahren"+
141 "</font> erlaubt!!</b><br><br>");
142 testok = false;
145 try{
146 if(positionen.size() >= 2){
147 if(positionen.get(0).equals(positionen.get(1))){
148 doppelbehandlung = true;
149 int doppelgesamt = anzahl.get(0) + anzahl.get(1);
150 if((doppelgesamt > maxprorezept) && (!AdRrezept)){
151 fehlertext = String.valueOf("<html><b>Die Doppelbehandlung bei Indikationsschlüssel "+indischluessel+
152 ", übersteigt<br>die maximal erlaubte Höchstverordnungsmenge pro Rezept von<br><font color='#ff0000'>"+Integer.toString(maxprorezept)+
153 " Behandlungen</font>!!</b><br><br>Wechsel auf -> außerhalb des Regelfalles <- ist erforderlich<br><br>");
154 testok = false;
158 // jetzt haben wir schon einmal die Doppelbehandlung
159 // dann testen ob die Positionsnummer überhaupt ein zugelassenes vorrangiges Heilmittel ist.
161 for(int i = 0; i < positionen.size();i++){
162 //Hier Doppelbehandlung einbauen start
163 if(i==0){
164 if(! Arrays.asList(vorrangig).contains(positionen.get(i))){
165 fehlertext = fehlertext+String.valueOf(
166 getDialogText(true,getHeilmittel(positionen.get(i)),positionen.get(i),vorrangig));
167 testok = false;
169 }else if(i==1 && doppelbehandlung){
171 }else{
172 if(! Arrays.asList(ergaenzend).contains(positionen.get(i))){
173 fehlertext = fehlertext+String.valueOf(
174 getDialogText(false,getHeilmittel(positionen.get(i)),positionen.get(i),ergaenzend));
175 testok = false;
178 //Hier Doppelbehandlung einbauen ende
181 //Jetzt auf Rezeptbeginn testen
182 if(neurezept){
183 long differenz = DatFunk.TageDifferenz(rezdatum,DatFunk.sHeute());
184 if(differenz < 0){
185 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'>"+
186 Long.toString(differenz)+" Tag(e) </font>.<br>Behandlungsbeginn ist also <font color='#ff0000'>vor</font> dem Ausstellungsdatum!!</b><br><br>";
187 testok = false;
189 if( (differenz=DatFunk.TageDifferenz(letztbeginn,DatFunk.sHeute() )) > 0){
190 //System.out.println("Differenz 2 = "+differenz);
191 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'>"+
192 Long.toString(differenz)+" Tage </font><br>" +
193 "</b><br><br>";
194 testok = false;
196 }else{
197 String cmd = "select termine from verordn where rez_nr='"+reznummer+"' LIMIT 1";
198 String termine = SqlInfo.holeFeld(cmd).get(0);
199 //Keine Termine notiert
200 if(termine.trim().equals("")){
201 //LetzterBeginn abhandeln
202 long differenz = DatFunk.TageDifferenz(rezdatum,DatFunk.sHeute());
203 if(differenz < 0){
204 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'>"+
205 Long.toString(differenz)+" Tag(e) </font>.<br>Behandlungsbeginn ist also <font color='#ff0000'>vor</font> dem Ausstellungsdatum!!</b><br><br>";
206 testok = false;
208 if( (differenz=DatFunk.TageDifferenz(letztbeginn,DatFunk.sHeute() )) > 0){
209 //System.out.println("Differenz 2 = "+differenz);
210 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'>"+
211 Long.toString(differenz)+" Tage </font><br>" +
212 "</b><br><br>";
213 testok = false;
216 }else{
217 //LetzterBeginn abhandeln
218 String erstbehandlung = RezTools.holeEinzelTermineAusRezept(null, termine).get(0);
219 long differenz = DatFunk.TageDifferenz(rezdatum,erstbehandlung);
220 if(differenz < 0){
221 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'>"+
222 Long.toString(differenz)+" Tag(e) </font>.<br>Behandlungsbeginn ist also <font color='#ff0000'>vor</font> dem Ausstellungsdatum!!</b><br><br>";
223 testok = false;
225 if( (differenz=DatFunk.TageDifferenz(letztbeginn,erstbehandlung )) > 0){
226 //System.out.println("Differenz 2 = "+differenz);
227 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'>"+
228 Long.toString(differenz)+" Tage </font><br>" +
229 "</b><br><br>";
230 testok = false;
235 }catch(Exception ex){
236 ex.printStackTrace();
238 if(! testok){
239 JOptionPane.showMessageDialog(null,fehlertext+"</html>");
241 return testok;
243 private String getDialogText(boolean vorrangig,String heilmittel,String hmpos,String[] positionen){
244 String meldung = (fehlertext.length() <= 0 ? "<html>" : "")+"Bei dem Indikationsschlüssel <b><font color='#ff0000'>"+indischluessel+"</font></b> ist das "+(vorrangig ? "vorrangige " : "ergänzende")+
245 " Heilmittel<br><br>--> <b><font color='#ff0000'>"+heilmittel+"</font></b> <-- nicht erlaubt!<br><br><br>"+
246 "Mögliche "+(vorrangig ? "vorrangige " : "ergänzende")+" Heilmittel sind:<br><b><font color='#ff0000'>"+
247 getErlaubteHeilmittel(positionen)+"</font></b><br><br>";
248 return meldung;
251 /************************/
252 private String getErlaubteHeilmittel(String[] heilmittel){
253 StringBuffer buf = new StringBuffer();
254 String hm = "";
255 for(int i = 0;i < heilmittel.length;i++){
256 hm = getHeilmittel(heilmittel[i]);
257 if(!hm.equals("")){
258 buf.append(getHeilmittel(heilmittel[i])+"<br>");
261 return (buf.toString().equals("") ? "<br>keine<br>" : buf.toString());
263 /************************/
264 private String getHeilmittel(String heilmittel){
265 for(int i = 0;i < preisvec.size();i++){
266 if(preisvec.get(i).get(2).equals(heilmittel)){
267 return preisvec.get(i).get(0);
270 return "";
272 /************************/
274 public static String X_holeLetztMoeglichenTag(boolean erstebehandlung,String disziplin,int preisgruppe,String referenz){
275 int frist = (Integer)((Vector<?>)SystemPreislisten.hmFristen.get(disziplin).get((erstebehandlung ? 0 : 2))).get(preisgruppe);
276 boolean kalendertage = (Boolean) ((Vector<?>)SystemPreislisten.hmFristen.get(disziplin).get((erstebehandlung ? 1 : 3))).get(preisgruppe);
277 boolean mitsamstag = (Boolean) ((Vector<?>)SystemPreislisten.hmFristen.get(disziplin).get((erstebehandlung ? 4 : 5))).get(preisgruppe);
278 if(kalendertage){
279 return DatFunk.sDatPlusTage(referenz, frist);
281 return hmrLetztesDatum(referenz,frist,mitsamstag);
284 public static long X_hmrTageErmitteln(int preisgruppe,String reznum,String rezdatum,String testdatum,String letzter){
285 long differenz = DatFunk.TageDifferenz(rezdatum, testdatum );
286 int wotag = DatFunk.TagDerWoche(rezdatum);
287 //System.out.println("Tag der Woche der Rezeptausstellung = "+wotag);
288 //System.out.println("Preisgruppe = "+preisgruppe);
289 //System.out.println("Tage Differenz insgesamt = "+differenz);
290 if(preisgruppe != 1 && differenz > 10){
291 if(wotag >= 3){
292 differenz -= 2;
293 }else{
294 differenz -= 1;
298 return differenz;
300 @SuppressWarnings("deprecation")
301 public static int[] XX_hmrArbeitsTage(Date start,Date ende,boolean samstagWochenende,boolean checkFeiertage){
302 int[] ret = {0,0,0}; //0=Arbeitstag,1=wochenende,2=Feiertag
304 for(Date date = start; date.compareTo(ende) <= 0; date = new Date(date.getTime() + 24*60*60*1000)) {
305 if (date.getDay() % 7 == 0) {
306 ret[1] ++;
307 } else if (checkFeiertage && istFeiertag(date)) { //selber implementieren
308 ret[2] ++;
309 } else {
310 ret[0]++;
313 return ret;
315 /******************************************/
316 public static int hmrTageDifferenz(String referenzdatum,String vergleichsdatum,int differenz,boolean samstagistwerktag){
317 int ret = 1;
318 try{
319 String letztesdatum = hmrLetztesDatum(referenzdatum,differenz,samstagistwerktag);
320 ret = Integer.parseInt(Long.toString(DatFunk.TageDifferenz(letztesdatum, vergleichsdatum)));
321 }catch(Exception ex){
322 System.out.println("Fehler in der Ermittlung der Unterbrechungszeiträume");
323 ex.printStackTrace();
325 return ret;
327 /******************************************/
328 @SuppressWarnings("deprecation")
329 public static String hmrLetztesDatum(String startdatum,int differenz,boolean samstagistwerktag){
330 //SimpleDateFormat sd = new SimpleDateFormat("dd.MM.yyyy");
331 int i = 0;
332 int werktage = 0;
333 Date date = null;
334 //System.out.println("Übergabe = "+startdatum);
336 try {
337 date = sdDeutsch.parse(startdatum);
338 } catch (ParseException e) {
339 e.printStackTrace();
342 //System.out.println("geparstes Datum = "+sd.format(date));
343 while(true){
344 //System.out.println("Getestetes Datum = "+sd.format(date));
345 if( (!(date.getDay() % 7 ==0)) && (samstagistwerktag) ){
346 if(! istFeiertag(date)){
347 if(werktage==differenz){
348 return sdDeutsch.format(date);
350 werktage++;
352 }else if( (!(date.getDay() % 7 ==0)) && (!samstagistwerktag) && (!(date.getDay() % 6 ==0))){
353 if(! istFeiertag(date)){
354 if(werktage==differenz){
355 return sdDeutsch.format(date);
357 werktage++;
360 i++;
361 date = new Date(date.getTime()+ (24*60*60*1000) );
364 @SuppressWarnings("deprecation")
365 public static int XX_hmrAnzahlTageLetztesDatum(String startdatum,int differenz){
366 //SimpleDateFormat sd = new SimpleDateFormat("dd.MM.yyyy");
367 int i = 0;
368 int werktage = 0;
370 Date date = null;
371 //System.out.println("Übergabe = "+startdatum);
373 try {
374 date = sdDeutsch.parse(startdatum);
375 } catch (ParseException e) {
376 e.printStackTrace();
379 //System.out.println("geparstes Datum = "+sd.format(date));
380 while(true){
381 //System.out.println("Getestetes Datum = "+sd.format(date));
382 if(! (date.getDay() % 7 ==0) ){
383 if(! istFeiertag(date)){
384 if(werktage==differenz){
385 return Integer.valueOf(i);
387 werktage++;
390 i++;
391 date = new Date(date.getTime()+ (24*60*60*1000) );
395 public static boolean istFeiertag(Date date){
396 //SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
397 //System.out.println("*******************"+sd.format(date));
398 if( SystemConfig.vFeiertage.contains(sdSql.format(date))){
399 return true;
401 return false;
405 private void aktualisiereHMRs(){
406 Vector<Vector<String>> vec = SqlInfo.holeFelder("select ergaenzend,maxergaenzend,id from hmrcheck where ergaenzend LIKE '%1508%'");
407 String sanzahl = "";
408 String cmd = "";
409 System.out.println("Anzahl indis = "+vec.size());
410 for(int i = 0; i < vec.size();i++){
412 try{
413 sanzahl = vec.get(i).get(1).split("@")[0];
414 }catch(Exception ex){
415 sanzahl = "6";
417 cmd = "update hmrcheck set ergaenzend='"+vec.get(i).get(0)+"@1531', maxergaenzend='"+
418 vec.get(i).get(1)+"@"+sanzahl+"' where id ='"+vec.get(i).get(2)+"' LIMIT 1";
419 System.out.println(cmd);
420 SqlInfo.sqlAusfuehren(cmd);