com.lp.server.kueche.ejbfac.KuecheReportFacBean.java Source code

Java tutorial

Introduction

Here is the source code for com.lp.server.kueche.ejbfac.KuecheReportFacBean.java

Source

/*******************************************************************************
 * HELIUM V, Open Source ERP software for sustained success
 * at small and medium-sized enterprises.
 * Copyright (C) 2004 - 2014 HELIUM V IT-Solutions GmbH
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published 
 * by the Free Software Foundation, either version 3 of theLicense, or 
 * (at your option) any later version.
 * 
 * According to sec. 7 of the GNU Affero General Public License, version 3, 
 * the terms of the AGPL are supplemented with the following terms:
 * 
 * "HELIUM V" and "HELIUM 5" are registered trademarks of 
 * HELIUM V IT-Solutions GmbH. The licensing of the program under the 
 * AGPL does not imply a trademark license. Therefore any rights, title and
 * interest in our trademarks remain entirely with us. If you want to propagate
 * modified versions of the Program under the name "HELIUM V" or "HELIUM 5",
 * you may only do so if you have a written permission by HELIUM V IT-Solutions 
 * GmbH (to acquire a permission please contact HELIUM V IT-Solutions
 * at trademark@heliumv.com).
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * Contact: developers@heliumv.com
 ******************************************************************************/
package com.lp.server.kueche.ejbfac;

import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeMap;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.interceptor.Interceptors;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.lp.server.artikel.service.ArtikelDto;
import com.lp.server.artikel.service.ArtikelFac;
import com.lp.server.artikel.service.ArtikellieferantDto;
import com.lp.server.artikel.service.LagerDto;
import com.lp.server.bestellung.fastlanereader.generated.FLRWareneingangspositionen;
import com.lp.server.fertigung.fastlanereader.generated.FLRLosReport;
import com.lp.server.fertigung.fastlanereader.generated.FLRLosistmaterial;
import com.lp.server.fertigung.fastlanereader.generated.FLRLossollmaterial;
import com.lp.server.fertigung.service.FertigungFac;
import com.lp.server.fertigung.service.LosDto;
import com.lp.server.fertigung.service.LoslagerentnahmeDto;
import com.lp.server.fertigung.service.LossollmaterialDto;
import com.lp.server.kueche.fastlanereader.generated.FLRKassaimport;
import com.lp.server.kueche.fastlanereader.generated.FLRSpeiseplanposition;
import com.lp.server.kueche.service.KuecheReportFac;
import com.lp.server.lieferschein.fastlanereader.generated.FLRLieferscheinposition;
import com.lp.server.lieferschein.service.LieferscheinFac;
import com.lp.server.lieferschein.service.LieferscheinpositionFac;
import com.lp.server.partner.service.KundeDto;
import com.lp.server.partner.service.KundeLieferstatistikDto;
import com.lp.server.rechnung.fastlanereader.generated.FLRRechnungPosition;
import com.lp.server.rechnung.service.RechnungDto;
import com.lp.server.rechnung.service.RechnungFac;
import com.lp.server.stueckliste.service.StuecklisteFac;
import com.lp.server.system.service.KostenstelleDto;
import com.lp.server.system.service.LocaleFac;
import com.lp.server.system.service.TheClientDto;
import com.lp.server.util.FacadeBeauftragter;
import com.lp.server.util.LPReport;
import com.lp.server.util.fastlanereader.FLRSessionFactory;
import com.lp.server.util.report.JasperPrintLP;
import com.lp.server.util.report.TimingInterceptor;
import com.lp.util.EJBExceptionLP;
import com.lp.util.Helper;
import com.lp.util.LPDatenSubreport;

@Stateless
@Interceptors(TimingInterceptor.class)
public class KuecheReportFacBean extends LPReport implements KuecheReportFac {

    private String sAktuellerReport = null;
    private Object[][] data = null;

    private static int REPORT_KUECHENAUSWERTUNG_ARTIKELNUMMER = 0;
    private static int REPORT_KUECHENAUSWERTUNG_BEZEICHNUNG = 1;
    private static int REPORT_KUECHENAUSWERTUNG_MENGEVERKAUFT = 2;
    private static int REPORT_KUECHENAUSWERTUNG_PREISVERKAUFT = 3;
    private static int REPORT_KUECHENAUSWERTUNG_DATUMVERKAUFT = 4;
    private static int REPORT_KUECHENAUSWERTUNG_KUNDE = 5;
    private static int REPORT_KUECHENAUSWERTUNG_LIEFERSCHEIN = 6;
    private static int REPORT_KUECHENAUSWERTUNG_MENGELIEFERSCEHIN = 7;
    private static int REPORT_KUECHENAUSWERTUNG_PREIS_LIEFERSCHEIN = 8;
    private static int REPORT_KUECHENAUSWERTUNG_THEORETISCHER_WARENEINSATZ = 9;
    private static int REPORT_KUECHENAUSWERTUNG_DATUMVERKAUFT_CUT = 10;
    private static int REPORT_KUECHENAUSWERTUNG_SETARTIKEL_TYP = 11;

    private static int REPORT_KUECHENAUSWERTUNG2_ARTIKELNUMMER = 0;
    private static int REPORT_KUECHENAUSWERTUNG2_BEZEICHNUNG = 1;
    private static int REPORT_KUECHENAUSWERTUNG2_MENGEVERBRAUCHT = 2;
    private static int REPORT_KUECHENAUSWERTUNG2_THEORETISCHER_WARENEINSATZ = 3;
    private static int REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_SOFORTVERBRAUCH = 4;
    private static int REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_MATERIAL = 5;
    private static int REPORT_KUECHENAUSWERTUNG2_EKPREIS = 6;

    private static int REPORT_DECKUNGSBEITRAG_KOSTENSTELLE = 0;
    private static int REPORT_DECKUNGSBEITRAG_RECHNUNGEN = 1;
    private static int REPORT_DECKUNGSBEITRAG_WARENEINGAENGE = 2;
    private static int REPORT_DECKUNGSBEITRAG_LOSESOFORTVERBRAUCH = 3;
    private static int REPORT_DECKUNGSBEITRAG_LOSEREST = 4;
    private static int REPORT_DECKUNGSBEITRAG_WARENAUSGANG = 5;

    private static int REPORT_DECKUNGSBEITRAG_RECHNUNG = 6;
    private static int REPORT_DECKUNGSBEITRAG_BESTELLUNG = 7;
    private static int REPORT_DECKUNGSBEITRAG_LOSNUMMER = 8;
    private static int REPORT_DECKUNGSBEITRAG_LIEFERSCHEIN_WA = 9;
    private static int REPORT_DECKUNGSBEITRAG_RECHNUNG_WA = 10;

    private static int REPORT_DECKUNGSBEITRAG_ANZAHL_FELDER = 11;

    @TransactionAttribute(TransactionAttributeType.NEVER)
    public JasperPrintLP printKuechenauswertung2(java.sql.Timestamp tVon, java.sql.Timestamp tBis,
            TheClientDto theClientDto) {
        HashMap<String, Object> parameter = new HashMap<String, Object>();
        parameter.put("P_VON", tVon);
        parameter.put("P_BIS", tBis);

        sAktuellerReport = KuecheReportFac.REPORT_KUECHENAUSWERTUNG2;

        Integer fertigungsgruppeIIdSofortverbrauch = null;
        try {
            fertigungsgruppeIIdSofortverbrauch = getStuecklisteFac().fertigungsgruppeFindByMandantCNrCBez(
                    theClientDto.getMandant(), StuecklisteFac.FERTIGUNGSGRUPPE_SOFORTVERBRAUCH).getIId();
        } catch (EJBExceptionLP e1) {
            if (e1.getCode() == EJBExceptionLP.FEHLER_BEI_FIND) {
                throw new EJBExceptionLP(
                        EJBExceptionLP.FEHLER_FERTIGUNG_FERTIGUNGSGRUPPE_SOFORTVERBRAUCH_NICHT_VORHANDEN,
                        new Exception("FEHLER_FERTIGUNG_FERTIGUNGSGRUPPE_SOFORTVERBRAUCH_NICHT_VORHANDEN"));
            } else {
                throw e1;
            }
        } catch (RemoteException e1) {
            throwEJBExceptionLPRespectOld(e1);
        }

        tVon = Helper.cutTimestamp(tVon);

        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(tBis.getTime());
        c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) + 1);

        tBis = Helper.cutTimestamp(new java.sql.Timestamp(c.getTimeInMillis()));

        Session session = FLRSessionFactory.getFactory().openSession();

        session.enableFilter("filterMandant").setParameter("paramMandant", theClientDto.getMandant());
        session.enableFilter("filterLocale").setParameter("paramLocale", theClientDto.getLocUiAsString());

        String sQuery = "SELECT k, aspr.c_bez FROM FLRKassaimport AS k LEFT OUTER JOIN k.flrartikel.artikelsprset AS aspr  WHERE k.n_menge>0 AND k.t_kassa>='"
                + Helper.formatDateWithSlashes(new java.sql.Date(tVon.getTime())) + "' AND k.t_kassa<'"
                + Helper.formatDateWithSlashes(new java.sql.Date(tBis.getTime()))
                + "' AND k.flrartikel.mandant_c_nr='" + theClientDto.getMandant() + "'";

        // SELECT KUNDE_I_ID,ARTIKEL_I_ID,T_KASSA, SUM(N_MENGE),
        // SUM(N_PREIS*N_MENGE) FROM KUE_KASSAIMPORT WHERE T_KASSA>2009-01-01
        // AND T_KASSA<'2009-07-01' AND N_MENGE>0 GROUP BY
        // KUNDE_I_ID,ARTIKEL_I_ID,T_KASSA

        Query query = session.createQuery(sQuery);

        List<?> results = query.list();
        Iterator<?> resultListIterator = results.iterator();

        TreeMap hmVerbrauchteArtikel = new TreeMap();
        while (resultListIterator.hasNext()) {

            Object[] o = (Object[]) resultListIterator.next();
            FLRKassaimport ki = (FLRKassaimport) o[0];

            if (ki.getSpeiseplan_i_id() != null) {

                Set s = ki.getFlrspeiseplan().getSpeiseplanpositionset();

                Iterator iTspeiseplanpos = s.iterator();

                while (iTspeiseplanpos.hasNext()) {
                    FLRSpeiseplanposition sppos = (FLRSpeiseplanposition) iTspeiseplanpos.next();

                    BigDecimal menge = new BigDecimal(0);

                    if (sppos.getN_menge().doubleValue() != 0) {
                        menge = sppos.getN_menge().divide(ki.getFlrspeiseplan().getN_menge())
                                .multiply(ki.getN_menge());
                    }

                    if (hmVerbrauchteArtikel.containsKey(sppos.getFlrartikel().getC_nr())) {
                        Object[] oZeile = (Object[]) hmVerbrauchteArtikel.get(sppos.getFlrartikel().getC_nr());

                        oZeile[REPORT_KUECHENAUSWERTUNG2_THEORETISCHER_WARENEINSATZ] =

                                ((BigDecimal) oZeile[REPORT_KUECHENAUSWERTUNG2_THEORETISCHER_WARENEINSATZ]).add(
                                        ((BigDecimal) oZeile[REPORT_KUECHENAUSWERTUNG2_EKPREIS]).multiply(menge));

                        oZeile[REPORT_KUECHENAUSWERTUNG2_MENGEVERBRAUCHT] = ((BigDecimal) oZeile[REPORT_KUECHENAUSWERTUNG2_MENGEVERBRAUCHT])
                                .add(menge);

                        hmVerbrauchteArtikel.put(sppos.getFlrartikel().getC_nr(), oZeile);

                    } else {
                        Object[] oZeile = new Object[7];

                        ArtikelDto artikelDto = getArtikelFac()
                                .artikelFindByPrimaryKeySmall(sppos.getFlrartikel().getI_id(), theClientDto);
                        oZeile[REPORT_KUECHENAUSWERTUNG2_ARTIKELNUMMER] = sppos.getFlrartikel().getC_nr();
                        oZeile[REPORT_KUECHENAUSWERTUNG2_BEZEICHNUNG] = artikelDto.formatBezeichnung();

                        ArtikellieferantDto ekPreis = getArtikelFac().getArtikelEinkaufspreis(
                                sppos.getArtikel_i_id(), null, menge, theClientDto.getSMandantenwaehrung(),
                                new java.sql.Date(ki.getT_kassa().getTime()), theClientDto);
                        if (ekPreis != null && ekPreis.getLief1Preis() != null) {
                            oZeile[REPORT_KUECHENAUSWERTUNG2_EKPREIS] = ekPreis.getLief1Preis();
                            oZeile[REPORT_KUECHENAUSWERTUNG2_THEORETISCHER_WARENEINSATZ] = ekPreis.getLief1Preis()
                                    .multiply(menge);
                        } else {
                            oZeile[REPORT_KUECHENAUSWERTUNG2_EKPREIS] = new BigDecimal(0);
                            oZeile[REPORT_KUECHENAUSWERTUNG2_THEORETISCHER_WARENEINSATZ] = new BigDecimal(0);
                        }

                        oZeile[REPORT_KUECHENAUSWERTUNG2_MENGEVERBRAUCHT] = menge;

                        oZeile[REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_MATERIAL] = new BigDecimal(0);
                        oZeile[REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_SOFORTVERBRAUCH] = new BigDecimal(0);
                        hmVerbrauchteArtikel.put(sppos.getFlrartikel().getC_nr(), oZeile);
                    }

                }

            } else {
                if (hmVerbrauchteArtikel.containsKey(ki.getFlrartikel().getC_nr())) {
                    Object[] oZeile = (Object[]) hmVerbrauchteArtikel.get(ki.getFlrartikel().getC_nr());

                    oZeile[REPORT_KUECHENAUSWERTUNG2_THEORETISCHER_WARENEINSATZ] =

                            ((BigDecimal) oZeile[REPORT_KUECHENAUSWERTUNG2_THEORETISCHER_WARENEINSATZ])
                                    .add(((BigDecimal) oZeile[REPORT_KUECHENAUSWERTUNG2_EKPREIS])
                                            .multiply(ki.getN_menge()));

                    oZeile[REPORT_KUECHENAUSWERTUNG2_MENGEVERBRAUCHT] = ((BigDecimal) oZeile[REPORT_KUECHENAUSWERTUNG2_MENGEVERBRAUCHT])
                            .add(ki.getN_menge());

                    hmVerbrauchteArtikel.put(ki.getFlrartikel().getC_nr(), oZeile);

                } else {
                    Object[] oZeile = new Object[7];
                    oZeile[REPORT_KUECHENAUSWERTUNG2_ARTIKELNUMMER] = ki.getFlrartikel().getC_nr();
                    oZeile[REPORT_KUECHENAUSWERTUNG2_BEZEICHNUNG] = o[1];

                    ArtikellieferantDto ekPreis = getArtikelFac().getArtikelEinkaufspreis(ki.getArtikel_i_id(),
                            null, ki.getN_menge(), theClientDto.getSMandantenwaehrung(),
                            new java.sql.Date(ki.getT_kassa().getTime()), theClientDto);
                    if (ekPreis != null && ekPreis.getLief1Preis() != null) {
                        oZeile[REPORT_KUECHENAUSWERTUNG2_EKPREIS] = ekPreis.getLief1Preis();
                        oZeile[REPORT_KUECHENAUSWERTUNG2_THEORETISCHER_WARENEINSATZ] = ekPreis.getLief1Preis()
                                .multiply(ki.getN_menge());
                    } else {
                        oZeile[REPORT_KUECHENAUSWERTUNG2_EKPREIS] = new BigDecimal(0);
                        oZeile[REPORT_KUECHENAUSWERTUNG2_THEORETISCHER_WARENEINSATZ] = new BigDecimal(0);
                    }

                    oZeile[REPORT_KUECHENAUSWERTUNG2_MENGEVERBRAUCHT] = ki.getN_menge();

                    oZeile[REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_MATERIAL] = new BigDecimal(0);
                    oZeile[REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_SOFORTVERBRAUCH] = new BigDecimal(0);
                    hmVerbrauchteArtikel.put(ki.getFlrartikel().getC_nr(), oZeile);
                }
            }

        }

        Session sessionSub = FLRSessionFactory.getFactory().openSession();
        String sQuerySub = "FROM FLRLossollmaterial AS s WHERE s.flrlos.status_c_nr NOT IN('"
                + FertigungFac.STATUS_GESTOPPT + "','" + FertigungFac.STATUS_ANGELEGT
                + "') AND s.flrlos.t_ausgabe>='" + Helper.formatDateWithSlashes(new java.sql.Date(tVon.getTime()))
                + "' AND s.flrlos.t_ausgabe<'" + Helper.formatDateWithSlashes(new java.sql.Date(tBis.getTime()))
                + "' AND s.flrlos.mandant_c_nr='" + theClientDto.getMandant() + "'";

        org.hibernate.Query hquerySub = sessionSub.createQuery(sQuerySub);
        List<?> resultListSub = hquerySub.list();
        Iterator<?> resultListIteratorSub = resultListSub.iterator();
        while (resultListIteratorSub.hasNext()) {
            FLRLossollmaterial sollmaterial = (FLRLossollmaterial) resultListIteratorSub.next();

            BigDecimal bdAusgegeben = new BigDecimal(0);
            for (Iterator<?> iter = sollmaterial.getIstmaterialset().iterator(); iter.hasNext();) {
                FLRLosistmaterial item = (FLRLosistmaterial) iter.next();
                if (Helper.short2boolean(item.getB_abgang()) == true) {
                    bdAusgegeben = bdAusgegeben.add(item.getN_menge());
                } else {
                    bdAusgegeben = bdAusgegeben.subtract(item.getN_menge());
                }
            }

            BigDecimal preis = new BigDecimal(0);

            if (bdAusgegeben.doubleValue() != 0) {
                try {
                    preis = getFertigungFac().getAusgegebeneMengePreis(sollmaterial.getI_id(), null, theClientDto);
                } catch (RemoteException e) {
                    throwEJBExceptionLPRespectOld(e);
                }
            }

            BigDecimal wert = preis.multiply(bdAusgegeben);

            if (hmVerbrauchteArtikel.containsKey(sollmaterial.getFlrartikel().getC_nr())) {
                Object[] oZeile = (Object[]) hmVerbrauchteArtikel.get(sollmaterial.getFlrartikel().getC_nr());

                if (sollmaterial.getFlrlos().getFertigungsgruppe_i_id()
                        .equals(fertigungsgruppeIIdSofortverbrauch)) {
                    oZeile[REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_SOFORTVERBRAUCH] = ((BigDecimal) oZeile[REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_SOFORTVERBRAUCH])
                            .add(wert);
                } else {
                    oZeile[REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_MATERIAL] = ((BigDecimal) oZeile[REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_MATERIAL])
                            .add(wert);
                }

                hmVerbrauchteArtikel.put(sollmaterial.getFlrartikel().getC_nr(), oZeile);

            } else {
                Object[] oZeile = new Object[7];
                oZeile[REPORT_KUECHENAUSWERTUNG2_ARTIKELNUMMER] = sollmaterial.getFlrartikel().getC_nr();

                ArtikelDto artikelDto = getArtikelFac()
                        .artikelFindByPrimaryKeySmall(sollmaterial.getFlrartikel().getI_id(), theClientDto);
                oZeile[REPORT_KUECHENAUSWERTUNG2_BEZEICHNUNG] = artikelDto.formatBezeichnung();

                oZeile[REPORT_KUECHENAUSWERTUNG2_MENGEVERBRAUCHT] = new BigDecimal(0);
                if (sollmaterial.getFlrlos().getFertigungsgruppe_i_id()
                        .equals(fertigungsgruppeIIdSofortverbrauch)) {
                    oZeile[REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_SOFORTVERBRAUCH] = wert;
                    oZeile[REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_MATERIAL] = new BigDecimal(0);
                } else {
                    oZeile[REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_SOFORTVERBRAUCH] = new BigDecimal(0);
                    oZeile[REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_MATERIAL] = wert;
                }

                hmVerbrauchteArtikel.put(sollmaterial.getFlrartikel().getC_nr(), oZeile);
            }
        }
        sessionSub.close();
        session.close();
        data = new Object[hmVerbrauchteArtikel.size()][10];
        data = (Object[][]) hmVerbrauchteArtikel.values().toArray(data);

        initJRDS(parameter, KuecheReportFac.REPORT_MODUL, KuecheReportFac.REPORT_KUECHENAUSWERTUNG2,
                theClientDto.getMandant(), theClientDto.getLocUi(), theClientDto);

        return getReportPrint();
    }

    private void holeWertAllerWareneingaenge(KostenstelleDto kstDto, java.sql.Timestamp tVon,
            java.sql.Timestamp tBis, ArrayList alDaten, TheClientDto theClientDto) {
        // Alle Wareneingaenge holen

        Session session = FLRSessionFactory.getFactory().openSession();

        String sQuery = "SELECT wep FROM FLRWareneingangspositionen wep WHERE wep.flrwareneingang.flrbestellung.kostenstelle_i_id="
                + kstDto.getIId() + " AND wep.flrwareneingang.t_wareneingansdatum>='"
                + Helper.formatDateWithSlashes(new java.sql.Date(tVon.getTime()))
                + "' AND wep.flrwareneingang.t_wareneingansdatum<'"
                + Helper.formatDateWithSlashes(new java.sql.Date(tBis.getTime()))
                + "' ORDER BY wep.flrwareneingang.flrbestellung.c_nr";

        Query query = session.createQuery(sQuery);

        List results = query.list();
        Iterator resultListIterator = results.iterator();
        while (resultListIterator.hasNext()) {
            FLRWareneingangspositionen pos = (FLRWareneingangspositionen) resultListIterator.next();

            Object[] oZeile = new Object[REPORT_DECKUNGSBEITRAG_ANZAHL_FELDER];
            oZeile[REPORT_DECKUNGSBEITRAG_KOSTENSTELLE] = kstDto.formatKostenstellenbezeichnung();
            oZeile[REPORT_DECKUNGSBEITRAG_BESTELLUNG] = pos.getFlrbestellposition().getFlrbestellung().getC_nr();

            try {
                BigDecimal einstandspreis = getLagerFac().getGemittelterEinstandspreisEinerZugangsposition(
                        LocaleFac.BELEGART_BESTELLUNG, pos.getI_id());
                if (einstandspreis != null && pos.getN_geliefertemenge() != null) {
                    oZeile[REPORT_DECKUNGSBEITRAG_WARENEINGAENGE] = einstandspreis
                            .multiply(pos.getN_geliefertemenge());
                }

            } catch (RemoteException e) {
                throwEJBExceptionLPRespectOld(e);
            }
            alDaten.add(oZeile);
        }
        session.close();

    }

    private void holeWarenausgangsGestehungswertZuKostenstelle(KostenstelleDto kstDto, java.sql.Timestamp tVon,
            java.sql.Timestamp tBis, ArrayList alDaten, TheClientDto theClientDto) {

        SessionFactory factory = FLRSessionFactory.getFactory();
        Session session = null;

        FacadeBeauftragter fac = new FacadeBeauftragter();
        session = factory.openSession();
        String queryRechnung = " from FLRRechnungPosition rechpos  WHERE rechpos.positionsart_c_nr = '"
                + LocaleFac.POSITIONSART_IDENT + "' ";

        queryRechnung += " AND rechpos.flrrechnung.status_c_nr NOT IN ('" + RechnungFac.STATUS_STORNIERT + "') ";

        queryRechnung += " AND rechpos.flrrechnung.mandant_c_nr= '" + theClientDto.getMandant() + "'";

        queryRechnung += " AND rechpos.flrrechnung.flrkostenstelle.i_id= '" + kstDto.getIId() + "'";

        if (tVon != null) {
            queryRechnung += " AND rechpos.flrrechnung.d_belegdatum>='"
                    + Helper.formatDateWithSlashes(Helper.cutDate(new java.sql.Date(tVon.getTime()))) + "'";
        }
        if (tBis != null) {
            queryRechnung += " AND rechpos.flrrechnung.d_belegdatum<'"
                    + Helper.formatDateWithSlashes(new java.sql.Date(tBis.getTime())) + "'";
        }

        queryRechnung += " ORDER BY rechpos.flrrechnung.d_belegdatum DESC";

        Query qRechnung = session.createQuery(queryRechnung);

        List<?> resultListRechnung = qRechnung.list();

        String queryLieferschein = " from FLRLieferscheinposition lspos  WHERE  1=1 ";

        queryLieferschein += " AND lspos.positionsart_c_nr = '"
                + LieferscheinpositionFac.LIEFERSCHEINPOSITIONSART_IDENT + "'";

        queryRechnung += " AND lspos.flrlieferschein.lieferscheinstatus_status_c_nr NOT IN ('"
                + LieferscheinFac.LSSTATUS_STORNIERT + "') ";

        queryLieferschein += " AND lspos.flrlieferschein.mandant_c_nr= '" + theClientDto.getMandant() + "'";
        queryLieferschein += " AND lspos.flrlieferschein.flrkostenstelle.i_id= '" + kstDto.getIId() + "'";

        if (tVon != null) {
            queryLieferschein += " AND lspos.flrlieferschein.d_belegdatum>='"
                    + Helper.formatDateWithSlashes(new java.sql.Date(tVon.getTime())) + "'";
        }
        if (tBis != null) {
            queryLieferschein += " AND lspos.flrlieferschein.d_belegdatum<'"
                    + Helper.formatDateWithSlashes(new java.sql.Date(tBis.getTime())) + "'";
        }

        queryLieferschein += " ORDER BY lspos.flrlieferschein.d_belegdatum DESC";

        Query qLieferschein = session.createQuery(queryLieferschein);

        List<?> resultListLieferschein = qLieferschein.list();

        Iterator<?> resultListIteratorRechnung = resultListRechnung.iterator();
        // Rechnungspositionen verarbeiten
        ArrayList<KundeLieferstatistikDto> cResult = new ArrayList<KundeLieferstatistikDto>();

        while (resultListIteratorRechnung.hasNext()) {
            FLRRechnungPosition rePos = (FLRRechnungPosition) resultListIteratorRechnung.next();

            try {
                RechnungDto d = fac.getRechnungFac().rechnungFindByPrimaryKey(rePos.getRechnung_i_id());

                String sRechnungsart = d.getRechnungartCNr();

                if (rePos.getFlrartikel() != null) {

                    BigDecimal bMenge = rePos.getN_menge();
                    BigDecimal bPreis = new BigDecimal(0);
                    Object[] oZeile = new Object[REPORT_DECKUNGSBEITRAG_ANZAHL_FELDER];
                    if (sRechnungsart.equals(RechnungFac.RECHNUNGART_GUTSCHRIFT)) {
                        bPreis = getLagerFac().getGemittelterEinstandspreisEinerZugangsposition(
                                LocaleFac.BELEGART_GUTSCHRIFT, rePos.getI_id());
                        bMenge = bMenge.negate();
                        oZeile[REPORT_DECKUNGSBEITRAG_RECHNUNG_WA] = "G" + rePos.getFlrrechnung().getC_nr();
                    } else {
                        bPreis = getLagerFac().getGemittelterGestehungspreisEinerAbgangsposition(
                                LocaleFac.BELEGART_RECHNUNG, rePos.getI_id());
                        oZeile[REPORT_DECKUNGSBEITRAG_RECHNUNG_WA] = "R" + rePos.getFlrrechnung().getC_nr();
                    }

                    if (rePos.getFlrrechnung().getN_kurs().doubleValue() != 0 && bPreis != null) {
                        bPreis = bPreis.divide(rePos.getFlrrechnung().getN_kurs(), 4, BigDecimal.ROUND_HALF_EVEN);
                    } else {
                        bPreis = new BigDecimal(0);
                    }

                    oZeile[REPORT_DECKUNGSBEITRAG_KOSTENSTELLE] = kstDto.formatKostenstellenbezeichnung();
                    oZeile[REPORT_DECKUNGSBEITRAG_RECHNUNG_WA] = rePos.getFlrrechnung().getC_nr();
                    oZeile[REPORT_DECKUNGSBEITRAG_WARENAUSGANG] = bMenge.multiply(bPreis);
                    alDaten.add(oZeile);

                }
            } catch (RemoteException e) {
                throwEJBExceptionLPRespectOld(e);
            }

        }
        Iterator<?> resultListIteratorLieferschein = resultListLieferschein.iterator();
        // lieferscheinpositionen verarbeiten
        while (resultListIteratorLieferschein.hasNext()) {
            FLRLieferscheinposition lsPos = (FLRLieferscheinposition) resultListIteratorLieferschein.next();

            KundeLieferstatistikDto dto = new KundeLieferstatistikDto();

            dto.setSWarenausgangverursacher(RechnungFac.RECHNUNGART_RECHNUNG);
            if (lsPos.getFlrverleih() != null) {
                dto.setdVerleihfaktor(lsPos.getFlrverleih().getF_faktor());
                dto.setiVerleihtage(lsPos.getFlrverleih().getI_tage());
            }

            dto.setNMenge(lsPos.getN_menge());

            BigDecimal bMenge = lsPos.getN_menge();
            BigDecimal bPreis = new BigDecimal(0);
            try {
                if (lsPos.getN_menge().doubleValue() < 0) {

                    if (lsPos.getFlrlieferschein().getFlrziellager() != null) {
                        // SP960
                        bPreis = getLagerFac().getGemittelterEinstandspreisEinerZugangsposition(
                                LocaleFac.BELEGART_LSZIELLAGER, lsPos.getI_id());

                    } else {
                        bPreis = getLagerFac().getGemittelterEinstandspreisEinerZugangsposition(
                                LocaleFac.BELEGART_LIEFERSCHEIN, lsPos.getI_id());

                    }

                } else {
                    bPreis = getLagerFac().getGemittelterGestehungspreisEinerAbgangsposition(
                            LocaleFac.BELEGART_LIEFERSCHEIN, lsPos.getI_id());
                }
            } catch (RemoteException e) {
                throwEJBExceptionLPRespectOld(e);
            }

            BigDecimal bdKurs = new BigDecimal(lsPos.getFlrlieferschein()
                    .getF_wechselkursmandantwaehrungzulieferscheinwaehrung().doubleValue());

            if (bdKurs.doubleValue() != 0 && lsPos.getN_nettogesamtpreis() != null) {
                bPreis = bPreis.divide(bdKurs, 4, BigDecimal.ROUND_HALF_EVEN);
            } else {
                bPreis = new BigDecimal(0);
            }

            Object[] oZeile = new Object[REPORT_DECKUNGSBEITRAG_ANZAHL_FELDER];
            oZeile[REPORT_DECKUNGSBEITRAG_KOSTENSTELLE] = kstDto.formatKostenstellenbezeichnung();
            oZeile[REPORT_DECKUNGSBEITRAG_LIEFERSCHEIN_WA] = lsPos.getFlrlieferschein().getC_nr();
            oZeile[REPORT_DECKUNGSBEITRAG_WARENAUSGANG] = bMenge.multiply(bPreis);
            alDaten.add(oZeile);

        }

    }

    private void holeZuganswerteAllerLose(KostenstelleDto kstDto, java.sql.Timestamp tVon, java.sql.Timestamp tBis,
            ArrayList alDaten, TheClientDto theClientDto) {
        // Alle Wareneingaenge holen

        Session session = FLRSessionFactory.getFactory().openSession();

        String sQuery = "SELECT li FROM FLRLosistmaterial li WHERE li.flrlossollmaterial.flrlos.mandant_c_nr='"
                + theClientDto.getMandant() + "' AND li.flrlossollmaterial.flrlos.t_ausgabe>='"
                + Helper.formatDateWithSlashes(new java.sql.Date(tVon.getTime()))
                + "' AND li.flrlossollmaterial.flrlos.t_ausgabe<'"
                + Helper.formatDateWithSlashes(new java.sql.Date(tBis.getTime()))
                + "' AND li.flrlossollmaterial.flrlos.kostenstelle_i_id=" + kstDto.getIId()
                + " ORDER BY li.flrlossollmaterial.flrlos.c_nr";

        Query query = session.createQuery(sQuery);

        List results = query.list();
        Iterator resultListIterator = results.iterator();
        while (resultListIterator.hasNext()) {
            FLRLosistmaterial ist = (FLRLosistmaterial) resultListIterator.next();

            try {
                BigDecimal bdMaterialIstpreis = ist.getN_menge().multiply(getFertigungFac()
                        .getAusgegebeneMengePreis(ist.getLossollmaterial_i_id(), null, theClientDto));

                Object[] oZeile = new Object[REPORT_DECKUNGSBEITRAG_ANZAHL_FELDER];
                oZeile[REPORT_DECKUNGSBEITRAG_KOSTENSTELLE] = kstDto.formatKostenstellenbezeichnung();
                oZeile[REPORT_DECKUNGSBEITRAG_LOSNUMMER] = ist.getFlrlossollmaterial().getFlrlos().getC_nr();
                if (ist.getFlrlossollmaterial().getFlrartikel().getI_sofortverbrauch() != null) {
                    oZeile[REPORT_DECKUNGSBEITRAG_LOSESOFORTVERBRAUCH] = bdMaterialIstpreis;
                } else {
                    oZeile[REPORT_DECKUNGSBEITRAG_LOSEREST] = bdMaterialIstpreis;
                }

                alDaten.add(oZeile);

            } catch (RemoteException e) {
                throwEJBExceptionLPRespectOld(e);
            }

        }
        session.close();

    }

    @TransactionAttribute(TransactionAttributeType.NEVER)
    public JasperPrintLP printDeckungsbeitrag(Integer kostenstelleIId, java.sql.Timestamp tVon,
            java.sql.Timestamp tBis, TheClientDto theClientDto) {

        HashMap<String, Object> parameter = new HashMap<String, Object>();
        parameter.put("P_VON", tVon);
        parameter.put("P_BIS", tBis);

        sAktuellerReport = KuecheReportFac.REPORT_DECKUNGSBEITRAG;

        tVon = Helper.cutTimestamp(tVon);

        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(tBis.getTime());
        c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) + 1);

        tBis = Helper.cutTimestamp(new java.sql.Timestamp(c.getTimeInMillis()));

        KostenstelleDto[] kstDtos = null;

        try {
            if (kostenstelleIId == null) {

                kstDtos = getSystemFac().kostenstelleFindByMandant(theClientDto.getMandant());

            } else {
                kstDtos = new KostenstelleDto[1];
                kstDtos[0] = getSystemFac().kostenstelleFindByPrimaryKey(kostenstelleIId);
                parameter.put("P_KOSTENSTELLE", kstDtos[0].formatKostenstellenbezeichnung());

            }

            ArrayList alDaten = new ArrayList();

            for (int i = 0; i < kstDtos.length; i++) {
                // Kostenstelle

                holeZuganswerteAllerLose(kstDtos[i], tVon, tBis, alDaten, theClientDto);

                holeWertAllerWareneingaenge(kstDtos[i], tVon, tBis, alDaten, theClientDto);
                holeWarenausgangsGestehungswertZuKostenstelle(kstDtos[i], tVon, tBis, alDaten, theClientDto);

                // Rechnungswert
                Session session = FLRSessionFactory.getFactory().openSession();

                String sQuery = "SELECT r.c_nr,r.n_wert FROM FLRRechnung r   WHERE r.flrkostenstelle.i_id="
                        + kstDtos[i].getIId() + " AND r.d_belegdatum>='"
                        + Helper.formatDateWithSlashes(new java.sql.Date(tVon.getTime())) + "' AND r.d_belegdatum<'"
                        + Helper.formatDateWithSlashes(new java.sql.Date(tBis.getTime())) + "' ORDER BY r.c_nr";

                Query query = session.createQuery(sQuery);

                List<?> results = query.list();
                Iterator<?> resultListIterator = results.iterator();
                while (resultListIterator.hasNext()) {

                    Object[] oDaten = (Object[]) resultListIterator.next();

                    Object[] oZeile = new Object[REPORT_DECKUNGSBEITRAG_ANZAHL_FELDER];
                    oZeile[REPORT_DECKUNGSBEITRAG_KOSTENSTELLE] = kstDtos[i].formatKostenstellenbezeichnung();
                    oZeile[REPORT_DECKUNGSBEITRAG_RECHNUNG] = oDaten[0];
                    oZeile[REPORT_DECKUNGSBEITRAG_RECHNUNGEN] = oDaten[1];
                    alDaten.add(oZeile);

                }
                session.close();

            }
            data = new Object[alDaten.size()][REPORT_DECKUNGSBEITRAG_ANZAHL_FELDER];
            data = (Object[][]) alDaten.toArray(data);
        } catch (RemoteException e) {
            throwEJBExceptionLPRespectOld(e);
        }
        initJRDS(parameter, KuecheReportFac.REPORT_MODUL, KuecheReportFac.REPORT_DECKUNGSBEITRAG,
                theClientDto.getMandant(), theClientDto.getLocUi(), theClientDto);
        return getReportPrint();
    }

    @TransactionAttribute(TransactionAttributeType.NEVER)
    public JasperPrintLP printKuechenauswertung1(java.sql.Timestamp tVon, java.sql.Timestamp tBis,
            String artikelNrVon, String artikelNrBis, Integer brancheIId, Integer artikelklasseIId,
            TheClientDto theClientDto) {

        HashMap<String, Object> parameter = new HashMap<String, Object>();
        parameter.put("P_VON", tVon);
        parameter.put("P_BIS", tBis);

        parameter.put("P_ARTIKELNRVON", artikelNrVon);
        parameter.put("P_ARTIKELNRBIS", artikelNrBis);

        HashMap<Integer, KundeDto> cachedKunde = new HashMap<Integer, KundeDto>();
        HashMap<Integer, ArtikelDto> cachedArtikel = new HashMap<Integer, ArtikelDto>();

        try {
            if (artikelklasseIId != null) {
                parameter.put("P_ARTIKELKLASSE",
                        getArtikelFac().artklaFindByPrimaryKey(artikelklasseIId, theClientDto).getCNr());
            }
            if (brancheIId != null) {
                parameter.put("P_BRANCHE",
                        getPartnerServicesFac().brancheFindByPrimaryKey(brancheIId, theClientDto).getCNr());
            }
        } catch (RemoteException ex1) {
            throwEJBExceptionLPRespectOld(ex1);
        }

        sAktuellerReport = KuecheReportFac.REPORT_KUECHENAUSWERTUNG1;

        tVon = Helper.cutTimestamp(tVon);

        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(tBis.getTime());
        c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) + 1);

        tBis = Helper.cutTimestamp(new java.sql.Timestamp(c.getTimeInMillis()));

        Session session = FLRSessionFactory.getFactory().openSession();

        session.enableFilter("filterMandant").setParameter("paramMandant", theClientDto.getMandant());
        session.enableFilter("filterLocale").setParameter("paramLocale", theClientDto.getLocUiAsString());

        String sQuery = "SELECT k.flrartikel.i_id,k.flrartikel.c_nr,k.flrkunde.i_id , k.t_kassa, sum(k.n_menge), sum(k.n_preis*k.n_menge), aspr.c_bez, k.speiseplan_i_id FROM FLRKassaimport k LEFT OUTER JOIN k.flrartikel.artikelsprset AS aspr  WHERE k.n_menge>0 AND k.t_kassa>='"
                + Helper.formatDateWithSlashes(new java.sql.Date(tVon.getTime())) + "' AND k.t_kassa<'"
                + Helper.formatDateWithSlashes(new java.sql.Date(tBis.getTime())) + "'";

        if (artikelNrVon != null) {
            sQuery += " AND k.flrartikel.c_nr >='" + artikelNrVon + "'";
        }
        if (artikelNrBis != null) {

            String artikelNrBis_Gefuellt = Helper.fitString2Length(artikelNrBis, 25, '_');
            sQuery += " AND k.flrartikel.c_nr <='" + artikelNrBis_Gefuellt + "'";
        }

        if (artikelklasseIId != null) {
            sQuery += " AND k.flrartikel.flrartikelklasse.i_id=" + artikelklasseIId.intValue();
        }

        if (brancheIId != null) {
            sQuery += " AND k.flrkunde.flrpartner.branche_i_id=" + brancheIId.intValue();
        }

        sQuery += " GROUP BY k.flrartikel.i_id, k.flrartikel.c_nr,k.flrkunde,  k.t_kassa, aspr.c_bez,k.speiseplan_i_id";

        // SELECT KUNDE_I_ID,ARTIKEL_I_ID,T_KASSA, SUM(N_MENGE),
        // SUM(N_PREIS*N_MENGE) FROM KUE_KASSAIMPORT WHERE T_KASSA>2009-01-01
        // AND T_KASSA<'2009-07-01' AND N_MENGE>0 GROUP BY
        // KUNDE_I_ID,ARTIKEL_I_ID,T_KASSA

        Query query = session.createQuery(sQuery);

        List<?> results = query.list();
        Iterator<?> resultListIterator = results.iterator();

        // HashMap hmKundenIds=new HashMap();

        ArrayList alKassaimport = new ArrayList();
        while (resultListIterator.hasNext()) {
            Object[] o = (Object[]) resultListIterator.next();

            Integer kundeIId = (Integer) o[2];

            // if(!hmKundenIds.containsKey(kundeIId)){
            // hmKundenIds.put(kundeIId, null);
            // }

            alKassaimport.add(o);

        }

        Session sessionLS = FLRSessionFactory.getFactory().openSession();
        String sQueryLS = "FROM FLRLieferscheinposition lspos WHERE lspos.flrlieferschein.lieferscheinstatus_status_c_nr NOT IN ('"
                + LocaleFac.STATUS_STORNIERT
                + "') AND lspos.flrartikel.i_id IS NOT NULL AND lspos.flrlieferschein.d_belegdatum>='"
                + Helper.formatDateWithSlashes(new java.sql.Date(tVon.getTime()))
                + "' AND lspos.flrlieferschein.d_belegdatum<'"
                + Helper.formatDateWithSlashes(new java.sql.Date(tBis.getTime())) + "'";

        if (artikelNrVon != null) {
            sQueryLS += " AND lspos.flrartikel.c_nr >='" + artikelNrVon + "'";
        }
        if (artikelNrBis != null) {

            String artikelNrBis_Gefuellt = Helper.fitString2Length(artikelNrBis, 25, '_');
            sQueryLS += " AND lspos.flrartikel.c_nr <='" + artikelNrBis_Gefuellt + "'";
        }

        if (artikelklasseIId != null) {
            sQueryLS += " AND lspos.flrartikel.flrartikelklasse.i_id=" + artikelklasseIId.intValue();
        }

        if (brancheIId != null) {
            sQueryLS += " AND lspos.flrlieferschein.flrkunde.flrpartner.branche_i_id=" + brancheIId.intValue();
        }

        Query queryLP = sessionLS.createQuery(sQueryLS);

        List<?> resultsLS = queryLP.list();
        Iterator<?> resultListIteratorLS = resultsLS.iterator();

        // HashMap hmKundenIds=new HashMap();

        ArrayList alLSPositionen = new ArrayList();
        while (resultListIteratorLS.hasNext()) {
            FLRLieferscheinposition lspos = (FLRLieferscheinposition) resultListIteratorLS.next();

            alLSPositionen.add(lspos);

        }

        // Nun beide Listen verknuepfen

        ArrayList alDaten = new ArrayList();

        for (int i = 0; i < alKassaimport.size(); i++) {

            Object[] oImport = (Object[]) alKassaimport.get(i);

            Object[] zeile = new Object[12];

            zeile[REPORT_KUECHENAUSWERTUNG_ARTIKELNUMMER] = oImport[1];
            zeile[REPORT_KUECHENAUSWERTUNG_BEZEICHNUNG] = oImport[6];

            BigDecimal menge = (BigDecimal) oImport[4];
            BigDecimal bdGesamtWert = (BigDecimal) oImport[5];

            java.sql.Timestamp tKassa = (java.sql.Timestamp) oImport[3];

            // MWST wurde bereits beim import agbezogen

            zeile[REPORT_KUECHENAUSWERTUNG_MENGEVERKAUFT] = menge;

            zeile[REPORT_KUECHENAUSWERTUNG_PREISVERKAUFT] = bdGesamtWert.divide(menge, BigDecimal.ROUND_HALF_EVEN);
            zeile[REPORT_KUECHENAUSWERTUNG_DATUMVERKAUFT] = oImport[3];

            zeile[REPORT_KUECHENAUSWERTUNG_DATUMVERKAUFT_CUT] = Helper.cutTimestamp((Timestamp) oImport[3]);

            try {
                KundeDto kundeDto = null;
                if (cachedKunde.containsKey((Integer) oImport[2])) {
                    kundeDto = cachedKunde.get((Integer) oImport[2]);
                } else {
                    kundeDto = kundeDto = getKundeFac().kundeFindByPrimaryKey((Integer) oImport[2], theClientDto);
                    cachedKunde.put((Integer) oImport[2], kundeDto);
                }

                zeile[REPORT_KUECHENAUSWERTUNG_KUNDE] = kundeDto.getPartnerDto().formatFixName1Name2();

                // PJ 14558 Theoretischer Wareneinsatz
                zeile[REPORT_KUECHENAUSWERTUNG_THEORETISCHER_WARENEINSATZ] = getKuecheFac()
                        .getTheoretischerWareneinsatz((Integer) oImport[7], (Integer) oImport[0], menge,
                                theClientDto);

            } catch (RemoteException e) {
                throwEJBExceptionLPRespectOld(e);
            }

            boolean bZeileImportHinzugefuegt = false;

            for (int j = 0; j < alLSPositionen.size(); j++) {

                FLRLieferscheinposition lspos = (FLRLieferscheinposition) alLSPositionen.get(j);
                // Kunde - oder Lieferadresse
                if (lspos.getFlrlieferschein().getFlrkunde().getI_id().equals(oImport[2])) {
                    // Nun muss auch noch der Artikel gleich sein
                    if (lspos.getFlrartikel().getI_id().equals(oImport[0])) {
                        if (lspos.getFlrlieferschein().getD_belegdatum().getTime() == tKassa.getTime()) {

                            if (bZeileImportHinzugefuegt == false) {
                                bZeileImportHinzugefuegt = true;
                                alDaten.add(zeile);
                            }

                            Object[] neueZeile = zeile.clone();

                            neueZeile[REPORT_KUECHENAUSWERTUNG_MENGEVERKAUFT] = null;
                            neueZeile[REPORT_KUECHENAUSWERTUNG_PREISVERKAUFT] = null;

                            neueZeile[REPORT_KUECHENAUSWERTUNG_MENGELIEFERSCEHIN] = lspos.getN_menge();
                            neueZeile[REPORT_KUECHENAUSWERTUNG_LIEFERSCHEIN] = lspos.getFlrlieferschein().getC_nr();

                            if (lspos.getPosition_i_id_artikelset() != null) {
                                neueZeile[REPORT_KUECHENAUSWERTUNG_SETARTIKEL_TYP] = ArtikelFac.SETARTIKEL_TYP_POSITION;
                            } else {
                                if (lspos.getSetartikel_set() != null && lspos.getSetartikel_set().size() > 0) {
                                    neueZeile[REPORT_KUECHENAUSWERTUNG_SETARTIKEL_TYP] = ArtikelFac.SETARTIKEL_TYP_KOPF;
                                }
                            }

                            neueZeile[REPORT_KUECHENAUSWERTUNG_PREIS_LIEFERSCHEIN] = lspos
                                    .getN_nettogesamtpreisplusversteckteraufschlagminusrabatt();
                            alDaten.add(neueZeile);

                            // Zeile entfernen
                            alLSPositionen.remove(j);
                            j--;

                        }

                    }

                }

            }

            if (bZeileImportHinzugefuegt == false) {
                alDaten.add(zeile);
            }

        }

        // Alle uebrigen LSPos eintragen
        for (int j = 0; j < alLSPositionen.size(); j++) {

            FLRLieferscheinposition lspos = (FLRLieferscheinposition) alLSPositionen.get(j);

            Object[] zeile = new Object[12];

            zeile[REPORT_KUECHENAUSWERTUNG_ARTIKELNUMMER] = lspos.getFlrartikel().getC_nr();

            zeile[REPORT_KUECHENAUSWERTUNG_MENGEVERKAUFT] = new BigDecimal(0);

            zeile[REPORT_KUECHENAUSWERTUNG_PREISVERKAUFT] = new BigDecimal(0);

            zeile[REPORT_KUECHENAUSWERTUNG_DATUMVERKAUFT] = new java.sql.Timestamp(
                    lspos.getFlrlieferschein().getD_belegdatum().getTime());
            zeile[REPORT_KUECHENAUSWERTUNG_DATUMVERKAUFT_CUT] = Helper
                    .cutTimestamp(new java.sql.Timestamp(lspos.getFlrlieferschein().getD_belegdatum().getTime()));

            ArtikelDto artikelDto = null;

            if (cachedArtikel.containsKey(lspos.getFlrartikel().getI_id())) {
                artikelDto = cachedArtikel.get(lspos.getFlrartikel().getI_id());
            } else {
                artikelDto = getArtikelFac().artikelFindByPrimaryKeySmall(lspos.getFlrartikel().getI_id(),
                        theClientDto);
                cachedArtikel.put(lspos.getFlrartikel().getI_id(), artikelDto);
            }

            zeile[REPORT_KUECHENAUSWERTUNG_BEZEICHNUNG] = artikelDto.formatBezeichnung();

            KundeDto kundeDto = null;

            if (cachedKunde.containsKey(lspos.getFlrlieferschein().getKunde_i_id_lieferadresse())) {
                kundeDto = cachedKunde.get(lspos.getFlrlieferschein().getKunde_i_id_lieferadresse());
            } else {
                kundeDto = getKundeFac().kundeFindByPrimaryKey(
                        lspos.getFlrlieferschein().getKunde_i_id_lieferadresse(), theClientDto);
                cachedKunde.put(lspos.getFlrlieferschein().getKunde_i_id_lieferadresse(), kundeDto);
            }
            zeile[REPORT_KUECHENAUSWERTUNG_KUNDE] = kundeDto.getPartnerDto().formatFixName1Name2();

            zeile[REPORT_KUECHENAUSWERTUNG_MENGELIEFERSCEHIN] = lspos.getN_menge();
            zeile[REPORT_KUECHENAUSWERTUNG_LIEFERSCHEIN] = lspos.getFlrlieferschein().getC_nr();

            if (lspos.getPosition_i_id_artikelset() != null) {

                zeile[REPORT_KUECHENAUSWERTUNG_SETARTIKEL_TYP] = ArtikelFac.SETARTIKEL_TYP_POSITION;

            } else {

                /*
                 * if(lspos.getSetartikel_set()!=null &&
                 * lspos.getSetartikel_set().size()>0){
                 * zeile[REPORT_KUECHENAUSWERTUNG_SETARTIKEL_TYP] =
                 * ArtikelFac.SETARTIKEL_TYP_KOPF; }
                 */
            }

            zeile[REPORT_KUECHENAUSWERTUNG_PREIS_LIEFERSCHEIN] = lspos
                    .getN_nettogesamtpreisplusversteckteraufschlagminusrabatt();
            alDaten.add(zeile);

        }

        session.close();
        sessionLS.close();

        // 2 Subreports
        Session sessionSub = FLRSessionFactory.getFactory().openSession();
        String sQuerySub = "FROM FLRLosReport AS l WHERE l.status_c_nr NOT IN('" + FertigungFac.STATUS_GESTOPPT
                + "','" + FertigungFac.STATUS_ANGELEGT + "') AND l.t_ausgabe>='"
                + Helper.formatDateWithSlashes(new java.sql.Date(tVon.getTime())) + "' AND l.t_ausgabe<'"
                + Helper.formatDateWithSlashes(new java.sql.Date(tBis.getTime())) + "' ";

        org.hibernate.Query hquerySub = sessionSub.createQuery(sQuerySub);
        List<?> resultListSub = hquerySub.list();
        Iterator<?> resultListIteratorSub = resultListSub.iterator();

        ArrayList alSofortverbrauch = new ArrayList();
        ArrayList alLagerbuchung = new ArrayList();

        int SUBREPORT_LOSNUMMER = 0;
        int SUBREPORT_WERT = 1;
        int SUBREPORT_PROJEKT = 2;
        int SUBREPORT_LAGER = 3;
        int SUBREPORT_KOSTENSTELLE = 4;
        int SUBREPORT_AUSGABEDATUM = 5;

        while (resultListIteratorSub.hasNext()) {
            FLRLosReport rep = (FLRLosReport) resultListIteratorSub.next();
            Object[] zeile = new Object[10];
            zeile[SUBREPORT_LOSNUMMER] = rep.getC_nr();
            zeile[SUBREPORT_PROJEKT] = rep.getC_projekt();
            zeile[SUBREPORT_KOSTENSTELLE] = rep.getFlrkostenstelle().getC_nr();
            zeile[SUBREPORT_AUSGABEDATUM] = rep.getT_ausgabe();

            LosDto losDto;
            try {
                losDto = getFertigungFac().losFindByPrimaryKey(rep.getI_id());

                LossollmaterialDto[] sollmat = getFertigungFac().lossollmaterialFindByLosIId(losDto.getIId());
                BigDecimal bdWert = new BigDecimal(0);
                for (int i = 0; i < sollmat.length; i++) {
                    BigDecimal bdAusgegeben = getFertigungFac().getAusgegebeneMenge(sollmat[i].getIId(), null,
                            theClientDto);
                    BigDecimal bdEinzelpreis = getFertigungFac().getAusgegebeneMengePreis(sollmat[i].getIId(), null,
                            theClientDto);
                    bdWert = bdWert.add(bdAusgegeben.multiply(bdEinzelpreis));
                }

                zeile[SUBREPORT_WERT] = bdWert;

                String laeger = "";
                LoslagerentnahmeDto[] dtos = getFertigungFac().loslagerentnahmeFindByLosIId(rep.getI_id());
                for (int i = 0; i < dtos.length; i++) {
                    LagerDto lagerDto = getLagerFac().lagerFindByPrimaryKey(dtos[i].getLagerIId());
                    laeger += lagerDto.getCNr() + ", ";
                }
                zeile[SUBREPORT_LAGER] = laeger;

            } catch (RemoteException e) {
                throwEJBExceptionLPRespectOld(e);
            }

            if (rep.getFlrfertigungsgruppe().getC_bez().equals(StuecklisteFac.FERTIGUNGSGRUPPE_SOFORTVERBRAUCH)) {

                alSofortverbrauch.add(zeile);

            } else {
                alLagerbuchung.add(zeile);
            }

        }

        if (alSofortverbrauch.size() > 0) {
            String[] fieldnames = new String[] { "F_LOSNUMMER", "F_WERT", "F_PROJEKT", "F_LAGER", "F_KOSTENSTELLE",
                    "F_AUSGABEDATUM" };
            Object[][] dataSub = new Object[alSofortverbrauch.size()][fieldnames.length];
            dataSub = (Object[][]) alSofortverbrauch.toArray(dataSub);

            parameter.put("DATENSUBREPORT_SOFORTVERBRAUCH", new LPDatenSubreport(dataSub, fieldnames));
        }

        if (alLagerbuchung.size() > 0) {
            String[] fieldnames = new String[] { "F_LOSNUMMER", "F_WERT", "F_PROJEKT", "F_LAGER", "F_KOSTENSTELLE",
                    "F_AUSGABEDATUM" };
            Object[][] dataSub = new Object[alLagerbuchung.size()][fieldnames.length];
            dataSub = (Object[][]) alLagerbuchung.toArray(dataSub);

            parameter.put("DATENSUBREPORT_TAGESLOS", new LPDatenSubreport(dataSub, fieldnames));
        }

        // Sortieren nach PJ16694
        for (int i = alDaten.size() - 1; i > 0; --i) {
            for (int j = 0; j < i; ++j) {
                Object[] o = (Object[]) alDaten.get(j);
                Object[] o1 = (Object[]) alDaten.get(j + 1);

                Timestamp datum = (Timestamp) o[REPORT_KUECHENAUSWERTUNG_DATUMVERKAUFT_CUT];
                Timestamp datum1 = (Timestamp) o1[REPORT_KUECHENAUSWERTUNG_DATUMVERKAUFT_CUT];
                if (datum.after(datum1)) {
                    alDaten.set(j, o1);
                    alDaten.set(j + 1, o);
                } else if (datum.equals(datum1)) {
                    String artikel = (String) o[REPORT_KUECHENAUSWERTUNG_ARTIKELNUMMER];
                    String artikel1 = (String) o1[REPORT_KUECHENAUSWERTUNG_ARTIKELNUMMER];
                    if (artikel.compareTo(artikel1) > 0) {
                        alDaten.set(j, o1);
                        alDaten.set(j + 1, o);
                    }
                }
            }
        }

        data = new Object[alDaten.size()][10];
        data = (Object[][]) alDaten.toArray(data);

        initJRDS(parameter, KuecheReportFac.REPORT_MODUL, KuecheReportFac.REPORT_KUECHENAUSWERTUNG1,
                theClientDto.getMandant(), theClientDto.getLocUi(), theClientDto);

        return getReportPrint();

    }

    public Object getFieldValue(JRField jRField) throws JRException {
        Object value = null;
        String fieldName = jRField.getName();
        if (sAktuellerReport.equals(KuecheReportFac.REPORT_KUECHENAUSWERTUNG1)) {
            if ("Artikel".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG_ARTIKELNUMMER];
            } else if ("Bezeichnung".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG_BEZEICHNUNG];
            } else if ("MengeVerkauft".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG_MENGEVERKAUFT];
            } else if ("PreisVerkauft".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG_PREISVERKAUFT];
            } else if ("DatumVerkauft".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG_DATUMVERKAUFT];
            } else if ("Kunde".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG_KUNDE];
            } else if ("LieferscheinMenge".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG_MENGELIEFERSCEHIN];
            } else if ("LieferscheinPreis".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG_PREIS_LIEFERSCHEIN];
            } else if ("LieferscheinNummer".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG_LIEFERSCHEIN];
            } else if ("TheoretischerWareneinsatz".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG_THEORETISCHER_WARENEINSATZ];
            } else if ("F_SETARTIKEL_TYP".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG_SETARTIKEL_TYP];
            }

        } else if (sAktuellerReport.equals(KuecheReportFac.REPORT_KUECHENAUSWERTUNG2)) {
            if ("Artikel".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG2_ARTIKELNUMMER];
            } else if ("Bezeichnung".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG2_BEZEICHNUNG];
            } else if ("TheoretischerWareneinsatz".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG2_THEORETISCHER_WARENEINSATZ];
            } else if ("WareneinsatzMaterial".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_MATERIAL];
            } else if ("WareneinsatzSofortverbrauch".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG2_WARENEINSATZ_SOFORTVERBRAUCH];
            } else if ("MengeVerbraucht".equals(fieldName)) {
                value = data[index][REPORT_KUECHENAUSWERTUNG2_MENGEVERBRAUCHT];
            }
        } else if (sAktuellerReport.equals(KuecheReportFac.REPORT_DECKUNGSBEITRAG)) {
            if ("Kostenstelle".equals(fieldName)) {
                value = data[index][REPORT_DECKUNGSBEITRAG_KOSTENSTELLE];
            } else if ("Rechnungen".equals(fieldName)) {
                value = data[index][REPORT_DECKUNGSBEITRAG_RECHNUNGEN];
            } else if ("Wareneingaenge".equals(fieldName)) {
                value = data[index][REPORT_DECKUNGSBEITRAG_WARENEINGAENGE];
            } else if ("LoseSofortverbrauch".equals(fieldName)) {
                value = data[index][REPORT_DECKUNGSBEITRAG_LOSESOFORTVERBRAUCH];
            } else if ("LoseRest".equals(fieldName)) {
                value = data[index][REPORT_DECKUNGSBEITRAG_LOSEREST];
            } else if ("Warenausgaenge".equals(fieldName)) {
                value = data[index][REPORT_DECKUNGSBEITRAG_WARENAUSGANG];
            } else if ("Bestellung".equals(fieldName)) {
                value = data[index][REPORT_DECKUNGSBEITRAG_BESTELLUNG];
            } else if ("Los".equals(fieldName)) {
                value = data[index][REPORT_DECKUNGSBEITRAG_LOSNUMMER];
            } else if ("Rechnung".equals(fieldName)) {
                value = data[index][REPORT_DECKUNGSBEITRAG_RECHNUNG];
            } else if ("LieferscheinWA".equals(fieldName)) {
                value = data[index][REPORT_DECKUNGSBEITRAG_LIEFERSCHEIN_WA];
            } else if ("RechnungWA".equals(fieldName)) {
                value = data[index][REPORT_DECKUNGSBEITRAG_RECHNUNG_WA];
            }
        }

        return value;
    }

    public boolean next() throws JRException {
        index++;
        return (index < data.length);
    }

}