com.lp.server.anfrage.ejbfac.AnfrageFacBean.java Source code

Java tutorial

Introduction

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

import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

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

import com.lp.server.anfrage.ejb.Anfrage;
import com.lp.server.anfrage.fastlanereader.generated.FLRAnfrage;
import com.lp.server.anfrage.service.AnfrageDto;
import com.lp.server.anfrage.service.AnfrageDtoAssembler;
import com.lp.server.anfrage.service.AnfrageFac;
import com.lp.server.anfrage.service.AnfrageServiceFac;
import com.lp.server.anfrage.service.AnfragepositionDto;
import com.lp.server.anfrage.service.AnfragepositionlieferdatenDto;
import com.lp.server.artikel.service.ArtikelDto;
import com.lp.server.artikel.service.ArtikelFac;
import com.lp.server.bestellung.fastlanereader.generated.FLRBestellvorschlag;
import com.lp.server.bestellung.service.BestellvorschlagDto;
import com.lp.server.bestellung.service.BestellvorschlagFac;
import com.lp.server.bestellung.service.BestellvorschlagUeberleitungKriterienDto;
import com.lp.server.partner.service.LieferantDto;
import com.lp.server.system.ejbfac.BelegAktivierungController;
import com.lp.server.system.ejbfac.IAktivierbar;
import com.lp.server.system.pkgenerator.PKConst;
import com.lp.server.system.pkgenerator.format.LpBelegnummer;
import com.lp.server.system.pkgenerator.format.LpBelegnummerFormat;
import com.lp.server.system.service.BelegartDto;
import com.lp.server.system.service.LocaleFac;
import com.lp.server.system.service.MediaFac;
import com.lp.server.system.service.TheClientDto;
import com.lp.server.util.Facade;
import com.lp.server.util.fastlanereader.FLRSessionFactory;
import com.lp.util.EJBExceptionLP;
import com.lp.util.Helper;

@Stateless
public class AnfrageFacBean extends Facade implements AnfrageFac, IAktivierbar {
    @PersistenceContext
    private EntityManager em;

    // Anfrage
    // -------------------------------------------------------------------

    /**
     * Anlegen einer neuen Anfrage.
     * 
     * @param anfrageDtoI
     *            die neue Anfrage
     * @param theClientDto
     *            der aktuelle Benutzer
     * @return Integer PK der neuen Anfrage
     * @throws EJBExceptionLP
     *             Ausnahme
     */
    public Integer createAnfrage(AnfrageDto anfrageDtoI, TheClientDto theClientDto) throws EJBExceptionLP {
        checkAnfrageDto(anfrageDtoI);

        Integer anfrageIId = null;
        String anfrageCNr = null;

        try {
            // Generieren von PK + Belegnummer
            LpBelegnummerFormat f = getBelegnummerGeneratorObj().getBelegnummernFormat(anfrageDtoI.getMandantCNr());

            Integer iGeschaeftsjahr = getParameterFac().getGeschaeftsjahr(anfrageDtoI.getMandantCNr(),
                    anfrageDtoI.getTBelegdatum());

            LpBelegnummer bnr = getBelegnummerGeneratorObj().getNextBelegNr(iGeschaeftsjahr, PKConst.PK_ANFRAGE,
                    anfrageDtoI.getMandantCNr(), theClientDto);

            anfrageIId = bnr.getPrimaryKey();
            anfrageCNr = f.format(bnr);

            anfrageDtoI.setIId(anfrageIId);
            anfrageDtoI.setCNr(anfrageCNr);
            anfrageDtoI.setPersonalIIdAnlegen(theClientDto.getIDPersonal());
            anfrageDtoI.setPersonalIIdAendern(theClientDto.getIDPersonal());
            anfrageDtoI.setNGesamtwertinbelegwaehrung(new BigDecimal(0));

            Anfrage anfrage = new Anfrage(anfrageDtoI.getIId(), anfrageDtoI.getCNr(), anfrageDtoI.getMandantCNr(),
                    anfrageDtoI.getStatusCNr(), anfrageDtoI.getArtCNr(), anfrageDtoI.getBelegartCNr(),
                    anfrageDtoI.getTBelegdatum(), anfrageDtoI.getWaehrungCNr(),
                    anfrageDtoI.getFWechselkursmandantwaehrungzubelegwaehrung(), anfrageDtoI.getKostenstelleIId(),
                    anfrageDtoI.getFAllgemeinerRabattsatz(), anfrageDtoI.getNTransportkosteninanfragewaehrung(),
                    anfrageDtoI.getBelegtextIIdKopftext(), anfrageDtoI.getBelegtextIIdFusstext(),
                    anfrageDtoI.getPersonalIIdAnlegen(), anfrageDtoI.getPersonalIIdAendern());

            em.persist(anfrage);
            // em.flush();

            anfrageDtoI.setTAnlegen(anfrage.getTAnlegen());
            anfrageDtoI.setTAendern(anfrage.getTAendern());

            setAnfrageFromAnfrageDto(anfrage, anfrageDtoI);
        } catch (EntityExistsException ex) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_ANLEGEN, ex);
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
        }

        return anfrageIId;
    }

    /**
     * Eine Anfrage stornieren.
     * 
     * @param iIdAnfrageI
     *            PK der Anfrage
     * @param theClientDto
     *            der aktuelle Benutzer
     * @throws EJBExceptionLP
     *             Ausnahme
     */
    public void storniereAnfrage(Integer iIdAnfrageI, TheClientDto theClientDto) throws EJBExceptionLP {
        checkAnfrageIId(iIdAnfrageI);

        // try {
        Anfrage anfrage = em.find(Anfrage.class, iIdAnfrageI);
        if (anfrage == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                    "Fehlerb beim stornieren der Anfrage. Es gibt keine Anfrage mit iid " + iIdAnfrageI);
        }
        anfrage.setAnfragestatusCNr(AnfrageServiceFac.ANFRAGESTATUS_STORNIERT);
        anfrage.setPersonalIIdStorniert(theClientDto.getIDPersonal());
        anfrage.setTStorniert(getTimestamp());

        // saemtliche Daten bleiben erhalten
        // }
        // catch (FinderException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
        // ex);
        // }
    }

    /**
     * Eine bestehende Anfrage aktualisieren.
     * 
     * @param anfrageDtoI
     *            die Anfrage
     * @param waehrungOriCNrI
     *            die urspruengliche Belegwaehrung aenderewaehrung: 0
     * @param theClientDto
     *            der aktuelle Benutzer
     * @throws EJBExceptionLP
     *             Ausnahme
     */
    public void updateAnfrage(AnfrageDto anfrageDtoI, String waehrungOriCNrI, TheClientDto theClientDto)
            throws EJBExceptionLP {
        checkAnfrageDto(anfrageDtoI);

        try {
            // wenn die Waehrung geaendert wurde, muessen die Belegwerte neu
            // berechnet werden
            if (waehrungOriCNrI != null && !waehrungOriCNrI.equals(anfrageDtoI.getWaehrungCNr())) {
                AnfragepositionDto[] aAnfragepositionDto = getAnfragepositionFac()
                        .anfragepositionFindByAnfrage(anfrageDtoI.getIId(), theClientDto);

                BigDecimal ffWechselkurs = getLocaleFac().getWechselkurs2(waehrungOriCNrI,
                        anfrageDtoI.getWaehrungCNr(), theClientDto);

                for (int i = 0; i < aAnfragepositionDto.length; i++) {
                    if (aAnfragepositionDto[i].getNMenge() != null
                            && aAnfragepositionDto[i].getNRichtpreis() != null) {
                        // die Positionswerte neu berechnen und abspeichern
                        BigDecimal nRichtpreisInNeuerWaehrung = aAnfragepositionDto[i].getNRichtpreis()
                                .multiply(ffWechselkurs);

                        aAnfragepositionDto[i].setNRichtpreis(nRichtpreisInNeuerWaehrung);

                        getAnfragepositionFac().updateAnfrageposition(aAnfragepositionDto[i], theClientDto);

                        // die zugehoerigen Lieferdaten korrigieren
                        AnfragepositionlieferdatenDto anfragepositionlieferdatenDto = getAnfragepositionFac()
                                .anfragepositionlieferdatenFindByAnfragepositionIIdOhneExc(
                                        aAnfragepositionDto[i].getIId());

                        if (anfragepositionlieferdatenDto != null) {
                            BigDecimal nNettogesamtpreis = anfragepositionlieferdatenDto.getNNettogesamtpreis()
                                    .multiply(ffWechselkurs);

                            anfragepositionlieferdatenDto.setNNettogesamtpreis(nNettogesamtpreis);

                            getAnfragepositionFac().updateAnfragepositionlieferdaten(anfragepositionlieferdatenDto,
                                    theClientDto);

                            getAnfragepositionFac().befuelleZusaetzlichesPreisfeld(
                                    anfragepositionlieferdatenDto.getIId(), theClientDto);
                        }
                    }
                }
            }

            anfrageDtoI.setPersonalIIdAendern(theClientDto.getIDPersonal());
            anfrageDtoI.setTAendern(getTimestamp());

            Anfrage anfrage = em.find(Anfrage.class, anfrageDtoI.getIId());
            if (anfrage == null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                        "Fehler bei Update Anfrage. Es gibt keine anfrage mit iid " + anfrageDtoI.getIId()
                                + " anfrageDto.toString:" + anfrageDtoI.toString());
            }
            setAnfrageFromAnfrageDto(anfrage, anfrageDtoI);
            pruefeUndSetzeAnfragestatusBeiAenderung(anfrageDtoI.getIId(), theClientDto);
            // }
            // catch (FinderException ex) {
            // throw new
            // EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, ex);
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
        }
    }

    /**
     * Die Kopfdaten einer Anfrage duerfen nur in bestimmten Stati geaendert
     * werden. <br>
     * Nachdem eine Anfrage geaendert wurde, befindet er sich im Status
     * ANGELEGT.
     * 
     * @param iIdAnfrageI
     *            PK der Anfrage
     * @throws EJBExceptionLP
     */
    /*
     * private void pruefeUndSetzeAnfragestatusBeiAenderung(Integer iIdAnfrageI,
     * String cNrUserI) throws EJBExceptionLP { check2(cNrUserI);
     * checkAnfrageHome(); checkAnfrageIId(iIdAnfrageI);
     * 
     * Anfrage anfrage = null;
     * 
     * try { anfrage = em.find(Anfrage.class, iIdAnfrageI);
     * 
     * String sStatus = anfrage.getAnfragestatusCNr();
     * 
     * if (!sStatus.equals(AnfrageServiceFac.ANFRAGESTATUS_ANGELEGT) &&
     * !sStatus.equals(AnfrageServiceFac.ANFRAGESTATUS_OFFEN) &&
     * !sStatus.equals(AnfrageServiceFac.ANFRAGESTATUS_ERFASST)) { throw new
     * EJBExceptionLP(EJBExceptionLP.FEHLER_STATUS, new Exception(sStatus)); }
     * 
     * anfrage.setAnfragestatusCNr(AnfrageServiceFac.ANFRAGESTATUS_ANGELEGT);
     * anfrage.setNGesamtanfragewertinanfragewaehrung(null); } catch
     * (FinderException ex) { throw new
     * EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, ex); } }
     */

    /**
     * Eine Anfrage manuell auf 'Erledigt' setzen.
     * 
     * @param iIdAnfrageI
     *            PK der Anfrage
     * @param theClientDto
     *            der aktuelle Benutzer
     * @throws EJBExceptionLP
     *             Ausnahme
     */
    public void manuellErledigen(Integer iIdAnfrageI, TheClientDto theClientDto) throws EJBExceptionLP {
        checkAnfrageIId(iIdAnfrageI);

        // try {
        Anfrage anfrage = em.find(Anfrage.class, iIdAnfrageI);
        if (anfrage == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                    "Fehler beim manuell erledigen der Anfrage. Es gibt keine Anfrage mit iid " + iIdAnfrageI);
        }

        if (anfrage.getAnfragestatusCNr().equals(AnfrageServiceFac.ANFRAGESTATUS_ERFASST)
                || anfrage.getAnfragestatusCNr().equals(AnfrageServiceFac.ANFRAGESTATUS_OFFEN)) {
            anfrage.setAnfragestatusCNr(AnfrageServiceFac.ANFRAGESTATUS_ERLEDIGT);
            anfrage.setPersonalIIdManuellerledigt(theClientDto.getIDPersonal());
            anfrage.setTManuellerledigt(getTimestamp());
        } else {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_STATUS, new Exception(
                    "Anfrage kann nicht manuell erledigt werden, Status : " + anfrage.getAnfragestatusCNr()));
        }
        // }
        // catch (FinderException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
        // ex);
        // }
    }

    /**
     * Den Status einer Anfrage von 'Erledigt' auf 'Erfasst' setzen.
     * 
     * @param iIdAnfrageI
     *            PK der Anfrage
     * @param theClientDto
     *            der aktuelle Benutzer
     * @throws EJBExceptionLP
     */
    public void erledigungAufheben(Integer iIdAnfrageI, TheClientDto theClientDto) throws EJBExceptionLP {
        checkAnfrageIId(iIdAnfrageI);

        // try {
        Anfrage anfrage = em.find(Anfrage.class, iIdAnfrageI);
        if (anfrage == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                    "Fehlerb beim Aufheben der erledigung. Es gibt keine Anfrage mit iid " + iIdAnfrageI);
        }

        if (anfrage.getAnfragestatusCNr().equals(AnfrageServiceFac.ANFRAGESTATUS_ERLEDIGT)) {
            if (anfrage.getPersonalIIdManuellerledigt() != null && anfrage.getTManuellerledigt() != null) {

                anfrage.setAnfragestatusCNr(AnfrageServiceFac.ANFRAGESTATUS_OFFEN);
                anfrage.setPersonalIIdManuellerledigt(null);
                anfrage.setTManuellerledigt(null);
            } else {
                // throw new EJBExceptionLP(
                // EJBExceptionLP.FEHLER_BELEG_WURDE_NICHT_MANUELL_ERLEDIGT,
                // new Exception("Diese Anfrage wurde nicht manuell erledigt"));
                anfrage.setAnfragestatusCNr(AnfrageServiceFac.ANFRAGESTATUS_OFFEN);
                myLogger.logKritisch(
                        "Status Erledigt wurde aufgehoben, obwohl die Anfrage nicht manuell erledigt wurde, AnfrageIId: "
                                + iIdAnfrageI);
            }
        } else {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_STATUS,
                    new Exception("Die Erledigung der Anfrage kann nicht aufgehoben werden, Status: "
                            + anfrage.getAnfragestatusCNr()));
        }
        // }
        // catch (FinderException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
        // ex);
        // }
    }

    public AnfrageDto anfrageFindByPrimaryKey(Integer iIdAnfrageI, TheClientDto theClientDto)
            throws EJBExceptionLP {
        // check2(cNrUserI);
        // checkAnfrageIId(iIdAnfrageI);

        AnfrageDto anfrageDto = anfrageFindByPrimaryKeyOhneExc(iIdAnfrageI);
        if (anfrageDto == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                    "Fehler bei AnfrageFindByPrimaryKey. Es gibt keine Anfrage mit iid " + iIdAnfrageI);
        }

        return anfrageDto;
    }

    public AnfrageDto anfrageFindByPrimaryKeyOhneExc(Integer iIdAnfrageI) {

        Anfrage anfrage = em.find(Anfrage.class, iIdAnfrageI);
        if (anfrage == null) {
            return null;
        }

        return assembleAnfrageDto(anfrage);
    }

    public AnfrageDto anfrageFindByCNrMandantCNrOhneExc(String cNr, String cNrMandantI) {
        Query query = em.createNamedQuery(Anfrage.QueryFindByCnrMandantCnr);
        query.setParameter("cnr", cNr);
        query.setParameter("mandant", cNrMandantI);
        try {
            Anfrage a = (Anfrage) query.getSingleResult();
            return assembleAnfrageDto(a);
        } catch (NoResultException ex) {
            return null;
        }
    }

    public AnfrageDto[] anfrageFindByMandantCNr(String cNrMandantI, TheClientDto theClientDto)
            throws EJBExceptionLP {
        // check2(cNrUserI);

        if (cNrMandantI == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PARAMETER_IS_NULL, new Exception("cNrMandantI == null"));
        }

        myLogger.info("cNrMandantI: " + cNrMandantI);

        AnfrageDto[] aAnfrageDto = null;

        // try {
        Query query = em.createNamedQuery("AnfragefindByMandant");
        query.setParameter(1, cNrMandantI);
        Collection<?> cl = query.getResultList();
        // if (cl.isEmpty()) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND, null);
        // }

        aAnfrageDto = assembleAnfrageDtos(cl);
        // }
        // catch (FinderException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND, ex);
        // }

        return aAnfrageDto;
    }

    public AnfrageDto[] anfrageFindByAnfrageIIdLiefergruppenanfrage(Integer iIdAnfrageLiefergruppenanfrageI,
            TheClientDto theClientDto) throws EJBExceptionLP {
        // check2(cNrUserI);

        if (iIdAnfrageLiefergruppenanfrageI == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PARAMETER_IS_NULL,
                    new Exception("iIdAnfrageLiefergruppenanfrageI == null"));
        }

        myLogger.info("iIdAnfrageLiefergruppenanfrageI: " + iIdAnfrageLiefergruppenanfrageI);

        AnfrageDto[] aAnfrageDto = null;

        // try {
        Query query = em.createNamedQuery("AnfragefindByAnfrageIIdLiefergruppenanfrage");
        query.setParameter(1, iIdAnfrageLiefergruppenanfrageI);
        Collection<?> cl = query.getResultList();
        // if (cl.isEmpty()) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND, null);
        // }

        aAnfrageDto = assembleAnfrageDtos(cl);
        // }
        // catch (FinderException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND, ex);
        // }

        return aAnfrageDto;
    }

    public AnfrageDto[] anfrageFindByAnsprechpartnerlieferantIIdMandantCNr(Integer iAnsprechpartnerLieferantIId,
            String cNrMandantI, TheClientDto theClientDto) throws EJBExceptionLP {

        if (iAnsprechpartnerLieferantIId == null || cNrMandantI == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PARAMETER_IS_NULL,
                    new Exception("iAnsprechpartnerLieferantIId == null || cNrMandantI == null"));
        }

        myLogger.info("iAnsprechpartnerLieferantIId: " + iAnsprechpartnerLieferantIId);

        AnfrageDto[] aAnfrageDto = null;

        // try {
        Query query = em.createNamedQuery("AnfragefindByAnsprechpartnerlieferantIIdMandantCNr");
        query.setParameter(1, iAnsprechpartnerLieferantIId);
        query.setParameter(2, cNrMandantI);
        aAnfrageDto = assembleAnfrageDtos(query.getResultList());
        if (aAnfrageDto.length == 0) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND,
                    new Exception("Es wurden keine Anfragen mit der iAnsprechpartnerLieferantIId "
                            + iAnsprechpartnerLieferantIId + "gefunden"));
        }
        // }
        // catch (FinderException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND, ex);
        // }

        return aAnfrageDto;
    }

    public AnfrageDto[] anfrageFindByAnsprechpartnerlieferantIIdMandantCNrOhneExc(
            Integer iAnsprechpartnerLieferantIId, String cNrMandantI, TheClientDto theClientDto) {

        if (iAnsprechpartnerLieferantIId == null || cNrMandantI == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PARAMETER_IS_NULL,
                    new Exception("iAnsprechpartnerLieferantIId == null || cNrMandantI == null"));
        }

        myLogger.info("iAnsprechpartnerLieferantIId: " + iAnsprechpartnerLieferantIId);

        AnfrageDto[] aAnfrageDto = null;

        try {
            Query query = em.createNamedQuery("AnfragefindByAnsprechpartnerlieferantIIdMandantCNr");
            query.setParameter(1, iAnsprechpartnerLieferantIId);
            query.setParameter(2, cNrMandantI);
            aAnfrageDto = assembleAnfrageDtos(query.getResultList());
        } catch (Throwable ex) {
            return null;
        }

        return aAnfrageDto;
    }

    public AnfrageDto[] anfrageFindByLieferantIIdAnfrageadresseMandantCNr(Integer iLieferantIIdAnfrageadresseI,
            String cNrMandantI, TheClientDto theClientDto) throws EJBExceptionLP {

        if (iLieferantIIdAnfrageadresseI == null || cNrMandantI == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PARAMETER_IS_NULL,
                    new Exception("iLieferantIIdAnfrageadresseI == null || cNrMandantI == null"));
        }

        myLogger.info("iLieferantIIdAnfrageadresseI: " + iLieferantIIdAnfrageadresseI);

        AnfrageDto[] aAnfrageDto = null;

        // try {
        Query query = em.createNamedQuery("AnfragefindByLieferantIIdAnfrageadresseMandantCNr");
        query.setParameter(1, iLieferantIIdAnfrageadresseI);
        query.setParameter(2, cNrMandantI);
        Collection<?> cl = query.getResultList();
        aAnfrageDto = assembleAnfrageDtos(cl);

        // }
        // catch (FinderException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND, ex);
        // }

        return aAnfrageDto;
    }

    public AnfrageDto[] anfrageFindByLieferantIIdAnfrageadresseMandantCNrOhneExc(
            Integer iLieferantIIdAnfrageadresseI, String cNrMandantI, TheClientDto theClientDto) {

        if (iLieferantIIdAnfrageadresseI == null || cNrMandantI == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PARAMETER_IS_NULL,
                    new Exception("iLieferantIIdAnfrageadresseI == null || cNrMandantI == null"));
        }

        myLogger.info("iLieferantIIdAnfrageadresseI: " + iLieferantIIdAnfrageadresseI);

        AnfrageDto[] aAnfrageDto = null;

        try {
            Query query = em.createNamedQuery("AnfragefindByLieferantIIdAnfrageadresseMandantCNr");
            query.setParameter(1, iLieferantIIdAnfrageadresseI);
            query.setParameter(2, cNrMandantI);
            aAnfrageDto = assembleAnfrageDtos(query.getResultList());
        } catch (Throwable th) {
            return null;
        }

        return aAnfrageDto;
    }

    private void setAnfrageFromAnfrageDto(Anfrage anfrage, AnfrageDto anfrageDto) {
        anfrage.setCNr(anfrageDto.getCNr());
        anfrage.setMandantCNr(anfrageDto.getMandantCNr());
        anfrage.setAnfrageartCNr(anfrageDto.getArtCNr());
        anfrage.setAnfragestatusCNr(anfrageDto.getStatusCNr());
        anfrage.setBelegartCNr(anfrageDto.getBelegartCNr());
        anfrage.setTBelegdatum(anfrageDto.getTBelegdatum());
        anfrage.setLieferantIIdAnfrageadresse(anfrageDto.getLieferantIIdAnfrageadresse());
        anfrage.setAnsprechpartnerIIdLieferant(anfrageDto.getAnsprechpartnerIIdLieferant());
        anfrage.setLieferguppeIId(anfrageDto.getLiefergruppeIId());
        anfrage.setCBez(anfrageDto.getCBez());
        anfrage.setCAngebotnummer(anfrageDto.getCAngebotnummer());
        anfrage.setWaehrungCNrAnfragewaehrung(anfrageDto.getWaehrungCNr());
        anfrage.setFWechselkursmandantwaehrungzuanfragewaehrung(
                anfrageDto.getFWechselkursmandantwaehrungzubelegwaehrung());
        anfrage.setTAnliefertermin(anfrageDto.getTAnliefertermin());
        anfrage.setTAngebotdatum(anfrageDto.getTAngebotdatum());
        anfrage.setTAngebotgueltigbis(anfrageDto.getTAngebotgueltigbis());
        anfrage.setKostenstelleIId(anfrageDto.getKostenstelleIId());
        anfrage.setFAllgemeinerrabattsatz(anfrageDto.getFAllgemeinerRabattsatz());
        anfrage.setLieferartIId(anfrageDto.getLieferartIId());
        anfrage.setZahlungszielIId(anfrageDto.getZahlungszielIId());
        anfrage.setSpediteurIId(anfrageDto.getSpediteurIId());
        anfrage.setNGesamtanfragewertinanfragewaehrung(anfrageDto.getNGesamtwertinbelegwaehrung());
        anfrage.setNTransportkosteninanfragewaehrung(anfrageDto.getNTransportkosteninanfragewaehrung());
        anfrage.setAnfragetextIIdKopftext(anfrageDto.getBelegtextIIdKopftext());
        anfrage.setXKopftextuebersteuert(anfrageDto.getXKopftextuebersteuert());
        anfrage.setAnfragetextIIdFusstext(anfrageDto.getBelegtextIIdFusstext());
        anfrage.setXFusstextuebersteuert(anfrageDto.getXFusstextuebersteuert());
        anfrage.setTGedruckt(anfrageDto.getTGedruckt());
        anfrage.setPersonalIIdStorniert(anfrageDto.getPersonalIIdStorniert());
        anfrage.setTStorniert(anfrageDto.getTStorniert());
        anfrage.setPersonalIIdAnlegen(anfrageDto.getPersonalIIdAnlegen());
        anfrage.setTAnlegen(anfrageDto.getTAnlegen());
        anfrage.setPersonalIIdAendern(anfrageDto.getPersonalIIdAendern());
        anfrage.setTAendern(anfrageDto.getTAendern());
        anfrage.setPersonalIIdManuellerledigt(anfrageDto.getPersonalIIdManuellerledigt());
        anfrage.setTManuellerledigt(anfrageDto.getTManuellerledigt());
        anfrage.setAnfrageIIdLiefergruppenanfrage(anfrageDto.getAnfrageIIdLiefergruppenanfrage());
        anfrage.setCLieferartort(anfrageDto.getCLieferartort());
        anfrage.setProjektIId(anfrageDto.getProjektIId());
        em.merge(anfrage);
        em.flush();
    }

    private AnfrageDto assembleAnfrageDto(Anfrage anfrage) {
        return AnfrageDtoAssembler.createDto(anfrage);
    }

    private AnfrageDto[] assembleAnfrageDtos(Collection<?> anfrages) {
        List<AnfrageDto> list = new ArrayList<AnfrageDto>();
        if (anfrages != null) {
            Iterator<?> iterator = anfrages.iterator();
            while (iterator.hasNext()) {
                Anfrage anfrage = (Anfrage) iterator.next();
                list.add(assembleAnfrageDto(anfrage));
            }
        }
        AnfrageDto[] returnArray = new AnfrageDto[list.size()];
        return (AnfrageDto[]) list.toArray(returnArray);
    }

    private void checkAnfrageDto(AnfrageDto anfrageDtoI) throws EJBExceptionLP {
        if (anfrageDtoI == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_DTO_IS_NULL, new Exception("anfrageDtoI == null"));
        }

        myLogger.info("AnfrageDto: " + anfrageDtoI.toString());
    }

    private void checkAnfrageIId(Integer iIdAnfrageI) throws EJBExceptionLP {
        if (iIdAnfrageI == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_DTO_IS_NULL, new Exception("iIdAnfrageI == null"));
        }

        myLogger.info("AnfrageIId: " + iIdAnfrageI.toString());
    }

    /**
     * Anfragen duerfen nur in bestimmten Stati geaendert werden. <br>
     * Nachdem eine Anfrage geaendert wurde, befindet sie sich im Status
     * 'Angelegt'.
     * 
     * @param iIdAnfrageI
     *            PK der Anfrage
     * @param theClientDto
     *            String
     * @throws EJBExceptionLP
     */
    public void pruefeUndSetzeAnfragestatusBeiAenderung(Integer iIdAnfrageI, TheClientDto theClientDto)
            throws EJBExceptionLP {
        checkAnfrageIId(iIdAnfrageI);

        Anfrage anfrage = null;

        // try {
        anfrage = em.find(Anfrage.class, iIdAnfrageI);
        if (anfrage == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                    "Fehler bei pruefe und setze Anfragestatus bei Aenderung. Es gibt keine Anfrage mit iid "
                            + iIdAnfrageI);
        }
        // }
        // catch (FinderException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
        // ex);
        // }

        anfrage.setPersonalIIdAendern(theClientDto.getIDPersonal());
        anfrage.setTAendern(getTimestamp());
        String sStatus = anfrage.getAnfragestatusCNr();

        if (!sStatus.equals(AnfrageServiceFac.ANFRAGESTATUS_ANGELEGT)
                && !sStatus.equals(AnfrageServiceFac.ANFRAGESTATUS_OFFEN)
                && !sStatus.equals(AnfrageServiceFac.ANFRAGESTATUS_ERFASST)) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_STATUS, new Exception(sStatus));
        }

        if (sStatus.equals(AnfrageServiceFac.ANFRAGESTATUS_OFFEN)
                || sStatus.equals(AnfrageServiceFac.ANFRAGESTATUS_ERFASST)) {
            anfrage.setAnfragestatusCNr(AnfrageServiceFac.ANFRAGESTATUS_ANGELEGT);
            anfrage.setNGesamtanfragewertinanfragewaehrung(null);
        }
    }

    /**
     * Berechne den Gesamtwert einer bestimmten Anfrage in der Anfragewaehrung. <br>
     * Der Gesamtwert berechnet sich aus
     * <p>
     * Summe der Nettogesamtpreiseminusrabatt der Positionlieferdaten. <br>
     * Beruecksichtigt werden alle mengenbehafteten Positionen.
     * 
     * @param iIdAnfrageI
     *            PK der Anfrage
     * @param theClientDto
     *            der aktuelle Benutzer
     * @throws EJBExceptionLP
     *             Ausnahme
     * @return BigDecimal der Gesamtwert der Anfrage
     */
    public BigDecimal berechneNettowertGesamt(Integer iIdAnfrageI, TheClientDto theClientDto)
            throws EJBExceptionLP {
        checkAnfrageIId(iIdAnfrageI);

        BigDecimal bdAnfragewert = new BigDecimal(0);

        try {
            // die aktuelle Anfrage
            Anfrage anfrage = em.find(Anfrage.class, iIdAnfrageI);
            if (anfrage == null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                        "Fehler bei berechneNettoGesamtwert. Es gibt keine ANfrage mit iid " + iIdAnfrageI);
            }

            // Step 1: Wenn der status STORNIERT ist, 0 zurueckgeben obwohl der
            // Anfragewert noch in der Tabelle steht
            if (anfrage.getAnfragestatusCNr().equals(AnfrageServiceFac.ANFRAGESTATUS_STORNIERT)) {
                bdAnfragewert = new BigDecimal(0);
            } else {
                // Step 2: Den Wert aus den Positionen berechnen
                AnfragepositionDto[] aAnfragepositionDto = getAnfragepositionFac()
                        .anfragepositionFindByAnfrage(iIdAnfrageI, theClientDto);

                for (int i = 0; i < aAnfragepositionDto.length; i++) {
                    // Lieferdaten gibt es nur zu Ident und
                    // Handeingabepositionen
                    if (aAnfragepositionDto[i].getPositionsartCNr()
                            .equals(AnfrageServiceFac.ANFRAGEPOSITIONART_IDENT)
                            || aAnfragepositionDto[i].getPositionsartCNr()
                                    .equals(AnfrageServiceFac.ANFRAGEPOSITIONART_HANDEINGABE)) {
                        AnfragepositionlieferdatenDto anfragepositionlieferdatenDto = getAnfragepositionFac()
                                .anfragepositionlieferdatenFindByAnfragepositionIIdOhneExc(
                                        aAnfragepositionDto[i].getIId());

                        // alle positiven mengenbehafteten Positionen
                        // beruecksichtigen
                        if (anfragepositionlieferdatenDto != null
                                && anfragepositionlieferdatenDto.getNAnliefermenge() != null
                                && anfragepositionlieferdatenDto.getNAnliefermenge().doubleValue() > 0) {

                            BigDecimal bdAnliefermenge = anfragepositionlieferdatenDto.getNAnliefermenge();

                            // Grundlage ist der Nettogesamtwertminusrabatt der
                            // Position in Anfragewaehrung
                            BigDecimal wertDerPosition = bdAnliefermenge
                                    .multiply(anfragepositionlieferdatenDto.getNNettogesamtpreisminusrabatt());

                            bdAnfragewert = bdAnfragewert.add(wertDerPosition);
                        }
                    }
                }
            }

            // Step 3: Der Wert muss in unsere Datenbank passen, fuer decimal(9)
            // gilt 15,4
            bdAnfragewert = Helper.rundeKaufmaennisch(bdAnfragewert, 4);
            checkNumberFormat(bdAnfragewert);
            // }
            // catch (FinderException ex) {
            // throw new
            // EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, ex);
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
        }
        myLogger.exit("Nettoanfragewert: " + bdAnfragewert.toString());

        return bdAnfragewert;
    }

    /**
     * Wenn der Abschlag in den Konditionen geaendert wurde, dann werden im
     * Anschluss die davon abhaengigen Werte neu berechnet.
     * 
     * @param iIdAnfrageI
     *            PK der Anfrage
     * @param theClientDto
     *            der aktuelle Benutzer
     * @throws EJBExceptionLP
     *             Ausnahme
     */
    public void updateAnfrageKonditionen(Integer iIdAnfrageI, TheClientDto theClientDto) throws EJBExceptionLP {
        checkAnfrageIId(iIdAnfrageI);

        try {
            // alle Positionen dieser Anfrage
            AnfragepositionDto[] aAnfragepositionDto = getAnfragepositionFac()
                    .anfragepositionFindByAnfrage(iIdAnfrageI, theClientDto);

            // fuer jede Position den Abschlag neu beruecksichtigen, wenn es
            // eine zugehoerige anfragepositionlieferdaten gibt
            for (int i = 0; i < aAnfragepositionDto.length; i++) {
                AnfragepositionlieferdatenDto anfragepositionlieferdatenDto = getAnfragepositionFac()
                        .anfragepositionlieferdatenFindByAnfragepositionIIdOhneExc(aAnfragepositionDto[i].getIId());

                if (anfragepositionlieferdatenDto != null) {
                    getAnfragepositionFac().befuelleZusaetzlichesPreisfeld(anfragepositionlieferdatenDto.getIId(),
                            theClientDto);
                }
            }

            Anfrage anfrage = em.find(Anfrage.class, iIdAnfrageI);
            if (anfrage == null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                        "Fehler bei updateAnfrageKonditionen. Es gibt keine Anfrage mit iid " + iIdAnfrageI);
            }

            anfrage.setPersonalIIdAendern(theClientDto.getIDPersonal());
            anfrage.setTAendern(getTimestamp());

            if (!anfrage.getAnfragestatusCNr().equals(AnfrageServiceFac.ANFRAGESTATUS_ANGELEGT)) {
                anfrage.setNGesamtanfragewertinanfragewaehrung(berechneNettowertGesamt(iIdAnfrageI, theClientDto));
                em.merge(anfrage);
            }
        } catch (RemoteException ex) {
            // exccatch: immer so!
            throwEJBExceptionLPRespectOld(ex);
        }
        // catch (FinderException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
        // ex);
        // }
    }

    /**
     * Den Druckzeitpunkt einer Anfrage vermerken.
     * 
     * @param iIdAnfrageI
     *            PK der Anfrage
     * @param timestampI
     *            der Zeitpunkt des Drucks
     * @param theClientDto
     *            der aktuelle Benutzer
     * @throws EJBExceptionLP
     *             Ausnahme
     */
    public void setzeDruckzeitpunkt(Integer iIdAnfrageI, Timestamp timestampI, TheClientDto theClientDto)
            throws EJBExceptionLP {
        checkAnfrageIId(iIdAnfrageI);

        // try {
        Anfrage anfrage = em.find(Anfrage.class, iIdAnfrageI);
        if (anfrage == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                    "Fehler bei setzeDruckzeitpunkt. Es gibt keine Anfrage mit iid " + iIdAnfrageI);
        }

        anfrage.setTGedruckt(timestampI);
        // }
        // catch (FinderException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
        // ex);
        // }
    }

    /**
     * Die Kennung einer Anfrage bestimmten.
     * 
     * @param iIdAnfrageI
     *            PK der Anfrage
     * @param localeI
     *            das gewuenschte Locale
     * @param theClientDto
     *            der aktuelle Benutzer
     * @return String die Kennung
     * @throws EJBExceptionLP
     *             Ausnahme
     */
    public String getAnfragekennung(Integer iIdAnfrageI, Locale localeI, TheClientDto theClientDto)
            throws EJBExceptionLP {
        checkAnfrageIId(iIdAnfrageI);

        StringBuffer buff = new StringBuffer();

        try {
            Anfrage anfrage = em.find(Anfrage.class, iIdAnfrageI);
            if (anfrage == null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                        "Fehler bei getAnfragenkennung. Es gibt keine Anfrage mit iid " + iIdAnfrageI);
            }

            if (anfrage.getAnfrageartCNr().equals(AnfrageServiceFac.ANFRAGEART_LIEFERANT)) {
                buff.append(getTextRespectUISpr("anf.anfragekennung", theClientDto.getMandant(), localeI));
            } else if (anfrage.getAnfrageartCNr().equals(AnfrageServiceFac.ANFRAGEART_LIEFERGRUPPE)) {
                buff.append(
                        getTextRespectUISpr("anf.liefergruppenanfragekennung", theClientDto.getMandant(), localeI));
            }

            buff.append(" ");

            BelegartDto belegartDto = getLocaleFac().belegartFindByPrimaryKey(anfrage.getBelegartCNr(),
                    theClientDto);

            buff.append(belegartDto.getCKurzbezeichnung());
            buff.append(" ").append(anfrage.getCNr());
        } catch (RemoteException ex) {
            // exccatch: immer so!
            throwEJBExceptionLPRespectOld(ex);
        }
        // catch (FinderException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
        // ex);
        // }

        return buff.toString();
    }

    /**
     * Eine Anfrage mit Status 'Storniert' auf 'Offen' setzen.
     * 
     * @param iIdAnfrageI
     *            PK der Anfrage
     * @param theClientDto
     *            der aktuelle Benutzer
     * @throws EJBExceptionLP
     *             Ausnahme
     */
    public void stornoAufheben(Integer iIdAnfrageI, TheClientDto theClientDto) throws EJBExceptionLP {
        checkAnfrageIId(iIdAnfrageI);

        // try {
        Anfrage anfrage = em.find(Anfrage.class, iIdAnfrageI);
        if (anfrage == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                    "Fehler bei stornoAufheben. Es gibt keine Anfrage mit iid " + iIdAnfrageI);
        }

        if (anfrage.getAnfragestatusCNr().equals(AnfrageServiceFac.ANFRAGESTATUS_STORNIERT)) {
            anfrage.setAnfragestatusCNr(AnfrageServiceFac.ANFRAGESTATUS_OFFEN);
            anfrage.setTStorniert(null);
            anfrage.setPersonalIIdStorniert(null);
            anfrage.setTAendern(getTimestamp());
            anfrage.setPersonalIIdAendern(theClientDto.getIDPersonal());
        } else {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_STATUS,
                    new Exception("Storno der Bestellung kann nicht aufgehoben werden, Status : "
                            + anfrage.getAnfragestatusCNr()));
        }
        // }
        // catch (FinderException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
        // ex);
        // }
    }

    @Override
    public void pruefeAktivierbar(Integer iid, TheClientDto theClientDto) throws EJBExceptionLP, RemoteException {
        //nichts zu pruefen
    }

    @Override
    public void aktiviereBeleg(Integer iid, TheClientDto theClientDto) throws EJBExceptionLP, RemoteException {
        Anfrage anfrage = em.find(Anfrage.class, iid);
        if (anfrage.getAnfragestatusCNr().equals(AnfrageServiceFac.ANFRAGESTATUS_ANGELEGT))
            setzeAnfragestatus(AnfrageServiceFac.ANFRAGESTATUS_OFFEN, iid, theClientDto);
    }

    @Override
    public void berechneBeleg(Integer iid, TheClientDto theClientDto) throws EJBExceptionLP, RemoteException {
        //hier gibt es nichts zu berechnen
    }

    /**
     * Den Status einer Anfrage aendern.
     * 
     * @param cNrStatusI
     *            der neue Status der Anfrage
     * @param iIdAnfrageI
     *            PK der Anfrage
     * @param theClientDto
     *            der aktuelle Benutzer
     * @throws EJBExceptionLP
     *             Ausnahme
     */
    public void setzeAnfragestatus(String cNrStatusI, Integer iIdAnfrageI, TheClientDto theClientDto) {
        checkAnfrageIId(iIdAnfrageI);

        if (cNrStatusI == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PARAMETER_IS_NULL, new Exception("cNrStatusI == null"));
        }
        try {
            // Das Setzen auf einen Status "Offen" oder hoeher ist ohne
            // Positionen nicht zulaessig
            if (cNrStatusI.equals(AnfrageServiceFac.ANFRAGESTATUS_OFFEN)
                    || cNrStatusI.equals(AnfrageServiceFac.ANFRAGESTATUS_ERFASST)
                    || cNrStatusI.equals(AnfrageServiceFac.ANFRAGESTATUS_ERLEDIGT)) {
                if (getAnfragepositionFac().getAnzahlMengenbehafteteAnfragepositionen(iIdAnfrageI,
                        theClientDto) == 0) {
                    ArrayList<Object> al = new ArrayList<Object>();
                    al.add(iIdAnfrageI);
                    throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BELEG_HAT_KEINE_POSITIONEN, al, new Exception(
                            "Fehler bei setzeAnfrageStatus. Es gibt keine Mengenbehafteten Positionen f\u00FCr die Anfrageiid "
                                    + iIdAnfrageI));
                }
            }
            myLogger.info("Neuer Status: " + cNrStatusI);
            Anfrage anfrage = em.find(Anfrage.class, iIdAnfrageI);
            if (anfrage == null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                        "Fehler bei setzeAnfrageStatus. Es gibt keine Anfrage mit iid " + iIdAnfrageI);
            }
            anfrage.setAnfragestatusCNr(cNrStatusI);
            em.merge(anfrage);
            em.flush();
        }
        // catch (FinderException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
        // ex);
        // }
        catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
        }
    }

    public void setzeNettogesamtwert(Integer iIdAnfrageI, BigDecimal nNettogesamtwertI, TheClientDto theClientDto)
            throws EJBExceptionLP {
        checkAnfrageIId(iIdAnfrageI);

        // try {
        Anfrage anfrage = em.find(Anfrage.class, iIdAnfrageI);
        if (anfrage == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                    "Fehler bei setzeNEttoGesamtwert. Es gibt keine Anfrage mit iid " + iIdAnfrageI);
        }
        anfrage.setNGesamtanfragewertinanfragewaehrung(nNettogesamtwertI);
        em.merge(anfrage);

        // catch (FinderException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
        // ex);
        // }
    }

    public BigDecimal berechneEinkaufswertIst(Integer iIdAnfrageI, String sArtikelartI, TheClientDto theClientDto) {

        BigDecimal bdEKwertIstO = Helper.getBigDecimalNull();
        AnfragepositionDto[] aAnfragepositionDtos = null;
        try {
            aAnfragepositionDtos = getAnfragepositionFac().anfragepositionFindByAnfrage(iIdAnfrageI, theClientDto);
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
        }
        for (int i = 0; i < aAnfragepositionDtos.length; i++) {

            // alle mengenbehafteten Positionen beruecksichtigen
            if (aAnfragepositionDtos[i].getNMenge() != null && aAnfragepositionDtos[i].getArtikelIId() != null) {

                if (aAnfragepositionDtos[i].getPositioniIdArtikelset() == null) {

                    ArtikelDto oArtikelDto = getArtikelFac()
                            .artikelFindByPrimaryKey(aAnfragepositionDtos[i].getArtikelIId(), theClientDto);

                    BigDecimal preis = new BigDecimal(0);

                    AnfragepositionlieferdatenDto lfDaten = null;
                    try {
                        lfDaten = getAnfragepositionFac().anfragepositionlieferdatenFindByAnfragepositionIIdOhneExc(
                                aAnfragepositionDtos[i].getIId());
                    } catch (RemoteException e) {
                        throwEJBExceptionLPRespectOld(e);
                    }

                    if (lfDaten != null && lfDaten.getNNettogesamtpreisminusrabatt() != null) {
                        preis = lfDaten.getNNettogesamtpreisminusrabatt();
                    }

                    BigDecimal bdBeitragDieserPosition = aAnfragepositionDtos[i].getNMenge().multiply(preis);

                    // je nach Artikelart beruecksichtigen
                    if (sArtikelartI.equals(ArtikelFac.ARTIKELART_ARBEITSZEIT)) {
                        if (oArtikelDto.getArtikelartCNr().equals(ArtikelFac.ARTIKELART_ARBEITSZEIT)) {
                            bdEKwertIstO = bdEKwertIstO.add(bdBeitragDieserPosition);
                        }
                    } else {
                        if (!oArtikelDto.getArtikelartCNr().equals(ArtikelFac.ARTIKELART_ARBEITSZEIT)) {
                            bdEKwertIstO = bdEKwertIstO.add(bdBeitragDieserPosition);
                        }
                    }
                }
            }
        }

        return bdEKwertIstO;
    }

    /**
     * Alle Anfragen zu einer Liefergruppenanfrage erzeugen.
     * 
     * @param iIdAnfrageI
     *            PK der Liefergruppenanfrage
     * @param theClientDto
     *            der aktuelle Benutzer
     * @return Integer PK der zuletzt erzeugten Anfrage
     * @throws EJBExceptionLP
     *             Ausnahme
     */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public ArrayList<Integer> erzeugeAnfragenAusLiefergruppenanfrage(Integer iIdAnfrageI,
            ArrayList<Integer> bereitserzeugteAnfragen, TheClientDto theClientDto) {
        checkAnfrageIId(iIdAnfrageI);

        if (bereitserzeugteAnfragen == null) {
            bereitserzeugteAnfragen = new ArrayList<Integer>();
        }

        Integer iIdLetzteErzeugteAnfrage = null;

        AnfrageDto liefergruppenanfrageDto = anfrageFindByPrimaryKey(iIdAnfrageI, theClientDto);

        AnfragepositionDto[] aAnfragepositionDto = null;
        LieferantDto[] aLieferantDto = null;
        try {
            aAnfragepositionDto = getAnfragepositionFac().anfragepositionFindByAnfrage(iIdAnfrageI, theClientDto);

            aLieferantDto = getLieferantFac()
                    .lieferantFindByLiefergruppeIId(liefergruppenanfrageDto.getLiefergruppeIId(), theClientDto);
        } catch (RemoteException e1) {
            throwEJBExceptionLPRespectOld(e1);
        }

        if (aLieferantDto != null && aLieferantDto.length > 0) {
            // fuer jeden Lieferanten eine Anfrage zur Liefergruppenanfrage
            // erzeugen
            for (int i = 0; i < aLieferantDto.length; i++) {
                AnfrageDto anfrageDto = (AnfrageDto) liefergruppenanfrageDto.clone();

                // PJ 16726 Wenn der Lieferant einen andere Waehrung hat,
                // dann diese verwenden
                if (!anfrageDto.getWaehrungCNr().equals(aLieferantDto[i].getWaehrungCNr())) {
                    anfrageDto.setWaehrungCNr(aLieferantDto[i].getWaehrungCNr());

                }
                try {
                    anfrageDto
                            .setFWechselkursmandantwaehrungzubelegwaehrung(
                                    new Double(
                                            getLocaleFac()
                                                    .getWechselkurs2(
                                                            getMandantFac()
                                                                    .mandantFindByPrimaryKey(
                                                                            theClientDto.getMandant(), theClientDto)
                                                                    .getWaehrungCNr(),
                                                            anfrageDto.getWaehrungCNr(), theClientDto)
                                                    .doubleValue()));
                } catch (RemoteException e) {
                    throwEJBExceptionLPRespectOld(e);
                }

                anfrageDto.setArtCNr(AnfrageServiceFac.ANFRAGEART_LIEFERANT);
                anfrageDto.setLieferantIIdAnfrageadresse(aLieferantDto[i].getIId());
                anfrageDto.setLiefergruppeIId(null);
                anfrageDto.setAnfrageIIdLiefergruppenanfrage(liefergruppenanfrageDto.getIId());

                if (aLieferantDto[i].getLieferartIId() != null) {
                    anfrageDto.setLieferartIId(aLieferantDto[i].getLieferartIId());
                }
                if (aLieferantDto[i].getZahlungszielIId() != null) {
                    anfrageDto.setZahlungszielIId(aLieferantDto[i].getZahlungszielIId());
                }
                if (aLieferantDto[i].getIdSpediteur() != null) {
                    anfrageDto.setSpediteurIId(aLieferantDto[i].getIdSpediteur());
                }

                iIdLetzteErzeugteAnfrage = getAnfrageFac().createAnfrage(anfrageDto, theClientDto);

                bereitserzeugteAnfragen.add(iIdLetzteErzeugteAnfrage);

                for (int j = 0; j < aAnfragepositionDto.length; j++) {
                    AnfragepositionDto anfragepositionDto = (AnfragepositionDto) aAnfragepositionDto[j].clone();
                    anfragepositionDto.setBelegIId(iIdLetzteErzeugteAnfrage);

                    if (anfragepositionDto.getNRichtpreis() != null && !liefergruppenanfrageDto.getWaehrungCNr()
                            .equals(aLieferantDto[i].getWaehrungCNr())) {
                        anfragepositionDto.setNRichtpreis(anfragepositionDto.getNRichtpreis().multiply(
                                new BigDecimal(anfrageDto.getFWechselkursmandantwaehrungzubelegwaehrung())));
                    }

                    getAnfragepositionFac().createAnfrageposition(anfragepositionDto, theClientDto);
                }
            }

            // den Status der Liefergruppenanfrage auf Erledigt setzen
            liefergruppenanfrageDto.setStatusCNr(AnfrageServiceFac.ANFRAGESTATUS_ERLEDIGT);
            getAnfrageFac().setzeAnfragestatus(AnfrageServiceFac.ANFRAGESTATUS_ERLEDIGT,
                    liefergruppenanfrageDto.getIId(), theClientDto);
        }

        return bereitserzeugteAnfragen;
    }

    public ArrayList<Integer> getAngelegteAnfragenNachUmwandlungDerLiefergruppenanfragen(Integer liefergruppeIId,
            TheClientDto theClientDto) {
        Session session = null;
        ArrayList<Integer> alErzeugteAnfragen = new ArrayList<Integer>();
        try {
            SessionFactory factory = FLRSessionFactory.getFactory();
            session = factory.openSession();
            Criteria c = session.createCriteria(FLRAnfrage.class);
            // Filter auf Mandant
            c.add(Restrictions.eq(AnfrageFac.FLR_ANFRAGE_MANDANT_C_NR, theClientDto.getMandant()));
            c.add(Restrictions.eq(AnfrageFac.FLR_ANFRAGE_ANFRAGEART_C_NR,
                    AnfrageServiceFac.ANFRAGEART_LIEFERGRUPPE));

            if (liefergruppeIId != null) {
                c.add(Restrictions.eq(AnfrageFac.FLR_ANFRAGE_LFLIEFERGRUPPE_I_ID, liefergruppeIId));
            }

            // Filter nach Status: nur angelegte
            c.add(Restrictions.or(
                    Restrictions.eq(AnfrageFac.FLR_ANFRAGE_ANFRAGESTATUS_C_NR,
                            AnfrageServiceFac.ANFRAGESTATUS_ANGELEGT),
                    Restrictions.eq(AnfrageFac.FLR_ANFRAGE_ANFRAGESTATUS_C_NR,
                            AnfrageServiceFac.ANFRAGESTATUS_OFFEN)));
            // nach RE-Nummer sortieren
            c.addOrder(Order.asc("c_nr"));
            // Query ausfuehren
            List<?> list = c.list();

            for (Iterator<?> iter = list.iterator(); iter.hasNext();) {
                FLRAnfrage item = (FLRAnfrage) iter.next();
                alErzeugteAnfragen = getAnfrageFac().erzeugeAnfragenAusLiefergruppenanfrage(item.getI_id(),
                        alErzeugteAnfragen, theClientDto);
            }
        } finally {
            if (session != null) {
                session.close();
            }

        }
        if (liefergruppeIId != null) {
            return alErzeugteAnfragen;
        }

        ArrayList<Integer> a = new ArrayList<Integer>();
        try {
            SessionFactory factory = FLRSessionFactory.getFactory();
            session = factory.openSession();
            Criteria c = session.createCriteria(FLRAnfrage.class);
            // Filter auf Mandant
            c.add(Restrictions.eq(AnfrageFac.FLR_ANFRAGE_MANDANT_C_NR, theClientDto.getMandant()));
            c.add(Restrictions.eq(AnfrageFac.FLR_ANFRAGE_ANFRAGEART_C_NR, AnfrageServiceFac.ANFRAGEART_LIEFERANT));

            // Filter nach Status: nur angelegte
            c.add(Restrictions.eq(AnfrageFac.FLR_ANFRAGE_ANFRAGESTATUS_C_NR,
                    AnfrageServiceFac.ANFRAGESTATUS_ANGELEGT));
            // nach RE-Nummer sortieren
            c.addOrder(Order.asc("c_nr"));
            // Query ausfuehren
            List<?> list = c.list();
            for (Iterator<?> iter = list.iterator(); iter.hasNext();) {
                FLRAnfrage item = (FLRAnfrage) iter.next();
                a.add(item.getI_id());
            }
        } finally {
            if (session != null) {
                session.close();
            }
        }

        return a;
    }

    /**
     * Nach Kriterien, die der Benutzer bestimmt hat, Anfragen aus einem
     * existierenden Bestellvorschlag erzeugen.
     * 
     * @param bestellvorschlagUeberleitungKriterienDtoI
     *            die Kriterien des Benutzers
     * @param theClientDto
     *            der aktuelle Benutzer
     * @throws EJBExceptionLP
     *             Ausnahme
     */
    public void erzeugeAnfragenAusBestellvorschlag(
            BestellvorschlagUeberleitungKriterienDto bestellvorschlagUeberleitungKriterienDtoI,
            TheClientDto theClientDto) throws EJBExceptionLP {

        if (bestellvorschlagUeberleitungKriterienDtoI == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PARAMETER_IS_NULL,
                    new Exception("bestellvorschlagUeberleitungKriterienDtoI == null"));
        }

        try {
            // alle Bestellvorschlaege entsprechend den Kriterien des Benutzers
            // holen,
            // sortiert wird nach Lieferanten und innerhalb der Lieferanten nach
            // Artikel.c_nr
            BestellvorschlagDto[] aBestellvorschlagDto = getListeBestellvorschlaege(
                    bestellvorschlagUeberleitungKriterienDtoI, theClientDto);

            LieferantDto lieferantDto = null;
            Timestamp tLiefertermin = null;
            int iIndexAbarbeitung = -1; // Index der Position aus der Liste der
            // Bestellvorschlaege, die bearbeitet
            // werden
            int iSortPosition = 1; // iSort der Positionen, die zu einer Anfrage
            // angelegt werden

            // pro Lieferant wird eine Anfrage erstellt
            if (aBestellvorschlagDto != null && aBestellvorschlagDto.length > 0) {
                iIndexAbarbeitung++;

                while (iIndexAbarbeitung < aBestellvorschlagDto.length) {
                    lieferantDto = getLieferantFac().lieferantFindByPrimaryKey(
                            aBestellvorschlagDto[iIndexAbarbeitung].getILieferantId(), theClientDto);

                    tLiefertermin = aBestellvorschlagDto[iIndexAbarbeitung].getTLiefertermin();

                    // Anfragekopf erstellen
                    AnfrageDto anfrageDto = new AnfrageDto();
                    anfrageDto.setMandantCNr(theClientDto.getMandant());
                    anfrageDto.setArtCNr(AnfrageServiceFac.ANFRAGEART_LIEFERANT);
                    anfrageDto.setStatusCNr(AnfrageServiceFac.ANFRAGESTATUS_ANGELEGT);
                    anfrageDto.setBelegartCNr(LocaleFac.BELEGART_ANFRAGE);
                    anfrageDto.setTBelegdatum(new Timestamp(System.currentTimeMillis()));
                    anfrageDto.setLieferantIIdAnfrageadresse(lieferantDto.getIId());
                    // ansprechpartner, liefergruppe, cbez, angebotnummer null
                    anfrageDto.setTAnliefertermin(tLiefertermin);
                    anfrageDto.setWaehrungCNr(lieferantDto.getWaehrungCNr());
                    anfrageDto.setFWechselkursmandantwaehrungzubelegwaehrung(
                            new Double(getLocaleFac().getWechselkurs2(theClientDto.getSMandantenwaehrung(),
                                    lieferantDto.getWaehrungCNr(), theClientDto).doubleValue()));
                    anfrageDto.setKostenstelleIId(bestellvorschlagUeberleitungKriterienDtoI.getKostenstelleIId());
                    anfrageDto.setFAllgemeinerRabattsatz(
                            lieferantDto.getNRabatt() == null ? new Double(0) : lieferantDto.getNRabatt());
                    anfrageDto.setLieferartIId(lieferantDto.getLieferartIId());
                    anfrageDto.setZahlungszielIId(lieferantDto.getZahlungszielIId());
                    anfrageDto.setSpediteurIId(lieferantDto.getIdSpediteur());
                    // anfragewert wird berechnet
                    anfrageDto.setNTransportkosteninanfragewaehrung(new BigDecimal(0));
                    // speziell in der Anfrage werden Kopf- und Fusstext besetzt
                    anfrageDto.setBelegtextIIdKopftext(getAnfrageServiceFac().anfragetextFindByMandantLocaleCNr(
                            lieferantDto.getPartnerDto().getLocaleCNrKommunikation(), MediaFac.MEDIAART_KOPFTEXT,
                            theClientDto).getIId());
                    anfrageDto.setBelegtextIIdFusstext(getAnfrageServiceFac().anfragetextFindByMandantLocaleCNr(
                            lieferantDto.getPartnerDto().getLocaleCNrKommunikation(), MediaFac.MEDIAART_FUSSTEXT,
                            theClientDto).getIId());
                    // die restlichen Felder sind alle null

                    anfrageDto.setIId(getAnfrageFac().createAnfrage(anfrageDto, theClientDto));

                    // Flag bestimmen, das festlegt, ob die aktuelle Position
                    // noch zu dieser Anfrage gehoert
                    boolean bPositionGehoertZuDieserAnfrage = true;

                    while (bPositionGehoertZuDieserAnfrage) {
                        if (bestellvorschlagUeberleitungKriterienDtoI.getBBelegprolieferantprotermin()) {
                            // in diesem Fall wird fuer jeden Lieferanten eine
                            // Anfrage pro Liefertermin erzeugt
                            if (iIndexAbarbeitung < aBestellvorschlagDto.length
                                    && lieferantDto.getIId()
                                            .equals(aBestellvorschlagDto[iIndexAbarbeitung].getILieferantId())
                                    && tLiefertermin
                                            .equals(aBestellvorschlagDto[iIndexAbarbeitung].getTLiefertermin())) {
                                bPositionGehoertZuDieserAnfrage = true;
                            } else {
                                bPositionGehoertZuDieserAnfrage = false;
                            }
                        } else {
                            // in den restlichen Faellen wird genau eine Anfrage
                            // fuer jeden Lieferanten erzeugt
                            if (iIndexAbarbeitung < aBestellvorschlagDto.length && lieferantDto.getIId()
                                    .equals(aBestellvorschlagDto[iIndexAbarbeitung].getILieferantId())) {
                                bPositionGehoertZuDieserAnfrage = true;
                            } else {
                                bPositionGehoertZuDieserAnfrage = false;
                            }
                        }

                        // alle Positionen zur Anfrage an einen Lieferanten
                        // werden hier erfasst
                        if (bPositionGehoertZuDieserAnfrage) {
                            // jetzt die Positionen der Anfrage erstellen
                            ArtikelDto artikelDto = getArtikelFac().artikelFindByPrimaryKey(
                                    aBestellvorschlagDto[iIndexAbarbeitung].getIArtikelId(), theClientDto);

                            AnfragepositionDto anfragepositionDto = new AnfragepositionDto();
                            anfragepositionDto.setBelegIId(anfrageDto.getIId());
                            anfragepositionDto.setISort(new Integer(iSortPosition));
                            anfragepositionDto.setPositionsartCNr(AnfrageServiceFac.ANFRAGEPOSITIONART_IDENT);
                            anfragepositionDto.setArtikelIId(artikelDto.getIId());
                            anfragepositionDto.setBArtikelbezeichnunguebersteuert(new Short((short) 0));
                            anfragepositionDto
                                    .setNMenge(aBestellvorschlagDto[iIndexAbarbeitung].getNZubestellendeMenge());
                            anfragepositionDto.setEinheitCNr(artikelDto.getEinheitCNr());
                            if (bestellvorschlagUeberleitungKriterienDtoI.getBRichtpreisUebernehmen()) {
                                anfragepositionDto.setNRichtpreis(
                                        aBestellvorschlagDto[iIndexAbarbeitung].getNNettogesamtpreis());
                            } else {
                                anfragepositionDto.setNRichtpreis(new BigDecimal(0));
                            }
                            getAnfragepositionFac().createAnfrageposition(anfragepositionDto, theClientDto);

                            iIndexAbarbeitung++;
                            iSortPosition++;
                        }
                    }

                    iSortPosition = 1; // zuruecksetzen fuer die naechste
                    // Anfrage
                }
            }
            for (int i = 0; i < aBestellvorschlagDto.length; i++) {
                getBestellvorschlagFac().removeBestellvorschlag(aBestellvorschlagDto[i]);
            }
        } catch (Throwable e) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_ANLEGEN, new Exception(e));
        }
    }

    /**
     * Die Liste der Bestellvorschlaege holen, die den Kriterien des Benutzers
     * entsprechen.
     * 
     * @param kritDtoI
     *            die Kriterien des Benutzers
     * @param theClientDto
     *            der aktuelle Benutzer
     * @return BestellvorschlagDto[] die Bestellvorschlaege
     * @throws EJBExceptionLP
     *             Ausnahme
     */
    private BestellvorschlagDto[] getListeBestellvorschlaege(BestellvorschlagUeberleitungKriterienDto kritDtoI,
            TheClientDto theClientDto) throws EJBExceptionLP {

        BestellvorschlagDto[] aBestellvorschlagDto = null;

        Session session = null;

        try {
            SessionFactory factory = FLRSessionFactory.getFactory();
            session = factory.openSession();

            // Criteria duerfen keine Texts oder Blobs enthalten!

            // Criteria anlegen fuer flrbestellvorschlag
            Criteria crit = session.createCriteria(FLRBestellvorschlag.class);
            Criteria critArtikel = crit.createCriteria("flrartikel"); // UW->JE
            // Konstante

            // Einschraenken nach Mandant
            crit.add(Restrictions.eq("mandant_c_nr", theClientDto.getMandant()));

            // der Lieferant muss gesetzt sein
            crit.add(Restrictions.isNotNull("lieferant_i_id"));

            if (kritDtoI.getBBelegeinlieferant()) {
                // alle Bestellvorschlaege zu einem bestimmten Lieferanten
                crit.add(Restrictions.eq("lieferant_i_id", kritDtoI.getBelegeinlieferantLieferantIId())); // UW->JE
                // Kosntante

                critArtikel.addOrder(Property.forName("c_nr").asc());
            } else if (kritDtoI.getBBelegeinlieferanteintermin()) {
                // alle Bestellvorschlaege zu einem bestimmten Lieferanten und
                // einem bestimmten Termin
                crit.add(Restrictions.eq("lieferant_i_id", kritDtoI.getBelegeinlieferanteinterminLieferantIId())); // UW->JE
                // Konstante
                crit.add(Restrictions.eq(BestellvorschlagFac.FLR_BESTELLVORSCHLAG_T_LIEFERTERMIN,
                        kritDtoI.getTBelegeinlieferanteinterminTermin())); // UW
                // -
                // >
                // JE
                // Konstante

                critArtikel.addOrder(Property.forName("c_nr").asc());
            } else if (kritDtoI.getBBelegprolieferant()) {
                // fuer jeden Lieferanten alle seine Bestellvorschlaege
                crit.addOrder(Property.forName("lieferant_i_id").asc()); // UW->JE
                // Konstante
                critArtikel.addOrder(Property.forName("c_nr").asc());
            } else if (kritDtoI.getBBelegprolieferantprotermin()) {
                // fuer jeden Lieferanten alle seine Bestellvorschlaege zu einem
                // bestimmten Termin
                crit.addOrder(Property.forName("lieferant_i_id").asc()); // UW->JE
                // Konstante
                crit.addOrder(Property.forName(BestellvorschlagFac.FLR_BESTELLVORSCHLAG_T_LIEFERTERMIN).asc()); // UW->JE Konstante
                critArtikel.addOrder(Property.forName("c_nr").asc());
            }

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

            aBestellvorschlagDto = new BestellvorschlagDto[list.size()];
            int iIndex = 0;
            Iterator<?> it = list.iterator();
            BestellvorschlagDto bestellvorschlagDto = null;

            while (it.hasNext()) {
                FLRBestellvorschlag flrbestellvorschlag = (FLRBestellvorschlag) it.next();

                bestellvorschlagDto = new BestellvorschlagDto();

                bestellvorschlagDto.setIId(flrbestellvorschlag.getI_id());
                bestellvorschlagDto.setCMandantCNr(flrbestellvorschlag.getMandant_c_nr());
                bestellvorschlagDto.setIArtikelId(flrbestellvorschlag.getArtikel_i_id());
                bestellvorschlagDto.setNZubestellendeMenge(flrbestellvorschlag.getN_zubestellendemenge());
                bestellvorschlagDto.setTLiefertermin((Timestamp) flrbestellvorschlag.getT_liefertermin());
                bestellvorschlagDto.setCBelegartCNr(flrbestellvorschlag.getBelegart_c_nr());
                bestellvorschlagDto.setIBelegartId(flrbestellvorschlag.getI_belegartid());
                bestellvorschlagDto.setILieferantId(flrbestellvorschlag.getLieferant_i_id());
                bestellvorschlagDto.setNNettoeinzelpreis(flrbestellvorschlag.getN_nettoeinzelpreis());
                // bestellvorschlagDto.setDRabattsatz(flrbestellvorschlag.
                // getFRabattsatz()); UW->JE
                bestellvorschlagDto.setNRabattbetrag(flrbestellvorschlag.getN_rabattbetrag());

                bestellvorschlagDto.setNNettogesamtpreis(flrbestellvorschlag.getN_nettogesamtpreis());

                aBestellvorschlagDto[iIndex] = bestellvorschlagDto;
                iIndex++;
            }
        } catch (Throwable t) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FLR, new Exception(t));
        } finally {
            try {
                session.close();
            } catch (HibernateException he) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_HIBERNATE, he);
            }
        }

        return aBestellvorschlagDto;
    }

    public void setzeVersandzeitpunktAufJetzt(Integer anfrageIId, String druckart) {
        if (anfrageIId != null) {
            Anfrage anfrage = em.find(Anfrage.class, anfrageIId);
            anfrage.setTVersandzeitpunkt(new Timestamp(System.currentTimeMillis()));
            anfrage.setCVersandtype(druckart);
            em.merge(anfrage);
            em.flush();
        }

    }

    @Override
    public void aktiviereBelegControlled(Integer iid, Timestamp t, TheClientDto theClientDto)
            throws EJBExceptionLP, RemoteException {
        new BelegAktivierungController(this).aktiviereBelegControlled(iid, t, theClientDto);
    }

    @Override
    public Timestamp berechneBelegControlled(Integer iid, TheClientDto theClientDto)
            throws EJBExceptionLP, RemoteException {
        return new BelegAktivierungController(this).berechneBelegControlled(iid, theClientDto);
    }

    @Override
    public boolean hatAenderungenNach(Integer iid, Timestamp t) throws EJBExceptionLP, RemoteException {
        Anfrage anfrage = em.find(Anfrage.class, iid);
        if (anfrage.getTAendern() != null && anfrage.getTAendern().after(t))
            return true;
        if (anfrage.getTManuellerledigt() != null && anfrage.getTManuellerledigt().after(t))
            return true;
        if (anfrage.getTStorniert() != null && anfrage.getTStorniert().after(t))
            return true;
        return false;
    }

    public void updateTAendern(Integer iid, TheClientDto theClientDto) {
        Anfrage anfrage = em.find(Anfrage.class, iid);
        anfrage.setPersonalIIdAendern(theClientDto.getIDPersonal());
        anfrage.setTAendern(getTimestamp());
        em.merge(anfrage);
        em.flush();
    }
}