com.lp.server.partner.ejbfac.KundeReportFacBean.java Source code

Java tutorial

Introduction

Here is the source code for com.lp.server.partner.ejbfac.KundeReportFacBean.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.partner.ejbfac;

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

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.interceptor.Interceptors;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

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

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.lp.server.angebot.fastlanereader.generated.FLRAngebot;
import com.lp.server.angebot.service.AngebotFac;
import com.lp.server.artikel.ejb.Artikelspr;
import com.lp.server.artikel.ejb.ArtikelsprPK;
import com.lp.server.artikel.fastlanereader.generated.FLRShopgruppe;
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.SeriennrChargennrMitMengeDto;
import com.lp.server.artikel.service.VkPreisfindungPreislisteDto;
import com.lp.server.artikel.service.VkpfMengenstaffelDto;
import com.lp.server.auftrag.fastlanereader.generated.FLRAuftragReport;
import com.lp.server.auftrag.fastlanereader.generated.FLRAuftragposition;
import com.lp.server.auftrag.service.AuftragDto;
import com.lp.server.auftrag.service.AuftragFac;
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.fastlanereader.generated.FLRAnsprechpartner;
import com.lp.server.partner.fastlanereader.generated.FLRKontakt;
import com.lp.server.partner.fastlanereader.generated.FLRKunde;
import com.lp.server.partner.fastlanereader.generated.FLRKurzbrief;
import com.lp.server.partner.fastlanereader.generated.FLRPASelektion;
import com.lp.server.partner.service.AnsprechpartnerDto;
import com.lp.server.partner.service.AnsprechpartnerfunktionDto;
import com.lp.server.partner.service.CustomerPricelistItemDescriptionDto;
import com.lp.server.partner.service.CustomerPricelistItemDto;
import com.lp.server.partner.service.CustomerPricelistPriceDto;
import com.lp.server.partner.service.CustomerPricelistReportDto;
import com.lp.server.partner.service.CustomerPricelistShopgroupDto;
import com.lp.server.partner.service.IdValueDto;
import com.lp.server.partner.service.KundeDto;
import com.lp.server.partner.service.KundeFac;
import com.lp.server.partner.service.KundeLieferstatistikDto;
import com.lp.server.partner.service.KundeReportFac;
import com.lp.server.partner.service.KundesokoDto;
import com.lp.server.partner.service.KundesokomengenstaffelDto;
import com.lp.server.partner.service.LieferantDto;
import com.lp.server.partner.service.PASelektionDto;
import com.lp.server.partner.service.PartnerDto;
import com.lp.server.partner.service.PartnerFac;
import com.lp.server.partner.service.PartnerReportFac;
import com.lp.server.partner.service.SelektionDto;
import com.lp.server.partner.service.StatistikParamDto;
import com.lp.server.personal.service.PersonalDto;
import com.lp.server.projekt.fastlanereader.generated.FLRProjekt;
import com.lp.server.projekt.service.ProjektServiceFac;
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.system.service.LocaleFac;
import com.lp.server.system.service.ParameterFac;
import com.lp.server.system.service.ParametermandantDto;
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.IJasperPrintTransformer;
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 KundeReportFacBean extends LPReport implements KundeReportFac, JRDataSource {

    private int useCase;
    private Object[][] data = null;
    private BigDecimal summePreis = null;

    private IJasperPrintTransformer jasperPrintTransformer;

    @PersistenceContext
    private EntityManager em;

    private static int REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_VORNAME = 0;
    private static int REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_NACHNAME = 1;
    private static int REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_FUNKTION = 2;
    private static int REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_TITEL = 3;
    private static int REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_TELDW = 4;
    private static int REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_FAXDW = 5;
    private static int REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_MOBIL = 6;
    private static int REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_EMAIL = 7;

    private static int REPORT_KUNDENLISTE_BRIEFANREDE = 0;
    private static int REPORT_KUNDENLISTE_PARTNERART = 1;
    private static int REPORT_KUNDENLISTE_ANREDE = 2;
    private static int REPORT_KUNDENLISTE_KURZBEZEICHNUNG = 3;
    private static int REPORT_KUNDENLISTE_CNAME1 = 4;
    private static int REPORT_KUNDENLISTE_CNAME2 = 5;
    private static int REPORT_KUNDENLISTE_CNAME3 = 6;
    private static int REPORT_KUNDENLISTE_TITEL = 7;
    private static int REPORT_KUNDENLISTE_UIDNUMMER = 8;
    private static int REPORT_KUNDENLISTE_STRASSE = 9;
    private static int REPORT_KUNDENLISTE_LAND = 10;
    private static int REPORT_KUNDENLISTE_PLZ = 11;
    private static int REPORT_KUNDENLISTE_ORT = 12;
    private static int REPORT_KUNDENLISTE_LAND_POSTFACH = 13;
    private static int REPORT_KUNDENLISTE_PLZ_POSTFACH = 14;
    private static int REPORT_KUNDENLISTE_ORT_POSTFACH = 15;
    private static int REPORT_KUNDENLISTE_POSTFACH = 16;
    private static int REPORT_KUNDENLISTE_KOMMUNIKATIONSSPRACHE = 17;
    private static int REPORT_KUNDENLISTE_PARTNERKLASSE = 18;
    private static int REPORT_KUNDENLISTE_BRANCHE = 19;
    private static int REPORT_KUNDENLISTE_GERICHTSSTAND = 20;
    private static int REPORT_KUNDENLISTE_FIRMENBUCHNUMMER = 21;
    private static int REPORT_KUNDENLISTE_TELEFON = 22;
    private static int REPORT_KUNDENLISTE_FAX = 23;
    private static int REPORT_KUNDENLISTE_HOMEPAGE = 24;
    private static int REPORT_KUNDENLISTE_EMAIL = 25;
    private static int REPORT_KUNDENLISTE_MWSTSATZ = 26;
    private static int REPORT_KUNDENLISTE_PREISLISTE = 27;
    private static int REPORT_KUNDENLISTE_INTERESSENT = 28;
    private static int REPORT_KUNDENLISTE_UMSATZ_HEUER = 29;
    private static int REPORT_KUNDENLISTE_UMSATZ_VORJAHR = 30;
    private static int REPORT_KUNDENLISTE_ANZAHL_RECHNUNGEN_HEUER = 31;
    private static int REPORT_KUNDENLISTE_ANZAHL_RECHNUNGEN_VORJAHR = 32;
    private static int REPORT_KUNDENLISTE_KOSTENSTELLE = 33;
    private static int REPORT_KUNDENLISTE_ERLOESKONTO = 34;
    private static int REPORT_KUNDENLISTE_DEBITORENKONTO = 35;
    private static int REPORT_KUNDENLISTE_ZESSION = 36;
    private static int REPORT_KUNDENLISTE_WAEHRUNG = 37;
    private static int REPORT_KUNDENLISTE_ABW_UST_LAND = 38;
    private static int REPORT_KUNDENLISTE_ZAHLUNGSZIEL = 39;
    private static int REPORT_KUNDENLISTE_LIEFERART = 40;
    private static int REPORT_KUNDENLISTE_SPEDITEUR = 41;
    private static int REPORT_KUNDENLISTE_RABATT = 42;
    private static int REPORT_KUNDENLISTE_KREDITLIMIT = 43;
    private static int REPORT_KUNDENLISTE_LIEFERANTENNUMMER = 44;
    private static int REPORT_KUNDENLISTE_ABC = 45;
    private static int REPORT_KUNDENLISTE_LETZTE_BONITAETSPRUEFUNG = 46;
    private static int REPORT_KUNDENLISTE_PROVISIONSEMPFAENGER = 47;
    private static int REPORT_KUNDENLISTE_RECHNUNGSADRESSE_ANREDE = 48;
    private static int REPORT_KUNDENLISTE_RECHNUNGSADRESSE_KURZBEZEICHNUNG = 49;
    private static int REPORT_KUNDENLISTE_RECHNUNGSADRESSE_CNAME1 = 50;
    private static int REPORT_KUNDENLISTE_RECHNUNGSADRESSE_CNAME2 = 51;
    private static int REPORT_KUNDENLISTE_RECHNUNGSADRESSE_CNAME3 = 52;
    private static int REPORT_KUNDENLISTE_RECHNUNGSADRESSE_TITEL = 53;
    private static int REPORT_KUNDENLISTE_RECHNUNGSADRESSE_UIDNUMMER = 54;
    private static int REPORT_KUNDENLISTE_RECHNUNGSADRESSE_STRASSE = 55;
    private static int REPORT_KUNDENLISTE_RECHNUNGSADRESSE_LAND = 56;
    private static int REPORT_KUNDENLISTE_RECHNUNGSADRESSE_PLZ = 57;
    private static int REPORT_KUNDENLISTE_RECHNUNGSADRESSE_ORT = 58;
    private static int REPORT_KUNDENLISTE_RECHNUNGSADRESSE_LAND_POSTFACH = 59;
    private static int REPORT_KUNDENLISTE_RECHNUNGSADRESSE_PLZ_POSTFACH = 60;
    private static int REPORT_KUNDENLISTE_RECHNUNGSADRESSE_ORT_POSTFACH = 61;
    private static int REPORT_KUNDENLISTE_RECHNUNGSADRESSE_POSTFACH = 62;
    private static int REPORT_KUNDENLISTE_SELEKTION01 = 63;
    private static int REPORT_KUNDENLISTE_SELEKTION02 = 64;
    private static int REPORT_KUNDENLISTE_SELEKTION03 = 65;
    private static int REPORT_KUNDENLISTE_SELEKTION04 = 66;
    private static int REPORT_KUNDENLISTE_SELEKTION05 = 67;
    private static int REPORT_KUNDENLISTE_SELEKTION06 = 68;
    private static int REPORT_KUNDENLISTE_SELEKTION07 = 69;
    private static int REPORT_KUNDENLISTE_SELEKTION08 = 70;
    private static int REPORT_KUNDENLISTE_SELEKTION09 = 71;
    private static int REPORT_KUNDENLISTE_SELEKTION10 = 72;
    private static int REPORT_KUNDENLISTE_SELEKTION11 = 73;
    private static int REPORT_KUNDENLISTE_SELEKTION12 = 74;
    private static int REPORT_KUNDENLISTE_SELEKTION13 = 75;
    private static int REPORT_KUNDENLISTE_SELEKTION14 = 76;
    private static int REPORT_KUNDENLISTE_SELEKTION15 = 77;
    private static int REPORT_KUNDENLISTE_ANSPRECHPARTNER_ANREDE = 78;
    private static int REPORT_KUNDENLISTE_ANSPRECHPARTNER_TITEL = 79;
    private static int REPORT_KUNDENLISTE_ANSPRECHPARTNER_VORNAME = 80;
    private static int REPORT_KUNDENLISTE_ANSPRECHPARTNER_NACHNAME = 81;
    private static int REPORT_KUNDENLISTE_ANSPRECHPARTNER_EMAIL = 82;
    private static int REPORT_KUNDENLISTE_ANSPRECHPARTNER_MOBIL = 83;
    private static int REPORT_KUNDENLISTE_ANSPRECHPARTNER_TELDW = 84;
    private static int REPORT_KUNDENLISTE_ANSPRECHPARTNER_FAXDW = 85;
    private static int REPORT_KUNDENLISTE_ANSPRECHPARTNER_BEMERKUNG = 86;
    private static int REPORT_KUNDENLISTE_BEMERKUNG = 87;
    private static int REPORT_KUNDENLISTE_SUBREPORT_PROJEKTE = 88;
    private static int REPORT_KUNDENLISTE_KUNDENNUMMER = 89;
    private static int REPORT_KUNDENLISTE_KUNDE_I_ID = 90;
    private static int REPORT_KUNDENLISTE_ANZAHL_SPALTEN = 91;

    private static int REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_KUNDE = 0;
    private static int REPORT_WARTUNGSAUSWERTUNG_FAELLIGKEIT = 1;
    private static int REPORT_WARTUNGSAUSWERTUNG_ARTIKELGRUPPE = 2;
    private static int REPORT_WARTUNGSAUSWERTUNG_INTERVALL = 3;
    private static int REPORT_WARTUNGSAUSWERTUNG_LETZTEPRUEFUNG = 4;
    private static int REPORT_WARTUNGSAUSWERTUNG_LETZTEPRUEFUNGDURCHGEFUEHRT = 5;
    private static int REPORT_WARTUNGSAUSWERTUNG_ARTIKELNUMMER = 6;
    private static int REPORT_WARTUNGSAUSWERTUNG_BEZEICHNUNG = 7;
    private static int REPORT_WARTUNGSAUSWERTUNG_ARTIKELLIEFERANT = 8;
    private static int REPORT_WARTUNGSAUSWERTUNG_PRUEFER = 9;
    private static int REPORT_WARTUNGSAUSWERTUNG_LETZTEPRUEFUNGDURCHGEFUEHRTLS = 10;
    private static int REPORT_WARTUNGSAUSWERTUNG_LETZTEPRUEFUNGDURCHGEFUEHRTPERSON = 11;
    private static int REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_PLZ = 12;
    private static int REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_ORT = 13;
    private static int REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_STRASSE = 14;
    private static int REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_LKZ = 15;
    private static int REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_FILIALNUMMER = 16;
    private static int REPORT_WARTUNGSAUSWERTUNG_AUFTRAG_AUSLOESER = 17;
    private static int REPORT_WARTUNGSAUSWERTUNG_POSITIONSKOMMENTAR_LIEFERSCHEIN = 18;
    private static int REPORT_WARTUNGSAUSWERTUNG_POSITIONSKOMMENTAR_AUFTRAG = 19;

    public final static int REPORT_KUNDENPREISLISTE_ARTIKELNUMMER = 0;
    public final static int REPORT_KUNDENPREISLISTE_BEZEICHNUNG = 1;
    public final static int REPORT_KUNDENPREISLISTE_KURZBEZEICHNUNG = 2;
    public final static int REPORT_KUNDENPREISLISTE_ZUSATZBEZEICHNUNG = 3;
    public final static int REPORT_KUNDENPREISLISTE_ZUSATZBEZEICHNUNG2 = 4;
    public final static int REPORT_KUNDENPREISLISTE_ARTIKELGRUPPE = 5;
    public final static int REPORT_KUNDENPREISLISTE_BEMERKUNG = 6;
    public final static int REPORT_KUNDENPREISLISTE_GUELTIGAB = 7;
    public final static int REPORT_KUNDENPREISLISTE_GUELTIGBIS = 8;
    public final static int REPORT_KUNDENPREISLISTE_KUNDENARTIKELNUMMER = 9;
    public final static int REPORT_KUNDENPREISLISTE_KUNDENARTIKELBEZEICHNUNG = 10;
    public final static int REPORT_KUNDENPREISLISTE_VERSTECKT = 11;
    public final static int REPORT_KUNDENPREISLISTE_SUBREPORT_PREISE = 12;
    public final static int REPORT_KUNDENPREISLISTE_ARTIKELKLASSE = 13;
    public final static int REPORT_KUNDENPREISLISTE_ENTHAELT_SOKO = 14;
    public final static int REPORT_KUNDENPREISLISTE_ANZAHL_SPALTEN = 15;

    protected void setData(Object[][] newData) {
        data = newData;
        jasperPrintTransformer = null;
    }

    protected void setDataTransformer(IJasperPrintTransformer transformer) {
        data = null;
        jasperPrintTransformer = transformer;
    }

    public boolean next() throws JRException {
        index++;
        if (data != null) {
            return (index < data.length);
        } else {
            return jasperPrintTransformer.next(index);
        }
    }

    public Object getFieldValue(JRField field) throws JRException {

        Object value = null;
        String fieldName = field.getName();

        switch (useCase) {
        case KundeReportFac.UC_REPORT_KUNDE_LIEFERSTATISTIK: {
            value = getFieldValueLieferstatistik(fieldName);
        }
            break;
        case KundeReportFac.UC_REPORT_KUNDE_MONATSSTATISTIK: {
            value = getFieldValueMonatsstatistik(fieldName);
        }
            break;
        case KundeReportFac.UC_REPORT_KUNDE_STAMMBLATT: {
            value = getFieldValueStammblatt(fieldName);
        }
            break;
        case KundeReportFac.UC_REPORT_KUNDE_STATISTIK: {
            value = getFieldValueStatistik(fieldName);
        }
            break;
        case KundeReportFac.UC_REPORT_KUNDE_KUNDENLISTE: {
            value = getFieldValueKundenliste(fieldName);
        }
            break;
        case KundeReportFac.UC_REPORT_KUNDE_KUNDENPREISLISTE: {
            value = getFieldValueKundenpreisliste(fieldName);
        }
            break;
        case KundeReportFac.UC_REPORT_KUNDE_WARTUNGSAUSWERTUNG: {
            value = getFieldValueWartungsauswertung(fieldName);
        }
            break;
        }
        return value;
    }

    /**
     * getFieldValueStatistik
     * 
     * @param fieldName
     *            String
     * @return Object
     */
    private Object getFieldValueStatistik(String fieldName) {
        return null;
    }

    private Object getFieldValueLieferstatistik(String fieldName) {
        Object value = null;
        if ("F_RECHNUNG".equals(fieldName)) {
            value = data[index][REPORT_STATISTIK_RECHNUNGSNUMMER];
        } else if ("F_LIEFERSCHEIN".equals(fieldName)) {
            value = data[index][REPORT_STATISTIK_LIEFERSCHEINNUMMER];
        } else if ("F_DATUM".equals(fieldName)) {
            value = data[index][REPORT_STATISTIK_DATUM];
        } else if ("F_IDENT".equals(fieldName)) {
            value = data[index][REPORT_STATISTIK_IDENT];
        } else if (F_BEZEICHNUNG.equals(fieldName)) {
            value = data[index][REPORT_STATISTIK_BEZEICHNUNG];
        } else if ("F_MENGE".equals(fieldName)) {
            value = data[index][REPORT_STATISTIK_MENGE];
        } else if ("F_SNRCHNR".equals(fieldName)) {
            value = data[index][REPORT_STATISTIK_SERIENNUMMER];
        } else if ("F_MATERIALZUSCHLAG".equals(fieldName)) {
            value = data[index][REPORT_STATISTIK_MATERIALZUSCHLAG];
        } else if ("F_SETARTIKEL_TYP".equals(fieldName)) {
            value = data[index][REPORT_STATISTIK_SETARTIKEL_TYP];
        } else if ("F_WERT".equals(fieldName)) {
            BigDecimal preis = (BigDecimal) data[index][REPORT_STATISTIK_PREIS];
            BigDecimal menge = (BigDecimal) data[index][REPORT_STATISTIK_MENGE];
            BigDecimal wert = preis;
            if (preis != null && menge != null) {
                wert = preis.multiply(menge);
            }
            value = wert;
        } else if ("F_PREIS".equals(fieldName)) {
            BigDecimal preis = (BigDecimal) data[index][REPORT_STATISTIK_PREIS];
            BigDecimal menge = (BigDecimal) data[index][REPORT_STATISTIK_MENGE];
            if (preis != null && menge != null) {
                summePreis = summePreis.add(preis.multiply(menge));
            }
            value = data[index][REPORT_STATISTIK_PREIS];
        } else if ("F_SUMMEPREIS".equals(fieldName)) {
            value = summePreis;
        } else if ("F_VERLEIHTAGE".equals(fieldName)) {
            value = data[index][REPORT_STATISTIK_VERLEIHTAGE];
        } else if ("F_VERLEIHFAKTOR".equals(fieldName)) {
            value = data[index][REPORT_STATISTIK_VERLEIHFAKTOR];
        }
        return value;
    }

    private Object getFieldValueStammblatt(String fieldName) {
        Object value = null;
        if ("F_FAXDW".equals(fieldName)) {
            value = data[index][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_FAXDW];
        } else if ("F_FUNKTION".equals(fieldName)) {
            value = data[index][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_FUNKTION];
        } else if ("F_MOBIL".equals(fieldName)) {
            value = data[index][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_MOBIL];
        } else if ("F_EMAIL".equals(fieldName)) {
            value = data[index][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_EMAIL];
        } else if ("F_NACHNAME".equals(fieldName)) {
            value = data[index][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_NACHNAME];
        } else if ("F_TELDW".equals(fieldName)) {
            value = data[index][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_TELDW];
        } else if ("F_TITEL".equals(fieldName)) {
            value = data[index][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_TITEL];
        } else if ("F_VORNAME".equals(fieldName)) {
            value = data[index][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_VORNAME];
        }

        return value;
    }

    private Object getFieldValueMonatsstatistik(String fieldName) {
        Object value = null;
        if ("Jahr".equals(fieldName)) {
            value = data[index][REPORT_MONATSSTATISTIK_JAHR];
        } else if ("Monat".equals(fieldName)) {
            value = data[index][REPORT_MONATSSTATISTIK_MONAT];
        } else if ("Menge".equals(fieldName)) {
            value = data[index][REPORT_MONATSSTATISTIK_MENGE];
        } else if ("Wert".equals(fieldName)) {
            value = data[index][REPORT_MONATSSTATISTIK_WERT];
        }

        return value;
    }

    private Object getFieldValueWartungsauswertung(String fieldName) {
        Object value = null;
        if ("F_LIEFERADRESSE_KUNDE".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_KUNDE];
        } else if ("F_INTERVALL".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_INTERVALL];
        } else if ("F_FAELLIGKEIT".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_FAELLIGKEIT];
        } else if ("F_LETZTEPRUEFUNG".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_LETZTEPRUEFUNG];
        } else if ("F_LETZTEPRUEFUNGDURCHGEFUEHRT".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_LETZTEPRUEFUNGDURCHGEFUEHRT];
        } else if ("F_ARTIKELGRUPPE".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_ARTIKELGRUPPE];
        } else if ("F_ARTIKELNUMMER".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_ARTIKELNUMMER];
        } else if ("F_ARTIKELBEZEICHNUNG".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_BEZEICHNUNG];
        } else if ("F_PRUEFER".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_PRUEFER];
        } else if ("F_LETZTERLIEFERSCHEIN".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_LETZTEPRUEFUNGDURCHGEFUEHRTLS];
        } else if ("F_LETZTERPRUEFER".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_LETZTEPRUEFUNGDURCHGEFUEHRTPERSON];
        } else if ("F_AUFTRAG_AUSLOESER".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_AUFTRAG_AUSLOESER];
        } else if ("F_LIEFERADRESSE_LKZ".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_LKZ];
        } else if ("F_LIEFERADRESSE_ORT".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_ORT];
        } else if ("F_LIEFERADRESSE_PLZ".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_PLZ];
        } else if ("F_LIEFERADRESSE_STRASSE".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_STRASSE];
        } else if ("F_LIEFERADRESSE_FILIALNUMMER".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_FILIALNUMMER];
        } else if ("F_POSITIONSKOMMENTAR_AUFTRAG".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_POSITIONSKOMMENTAR_AUFTRAG];
        } else if ("F_POSITIONSKOMMENTAR_LIEFERSCHEIN".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_POSITIONSKOMMENTAR_LIEFERSCHEIN];
        } else if ("F_ARTIKELLIEFERANT".equals(fieldName)) {
            value = data[index][REPORT_WARTUNGSAUSWERTUNG_ARTIKELLIEFERANT];
        }

        return value;
    }

    private Object getFieldValueKundenpreisliste(String fieldName) {
        return jasperPrintTransformer.transformData(index, fieldName);
        //
        // Object value = null;
        // if ("Artikelnummer".equals(fieldName)) {
        // value = data[index][REPORT_KUNDENPREISLISTE_ARTIKELNUMMER];
        // } else if ("Bezeichnung".equals(fieldName)) {
        // value = data[index][REPORT_KUNDENPREISLISTE_BEZEICHNUNG];
        // } else if ("Kurzbezeichnung".equals(fieldName)) {
        // value = data[index][REPORT_KUNDENPREISLISTE_KURZBEZEICHNUNG];
        // } else if ("Zusatzbezeichnung".equals(fieldName)) {
        // value = data[index][REPORT_KUNDENPREISLISTE_ZUSATZBEZEICHNUNG];
        // } else if ("Zusatzbezeichnung2".equals(fieldName)) {
        // value = data[index][REPORT_KUNDENPREISLISTE_ZUSATZBEZEICHNUNG2];
        // } else if ("Versteckt".equals(fieldName)) {
        // value = data[index][REPORT_KUNDENPREISLISTE_VERSTECKT];
        // } else if ("Artikelgruppe".equals(fieldName)) {
        // value = data[index][REPORT_KUNDENPREISLISTE_ARTIKELGRUPPE];
        // } else if ("Artikelklasse".equals(fieldName)) {
        // value = data[index][REPORT_KUNDENPREISLISTE_ARTIKELKLASSE];
        // } else if ("SubreportPreise".equals(fieldName)) {
        // value = data[index][REPORT_KUNDENPREISLISTE_SUBREPORT_PREISE];
        // } else if ("EnthaeltSokos".equals(fieldName)) {
        // value = data[index][REPORT_KUNDENPREISLISTE_ENTHAELT_SOKO];
        // }
        //
        // return value;
    }

    private Object getFieldValueKundenliste(String fieldName) {
        Object value = null;
        if ("F_ABC".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ABC];
        } else if ("F_ABW_UST_LAND".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ABW_UST_LAND];
        } else if ("F_ANREDE".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ANREDE];
        } else if ("F_ANSPRECHPARTNER_ANREDE".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ANSPRECHPARTNER_ANREDE];
        } else if ("F_ANSPRECHPARTNER_EMAIL".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ANSPRECHPARTNER_EMAIL];
        } else if ("F_ANSPRECHPARTNER_FAXDW".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ANSPRECHPARTNER_FAXDW];
        } else if ("F_ANSPRECHPARTNER_MOBIL".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ANSPRECHPARTNER_MOBIL];
        } else if ("F_ANSPRECHPARTNER_BEMERKUNG".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ANSPRECHPARTNER_BEMERKUNG];
        } else if ("F_ANSPRECHPARTNER_NACHNAME".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ANSPRECHPARTNER_NACHNAME];
        } else if ("F_ANSPRECHPARTNER_TELDW".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ANSPRECHPARTNER_TELDW];
        } else if ("F_ANSPRECHPARTNER_TITEL".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ANSPRECHPARTNER_TITEL];
        } else if ("F_ANSPRECHPARTNER_VORNAME".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ANSPRECHPARTNER_VORNAME];
        } else if ("F_ANZAHL_RECHNUNGEN_HEUER".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ANZAHL_RECHNUNGEN_HEUER];
        } else if ("F_ANZAHL_RECHNUNGEN_VORJAHR".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ANZAHL_RECHNUNGEN_VORJAHR];
        } else if ("F_BRANCHE".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_BRANCHE];
        } else if ("F_BRIEFANREDE".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_BRIEFANREDE];
        } else if ("F_CNAME1".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_CNAME1];
        } else if ("F_CNAME2".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_CNAME2];
        } else if ("F_CNAME3".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_CNAME3];
        } else if ("F_BEMERKUNG".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_BEMERKUNG];
        } else if ("F_DEBITORENKONTO".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_DEBITORENKONTO];
        } else if ("F_EMAIL".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_EMAIL];
        } else if ("F_ERLOESKONTO".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ERLOESKONTO];
        } else if ("F_FAX".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_FAX];
        } else if ("F_FIRMENBUCHNUMMER".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_FIRMENBUCHNUMMER];
        } else if ("F_GERICHTSSTAND".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_GERICHTSSTAND];
        } else if ("F_HOMEPAGE".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_HOMEPAGE];
        } else if ("F_INTERESSENT".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_INTERESSENT];
        } else if ("F_KOMMUNIKATIONSSPRACHE".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_KOMMUNIKATIONSSPRACHE];
        } else if ("F_KOSTENSTELLE".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_KOSTENSTELLE];
        } else if ("F_KREDITLIMIT".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_KREDITLIMIT];
        } else if ("F_KURZBEZEICHNUNG".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_KURZBEZEICHNUNG];
        } else if ("F_LAND".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_LAND];
        } else if ("F_LAND_POSTFACH".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_LAND_POSTFACH];
        } else if ("F_LETZTE_BONITAETSPRUEFUNG".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_LETZTE_BONITAETSPRUEFUNG];
        } else if ("F_LIEFERANTENNUMMER".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_LIEFERANTENNUMMER];
        } else if ("F_LIEFERART".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_LIEFERART];
        } else if ("F_MWSTSATZ".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_MWSTSATZ];
        } else if ("F_ORT".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ORT];
        } else if ("F_ORT_POSTFACH".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ORT_POSTFACH];
        } else if ("F_PARTNERART".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_PARTNERART];
        } else if ("F_PARTNERKLASSE".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_PARTNERKLASSE];
        } else if ("F_PLZ".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_PLZ];
        } else if ("F_PLZ_POSTFACH".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_PLZ_POSTFACH];
        } else if ("F_POSTFACH".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_POSTFACH];
        } else if ("F_PREISLISTE".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_PREISLISTE];
        } else if ("F_PROVISIONSEMPFAENGER".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_PROVISIONSEMPFAENGER];
        } else if ("F_RABATT".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RABATT];
        } else if ("F_RECHNUNGSADRESSE_ANREDE".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RECHNUNGSADRESSE_ANREDE];
        } else if ("F_RECHNUNGSADRESSE_CNAME1".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RECHNUNGSADRESSE_CNAME1];
        } else if ("F_RECHNUNGSADRESSE_CNAME2".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RECHNUNGSADRESSE_CNAME2];
        } else if ("F_RECHNUNGSADRESSE_CNAME3".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RECHNUNGSADRESSE_CNAME3];
        } else if ("F_RECHNUNGSADRESSE_KURZBEZEICHNUNG".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RECHNUNGSADRESSE_KURZBEZEICHNUNG];
        } else if ("F_RECHNUNGSADRESSE_LAND".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RECHNUNGSADRESSE_LAND];
        } else if ("F_RECHNUNGSADRESSE_LAND_POSTFACH".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RECHNUNGSADRESSE_LAND_POSTFACH];
        } else if ("F_RECHNUNGSADRESSE_ORT".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RECHNUNGSADRESSE_ORT];
        } else if ("F_RECHNUNGSADRESSE_ORT_POSTFACH".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RECHNUNGSADRESSE_ORT_POSTFACH];
        } else if ("F_RECHNUNGSADRESSE_PLZ".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RECHNUNGSADRESSE_PLZ];
        } else if ("F_RECHNUNGSADRESSE_PLZ_POSTFACH".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RECHNUNGSADRESSE_PLZ_POSTFACH];
        } else if ("F_RECHNUNGSADRESSE_POSTFACH".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RECHNUNGSADRESSE_POSTFACH];
        } else if ("F_RECHNUNGSADRESSE_STRASSE".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RECHNUNGSADRESSE_STRASSE];
        } else if ("F_RECHNUNGSADRESSE_TITEL".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RECHNUNGSADRESSE_TITEL];
        } else if ("F_RECHNUNGSADRESSE_UIDNUMMER".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_RECHNUNGSADRESSE_UIDNUMMER];
        } else if ("F_KUNDENLISTE_SELEKTION01".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SELEKTION01];
        } else if ("F_KUNDENLISTE_SELEKTION02".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SELEKTION02];
        } else if ("F_KUNDENLISTE_SELEKTION03".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SELEKTION03];
        } else if ("F_KUNDENLISTE_SELEKTION04".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SELEKTION04];
        } else if ("F_KUNDENLISTE_SELEKTION05".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SELEKTION05];
        } else if ("F_KUNDENLISTE_SELEKTION06".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SELEKTION06];
        } else if ("F_KUNDENLISTE_SELEKTION07".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SELEKTION07];
        } else if ("F_KUNDENLISTE_SELEKTION08".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SELEKTION08];
        } else if ("F_KUNDENLISTE_SELEKTION09".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SELEKTION09];
        } else if ("F_KUNDENLISTE_SELEKTION10".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SELEKTION10];
        } else if ("F_KUNDENLISTE_SELEKTION11".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SELEKTION11];
        } else if ("F_KUNDENLISTE_SELEKTION12".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SELEKTION12];
        } else if ("F_KUNDENLISTE_SELEKTION13".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SELEKTION13];
        } else if ("F_KUNDENLISTE_SELEKTION14".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SELEKTION14];
        } else if ("F_KUNDENLISTE_SELEKTION15".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SELEKTION15];
        } else if ("F_SPEDITEUR".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SPEDITEUR];
        } else if ("F_STRASSE".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_STRASSE];
        } else if ("F_TELEFON".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_TELEFON];
        } else if ("F_TITEL".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_TITEL];
        } else if ("F_UIDNUMMER".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_UIDNUMMER];
        } else if ("F_UMSATZ_HEUER".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_UMSATZ_HEUER];
        } else if ("F_UMSATZ_VORJAHR".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_UMSATZ_VORJAHR];
        } else if ("F_WAEHRUNG".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_WAEHRUNG];
        } else if ("F_ZAHLUNGSZIEL".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ZAHLUNGSZIEL];
        } else if ("F_ZESSION".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_ZESSION];
        } else if ("F_KUNDENNUMMER".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_KUNDENNUMMER];
        } else if ("F_SUBREPORT_PROJEKTE".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_SUBREPORT_PROJEKTE];
        } else if ("F_KUNDE_I_ID".equals(fieldName)) {
            value = data[index][REPORT_KUNDENLISTE_KUNDE_I_ID];
        }

        return value;
    }

    @TransactionAttribute(TransactionAttributeType.NEVER)
    public JasperPrintLP printWartungsauswertung(java.sql.Timestamp tStichtag, boolean bVerdichtet,
            boolean bSortiertNachArtikellieferant, TheClientDto theClientDto) {
        useCase = KundeReportFac.UC_REPORT_KUNDE_WARTUNGSAUSWERTUNG;
        HashMap<String, Object> parameter = new HashMap<String, Object>();

        parameter.put("P_STICHTAG", tStichtag);
        parameter.put("P_VERDICHTET", new Boolean(bVerdichtet));

        if (bSortiertNachArtikellieferant == true) {
            parameter.put("P_SORTIERUNG",
                    getTextRespectUISpr("lp.artikellieferant", theClientDto.getMandant(), theClientDto.getLocUi()));
        } else {
            parameter.put("P_SORTIERUNG",
                    getTextRespectUISpr("lp.pruefer", theClientDto.getMandant(), theClientDto.getLocUi()));
        }

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

        String sQuery = "SELECT ap FROM FLRAuftragposition ap WHERE ap.flrauftrag.auftragstatus_c_nr IN ('"
                + LocaleFac.STATUS_OFFEN + "','" + LocaleFac.STATUS_TEILERLEDIGT + "') "
                + " AND ap.flrartikel.i_id IS NOT NULL AND ap.flrauftrag.mandant_c_nr='" + theClientDto.getMandant()
                + "' AND ap.t_uebersteuerterliefertermin<='"
                + Helper.formatDateWithSlashes(new java.sql.Date(tStichtag.getTime())) + "'"
                + " ORDER BY ap.flrauftrag.flrkunde.flrpartner.c_name1nachnamefirmazeile1 ASC";

        Query inventurliste = session.createQuery(sQuery);

        List<?> resultList = inventurliste.list();

        Iterator<?> resultListIterator = resultList.iterator();

        ArrayList alDaten = new ArrayList();

        while (resultListIterator.hasNext()) {

            FLRAuftragposition pos = (FLRAuftragposition) resultListIterator.next();

            Object[] zeile = new Object[20];
            zeile[REPORT_WARTUNGSAUSWERTUNG_PRUEFER] = "";
            java.sql.Timestamp tTermin = new java.sql.Timestamp(pos.getT_uebersteuerterliefertermin().getTime());

            zeile[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_KUNDE] = pos.getFlrauftrag().getFlrkunde().getFlrpartner()
                    .getC_name1nachnamefirmazeile1();

            if (pos.getFlrauftrag().getFlrkunde().getFlrpartner().getFlrlandplzort() != null) {
                zeile[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_LKZ] = pos.getFlrauftrag().getFlrkunde()
                        .getFlrpartner().getFlrlandplzort().getFlrland().getC_lkz();

                zeile[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_PLZ] = pos.getFlrauftrag().getFlrkunde()
                        .getFlrpartner().getFlrlandplzort().getC_plz();

                zeile[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_ORT] = pos.getFlrauftrag().getFlrkunde()
                        .getFlrpartner().getFlrlandplzort().getFlrort().getC_name();

                zeile[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_STRASSE] = pos.getFlrauftrag().getFlrkunde()
                        .getFlrpartner().getC_strasse();
            }
            zeile[REPORT_WARTUNGSAUSWERTUNG_POSITIONSKOMMENTAR_AUFTRAG] = pos.getX_textinhalt();

            PartnerDto partnerDto = getPartnerFac().partnerFindByPrimaryKey(
                    pos.getFlrauftrag().getFlrkunde().getFlrpartner().getI_id(), theClientDto);

            zeile[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_FILIALNUMMER] = partnerDto.getCFilialnummer();

            zeile[REPORT_WARTUNGSAUSWERTUNG_AUFTRAG_AUSLOESER] = pos.getFlrauftrag().getC_nr();

            PersonalDto personalDtoAB = getPersonalFac()
                    .personalFindByPrimaryKey(pos.getFlrauftrag().getVertreter_i_id(), theClientDto);
            zeile[REPORT_WARTUNGSAUSWERTUNG_PRUEFER] = personalDtoAB.getPartnerDto().formatAnrede();

            ArtikelDto artikelDto = getArtikelFac().artikelFindByPrimaryKeySmall(pos.getFlrartikel().getI_id(),
                    theClientDto);

            zeile[REPORT_WARTUNGSAUSWERTUNG_ARTIKELNUMMER] = artikelDto.getCNr();

            // 1. Artikellieferant einfuegen

            ArtikellieferantDto[] aldtos = getArtikelFac().artikellieferantFindByArtikelIId(artikelDto.getIId(),
                    theClientDto);
            if (aldtos != null && aldtos.length > 0) {

                LieferantDto lDto = getLieferantFac().lieferantFindByPrimaryKey(aldtos[0].getLieferantIId(),
                        theClientDto);

                zeile[REPORT_WARTUNGSAUSWERTUNG_ARTIKELLIEFERANT] = lDto.getPartnerDto().formatAnrede();
            } else {
                zeile[REPORT_WARTUNGSAUSWERTUNG_ARTIKELLIEFERANT] = "";
            }

            if (artikelDto.getArtikelsprDto() != null) {
                zeile[REPORT_WARTUNGSAUSWERTUNG_BEZEICHNUNG] = artikelDto.getArtikelsprDto().getCBez();
            }
            int iWartungsintervall = 0;
            if (artikelDto.getIWartungsintervall() != null) {
                iWartungsintervall = artikelDto.getIWartungsintervall();
            }

            // Wenn das Wartungsintervall 0 ist, dann steht sie immer auf
            // der Liste
            if (iWartungsintervall == 0) {
                zeile[REPORT_WARTUNGSAUSWERTUNG_FAELLIGKEIT] = tTermin;
            }

            zeile[REPORT_WARTUNGSAUSWERTUNG_LETZTEPRUEFUNGDURCHGEFUEHRT] = new Boolean(true);

            zeile[REPORT_WARTUNGSAUSWERTUNG_INTERVALL] = new Integer(iWartungsintervall);

            // Nun die letzte Lieferscheinposition des Artkels mit der
            // Auftragsadresse holen
            Session session2 = FLRSessionFactory.getFactory().openSession();

            String sQuery2 = "SELECT lp FROM FLRLieferscheinposition lp WHERE lp.flrlieferschein.lieferscheinstatus_status_c_nr NOT IN ('"
                    + LocaleFac.STATUS_STORNIERT + "') " + " AND lp.flrartikel.i_id=" + artikelDto.getIId()
                    + "AND lp.flrlieferschein.flrkunde=" + pos.getFlrauftrag().getFlrkunde().getI_id()
                    + " AND lp.flrlieferschein.d_belegdatum>='"
                    + Helper.formatDateWithSlashes(new java.sql.Date(tTermin.getTime())) + "' "
                    + " ORDER BY lp.flrlieferschein.d_belegdatum DESC";

            Query query2 = session2.createQuery(sQuery2);
            query2.setMaxResults(1);
            List<?> resultList2 = query2.list();

            if (resultList2.size() > 0) {
                FLRLieferscheinposition lsPos = (FLRLieferscheinposition) resultList2.iterator().next();

                // Faelligkeit berechnen
                java.sql.Timestamp tLetzteWartung = new java.sql.Timestamp(
                        lsPos.getFlrlieferschein().getD_belegdatum().getTime());

                PersonalDto personalDto = getPersonalFac().personalFindByPrimaryKey(
                        lsPos.getFlrlieferschein().getPersonal_i_id_vertreter(), theClientDto);

                zeile[REPORT_WARTUNGSAUSWERTUNG_POSITIONSKOMMENTAR_LIEFERSCHEIN] = lsPos.getC_textinhalt();

                zeile[REPORT_WARTUNGSAUSWERTUNG_LETZTEPRUEFUNGDURCHGEFUEHRTLS] = lsPos.getFlrlieferschein()
                        .getC_nr();

                zeile[REPORT_WARTUNGSAUSWERTUNG_LETZTEPRUEFUNG] = tLetzteWartung;
                zeile[REPORT_WARTUNGSAUSWERTUNG_LETZTEPRUEFUNGDURCHGEFUEHRTPERSON] = personalDto.getPartnerDto()
                        .formatAnrede();

                Calendar c = Calendar.getInstance();
                c.setTimeInMillis(tLetzteWartung.getTime());
                c.set(Calendar.MONTH, c.get(Calendar.MONTH) + iWartungsintervall);

                if (c.getTimeInMillis() <= tStichtag.getTime()) {
                    zeile[REPORT_WARTUNGSAUSWERTUNG_FAELLIGKEIT] = new java.sql.Timestamp(c.getTimeInMillis());
                } else {
                    continue;
                }

                if (lsPos.getN_menge() != null && lsPos.getN_menge().doubleValue() == 0) {
                    zeile[REPORT_WARTUNGSAUSWERTUNG_LETZTEPRUEFUNGDURCHGEFUEHRT] = new Boolean(false);
                }

            } else {
                zeile[REPORT_WARTUNGSAUSWERTUNG_FAELLIGKEIT] = tTermin;
            }

            session2.close();

            alDaten.add(zeile);
        }
        session.close();

        if (bSortiertNachArtikellieferant == true) {
            for (int k = alDaten.size() - 1; k > 0; --k) {
                for (int j = 0; j < k; ++j) {
                    Object[] a1 = (Object[]) alDaten.get(j);
                    Object[] a2 = (Object[]) alDaten.get(j + 1);

                    String s1 = (String) a1[REPORT_WARTUNGSAUSWERTUNG_ARTIKELLIEFERANT];

                    s1 += " " + a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_KUNDE];

                    if (a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_LKZ] != null) {
                        s1 += " " + a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_LKZ];
                    }
                    if (a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_PLZ] != null) {
                        s1 += " " + a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_PLZ];
                    }
                    if (a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_ORT] != null) {
                        s1 += " " + a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_ORT];
                    }
                    if (a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_STRASSE] != null) {
                        s1 += " " + a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_STRASSE];
                    }

                    String s2 = (String) a2[REPORT_WARTUNGSAUSWERTUNG_ARTIKELLIEFERANT];
                    s2 += " " + a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_KUNDE];

                    if (a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_LKZ] != null) {
                        s2 += " " + a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_LKZ];
                    }
                    if (a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_PLZ] != null) {
                        s2 += " " + a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_PLZ];
                    }
                    if (a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_ORT] != null) {
                        s2 += " " + a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_ORT];
                    }
                    if (a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_STRASSE] != null) {
                        s2 += " " + a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_STRASSE];
                    }

                    if (s1.compareTo(s2) > 0) {
                        alDaten.set(j, a2);
                        alDaten.set(j + 1, a1);
                    }
                }

            }
        } else {
            for (int k = alDaten.size() - 1; k > 0; --k) {
                for (int j = 0; j < k; ++j) {
                    Object[] a1 = (Object[]) alDaten.get(j);
                    Object[] a2 = (Object[]) alDaten.get(j + 1);

                    String s1 = (String) a1[REPORT_WARTUNGSAUSWERTUNG_PRUEFER];

                    s1 += " " + a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_KUNDE];

                    if (a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_LKZ] != null) {
                        s1 += " " + a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_LKZ];
                    }
                    if (a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_PLZ] != null) {
                        s1 += " " + a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_PLZ];
                    }
                    if (a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_ORT] != null) {
                        s1 += " " + a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_ORT];
                    }
                    if (a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_STRASSE] != null) {
                        s1 += " " + a1[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_STRASSE];
                    }

                    String s2 = (String) a2[REPORT_WARTUNGSAUSWERTUNG_PRUEFER];
                    s2 += " " + a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_KUNDE];

                    if (a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_LKZ] != null) {
                        s2 += " " + a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_LKZ];
                    }
                    if (a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_PLZ] != null) {
                        s2 += " " + a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_PLZ];
                    }
                    if (a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_ORT] != null) {
                        s2 += " " + a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_ORT];
                    }
                    if (a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_STRASSE] != null) {
                        s2 += " " + a2[REPORT_WARTUNGSAUSWERTUNG_LIEFERADRESSE_STRASSE];
                    }

                    if (s1.compareTo(s2) > 0) {
                        alDaten.set(j, a2);
                        alDaten.set(j + 1, a1);
                    }
                }

            }
        }

        // Nach Person sortieren, damit danach gruppiert werden kann

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

        // data = (Object[][]) alDaten.toArray(data);
        setData((Object[][]) alDaten.toArray(data));

        if (bSortiertNachArtikellieferant == true) {
            initJRDS(parameter, KundeReportFac.REPORT_MODUL,
                    KundeReportFac.REPORT_WARTUNGSAUSWERTUNG_ARTIKELLIEFERANT, theClientDto.getMandant(),
                    theClientDto.getLocUi(), theClientDto);
        } else {

            initJRDS(parameter, KundeReportFac.REPORT_MODUL, KundeReportFac.REPORT_WARTUNGSAUSWERTUNG,
                    theClientDto.getMandant(), theClientDto.getLocUi(), theClientDto);
        }

        return getReportPrint();
    }

    @TransactionAttribute(TransactionAttributeType.NEVER)
    public CustomerPricelistReportDto printKundenpreislisteRaw(Integer kundeIId, Integer artikelgruppeIId,
            Integer artikelklasseIId, boolean bMitGesperrten, String artikelNrVon, String artikelNrBis,
            boolean bMitVersteckten, java.sql.Date datGueltikeitsdatumI, boolean nurSonderkonditionen,
            boolean bMitArtikelbezeichnungenInMandantensprache, boolean nurWebshopartikel,
            TheClientDto theClientDto) {

        CustomerPricelistReportDto returnDto = new CustomerPricelistReportDto();

        useCase = KundeReportFac.UC_REPORT_KUNDE_KUNDENPREISLISTE;
        KundeDto kundeDto = getKundeFac().kundeFindByPrimaryKey(kundeIId, theClientDto);
        if (!kundeDto.getMandantCNr().equals(theClientDto.getMandant())) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FALSCHER_MANDANT,
                    "Kunde (i_id = " + kundeIId + ") in Mandant " + theClientDto.getMandant() + " nicht vorhanden");
        }
        // HashMap<String, Object> parameter = new HashMap<String, Object>();
        try {
            returnDto.setCustomer(new IdValueDto(kundeDto.getIId(), kundeDto.getPartnerDto().formatAnrede()));

            if (artikelgruppeIId != null) {
                returnDto.setItemgroup(new IdValueDto(artikelgruppeIId,
                        getArtikelFac().artgruFindByPrimaryKey(artikelgruppeIId, theClientDto).getCNr()));
            }
            if (artikelklasseIId != null) {
                returnDto.setItemclass(new IdValueDto(artikelklasseIId,
                        getArtikelFac().artklaFindByPrimaryKey(artikelklasseIId, theClientDto).getCNr()));
            }

            returnDto.setOnlyWebshopItems(nurWebshopartikel);
            ParametermandantDto param = getParameterFac().getMandantparameter(theClientDto.getMandant(),
                    ParameterFac.KATEGORIE_KUNDEN, ParameterFac.PARAMETER_PREISBASIS_VERKAUF);

            int iPreisbasis = (Integer) param.getCWertAsObject();
            // Mwstsatz aus Artikel

            String sQuery = "SELECT artikelliste.i_id, artikelliste.c_nr, aspr.c_bez, aspr.c_kbez, aspr.c_zbez,aspr.c_zbez2,artikelliste.einheit_c_nr, gruppe.c_nr, "
                    + " klasse.c_nr, artikelliste.b_versteckt,artikelliste.mwstsatz_i_id, gruppe.i_id, shopgruppe, sgspr.c_bez "
                    + " FROM FLRArtikelliste AS artikelliste"
                    + " LEFT OUTER JOIN artikelliste.flrshopgruppe as shopgruppe "
                    + " LEFT OUTER JOIN shopgruppe.shopgruppesprset AS sgspr "
                    + " LEFT OUTER JOIN artikelliste.flrartikelgruppe AS gruppe "
                    + " LEFT OUTER JOIN artikelliste.flrartikelklasse AS klasse "
                    // +
                    // " LEFT OUTER JOIN artikelliste.artikelsperreset AS sperren "
                    + " LEFT OUTER JOIN artikelliste.artikelsprset AS aspr WHERE artikelliste.mandant_c_nr='"
                    + theClientDto.getMandant() + "' AND artikelliste.artikelart_c_nr NOT IN ('"
                    + ArtikelFac.ARTIKELART_HANDARTIKEL + "') ";

            if (!bMitGesperrten) {
                sQuery += " AND artikelliste.artikelsperreset IS EMPTY";
            }
            if (artikelklasseIId != null) {
                sQuery += " AND klasse.i_id=" + artikelklasseIId.intValue();
            }
            if (artikelgruppeIId != null) {
                sQuery += " AND gruppe.i_id=" + artikelgruppeIId.intValue();
            }
            if (bMitVersteckten == false) {
                sQuery += " AND artikelliste.b_versteckt=0 ";
            }
            if (artikelNrVon != null) {
                sQuery += " AND artikelliste.c_nr >='" + artikelNrVon + "'";
            }
            if (artikelNrBis != null) {
                sQuery = sQuery + " AND artikelliste.c_nr <='" + artikelNrBis + "'";
            }
            if (nurWebshopartikel) {
                sQuery = sQuery + " AND shopgruppe.i_id IS NOT NULL ";
            }
            sQuery += "ORDER BY artikelliste.c_nr";

            Session session = FLRSessionFactory.getFactory().openSession();
            Query inventurliste = session.createQuery(sQuery);

            session.enableFilter("filterLocale").setParameter("paramLocale",
                    kundeDto.getPartnerDto().getLocaleCNrKommunikation());

            List<?> resultList = inventurliste.list();

            Iterator<?> resultListIterator = resultList.iterator();

            // ArrayList alDaten = new ArrayList();
            //
            // int row = 0;

            // int preisNachkommastellen =
            // getMandantFac().getNachkommastellenPreisVK(theClientDto.getMandant())
            // ;
            int preisNachkommastellen = 4;

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

                Integer artikel_i_id = (Integer) o[0];
                Integer artgruIId = (Integer) o[11];

                CustomerPricelistItemDto reportArtikel = new CustomerPricelistItemDto(artikel_i_id, (String) o[1]);
                // Integer artikel_i_id = (Integer) o[0];
                // String artikelnummer = (String) o[1];
                // String bezeichnung = (String) o[2];
                // String kurzbezeichnung = (String) o[3];
                // String zusatzbezeichnung = (String) o[4];
                // String zusatzbezeichnung2 = (String) o[5];
                // String einheit = (String) o[6];
                // String gruppe = (String) o[7];
                // String klasse = (String) o[8];
                // Short versteckt = (Short) o[9];
                // Integer mwstsatzIId = (Integer) o[10];

                reportArtikel.setName((String) o[2]);
                reportArtikel.setShortName((String) o[3]);
                reportArtikel.setAdditionalName((String) o[4]);
                reportArtikel.setAdditionalName2((String) o[5]);
                reportArtikel.setUnit((String) o[6]);
                reportArtikel.setItemGroup((String) o[7]);
                reportArtikel.setItemClass((String) o[8]);
                reportArtikel.setHidden((Short) o[9]);
                reportArtikel.setVATId((Integer) o[10]);
                // reportArtikel.setArtikelgruppeId(artgruIId);
                reportArtikel.setSpecialCondition(false);
                reportArtikel.setItemGroupDto(new IdValueDto(artgruIId, (String) o[7]));

                if (o[12] != null) {
                    FLRShopgruppe flrShopgruppe = (FLRShopgruppe) o[12];
                    CustomerPricelistShopgroupDto shopgroupDto = new CustomerPricelistShopgroupDto();
                    shopgroupDto.setId(flrShopgruppe.getI_id());
                    shopgroupDto.setCnr(flrShopgruppe.getC_nr());
                    shopgroupDto.setName(flrShopgruppe.getC_nr());
                    shopgroupDto.setName(o[13] != null ? (String) o[13] : flrShopgruppe.getC_nr());
                    reportArtikel.setShopgroupDto(shopgroupDto);
                }

                BigDecimal preisBasis = null;
                if (iPreisbasis == 0 || iPreisbasis == 2) {

                    preisBasis = getVkPreisfindungFac().ermittlePreisbasis(artikel_i_id, datGueltikeitsdatumI, null,
                            kundeDto.getCWaehrung(), theClientDto);
                } else {

                    preisBasis = getVkPreisfindungFac().ermittlePreisbasis(artikel_i_id, datGueltikeitsdatumI,
                            kundeDto.getVkpfArtikelpreislisteIIdStdpreisliste(), kundeDto.getCWaehrung(),
                            theClientDto);

                }

                // Preisbasis fuer Menge =1 ist nun definiert

                // int iAnzahlZeilenSubreport = 8;
                // String[] fieldnames = new String[] { "Menge", "Basis",
                // "BasisPreis", "Fixpreis", "Rabattsatz",
                // "BerechneterPreis", "Waehrung", "Soko" };

                // ArrayList al = new ArrayList();

                if (nurSonderkonditionen == false) {
                    CustomerPricelistPriceDto preisDto = new CustomerPricelistPriceDto(
                            CustomerPricelistPriceDto.PREISTYP_VKPREISBASIS, preisNachkommastellen);
                    preisDto.setBasePrice(preisBasis);

                    // Object[] zeile = new Object[iAnzahlZeilenSubreport];
                    // zeile[0] = null;
                    // zeile[1] = "VK-Preisbasis";
                    // zeile[2] = preisBasis;
                    // zeile[3] = null;

                    VkPreisfindungPreislisteDto artikelPreisliste = null;

                    try {
                        artikelPreisliste = getVkPreisfindungFac().getAktuellePreislisteByArtikelIIdPreislisteIId(
                                artikel_i_id, kundeDto.getVkpfArtikelpreislisteIIdStdpreisliste(),
                                new Date(System.currentTimeMillis()), kundeDto.getCWaehrung(), theClientDto);
                    } catch (Throwable t) {
                        // ignore
                    }

                    if (artikelPreisliste != null) {

                        if (artikelPreisliste.getNArtikelfixpreis() != null) {
                            // zeile[5] =
                            // artikelPreisliste.getNArtikelfixpreis();
                            preisDto.setCalculatedPrice(artikelPreisliste.getNArtikelfixpreis());
                        } else {
                            // zeile[4] = artikelPreisliste
                            // .getNArtikelstandardrabattsatz()
                            // .doubleValue();
                            preisDto.setDiscountRate(
                                    artikelPreisliste.getNArtikelstandardrabattsatz().doubleValue());
                            if (preisBasis != null) {
                                BigDecimal p = getVkPreisfindungFac().berechneVerkaufspreis(preisBasis,
                                        artikelPreisliste.getNArtikelstandardrabattsatz().doubleValue()).nettopreis;
                                preisDto.setCalculatedPrice(p);
                                // zeile[5] = getVkPreisfindungFac()
                                // .berechneVerkaufspreis(
                                // preisBasis,
                                // artikelPreisliste
                                // .getNArtikelstandardrabattsatz()
                                // .doubleValue()).nettopreis;
                            } else {
                                // zeile[5] = new BigDecimal(0);
                                preisDto.setCalculatedPrice(BigDecimal.ZERO);
                            }
                        }

                    } else {
                        // zeile[5] = preisBasis;
                        preisDto.setCalculatedPrice(preisBasis);
                    }

                    // zeile[6] = kundeDto.getCWaehrung();
                    // zeile[7] = new Boolean(false);
                    // al.add(zeile);

                    preisDto.setCurrency(kundeDto.getCWaehrung());
                    preisDto.setSpecialCondition(false);
                    reportArtikel.getPrices().add(preisDto);

                    // Staffelpreis
                    VkpfMengenstaffelDto[] vkpfMengenstaffelDtos = getVkPreisfindungFac()
                            .vkpfMengenstaffelFindByArtikelIIdGueltigkeitsdatum(artikel_i_id, datGueltikeitsdatumI,
                                    kundeDto.getVkpfArtikelpreislisteIIdStdpreisliste(), theClientDto);
                    for (int i = 0; i < vkpfMengenstaffelDtos.length; i++) {
                        VkpfMengenstaffelDto vkpfMengenstaffelDto = vkpfMengenstaffelDtos[i];

                        if (vkpfMengenstaffelDto.getVkpfartikelpreislisteIId() == null
                                || vkpfMengenstaffelDto.getVkpfartikelpreislisteIId()
                                        .equals(kundeDto.getVkpfArtikelpreislisteIIdStdpreisliste())) {
                            BigDecimal preisBasisStaffel = getVkPreisfindungFac().ermittlePreisbasis(artikel_i_id,
                                    datGueltikeitsdatumI, vkpfMengenstaffelDto.getNMenge(),
                                    vkpfMengenstaffelDto.getVkpfartikelpreislisteIId(), kundeDto.getCWaehrung(),
                                    theClientDto);

                            CustomerPricelistPriceDto staffelpreisDto = new CustomerPricelistPriceDto(
                                    CustomerPricelistPriceDto.PREISTYP_VKSTAFFELPREIS, preisNachkommastellen);
                            staffelpreisDto.setAmount(vkpfMengenstaffelDto.getNMenge());
                            staffelpreisDto.setBasePrice(preisBasisStaffel);
                            // zeile = new Object[iAnzahlZeilenSubreport];
                            // zeile[0] = vkpfMengenstaffelDto.getNMenge();
                            // zeile[1] = "VK-Staffelpreis";
                            // zeile[2] = preisBasisStaffel;

                            String waehrung = theClientDto.getSMandantenwaehrung();

                            if (vkpfMengenstaffelDto.getVkpfartikelpreislisteIId() != null) {
                                waehrung = getVkPreisfindungFac()
                                        .vkpfartikelpreislisteFindByPrimaryKey(
                                                vkpfMengenstaffelDto.getVkpfartikelpreislisteIId())
                                        .getWaehrungCNr();
                            }

                            // zeile[5] = waehrung;

                            if (vkpfMengenstaffelDto.getNArtikelfixpreis() != null) {
                                // zeile[3] = vkpfMengenstaffelDto
                                // .getNArtikelfixpreis();
                                // zeile[5] = vkpfMengenstaffelDto
                                // .getNArtikelfixpreis();
                                // zeile[6] = waehrung;

                                staffelpreisDto.setFixPrice(vkpfMengenstaffelDto.getNArtikelfixpreis());
                                staffelpreisDto.setCalculatedPrice(vkpfMengenstaffelDto.getNArtikelfixpreis());
                                staffelpreisDto.setCurrency(waehrung);
                            } else {
                                // zeile[3] = null;
                                // zeile[4] = vkpfMengenstaffelDto
                                // .getFArtikelstandardrabattsatz();
                                // zeile[5] = getVkPreisfindungFac()
                                // .berechneVerkaufspreis(
                                // preisBasisStaffel,
                                // vkpfMengenstaffelDto
                                // .getFArtikelstandardrabattsatz()).nettopreis;
                                // zeile[6] = kundeDto.getCWaehrung();
                                // zeile[7] = new Boolean(false);

                                staffelpreisDto
                                        .setDiscountRate(vkpfMengenstaffelDto.getFArtikelstandardrabattsatz());
                                staffelpreisDto.setCalculatedPrice(
                                        getVkPreisfindungFac().berechneVerkaufspreis(preisBasisStaffel,
                                                vkpfMengenstaffelDto.getFArtikelstandardrabattsatz()).nettopreis);
                                staffelpreisDto.setCurrency(kundeDto.getCWaehrung());
                            }

                            // al.add(zeile);
                            reportArtikel.getPrices().add(staffelpreisDto);
                        }
                    }
                }

                // Soko Artikel
                KundesokoDto kundeSokoArtikel = getKundesokoFac()
                        .kundesokoFindByKundeIIdArtikelIIdGueltigkeitsdatumOhneExc(kundeIId, artikel_i_id,
                                datGueltikeitsdatumI);

                if (kundeSokoArtikel != null) {
                    // oZeile[REPORT_KUNDENPREISLISTE_ENTHAELT_SOKO] = new
                    // Boolean(
                    // true);
                    reportArtikel.setSpecialCondition(true);

                    KundesokomengenstaffelDto[] kundesokomengenstaffelDto = getKundesokoFac()
                            .kundesokomengenstaffelFindByKundesokoIIdInZielWaehrung(kundeSokoArtikel.getIId(),
                                    datGueltikeitsdatumI, kundeDto.getCWaehrung(), theClientDto);

                    for (int u = 0; u < kundesokomengenstaffelDto.length; u++) {

                        KundesokomengenstaffelDto kdsDto = kundesokomengenstaffelDto[u];

                        CustomerPricelistPriceDto sokopreisDto = new CustomerPricelistPriceDto(
                                CustomerPricelistPriceDto.PREISTYP_SOKOARTIKEL, preisNachkommastellen);
                        sokopreisDto.setSpecialCondition(true);
                        sokopreisDto.setBasePrice(preisBasis);
                        // Object[] zeile = new Object[iAnzahlZeilenSubreport];
                        // zeile[0] = kdsDto.getNMenge();
                        // zeile[1] = "Soko-Artikel";
                        // zeile[2] = preisBasis;

                        if (kdsDto.getNArtikelfixpreis() != null) {
                            // zeile[3] = kdsDto.getNArtikelfixpreis();
                            // zeile[5] = kdsDto.getNArtikelfixpreis();
                            sokopreisDto.setFixPrice(kdsDto.getNArtikelfixpreis());
                            sokopreisDto.setCalculatedPrice(kdsDto.getNArtikelfixpreis());
                        } else {
                            // zeile[4] =
                            // kdsDto.getFArtikelstandardrabattsatz();
                            sokopreisDto.setDiscountRate(kdsDto.getFArtikelstandardrabattsatz());

                            BigDecimal nPreisbasis = null;
                            if (iPreisbasis == 0 || iPreisbasis == 2) {

                                // WH 21.06.06 Es gilt die VK-Basis, die zu
                                // Beginn
                                // der Mengenstaffel gueltig ist
                                nPreisbasis = getVkPreisfindungFac().ermittlePreisbasis(artikel_i_id,
                                        datGueltikeitsdatumI, null, kundeDto.getCWaehrung(), theClientDto);
                            } else {
                                nPreisbasis = getVkPreisfindungFac().ermittlePreisbasis(artikel_i_id,
                                        datGueltikeitsdatumI, kundeDto.getVkpfArtikelpreislisteIIdStdpreisliste(),
                                        kundeDto.getCWaehrung(), theClientDto);
                            }

                            if (nPreisbasis != null) {
                                // zeile[6] = kundeDto.getCWaehrung();
                                // zeile[5] = getVkPreisfindungFac()
                                // .berechneVerkaufspreis(
                                // nPreisbasis,
                                // kdsDto.getFArtikelstandardrabattsatz()).nettopreis;
                                sokopreisDto.setCalculatedPrice(getVkPreisfindungFac().berechneVerkaufspreis(
                                        nPreisbasis, kdsDto.getFArtikelstandardrabattsatz()).nettopreis);
                            }
                        }

                        // zeile[6] = kundeDto.getCWaehrung();
                        sokopreisDto.setCurrency(kundeDto.getCWaehrung());
                        sokopreisDto.setAmount(kdsDto.getNMenge());

                        // al.add(zeile);
                        reportArtikel.getPrices().add(sokopreisDto);
                    }
                }

                // Soko Artikelgruppe
                if (artgruIId != null) {
                    KundesokoDto kundeSokoArtGru = getKundesokoFac()
                            .kundesokoFindByKundeIIdArtgruIIdGueltigkeitsdatumOhneExc(kundeIId, artgruIId,
                                    datGueltikeitsdatumI);
                    if (kundeSokoArtGru != null) {
                        KundesokomengenstaffelDto[] kundesokomengenstaffelDto = getKundesokoFac()
                                .kundesokomengenstaffelFindByKundesokoIIdInZielWaehrung(kundeSokoArtGru.getIId(),
                                        datGueltikeitsdatumI, kundeDto.getCWaehrung(), theClientDto);

                        for (int u = 0; u < kundesokomengenstaffelDto.length; u++) {

                            KundesokomengenstaffelDto kdsDto = kundesokomengenstaffelDto[u];

                            CustomerPricelistPriceDto sokopreisDto = new CustomerPricelistPriceDto(
                                    CustomerPricelistPriceDto.PREISTYP_SOKOARTIKELGRUPPE, preisNachkommastellen);
                            sokopreisDto.setSpecialCondition(true);
                            sokopreisDto.setAmount(kdsDto.getNMenge());
                            sokopreisDto.setBasePrice(preisBasis);
                            // Object[] zeile = new
                            // Object[iAnzahlZeilenSubreport];
                            // zeile[0] = kdsDto.getNMenge();
                            // zeile[1] = "Soko-Artikelgruppe";
                            // zeile[2] = preisBasis;

                            if (kdsDto.getNArtikelfixpreis() != null) {
                                sokopreisDto.setFixPrice(kdsDto.getNArtikelfixpreis());
                                sokopreisDto.setCalculatedPrice(kdsDto.getNArtikelfixpreis());
                                // zeile[3] = kdsDto.getNArtikelfixpreis();
                                // zeile[5] = kdsDto.getNArtikelfixpreis();
                            } else {
                                sokopreisDto.setDiscountRate(kdsDto.getFArtikelstandardrabattsatz());
                                // zeile[4] = kdsDto
                                // .getFArtikelstandardrabattsatz();

                                BigDecimal nPreisbasis = null;
                                if (iPreisbasis == 0 || iPreisbasis == 2) {

                                    // WH 21.06.06 Es gilt die VK-Basis, die
                                    // zu
                                    // Beginn
                                    // der Mengenstaffel gueltig ist
                                    nPreisbasis = getVkPreisfindungFac().ermittlePreisbasis(artikel_i_id,
                                            datGueltikeitsdatumI, null, kundeDto.getCWaehrung(), theClientDto);
                                } else {
                                    nPreisbasis = getVkPreisfindungFac().ermittlePreisbasis(artikel_i_id,
                                            datGueltikeitsdatumI,
                                            kundeDto.getVkpfArtikelpreislisteIIdStdpreisliste(),
                                            kundeDto.getCWaehrung(), theClientDto);
                                }

                                if (nPreisbasis != null) {
                                    sokopreisDto.setCalculatedPrice(getVkPreisfindungFac().berechneVerkaufspreis(
                                            nPreisbasis, kdsDto.getFArtikelstandardrabattsatz()).nettopreis);
                                    // zeile[5] = getVkPreisfindungFac()
                                    // .berechneVerkaufspreis(
                                    // nPreisbasis,
                                    // kdsDto.getFArtikelstandardrabattsatz()).nettopreis;
                                }
                            }

                            sokopreisDto.setCurrency(kundeDto.getCWaehrung());
                            // zeile[6] = kundeDto.getCWaehrung();

                            reportArtikel.getPrices().add(sokopreisDto);
                            // al.add(zeile);
                        }
                    }
                }

                // Object[][] dataSub = new
                // Object[al.size()][fieldnames.length];
                // dataSub = (Object[][]) al.toArray(dataSub);
                //
                // oZeile[REPORT_KUNDENPREISLISTE_SUBREPORT_PREISE] = new
                // LPDatenSubreport(
                // dataSub, fieldnames);
                // alDaten.add(oZeile);

                if (bMitArtikelbezeichnungenInMandantensprache) {
                    // Object[] oZeileMand = oZeile.clone();

                    Artikelspr artikelspr = em.find(Artikelspr.class,
                            new ArtikelsprPK(artikel_i_id, theClientDto.getLocUiAsString()));
                    CustomerPricelistItemDescriptionDto bezDto = new CustomerPricelistItemDescriptionDto();
                    if (artikelspr != null) {
                        bezDto.setName(artikelspr.getCBez());
                        bezDto.setShortName(artikelspr.getCKbez());
                        bezDto.setAdditionalName(artikelspr.getCZbez());
                        bezDto.setAdditionalName2(artikelspr.getCZbez2());
                        // oZeileMand[REPORT_KUNDENPREISLISTE_BEZEICHNUNG] =
                        // artikelspr
                        // .getCBez();
                        // oZeileMand[REPORT_KUNDENPREISLISTE_KURZBEZEICHNUNG] =
                        // artikelspr
                        // .getCKbez();
                        // oZeileMand[REPORT_KUNDENPREISLISTE_ZUSATZBEZEICHNUNG]
                        // = artikelspr
                        // .getCZbez();
                        // oZeileMand[REPORT_KUNDENPREISLISTE_ZUSATZBEZEICHNUNG2]
                        // = artikelspr
                        // .getCZbez2();
                        // } else {
                        // oZeileMand[REPORT_KUNDENPREISLISTE_BEZEICHNUNG] =
                        // null;
                        // oZeileMand[REPORT_KUNDENPREISLISTE_KURZBEZEICHNUNG] =
                        // null;
                        // oZeileMand[REPORT_KUNDENPREISLISTE_ZUSATZBEZEICHNUNG]
                        // = null;
                        // oZeileMand[REPORT_KUNDENPREISLISTE_ZUSATZBEZEICHNUNG2]
                        // = null;
                    }
                    reportArtikel.setClientDescriptionDto(bezDto);
                    // alDaten.add(oZeileMand);
                }

                if (!nurSonderkonditionen || (nurSonderkonditionen & reportArtikel.getSpecialCondition())) {
                    returnDto.getItems().add(reportArtikel);
                }
            }

            session.close();

            // Object[][] dataTemp = new Object[1][1];
            // data = (Object[][]) alDaten.toArray(dataTemp);
            // parameter.put("P_ARTIKELNRVON", artikelNrVon);
            // parameter.put("P_ARTIKELNRBIS", artikelNrBis);
            // parameter.put("P_MITVERSTECKTEN", new Boolean(bMitVersteckten));
            // parameter.put("P_NURSOKO", new Boolean(nurSonderkonditionen));
            // parameter.put("P_MITMANDANTENSPRACHE", new Boolean(
            // bMitArtikelbezeichnungenInMandantensprache));
            //
            // parameter.put("P_PREISGUELTIGKEIT", datGueltikeitsdatumI);

            returnDto.setItemRangeFrom(artikelNrVon);
            returnDto.setItemRangeTo(artikelNrBis);
            returnDto.setWithHidden(bMitVersteckten);
            returnDto.setOnlySpecialCondition(nurSonderkonditionen);
            returnDto.setWithClientLanguage(bMitArtikelbezeichnungenInMandantensprache);
            returnDto.setPriceValidityMs(datGueltikeitsdatumI.getTime());
        } catch (RemoteException e) {
            throwEJBExceptionLPRespectOld(e);
            // } catch(Throwable t) {
            // System.out.println("uups " + t.getMessage()) ;
        }
        // initJRDS(parameter, KundeReportFac.REPORT_MODUL,
        // KundeReportFac.REPORT_KUNDENPREISLISTE,
        // theClientDto.getMandant(), theClientDto.getLocUi(),
        // theClientDto);
        return returnDto;
    }

    @TransactionAttribute(TransactionAttributeType.NEVER)
    public JasperPrintLP printKundenpreisliste(Integer kundeIId, Integer artikelgruppeIId, Integer artikelklasseIId,
            boolean bMitGesperrten, String artikelNrVon, String artikelNrBis, boolean bMitVersteckten,
            java.sql.Date datGueltikeitsdatumI, boolean nurSonderkonditionen,
            boolean bMitArtikelbezeichnungenInMandantensprache, TheClientDto theClientDto) {
        boolean useOld = false;
        if (useOld) {
            return printKundenpreislisteOld(kundeIId, artikelgruppeIId, artikelklasseIId, bMitGesperrten,
                    artikelNrVon, artikelNrBis, bMitVersteckten, datGueltikeitsdatumI, nurSonderkonditionen,
                    bMitArtikelbezeichnungenInMandantensprache, theClientDto);
        }

        CustomerPricelistReportDto reportDto = printKundenpreislisteRaw(kundeIId, artikelgruppeIId,
                artikelklasseIId, bMitGesperrten, artikelNrVon, artikelNrBis, bMitVersteckten, datGueltikeitsdatumI,
                nurSonderkonditionen, bMitArtikelbezeichnungenInMandantensprache, false, theClientDto);

        setDataTransformer(new KundenpreislisteTransformer(reportDto));
        initJRDS(jasperPrintTransformer.transformParameter(), KundeReportFac.REPORT_MODUL,
                KundeReportFac.REPORT_KUNDENPREISLISTE, theClientDto.getMandant(), theClientDto.getLocUi(),
                theClientDto);
        return getReportPrint();
    }

    private JasperPrintLP printKundenpreislisteOld(Integer kundeIId, Integer artikelgruppeIId,
            Integer artikelklasseIId, boolean bMitInaktiven, String artikelNrVon, String artikelNrBis,
            boolean bMitVersteckten, java.sql.Date datGueltikeitsdatumI, boolean nurSonderkonditionen,
            boolean bMitArtikelbezeichnungenInMandantensprache, TheClientDto theClientDto) {
        useCase = KundeReportFac.UC_REPORT_KUNDE_KUNDENPREISLISTE;
        KundeDto kundeDto = getKundeFac().kundeFindByPrimaryKey(kundeIId, theClientDto);
        HashMap<String, Object> parameter = new HashMap<String, Object>();
        try {

            parameter.put("P_KUNDE", kundeDto.getPartnerDto().formatAnrede());

            if (artikelgruppeIId != null) {
                parameter.put("P_ARTIKELGRUPPE",
                        getArtikelFac().artgruFindByPrimaryKey(artikelgruppeIId, theClientDto).getCNr());
            }
            if (artikelklasseIId != null) {
                parameter.put("P_ARTIKELKLASSE",
                        getArtikelFac().artklaFindByPrimaryKey(artikelklasseIId, theClientDto).getCNr());
            }

            ParametermandantDto param = getParameterFac().getMandantparameter(theClientDto.getMandant(),
                    ParameterFac.KATEGORIE_KUNDEN, ParameterFac.PARAMETER_PREISBASIS_VERKAUF);

            int iPreisbasis = (Integer) param.getCWertAsObject();

            // Mwstsatz aus Artikel

            String sQuery = "SELECT artikelliste.i_id, artikelliste.c_nr, aspr.c_bez, aspr.c_kbez, aspr.c_zbez,aspr.c_zbez2,artikelliste.einheit_c_nr, gruppe.c_nr, klasse.c_nr, artikelliste.b_versteckt,artikelliste.mwstsatz_i_id, gruppe.i_id "
                    + " FROM FLRArtikelliste AS artikelliste"
                    + " LEFT OUTER JOIN artikelliste.flrartikelgruppe AS gruppe "
                    + " LEFT OUTER JOIN artikelliste.flrartikelklasse AS klasse "
                    + " LEFT OUTER JOIN artikelliste.artikelsprset AS aspr WHERE artikelliste.mandant_c_nr='"
                    + theClientDto.getMandant() + "' AND artikelliste.artikelart_c_nr NOT IN ('"
                    + ArtikelFac.ARTIKELART_HANDARTIKEL + "') ";

            if (artikelklasseIId != null) {
                sQuery += " AND klasse.i_id=" + artikelklasseIId.intValue();
            }
            if (artikelgruppeIId != null) {
                sQuery += " AND gruppe.i_id=" + artikelgruppeIId.intValue();
            }
            if (bMitVersteckten == false) {
                sQuery += " AND artikelliste.b_versteckt=0 ";
            }
            if (artikelNrVon != null) {
                sQuery += " AND artikelliste.c_nr >='" + artikelNrVon + "'";
            }
            if (artikelNrBis != null) {
                sQuery = sQuery + " AND artikelliste.c_nr <='" + artikelNrBis + "'";
            }

            sQuery += "ORDER BY artikelliste.c_nr";

            Session session = FLRSessionFactory.getFactory().openSession();
            Query inventurliste = session.createQuery(sQuery);

            session.enableFilter("filterLocale").setParameter("paramLocale",
                    kundeDto.getPartnerDto().getLocaleCNrKommunikation());

            List<?> resultList = inventurliste.list();

            Iterator<?> resultListIterator = resultList.iterator();

            ArrayList alDaten = new ArrayList();

            int row = 0;

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

                Integer artikel_i_id = (Integer) o[0];
                String artikelnummer = (String) o[1];
                String bezeichnung = (String) o[2];
                String kurzbezeichnung = (String) o[3];
                String zusatzbezeichnung = (String) o[4];
                String zusatzbezeichnung2 = (String) o[5];
                String einheit = (String) o[6];
                String gruppe = (String) o[7];
                String klasse = (String) o[8];
                Short versteckt = (Short) o[9];
                Integer mwstsatzIId = (Integer) o[10];
                Integer artgruIId = (Integer) o[11];

                Object[] oZeile = new Object[REPORT_KUNDENPREISLISTE_ANZAHL_SPALTEN];

                oZeile[REPORT_KUNDENPREISLISTE_ARTIKELNUMMER] = artikelnummer;
                oZeile[REPORT_KUNDENPREISLISTE_BEZEICHNUNG] = bezeichnung;
                oZeile[REPORT_KUNDENPREISLISTE_KURZBEZEICHNUNG] = kurzbezeichnung;
                oZeile[REPORT_KUNDENPREISLISTE_ZUSATZBEZEICHNUNG] = zusatzbezeichnung;
                oZeile[REPORT_KUNDENPREISLISTE_ZUSATZBEZEICHNUNG2] = zusatzbezeichnung2;
                oZeile[REPORT_KUNDENPREISLISTE_ARTIKELGRUPPE] = gruppe;
                oZeile[REPORT_KUNDENPREISLISTE_ARTIKELKLASSE] = klasse;
                oZeile[REPORT_KUNDENPREISLISTE_VERSTECKT] = Helper.short2Boolean(versteckt);
                oZeile[REPORT_KUNDENPREISLISTE_ENTHAELT_SOKO] = new Boolean(false);

                BigDecimal preisBasis = getVkPreisfindungFac().ermittlePreisbasis(artikel_i_id,
                        datGueltikeitsdatumI, null, kundeDto.getCWaehrung(), theClientDto);

                // Preisbasis fuer Menge =1 ist nun definiert

                int iAnzahlZeilenSubreport = 8;
                String[] fieldnames = new String[] { "Menge", "Basis", "BasisPreis", "Fixpreis", "Rabattsatz",
                        "BerechneterPreis", "Waehrung", "Soko" };

                ArrayList al = new ArrayList();

                if (nurSonderkonditionen == false) {

                    Object[] zeile = new Object[iAnzahlZeilenSubreport];
                    zeile[0] = null;
                    zeile[1] = "VK-Preisbasis";
                    zeile[2] = preisBasis;
                    zeile[3] = null;

                    VkPreisfindungPreislisteDto artikelPreisliste = null;

                    try {
                        artikelPreisliste = getVkPreisfindungFac().getAktuellePreislisteByArtikelIIdPreislisteIId(
                                artikel_i_id, kundeDto.getVkpfArtikelpreislisteIIdStdpreisliste(),
                                new Date(System.currentTimeMillis()), kundeDto.getCWaehrung(), theClientDto);
                    } catch (Throwable t) {
                        // ignore
                    }

                    if (artikelPreisliste != null) {

                        if (artikelPreisliste.getNArtikelfixpreis() != null) {
                            zeile[5] = artikelPreisliste.getNArtikelfixpreis();
                        } else {
                            zeile[4] = artikelPreisliste.getNArtikelstandardrabattsatz().doubleValue();

                            if (preisBasis != null) {

                                zeile[5] = getVkPreisfindungFac().berechneVerkaufspreis(preisBasis,
                                        artikelPreisliste.getNArtikelstandardrabattsatz().doubleValue()).nettopreis;
                            } else {
                                zeile[5] = new BigDecimal(0);
                            }
                        }

                    } else {

                        zeile[5] = preisBasis;
                    }

                    zeile[6] = kundeDto.getCWaehrung();
                    zeile[7] = new Boolean(false);

                    al.add(zeile);

                    // Staffelpreis
                    VkpfMengenstaffelDto[] vkpfMengenstaffelDtos = getVkPreisfindungFac()
                            .vkpfMengenstaffelFindByArtikelIIdGueltigkeitsdatum(artikel_i_id, datGueltikeitsdatumI,
                                    kundeDto.getVkpfArtikelpreislisteIIdStdpreisliste(), theClientDto);
                    for (int i = 0; i < vkpfMengenstaffelDtos.length; i++) {
                        VkpfMengenstaffelDto vkpfMengenstaffelDto = vkpfMengenstaffelDtos[i];

                        if (vkpfMengenstaffelDto.getVkpfartikelpreislisteIId() == null
                                || vkpfMengenstaffelDto.getVkpfartikelpreislisteIId()
                                        .equals(kundeDto.getVkpfArtikelpreislisteIIdStdpreisliste())) {
                            BigDecimal preisBasisStaffel = getVkPreisfindungFac().ermittlePreisbasis(artikel_i_id,
                                    datGueltikeitsdatumI, vkpfMengenstaffelDto.getNMenge(),
                                    vkpfMengenstaffelDto.getVkpfartikelpreislisteIId(), kundeDto.getCWaehrung(),
                                    theClientDto);

                            zeile = new Object[iAnzahlZeilenSubreport];
                            zeile[0] = vkpfMengenstaffelDto.getNMenge();
                            zeile[1] = "VK-Staffelpreis";
                            zeile[2] = preisBasisStaffel;

                            String waehrung = theClientDto.getSMandantenwaehrung();

                            if (vkpfMengenstaffelDto.getVkpfartikelpreislisteIId() != null) {
                                waehrung = getVkPreisfindungFac()
                                        .vkpfartikelpreislisteFindByPrimaryKey(
                                                vkpfMengenstaffelDto.getVkpfartikelpreislisteIId())
                                        .getWaehrungCNr();
                            }

                            zeile[5] = waehrung;
                            if (vkpfMengenstaffelDto.getNArtikelfixpreis() != null) {
                                zeile[3] = vkpfMengenstaffelDto.getNArtikelfixpreis();
                                zeile[5] = vkpfMengenstaffelDto.getNArtikelfixpreis();
                                zeile[6] = waehrung;

                            } else {

                                zeile[3] = null;
                                zeile[4] = vkpfMengenstaffelDto.getFArtikelstandardrabattsatz();
                                zeile[5] = getVkPreisfindungFac().berechneVerkaufspreis(preisBasisStaffel,
                                        vkpfMengenstaffelDto.getFArtikelstandardrabattsatz()).nettopreis;
                                zeile[6] = kundeDto.getCWaehrung();
                                zeile[7] = new Boolean(false);
                            }

                            al.add(zeile);
                        }

                    }

                }

                // Soko Artikel
                KundesokoDto kundeSokoArtikel = getKundesokoFac()
                        .kundesokoFindByKundeIIdArtikelIIdGueltigkeitsdatumOhneExc(kundeIId, artikel_i_id,
                                datGueltikeitsdatumI);

                if (kundeSokoArtikel != null) {
                    oZeile[REPORT_KUNDENPREISLISTE_ENTHAELT_SOKO] = new Boolean(true);
                    KundesokomengenstaffelDto[] kundesokomengenstaffelDto = getKundesokoFac()
                            .kundesokomengenstaffelFindByKundesokoIIdInZielWaehrung(kundeSokoArtikel.getIId(),
                                    datGueltikeitsdatumI, kundeDto.getCWaehrung(), theClientDto);

                    for (int u = 0; u < kundesokomengenstaffelDto.length; u++) {

                        KundesokomengenstaffelDto kdsDto = kundesokomengenstaffelDto[u];

                        Object[] zeile = new Object[iAnzahlZeilenSubreport];
                        zeile[0] = kdsDto.getNMenge();
                        zeile[1] = "Soko-Artikel";
                        zeile[2] = preisBasis;

                        if (kdsDto.getNArtikelfixpreis() != null) {
                            zeile[3] = kdsDto.getNArtikelfixpreis();
                            zeile[5] = kdsDto.getNArtikelfixpreis();
                        } else {
                            zeile[4] = kdsDto.getFArtikelstandardrabattsatz();

                            BigDecimal nPreisbasis = null;
                            if (iPreisbasis == 0 || iPreisbasis == 2) {

                                // WH 21.06.06 Es gilt die VK-Basis, die zu
                                // Beginn
                                // der Mengenstaffel gueltig ist
                                nPreisbasis = getVkPreisfindungFac().ermittlePreisbasis(artikel_i_id,
                                        datGueltikeitsdatumI, null, kundeDto.getCWaehrung(), theClientDto);
                            } else {
                                nPreisbasis = getVkPreisfindungFac().ermittlePreisbasis(artikel_i_id,
                                        datGueltikeitsdatumI, kundeDto.getVkpfArtikelpreislisteIIdStdpreisliste(),
                                        kundeDto.getCWaehrung(), theClientDto);
                            }

                            if (nPreisbasis != null) {
                                zeile[6] = kundeDto.getCWaehrung();
                                zeile[5] = getVkPreisfindungFac().berechneVerkaufspreis(nPreisbasis,
                                        kdsDto.getFArtikelstandardrabattsatz()).nettopreis;
                            }

                        }

                        zeile[6] = kundeDto.getCWaehrung();

                        al.add(zeile);
                    }

                    // Soko Artikelgruppe
                    if (artgruIId != null) {
                        KundesokoDto kundeSokoArtGru = getKundesokoFac()
                                .kundesokoFindByKundeIIdArtgruIIdGueltigkeitsdatumOhneExc(kundeIId, artgruIId,
                                        datGueltikeitsdatumI);

                        if (kundeSokoArtGru != null) {
                            kundesokomengenstaffelDto = getKundesokoFac()
                                    .kundesokomengenstaffelFindByKundesokoIIdInZielWaehrung(
                                            kundeSokoArtGru.getIId(), datGueltikeitsdatumI, kundeDto.getCWaehrung(),
                                            theClientDto);

                            for (int u = 0; u < kundesokomengenstaffelDto.length; u++) {

                                KundesokomengenstaffelDto kdsDto = kundesokomengenstaffelDto[u];

                                Object[] zeile = new Object[iAnzahlZeilenSubreport];
                                zeile[0] = kdsDto.getNMenge();
                                zeile[1] = "Soko-Artikelgruppe";
                                zeile[2] = preisBasis;

                                if (kdsDto.getNArtikelfixpreis() != null) {
                                    zeile[3] = kdsDto.getNArtikelfixpreis();
                                    zeile[5] = kdsDto.getNArtikelfixpreis();
                                } else {
                                    zeile[4] = kdsDto.getFArtikelstandardrabattsatz();

                                    BigDecimal nPreisbasis = null;
                                    if (iPreisbasis == 0 || iPreisbasis == 2) {

                                        // WH 21.06.06 Es gilt die VK-Basis, die
                                        // zu
                                        // Beginn
                                        // der Mengenstaffel gueltig ist
                                        nPreisbasis = getVkPreisfindungFac().ermittlePreisbasis(artikel_i_id,
                                                datGueltikeitsdatumI, null, kundeDto.getCWaehrung(), theClientDto);
                                    } else {
                                        nPreisbasis = getVkPreisfindungFac().ermittlePreisbasis(artikel_i_id,
                                                datGueltikeitsdatumI,
                                                kundeDto.getVkpfArtikelpreislisteIIdStdpreisliste(),
                                                kundeDto.getCWaehrung(), theClientDto);
                                    }

                                    if (nPreisbasis != null) {

                                        zeile[5] = getVkPreisfindungFac().berechneVerkaufspreis(nPreisbasis,
                                                kdsDto.getFArtikelstandardrabattsatz()).nettopreis;
                                    }

                                }

                                zeile[6] = kundeDto.getCWaehrung();

                                al.add(zeile);
                            }

                        }
                    }

                }
                Object[][] dataSub = new Object[al.size()][fieldnames.length];
                dataSub = (Object[][]) al.toArray(dataSub);

                oZeile[REPORT_KUNDENPREISLISTE_SUBREPORT_PREISE] = new LPDatenSubreport(dataSub, fieldnames);
                alDaten.add(oZeile);

                if (bMitArtikelbezeichnungenInMandantensprache) {
                    Object[] oZeileMand = oZeile.clone();

                    Artikelspr artikelspr = em.find(Artikelspr.class,
                            new ArtikelsprPK(artikel_i_id, theClientDto.getLocUiAsString()));
                    if (artikelspr != null) {
                        oZeileMand[REPORT_KUNDENPREISLISTE_BEZEICHNUNG] = artikelspr.getCBez();
                        oZeileMand[REPORT_KUNDENPREISLISTE_KURZBEZEICHNUNG] = artikelspr.getCKbez();
                        oZeileMand[REPORT_KUNDENPREISLISTE_ZUSATZBEZEICHNUNG] = artikelspr.getCZbez();
                        oZeileMand[REPORT_KUNDENPREISLISTE_ZUSATZBEZEICHNUNG2] = artikelspr.getCZbez2();
                    } else {
                        oZeileMand[REPORT_KUNDENPREISLISTE_BEZEICHNUNG] = null;
                        oZeileMand[REPORT_KUNDENPREISLISTE_KURZBEZEICHNUNG] = null;
                        oZeileMand[REPORT_KUNDENPREISLISTE_ZUSATZBEZEICHNUNG] = null;
                        oZeileMand[REPORT_KUNDENPREISLISTE_ZUSATZBEZEICHNUNG2] = null;
                    }

                    alDaten.add(oZeileMand);

                }

            }

            session.close();

            Object[][] dataTemp = new Object[1][1];
            data = (Object[][]) alDaten.toArray(dataTemp);
            parameter.put("P_ARTIKELNRVON", artikelNrVon);
            parameter.put("P_ARTIKELNRBIS", artikelNrBis);
            parameter.put("P_MITVERSTECKTEN", new Boolean(bMitVersteckten));
            parameter.put("P_NURSOKO", new Boolean(nurSonderkonditionen));
            parameter.put("P_MITMANDANTENSPRACHE", new Boolean(bMitArtikelbezeichnungenInMandantensprache));

            parameter.put("P_PREISGUELTIGKEIT", datGueltikeitsdatumI);
        } catch (RemoteException e) {
            throwEJBExceptionLPRespectOld(e);
        }
        initJRDS(parameter, KundeReportFac.REPORT_MODUL, KundeReportFac.REPORT_KUNDENPREISLISTE,
                theClientDto.getMandant(), theClientDto.getLocUi(), theClientDto);
        return getReportPrint();
    }

    @TransactionAttribute(TransactionAttributeType.NEVER)
    public JasperPrintLP printKundenliste(TheClientDto theClientDto, boolean bUmsatzNachStatistikadresse,
            boolean bMitVersteckten, boolean bMitInteressenten, boolean bMitAnsprechpartner,
            Integer kundeIIdSelektiert, int iProjektemitdrucken, String cPlz, Integer landIId, Integer brancheIId,
            Integer partnerklasseIId) {
        useCase = KundeReportFac.UC_REPORT_KUNDE_KUNDENLISTE;
        Session session = FLRSessionFactory.getFactory().openSession();

        org.hibernate.Criteria crit = session.createCriteria(FLRKunde.class);
        crit.createAlias(KundeFac.FLR_PARTNER, "p");
        crit.createAlias("p." + PartnerFac.FLR_PARTNER_FLRLANDPLZORT, "landplzort");
        crit.createAlias("landplzort.flrland", "land");
        if (kundeIIdSelektiert != null) {
            crit.add(Restrictions.eq("i_id", kundeIIdSelektiert));
        }

        if (cPlz != null) {
            crit.add(Restrictions.like("landplzort.c_plz", cPlz + "%"));
        }

        if (landIId != null) {
            crit.add(Restrictions.eq("land.i_id", landIId));
        }
        if (brancheIId != null) {
            crit.add(Restrictions.eq("p.branche_i_id", brancheIId));
        }
        if (partnerklasseIId != null) {
            crit.add(Restrictions.eq("p.partnerklasse_i_id", partnerklasseIId));
        }

        crit.add(Restrictions.eq("mandant_c_nr", theClientDto.getMandant()));
        crit.addOrder(Order.asc("p." + PartnerFac.FLR_PARTNER_NAME1NACHNAMEFIRMAZEILE1));
        if (bMitVersteckten == false) {
            crit.add(Restrictions.eq("p." + PartnerFac.FLR_PARTNER_VERSTECKT, Helper.boolean2Short(false)));
        }
        if (bMitInteressenten == false) {
            crit.add(Restrictions.eq(KundeFac.FLR_KUNDE_B_ISTINTERESSENT, Helper.boolean2Short(false)));
        }
        ArrayList<Object[]> daten = new ArrayList<Object[]>();
        List<?> list = crit.list();
        Iterator<?> resultListIterator = list.iterator();
        while (resultListIterator.hasNext()) {
            Object[] zeile = new Object[92];
            FLRKunde kunde = (FLRKunde) resultListIterator.next();

            try {
                KundeDto kundeDto = getKundeFac().kundeFindByPrimaryKey(kunde.getI_id(), theClientDto);
                zeile[REPORT_KUNDENLISTE_ABC] = kundeDto.getCAbc();
                zeile[REPORT_KUNDENLISTE_KUNDE_I_ID] = kundeDto.getIId();

                if (kundeDto.getPartnerDto().getLandIIdAbweichendesustland() != null) {
                    zeile[REPORT_KUNDENLISTE_ABW_UST_LAND] = getSystemFac()
                            .landFindByPrimaryKey(kundeDto.getPartnerDto().getLandIIdAbweichendesustland())
                            .getCLkz();
                }
                zeile[REPORT_KUNDENLISTE_ANREDE] = kundeDto.getPartnerDto().getAnredeCNr();

                if (kundeDto.getPartnerDto().getBrancheIId() != null) {
                    zeile[REPORT_KUNDENLISTE_BRANCHE] = getPartnerServicesFac()
                            .brancheFindByPrimaryKey(kundeDto.getPartnerDto().getBrancheIId(), theClientDto)
                            .getBezeichnung();
                }

                zeile[REPORT_KUNDENLISTE_CNAME1] = kundeDto.getPartnerDto().getCName1nachnamefirmazeile1();
                zeile[REPORT_KUNDENLISTE_CNAME2] = kundeDto.getPartnerDto().getCName2vornamefirmazeile2();
                zeile[REPORT_KUNDENLISTE_CNAME3] = kundeDto.getPartnerDto().getCName3vorname2abteilung();

                zeile[REPORT_KUNDENLISTE_BEMERKUNG] = kundeDto.getPartnerDto().getXBemerkung();

                zeile[REPORT_KUNDENLISTE_KUNDENNUMMER] = kundeDto.getIKundennummer();

                if (kundeDto.getIidErloeseKonto() != null) {
                    zeile[REPORT_KUNDENLISTE_ERLOESKONTO] = getFinanzFac()
                            .kontoFindByPrimaryKey(kundeDto.getIidErloeseKonto()).getCNr();
                }
                if (kunde.getFlrkonto() != null) {
                    zeile[REPORT_KUNDENLISTE_DEBITORENKONTO] = kunde.getFlrkonto().getC_nr();
                }

                zeile[REPORT_KUNDENLISTE_EMAIL] = kundeDto.getPartnerDto().getCEmail();

                zeile[REPORT_KUNDENLISTE_FAX] = kundeDto.getPartnerDto().getCFax();

                zeile[REPORT_KUNDENLISTE_HOMEPAGE] = kundeDto.getPartnerDto().getCHomepage();

                zeile[REPORT_KUNDENLISTE_TELEFON] = kundeDto.getPartnerDto().getCTelefon();

                zeile[REPORT_KUNDENLISTE_FIRMENBUCHNUMMER] = kundeDto.getPartnerDto().getCFirmenbuchnr();
                zeile[REPORT_KUNDENLISTE_GERICHTSSTAND] = kundeDto.getPartnerDto().getCGerichtsstand();
                zeile[REPORT_KUNDENLISTE_INTERESSENT] = kundeDto.getbIstinteressent();
                zeile[REPORT_KUNDENLISTE_KOMMUNIKATIONSSPRACHE] = kundeDto.getPartnerDto()
                        .getLocaleCNrKommunikation();

                if (kundeDto.getKostenstelleIId() != null) {
                    zeile[REPORT_KUNDENLISTE_KOSTENSTELLE] = getSystemFac()
                            .kostenstelleFindByPrimaryKey(kundeDto.getKostenstelleIId()).getCNr();
                }
                zeile[REPORT_KUNDENLISTE_KREDITLIMIT] = kundeDto.getNKreditlimit();
                zeile[REPORT_KUNDENLISTE_KURZBEZEICHNUNG] = kundeDto.getPartnerDto().getCKbez();
                if (kundeDto.getPartnerDto().getLandplzortDto() != null) {
                    zeile[REPORT_KUNDENLISTE_LAND] = kundeDto.getPartnerDto().getLandplzortDto().getLandDto()
                            .getCLkz();
                    zeile[REPORT_KUNDENLISTE_PLZ] = kundeDto.getPartnerDto().getLandplzortDto().getCPlz();
                    zeile[REPORT_KUNDENLISTE_ORT] = kundeDto.getPartnerDto().getLandplzortDto().getOrtDto()
                            .getCName();
                }
                if (kundeDto.getPartnerDto().getLandplzortDto_Postfach() != null) {
                    zeile[REPORT_KUNDENLISTE_LAND_POSTFACH] = kundeDto.getPartnerDto().getLandplzortDto_Postfach()
                            .getLandDto().getCLkz();
                    zeile[REPORT_KUNDENLISTE_PLZ_POSTFACH] = kundeDto.getPartnerDto().getLandplzortDto_Postfach()
                            .getCPlz();
                    zeile[REPORT_KUNDENLISTE_ORT_POSTFACH] = kundeDto.getPartnerDto().getLandplzortDto_Postfach()
                            .getOrtDto().getCName();
                }
                zeile[REPORT_KUNDENLISTE_POSTFACH] = kundeDto.getPartnerDto().getCPostfach();

                if (kundeDto.getTBonitaet() != null) {
                    zeile[REPORT_KUNDENLISTE_LETZTE_BONITAETSPRUEFUNG] = new java.sql.Timestamp(
                            kundeDto.getTBonitaet().getTime());
                }
                zeile[REPORT_KUNDENLISTE_LIEFERANTENNUMMER] = kundeDto.getCLieferantennr();
                zeile[REPORT_KUNDENLISTE_PARTNERART] = kundeDto.getPartnerDto().getPartnerartCNr();

                if (kundeDto.getPartnerDto().getPartnerklasseIId() != null) {
                    zeile[REPORT_KUNDENLISTE_PARTNERKLASSE] = getPartnerFac().partnerklasseFindByPrimaryKey(
                            kundeDto.getPartnerDto().getPartnerklasseIId(), theClientDto).getCNr();
                }
                zeile[REPORT_KUNDENLISTE_RABATT] = kundeDto.getFRabattsatz();
                zeile[REPORT_KUNDENLISTE_ZESSION] = kundeDto.getFZessionsfaktor();

                if (kundeDto.getPersonaliIdProvisionsempfaenger() != null) {
                    PersonalDto personalDto = getPersonalFac()
                            .personalFindByPrimaryKey(kundeDto.getPersonaliIdProvisionsempfaenger(), theClientDto);
                    zeile[REPORT_KUNDENLISTE_PROVISIONSEMPFAENGER] = personalDto.getPartnerDto()
                            .formatFixTitelName1Name2();
                }

                if (kundeDto.getPartnerRechnungsadresseDto() != null) {
                    zeile[REPORT_KUNDENLISTE_RECHNUNGSADRESSE_ANREDE] = kundeDto.getPartnerRechnungsadresseDto()
                            .getAnredeCNr();
                    zeile[REPORT_KUNDENLISTE_RECHNUNGSADRESSE_CNAME1] = kundeDto.getPartnerRechnungsadresseDto()
                            .getCName1nachnamefirmazeile1();
                    zeile[REPORT_KUNDENLISTE_RECHNUNGSADRESSE_CNAME2] = kundeDto.getPartnerRechnungsadresseDto()
                            .getCName2vornamefirmazeile2();
                    zeile[REPORT_KUNDENLISTE_RECHNUNGSADRESSE_CNAME3] = kundeDto.getPartnerRechnungsadresseDto()
                            .getCName3vorname2abteilung();
                    zeile[REPORT_KUNDENLISTE_RECHNUNGSADRESSE_KURZBEZEICHNUNG] = kundeDto
                            .getPartnerRechnungsadresseDto().getCKbez();
                    if (kundeDto.getPartnerRechnungsadresseDto().getLandplzortDto() != null) {
                        zeile[REPORT_KUNDENLISTE_RECHNUNGSADRESSE_LAND] = kundeDto.getPartnerRechnungsadresseDto()
                                .getLandplzortDto().getLandDto().getCName();
                        zeile[REPORT_KUNDENLISTE_RECHNUNGSADRESSE_PLZ] = kundeDto.getPartnerRechnungsadresseDto()
                                .getLandplzortDto().getCPlz();
                        zeile[REPORT_KUNDENLISTE_RECHNUNGSADRESSE_ORT] = kundeDto.getPartnerRechnungsadresseDto()
                                .getLandplzortDto().getOrtDto().getCName();
                    }
                    if (kundeDto.getPartnerRechnungsadresseDto().getLandplzortDto_Postfach() != null) {
                        zeile[REPORT_KUNDENLISTE_RECHNUNGSADRESSE_LAND_POSTFACH] = kundeDto
                                .getPartnerRechnungsadresseDto().getLandplzortDto_Postfach().getLandDto()
                                .getCName();
                        zeile[REPORT_KUNDENLISTE_RECHNUNGSADRESSE_PLZ_POSTFACH] = kundeDto
                                .getPartnerRechnungsadresseDto().getLandplzortDto_Postfach().getCPlz();
                        zeile[REPORT_KUNDENLISTE_RECHNUNGSADRESSE_ORT] = kundeDto.getPartnerRechnungsadresseDto()
                                .getLandplzortDto_Postfach().getOrtDto().getCName();
                    }
                    zeile[REPORT_KUNDENLISTE_RECHNUNGSADRESSE_POSTFACH] = kundeDto.getPartnerRechnungsadresseDto()
                            .getCPostfach();
                    zeile[REPORT_KUNDENLISTE_RECHNUNGSADRESSE_STRASSE] = kundeDto.getPartnerRechnungsadresseDto()
                            .getCStrasse();
                    zeile[REPORT_KUNDENLISTE_RECHNUNGSADRESSE_TITEL] = kundeDto.getPartnerRechnungsadresseDto()
                            .getCTitel();
                    zeile[REPORT_KUNDENLISTE_RECHNUNGSADRESSE_UIDNUMMER] = kundeDto.getPartnerRechnungsadresseDto()
                            .getCUid();

                }

                zeile[REPORT_KUNDENLISTE_STRASSE] = kundeDto.getPartnerDto().getCStrasse();
                zeile[REPORT_KUNDENLISTE_TITEL] = kundeDto.getPartnerDto().getCTitel();
                zeile[REPORT_KUNDENLISTE_UIDNUMMER] = kundeDto.getPartnerDto().getCUid();
                zeile[REPORT_KUNDENLISTE_WAEHRUNG] = kundeDto.getCWaehrung();

                if (kundeDto.getZahlungszielIId() != null) {
                    zeile[REPORT_KUNDENLISTE_ZAHLUNGSZIEL] = getMandantFac()
                            .zahlungszielFindByPrimaryKey(kundeDto.getZahlungszielIId(), theClientDto).getCBez();
                }

                if (kundeDto.getSpediteurIId() != null) {
                    zeile[REPORT_KUNDENLISTE_SPEDITEUR] = getMandantFac()
                            .spediteurFindByPrimaryKey(kundeDto.getSpediteurIId()).getCNamedesspediteurs();
                }
                if (kundeDto.getLieferartIId() != null) {
                    zeile[REPORT_KUNDENLISTE_LIEFERART] = getLocaleFac()
                            .lieferartFindByPrimaryKey(kundeDto.getLieferartIId(), theClientDto).formatBez();
                }
                if (kundeDto.getMwstsatzbezIId() != null) {
                    zeile[REPORT_KUNDENLISTE_MWSTSATZ] = getMandantFac()
                            .mwstsatzbezFindByPrimaryKey(kundeDto.getMwstsatzbezIId(), theClientDto)
                            .getCBezeichnung();
                }
                if (kundeDto.getVkpfArtikelpreislisteIIdStdpreisliste() != null) {
                    zeile[REPORT_KUNDENLISTE_PREISLISTE] = getVkPreisfindungFac()
                            .vkpfartikelpreislisteFindByPrimaryKey(
                                    kundeDto.getVkpfArtikelpreislisteIIdStdpreisliste())
                            .getCNr();
                }

                if (iProjektemitdrucken == REPORT_KUNDENLISTE_OPTION_PROJEKTEALLE
                        || iProjektemitdrucken == REPORT_KUNDENLISTE_OPTION_PROJEKTEOFFENE) {

                    if (iProjektemitdrucken == REPORT_KUNDENLISTE_OPTION_PROJEKTEALLE) {
                        zeile[REPORT_KUNDENLISTE_SUBREPORT_PROJEKTE] = getSubreportProjekte(
                                kundeDto.getPartnerIId(), false, theClientDto);
                    } else {
                        zeile[REPORT_KUNDENLISTE_SUBREPORT_PROJEKTE] = getSubreportProjekte(
                                kundeDto.getPartnerIId(), true, theClientDto);
                    }
                }

                zeile[REPORT_KUNDENLISTE_UMSATZ_HEUER] = getRechnungFac().getUmsatzVomKundenHeuer(theClientDto,
                        kundeDto.getIId(), bUmsatzNachStatistikadresse);
                zeile[REPORT_KUNDENLISTE_UMSATZ_VORJAHR] = getRechnungFac().getUmsatzVomKundenVorjahr(theClientDto,
                        kundeDto.getIId(), bUmsatzNachStatistikadresse);
                zeile[REPORT_KUNDENLISTE_ANZAHL_RECHNUNGEN_HEUER] = getRechnungFac()
                        .getAnzahlDerRechnungenVomKundenHeuer(theClientDto, kundeDto.getIId(),
                                bUmsatzNachStatistikadresse);
                zeile[REPORT_KUNDENLISTE_ANZAHL_RECHNUNGEN_VORJAHR] = getRechnungFac()
                        .getAnzahlDerRechnungenVomKundenVorjahr(theClientDto, kundeDto.getIId(),
                                bUmsatzNachStatistikadresse);

                // Selektionen
                Set<?> selektionen = kunde.getFlrpartner().getPartner_paselektion_set();
                Iterator<?> isSel = selektionen.iterator();
                if (isSel.hasNext() == true) {
                    FLRPASelektion selektion = (FLRPASelektion) isSel.next();
                    zeile[REPORT_KUNDENLISTE_SELEKTION01] = selektion.getFlrselektion().getC_nr();
                }
                if (isSel.hasNext() == true) {
                    FLRPASelektion selektion = (FLRPASelektion) isSel.next();
                    zeile[REPORT_KUNDENLISTE_SELEKTION02] = selektion.getFlrselektion().getC_nr();
                }
                if (isSel.hasNext() == true) {
                    FLRPASelektion selektion = (FLRPASelektion) isSel.next();
                    zeile[REPORT_KUNDENLISTE_SELEKTION03] = selektion.getFlrselektion().getC_nr();
                }
                if (isSel.hasNext() == true) {
                    FLRPASelektion selektion = (FLRPASelektion) isSel.next();
                    zeile[REPORT_KUNDENLISTE_SELEKTION04] = selektion.getFlrselektion().getC_nr();
                }
                if (isSel.hasNext() == true) {
                    FLRPASelektion selektion = (FLRPASelektion) isSel.next();
                    zeile[REPORT_KUNDENLISTE_SELEKTION05] = selektion.getFlrselektion().getC_nr();
                }
                if (isSel.hasNext() == true) {
                    FLRPASelektion selektion = (FLRPASelektion) isSel.next();
                    zeile[REPORT_KUNDENLISTE_SELEKTION06] = selektion.getFlrselektion().getC_nr();
                }
                if (isSel.hasNext() == true) {
                    FLRPASelektion selektion = (FLRPASelektion) isSel.next();
                    zeile[REPORT_KUNDENLISTE_SELEKTION07] = selektion.getFlrselektion().getC_nr();
                }
                if (isSel.hasNext() == true) {
                    FLRPASelektion selektion = (FLRPASelektion) isSel.next();
                    zeile[REPORT_KUNDENLISTE_SELEKTION08] = selektion.getFlrselektion().getC_nr();
                }
                if (isSel.hasNext() == true) {
                    FLRPASelektion selektion = (FLRPASelektion) isSel.next();
                    zeile[REPORT_KUNDENLISTE_SELEKTION09] = selektion.getFlrselektion().getC_nr();
                }
                if (isSel.hasNext() == true) {
                    FLRPASelektion selektion = (FLRPASelektion) isSel.next();
                    zeile[REPORT_KUNDENLISTE_SELEKTION10] = selektion.getFlrselektion().getC_nr();
                }
                if (isSel.hasNext() == true) {
                    FLRPASelektion selektion = (FLRPASelektion) isSel.next();
                    zeile[REPORT_KUNDENLISTE_SELEKTION11] = selektion.getFlrselektion().getC_nr();
                }
                if (isSel.hasNext() == true) {
                    FLRPASelektion selektion = (FLRPASelektion) isSel.next();
                    zeile[REPORT_KUNDENLISTE_SELEKTION12] = selektion.getFlrselektion().getC_nr();
                }
                if (isSel.hasNext() == true) {
                    FLRPASelektion selektion = (FLRPASelektion) isSel.next();
                    zeile[REPORT_KUNDENLISTE_SELEKTION13] = selektion.getFlrselektion().getC_nr();
                }
                if (isSel.hasNext() == true) {
                    FLRPASelektion selektion = (FLRPASelektion) isSel.next();
                    zeile[REPORT_KUNDENLISTE_SELEKTION14] = selektion.getFlrselektion().getC_nr();
                }
                if (isSel.hasNext() == true) {
                    FLRPASelektion selektion = (FLRPASelektion) isSel.next();
                    zeile[REPORT_KUNDENLISTE_SELEKTION15] = selektion.getFlrselektion().getC_nr();
                }

                Set<?> ansprechpartner = kunde.getFlrpartner().getAnsprechpartner();
                if (ansprechpartner.size() > 0) {

                    int z = 0;
                    Iterator<?> anspIt = ansprechpartner.iterator();
                    while (anspIt.hasNext()) {
                        z++;

                        if (z == 2) {
                            int u = 0;
                        }

                        Object[] oKopie = new Object[92];

                        for (int i = 0; i < 91; i++) {
                            oKopie[i] = zeile[i];
                        }

                        FLRAnsprechpartner flrAnsprechpartner = (FLRAnsprechpartner) anspIt.next();

                        oKopie[REPORT_KUNDENLISTE_ANSPRECHPARTNER_ANREDE] = flrAnsprechpartner
                                .getFlrpartneransprechpartner().getAnrede_c_nr();

                        oKopie[REPORT_KUNDENLISTE_ANSPRECHPARTNER_EMAIL] = flrAnsprechpartner.getC_email();

                        oKopie[REPORT_KUNDENLISTE_ANSPRECHPARTNER_FAXDW] = flrAnsprechpartner.getC_fax();

                        oKopie[REPORT_KUNDENLISTE_ANSPRECHPARTNER_MOBIL] = flrAnsprechpartner.getC_handy();

                        oKopie[REPORT_KUNDENLISTE_ANSPRECHPARTNER_BEMERKUNG] = flrAnsprechpartner.getX_bemerkung();

                        oKopie[REPORT_KUNDENLISTE_ANSPRECHPARTNER_NACHNAME] = flrAnsprechpartner
                                .getFlrpartneransprechpartner().getC_name1nachnamefirmazeile1();

                        oKopie[REPORT_KUNDENLISTE_ANSPRECHPARTNER_TELDW] = flrAnsprechpartner.getC_telefon();

                        oKopie[REPORT_KUNDENLISTE_ANSPRECHPARTNER_TITEL] = flrAnsprechpartner
                                .getFlrpartneransprechpartner().getC_titel();
                        oKopie[REPORT_KUNDENLISTE_ANSPRECHPARTNER_VORNAME] = flrAnsprechpartner
                                .getFlrpartneransprechpartner().getC_name2vornamefirmazeile2();

                        if (z == 1) {

                            daten.add(oKopie);
                        }

                        if (z > 1 && bMitAnsprechpartner == true) {
                            daten.add(oKopie);
                        }

                    }
                } else {
                    zeile[REPORT_KUNDENLISTE_BRIEFANREDE] = getPartnerServicesFac().getBriefanredeFuerBeleg(null,
                            kundeDto.getPartnerIId(), theClientDto.getLocUi(), theClientDto);
                    daten.add(zeile);
                }
            } catch (RemoteException ex) {
                throwEJBExceptionLPRespectOld(ex);
            }
        }
        HashMap<String, Object> parameter = new HashMap<String, Object>();

        parameter.put("P_MITANSPRECHPARTNER", new Boolean(bMitAnsprechpartner));

        // data = new Object[daten.size()][87];
        setData(new Object[daten.size()][87]);
        for (int i = 0; i < daten.size(); i++) {
            data[i] = (Object[]) daten.get(i);
        }

        initJRDS(parameter, KundeReportFac.REPORT_MODUL, KundeReportFac.REPORT_KUNDENLISTE,
                theClientDto.getMandant(), theClientDto.getLocUi(), theClientDto);
        return getReportPrint();
    }

    public Object[][] getDataLieferstatistik(TheClientDto theClientDto, Integer kundeIId, Integer artikelIId,
            Integer artikelgruppeIId, Date dVon, Date dBis, Integer iSortierung, String mandantCNr,
            boolean bMitTexteingaben, boolean bVerdichtetNachArtikel, boolean bEingeschraenkt, int iOptionAdrsse,
            boolean bRechnungsdatum) throws EJBExceptionLP {

        Object[][] data = null;
        SessionFactory factory = FLRSessionFactory.getFactory();
        Session session = null;
        try {
            FacadeBeauftragter fac = new FacadeBeauftragter();
            session = factory.openSession();

            String queryRechnung = " from FLRRechnungPosition rechpos  WHERE 1=1 ";

            if (bMitTexteingaben == true) {
                queryRechnung += " AND rechpos.positionsart_c_nr NOT IN ('" + LocaleFac.POSITIONSART_LIEFERSCHEIN
                        + "','" + LocaleFac.POSITIONSART_LEERZEILE + "')";
            } else {
                queryRechnung += " AND rechpos.positionsart_c_nr NOT IN ('" + LocaleFac.POSITIONSART_LIEFERSCHEIN
                        + "','" + LocaleFac.POSITIONSART_LEERZEILE + "','" + LocaleFac.POSITIONSART_TEXTEINGABE
                        + "')";

            }

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

            if (kundeIId != null) {
                if (iOptionAdrsse == REPORT_LIEFERSTATISTIK_OPTION_STATISTIKADRESSE) {
                    queryRechnung += " AND rechpos.flrrechnung.flrstatistikadresse.i_id=" + kundeIId;
                } else {
                    queryRechnung += " AND rechpos.flrrechnung.flrkunde.i_id=" + kundeIId;
                }
            }

            if (artikelIId != null) {
                queryRechnung += " AND rechpos.artikel_i_id=" + artikelIId + " ";
            }

            if (artikelgruppeIId != null) {
                queryRechnung += " AND rechpos.flrartikel.flrartikelgruppe.i_id=" + artikelgruppeIId + " ";
            }

            if (mandantCNr != null) {
                queryRechnung += " AND rechpos.flrrechnung.mandant_c_nr= '" + mandantCNr + "'";
            }

            if (dVon != null) {
                queryRechnung += " AND rechpos.flrrechnung.d_belegdatum>'"
                        + Helper.formatDateWithSlashes(Helper.cutDate(dVon)) + "'";
            }
            if (dBis != null) {
                queryRechnung += " AND rechpos.flrrechnung.d_belegdatum<'" + Helper.formatDateWithSlashes(dBis)
                        + "'";
            }

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

            Query qRechnung = session.createQuery(queryRechnung);

            if (bEingeschraenkt) {
                qRechnung.setMaxResults(50);
            }

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

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

            if (bMitTexteingaben == false) {
                queryLieferschein += " AND lspos.positionsart_c_nr NOT IN ('"
                        + LieferscheinpositionFac.LIEFERSCHEINPOSITIONSART_TEXTEINGABE + "')";
            }

            if (kundeIId != null) {
                if (iOptionAdrsse == REPORT_LIEFERSTATISTIK_OPTION_RECHNUNGSADRESSE) {
                    queryLieferschein += " AND lspos.flrlieferschein.kunde_i_id_rechnungsadresse=" + kundeIId;
                } else {
                    queryLieferschein += " AND lspos.flrlieferschein.kunde_i_id_lieferadresse=" + kundeIId;
                }
            }

            if (artikelIId != null) {
                queryLieferschein += " AND lspos.flrartikel.i_id=" + artikelIId + " ";
            }

            if (artikelgruppeIId != null) {
                queryLieferschein += " AND lspos.flrartikel.flrartikelgruppe.i_id=" + artikelgruppeIId + " ";
            }

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

            if (mandantCNr != null) {
                queryLieferschein += " AND lspos.flrlieferschein.mandant_c_nr= '" + mandantCNr + "'";
            }

            if (bRechnungsdatum == true) {

                queryLieferschein += " AND lspos.flrlieferschein.flrrechnung.i_id IS NOT NULL ";

                if (dVon != null) {

                    queryLieferschein += " AND lspos.flrlieferschein.flrrechnung.d_belegdatum>'"
                            + Helper.formatDateWithSlashes(dVon) + "'";
                }
                if (dBis != null) {
                    queryLieferschein += " AND lspos.flrlieferschein.flrrechnung.d_belegdatum<'"
                            + Helper.formatDateWithSlashes(dBis) + "'";
                }
            } else {
                if (dVon != null) {

                    queryLieferschein += " AND lspos.flrlieferschein.d_belegdatum>'"
                            + Helper.formatDateWithSlashes(dVon) + "'";
                }
                if (dBis != null) {
                    queryLieferschein += " AND lspos.flrlieferschein.d_belegdatum<'"
                            + Helper.formatDateWithSlashes(dBis) + "'";
                }
            }

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

            Query qLieferschein = session.createQuery(queryLieferschein);

            if (bEingeschraenkt) {
                qLieferschein.setMaxResults(50);
            }

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

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

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

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

                KundeLieferstatistikDto dto = new KundeLieferstatistikDto();

                if (rePos.getFlrverleih() != null) {
                    dto.setdVerleihfaktor(rePos.getFlrverleih().getF_faktor());
                    dto.setiVerleihtage(rePos.getFlrverleih().getI_tage());
                }

                String sRechnungsart = d.getRechnungartCNr();
                dto.setSWarenausgangverursacher(d.getRechnungartCNr());

                // Rechnungsnummer
                dto.setSRechnungsnummer(rePos.getFlrrechnung().getC_nr());
                // Lieferscheinnummer
                if (rePos.getFlrlieferschein() != null) {
                    dto.setSLieferscheinnummer(rePos.getFlrlieferschein().getC_nr());
                }
                // Mwstsatz
                if (rePos.getFlrmwstsatz() != null) {
                    dto.setNMwstsatz(
                            Helper.rundeKaufmaennisch(new BigDecimal(rePos.getFlrmwstsatz().getF_mwstsatz()), 2));
                }
                // Vertreter
                if (rePos.getFlrrechnung().getFlrvertreter() != null) {
                    dto.setSVertreter(rePos.getFlrrechnung().getFlrvertreter().getC_kurzzeichen());
                }
                // Provisionsempfaenger
                if (rePos.getFlrrechnung().getFlrkunde().getFlrpersonal() != null) {
                    dto.setSProvisionsempfaenger(
                            rePos.getFlrrechnung().getFlrkunde().getFlrpersonal().getC_kurzzeichen());
                }
                // Kunde + LAND + PLZ + ORT
                String kundenname = rePos.getFlrrechnung().getFlrkunde().getFlrpartner()
                        .getC_name1nachnamefirmazeile1();

                String firma2 = rePos.getFlrrechnung().getFlrkunde().getFlrpartner().getC_name2vornamefirmazeile2();

                if (firma2 != null) {
                    kundenname += " " + firma2;
                }
                dto.setSKundenname(kundenname);
                if (rePos.getFlrrechnung().getFlrkunde().getFlrpartner().getFlrlandplzort() != null) {
                    dto.setSLand(rePos.getFlrrechnung().getFlrkunde().getFlrpartner().getFlrlandplzort()
                            .getFlrland().getC_lkz());
                    dto.setSPlz(rePos.getFlrrechnung().getFlrkunde().getFlrpartner().getFlrlandplzort().getC_plz());
                    dto.setSOrt(rePos.getFlrrechnung().getFlrkunde().getFlrpartner().getFlrlandplzort().getFlrort()
                            .getC_name());
                }
                // Statistikadresse + LAND + PLZ + ORT
                String statistikadresse = rePos.getFlrrechnung().getFlrstatistikadresse().getFlrpartner()
                        .getC_name1nachnamefirmazeile1();

                String statistikadressefirma2 = rePos.getFlrrechnung().getFlrstatistikadresse().getFlrpartner()
                        .getC_name2vornamefirmazeile2();

                if (statistikadressefirma2 != null) {
                    statistikadresse += " " + statistikadressefirma2;
                }
                dto.setSStatistikadresse(statistikadresse);
                if (rePos.getFlrrechnung().getFlrstatistikadresse().getFlrpartner().getFlrlandplzort() != null) {
                    dto.setSLandStatistikadresse(rePos.getFlrrechnung().getFlrstatistikadresse().getFlrpartner()
                            .getFlrlandplzort().getFlrland().getC_lkz());
                    dto.setSPlzStatistikadresse(rePos.getFlrrechnung().getFlrstatistikadresse().getFlrpartner()
                            .getFlrlandplzort().getC_plz());
                    dto.setSOrtStatistikadresse(rePos.getFlrrechnung().getFlrstatistikadresse().getFlrpartner()
                            .getFlrlandplzort().getFlrort().getC_name());
                }

                // Datum
                dto.setDWarenausgangsdatum(new Timestamp(rePos.getFlrrechnung().getD_belegdatum().getTime()));
                // Ident

                if (rePos.getPositionsart_c_nr().equals(RechnungFac.POSITIONSART_RECHNUNG_IDENT)) {
                    if (Helper.short2boolean(rePos.getFlrartikel().getB_seriennrtragend())
                            || Helper.short2boolean(rePos.getFlrartikel().getB_chargennrtragend())) {
                        dto.setSnrs(getLagerFac().getAllSeriennrchargennrEinerBelegartposition(
                                LocaleFac.BELEGART_RECHNUNG, rePos.getI_id()));
                    }

                }

                if (rePos.getPositionsart_c_nr().equals(RechnungFac.POSITIONSART_RECHNUNG_IDENT)
                        || rePos.getPositionsart_c_nr().equals(RechnungFac.POSITIONSART_RECHNUNG_HANDEINGABE)) {
                    if (rePos.getFlrartikel() != null) {
                        if (rePos.getFlrartikel().getArtikelart_c_nr().equals(ArtikelFac.ARTIKELART_HANDARTIKEL)) {
                            dto.setSIdent(ArtikelFac.ARTIKELART_HANDARTIKEL.trim());
                        } else {
                            dto.setSIdent(rePos.getFlrartikel().getC_nr());
                        }
                    }
                } else if (rePos.getPositionsart_c_nr().equals(RechnungFac.POSITIONSART_RECHNUNG_TEXTEINGABE)) {
                    dto.setSBezeichnung(rePos.getX_textinhalt());
                }

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

                    dto.setSSetartikelTyp(ArtikelFac.SETARTIKEL_TYP_POSITION);

                } else {
                    if (rePos.getSetartikel_set().size() > 0) {
                        dto.setSSetartikelTyp(ArtikelFac.SETARTIKEL_TYP_KOPF);
                    }
                }

                if (!rePos.getPositionsart_c_nr().equals(RechnungFac.POSITIONSART_RECHNUNG_TEXTEINGABE)) {
                    if (rePos.getFlrartikel() != null) {
                        ArtikelDto artikelDto = fac.getArtikelFac()
                                .artikelFindByPrimaryKeySmall(rePos.getFlrartikel().getI_id(), theClientDto);

                        if (rePos.getC_bez() == null) {
                            dto.setSBezeichnung(artikelDto.formatBezeichnung());
                        } else {
                            dto.setSBezeichnung(rePos.getC_bez());
                        }
                        BigDecimal bMenge = rePos.getN_menge();
                        dto.setNMenge(sRechnungsart.equals(RechnungFac.RECHNUNGART_GUTSCHRIFT) ? bMenge.negate()
                                : bMenge);

                        dto.setNMaterialzuschlag(rePos.getN_materialzuschlag());

                        if (rePos.getFlrrechnung().getN_kurs().doubleValue() != 0
                                && rePos.getN_nettoeinzelpreis() != null) {
                            dto.setNPreis(rePos.getN_nettoeinzelpreis().divide(rePos.getFlrrechnung().getN_kurs(),
                                    4, BigDecimal.ROUND_HALF_EVEN));
                        } else {
                            dto.setNPreis(new BigDecimal(0));
                        }
                        if (rePos.getFlrartikel().getFlrartikelgruppe() != null) {
                            dto.setSArtikelgruppe(rePos.getFlrartikel().getFlrartikelgruppe().getC_nr());
                            if (rePos.getFlrartikel().getFlrartikelgruppe().getFlrkonto() != null) {
                                dto.setSKonto(rePos.getFlrartikel().getFlrartikelgruppe().getFlrkonto().getC_nr());
                            }
                        }
                        if (rePos.getFlrartikel().getFlrartikelklasse() != null) {
                            dto.setSArtikelklasse(rePos.getFlrartikel().getFlrartikelklasse().getC_nr());
                        }
                    } else {
                        dto.setSBezeichnung(rePos.getC_bez());
                    }
                }

                if (bVerdichtetNachArtikel) {
                    boolean bGefunden = false;
                    for (int j = 0; j < cResult.size(); j++) {
                        KundeLieferstatistikDto temp = (KundeLieferstatistikDto) cResult.get(j);
                        if (temp.getSIdent().equals(dto.getSIdent())) {
                            if (dto.getNMenge() != null && temp.getNMenge() != null) {
                                BigDecimal mengeNeu = dto.getNMenge().add(temp.getNMenge());

                                BigDecimal wertAlt = temp.getNPreis().multiply(temp.getNMenge());
                                BigDecimal wertNeu = dto.getNPreis().multiply(dto.getNMenge());

                                BigDecimal preisNeu = dto.getNPreis();
                                if (mengeNeu.doubleValue() != 0) {
                                    preisNeu = wertNeu.add(wertAlt).divide(mengeNeu, BigDecimal.ROUND_HALF_EVEN);
                                }
                                temp.setNMenge(mengeNeu);
                                temp.setNPreis(preisNeu);

                                temp.setSnrs(SeriennrChargennrMitMengeDto.add2SnrChnrDtos(temp.getSnrs(),
                                        dto.getSnrs()));

                                temp.setDWarenausgangsdatum(null);
                                temp.setSLieferscheinnummer(null);
                                temp.setSRechnungsnummer(null);
                                cResult.set(j, temp);
                                bGefunden = true;
                                break;
                            }

                        }
                    }
                    if (bGefunden == false) {
                        cResult.add(dto);
                    }
                } else {
                    cResult.add(dto);
                }

            }
            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());
                }

                // Rechnungsnummer
                if (lsPos.getFlrlieferschein().getFlrrechnung() != null) {
                    dto.setSRechnungsnummer(lsPos.getFlrlieferschein().getFlrrechnung().getC_nr());
                }
                // Lieferscheinnummer
                if (lsPos.getFlrlieferschein() != null) {
                    dto.setSLieferscheinnummer(lsPos.getFlrlieferschein().getC_nr());
                }
                // Mwstsatz
                if (lsPos.getFlrmwstsatz() != null) {
                    dto.setNMwstsatz(
                            Helper.rundeKaufmaennisch(new BigDecimal(lsPos.getFlrmwstsatz().getF_mwstsatz()), 2));
                }
                // Kunde + LAND + PLZ + ORT
                String kundenname = lsPos.getFlrlieferschein().getFlrkunde().getFlrpartner()
                        .getC_name1nachnamefirmazeile1();

                String firma2 = lsPos.getFlrlieferschein().getFlrkunde().getFlrpartner()
                        .getC_name2vornamefirmazeile2();

                if (firma2 != null) {
                    kundenname += " " + firma2;
                }
                dto.setSKundenname(kundenname);
                if (lsPos.getFlrlieferschein().getFlrkunde().getFlrpartner().getFlrlandplzort() != null) {
                    dto.setSLand(lsPos.getFlrlieferschein().getFlrkunde().getFlrpartner().getFlrlandplzort()
                            .getFlrland().getC_lkz());
                    dto.setSPlz(
                            lsPos.getFlrlieferschein().getFlrkunde().getFlrpartner().getFlrlandplzort().getC_plz());
                    dto.setSOrt(lsPos.getFlrlieferschein().getFlrkunde().getFlrpartner().getFlrlandplzort()
                            .getFlrort().getC_name());
                }
                // Vertreter
                if (lsPos.getFlrlieferschein().getFlrvertreter() != null) {
                    dto.setSVertreter(lsPos.getFlrlieferschein().getFlrvertreter().getC_kurzzeichen());
                }
                // Provisionsempfaenger
                if (lsPos.getFlrlieferschein().getFlrkunde().getFlrpersonal() != null) {
                    dto.setSProvisionsempfaenger(
                            lsPos.getFlrlieferschein().getFlrkunde().getFlrpersonal().getC_kurzzeichen());
                }
                // Datum
                if (bRechnungsdatum == true) {
                    dto.setDWarenausgangsdatum(lsPos.getFlrlieferschein().getFlrrechnung().getD_belegdatum());
                } else {
                    dto.setDWarenausgangsdatum(lsPos.getFlrlieferschein().getD_belegdatum());
                }
                // Ident
                if (lsPos.getFlrartikel() != null) {
                    if (lsPos.getFlrartikel().getArtikelart_c_nr().equals(ArtikelFac.ARTIKELART_HANDARTIKEL)) {
                        dto.setSIdent(ArtikelFac.ARTIKELART_HANDARTIKEL.trim());
                    } else {
                        dto.setSIdent(lsPos.getFlrartikel().getC_nr());
                    }
                }
                dto.setNMenge(lsPos.getN_menge());

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

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

                dto.setNPreis(lsPos.getN_nettogesamtpreis());
                dto.setNMaterialzuschlag(lsPos.getN_materialzuschlag());

                if (lsPos.getPositionsart_c_nr().equals(RechnungFac.POSITIONSART_RECHNUNG_IDENT)) {
                    dto.setSnrs(getLagerFac().getAllSeriennrchargennrEinerBelegartposition(
                            LocaleFac.BELEGART_LIEFERSCHEIN, lsPos.getI_id()));

                }

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

                    dto.setSSetartikelTyp(ArtikelFac.SETARTIKEL_TYP_POSITION);

                } else {

                    if (lsPos.getSetartikel_set().size() > 0) {
                        dto.setSSetartikelTyp(ArtikelFac.SETARTIKEL_TYP_KOPF);
                    }

                }

                if (lsPos.getPositionsart_c_nr().equals(LieferscheinpositionFac.LIEFERSCHEINPOSITIONSART_IDENT)
                        || lsPos.getPositionsart_c_nr()
                                .equals(LieferscheinpositionFac.LIEFERSCHEINPOSITIONSART_HANDEINGABE)) {
                    if (lsPos.getFlrartikel() != null) {
                        ArtikelDto artikelDto = fac.getArtikelFac()
                                .artikelFindByPrimaryKeySmall(lsPos.getFlrartikel().getI_id(), theClientDto);

                        if (Helper.short2boolean(lsPos.getB_artikelbezeichnunguebersteuert())) {
                            dto.setSBezeichnung(lsPos.getC_bez());
                        } else {
                            dto.setSBezeichnung(artikelDto.formatBezeichnung());
                        }

                        if (lsPos.getFlrartikel().getFlrartikelgruppe() != null) {
                            dto.setSArtikelgruppe(lsPos.getFlrartikel().getFlrartikelgruppe().getC_nr());
                            if (lsPos.getFlrartikel().getFlrartikelgruppe().getFlrkonto() != null) {
                                dto.setSKonto(lsPos.getFlrartikel().getFlrartikelgruppe().getFlrkonto().getC_nr());
                            }
                        }
                        if (lsPos.getFlrartikel().getFlrartikelklasse() != null) {
                            dto.setSArtikelklasse(lsPos.getFlrartikel().getFlrartikelklasse().getC_nr());
                        }

                    } else {
                        dto.setSBezeichnung(lsPos.getC_bez());
                    }
                } else if (lsPos.getPositionsart_c_nr()
                        .equals(LieferscheinpositionFac.LIEFERSCHEINPOSITIONSART_TEXTEINGABE)) {
                    dto.setSBezeichnung(lsPos.getC_textinhalt());
                }

                if (bVerdichtetNachArtikel) {
                    boolean bGefunden = false;
                    for (int j = 0; j < cResult.size(); j++) {
                        KundeLieferstatistikDto temp = (KundeLieferstatistikDto) cResult.get(j);
                        if (temp.getSIdent().equals(dto.getSIdent())) {
                            if (dto.getNMenge() != null && temp.getNMenge() != null) {
                                BigDecimal mengeNeu = dto.getNMenge().add(temp.getNMenge());

                                BigDecimal wertAlt = temp.getNPreis().multiply(temp.getNMenge());
                                BigDecimal wertNeu = dto.getNPreis().multiply(dto.getNMenge());

                                BigDecimal preisNeu = dto.getNPreis();
                                if (mengeNeu.doubleValue() != 0) {
                                    preisNeu = wertNeu.add(wertAlt).divide(mengeNeu, BigDecimal.ROUND_HALF_EVEN);
                                }
                                temp.setNMenge(mengeNeu);
                                temp.setNPreis(preisNeu);

                                temp.setSnrs(SeriennrChargennrMitMengeDto.add2SnrChnrDtos(temp.getSnrs(),
                                        dto.getSnrs()));

                                temp.setDWarenausgangsdatum(null);
                                temp.setSLieferscheinnummer(null);
                                temp.setSRechnungsnummer(null);
                                cResult.set(j, temp);
                                bGefunden = true;
                                break;
                            }
                        }
                    }
                    if (bGefunden == false) {
                        cResult.add(dto);
                    }
                } else {
                    cResult.add(dto);
                }

            }
            int row = 0;

            // Datenarray erzeugen
            data = new Object[cResult.size()][REPORT_STATISTIK_ANZAHL_FELDER];

            Collections.sort(cResult, new ComparatorKD(iSortierung.intValue()));

            if (bEingeschraenkt) {
                while (cResult.size() > 50) {
                    cResult.remove(cResult.size() - 1);
                }
            }

            for (Iterator<KundeLieferstatistikDto> iter = cResult.iterator(); iter.hasNext();) {
                KundeLieferstatistikDto dto = (KundeLieferstatistikDto) iter.next();
                data[row][REPORT_STATISTIK_RE_OR_GS] = dto.getSWarenausgangverursacher();
                data[row][REPORT_STATISTIK_BEZEICHNUNG] = dto.getSBezeichnung();
                data[row][REPORT_STATISTIK_DATUM] = dto.getDWarenausgangsdatum();
                data[row][REPORT_STATISTIK_IDENT] = dto.getSIdent();
                data[row][REPORT_STATISTIK_LIEFERSCHEINNUMMER] = dto.getSLieferscheinnummer();
                data[row][REPORT_STATISTIK_MENGE] = dto.getNMenge();
                data[row][REPORT_STATISTIK_PREIS] = dto.getNPreis();
                data[row][REPORT_STATISTIK_MATERIALZUSCHLAG] = dto.getNMaterialzuschlag();
                data[row][REPORT_STATISTIK_RECHNUNGSNUMMER] = dto.getSRechnungsnummer();
                data[row][REPORT_STATISTIK_SERIENNUMMER] = SeriennrChargennrMitMengeDto
                        .erstelleStringAusMehrerenSeriennummern(dto.getSnrs());
                data[row][REPORT_STATISTIK_LAND] = dto.getSLand();
                data[row][REPORT_STATISTIK_STATISTIKADRESSE] = dto.getSStatistikadresse();
                data[row][REPORT_STATISTIK_VERTRETER] = dto.getSVertreter();
                data[row][REPORT_STATISTIK_PROVISIONSEMPFAENGER] = dto.getSProvisionsempfaenger();
                data[row][REPORT_STATISTIK_PLZ] = dto.getSPlz();
                data[row][REPORT_STATISTIK_MWSTSATZ] = dto.getNMwstsatz();
                data[row][REPORT_STATISTIK_KUNDENNAME] = dto.getSKundenname();
                data[row][REPORT_STATISTIK_KONTO] = dto.getSKonto();
                data[row][REPORT_STATISTIK_ARTIKELGRUPPE] = dto.getSArtikelgruppe();
                data[row][REPORT_STATISTIK_ARTIKELKLASSE] = dto.getSArtikelklasse();
                data[row][REPORT_STATISTIK_SETARTIKEL_TYP] = dto.getSSetartikelTyp();

                data[row][REPORT_STATISTIK_ORT] = dto.getSOrt();
                data[row][REPORT_STATISTIK_ORT_STATISTIKADRESSE] = dto.getSOrtStatistikadresse();
                data[row][REPORT_STATISTIK_PLZ_STATISTIKADRESSE] = dto.getSPlzStatistikadresse();
                data[row][REPORT_STATISTIK_LAND_STATISTIKADRESSE] = dto.getSLandStatistikadresse();
                data[row][REPORT_STATISTIK_VERLEIHFAKTOR] = dto.getdVerleihfaktor();
                data[row][REPORT_STATISTIK_VERLEIHTAGE] = dto.getiVerleihtage();

                row++;
            }
            row++;
        } catch (RemoteException ex) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER, ex);
        } finally {
            try {
                session.close();
            } catch (HibernateException he) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER, he);
            }
        }
        return data;
    }

    @TransactionAttribute(TransactionAttributeType.NEVER)
    public JasperPrintLP printLieferStatistik(TheClientDto theClientDto, Integer iIdkundeI, Integer artikelIId,
            Integer artikelgruppeIId, Date dVonI, Date dBisI, Integer iSortierungI, boolean bMitTexteingaben,
            boolean bVerdichtetNachArtikel, boolean bEingeschraenkt, boolean bMonatsstatistik, int iOptionAdresse,
            boolean bRechnungsdatum) {

        long t = System.currentTimeMillis();
        myLogger.logData("KD>Lieferstatistik serverentrytime 0: " + t);
        myLogger.logData("KD>Lieferstatistik 1: 0");

        useCase = KundeReportFac.UC_REPORT_KUNDE_LIEFERSTATISTIK;

        if (bMonatsstatistik == true) {
            iSortierungI = Helper.SORTIERUNG_NACH_DATUM;
        }

        // Daten erzeugen
        // data = getDataLieferstatistik(theClientDto, iIdkundeI, artikelIId,
        // artikelgruppeIId, dVonI, dBisI, iSortierungI,
        // theClientDto.getMandant(), bMitTexteingaben,
        // bVerdichtetNachArtikel, bEingeschraenkt, iOptionAdresse,
        // bRechnungsdatum);
        setData(getDataLieferstatistik(theClientDto, iIdkundeI, artikelIId, artikelgruppeIId, dVonI, dBisI,
                iSortierungI, theClientDto.getMandant(), bMitTexteingaben, bVerdichtetNachArtikel, bEingeschraenkt,
                iOptionAdresse, bRechnungsdatum));

        String report = PartnerReportFac.REPORT_KUNDE_LIEFERSTATISTIK;

        if (bMonatsstatistik == true && data.length > 0) {

            ArrayList alMonate = new ArrayList();
            useCase = KundeReportFac.UC_REPORT_KUNDE_MONATSSTATISTIK;
            report = PartnerReportFac.REPORT_KUNDE_MONATSSTATISTIK;

            java.text.DateFormatSymbols symbols = new java.text.DateFormatSymbols(theClientDto.getLocUi());
            String[] defaultMonths = symbols.getMonths();

            Calendar cAktuell = Calendar.getInstance();
            cAktuell.setTimeInMillis(((Timestamp) data[data.length - 1][REPORT_STATISTIK_DATUM]).getTime());

            while (cAktuell.getTimeInMillis() <= ((Timestamp) data[0][REPORT_STATISTIK_DATUM]).getTime()) {
                BigDecimal menge = new BigDecimal(0);
                BigDecimal wert = new BigDecimal(0);
                for (int i = 0; i < data.length; i++) {
                    Object[] zeile = data[i];
                    java.util.Date d = (java.util.Date) zeile[REPORT_STATISTIK_DATUM];

                    Calendar cZeile = Calendar.getInstance();
                    cZeile.setTimeInMillis(d.getTime());

                    if (cAktuell.get(Calendar.MONTH) == cZeile.get(Calendar.MONTH)
                            && cAktuell.get(Calendar.YEAR) == cZeile.get(Calendar.YEAR)) {
                        BigDecimal mengeZeile = (BigDecimal) zeile[REPORT_STATISTIK_MENGE];
                        BigDecimal preisZeile = (BigDecimal) zeile[REPORT_STATISTIK_PREIS];
                        if (mengeZeile != null && preisZeile != null) {
                            menge = menge.add(mengeZeile);
                            wert = wert.add(mengeZeile.multiply(preisZeile));
                        }
                    }

                }

                Object[] zeileMonate = new Object[KundeReportFac.REPORT_MONATSSTATISTIK_ANZAHL_FELDER];
                zeileMonate[REPORT_MONATSSTATISTIK_MONAT] = defaultMonths[cAktuell.get(Calendar.MONTH)];
                zeileMonate[REPORT_MONATSSTATISTIK_JAHR] = cAktuell.get(Calendar.YEAR);
                zeileMonate[REPORT_MONATSSTATISTIK_MENGE] = menge;
                zeileMonate[REPORT_MONATSSTATISTIK_WERT] = wert;
                alMonate.add(zeileMonate);
                cAktuell.set(Calendar.MONTH, cAktuell.get(Calendar.MONTH) + 1);
            }

            Object[][] dataTemp = new Object[1][1];
            // data = (Object[][]) alMonate.toArray(dataTemp);
            setData((Object[][]) alMonate.toArray(dataTemp));
        }

        JasperPrintLP print = null;
        HashMap<String, Object> parameter = null;
        try {
            KundeDto kundeDto = getKundeFac().kundeFindByPrimaryKey(iIdkundeI, theClientDto);
            summePreis = new BigDecimal(0);
            parameter = new HashMap<String, Object>();
            parameter.put("P_KUNDE_NAME", kundeDto.getPartnerDto().formatTitelAnrede());
            parameter.put("P_KUNDE_ANSCHRIFT", kundeDto.getPartnerDto().formatLKZPLZOrt());

            if (artikelIId != null) {
                parameter.put("P_ARTIKEL", getArtikelFac().artikelFindByPrimaryKeySmall(artikelIId, theClientDto)
                        .formatArtikelbezeichnung());
            }
            if (artikelgruppeIId != null) {
                parameter.put("P_ARTIKELGRUPPE",
                        getArtikelFac().artgruFindByPrimaryKey(artikelgruppeIId, theClientDto).getBezeichnung());
            }
            parameter.put("P_VON", dVonI);
            parameter.put("P_BIS", dBisI);
            if (Helper.SORTIERUNG_NACH_IDENT == iSortierungI) {
                parameter.put("P_SORTIERUNG",
                        getTextRespectUISpr("lp.artikel", theClientDto.getMandant(), theClientDto.getLocUi()));
            } else {
                parameter.put("P_SORTIERUNG",
                        getTextRespectUISpr("lp.datum", theClientDto.getMandant(), theClientDto.getLocUi()));
            }
            parameter.put("P_VERDICHTET", new Boolean(bVerdichtetNachArtikel));
            parameter.put("P_EINGESCHRAENKT", new Boolean(bEingeschraenkt));
            if (iOptionAdresse == REPORT_LIEFERSTATISTIK_OPTION_STATISTIKADRESSE) {
                parameter.put("P_ADRESSE", getTextRespectUISpr("rech.statistikadresse", theClientDto.getMandant(),
                        theClientDto.getLocUi()));
            } else if (iOptionAdresse == REPORT_LIEFERSTATISTIK_OPTION_LIEFERADRESSE) {
                parameter.put("P_ADRESSE", getTextRespectUISpr("lsch.lieferadreesse", theClientDto.getMandant(),
                        theClientDto.getLocUi()));
            } else if (iOptionAdresse == REPORT_LIEFERSTATISTIK_OPTION_RECHNUNGSADRESSE) {
                parameter.put("P_ADRESSE", getTextRespectUISpr("lp.rechnungsadresse", theClientDto.getMandant(),
                        theClientDto.getLocUi()));
            }

            initJRDS(parameter, PartnerReportFac.REPORT_MODUL, report, theClientDto.getMandant(),
                    theClientDto.getLocUi(), theClientDto);
            print = getReportPrint();
        } catch (Exception ex) {
            throw new EJBExceptionLP(ex);
        }

        myLogger.logData("KD>Lieferstatistik 2: " + (System.currentTimeMillis() - t));
        t = System.currentTimeMillis();
        return print;
    }

    @TransactionAttribute(TransactionAttributeType.NEVER)
    public JasperPrintLP printKundenstammblatt(Integer kundeIId, TheClientDto theClientDto) throws EJBExceptionLP {
        useCase = KundeReportFac.UC_REPORT_KUNDE_STAMMBLATT;
        HashMap<String, Object> parameter = new HashMap<String, Object>();
        try {
            KundeDto kundeDto = getKundeFac().kundeFindByPrimaryKey(kundeIId, theClientDto);

            parameter.put("P_NAME1", kundeDto.getPartnerDto().getCName1nachnamefirmazeile1());
            parameter.put("P_NAME2", kundeDto.getPartnerDto().getCName2vornamefirmazeile2());
            parameter.put("P_NAME3", kundeDto.getPartnerDto().getCName3vorname2abteilung());
            parameter.put("P_STRASSE", kundeDto.getPartnerDto().getCStrasse());

            if (kundeDto.getPartnerDto().getLandplzortDto() != null) {
                parameter.put("P_LANDPLZORT", kundeDto.getPartnerDto().getLandplzortDto().formatLandPlzOrt());
            }

            parameter.put("P_TELEFON", kundeDto.getPartnerDto().getCTelefon());

            parameter.put("P_HOMEPAGE", kundeDto.getPartnerDto().getCHomepage());

            parameter.put("P_FAX", kundeDto.getPartnerDto().getCFax());

            parameter.put("P_EMAIL", kundeDto.getPartnerDto().getCEmail());

            parameter.put("P_HINWEISEXTERN", kundeDto.getSHinweisextern());
            parameter.put("P_HINWEISINTERN", kundeDto.getSHinweisintern());

            String sKommentar = null;

            if (kundeDto.getPartnerDto().getXBemerkung() != null
                    && kundeDto.getPartnerDto().getXBemerkung().length() > 0) {
                sKommentar = getTextRespectUISpr("lp.partner", theClientDto.getMandant(), theClientDto.getLocUi());
                sKommentar += ":\n" + kundeDto.getPartnerDto().getXBemerkung() + "\n";
            }

            if (kundeDto.getXKommentar() != null && kundeDto.getXKommentar().length() > 0) {
                if (sKommentar == null) {
                    sKommentar = getTextRespectUISpr("lp.kunde", theClientDto.getMandant(),
                            theClientDto.getLocUi());
                } else {
                    sKommentar += "\n"
                            + getTextRespectUISpr("lp.kunde", theClientDto.getMandant(), theClientDto.getLocUi());
                }
                sKommentar += ":\n" + kundeDto.getXKommentar();
            }

            parameter.put("P_KOMMENTAR", sKommentar);

            // Selektionen
            PASelektionDto[] paselDtos = getPartnerFac().pASelektionFindByPartnerIId(kundeDto.getPartnerIId());
            if (paselDtos != null && paselDtos.length > 0) {
                String sPasel = "";
                for (int i = 0; i < paselDtos.length; i++) {
                    PASelektionDto paselDto = paselDtos[i];
                    SelektionDto selektionDto = getPartnerServicesFac()
                            .selektionFindByPrimaryKey(paselDto.getSelektionIId(), theClientDto);
                    sPasel += " " + (i + 1) + ": " + selektionDto.getBezeichnung();
                }
                parameter.put("P_SELEKTIONEN", sPasel);
            }

            ArrayList<?> alAnsprechpartner = getAnsprechpartnerFac().getAllAnsprechpartner(kundeDto.getPartnerIId(),
                    theClientDto);

            // data = new Object[alAnsprechpartner.size()][8];
            setData(new Object[alAnsprechpartner.size()][8]);
            if (alAnsprechpartner.size() == 0) {
                data = new Object[0][8];
            }

            for (int i = 0; i < alAnsprechpartner.size(); i++) {
                AnsprechpartnerDto dtoTemp = (AnsprechpartnerDto) alAnsprechpartner.get(i);
                data[i][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_NACHNAME] = dtoTemp.getPartnerDto()
                        .getCName1nachnamefirmazeile1();
                data[i][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_VORNAME] = dtoTemp.getPartnerDto()
                        .getCName2vornamefirmazeile2();
                data[i][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_TITEL] = dtoTemp.getPartnerDto().getCTitel();

                if (dtoTemp.getAnsprechpartnerfunktionIId() != null) {
                    AnsprechpartnerfunktionDto dto = getAnsprechpartnerFac()
                            .ansprechpartnerfunktionFindByPrimaryKey(dtoTemp.getAnsprechpartnerfunktionIId(),
                                    theClientDto);
                    data[i][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_FUNKTION] = dto.getBezeichnung();
                }

                data[i][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_FAXDW] = dtoTemp.getCFax();

                data[i][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_TELDW] = dtoTemp.getCTelefon();

                data[i][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_MOBIL] = dtoTemp.getCHandy();

                data[i][REPORT_KUNDENSTAMMBLATT_ANSPRECHPARTNER_EMAIL] = dtoTemp.getCEmail();

            }

            // Auftraege

            Session session = FLRSessionFactory.getFactory().openSession();
            // Filter und Sortierung
            Criteria crit = session.createCriteria(FLRAuftragReport.class);
            // Filter nach Kunde
            crit.add(Restrictions.eq(AuftragFac.FLR_AUFTRAG_KUNDE_I_ID_AUFTRAGSADRESSE, kundeIId));
            crit.addOrder(Order.desc(AuftragFac.FLR_AUFTRAG_C_NR));

            List<?> list = crit.list();
            Iterator<?> it = list.iterator();
            ArrayList<Object[]> al = new ArrayList<Object[]>();
            while (it.hasNext()) {
                FLRAuftragReport flrauftrag = (FLRAuftragReport) it.next();

                Object[] o = new Object[7];
                o[0] = flrauftrag.getC_nr();
                o[1] = flrauftrag.getAuftragstatus_c_nr();

                BigDecimal wert = flrauftrag.getN_gesamtauftragswertinauftragswaehrung();

                if (wert != null) {

                    wert = getLocaleFac().rechneUmInMandantenWaehrung(wert,
                            new BigDecimal(flrauftrag.getF_wechselkursmandantwaehrungzuauftragswaehrung()));

                    o[2] = wert;
                }
                o[3] = null; // todo;
                o[4] = flrauftrag.getT_liefertermin();
                o[5] = flrauftrag.getC_bez();
                o[6] = flrauftrag.getC_bestellnummer();
                al.add(o);
            }

            if (al.size() > 0) {
                String[] fieldnames = new String[] { "Auftragsnummer", "Status", "Wert", "OffenerWert",
                        "Liefertermin", "Projekt", "Bestellnummer" };
                Object[][] dataSub = new Object[al.size()][fieldnames.length];
                dataSub = (Object[][]) al.toArray(dataSub);

                parameter.put("P_SUBREPORT_AUFTRAEGE",
                        ((net.sf.jasperreports.engine.JRDataSource) new LPDatenSubreport(dataSub, fieldnames)));
            }
            session.close();

            // Kurzbriefe
            session = FLRSessionFactory.getFactory().openSession();
            // Filter und Sortierung
            crit = session.createCriteria(FLRKurzbrief.class);
            // Filter nach Kunde
            crit.add(Restrictions.eq("partner_i_id", kundeDto.getPartnerIId()));
            crit.addOrder(Order.desc("t_aendern"));

            list = crit.list();
            it = list.iterator();
            al = new ArrayList<Object[]>();
            while (it.hasNext()) {
                FLRKurzbrief kurzbrief = (FLRKurzbrief) it.next();

                Object[] o = new Object[7];
                o[0] = kurzbrief.getC_betreff();

                if (kurzbrief.getFlransprechpartner() != null) {
                    AnsprechpartnerDto oAnsprechpartner = getAnsprechpartnerFac().ansprechpartnerFindByPrimaryKey(
                            kurzbrief.getFlransprechpartner().getI_id(), theClientDto);
                    o[1] = oAnsprechpartner.getPartnerDto().formatAnrede();
                }
                PersonalDto personalDto = getPersonalFac()
                        .personalFindByPrimaryKey(kurzbrief.getPersonal_i_id_aendern(), theClientDto);

                o[2] = personalDto.getPartnerDto().formatAnrede();
                o[3] = kurzbrief.getT_aendern();
                al.add(o);
            }

            if (al.size() > 0) {
                String[] fieldnames = new String[] { "Betreff", "Ansprechpartner", "Person", "Zeitpunkt" };
                Object[][] dataSub = new Object[al.size()][fieldnames.length];
                dataSub = (Object[][]) al.toArray(dataSub);

                parameter.put("P_SUBREPORT_KURZBRIEFE",
                        ((net.sf.jasperreports.engine.JRDataSource) new LPDatenSubreport(dataSub, fieldnames)));
            }

            // Umsaetze der vergangenen Jahre

            al = new ArrayList<Object[]>();

            Calendar cVon = Calendar.getInstance();
            cVon = Helper.cutCalendar(cVon);
            cVon.set(Calendar.MONTH, Calendar.JANUARY);
            cVon.set(Calendar.DAY_OF_MONTH, 1);

            Calendar cBis = Calendar.getInstance();
            cBis = Helper.cutCalendar(cBis);
            cBis.set(Calendar.MONTH, Calendar.DECEMBER);
            cBis.set(Calendar.DAY_OF_MONTH, 31);

            for (int i = 0; i < 10; i++) {

                int iJahr = cVon.get(Calendar.YEAR);

                java.sql.Date dVon = new java.sql.Date(cVon.getTime().getTime());
                java.sql.Date dBis = new java.sql.Date(cBis.getTime().getTime());

                // den Umsatz errechnen
                BigDecimal bdUmsatz = getRechnungFac().getUmsatzVomKundenImZeitraum(theClientDto, kundeIId, dVon,
                        dBis, false);
                Object[] o = new Object[2];
                o[0] = new Integer(iJahr);
                o[1] = bdUmsatz;
                cVon.set(Calendar.YEAR, cVon.get(Calendar.YEAR) - 1);
                cBis.set(Calendar.YEAR, cBis.get(Calendar.YEAR) - 1);
                al.add(o);
            }

            if (al.size() > 0) {
                String[] fieldnames = new String[] { "Jahr", "Umsatz" };
                Object[][] dataSub = new Object[al.size()][fieldnames.length];
                dataSub = (Object[][]) al.toArray(dataSub);

                parameter.put("P_SUBREPORT_UMSAETZE",
                        ((net.sf.jasperreports.engine.JRDataSource) new LPDatenSubreport(dataSub, fieldnames)));
            }

            // Umsaetze der vergangenen Geschaeftsjahre

            Integer gfJahr = getParameterFac().getGeschaeftsjahr(theClientDto.getMandant());

            al = new ArrayList<Object[]>();

            for (int i = 0; i < 10; i++) {

                int iJahr = gfJahr;

                Timestamp[] tVonBis = getBuchenFac().getDatumVonBisGeschaeftsjahr(gfJahr, theClientDto);

                java.sql.Date dVon = new java.sql.Date(tVonBis[0].getTime());
                java.sql.Date dBis = new java.sql.Date(tVonBis[1].getTime());

                // den Umsatz errechnen
                BigDecimal bdUmsatz = getRechnungFac().getUmsatzVomKundenImZeitraum(theClientDto, kundeIId, dVon,
                        dBis, false);
                Object[] o = new Object[2];
                o[0] = new Integer(iJahr);
                o[1] = bdUmsatz;

                al.add(o);

                gfJahr--;
            }

            if (al.size() > 0) {
                String[] fieldnames = new String[] { "Jahr", "Umsatz" };
                Object[][] dataSub = new Object[al.size()][fieldnames.length];
                dataSub = (Object[][]) al.toArray(dataSub);

                parameter.put("P_SUBREPORT_UMSAETZEGFJAHR",
                        ((net.sf.jasperreports.engine.JRDataSource) new LPDatenSubreport(dataSub, fieldnames)));
            }

            // Kontakte

            // Kurzbriefe
            session = FLRSessionFactory.getFactory().openSession();
            // Filter und Sortierung
            crit = session.createCriteria(FLRKontakt.class);
            // Filter nach Kunde
            crit.add(Restrictions.eq("partner_i_id", kundeDto.getPartnerIId()));
            crit.addOrder(Order.desc("t_kontakt"));

            list = crit.list();
            it = list.iterator();
            al = new ArrayList<Object[]>();
            while (it.hasNext()) {
                FLRKontakt kontakt = (FLRKontakt) it.next();

                Object[] o = new Object[7];
                o[0] = kontakt.getC_titel();
                o[1] = kontakt.getFlrkontaktart().getC_bez();
                o[2] = kontakt.getT_kontakt();
                o[3] = kontakt.getT_kontaktbis();

                PersonalDto personalDto = getPersonalFac()
                        .personalFindByPrimaryKey(kontakt.getFlrpersonal().getI_id(), theClientDto);

                o[4] = personalDto.getPartnerDto().formatAnrede();
                al.add(o);
            }

            if (al.size() > 0) {
                String[] fieldnames = new String[] { "Titel", "Kontaktart", "Von", "Bis", "Zugewiesener" };
                Object[][] dataSub = new Object[al.size()][fieldnames.length];
                dataSub = (Object[][]) al.toArray(dataSub);

                parameter.put("P_SUBREPORT_KONTAKTE",
                        ((net.sf.jasperreports.engine.JRDataSource) new LPDatenSubreport(dataSub, fieldnames)));
            }

            // Angebote
            session = FLRSessionFactory.getFactory().openSession();
            // Filter und Sortierung
            crit = session.createCriteria(FLRAngebot.class);
            // Filter nach Kunde
            crit.add(Restrictions.eq(AngebotFac.FLR_ANGEBOT_KUNDE_I_ID_ANGEBOTSADRESSE, kundeIId));
            crit.addOrder(Order.desc("c_nr"));

            list = crit.list();
            it = list.iterator();
            al = new ArrayList<Object[]>();
            while (it.hasNext()) {
                FLRAngebot angebot = (FLRAngebot) it.next();

                Object[] o = new Object[8];
                o[0] = angebot.getC_nr();
                o[1] = angebot.getAngebotstatus_c_nr();

                BigDecimal wert = angebot.getN_gesamtangebotswertinangebotswaehrung();

                if (wert != null) {

                    wert = getLocaleFac().rechneUmInMandantenWaehrung(wert,
                            new BigDecimal(angebot.getF_wechselkursmandantwaehrungzuangebotswaehrung()));

                    o[2] = wert;
                }
                o[3] = angebot.getT_belegdatum();
                o[4] = angebot.getAngeboterledigungsgrund_c_nr();
                o[5] = angebot.getT_manuellerledigt();

                AuftragDto[] aAuftragDto = getAuftragFac().auftragFindByAngebotIId(angebot.getI_id(), theClientDto);

                String s = "";
                for (int i = 0; i < aAuftragDto.length; i++) {
                    s += aAuftragDto[i].getCNr() + ", ";
                }
                o[6] = s;

                o[7] = angebot.getC_bez();

                al.add(o);
            }

            if (al.size() > 0) {
                String[] fieldnames = new String[] { "Angebotsnummer", "Status", "Wert", "Belegdatum",
                        "Erledigungsgrund", "Erledigungsdatum", "Erledigungsauftrag", "Projekt" };
                Object[][] dataSub = new Object[al.size()][fieldnames.length];
                dataSub = (Object[][]) al.toArray(dataSub);

                parameter.put("P_SUBREPORT_ANGEBOTE",
                        ((net.sf.jasperreports.engine.JRDataSource) new LPDatenSubreport(dataSub, fieldnames)));
            }
            session.close();

            parameter.put("P_SUBREPORT_PROJEKTE",
                    getSubreportProjekte(kundeDto.getPartnerIId(), false, theClientDto));

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

        parameter.put("P_MANDANTENWAEHRUNG", theClientDto.getSMandantenwaehrung());

        initJRDS(parameter, KundeReportFac.REPORT_MODUL, KundeReportFac.REPORT_KUNDENSTAMMBLATT,
                theClientDto.getMandant(), theClientDto.getLocUi(), theClientDto);
        return getReportPrint();
    }

    public LPDatenSubreport getSubreportProjekte(Integer partnerIId, boolean bNurOffene,
            TheClientDto theClientDto) {
        // Projekte
        Session session = FLRSessionFactory.getFactory().openSession();
        // Filter und Sortierung
        Criteria crit = session.createCriteria(FLRProjekt.class);
        // Filter nach Kunde
        crit.add(Restrictions.eq("partner_i_id", partnerIId));
        crit.add(Restrictions.eq("mandant_c_nr", theClientDto.getMandant()));

        if (bNurOffene) {
            crit.add(Restrictions.in("status_c_nr", new String[] { ProjektServiceFac.PROJEKT_STATUS_ANGELEGT,
                    ProjektServiceFac.PROJEKT_STATUS_OFFEN }));
        }

        crit.addOrder(Order.desc("c_nr"));

        List<?> list = crit.list();
        Iterator it = list.iterator();
        ArrayList al = new ArrayList<Object[]>();
        while (it.hasNext()) {
            FLRProjekt projekt = (FLRProjekt) it.next();

            Object[] o = new Object[11];
            o[0] = projekt.getC_nr();
            o[1] = projekt.getC_titel();
            o[2] = projekt.getTyp_c_nr();

            PersonalDto personalDto = getPersonalFac()
                    .personalFindByPrimaryKey(projekt.getFlrpersonalZugewiesener().getI_id(), theClientDto);

            o[3] = personalDto.getPartnerDto().formatAnrede();
            o[4] = projekt.getT_anlegen();
            o[5] = projekt.getStatus_c_nr();
            o[6] = projekt.getD_dauer();
            o[7] = projekt.getKategorie_c_nr();
            o[8] = projekt.getI_prio();
            o[9] = projekt.getN_umsatzgeplant();
            o[10] = projekt.getI_wahrscheinlichkeit();

            al.add(o);
        }

        if (al.size() > 0) {
            String[] fieldnames = new String[] { "Projektnummer", "Titel", "Typ", "Zugewiesener", "Anlagedatum",
                    "Status", "Schaetzung", "Kategorie", "Prio", "UmsatzGeplant", "Wahrscheinlichkeit" };
            Object[][] dataSub = new Object[al.size()][fieldnames.length];
            dataSub = (Object[][]) al.toArray(dataSub);

            return new LPDatenSubreport(dataSub, fieldnames);
        }
        session.close();
        return null;
    }

    @TransactionAttribute(TransactionAttributeType.NEVER)
    public JasperPrintLP printKundenstatistik(StatistikParamDto statistikParamDtoI) {
        return null;
    }

    public class KundenpreislisteTransformer implements IJasperPrintTransformer {
        private CustomerPricelistReportDto reportDto;
        private String[] fieldnames = new String[] { "Menge", "Basis", "BasisPreis", "Fixpreis", "Rabattsatz",
                "BerechneterPreis", "Waehrung", "Soko" };
        private int totalSize;

        public KundenpreislisteTransformer(CustomerPricelistReportDto reportDto) {
            this.reportDto = reportDto;
            totalSize = this.reportDto.getItems().size();
            if (this.reportDto.getWithClientLanguage())
                totalSize += totalSize;
        }

        public boolean next(int index) {
            return index < totalSize;
        }

        public HashMap<String, Object> transformParameter() {
            HashMap<String, Object> parameter = new HashMap<String, Object>();
            parameter.put("P_KUNDE", reportDto.getCustomer().getValue());
            parameter.put("P_ARTIKELGRUPPE",
                    reportDto.getItemgroup() != null ? reportDto.getItemgroup().getValue() : null);
            parameter.put("P_ARTIKELKLASSE",
                    reportDto.getItemclass() != null ? reportDto.getItemclass().getValue() : null);
            parameter.put("P_ARTIKELNRVON", reportDto.getItemRangeFrom());
            parameter.put("P_ARTIKELNRBIS", reportDto.getItemRangeFrom());
            parameter.put("P_MITVERSTECKTEN", reportDto.getWithHidden());
            parameter.put("P_NURSOKO", reportDto.getOnlySpecialCondition());
            parameter.put("P_MITMANDANTENSPRACHE", reportDto.getWithClientLanguage());
            parameter.put("P_PREISGUELTIGKEIT", new Date(reportDto.getPriceValidityMs()));
            return parameter;
        }

        public Object transformData(int rowIndex, String keyName) {
            int index = rowIndex;
            if (reportDto.getWithClientLanguage()) {
                index >>= 1;
            }
            CustomerPricelistItemDescriptionDto descDto = reportDto.getWithClientLanguage() && ((rowIndex & 1) == 1)
                    ? reportDto.getItems().get(index).getClientDescriptionDto()
                    : reportDto.getItems().get(index).getDescriptionDto();
            // CustomerPricelistItemDescriptionDto descDto =
            // reportDto.getItems().get(index).getDescriptionDto() ;
            // if(reportDto.getWithClientLanguage()) {
            // if((rowIndex & 1) == 1) {
            // descDto =
            // reportDto.getItems().get(index).getClientDescriptionDto() ;
            // }
            // }
            if ("Artikelnummer".equals(keyName)) {
                return reportDto.getItems().get(index).getItem().getValue();
            } else if ("Bezeichnung".equals(keyName)) {
                // return reportDto.getItems().get(index).getName() ;
                return descDto.getName();
            } else if ("Kurzbezeichnung".equals(keyName)) {
                // return reportDto.getItems().get(index).getShortName() ;
                return descDto.getShortName();
            } else if ("Zusatzbezeichnung".equals(keyName)) {
                // return reportDto.getItems().get(index).getAdditionalName() ;
                return descDto.getAdditionalName();
            } else if ("Zusatzbezeichnung2".equals(keyName)) {
                // return reportDto.getItems().get(index).getAdditionalName2() ;
                return descDto.getAdditionalName2();
            } else if ("Versteckt".equals(keyName)) {
                return reportDto.getItems().get(index).getHidden();
            } else if ("Artikelgruppe".equals(keyName)) {
                return reportDto.getItems().get(index).getItemGroupDto().getValue();
            } else if ("Artikelklasse".equals(keyName)) {
                return reportDto.getItems().get(index).getItemClass();
            } else if ("SubreportPreise".equals(keyName)) {
                return createPreiseSubreport(reportDto.getItems().get(index).getPrices());
            } else if ("EnthaeltSokos".equals(keyName)) {
                return reportDto.getItems().get(index).getSpecialCondition();
            }

            return null;
        }

        private LPDatenSubreport createPreiseSubreport(List<CustomerPricelistPriceDto> preise) {
            Object[][] dataSub = new Object[preise.size()][fieldnames.length];
            for (int i = 0; i < preise.size(); i++) {
                CustomerPricelistPriceDto preisDto = preise.get(i);
                dataSub[i][0] = preisDto.getAmount();
                dataSub[i][1] = preisDto.getPricetypKey();
                dataSub[i][2] = preisDto.getBasePrice();
                dataSub[i][3] = preisDto.getFixPrice();
                dataSub[i][4] = preisDto.getDiscountRate();
                dataSub[i][5] = preisDto.getCalculatedPrice();
                dataSub[i][6] = preisDto.getCurrency();
                dataSub[i][7] = preisDto.getSpecialCondition();
            }
            return new LPDatenSubreport(dataSub, fieldnames);
        }
    }
}