com.lp.server.rechnung.ejbfac.RechnungReportFacBean.java Source code

Java tutorial

Introduction

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

import java.io.File;
import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.sql.Date;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
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.JRExporterParameter;
import net.sf.jasperreports.engine.JRField;
import net.sf.jasperreports.engine.export.JRCsvExporter;

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

import com.lp.server.angebot.service.AngebotServiceFac;
import com.lp.server.artikel.service.ArtgruDto;
import com.lp.server.artikel.service.ArtikelDto;
import com.lp.server.artikel.service.ArtikelFac;
import com.lp.server.artikel.service.LagerDto;
import com.lp.server.artikel.service.MaterialDto;
import com.lp.server.artikel.service.MaterialzuschlagDto;
import com.lp.server.artikel.service.SeriennrChargennrMitMengeDto;
import com.lp.server.artikel.service.VerkaufspreisDto;
import com.lp.server.artikel.service.VerleihDto;
import com.lp.server.artikel.service.VkpreisfindungDto;
import com.lp.server.auftrag.service.AuftragDto;
import com.lp.server.auftrag.service.AuftragReportFac;
import com.lp.server.auftrag.service.AuftragpositionDto;
import com.lp.server.finanz.ejb.Exportlauf;
import com.lp.server.finanz.ejb.MahnstufePK;
import com.lp.server.finanz.ejbfac.BuchungDetailQueryBuilder;
import com.lp.server.finanz.ejbfac.FinanzSubreportGenerator;
import com.lp.server.finanz.fastlanereader.generated.FLRFinanzBuchungDetail;
import com.lp.server.finanz.service.ExportdatenDto;
import com.lp.server.finanz.service.ExportlaufDto;
import com.lp.server.finanz.service.FinanzFac;
import com.lp.server.finanz.service.FinanzReportFac;
import com.lp.server.finanz.service.FinanzamtDto;
import com.lp.server.finanz.service.KontoDto;
import com.lp.server.finanz.service.KontoDtoSmall;
import com.lp.server.finanz.service.MahnstufeDto;
import com.lp.server.lieferschein.fastlanereader.generated.FLRLieferscheinposition;
import com.lp.server.lieferschein.service.LieferscheinDto;
import com.lp.server.lieferschein.service.LieferscheinFac;
import com.lp.server.lieferschein.service.LieferscheinReportFac;
import com.lp.server.lieferschein.service.LieferscheinpositionDto;
import com.lp.server.lieferschein.service.LieferscheinpositionFac;
import com.lp.server.partner.fastlanereader.generated.FLRKunde;
import com.lp.server.partner.service.AnsprechpartnerDto;
import com.lp.server.partner.service.BankFac;
import com.lp.server.partner.service.KundeDto;
import com.lp.server.partner.service.KundeFac;
import com.lp.server.partner.service.KundeReportFac;
import com.lp.server.partner.service.KundesokoDto;
import com.lp.server.partner.service.PartnerDto;
import com.lp.server.partner.service.PartnerFac;
import com.lp.server.personal.service.PersonalDto;
import com.lp.server.personal.service.PersonalFac;
import com.lp.server.projekt.service.ProjektDto;
import com.lp.server.rechnung.ejb.Rechnung;
import com.lp.server.rechnung.ejb.Rechnungposition;
import com.lp.server.rechnung.fastlanereader.generated.FLRRechnungPosition;
import com.lp.server.rechnung.fastlanereader.generated.FLRRechnungReport;
import com.lp.server.rechnung.fastlanereader.generated.FLRRechnungZahlung;
import com.lp.server.rechnung.service.GutschrifttextDto;
import com.lp.server.rechnung.service.RechnungDto;
import com.lp.server.rechnung.service.RechnungFac;
import com.lp.server.rechnung.service.RechnungPositionDto;
import com.lp.server.rechnung.service.RechnungReportFac;
import com.lp.server.rechnung.service.RechnungkontierungDto;
import com.lp.server.rechnung.service.RechnungtextDto;
import com.lp.server.rechnung.service.RechnungzahlungDto;
import com.lp.server.rechnung.service.ReportRechnungJournalKriterienDto;
import com.lp.server.stueckliste.service.StuecklisteDto;
import com.lp.server.stueckliste.service.StuecklisteMitStrukturDto;
import com.lp.server.stueckliste.service.StuecklistepositionDto;
import com.lp.server.system.jcr.service.PrintInfoDto;
import com.lp.server.system.pkgenerator.format.LpBelegnummerFormat;
import com.lp.server.system.service.KostenstelleDto;
import com.lp.server.system.service.LandDto;
import com.lp.server.system.service.LocaleFac;
import com.lp.server.system.service.MandantDto;
import com.lp.server.system.service.MediaFac;
import com.lp.server.system.service.MediastandardDto;
import com.lp.server.system.service.MwstsatzDto;
import com.lp.server.system.service.ParameterFac;
import com.lp.server.system.service.ParametermandantDto;
import com.lp.server.system.service.ReportJournalKriterienDto;
import com.lp.server.system.service.SpediteurDto;
import com.lp.server.system.service.SystemFac;
import com.lp.server.system.service.TheClientDto;
import com.lp.server.system.service.ZahlungszielDto;
import com.lp.server.util.BelegPositionDruckIdentDto;
import com.lp.server.util.BelegPositionDruckTextbausteinDto;
import com.lp.server.util.HelperServer;
import com.lp.server.util.LPReport;
import com.lp.server.util.fastlanereader.FLRSessionFactory;
import com.lp.server.util.fastlanereader.service.query.QueryParameters;
import com.lp.server.util.report.JasperPrintLP;
import com.lp.server.util.report.MwstsatzReportDto;
import com.lp.service.StuecklisteInfoDto;
import com.lp.util.EJBExceptionLP;
import com.lp.util.Helper;
import com.lp.util.LPDatenSubreport;

@Stateless
@TransactionAttribute(TransactionAttributeType.NEVER)
public class RechnungReportFacBean extends LPReport implements RechnungReportFac, JRDataSource {

    @PersistenceContext
    private EntityManager em;

    private final static int UC_RE_GS_PR = 0;
    public final static int UC_REPORT_RECHNUNGEN_OFFENE = 1;
    public final static int UC_REPORT_WARENAUSGANGSJOURNAL = 2;
    public final static int UC_REPORT_ZAHLUNGSJOURNAL = 3;
    public final static int UC_REPORT_UMSATZ = 4;
    public final static int UC_REPORT_ALLE = 5;
    public final static int UC_ZAHLSCHEIN = 6;
    public final static int UC_ZUSAMMENFASSENDE_MELDUNG = 7;

    private final static int RECHNUNG_FELD_POSITION = 0;
    private final static int RECHNUNG_FELD_IDENT = 1;
    private final static int RECHNUNG_FELD_MENGE = 2;
    private final static int RECHNUNG_FELD_EINHEIT = 3;
    private final static int RECHNUNG_FELD_EINZELPREIS = 4;
    private final static int RECHNUNG_FELD_RABATT = 5;
    private final static int RECHNUNG_FELD_GESAMTPREIS = 6;
    private final static int RECHNUNG_FELD_POSITIONSART = 7;
    private final static int RECHNUNG_FELD_FREIERTEXT = 8;
    private final static int RECHNUNG_FELD_LEERZEILE = 9;
    private final static int RECHNUNG_FELD_B_SEITENUMBRUCH = 10;
    private final static int RECHNUNG_FELD_IMAGE = 11;
    private final static int RECHNUNG_FELD_MWSTSATZ = 12;
    private final static int RECHNUNG_FELD_MWSTBETRAG = 13;
    private final static int RECHNUNG_FELD_STKLMENGE = 14;
    private final static int RECHNUNG_FELD_STKLEINHEIT = 15;
    private final static int RECHNUNG_FELD_STKLARTIKELCNR = 16;
    private final static int RECHNUNG_FELD_STKLARTIKELBEZ = 17;
    private final static int RECHNUNG_FELD_ZUSATZRABATT = 18;
    private final static int RECHNUNG_FELD_IDENTNUMMER = 19;
    private final static int RECHNUNG_FELD_BEZEICHNUNG = 20;
    private final static int RECHNUNG_FELD_KURZBEZEICHNUNG = 21;
    private final static int RECHNUNG_FELD_AUFTRAG_NUMMER = 22;
    private final static int RECHNUNG_FELD_AUFTRAG_PROJEKT = 23;
    private final static int RECHNUNG_FELD_AUFTRAG_BESTELLNUMMER = 24;
    private final static int RECHNUNG_FELD_AUFTRAG_BESTELLDATUM = 25;
    private final static int RECHNUNG_FELD_WARENVERKEHRSNUMMER = 26;
    private final static int RECHNUNG_FELD_SERIENCHARGENR = 27;
    private final static int RECHNUNG_FELD_SERIENCHARGENR_MENGE = 28;
    private final static int RECHNUNG_FELD_MINDESTHALTBARKEIT = 29;
    private final static int RECHNUNG_FELD_KUNDEARTIKELNR = 30;
    private final static int RECHNUNG_FELD_ARTIKEL_VERPACKUNGSMENGE = 31;
    private final static int RECHNUNG_FELD_ARTIKEL_VERPACKUNGSEANNR = 32;
    private final static int RECHNUNG_FELD_ARTIKEL_VERKAUFSEANNR = 33;
    private final static int RECHNUNG_FELD_REFERENZNUMMER = 34;
    private final static int RECHNUNG_FELD_ARTIKELCZBEZ2 = 35;
    private final static int RECHNUNG_FELD_ARTIKELKOMMENTAR = 36;
    private final static int RECHNUNG_FELD_ZUSATZBEZEICHNUNG = 37;
    public final static int RECHNUNG_FELD_BAUFORM = 38;
    public final static int RECHNUNG_FELD_VERPACKUNGSART = 39;
    public final static int RECHNUNG_FELD_ARTIKEL_MATERIAL = 40;
    public final static int RECHNUNG_FELD_ARTIKEL_BREITE = 41;
    public final static int RECHNUNG_FELD_ARTIKEL_HOEHE = 42;
    public final static int RECHNUNG_FELD_ARTIKEL_TIEFE = 43;
    public final static int RECHNUNG_FELD_ARTIKEL_URSPRUNGSLAND = 44;
    public final static int RECHNUNG_FELD_ARTIKEL_ARTIKELGRUPPE = 45;
    private final static int RECHNUNG_FELD_POSITION_NR = 46;
    private final static int RECHNUNG_FELD_TYP_CNR = 47;
    private final static int RECHNUNG_FELD_IDENT_TEXTEINGABE = 48;
    private final static int RECHNUNG_FELD_LS_FILIALNR = 49;
    private final static int RECHNUNG_FELD_POSITIONSOBJEKT = 50;
    private final static int RECHNUNG_FELD_LS_ANSPRECHPARTNER = 51;
    private final static int RECHNUNG_FELD_LS_ANSPRECHPARTNER_FREMDSYSTEMNUMMER = 52;
    private final static int RECHNUNG_FELD_LS_KOMMISIONSNUMMER = 53;
    private final static int RECHNUNG_FELD_LS_ABBUCHUNGSLAGER = 54;
    private final static int RECHNUNG_FELD_WE_REFERENZ = 55;
    private final static int RECHNUNG_FELD_LS_PROJEKT = 56;
    private final static int RECHNUNG_FELD_LS_BESTELLNUMMER = 57;
    private final static int RECHNUNG_FELD_LS_KOSTENSTELLE = 58;
    private final static int RECHNUNG_FELD_LS_RECHNUNGSADRESSEGLEICHLIEFERADRESSE = 59;
    private final static int RECHNUNG_FELD_SETARTIKEL_TYP = 60;
    private final static int RECHNUNG_FELD_FIBU_MWST_CODE = 61;
    private final static int RECHNUNG_FELD_LS_VERRECHNET_MIT = 62;
    public final static int RECHNUNG_FELD_ARTIKEL_REVISION = 63;
    public final static int RECHNUNG_FELD_ARTIKEL_INDEX = 64;
    public final static int RECHNUNG_FELD_VERLEIHTAGE = 65;
    public final static int RECHNUNG_FELD_VERLEIHFAKTOR = 66;
    public final static int RECHNUNG_FELD_GEWICHT = 67;
    public final static int RECHNUNG_FELD_VONPOSITION = 68;
    public final static int RECHNUNG_FELD_BISPOSITION = 69;
    public final static int RECHNUNG_FELD_ZWSNETTOSUMME = 70;
    public final static int RECHNUNG_FELD_ZWSTEXT = 71;
    public final static int RECHNUNG_FELD_INTERNAL_IID = 72;
    public final static int RECHNUNG_FELD_LVPOSITION = 73;
    private final static int RECHNUNG_FELD_STKLARTIKELKBEZ = 74;
    private final static int RECHNUNG_FELD_STKLARTIKEL_KDARTIKELNR = 75;
    private final static int RECHNUNG_FELD_ARTIKEL_WERBEABGABEPFLICHTIG = 76;
    private final static int RECHNUNG_FELD_INSERAT_DTO = 77;
    private final static int RECHNUNG_FELD_STKLARTIKEL_KDPREIS = 78;
    public final static int RECHNUNG_FELD_MATERIALZUSCHLAG = 79;
    public final static int RECHNUNG_FELD_ARTIKEL_MATERIALGEWICHT = 80;
    public final static int RECHNUNG_FELD_ARTIKEL_KURS_MATERIALZUSCHLAG = 81;
    public final static int RECHNUNG_FELD_ARTIKEL_DATUM_MATERIALZUSCHLAG = 82;
    private final static int RECHNUNG_ANZAHL_SPALTEN = 83;

    private final static int OFFENE_FELD_RECHNUNGART = 0;
    private final static int OFFENE_FELD_KOSTENSTELLE = 1;
    private final static int OFFENE_FELD_RECHNUNGSNUMMER = 2;
    private final static int OFFENE_FELD_FIRMA = 3;
    private final static int OFFENE_FELD_RECHNUNGSDATUM = 4;
    private final static int OFFENE_FELD_MAHNDATUM = 5;
    private final static int OFFENE_FELD_MAHNSTUFE = 6;
    private final static int OFFENE_FELD_WERT_BRUTTO = 7;
    private final static int OFFENE_FELD_WERT_NETTO = 8;
    private final static int OFFENE_FELD_WERT_BRUTTO_OFFEN = 9;
    private final static int OFFENE_FELD_WERT_NETTO_OFFEN = 10;
    private final static int OFFENE_FELD_WECHSELDATUM = 11;
    private final static int OFFENE_FELD_FAELLIGKEITSDATUM = 12;
    private final static int OFFENE_FELD_TAGE_BIS_FAELLIGKEITSDATUM = 13;
    private final static int OFFENE_FELD_FIRMA_LKZ = 14;
    private final static int OFFENE_FELD_FIRMA_LKZ_STATISTIK = 15;
    private final static int OFFENE_FELD_FIRMA_STATISTIK = 16;
    private final static int OFFENE_FELD_VERTRETER = 17;
    private final static int OFFENE_FELD_MAHNSPERRE = 18;
    private final static int OFFENE_FELD_WERT_BRUTTO_ANZAHLUNGEN = 19;
    private final static int OFFENE_FELD_WERT_NETTO_ANZAHLUNGEN = 20;
    private final static int OFFENE_FELD_WERT_BRUTTO_FW = 21;
    private final static int OFFENE_FELD_WERT_NETTO_FW = 22;
    private final static int OFFENE_FELD_WERT_BRUTTO_OFFEN_FW = 23;
    private final static int OFFENE_FELD_WERT_NETTO_OFFEN_FW = 24;
    private final static int OFFENE_FELD_WERT_BRUTTO_ANZAHLUNGEN_FW = 25;
    private final static int OFFENE_FELD_WERT_NETTO_ANZAHLUNGEN_FW = 26;
    private final static int OFFENE_FELD_KURS = 27;
    private final static int OFFENE_FELD_WAEHRUNG = 28;
    private final static int OFFENE_FELD_DEBITORENNR = 29;
    private final static int OFFENE_SUBREPORT_OFFENE_BUCHUNGEN = 30;
    private final static int OFFENE_ANZAHL_SPALTEN = 31;

    private final static int ZAHLUNGEN_FELD_ER_C_NR = 0;
    private final static int ZAHLUNGEN_FELD_FIRMA = 1;
    private final static int ZAHLUNGEN_FELD_ZAHLDATUM = 2;
    private final static int ZAHLUNGEN_FELD_BETRAG = 3;
    private final static int ZAHLUNGEN_FELD_BETRAG_UST = 4;
    private final static int ZAHLUNGEN_FELD_BANK = 5;
    private final static int ZAHLUNGEN_FELD_AUSZUG = 6;
    private final static int ZAHLUNGEN_FELD_WECHSEL = 7;
    private static int ZAHLUNGEN_FELD_BETRAG_MANDANTENWAEHRUNG_ZU_BELEGZEIT = 8;
    private static int ZAHLUNGEN_FELD_BETRAG_UST_MANDANTENWAEHRUNG_ZU_BELEGZEIT = 9;
    private static int ZAHLUNGEN_FELD_BELEGWAEHRUNG = 10;
    private static int ZAHLUNGEN_FELD_BETRAG_FW = 11;
    private static int ZAHLUNGEN_FELD_BETRAG_UST_FW = 12;
    private static int ZAHLUNGEN_FELD_KONTO = 13;
    private static int ZAHLUNGEN_FELD_ZAHLUNGSART = 14;
    private static int ZAHLUNGEN_FELD_KASSENBUCH = 15;
    private static int ZAHLUNGEN_FELD_DEBITORENKONTO = 16;
    private static int ZAHLUNGEN_FELD_RECHNUNGSART = 17;
    private final static int ZAHLUNGEN_FELD_LAENDERART = 18;
    private final static int ZAHLUNGEN_FELD_KOSTENSTELLE = 19;
    private final static int ZAHLUNGEN_ANZAHL_FELDER = 20;

    private final static int UMSATZ_FELD_MONAT = 0;
    private final static int UMSATZ_FELD_WERT = 1;
    private final static int UMSATZ_FELD_WERT_UST = 2;
    private final static int UMSATZ_FELD_WERT_NICHT_ABGERECHNETE_ANZAHLUNGEN = 3;
    private final static int UMSATZ_FELD_WERT_NICHT_ABGERECHNETE_ANZAHLUNGEN_UST = 4;

    private final static int FELD_ALLE_RECHNUNGSNUMMER = 0;
    private final static int FELD_ALLE_BELEGDATUM = 1;
    private final static int FELD_ALLE_KUNDE = 2;
    private final static int FELD_ALLE_KUNDE2 = 3;
    private final static int FELD_ALLE_KOSTENSTELLENUMMER = 4;
    private final static int FELD_ALLE_BETRAG = 5;
    private final static int FELD_ALLE_BETRAGUST = 6;
    private final static int FELD_ALLE_ORT = 7;
    private final static int FELD_ALLE_ZIELDATUM = 8;
    private final static int FELD_ALLE_BEZAHLTDATUM = 9;
    private final static int FELD_ALLE_BEZAHLT = 10;
    private final static int FELD_ALLE_BEZAHLTUST = 11;
    private final static int FELD_ALLE_MAHNSTUFE = 12;
    private final static int FELD_ALLE_WECHSELDATUM = 13;
    private final static int FELD_ALLE_DEBITORENKONTO = 14;
    private final static int FELD_ALLE_ADRESSE = 15;
    private final static int FELD_ALLE_ZINSEN = 16;
    private final static int FELD_ALLE_ZAHLTAGE = 17;
    private final static int FELD_ALLE_VERTRETER = 18;
    private final static int FELD_ALLE_KURS = 19;
    private final static int FELD_ALLE_WAEHRUNG = 20;
    private final static int FELD_ALLE_RECHNUNGSNUMMERZUGUTSCHRIFT = 21;
    private final static int FELD_ALLE_KUNDE_STATISTIK = 22;
    private final static int FELD_ALLE_KUNDE2_STATISTIK = 23;
    private final static int FELD_ALLE_ADRESSE_STATISTIK = 24;
    private final static int FELD_ALLE_LAENDERART = 25;
    private final static int FELD_ALLE_KUNDE_UID = 26;
    private final static int FELD_ALLE_REVERSE_CHARGE = 27;
    private final static int FELD_ALLE_WERT_ANZAHLUNGEN = 28;
    private final static int FELD_ALLE_WERT_ANZAHLUNGENUST = 29;
    private final static int FELD_ALLE_STATUS = 30;
    private final static int FELD_ALLE_BETRAG_FW = 31;
    private final static int FELD_ALLE_BETRAGUST_FW = 32;
    private final static int FELD_ALLE_BEZAHLT_FW = 33;
    private final static int FELD_ALLE_BEZAHLTUST_FW = 34;
    private final static int FELD_ALLE_WERT_ANZAHLUNGEN_FW = 35;
    private final static int FELD_ALLE_WERT_ANZAHLUNGENUST_FW = 36;
    private final static int FELD_ALLE_ZOLLBELEGNUMMER = 37;
    private final static int REPORT_ALLE_ANZAHL_SPALTEN = 38;

    private final static int FELD_ZM_RECHNUNGSNUMMER = 0;
    private final static int FELD_ZM_BELEGDATUM = 1;
    private final static int FELD_ZM_KUNDE = 2;
    private final static int FELD_ZM_KUNDE2 = 3;
    private final static int FELD_ZM_KOSTENSTELLENUMMER = 4;
    private final static int FELD_ZM_BETRAG = 5;
    private final static int FELD_ZM_BETRAGUST = 6;
    private final static int FELD_ZM_ORT = 7;
    private final static int FELD_ZM_ZIELDATUM = 8;
    private final static int FELD_ZM_BEZAHLTDATUM = 9;
    private final static int FELD_ZM_BEZAHLT = 10;
    private final static int FELD_ZM_BEZAHLTUST = 11;
    private final static int FELD_ZM_MAHNSTUFE = 12;
    private final static int FELD_ZM_WECHSELDATUM = 13;
    private final static int FELD_ZM_DEBITORENKONTO = 14;
    private final static int FELD_ZM_ADRESSE = 15;
    private final static int FELD_ZM_ZINSEN = 16;
    private final static int FELD_ZM_ZAHLTAGE = 17;
    private final static int FELD_ZM_VERTRETER = 18;
    private final static int FELD_ZM_KURS = 19;
    private final static int FELD_ZM_WAEHRUNG = 20;
    private final static int FELD_ZM_RECHNUNGSNUMMERZUGUTSCHRIFT = 21;
    private final static int FELD_ZM_KUNDE_STATISTIK = 22;
    private final static int FELD_ZM_KUNDE2_STATISTIK = 23;
    private final static int FELD_ZM_ADRESSE_STATISTIK = 24;
    private final static int FELD_ZM_LAENDERART = 25;
    private final static int FELD_ZM_KUNDE_UID = 26;
    private final static int FELD_ZM_REVERSE_CHARGE = 27;
    private final static int REPORT_ZM_ANZAHL_SPALTEN = 28;

    private final static int FELD_WARENAUSGANG_RECHNUNGSNUMMER = 0;
    private final static int FELD_WARENAUSGANG_RECHNUNGSDATUM = 1;
    private final static int FELD_WARENAUSGANG_POSITIONSPREIS = 2;
    private final static int FELD_WARENAUSGANG_KUNDENBEZEICHNUNG = 3;
    private final static int FELD_WARENAUSGANG_KUNDENNUMMER = 4;
    private final static int FELD_WARENAUSGANG_ARTIKELNUMMER = 5;
    private final static int FELD_WARENAUSGANG_ARTIKELBEZEICHNUNG = 6;
    private final static int FELD_WARENAUSGANG_ARTIKELKLASSE = 7;
    private final static int FELD_WARENAUSGANG_ARTIKELGRUPPE = 8;
    private final static int FELD_WARENAUSGANG_URSPRUNGSLAND = 9;
    private final static int FELD_WARENAUSGANG_WARENVERKEHRSNUMMER = 10;
    private final static int FELD_WARENAUSGANG_MENGE = 11;
    private final static int FELD_WARENAUSGANG_EINHEIT = 12;
    private final static int FELD_WARENAUSGANG_ARTIKELBEZEICHNUNG2 = 13;
    private final static int FELD_WARENAUSGANG_RECHNUNGSPROVISION = 14;
    private final static int FELD_WARENAUSGANG_PROVISIONSEMPFAENGER = 15;
    private final static int FELD_WARENAUSGANG_ERLOESKONTO = 16;
    private final static int FELD_WARENAUSGANG_DEBITORENKONTO = 17;
    private final static int FELD_WARENAUSGANG_PLZ = 18;
    private final static int FELD_WARENAUSGANG_LKZ = 19;
    private final static int FELD_WARENAUSGANG_ADRESSE = 20;
    private final static int FELD_WARENAUSGANG_MWST = 21;
    private final static int FELD_WARENAUSGANG_BRANCHE = 22;
    private final static int FELD_WARENAUSGANG_PARTNERKLASSE = 23;
    private final static int FELD_WARENAUSGANG_USTLAND = 24;
    private final static int FELD_WARENAUSGANG_LIEFERSCHEINNUMMER = 25;
    private final static int FELD_WARENAUSGANG_LIEFERSCHEINDATUM = 26;
    private final static int FELD_WARENAUSGANG_STATISTIKADRESSE_PARTNER_I_ID = 27;
    private final static int FELD_WARENAUSGANG_STATISTIKADRESSE_ANREDE_C_NR = 28;
    private final static int FELD_WARENAUSGANG_STATISTIKADRESSE_C_NAME1 = 29;
    private final static int FELD_WARENAUSGANG_STATISTIKADRESSE_C_NAME2 = 30;
    private final static int FELD_WARENAUSGANG_STATISTIKADRESSE_C_NAME3ABTEILUNG = 31;
    private final static int FELD_WARENAUSGANG_STATISTIKADRESSE_C_STRASSE = 32;
    private final static int FELD_WARENAUSGANG_STATISTIKADRESSE_LAND = 33;
    private final static int FELD_WARENAUSGANG_STATISTIKADRESSE_ORT = 34;
    private final static int FELD_WARENAUSGANG_STATISTIKADRESSE_PLZ = 35;
    private final static int FELD_WARENAUSGANG_PARTNER_I_ID = 36;
    private final static int FELD_WARENAUSGANG_WAEHRUNG = 37;
    private final static int FELD_WARENAUSGANG_KURS = 38;
    private final static int FELD_WARENAUSGANG_RECHNUNGSART = 39;
    private final static int FELD_WARENAUSGANG_ZURECHNUNG = 40;
    private final static int FELD_WARENAUSGANG_ARTIKELPROVISION = 41;
    private final static int FELD_WARENAUSGANG_BESTELLNUMMER = 42;
    private final static int FELD_WARENAUSGANG_KUNDENNUMMER_RECHNUNGSADRESSE_LS = 43;
    private final static int FELD_WARENAUSGANG_KUNDENBEZEICHNUNG_RECHNUNGSADRESSE_LS = 44;
    private final static int FELD_WARENAUSGANG_KUNDEKURZBEZEICHNUNG_RECHNUNGSADRESSE_LS = 45;
    private final static int FELD_WARENAUSGANG_KUNDE_HINWEISEXT = 46;
    private final static int FELD_WARENAUSGANG_KUNDE_HINWEISINT = 47;
    private final static int FELD_WARENAUSGANG_KUNDE_PROVISIONSEMPFAENGER_KURZZEICHEN = 48;
    private final static int FELD_WARENAUSGANG_ARTIKEL_GEWICHTKG = 49;
    private final static int FELD_WARENAUSGANG_LAGER_RECHNUNG = 50;
    private final static int FELD_WARENAUSGANG_LAGER_LIEFERSCHEIN = 51;
    private final static int FELD_WARENAUSGANG_ZIELLAGER_LIEFERSCHEIN = 52;
    private final static int FELD_WARENAUSGANG_KUNDENNUMMER_LIEFERADRESSE_LS = 53;
    private final static int FELD_WARENAUSGANG_TEXTEINGABE = 54; // der
    private final static int FELD_WARENAUSGANG_ILN_LIEFERADRESSE = 55; // der
    private final static int FELD_WARENAUSGANG_ILN_RECHNUNGSADRESSE = 56;
    private final static int FELD_WARENAUSGANG_LIEFERADRESSE_PARTNER_I_ID = 57;
    private final static int FELD_WARENAUSGANG_LIEFERADRESSE_ANREDE_C_NR = 58;
    private final static int FELD_WARENAUSGANG_LIEFERADRESSE_C_NAME1 = 59;
    private final static int FELD_WARENAUSGANG_LIEFERADRESSE_C_NAME2 = 60;
    private final static int FELD_WARENAUSGANG_LIEFERADRESSE_C_NAME3ABTEILUNG = 61;
    private final static int FELD_WARENAUSGANG_LIEFERADRESSE_C_STRASSE = 62;
    private final static int FELD_WARENAUSGANG_LIEFERADRESSE_LAND = 63;
    private final static int FELD_WARENAUSGANG_LIEFERADRESSE_ORT = 64;
    private final static int FELD_WARENAUSGANG_LIEFERADRESSE_PLZ = 65;
    private final static int FELD_WARENAUSGANG_GRUNDNICHTEINGEHALTEN = 66;
    private final static int FELD_WARENAUSGANG_GEPLANTER_LIEFERTERMIN = 67;
    private final static int FELD_WARENAUSGANG_KUNDE_LIEFERDAUER = 68;
    private final static int FELD_WARENAUSGANG_AUFTRAG_NUMMER = 69;
    private final static int FELD_WARENAUSGANG_AUFTRAG_BEGRUENDUNG = 70;
    private final static int FELD_WARENAUSGANG_GESTPREIS = 71;
    private final static int FELD_WARENAUSGANG_KOSTENTRAEGER = 72;
    private final static int FELD_WARENAUSGANG_SETARTIKEL_TYP = 73;
    private final static int FELD_WARENAUSGANG_PROJEKT = 74;
    private final static int REPORT_WARENAUSGANG_ANZAHL_SPALTEN = 75;

    private final static String PARAMETER_WARENAUSGANG_VON = "P_VON";
    private final static String PARAMETER_WARENAUSGANG_BIS = "P_BIS";
    private final static String PARAMETER_WARENAUSGNAG_GRUPPIERUNGNACHSTATISTIK = "P_GRUPPIERTNACHSTATISTIK";
    private final static String PARAMETER_WARENAUSGANG_MANDANTENWAEHRUNG = "P_WAEHRUNG_MANDANT";

    private int useCase;
    private Object[][] data = null;
    private Integer iArtikelpositionsnummer;

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

    public Object getFieldValue(JRField field) throws JRException {
        Object value = null;
        String fieldName = field.getName();
        switch (useCase) {
        case UC_RE_GS_PR: {
            if ("Position".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_POSITION];
            }
            if ("F_POSITION_NR".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_POSITION_NR];
            } else if ("Ident".equals(fieldName)) {
                value = Helper.formatStyledTextForJasper(data[index][RECHNUNG_FELD_IDENT]);
            } else if ("Menge".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_MENGE];
            } else if ("Einheit".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_EINHEIT];
            } else if ("Einzelpreis".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_EINZELPREIS];
            } else if ("Rabatt".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_RABATT];
            } else if ("Gesamtpreis".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_GESAMTPREIS];
            } else if ("Materialzuschlag".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_MATERIALZUSCHLAG];
            } else if ("Positionsart".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_POSITIONSART];
            } else if ("Freiertext".equals(fieldName)) {
                value = Helper.formatStyledTextForJasper(data[index][RECHNUNG_FELD_FREIERTEXT]);
            } else if ("Leerzeile".equals(fieldName)) {
                value = Helper.formatStyledTextForJasper(data[index][RECHNUNG_FELD_LEERZEILE]);
            } else if ("Seitenumbruch".equals(fieldName)) {
                // seitenumbruch: uebergeben
                value = data[index][RECHNUNG_FELD_B_SEITENUMBRUCH];
            } else if ("Image".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_IMAGE];
            } else if ("Mwstsatz".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_MWSTSATZ];
            } else if ("Mwstbetrag".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_MWSTBETRAG];
            } else if ("F_STKLMENGE".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_STKLMENGE];
            } else if ("F_STKLEINHEIT".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_STKLEINHEIT];
            } else if ("F_STKLARTIKELCNR".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_STKLARTIKELCNR];
            } else if ("F_STKLARTIKELBEZ".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_STKLARTIKELBEZ];
            } else if ("F_STKLARTIKELKBEZ".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_STKLARTIKELKBEZ];
            } else if ("F_STKLARTIKEL_KDARTIKELNR".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_STKLARTIKEL_KDARTIKELNR];
            } else if ("F_STKLARTIKEL_KDPREIS".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_STKLARTIKEL_KDPREIS];
            } else if ("F_ZUSATZRABATT".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ZUSATZRABATT];
            } else if (F_IDENTNUMMER.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_IDENTNUMMER];
            } else if (F_BEZEICHNUNG.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_BEZEICHNUNG];
            } else if ("F_LV_POSITION".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_LVPOSITION];
            } else if (F_KURZBEZEICHNUNG.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_KURZBEZEICHNUNG];
            } else if ("AUFTRAG_BESTELLDATUM".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_AUFTRAG_BESTELLDATUM];
            } else if ("AUFTRAG_BESTELLNUMMER".equals(fieldName)) {
                value = Helper.formatStyledTextForJasper(data[index][RECHNUNG_FELD_AUFTRAG_BESTELLNUMMER]);
            } else if ("AUFTRAG_NUMMER".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_AUFTRAG_NUMMER];
            } else if ("AUFTRAG_PROJEKT".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_AUFTRAG_PROJEKT];
            } else if ("F_WARENVERKEHRSNUMMER".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_WARENVERKEHRSNUMMER];
            } else if ("F_SERIENCHARGENR".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_SERIENCHARGENR];
            } else if ("F_SERIENCHARGENR_MENGE".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_SERIENCHARGENR_MENGE];
            } else if ("F_CHARGE_MINDESTHALTBARKEIT".equals(fieldName)) {
                value = Helper.formatStyledTextForJasper(data[index][RECHNUNG_FELD_MINDESTHALTBARKEIT]);
            } else if (F_KUNDEARTIKELNR.equals(fieldName)) {
                value = Helper.formatStyledTextForJasper(data[index][RECHNUNG_FELD_KUNDEARTIKELNR]);
            } else if ("F_VERPACKUNGSMENGE".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKEL_VERPACKUNGSMENGE];
            } else if ("F_ARTIKEL_WERBEABGABEPFLICHTIG".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKEL_WERBEABGABEPFLICHTIG];
            } else if ("F_INSERAT_DTO".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_INSERAT_DTO];
            } else if ("F_VERPACKUNGSEANNR".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKEL_VERPACKUNGSEANNR];
            } else if ("F_VERKAUFSEANNR".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKEL_VERKAUFSEANNR];
            } else if (F_REFERENZNUMMER.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_REFERENZNUMMER];
            } else if ("F_GEWICHT".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_GEWICHT];
            } else if (F_ZUSATZBEZEICHNUNG2.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKELCZBEZ2];
            } else if (F_ARTIKELKOMMENTAR.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKELKOMMENTAR];
            } else if (F_ZUSATZBEZEICHNUNG.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ZUSATZBEZEICHNUNG];
            } else if (F_ARTIKEL_BAUFORM.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_BAUFORM];
            } else if (F_ARTIKEL_VERPACKUNGSART.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_VERPACKUNGSART];
            } else if (F_ARTIKEL_MATERIAL.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKEL_MATERIAL];
            } else if (F_ARTIKEL_MATERIALGEWICHT.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKEL_MATERIALGEWICHT];
            } else if (F_ARTIKEL_KURS_MATERIALZUSCHLAG.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKEL_KURS_MATERIALZUSCHLAG];
            } else if (F_ARTIKEL_DATUM_MATERIALZUSCHLAG.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKEL_DATUM_MATERIALZUSCHLAG];
            } else if ("F_ARTIKEL_INDEX".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKEL_INDEX];
            } else if ("F_ARTIKEL_REVISION".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKEL_REVISION];
            } else if (F_ARTIKEL_BREITE.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKEL_BREITE];
            } else if (F_ARTIKEL_HOEHE.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKEL_HOEHE];
            } else if (F_ARTIKEL_TIEFE.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKEL_TIEFE];
            } else if (F_ARTIKEL_URSPRUNGSLAND.equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKEL_URSPRUNGSLAND];
            } else if ("F_ARTIKEL_ARTIKELGRUPPE".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ARTIKEL_ARTIKELGRUPPE];
            } else if ("F_TYP_CNR".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_TYP_CNR];
            } else if ("F_IDENT_TEXTEINGABE".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_IDENT_TEXTEINGABE];
            } else if ("F_LS_FILIALNR".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_LS_FILIALNR];
            } else if ("F_LS_ANSPRECHPARTNER".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_LS_ANSPRECHPARTNER];
            } else if ("F_LS_ANSPRECHPARTNER_FREMDSYSTEMNUMMER".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_LS_ANSPRECHPARTNER_FREMDSYSTEMNUMMER];
            } else if ("F_LS_KOMMISIONSNUMMER".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_LS_KOMMISIONSNUMMER];
            } else if ("F_LS_ABBUCHUNGSLAGER".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_LS_ABBUCHUNGSLAGER];
            } else if ("F_POSITIONSOBJEKT".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_POSITIONSOBJEKT];
            } else if ("WE_REFERENZ".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_WE_REFERENZ];
            } else if ("F_LS_PROJEKT".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_LS_PROJEKT];
            } else if ("F_LS_BESTELLNUMMER".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_LS_BESTELLNUMMER];
            } else if ("F_LS_KOSTENSTELLE".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_LS_KOSTENSTELLE];
            } else if ("F_LS_VERRECHNETMIT".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_LS_VERRECHNET_MIT];
            } else if ("F_LS_RECHNUNGSADRESSEGLEICHLIEFERADRESSE".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_LS_RECHNUNGSADRESSEGLEICHLIEFERADRESSE];
            } else if ("F_SETARTIKEL_TYP".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_SETARTIKEL_TYP];
            } else if ("F_FIBU_MWST_CODE".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_FIBU_MWST_CODE];
            } else if ("F_VERLEIHTAGE".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_VERLEIHTAGE];
            } else if ("F_VERLEIHFAKTOR".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_VERLEIHFAKTOR];
            } else if ("F_VONPOSITION".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_VONPOSITION];
            } else if ("F_BISPOSITION".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_BISPOSITION];
            } else if ("F_ZWSNETTOSUMME".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ZWSNETTOSUMME];
            } else if ("F_ZWSTEXT".equals(fieldName)) {
                value = data[index][RECHNUNG_FELD_ZWSTEXT];
            }
        }
            break;
        case UC_REPORT_RECHNUNGEN_OFFENE: {
            if ("F_KUNDE".equals(fieldName)) {
                value = data[index][OFFENE_FELD_FIRMA];
            } else if ("F_KUNDE_STATISTIK".equals(fieldName)) {
                value = data[index][OFFENE_FELD_FIRMA_STATISTIK];
            } else if ("F_KOSTENSTELLE".equals(fieldName)) {
                value = data[index][OFFENE_FELD_KOSTENSTELLE];
            } else if ("F_MAHNDATUM".equals(fieldName)) {
                value = data[index][OFFENE_FELD_MAHNDATUM];
            } else if ("F_MAHNSTUFE".equals(fieldName)) {
                value = data[index][OFFENE_FELD_MAHNSTUFE];
            } else if ("F_RECHNUNGSART".equals(fieldName)) {
                value = data[index][OFFENE_FELD_RECHNUNGART];
            } else if ("F_RECHNUNGSDATUM".equals(fieldName)) {
                value = data[index][OFFENE_FELD_RECHNUNGSDATUM];
            } else if ("F_RECHNUNGSNUMMER".equals(fieldName)) {
                value = data[index][OFFENE_FELD_RECHNUNGSNUMMER];
            } else if ("F_WECHSEL".equals(fieldName)) {
                value = data[index][OFFENE_FELD_WECHSELDATUM];
            } else if ("F_WERT".equals(fieldName)) {
                value = data[index][OFFENE_FELD_WERT_BRUTTO];
            } else if ("F_OFFEN".equals(fieldName)) {
                value = data[index][OFFENE_FELD_WERT_BRUTTO_OFFEN];
            } else if ("F_WERT_NETTO".equals(fieldName)) {
                value = data[index][OFFENE_FELD_WERT_NETTO];
            } else if ("F_NETTO_ANZAHLUNGEN".equals(fieldName)) {
                value = data[index][OFFENE_FELD_WERT_NETTO_ANZAHLUNGEN];
            } else if ("F_BRUTTO_ANZAHLUNGEN".equals(fieldName)) {
                value = data[index][OFFENE_FELD_WERT_BRUTTO_ANZAHLUNGEN];
            } else if ("F_OFFEN_NETTO".equals(fieldName)) {
                value = data[index][OFFENE_FELD_WERT_NETTO_OFFEN];
            }

            else if ("F_WERT_FW".equals(fieldName)) {
                value = data[index][OFFENE_FELD_WERT_BRUTTO_FW];
            } else if ("F_KURS".equals(fieldName)) {
                value = data[index][OFFENE_FELD_KURS];
            } else if ("F_WAEHRUNG".equals(fieldName)) {
                value = data[index][OFFENE_FELD_WAEHRUNG];
            } else if ("F_DEBITORENNR".equals(fieldName)) {
                value = data[index][OFFENE_FELD_DEBITORENNR];
            } else if ("F_OFFEN_FW".equals(fieldName)) {
                value = data[index][OFFENE_FELD_WERT_BRUTTO_OFFEN_FW];
            } else if ("F_WERT_NETTO_FW".equals(fieldName)) {
                value = data[index][OFFENE_FELD_WERT_NETTO_FW];
            } else if ("F_NETTO_ANZAHLUNGEN_FW".equals(fieldName)) {
                value = data[index][OFFENE_FELD_WERT_NETTO_ANZAHLUNGEN_FW];
            } else if ("F_BRUTTO_ANZAHLUNGEN_FW".equals(fieldName)) {
                value = data[index][OFFENE_FELD_WERT_BRUTTO_ANZAHLUNGEN_FW];
            } else if ("F_OFFEN_NETTO_FW".equals(fieldName)) {
                value = data[index][OFFENE_FELD_WERT_NETTO_OFFEN_FW];
            }

            else if ("F_FAELLIGKEITSDATUM".equals(fieldName)) {
                value = data[index][OFFENE_FELD_FAELLIGKEITSDATUM];
            } else if ("F_TAGE_BIS_FAELLIGKEITSDATUM".equals(fieldName)) {
                value = data[index][OFFENE_FELD_TAGE_BIS_FAELLIGKEITSDATUM];
            } else if ("F_FIRMA_LKZ_STATISTIK".equals(fieldName)) {
                value = data[index][OFFENE_FELD_FIRMA_LKZ_STATISTIK];
            } else if ("F_FIRMA_LKZ".equals(fieldName)) {
                value = data[index][OFFENE_FELD_FIRMA_LKZ];
            } else if ("F_VERTRETER".equals(fieldName)) {
                value = data[index][OFFENE_FELD_VERTRETER];
            } else if ("F_MAHNSPERRE".equals(fieldName)) {
                value = data[index][OFFENE_FELD_MAHNSPERRE];
            } else if ("F_SUBREPORT_OFFENE_BUCHUNGEN".equals(fieldName)) {
                value = data[index][OFFENE_SUBREPORT_OFFENE_BUCHUNGEN];
            }
        }
            break;
        case UC_REPORT_ZAHLUNGSJOURNAL: {
            if ("F_RECHNUNGSNUMMER".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_ER_C_NR];
            } else if ("F_FIRMA".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_FIRMA];
            } else if ("F_KOSTENSTELLE".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_KOSTENSTELLE];
            } else if ("F_ZAHLDATUM".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_ZAHLDATUM];
            } else if ("F_BETRAG".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_BETRAG];
            } else if ("F_BETRAG_UST".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_BETRAG_UST];
            } else if ("F_BANK".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_BANK];
            } else if ("F_AUSZUG".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_AUSZUG];
            } else if ("F_WECHSEL".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_WECHSEL];
            } else if ("F_BETRAG_BELEGZEIT".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_BETRAG_MANDANTENWAEHRUNG_ZU_BELEGZEIT];
            } else if ("F_BETRAG_UST_BELEGZEIT".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_BETRAG_UST_MANDANTENWAEHRUNG_ZU_BELEGZEIT];
            } else if ("F_WAEHRUNG".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_BELEGWAEHRUNG];
            } else if ("F_BETRAG_FW".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_BETRAG_FW];
            } else if ("F_BETRAG_UST_FW".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_BETRAG_UST_FW];
            } else if ("F_KONTO".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_KONTO];
            } else if ("F_ZAHLUNGSART".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_ZAHLUNGSART];
            } else if ("F_KASSENBUCH".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_KASSENBUCH];
            } else if ("F_DEBITORENKONTO".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_DEBITORENKONTO];
            } else if ("F_RECHNUNGSART".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_RECHNUNGSART];
            } else if ("F_LAENDERART".equals(fieldName)) {
                value = data[index][ZAHLUNGEN_FELD_LAENDERART];
            }

        }
            break;
        case UC_REPORT_UMSATZ: {
            if ("F_MONAT".equals(fieldName)) {
                value = data[index][UMSATZ_FELD_MONAT];
            } else if ("F_WERT".equals(fieldName)) {
                value = data[index][UMSATZ_FELD_WERT];
            } else if ("F_WERT_UST".equals(fieldName)) {
                value = data[index][UMSATZ_FELD_WERT_UST];
            } else if ("F_WERT_NICHT_ABGERECHNETE_ANZAHLUNGEN".equals(fieldName)) {
                value = data[index][UMSATZ_FELD_WERT_NICHT_ABGERECHNETE_ANZAHLUNGEN];
            } else if ("F_WERT_NICHT_ABGERECHNETE_ANZAHLUNGEN_UST".equals(fieldName)) {
                value = data[index][UMSATZ_FELD_WERT_NICHT_ABGERECHNETE_ANZAHLUNGEN_UST];
            }
        }
            break;
        case UC_REPORT_ALLE: {
            if ("F_BELEGDATUM".equals(fieldName)) {
                value = data[index][FELD_ALLE_BELEGDATUM];
            } else if ("F_BETRAG".equals(fieldName)) {
                value = data[index][FELD_ALLE_BETRAG];
            } else if ("F_BETRAGUST".equals(fieldName)) {
                value = data[index][FELD_ALLE_BETRAGUST];
            } else if ("F_BETRAG_FW".equals(fieldName)) {
                value = data[index][FELD_ALLE_BETRAG_FW];
            } else if ("F_BETRAGUST_FW".equals(fieldName)) {
                value = data[index][FELD_ALLE_BETRAGUST_FW];
            } else if ("F_WERT_ANZAHLUNGEN".equals(fieldName)) {
                value = data[index][FELD_ALLE_WERT_ANZAHLUNGEN];
            } else if ("F_WERT_ANZAHLUNGENUST".equals(fieldName)) {
                value = data[index][FELD_ALLE_WERT_ANZAHLUNGENUST];
            } else if ("F_WERT_ANZAHLUNGEN_FW".equals(fieldName)) {
                value = data[index][FELD_ALLE_WERT_ANZAHLUNGEN_FW];
            } else if ("F_WERT_ANZAHLUNGENUST_FW".equals(fieldName)) {
                value = data[index][FELD_ALLE_WERT_ANZAHLUNGENUST_FW];
            } else if ("F_BEZAHLT".equals(fieldName)) {
                value = data[index][FELD_ALLE_BEZAHLT];
            } else if ("F_BEZAHLT_FW".equals(fieldName)) {
                value = data[index][FELD_ALLE_BEZAHLT_FW];
            } else if ("F_BEZAHLTDATUM".equals(fieldName)) {
                value = data[index][FELD_ALLE_BEZAHLTDATUM];
            } else if ("F_BEZAHLTUST".equals(fieldName)) {
                value = data[index][FELD_ALLE_BEZAHLTUST];
            } else if ("F_BEZAHLTUST_FW".equals(fieldName)) {
                value = data[index][FELD_ALLE_BEZAHLTUST_FW];
            } else if ("F_KOSTENSTELLENUMMER".equals(fieldName)) {
                value = data[index][FELD_ALLE_KOSTENSTELLENUMMER];
            } else if ("F_KUNDE".equals(fieldName)) {
                value = data[index][FELD_ALLE_KUNDE];
            } else if ("F_REVERSECHARGE".equals(fieldName)) {
                value = data[index][FELD_ALLE_REVERSE_CHARGE];
            } else if ("F_STATUS".equals(fieldName)) {
                value = data[index][FELD_ALLE_STATUS];
            } else if ("F_ZOLLBELEGNUMMER".equals(fieldName)) {
                value = data[index][FELD_ALLE_ZOLLBELEGNUMMER];
            } else if ("F_KUNDE_UID".equals(fieldName)) {
                value = data[index][FELD_ALLE_KUNDE_UID];
            } else if ("F_KUNDE2".equals(fieldName)) {
                value = data[index][FELD_ALLE_KUNDE2];
            } else if ("F_KUNDE_STATISTIK".equals(fieldName)) {
                value = data[index][FELD_ALLE_KUNDE_STATISTIK];
            } else if ("F_KUNDE2_STATISTIK".equals(fieldName)) {
                value = data[index][FELD_ALLE_KUNDE2_STATISTIK];
            } else if ("F_MAHNSTUFE".equals(fieldName)) {
                value = data[index][FELD_ALLE_MAHNSTUFE];
            } else if ("F_ORT".equals(fieldName)) {
                value = data[index][FELD_ALLE_ORT];
            } else if ("F_RECHNUNGSNUMMER".equals(fieldName)) {
                value = data[index][FELD_ALLE_RECHNUNGSNUMMER];
            } else if ("F_ZIELDATUM".equals(fieldName)) {
                value = data[index][FELD_ALLE_ZIELDATUM];
            } else if ("F_WECHSEL".equals(fieldName)) {
                value = data[index][FELD_ALLE_WECHSELDATUM];
            } else if ("F_DEBITORENKONTO".equals(fieldName)) {
                value = data[index][FELD_ALLE_DEBITORENKONTO];
            } else if ("F_ADRESSE".equals(fieldName)) {
                value = data[index][FELD_ALLE_ADRESSE];
            } else if ("F_ADRESSE_STATISTIK".equals(fieldName)) {
                value = data[index][FELD_ALLE_ADRESSE_STATISTIK];
            } else if ("F_ZINSEN".equals(fieldName)) {
                value = data[index][FELD_ALLE_ZINSEN];
            } else if ("F_ZAHLTAGE".equals(fieldName)) {
                value = data[index][FELD_ALLE_ZAHLTAGE];
            } else if ("F_VERTRETER".equals(fieldName)) {
                value = data[index][FELD_ALLE_VERTRETER];
            } else if ("F_WAEHRUNG".equals(fieldName)) {
                value = data[index][FELD_ALLE_WAEHRUNG];
            } else if ("F_KURS".equals(fieldName)) {
                value = data[index][FELD_ALLE_KURS];
            } else if ("F_RECHNUNGSNUMMERZUGUTSCHRIFT".equals(fieldName)) {
                value = data[index][FELD_ALLE_RECHNUNGSNUMMERZUGUTSCHRIFT];
            } else if ("F_LAENDERART".equals(fieldName)) {
                value = data[index][FELD_ALLE_LAENDERART];
            }

        }
            break;
        case UC_ZUSAMMENFASSENDE_MELDUNG: {
            if ("F_BELEGDATUM".equals(fieldName)) {
                value = data[index][FELD_ZM_BELEGDATUM];
            } else if ("F_BETRAG".equals(fieldName)) {
                value = data[index][FELD_ZM_BETRAG];
            } else if ("F_BETRAGUST".equals(fieldName)) {
                value = data[index][FELD_ZM_BETRAGUST];
            } else if ("F_BEZAHLT".equals(fieldName)) {
                value = data[index][FELD_ZM_BEZAHLT];
            } else if ("F_BEZAHLTDATUM".equals(fieldName)) {
                value = data[index][FELD_ZM_BEZAHLTDATUM];
            } else if ("F_BEZAHLTUST".equals(fieldName)) {
                value = data[index][FELD_ZM_BEZAHLTUST];
            } else if ("F_KOSTENSTELLENUMMER".equals(fieldName)) {
                value = data[index][FELD_ZM_KOSTENSTELLENUMMER];
            } else if ("F_KUNDE".equals(fieldName)) {
                value = data[index][FELD_ZM_KUNDE];
            } else if ("F_REVERSECHARGE".equals(fieldName)) {
                value = data[index][FELD_ZM_REVERSE_CHARGE];
            } else if ("F_KUNDE_UID".equals(fieldName)) {
                value = data[index][FELD_ZM_KUNDE_UID];
            } else if ("F_KUNDE2".equals(fieldName)) {
                value = data[index][FELD_ZM_KUNDE2];
            } else if ("F_KUNDE_STATISTIK".equals(fieldName)) {
                value = data[index][FELD_ZM_KUNDE_STATISTIK];
            } else if ("F_KUNDE2_STATISTIK".equals(fieldName)) {
                value = data[index][FELD_ZM_KUNDE2_STATISTIK];
            } else if ("F_MAHNSTUFE".equals(fieldName)) {
                value = data[index][FELD_ZM_MAHNSTUFE];
            } else if ("F_ORT".equals(fieldName)) {
                value = data[index][FELD_ZM_ORT];
            } else if ("F_RECHNUNGSNUMMER".equals(fieldName)) {
                value = data[index][FELD_ZM_RECHNUNGSNUMMER];
            } else if ("F_ZIELDATUM".equals(fieldName)) {
                value = data[index][FELD_ZM_ZIELDATUM];
            } else if ("F_WECHSEL".equals(fieldName)) {
                value = data[index][FELD_ZM_WECHSELDATUM];
            } else if ("F_DEBITORENKONTO".equals(fieldName)) {
                value = data[index][FELD_ZM_DEBITORENKONTO];
            } else if ("F_ADRESSE".equals(fieldName)) {
                value = data[index][FELD_ZM_ADRESSE];
            } else if ("F_ADRESSE_STATISTIK".equals(fieldName)) {
                value = data[index][FELD_ZM_ADRESSE_STATISTIK];
            } else if ("F_ZINSEN".equals(fieldName)) {
                value = data[index][FELD_ZM_ZINSEN];
            } else if ("F_ZAHLTAGE".equals(fieldName)) {
                value = data[index][FELD_ZM_ZAHLTAGE];
            } else if ("F_VERTRETER".equals(fieldName)) {
                value = data[index][FELD_ZM_VERTRETER];
            } else if ("F_WAEHRUNG".equals(fieldName)) {
                value = data[index][FELD_ZM_WAEHRUNG];
            } else if ("F_KURS".equals(fieldName)) {
                value = data[index][FELD_ZM_KURS];
            } else if ("F_RECHNUNGSNUMMERZUGUTSCHRIFT".equals(fieldName)) {
                value = data[index][FELD_ZM_RECHNUNGSNUMMERZUGUTSCHRIFT];
            } else if ("F_LAENDERART".equals(fieldName)) {
                value = data[index][FELD_ZM_LAENDERART];
            }

        }
            break;
        case UC_REPORT_WARENAUSGANGSJOURNAL: {
            if ("F_RECHNUNGSNUMMER".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_RECHNUNGSNUMMER];
            } else if ("F_DATUM".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_RECHNUNGSDATUM];
            } else if ("F_PREIS".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_POSITIONSPREIS];
            } else if ("F_GESTPREIS".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_GESTPREIS];
            } else if ("F_KOSTENTRAEGER".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_KOSTENTRAEGER];
            } else if ("F_KUNDENBEZEICHNUNG".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_KUNDENBEZEICHNUNG];
            } else if ("F_KUNDENNUMMER".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_KUNDENNUMMER];
            } else if ("F_ARTIKELNUMMER".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_ARTIKELNUMMER];
            } else if ("F_ARTIKELBEZEICHNUNG".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_ARTIKELBEZEICHNUNG];
            } else if ("F_ARTIKELKLASSE".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_ARTIKELKLASSE];
            } else if ("F_ARTIKELGRUPPE".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_ARTIKELGRUPPE];
            } else if ("F_URSPRUNGSLAND".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_URSPRUNGSLAND];
            } else if ("F_WARENVERKEHRSNUMMER".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_WARENVERKEHRSNUMMER];
            } else if ("F_MENGE".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_MENGE];
            } else if ("F_GRUNDNICHTEINGEHALTEN".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_GRUNDNICHTEINGEHALTEN];
            } else if ("F_EINHEIT".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_EINHEIT];
            } else if ("F_ARTIKELBEZEICHNUNG2".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_ARTIKELBEZEICHNUNG2];
            } else if ("F_RECHNUNGSPROVISION".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_RECHNUNGSPROVISION];
            } else if ("F_PROVISIONSEMPFAENGER".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_PROVISIONSEMPFAENGER];
            } else if ("F_ERLOESKONTO".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_ERLOESKONTO];
            } else if ("F_DEBITORENKONTO".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_DEBITORENKONTO];
            } else if ("F_PLZ".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_PLZ];
            } else if ("F_LKZ".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_LKZ];
            } else if ("F_ADRESSE".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_ADRESSE];
            } else if ("F_MWST".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_MWST];
            } else if ("F_BRANCHE".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_BRANCHE];
            } else if ("F_PARTNERKLASSE".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_PARTNERKLASSE];
            } else if ("F_USTLAND".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_USTLAND];
            } else if ("F_LIEFERSCHEINNUMMER".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_LIEFERSCHEINNUMMER];
            } else if ("F_LIEFERSCHEINDATUM".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_LIEFERSCHEINDATUM];
            } else if ("F_STATISTIKADRESSE_PARTNERIID".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_STATISTIKADRESSE_PARTNER_I_ID];
            } else if ("F_STATISTIKADRESSE_ANREDE".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_STATISTIKADRESSE_ANREDE_C_NR];
            } else if ("F_STATISTIKADRESSE_NAME1".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_STATISTIKADRESSE_C_NAME1];
            } else if ("F_STATISTIKADRESSE_NAME2".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_STATISTIKADRESSE_C_NAME2];
            } else if ("F_STATISTIKADRESSE_NAME3ABTEILUNG".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_STATISTIKADRESSE_C_NAME3ABTEILUNG];
            } else if ("F_STATISTIKADRESSE_STRASSE".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_STATISTIKADRESSE_C_STRASSE];
            } else if ("F_STATISTIKADRESSE_ORT".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_STATISTIKADRESSE_ORT];
            } else if ("F_STATISTIKADRESSE_LAND".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_STATISTIKADRESSE_LAND];
            } else if ("F_STATISTIKADRESSE_PLZ".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_STATISTIKADRESSE_PLZ];
            } else if ("F_PARTNERIID".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_PARTNER_I_ID];
            } else if ("F_WAEHRUNG".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_WAEHRUNG];
            } else if ("F_KURS".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_KURS];
            } else if ("F_RECHNUNGSART".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_RECHNUNGSART];
            } else if ("F_ZURECHNUNG".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_ZURECHNUNG];
            } else if ("F_ARTIKELPROVISION".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_ARTIKELPROVISION];
            } else if ("F_BESTELLNUMMER".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_BESTELLNUMMER];
            } else if ("F_KUNDENNUMMER_RECHNUNGSADRESSE_LS".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_KUNDENNUMMER_RECHNUNGSADRESSE_LS];
            } else if ("F_KUNDENBEZEICHNUNG_RECHNUNGSADRESSE_LS".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_KUNDENBEZEICHNUNG_RECHNUNGSADRESSE_LS];
            } else if ("F_KUNDENKURZBEZEICHNUNG_RECHNUNGSADRESSE_LS".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_KUNDEKURZBEZEICHNUNG_RECHNUNGSADRESSE_LS];
            } else if ("F_KUNDE_HINWEISEXTERN".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_KUNDE_HINWEISEXT];
            } else if ("F_KUNDE_LIEFERDAUER".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_KUNDE_LIEFERDAUER];
            } else if ("F_GEPLANTER_LIEFERTERMIN".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_GEPLANTER_LIEFERTERMIN];
            } else if ("F_KUNDE_HINWEISINTERN".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_KUNDE_HINWEISINT];
            } else if ("F_KUNDE_PROVISIONSEMPFAENGER_KURZZEICHEN".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_KUNDE_PROVISIONSEMPFAENGER_KURZZEICHEN];
            } else if ("F_ARTIKELGEWICHTKG".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_ARTIKEL_GEWICHTKG];
            } else if ("F_LAGER_RECHNUNG".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_LAGER_RECHNUNG];
            } else if ("F_LAGER_LIEFERSCHEIN".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_LAGER_LIEFERSCHEIN];
            } else if ("F_ZIELLAGER_LIEFERSCHEIN".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_ZIELLAGER_LIEFERSCHEIN];
            } else if ("F_KUNDENNUMMER_LIEFERADRESSE_LS".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_KUNDENNUMMER_LIEFERADRESSE_LS];
            } else if ("F_TEXTEINGABE".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_TEXTEINGABE];
            } else if ("F_ILN_LIEFERADRESSE".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_ILN_LIEFERADRESSE];
            } else if ("F_ILN_RECHNUNGSADRESSE".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_ILN_RECHNUNGSADRESSE];
            } else if ("F_LIEFERADRESSE_PARTNERIID".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_LIEFERADRESSE_PARTNER_I_ID];
            } else if ("F_LIEFERADRESSE_ANREDE".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_LIEFERADRESSE_ANREDE_C_NR];
            } else if ("F_LIEFERADRESSE_NAME1".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_LIEFERADRESSE_C_NAME1];
            } else if ("F_LIEFERADRESSE_NAME2".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_LIEFERADRESSE_C_NAME2];
            } else if ("F_LIEFERADRESSE_NAME3ABTEILUNG".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_LIEFERADRESSE_C_NAME3ABTEILUNG];
            } else if ("F_LIEFERADRESSE_STRASSE".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_LIEFERADRESSE_C_STRASSE];
            } else if ("F_LIEFERADRESSE_LAND".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_LIEFERADRESSE_LAND];
            } else if ("F_LIEFERADRESSE_ORT".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_LIEFERADRESSE_ORT];
            } else if ("F_LIEFERADRESSE_PLZ".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_LIEFERADRESSE_PLZ];
            } else if ("F_AUFTRAGSNUMMER".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_AUFTRAG_NUMMER];
            } else if ("F_AUFTRAGBEGRUENDUNG".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_AUFTRAG_BEGRUENDUNG];
            } else if ("F_SETARTIKEL_TYP".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_SETARTIKEL_TYP];
            } else if ("F_PROJEKT".equals(fieldName)) {
                value = data[index][FELD_WARENAUSGANG_PROJEKT];
            }
        }
            break;
        case UC_ZAHLSCHEIN: {
            value = null;
        }
            break;

        }
        return value;
    }

    /**
     * Rechnung drucken.
     * 
     * @param rechnungIId
     *            Integer
     * @param locale
     *            Locale
     * @param bMitLogo
     *            Boolean
     * @param iAnzahlKopien
     *            Integer
     * @param theClientDto
     *            String
     * @return JasperPrint
     * @throws EJBExceptionLP
     */
    public JasperPrintLP[] printRechnung(Integer rechnungIId, Locale locale, Boolean bMitLogo,
            Integer iAnzahlKopien, TheClientDto theClientDto) throws EJBExceptionLP {
        // belegkopien: 0 Der Methode wird die Anzahl der Kopien uebergeben
        // belegkopien: 1 Der Rueckgabetyp der Print-Methode ist JasperPrint []
        if (rechnungIId == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PARAMETER_IS_NULL, new Exception("rechnungIId == null"));
        }
        return buildRechnungReport(rechnungIId, RechnungReportFac.REPORT_RECHNUNG, RechnungReportFac.REPORT_MODUL,
                locale, bMitLogo, iAnzahlKopien, null, false, theClientDto);
    }

    public JasperPrintLP printRechnungAlsMahnung(Integer rechnungIId, Locale locale, Boolean bMitLogo,
            Integer iMahnstufe, TheClientDto theClientDto) throws EJBExceptionLP, RemoteException {
        // belegkopien: 0 Der Methode wird die Anzahl der Kopien uebergeben
        // belegkopien: 1 Der Rueckgabetyp der Print-Methode ist JasperPrint []
        if (rechnungIId == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PARAMETER_IS_NULL, new Exception("rechnungIId == null"));
        }
        JasperPrintLP rechnungsprint = buildRechnungReport(rechnungIId, FinanzReportFac.REPORT_MAHNUNG_AUSFUEHRLICH,
                FinanzReportFac.REPORT_MODUL, locale, bMitLogo, 1, iMahnstufe, false, theClientDto)[0];
        return rechnungsprint;
    }

    /**
     * Gutschrift drucken.
     * 
     * @param rechnungIId
     *            Integer
     * @param locale
     *            Locale
     * @param bMitLogo
     *            Boolean
     * @param iAnzahlKopien
     *            Integer
     * @param theClientDto
     *            String
     * @return JasperPrint
     * @throws EJBExceptionLP
     */
    public JasperPrintLP[] printGutschrift(Integer rechnungIId, Locale locale, Boolean bMitLogo,
            Integer iAnzahlKopien, TheClientDto theClientDto) throws EJBExceptionLP {
        if (rechnungIId == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PARAMETER_IS_NULL, new Exception("rechnungIId == null"));
        }
        return buildRechnungReport(rechnungIId, RechnungReportFac.REPORT_GUTSCHRIFT, RechnungReportFac.REPORT_MODUL,
                locale, bMitLogo, iAnzahlKopien, null, false, theClientDto);
    }

    /**
     * Proformarechnung drucken.
     * 
     * @param rechnungIId
     *            Integer
     * @param locale
     *            Locale
     * @param bMitLogo
     *            Boolean
     * @param iAnzahlKopien
     *            Integer
     * @param theClientDto
     *            String
     * @return JasperPrint
     * @throws EJBExceptionLP
     */
    public JasperPrintLP[] printProformarechnung(Integer rechnungIId, Locale locale, Boolean bMitLogo,
            Integer iAnzahlKopien, TheClientDto theClientDto) throws EJBExceptionLP {
        if (rechnungIId == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PARAMETER_IS_NULL, new Exception("rechnungIId == null"));
        }
        return buildRechnungReport(rechnungIId, RechnungReportFac.REPORT_PROFORMARECHNUNG,
                RechnungReportFac.REPORT_MODUL, locale, bMitLogo, iAnzahlKopien, null, false, theClientDto);
    }

    /**
     * Alle Gutschriften eines Mandanten im Zeitraum drucken
     * 
     * @param krit
     *            ReportJournalKriterienDto
     * @param theClientDto
     *            Date
     * @throws EJBExceptionLP
     * @return JasperPrint
     */
    public JasperPrintLP printGutschriftenAlle(ReportRechnungJournalKriterienDto krit, TheClientDto theClientDto)
            throws EJBExceptionLP {
        return buildAlleReport(krit, RechnungFac.RECHNUNGTYP_GUTSCHRIFT, RechnungReportFac.REPORT_GUTSCHRIFTEN_ALLE,
                theClientDto);
    }

    /**
     * Alle Offenen Rechnungen eines Mandanten im Zeitraum drucken
     * 
     * @param theClientDto
     *            String
     * @param iGeschaeftsjahr
     *            Integer
     * @param bMitGutschriften
     *            Boolean
     * @throws EJBExceptionLP
     * @return JasperPrint
     */
    public JasperPrintLP printRechnungenUmsatz(TheClientDto theClientDto, Integer iGeschaeftsjahr,
            Boolean bMitGutschriften) throws EJBExceptionLP {
        Locale locUI = theClientDto.getLocUi();
        // Monatsnamen localeabhaengig mit Calendar formatieren
        SimpleDateFormat dateformat = new SimpleDateFormat("MMMM", locUI);
        Calendar cal = GregorianCalendar.getInstance(locUI);
        cal.set(Calendar.YEAR, GregorianCalendar.JANUARY, 1);

        useCase = UC_REPORT_UMSATZ;
        try {
            Map<String, Object> mapParameter = new TreeMap<String, Object>();
            mapParameter.put("P_GESCHAEFTSJAHR", iGeschaeftsjahr);
            if (bMitGutschriften.booleanValue()) {
                mapParameter.put(LPReport.P_FILTER, "inklusive Gutschriften");
            } else {
                mapParameter.put(LPReport.P_FILTER, "exklusive Gutschriften");
            }
            MandantDto mandantDto = getMandantFac().mandantFindByPrimaryKey(theClientDto.getMandant(),
                    theClientDto);
            mapParameter.put(LPReport.P_WAEHRUNG, mandantDto.getWaehrungCNr());

            data = new Object[12][5];
            String sKriterium = null;
            if (bMitGutschriften.booleanValue()) {
                sKriterium = RechnungFac.KRIT_MIT_GUTSCHRIFTEN;
            } else {
                sKriterium = RechnungFac.KRIT_OHNE_GUTSCHRIFTEN;
            }

            for (int i = 0; i < data.length; i++) {
                String sMonat = null;
                GregorianCalendar gcBerechnungsdatumVon = null;
                GregorianCalendar gcBerechnungsdatumBis = null;

                switch (i) {
                case 0: {
                    gcBerechnungsdatumVon = new GregorianCalendar(locUI);
                    gcBerechnungsdatumVon.set(iGeschaeftsjahr.intValue(), GregorianCalendar.JANUARY, 1);
                    sMonat = dateformat.format(gcBerechnungsdatumVon.getTime());

                    gcBerechnungsdatumBis = new GregorianCalendar(iGeschaeftsjahr.intValue(),
                            GregorianCalendar.FEBRUARY, 1);
                }
                    break;
                case 1: {
                    gcBerechnungsdatumVon = new GregorianCalendar(locUI);
                    gcBerechnungsdatumVon.set(iGeschaeftsjahr.intValue(), GregorianCalendar.FEBRUARY, 1);
                    sMonat = dateformat.format(gcBerechnungsdatumVon.getTime());

                    gcBerechnungsdatumBis = new GregorianCalendar(iGeschaeftsjahr.intValue(),
                            GregorianCalendar.MARCH, 1);
                }
                    break;
                case 2: {
                    gcBerechnungsdatumVon = new GregorianCalendar(locUI);
                    gcBerechnungsdatumVon.set(iGeschaeftsjahr.intValue(), GregorianCalendar.MARCH, 1);
                    sMonat = dateformat.format(gcBerechnungsdatumVon.getTime());

                    gcBerechnungsdatumBis = new GregorianCalendar(iGeschaeftsjahr.intValue(),
                            GregorianCalendar.APRIL, 1);
                }
                    break;
                case 3: {
                    gcBerechnungsdatumVon = new GregorianCalendar(locUI);
                    gcBerechnungsdatumVon.set(iGeschaeftsjahr.intValue(), GregorianCalendar.APRIL, 1);
                    sMonat = dateformat.format(gcBerechnungsdatumVon.getTime());

                    gcBerechnungsdatumBis = new GregorianCalendar(iGeschaeftsjahr.intValue(), GregorianCalendar.MAY,
                            1);
                }
                    break;
                case 4: {
                    gcBerechnungsdatumVon = new GregorianCalendar(locUI);
                    gcBerechnungsdatumVon.set(iGeschaeftsjahr.intValue(), GregorianCalendar.MAY, 1);
                    sMonat = dateformat.format(gcBerechnungsdatumVon.getTime());

                    gcBerechnungsdatumBis = new GregorianCalendar(iGeschaeftsjahr.intValue(),
                            GregorianCalendar.JUNE, 1);
                }
                    break;
                case 5: {
                    gcBerechnungsdatumVon = new GregorianCalendar(locUI);
                    gcBerechnungsdatumVon.set(iGeschaeftsjahr.intValue(), GregorianCalendar.JUNE, 1);
                    sMonat = dateformat.format(gcBerechnungsdatumVon.getTime());

                    gcBerechnungsdatumBis = new GregorianCalendar(iGeschaeftsjahr.intValue(),
                            GregorianCalendar.JULY, 1);
                }
                    break;
                case 6: {
                    gcBerechnungsdatumVon = new GregorianCalendar(locUI);
                    gcBerechnungsdatumVon.set(iGeschaeftsjahr.intValue(), GregorianCalendar.JULY, 1);
                    sMonat = dateformat.format(gcBerechnungsdatumVon.getTime());

                    gcBerechnungsdatumBis = new GregorianCalendar(iGeschaeftsjahr.intValue(),
                            GregorianCalendar.AUGUST, 1);
                }
                    break;
                case 7: {
                    gcBerechnungsdatumVon = new GregorianCalendar(locUI);
                    gcBerechnungsdatumVon.set(iGeschaeftsjahr.intValue(), GregorianCalendar.AUGUST, 1);
                    sMonat = dateformat.format(gcBerechnungsdatumVon.getTime());

                    gcBerechnungsdatumBis = new GregorianCalendar(iGeschaeftsjahr.intValue(),
                            GregorianCalendar.SEPTEMBER, 1);
                }
                    break;
                case 8: {
                    gcBerechnungsdatumVon = new GregorianCalendar(locUI);
                    gcBerechnungsdatumVon.set(iGeschaeftsjahr.intValue(), GregorianCalendar.SEPTEMBER, 1);
                    sMonat = dateformat.format(gcBerechnungsdatumVon.getTime());

                    gcBerechnungsdatumBis = new GregorianCalendar(iGeschaeftsjahr.intValue(),
                            GregorianCalendar.OCTOBER, 1);
                }
                    break;
                case 9: {
                    gcBerechnungsdatumVon = new GregorianCalendar(locUI);
                    gcBerechnungsdatumVon.set(iGeschaeftsjahr.intValue(), GregorianCalendar.OCTOBER, 1);
                    sMonat = dateformat.format(gcBerechnungsdatumVon.getTime());

                    gcBerechnungsdatumBis = new GregorianCalendar(iGeschaeftsjahr.intValue(),
                            GregorianCalendar.NOVEMBER, 1);
                }
                    break;
                case 10: {
                    gcBerechnungsdatumVon = new GregorianCalendar(locUI);
                    gcBerechnungsdatumVon.set(iGeschaeftsjahr.intValue(), GregorianCalendar.NOVEMBER, 1);
                    sMonat = dateformat.format(gcBerechnungsdatumVon.getTime());

                    gcBerechnungsdatumBis = new GregorianCalendar(iGeschaeftsjahr.intValue(),
                            GregorianCalendar.DECEMBER, 1);
                }
                    break;
                case 11: {
                    gcBerechnungsdatumVon = new GregorianCalendar(locUI);
                    gcBerechnungsdatumVon.set(iGeschaeftsjahr.intValue(), GregorianCalendar.DECEMBER, 1);
                    sMonat = dateformat.format(gcBerechnungsdatumVon.getTime());
                    gcBerechnungsdatumBis = new GregorianCalendar(iGeschaeftsjahr.intValue() + 1,
                            GregorianCalendar.JANUARY, 1);
                }
                    break;
                }
                data[i][UMSATZ_FELD_MONAT] = sMonat;
                // den Umsatz brutto bestimmen
                BigDecimal bdUmsatzBrutto = getRechnungFac().berechneSummeUmsatzBrutto(theClientDto.getMandant(),
                        sKriterium, gcBerechnungsdatumVon, gcBerechnungsdatumBis, theClientDto);
                // den Umsatz netto bestimmen
                BigDecimal bdUmsatzNetto = getRechnungFac().berechneSummeUmsatzNetto(theClientDto.getMandant(),
                        sKriterium, gcBerechnungsdatumVon, gcBerechnungsdatumBis, theClientDto);

                // den Anzahlung Gesamtbrutto bestimmen
                BigDecimal bdAnzahlungBruttoGesamt = getRechnungFac().berechneSummeAnzahlungBrutto(
                        theClientDto.getMandant(), sKriterium, gcBerechnungsdatumVon, gcBerechnungsdatumBis, false,
                        theClientDto);

                // den Anzahlung Gesamtnetto bestimmen
                BigDecimal bdAnzahlungNettoGesamt = getRechnungFac().berechneSummeAnzahlungNetto(
                        theClientDto.getMandant(), sKriterium, gcBerechnungsdatumVon, gcBerechnungsdatumBis, false,
                        theClientDto);

                bdUmsatzBrutto = bdUmsatzBrutto.subtract(bdAnzahlungBruttoGesamt);
                bdUmsatzNetto = bdUmsatzNetto.subtract(bdAnzahlungNettoGesamt);

                // den nichabgerechneten Anzahlungen brutto bestimmen
                BigDecimal bdAnzahlungBruttoNichtAbgerechnet = getRechnungFac().berechneSummeAnzahlungBrutto(
                        theClientDto.getMandant(), sKriterium, gcBerechnungsdatumVon, gcBerechnungsdatumBis, true,
                        theClientDto);

                // den Anzahlung netto bestimmen
                BigDecimal bdAnzahlungNettoGesamtNichtAbgerechnet = getRechnungFac().berechneSummeAnzahlungNetto(
                        theClientDto.getMandant(), sKriterium, gcBerechnungsdatumVon, gcBerechnungsdatumBis, true,
                        theClientDto);

                data[i][UMSATZ_FELD_WERT] = bdUmsatzNetto;
                data[i][UMSATZ_FELD_WERT_UST] = bdUmsatzBrutto.subtract(bdUmsatzNetto);

                data[i][UMSATZ_FELD_WERT_NICHT_ABGERECHNETE_ANZAHLUNGEN] = bdAnzahlungBruttoNichtAbgerechnet;
                data[i][UMSATZ_FELD_WERT_NICHT_ABGERECHNETE_ANZAHLUNGEN_UST] = bdAnzahlungBruttoNichtAbgerechnet
                        .subtract(bdAnzahlungNettoGesamtNichtAbgerechnet);

            }
            initJRDS(mapParameter, RechnungReportFac.REPORT_MODUL, RechnungReportFac.REPORT_RECHNUNGEN_UMSATZ,
                    theClientDto.getMandant(), theClientDto.getLocUi(), theClientDto);
            return getReportPrint();
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
            return null;
        }
    }

    /**
     * RE/AR/PR drucken
     * 
     * @param rechnungIId
     *            Integer
     * @param sReportName
     *            String
     * @param locale
     *            Locale
     * @param bMitLogo
     *            Boolean
     * @param iAnzahlKopien
     *            Integer
     * @param theClientDto
     *            String
     * @return JasperPrint
     * @throws EJBExceptionLP
     */
    private JasperPrintLP[] buildRechnungReport(Integer rechnungIId, String sReportName, String sReportModul,
            Locale locale, Boolean bMitLogo, Integer iAnzahlKopien, Integer iMahnstufe,
            boolean bSortiertNachArtikelnummer, TheClientDto theClientDto) throws EJBExceptionLP {

        useCase = UC_RE_GS_PR;
        try {
            // Rechnung holen
            final RechnungDto rechnungDto = getRechnungFac().rechnungFindByPrimaryKey(rechnungIId);
            // Rechnung im Reverse Charge Verfahren ?
            final boolean bReverseCharge = Helper.short2boolean(rechnungDto.getBReversecharge());

            // Zur detaillierten UST-Auflistung
            final Set<?> mwstSatzKeys = getMandantFac().mwstsatzIIdFindAllByMandant(rechnungDto.getMandantCNr(),
                    theClientDto);
            final LinkedHashMap<Integer, MwstsatzReportDto> mwstMap = new LinkedHashMap<Integer, MwstsatzReportDto>();
            // Fuer jeden UST-Satz gibt es einen Eintrag
            for (Iterator<?> iter = mwstSatzKeys.iterator(); iter.hasNext();) {
                Integer item = (Integer) iter.next();
                MwstsatzReportDto mwstsatzReportDto = new MwstsatzReportDto();
                mwstMap.put(item, mwstsatzReportDto);
            }
            // Kunde holen
            final KundeDto kundeDto = getKundeFac().kundeFindByPrimaryKey(rechnungDto.getKundeIId(), theClientDto);
            // Sollen die Rabatte auf der Rechnung angedruckt werden?
            final boolean bDruckeRabatt = Helper.short2boolean(kundeDto.getBRechnungsdruckmitrabatt());
            // Positionen der Rechnung holen
            final RechnungPositionDto[] rePos = getRechnungFac().getRechnungPositionenByRechnungIId(rechnungIId,
                    theClientDto);
            // die Lieferscheindaten werden in HashMaps gecacht, Schluessel ist
            // jeweils die LS-IId
            final HashMap<Integer, LieferscheinDto> hmLSDto = new HashMap<Integer, LieferscheinDto>();
            // Lieferscheinpositionen cachen
            final HashMap<Integer, LieferscheinpositionDto[]> hmLSPosDtos = new HashMap<Integer, LieferscheinpositionDto[]>();
            final HashMap<Integer, Object[][]> hmLSData = new HashMap<Integer, Object[][]>();
            // Auch die anzudruckenden Stuecklistenpositionen, key ist die
            // ArtikelIId
            final HashMap<Integer, StuecklisteInfoDto> hmStklPos = new HashMap<Integer, StuecklisteInfoDto>();
            // Auch die Artikel, key ist die ArtikelIId
            final HashMap<Integer, ArtikelDto> hmArtikel = new HashMap<Integer, ArtikelDto>();
            // Nach jeder mengenbehafteten Position eine Leerzeile einfuegen?
            ParametermandantDto parameter = getParameterFac().getMandantparameter(theClientDto.getMandant(),
                    ParameterFac.KATEGORIE_ALLGEMEIN,
                    ParameterFac.PARAMETER_LEERZEILE_NACH_MENGENBEHAFTETERPOSITION);
            final boolean bLeerzeileNachMengenbehafteterPosition = ((Boolean) parameter.getCWertAsObject())
                    .booleanValue();
            // Beinhaltet Chargennummer die Mindesthalbarkeit MHD?
            ParametermandantDto parameter_MhdInCharge = getParameterFac().getMandantparameter(
                    theClientDto.getMandant(), ParameterFac.KATEGORIE_ARTIKEL,
                    ParameterFac.PARAMETER_CHARGENNUMMER_BEINHALTET_MINDESTHALTBARKEITSDATUM);
            ParametermandantDto parameterAbweichung = getParameterFac().getMandantparameter(
                    theClientDto.getMandant(), ParameterFac.KATEGORIE_RECHNUNG,
                    ParameterFac.PARAMETER_MAXIMALE_ABWEICHUNG_SUMMENAUSDRUCK);
            final boolean bChargennummerBeinhaltetMindesthaltbarkeitsdatum = ((Boolean) parameter_MhdInCharge
                    .getCWertAsObject()).booleanValue();
            final Double dAbweichung = (Double) parameterAbweichung.getCWertAsObject();

            // jetzt wird die anzahl der zeilen berechnet, gleichzeitig werden
            // alle erforderlichen Daten geholt
            final int rows = getZeilenAnzahlDesRechnungsDrucksUndCacheDaten(rePos, hmLSDto, hmLSPosDtos, hmLSData,
                    hmStklPos, hmArtikel, bLeerzeileNachMengenbehafteterPosition, theClientDto);
            // Datenarray kreieren
            data = new Object[rows][RECHNUNG_ANZAHL_SPALTEN];
            // Artikelpositionsnummer fuer alle mengen- und preisbehafteten
            // positionen
            iArtikelpositionsnummer = new Integer(1);
            // seitenumbruch: deklarieren
            Boolean bSeitenumbruch = new Boolean(false);
            int index = 0;
            for (int p = 0; p < rePos.length; p++) {
                data[index][RECHNUNG_FELD_POSITIONSOBJEKT] = getSystemReportFac()
                        .getPositionForReport(LocaleFac.BELEGART_RECHNUNG, rePos[p].getIId(), theClientDto);
                data[index][RECHNUNG_FELD_INTERNAL_IID] = rePos[p].getIId();

                // 15145
                if (rePos[p].getAuftragpositionIId() != null) {
                    AuftragpositionDto abPosDto = getAuftragpositionFac()
                            .auftragpositionFindByPrimaryKey(rePos[p].getAuftragpositionIId());
                    AuftragDto auftragDto = getAuftragFac().auftragFindByPrimaryKey(abPosDto.getBelegIId());

                    data[index][RECHNUNG_FELD_AUFTRAG_BESTELLDATUM] = auftragDto.getDBestelldatum();
                    data[index][RECHNUNG_FELD_AUFTRAG_BESTELLNUMMER] = auftragDto.getCBestellnummer();
                    data[index][RECHNUNG_FELD_AUFTRAG_NUMMER] = auftragDto.getCNr();
                    data[index][RECHNUNG_FELD_AUFTRAG_PROJEKT] = auftragDto.getCBezProjektbezeichnung();
                }

                if (rePos[p].getTypCNr() != null) {
                    if (rePos[p].getRechnungpositionartCNr().equals(RechnungFac.POSITIONSART_RECHNUNG_POSITION)) {
                        index = addPositionToDataPosition(rechnungDto, rePos[p], mwstMap, index, bDruckeRabatt,
                                bSeitenumbruch, theClientDto);
                        index++;
                    }
                } else {
                    if (rePos[p].getRechnungpositionartCNr()
                            .equals(RechnungFac.POSITIONSART_RECHNUNG_SEITENUMBRUCH)) {
                        // seitenumbruch: togglemodus
                        bSeitenumbruch = new Boolean(!bSeitenumbruch.booleanValue());
                    }
                    // seitenumbruch: uebergeben
                    data[index][RECHNUNG_FELD_B_SEITENUMBRUCH] = bSeitenumbruch;
                    // Artikelpositionen
                    if (rePos[p].getRechnungpositionartCNr().equals(RechnungFac.POSITIONSART_RECHNUNG_IDENT)
                            || rePos[p].getRechnungpositionartCNr()
                                    .equals(RechnungFac.POSITIONSART_RECHNUNG_HANDEINGABE)) {
                        // daten anhaengen
                        index = addPositionToDataIdentHandeingabe(rechnungDto, rePos[p], bDruckeRabatt, mwstMap,
                                hmArtikel, hmStklPos, bSeitenumbruch, index, locale,
                                bLeerzeileNachMengenbehafteterPosition,
                                bChargennummerBeinhaltetMindesthaltbarkeitsdatum, theClientDto);
                    } else if (rePos[p].getRechnungpositionartCNr()
                            .equals(RechnungFac.POSITIONSART_RECHNUNG_LIEFERSCHEIN)) {
                        index = addPositionToDataLieferschein(rechnungDto, rePos[p], bDruckeRabatt, mwstMap,
                                hmLSDto, hmLSPosDtos, hmLSData, locale, bSeitenumbruch, index,
                                bLeerzeileNachMengenbehafteterPosition,
                                bChargennummerBeinhaltetMindesthaltbarkeitsdatum, theClientDto);
                    } else if (rePos[p].getRechnungpositionartCNr()
                            .equals(RechnungFac.POSITIONSART_RECHNUNG_INTELLIGENTE_ZWISCHENSUMME)) {
                        index = addPositionToDataIntelligenteZwischensumme(rechnungDto, rePos[p], bDruckeRabatt,
                                mwstMap, hmArtikel, hmStklPos, bSeitenumbruch, index, locale,
                                bLeerzeileNachMengenbehafteterPosition,
                                bChargennummerBeinhaltetMindesthaltbarkeitsdatum, theClientDto);
                    }
                    // Betrifft Positionen
                    else if (rePos[p].getRechnungpositionartCNr()
                            .equals(RechnungFac.POSITIONSART_RECHNUNG_BETRIFFT)) {
                        data[index][RECHNUNG_FELD_POSITIONSART] = rePos[p].getRechnungpositionartCNr();
                        data[index][RECHNUNG_FELD_FREIERTEXT] = rePos[p].getCBez();
                        index++;
                    }
                    // Ursprung Positionen
                    else if (rePos[p].getRechnungpositionartCNr()
                            .equals(RechnungFac.POSITIONSART_RECHNUNG_URSPRUNGSLAND)) {
                        data[index][RECHNUNG_FELD_POSITIONSART] = rePos[p].getRechnungpositionartCNr();
                        data[index][RECHNUNG_FELD_FREIERTEXT] = rePos[p].getCBez();
                        index++;
                    } else if (rePos[p].getRechnungpositionartCNr()
                            .equals(AngebotServiceFac.ANGEBOTPOSITIONART_ENDSUMME)) {
                        data[index][RECHNUNG_FELD_POSITIONSART] = rePos[p].getPositionsartCNr();

                        index++;
                    }
                    // Texteingabe Positionen
                    else if (rePos[p].getRechnungpositionartCNr()
                            .equals(RechnungFac.POSITIONSART_RECHNUNG_TEXTEINGABE)) {
                        data[index][RECHNUNG_FELD_POSITIONSART] = rePos[p].getRechnungpositionartCNr();
                        // lt. WH soll ein leerer text als leerzeile erscheinen
                        String sText = rePos[p].getXTextinhalt();
                        if (sText != null && sText.trim().equals("")) {
                            data[index] = getLeerzeile(bSeitenumbruch);
                        } else {
                            data[index][RECHNUNG_FELD_FREIERTEXT] = sText;
                        }
                        index++;
                    }
                    // Textbaustein Positionen
                    else if (rePos[p].getRechnungpositionartCNr()
                            .equals(RechnungFac.POSITIONSART_RECHNUNG_TEXTBAUSTEIN)) {
                        // Dto holen
                        MediastandardDto oMediastandardDto = getMediaFac()
                                .mediastandardFindByPrimaryKey(rePos[p].getMediastandardIId());
                        // zum Drucken vorbereiten
                        BelegPositionDruckTextbausteinDto druckDto = printTextbaustein(oMediastandardDto,
                                theClientDto);
                        data[index][RECHNUNG_FELD_FREIERTEXT] = druckDto.getSFreierText();
                        data[index][RECHNUNG_FELD_IMAGE] = druckDto.getOImage();

                        data[index][RECHNUNG_FELD_POSITIONSART] = RechnungFac.POSITIONSART_RECHNUNG_TEXTBAUSTEIN;
                        index++;
                    }
                    // Leerzeile Positionen
                    else if (rePos[p].getRechnungpositionartCNr()
                            .equals(RechnungFac.POSITIONSART_RECHNUNG_LEERZEILE)) {
                        data[index] = getLeerzeile(bSeitenumbruch);
                        index++;
                    }
                }
            }

            // PJ 16369
            if (bSortiertNachArtikelnummer) {
                for (int i = data.length - 1; i > 0; --i) {
                    for (int j = 0; j < i; ++j) {
                        Object[] o = data[j];
                        Object[] o1 = data[j + 1];

                        String sArtikelnummer1 = "";

                        if (o[RECHNUNG_FELD_IDENTNUMMER] != null) {
                            sArtikelnummer1 = (String) o[RECHNUNG_FELD_IDENTNUMMER];
                        }

                        String sArtikelnummer2 = "";

                        if (o1[RECHNUNG_FELD_IDENTNUMMER] != null) {
                            sArtikelnummer2 = (String) o1[RECHNUNG_FELD_IDENTNUMMER];
                        }

                        if (sArtikelnummer1.compareTo(sArtikelnummer2) > 0) {
                            data[j] = o1;
                            data[j + 1] = o;
                        }
                    }
                }
            }

            AnsprechpartnerDto oAnsprechpartner = null;
            if (rechnungDto.getAnsprechpartnerIId() != null) {
                oAnsprechpartner = getAnsprechpartnerFac()
                        .ansprechpartnerFindByPrimaryKey(rechnungDto.getAnsprechpartnerIId(), theClientDto);
            }
            MandantDto mandantDto = getMandantFac().mandantFindByPrimaryKey(theClientDto.getMandant(),
                    theClientDto);
            // Parameter
            Map<String, Object> mapParameter = new TreeMap<String, Object>();
            if (FinanzReportFac.REPORT_MAHNUNG_AUSFUEHRLICH.equals(sReportName)) {
                mapParameter = getFinanzReportFac().getMahnungsParameterFuerRechnung(theClientDto, rechnungIId,
                        iMahnstufe);
            }

            // CK: PJ 13849
            mapParameter.put("P_BEARBEITER",
                    getPersonalFac().getPersonRpt(rechnungDto.getPersonalIIdAnlegen(), theClientDto));
            mapParameter.put(LPReport.P_MANDANTADRESSE, Helper.formatMandantAdresse(mandantDto));

            // SK Comment out Immer die Adresse des Kunden
            // if (kundeDto.getPartnerIIdRechnungsadresse() != null) {
            // PartnerDto kundeDtoRechnungsadresse =
            // getPartnerFac().partnerFindByPrimaryKey(
            // kundeDto.getPartnerIIdRechnungsadresse(), theClientDto);
            // mapParameter.put("P_KUNDE_ADRESSBLOCK",
            // formatAdresseFuerAusdruck(kundeDtoRechnungsadresse,
            // oAnsprechpartner, mandantDto, locale));
            //
            // KundeDto rechnungKunde =
            // getKundeFac().kundeFindByiIdPartnercNrMandantOhneExc(
            // kundeDtoRechnungsadresse.getIId(),
            // theClientDto.getMandant(), theClientDto);
            // if (rechnungKunde != null) {
            // mapParameter.put("P_RECHNUNG_LIEFERANTENNR",
            // rechnungKunde.getCLieferantennr());
            // }
            // }
            // else {
            mapParameter.put("P_KUNDE_ADRESSBLOCK", formatAdresseFuerAusdruck(kundeDto.getPartnerDto(),
                    oAnsprechpartner, mandantDto, locale, LocaleFac.BELEGART_RECHNUNG));

            if (oAnsprechpartner != null) {
                mapParameter.put("P_ANSPRECHPARTNER_KUNDE_ADRESSBLOCK",
                        getPartnerFac().formatFixAnredeTitelName2Name1FuerAdresskopf(
                                oAnsprechpartner.getPartnerDto(), locale, null));
            }

            // }
            // Debitorenkonto des Kunden
            if (kundeDto.getIidDebitorenkonto() != null) {
                KontoDto kontoDto = getFinanzFac().kontoFindByPrimaryKey(kundeDto.getIidDebitorenkonto());
                mapParameter.put("P_KUNDE_DEBITORENKONTO", kontoDto.getCNr());
            }

            // PJ17820
            mapParameter.put("P_AUFTRAGANZAHL", getGesamtAnzahlAnAuftraegen(rechnungDto));

            // Fuer Voest
            mapParameter.put("P_KUNDE_NAME1", kundeDto.getPartnerDto().getCName1nachnamefirmazeile1());
            mapParameter.put("P_KUNDE_NAME2", kundeDto.getPartnerDto().getCName2vornamefirmazeile2());
            mapParameter.put("P_KUNDE_NAME3", kundeDto.getPartnerDto().getCName3vorname2abteilung());

            mapParameter.put("P_KUNDE_STRASSE", kundeDto.getPartnerDto().getCStrasse());

            if (kundeDto.getPartnerDto().getLandplzortDto() != null) {
                mapParameter.put("P_KUNDE_LKZ", kundeDto.getPartnerDto().getLandplzortDto().getLandDto().getCLkz());
                mapParameter.put("P_KUNDE_PLZ", kundeDto.getPartnerDto().getLandplzortDto().getCPlz());
                mapParameter.put("P_KUNDE_ORT", kundeDto.getPartnerDto().getLandplzortDto().getOrtDto().getCName());
            }

            mapParameter.put("P_KUNDE_UID", kundeDto.getPartnerDto().getCUid());
            mapParameter.put("P_KUNDE_EORI", kundeDto.getPartnerDto().getCEori());
            mapParameter.put("P_KUNDE_FREMDSYSTEMNR", kundeDto.getCFremdsystemnr());
            mapParameter.put("P_KUNDE_TOUR", kundeDto.getCTour());
            mapParameter.put("P_KUNDE_KUNDENNUMMER", kundeDto.getIKundennummer());
            mapParameter.put("P_ILN", kundeDto.getPartnerDto().getCIln());
            mapParameter.put("P_MAXIMALE_ABWEICHUNG", dAbweichung);

            ParametermandantDto parameterWerbeabgabe = getParameterFac().getMandantparameter(
                    theClientDto.getMandant(), ParameterFac.KATEGORIE_ARTIKEL,
                    ParameterFac.PARAMETER_WERBEABGABE_PROZENT);
            mapParameter.put("P_WERBEABGABE_PROZENT", (Integer) parameterWerbeabgabe.getCWertAsObject());
            ParametermandantDto parameterWerbeabgabeArtikel = getParameterFac().getMandantparameter(
                    theClientDto.getMandant(), ParameterFac.KATEGORIE_ARTIKEL,
                    ParameterFac.PARAMETER_WERBEABGABE_ARTIKEL);
            mapParameter.put("P_WERBEABGABE_ARTIKEL", parameterWerbeabgabeArtikel.getCWert());

            if (kundeDto.getSHinweisextern() != null) {
                mapParameter.put("P_KUNDE_HINWEISEXTERN", kundeDto.getSHinweisextern());
            }
            mapParameter.put("P_BELEGKENNUNG", rechnungDto.getCNr());
            mapParameter.put("P_RECHNUNGSART", rechnungDto.getRechnungartCNr());
            // Kopftext
            String sKopftext = rechnungDto.getCKopftextuebersteuert();
            if (sKopftext == null || sKopftext.length() == 0) {

                if (rechnungDto.getRechnungartCNr().equals(RechnungFac.RECHNUNGART_GUTSCHRIFT)) {
                    GutschrifttextDto oRechnungtextDto = getRechnungServiceFac()
                            .gutschrifttextFindByMandantLocaleCNr(mandantDto.getCNr(),
                                    kundeDto.getPartnerDto().getLocaleCNrKommunikation(),
                                    MediaFac.MEDIAART_KOPFTEXT);
                    if (oRechnungtextDto != null) {
                        sKopftext = oRechnungtextDto.getCTextinhalt();
                    } else {
                        sKopftext = "";
                    }
                } else {
                    RechnungtextDto oRechnungtextDto = getRechnungServiceFac().rechnungtextFindByMandantLocaleCNr(
                            mandantDto.getCNr(), kundeDto.getPartnerDto().getLocaleCNrKommunikation(),
                            MediaFac.MEDIAART_KOPFTEXT);
                    if (oRechnungtextDto != null) {
                        sKopftext = oRechnungtextDto.getCTextinhalt();
                    } else {
                        sKopftext = "";
                    }
                }
            }
            mapParameter.put("P_KOPFTEXT", Helper.formatStyledTextForJasper(sKopftext));
            // Fusstext
            String sFusstext = rechnungDto.getCFusstextuebersteuert();
            if (sFusstext == null || sFusstext.length() == 0) {
                if (rechnungDto.getRechnungartCNr().equals(RechnungFac.RECHNUNGART_GUTSCHRIFT)) {
                    GutschrifttextDto oRechnungtextDto = getRechnungServiceFac()
                            .gutschrifttextFindByMandantLocaleCNr(mandantDto.getCNr(),
                                    kundeDto.getPartnerDto().getLocaleCNrKommunikation(),
                                    MediaFac.MEDIAART_FUSSTEXT);
                    if (oRechnungtextDto != null) {
                        sFusstext = oRechnungtextDto.getCTextinhalt();
                    } else {
                        sFusstext = "";
                    }
                } else {
                    RechnungtextDto oRechnungtextDto = getRechnungServiceFac().rechnungtextFindByMandantLocaleCNr(
                            mandantDto.getCNr(), kundeDto.getPartnerDto().getLocaleCNrKommunikation(),
                            MediaFac.MEDIAART_FUSSTEXT);
                    if (oRechnungtextDto != null) {
                        sFusstext = oRechnungtextDto.getCTextinhalt();
                    } else {
                        sFusstext = "";
                    }
                }

            }
            mapParameter.put("P_FUSSTEXT", Helper.formatStyledTextForJasper(sFusstext));
            // Kommunikationsdaten des Ansprechpartners
            // belegkommunikation: 1 die partnerIId des ansprechpartners brauch
            // ich
            Integer partnerIIdAnsprechpartner = null;
            if (oAnsprechpartner != null) {
                partnerIIdAnsprechpartner = oAnsprechpartner.getPartnerIIdAnsprechpartner();
            }
            // belegkommunikation: 2 daten holen
            String sEmail = getPartnerFac().partnerkommFindRespectPartnerAsStringOhneExec(partnerIIdAnsprechpartner,
                    kundeDto.getPartnerDto(), PartnerFac.KOMMUNIKATIONSART_EMAIL, theClientDto.getMandant(),
                    theClientDto);
            String sFax = getPartnerFac().partnerkommFindRespectPartnerAsStringOhneExec(partnerIIdAnsprechpartner,
                    kundeDto.getPartnerDto(), PartnerFac.KOMMUNIKATIONSART_FAX, theClientDto.getMandant(),
                    theClientDto);
            String sTelefon = getPartnerFac().partnerkommFindRespectPartnerAsStringOhneExec(
                    partnerIIdAnsprechpartner, kundeDto.getPartnerDto(), PartnerFac.KOMMUNIKATIONSART_TELEFON,
                    theClientDto.getMandant(), theClientDto);
            // belegkommunikation: 3 daten als parameter an den Report
            // weitergeben
            mapParameter.put(LPReport.P_ANSPRECHPARTNEREMAIL, sEmail != null ? sEmail : "");
            mapParameter.put(LPReport.P_ANSPRECHPARTNERFAX, sFax != null ? sFax : "");
            mapParameter.put(LPReport.P_ANSPRECHPARTNERTELEFON, sTelefon != null ? sTelefon : "");
            // IG Lieferung / Drittland

            Integer partnerIIdLieferadresse = null;
            if (rechnungDto.getAuftragIId() != null) {
                AuftragDto auftragDto = getAuftragFac().auftragFindByPrimaryKey(rechnungDto.getAuftragIId());
                if (auftragDto.getKundeIIdLieferadresse() != null) {
                    partnerIIdLieferadresse = getKundeFac()
                            .kundeFindByPrimaryKeySmall(auftragDto.getKundeIIdLieferadresse()).getPartnerIId();
                }
            }
            if (partnerIIdLieferadresse == null) {
                partnerIIdLieferadresse = kundeDto.getPartnerIId();
            }
            String laenderartCNr = getFinanzServiceFac().getLaenderartZuPartner(partnerIIdLieferadresse,
                    theClientDto);

            boolean bIGLieferung = false;
            boolean bWarenerklaerung = false;
            if (laenderartCNr != null) {
                if (laenderartCNr.equals(FinanzFac.LAENDERART_EU_AUSLAND_MIT_UID)) {
                    // nur mit UID
                    bIGLieferung = true;
                }
                if (laenderartCNr.equals(FinanzFac.LAENDERART_DRITTLAND)) {
                    bWarenerklaerung = true;
                }
            }
            mapParameter.put("P_IGWARENVERKEHR", new Boolean(bIGLieferung));
            mapParameter.put("P_WARENERKLAERUNG", new Boolean(bWarenerklaerung));
            // Reverse Charge
            Boolean bReverseChargeInland = Boolean.FALSE;
            Boolean bReverseChargeAusland = Boolean.FALSE;
            if (bReverseCharge) {
                if (laenderartCNr != null) {
                    if (laenderartCNr.equals(FinanzFac.LAENDERART_INLAND)) {
                        bReverseChargeInland = Boolean.TRUE;
                    } else {
                        bReverseChargeAusland = Boolean.TRUE;
                    }
                }
            }
            mapParameter.put("P_REVERSECHARGE_INLAND", bReverseChargeInland);
            mapParameter.put("P_REVERSECHARGE_AUSLAND", bReverseChargeAusland);
            // Kostenstelle der Rechnung
            if (rechnungDto.getKostenstelleIId() != null) {
                KostenstelleDto kostenstelleDto = getSystemFac()
                        .kostenstelleFindByPrimaryKey(rechnungDto.getKostenstelleIId());
                mapParameter.put(LPReport.P_KOSTENSTELLE, kostenstelleDto.getCNr());
            }
            mapParameter.put(LPReport.P_LIEFERBEDINGUNGEN, Helper.formatStyledTextForJasper(getMediaFac()
                    .mediastandardFindByCNrDatenformatCNrMandantCNr(MediaFac.MEDIASTANDARD_LIEFERBEDINGUNGEN,
                            MediaFac.DATENFORMAT_MIMETYPE_TEXT_HTML, theClientDto.getMandant(),
                            kundeDto.getPartnerDto().getLocaleCNrKommunikation(), theClientDto)
                    .getOMediaText()));
            mapParameter.put(LPReport.P_EIGENTUMSVORBEHALT, Helper.formatStyledTextForJasper(getMediaFac()
                    .mediastandardFindByCNrDatenformatCNrMandantCNr(MediaFac.MEDIASTANDARD_EIGENTUMSVORBEHALT,
                            MediaFac.DATENFORMAT_MIMETYPE_TEXT_HTML, theClientDto.getMandant(),
                            kundeDto.getPartnerDto().getLocaleCNrKommunikation(), theClientDto)
                    .getOMediaText()));

            mapParameter.put("P_RABATTSPALTE_DRUCKEN", new Boolean(bDruckeRabatt));

            String sIhreBestellNummer = null;
            String sAuftragsnummer = null;
            if (rechnungDto.getAuftragIId() != null) {
                // wenn die AR einem Auftrag zugeordnet ist, kommen Auftrags-
                // und Kundenbestellnummer aus der AB
                AuftragDto auftragDto = getAuftragFac().auftragFindByPrimaryKey(rechnungDto.getAuftragIId());
                sAuftragsnummer = auftragDto.getCNr();
                sIhreBestellNummer = auftragDto.getCBestellnummer();
                befuelleParameterLieferDaten(auftragDto.getKundeIIdLieferadresse(), mapParameter, mandantDto,
                        locale, theClientDto);

                // AUFTRAGSEIGENSCHAFTEN
                Hashtable<?, ?> hAE = getAuftragReportFac().getAuftragEigenschaften(rechnungDto.getAuftragIId(),
                        theClientDto);
                if (hAE != null) {
                    mapParameter.put(P_AUFTRAGEIGENSCHAFT_FA, hAE.get(AuftragReportFac.AUFTRAG_EIGENSCHAFTEN_FA));
                    mapParameter.put(P_AUFTRAGEIGENSCHAFT_CLUSTER,
                            hAE.get(AuftragReportFac.AUFTRAG_EIGENSCHAFTEN_CLUSTER));
                    mapParameter.put(P_AUFTRAGEIGENSCHAFT_EQNR,
                            hAE.get(AuftragReportFac.AUFTRAG_EIGENSCHAFTEN_EQNR));
                }
            } else if (rechnungDto.getLieferscheinIId() != null) {
                // AR ist einem LS zugeordnet
                LieferscheinDto lsDto = getLieferscheinFac()
                        .lieferscheinFindByPrimaryKey(rechnungDto.getLieferscheinIId(), theClientDto);
                // dann kommt die Bestellnummer aus dem LS
                sIhreBestellNummer = lsDto.getCBestellnummer();
                mapParameter.put("P_AUSLIEFERDATUM",
                        Helper.formatDatum(Helper.cutTimestamp(lsDto.getTLiefertermin()), locale));

                // SK 14572
                befuelleParameterLieferDaten(lsDto.getKundeIIdLieferadresse(), mapParameter, mandantDto, locale,
                        theClientDto);

                if (lsDto.getLieferscheinartCNr().equals(LieferscheinFac.LSART_AUFTRAG)) {
                    // Die Nummer des Hauptauftrags des LS wird gedruckt.
                    if (lsDto.getAuftragIId() != null) {
                        AuftragDto auftragDto = getAuftragFac().auftragFindByPrimaryKey(lsDto.getAuftragIId());
                        sAuftragsnummer = auftragDto.getCNr();
                        // SK 14572
                        // befuelleParameterLieferDaten(auftragDto.
                        // getKundeIIdLieferadresse(),
                        // mapParameter, mandantDto, locale, theClientDto);
                        // befuelleParameterLieferDatenRechnungsadresse(auftragDto
                        // .
                        // getKundeIIdRechnungsadresse(),
                        // mapParameter, mandantDto, locale, theClientDto);
                        // AUFTRAGSEIGENSCHAFTEN
                        Hashtable<?, ?> hAE = getAuftragReportFac().getAuftragEigenschaften(lsDto.getAuftragIId(),
                                theClientDto);
                        if (hAE != null) {
                            mapParameter.put(P_AUFTRAGEIGENSCHAFT_FA,
                                    hAE.get(AuftragReportFac.AUFTRAG_EIGENSCHAFTEN_FA));
                            mapParameter.put(P_AUFTRAGEIGENSCHAFT_CLUSTER,
                                    hAE.get(AuftragReportFac.AUFTRAG_EIGENSCHAFTEN_CLUSTER));
                            mapParameter.put(P_AUFTRAGEIGENSCHAFT_EQNR,
                                    hAE.get(AuftragReportFac.AUFTRAG_EIGENSCHAFTEN_EQNR));
                        }
                    }
                }
                // SK 14572
                // else {
                // // Freier Lieferschein, oder Lieferant Lieferschein
                // befuelleParameterLieferDaten(lsDto.getKundeIIdLieferadresse(),
                // mapParameter,
                // mandantDto, locale, theClientDto);
                // befuelleParameterLieferDatenRechnungsadresse(lsDto.
                // getKundeIIdRechnungsadresse(),
                // mapParameter,
                // mandantDto, locale, theClientDto);
                // }

            }
            befuelleParameterLieferDatenRechnungsadresse(rechnungDto.getKundeIId(), mapParameter, mandantDto,
                    locale, theClientDto);

            if (rechnungDto.getKundeIIdStatistikadresse() != null) {
                if (!rechnungDto.getKundeIIdStatistikadresse().equals(kundeDto.getPartnerIIdRechnungsadresse())) {
                    KundeDto statistikKunde = getKundeFac()
                            .kundeFindByPrimaryKey(rechnungDto.getKundeIIdStatistikadresse(), theClientDto);
                    AnsprechpartnerDto akunde = null;
                    if (statistikKunde.getAnsprechpartnerDto() != null) {
                        AnsprechpartnerDto[] anspkunde = statistikKunde.getAnsprechpartnerDto();
                        akunde = anspkunde[0];
                    }
                    mapParameter.put("P_STATISTIKADRESS",
                            formatAdresseFuerAusdruck(statistikKunde.getPartnerDto(), akunde, mandantDto, locale));
                    mapParameter.put("P_STATISTIKKUNDE_FREMDSYSTEMNR", statistikKunde.getCFremdsystemnr());
                    mapParameter.put("P_STATISTIKKUNDE_LIEFERANTENNR", statistikKunde.getCLieferantennr());
                    if (statistikKunde.getIidDebitorenkonto() != null) {
                        KontoDto kontoDto = getFinanzFac()
                                .kontoFindByPrimaryKey(statistikKunde.getIidDebitorenkonto());
                        mapParameter.put("P_STATISTIKKUNDE_DEBITORENKONTO", kontoDto.getCNr());
                    }
                    mapParameter.put("P_STATISTIKKUNDE_TOUR", statistikKunde.getCTour());

                    mapParameter.put("P_STATISTIKKUNDE_ILN", statistikKunde.getPartnerDto().getCIln());
                }
            }
            // falls die RE eine eigene bestellnummer hat, nehm ich diese
            if (rechnungDto.getCBestellnummer() != null) {
                sIhreBestellNummer = rechnungDto.getCBestellnummer();
            }
            mapParameter.put("P_IHRE_BESTELLNUMMER", sIhreBestellNummer);
            mapParameter.put("P_AUFTRAGSNUMMER", sAuftragsnummer);
            mapParameter.put("P_PROJEKT", rechnungDto.getCBez());

            if (rechnungDto.getProjektIId() != null) {
                ProjektDto pjDto = getProjektFac().projektFindByPrimaryKey(rechnungDto.getProjektIId());
                mapParameter.put("P_PROJEKTNUMMER", pjDto.getCNr());
            }

            // fuer Gutschrift
            if (rechnungDto.getRechnungIIdZurechnung() != null) {
                RechnungDto rechnungDtoZuRechnung = getRechnungFac()
                        .rechnungFindByPrimaryKey(rechnungDto.getRechnungIIdZurechnung());
                mapParameter.put("P_RECHNUNGSNUMMER", rechnungDtoZuRechnung.getCNr());
            }
            // Zahlungsziel alt
            String sZahlungsziel = getMandantFac()
                    .zahlungszielFindByIIdLocaleOhneExc(rechnungDto.getZahlungszielIId(), locale, theClientDto);
            mapParameter.put("P_ZAHLUNGSKONDITION", sZahlungsziel);
            // Lieferart
            String sLieferart = getLocaleFac().lieferartFindByIIdLocaleOhneExc(rechnungDto.getLieferartIId(),
                    locale, theClientDto);
            mapParameter.put("P_LIEFERART", sLieferart);

            mapParameter.put("P_LIEFERART_ORT", rechnungDto.getCLieferartort());

            // Unser Zeichen
            PersonalDto oPersonalBenutzer = getPersonalFac().personalFindByPrimaryKey(theClientDto.getIDPersonal(),
                    theClientDto);
            PersonalDto oPersonalAnleger;
            // wenn Anleger und Ausdrucker identisch sind, erspar ich mir einen
            // DB-Zugriff.
            if (theClientDto.getIDPersonal().equals(rechnungDto.getPersonalIIdAnlegen())) {
                oPersonalAnleger = oPersonalBenutzer;
            } else {
                oPersonalAnleger = getPersonalFac().personalFindByPrimaryKey(rechnungDto.getPersonalIIdAnlegen(),
                        theClientDto);
            }
            mapParameter.put("P_UNSER_ZEICHEN", Helper.getKurzzeichenkombi(oPersonalBenutzer.getCKurzzeichen(),
                    oPersonalAnleger.getCKurzzeichen()));
            // Name des Anlegers
            mapParameter.put("P_ANLEGER_ANREDE", oPersonalAnleger.getPartnerDto().formatFixName2Name1());

            LagerDto lDto = getLagerFac().lagerFindByPrimaryKey(rechnungDto.getLagerIId());
            mapParameter.put("P_ABBUCHUNGSLAGER", lDto.getCNr());

            // Belegdatum
            mapParameter.put("P_BELEGDATUM", Helper.formatDatum(rechnungDto.getTBelegdatum(), locale));
            mapParameter.put("P_BELEGDATUM_TIMESTAMP", rechnungDto.getTBelegdatum());
            // Waehrung
            mapParameter.put(LPReport.P_WAEHRUNG, rechnungDto.getWaehrungCNr());
            BigDecimal dAllgemeinerRabatt;
            if (rechnungDto.getFAllgemeinerRabattsatz() != null) {
                dAllgemeinerRabatt = new BigDecimal(rechnungDto.getFAllgemeinerRabattsatz().doubleValue());
            } else {
                dAllgemeinerRabatt = new BigDecimal(0);
            }

            // aufschlag auf 2 Stellen runden (wegen float in der DB)
            BigDecimal bdAllgRabattProzent = Helper.rundeKaufmaennisch(dAllgemeinerRabatt, 2);
            dAllgemeinerRabatt = bdAllgRabattProzent;
            // und an den report weitergeben
            mapParameter.put("P_ALLGEMEINER_RABATT", dAllgemeinerRabatt.doubleValue());
            if (rechnungDto.getMwstsatzIId() != null) {
                MwstsatzDto mwstsatzDto = getMandantFac().mwstsatzFindByPrimaryKey(rechnungDto.getMwstsatzIId(),
                        theClientDto);
                mapParameter.put("P_MEHRWERTSTEUER", mwstsatzDto.getFMwstsatz());
            }
            mapParameter.put("P_MEHRWERTSTEUERBETRAG", rechnungDto.getNWertustfw());
            // Endbetrag
            BigDecimal bdEndbetrag;
            if (rechnungDto.getNWertfw() != null && rechnungDto.getNWertustfw() != null) {
                bdEndbetrag = rechnungDto.getNWertfw().add(rechnungDto.getNWertustfw());
            }
            // bei stornierten muss ich das aus den positionen ausrechnen
            else {
                bdEndbetrag = new BigDecimal(0);
                for (int i = 0; i < data.length; i++) {
                    if (data[i][RECHNUNG_FELD_GESAMTPREIS] != null) {
                        bdEndbetrag = bdEndbetrag.add((BigDecimal) data[i][RECHNUNG_FELD_GESAMTPREIS]);
                    }
                    if (data[i][RECHNUNG_FELD_MWSTBETRAG] != null) {
                        bdEndbetrag = bdEndbetrag.add((BigDecimal) data[i][RECHNUNG_FELD_MWSTBETRAG]);
                    }
                }
            }

            Object sMwstsatz[] = null;
            sMwstsatz = getBelegVerkaufFac().getMwstTabelle(mwstMap, rechnungDto, locale, theClientDto);

            mapParameter.put("P_MWST_TABELLE_LINKS", sMwstsatz[LPReport.MWST_TABELLE_LINKS]);
            mapParameter.put("P_MWST_TABELLE_RECHTS", sMwstsatz[LPReport.MWST_TABELLE_RECHTS]);
            mapParameter.put("P_MWST_TABELLE_BETRAG", sMwstsatz[LPReport.MWST_TABELLE_SUMME_POSITIONEN]);
            mapParameter.put("P_MWST_TABELLE_WAEHRUNG", sMwstsatz[LPReport.MWST_MWST_TABELLE_WAEHRUNG]);

            if (bReverseCharge)
                bdEndbetrag = rechnungDto.getNWertfw();
            else
                bdEndbetrag = (BigDecimal) sMwstsatz[LPReport.MWST_ENDBETRAGMITMWST];
            mapParameter.put("P_RECHNUNGSENDBETRAG", bdEndbetrag);
            // Zahlungsziel Detail andrucken
            ZahlungszielDto zahlungszielDto = null;
            if (rechnungDto.getZahlungszielIId() != null) {
                zahlungszielDto = getMandantFac().zahlungszielFindByPrimaryKey(rechnungDto.getZahlungszielIId(),
                        theClientDto);
            }
            // Zahlungsziel ist bei Gutschrift nicht vorhanden
            if (zahlungszielDto != null) {
                java.sql.Date dBelegdatum = new java.sql.Date(rechnungDto.getTBelegdatum().getTime());
                Integer iSkontoAnzahlTage1 = zahlungszielDto.getSkontoAnzahlTage1();
                Integer iSkontoAnzahlTage2 = zahlungszielDto.getSkontoAnzahlTage2();

                java.sql.Date dSkonto1Datum = null;
                java.sql.Date dSkonto2Datum = null;
                if (iSkontoAnzahlTage1 != null && iSkontoAnzahlTage1 != 0) {
                    dSkonto1Datum = getMandantFac().berechneSkontoTage1FuerBelegdatum(dBelegdatum,
                            rechnungDto.getZahlungszielIId(), theClientDto);
                    mapParameter.put("P_SKONTO1ANZAHLTAGE",
                            Helper.formatStyledTextForJasper(iSkontoAnzahlTage1.toString()));
                    mapParameter.put("P_SKONTO1DATUM", new java.util.Date(dSkonto1Datum.getTime()));
                }
                if (iSkontoAnzahlTage2 != null && iSkontoAnzahlTage2 != 0) {
                    dSkonto2Datum = getMandantFac().berechneSkontoTage2Belegdatum(dBelegdatum,
                            rechnungDto.getZahlungszielIId(), theClientDto);
                    mapParameter.put("P_SKONTO2ANZAHLTAGE",
                            Helper.formatStyledTextForJasper(iSkontoAnzahlTage2.toString()));
                    mapParameter.put("P_SKONTO2DATUM", new java.util.Date(dSkonto2Datum.getTime()));
                }
                BigDecimal bdSkontoProzentsatz1 = zahlungszielDto.getSkontoProzentsatz1();
                BigDecimal bdSkontoProzentsatz2 = zahlungszielDto.getSkontoProzentsatz2();

                BigDecimal bdBetragNurSkonto1 = null;
                BigDecimal bdBetragNurSkonto2 = null;
                if (bdEndbetrag != null && bdSkontoProzentsatz1 != null && bdSkontoProzentsatz1.intValue() != 0) {
                    mapParameter.put("P_SKONTO1PROZENTSATZ", bdSkontoProzentsatz1);
                    bdBetragNurSkonto1 = Helper.rundeKaufmaennisch(
                            bdEndbetrag.multiply(bdSkontoProzentsatz1.divide(new BigDecimal(100))), 2);

                }
                if (bdEndbetrag != null && bdSkontoProzentsatz2 != null && bdSkontoProzentsatz2.intValue() != 0) {
                    mapParameter.put("P_SKONTO2PROZENTSATZ", bdSkontoProzentsatz2);
                    bdBetragNurSkonto2 = Helper.rundeKaufmaennisch(
                            bdEndbetrag.multiply(bdSkontoProzentsatz2.divide(new BigDecimal(100))), 2);
                }

                mapParameter.put("P_BETRAGNURSKONTO1", bdBetragNurSkonto1);
                mapParameter.put("P_BETRAGNURSKONTO2", bdBetragNurSkonto2);

                java.sql.Date dZielDatumNetto = getMandantFac().berechneZielDatumFuerBelegdatum(dBelegdatum,
                        zahlungszielDto, theClientDto);

                if (dZielDatumNetto != null) {
                    mapParameter.put("P_ZIELDATUMNETTO", new java.util.Date(dZielDatumNetto.getTime()));
                }
            }
            // Zahlungsziel Detail andrucken ENDE

            StringBuffer buff = new StringBuffer();
            // Anrede des Mandanten
            String sMandantAnrede = mandantDto.getPartnerDto().formatFixName1Name2();
            if (sMandantAnrede != null) {
                mapParameter.put(P_MANDANT_ANREDE_UND_NAME, sMandantAnrede);
                buff.append(sMandantAnrede).append("\n\n");
            }
            // Vertreter darf nicht null sein.
            PersonalDto vertreterDto = null;
            if (rechnungDto.getPersonalIIdVertreter() != null) {
                vertreterDto = getPersonalFac().personalFindByPrimaryKey(rechnungDto.getPersonalIIdVertreter(),
                        theClientDto);
            }
            if (vertreterDto != null) {
                mapParameter.put(P_VERTRETER, vertreterDto.formatAnrede());

                mapParameter.put(P_VERTRETER_UNTERSCHRIFTSFUNKTION_UND_NAME,
                        vertreterDto.formatFixUFTitelName2Name1());
                buff.append(vertreterDto.formatFixUFTitelName2Name1());
                if (vertreterDto.getCUnterschriftstext() != null
                        && vertreterDto.getCUnterschriftstext().length() > 0) {
                    String sUnterschriftstext = vertreterDto.getCUnterschriftstext();
                    mapParameter.put(P_VERTRETER_UNTERSCHRIFTSTEXT, sUnterschriftstext);
                    buff.append("\n").append(sUnterschriftstext);
                }
                mapParameter.put("P_VERTRETER_ANREDE", vertreterDto.getPartnerDto().formatFixName2Name1());

                // Vertreter Kontaktdaten
                String sVertreterEmail = vertreterDto.getCEmail();

                String sVertreterFaxDirekt = vertreterDto.getCDirektfax();

                String sVertreterFax = vertreterDto.getCFax();

                String sVertreterTelefon = vertreterDto.getCTelefon();
                mapParameter.put(LPReport.P_VERTRETEREMAIL, sVertreterEmail != null ? sVertreterEmail : "");
                if (sVertreterFaxDirekt != null && sVertreterFaxDirekt != "") {
                    mapParameter.put(LPReport.P_VERTRETERFAX, sVertreterFaxDirekt);
                } else {
                    mapParameter.put(LPReport.P_VERTRETERFAX, sVertreterFax != null ? sVertreterFax : "");
                }
                mapParameter.put(LPReport.P_VERTRETEERTELEFON, sVertreterTelefon != null ? sVertreterTelefon : "");

            }

            String sSpediteur = null;
            if (rechnungDto.getSpediteurIId() != null) {

                SpediteurDto spediteurDto = getMandantFac()
                        .spediteurFindByPrimaryKey(rechnungDto.getSpediteurIId());
                if (spediteurDto.getPartnerIId() != null) {
                    PartnerDto partnerDto = getPartnerFac().partnerFindByPrimaryKey(spediteurDto.getPartnerIId(),
                            theClientDto);

                    AnsprechpartnerDto ansprechpartnerDtoSpediteur = null;

                    if (spediteurDto.getAnsprechpartnerIId() != null) {
                        ansprechpartnerDtoSpediteur = getAnsprechpartnerFac().ansprechpartnerFindByPrimaryKey(
                                spediteurDto.getAnsprechpartnerIId(), theClientDto);
                    }

                    mapParameter.put("P_SPEDITEUR_ADRESSBLOCK",
                            formatAdresseFuerAusdruck(partnerDto, ansprechpartnerDtoSpediteur, mandantDto, locale));
                }

                sSpediteur = spediteurDto.getCNamedesspediteurs();

            }
            mapParameter.put("P_SPEDITEUR", sSpediteur != null ? sSpediteur : "");

            String cBriefanrede = "";

            if (oAnsprechpartner != null) {
                cBriefanrede = getPartnerServicesFac().getBriefanredeFuerBeleg(rechnungDto.getAnsprechpartnerIId(),
                        kundeDto.getPartnerIId(), locale, theClientDto);
            } else {
                // neutrale Anrede
                cBriefanrede = getBriefanredeNeutralOderPrivatperson(kundeDto.getPartnerIId(), locale,
                        theClientDto);
            }

            mapParameter.put("P_BRIEFANREDE", cBriefanrede);

            // Storno ?
            if (rechnungDto.getStatusCNr().equals(RechnungFac.STATUS_STORNIERT)) {
                mapParameter.put("P_STORNIERT", new Boolean(true));
            } else {
                mapParameter.put("P_STORNIERT", new Boolean(false));
            }
            // belegkopien: 2 Die Anzahl der Exemplare ist 1 + Anzahl der Kopien
            int iExemplare;
            if (iAnzahlKopien == null || iAnzahlKopien.intValue() <= 0) {
                iExemplare = 1;
            } else {
                iExemplare = 1 + iAnzahlKopien.intValue();
            }
            // Wenns eine Schlussrechnung ist, dann muessen die Anzahlungen noch
            // mitgedruckt werden
            if (rechnungDto.getRechnungartCNr().equals(RechnungFac.RECHNUNGART_SCHLUSSZAHLUNG)) {
                // Anzahlungsrechnungen suchen
                RechnungDto[] anzRechnungen = getRechnungFac()
                        .rechnungFindByAuftragIId(rechnungDto.getAuftragIId());

                BigDecimal bdEndbetrag2 = bdEndbetrag;
                StringBuffer sAnz = new StringBuffer();
                StringBuffer sAnzDetails = new StringBuffer();

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

                String[] fieldnames = new String[] { "F_RECHNUNGSNUMMER", "F_WERTBRUTTO", "F_WERT_UST",
                        "F_BEZAHLTBRUTTO", "F_BEZAHLT_UST" };

                for (int i = 0; i < anzRechnungen.length; i++) {
                    if (anzRechnungen[i].getRechnungartCNr().equals(RechnungFac.RECHNUNGART_ANZAHLUNG)) {
                        if (anzRechnungen[i].getNWertfw() != null && anzRechnungen[i].getNWertustfw() != null) {

                            Object[] oSubZeile = new Object[fieldnames.length];

                            BigDecimal bdBrutto = anzRechnungen[i].getNWertfw()
                                    .add(anzRechnungen[i].getNWertustfw());

                            oSubZeile[0] = anzRechnungen[i].getCNr();
                            oSubZeile[1] = bdBrutto;
                            oSubZeile[2] = anzRechnungen[i].getNWertustfw();

                            BigDecimal bezahltUst = getRechnungFac().getBereitsBezahltWertVonRechnungUstFw(
                                    anzRechnungen[i].getIId(), null, rechnungDto.getTBelegdatum());

                            oSubZeile[3] = getRechnungFac().getBereitsBezahltWertVonRechnungFw(
                                    anzRechnungen[i].getIId(), null, rechnungDto.getTBelegdatum()).add(bezahltUst);
                            oSubZeile[4] = bezahltUst;

                            bdEndbetrag2 = bdEndbetrag2.subtract(bdBrutto);
                            // umbrechen, wenn schon was drinsteht
                            if (sAnz.length() > 0) {
                                sAnz.append("\n");
                                sAnzDetails.append("\n");
                            }
                            sAnz.append(Helper.formatZahl(bdBrutto, FinanzFac.NACHKOMMASTELLEN, locale));

                            sAnzDetails.append(
                                    getTextRespectUISpr("lp.kuerzel.rechnung", mandantDto.getCNr(), locale));
                            sAnzDetails.append(" " + anzRechnungen[i].getCNr() + ", ");
                            sAnzDetails.append(anzRechnungen[i].getWaehrungCNr() + " "
                                    + Helper.formatZahl(bdBrutto, FinanzFac.NACHKOMMASTELLEN, locale));
                            sAnzDetails.append(
                                    ", " + getTextRespectUISpr("lp.enthaltenemwst", mandantDto.getCNr(), locale));
                            sAnzDetails.append(" " + Helper.formatZahl(anzRechnungen[i].getNWertustfw(),
                                    FinanzFac.NACHKOMMASTELLEN, locale));
                            sAnzDetails.append("   " + anzRechnungen[i].getWaehrungCNr());
                            alSuData.add(oSubZeile);
                        }
                    }
                }
                mapParameter.put("P_RECHNUNGSENDBETRAG2", bdEndbetrag2);
                mapParameter.put("P_ANZAHLUNGEN", sAnz.toString());
                mapParameter.put("P_ANZAHLUNGENDETAILS", sAnzDetails.toString());

                Object[][] oSubData = new Object[alSuData.size()][fieldnames.length];
                oSubData = alSuData.toArray(oSubData);

                mapParameter.put("P_SUBREPORT_ANZAHLUNGEN", new LPDatenSubreport(oSubData, fieldnames));

            }
            JasperPrintLP[] prints = new JasperPrintLP[iExemplare];
            // belegkopien: 3 Print-Array in der Schleife befuellen
            for (int iKopieNummer = 0; iKopieNummer < iExemplare; iKopieNummer++) {
                // belegkopien: 4 jede Kopie erhaelt seine Kopiennummer
                // die "0." Kopie ist das Original und kriegt deshalb keine
                if (iKopieNummer > 0) {
                    mapParameter.put(LPReport.P_KOPIE_NUMMER, new Integer(iKopieNummer));
                }
                if (FinanzReportFac.REPORT_MAHNUNG_AUSFUEHRLICH.equals(sReportName)) {
                    mapParameter.put("P_MAHNSTUFE", iMahnstufe);
                }
                // Index zuruecksetzen
                index = -1;
                initJRDS(mapParameter, sReportModul, sReportName, theClientDto.getMandant(), locale, theClientDto,
                        bMitLogo.booleanValue(), rechnungDto.getKostenstelleIId());
                prints[iKopieNummer] = getReportPrint();
            }
            int useCaseId = 0;
            int iId = rechnungDto.getIId();
            if (sReportName.equals(RechnungReportFac.REPORT_GUTSCHRIFT))
                useCaseId = QueryParameters.UC_ID_GUTSCHRIFT;
            else if (sReportName.equals(RechnungReportFac.REPORT_RECHNUNG))
                useCaseId = QueryParameters.UC_ID_RECHNUNG;
            else if (sReportName.equals(RechnungReportFac.REPORT_PROFORMARECHNUNG))
                useCaseId = QueryParameters.UC_ID_PROFORMARECHNUNG;
            else if (sReportName.equals(FinanzReportFac.REPORT_MAHNUNG_AUSFUEHRLICH)) {
                useCaseId = QueryParameters.UC_ID_RECHNUNG;
            }

            PrintInfoDto values = getJCRDocFac().getPathAndPartnerAndTable(iId, useCaseId, theClientDto);
            prints[0].setOInfoForArchive(values);
            prints[0].putAdditionalInformation(JasperPrintLP.KEY_BELEGART, LocaleFac.BELEGART_RECHNUNG);
            prints[0].putAdditionalInformation(JasperPrintLP.KEY_BELEGIID, rechnungDto.getIId());
            return prints;
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
            return null;
        }
    }

    /**
     * Befuelle Mit Kundendaten folgende Lieferparameter P_LIEFERADRESSE,
     * P_FREMDSYSTEMNR,P_LIEFERANTENNR,P_DEBITORENKONTO,P_TOUR,P_KUNDE_ILN,
     * P_LIEFERKUNDE_FIRMENBUCHNUMMER,P_LIEFERKUNDE_KUNDENNUMMER
     * 
     * @param kundeIID
     *            Integer
     * @param locale
     *            Locale
     * @param theClientDto
     *            String
     * @param mandantDto
     *            MandantDto
     * @param mapParameter
     *            Map
     * @throws RemoteException
     * @throws EJBExceptionLP
     */
    private void befuelleParameterLieferDaten(Integer kundeIID, Map<String, Object> mapParameter,
            MandantDto mandantDto, Locale locale, TheClientDto theClientDto)
            throws RemoteException, EJBExceptionLP {
        KundeDto lieferKunde = getKundeFac().kundeFindByPrimaryKey(kundeIID, theClientDto);
        AnsprechpartnerDto akunde = null;
        if (lieferKunde.getAnsprechpartnerDto() != null) {
            AnsprechpartnerDto[] anspkunde = lieferKunde.getAnsprechpartnerDto();
            akunde = anspkunde[0];
        }
        mapParameter.put("P_LIEFERADRESSE",
                formatAdresseFuerAusdruck(lieferKunde.getPartnerDto(), akunde, mandantDto, locale));

        mapParameter.put("P_FREMDSYSTEMNR", lieferKunde.getCFremdsystemnr());
        // Achtung falsch benannt eigentlich P_LIEFER_ILN
        mapParameter.put("P_KUNDE_ILN", lieferKunde.getPartnerDto().getCIln());
        mapParameter.put("P_LIEFERANTENNR", lieferKunde.getCLieferantennr());
        if (lieferKunde.getIidDebitorenkonto() != null) {
            KontoDto kontoDto = getFinanzFac().kontoFindByPrimaryKey(lieferKunde.getIidDebitorenkonto());
            mapParameter.put("P_DEBITORENKONTO", kontoDto.getCNr());
        }
        mapParameter.put("P_TOUR", lieferKunde.getCTour());
        mapParameter.put("P_LIEFERKUNDE_FIRMENBUCHNUMMER", lieferKunde.getPartnerDto().getCFirmenbuchnr());
        mapParameter.put("P_LIEFERKUNDE_KUNDENNUMMER", lieferKunde.getIKundennummer());
    }

    private Integer getGesamtAnzahlAnAuftraegen(RechnungDto rechnungDto) {

        HashMap hmAuftraege = new HashMap();

        if (rechnungDto.getAuftragIId() != null) {
            hmAuftraege.put(rechnungDto.getAuftragIId(), "");
        }

        // Auftrage aus RE-Positionen
        Session session = FLRSessionFactory.getFactory().openSession();
        String sQuery = "SELECT distinct auftragpos.auftrag_i_id FROM FLRRechnungPosition rp LEFT OUTER JOIN rp.flrpositionensichtauftrag AS auftragpos WHERE rp.flrrechnung.i_id="
                + rechnungDto.getIId() + " ";

        Query querylagerbewegungen = session.createQuery(sQuery);
        List<?> results = querylagerbewegungen.list();
        Iterator<?> resultListIterator = results.iterator();
        while (resultListIterator.hasNext()) {
            Integer auftragIId = (Integer) resultListIterator.next();
            if (auftragIId != null && !hmAuftraege.containsKey(auftragIId)) {
                hmAuftraege.put(auftragIId, "");

            }
        }
        session.close();

        // Auftrage aus LS-Positionen
        session = FLRSessionFactory.getFactory().openSession();
        sQuery = "SELECT distinct aufpos.auftrag_i_id FROM FLRRechnungPosition rp LEFT OUTER JOIN rp.flrlieferschein AS ls LEFT OUTER JOIN ls.flrlieferscheinpositionen AS lspos LEFT OUTER JOIN  lspos.flrpositionensichtauftrag AS aufpos WHERE rp.flrrechnung.i_id="
                + rechnungDto.getIId() + " ";

        querylagerbewegungen = session.createQuery(sQuery);
        results = querylagerbewegungen.list();
        resultListIterator = results.iterator();
        while (resultListIterator.hasNext()) {
            Integer auftragIId = (Integer) resultListIterator.next();
            if (auftragIId != null && !hmAuftraege.containsKey(auftragIId)) {
                hmAuftraege.put(auftragIId, "");
            }
        }

        session.close();

        return hmAuftraege.size();
    }

    /**
     * Befuelle Mit Kundendaten folgende Lieferparameter
     * P_RECHNUNG_KUNDE_LIEFERADRESSE,
     * P_RECHNUNG_KUNDE_FREMDSYSTEMNR,P_RECHNUNG_KUNDE_LIEFERANTENNR,
     * P_RECHNUNG_KUNDE_DEBITORENKONTO
     * ,P_RECHNUNG_KUNDE_TOUR,P_RECHNUNG_KUNDE_ILN,
     * P_RECHNUNG_KUNDE_FIRMENBUCHNUMMER,P_RECHNUNG_KUNDE_KUNDENNUMMER
     * 
     * @param kundeIID
     *            Integer
     * @param locale
     *            Locale
     * @param theClientDto
     *            String
     * @param mandantDto
     *            MandantDto
     * @param mapParameter
     *            Map
     * @throws RemoteException
     * @throws EJBExceptionLP
     */
    private void befuelleParameterLieferDatenRechnungsadresse(Integer kundeIID, Map<String, Object> mapParameter,
            MandantDto mandantDto, Locale locale, TheClientDto theClientDto)
            throws RemoteException, EJBExceptionLP {
        KundeDto kundeDto = getKundeFac().kundeFindByPrimaryKey(kundeIID, theClientDto);
        AnsprechpartnerDto akunde = null;
        if (kundeDto.getAnsprechpartnerDto() != null) {
            AnsprechpartnerDto[] anspkunde = kundeDto.getAnsprechpartnerDto();
            akunde = anspkunde[0];
        }
        mapParameter.put("P_RECHNUNG_KUNDE_LIEFERADRESSE",
                formatAdresseFuerAusdruck(kundeDto.getPartnerDto(), akunde, mandantDto, locale));

        mapParameter.put("P_RECHNUNG_KUNDE_FREMDSYSTEMNR", kundeDto.getCFremdsystemnr());
        mapParameter.put("P_RECHNUNG_KUNDE_ILN", kundeDto.getPartnerDto().getCIln());
        mapParameter.put("P_RECHNUNG_KUNDE_LIEFERANTENNR", kundeDto.getCLieferantennr());
        if (kundeDto.getIidDebitorenkonto() != null) {
            KontoDto kontoDto = getFinanzFac().kontoFindByPrimaryKey(kundeDto.getIidDebitorenkonto());
            mapParameter.put("P_RECHNUNG_KUNDE_DEBITORENKONTO", kontoDto.getCNr());
        }
        mapParameter.put("P_RECHNUNG_KUNDE_TOUR", kundeDto.getCTour());
        mapParameter.put("P_RECHNUNG_KUNDE_FIRMENBUCHNUMMER", kundeDto.getPartnerDto().getCFirmenbuchnr());
        mapParameter.put("P_RECHNUNG_KUNDE_KUNDENNUMMER", kundeDto.getIKundennummer());
    }

    public JasperPrintLP printRechnungenOffene(ReportRechnungJournalKriterienDto krit, TheClientDto theClientDto)
            throws EJBExceptionLP {
        Session session = null;
        try {
            Map<String, Object> mapParameter = new TreeMap<String, Object>();

            MandantDto mandantDto = getMandantFac().mandantFindByPrimaryKey(theClientDto.getMandant(),
                    theClientDto);

            this.useCase = UC_REPORT_RECHNUNGEN_OFFENE;
            SessionFactory factory = FLRSessionFactory.getFactory();
            session = factory.openSession();
            // Kunde oder Statistikadresse verwenden
            final String critKundeIId;
            final String critFLRKunde;
            if (krit.getBVerwendeStatistikAdresse()) {
                critKundeIId = RechnungFac.FLR_RECHNUNG_KUNDE_I_ID_STATISTIKADRESSE;
                critFLRKunde = RechnungFac.FLR_RECHNUNG_FLRSTATISTIKADRESSE;
            } else {
                critKundeIId = RechnungFac.FLR_RECHNUNG_KUNDE_I_ID;
                critFLRKunde = RechnungFac.FLR_RECHNUNG_FLRKUNDE;
            }

            List<Integer> kundenIIds = new ArrayList<Integer>();

            if (krit.kundeIId != null) {
                kundenIIds.add(krit.kundeIId);
            } else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_PARTNER) {
                Iterator<?> iter = session.createCriteria(FLRKunde.class).createAlias("flrpartner", "p")
                        .addOrder(Order.asc("p.c_name1nachnamefirmazeile1"))
                        .add(Restrictions.eq("mandant_c_nr", theClientDto.getMandant())).list().iterator();
                while (iter.hasNext())
                    kundenIIds.add(((FLRKunde) iter.next()).getI_id());
            } else {
                kundenIIds.add(null);
            }

            List<Object[]> dataList = new ArrayList<Object[]>();

            for (Integer kndIId : kundenIIds) {

                Criteria c = session.createCriteria(FLRRechnungReport.class);
                // Filter nach Mandant
                c.add(Restrictions.eq(RechnungFac.FLR_RECHNUNG_MANDANT_C_NR, theClientDto.getMandant()));
                // Rechnungstypen
                Collection<String> cRechnungstyp = new LinkedList<String>();
                cRechnungstyp.add(RechnungFac.RECHNUNGTYP_RECHNUNG);
                if (krit.getBGutschriftenBeruecksichtigen()) {
                    cRechnungstyp.add(RechnungFac.RECHNUNGTYP_GUTSCHRIFT);
                }
                c.createCriteria(RechnungFac.FLR_RECHNUNG_FLRRECHNUNGART)
                        .add(Restrictions.in(RechnungFac.FLR_RECHNUNGART_RECHNUNGTYP_C_NR, cRechnungstyp));
                // Kostenstelle
                if (krit.kostenstelleIId != null) {
                    c.add(Restrictions.eq(RechnungFac.FLR_RECHNUNG_KOSTENSTELLE_I_ID, krit.kostenstelleIId));
                }
                if (kndIId != null) {
                    c.add(Restrictions.eq(critKundeIId, kndIId));
                    KundeDto kundeDto = getKundeFac().kundeFindByPrimaryKey(kndIId, theClientDto);
                    mapParameter.put("P_KUNDE", kundeDto.getPartnerDto().formatTitelAnrede());
                }
                // Filter nach einem Vertrter
                if (krit.vertreterIId != null) {
                    c.add(Restrictions.eq(RechnungFac.FLR_RECHNUNG_FLRVERTRETER + ".i_id", krit.vertreterIId));
                }
                String sVon = null;
                String sBis = null;
                if (krit.dVon != null) {
                    c.add(Restrictions.ge(RechnungFac.FLR_RECHNUNG_D_BELEGDATUM, krit.dVon));
                    sVon = Helper.formatDatum(krit.dVon, theClientDto.getLocUi());
                }
                if (krit.dBis != null) {
                    c.add(Restrictions.le(RechnungFac.FLR_RECHNUNG_D_BELEGDATUM, krit.dBis));
                    sBis = Helper.formatDatum(krit.dBis, theClientDto.getLocUi());
                }
                LpBelegnummerFormat f = getBelegnummerGeneratorObj()
                        .getBelegnummernFormat(theClientDto.getMandant());
                Integer iGeschaeftsjahr = getParameterFac().getGeschaeftsjahr(theClientDto.getMandant());
                String sMandantKuerzel = getParameterFac().getMandantparameter(theClientDto.getMandant(),
                        ParameterFac.KATEGORIE_ALLGEMEIN, ParameterFac.PARAMETER_BELEGNUMMER_MANDANTKENNUNG)
                        .getCWert();
                if (krit.sBelegnummerVon != null) {
                    sVon = HelperServer.getBelegnummernFilterForHibernateCriterias(f, iGeschaeftsjahr,
                            sMandantKuerzel, krit.sBelegnummerVon);
                    c.add(Restrictions.ge(RechnungFac.FLR_RECHNUNG_C_NR, sVon));
                }
                if (krit.sBelegnummerBis != null) {
                    sBis = HelperServer.getBelegnummernFilterForHibernateCriterias(f, iGeschaeftsjahr,
                            sMandantKuerzel, krit.sBelegnummerBis);
                    c.add(Restrictions.le(RechnungFac.FLR_RECHNUNG_C_NR, sBis));
                }
                // Alle Stati ausser Angelegt, Bezahlt, Storniert
                Collection<String> cStati = new LinkedList<String>();
                cStati.add(RechnungFac.STATUS_ANGELEGT);
                cStati.add(RechnungFac.STATUS_STORNIERT);

                c.add(Restrictions.not(Restrictions.in(RechnungFac.FLR_RECHNUNG_STATUS_C_NR, cStati)));

                c.add(Restrictions.or(Restrictions.gt("t_bezahltdatum", krit.getTStichtag()),
                        Restrictions.isNull("t_bezahltdatum")));

                boolean mitNichtZugeordnetenBelegen = false;
                // Sortierung nach Kostenstelle
                if (krit.bSortiereNachKostenstelle) {
                    c.createCriteria(RechnungFac.FLR_RECHNUNG_FLRKOSTENSTELLE).addOrder(Order.asc("c_nr"));
                }
                // Sortierung nach Kunde
                if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_PARTNER) {
                    c.createCriteria(critFLRKunde).createCriteria(KundeFac.FLR_PARTNER)
                            .addOrder(Order.asc(PartnerFac.FLR_PARTNER_NAME1NACHNAMEFIRMAZEILE1));
                    c.addOrder(Order.asc(RechnungFac.FLR_RECHNUNG_C_NR));
                    mitNichtZugeordnetenBelegen = krit.getBMitNichtZugeordnetendBelegen();
                }
                // Sortierung nach Belegnummer
                else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_BELEGNUMMER) {
                    c.addOrder(Order.asc(RechnungFac.FLR_RECHNUNG_C_NR));
                } else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_VERTRETER) {
                    c.createCriteria(RechnungFac.FLR_RECHNUNG_FLRVERTRETER)
                            .addOrder(Order.asc(PersonalFac.FLR_PERSONAL_C_KURZZEICHEN));
                } else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_FAELLIGKEIT) {
                    c.addOrder(Order.asc(RechnungFac.FLR_RECHNUNG_T_FAELLIGKEIT))
                            .addOrder(Order.asc(RechnungFac.FLR_RECHNUNG_C_NR));
                }
                // stichtag ab belegdatum
                c.add(Restrictions.le(RechnungFac.FLR_RECHNUNG_D_BELEGDATUM, krit.getTStichtag()));
                List<?> firstResultList = c.list();
                Iterator<?> firstResultListIterator = firstResultList.iterator();
                List<FLRRechnungReport> resultList = new LinkedList<FLRRechnungReport>();
                while (firstResultListIterator.hasNext()) {
                    FLRRechnungReport re = (FLRRechnungReport) firstResultListIterator.next();
                    // stichtag bereits bezahlt?
                    if (re.getT_bezahltdatum() == null || !krit.getTStichtag().after(re.getT_bezahltdatum())) {
                        resultList.add(re);
                    }
                }
                Iterator<?> resultListIterator = resultList.iterator();
                int row = 0;
                Object[][] tempData = new Object[resultList.size()][OFFENE_ANZAHL_SPALTEN];

                KundeDto kundeDto = null;
                if (kndIId != null)
                    kundeDto = getKundeFac().kundeFindByPrimaryKey(kndIId, theClientDto);

                if (mitNichtZugeordnetenBelegen && kundeDto.getIidDebitorenkonto() != null) {

                    // TODO: nur FLRFinanzBuchungDetail holen
                    Query query = session.createQuery(
                            "SELECT buchungdetail from FLRFinanzBuchungDetail buchungdetail LEFT OUTER JOIN buchungdetail.flrbuchung AS buchung"
                                    + " WHERE"
                                    + BuchungDetailQueryBuilder.buildNurOffeneBuchungDetails("buchungdetail")
                                    + "AND"
                                    + BuchungDetailQueryBuilder.buildNichtZuordenbareVonKonto("buchungdetail",
                                            "buchung", kundeDto.getIidDebitorenkonto())
                                    + (krit.getTStichtag() == null ? ""
                                            : (" AND buchung.d_buchungsdatum<='"
                                                    + Helper.formatDateWithSlashes(krit.getTStichtag()) + "'")));

                    @SuppressWarnings("unchecked")
                    List<FLRFinanzBuchungDetail> bdList = query.list();
                    if (bdList.size() > 0) {
                        if (tempData.length < 1) {
                            tempData = new Object[1][OFFENE_ANZAHL_SPALTEN];
                            String sFirma = kundeDto.getPartnerDto().getCName1nachnamefirmazeile1();
                            tempData[row][OFFENE_FELD_FIRMA] = sFirma;
                            tempData[row][OFFENE_FELD_DEBITORENNR] = kundeDto.getIidDebitorenkonto() != null
                                    ? getFinanzFac().kontoFindByPrimaryKey(kundeDto.getIidDebitorenkonto()).getCNr()
                                    : null;
                        }
                        tempData[0][OFFENE_SUBREPORT_OFFENE_BUCHUNGEN] = FinanzSubreportGenerator
                                .createBuchungsdetailSubreport(bdList, true);
                    }
                }

                while (resultListIterator.hasNext()) {
                    FLRRechnungReport re = (FLRRechnungReport) resultListIterator.next();
                    RechnungDto reDto = getRechnungFac().rechnungFindByPrimaryKey(re.getI_id());
                    // Kunde oder Statistikadresse?
                    final Integer kundeIId, kundeIIdStatistik;
                    if (krit.getBVerwendeStatistikAdresse()) {
                        kundeIId = reDto.getKundeIIdStatistikadresse();
                    } else {
                        kundeIId = reDto.getKundeIId();
                        // Statistikdaten wenn nicht Kriterium Statistikadresse
                        kundeIIdStatistik = reDto.getKundeIIdStatistikadresse();

                        KundeDto kundeDtoStatistik = getKundeFac().kundeFindByPrimaryKey(kundeIIdStatistik,
                                theClientDto);
                        String sFirmaStatistik = kundeDtoStatistik.getPartnerDto().getCName1nachnamefirmazeile1();

                        String sKundeLKZStatistik = null;
                        if (kundeDtoStatistik.getPartnerDto().getLandplzortDto() != null) {
                            sKundeLKZStatistik = kundeDtoStatistik.getPartnerDto().getLandplzortDto().getLandDto()
                                    .getCLkz();
                        }
                        tempData[row][OFFENE_FELD_FIRMA_STATISTIK] = sFirmaStatistik;
                        tempData[row][OFFENE_FELD_FIRMA_LKZ_STATISTIK] = sKundeLKZStatistik;

                    }

                    if (kundeDto == null || kundeDto.getIId() != kundeIId) {
                        kundeDto = getKundeFac().kundeFindByPrimaryKey(kundeIId, theClientDto);
                    }

                    String sFirma = kundeDto.getPartnerDto().getCName1nachnamefirmazeile1();

                    String sKundeLKZ = null;
                    if (kundeDto.getPartnerDto().getLandplzortDto() != null) {
                        sKundeLKZ = kundeDto.getPartnerDto().getLandplzortDto().getLandDto().getCLkz();
                    }
                    tempData[row][OFFENE_FELD_RECHNUNGART] = re.getFlrrechnungart().getRechnungtyp_c_nr();
                    tempData[row][OFFENE_FELD_RECHNUNGSNUMMER] = reDto.getCNr();
                    tempData[row][OFFENE_FELD_FIRMA] = sFirma;
                    tempData[row][OFFENE_FELD_FIRMA_LKZ] = sKundeLKZ;
                    tempData[row][OFFENE_FELD_RECHNUNGSDATUM] = re.getD_belegdatum();

                    tempData[row][OFFENE_FELD_KURS] = re.getN_kurs();
                    tempData[row][OFFENE_FELD_WAEHRUNG] = re.getWaehrung_c_nr();
                    tempData[row][OFFENE_FELD_DEBITORENNR] = kundeDto.getIidDebitorenkonto() != null
                            ? getFinanzFac().kontoFindByPrimaryKey(kundeDto.getIidDebitorenkonto()).getCNr()
                            : null;

                    // Vertreter
                    if (re.getFlrvertreter() != null) {
                        if (re.getFlrvertreter().getFlrpartner().getC_name2vornamefirmazeile2() != null) {
                            tempData[row][OFFENE_FELD_VERTRETER] = re.getFlrvertreter().getFlrpartner()
                                    .getC_name1nachnamefirmazeile1() + " "
                                    + re.getFlrvertreter().getFlrpartner().getC_name2vornamefirmazeile2();
                        } else {
                            tempData[row][OFFENE_FELD_VERTRETER] = re.getFlrvertreter().getFlrpartner()
                                    .getC_name1nachnamefirmazeile1();
                        }
                    }
                    // datum der letzten zahlung bis zum stichtag ermitteln
                    RechnungzahlungDto[] zahlungen = getRechnungFac().zahlungFindByRechnungIId(re.getI_id());
                    java.sql.Date dZahldatum = null;
                    for (int i = 0; i < zahlungen.length; i++) {
                        if ((dZahldatum == null || zahlungen[i].getDZahldatum().after(dZahldatum))
                                && !zahlungen[i].getDZahldatum().after(krit.getTStichtag())) {
                            dZahldatum = new Date(zahlungen[i].getDZahldatum().getTime());
                        }
                    }
                    // Zahlungsbetrag bis zum Stichtag ermitteln
                    BigDecimal bdBezahlt = new BigDecimal(0);
                    for (int i = 0; i < zahlungen.length; i++) {
                        if (!zahlungen[i].getDZahldatum().after(krit.getTStichtag())) {
                            bdBezahlt = bdBezahlt.add(zahlungen[i].getNBetrag());
                        }
                    }
                    if (reDto.getKostenstelleIId() != null) {
                        KostenstelleDto kstDto = getSystemFac()
                                .kostenstelleFindByPrimaryKey(reDto.getKostenstelleIId());
                        tempData[row][OFFENE_FELD_KOSTENSTELLE] = kstDto.getCNr();
                    }

                    if (reDto.getNWert() == null) {
                        EJBExceptionLP ex = new EJBExceptionLP(EJBExceptionLP.FEHLER_RECHNUNG_HAT_KEINEN_WERT, "");
                        ArrayList<Object> alInfo = new ArrayList<Object>();
                        alInfo.add("ID: " + reDto.getIId());
                        alInfo.add("Nr: " + reDto.getCNr());
                        ex.setAlInfoForTheClient(alInfo);
                        throw ex;
                    }
                    BigDecimal bdWertBrutto = reDto.getNWert().add(reDto.getNWertust());
                    BigDecimal bdWertNetto = reDto.getNWert();

                    BigDecimal bdWertBruttoFW = reDto.getNWertfw().add(reDto.getNWertustfw());
                    BigDecimal bdWertNettoFW = reDto.getNWertfw();

                    BigDecimal bdBezahltUst = getRechnungFac().getBereitsBezahltWertVonRechnungUst(reDto.getIId(),
                            null, krit.getTStichtag());
                    BigDecimal bdBezahltNetto = getRechnungFac().getBereitsBezahltWertVonRechnung(reDto.getIId(),
                            null, krit.getTStichtag());

                    BigDecimal bdBezahltUstFw = getRechnungFac()
                            .getBereitsBezahltWertVonRechnungUstFw(reDto.getIId(), null, krit.getTStichtag());
                    BigDecimal bdBezahltNettoFw = getRechnungFac()
                            .getBereitsBezahltWertVonRechnungFw(reDto.getIId(), null, krit.getTStichtag());

                    BigDecimal bdNettoOffenFw = reDto.getNWertfw().subtract(bdBezahltNettoFw);

                    BigDecimal bdUstOffenFw = reDto.getNWertustfw().subtract(bdBezahltUstFw);

                    BigDecimal bdNettoOffenMandWhg = getLocaleFac().rechneUmInAndereWaehrungZuDatum(bdNettoOffenFw,
                            reDto.getWaehrungCNr(), theClientDto.getSMandantenwaehrung(), krit.getTStichtag(),
                            theClientDto);
                    BigDecimal bdUstOffenMandWhg = getLocaleFac().rechneUmInAndereWaehrungZuDatum(bdUstOffenFw,
                            reDto.getWaehrungCNr(), theClientDto.getSMandantenwaehrung(), krit.getTStichtag(),
                            theClientDto);

                    BigDecimal bdUstAnzahlungMandWhg = new BigDecimal(0);
                    BigDecimal bdNettoAnzahlungMandWhg = new BigDecimal(0);
                    BigDecimal bdUstAnzahlungFW = new BigDecimal(0);
                    BigDecimal bdNettoAnzahlungFW = new BigDecimal(0);
                    if (reDto.getAuftragIId() != null
                            && reDto.getRechnungartCNr().equals(RechnungFac.RECHNUNGART_SCHLUSSZAHLUNG)) {
                        bdNettoAnzahlungMandWhg = getLocaleFac().rechneUmInAndereWaehrungZuDatum(
                                getRechnungFac().getAnzahlungenZuSchlussrechnungFw(reDto.getIId()),
                                reDto.getWaehrungCNr(), theClientDto.getSMandantenwaehrung(), krit.getTStichtag(),
                                theClientDto);
                        bdUstAnzahlungMandWhg = getLocaleFac().rechneUmInAndereWaehrungZuDatum(
                                getRechnungFac().getAnzahlungenZuSchlussrechnungUstFw(reDto.getIId()),
                                reDto.getWaehrungCNr(), theClientDto.getSMandantenwaehrung(), krit.getTStichtag(),
                                theClientDto);

                    }

                    tempData[row][OFFENE_FELD_WERT_BRUTTO_ANZAHLUNGEN] = bdNettoAnzahlungMandWhg
                            .add(bdUstAnzahlungMandWhg);
                    tempData[row][OFFENE_FELD_WERT_NETTO_ANZAHLUNGEN] = bdNettoAnzahlungMandWhg;
                    tempData[row][OFFENE_FELD_WERT_BRUTTO_ANZAHLUNGEN_FW] = bdNettoAnzahlungFW
                            .add(bdUstAnzahlungFW);
                    tempData[row][OFFENE_FELD_WERT_NETTO_ANZAHLUNGEN_FW] = bdNettoAnzahlungFW;

                    // SP554
                    bdNettoOffenMandWhg = bdNettoOffenMandWhg.subtract(bdNettoAnzahlungMandWhg);
                    bdUstOffenMandWhg = bdUstOffenMandWhg.subtract(bdUstAnzahlungMandWhg);

                    if (re.getFlrrechnungart().getRechnungtyp_c_nr().equals(RechnungFac.RECHNUNGTYP_RECHNUNG)) {
                        tempData[row][OFFENE_FELD_WERT_BRUTTO] = bdWertBrutto;
                        tempData[row][OFFENE_FELD_WERT_NETTO] = bdWertNetto;
                        tempData[row][OFFENE_FELD_WERT_BRUTTO_OFFEN] = bdNettoOffenMandWhg.add(bdUstOffenMandWhg);
                        tempData[row][OFFENE_FELD_WERT_NETTO_OFFEN] = bdNettoOffenMandWhg;

                        // FW
                        tempData[row][OFFENE_FELD_WERT_BRUTTO_FW] = bdWertBruttoFW;
                        tempData[row][OFFENE_FELD_WERT_NETTO_FW] = bdWertNettoFW;
                        tempData[row][OFFENE_FELD_WERT_BRUTTO_OFFEN_FW] = bdNettoOffenFw.add(bdUstOffenFw);
                        tempData[row][OFFENE_FELD_WERT_NETTO_OFFEN_FW] = bdNettoOffenFw;

                    } else if (re.getFlrrechnungart().getRechnungtyp_c_nr()
                            .equals(RechnungFac.RECHNUNGTYP_GUTSCHRIFT)) {
                        tempData[row][OFFENE_FELD_WERT_BRUTTO] = bdWertBrutto.negate();
                        tempData[row][OFFENE_FELD_WERT_NETTO] = bdWertNetto.negate();
                        tempData[row][OFFENE_FELD_WERT_BRUTTO_OFFEN] = bdNettoOffenMandWhg.add(bdUstOffenMandWhg)
                                .negate();
                        tempData[row][OFFENE_FELD_WERT_NETTO_OFFEN] = bdNettoOffenMandWhg.negate();

                        // FW
                        tempData[row][OFFENE_FELD_WERT_BRUTTO_FW] = bdWertBruttoFW.negate();
                        tempData[row][OFFENE_FELD_WERT_NETTO_FW] = bdWertNettoFW.negate();
                        tempData[row][OFFENE_FELD_WERT_BRUTTO_OFFEN_FW] = bdNettoOffenFw.add(bdUstOffenFw).negate();
                        tempData[row][OFFENE_FELD_WERT_NETTO_OFFEN_FW] = bdNettoOffenFw.negate();

                    }

                    tempData[row][OFFENE_FELD_MAHNDATUM] = getMahnwesenFac()
                            .getAktuellesMahndatumEinerRechnung(reDto.getIId(), theClientDto);
                    tempData[row][OFFENE_FELD_MAHNSTUFE] = getMahnwesenFac()
                            .getAktuelleMahnstufeEinerRechnung(reDto.getIId(), theClientDto);
                    tempData[row][OFFENE_FELD_MAHNSPERRE] = reDto.getTMahnsperrebis();
                    // Faelligkeitsdatum
                    // java.sql.Date dFaellig;
                    // if (reDto.getZahlungszielIId() != null) {
                    // dFaellig =
                    // getMandantFac().berechneZielDatumFuerBelegdatum(reDto
                    // .getTBelegdatum(),
                    // reDto.getZahlungszielIId(), theClientDto);
                    // }
                    // else {
                    // dFaellig = new
                    // java.sql.Date(reDto.getTBelegdatum().getTime());
                    // }
                    if (re.getT_faelligkeit() != null) {
                        tempData[row][OFFENE_FELD_FAELLIGKEITSDATUM] = new java.util.Date(
                                re.getT_faelligkeit().getTime());
                    } else {
                        throw new EJBExceptionLP(EJBExceptionLP.FEHLER_RECHNUNG_FAELLIGKEIT_NICHT_BERECHENBAR,
                                new Exception("Faelligkeit nicht berechenbar"));
                    }
                    // Differenz in Tagen: Stichtag - Faelligkeitsdatum
                    tempData[row][OFFENE_FELD_TAGE_BIS_FAELLIGKEITSDATUM] = Helper
                            .getDifferenzInTagen(krit.getTStichtag(), re.getT_faelligkeit());
                    row++;
                }
                dataList.addAll(Arrays.asList(tempData));
            }

            data = dataList.toArray(new Object[0][]);

            // Waehrung
            mapParameter.put(LPReport.P_WAEHRUNG, mandantDto.getWaehrungCNr());
            mapParameter.put("P_STICHTAG", Helper.formatDatum(krit.getTStichtag(), theClientDto.getLocUi()));
            StringBuffer sSortierung = new StringBuffer();
            if (krit.bSortiereNachKostenstelle) {
                sSortierung.append(
                        getTextRespectUISpr("lp.kostenstelle", theClientDto.getMandant(), theClientDto.getLocUi()));
                sSortierung.append(", ");
            }
            if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_PARTNER) {
                if (krit.getBVerwendeStatistikAdresse()) {
                    sSortierung.append(getTextRespectUISpr("rech.statistikadresse", theClientDto.getMandant(),
                            theClientDto.getLocUi()));
                } else {
                    sSortierung.append(
                            getTextRespectUISpr("lp.kunde", theClientDto.getMandant(), theClientDto.getLocUi()));
                }
            } else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_BELEGNUMMER) {
                sSortierung.append(getTextRespectUISpr("rechnung.rechnungsnummer", theClientDto.getMandant(),
                        theClientDto.getLocUi()));
            } else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_VERTRETER) {
                sSortierung.append(
                        getTextRespectUISpr("lp.vertreter", theClientDto.getMandant(), theClientDto.getLocUi()));
            } else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_FAELLIGKEIT) {
                sSortierung.append(
                        getTextRespectUISpr("lp.faelligkeit", theClientDto.getMandant(), theClientDto.getLocUi()));
            }
            mapParameter.put(LPReport.P_SORTIERUNG, sSortierung.toString());
            mapParameter.put(LPReport.P_SORTIERENACHKOSTENSTELLE, new Boolean(krit.bSortiereNachKostenstelle));
            mapParameter.put(LPReport.P_SORTIERENACHKUNDE,
                    new Boolean(krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_PARTNER));
            mapParameter.put(LPReport.P_SORTIERENACHVERTRETER,
                    new Boolean(krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_VERTRETER));

            String sZessionstext = null;
            sZessionstext = getParameterFac().parametermandantFindByPrimaryKey(ParameterFac.PARAMETER_ZESSIONSTEXT,
                    ParameterFac.KATEGORIE_ALLGEMEIN, theClientDto.getMandant()).getCWert();
            if (sZessionstext != null) {
                mapParameter.put("P_ZESSIONSTEXT", sZessionstext);
            }
            /**
             * @todo zinsen PJ 4538
             */

            initJRDS(mapParameter, RechnungReportFac.REPORT_MODUL, RechnungReportFac.REPORT_RECHNUNGEN_OFFENE,
                    theClientDto.getMandant(), theClientDto.getLocUi(), theClientDto);
            return getReportPrint();
            // }
            // catch (FinderException ex) {
            // { // @ToDo FinderException
            // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_DRUCKEN,
            // null);
            // }
            // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_DRUCKEN, ex);
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
            return null;
        } finally {
            try {
                session.close();
            } catch (HibernateException he) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER, he);
            }
        }
    }

    public JasperPrintLP printZahlungsjournal(TheClientDto theClientDto, int iSortierung, Date dVon, Date dBis,
            Integer bankverbindungIId, boolean bSortierungNachKostenstelle) throws EJBExceptionLP {
        this.useCase = UC_REPORT_ZAHLUNGSJOURNAL;
        SessionFactory factory = FLRSessionFactory.getFactory();
        Session session = null;
        try {
            session = factory.openSession();
            Criteria c = session.createCriteria(FLRRechnungZahlung.class);
            // Filter von/bis
            if (dVon != null) {
                c.add(Restrictions.ge(RechnungFac.FLR_RECHNUNG_ZAHLUNG_D_ZAHLDATUM, dVon));
            }
            if (dBis != null) {
                c.add(Restrictions.le(RechnungFac.FLR_RECHNUNG_ZAHLUNG_D_ZAHLDATUM, dBis));
            }

            if (bankverbindungIId != null) {
                c.add(Restrictions.eq(RechnungFac.FLR_RECHNUNG_ZAHLUNG_BANKVERBINDUNG_I_ID, bankverbindungIId));
            }

            Criteria cRechnung = c.createCriteria(RechnungFac.FLR_RECHNUNG_ZAHLUNG_FLRRECHNUNG);
            // Filter nach Mandant
            cRechnung.add(Restrictions.eq(RechnungFac.FLR_RECHNUNG_MANDANT_C_NR, theClientDto.getMandant()));
            // Sortierung

            if (bSortierungNachKostenstelle) {
                cRechnung.createCriteria(RechnungFac.FLR_RECHNUNG_FLRKOSTENSTELLE).addOrder(Order.asc("c_nr"));
            }

            if (iSortierung == RechnungReportFac.REPORT_ZAHLUNGEN_SORT_BANK_AUSZUG) {
                // SK full_join wird hier benoetigt damit auch Gutschriften die
                // keine Bankverbindung haben angedruckt werden
                c.createCriteria(RechnungFac.FLR_RECHNUNG_ZAHLUNG_FLRBANKVERBINDUNG,
                        CriteriaSpecification.FULL_JOIN)
                        .createCriteria(FinanzFac.FLR_BANKKONTO_FLRBANK, CriteriaSpecification.FULL_JOIN)
                        .createCriteria(BankFac.FLR_PARTNERBANK_FLRPARTNER, CriteriaSpecification.FULL_JOIN)
                        .addOrder(Order.asc(PartnerFac.FLR_PARTNER_C_NAME1NACHNAMEFIRMAZEILE1));

                c.addOrder(Order.asc(RechnungFac.FLR_RECHNUNG_ZAHLUNG_I_AUSZUG));
            } else if (iSortierung == RechnungReportFac.REPORT_ZAHLUNGEN_SORT_RECHNUNGSNUMMER) {
                cRechnung.addOrder(Order.asc(RechnungFac.FLR_RECHNUNG_C_NR));
            } else if (iSortierung == RechnungReportFac.REPORT_ZAHLUNGEN_SORT_ZAHLUNGSAUSGANG) {
                c.addOrder(Order.asc(RechnungFac.FLR_RECHNUNG_ZAHLUNG_D_ZAHLDATUM));
            }
            List<?> resultList = c.list();
            Iterator<?> resultListIterator = resultList.iterator();
            int row = 0;
            data = new Object[resultList.size()][ZAHLUNGEN_ANZAHL_FELDER];

            while (resultListIterator.hasNext()) {
                FLRRechnungZahlung zahlung = (FLRRechnungZahlung) resultListIterator.next();
                RechnungDto erDto = getRechnungFac().rechnungFindByPrimaryKey(zahlung.getRechnung_i_id());
                String sErCNr = erDto.getCNr();
                KundeDto kundeDto = getKundeFac().kundeFindByPrimaryKey(erDto.getKundeIId(), theClientDto);

                String sFirma = kundeDto.getPartnerDto().formatAnrede();
                data[row][ZAHLUNGEN_FELD_DEBITORENKONTO] = kundeDto.getIDebitorenkontoAsIntegerNotiId();
                data[row][ZAHLUNGEN_FELD_ER_C_NR] = sErCNr;
                data[row][ZAHLUNGEN_FELD_KOSTENSTELLE] = zahlung.getFlrrechnung().getFlrkostenstelle().getC_nr();
                data[row][ZAHLUNGEN_FELD_RECHNUNGSART] = erDto.getRechnungartCNr();
                data[row][ZAHLUNGEN_FELD_FIRMA] = sFirma;
                data[row][ZAHLUNGEN_FELD_ZAHLDATUM] = zahlung.getD_zahldatum();

                String sLaenderart = getFinanzServiceFac().getLaenderartZuPartner(kundeDto.getPartnerIId(),
                        theClientDto);
                data[row][ZAHLUNGEN_FELD_LAENDERART] = sLaenderart;
                if (zahlung.getFlrbankverbindung() != null) {
                    data[row][ZAHLUNGEN_FELD_BANK] = zahlung.getFlrbankverbindung().getFlrbank().getFlrpartner()
                            .getC_name1nachnamefirmazeile1();
                } else {
                }
                data[row][ZAHLUNGEN_FELD_AUSZUG] = zahlung.getI_auszug();
                data[row][ZAHLUNGEN_FELD_WECHSEL] = zahlung.getD_wechsel_faellig_am();
                data[row][ZAHLUNGEN_FELD_BELEGWAEHRUNG] = erDto.getWaehrungCNr();
                if (zahlung.getFlrbankverbindung() != null) {
                    data[row][ZAHLUNGEN_FELD_KONTO] = zahlung.getFlrbankverbindung().getC_kontonummer();
                }
                if (RechnungFac.RECHNUNGART_GUTSCHRIFT.equals(erDto.getRechnungartCNr())) {
                    data[row][ZAHLUNGEN_FELD_BETRAG] = zahlung.getN_betrag().negate();
                    data[row][ZAHLUNGEN_FELD_BETRAG_UST] = zahlung.getN_betrag_ust().negate();
                    data[row][ZAHLUNGEN_FELD_BETRAG_MANDANTENWAEHRUNG_ZU_BELEGZEIT] = zahlung.getN_betragfw()
                            .multiply(erDto.getNKurs()).negate();
                    data[row][ZAHLUNGEN_FELD_BETRAG_UST_MANDANTENWAEHRUNG_ZU_BELEGZEIT] = zahlung
                            .getN_betrag_ustfw().multiply(erDto.getNKurs()).negate();
                    data[row][ZAHLUNGEN_FELD_BETRAG_FW] = zahlung.getN_betragfw().negate();
                    data[row][ZAHLUNGEN_FELD_BETRAG_UST_FW] = zahlung.getN_betrag_ustfw().negate();
                } else {
                    data[row][ZAHLUNGEN_FELD_BETRAG] = zahlung.getN_betrag();
                    data[row][ZAHLUNGEN_FELD_BETRAG_UST] = zahlung.getN_betrag_ust();
                    data[row][ZAHLUNGEN_FELD_BETRAG_MANDANTENWAEHRUNG_ZU_BELEGZEIT] = zahlung.getN_betragfw()
                            .multiply(erDto.getNKurs());
                    data[row][ZAHLUNGEN_FELD_BETRAG_UST_MANDANTENWAEHRUNG_ZU_BELEGZEIT] = zahlung
                            .getN_betrag_ustfw().multiply(erDto.getNKurs());
                    data[row][ZAHLUNGEN_FELD_BETRAG_FW] = zahlung.getN_betragfw();
                    data[row][ZAHLUNGEN_FELD_BETRAG_UST_FW] = zahlung.getN_betrag_ustfw();
                }
                data[row][ZAHLUNGEN_FELD_ZAHLUNGSART] = zahlung.getZahlungsart_c_nr();
                if (zahlung.getFlrkassenbuch() != null) {
                    data[row][ZAHLUNGEN_FELD_KASSENBUCH] = zahlung.getFlrkassenbuch().getC_bez();
                } else {
                    data[row][ZAHLUNGEN_FELD_KASSENBUCH] = "";
                }
                row++;
            }
        } catch (RemoteException e) {
            throwEJBExceptionLPRespectOld(e);
        } finally {
            try {
                session.close();
            } catch (HibernateException he) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER, he);
            }
        }
        Map<String, Object> mapParameter = new TreeMap<String, Object>();
        mapParameter.put("VON", dVon);
        mapParameter.put("BIS", dBis);

        mapParameter.put("WAEHRUNG_C_NR", theClientDto.getSMandantenwaehrung());

        String sSortierung = null;
        if (iSortierung == RechnungReportFac.REPORT_ZAHLUNGEN_SORT_BANK_AUSZUG) {
            sSortierung = "Bank, Auszug";
        } else if (iSortierung == RechnungReportFac.REPORT_ZAHLUNGEN_SORT_RECHNUNGSNUMMER) {
            sSortierung = "Rechnungsnummer";
        } else if (iSortierung == RechnungReportFac.REPORT_ZAHLUNGEN_SORT_ZAHLUNGSAUSGANG) {
            sSortierung = "Zahlungseingangsdatum";
        }
        mapParameter.put("SORTIERUNG", sSortierung);

        mapParameter.put("P_SORTIERTNACHKOSTENSTELLE", new Boolean(bSortierungNachKostenstelle));

        initJRDS(mapParameter, RechnungReportFac.REPORT_MODUL, RechnungReportFac.REPORT_ZAHLUNGSJOURNAL,
                theClientDto.getMandant(), theClientDto.getLocUi(), theClientDto);
        return getReportPrint();
    }

    public String exportWAJournal(TheClientDto theClientDto, Integer kundeIId, Date dVon, Date dBis,
            String sLineSeparator, Integer iSortierung) throws EJBExceptionLP {

        Object[][] data = null;
        StringBuffer sb = new StringBuffer();
        data = getKundeReportFac().getDataLieferstatistik(theClientDto, kundeIId, null, null, dVon, dBis,
                iSortierung, theClientDto.getMandant(), false, false, false,
                KundeReportFac.REPORT_LIEFERSTATISTIK_OPTION_LIEFERADRESSE, false);
        if (data != null) {
            String trennzeichen = ";";
            // Ueberschriften
            sb.append("Rechnungsnummer" + trennzeichen);
            sb.append("Lieferscheinnummer" + trennzeichen);
            sb.append(getTextRespectUISpr("lp.datum", theClientDto.getMandant(), theClientDto.getLocUi())
                    + trennzeichen);
            sb.append("Ident" + trennzeichen);
            sb.append("Bezeichnung" + trennzeichen);
            sb.append("Menge" + trennzeichen);
            sb.append("Preis" + trennzeichen);

            sb.append("Artikelgruppe" + trennzeichen);
            sb.append("Artikelklasse" + trennzeichen);
            sb.append("Konto" + trennzeichen);
            sb.append("Mwstsatz" + trennzeichen);
            sb.append("Vertreter" + trennzeichen);
            sb.append("Provisionsempfaenger" + trennzeichen);
            sb.append("Kunde" + trennzeichen);
            sb.append("Land" + trennzeichen);
            sb.append("Plz" + trennzeichen);
            sb.append("Ort" + trennzeichen);
            sb.append("Statistikadresse" + trennzeichen);
            sb.append("StatistikadresseLand" + trennzeichen);
            sb.append("StatistikadressePlz" + trennzeichen);
            sb.append("StatistikadresseOrt");

            sb.append(sLineSeparator);

            for (int i = 0; i < data.length; i++) {
                if (data[i][KundeReportFac.REPORT_STATISTIK_RECHNUNGSNUMMER] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_RECHNUNGSNUMMER]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_LIEFERSCHEINNUMMER] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_LIEFERSCHEINNUMMER]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_DATUM] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_DATUM]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_IDENT] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_IDENT]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_BEZEICHNUNG] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_BEZEICHNUNG]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_MENGE] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_MENGE]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_PREIS] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_PREIS]);
                }

                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_ARTIKELGRUPPE] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_ARTIKELGRUPPE]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_ARTIKELKLASSE] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_ARTIKELKLASSE]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_KONTO] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_KONTO]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_MWSTSATZ] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_MWSTSATZ]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_VERTRETER] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_VERTRETER]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_PROVISIONSEMPFAENGER] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_PROVISIONSEMPFAENGER]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_KUNDENNAME] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_KUNDENNAME]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_LAND] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_LAND]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_PLZ] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_PLZ]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_ORT] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_ORT]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_STATISTIKADRESSE] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_STATISTIKADRESSE]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_LAND_STATISTIKADRESSE] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_LAND_STATISTIKADRESSE]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_PLZ_STATISTIKADRESSE] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_PLZ_STATISTIKADRESSE]);
                }
                sb.append(trennzeichen);
                if (data[i][KundeReportFac.REPORT_STATISTIK_ORT_STATISTIKADRESSE] != null) {
                    sb.append(data[i][KundeReportFac.REPORT_STATISTIK_ORT_STATISTIKADRESSE]);
                }
                sb.append(sLineSeparator);
            }
        }
        return sb.toString();
    }

    public JasperPrintLP printRechnungenAlle(ReportRechnungJournalKriterienDto krit, TheClientDto theClientDto)
            throws EJBExceptionLP {
        return buildAlleReport(krit, RechnungFac.RECHNUNGTYP_RECHNUNG, RechnungReportFac.REPORT_RECHNUNGEN_ALLE,
                theClientDto);
    }

    public JasperPrintLP printWarenausgangsjournal(ReportRechnungJournalKriterienDto krit,
            TheClientDto theClientDto) throws EJBExceptionLP {
        return buildWarenausgangsjournal(krit, theClientDto);
    }

    public JasperPrintLP printProformarechnungenAlle(ReportRechnungJournalKriterienDto krit,
            TheClientDto theClientDto) throws EJBExceptionLP {
        return buildAlleReport(krit, RechnungFac.RECHNUNGTYP_PROFORMARECHNUNG,
                RechnungReportFac.REPORT_PROFORMARECHNUNGEN_ALLE, theClientDto);
    }

    private JasperPrintLP buildWarenausgangsjournal(ReportRechnungJournalKriterienDto krit,
            TheClientDto theClientDto) throws EJBExceptionLP {
        Session session = null;
        try {

            String querySelect = "SELECT R.C_NR AS R_C_NR," + "R.T_BELEGDATUM AS R_T_BELEGDATUM," + "COALESCE "
                    + "(LP.N_NETTOGESAMTPREISPLUSVERSTECKTERAUFSCHLAGMINUSRABATT, P.N_NETTOEINZELPREISPLUSAUFSCHLAGMINUSRABATT, P.N_NETTOEINZELPREIS ) "
                    + "AS P_N_NETTOEINZELPREISPLUSAUFSCHLAGMINUSRABATT,"
                    + "PN.C_NAME1NACHNAMEFIRMAZEILE1 AS PN_C_NAME1NACHNAMEFIRMAZEILE1,"
                    + "KN.I_KUNDENNUMMER AS KN_I_KUNDENNUMMER," + "AR.C_NR AS AR_C_NR," + "ARS.C_BEZ AS ARS_C_BEZ,"
                    + "ARK.C_NR AS ARK_C_NR," + "ARG.C_NR AS ARG_C_NR," + "LA.C_LKZ AS LA_C_LKZ,"
                    + "AR.C_WARENVERKEHRSNUMMER AS AR_C_WARENVERKEHRSNUMMER,"
                    + "COALESCE (LP.N_MENGE, P.N_MENGE) AS P_N_MENGE,"
                    + "COALESCE (cast (LP.EINHEIT_C_NR AS VARCHAR), cast (P.EINHEIT_C_NR AS VARCHAR)) AS P_EINHEIT_C_NR,"
                    + "ARS.C_ZBEZ AS ARS_C_ZBEZ," + "R.N_PROVISION AS R_N_PROVISION,"
                    + "PE.C_KURZZEICHEN AS PE_C_KURZZEICHEN," + "KNTE.C_NR AS KNTE_C_NR,"
                    + "KNTD.C_NR AS KNTD_C_NR," + "LPO.C_PLZ AS LPO_C_PLZ," + "LA2.C_LKZ AS LA2_C_LKZ,"
                    + "PN.C_STRASSE AS PN_C_STRASSE,"
                    + "COALESCE (LSPOSMWSTSATZ.F_MWSTSATZ, POSMWSTSATZ.F_MWSTSATZ, MWSTSATZ.F_MWSTSATZ) AS MWSTSATZ_F_MWSTSATZ,"
                    + "BRANCH.C_NR AS BRANCH_C_NR," + "cast (PARTKL.C_NR AS VARCHAR) AS PARTKL_C_NR,"
                    + "LA2.C_LKZ AS LA2_C_LKZ," + "L.C_NR AS L_C_NR," + "L.T_BELEGDATUM AS L_T_BELEGDATUM,"
                    + "PARTNER_STATISTIK.I_ID AS PART_STATISTIK_I_ID,"
                    + "cast (PARTNER_STATISTIK.ANREDE_C_NR AS VARCHAR) AS PART_STATISTIK_ANREDE_C_NR,"
                    + "PARTNER_STATISTIK.C_NAME1NACHNAMEFIRMAZEILE1 AS PARTNER_STATISTIK_C_NAME1,"
                    + "PARTNER_STATISTIK.C_NAME2VORNAMEFIRMAZEILE2 AS PARTNER_STATISTIK_C_NAME2,"
                    + "PARTNER_STATISTIK.C_NAME3VORNAME2ABTEILUNG AS PARTNER_STATISTIK_C_NAME3_ABTEILUNG,"
                    + "PARTNER_STATISTIK.C_STRASSE AS PARTNER_STATISTIK_C_STRASSE,"
                    + "PARTNER_STATISTIK_LAND.C_LKZ AS PARTNER_STATISTIK_C_LKZ,"
                    + "PARTNER_STATISTIK_ORT.C_NAME AS PARTNER_STATISTIK_C_ORT,"
                    + "PARTNER_STATISTIK_LPO.C_PLZ AS PARTNER_STATISTIK_C_PLZ," + "PN.I_ID AS PARTNER_I_ID,"
                    + "cast (R.WAEHRUNG_C_NR AS VARCHAR)AS R_WAEHRUNG_C_NR," + "R.N_KURS AS R_N_KURS,"
                    + "R.RECHNUNGART_C_NR AS R_RECHNUNGART_C_NR,"
                    + "R.RECHNUNG_I_ID_ZURECHNUNG AS R_RECHNUNG_I_ID_ZURECHNUNG,"
                    + "AR.F_VERTRETERPROVISIONMAX AS AR_F_VERTRETERPROVISIONMAX,"
                    + "COALESCE (R.C_BESTELLNUMMER,L.C_BESTELLNUMMER) AS R_BESTELLNUMMER,"
                    + "KNRECHNUNGSADRESSELS.I_KUNDENNUMMER AS KN_RECHNUNGSADRESSELS_I_KUNDENNUMMER,"
                    + "PARTNERRECHNUNGSADRESSELS.C_NAME1NACHNAMEFIRMAZEILE1 AS PARTNERRECHNUNGSADRESSELSBEZEICHNUNG,"
                    + "PARTNERRECHNUNGSADRESSELS.C_KBEZ AS PARTNERRECHNUNGSADRESSELSKBEZ,"
                    + "KN.C_HINWEISEXTERN AS KUNDEHINWEISEXTERN," + "KN.C_HINWEISINTERN AS KUNDEHINWEISINTERN,"
                    + "PEPROVISION.C_KURZZEICHEN AS PEPROVISION_C_KURZZEICHEN,"
                    + "AR.F_GEWICHTKG AS ARTIKELGEWICHTKG," + "RELAGER.C_NR AS RELAGERCNR,"
                    + "LSLAGER.C_NR AS LSLAGERCNR," + "LSZIELLAGER.C_NR AS LSZIELLAGERCNR,"
                    + "KNLIEFERADRESSELS.I_KUNDENNUMMER AS KN_KNLIEFERADRESSELS_I_KUNDENNUMMER,"
                    + "cast(COALESCE (P.X_TEXTINHALT,LP.X_TEXTINHALT) AS VARCHAR) AS R_TEXTINHALT, "
                    + "PLIEFERADRESSELS.C_ILN AS C_ILNLIEFERADRESSELS, " + "PN.C_ILN AS C_ILNPARTNER, "
                    + "PLIEFERADRESSELS.I_ID AS PART_STATISTIK_I_ID,"
                    + "cast (PLIEFERADRESSELS.ANREDE_C_NR AS VARCHAR) AS PLIEFERADRESSELS_ANREDE_C_NR,"
                    + "PLIEFERADRESSELS.C_NAME1NACHNAMEFIRMAZEILE1 AS PLIEFERADRESSELS_C_NAME1,"
                    + "PLIEFERADRESSELS.C_NAME2VORNAMEFIRMAZEILE2 AS PLIEFERADRESSELS_C_NAME2,"
                    + "PLIEFERADRESSELS.C_NAME3VORNAME2ABTEILUNG AS PLIEFERADRESSELS_C_NAME3_ABTEILUNG,"
                    + "PLIEFERADRESSELS.C_STRASSE AS PLIEFERADRESSELS_C_STRASSE,"
                    + "PLIEFERADRESSELS_LAND.C_LKZ AS PLIEFERADRESSELS_C_LKZ,"
                    + "PLIEFERADRESSELS_ORT.C_NAME AS PLIEFERADRESSELS_C_ORT,"
                    + "PLIEFERADRESSELS_LPO.C_PLZ AS PLIEFERADRESSELS_C_PLZ, " + "BEGR.C_NR AS BEGR_C_NR, "
                    + "ABP.T_UEBERSTEUERTERLIEFERTERMIN AS UEBERSTEUERTERLIEFERTERMIN, "
                    + "KN.I_LIEFERDAUER AS LIEFERDAUER, " + "AB.C_NR AS AUFTRAGSNUMMER, "
                    + "ABG.C_NR AS AUFTRGABEGRUENDUNG, "
                    + " COALESCE ( (SELECT AVG(N_GESTEHUNGSPREIS) FROM WW_LAGERBEWEGUNG WHERE I_BELEGARTPOSITIONID=P.I_ID AND C_BELEGARTNR=R.RECHNUNGART_C_NR AND B_HISTORIE=0),(SELECT AVG(N_GESTEHUNGSPREIS) FROM WW_LAGERBEWEGUNG WHERE I_BELEGARTPOSITIONID=LP.I_ID AND C_BELEGARTNR='Lieferschein' AND B_HISTORIE=0)) AS GESTPREIS,"
                    + " KT.C_BEZ, " + "CASE WHEN LP.POSITION_I_ID_ARTIKELSET IS NULL THEN "
                    + " CASE WHEN (SELECT COUNT(*) FROM LS_LIEFERSCHEINPOSITION WHERE POSITION_I_ID_ARTIKELSET=LP.I_ID) > 0 THEN 'Kopf' "
                    + " ELSE NULL END "
                    + "ELSE 'Position' END AS ARTIKELSETART, COALESCE (R.C_BEZ,L.C_BEZ) AS R_BEZ ";

            String queryFrom = "FROM RECH_RECHNUNG R "
                    + "INNER JOIN RECH_RECHNUNGPOSITION P ON P.RECHNUNG_I_ID=R.I_ID "
                    + "LEFT OUTER JOIN LS_LIEFERSCHEIN L ON L.I_ID=P.LIEFERSCHEIN_I_ID "
                    + "LEFT OUTER JOIN LS_LIEFERSCHEINPOSITION LP ON LP.LIEFERSCHEIN_I_ID=P.LIEFERSCHEIN_I_ID "
                    + "LEFT OUTER JOIN PART_KUNDE KN ON KN.I_ID=R.KUNDE_I_ID "
                    + "LEFT OUTER JOIN PART_PARTNER PN ON PN.I_ID=KN.PARTNER_I_ID "
                    + "LEFT OUTER JOIN WW_ARTIKEL AR ON AR.I_ID=COALESCE(LP.ARTIKEL_I_ID, P.ARTIKEL_I_ID) "
                    + "LEFT OUTER JOIN WW_ARTKLA ARK ON ARK.I_ID=AR.ARTKLA_I_ID "
                    + "LEFT OUTER JOIN WW_ARTGRU ARG ON ARG.I_ID=AR.ARTGRU_I_ID "
                    + "LEFT OUTER JOIN LP_LAND LA ON LA.I_ID=AR.LAND_I_ID_URSPRUNGSLAND "
                    + "LEFT OUTER JOIN PERS_PERSONAL PE ON PE.I_ID=R.PERSONAL_I_ID_VERTRETER "
                    + "LEFT OUTER JOIN FB_KONTO KNTE ON KNTE.I_ID=KN.KONTO_I_ID_ERLOESEKONTO "
                    + "LEFT OUTER JOIN FB_KONTO KNTD ON KNTD.I_ID=KN.KONTO_I_ID_DEBITORENKONTO "
                    + "LEFT OUTER JOIN LP_LANDPLZORT LPO ON LPO.I_ID=PN.LANDPLZORT_I_ID "
                    + "LEFT OUTER JOIN LP_LAND LA2 ON LA2.I_ID=LPO.LAND_I_ID "
                    + "LEFT OUTER JOIN LP_MWSTSATZ MWSTSATZ ON MWSTSATZ.I_ID=R.MWSTSATZ_I_ID "
                    + "LEFT OUTER JOIN LP_MWSTSATZ POSMWSTSATZ ON POSMWSTSATZ.I_ID=P.MWSTSATZ_I_ID "
                    + "LEFT OUTER JOIN LP_MWSTSATZ LSPOSMWSTSATZ ON LSPOSMWSTSATZ.I_ID=LP.MWSTSATZ_I_ID "
                    + "LEFT OUTER JOIN PART_BRANCHE BRANCH ON BRANCH.I_ID=PN.BRANCHE_I_ID "
                    + "LEFT OUTER JOIN PART_PARTNERKLASSE PARTKL ON PARTKL.I_ID=PN.PARTNERKLASSE_I_ID "
                    + "LEFT OUTER JOIN PART_KUNDE KNSTATISTIK ON KNSTATISTIK.I_ID=R.KUNDE_I_ID_STATISTIKADRESSE "
                    + "LEFT OUTER JOIN PART_PARTNER PARTNER_STATISTIK ON PARTNER_STATISTIK.I_ID = KNSTATISTIK.PARTNER_I_ID "
                    + "LEFT OUTER JOIN LP_LANDPLZORT PARTNER_STATISTIK_LPO ON PARTNER_STATISTIK_LPO.I_ID=PARTNER_STATISTIK.LANDPLZORT_I_ID "
                    + "LEFT OUTER JOIN LP_LAND PARTNER_STATISTIK_LAND ON PARTNER_STATISTIK_LAND.I_ID=PARTNER_STATISTIK_LPO.LAND_I_ID "
                    + "LEFT OUTER JOIN LP_ORT PARTNER_STATISTIK_ORT ON PARTNER_STATISTIK_ORT.I_ID=PARTNER_STATISTIK_LPO.ORT_I_ID "
                    + "LEFT OUTER JOIN PART_KUNDE KNRECHNUNGSADRESSELS ON KNRECHNUNGSADRESSELS.I_ID=L.KUNDE_I_ID_RECHNUNGSADRESSE "
                    + "LEFT OUTER JOIN PART_PARTNER PARTNERRECHNUNGSADRESSELS ON PARTNERRECHNUNGSADRESSELS.I_ID=KNRECHNUNGSADRESSELS.PARTNER_I_ID "
                    + "LEFT OUTER JOIN PERS_PERSONAL PEPROVISION ON PEPROVISION.I_ID=KN.PERSONAL_I_ID_BEKOMMEPROVISION "
                    + "LEFT OUTER JOIN WW_LAGER RELAGER ON RELAGER.I_ID=R.LAGER_I_ID "
                    + "LEFT OUTER JOIN WW_LAGER LSLAGER ON LSLAGER.I_ID=L.LAGER_I_ID "
                    + "LEFT OUTER JOIN WW_LAGER LSZIELLAGER ON LSZIELLAGER.I_ID=L.ZIELLAGER_I_ID "
                    + "LEFT OUTER JOIN PART_KUNDE KNLIEFERADRESSELS ON KNLIEFERADRESSELS.I_ID=L.KUNDE_I_ID_LIEFERADRESSE "
                    + "LEFT OUTER JOIN PART_PARTNER PLIEFERADRESSELS ON PLIEFERADRESSELS.I_ID=KNLIEFERADRESSELS.PARTNER_I_ID "
                    + "LEFT OUTER JOIN LP_LANDPLZORT PLIEFERADRESSELS_LPO ON PLIEFERADRESSELS_LPO.I_ID=PLIEFERADRESSELS.LANDPLZORT_I_ID "
                    + "LEFT OUTER JOIN LP_LAND PLIEFERADRESSELS_LAND ON PLIEFERADRESSELS_LAND.I_ID=PLIEFERADRESSELS_LPO.LAND_I_ID "
                    + "LEFT OUTER JOIN LP_ORT PLIEFERADRESSELS_ORT ON PLIEFERADRESSELS_ORT.I_ID=PLIEFERADRESSELS_LPO.ORT_I_ID "
                    + "LEFT OUTER JOIN LS_BEGRUENDUNG BEGR ON BEGR.I_ID=L.BEGRUENDUNG_I_ID "
                    + "LEFT OUTER JOIN AUFT_AUFTRAGPOSITION ABP ON ABP.I_ID=LP.AUFTRAGPOSITION_I_ID "
                    + "LEFT OUTER JOIN AUFT_AUFTRAG AB ON AB.I_ID=ABP.AUFTRAG_I_ID "
                    + "LEFT OUTER JOIN AUFT_AUFTRAGBEGRUENDUNG ABG ON ABG.I_ID=AB.AUFTRAGBEGRUENDUNG_I_ID "
                    + "LEFT OUTER JOIN LP_KOSTENTRAEGER KT ON KT.I_ID=COALESCE(LP.KOSTENTRAEGER_I_ID, P.KOSTENTRAEGER_I_ID) "
                    + "LEFT OUTER JOIN WW_ARTIKELSPR ARS ON ARS.ARTIKEL_I_ID=AR.I_ID AND ARS.LOCALE_C_NR='"
                    + theClientDto.getLocUiAsString() + "' ";

            String queryWhere = "";
            if (krit.dVon != null && krit.dBis != null) {
                queryWhere = "WHERE R.T_BELEGDATUM BETWEEN '" + Helper.formatDateWithSlashes(krit.dVon) + "' AND '"
                        + Helper.formatDateWithSlashes(krit.dBis) + "' ";
            } else {
                if (krit.sBelegnummerVon != null && krit.sBelegnummerBis != null) {
                    queryWhere = "WHERE R.C_NR BETWEEN '" + krit.sBelegnummerVon + "' AND '" + krit.sBelegnummerBis
                            + "' ";
                }
            }

            queryWhere = queryWhere + "AND (POSITIONSART_C_NR='"
                    + RechnungFac.POSITIONSART_RECHNUNG_HANDEINGABE.trim() + "' " + "OR P.POSITIONSART_C_NR='"
                    + RechnungFac.POSITIONSART_RECHNUNG_IDENT.trim() + "' " + "OR P.POSITIONSART_C_NR='"
                    + RechnungFac.POSITIONSART_RECHNUNG_LIEFERSCHEIN.trim() + "' " + "OR P.POSITIONSART_C_NR='"
                    + RechnungFac.POSITIONSART_RECHNUNG_TEXTEINGABE.trim() + "') ";
            String[] sRechnungsarten = null;
            if (krit.getBGutschriftenBeruecksichtigen()) {
                sRechnungsarten = new String[5];
                sRechnungsarten[0] = LocaleFac.BELEGART_RECHNUNG;
                sRechnungsarten[1] = LocaleFac.BELEGART_GUTSCHRIFT;
                sRechnungsarten[2] = RechnungFac.RECHNUNGART_WERTGUTSCHRIFT;
                sRechnungsarten[3] = RechnungFac.RECHNUNGART_ANZAHLUNG;
                sRechnungsarten[4] = RechnungFac.RECHNUNGART_SCHLUSSZAHLUNG;
            } else {
                sRechnungsarten = new String[3];
                sRechnungsarten[0] = LocaleFac.BELEGART_RECHNUNG;
                sRechnungsarten[1] = RechnungFac.RECHNUNGART_ANZAHLUNG;
                sRechnungsarten[2] = RechnungFac.RECHNUNGART_SCHLUSSZAHLUNG;
            }
            queryWhere = queryWhere + "AND R.MANDANT_C_NR = '" + theClientDto.getMandant() + "' ";
            boolean bFirstRechnungArt = true;
            for (int i = 0; i < sRechnungsarten.length; i++) {
                if (bFirstRechnungArt) {
                    queryWhere = queryWhere + "AND RECHNUNGART_C_NR IN (";
                    bFirstRechnungArt = false;
                } else {
                    queryWhere = queryWhere + ", ";
                }
                queryWhere = queryWhere + "'" + sRechnungsarten[i].trim() + "'";
            }
            queryWhere = queryWhere + ")";
            queryWhere = queryWhere + "AND STATUS_C_NR NOT LIKE '" + RechnungFac.STATUS_STORNIERT + "' ";
            if (krit.kundeIId != null) {
                queryWhere = queryWhere + "AND R.KUNDE_I_ID = " + krit.kundeIId + " ";
            }
            if (krit.vertreterIId != null) {
                queryWhere = queryWhere + "AND R.PERSONAL_I_ID_VERTRETER = " + krit.vertreterIId + " ";
            }
            if (!krit.getBMitTexteingaben()) {
                // das OR muss wegen Gutschriften rein
                queryWhere = queryWhere
                        + "AND (LP.LIEFERSCHEINPOSITIONART_C_NR != 'Texteingabe' OR LP.LIEFERSCHEINPOSITIONART_C_NR IS NULL) ";
            }
            if (krit.kostenstelleIId != null) {
                queryWhere = queryWhere + "AND R.KOSTENSTELLE_I_ID = " + krit.kostenstelleIId + " ";
            }
            String queryOrder = "ORDER BY ";
            if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_PARTNER) {
                queryOrder = queryOrder + "PN.C_NAME1NACHNAMEFIRMAZEILE1";
            } else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_BELEGNUMMER) {
                queryOrder = queryOrder + "R.C_NR";
            } else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_VERTRETER) {
                queryOrder = queryOrder + "R.PERSONAL_I_ID_VERTRETER";
            } else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_IDENT) {
                queryOrder = queryOrder + "AR.C_NR";
            }
            if (krit.getBVerwendeStatistikAdresse()) {
                queryOrder = queryOrder + ", PARTNER_STATISTIK.I_ID";
            }
            String queryString = querySelect + queryFrom + queryWhere + queryOrder;
            this.useCase = UC_REPORT_WARENAUSGANGSJOURNAL;
            SessionFactory factory = FLRSessionFactory.getFactory();
            session = factory.openSession();
            Query query = session.createSQLQuery(queryString);
            List<?> list = query.list();
            Map<Integer, Object> tmData = new TreeMap<Integer, Object>();
            int i = 0;
            for (Iterator<?> iter = list.iterator(); iter.hasNext();) {
                tmData.put(i, iter.next());
                i++;
            }
            // Lieferscheine ohne Rechnung hinten anhaengen
            // Alle Lieferscheine ohne Rechnung Kriterien
            List<?> LsList = null;
            if (krit.dVon != null || krit.dBis != null) {
                Criteria cLsPosCrit = session.createCriteria(FLRLieferscheinposition.class);
                Criteria cLs = cLsPosCrit
                        .createCriteria(LieferscheinpositionFac.FLR_LIEFERSCHEINPOSITION_FLRLIEFERSCHEIN);
                // Filter nach Mandant
                cLs.add(Restrictions.eq(LieferscheinFac.FLR_LIEFERSCHEIN_MANDANT_C_NR, theClientDto.getMandant()));
                // Filter nach Status (keine stornierten)
                cLs.add(Restrictions
                        .not(Restrictions.eq(LieferscheinFac.FLR_LIEFERSCHEIN_LIEFERSCHEINSTATUS_STATUS_C_NR,
                                LieferscheinFac.LSSTATUS_STORNIERT)));
                // Filter nach Datum
                if (krit.dVon != null) {
                    cLs.add(Restrictions.ge(LieferscheinFac.FLR_LIEFERSCHEIN_D_BELEGDATUM, krit.dVon));
                }
                if (krit.dBis != null) {
                    cLs.add(Restrictions.le(LieferscheinFac.FLR_LIEFERSCHEIN_D_BELEGDATUM, krit.dBis));
                }

                cLsPosCrit.add(Restrictions.gt(LieferscheinpositionFac.FLR_LIEFERSCHEINPOSITION_N_MENGE,
                        new BigDecimal(0)));

                // Filter nach Kunde
                if (krit.kundeIId != null) {
                    cLs.add(Restrictions.eq(LieferscheinFac.FLR_LIEFERSCHEIN_KUNDE_I_ID_RECHNUNGSADRESSE,
                            krit.kundeIId));
                }
                // Filter nach Vertreter
                if (krit.vertreterIId != null) {
                    cLs.add(Restrictions.eq(LieferscheinFac.FLR_LIEFERSCHEIN_PERSONAL_I_ID_VERTRETER,
                            krit.vertreterIId));
                }
                // Filter nach Kostenstelle
                if (krit.kostenstelleIId != null) {
                    cLs.add(Restrictions.eq(LieferscheinFac.FLR_LIEFERSCHEIN_KOSTENSTELLE_I_ID,
                            krit.kostenstelleIId));
                }
                if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_BELEGNUMMER) {
                    cLs.addOrder(Order.asc(LieferscheinFac.FLR_LIEFERSCHEIN_C_NR));
                }

                if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_PARTNER) {
                    cLs.createAlias("flrkunde", "k").createAlias("k.flrpartner", "p")
                            .addOrder(Order.asc("p.c_name1nachnamefirmazeile1"));

                }
                if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_VERTRETER) {
                    cLs.addOrder(Order.asc(LieferscheinFac.FLR_LIEFERSCHEIN_PERSONAL_I_ID_VERTRETER));
                }
                if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_IDENT) {
                    cLsPosCrit.createAlias("flrartikel", "a").addOrder(Order.asc("a.c_nr"));
                }

                if (krit.getBNurOffene()) {
                    Collection<String> cStati = new LinkedList<String>();
                    cStati.add(LieferscheinFac.LSSTATUS_ANGELEGT);
                    cStati.add(LieferscheinFac.LSSTATUS_OFFEN);
                    cStati.add(LieferscheinFac.LSSTATUS_ERLEDIGT);
                    cStati.add(LieferscheinFac.LSSTATUS_GELIEFERT);
                }
                cLs.add(Restrictions.isNull(LieferscheinFac.FLR_LIEFERSCHEIN_FLRRECHNUNG));
                LsList = cLsPosCrit.list();
            }
            // befuellen
            if (LsList != null) {
                for (Iterator<?> iter = LsList.iterator(); iter.hasNext();) {
                    FLRLieferscheinposition lspos = (FLRLieferscheinposition) iter.next();
                    Object[] dataRow = new Object[REPORT_WARENAUSGANG_ANZAHL_SPALTEN];
                    dataRow[FELD_WARENAUSGANG_LIEFERSCHEINNUMMER] = lspos.getFlrlieferschein().getC_nr();
                    dataRow[FELD_WARENAUSGANG_LIEFERSCHEINDATUM] = lspos.getFlrlieferschein().getD_belegdatum();

                    if (lspos.getFlrlieferschein().getFlrbegruendung() != null) {
                        dataRow[FELD_WARENAUSGANG_GRUNDNICHTEINGEHALTEN] = lspos.getFlrlieferschein()
                                .getFlrbegruendung().getC_nr();

                        if (lspos.getFlrlieferschein().getFlrbegruendung().getC_bez() != null) {
                            dataRow[FELD_WARENAUSGANG_GRUNDNICHTEINGEHALTEN] = lspos.getFlrlieferschein()
                                    .getFlrbegruendung().getC_bez();
                        }

                    }

                    dataRow[FELD_WARENAUSGANG_KUNDENBEZEICHNUNG] = lspos.getFlrlieferschein().getFlrkunde()
                            .getFlrpartner().getC_name1nachnamefirmazeile1();
                    dataRow[FELD_WARENAUSGANG_TEXTEINGABE] = lspos.getC_textinhalt();
                    dataRow[FELD_WARENAUSGANG_ILN_LIEFERADRESSE] = lspos.getFlrlieferschein().getFlrkunde()
                            .getFlrpartner().getC_iln();
                    dataRow[FELD_WARENAUSGANG_KUNDENNUMMER_LIEFERADRESSE_LS] = lspos.getFlrlieferschein()
                            .getFlrkunde().getI_kundennummer();
                    dataRow[FELD_WARENAUSGANG_KUNDENNUMMER] = lspos.getFlrlieferschein().getFlrkunde()
                            .getI_kundennummer();
                    dataRow[FELD_WARENAUSGANG_PARTNER_I_ID] = lspos.getFlrlieferschein().getFlrkunde()
                            .getFlrpartner().getI_id();
                    if (lspos.getFlrartikel() != null) {
                        dataRow[FELD_WARENAUSGANG_ARTIKELNUMMER] = lspos.getFlrartikel().getC_nr();
                        dataRow[FELD_WARENAUSGANG_ARTIKELPROVISION] = lspos.getFlrartikel()
                                .getF_vertreterprovisionmax();

                        if (lspos.getFlrartikel().getI_id() != null) {
                            ArtikelDto artikelDto = getArtikelFac()
                                    .artikelFindByPrimaryKeySmall(lspos.getFlrartikel().getI_id(), theClientDto);
                            dataRow[FELD_WARENAUSGANG_ARTIKELBEZEICHNUNG] = artikelDto.formatArtikelbezeichnung();
                            dataRow[FELD_WARENAUSGANG_ARTIKEL_GEWICHTKG] = artikelDto.getFGewichtkg();
                            if (artikelDto.formatArtikelbezeichnung().length() > 1) {
                                if (artikelDto.formatBezeichnung() != null) {
                                    // Comment out SK.. funktioniert so nicht
                                    // ???
                                    // data[i][
                                    // FELD_WARENAUSGANG_ARTIKELBEZEICHNUNG2] =
                                    // artikelDto.
                                    // formatBezeichnung().substring(artikelDto.
                                    // formatArtikelbezeichnung().
                                    // length() - 1);
                                } else {
                                    // data[i][
                                    // FELD_WARENAUSGANG_ARTIKELBEZEICHNUNG2] =
                                    // artikelDto.formatBezeichnung();
                                }
                            } else {
                                dataRow[FELD_WARENAUSGANG_ARTIKELBEZEICHNUNG2] = "";
                            }
                        } else {
                            dataRow[FELD_WARENAUSGANG_ARTIKELBEZEICHNUNG] = "";
                            dataRow[FELD_WARENAUSGANG_ARTIKELBEZEICHNUNG2] = "";
                        }
                        if (lspos.getFlrartikel().getFlrartikelklasse() != null) {
                            dataRow[FELD_WARENAUSGANG_ARTIKELKLASSE] = lspos.getFlrartikel().getFlrartikelklasse()
                                    .getC_nr();
                        } else {
                            dataRow[FELD_WARENAUSGANG_ARTIKELKLASSE] = "";
                        }
                        if (lspos.getFlrartikel().getFlrartikelgruppe() != null) {
                            dataRow[FELD_WARENAUSGANG_ARTIKELGRUPPE] = lspos.getFlrartikel().getFlrartikelgruppe()
                                    .getC_nr();
                        } else {
                            dataRow[FELD_WARENAUSGANG_ARTIKELGRUPPE] = "";
                        }
                        dataRow[FELD_WARENAUSGANG_EINHEIT] = lspos.getFlrartikel().getEinheit_c_nr();
                    }

                    dataRow[FELD_WARENAUSGANG_URSPRUNGSLAND] = "";
                    dataRow[FELD_WARENAUSGANG_WARENVERKEHRSNUMMER] = "";
                    dataRow[FELD_WARENAUSGANG_MENGE] = lspos.getN_menge();
                    dataRow[FELD_WARENAUSGANG_POSITIONSPREIS] = lspos
                            .getN_nettogesamtpreisplusversteckteraufschlagminusrabatt();
                    dataRow[FELD_WARENAUSGANG_GESTPREIS] = getLagerFac()
                            .getGemittelterGestehungspreisEinerAbgangsposition(LocaleFac.BELEGART_LIEFERSCHEIN,
                                    lspos.getI_id());

                    if (lspos.getFlrkostentraeger() != null) {
                        dataRow[FELD_WARENAUSGANG_KOSTENTRAEGER] = lspos.getFlrkostentraeger().getC_bez();
                    }

                    dataRow[FELD_WARENAUSGANG_TEXTEINGABE] = lspos.getC_textinhalt();
                    dataRow[FELD_WARENAUSGANG_RECHNUNGSPROVISION] = null;
                    if (lspos.getFlrlieferschein().getPersonal_i_id_vertreter() != null) {
                        PersonalDto persDto = getPersonalFac().personalFindByPrimaryKey(
                                lspos.getFlrlieferschein().getPersonal_i_id_vertreter(), theClientDto);
                        dataRow[FELD_WARENAUSGANG_PROVISIONSEMPFAENGER] = persDto.getCKurzzeichen();
                    }
                    if (lspos.getFlrmwstsatz() != null) {
                        dataRow[FELD_WARENAUSGANG_MWST] = lspos.getFlrmwstsatz().getF_mwstsatz();
                    }
                    dataRow[FELD_WARENAUSGANG_ERLOESKONTO] = null;
                    dataRow[FELD_WARENAUSGANG_DEBITORENKONTO] = null;
                    if (lspos.getFlrlieferschein().getFlrkunde().getFlrpartner().getFlrlandplzort() == null) {
                        dataRow[FELD_WARENAUSGANG_PLZ] = "";
                        dataRow[FELD_WARENAUSGANG_LKZ] = "";
                        dataRow[FELD_WARENAUSGANG_STATISTIKADRESSE_ORT] = "";
                    } else {
                        dataRow[FELD_WARENAUSGANG_PLZ] = lspos.getFlrlieferschein().getFlrkunde().getFlrpartner()
                                .getFlrlandplzort().getC_plz();
                        dataRow[FELD_WARENAUSGANG_LKZ] = lspos.getFlrlieferschein().getFlrkunde().getFlrpartner()
                                .getFlrlandplzort().getFlrland().getC_lkz();
                        dataRow[FELD_WARENAUSGANG_STATISTIKADRESSE_ORT] = lspos.getFlrlieferschein().getFlrkunde()
                                .getFlrpartner().getFlrlandplzort().getFlrort().getC_name();
                        dataRow[FELD_WARENAUSGANG_LIEFERADRESSE_ORT] = lspos.getFlrlieferschein().getFlrkunde()
                                .getFlrpartner().getFlrlandplzort().getFlrort().getC_name();
                    }
                    dataRow[FELD_WARENAUSGANG_ADRESSE] = lspos.getFlrlieferschein().getFlrkunde().getFlrpartner()
                            .getC_strasse();
                    dataRow[FELD_WARENAUSGANG_STATISTIKADRESSE_PARTNER_I_ID] = dataRow[FELD_WARENAUSGANG_PARTNER_I_ID];
                    dataRow[FELD_WARENAUSGANG_STATISTIKADRESSE_ANREDE_C_NR] = lspos.getFlrlieferschein()
                            .getFlrkunde().getFlrpartner().getAnrede_c_nr();
                    dataRow[FELD_WARENAUSGANG_STATISTIKADRESSE_C_NAME1] = lspos.getFlrlieferschein().getFlrkunde()
                            .getFlrpartner().getC_name1nachnamefirmazeile1();
                    dataRow[FELD_WARENAUSGANG_STATISTIKADRESSE_C_NAME2] = lspos.getFlrlieferschein().getFlrkunde()
                            .getFlrpartner().getC_name2vornamefirmazeile2();
                    dataRow[FELD_WARENAUSGANG_STATISTIKADRESSE_C_NAME3ABTEILUNG] = lspos.getFlrlieferschein()
                            .getFlrkunde().getFlrpartner().getC_name3vorname2abteilung();
                    dataRow[FELD_WARENAUSGANG_STATISTIKADRESSE_C_STRASSE] = lspos.getFlrlieferschein().getFlrkunde()
                            .getFlrpartner().getC_strasse();
                    dataRow[FELD_WARENAUSGANG_STATISTIKADRESSE_LAND] = dataRow[FELD_WARENAUSGANG_LKZ];
                    dataRow[FELD_WARENAUSGANG_STATISTIKADRESSE_PLZ] = dataRow[FELD_WARENAUSGANG_PLZ];
                    dataRow[FELD_WARENAUSGANG_LIEFERADRESSE_PARTNER_I_ID] = dataRow[FELD_WARENAUSGANG_PARTNER_I_ID];
                    dataRow[FELD_WARENAUSGANG_LIEFERADRESSE_ANREDE_C_NR] = lspos.getFlrlieferschein().getFlrkunde()
                            .getFlrpartner().getAnrede_c_nr();
                    dataRow[FELD_WARENAUSGANG_LIEFERADRESSE_C_NAME1] = lspos.getFlrlieferschein().getFlrkunde()
                            .getFlrpartner().getC_name1nachnamefirmazeile1();
                    dataRow[FELD_WARENAUSGANG_LIEFERADRESSE_C_NAME2] = lspos.getFlrlieferschein().getFlrkunde()
                            .getFlrpartner().getC_name2vornamefirmazeile2();
                    dataRow[FELD_WARENAUSGANG_LIEFERADRESSE_C_NAME3ABTEILUNG] = lspos.getFlrlieferschein()
                            .getFlrkunde().getFlrpartner().getC_name3vorname2abteilung();
                    dataRow[FELD_WARENAUSGANG_LIEFERADRESSE_C_STRASSE] = lspos.getFlrlieferschein().getFlrkunde()
                            .getFlrpartner().getC_strasse();
                    dataRow[FELD_WARENAUSGANG_LIEFERADRESSE_LAND] = dataRow[FELD_WARENAUSGANG_LKZ];
                    dataRow[FELD_WARENAUSGANG_LIEFERADRESSE_PLZ] = dataRow[FELD_WARENAUSGANG_PLZ];

                    Integer brancheIId = lspos.getFlrlieferschein().getFlrkunde().getFlrpartner().getBranche_i_id();
                    if (brancheIId != null) {
                        dataRow[FELD_WARENAUSGANG_BRANCHE] = getPartnerServicesFac()
                                .brancheFindByPrimaryKey(brancheIId, theClientDto).getCNr();
                    }
                    Integer partnerklIId = lspos.getFlrlieferschein().getFlrkunde().getFlrpartner()
                            .getPartnerklasse_i_id();
                    if (partnerklIId != null) {
                        dataRow[FELD_WARENAUSGANG_PARTNERKLASSE] = getPartnerFac()
                                .partnerklasseFindByPrimaryKey(partnerklIId, theClientDto).getCNr();
                    }
                    dataRow[FELD_WARENAUSGANG_USTLAND] = null;
                    dataRow[FELD_WARENAUSGANG_WAEHRUNG] = lspos.getFlrlieferschein()
                            .getWaehrung_c_nr_lieferscheinwaehrung();
                    dataRow[FELD_WARENAUSGANG_KURS] = new BigDecimal(
                            lspos.getFlrlieferschein().getF_wechselkursmandantwaehrungzulieferscheinwaehrung());
                    dataRow[FELD_WARENAUSGANG_BESTELLNUMMER] = lspos.getFlrlieferschein().getC_bestellnummer();
                    dataRow[FELD_WARENAUSGANG_PROJEKT] = lspos.getFlrlieferschein().getC_bez_projektbezeichnung();
                    if (lspos.getFlrlieferschein().getFlrkunderechnungsadresse() != null) {
                        dataRow[FELD_WARENAUSGANG_KUNDENNUMMER_RECHNUNGSADRESSE_LS] = lspos.getFlrlieferschein()
                                .getFlrkunderechnungsadresse().getI_kundennummer();
                        dataRow[FELD_WARENAUSGANG_KUNDENBEZEICHNUNG_RECHNUNGSADRESSE_LS] = lspos
                                .getFlrlieferschein().getFlrkunderechnungsadresse().getFlrpartner()
                                .getC_name1nachnamefirmazeile1();
                        dataRow[FELD_WARENAUSGANG_KUNDEKURZBEZEICHNUNG_RECHNUNGSADRESSE_LS] = lspos
                                .getFlrlieferschein().getFlrkunderechnungsadresse().getFlrpartner().getC_kbez();
                    } else {
                        dataRow[FELD_WARENAUSGANG_KUNDENNUMMER_RECHNUNGSADRESSE_LS] = "";
                        dataRow[FELD_WARENAUSGANG_KUNDENBEZEICHNUNG_RECHNUNGSADRESSE_LS] = "";
                        dataRow[FELD_WARENAUSGANG_KUNDEKURZBEZEICHNUNG_RECHNUNGSADRESSE_LS] = "";
                    }
                    dataRow[FELD_WARENAUSGANG_KUNDE_HINWEISEXT] = lspos.getFlrlieferschein().getFlrkunde()
                            .getC_hinweisextern();
                    dataRow[FELD_WARENAUSGANG_KUNDE_HINWEISINT] = lspos.getFlrlieferschein().getFlrkunde()
                            .getC_hinweisintern();

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

                        dataRow[FELD_WARENAUSGANG_SETARTIKEL_TYP] = ArtikelFac.SETARTIKEL_TYP_POSITION;

                    } else {
                        if (lspos.getSetartikel_set().size() > 0) {
                            dataRow[FELD_WARENAUSGANG_SETARTIKEL_TYP] = ArtikelFac.SETARTIKEL_TYP_KOPF;
                        }
                    }

                    if (lspos.getFlrlieferschein().getFlrauftrag() != null) {
                        dataRow[FELD_WARENAUSGANG_KUNDE_LIEFERDAUER] = lspos.getFlrlieferschein().getFlrauftrag()
                                .getFlrkunde().getI_lieferdauer();

                        dataRow[FELD_WARENAUSGANG_AUFTRAG_NUMMER] = lspos.getFlrlieferschein().getFlrauftrag()
                                .getC_nr();

                        if (lspos.getFlrlieferschein().getFlrauftrag().getFlrbegruendung() != null) {
                            String bez = lspos.getFlrlieferschein().getFlrauftrag().getFlrbegruendung().getC_nr();

                            if (lspos.getFlrlieferschein().getFlrauftrag().getFlrbegruendung().getC_bez() != null) {
                                bez += " "
                                        + lspos.getFlrlieferschein().getFlrauftrag().getFlrbegruendung().getC_bez();
                            }

                            dataRow[FELD_WARENAUSGANG_AUFTRAG_BEGRUENDUNG] = bez;
                        }
                    }
                    if (lspos.getFlrpositionensichtauftrag() != null) {
                        dataRow[FELD_WARENAUSGANG_GEPLANTER_LIEFERTERMIN] = lspos.getFlrpositionensichtauftrag()
                                .getT_uebersteuerterliefertermin();
                    }

                    if (lspos.getFlrlieferschein().getFlrkunde().getFlrpersonal() != null) {
                        dataRow[FELD_WARENAUSGANG_KUNDE_PROVISIONSEMPFAENGER_KURZZEICHEN] = lspos
                                .getFlrlieferschein().getFlrkunde().getFlrpersonal().getC_kurzzeichen();
                    } else {
                        dataRow[FELD_WARENAUSGANG_KUNDE_PROVISIONSEMPFAENGER_KURZZEICHEN] = "";
                    }
                    dataRow[FELD_WARENAUSGANG_LAGER_RECHNUNG] = "";
                    if (lspos.getFlrlieferschein().getFlrlager() != null) {
                        dataRow[FELD_WARENAUSGANG_LAGER_LIEFERSCHEIN] = lspos.getFlrlieferschein().getFlrlager()
                                .getC_nr();
                    } else {
                        dataRow[FELD_WARENAUSGANG_LAGER_LIEFERSCHEIN] = "";
                    }
                    if (lspos.getFlrlieferschein().getFlrziellager() != null) {
                        dataRow[FELD_WARENAUSGANG_ZIELLAGER_LIEFERSCHEIN] = lspos.getFlrlieferschein()
                                .getFlrziellager().getC_nr();
                    } else {
                        dataRow[FELD_WARENAUSGANG_ZIELLAGER_LIEFERSCHEIN] = "";
                    }
                    if (lspos.getFlrlieferschein().getFlrkunderechnungsadresse() != null) {
                        dataRow[FELD_WARENAUSGANG_ILN_RECHNUNGSADRESSE] = lspos.getFlrlieferschein()
                                .getFlrkunderechnungsadresse().getFlrpartner().getC_iln();
                    }

                    tmData.put(i, dataRow);
                    i++;
                }
            }

            // tmData in Object[][] umwandeln
            data = new Object[tmData.size()][REPORT_WARENAUSGANG_ANZAHL_SPALTEN];
            for (int y = 0; y < data.length; y++) {
                data[y] = (Object[]) tmData.get(y);
                if (RechnungFac.RECHNUNGART_GUTSCHRIFT.equals(data[y][FELD_WARENAUSGANG_RECHNUNGSART])
                        || RechnungFac.RECHNUNGART_WERTGUTSCHRIFT.equals(data[y][FELD_WARENAUSGANG_RECHNUNGSART])) {
                    BigDecimal bdMenge = (BigDecimal) data[y][FELD_WARENAUSGANG_MENGE];
                    if (bdMenge != null) {
                        data[y][FELD_WARENAUSGANG_MENGE] = bdMenge.multiply(new BigDecimal(-1));
                    } else {
                        data[y][FELD_WARENAUSGANG_MENGE] = new BigDecimal(0);
                    }
                    // SK: Achtung bremst
                    if (data[y][FELD_WARENAUSGANG_ZURECHNUNG] != null) {
                        RechnungDto rechDto = getRechnungFac()
                                .rechnungFindByPrimaryKey((Integer) data[y][FELD_WARENAUSGANG_ZURECHNUNG]);
                        data[y][FELD_WARENAUSGANG_ZURECHNUNG] = rechDto.getCNr();
                        data[y][FELD_WARENAUSGANG_LIEFERSCHEINDATUM] = rechDto.getTBelegdatum();
                    }
                }

                // Dauert so zu lange.. Felder werden einzeln uebergeben
                /*
                 * Integer partnerIId = (Integer)
                 * data[y][FELD_WARENAUSGANG_STATISTIKADRESSE];
                 * if(partnerIId!=null){ PartnerDto helper =
                 * getPartnerFac().partnerFindByPrimaryKey(partnerIId ,
                 * theClientDto); data[y][FELD_WARENAUSGANG_STATISTIKADRESSE]=
                 * helper.formatFixTitelName1Name2(); }
                 */
            }
            Map<String, Object> mapParameter = new TreeMap<String, Object>();
            StringBuffer sSortierung = new StringBuffer();

            mapParameter.put("P_MITTEXTEINGABEN", krit.getBMitTexteingaben());
            if (krit.bSortiereNachKostenstelle) {
                sSortierung.append(
                        getTextRespectUISpr("lp.kostenstelle", theClientDto.getMandant(), theClientDto.getLocUi()));
                sSortierung.append(", ");
            }
            if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_PARTNER) {
                if (krit.getBVerwendeStatistikAdresse()) {
                    sSortierung.append(getTextRespectUISpr("rech.statistikadresse", theClientDto.getMandant(),
                            theClientDto.getLocUi()));
                } else {
                    sSortierung.append(
                            getTextRespectUISpr("lp.kunde", theClientDto.getMandant(), theClientDto.getLocUi()));
                }
            } else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_BELEGNUMMER) {
                sSortierung.append(
                        getTextRespectUISpr("bes.belegnummer", theClientDto.getMandant(), theClientDto.getLocUi()));
            } else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_VERTRETER) {
                sSortierung.append(
                        getTextRespectUISpr("lp.vertreter", theClientDto.getMandant(), theClientDto.getLocUi()));
            } else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_IDENT) {
                sSortierung.append(
                        getTextRespectUISpr("lp.artikel", theClientDto.getMandant(), theClientDto.getLocUi()));
            }
            mapParameter.put(LPReport.P_SORTIERUNG, sSortierung.toString());
            if (krit.dBis != null && krit.dVon != null) {
                mapParameter.put(PARAMETER_WARENAUSGANG_BIS, krit.dBis.toString());
                mapParameter.put(PARAMETER_WARENAUSGANG_VON, krit.dVon.toString());
            }
            if (krit.sBelegnummerBis != null && krit.sBelegnummerVon != null) {
                mapParameter.put(PARAMETER_WARENAUSGANG_BIS, krit.sBelegnummerBis);
                mapParameter.put(PARAMETER_WARENAUSGANG_VON, krit.sBelegnummerVon);
            }
            mapParameter.put(PARAMETER_WARENAUSGNAG_GRUPPIERUNGNACHSTATISTIK, krit.getBVerwendeStatistikAdresse());
            mapParameter.put(PARAMETER_WARENAUSGANG_MANDANTENWAEHRUNG, theClientDto.getSMandantenwaehrung());
            initJRDS(mapParameter, RechnungReportFac.REPORT_MODUL, RechnungReportFac.REPORT_WARENAUSGANGSJOURNAL,
                    theClientDto.getMandant(), theClientDto.getLocUi(), theClientDto);
            return getReportPrint();
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
            return null;
        } finally {
            if (session != null) {
                session.close();
            }
        }

    }

    public JasperPrintLP printZusammenfassendeMeldung(java.sql.Date dVon, java.sql.Date dBis,
            Integer partnerIIdFinanzamt, TheClientDto theClientDto) {
        Session session = null;
        try {

            PartnerDto partnerDtoFinazamt = getPartnerFac().partnerFindByPrimaryKey(partnerIIdFinanzamt,
                    theClientDto);

            this.useCase = UC_REPORT_ALLE;
            SessionFactory factory = FLRSessionFactory.getFactory();
            session = factory.openSession();
            // Kunde oder Statistikadresse verwenden

            Criteria c = session.createCriteria(FLRRechnungReport.class);
            // Filter nach Mandant
            c.add(Restrictions.eq(RechnungFac.FLR_RECHNUNG_MANDANT_C_NR, theClientDto.getMandant()));

            // Rechnungen und Gutschriften
            Collection<String> cArten = new LinkedList<String>();
            cArten.add(RechnungFac.RECHNUNGTYP_RECHNUNG);
            cArten.add(RechnungFac.RECHNUNGART_GUTSCHRIFT);
            c.createCriteria(RechnungFac.FLR_RECHNUNG_FLRRECHNUNGART)
                    .add(Restrictions.in(RechnungFac.FLR_RECHNUNGART_RECHNUNGTYP_C_NR, cArten));

            // Filter nach Status (keine stornierten)
            c.add(Restrictions
                    .not(Restrictions.eq(RechnungFac.FLR_RECHNUNG_STATUS_C_NR, RechnungFac.STATUS_STORNIERT)));

            // Datum von/bis
            String sVon = null;
            String sBis = null;
            if (dVon != null) {
                c.add(Restrictions.ge(RechnungFac.FLR_RECHNUNG_D_BELEGDATUM, dVon));
                sVon = Helper.formatDatum(dVon, theClientDto.getLocUi());
            }
            if (dBis != null) {
                c.add(Restrictions.le(RechnungFac.FLR_RECHNUNG_D_BELEGDATUM, dBis));
                sBis = Helper.formatDatum(dBis, theClientDto.getLocUi());
            }

            // Belegnummer von/bis
            LpBelegnummerFormat f = getBelegnummerGeneratorObj().getBelegnummernFormat(theClientDto.getMandant());
            Integer iGeschaeftsjahr = getParameterFac().getGeschaeftsjahr(theClientDto.getMandant());
            String sMandantKuerzel = getParameterFac().getMandantparameter(theClientDto.getMandant(),
                    ParameterFac.KATEGORIE_ALLGEMEIN, ParameterFac.PARAMETER_BELEGNUMMER_MANDANTKENNUNG).getCWert();

            // Immer nach Kunde sortiert

            c.createCriteria(RechnungFac.FLR_RECHNUNG_FLRKUNDE).createCriteria(KundeFac.FLR_PARTNER)
                    .addOrder(Order.asc(PartnerFac.FLR_PARTNER_NAME1NACHNAMEFIRMAZEILE1));
            c.addOrder(Order.asc(RechnungFac.FLR_RECHNUNG_C_NR));

            List<?> list = c.list();

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

            for (Iterator<?> iter = list.iterator(); iter.hasNext();) {
                FLRRechnungReport r = (FLRRechnungReport) iter.next();

                Object[] zeile = new Object[REPORT_ZM_ANZAHL_SPALTEN];

                zeile[FELD_ZM_BELEGDATUM] = r.getD_belegdatum();
                // Bezahlte Betraege
                BigDecimal bdBezahlt = getRechnungFac().getBereitsBezahltWertVonRechnung(r.getI_id(), null);
                BigDecimal bdBezahltUst = getRechnungFac().getBereitsBezahltWertVonRechnungUst(r.getI_id(), null);

                BigDecimal bdWertmw = null;
                BigDecimal bdWertUstmw = null;
                BigDecimal bdBezahltmw = null;
                BigDecimal bdBezahltUstmw = null;
                bdBezahltmw = bdBezahlt;
                bdBezahltUstmw = bdBezahltUst;

                bdWertmw = r.getN_wert();
                bdWertUstmw = r.getN_wertust();
                if (r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_GUTSCHRIFT)
                        || r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_WERTGUTSCHRIFT)) {
                    if (bdWertmw != null)
                        bdWertmw = bdWertmw.negate();
                    if (bdWertUstmw != null)
                        bdWertUstmw = bdWertUstmw.negate();
                    if (bdBezahltmw != null)
                        bdBezahltmw = bdBezahltmw.negate();
                    if (bdBezahltUstmw != null)
                        bdBezahltUstmw = bdBezahltUstmw.negate();
                }
                zeile[FELD_ZM_BETRAG] = bdWertmw;
                zeile[FELD_ZM_BETRAGUST] = bdWertUstmw;
                zeile[FELD_ZM_BEZAHLT] = bdBezahltmw;
                zeile[FELD_ZM_BEZAHLTUST] = bdBezahltUstmw;
                // Kostenstelle
                if (r.getFlrkostenstelle() != null) {
                    String sKostenstellen = "";
                    KostenstelleDto k = null;
                    RechnungkontierungDto[] rechnungkontierungsDto = getRechnungFac()
                            .rechnungkontierungFindByRechnungIId(r.getI_id());
                    if (rechnungkontierungsDto.length != 0) {
                        for (int e = 0; e < rechnungkontierungsDto.length; e++) {
                            k = getSystemFac()
                                    .kostenstelleFindByPrimaryKey(rechnungkontierungsDto[e].getKostenstelleIId());
                            sKostenstellen = sKostenstellen + k.getCNr() + " ";
                        }
                    } else {
                        sKostenstellen = r.getFlrkostenstelle().getC_nr();
                    }
                    zeile[FELD_ZM_KOSTENSTELLENUMMER] = sKostenstellen;
                } else {
                    zeile[FELD_ZM_KOSTENSTELLENUMMER] = null;
                }
                // Kundendaten
                FLRKunde flrKunde, flrKundeStatistik;
                flrKunde = r.getFlrkunde();

                // Statistikdaten wenn nicht Kriterium Statistikadresse
                flrKundeStatistik = r.getFlrstatistikadresse();
                zeile[FELD_ZM_KUNDE_STATISTIK] = flrKundeStatistik.getFlrpartner().getC_name1nachnamefirmazeile1();
                if (flrKundeStatistik.getFlrpartner().getC_name2vornamefirmazeile2() != null) {
                    zeile[FELD_ZM_KUNDE2_STATISTIK] = flrKundeStatistik.getFlrpartner()
                            .getC_name2vornamefirmazeile2();
                } else {
                    zeile[FELD_ZM_KUNDE2_STATISTIK] = "";
                }
                PartnerDto partnerDtoStatistik = getPartnerFac()
                        .partnerFindByPrimaryKey(flrKundeStatistik.getFlrpartner().getI_id(), theClientDto);
                zeile[FELD_ZM_ADRESSE_STATISTIK] = partnerDtoStatistik.formatAdresse();

                zeile[FELD_ZM_KUNDE] = flrKunde.getFlrpartner().getC_name1nachnamefirmazeile1();
                zeile[FELD_ZM_REVERSE_CHARGE] = Helper.short2Boolean(r.getB_reversecharge());
                zeile[FELD_ZM_KUNDE_UID] = flrKunde.getFlrpartner().getC_uid();
                if (r.getFlrvertreter() != null) {
                    if (r.getFlrvertreter().getFlrpartner().getC_name2vornamefirmazeile2() != null) {
                        zeile[FELD_ZM_VERTRETER] = r.getFlrvertreter().getFlrpartner()
                                .getC_name1nachnamefirmazeile1() + " "
                                + r.getFlrvertreter().getFlrpartner().getC_name2vornamefirmazeile2();
                    } else {
                        zeile[FELD_ZM_VERTRETER] = r.getFlrvertreter().getFlrpartner()
                                .getC_name1nachnamefirmazeile1();
                    }
                }
                if (flrKunde.getFlrpartner().getC_name2vornamefirmazeile2() != null) {
                    zeile[FELD_ZM_KUNDE2] = flrKunde.getFlrpartner().getC_name2vornamefirmazeile2();
                } else {
                    zeile[FELD_ZM_KUNDE2] = "";
                }
                PartnerDto partnerDto = getPartnerFac().partnerFindByPrimaryKey(flrKunde.getFlrpartner().getI_id(),
                        theClientDto);
                zeile[FELD_ZM_ADRESSE] = partnerDto.formatAdresse();

                Integer mahnstufeIId = getMahnwesenFac().getAktuelleMahnstufeEinerRechnung(r.getI_id(),
                        theClientDto);

                if (mahnstufeIId != null) {
                    zeile[FELD_ZM_MAHNSTUFE] = mahnstufeIId;
                    MahnstufeDto mahnstufeDto = getMahnwesenFac()
                            .mahnstufeFindByPrimaryKey(new MahnstufePK(mahnstufeIId, r.getMandant_c_nr()));
                    // Zinsen nur fuer noch nicht vollstaendig bezahlte
                    if (!r.getStatus_c_nr().equals(RechnungFac.STATUS_BEZAHLT)) {
                        if (mahnstufeDto.getFZinssatz() != null) {
                            BigDecimal bdOffen = r.getN_wert().subtract(bdBezahlt);
                            // Zinsen
                            zeile[FELD_ZM_ZINSEN] = bdOffen
                                    .multiply(new BigDecimal(mahnstufeDto.getFZinssatz().floatValue()))
                                    .movePointLeft(2);
                        }
                    }
                }
                zeile[FELD_ZM_ORT] = partnerDto.formatAdresse();
                if (r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_RECHNUNG)) {
                    zeile[FELD_ZM_RECHNUNGSNUMMER] = "RE " + r.getC_nr();
                    zeile[FELD_ZM_RECHNUNGSNUMMERZUGUTSCHRIFT] = "";
                } else if (r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_ANZAHLUNG)) {
                    zeile[FELD_ZM_RECHNUNGSNUMMER] = "AZ " + r.getC_nr();
                    zeile[FELD_ZM_RECHNUNGSNUMMERZUGUTSCHRIFT] = "";
                } else if (r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_SCHLUSSZAHLUNG)) {
                    zeile[FELD_ZM_RECHNUNGSNUMMER] = "SZ " + r.getC_nr();
                    zeile[FELD_ZM_RECHNUNGSNUMMERZUGUTSCHRIFT] = "";
                } else {
                    if (r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_GUTSCHRIFT)
                            || r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_WERTGUTSCHRIFT)) {
                        zeile[FELD_ZM_RECHNUNGSNUMMER] = "GS " + r.getC_nr();
                        // wenn es eine Gutschrift ist die C_NR der Rechnung
                        // uebergeben
                        if (r.getFlrrechnung() != null) {
                            zeile[FELD_ZM_RECHNUNGSNUMMERZUGUTSCHRIFT] = "RE " + r.getFlrrechnung().getC_nr();
                        }
                    } else {
                        zeile[FELD_ZM_RECHNUNGSNUMMER] = r.getC_nr();
                        zeile[FELD_ZM_RECHNUNGSNUMMERZUGUTSCHRIFT] = "";
                    }
                }
                if (r.getZahlungsziel_i_id() != null) {
                    zeile[FELD_ZM_ZIELDATUM] = getMandantFac().berechneZielDatumFuerBelegdatum(r.getD_belegdatum(),
                            r.getZahlungsziel_i_id(), theClientDto);
                }
                // Bezahlt
                if (r.getT_bezahltdatum() != null) {
                    zeile[FELD_ZM_BEZAHLTDATUM] = r.getT_bezahltdatum();
                    // Zahltage
                    int iZahltage = Helper.getDifferenzInTagen(r.getD_belegdatum(), r.getT_bezahltdatum());
                    zeile[FELD_ZM_ZAHLTAGE] = new Integer(iZahltage);
                }
                // Debitorenkontonummer
                KontoDtoSmall kontoDtoDeb = null;
                if (flrKunde.getKonto_i_id_debitorenkonto() != null) {
                    kontoDtoDeb = getFinanzFac()
                            .kontoFindByPrimaryKeySmallOhneExc(flrKunde.getKonto_i_id_debitorenkonto());
                }
                String sKontonummer;
                if (kontoDtoDeb != null) {
                    sKontonummer = kontoDtoDeb.getCNr();
                } else {
                    sKontonummer = "";
                }
                zeile[FELD_ZM_DEBITORENKONTO] = sKontonummer;
                zeile[FELD_ZM_WAEHRUNG] = r.getWaehrung_c_nr();
                zeile[FELD_ZM_KURS] = r.getN_kurs();

                // 14217
                String sLaenderart = getFinanzServiceFac().getLaenderartZuPartner(partnerDtoFinazamt, partnerDto,
                        theClientDto);
                zeile[FELD_ZM_LAENDERART] = sLaenderart;

                if (sLaenderart != null && sLaenderart.equals(FinanzFac.LAENDERART_EU_AUSLAND_MIT_UID)) {
                    alZeilen.add(zeile);
                }

            }

            data = new Object[alZeilen.size()][REPORT_ZM_ANZAHL_SPALTEN];
            data = alZeilen.toArray(data);

            MandantDto mandantDto = getMandantFac().mandantFindByPrimaryKey(theClientDto.getMandant(),
                    theClientDto);
            // Waehrung
            HashMap mapParameter = new HashMap();
            mapParameter.put(LPReport.P_WAEHRUNG, mandantDto.getWaehrungCNr());
            StringBuffer sSortierung = new StringBuffer();

            sSortierung.append(getTextRespectUISpr("lp.kunde", theClientDto.getMandant(), theClientDto.getLocUi()));

            StringBuffer sFilter = new StringBuffer();
            if (sVon != null) {
                sFilter.append(getTextRespectUISpr("lp.von", theClientDto.getMandant(), theClientDto.getLocUi()));
                sFilter.append(" " + sVon + " ");
            }
            if (sBis != null) {
                sFilter.append(getTextRespectUISpr("lp.bis", theClientDto.getMandant(), theClientDto.getLocUi()));
                sFilter.append(" " + sBis + " ");
            }

            mapParameter.put(LPReport.P_SORTIERUNG, sSortierung.toString());
            mapParameter.put(LPReport.P_FILTER, sFilter.toString());

            FinanzamtDto finanzamtDto = getFinanzFac().finanzamtFindByPrimaryKey(partnerIIdFinanzamt,
                    theClientDto.getMandant(), theClientDto);

            boolean bRunden = false;

            bRunden = Helper.short2boolean(finanzamtDto.getBUmsatzRunden());

            mapParameter.put("P_FA_NAME", finanzamtDto.getPartnerDto().formatFixName1Name2());
            mapParameter.put("P_FA_ADRESSE", finanzamtDto.getPartnerDto().formatAdresse());
            // Steuernummer
            mapParameter.put("P_FA_STEUERNUMMER", finanzamtDto.getCSteuernummer());
            mapParameter.put("P_FA_REFERAT", finanzamtDto.getCReferat());
            mapParameter.put("P_UMSATZRUNDEN", new Boolean(bRunden));

            initJRDS(mapParameter, RechnungReportFac.REPORT_MODUL, RechnungReportFac.REPORT_RECHNUNGEN_ZM,
                    theClientDto.getMandant(), theClientDto.getLocUi(), theClientDto);
            return getReportPrint();

        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
            return null;
        } finally {
            if (session != null) {
                session.close();
            }
        }

    }

    private JasperPrintLP buildAlleReport(ReportRechnungJournalKriterienDto krit, String rechnungtypCNr,
            String sReportname, TheClientDto theClientDto) throws EJBExceptionLP {
        Session session = null;
        try {
            this.useCase = UC_REPORT_ALLE;
            SessionFactory factory = FLRSessionFactory.getFactory();
            session = factory.openSession();
            // Kunde oder Statistikadresse verwenden
            final String critKundeIId;
            final String critFLRKunde;
            if (krit.getBVerwendeStatistikAdresse()) {
                critKundeIId = RechnungFac.FLR_RECHNUNG_KUNDE_I_ID_STATISTIKADRESSE;
                critFLRKunde = RechnungFac.FLR_RECHNUNG_FLRSTATISTIKADRESSE;
            } else {
                critKundeIId = RechnungFac.FLR_RECHNUNG_KUNDE_I_ID;
                critFLRKunde = RechnungFac.FLR_RECHNUNG_FLRKUNDE;
            }

            Criteria c = session.createCriteria(FLRRechnungReport.class);
            // Filter nach Mandant
            c.add(Restrictions.eq(RechnungFac.FLR_RECHNUNG_MANDANT_C_NR, theClientDto.getMandant()));
            if (krit.getBGutschriftenBeruecksichtigen()) {
                // Rechnungen und Gutschriften
                Collection<String> cArten = new LinkedList<String>();
                cArten.add(rechnungtypCNr);
                cArten.add(RechnungFac.RECHNUNGART_GUTSCHRIFT);
                c.createCriteria(RechnungFac.FLR_RECHNUNG_FLRRECHNUNGART)
                        .add(Restrictions.in(RechnungFac.FLR_RECHNUNGART_RECHNUNGTYP_C_NR, cArten));
            } else {
                // nur Rechnungen
                c.createCriteria(RechnungFac.FLR_RECHNUNG_FLRRECHNUNGART)
                        .add(Restrictions.eq(RechnungFac.FLR_RECHNUNGART_RECHNUNGTYP_C_NR, rechnungtypCNr));
            }
            // Filter nach Kostenstelle
            if (krit.kostenstelleIId != null) {
                c.add(Restrictions.eq(RechnungFac.FLR_RECHNUNG_KOSTENSTELLE_I_ID, krit.kostenstelleIId));
            }
            // Filter nach einem Kunden
            Map<String, Object> mapParameter = new TreeMap<String, Object>();
            if (krit.kundeIId != null) {
                c.add(Restrictions.eq(critKundeIId, krit.kundeIId));
                KundeDto kundeDto = getKundeFac().kundeFindByPrimaryKey(krit.kundeIId, theClientDto);
                mapParameter.put("P_KUNDE", kundeDto.getPartnerDto().formatTitelAnrede());
            }
            // Filter nach einem Vertrter
            if (krit.vertreterIId != null) {
                c.add(Restrictions.eq(RechnungFac.FLR_RECHNUNG_FLRVERTRETER + ".i_id", krit.vertreterIId));
            }
            // Filter nach Status (keine stornierten)
            c.add(Restrictions
                    .not(Restrictions.eq(RechnungFac.FLR_RECHNUNG_STATUS_C_NR, RechnungFac.STATUS_STORNIERT)));
            // Nur offene anzeigen?
            if (krit.getBNurOffene()) {
                Collection<String> cStati = new LinkedList<String>();
                cStati.add(RechnungFac.STATUS_ANGELEGT);
                cStati.add(RechnungFac.STATUS_OFFEN);
                cStati.add(RechnungFac.STATUS_TEILBEZAHLT);
                cStati.add(RechnungFac.STATUS_VERBUCHT);
                c.add(Restrictions.in(RechnungFac.FLR_RECHNUNG_STATUS_C_NR, cStati));
            }
            // Datum von/bis
            String sVon = null;
            String sBis = null;
            if (krit.dVon != null) {
                c.add(Restrictions.ge(RechnungFac.FLR_RECHNUNG_D_BELEGDATUM, krit.dVon));
                sVon = Helper.formatDatum(krit.dVon, theClientDto.getLocUi());
            }
            if (krit.dBis != null) {
                c.add(Restrictions.le(RechnungFac.FLR_RECHNUNG_D_BELEGDATUM, krit.dBis));
                sBis = Helper.formatDatum(krit.dBis, theClientDto.getLocUi());
            }

            // Belegnummer von/bis
            LpBelegnummerFormat f = getBelegnummerGeneratorObj().getBelegnummernFormat(theClientDto.getMandant());
            Integer iGeschaeftsjahr = getParameterFac().getGeschaeftsjahr(theClientDto.getMandant());
            String sMandantKuerzel = getParameterFac().getMandantparameter(theClientDto.getMandant(),
                    ParameterFac.KATEGORIE_ALLGEMEIN, ParameterFac.PARAMETER_BELEGNUMMER_MANDANTKENNUNG).getCWert();
            if (krit.sBelegnummerVon != null) {
                sVon = HelperServer.getBelegnummernFilterForHibernateCriterias(f, iGeschaeftsjahr, sMandantKuerzel,
                        krit.sBelegnummerVon);
                c.add(Restrictions.ge(RechnungFac.FLR_RECHNUNG_C_NR, sVon));
            }
            if (krit.sBelegnummerBis != null) {
                sBis = HelperServer.getBelegnummernFilterForHibernateCriterias(f, iGeschaeftsjahr, sMandantKuerzel,
                        krit.sBelegnummerBis);
                c.add(Restrictions.le(RechnungFac.FLR_RECHNUNG_C_NR, sBis));
            }
            // Sortierung nach Kostenstelle ist optional
            if (krit.bSortiereNachKostenstelle) {
                c.createCriteria(RechnungFac.FLR_RECHNUNG_FLRKOSTENSTELLE).addOrder(Order.asc("c_nr"));
            }
            // Sortierung nach Partner ist optional
            if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_PARTNER) {
                c.createCriteria(critFLRKunde).createCriteria(KundeFac.FLR_PARTNER)
                        .addOrder(Order.asc(PartnerFac.FLR_PARTNER_NAME1NACHNAMEFIRMAZEILE1));
            } else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_BELEGNUMMER) {
                c.addOrder(Order.asc(RechnungFac.FLR_RECHNUNG_C_NR));
            }
            if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_VERTRETER) {
                c.createCriteria(RechnungFac.FLR_RECHNUNG_FLRVERTRETER)
                        .addOrder(Order.asc(PersonalFac.FLR_PERSONAL_C_KURZZEICHEN));
            }
            List<?> list = c.list();
            data = new Object[list.size()][REPORT_ALLE_ANZAHL_SPALTEN];

            // Map mapZahlungsziele =
            // getMandantFac().zahlungszielFindAllByMandantAsDto
            // (theClientDto.getMandant(),
            // theClientDto.getIDUser());

            int i = 0;
            for (Iterator<?> iter = list.iterator(); iter.hasNext();) {
                FLRRechnungReport r = (FLRRechnungReport) iter.next();
                data[i][FELD_ALLE_BELEGDATUM] = r.getD_belegdatum();
                // Bezahlte Betraege
                BigDecimal bdBezahlt = getRechnungFac().getBereitsBezahltWertVonRechnung(r.getI_id(), null);
                BigDecimal bdBezahltUst = getRechnungFac().getBereitsBezahltWertVonRechnungUst(r.getI_id(), null);

                BigDecimal bdWertmw = null;
                BigDecimal bdWertUstmw = null;
                BigDecimal bdBezahltmw = null;
                BigDecimal bdBezahltUstmw = null;
                bdBezahltmw = bdBezahlt;
                bdBezahltUstmw = bdBezahltUst;

                BigDecimal bdWertFW = null;
                BigDecimal bdWertUstFW = null;
                BigDecimal bdBezahltFW = getRechnungFac().getBereitsBezahltWertVonRechnungFw(r.getI_id(), null);
                BigDecimal bdBezahltUstFW = getRechnungFac().getBereitsBezahltWertVonRechnungUstFw(r.getI_id(),
                        null);

                bdWertmw = r.getN_wert();
                bdWertUstmw = r.getN_wertust();
                bdWertFW = r.getN_wertfw();
                bdWertUstFW = r.getN_wertustfw();
                if (r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_GUTSCHRIFT)
                        || r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_WERTGUTSCHRIFT)) {
                    if (bdWertmw != null)
                        bdWertmw = bdWertmw.negate();
                    if (bdWertUstmw != null)
                        bdWertUstmw = bdWertUstmw.negate();
                    if (bdBezahltmw != null)
                        bdBezahltmw = bdBezahltmw.negate();
                    if (bdBezahltUstmw != null)
                        bdBezahltUstmw = bdBezahltUstmw.negate();
                    // FW
                    if (bdWertFW != null)
                        bdWertFW = bdWertFW.negate();
                    if (bdWertUstFW != null)
                        bdWertUstFW = bdWertUstFW.negate();
                    if (bdBezahltFW != null)
                        bdBezahltFW = bdBezahltFW.negate();
                    if (bdBezahltUstFW != null)
                        bdBezahltUstFW = bdBezahltUstFW.negate();

                }
                data[i][FELD_ALLE_BETRAG] = bdWertmw;
                data[i][FELD_ALLE_BETRAGUST] = bdWertUstmw;
                data[i][FELD_ALLE_BEZAHLT] = bdBezahltmw;
                data[i][FELD_ALLE_BEZAHLTUST] = bdBezahltUstmw;

                data[i][FELD_ALLE_BETRAG_FW] = bdWertFW;
                data[i][FELD_ALLE_BETRAGUST_FW] = bdWertUstFW;
                data[i][FELD_ALLE_BEZAHLT_FW] = bdBezahltFW;
                data[i][FELD_ALLE_BEZAHLTUST_FW] = bdBezahltUstFW;

                BigDecimal bdUstAnzahlungMandWhg = new BigDecimal(0);
                BigDecimal bdNettoAnzahlungMandWhg = new BigDecimal(0);
                BigDecimal bdUstAnzahlungFW = new BigDecimal(0);
                BigDecimal bdNettoAnzahlungFW = new BigDecimal(0);
                if (r.getFlrauftrag() != null
                        && r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_SCHLUSSZAHLUNG)) {

                    bdUstAnzahlungFW = getRechnungFac().getAnzahlungenZuSchlussrechnungUstFw(r.getI_id());
                    bdNettoAnzahlungFW = getRechnungFac().getAnzahlungenZuSchlussrechnungFw(r.getI_id());

                    bdNettoAnzahlungMandWhg = getLocaleFac().rechneUmInAndereWaehrungZuDatum(bdNettoAnzahlungFW,
                            r.getWaehrung_c_nr(), theClientDto.getSMandantenwaehrung(),
                            new Date(System.currentTimeMillis()), theClientDto);
                    bdUstAnzahlungMandWhg = getLocaleFac().rechneUmInAndereWaehrungZuDatum(bdUstAnzahlungFW,
                            r.getWaehrung_c_nr(), theClientDto.getSMandantenwaehrung(),
                            new Date(System.currentTimeMillis()), theClientDto);

                }

                data[i][FELD_ALLE_WERT_ANZAHLUNGEN] = bdNettoAnzahlungMandWhg;
                data[i][FELD_ALLE_WERT_ANZAHLUNGENUST] = bdUstAnzahlungMandWhg;
                data[i][FELD_ALLE_WERT_ANZAHLUNGEN_FW] = bdNettoAnzahlungFW;
                data[i][FELD_ALLE_WERT_ANZAHLUNGENUST_FW] = bdUstAnzahlungFW;

                // Kostenstelle
                if (r.getFlrkostenstelle() != null) {
                    String sKostenstellen = "";
                    KostenstelleDto k = null;
                    RechnungkontierungDto[] rechnungkontierungsDto = getRechnungFac()
                            .rechnungkontierungFindByRechnungIId(r.getI_id());
                    if (rechnungkontierungsDto.length != 0) {
                        for (int e = 0; e < rechnungkontierungsDto.length; e++) {
                            k = getSystemFac()
                                    .kostenstelleFindByPrimaryKey(rechnungkontierungsDto[e].getKostenstelleIId());
                            sKostenstellen = sKostenstellen + k.getCNr() + " ";
                        }
                    } else {
                        sKostenstellen = r.getFlrkostenstelle().getC_nr();
                    }
                    data[i][FELD_ALLE_KOSTENSTELLENUMMER] = sKostenstellen;
                } else {
                    data[i][FELD_ALLE_KOSTENSTELLENUMMER] = null;
                }
                // Kundendaten
                FLRKunde flrKunde, flrKundeStatistik;
                if (krit.getBVerwendeStatistikAdresse()) {
                    flrKunde = r.getFlrstatistikadresse();
                } else {
                    flrKunde = r.getFlrkunde();

                    // Statistikdaten wenn nicht Kriterium Statistikadresse
                    flrKundeStatistik = r.getFlrstatistikadresse();
                    data[i][FELD_ALLE_KUNDE_STATISTIK] = flrKundeStatistik.getFlrpartner()
                            .getC_name1nachnamefirmazeile1();
                    if (flrKundeStatistik.getFlrpartner().getC_name2vornamefirmazeile2() != null) {
                        data[i][FELD_ALLE_KUNDE2_STATISTIK] = flrKundeStatistik.getFlrpartner()
                                .getC_name2vornamefirmazeile2();
                    } else {
                        data[i][FELD_ALLE_KUNDE2_STATISTIK] = "";
                    }
                    PartnerDto partnerDtoStatistik = getPartnerFac()
                            .partnerFindByPrimaryKey(flrKundeStatistik.getFlrpartner().getI_id(), theClientDto);
                    data[i][FELD_ALLE_ADRESSE_STATISTIK] = partnerDtoStatistik.formatAdresse();

                }
                data[i][FELD_ALLE_KUNDE] = flrKunde.getFlrpartner().getC_name1nachnamefirmazeile1();
                data[i][FELD_ALLE_REVERSE_CHARGE] = Helper.short2Boolean(r.getB_reversecharge());
                data[i][FELD_ALLE_STATUS] = r.getStatus_c_nr();
                data[i][FELD_ALLE_ZOLLBELEGNUMMER] = r.getC_zollpapier();
                data[i][FELD_ALLE_KUNDE_UID] = flrKunde.getFlrpartner().getC_uid();
                if (r.getFlrvertreter() != null) {
                    if (r.getFlrvertreter().getFlrpartner().getC_name2vornamefirmazeile2() != null) {
                        data[i][FELD_ALLE_VERTRETER] = r.getFlrvertreter().getFlrpartner()
                                .getC_name1nachnamefirmazeile1() + " "
                                + r.getFlrvertreter().getFlrpartner().getC_name2vornamefirmazeile2();
                    } else {
                        data[i][FELD_ALLE_VERTRETER] = r.getFlrvertreter().getFlrpartner()
                                .getC_name1nachnamefirmazeile1();
                    }
                }
                if (flrKunde.getFlrpartner().getC_name2vornamefirmazeile2() != null) {
                    data[i][FELD_ALLE_KUNDE2] = flrKunde.getFlrpartner().getC_name2vornamefirmazeile2();
                } else {
                    data[i][FELD_ALLE_KUNDE2] = "";
                }
                PartnerDto partnerDto = getPartnerFac().partnerFindByPrimaryKey(flrKunde.getFlrpartner().getI_id(),
                        theClientDto);
                data[i][FELD_ALLE_ADRESSE] = partnerDto.formatAdresse();
                Integer mahnstufeIId = getMahnwesenFac().getAktuelleMahnstufeEinerRechnung(r.getI_id(),
                        theClientDto);

                if (mahnstufeIId != null) {
                    data[i][FELD_ALLE_MAHNSTUFE] = mahnstufeIId;
                    MahnstufeDto mahnstufeDto = getMahnwesenFac()
                            .mahnstufeFindByPrimaryKey(new MahnstufePK(mahnstufeIId, r.getMandant_c_nr()));
                    // Zinsen nur fuer noch nicht vollstaendig bezahlte
                    if (!r.getStatus_c_nr().equals(RechnungFac.STATUS_BEZAHLT)) {
                        if (mahnstufeDto.getFZinssatz() != null) {
                            BigDecimal bdOffen = r.getN_wert().subtract(bdBezahlt);
                            // Zinsen
                            data[i][FELD_ALLE_ZINSEN] = bdOffen
                                    .multiply(new BigDecimal(mahnstufeDto.getFZinssatz().floatValue()))
                                    .movePointLeft(2);
                        }
                    }
                }
                data[i][FELD_ALLE_ORT] = partnerDto.formatAdresse();
                if (r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_RECHNUNG)) {
                    data[i][FELD_ALLE_RECHNUNGSNUMMER] = "RE " + r.getC_nr();
                    data[i][FELD_ALLE_RECHNUNGSNUMMERZUGUTSCHRIFT] = "";
                } else {
                    if (r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_GUTSCHRIFT)
                            || r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_WERTGUTSCHRIFT)) {
                        data[i][FELD_ALLE_RECHNUNGSNUMMER] = "GS " + r.getC_nr();
                        // wenn es eine Gutschrift ist die C_NR der Rechnung
                        // uebergeben
                        if (r.getFlrrechnung() != null) {
                            data[i][FELD_ALLE_RECHNUNGSNUMMERZUGUTSCHRIFT] = "RE " + r.getFlrrechnung().getC_nr();
                        }
                    } else if (r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_ANZAHLUNG)) {
                        data[i][FELD_ALLE_RECHNUNGSNUMMER] = "AZ " + r.getC_nr();
                    } else if (r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_SCHLUSSZAHLUNG)) {
                        data[i][FELD_ALLE_RECHNUNGSNUMMER] = "SR " + r.getC_nr();
                    } else if (r.getFlrrechnungart().getC_nr().equals(RechnungFac.RECHNUNGART_PROFORMARECHNUNG)) {
                        data[i][FELD_ALLE_RECHNUNGSNUMMER] = "PF " + r.getC_nr();
                    } else {
                        data[i][FELD_ALLE_RECHNUNGSNUMMER] = r.getC_nr();
                        data[i][FELD_ALLE_RECHNUNGSNUMMERZUGUTSCHRIFT] = "";
                    }
                }
                if (r.getZahlungsziel_i_id() != null) {
                    data[i][FELD_ALLE_ZIELDATUM] = getMandantFac().berechneZielDatumFuerBelegdatum(
                            r.getD_belegdatum(), r.getZahlungsziel_i_id(), theClientDto);
                }
                // Bezahlt
                if (r.getT_bezahltdatum() != null) {
                    data[i][FELD_ALLE_BEZAHLTDATUM] = r.getT_bezahltdatum();
                    // Zahltage
                    int iZahltage = Helper.getDifferenzInTagen(r.getD_belegdatum(), r.getT_bezahltdatum());
                    data[i][FELD_ALLE_ZAHLTAGE] = new Integer(iZahltage);
                }
                // Debitorenkontonummer
                KontoDtoSmall kontoDtoDeb = null;
                if (flrKunde.getKonto_i_id_debitorenkonto() != null) {
                    kontoDtoDeb = getFinanzFac()
                            .kontoFindByPrimaryKeySmallOhneExc(flrKunde.getKonto_i_id_debitorenkonto());
                }
                String sKontonummer;
                if (kontoDtoDeb != null) {
                    sKontonummer = kontoDtoDeb.getCNr();
                } else {
                    sKontonummer = "";
                }
                data[i][FELD_ALLE_DEBITORENKONTO] = sKontonummer;
                data[i][FELD_ALLE_WAEHRUNG] = r.getWaehrung_c_nr();
                data[i][FELD_ALLE_KURS] = r.getN_kurs();

                // 14217
                String sLaenderart = getFinanzServiceFac().getLaenderartZuPartner(partnerDto.getIId(),
                        theClientDto);
                data[i][FELD_ALLE_LAENDERART] = sLaenderart;
                i++;
            }

            MandantDto mandantDto = getMandantFac().mandantFindByPrimaryKey(theClientDto.getMandant(),
                    theClientDto);
            // Waehrung
            mapParameter.put(LPReport.P_WAEHRUNG, mandantDto.getWaehrungCNr());
            StringBuffer sSortierung = new StringBuffer();
            if (krit.bSortiereNachKostenstelle) {
                sSortierung.append(
                        getTextRespectUISpr("lp.kostenstelle", theClientDto.getMandant(), theClientDto.getLocUi()));
                sSortierung.append(", ");
            }
            if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_PARTNER) {
                if (krit.getBVerwendeStatistikAdresse()) {
                    sSortierung.append(getTextRespectUISpr("rech.statistikadresse", theClientDto.getMandant(),
                            theClientDto.getLocUi()));
                } else {
                    sSortierung.append(
                            getTextRespectUISpr("lp.kunde", theClientDto.getMandant(), theClientDto.getLocUi()));
                }
            } else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_BELEGNUMMER) {
                sSortierung.append(
                        getTextRespectUISpr("bes.belegnummer", theClientDto.getMandant(), theClientDto.getLocUi()));
            } else if (krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_VERTRETER) {
                sSortierung.append(
                        getTextRespectUISpr("lp.vertreter", theClientDto.getMandant(), theClientDto.getLocUi()));
            }
            StringBuffer sFilter = new StringBuffer();
            if (sVon != null) {
                sFilter.append(getTextRespectUISpr("lp.von", theClientDto.getMandant(), theClientDto.getLocUi()));
                sFilter.append(" " + sVon + " ");
            }
            if (sBis != null) {
                sFilter.append(getTextRespectUISpr("lp.bis", theClientDto.getMandant(), theClientDto.getLocUi()));
                sFilter.append(" " + sBis + " ");
            }
            if (krit.kostenstelleIId != null) {
                if (sFilter.length() > 0) {
                    sFilter.append(", ");
                }
                KostenstelleDto kstDto = getSystemFac().kostenstelleFindByPrimaryKey(krit.kostenstelleIId);
                sFilter.append(
                        getTextRespectUISpr("lp.kostenstelle", theClientDto.getMandant(), theClientDto.getLocUi()));
                sFilter.append(" ");
                sFilter.append(kstDto.getCNr());
            }
            // Statistikadresse
            if (krit.getBVerwendeStatistikAdresse()) {
                if (sFilter.length() > 0) {
                    sFilter.append(", ");
                }
                sFilter.append(getTextRespectUISpr("rech.nachstatistikadresse", theClientDto.getMandant(),
                        theClientDto.getLocUi()));
            }

            mapParameter.put(LPReport.P_SORTIERUNG, sSortierung.toString());
            mapParameter.put(LPReport.P_SORTIERENACHKOSTENSTELLE, new Boolean(krit.bSortiereNachKostenstelle));
            mapParameter.put(LPReport.P_SORTIERENACHKUNDE,
                    new Boolean(krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_PARTNER));
            mapParameter.put(LPReport.P_SORTIERENACHVERTRETER,
                    new Boolean(krit.iSortierung == ReportJournalKriterienDto.KRIT_SORT_NACH_VERTRETER));
            mapParameter.put(LPReport.P_FILTER, sFilter.toString());
            initJRDS(mapParameter, RechnungReportFac.REPORT_MODUL, sReportname, theClientDto.getMandant(),
                    theClientDto.getLocUi(), theClientDto);
            return getReportPrint();
            // }
            // catch (FinderException ex) {
            // { // @ToDo FinderException
            // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_DRUCKEN,
            // null);
            // }
            // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_DRUCKEN, ex);
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
            return null;
        } finally {
            if (session != null) {
                session.close();
            }
        }
    }

    private int getZeilenAnzahlDesRechnungsDrucksUndCacheDaten(RechnungPositionDto[] rePos,
            HashMap<Integer, LieferscheinDto> hmLSDto, HashMap<Integer, LieferscheinpositionDto[]> hmLSPosDtos,
            HashMap<Integer, Object[][]> hmLSData, HashMap<Integer, StuecklisteInfoDto> hmStklPos,
            HashMap<Integer, ArtikelDto> hmArtikel, boolean bLeerzeileNachMengenbehafteterPosition,
            TheClientDto theClientDto) throws EJBExceptionLP {
        // laufzeiten werden mitgeloggt
        long lStartzeit = System.currentTimeMillis();
        int rows = 0;
        try {
            // da aber auch saemtliche lieferscheinpositionen gedruckt werden,
            // muss ich mir das vorher anschaun
            for (int i = 0; i < rePos.length; i++) {
                if (rePos[i].getRechnungpositionartCNr().equals(RechnungFac.POSITIONSART_RECHNUNG_LIEFERSCHEIN)) {
                    Integer lieferscheinIId = rePos[i].getLieferscheinIId();
                    LieferscheinDto lieferscheinDto = getLieferscheinFac()
                            .lieferscheinFindByPrimaryKey(lieferscheinIId, theClientDto);
                    LieferscheinpositionDto[] lsPos = getLieferscheinpositionFac()
                            .getLieferscheinPositionenByLieferschein(lieferscheinDto.getIId(), theClientDto);
                    // Optional: Leerzeilen nach jeder mengenbehafteten Position
                    // auch fuer
                    // die angedruckten Lieferscheinpositionen
                    if (bLeerzeileNachMengenbehafteterPosition) {
                        for (int j = 0; j < lsPos.length; j++) {
                            if (lsPos[j].getNMenge() != null) {
                                rows++;
                            }
                        }
                    }
                    Object[][] lsData = getLieferscheinReportFac().getLieferscheinReportData(lieferscheinIId,
                            theClientDto);
                    hmLSDto.put(lieferscheinIId, lieferscheinDto);
                    hmLSPosDtos.put(lieferscheinIId, lsPos);
                    hmLSData.put(lieferscheinIId, lsData);
                    // Der Lieferschein hat ausserdem eine kopf- und eine
                    // fusszeile -> +2
                    rows = rows + lsData.length + 2;
                } else if (rePos[i].getRechnungpositionartCNr().equals(RechnungFac.POSITIONSART_RECHNUNG_IDENT)) {
                    // eine zeile fuer die position selbst
                    rows++;
                    // nur wenn der Artikel noch nicht gecacht wurde
                    if (hmArtikel.get(rePos[i].getArtikelIId()) == null) {
                        // die eventuell dem Artikel hinterlegte Stueckliste
                        // holen
                        StuecklisteDto stuecklisteDto = getStuecklisteFac()
                                .stuecklisteFindByMandantCNrArtikelIIdOhneExc(rePos[i].getArtikelIId(),
                                        theClientDto);
                        // hier kann ich auch gleich den Artikel cachen
                        ArtikelDto artikelDto = null;
                        if (stuecklisteDto != null) {
                            // Stuecklisteninfo holen, enthaelt anzahl der
                            // positionen und hierarchie
                            StuecklisteInfoDto stuecklisteInfoDto = getStuecklisteFac()
                                    .getStrukturdatenEinesArtikels(rePos[i].getArtikelIId(), true, null, // in die Rekursion mit einer
                                            // leeren Listen einsteigen
                                            0, // in die Rekursion mit Ebene 0
                                            // einsteigen
                                            -1, // alle Stuecklisten komplett
                                            // aufloesen
                                            false, // Menge pro Einheit der
                                            // uebergeorndeten Position
                                            new BigDecimal(1), // fuer 1 Einheit
                                            // der STKL
                                            true, // Fremdfertigung aufloesen
                                            theClientDto);
                            rows += stuecklisteInfoDto.getIiAnzahlPositionen().intValue();
                            hmStklPos.put(rePos[i].getArtikelIId(), stuecklisteInfoDto);
                            // jetzt noch den artikel holen
                            artikelDto = stuecklisteDto.getArtikelDto();
                            // der Artikel kommt nicht immer mit :-(
                            if (artikelDto == null) {
                                artikelDto = getArtikelFac().artikelFindByPrimaryKey(stuecklisteDto.getArtikelIId(),
                                        theClientDto);
                            }
                        } else {
                            artikelDto = getArtikelFac().artikelFindByPrimaryKey(rePos[i].getArtikelIId(),
                                    theClientDto);
                        }
                        // Artikel behalten
                        hmArtikel.put(rePos[i].getArtikelIId(), artikelDto);
                    } else {
                        // wenn der artikel schon gecacht wurde, muss ich auch
                        // schaun, ob der zu druckende Stkl-Positionen hat
                        if (hmStklPos.get(rePos[i].getArtikelIId()) != null) {
                            StuecklisteInfoDto stklInfoDto = hmStklPos.get(rePos[i].getArtikelIId());
                            rows += stklInfoDto.getIiAnzahlPositionen().intValue();
                        }
                    }
                    // fuer Serien/Chargenr. wird jeweils eine zeile reserviert.
                    int iAnzahlSerienChargeNummern = berechneAnzahlSerienChargeNummern(
                            hmArtikel.get(rePos[i].getArtikelIId()), rePos[i].getSeriennrChargennrMitMenge(),
                            theClientDto);
                    rows += iAnzahlSerienChargeNummern;
                    // Optional: Leerzeilen nach jeder mengenbehafteten Position
                    if (bLeerzeileNachMengenbehafteterPosition) {
                        rows++;
                    }
                } else if (rePos[i].getRechnungpositionartCNr()
                        .equals(RechnungFac.POSITIONSART_RECHNUNG_HANDEINGABE)) {
                    // jede handeingabe hat ihren eigenen Handartikel -> 1 Zeile
                    rows++;
                    ArtikelDto artikelDto = getArtikelFac().artikelFindByPrimaryKey(rePos[i].getArtikelIId(),
                            theClientDto);
                    hmArtikel.put(rePos[i].getArtikelIId(), artikelDto);
                    // Optional: Leerzeilen nach jeder mengenbehafteten Position
                    if (bLeerzeileNachMengenbehafteterPosition) {
                        rows++;
                    }
                } else if (rePos[i].getRechnungpositionartCNr()
                        .equals(RechnungFac.POSITIONSART_RECHNUNG_SEITENUMBRUCH)) {
                    // Der Seitenumbruch wird ueber ein Toggle-Flag gesteuert ->
                    // braucht keine zeile
                } else {
                    // jede andere position braucht nur eine zeile
                    rows++;
                }
            }
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
        }
        // laufzeiten werden mitgeloggt
        myLogger.logData("daten holen dauerte " + (System.currentTimeMillis() - lStartzeit) + " ms.",
                theClientDto.getIDUser());
        return rows;
    }

    private int addPositionToDataPosition(RechnungDto rechnungDto, RechnungPositionDto rePos,
            Map<?, MwstsatzReportDto> mwstMap, int index, boolean bDruckeRabatt, Boolean bSeitenumbruch,
            TheClientDto theClientDto) throws EJBExceptionLP {
        data[index][RECHNUNG_FELD_POSITION_NR] = iArtikelpositionsnummer;
        data[index][RECHNUNG_FELD_B_SEITENUMBRUCH] = bSeitenumbruch;
        // weiterzaehlen
        iArtikelpositionsnummer = new Integer(iArtikelpositionsnummer.intValue() + 1);
        try {
            // Positionsnummer
            data[index][RECHNUNG_FELD_POSITION] = getRechnungFac().getPositionNummer(rePos.getIId());
            data[index][RECHNUNG_FELD_MENGE] = new BigDecimal(1);
            data[index][RECHNUNG_FELD_EINHEIT] = SystemFac.EINHEIT_STUECK.trim();
            data[index][RECHNUNG_FELD_ZUSATZRABATT] = new Float(0);
            data[index][RECHNUNG_FELD_RABATT] = new Float(0);
            data[index][RECHNUNG_FELD_POSITIONSART] = LocaleFac.POSITIONSART_IDENT;
            String sIdent = null;
            // Druckdaten zusammenstellen
            if (rePos.getCBez() != null)
                sIdent = rePos.getCBez();
            else
                sIdent = "";
            data[index][RECHNUNG_FELD_IDENTNUMMER] = sIdent;
            data[index][RECHNUNG_FELD_IDENT] = sIdent;

            BigDecimal bdNettogesamtpreisplusversteckteraufschlagminusrabatte = getRechnungFac()
                    .getGesamtpreisPosition(rePos.getIId(), theClientDto);
            data[index][RECHNUNG_FELD_EINZELPREIS] = bdNettogesamtpreisplusversteckteraufschlagminusrabatte;
            data[index][RECHNUNG_FELD_GESAMTPREIS] = bdNettogesamtpreisplusversteckteraufschlagminusrabatte;
            RechnungPositionDto first = getRechnungFac().rechnungPositionFindPositionIIdISort(rePos.getIId(),
                    rePos.getISort() + 1);
            Integer mwstsatzIId = first.getMwstsatzIId();
            if (mwstsatzIId != null) {
                MwstsatzDto mwstREPos = getMandantFac().mwstsatzFindByPrimaryKey(mwstsatzIId, theClientDto);
                bdNettogesamtpreisplusversteckteraufschlagminusrabatte = Helper
                        .rundeKaufmaennisch(bdNettogesamtpreisplusversteckteraufschlagminusrabatte, 2);
                BigDecimal bdLSUst = bdNettogesamtpreisplusversteckteraufschlagminusrabatte
                        .multiply(new BigDecimal(mwstREPos.getFMwstsatz().doubleValue() / 100.0));
                data[index][RECHNUNG_FELD_MWSTSATZ] = mwstREPos.getFMwstsatz();
                data[index][RECHNUNG_FELD_MWSTBETRAG] = bdLSUst;
                MwstsatzReportDto m = mwstMap.get(mwstsatzIId);
                m.setNSummeMwstbetrag(m.getNSummeMwstbetrag().add(bdLSUst));
                m.setNSummePositionsbetrag(
                        m.getNSummePositionsbetrag().add(bdNettogesamtpreisplusversteckteraufschlagminusrabatte));
            }
            Session session = null;
            try {
                if (rePos.getTypCNr().equals(LocaleFac.POSITIONTYP_MITPREISE)) {
                    List<?> l = null;
                    String sArtikelInfo = new String();
                    SessionFactory factory = FLRSessionFactory.getFactory();
                    session = factory.openSession();
                    Criteria crit = session.createCriteria(FLRRechnungPosition.class);
                    crit.add(Restrictions.eq("position_i_id", rePos.getIId()));
                    crit.addOrder(Order.asc(RechnungFac.FLR_RECHNUNGPOSITION_I_SORT));
                    l = crit.list();
                    Iterator<?> iter = l.iterator();
                    while (iter.hasNext()) {
                        index++;
                        FLRRechnungPosition pos = (FLRRechnungPosition) iter.next();
                        if (pos.getPositionsart_c_nr().equals(LocaleFac.POSITIONSART_IDENT))
                            sArtikelInfo = pos.getFlrartikel().getC_nr();
                        else if (pos.getPositionsart_c_nr().equals(LocaleFac.POSITIONSART_TEXTEINGABE))
                            sArtikelInfo = pos.getX_textinhalt();
                        else if (pos.getPositionsart_c_nr().equals(LocaleFac.POSITIONSART_HANDEINGABE))
                            sArtikelInfo = pos.getC_bez();
                        // Druckdaten zusammenstellen
                        data[index][RECHNUNG_FELD_IDENTNUMMER] = sArtikelInfo;
                        data[index][RECHNUNG_FELD_IDENT] = sArtikelInfo;
                        // weitere Daten
                        data[index][RECHNUNG_FELD_MENGE] = pos.getN_menge();
                        data[index][RECHNUNG_FELD_EINHEIT] = pos.getEinheit_c_nr();
                        data[index][RECHNUNG_FELD_ZUSATZRABATT] = new Float(0);
                        data[index][RECHNUNG_FELD_RABATT] = new Float(0);
                        data[index][RECHNUNG_FELD_POSITIONSART] = LocaleFac.POSITIONSART_IDENT;
                        data[index][RECHNUNG_FELD_EINZELPREIS] = pos.getN_einzelpreis();
                        data[index][RECHNUNG_FELD_GESAMTPREIS] = pos.getN_menge().multiply(pos.getN_einzelpreis());
                        data[index][RECHNUNG_FELD_TYP_CNR] = pos.getTyp_c_nr();
                        data[index][RECHNUNG_FELD_B_SEITENUMBRUCH] = bSeitenumbruch;
                    }
                } else {
                    List<?> l = null;
                    StringBuffer sbArtikelInfo = new StringBuffer();
                    SessionFactory factory = FLRSessionFactory.getFactory();
                    session = factory.openSession();
                    Criteria crit = session.createCriteria(FLRRechnungPosition.class);
                    crit.add(Restrictions.eq("position_i_id", rePos.getIId()));
                    crit.addOrder(Order.asc(RechnungFac.FLR_RECHNUNGPOSITION_I_SORT));
                    l = crit.list();
                    Iterator<?> iter = l.iterator();
                    while (iter.hasNext()) {
                        FLRRechnungPosition pos = (FLRRechnungPosition) iter.next();
                        if (pos.getPositionsart_c_nr().equals(LocaleFac.POSITIONSART_IDENT)) {
                            sbArtikelInfo.append(pos.getFlrartikel().getC_nr());
                            sbArtikelInfo.append("  ");
                            if (pos.getFlrartikel().getFlrartikelgruppe() != null)
                                sbArtikelInfo.append(pos.getFlrartikel().getFlrartikelgruppe().getC_nr());
                            if (iter.hasNext()) {
                                sbArtikelInfo.append("\n");
                            }
                        } else if (pos.getPositionsart_c_nr().equals(LocaleFac.POSITIONSART_TEXTEINGABE)) {
                            sbArtikelInfo.append(pos.getX_textinhalt());
                            if (iter.hasNext()) {
                                sbArtikelInfo.append("\n");
                            }
                        }
                        if (pos.getPositionsart_c_nr().equals(LocaleFac.POSITIONSART_HANDEINGABE)) {
                            if (pos.getC_bez() != null) {
                                sbArtikelInfo.append(pos.getC_bez());
                                if (iter.hasNext()) {
                                    sbArtikelInfo.append("\n");
                                }
                            }
                        }
                    }
                    // Druckdaten zusammenstellen
                    data[index][RECHNUNG_FELD_IDENTNUMMER] = sbArtikelInfo.toString();
                    data[index][RECHNUNG_FELD_IDENT] = sbArtikelInfo.toString();

                }

            } finally {
                if (session != null) {
                    session.close();
                }
            }
        } catch (RemoteException ex) {
        } catch (EJBExceptionLP ex) {
        }

        return index;
    }

    private int addPositionToDataIdentHandeingabe(RechnungDto rechnungDto, RechnungPositionDto rePos,
            boolean bDruckeRabatt, Map<?, MwstsatzReportDto> mwstMap, HashMap<?, ArtikelDto> hmArtikel,
            HashMap<?, StuecklisteInfoDto> hmStklPos, Boolean bSeitenumbruch, int index, Locale locale,
            boolean bLeerzeileNachMengenbehafteterPosition,
            boolean bChargennummerBeinhaltetMindesthaltbarkeitsdatumI, TheClientDto theClientDto)
            throws EJBExceptionLP {
        try {
            // Flag Seitenumbruch
            data[index][RECHNUNG_FELD_B_SEITENUMBRUCH] = bSeitenumbruch;
            // Positionsnummer
            data[index][RECHNUNG_FELD_POSITION] = getRechnungFac().getPositionNummer(rePos.getIId());
            data[index][RECHNUNG_FELD_POSITION_NR] = iArtikelpositionsnummer;
            // weiterzaehlen
            iArtikelpositionsnummer = new Integer(iArtikelpositionsnummer.intValue() + 1);
            ArtikelDto oArtikelDto = hmArtikel.get(rePos.getArtikelIId());
            // Druckdaten zusammenstellen
            KundeDto kundeDto = getKundeFac().kundeFindByPrimaryKey(rechnungDto.getKundeIId(), theClientDto);

            data[index][RECHNUNG_FELD_LVPOSITION] = rePos.getCLvposition();

            BelegPositionDruckIdentDto druckDto = printIdent(rePos, LocaleFac.BELEGART_RECHNUNG, oArtikelDto,
                    locale, kundeDto.getPartnerIId(), theClientDto);
            data[index][RECHNUNG_FELD_IDENTNUMMER] = druckDto.getSIdentnummer();
            data[index][RECHNUNG_FELD_WARENVERKEHRSNUMMER] = druckDto.getSWarenverkehrsnummer();
            data[index][RECHNUNG_FELD_POSITIONSOBJEKT] = getSystemReportFac()
                    .getPositionForReport(LocaleFac.BELEGART_RECHNUNG, rePos.getIId(), theClientDto);
            data[index][RechnungReportFacBean.RECHNUNG_FELD_IMAGE] = druckDto.getOImageKommentar();

            data[index][RechnungReportFacBean.RECHNUNG_FELD_WE_REFERENZ] = getLagerFac()
                    .getWareneingangsreferenzSubreport(LocaleFac.BELEGART_RECHNUNG, rePos.getIId(),
                            rePos.getSeriennrChargennrMitMenge(), false, theClientDto);

            if (oArtikelDto.getMaterialIId() != null) {
                MaterialDto materialDto = getMaterialFac().materialFindByPrimaryKey(oArtikelDto.getMaterialIId(),
                        theClientDto);
                if (materialDto.getMaterialsprDto() != null) {
                    /**
                     * @todo MR->MR richtige Mehrsprachigkeit: Material in
                     *       Drucksprache.
                     */
                    data[index][RECHNUNG_FELD_ARTIKEL_MATERIAL] = materialDto.getMaterialsprDto().getCBez();
                } else {
                    data[index][RECHNUNG_FELD_ARTIKEL_MATERIAL] = materialDto.getCNr();
                }

                MaterialzuschlagDto mzDto = getMaterialFac().getKursMaterialzuschlagDtoInZielwaehrung(
                        oArtikelDto.getMaterialIId(), rechnungDto.getTBelegdatum(), rechnungDto.getWaehrungCNr(),
                        theClientDto);

                data[index][RECHNUNG_FELD_ARTIKEL_KURS_MATERIALZUSCHLAG] = mzDto.getNZuschlag();
                data[index][RECHNUNG_FELD_ARTIKEL_DATUM_MATERIALZUSCHLAG] = mzDto.getTGueltigab();

            }

            data[index][RECHNUNG_FELD_ARTIKEL_MATERIALGEWICHT] = oArtikelDto.getFMaterialgewicht();

            // KundeArtikelnr gueltig zu Belegdatum
            KundesokoDto kundeSokoDto_gueltig = this.getKundesokoFac()
                    .kundesokoFindByKundeIIdArtikelIIdGueltigkeitsdatumOhneExc(rechnungDto.getKundeIId(),
                            oArtikelDto.getIId(), new java.sql.Date(rechnungDto.getTBelegdatum().getTime()));
            if (kundeSokoDto_gueltig != null) {
                data[index][RechnungReportFacBean.RECHNUNG_FELD_KUNDEARTIKELNR] = kundeSokoDto_gueltig
                        .getCKundeartikelnummer();
            }

            data[index][RECHNUNG_FELD_BEZEICHNUNG] = druckDto.getSBezeichnung();
            data[index][RECHNUNG_FELD_KURZBEZEICHNUNG] = druckDto.getSKurzbezeichnung();
            data[index][RECHNUNG_FELD_IDENT] = druckDto.getSArtikelInfo();
            data[index][RECHNUNG_FELD_IDENT_TEXTEINGABE] = druckDto.getSIdentTexteingabe();
            data[index][RECHNUNG_FELD_ZUSATZBEZEICHNUNG] = druckDto.getSZusatzBezeichnung();
            data[index][RECHNUNG_FELD_ARTIKELKOMMENTAR] = druckDto.getSArtikelkommentar();
            // weitere Daten
            data[index][RECHNUNG_FELD_MENGE] = Helper.rundeKaufmaennisch(rePos.getNMenge(),
                    getMandantFac().getNachkommastellenMenge(theClientDto.getMandant()));
            data[index][RECHNUNG_FELD_EINHEIT] = getSystemFac().formatEinheit(rePos.getEinheitCNr(), locale,
                    theClientDto);
            data[index][RECHNUNG_FELD_ARTIKEL_VERPACKUNGSMENGE] = oArtikelDto.getFVerpackungsmenge();
            data[index][RECHNUNG_FELD_ARTIKEL_WERBEABGABEPFLICHTIG] = Helper
                    .short2Boolean(oArtikelDto.getBWerbeabgabepflichtig());
            data[index][RECHNUNG_FELD_POSITIONSART] = rePos.getRechnungpositionartCNr();
            data[index][RECHNUNG_FELD_ARTIKEL_VERKAUFSEANNR] = druckDto.getSVerkaufseannr();
            data[index][RECHNUNG_FELD_ARTIKEL_VERPACKUNGSEANNR] = druckDto.getSVerpackungseannr();
            data[index][RECHNUNG_FELD_REFERENZNUMMER] = druckDto.getSReferenznr();

            data[index][RECHNUNG_FELD_INSERAT_DTO] = getInseratFac()
                    .istIseratAufRechnungspositionVorhanden(rePos.getIId());

            // PJ 15348
            if (rePos.getMwstsatzIId() != null) {

                MwstsatzDto mwstSatzDto = getMandantFac().mwstsatzFindByPrimaryKey(rePos.getMwstsatzIId(),
                        theClientDto);
                data[index][RECHNUNG_FELD_FIBU_MWST_CODE] = mwstSatzDto.getIFibumwstcode();

            }

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

                data[index][RECHNUNG_FELD_SETARTIKEL_TYP] = ArtikelFac.SETARTIKEL_TYP_POSITION;

            } else {

                Session session = null;
                SessionFactory factory = FLRSessionFactory.getFactory();
                session = factory.openSession();
                Criteria crit = session.createCriteria(FLRRechnungPosition.class);
                crit.add(Restrictions.eq("position_i_id_artikelset", rePos.getIId()));

                int iZeilen = crit.list().size();

                if (iZeilen > 0) {
                    data[index][RECHNUNG_FELD_SETARTIKEL_TYP] = ArtikelFac.SETARTIKEL_TYP_KOPF;
                }

            }

            if (oArtikelDto.getArtikelsprDto() != null) {
                if (oArtikelDto.getArtikelsprDto().getCZbez2() != null) {
                    data[index][RECHNUNG_FELD_ARTIKELCZBEZ2] = oArtikelDto.getArtikelsprDto().getCZbez2();
                }
            }

            int iNachkommastellenPreis = getUINachkommastellenPreisVK(rechnungDto.getMandantCNr());
            RechnungPositionDto rechnungPositionDto = (RechnungPositionDto) getBelegVerkaufFac()
                    .getBelegpositionVerkaufReport(rePos, rechnungDto, iNachkommastellenPreis);
            // Bei Setartikelpositionen Preise auslassen
            if (rechnungPositionDto.getPositioniIdArtikelset() == null) {

                if (bDruckeRabatt) {
                    data[index][RECHNUNG_FELD_EINZELPREIS] = rechnungPositionDto
                            .getNReportEinzelpreisplusversteckteraufschlag();
                    data[index][RECHNUNG_FELD_RABATT] = new Float(rechnungPositionDto.getDReportRabattsatz());
                    data[index][RECHNUNG_FELD_ZUSATZRABATT] = new Float(
                            rechnungPositionDto.getDReportZusatzrabattsatz());
                } else {
                    data[index][RECHNUNG_FELD_EINZELPREIS] = rechnungPositionDto
                            .getNReportNettoeinzelpreisplusversteckteraufschlag();
                    data[index][RECHNUNG_FELD_RABATT] = new Float(0);
                    data[index][RECHNUNG_FELD_ZUSATZRABATT] = new Float(0);
                }

                data[index][RECHNUNG_FELD_GESAMTPREIS] = rechnungPositionDto.getNReportGesamtpreis();
                data[index][RECHNUNG_FELD_MATERIALZUSCHLAG] = rechnungPositionDto.getNMaterialzuschlag();
                data[index][RECHNUNG_FELD_MWSTSATZ] = rechnungPositionDto.getDReportMwstsatz();
                data[index][RECHNUNG_FELD_MWSTBETRAG] = Helper
                        .rundeGeldbetrag(rechnungPositionDto.getNReportMwstsatzbetrag());
                MwstsatzReportDto m = mwstMap.get(rechnungPositionDto.getMwstsatzIId());
                m.setNSummeMwstbetrag(m.getNSummeMwstbetrag().add(rechnungPositionDto.getNReportMwstsatzbetrag()));
                m.setNSummePositionsbetrag(
                        m.getNSummePositionsbetrag().add(rechnungPositionDto.getNReportGesamtpreis()));
            }

            /*
             * // ohne Rabatt wird der einzelpreis vor rabattabzug gedruckt if
             * (bDruckeRabatt) { data[index][RECHNUNG_FELD_EINZELPREIS] = rePos.
             * getNEinzelpreisplusversteckteraufschlag(); } // mit Rabatt sofort
             * der Nettopreis else { data[index][RECHNUNG_FELD_EINZELPREIS] =
             * rePos. getNNettoeinzelpreisplusversteckteraufschlag(); } // der
             * Rabattsatz wird immer uebergeben
             * data[index][RECHNUNG_FELD_RABATT] = new
             * Float(rePos.getFRabattsatz()); if (rePos.getFZusatzrabattsatz()
             * != null) { data[index][RECHNUNG_FELD_ZUSATZRABATT] = new
             * Float(rePos.getFZusatzrabattsatz()); } else {
             * data[index][RECHNUNG_FELD_ZUSATZRABATT] = new Float(0); } //
             * Gesamtpreis: Nettopreis X Menge BigDecimal bdGesamtpreis = null;
             * if (rePos.getNNettoeinzelpreisplusversteckteraufschlag() != null)
             * { if (rePos.getNMenge() != null) { bdGesamtpreis =
             * rePos.getNNettoeinzelpreisplusversteckteraufschlag().multiply(
             * rePos. getNMenge()); } } data[index][RECHNUNG_FELD_GESAMTPREIS] =
             * bdGesamtpreis;
             * 
             * if (rePos.getMwstsatzIId() != null &&
             * !Helper.short2boolean(rechnungDto.getBReversecharge())) { //
             * Umsatzsteuerbetrag berechnen MwstsatzDto mwst =
             * getMandantFac().mwstsatzFindByPrimaryKey(rePos.getMwstsatzIId(),
             * theClientDto); data[index][RECHNUNG_FELD_MWSTSATZ] =
             * mwst.getFMwstsatz(); // vom Gesamtpreis muss noch der allgemeine
             * Rabatt abgezogen werden double dAllgRabatt; if
             * (rechnungDto.getFAllgemeinerRabattsatz() != null) { dAllgRabatt =
             * rechnungDto.getFAllgemeinerRabattsatz().doubleValue(); } else {
             * dAllgRabatt = 0.0; } BigDecimal bdGesamtpreisMinusAufschlag =
             * bdGesamtpreis.multiply(new BigDecimal( 1.0 - (dAllgRabatt /
             * 100.0))); BigDecimal ust =
             * Helper.getProzentWert(bdGesamtpreisMinusAufschlag, new
             * Float(mwst.getFMwstsatz().floatValue()), 2);
             * data[index][RECHNUNG_FELD_MWSTBETRAG] = ust; MwstsatzReportDto m
             * = ( (MwstsatzReportDto) mwstMap.get(rePos.getMwstsatzIId()));
             * m.setNSummeMwstbetrag(m.getNSummeMwstbetrag().add(ust));
             * m.setNSummePositionsbetrag(m.getNSummePositionsbetrag().add(
             * bdGesamtpreisMinusAufschlag)); }
             */
            // eventuell zu druckende stuecklistenpositionen drucken
            if (rePos.getRechnungpositionartCNr().equals(RechnungFac.POSITIONSART_RECHNUNG_IDENT)) {
                StuecklisteInfoDto stklPos = hmStklPos.get(rePos.getArtikelIId());
                if (stklPos != null) {
                    ArrayList<?> aListe = stklPos.getAlStuecklisteAufgeloest();
                    for (Iterator<?> iter = aListe.iterator(); iter.hasNext();) {
                        index++;
                        StuecklisteMitStrukturDto stuecklisteMitStrukturDto = (StuecklisteMitStrukturDto) iter
                                .next();
                        data[index][RECHNUNG_FELD_POSITIONSART] = LocaleFac.POSITIONSART_STUECKLISTENPOSITION;
                        data[index][RECHNUNG_FELD_B_SEITENUMBRUCH] = bSeitenumbruch;

                        StuecklistepositionDto stuecklistepositionDto = stuecklisteMitStrukturDto
                                .getStuecklistepositionDto();

                        data[index][RECHNUNG_FELD_STKLMENGE] = stuecklistepositionDto.getNMenge();
                        data[index][RECHNUNG_FELD_STKLEINHEIT] = getSystemFac()
                                .formatEinheit(stuecklistepositionDto.getEinheitCNr(), locale, theClientDto);

                        // Einrueckung fuer Unterstuecklisten
                        String einrueckung = "";
                        for (int j = 0; j < stuecklisteMitStrukturDto.getIEbene(); j++) {
                            einrueckung = einrueckung + "    ";
                        }
                        data[index][RECHNUNG_FELD_STKLARTIKELCNR] = einrueckung
                                + stuecklistepositionDto.getArtikelDto().getCNr();
                        data[index][RECHNUNG_FELD_STKLARTIKELBEZ] = getArtikelFac()
                                .baueArtikelBezeichnungMehrzeilig(stuecklistepositionDto.getArtikelIId(),
                                        LocaleFac.POSITIONSART_IDENT, null, null, false, locale, theClientDto);

                        if (stuecklistepositionDto.getArtikelIId() != null) {

                            ArtikelDto artikelDtoStkl = getArtikelFac().artikelFindByPrimaryKeySmall(
                                    stuecklistepositionDto.getArtikelIId(), theClientDto);

                            data[index][RECHNUNG_FELD_STKLARTIKELKBEZ] = artikelDtoStkl.getKbezAusSpr();
                        }

                        // KundeArtikelnr gueltig zu Belegdatum
                        KundesokoDto kundeSokoDto_gueltigStkl = this.getKundesokoFac()
                                .kundesokoFindByKundeIIdArtikelIIdGueltigkeitsdatumOhneExc(
                                        rechnungDto.getKundeIId(), stuecklistepositionDto.getArtikelIId(),
                                        new java.sql.Date(rechnungDto.getTBelegdatum().getTime()));
                        if (kundeSokoDto_gueltigStkl != null) {
                            data[index][RECHNUNG_FELD_STKLARTIKEL_KDARTIKELNR] = kundeSokoDto_gueltigStkl
                                    .getCKundeartikelnummer();
                        }

                        // PJ18038
                        VkpreisfindungDto vkpreisfindungDto = getVkPreisfindungFac().verkaufspreisfindung(
                                stuecklistepositionDto.getArtikelIId(), rechnungDto.getKundeIId(),
                                stuecklistepositionDto.getNMenge(),
                                new Date(rechnungDto.getTBelegdatum().getTime()),
                                kundeDto.getVkpfArtikelpreislisteIIdStdpreisliste(),
                                rechnungPositionDto.getMwstsatzIId(), theClientDto.getSMandantenwaehrung(),
                                theClientDto);

                        VerkaufspreisDto kundenVKPreisDto = Helper.getVkpreisBerechnet(vkpreisfindungDto);
                        if (kundenVKPreisDto != null) {
                            data[index][RECHNUNG_FELD_STKLARTIKEL_KDPREIS] = kundenVKPreisDto.nettopreis;
                        }

                    }
                }
                /**
                 * SerienChargenummer fuer Artikel als eigene Pos drucken
                 */
                if (Helper.short2Boolean(oArtikelDto.getBSeriennrtragend())) {
                    index++;
                    data[index][RECHNUNG_FELD_SERIENCHARGENR] = SeriennrChargennrMitMengeDto
                            .erstelleStringAusMehrerenSeriennummern(rePos.getSeriennrChargennrMitMenge());
                    data[index][RECHNUNG_FELD_POSITIONSART] = RechnungFac.POSITIONSART_RECHNUNG_SERIENNR;
                    data[index][RECHNUNG_FELD_B_SEITENUMBRUCH] = bSeitenumbruch;
                } else if (Helper.short2Boolean(oArtikelDto.getBChargennrtragend())) {
                    // Chargennummer splitten in eigene Positionen
                    String[] aChargeNummer = SeriennrChargennrMitMengeDto
                            .erstelleStringArrayAusMehrerenSeriennummern(rePos.getSeriennrChargennrMitMenge());
                    for (int k = 0; k < aChargeNummer.length; k++) {
                        String sChargeNummer = aChargeNummer[k];
                        index++;
                        if (bChargennummerBeinhaltetMindesthaltbarkeitsdatumI) {
                            // MHD als eigenes Feld falls vorhanden
                            String[] aChargenrMHD = Helper.zerlegeChargennummerMHD(sChargeNummer);
                            if (aChargenrMHD != null) {
                                data[index][RECHNUNG_FELD_SERIENCHARGENR] = aChargenrMHD[0];
                                if (aChargenrMHD.length > 1) {
                                    data[index][RECHNUNG_FELD_MINDESTHALTBARKEIT] = aChargenrMHD[1];
                                }
                            }
                        } else {
                            data[index][RECHNUNG_FELD_SERIENCHARGENR] = sChargeNummer;
                        }

                        data[index][RECHNUNG_FELD_POSITIONSART] = RechnungFac.POSITIONSART_RECHNUNG_CHARGENR;
                        data[index][RECHNUNG_FELD_B_SEITENUMBRUCH] = bSeitenumbruch;
                        // Menge dieser Charge holen,nur wenn mehrere
                        // Chargennummer vorhanden sind
                        if (aChargeNummer.length > 1) {
                            // alle Chargennummern der Position
                            List<SeriennrChargennrMitMengeDto> aChargenMitMengeDto = getLagerFac()
                                    .getAllSeriennrchargennrEinerBelegartposition(LocaleFac.BELEGART_RECHNUNG,
                                            rePos.getIId());

                            if (aChargenMitMengeDto != null) {
                                for (int u = 0; u < aChargenMitMengeDto.size(); u++) {
                                    SeriennrChargennrMitMengeDto chargenMitMengeDto = aChargenMitMengeDto.get(u);
                                    // Menge der aktuellen Chargenr holen
                                    if (sChargeNummer.equals(chargenMitMengeDto.getCSeriennrChargennr())) {
                                        data[index][RECHNUNG_FELD_SERIENCHARGENR_MENGE] = chargenMitMengeDto
                                                .getNMenge();
                                    }
                                }
                            }

                        }
                    }

                }

                if (oArtikelDto.getVerpackungDto() != null) {
                    data[index][RECHNUNG_FELD_BAUFORM] = oArtikelDto.getVerpackungDto().getCBauform();
                    data[index][RECHNUNG_FELD_VERPACKUNGSART] = oArtikelDto.getVerpackungDto().getCVerpackungsart();
                }

                // PJ 15926
                if (rePos.getVerleihIId() != null) {
                    VerleihDto verleihDto = getArtikelFac().verleihFindByPrimaryKey(rePos.getVerleihIId());
                    data[index][RECHNUNG_FELD_VERLEIHFAKTOR] = verleihDto.getFFaktor();
                    data[index][RECHNUNG_FELD_VERLEIHTAGE] = verleihDto.getITage();
                }

                data[index][RECHNUNG_FELD_ARTIKEL_INDEX] = oArtikelDto.getCIndex();

                data[index][RECHNUNG_FELD_ARTIKEL_REVISION] = oArtikelDto.getCRevision();
                data[index][RECHNUNG_FELD_GEWICHT] = oArtikelDto.getFGewichtkg();

                if (oArtikelDto.getGeometrieDto() != null) {
                    data[index][RECHNUNG_FELD_ARTIKEL_BREITE] = oArtikelDto.getGeometrieDto().getFBreite();
                    data[index][RECHNUNG_FELD_ARTIKEL_HOEHE] = oArtikelDto.getGeometrieDto().getFHoehe();
                    data[index][RECHNUNG_FELD_ARTIKEL_TIEFE] = oArtikelDto.getGeometrieDto().getFTiefe();
                }

                // Ursprungsland
                if (oArtikelDto.getLandIIdUrsprungsland() != null) {
                    LandDto landDto = getSystemFac().landFindByPrimaryKey(oArtikelDto.getLandIIdUrsprungsland());
                    data[index][RECHNUNG_FELD_ARTIKEL_URSPRUNGSLAND] = landDto.getCName().toUpperCase();
                }
                // Artikelgruppe
                if ((Boolean) getParameterFac().getMandantparameter(theClientDto.getMandant(),
                        ParameterFac.KATEGORIE_RECHNUNG, ParameterFac.PARAMETER_RECHNUNG_ARTIKELGRUPPE_DRUCKEN)
                        .getCWertAsObject()) {
                    if (oArtikelDto.getArtgruIId() != null) {
                        ArtgruDto artgruDto = getArtikelFac().artgruFindByPrimaryKey(oArtikelDto.getArtgruIId(),
                                theClientDto);
                        // String sHelper = (String)
                        // data[index][RECHNUNG_FELD_IDENT];
                        // String sBegin = sHelper.substring(0,
                        // sHelper.indexOf("\n"));
                        // String sEnd =
                        // sHelper.substring(sHelper.indexOf("\n"));
                        data[index][RECHNUNG_FELD_ARTIKEL_ARTIKELGRUPPE] = data[index][RECHNUNG_FELD_ARTIKEL_ARTIKELGRUPPE] == null
                                ? artgruDto.getCNr() + "\n"
                                : data[index][RECHNUNG_FELD_ARTIKEL_ARTIKELGRUPPE] + artgruDto.getCNr() + "\n";
                        // data[index][RECHNUNG_FELD_IDENT] =sBegin + "  " + +
                        // sEnd;
                    }
                }
            }
            index++;
            // Optional: Leerzeile nach mengenbehafteter Position
            if (bLeerzeileNachMengenbehafteterPosition && rePos.getNMenge() != null) {
                data[index] = getLeerzeile(bSeitenumbruch);
                // damit trotz eingefuegter Leerzeile keine neue
                // Auftragsueberschrift kommt.
                data[index][RECHNUNG_FELD_AUFTRAG_NUMMER] = data[index - 1][RECHNUNG_FELD_AUFTRAG_NUMMER];
                index++;
            }
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
        }
        return index;
    }

    private int addPositionToDataLieferschein(RechnungDto rechnungDto, RechnungPositionDto rePos,
            boolean bDruckeRabatt, Map<?, MwstsatzReportDto> mwstMap, HashMap<?, LieferscheinDto> hmLSDto,
            HashMap<?, LieferscheinpositionDto[]> hmLSPosDto, HashMap<?, Object[][]> hmLSData, Locale locale,
            Boolean bSeitenumbruch, int index, boolean bLeerzeileNachMengenbehafteterPosition,
            boolean bChargennummerBeinhaltetMindesthaltbarkeitsdatumI, TheClientDto theClientDto)
            throws EJBExceptionLP {
        try {
            // Den Lieferschein und seine Positionen aus dem Cache holen
            LieferscheinDto lieferscheinDto = hmLSDto.get(rePos.getLieferscheinIId());
            LieferscheinpositionDto[] lsPos = hmLSPosDto.get(rePos.getLieferscheinIId());

            String ansprechpartner = null;
            String ansp_fremdsystem = null;
            if (lieferscheinDto.getAnsprechpartnerIId() != null) {
                AnsprechpartnerDto anspDto = getAnsprechpartnerFac()
                        .ansprechpartnerFindByPrimaryKey(lieferscheinDto.getAnsprechpartnerIId(), theClientDto);

                ansprechpartner = anspDto.getPartnerDto().formatAnrede();
                ansp_fremdsystem = anspDto.getCFremdsystemnr();

            }

            Object[][] lsData = hmLSData.get(lieferscheinDto.getIId());
            // am Druck gibt es eine "Ueberschrift"
            StringBuffer sbArtikelInfo = new StringBuffer();

            sbArtikelInfo.append(
                    getTextRespectUISpr("rechnung.unserlieferschein", theClientDto.getMandant(), locale) + " ");
            sbArtikelInfo.append(lieferscheinDto.getCNr());
            sbArtikelInfo.append(" " + getTextRespectUISpr("lp.vom", theClientDto.getMandant(), locale) + " ");
            sbArtikelInfo.append(Helper.formatDatum(lieferscheinDto.getTBelegdatum(), locale));
            data[index][RECHNUNG_FELD_POSITIONSART] = RechnungFac.POSITIONSART_RECHNUNG_LS_BEGINN;
            data[index][RECHNUNG_FELD_FREIERTEXT] = sbArtikelInfo.toString();
            data[index][RECHNUNG_FELD_B_SEITENUMBRUCH] = bSeitenumbruch;
            data[index][RECHNUNG_FELD_LS_ANSPRECHPARTNER] = ansprechpartner;
            data[index][RECHNUNG_FELD_LS_ANSPRECHPARTNER_FREMDSYSTEMNUMMER] = ansp_fremdsystem;
            data[index][RECHNUNG_FELD_LS_KOMMISIONSNUMMER] = lieferscheinDto.getCKommission();

            String rechnungMitDerVerrechnet = null;
            if (rechnungDto.getRechnungartCNr().equals(RechnungFac.RECHNUNGART_PROFORMARECHNUNG)) {

                javax.persistence.Query query = em.createNamedQuery("RechnungPositionfindByLieferscheinIId");
                query.setParameter(1, lieferscheinDto.getIId());
                Collection<?> cl = query.getResultList();
                if (cl.size() != 0) {

                    Iterator<?> iterator = cl.iterator();
                    while (iterator.hasNext()) {
                        Rechnungposition rechnungPosition = (Rechnungposition) iterator.next();

                        Rechnung rechnungMitDerBereitsVerrechnet = em.find(Rechnung.class,
                                rechnungPosition.getRechnungIId());

                        if (rechnungMitDerBereitsVerrechnet.getRechnungartCNr()
                                .equals(RechnungFac.RECHNUNGART_RECHNUNG)) {
                            rechnungMitDerVerrechnet = rechnungMitDerBereitsVerrechnet.getCNr();
                            data[index][RECHNUNG_FELD_LS_VERRECHNET_MIT] = rechnungMitDerVerrechnet;
                        }

                    }

                }
            }

            // Pj 15202
            data[index][RECHNUNG_FELD_LS_BESTELLNUMMER] = lieferscheinDto.getCBestellnummer();

            Boolean bRechnungsadresseGleichLieferadresse = Boolean.FALSE;
            if (lieferscheinDto.getKundeIIdRechnungsadresse().equals(lieferscheinDto.getKundeIIdLieferadresse())) {
                bRechnungsadresseGleichLieferadresse = Boolean.TRUE;
            }
            data[index][RECHNUNG_FELD_LS_RECHNUNGSADRESSEGLEICHLIEFERADRESSE] = bRechnungsadresseGleichLieferadresse;

            data[index][RECHNUNG_FELD_LS_PROJEKT] = lieferscheinDto.getCBezProjektbezeichnung();
            // Waehrungen pruefen
            String sRechnungswaehrung = rechnungDto.getWaehrungCNr();
            String sLieferscheinwaehrung = lieferscheinDto.getWaehrungCNr();
            boolean bUmrechnen = false;
            if (!sRechnungswaehrung.equals(sLieferscheinwaehrung)) {
                bUmrechnen = true;
            }
            int lsIndex = 0;
            index++;
            for (int i = 0; i < lsData.length; i++) {
                // die einfachen Felder koennen direkt uebernommen werden.
                data[index][RECHNUNG_FELD_LEERZEILE] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_LEERZEILE];
                data[index][RECHNUNG_FELD_EINHEIT] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_EINHEIT];
                data[index][RECHNUNG_FELD_POSITIONSOBJEKT] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_POSITIONSOBJEKT];
                data[index][RECHNUNG_FELD_FREIERTEXT] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_FREIERTEXT];
                data[index][RECHNUNG_FELD_IDENT] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_IDENT];
                data[index][RECHNUNG_FELD_IDENT_TEXTEINGABE] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_IDENT_TEXTEINGABE];
                data[index][RECHNUNG_FELD_ARTIKEL_ARTIKELGRUPPE] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKEL_ARTIKELGRUPPE];
                data[index][RECHNUNG_FELD_IDENTNUMMER] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_IDENTNUMMER];
                data[index][RECHNUNG_FELD_BEZEICHNUNG] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_BEZEICHNUNG];
                data[index][RECHNUNG_FELD_LVPOSITION] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_LV_POSITION];
                data[index][RECHNUNG_FELD_ZUSATZBEZEICHNUNG] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ZUSATZBEZEICHNUNG];
                data[index][RECHNUNG_FELD_KURZBEZEICHNUNG] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_KURZBEZEICHNUNG];
                data[index][RECHNUNG_FELD_IMAGE] = Helper
                        .byteArrayToImage((byte[]) lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_IMAGE]);
                data[index][RECHNUNG_FELD_ARTIKELKOMMENTAR] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKELKOMMENTAR];
                data[index][RECHNUNG_FELD_POSITIONSART] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_POSITIONSART];
                data[index][RECHNUNG_FELD_FIBU_MWST_CODE] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_FIBU_MWST_CODE];
                data[index][RECHNUNG_FELD_MENGE] = Helper.rundeKaufmaennisch(
                        (BigDecimal) (lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_MENGE]),
                        getMandantFac().getNachkommastellenMenge(theClientDto.getMandant()));
                data[index][RECHNUNG_FELD_STKLARTIKELBEZ] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_STKLARTIKELBEZ];
                data[index][RECHNUNG_FELD_STKLARTIKELKBEZ] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_STKLARTIKELKBEZ];
                data[index][RECHNUNG_FELD_STKLARTIKEL_KDARTIKELNR] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_STKLARTIKEL_KDARTIKELNR];
                data[index][RECHNUNG_FELD_STKLARTIKEL_KDPREIS] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_STKLARTIKEL_KDPREIS];
                data[index][RECHNUNG_FELD_STKLARTIKELCNR] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_STKLARTIKELCNR];
                data[index][RECHNUNG_FELD_STKLEINHEIT] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_STKLEINHEIT];
                data[index][RECHNUNG_FELD_STKLMENGE] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_STKLMENGE];
                // die Auftragsdaten der LS-Position
                data[index][RECHNUNG_FELD_AUFTRAG_BESTELLDATUM] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_AUFTRAG_BESTELLDATUM];
                data[index][RECHNUNG_FELD_AUFTRAG_BESTELLNUMMER] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_AUFTRAG_BESTELLNUMMER];
                data[index][RECHNUNG_FELD_AUFTRAG_NUMMER] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_AUFTRAG_NUMMER];
                data[index][RECHNUNG_FELD_AUFTRAG_PROJEKT] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_AUFTRAG_PROJEKT];
                // Seitenumbrueche im Lieferschein werden ignoriert
                data[index][RECHNUNG_FELD_B_SEITENUMBRUCH] = bSeitenumbruch;
                data[index][RECHNUNG_FELD_ARTIKEL_VERPACKUNGSMENGE] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKEL_VERPACKUNGSMENGE];
                data[index][RECHNUNG_FELD_ARTIKEL_WERBEABGABEPFLICHTIG] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKEL_WERBEABGABEPFLICHTIG];
                data[index][RECHNUNG_FELD_ARTIKEL_VERPACKUNGSEANNR] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKEL_VERPACKUNGSEANNR];
                data[index][RECHNUNG_FELD_ARTIKEL_VERKAUFSEANNR] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKEL_VERKAUFSEANNR];
                data[index][RECHNUNG_FELD_REFERENZNUMMER] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_REFERENZNUMMER];
                data[index][RECHNUNG_FELD_ARTIKELCZBEZ2] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKELCZBEZ2];
                data[index][RECHNUNG_FELD_WARENVERKEHRSNUMMER] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_WARENVERKEHRSNUMMER];
                data[index][RECHNUNG_FELD_ARTIKEL_MATERIAL] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKEL_MATERIAL];
                data[index][RECHNUNG_FELD_ARTIKEL_MATERIALGEWICHT] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKEL_MATERIALGEWICHT];
                data[index][RECHNUNG_FELD_ARTIKEL_KURS_MATERIALZUSCHLAG] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKEL_KURS_MATERIALZUSCHLAG];
                data[index][RECHNUNG_FELD_ARTIKEL_BREITE] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKEL_BREITE];
                data[index][RECHNUNG_FELD_ARTIKEL_HOEHE] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKEL_HOEHE];
                data[index][RECHNUNG_FELD_ARTIKEL_TIEFE] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKEL_TIEFE];
                data[index][RECHNUNG_FELD_BAUFORM] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_BAUFORM];
                data[index][RECHNUNG_FELD_TYP_CNR] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_TYP_CNR];
                data[index][RECHNUNG_FELD_VERPACKUNGSART] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_VERPACKUNGSART];
                data[index][RECHNUNG_FELD_ARTIKEL_URSPRUNGSLAND] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKEL_URSPRUNGSLAND];
                data[index][RECHNUNG_FELD_SETARTIKEL_TYP] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_SETARTIKEL_TYP];
                data[index][RECHNUNG_FELD_ARTIKEL_INDEX] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKEL_INDEX];
                data[index][RECHNUNG_FELD_ARTIKEL_REVISION] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKEL_REVISION];
                data[index][RECHNUNG_FELD_GEWICHT] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_ARTIKEL_GEWICHT];
                data[index][RECHNUNG_FELD_VERLEIHFAKTOR] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_VERLEIHFAKTOR];
                data[index][RECHNUNG_FELD_VERLEIHTAGE] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_VERLEIHTAGE];

                KundeDto kundeDto = getKundeFac().kundeFindByPrimaryKey(lieferscheinDto.getKundeIIdLieferadresse(),
                        theClientDto);
                data[index][RECHNUNG_FELD_LS_FILIALNR] = kundeDto.getPartnerDto().getCFilialnummer();
                data[index][RECHNUNG_FELD_LS_KOMMISIONSNUMMER] = lieferscheinDto.getCKommission();
                data[index][RECHNUNG_FELD_LS_VERRECHNET_MIT] = rechnungMitDerVerrechnet;

                // Pj 15202
                data[index][RECHNUNG_FELD_LS_BESTELLNUMMER] = lieferscheinDto.getCBestellnummer();

                data[index][RECHNUNG_FELD_LS_RECHNUNGSADRESSEGLEICHLIEFERADRESSE] = bRechnungsadresseGleichLieferadresse;

                data[index][RECHNUNG_FELD_LS_PROJEKT] = lieferscheinDto.getCBezProjektbezeichnung();
                KostenstelleDto kstDto = getSystemFac()
                        .kostenstelleFindByPrimaryKey(lieferscheinDto.getKostenstelleIId());
                data[index][RECHNUNG_FELD_LS_KOSTENSTELLE] = kstDto.getCNr();

                LagerDto lDto = getLagerFac().lagerFindByPrimaryKey(lieferscheinDto.getLagerIId());

                data[index][RECHNUNG_FELD_LS_ABBUCHUNGSLAGER] = lDto.getCNr();

                data[index][RECHNUNG_FELD_LS_ANSPRECHPARTNER] = ansprechpartner;
                data[index][RECHNUNG_FELD_LS_ANSPRECHPARTNER_FREMDSYSTEMNUMMER] = ansp_fremdsystem;
                /**
                 * Seriennr Position
                 */
                if (lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_POSITIONSART]
                        .equals(LieferscheinpositionFac.LIEFERSCHEINPOSITIONSART_SERIENNR)) {
                    // Seriennr
                    data[index][RECHNUNG_FELD_SERIENCHARGENR] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_SERIENCHARGENR];
                    data[index][RECHNUNG_FELD_POSITIONSART] = RechnungFac.POSITIONSART_RECHNUNG_SERIENNR;
                }

                // Chargennr Position
                if (lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_POSITIONSART]
                        .equals(LieferscheinpositionFac.LIEFERSCHEINPOSITIONSART_CHARGENR)) {
                    // Chargennr
                    data[index][RECHNUNG_FELD_SERIENCHARGENR] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_SERIENCHARGENR];
                    data[index][RECHNUNG_FELD_MINDESTHALTBARKEIT] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_MINDESTHALTBARKEIT];
                    data[index][RECHNUNG_FELD_POSITIONSART] = RechnungFac.POSITIONSART_RECHNUNG_CHARGENR;
                    // Menge nur bei Chargennummer
                    data[index][RECHNUNG_FELD_SERIENCHARGENR_MENGE] = lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_SERIENCHARGENR_MENGE];
                }
                // hier beginnt die preisberechnung,
                // stuecklistenpositionen,Auftragsdaten und
                // SerienChargepositionen sind davon ausgeschlossen
                if (!lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_POSITIONSART]
                        .equals(LocaleFac.POSITIONSART_STUECKLISTENPOSITION)
                        && !lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_POSITIONSART]
                                .equals(LocaleFac.POSITIONSART_AUFTRAGSDATEN)
                        && !lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_POSITIONSART]
                                .equals(LieferscheinpositionFac.LIEFERSCHEINPOSITIONSART_SERIENNR)
                        && !lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_POSITIONSART]
                                .equals(LieferscheinpositionFac.LIEFERSCHEINPOSITIONSART_CHARGENR)) {

                    data[index][RECHNUNG_FELD_INTERNAL_IID] = lsPos[lsIndex].getIId();

                    // auch beim Lieferschein gelten die Positionsnummern nur
                    // fuer Ident und Handeingabe
                    if (lsPos[lsIndex].getLieferscheinpositionartCNr()
                            .equals(LieferscheinpositionFac.LIEFERSCHEINPOSITIONSART_IDENT)
                            || lsPos[lsIndex].getLieferscheinpositionartCNr()
                                    .equals(LieferscheinpositionFac.LIEFERSCHEINPOSITIONSART_HANDEINGABE)
                            || lsPos[lsIndex].getLieferscheinpositionartCNr()
                                    .equals(LocaleFac.POSITIONSART_POSITION)) {
                        Integer nr = null;
                        if (lsPos[lsIndex].getAuftragpositionIId() != null) {
                            nr = getAuftragpositionFac().getPositionNummer(lsPos[lsIndex].getAuftragpositionIId());
                        } else {
                            if (lieferscheinDto.getAuftragIId() == null)
                                nr = getLieferscheinpositionFac().getPositionNummer(lsPos[lsIndex].getIId());
                        }
                        data[index][RECHNUNG_FELD_POSITION] = nr;
                        data[index][RECHNUNG_FELD_POSITION_NR] = iArtikelpositionsnummer;
                        iArtikelpositionsnummer = new Integer(iArtikelpositionsnummer.intValue() + 1);

                        data[index][RechnungReportFacBean.RECHNUNG_FELD_WE_REFERENZ] = getLagerFac()
                                .getWareneingangsreferenzSubreport(LocaleFac.BELEGART_LIEFERSCHEIN,
                                        lsPos[lsIndex].getIId(), lsPos[lsIndex].getSeriennrChargennrMitMenge(),
                                        false, theClientDto);

                    }

                    // nur preisbehaftete Positionen
                    if (lsPos[lsIndex].getNEinzelpreis() != null) {
                        // Einzelpreis berechnen
                        // PJ 09/0014325
                        /*
                         * BigDecimal bdEinzelpreis =getRechnungFac().
                         * berechneEinzelpreisLSPositionOhneLSRabatt(
                         * rechnungDto, lieferscheinDto, lsPos[lsIndex],
                         * !bDruckeRabatt, theClientDto);
                         * if(Helper.short2boolean
                         * (lsPos[lsIndex].getBNettopreisuebersteuert()))
                         * bdEinzelpreis =
                         * lsPos[lsIndex].getNNettoeinzelpreis(); BigDecimal
                         * bdNettopreis =
                         * getRechnungFac().berechneNettopreisLSPositionOhneLSRabatt
                         * ( rechnungDto, lieferscheinDto, lsPos[lsIndex],
                         * theClientDto);
                         * if(Helper.short2boolean(lsPos[lsIndex].
                         * getBNettopreisuebersteuert())) bdNettopreis =
                         * lsPos[lsIndex].getNNettoeinzelpreis(); BigDecimal
                         * bdGesamtpreis =
                         * bdNettopreis.multiply(lsPos[lsIndex].getNMenge()); if
                         * (lsPos[lsIndex].getMwstsatzIId() != null &&
                         * !Helper.short2boolean
                         * (rechnungDto.getBReversecharge())) { // allgemeinen
                         * rabatt abziehen double dAllgRabatt; if
                         * (rechnungDto.getFAllgemeinerRabattsatz() != null) {
                         * dAllgRabatt =
                         * rechnungDto.getFAllgemeinerRabattsatz().
                         * doubleValue(); } else { dAllgRabatt = 0.0; }
                         * BigDecimal bdAllgRabatt =
                         * Helper.getProzentWert(bdGesamtpreis, new
                         * Float(dAllgRabatt), 2); BigDecimal
                         * bdGesamtNettoEndpreis =
                         * bdGesamtpreis;//.subtract(bdAllgRabatt);
                         * 
                         * MwstsatzDto mwstLSPos =
                         * getMandantFac().mwstsatzFindByPrimaryKey
                         * (lsPos[lsIndex].getMwstsatzIId(), theClientDto);
                         * BigDecimal bdLSUst =
                         * bdGesamtNettoEndpreis.multiply(new BigDecimal(
                         * mwstLSPos.getFMwstsatz().doubleValue() / 100.0));
                         * data[index][RECHNUNG_FELD_MWSTSATZ] =
                         * mwstLSPos.getFMwstsatz();
                         * data[index][RECHNUNG_FELD_MWSTBETRAG] = bdLSUst;
                         * MwstsatzReportDto m = ( (MwstsatzReportDto)
                         * mwstMap.get(lsPos[lsIndex]. getMwstsatzIId()));
                         * m.setNSummeMwstbetrag
                         * (m.getNSummeMwstbetrag().add(bdLSUst));
                         * m.setNSummePositionsbetrag
                         * (m.getNSummePositionsbetrag().add(
                         * bdGesamtNettoEndpreis)); }
                         */
                        int iNachkommastellenPreis = getUINachkommastellenPreisVK(rechnungDto.getMandantCNr());
                        LieferscheinpositionDto lieferscheinpositionDto = (LieferscheinpositionDto) getBelegVerkaufFac()
                                .getBelegpositionVerkaufReport(lsPos[lsIndex], lieferscheinDto,
                                        iNachkommastellenPreis);

                        // Bei Setartikelpositionen Preise auslassen
                        if (lieferscheinpositionDto.getPositioniIdArtikelset() == null) {

                            if (bDruckeRabatt) {
                                data[index][RECHNUNG_FELD_EINZELPREIS] = lieferscheinpositionDto
                                        .getNReportEinzelpreisplusversteckteraufschlag();
                                data[index][RECHNUNG_FELD_RABATT] = new Float(
                                        lieferscheinpositionDto.getDReportRabattsatz());
                                data[index][RECHNUNG_FELD_ZUSATZRABATT] = new Float(
                                        lieferscheinpositionDto.getDReportZusatzrabattsatz());
                            } else {
                                data[index][RECHNUNG_FELD_EINZELPREIS] = lieferscheinpositionDto
                                        .getNReportNettoeinzelpreisplusversteckteraufschlag();
                                data[index][RECHNUNG_FELD_RABATT] = new Float(0);
                                data[index][RECHNUNG_FELD_ZUSATZRABATT] = new Float(0);
                            }
                            data[index][RECHNUNG_FELD_GESAMTPREIS] = lieferscheinpositionDto
                                    .getNReportGesamtpreis();
                            data[index][RECHNUNG_FELD_MATERIALZUSCHLAG] = lieferscheinpositionDto
                                    .getNMaterialzuschlag();

                            data[index][RECHNUNG_FELD_MWSTSATZ] = lieferscheinpositionDto.getDReportMwstsatz();
                            data[index][RECHNUNG_FELD_MWSTBETRAG] = lieferscheinpositionDto.getNMwstbetrag();
                            MwstsatzReportDto m = mwstMap.get(lieferscheinpositionDto.getMwstsatzIId());
                            m.setNSummeMwstbetrag(m.getNSummeMwstbetrag()
                                    .add(lieferscheinpositionDto.getNReportMwstsatzbetrag()));
                            m.setNSummePositionsbetrag(m.getNSummePositionsbetrag()
                                    .add(lieferscheinpositionDto.getNReportGesamtpreis()));
                        }
                    } else {
                        if (lsPos[lsIndex].getPositionsartCNr().equals(LocaleFac.POSITIONSART_POSITION)) {
                            if (lsPos[lsIndex].getTypCNr().equals(LocaleFac.POSITIONTYP_MITPREISE)) {
                                BigDecimal bdGesamtNettoEndpreis = getLieferscheinpositionFac()
                                        .getGesamtpreisPosition(lsPos[lsIndex].getIId(), theClientDto);
                                data[index][RECHNUNG_FELD_EINZELPREIS] = bdGesamtNettoEndpreis;
                                data[index][RECHNUNG_FELD_GESAMTPREIS] = bdGesamtNettoEndpreis;
                                data[index][RECHNUNG_FELD_RABATT] = new Float(0);
                                data[index][RECHNUNG_FELD_ZUSATZRABATT] = new Float(0);
                                Integer mwstsatzIId = null;
                                if (lsPos[lsIndex].getAuftragpositionIId() != null) {
                                    LieferscheinpositionDto lsp = getLieferscheinpositionFac()
                                            .lieferscheinpositionFindPositionIIdISort(lsPos[lsIndex].getIId(),
                                                    lsPos[lsIndex].getISort() + 1);
                                    mwstsatzIId = lsp.getMwstsatzIId();
                                    if (mwstsatzIId != null) {
                                        MwstsatzDto mwstLSPos = getMandantFac()
                                                .mwstsatzFindByPrimaryKey(mwstsatzIId, theClientDto);
                                        BigDecimal bdLSUst = bdGesamtNettoEndpreis.multiply(
                                                new BigDecimal(mwstLSPos.getFMwstsatz().doubleValue() / 100.0));
                                        data[index][RECHNUNG_FELD_MWSTSATZ] = mwstLSPos.getFMwstsatz();
                                        data[index][RECHNUNG_FELD_MWSTBETRAG] = bdLSUst;
                                        MwstsatzReportDto m = mwstMap.get(mwstsatzIId);
                                        m.setNSummeMwstbetrag(m.getNSummeMwstbetrag().add(bdLSUst));
                                        m.setNSummePositionsbetrag(
                                                m.getNSummePositionsbetrag().add(bdGesamtNettoEndpreis));
                                    }
                                }

                                Session session = null;
                                List<?> l = null;
                                String sArtikelInfo = new String();
                                SessionFactory factory = FLRSessionFactory.getFactory();
                                session = factory.openSession();
                                Criteria crit = session.createCriteria(FLRLieferscheinposition.class);
                                crit.add(Restrictions.eq("position_i_id", lsPos[lsIndex].getIId()));
                                crit.addOrder(Order.asc(RechnungFac.FLR_RECHNUNGPOSITION_I_SORT));
                                l = crit.list();
                                Iterator<?> iter = l.iterator();
                                while (iter.hasNext()) {
                                    index++;
                                    i++;
                                    FLRLieferscheinposition pos = (FLRLieferscheinposition) iter.next();
                                    if (pos.getPositionsart_c_nr().equals(LocaleFac.POSITIONSART_IDENT))
                                        sArtikelInfo = pos.getFlrartikel().getC_nr();
                                    else if (pos.getPositionsart_c_nr().equals(LocaleFac.POSITIONSART_TEXTEINGABE))
                                        sArtikelInfo = pos.getC_textinhalt();
                                    else if (pos.getPositionsart_c_nr().equals(LocaleFac.POSITIONSART_HANDEINGABE))
                                        sArtikelInfo = pos.getC_bez();
                                    // Druckdaten zusammenstellen
                                    data[index][RECHNUNG_FELD_IDENTNUMMER] = sArtikelInfo;
                                    data[index][RECHNUNG_FELD_IDENT] = sArtikelInfo;
                                    // weitere Daten
                                    data[index][RECHNUNG_FELD_MENGE] = pos.getN_menge();
                                    data[index][RECHNUNG_FELD_EINHEIT] = pos.getEinheit_c_nr();
                                    data[index][RECHNUNG_FELD_ZUSATZRABATT] = new Float(0);
                                    data[index][RECHNUNG_FELD_RABATT] = new Float(0);
                                    data[index][RECHNUNG_FELD_B_SEITENUMBRUCH] = new Boolean(false);
                                    data[index][RECHNUNG_FELD_POSITIONSART] = LocaleFac.POSITIONSART_IDENT;
                                    data[index][RECHNUNG_FELD_EINZELPREIS] = pos.getN_nettogesamtpreis();
                                    if (pos.getN_menge() != null && pos.getN_nettogesamtpreis() != null)
                                        data[index][RECHNUNG_FELD_GESAMTPREIS] = pos.getN_menge()
                                                .multiply(pos.getN_nettogesamtpreis());
                                    data[index][RECHNUNG_FELD_TYP_CNR] = pos.getTyp_c_nr();

                                }

                            } else {
                                BigDecimal bdGesamtNettoEndpreis = getLieferscheinpositionFac()
                                        .getGesamtpreisPosition(lsPos[lsIndex].getIId(), theClientDto);
                                data[index][RECHNUNG_FELD_EINZELPREIS] = bdGesamtNettoEndpreis;
                                data[index][RECHNUNG_FELD_GESAMTPREIS] = bdGesamtNettoEndpreis;
                                data[index][RECHNUNG_FELD_RABATT] = new Float(0);
                                data[index][RECHNUNG_FELD_ZUSATZRABATT] = new Float(0);
                                Integer mwstsatzIId = null;
                                if (lsPos[lsIndex].getAuftragpositionIId() != null) {
                                    LieferscheinpositionDto lsp = getLieferscheinpositionFac()
                                            .lieferscheinpositionFindPositionIIdISort(lsPos[lsIndex].getIId(),
                                                    lsPos[lsIndex].getISort() + 1);
                                    mwstsatzIId = lsp.getMwstsatzIId();
                                    if (mwstsatzIId != null) {
                                        MwstsatzDto mwstLSPos = getMandantFac()
                                                .mwstsatzFindByPrimaryKey(mwstsatzIId, theClientDto);
                                        BigDecimal bdLSUst = bdGesamtNettoEndpreis.multiply(
                                                new BigDecimal(mwstLSPos.getFMwstsatz().doubleValue() / 100.0));
                                        data[index][RECHNUNG_FELD_MWSTSATZ] = mwstLSPos.getFMwstsatz();
                                        data[index][RECHNUNG_FELD_MWSTBETRAG] = bdLSUst;
                                        MwstsatzReportDto m = mwstMap.get(mwstsatzIId);
                                        m.setNSummeMwstbetrag(m.getNSummeMwstbetrag().add(bdLSUst));
                                        m.setNSummePositionsbetrag(
                                                m.getNSummePositionsbetrag().add(bdGesamtNettoEndpreis));
                                    }
                                }

                            }
                        }
                    }
                    if (lsPos[lsIndex].getLieferscheinpositionartCNr()
                            .equals(LieferscheinpositionFac.LIEFERSCHEINPOSITIONSART_IDENT)) {
                        // KundeArtikelnr gueltig zu Belegdatum
                        KundesokoDto kundeSokoDto_gueltig = this.getKundesokoFac()
                                .kundesokoFindByKundeIIdArtikelIIdGueltigkeitsdatumOhneExc(
                                        rechnungDto.getKundeIId(), lsPos[lsIndex].getArtikelIId(),
                                        new java.sql.Date(rechnungDto.getTBelegdatum().getTime()));
                        if (kundeSokoDto_gueltig != null) {
                            data[index][RechnungReportFacBean.RECHNUNG_FELD_KUNDEARTIKELNR] = kundeSokoDto_gueltig
                                    .getCKundeartikelnummer();
                        }
                    }

                    if (lsPos[lsIndex].getLieferscheinpositionartCNr()
                            .equals(LieferscheinpositionFac.LIEFERSCHEINPOSITIONSART_INTELLIGENTE_ZWISCHENSUMME)) {
                        data[index][RECHNUNG_FELD_VONPOSITION] = getLieferscheinpositionFac()
                                .getLSPositionNummer(lsPos[lsIndex].getZwsVonPosition());
                        data[index][RECHNUNG_FELD_BISPOSITION] = getLieferscheinpositionFac()
                                .getLSPositionNummer(lsPos[lsIndex].getZwsBisPosition());
                        data[index][RECHNUNG_FELD_ZWSNETTOSUMME] = lsPos[lsIndex].getZwsNettoSumme();
                        if (data[index][RECHNUNG_FELD_VONPOSITION] != null) {
                            updateZwischensummenData(index, lsPos[lsIndex].getZwsVonPosition(),
                                    lsPos[lsIndex].getCBez());
                        }
                        data[index][RECHNUNG_FELD_POSITION] = getLieferscheinpositionFac()
                                .getLSPositionNummer(lsPos[lsIndex].getIId());
                    }

                    // fuer alle nicht-stuecklistenpositionen auch bei den
                    // LS-Pos. eins weiter
                    lsIndex++;
                }
                index++;
                // Optional: Leerzeile nach mengenbehafteter Position
                if (bLeerzeileNachMengenbehafteterPosition
                        && lsData[i][LieferscheinReportFac.REPORT_LIEFERSCHEIN_MENGE] != null) {
                    data[index] = getLeerzeile(bSeitenumbruch);
                    // damit trotz eingefuegter Leerzeile keine neue
                    // Auftragsueberschrift kommt.
                    data[index][RECHNUNG_FELD_AUFTRAG_NUMMER] = data[index - 1][RECHNUNG_FELD_AUFTRAG_NUMMER];
                    index++;
                }
            }
            // Fusszeile des Lieferscheins
            sbArtikelInfo = new StringBuffer();
            sbArtikelInfo.append(
                    getTextRespectUISpr("rechnung.endelieferschein", theClientDto.getMandant(), locale) + " ");
            sbArtikelInfo.append(lieferscheinDto.getCNr());
            data[index][RECHNUNG_FELD_POSITIONSART] = RechnungFac.POSITIONSART_RECHNUNG_LS_ENDE;
            data[index][RECHNUNG_FELD_FREIERTEXT] = sbArtikelInfo.toString();
            data[index][RECHNUNG_FELD_B_SEITENUMBRUCH] = bSeitenumbruch;
            data[index][RECHNUNG_FELD_LS_ANSPRECHPARTNER] = ansprechpartner;
            index++;
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
        }
        return index;
    }

    private int addPositionToDataIntelligenteZwischensumme(RechnungDto rechnungDto, RechnungPositionDto rePos,
            boolean bDruckeRabatt, Map<?, MwstsatzReportDto> mwstMap, HashMap<?, ArtikelDto> hmArtikel,
            HashMap<?, StuecklisteInfoDto> hmStklPos, Boolean bSeitenumbruch, int index, Locale locale,
            boolean bLeerzeileNachMengenbehafteterPosition,
            boolean bChargennummerBeinhaltetMindesthaltbarkeitsdatumI, TheClientDto theClientDto)
            throws EJBExceptionLP {
        try {
            data[index][RECHNUNG_FELD_INTERNAL_IID] = rePos.getIId();

            // Flag Seitenumbruch
            data[index][RECHNUNG_FELD_B_SEITENUMBRUCH] = bSeitenumbruch;
            // Positionsnummer
            data[index][RECHNUNG_FELD_POSITION] = getRechnungFac().getPositionNummer(rePos.getIId());
            data[index][RECHNUNG_FELD_POSITION_NR] = iArtikelpositionsnummer;
            // weiterzaehlen
            iArtikelpositionsnummer = new Integer(iArtikelpositionsnummer.intValue() + 1);

            // Druckdaten zusammenstellen
            KundeDto kundeDto = getKundeFac().kundeFindByPrimaryKey(rechnungDto.getKundeIId(), theClientDto);

            data[index][RECHNUNG_FELD_BEZEICHNUNG] = rePos.getCBez();
            data[index][RECHNUNG_FELD_KURZBEZEICHNUNG] = "";
            data[index][RECHNUNG_FELD_IDENT] = rePos.getCBez();
            data[index][RECHNUNG_FELD_IDENT_TEXTEINGABE] = "";
            data[index][RECHNUNG_FELD_ZUSATZBEZEICHNUNG] = "";
            data[index][RECHNUNG_FELD_ARTIKELKOMMENTAR] = "";

            // weitere Daten
            // data[index][RECHNUNG_FELD_MENGE] = Helper.rundeKaufmaennisch(
            // rePos.getNMenge(),
            // getMandantFac().getNachkommastellenMenge(
            // theClientDto.getMandant()));
            data[index][RECHNUNG_FELD_EINHEIT] = getSystemFac().formatEinheit(rePos.getEinheitCNr(), locale,
                    theClientDto);
            data[index][RECHNUNG_FELD_ARTIKEL_VERPACKUNGSMENGE] = 0.0;
            data[index][RECHNUNG_FELD_POSITIONSART] = rePos.getRechnungpositionartCNr();
            data[index][RECHNUNG_FELD_ARTIKEL_VERKAUFSEANNR] = "";
            data[index][RECHNUNG_FELD_ARTIKEL_VERPACKUNGSEANNR] = "";
            data[index][RECHNUNG_FELD_REFERENZNUMMER] = "";

            // PJ 15348
            if (rePos.getMwstsatzIId() != null) {
                MwstsatzDto mwstSatzDto = getMandantFac().mwstsatzFindByPrimaryKey(rePos.getMwstsatzIId(),
                        theClientDto);
                data[index][RECHNUNG_FELD_FIBU_MWST_CODE] = mwstSatzDto.getIFibumwstcode();
            }

            int iNachkommastellenPreis = getUINachkommastellenPreisVK(rechnungDto.getMandantCNr());
            RechnungPositionDto rechnungPositionDto = (RechnungPositionDto) getBelegVerkaufFac()
                    .getBelegpositionVerkaufReport(rePos, rechnungDto, iNachkommastellenPreis);

            if (bDruckeRabatt) {
                data[index][RECHNUNG_FELD_EINZELPREIS] = rechnungPositionDto
                        .getNReportEinzelpreisplusversteckteraufschlag();
            } else {
                data[index][RECHNUNG_FELD_EINZELPREIS] = rechnungPositionDto
                        .getNReportNettoeinzelpreisplusversteckteraufschlag();
            }
            data[index][RECHNUNG_FELD_RABATT] = new Float(rechnungPositionDto.getDReportRabattsatz());
            data[index][RECHNUNG_FELD_ZUSATZRABATT] = new Float(rechnungPositionDto.getDReportZusatzrabattsatz());
            data[index][RECHNUNG_FELD_GESAMTPREIS] = rechnungPositionDto.getNReportGesamtpreis();
            data[index][RECHNUNG_FELD_MWSTSATZ] = rechnungPositionDto.getDReportMwstsatz();
            data[index][RECHNUNG_FELD_MWSTBETRAG] = Helper
                    .rundeGeldbetrag(rechnungPositionDto.getNReportMwstsatzbetrag());
            data[index][RECHNUNG_FELD_VONPOSITION] = getRechnungFac().getPositionNummer(rePos.getZwsVonPosition());
            data[index][RECHNUNG_FELD_BISPOSITION] = getRechnungFac().getPositionNummer(rePos.getZwsBisPosition());
            data[index][RECHNUNG_FELD_ZWSNETTOSUMME] = rechnungPositionDto.getZwsNettoSumme();
            if (data[index][RECHNUNG_FELD_VONPOSITION] != null) {
                updateZwischensummenData(index, rePos.getZwsVonPosition(), rePos.getCBez());
            }

            MwstsatzReportDto m = mwstMap.get(rechnungPositionDto.getMwstsatzIId());
            m.setNSummeMwstbetrag(m.getNSummeMwstbetrag().add(rechnungPositionDto.getNReportMwstsatzbetrag()));
            m.setNSummePositionsbetrag(
                    m.getNSummePositionsbetrag().add(rechnungPositionDto.getNReportGesamtpreis()));

            index++;
            // Optional: Leerzeile nach mengenbehafteter Position
            if (bLeerzeileNachMengenbehafteterPosition && rePos.getNMenge() != null) {
                data[index] = getLeerzeile(bSeitenumbruch);
                // damit trotz eingefuegter Leerzeile keine neue
                // Auftragsueberschrift kommt.
                data[index][RECHNUNG_FELD_AUFTRAG_NUMMER] = data[index - 1][RECHNUNG_FELD_AUFTRAG_NUMMER];
                index++;
            }
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
        }
        return index;
    }

    /**
     * Update des Data-Arrays um die Zwischensummenbezeichnung in allen
     * Positionen verf&uuml;gbar zu haben.
     * 
     * @param i
     *            ist der Index an dem die Zwischensummenposition definiert ist
     * @param zwsVonPosition
     *            ist die IId der Von-Position
     * @param zwsBisPosition
     *            ist die IId der Bis-Position
     * @param cBez
     */
    private void updateZwischensummenDataOld(int lastIndex, Integer zwsVonPosition, Integer zwsBisPosition,
            String cBez) {
        boolean foundFrom = false;

        for (int i = 0; i < lastIndex; i++) {
            if (zwsVonPosition.equals(data[i][RECHNUNG_FELD_INTERNAL_IID])) {
                foundFrom = true;
            }

            if (foundFrom) {
                if (null == data[i][RECHNUNG_FELD_ZWSTEXT]) {
                    data[i][RECHNUNG_FELD_ZWSTEXT] = cBez;
                } else {
                    String s = (String) data[i][RECHNUNG_FELD_ZWSTEXT] + "\n" + cBez;
                    data[i][RECHNUNG_FELD_ZWSTEXT] = s;
                }
                if (zwsBisPosition.equals(data[i][RECHNUNG_FELD_INTERNAL_IID])) {
                    return;
                }
            }
        }
    }

    private void updateZwischensummenData(int lastIndex, Integer zwsVonPosition, String cBez) {
        for (int i = 0; i < lastIndex; i++) {
            if (zwsVonPosition.equals(data[i][RECHNUNG_FELD_INTERNAL_IID])) {
                if (null == data[i][RECHNUNG_FELD_ZWSTEXT]) {
                    data[i][RECHNUNG_FELD_ZWSTEXT] = cBez;
                } else {
                    String s = (String) data[i][RECHNUNG_FELD_ZWSTEXT] + "\n" + cBez;
                    data[i][RECHNUNG_FELD_ZWSTEXT] = s;
                }
                return;
            }
        }
    }

    private Object[] getLeerzeile(Boolean bSeitenumbruch) {
        Object[] oZeile = new Object[RechnungReportFacBean.RECHNUNG_ANZAHL_SPALTEN];
        oZeile[RECHNUNG_FELD_POSITIONSART] = RechnungFac.POSITIONSART_RECHNUNG_LEERZEILE;
        oZeile[RECHNUNG_FELD_LEERZEILE] = " ";
        oZeile[RECHNUNG_FELD_B_SEITENUMBRUCH] = bSeitenumbruch;
        return oZeile;
    }

    /**
     * Fuer Serien- oder Chargennummerntragenden Artikel, die Anzahl der Serien
     * oder Chargennummern berechnen.
     * 
     * @param artikelDto
     *            ArtikelDto
     * @param cSerienchargennummerI
     *            String
     * @param cNrUserI
     *            String
     * @return int
     * @throws EJBExceptionLP
     */
    private int berechneAnzahlSerienChargeNummern(ArtikelDto artikelDto, List<SeriennrChargennrMitMengeDto> list,
            TheClientDto theClientDto) throws EJBExceptionLP {
        int iAnzahl = 0;
        if (Helper.short2Boolean(artikelDto.getBChargennrtragend())) {
            if (list != null) {

                iAnzahl = list.size();
            }
        }
        if (Helper.short2Boolean(artikelDto.getBSeriennrtragend())) {
            if (list != null) {

                iAnzahl = 1;
            }
        }
        return iAnzahl;
    }

    public void erstelleEinzelexport(Integer rechnungIId, String pfad, boolean bSortiertNachArtikelnummer,
            TheClientDto theClientDto) {

        try {
            RechnungDto rechnungDto = getRechnungFac().rechnungFindByPrimaryKey(rechnungIId);

            if (rechnungDto.getStatusCNr().equals(LocaleFac.STATUS_ANGELEGT)
                    || rechnungDto.getStatusCNr().equals(LocaleFac.STATUS_STORNIERT)) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_STATUS, new Exception(
                        "Rechnung kann nicht exportiert werden, Status : " + rechnungDto.getStatusCNr()));
            }

            if (rechnungDto.getTFibuuebernahme() == null) {

                JasperPrintLP[] report = null;

                if (bSortiertNachArtikelnummer) {
                    report = buildRechnungReport(rechnungIId, "rech_rechnung_expo2.jasper",
                            RechnungReportFac.REPORT_MODUL, theClientDto.getLocUi(), false, 0, null, true,
                            theClientDto);
                } else {
                    report = buildRechnungReport(rechnungIId, "rech_rechnung_expo.jasper",
                            RechnungReportFac.REPORT_MODUL, theClientDto.getLocUi(), false, 0, null, false,
                            theClientDto);
                }

                // JRCsvExporter exp=new JRCsvExporter();
                File reportFile = new File(pfad + "RE" + rechnungDto.getCNr().replaceAll("/", "_") + ".csv");
                JRCsvExporter exporterCSV = new JRCsvExporter();
                exporterCSV.setParameter(JRExporterParameter.JASPER_PRINT, report[0].getPrint());

                String characterEncoding = "ISO-8859-1";
                exporterCSV.setParameter(JRExporterParameter.CHARACTER_ENCODING, characterEncoding);

                exporterCSV.setParameter(JRExporterParameter.OUTPUT_FILE, reportFile);

                javax.persistence.Query query = em.createNamedQuery("ExportlaufFindByTStichtagMandantCNr");
                query.setParameter(1, new Date(System.currentTimeMillis()));
                query.setParameter(2, theClientDto.getMandant());
                Collection<?> cl = query.getResultList();

                Integer exportlaufId = null;

                if (cl.size() > 0) {
                    exportlaufId = ((Exportlauf) cl.iterator().next()).getIId();
                } else {
                    ExportlaufDto exportlaufDto = new ExportlaufDto();
                    exportlaufDto.setMandantCNr(theClientDto.getMandant());
                    exportlaufDto.setPersonalIIdAendern(theClientDto.getIDPersonal());
                    exportlaufDto.setTStichtag(Helper.cutDate(new Date(System.currentTimeMillis())));
                    exportlaufDto = getFibuExportFac().createExportlauf(exportlaufDto);
                    exportlaufId = exportlaufDto.getIId();
                }

                // Exportprotokoll
                ExportdatenDto exportdatenDto = new ExportdatenDto();
                exportdatenDto.setBelegartCNr(LocaleFac.BELEGART_RECHNUNG);
                exportdatenDto.setExportlaufIId(exportlaufId);
                exportdatenDto.setIBelegiid(rechnungDto.getIId());
                getFibuExportFac().createExportdaten(exportdatenDto);
                // AER-Status setzen
                getRechnungFac().setzeRechnungFibuUebernahme(rechnungDto.getIId(), theClientDto);

                try {
                    exporterCSV.exportReport();
                } catch (JRException e) {
                    throw new EJBExceptionLP(EJBExceptionLP.FEHLER, e);
                }

            } else {

                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FINANZ_BELEG_BEREITS_VERBUCHT,
                        new Exception("FEHLER_FINANZ_BELEG_BEREITS_VERBUCHT"));

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

    }

    public JasperPrintLP[] printRechnungZahlschein(Integer iRechnungIId, String sReportname, Integer iKopien,
            TheClientDto theClientDto) throws EJBExceptionLP, RemoteException {
        Map<String, Object> mapParameter = new TreeMap<String, Object>();

        RechnungDto rechnungDto = getRechnungFac().rechnungFindByPrimaryKey(iRechnungIId);

        if (LocaleFac.STATUS_ANGELEGT.equals(rechnungDto.getStatusCNr())) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_RECHNUNG_NOCH_NICHT_AKTIVIERT,
                    new Exception("Status == Angelegt. Rechnung wurde noch nicht aktiviert"));
        }

        KostenstelleDto kostenstelleDto = getSystemFac()
                .kostenstelleFindByPrimaryKey(rechnungDto.getKostenstelleIId());
        KundeDto kundeDto = getKundeFac().kundeFindByPrimaryKey(rechnungDto.getKundeIId(), theClientDto);

        mapParameter.put("P_BRUTTOBETRAG",
                rechnungDto.getNGesamtwertinbelegwaehrung().add(rechnungDto.getNWertustfw()));
        mapParameter.put("P_RECHNUNGSNUMMER", rechnungDto.getCNr());
        mapParameter.put("P_BESTELLNUMMER", rechnungDto.getCBestellnummer());
        mapParameter.put("P_RECHNUNGSDATUM", rechnungDto.getTBelegdatum());
        mapParameter.put("P_KOSTENSTELLENUMMER", kostenstelleDto.getCNr());
        mapParameter.put("P_KOSTENSTELLEBEZEICHNUNG", kostenstelleDto.getCBez());
        mapParameter.put("P_KUNDENNUMMER", kundeDto.getIKundennummer());
        mapParameter.put("P_DEBITORENKONTO", kundeDto.getIDebitorenkontoAsIntegerNotiId());
        if (rechnungDto.getZahlungszielIId() != null) {
            ZahlungszielDto zahlungszielDto = getMandantFac()
                    .zahlungszielFindByPrimaryKey(rechnungDto.getZahlungszielIId(), theClientDto);
            mapParameter.put("P_SKONTO_BEZEICHNUNG", zahlungszielDto.getCBez());
            mapParameter.put("P_SKONTO_ZIELTAGE_NETTO", zahlungszielDto.getAnzahlZieltageFuerNetto());
            mapParameter.put("P_SKONTO1_ANZAHL_TAGE", zahlungszielDto.getSkontoAnzahlTage1());
            mapParameter.put("P_SKONTO2_ANZAHL_TAGE", zahlungszielDto.getSkontoAnzahlTage2());
            mapParameter.put("P_SKONTO1_PROZENT", zahlungszielDto.getSkontoProzentsatz1());
            mapParameter.put("P_SKONTO2_PROZENT", zahlungszielDto.getSkontoProzentsatz2());
            Timestamp tFaelligkeit = null;
            Timestamp tFaelligkeitSkonto1 = null;
            Timestamp tFaelligkeitSkonto2 = null;
            if (zahlungszielDto.getAnzahlZieltageFuerNetto() != null) {
                tFaelligkeit = new Timestamp(rechnungDto.getTBelegdatum().getTime()
                        + Helper.calculateDaysBackIntoMilliseconds(zahlungszielDto.getAnzahlZieltageFuerNetto()));
            }
            if (zahlungszielDto.getSkontoAnzahlTage1() != null) {
                tFaelligkeit = new Timestamp(rechnungDto.getTBelegdatum().getTime()
                        + Helper.calculateDaysBackIntoMilliseconds(zahlungszielDto.getSkontoAnzahlTage1()));
            }
            if (zahlungszielDto.getSkontoAnzahlTage2() != null) {
                tFaelligkeit = new Timestamp(rechnungDto.getTBelegdatum().getTime()
                        + Helper.calculateDaysBackIntoMilliseconds(zahlungszielDto.getSkontoAnzahlTage2()));
            }
            mapParameter.put("P_FAELLIGKEIT", tFaelligkeit);
            mapParameter.put("P_FAELLIGKEIT_SKONTO1", tFaelligkeitSkonto1);
            mapParameter.put("P_FAELLIGKEIT_SKONTO2", tFaelligkeitSkonto2);

        }

        this.useCase = UC_ZAHLSCHEIN;
        data = new Object[1][1];

        int iAnzahlExemplare = 1;

        if (iKopien != null && iKopien.intValue() > 0) {
            iAnzahlExemplare += iKopien.intValue();
        }
        JasperPrintLP[] aJasperPrint = null;
        aJasperPrint = new JasperPrintLP[iAnzahlExemplare];
        for (int iKopieNummer = 0; iKopieNummer < iAnzahlExemplare; iKopieNummer++) {
            if (iKopieNummer > 0) {
                mapParameter.put(LPReport.P_KOPIE_NUMMER, new Integer(iKopieNummer));
            }
            index = -1;
            initJRDS(mapParameter, RechnungReportFac.REPORT_MODUL, sReportname, theClientDto.getMandant(),
                    theClientDto.getLocUi(), theClientDto, true, rechnungDto.getKostenstelleIId());
            aJasperPrint[iKopieNummer] = getReportPrint();

        }
        return aJasperPrint;
    }
}