View Javadoc

1   ////////////////////////////////////////////////////////////////////////////////
2   //CabaWeb
3   //Copyright (C) 2004  Thomas Vogt <Thomas.Vogt@TVC-Software.com>
4   //
5   //This library is free software; you can redistribute it and/or
6   //modify it under the terms of the GNU Lesser General Public
7   //License as published by the Free Software Foundation; either
8   //version 2.1 of the License, or (at your option) any later version.
9   //
10  //This library is distributed in the hope that it will be useful,
11  //but WITHOUT ANY WARRANTY; without even the implied warranty of
12  //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  //Lesser General Public License for more details.
14  //
15  //You should have received a copy of the GNU Lesser General Public
16  //License along with this library; if not, write to the Free Software
17  //Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  ////////////////////////////////////////////////////////////////////////////////
19  
20  package org.fhw.cabaweb.calculation.timer;
21  
22  import java.io.IOException;
23  import java.sql.Time;
24  import java.sql.Date;
25  import java.text.SimpleDateFormat;
26  import java.util.ArrayList;
27  import java.util.Collection;
28  import java.util.Iterator;
29  import java.util.Properties;
30  
31  import javax.mail.AuthenticationFailedException;
32  import javax.mail.MessagingException;
33  import javax.mail.SendFailedException;
34  import javax.mail.internet.AddressException;
35  
36  import org.apache.commons.logging.Log;
37  import org.apache.commons.logging.LogFactory;
38  import org.apache.struts.util.MessageResources;
39  
40  import org.fhw.cabaweb.calculation.ErstelleIndices;
41  import org.fhw.cabaweb.calculation.Startwerte;
42  import org.fhw.cabaweb.calculation.common.CommonCalculation;
43  import org.fhw.cabaweb.calculation.threads.BerechneBewertung;
44  import org.fhw.cabaweb.calculation.threads.BerechneHauptwerte;
45  import org.fhw.cabaweb.calculation.threads.BerechneVollUndGrenzkosten;
46  import org.fhw.cabaweb.calculation.threads.CheckEntscheidungen;
47  import org.fhw.cabaweb.calculation.threads.Lock;
48  import org.fhw.cabaweb.data.DataInterfaceBerechnungsauftraege;
49  import org.fhw.cabaweb.data.DataInterfaceErgebnissdaten;
50  import org.fhw.cabaweb.data.DataInterfaceErgebnissdatenDouble;
51  import org.fhw.cabaweb.data.DataInterfaceErgebnissdatenInteger;
52  import org.fhw.cabaweb.data.DataInterfaceGruppenmitglieder;
53  import org.fhw.cabaweb.data.DataInterfaceProjekte;
54  import org.fhw.cabaweb.data.DataInterfaceProjektgruppen;
55  import org.fhw.cabaweb.data.constants.Constants;
56  import org.fhw.cabaweb.data.dataobjects.Ergebniss;
57  import org.fhw.cabaweb.ojb.dataobjects.Berechnungsauftraege;
58  import org.fhw.cabaweb.ojb.dataobjects.Gruppenmitglieder;
59  import org.fhw.cabaweb.ojb.dataobjects.Projekte;
60  import org.fhw.cabaweb.ojb.dataobjects.Projektgruppen;
61  import org.fhw.cabaweb.tools.MailUtilities;
62  import org.fhw.cabaweb.tools.StringUtilities;
63  
64  import org.quartz.Job;
65  import org.quartz.JobExecutionContext;
66  import org.quartz.JobExecutionException;
67  
68  /***
69   * Die Klasse ist f&uuml;r die Ausf&uuml;hrung der Berechnung durch den QUARTZ Scheduler zust&auml;ndig.
70   *
71   * @author  <a href="mailto:thomas.vogt@tvc-software.com">Thomas Vogt</a>
72   * @version Version 1.0 27.08.2004
73   */
74  public final class BerechnungsJob implements Job
75  {
76      /*** Commons Logging Instanz */
77      private static Log log = LogFactory.getLog("org.fhw.cabaweb.calculation.timer.BerechnungsJob");
78  
79      /* (Kein Javadoc)
80       * @see org.quartz.Job#execute(org.quartz.JobExecutionContext)
81       */
82      public void execute(JobExecutionContext context) throws JobExecutionException
83      {
84          /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
85          DataInterfaceBerechnungsauftraege diba = new DataInterfaceBerechnungsauftraege();
86          boolean rueckgabewert = false;
87  
88          Date now = new Date(System.currentTimeMillis());
89          SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss.S");
90  
91          if (log.isDebugEnabled())
92          {
93              log.debug(" Starte Timer : " + df.format(now));
94          }
95  
96          Collection berechnungsauftraege = diba.sucheDatumUhrzeit(new Date(System.currentTimeMillis()), new Time(System.currentTimeMillis()));
97          Iterator berechnungsauftragsiterator = berechnungsauftraege.iterator();
98  
99          while (berechnungsauftragsiterator.hasNext())
100         {
101             Berechnungsauftraege berechnungsauftrag = (Berechnungsauftraege) berechnungsauftragsiterator.next();
102             Integer projektnummer = berechnungsauftrag.getProjekte().getProjektnummer();
103             Date datum = berechnungsauftrag.getDatum();
104             Short wiederholung = berechnungsauftrag.getWiederholung();
105             Integer artDerBerechnung = berechnungsauftrag.getArtDerBerechnung();
106 
107             berechnungsauftrag.setDatum(new Date(datum.getTime() + (86400000 * wiederholung.longValue())));
108 
109             switch (wiederholung.intValue())
110             {
111                 case 0 :
112                     if (log.isDebugEnabled())
113                     {
114                         log.debug(" Loeschen des Berechnungsauftrags");
115                     }
116 
117                     rueckgabewert = diba.loeschen(berechnungsauftrag);
118 
119                     if (rueckgabewert == false)
120                     {
121                         log.error(MailUtilities.SendErrorMailToAdmin("Loeschen des Berechnungsauftrags fehlgeschlagen (PRJ " + projektnummer + ")", ""));
122                         log.error(" Loeschen des Berechnungsauftrags fehlgeschlagen");
123                     }
124                     break;
125                 case 1 :
126                     if (log.isDebugEnabled())
127                     {
128                         log.debug(" Weiterschaltung des Berechnungsauftrags-Datums auf morgen");
129                     }
130 
131                     rueckgabewert = diba.editieren(berechnungsauftrag);
132 
133                     if (rueckgabewert == false)
134                     {
135                         log.error(MailUtilities.SendErrorMailToAdmin("Weiterschaltung des Datums auf morgen fehlgeschlagen (PRJ " + projektnummer + ")", ""));
136                         log.error(" Weiterschaltung des Datums auf morgen fehlgeschlagen");
137                     }
138                     break;
139                 case 7 :
140                     if (log.isDebugEnabled())
141                     {
142                         log.debug(" Weiterschaltung des Berechnungsauftrags-Datums auf naechste Woche");
143                     }
144 
145                     rueckgabewert = diba.editieren(berechnungsauftrag);
146 
147                     if (rueckgabewert == false)
148                     {
149                         log.error(MailUtilities.SendErrorMailToAdmin("Weiterschaltung des Datums auf naechste Woche fehlgeschlagen (PRJ " + projektnummer + ")", ""));
150                         log.error(" Weiterschaltung des Datums auf naechste Woche fehlgeschlagen");
151                     }
152                     break;
153             }
154 
155             switch (artDerBerechnung.intValue())
156             {
157                 case -99 :
158                     ResetQuartalStart(projektnummer);
159                     break;
160                 case -1 :
161                     ResetQuartal(projektnummer);
162                     break;
163                 case 0 :
164                     log.info(" DO NOTHING : " + projektnummer);
165                     break;
166                 case 1 :
167                     BerechneQuartal(projektnummer);
168                     break;
169             }
170         }
171 
172         if (log.isDebugEnabled())
173         {
174             log.debug(" Berechnungsvorgang abgeschlossen");
175         }
176     }
177 
178     /***
179      * Berechnet ein Quartal f&uuml;r die &uuml;bergebene Projektnummer
180      *
181      * @param projektnummer Die Projektnummer
182      */
183     public synchronized void BerechneQuartal(Integer projektnummer)
184     {
185         /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
186         DataInterfaceProjekte dip = new DataInterfaceProjekte();
187         boolean rueckgabewert = false;
188         Projekte projekt = (Projekte) dip.sucheProjektnummer(projektnummer);
189         Integer quartal = projekt.getAktuellesQuartal();
190 
191         if (log.isDebugEnabled())
192         {
193             log.debug(" Berechne Quartal " + (quartal.intValue() + 1));
194         }
195 
196         DeaktiviereUnternehmen(projektnummer);
197 
198         if (quartal.intValue() == -1)
199         {
200             Startwerte.StartwerteEintragen(projektnummer);
201         }
202         else
203         {
204             CheckEntscheidungen(projektnummer, new Integer(quartal.intValue() + 1));
205         }
206 
207         ErstelleIndices(projektnummer, new Integer(quartal.intValue() + 1));
208 
209         BerechneWerte(projektnummer, quartal);
210 
211         projekt.setAktuellesQuartal(new Integer(quartal.intValue() + 1));
212 
213         rueckgabewert = dip.editieren(projekt);
214 
215         if (rueckgabewert == false)
216         {
217             log.error(MailUtilities.SendErrorMailToAdmin("Weiterschaltung des Quartals fehlgeschlagen (PRJ " + projektnummer + ")", ""));
218             log.error(" Weiterschaltung des Quartals fehlgeschlagen");
219             SendStatusMail(projektnummer, new Integer(quartal.intValue() + 1), 1, false);
220         }
221         else
222         {
223             SendStatusMail(projektnummer, new Integer(quartal.intValue() + 1), 1, true);
224         }
225     }
226 
227     /***
228      * Setzt um ein Quartal f&uuml;r die &uuml;bergebene Projektnummer zur&uuml;ck
229      *
230      * @param projektnummer Die Projektnummer
231      */
232     private synchronized void ResetQuartal(Integer projektnummer)
233     {
234         /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
235         DataInterfaceProjekte dip = new DataInterfaceProjekte();
236         boolean rueckgabewert = false;
237         Projekte projekt = (Projekte) dip.sucheProjektnummer(projektnummer);
238         Integer quartal = projekt.getAktuellesQuartal();
239 
240         if (log.isDebugEnabled())
241         {
242             log.debug(" Reset Quartal nach " + (quartal.intValue() - 1));
243         }
244 
245         if (quartal.intValue() > -1)
246         {
247             quartal = new Integer(quartal.intValue() - 1);
248         }
249 
250         projekt.setAktuellesQuartal(quartal);
251 
252         rueckgabewert = dip.editieren(projekt);
253 
254         if (rueckgabewert == false)
255         {
256             log.error(MailUtilities.SendErrorMailToAdmin("Reset des Quartals fehlgeschlagen (PRJ " + projektnummer + ")", ""));
257             log.error(" Reset des Quartals fehlgeschlagen");
258             SendStatusMail(projektnummer, new Integer(quartal.intValue() + 1), -1, false);
259         }
260         else
261         {
262             SendStatusMail(projektnummer, new Integer(quartal.intValue() + 1), -1, true);
263         }
264     }
265 
266     /***
267      * Setzt auf das Quartal -1 f&uuml;r die &uuml;bergebene Projektnummer zur&uuml;ck
268      *
269      * @param projektnummer Die Projektnummer
270      */
271     private synchronized void ResetQuartalStart(Integer projektnummer)
272     {
273         /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
274         DataInterfaceProjekte dip = new DataInterfaceProjekte();
275         /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
276         DataInterfaceErgebnissdatenDouble died = new DataInterfaceErgebnissdatenDouble();
277         /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
278         DataInterfaceErgebnissdatenInteger diei = new DataInterfaceErgebnissdatenInteger();
279         boolean rueckgabewert = false;
280         Projekte projekt = (Projekte) dip.sucheProjektnummer(projektnummer);
281 
282         if (log.isDebugEnabled())
283         {
284             log.debug(" Reset Quartal nach -1");
285         }
286 
287         projekt.setAktuellesQuartal(new Integer(-1));
288 
289         rueckgabewert = dip.editieren(projekt);
290 
291         if (rueckgabewert == false)
292         {
293             log.error(MailUtilities.SendErrorMailToAdmin("Reset des Quartals fehlgeschlagen (PRJ " + projektnummer + ")", ""));
294             log.error(" Reset des Quartals fehlgeschlagen");
295         }
296 
297         if (log.isDebugEnabled())
298         {
299             log.debug(" Loeschen der DOUBLE Ergebnisse");
300         }
301 
302         Collection ergebnisse = died.sucheKombination(projektnummer, null, null);
303         Iterator ergebnisiterator = ergebnisse.iterator();
304 
305         while (ergebnisiterator.hasNext())
306         {
307             rueckgabewert = died.loeschen(ergebnisiterator.next());
308 
309             if (rueckgabewert == false)
310             {
311                 log.error(MailUtilities.SendErrorMailToAdmin("Loeschen DOUBLE Ergebnis fehlgeschlagen (PRJ " + projektnummer + ")", ""));
312                 log.error(" Loeschen DOUBLE Ergebnis fehlgeschlagen");
313             }
314         }
315 
316         if (log.isDebugEnabled())
317         {
318             log.debug(" Loeschen der INTEGER Ergebnisse");
319         }
320 
321         ergebnisse = diei.sucheKombination(projektnummer, null, null);
322         ergebnisiterator = ergebnisse.iterator();
323 
324         while (ergebnisiterator.hasNext())
325         {
326             rueckgabewert = diei.loeschen(ergebnisiterator.next());
327 
328             if (rueckgabewert == false)
329             {
330                 log.error(MailUtilities.SendErrorMailToAdmin("Loeschen INTEGER Ergebnis fehlgeschlagen (PRJ " + projektnummer + ")", ""));
331                 log.error(" Loeschen INTEGER Ergebnis fehlgeschlagen");
332             }
333         }
334 
335         Startwerte.StartwerteEintragen(projektnummer);
336 
337         SendStatusMail(projektnummer, new Integer(-1), -99, true);
338     }
339 
340     /***
341      * Checkt die Entscheidungen des Unterenehmens und übernimmt sie im Zweifelsfall aus dem VorQuartal.
342      *
343      * @param projektnummer Die Projektnummer
344      */
345     private synchronized void CheckEntscheidungen(Integer projektnummer, Integer quartal)
346     {
347         if (log.isDebugEnabled())
348         {
349             log.debug(" CheckEntscheidungen");
350         }
351 
352         /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
353         DataInterfaceProjektgruppen dipg = new DataInterfaceProjektgruppen();
354 
355         Collection projektgruppen = dipg.sucheProjektnummer(projektnummer);
356         Iterator projektgruppeniterator = projektgruppen.iterator();
357 
358         while (projektgruppeniterator.hasNext())
359         {
360             Projektgruppen projektgruppe = (Projektgruppen) projektgruppeniterator.next();
361 
362             if (projektgruppe.getAktiv().booleanValue() == false || projektgruppe.getGruppenname().compareTo("Default") == 0 || projektgruppe.getGruppenname().compareTo("Projektleiter") == 0 || projektgruppe.getGruppenname().compareTo("Administratorgruppe") == 0)
363                 projektgruppeniterator.remove();
364         }
365 
366         projektgruppeniterator = projektgruppen.iterator();
367 
368         Lock lock = new Lock(projektgruppen.size());
369 
370         while (projektgruppeniterator.hasNext())
371         {
372             Projektgruppen projektgruppe = (Projektgruppen) projektgruppeniterator.next();
373             Integer gruppennummer = projektgruppe.getGruppennummer();
374 
375             CheckEntscheidungen mt = new CheckEntscheidungen(lock, projektnummer, gruppennummer, quartal);
376             mt.setName("P " + projektnummer + " - G " + gruppennummer + " - Q " + quartal);
377             mt.setPriority(3);
378             mt.start();
379         }
380 
381         while (lock.getFinishSemaphore() > 0)
382         {
383             synchronized (lock)
384             {
385                 try
386                 {
387                     Thread.sleep(25);
388 
389                     if (lock.getSemaphore() == projektgruppen.size())
390                     {
391                         lock.notifyAll();
392                     }
393                 }
394                 catch (Exception e)
395                 {
396                     log.error(MailUtilities.SendErrorMailToAdmin("Fehler bei 'CheckEntscheidungen'", e.getMessage()));
397                     log.error(e.getMessage(), e);
398                 }
399             }
400         }
401     }
402 
403     /***
404      * Berechnet die Werte f&uuml;r das Projekt und das angegebene Quartal
405      *
406      * @param projektnummer Die Projektnummer
407      * @param quartal Das Quartal
408      */
409     private synchronized void BerechneWerte(Integer projektnummer, Integer quartal)
410     {
411         if (log.isDebugEnabled())
412         {
413             log.debug(" BerechneHauptwerte");
414         }
415 
416         /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
417         DataInterfaceProjektgruppen dipg = new DataInterfaceProjektgruppen();
418 
419         Collection projektgruppen = dipg.sucheProjektnummer(projektnummer);
420         Iterator projektgruppeniterator = projektgruppen.iterator();
421 
422         while (projektgruppeniterator.hasNext())
423         {
424             Projektgruppen projektgruppe = (Projektgruppen) projektgruppeniterator.next();
425 
426             if (!projektgruppe.getAktiv().booleanValue() || projektgruppe.getGruppenname().compareTo("Default") == 0 || projektgruppe.getGruppenname().compareTo("Projektleiter") == 0 || projektgruppe.getGruppenname().compareTo("Administratorgruppe") == 0)
427                 projektgruppeniterator.remove();
428         }
429 
430         projektgruppeniterator = projektgruppen.iterator();
431 
432         Lock lock = new Lock(projektgruppen.size());
433 
434         while (projektgruppeniterator.hasNext())
435         {
436             Projektgruppen projektgruppe = (Projektgruppen) projektgruppeniterator.next();
437             Integer gruppennummer = projektgruppe.getGruppennummer();
438 
439             BerechneHauptwerte mt = new BerechneHauptwerte(lock, projektnummer, gruppennummer, quartal);
440             mt.setName("P " + projektnummer + " - G " + gruppennummer + " - Q " + quartal);
441             mt.setPriority(3);
442             mt.start();
443         }
444 
445         while (lock.getFinishSemaphore() > 0)
446         {
447             synchronized (lock)
448             {
449                 try
450                 {
451                     Thread.sleep(25);
452 
453                     if (lock.getSemaphore() == projektgruppen.size())
454                     {
455                         lock.notifyAll();
456                     }
457                 }
458                 catch (Exception e)
459                 {
460                     log.error(MailUtilities.SendErrorMailToAdmin("Fehler bei 'BerechneWerte'", e.getMessage()));
461                     log.error(e.getMessage(), e);
462                 }
463             }
464         }
465 
466         if (log.isDebugEnabled())
467         {
468             log.debug("BerechneVollUndGrenzkosten");
469         }
470 
471         projektgruppeniterator = projektgruppen.iterator();
472         lock.setFinishSemaphore(projektgruppen.size());
473 
474         while (projektgruppeniterator.hasNext())
475         {
476             Projektgruppen projektgruppe = (Projektgruppen) projektgruppeniterator.next();
477             Integer gruppennummer = projektgruppe.getGruppennummer();
478 
479             BerechneVollUndGrenzkosten mt = new BerechneVollUndGrenzkosten(lock, projektnummer, gruppennummer, quartal);
480             mt.setName("P " + projektnummer + " - G " + gruppennummer + " - Q " + quartal);
481             mt.setPriority(3);
482             mt.start();
483         }
484 
485         while (lock.getFinishSemaphore() > 0)
486         {
487             synchronized (lock)
488             {
489                 try
490                 {
491 
492                     Thread.sleep(25);
493 
494                     if (lock.getSemaphore() == projektgruppen.size())
495                     {
496                         lock.notifyAll();
497                     }
498                 }
499                 catch (Exception e)
500                 {
501                     log.error(MailUtilities.SendErrorMailToAdmin("Fehler bei 'BerechneWerte'", e.getMessage()));
502                     log.error(e.getMessage(), e);
503                 }
504             }
505         }
506 
507         if (log.isDebugEnabled())
508         {
509             log.debug("BerechneBewertung");
510         }
511 
512         projektgruppeniterator = projektgruppen.iterator();
513         lock.setFinishSemaphore(projektgruppen.size());
514 
515         while (projektgruppeniterator.hasNext())
516         {
517             Projektgruppen projektgruppe = (Projektgruppen) projektgruppeniterator.next();
518             Integer gruppennummer = projektgruppe.getGruppennummer();
519 
520             BerechneBewertung mt = new BerechneBewertung(lock, projektnummer, gruppennummer, quartal);
521             mt.setName("P " + projektnummer + " - G " + gruppennummer + " - Q " + quartal);
522             mt.setPriority(3);
523             mt.start();
524         }
525 
526         while (lock.getFinishSemaphore() > 0)
527         {
528             synchronized (lock)
529             {
530                 try
531                 {
532 
533                     Thread.sleep(25);
534 
535                     if (lock.getSemaphore() == projektgruppen.size())
536                     {
537                         lock.notifyAll();
538                     }
539                 }
540                 catch (Exception e)
541                 {
542                     log.error(MailUtilities.SendErrorMailToAdmin("Fehler bei 'BerechneWerte'", e.getMessage()));
543                     log.error(e.getMessage(), e);
544                 }
545             }
546         }
547     }
548 
549     /***
550      * Berechnet die Indices f&uuml;r das Projekt und das angegebene Quartal
551      *
552      * @param projektnummer Die Projektnummer
553      * @param quartal Das Quartal
554      */
555     private synchronized void ErstelleIndices(Integer projektnummer, Integer quartal)
556     {
557         if (log.isDebugEnabled())
558         {
559             log.debug("ErstelleIndices");
560         }
561 
562         /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
563         DataInterfaceProjektgruppen dipg = new DataInterfaceProjektgruppen();
564         /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
565         DataInterfaceErgebnissdaten die = new DataInterfaceErgebnissdaten();
566 
567         Collection projektgruppen = dipg.sucheProjektnummer(projektnummer);
568         Iterator projektgruppeniterator = projektgruppen.iterator();
569 
570         Double inflation = new Double(0.0);
571         Double inflationVorhersage = new Double(0.0);
572         Double lohnerhoehung = new Double(0.0);
573         Double lohnerhoehungVorhersage = new Double(0.0);
574         Double saison = new Double(0.0);
575         Double saisonVorhersage = new Double(0.0);
576         Double konjunktur = new Double(0.0);
577         Double konjunkturVorhersage = new Double(0.0);
578 
579         while (projektgruppeniterator.hasNext())
580         {
581             Projektgruppen projektgruppe = (Projektgruppen) projektgruppeniterator.next();
582 
583             if (projektgruppe.getAktiv().booleanValue() == false || projektgruppe.getGruppenname().compareTo("Default") == 0 || projektgruppe.getGruppenname().compareTo("Projektleiter") == 0 || projektgruppe.getGruppenname().compareTo("Administratorgruppe") == 0)
584                 projektgruppeniterator.remove();
585         }
586 
587         projektgruppeniterator = projektgruppen.iterator();
588 
589         if (projektgruppeniterator.hasNext())
590         {
591             Projektgruppen projektgruppe = (Projektgruppen) projektgruppeniterator.next();
592             Integer gruppennummer = projektgruppe.getGruppennummer();
593 
594             inflation = ErstelleIndices.Inflation(projektnummer, gruppennummer, quartal);
595             inflationVorhersage = ErstelleIndices.InflationVorhersage(projektnummer, gruppennummer, quartal);
596             lohnerhoehung = ErstelleIndices.Lohnerhoehung(projektnummer, gruppennummer, quartal);
597             lohnerhoehungVorhersage = ErstelleIndices.LohnerhoehungVorhersage(projektnummer, gruppennummer, quartal);
598             saison = ErstelleIndices.Saison(projektnummer, gruppennummer, quartal);
599             saisonVorhersage = ErstelleIndices.SaisonVorhersage(projektnummer, gruppennummer, quartal);
600             konjunktur = ErstelleIndices.Konjunktur(projektnummer, gruppennummer, quartal);
601             konjunkturVorhersage = ErstelleIndices.KonjunkturVorhersage(projektnummer, gruppennummer, quartal);
602         }
603 
604         projektgruppeniterator = projektgruppen.iterator();
605 
606         while (projektgruppeniterator.hasNext())
607         {
608             Projektgruppen projektgruppe = (Projektgruppen) projektgruppeniterator.next();
609             Integer gruppennummer = projektgruppe.getGruppennummer();
610 
611             ArrayList aktuellesQuartal = (ArrayList) die.sucheQuartal(projektnummer, gruppennummer, quartal);
612             Ergebniss ergebnis = null;
613 
614             //          Tab. 20 (11)
615             /* Setze Inflationsrate */
616             ergebnis = CommonCalculation.SucheErgebnissFeldname(aktuellesQuartal, Constants.EF_GRUNDDATENINFLATIONSRATE_KEY);
617             ergebnis.setObjectWert(inflation);
618             CommonCalculation.WertEintragen(ergebnis, gruppennummer, quartal);
619 
620             //          Tab. 20 (11V)
621             /* Setze Vorhersage Inflationsrate */
622             ergebnis = CommonCalculation.SucheErgebnissFeldname(aktuellesQuartal, Constants.EF_GRUNDDATENINFLATIONSRATEVORHERSAGE_KEY);
623             ergebnis.setObjectWert(inflationVorhersage);
624             CommonCalculation.WertEintragen(ergebnis, gruppennummer, quartal);
625 
626             //          Tab. 20 (12)
627             /* Setze Lohnerhoehungsrate */
628             ergebnis = CommonCalculation.SucheErgebnissFeldname(aktuellesQuartal, Constants.EF_GRUNDDATENLOHNERHOEHUNG_KEY);
629             ergebnis.setObjectWert(lohnerhoehung);
630             CommonCalculation.WertEintragen(ergebnis, gruppennummer, quartal);
631 
632             //          Tab. 20 (12V)
633             /* Setze Vorhersage Lohnerhoehung */
634             ergebnis = CommonCalculation.SucheErgebnissFeldname(aktuellesQuartal, Constants.EF_GRUNDDATENLOHNERHOEHUNGVORHERSAGE_KEY);
635             ergebnis.setObjectWert(lohnerhoehungVorhersage);
636             CommonCalculation.WertEintragen(ergebnis, gruppennummer, quartal);
637 
638             //          Tab. 20 (13)
639             /* Setze Saisonindex */
640             ergebnis = CommonCalculation.SucheErgebnissFeldname(aktuellesQuartal, Constants.EF_GRUNDDATENSAISONINDEX_KEY);
641             ergebnis.setObjectWert(saison);
642             CommonCalculation.WertEintragen(ergebnis, gruppennummer, quartal);
643 
644             //          Tab. 20 (13V)
645             /* Setze Vorhersage Saisonindex */
646             ergebnis = CommonCalculation.SucheErgebnissFeldname(aktuellesQuartal, Constants.EF_GRUNDDATENSAISONINDEXVORHERSAGE_KEY);
647             ergebnis.setObjectWert(saisonVorhersage);
648             CommonCalculation.WertEintragen(ergebnis, gruppennummer, quartal);
649 
650             //          Tab. 20 (14)
651             /* Setze Konjunkturindex */
652             ergebnis = CommonCalculation.SucheErgebnissFeldname(aktuellesQuartal, Constants.EF_GRUNDDATENKONJUNKTURINDEX_KEY);
653             ergebnis.setObjectWert(konjunktur);
654             CommonCalculation.WertEintragen(ergebnis, gruppennummer, quartal);
655 
656             //          Tab. 20 (14V)
657             /* Setze Vorhersage Konjunkturindex */
658             ergebnis = CommonCalculation.SucheErgebnissFeldname(aktuellesQuartal, Constants.EF_GRUNDDATENKONJUNKURINDEXVORHERSAGE_KEY);
659             ergebnis.setObjectWert(konjunkturVorhersage);
660             CommonCalculation.WertEintragen(ergebnis, gruppennummer, quartal);
661         }
662     }
663 
664     /***
665      * Verschickt eMails mit Information über die erfolgte Berechnung.
666      *
667      * @param projektnummer Die Projektnummer
668      * @param quartal Das Quartal
669      * @param artDerBerechnung Die Art der Berechnung (-99, -1, 0, 1)
670      * @param success War der Vorgang erfolgreich (true/false)
671      */
672     private synchronized void SendStatusMail(Integer projektnummer, Integer quartal, int artDerBerechnung, boolean success)
673     {
674         if (log.isDebugEnabled())
675         {
676             log.debug("Email");
677         }
678 
679         Properties properties = StringUtilities.getPropertiesFromFile("cabaweb.properties");
680 
681         String smtphost = properties.getProperty("SMTPHost");
682         String smtpport = properties.getProperty("SMTPPort");
683         String smtpuser = properties.getProperty("SMTPUser");
684         String smtppassword = properties.getProperty("SMTPPassword");
685         String absenderadresse = properties.getProperty("AbsenderAdresse");
686         String absoluteURL = properties.getProperty("AbsoluteURL");
687 
688         if (log.isDebugEnabled())
689         {
690             log.debug(" SMTP: " + smtphost + ":" + smtpport + " - SENDER: " + absenderadresse + " - URL: " + absoluteURL);
691         }
692 
693         /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
694         DataInterfaceGruppenmitglieder dig = new DataInterfaceGruppenmitglieder();
695 
696         Collection gruppenmitglieder = dig.sucheProjektnummer(projektnummer);
697         Iterator gruppenmitgliederiterator = gruppenmitglieder.iterator();
698 
699         while (gruppenmitgliederiterator.hasNext())
700         {
701             Gruppenmitglieder gruppenmitglied = (Gruppenmitglieder) gruppenmitgliederiterator.next();
702 
703             if (gruppenmitglied.getAktiv().booleanValue() == false || gruppenmitglied.getProjektgruppe().getAktiv().booleanValue() == false || gruppenmitglied.getProjektgruppe().getProjekte().getAktiv().booleanValue() == false || gruppenmitglied.getProjektgruppe().getGruppenname().compareTo("Default") == 0)
704                 gruppenmitgliederiterator.remove();
705         }
706 
707         gruppenmitgliederiterator = gruppenmitglieder.iterator();
708 
709         MessageResources grpmessages = MessageResources.getMessageResources("org.fhw.cabaweb.webfrontend.resources.CalculationResources");
710 
711         String subject = null;
712         String mailbody = null;
713         String successString = null;
714 
715         while (gruppenmitgliederiterator.hasNext())
716         {
717             Gruppenmitglieder gruppenmitglied = (Gruppenmitglieder) gruppenmitgliederiterator.next();
718 
719             try
720             {
721                 if (success)
722                     successString = grpmessages.getMessage("description.successful");
723                 else
724                     successString = grpmessages.getMessage("description.failure");
725 
726                 switch (artDerBerechnung)
727                 {
728                     case -99 :
729                         subject = grpmessages.getMessage("message.de.emailsubject.reset", gruppenmitglied.getProjektgruppe().getProjekte().getProjektname(), quartal, successString);
730                         mailbody = grpmessages.getMessage("message.de.emailtext.reset", gruppenmitglied.getProjektgruppe().getProjekte().getProjektname(), quartal, successString) + "\n\n";
731                         mailbody += "\n-----------------------------------------------------------------\n";
732                         mailbody += grpmessages.getMessage("message.en.emailtext.reset", gruppenmitglied.getProjektgruppe().getProjekte().getProjektname(), quartal, successString) + "\n\n";
733                         MailUtilities.sendMail(smtphost, smtpport, smtpuser, smtppassword, absenderadresse, gruppenmitglied.getMitgliedsemailadresse(), null, subject, mailbody);
734                         break;
735                     case -1 :
736                         subject = grpmessages.getMessage("message.de.emailsubject.reset", gruppenmitglied.getProjektgruppe().getProjekte().getProjektname(), quartal, successString);
737                         mailbody = grpmessages.getMessage("message.de.emailtext.reset", gruppenmitglied.getProjektgruppe().getProjekte().getProjektname(), quartal, successString) + "\n\n";
738                         mailbody += "\n-----------------------------------------------------------------\n";
739                         mailbody += grpmessages.getMessage("message.en.emailtext.reset", gruppenmitglied.getProjektgruppe().getProjekte().getProjektname(), quartal, successString) + "\n\n";
740                         MailUtilities.sendMail(smtphost, smtpport, smtpuser, smtppassword, absenderadresse, gruppenmitglied.getMitgliedsemailadresse(), null, subject, mailbody);
741                         break;
742                     case 0 :
743                         subject = "";
744                         break;
745                     case 1 :
746                         subject = grpmessages.getMessage("message.de.emailsubject.calc", gruppenmitglied.getProjektgruppe().getProjekte().getProjektname(), quartal, successString);
747                         mailbody = grpmessages.getMessage("message.de.emailtext.calc", gruppenmitglied.getProjektgruppe().getProjekte().getProjektname(), quartal, successString, absoluteURL) + "\n\n";
748                         mailbody += "\n-----------------------------------------------------------------\n";
749                         mailbody += grpmessages.getMessage("message.en.emailtext.calc", gruppenmitglied.getProjektgruppe().getProjekte().getProjektname(), quartal, successString, absoluteURL) + "\n\n";
750                         MailUtilities.sendMail(smtphost, smtpport, smtpuser, smtppassword, absenderadresse, gruppenmitglied.getMitgliedsemailadresse(), null, subject, mailbody);
751                         break;
752                 }
753             }
754             catch (IOException ex)
755             {
756                 log.error(MailUtilities.SendErrorMailToAdmin("IOException - Failure sending mail to " + gruppenmitglied.getMitgliedsemailadresse(), ex.getLocalizedMessage()));
757                 log.error(" IOException - Failure sending mail to " + gruppenmitglied.getMitgliedsemailadresse(), ex);
758             }
759             catch (AuthenticationFailedException ex)
760             {
761                 log.error(MailUtilities.SendErrorMailToAdmin("AuthenticationFailedException - Failure sending mail to " + gruppenmitglied.getMitgliedsemailadresse(), ex.getLocalizedMessage()));
762                 log.error(" AuthenticationFailedException - Failure sending mail to " + gruppenmitglied.getMitgliedsemailadresse(), ex);
763             }
764             catch (SendFailedException ex)
765             {
766                 log.error(MailUtilities.SendErrorMailToAdmin("SendFailedException - Failure sending mail to " + gruppenmitglied.getMitgliedsemailadresse(), ex.getLocalizedMessage()));
767                 log.error(" SendFailedException - Failure sending mail to " + gruppenmitglied.getMitgliedsemailadresse(), ex);
768             }
769             catch (AddressException ex)
770             {
771                 log.error(MailUtilities.SendErrorMailToAdmin("AddressException - Failure sending mail to " + gruppenmitglied.getMitgliedsemailadresse(), ex.getLocalizedMessage()));
772                 log.error(" AddressException - Failure sending mail to " + gruppenmitglied.getMitgliedsemailadresse(), ex);
773             }
774             catch (MessagingException ex)
775             {
776                 log.error(MailUtilities.SendErrorMailToAdmin("MessagingException - Failure sending mail to " + gruppenmitglied.getMitgliedsemailadresse(), ex.getLocalizedMessage()));
777                 log.error(" MessagingException - Failure sending mail to " + gruppenmitglied.getMitgliedsemailadresse(), ex);
778             }
779         }
780     }
781 
782     /***
783      * Deaktiviert Unternehmen ohne Gruppenmitglieder bei der Berechnung von Quartal 0.
784      *
785      * @param projektnummer Die Projektnummer
786      */
787     private synchronized void DeaktiviereUnternehmen(Integer projektnummer)
788     {
789         if (log.isDebugEnabled())
790         {
791             log.debug(" DeaktiviereUnternehmen");
792         }
793 
794         /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
795         DataInterfaceProjektgruppen dipg = new DataInterfaceProjektgruppen();
796         /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
797         DataInterfaceGruppenmitglieder digm = new DataInterfaceGruppenmitglieder();
798 
799         Collection projektgruppen = dipg.sucheProjektnummer(projektnummer);
800         Iterator projektgruppeniterator = projektgruppen.iterator();
801 
802         while (projektgruppeniterator.hasNext())
803         {
804             Projektgruppen projektgruppe = (Projektgruppen) projektgruppeniterator.next();
805 
806             if (projektgruppe.getAktiv().booleanValue() == false || projektgruppe.getGruppenname().compareTo("Default") == 0 || projektgruppe.getGruppenname().compareTo("Projektleiter") == 0 || projektgruppe.getGruppenname().compareTo("Administratorgruppe") == 0)
807             {
808                 projektgruppeniterator.remove();
809             }
810         }
811 
812         projektgruppeniterator = projektgruppen.iterator();
813 
814         while (projektgruppeniterator.hasNext())
815         {
816             Projektgruppen projektgruppe = (Projektgruppen) projektgruppeniterator.next();
817             Collection gruppenmitglieder = digm.sucheGruppennummer(projektgruppe.getGruppennummer());
818 
819             if(gruppenmitglieder.size() == 0)
820             {
821                 projektgruppe.setAktiv(Boolean.FALSE);
822                 dipg.editieren(projektgruppe);
823                 projektgruppeniterator.remove();
824             }
825         }
826     }
827 }