3 import hauptFenster
.Reha
;
6 import java
.text
.ParseException
;
7 import java
.text
.SimpleDateFormat
;
8 import java
.util
.Arrays
;
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;
30 final String maxanzahl
= "Die Höchstmenge pro Rezept bei ";
31 final String rotein
= "<>";
32 boolean testok
= true;
33 String fehlertext
= "";
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
;
58 positionen
= vecpositionen
;
59 preisgruppe
= xpreisgruppe
;
61 //rezanlage = xrezanlage;
62 rezeptart
=xrezeptart
;
64 unter18
= DatFunk
.Unter18(DatFunk
.sHeute(), DatFunk
.sDatInDeutsch(Reha
.thisClass
.patpanel
.patDaten
.get(4)));
65 if(reznummer
.equals("")){
69 letztbeginn
= xletztbeginn
;
70 //System.out.println("IDdiszi = "+idiszi);
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.
83 public boolean check(){
84 if(reznummer
.startsWith("RS") || reznummer
.startsWith("FT") ){
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!");
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");
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
];
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>");
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'>"+
133 "</font> erlaubt!!</b><br><br>");
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>");
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>");
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>");
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
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
));
176 }else if(i
==1 && doppelbehandlung
){
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
));
185 //Hier Doppelbehandlung einbauen ende
188 //Jetzt auf Rezeptbeginn testen
190 long differenz
= DatFunk
.TageDifferenz(rezdatum
,DatFunk
.sHeute());
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>";
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>" +
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());
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>";
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>" +
224 //LetzterBeginn abhandeln
225 String erstbehandlung
= RezTools
.holeEinzelTermineAusRezept(null, termine
).get(0);
226 long differenz
= DatFunk
.TageDifferenz(rezdatum
,erstbehandlung
);
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>";
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>" +
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>" +
252 }catch(Exception ex
){
253 ex
.printStackTrace();
256 JOptionPane
.showMessageDialog(null,fehlertext
+"</html>");
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>";
268 /************************/
269 private String
getErlaubteHeilmittel(String
[] heilmittel
){
270 StringBuffer buf
= new StringBuffer();
272 for(int i
= 0;i
< heilmittel
.length
;i
++){
273 hm
= getHeilmittel(heilmittel
[i
]);
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);
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
);
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){
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) {
324 } else if (checkFeiertage
&& istFeiertag(date
)) { //selber implementieren
332 /******************************************/
333 public static int hmrTageDifferenz(String referenzdatum
,String vergleichsdatum
,int differenz
,boolean samstagistwerktag
){
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();
344 /******************************************/
345 @SuppressWarnings("deprecation")
346 public static String
hmrLetztesDatum(String startdatum
,int differenz
,boolean samstagistwerktag
){
347 //SimpleDateFormat sd = new SimpleDateFormat("dd.MM.yyyy");
351 //System.out.println("Übergabe = "+startdatum);
354 date
= sdDeutsch
.parse(startdatum
);
355 } catch (ParseException e
) {
359 //System.out.println("geparstes Datum = "+sd.format(date));
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
);
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
);
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");
388 //System.out.println("Übergabe = "+startdatum);
391 date
= sdDeutsch
.parse(startdatum
);
392 } catch (ParseException e
) {
396 //System.out.println("geparstes Datum = "+sd.format(date));
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
);
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
))){
422 private void aktualisiereHMRs(){
423 Vector<Vector<String>> vec = SqlInfo.holeFelder("select ergaenzend,maxergaenzend,id from hmrcheck where ergaenzend LIKE '%1508%'");
426 System.out.println("Anzahl indis = "+vec.size());
427 for(int i = 0; i < vec.size();i++){
430 sanzahl = vec.get(i).get(1).split("@")[0];
431 }catch(Exception ex){
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);