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//version 2.1 of the License, or (at your option) any later version.
8   //
9   //This library is distributed in the hope that it will be useful,
10  //but WITHOUT ANY WARRANTY; without even the implied warranty of
11  //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  //Lesser General Public License for more details.
13  //
14  //You should have received a copy of the GNU Lesser General Public
15  //License along with this library; if not, write to the Free Software
16  //Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  ////////////////////////////////////////////////////////////////////////////////
18  
19  package org.fhw.cabaweb.calculation.threads;
20  
21  import java.util.ArrayList;
22  
23  import org.apache.commons.logging.Log;
24  import org.apache.commons.logging.LogFactory;
25  import org.fhw.cabaweb.calculation.ErstelleDatentabellen;
26  import org.fhw.cabaweb.calculation.common.CommonCalculation;
27  import org.fhw.cabaweb.data.DataInterfaceErgebnissdaten;
28  import org.fhw.cabaweb.data.DataInterfaceVoreinstellungen;
29  import org.fhw.cabaweb.data.constants.Constants;
30  import org.fhw.cabaweb.data.dataobjects.Ergebniss;
31  import org.fhw.cabaweb.data.dataobjects.ProduktartAbhaengigkeiten;
32  import org.fhw.cabaweb.data.dataobjects.Voreinstellung;
33  import org.fhw.cabaweb.math.Finanzierung;
34  import org.fhw.cabaweb.math.Vertrieb;
35  
36  /***
37   * Die Klasse berechnet die Voll- und Grenzkostenwerte der Unternehmen.
38   *
39   * @author  <a href="mailto:thomas.vogt@tvc-software.com">Thomas Vogt</a>
40   * @version Version 1.0 25.08.2004
41   */
42  public final class BerechneVollUndGrenzkosten extends Thread
43  {
44      /*** Commons Logging Instanz */
45      private Log log = LogFactory.getLog("org.fhw.cabaweb.calculation.threads.BerechneVollUndGrenzkosten");
46      /*** Das LOCK Objekt */
47      private Lock lock;
48      /*** Die Projektnummer */
49      private Integer projektnummer;
50      /*** Die Gruppennummer */
51      private Integer gruppennummer;
52      /*** Das Quartal */
53      private Integer quartal;
54  
55      /* ----- Konstruktoren / Destruktoren ----- */
56  
57      /***
58       * Standardkonstruktor der nicht zug&auml;nglich sein soll
59       */
60      private BerechneVollUndGrenzkosten()
61      {
62          log.error("!!! DEFAULT CONSTRUCTOR NOT TO BE USED !!!");
63      }
64  
65      /***
66       * Standardkonstruktor der das "Lock" Objekt übergeben bekommt
67       *
68       * @param lock          Das Lock Objekt
69       */
70      public BerechneVollUndGrenzkosten(Lock lock)
71      {
72          this.lock = lock;
73      }
74  
75      /***
76       * Standardkonstruktor der das "Lock" Objekt übergeben bekommt
77       * Zusätzlich auch noch die nötigen Parameter
78       *
79       * @param lock          Das Lock Objekt
80       * @param projektnummer Die Projektnummer
81       * @param gruppennummer Die Gruppennummer
82       * @param quartal       Das Quartal
83       */
84      public BerechneVollUndGrenzkosten(Lock lock, Integer projektnummer, Integer gruppennummer, Integer quartal)
85      {
86          this.lock = lock;
87          this.projektnummer = projektnummer;
88          this.gruppennummer = gruppennummer;
89          this.quartal = quartal;
90      }
91  
92      /* ----- Thread Methode ----- */
93  
94      /***
95       * Methode die beim Start des Threads ausgeführt wird
96       *
97       * Aufruf:
98       *
99       * Object lock = new Object ();
100      * BerechneVollUndGrenzkosten mt1 = new BerechneVollUndGrenzkosten(lock, PROJEKTNUMMER, GRUPPENNUMMER, QUARTAL);
101      * mt1.setName ("Name XYZ");
102      * // DEFAULT PRIORITY IS 5, MIN(IDLE) = 1, MAX(REALTIME) = 10
103      * mt1.setPriority(5);
104      * mt1.start();
105      *
106      * while(Thread.activeCount() > 1)
107      * {
108      *     synchronized (lock)
109      *     {
110      *         try
111      *         {
112      *             lock.wait();
113      *         }
114      *         catch (Exception e)
115      *         {
116      *             // Error Handling
117      *         }
118      *     }
119      * }
120      */
121     public synchronized void run()
122     {
123         if (lock != null && projektnummer != null && gruppennummer != null && quartal != null)
124         {
125             if (log.isDebugEnabled())
126             {
127                 log.debug(" THREAD NAME : " + getName());
128                 log.debug(" THREAD PRIO : " + getPriority());
129                 log.debug(" (S) Start der Verarbeitung \"BerechneVollUndGrenzkosten\" fuer Gruppe \"" + gruppennummer + "\", Quartal \"" + quartal + "\" THREAD NAME : " + getName());
130             }
131 
132             try
133             {
134                 /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
135                 DataInterfaceErgebnissdaten die = new DataInterfaceErgebnissdaten();
136                 /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
137                 DataInterfaceVoreinstellungen div = new DataInterfaceVoreinstellungen();
138 
139                 Ergebniss wert1 = null;
140                 Ergebniss wert2 = null;
141                 Voreinstellung voreinstellung1 = null;
142 
143                 //              ArrayList mit den allgemeinen Voreinstellungen
144                 ArrayList allgemein = (ArrayList) div.sucheKombination_Gruppierung(projektnummer, Constants.VG_VOREINSTELLUNGENALLGEMEIN_KEY);
145                 //              ArrayList mit dem zu vorherigen Quartal
146                 ArrayList aktuellesquartalminus1 = (ArrayList) die.sucheQuartal(projektnummer, gruppennummer, quartal);
147                 //              ArrayList mit dem zu berechnenden Quartal
148                 ArrayList aktuellesquartal = (ArrayList) die.sucheQuartal(projektnummer, gruppennummer, new Integer(quartal.intValue() + 1));
149 
150                 //              Tabellen f&uuml;r die Voreinstellungen bezgl. Rahmenwerte
151                 ArrayList produktArtAbhaengigkeitenTabelle = ErstelleDatentabellen.ProduktArtAbhaengigkeitenTabelle(projektnummer);
152                 ArrayList preisAbsatzTabelle = ErstelleDatentabellen.PreisAbsatzTabelle(projektnummer);
153                 ArrayList marketingTabelle = ErstelleDatentabellen.MarketingTabelle(projektnummer);
154                 ArrayList verwaltungTabelle = ErstelleDatentabellen.VerwaltungTabelle(projektnummer);
155 
156                 //              Tab A1.1 (1)
157                 /* Erlös VK */
158                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ENTSCHEIDUNGVERKAUFSPREIS_KEY);
159                 Double erloesVK = (Double) wert1.getObjectWert();
160                 wert2 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGERLOES_KEY);
161                 wert2.setObjectWert(erloesVK);
162                 CommonCalculation.WertEintragen(wert2, gruppennummer, new Integer(quartal.intValue() + 1));
163 
164                 //              Tab A1.1 (2.11)
165                 /* Marketing VK */
166                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGMARKETINGKOSTEN_KEY);
167                 Double marketingkosten = (Double) wert1.getObjectWert();
168                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRUNDDATENABGESETZTEMENGE_KEY);
169                 Double abgesetzteMenge = (Double) wert1.getObjectWert();
170                 wert2 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGMARKETING_KEY);
171                 Double marketingVK = new Double(Finanzierung.vertriebsKostenMarketing(marketingkosten.doubleValue(), abgesetzteMenge.doubleValue()));
172                 wert2.setObjectWert(marketingVK);
173                 CommonCalculation.WertEintragen(wert2, gruppennummer, new Integer(quartal.intValue() + 1));
174 
175                 //              Tab A1.1 (2.12)
176                 /* Lagerung Fertigprodukte VK */
177                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGLAGERUNGSKOSTENFERTIGPRODUKTE_KEY);
178                 Double lagerungskostenFertigprodukte = (Double) wert1.getObjectWert();
179                 wert2 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGLAGERUNGVONFERTIGPRODUKTEN_KEY);
180                 Double lagerungFertigprodukteVK = new Double(Finanzierung.vertriebsKostenLagerungFertigprodukte(lagerungskostenFertigprodukte.doubleValue(), abgesetzteMenge.doubleValue()));
181                 wert2.setObjectWert(lagerungFertigprodukteVK);
182                 CommonCalculation.WertEintragen(wert2, gruppennummer, new Integer(quartal.intValue() + 1));
183 
184                 //              Tab A1.1 (2.13)
185                 /* Beratung Und Marktforschung VK */
186                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGMARKTFORSCHUNGSKOSTEN_KEY);
187                 Double marktforschungskosten = (Double) wert1.getObjectWert();
188                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGBERATUNGSKOSTEN_KEY);
189                 Double beratungskosten = (Double) wert1.getObjectWert();
190                 wert2 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGBERATUNGUNDMARKTFORSCHUNG_KEY);
191                 Double beratungUndMarktforschungVK = new Double(Finanzierung.vertriebsKostenBeratungUndMarktforschung(marktforschungskosten.doubleValue(), beratungskosten.doubleValue(), abgesetzteMenge.doubleValue()));
192                 wert2.setObjectWert(beratungUndMarktforschungVK);
193                 CommonCalculation.WertEintragen(wert2, gruppennummer, new Integer(quartal.intValue() + 1));
194 
195                 //              Tab A1.1 (2.1)
196                 /* Vertriebskosten VK */
197                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGVERTRIEBSKOSTEN_KEY);
198                 Double vertriebskostenVK = new Double(Finanzierung.vertriebskosten(marketingVK.doubleValue(), lagerungFertigprodukteVK.doubleValue(), beratungUndMarktforschungVK.doubleValue()));
199                 wert1.setObjectWert(vertriebskostenVK);
200                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
201 
202                 //              Tab A1.1 (2.21)
203                 /* Löhne ohne Überstunden VK */
204                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGFLKOHNEUEBERSTUNDENUNDNACHARBEIT_KEY);
205                 Double flkOhneUeberstundenOhneNacharbeit = (Double) wert1.getObjectWert();
206                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGNACHARBEITSKOSTENOHNEUEBERSTUNDEN_KEY);
207                 Double nacharbeitslohnkosten = (Double) wert1.getObjectWert();
208                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRUNDDATENGUTEPRODUKTIONSMENGE_KEY);
209                 Double guteProduktionsmenge = (Double) wert1.getObjectWert();
210                 wert2 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGLOEHNEOHNEUEBERSTUNDENZUSCHLAG_KEY);
211                 Double loehneOhneÜberstundenVK = new Double(Finanzierung.herstellEinzelKostenLoehne(flkOhneUeberstundenOhneNacharbeit.doubleValue() + nacharbeitslohnkosten.doubleValue(), guteProduktionsmenge.doubleValue()));
212                 wert2.setObjectWert(loehneOhneÜberstundenVK);
213                 CommonCalculation.WertEintragen(wert2, gruppennummer, new Integer(quartal.intValue() + 1));
214 
215                 //              Tab A1.1 (2.22)
216                 /* Überstundenzuschlag VK */
217                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGUEBERSTUNDENZUSCHLAEGEFLKOHNEUEBERSTUNDENUNDNACHARBEIT_KEY);
218                 Double ueberstundenzuschlaege = (Double) wert1.getObjectWert();
219                 wert2 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGUEBERSTUNDENZUSCHLAG_KEY);
220                 Double ueberstundenzuschlaegeVK = new Double(Finanzierung.herstellEinzelKostenUeberstunden(ueberstundenzuschlaege.doubleValue(), guteProduktionsmenge.doubleValue()));
221                 wert2.setObjectWert(ueberstundenzuschlaegeVK);
222                 CommonCalculation.WertEintragen(wert2, gruppennummer, new Integer(quartal.intValue() + 1));
223 
224                 //              Tab A1.1 (2.23)
225                 /* Rohstoffe VK */
226                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGROHSTOFFVERBRAUCHSKOSTEN_KEY);
227                 Double rohstoffverbrauchskosten = (Double) wert1.getObjectWert();
228                 wert2 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGROHSTOFFE_KEY);
229                 Double rohstoffeVK = new Double(Finanzierung.herstellEinzelKostenRohstoffe(rohstoffverbrauchskosten.doubleValue(), guteProduktionsmenge.doubleValue()));
230                 wert2.setObjectWert(rohstoffeVK);
231                 CommonCalculation.WertEintragen(wert2, gruppennummer, new Integer(quartal.intValue() + 1));
232 
233                 //              Tab A1.1 (2.2)
234                 /* Herstell-Einzelkosten VK */
235                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGHERSTELLEINZELKOSTEN_KEY);
236                 Double herstellEinzelkostenVK = new Double(Finanzierung.herstellEinzelKosten(loehneOhneÜberstundenVK.doubleValue(), ueberstundenzuschlaegeVK.doubleValue(), rohstoffeVK.doubleValue()));
237                 wert1.setObjectWert(herstellEinzelkostenVK);
238                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
239 
240                 //              Tab A1.1 (2.31)
241                 /* Rohstofflagerung Und Bestellung VK */
242                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGROHSTOFFBESTELLUNGSKOSTEN_KEY);
243                 Double rohstoffbestellungskosten = (Double) wert1.getObjectWert();
244                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGLAGERKOSTENROHSTOFFE_KEY);
245                 Double rohstofflagerkosten = (Double) wert1.getObjectWert();
246                 wert2 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGROHSTOFFLAGERUNGUNDBESTELLUNG_KEY);
247                 Double rohstofflagerungUndBestellungVK = new Double(Finanzierung.herstellGemeinKostenRohstoffe(rohstofflagerkosten.doubleValue(), rohstoffbestellungskosten.doubleValue(), guteProduktionsmenge.doubleValue()));
248                 wert2.setObjectWert(rohstofflagerungUndBestellungVK);
249                 CommonCalculation.WertEintragen(wert2, gruppennummer, new Integer(quartal.intValue() + 1));
250 
251                 //              Tab A1.1 (2.32)
252                 /* Abschreibung und Anlagenprojektierung VK */
253                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGABSCHREIBUNGSKOSTEN_KEY);
254                 Double abschreibungskosten = (Double) wert1.getObjectWert();
255                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGANLAGENPROJEKTIERUNGSKOSTEN_KEY);
256                 Double anlagenprojektierungskosten = (Double) wert1.getObjectWert();
257                 wert2 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGABSCHREIBUNGUNDANLAGENPROJEKTIERUNG_KEY);
258                 Double abschreibungUndAnlagenProjektierungVK = new Double(Finanzierung.herstellGemeinKostenAbschreibungUndAnlagenprojektierung(abschreibungskosten.doubleValue(), anlagenprojektierungskosten.doubleValue(), guteProduktionsmenge.doubleValue()));
259                 wert2.setObjectWert(abschreibungUndAnlagenProjektierungVK);
260                 CommonCalculation.WertEintragen(wert2, gruppennummer, new Integer(quartal.intValue() + 1));
261 
262                 //              Tab A1.1 (2.33)
263                 /* Qualitätssicherung VK */
264                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGQUALITAETSSICHERUNGSKOSTEN_KEY);
265                 Double qualitaetssicherungskosten = (Double) wert1.getObjectWert();
266                 wert2 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGQUALITAETSSICHERUNG_KEY);
267                 Double qualitaetssicherungVK = new Double(Finanzierung.herstellGemeinKostenQualitaetssicherung(qualitaetssicherungskosten.doubleValue(), guteProduktionsmenge.doubleValue()));
268                 wert2.setObjectWert(qualitaetssicherungVK);
269                 CommonCalculation.WertEintragen(wert2, gruppennummer, new Integer(quartal.intValue() + 1));
270 
271                 //              Tab A1.1 (2.34)
272                 /* Schichtwechsel VK */
273                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGSCHICHTWECHSELKOSTEN_KEY);
274                 Double schichtwechselkosten = (Double) wert1.getObjectWert();
275                 wert2 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGSCHICHTWECHSEL_KEY);
276                 Double schichtwechselVK = new Double(Finanzierung.herstellGemeinKostenSchichtwechsel(schichtwechselkosten.doubleValue(), guteProduktionsmenge.doubleValue()));
277                 wert2.setObjectWert(schichtwechselVK);
278                 CommonCalculation.WertEintragen(wert2, gruppennummer, new Integer(quartal.intValue() + 1));
279 
280                 //              Tab A1.1 (2.35)
281                 /* Forschung und Entwicklung VK */
282                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGFORSCHUNGSUNDENTWICKLUNGSKOSTEN_KEY);
283                 Double forschungsUndEntwicklungskosten = (Double) wert1.getObjectWert();
284                 wert2 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGFUNDEAUFARBEITUNGTRANSFERERTRAEGE_KEY);
285                 Double forschungUndEntwicklungVK = new Double(Finanzierung.herstellGemeinKostenForschungUndEntwicklung(forschungsUndEntwicklungskosten.doubleValue(), guteProduktionsmenge.doubleValue()));
286                 wert2.setObjectWert(forschungUndEntwicklungVK);
287                 CommonCalculation.WertEintragen(wert2, gruppennummer, new Integer(quartal.intValue() + 1));
288 
289                 //              Tab A1.1 (2.36)
290                 /* Zinsen VK */
291                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGZINSKOSTENBANKDARLEHEN_KEY);
292                 Double zinskostenBankdarlehen = (Double) wert1.getObjectWert();
293                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGZINSKOSTENKONTOKORRENTKREDIT_KEY);
294                 Double zinskostenKontokorrentkredit = (Double) wert1.getObjectWert();
295                 wert2 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGZINSEN_KEY);
296                 Double zinsenVK = new Double(Finanzierung.herstellGemeinKostenZinsen(zinskostenKontokorrentkredit.doubleValue(), zinskostenBankdarlehen.doubleValue(), guteProduktionsmenge.doubleValue()));
297                 wert2.setObjectWert(zinsenVK);
298                 CommonCalculation.WertEintragen(wert2, gruppennummer, new Integer(quartal.intValue() + 1));
299 
300                 //              Tab A1.1 (2.37)
301                 /* Verwaltung VK */
302                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ERFOLGSRECHNUNGVERWALTUNGSKOSTEN_KEY);
303                 Double verwaltungskosten = (Double) wert1.getObjectWert();
304                 wert2 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGVERWALTUNG_KEY);
305                 Double verwaltungVK = new Double(Finanzierung.herstellGemeinKostenVerwaltung(verwaltungskosten.doubleValue(), guteProduktionsmenge.doubleValue()));
306                 wert2.setObjectWert(verwaltungVK);
307                 CommonCalculation.WertEintragen(wert2, gruppennummer, new Integer(quartal.intValue() + 1));
308 
309                 //              Tab A1.1 (2.3)
310                 /* Herstell-Gemein-Kosten VK */
311                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGHERSTELLGEMEINKOSTEN_KEY);
312                 Double herstellGemeinkostenVK = new Double(Finanzierung.herstellGemeinKosten(rohstofflagerungUndBestellungVK.doubleValue(), abschreibungUndAnlagenProjektierungVK.doubleValue(), qualitaetssicherungVK.doubleValue(), schichtwechselVK.doubleValue(), forschungUndEntwicklungVK.doubleValue(), zinsenVK.doubleValue(), verwaltungVK.doubleValue()));
313                 wert1.setObjectWert(herstellGemeinkostenVK);
314                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
315 
316                 //              Tab A1.1 (2)
317                 /* Kosten VK */
318                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGKOSTEN_KEY);
319                 Double kostenVK = new Double(Finanzierung.vollkosten(vertriebskostenVK.doubleValue(), herstellEinzelkostenVK.doubleValue(), herstellGemeinkostenVK.doubleValue()));
320                 wert1.setObjectWert(kostenVK);
321                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
322 
323                 //              Tab A1.1 (3)
324                 /* Gewinn VK */
325                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGGEWINN_KEY);
326                 Double gewinnVK = new Double(Finanzierung.gewinn(erloesVK.doubleValue(), kostenVK.doubleValue()));
327                 wert1.setObjectWert(gewinnVK);
328                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
329 
330                 //              Tabelle mit den wirksamen Preisen
331                 ArrayList wirksamerPreisTabelle = ErstelleDatentabellen.WirksamerPreisTabelle(projektnummer, new Integer(quartal.intValue() + 1));
332 
333                 //              Tab A1.2 (1)
334                 /* Grenzerlös GK */
335                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_ENTSCHEIDUNGVERKAUFSPREIS_KEY);
336                 Double grenzerloesGK = (Double) wert1.getObjectWert();
337                 wert2 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRENZKOSTENRECHNUNGGRENZERLOES_KEY);
338                 wert2.setObjectWert(grenzerloesGK);
339                 CommonCalculation.WertEintragen(wert2, gruppennummer, new Integer(quartal.intValue() + 1));
340 
341                 //              Produzierte Produktart
342                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRUNDDATENPRODUZIERTEPRODUKTART_KEY);
343                 Integer produzierteProduktart = (Integer) wert1.getObjectWert();
344                 if (log.isDebugEnabled())
345                 {
346                     log.debug(" Produzierte Produktart : '" + produzierteProduktart.toString() + "'");
347                 }
348 
349                 //              Tab A1.1 (4)
350                 /* Produzierte Menge */
351                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGPRODUZIERTEMENGE_KEY);
352                 wert1.setObjectWert(guteProduktionsmenge);
353                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
354 
355                 //              Tab A1.1 (5)
356                 /* Abgesetzte Menge */
357                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_VOLLKOSTENRECHNUNGABGESETZTEMENGE_KEY);
358                 wert1.setObjectWert(abgesetzteMenge);
359                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
360 
361                 //              Produktarteffekt
362                 ProduktartAbhaengigkeiten produzierteStufe = null;
363                 for (int i = 0; i < produktArtAbhaengigkeitenTabelle.size(); i++)
364                 {
365                     produzierteStufe = (ProduktartAbhaengigkeiten) produktArtAbhaengigkeitenTabelle.get(i);
366 
367                     if (produzierteStufe.getProduktart() == produzierteProduktart.intValue())
368                     {
369                         break;
370                     }
371                     else
372                     {
373                         produzierteStufe = null;
374                     }
375 
376                 }
377 
378                 if (produzierteStufe == null)
379                 {
380                     log.error(" Produzierte Stufe nicht gefunden !!!");
381                 }
382 
383                 Double produktarteffekt = new Double(produzierteStufe.getProduktarteffekt() / 100.0);
384                 if (log.isDebugEnabled())
385                 {
386                     log.debug(" Produktarteffekt : '" + produktarteffekt.toString() + "'");
387                 }
388 
389                 //              wirksame Marketingkosten Vor-Quartal
390                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartalminus1, Constants.EF_GRUNDDATENWIRKSAMEMARKETINGKOSTEN_KEY);
391                 Double wirksameMarketingkostenVQ = (Double) wert1.getObjectWert();
392                 if (log.isDebugEnabled())
393                 {
394                     log.debug(" Wirksame Marketingkosten Vor-Quartal : '" + wirksameMarketingkostenVQ.toString() + "'");
395                 }
396 
397                 //              realer Verkaufspreis Vor-Quartal
398                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartalminus1, Constants.EF_GRUNDDATENVERKAUFSPREISREAL_KEY);
399                 Double realerVerkaufspreisVQ = (Double) wert1.getObjectWert();
400                 if (log.isDebugEnabled())
401                 {
402                     log.debug(" Realer Verkaufspreis Vor-Quartal : '" + realerVerkaufspreisVQ.toString() + "'");
403                 }
404 
405                 //              Umsatzerloese Vor-Quartal
406                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartalminus1, Constants.EF_ERFOLGSRECHNUNGUMSATZERLOESE_KEY);
407                 Double umsatzerloeseVQ = (Double) wert1.getObjectWert();
408                 if (log.isDebugEnabled())
409                 {
410                     log.debug(" Umsatzerloese Vor-Quartal : '" + umsatzerloeseVQ.toString() + "'");
411                 }
412 
413                 //              Korrekturfaktor
414                 Double korrekturfaktor = new Double(Vertrieb.korrekturfaktor(wirksamerPreisTabelle, gruppennummer));
415                 if (log.isDebugEnabled())
416                 {
417                     log.debug(" Korrekturfaktor : '" + korrekturfaktor.toString() + "'");
418                 }
419 
420                 //              Preis abhängig ab
421                 voreinstellung1 = CommonCalculation.SucheVoreinstellungFeldname(allgemein, Constants.VF_ALLGEMEINEVOREINSTELLUNGENABHAENGIGEPREISE_KEY);
422                 Integer preisAbhaengigAb = (Integer) voreinstellung1.getWertObject();
423                 if (log.isDebugEnabled())
424                 {
425                     log.debug(" Preis abhängig ab : '" + preisAbhaengigAb.toString() + "'");
426                 }
427 
428                 //              Sainsonindex
429                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRUNDDATENSAISONINDEX_KEY);
430                 Double sainsonindex = new Double(((Double) wert1.getObjectWert()).doubleValue() / 100.0);
431                 if (log.isDebugEnabled())
432                 {
433                     log.debug(" Sainsonindex : '" + sainsonindex.toString() + "'");
434                 }
435 
436                 //              Konjunkturindex
437                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRUNDDATENKONJUNKTURINDEX_KEY);
438                 Double konjunkturindex = new Double(((Double) wert1.getObjectWert()).doubleValue() / 100.0);
439                 if (log.isDebugEnabled())
440                 {
441                     log.debug(" Konjunkturindex : '" + konjunkturindex.toString() + "'");
442                 }
443 
444                 //              Inflationsindex
445                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRUNDDATENINFLATIONSINDEX_KEY);
446                 Double inflationsindex = (Double) wert1.getObjectWert();
447                 if (log.isDebugEnabled())
448                 {
449                     log.debug(" Inflationsindex : '" + inflationsindex.toString() + "'");
450                 }
451 
452                 //              Absetzbare Menge
453                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRUNDDATENABSETZBAREMENGE_KEY);
454                 Double absetzbareMenge = (Double) wert1.getObjectWert();
455                 if (log.isDebugEnabled())
456                 {
457                     log.debug(" Absetzbare Menge : '" + absetzbareMenge.toString() + "'");
458                 }
459 
460                 //              wirksamer Verkaufspreis
461                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRUNDDATENVERKAUFSPREISWIRKSAM_KEY);
462                 Double wirksamerVerkaufspreis = (Double) wert1.getObjectWert();
463                 if (log.isDebugEnabled())
464                 {
465                     log.debug(" Wirksamer Verkaufspreis : '" + wirksamerVerkaufspreis.toString() + "'");
466                 }
467 
468                 //              realer Verkaufspreis
469                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRUNDDATENVERKAUFSPREISREAL_KEY);
470                 Double realerVerkaufspreis = (Double) wert1.getObjectWert();
471                 if (log.isDebugEnabled())
472                 {
473                     log.debug(" Realer Verkaufspreis : '" + realerVerkaufspreis.toString() + "'");
474                 }
475 
476                 //              Nachhalleffekt
477                 voreinstellung1 = CommonCalculation.SucheVoreinstellungFeldname(allgemein, Constants.VF_ALLGEMEINEVOREINSTELLUNGENNACHHALLEFFEKT_KEY);
478                 Double nachhalleffekt = new Double(((Double) voreinstellung1.getWertObject()).doubleValue() / 100.0);
479                 if (log.isDebugEnabled())
480                 {
481                     log.debug(" Nachhalleffekt : '" + nachhalleffekt.toString() + "'");
482                 }
483 
484                 //              wirksame Marketingkosten
485                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRUNDDATENWIRKSAMEMARKETINGKOSTEN_KEY);
486                 Double wirksameMarketingkosten = (Double) wert1.getObjectWert();
487                 if (log.isDebugEnabled())
488                 {
489                     log.debug(" Wirksame Marketingkosten : '" + wirksameMarketingkosten.toString() + "'");
490                 }
491 
492                 //              Tab A1.2 (2)
493                 /* Grenzmarketingkosten GK */
494                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRENZKOSTENRECHNUNGGRENZMARKETINGKOSTEN_KEY);
495                 Double grenzmarketingkostenGK = new Double(0.0);
496                 if ((quartal.intValue() + 1) >= preisAbhaengigAb.intValue())
497                 {
498                     grenzmarketingkostenGK =
499                         new Double(
500                             Vertrieb.grenzMarketingKosten(
501                                 konjunkturindex.doubleValue(),
502                                 sainsonindex.doubleValue(),
503                                 absetzbareMenge.doubleValue(),
504                                 wirksamerVerkaufspreis.doubleValue(),
505                                 realerVerkaufspreis.doubleValue(),
506                                 realerVerkaufspreisVQ.doubleValue(),
507                                 produktarteffekt.doubleValue(),
508                                 umsatzerloeseVQ.doubleValue(),
509                                 wirksameMarketingkostenVQ.doubleValue(),
510                                 inflationsindex.doubleValue(),
511                                 nachhalleffekt.doubleValue(),
512                                 wirksameMarketingkosten.doubleValue(),
513                                 korrekturfaktor.doubleValue(),
514                                 preisAbsatzTabelle,
515                                 marketingTabelle,
516                                 wirksamerPreisTabelle.size()));
517                 }
518                 else
519                 {
520                     grenzmarketingkostenGK =
521                         new Double(
522                             Vertrieb.grenzMarketingKosten(
523                                 konjunkturindex.doubleValue(),
524                                 sainsonindex.doubleValue(),
525                                 absetzbareMenge.doubleValue(),
526                                 wirksamerVerkaufspreis.doubleValue(),
527                                 realerVerkaufspreis.doubleValue(),
528                                 realerVerkaufspreisVQ.doubleValue(),
529                                 produktarteffekt.doubleValue(),
530                                 umsatzerloeseVQ.doubleValue(),
531                                 wirksameMarketingkostenVQ.doubleValue(),
532                                 inflationsindex.doubleValue(),
533                                 nachhalleffekt.doubleValue(),
534                                 wirksameMarketingkosten.doubleValue(),
535                                 1.0,
536                                 preisAbsatzTabelle,
537                                 marketingTabelle,
538                                 wirksamerPreisTabelle.size()));
539                 }
540                 wert1.setObjectWert(grenzmarketingkostenGK);
541                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
542 
543                 //              Kapazitätsauslastung
544                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRUNDDATENKAPAZITAETSAUSLASTUNG_KEY);
545                 Double kapazitaetsauslastung = (Double) wert1.getObjectWert();
546                 if (log.isDebugEnabled())
547                 {
548                     log.debug(" Kapazitätsauslastung : '" + kapazitaetsauslastung.toString() + "'");
549                 }
550 
551                 //              Tab A1.2 (5)
552                 /* Produktion in der letzten Zone GK */
553                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRENZKOSTENRECHNUNGPRODUKTIONINLETZTERZONE_KEY);
554                 Double produktionLetzteZoneGK = new Double(Finanzierung.produktionInDerLetztenZone(kapazitaetsauslastung.doubleValue(), guteProduktionsmenge.doubleValue()));
555                 wert1.setObjectWert(produktionLetzteZoneGK);
556                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
557 
558                 //              Fertigungslohnkosten
559                 Double fertigungslohnkosten = new Double(flkOhneUeberstundenOhneNacharbeit.doubleValue() + nacharbeitslohnkosten.doubleValue());
560                 if (log.isDebugEnabled())
561                 {
562                     log.debug(" Fertigungslohnkosten : '" + fertigungslohnkosten.toString() + "'");
563                 }
564 
565                 //              Tab A1.2 (3.1)
566                 /* Löhne ohne Überstunden GK */
567                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRENZKOSTENRECHNUNGLOEHNEOHNEUEBERSTUNDENZUSCHLAG_KEY);
568                 Double loehneOhneUeberstundenGK = new Double(Finanzierung.grenzHerstellKostenLoehne(kapazitaetsauslastung.doubleValue(), fertigungslohnkosten.doubleValue(), guteProduktionsmenge.doubleValue()));
569                 wert1.setObjectWert(loehneOhneUeberstundenGK);
570                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
571 
572                 //              Tab A1.2 (3.2)
573                 /* Überstundenzuschläge GK */
574                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRENZKOSTENRECHNUNGUEBERSTUNDENZUSCHLAG_KEY);
575                 Double ueberstundenzuschlagGK = new Double(Finanzierung.grenzHerstellKostenUeberstunden(kapazitaetsauslastung.doubleValue(), ueberstundenzuschlaege.doubleValue(), produktionLetzteZoneGK.doubleValue()));
576                 wert1.setObjectWert(ueberstundenzuschlagGK);
577                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
578 
579                 //              Tab A1.2 (3.3)
580                 /* Rohstoffe GK */
581                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRENZKOSTENRECHNUNGROHSTOFFE_KEY);
582                 Double rohstoffeGK = new Double(Finanzierung.grenzHerstellKostenRohstoffe(kapazitaetsauslastung.doubleValue(), rohstoffverbrauchskosten.doubleValue(), guteProduktionsmenge.doubleValue()));
583                 wert1.setObjectWert(rohstoffeGK);
584                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
585 
586                 //              Tab A1.2 (3.4)
587                 /* Qualitätssicherung GK */
588                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRENZKOSTENRECHNUNGQUALITAETSSICHERUNG_KEY);
589                 Double qualitaetssicherungGK = new Double(Finanzierung.grenzHerstellKostenQualitaetssicherung(kapazitaetsauslastung.doubleValue(), qualitaetssicherungskosten.doubleValue(), guteProduktionsmenge.doubleValue()));
590                 wert1.setObjectWert(qualitaetssicherungGK);
591                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
592 
593                 //              Tab A1.2 (3.5)
594                 /* Schichtwechsel GK */
595                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRENZKOSTENRECHNUNGSCHICHTWECHSEL_KEY);
596                 Double schichtwechselGK = new Double(Finanzierung.grenzHerstellKostenSchichtwechsel(kapazitaetsauslastung.doubleValue(), schichtwechselkosten.doubleValue(), produktionLetzteZoneGK.doubleValue()));
597                 wert1.setObjectWert(schichtwechselGK);
598                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
599 
600                 //              Lohnerhöhungsindex
601                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRUNDDATENLOHNERHOEHUNGSINDEX_KEY);
602                 Double lohnerhoehungsindex = (Double) wert1.getObjectWert();
603                 if (log.isDebugEnabled())
604                 {
605                     log.debug(" Lohnerhöhungsindex : '" + lohnerhoehungsindex.toString() + "'");
606                 }
607 
608                 //              Tab A1.2 (3.6)
609                 /* Verwaltung GK */
610                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRENZKOSTENRECHNUNGVERWALTUNG_KEY);
611                 Double verwaltungGK = new Double(-Finanzierung.grenzHerstellKostenVerwaltung(lohnerhoehungsindex.doubleValue(), kapazitaetsauslastung.doubleValue(), -verwaltungskosten.doubleValue(), produktionLetzteZoneGK.doubleValue(), verwaltungTabelle));
612                 wert1.setObjectWert(verwaltungGK);
613                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
614 
615                 //              Tab A1.2 (3)
616                 /* Grenzherstellkosten GK */
617                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRENZKOSTENRECHNUNGGRENZHERSTELLKOSTEN_KEY);
618                 Double grenzherstellkostenGK = new Double(Finanzierung.grenzHerstellKosten(kapazitaetsauslastung.doubleValue(), loehneOhneUeberstundenGK.doubleValue(), ueberstundenzuschlagGK.doubleValue(), rohstoffeGK.doubleValue(), qualitaetssicherungGK.doubleValue(), schichtwechselGK.doubleValue(), verwaltungGK.doubleValue()));
619                 wert1.setObjectWert(grenzherstellkostenGK);
620                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
621 
622                 //              Tab A1.2 (4)
623                 /* Grenzgewinn GK */
624                 wert1 = CommonCalculation.SucheErgebnissFeldname(aktuellesquartal, Constants.EF_GRENZKOSTENRECHNUNGGRENZGEWINN_KEY);
625                 Double grenzgewinnGK = new Double(Finanzierung.grenzGewinn(grenzerloesGK.doubleValue(), grenzmarketingkostenGK.doubleValue(), grenzherstellkostenGK.doubleValue()));
626                 wert1.setObjectWert(grenzgewinnGK);
627                 CommonCalculation.WertEintragen(wert1, gruppennummer, new Integer(quartal.intValue() + 1));
628             }
629             catch (Exception e)
630             {
631                 log.error("THREAD NAME : " + getName());
632                 log.error(e.getMessage(), e);
633             }
634 
635             if (log.isDebugEnabled())
636             {
637                 log.debug(" (F) Verarbeitung \"BerechneVollUndGrenzkosten\" fuer Gruppe \"" + gruppennummer + "\", Quartal \"" + quartal + "\" abgeschlossen");
638             }
639         }
640         else
641         {
642             log.error(" WICHTIGE DATEN FUER DEN THREAD WURDEN NICHT FESTGELEGT. STOPPE VERARBEITUNG !!! ");
643         }
644 
645         synchronized (lock)
646         {
647             try
648             {
649                 if (log.isDebugEnabled())
650                 {
651                     log.debug(" (N) Verstaendige andere Threads, ich bin fertig. THREAD NAME : " + getName());
652                 }
653 
654                 // Inkrementiere Semaphore, Warte auf Freigabe, Vater wartet bis semaphor == Threadcount - 1
655                 lock.incrementSemaphore();
656                 // Warte auf NotifyAll bzw 60 Minuten.
657                 lock.wait(3600000);
658                 // Dekrementiere Semaphore, Arbeite weiter
659                 lock.decrementSemaphore();
660 
661                 if (log.isDebugEnabled())
662                 {
663                     log.debug(" FINALIZING THREAD. " + getName());
664                 }
665 
666                 // Dekrementiere FinishSemaphore, ICH BIN FERTIG
667                 lock.decrementFinishSemaphore();
668             }
669             catch (Exception e)
670             {
671                 log.error("THREAD NAME : " + getName());
672                 log.error(e.getMessage(), e);
673             }
674         }
675     }
676 
677     /* ----- SET und GET Methoden ----- */
678 
679     /***
680      * GET Methode
681      *
682      * @return Gruppennummer
683      */
684     public Integer getGruppennummer()
685     {
686         return gruppennummer;
687     }
688 
689     /***
690      * GET Methode
691      *
692      * @return Projektnummer
693      */
694     public Integer getProjektnummer()
695     {
696         return projektnummer;
697     }
698 
699     /***
700      * GET Methode
701      *
702      * @return Quartal
703      */
704     public Integer getQuartal()
705     {
706         return quartal;
707     }
708 
709     /***
710      * SET Methode
711      *
712      * @param gruppennummer Die Gruppennummer
713      */
714     public void setGruppennummer(Integer gruppennummer)
715     {
716         this.gruppennummer = gruppennummer;
717     }
718 
719     /***
720      * SET Methode
721      *
722      * @param projektnummer Die Projektnummer
723      */
724     public void setProjektnummer(Integer projektnummer)
725     {
726         this.projektnummer = projektnummer;
727     }
728 
729     /***
730      * SET Methode
731      *
732      * @param quartal Das Quartal
733      */
734     public void setQuartal(Integer quartal)
735     {
736         this.quartal = quartal;
737     }
738 }