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"};
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
;
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.
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!");
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
];
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>");
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'>"+
126 "</font> erlaubt!!</b><br><br>");
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>");
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>");
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>");
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
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
));
169 }else if(i
==1 && doppelbehandlung
){
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
));
178 //Hier Doppelbehandlung einbauen ende
181 //Jetzt auf Rezeptbeginn testen
183 long differenz
= DatFunk
.TageDifferenz(rezdatum
,DatFunk
.sHeute());
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>";
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>" +
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());
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>";
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>" +
217 //LetzterBeginn abhandeln
218 String erstbehandlung
= RezTools
.holeEinzelTermineAusRezept(null, termine
).get(0);
219 long differenz
= DatFunk
.TageDifferenz(rezdatum
,erstbehandlung
);
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>";
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>" +
235 }catch(Exception ex
){
236 ex
.printStackTrace();
239 JOptionPane
.showMessageDialog(null,fehlertext
+"</html>");
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>";
251 /************************/
252 private String
getErlaubteHeilmittel(String
[] heilmittel
){
253 StringBuffer buf
= new StringBuffer();
255 for(int i
= 0;i
< heilmittel
.length
;i
++){
256 hm
= getHeilmittel(heilmittel
[i
]);
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);
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
);
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){
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) {
307 } else if (checkFeiertage
&& istFeiertag(date
)) { //selber implementieren
315 /******************************************/
316 public static int hmrTageDifferenz(String referenzdatum
,String vergleichsdatum
,int differenz
,boolean samstagistwerktag
){
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();
327 /******************************************/
328 @SuppressWarnings("deprecation")
329 public static String
hmrLetztesDatum(String startdatum
,int differenz
,boolean samstagistwerktag
){
330 //SimpleDateFormat sd = new SimpleDateFormat("dd.MM.yyyy");
334 //System.out.println("Übergabe = "+startdatum);
337 date
= sdDeutsch
.parse(startdatum
);
338 } catch (ParseException e
) {
342 //System.out.println("geparstes Datum = "+sd.format(date));
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
);
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
);
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");
371 //System.out.println("Übergabe = "+startdatum);
374 date
= sdDeutsch
.parse(startdatum
);
375 } catch (ParseException e
) {
379 //System.out.println("geparstes Datum = "+sd.format(date));
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
);
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
))){
405 private void aktualisiereHMRs(){
406 Vector<Vector<String>> vec = SqlInfo.holeFelder("select ergaenzend,maxergaenzend,id from hmrcheck where ergaenzend LIKE '%1508%'");
409 System.out.println("Anzahl indis = "+vec.size());
410 for(int i = 0; i < vec.size();i++){
413 sanzahl = vec.get(i).get(1).split("@")[0];
414 }catch(Exception ex){
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);