com.lp.server.artikel.ejbfac.ArtikelbestelltFacBean.java Source code

Java tutorial

Introduction

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

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

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.NonUniqueResultException;
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.Restrictions;

import com.lp.server.artikel.ejb.Artikelbestellt;
import com.lp.server.artikel.fastlanereader.generated.FLRArtikelbestellt;
import com.lp.server.artikel.service.ArtikelbestelltDto;
import com.lp.server.artikel.service.ArtikelbestelltDtoAssembler;
import com.lp.server.artikel.service.ArtikelbestelltFac;
import com.lp.server.bestellung.fastlanereader.generated.FLRBestellposition;
import com.lp.server.bestellung.fastlanereader.generated.FLRBestellpositionReport;
import com.lp.server.bestellung.service.BestellpositionDto;
import com.lp.server.bestellung.service.BestellpositionFac;
import com.lp.server.bestellung.service.BestellungDto;
import com.lp.server.bestellung.service.BestellungFac;
import com.lp.server.system.pkgenerator.PKConst;
import com.lp.server.system.pkgenerator.bl.PKGeneratorObj;
import com.lp.server.system.service.LocaleFac;
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;

@Stateless
public class ArtikelbestelltFacBean extends Facade implements ArtikelbestelltFac {
    @PersistenceContext
    private EntityManager em;

    public void createArtikelbestellt(ArtikelbestelltDto artikelbestelltDto) throws EJBExceptionLP {
        myLogger.entry();
        if (artikelbestelltDto == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_DTO_IS_NULL,
                    new Exception("artikelbestelltDto == null"));
        }
        if (artikelbestelltDto.getNMenge() == null || artikelbestelltDto.getCBelegartnr() == null
                || artikelbestelltDto.getIBelegartpositionid() == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FELD_IN_DTO_IS_NULL, new Exception(
                    "artikelbestelltDto.getNMenge() == null || artikelbestelltDto.getBelegartCNr() == null || artikelbestelltDto.getBelegartpositionIId() == null"));
        }
        if (artikelbestelltDto.getNMenge().doubleValue() <= 0) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_MUSS_GROESSER_0_SEIN,
                    new Exception("artikelbestelltDto.getNMenge().doubleValue() <= 0"));
        }
        try {
            Query query = em.createNamedQuery("ArtikelreservierungfindByBelegartCNrIBelegartpositionid");
            query.setParameter(1, artikelbestelltDto.getCBelegartnr());
            query.setParameter(2, artikelbestelltDto.getIBelegartpositionid());
            Artikelbestellt doppelt = (Artikelbestellt) query.getSingleResult();
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_DUPLICATE_UNIQUE,
                    new Exception("WW_ARTIKELBESTELLT.UK"));
        } catch (NoResultException ex) {

        }
        try {
            PKGeneratorObj pkGen = new PKGeneratorObj(); // PKGEN
            Integer pk = pkGen.getNextPrimaryKey(PKConst.PK_ARTIKELBESTELLT);
            artikelbestelltDto.setIId(pk);

            Artikelbestellt artikelreservierung = new Artikelbestellt(artikelbestelltDto.getIId(),
                    artikelbestelltDto.getCBelegartnr(), artikelbestelltDto.getIBelegartpositionid(),
                    artikelbestelltDto.getArtikelIId(), artikelbestelltDto.getTLiefertermin(),
                    artikelbestelltDto.getNMenge());
            em.persist(artikelreservierung);
            em.flush();
        } catch (EntityExistsException e) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_ANLEGEN, e);
        }
    }

    public void removeArtikelbestellt(String belegartCNr, Integer belegartpositionIId) throws EJBExceptionLP {
        myLogger.entry();
        if (belegartCNr == null || belegartpositionIId == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PKFIELD_IS_NULL,
                    new Exception("belegartCNr == null || belegartpositionIId == null"));
        }

        // try {
        Query query = em.createNamedQuery("ArtikelbestelltfindByBelegartCNrIBelegartpositionid");
        query.setParameter(1, belegartCNr);
        query.setParameter(2, belegartpositionIId);
        Artikelbestellt artikelbestellt = (Artikelbestellt) query.getSingleResult();
        if (artikelbestellt == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND,
                    "Fehler bei removeArtikelbestellt. Es gibt keinen Eintrag f\u00FCr Belegart " + belegartCNr
                            + " und Positioniid " + belegartpositionIId);
        }
        try {
            em.remove(artikelbestellt);
            em.flush();
        } catch (EntityExistsException ex) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, ex);
        }
        // }
        // catch (FinderException e) {
        // throw new EJBExceptionLP(EJBExceptionLP.
        // FEHLER_BEI_FIND,
        // e);
        // }

    }

    public void updateArtikelbestellt(ArtikelbestelltDto artikelbestelltDto) throws EJBExceptionLP {
        myLogger.entry();
        if (artikelbestelltDto == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_DTO_IS_NULL,
                    new Exception("artikelbestelltDto == null"));

        }
        if (artikelbestelltDto.getIId() == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PKFIELD_IS_NULL,
                    new Exception("artikelbestelltDto.getIId() == null"));

        }
        if (artikelbestelltDto.getIBelegartpositionid() == null || artikelbestelltDto.getCBelegartnr() == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FELD_DARF_NICHT_NULL_SEIN, new Exception(
                    "artikelbestelltDto.getBelegartpositionIId() == null || artikelbestelltDto.getBelegartCNr() == null"));

        }
        // JO 23.3.06 wenn negativ, dann Ueberlieferung um die Menge
        // if (artikelbestelltDto.getNMenge() == null) {
        // throw new EJBExceptionLP(EJBExceptionLP.
        // FEHLER_FELD_IN_DTO_IS_NULL,
        // new Exception(
        // "artikelbestelltDto.getFMenge() == null"));
        // }
        // if (artikelbestelltDto.getNMenge().doubleValue() <= 0) {
        // throw new EJBExceptionLP(EJBExceptionLP.
        // FEHLER_MUSS_GROESSER_0_SEIN,
        // new Exception(
        // "artikelbestelltDto.getFMenge().doubleValue() <= 0"));
        // }

        // try {
        Artikelbestellt artikelbestellt = em.find(Artikelbestellt.class, artikelbestelltDto.getIId());
        if (artikelbestellt == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                    "FEhler bei updateArtikelbestellt. Es gibt keine iid " + artikelbestelltDto.getIId()
                            + "\nartikelbestelltDto.toString: " + artikelbestelltDto.toString());
        }

        // JO: 23.3.06
        artikelbestellt.setNMenge(artikelbestelltDto.getNMenge().doubleValue() < 0 ? new BigDecimal(0)
                : artikelbestelltDto.getNMenge());

        artikelbestellt.setArtikelIId(artikelbestelltDto.getArtikelIId());
        artikelbestellt.setTLiefertermin(artikelbestelltDto.getTLiefertermin());
        artikelbestellt.setCBelegartnr(artikelbestelltDto.getCBelegartnr());
        artikelbestellt.setIBelegartpositionid(artikelbestelltDto.getIBelegartpositionid());
        // }
        // catch (FinderException e) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
        // e);
        // }
        em.merge(artikelbestellt);
        em.flush();

    }

    public void updateArtikelbestelltRelativ(ArtikelbestelltDto artikelbestelltDto) throws EJBExceptionLP {
        myLogger.entry();
        if (artikelbestelltDto == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_DTO_IS_NULL,
                    new Exception("artikelbestelltDto == null"));

        }
        if (artikelbestelltDto.getIId() == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PKFIELD_IS_NULL,
                    new Exception("artikelbestelltDto.getIId() == null"));

        }
        if (artikelbestelltDto.getIBelegartpositionid() == null || artikelbestelltDto.getCBelegartnr() == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FELD_DARF_NICHT_NULL_SEIN, new Exception(
                    "artikelbestelltDto.getBelegartpositionIId() == null || artikelbestelltDto.getBelegartCNr() == null"));

        }
        if (artikelbestelltDto.getTLiefertermin() == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FELD_DARF_NICHT_NULL_SEIN,
                    new Exception("artikelbestelltDto.getDLiefertermin() == null"));

        }
        if (artikelbestelltDto.getArtikelIId() == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FELD_DARF_NICHT_NULL_SEIN,
                    new Exception("auftragreservierungDto.getArtikelIId() == null"));

        }
        if (artikelbestelltDto.getNMenge() == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FELD_IN_DTO_IS_NULL,
                    new Exception("artikelbestelltDto.getNMenge() == null"));
        }

        // try {
        Artikelbestellt artikelbestellt = em.find(Artikelbestellt.class, artikelbestelltDto.getIId());
        if (artikelbestellt == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                    "Fehler bei updateArtikelbestelltRelativ. Es gibt keine iid " + artikelbestelltDto.getIId()
                            + "\nartikelbestelltDto.toString: " + artikelbestelltDto.toString());
        }
        /** Alter Wert + neuer Relativer Wert = neuer Wert */
        BigDecimal valueNeu = artikelbestellt.getNMenge().add(artikelbestelltDto.getNMenge());

        artikelbestellt.setNMenge(valueNeu);
        artikelbestellt.setArtikelIId(artikelbestelltDto.getArtikelIId());
        artikelbestellt.setTLiefertermin(artikelbestelltDto.getTLiefertermin());
        artikelbestellt.setCBelegartnr(artikelbestelltDto.getCBelegartnr());
        artikelbestellt.setIBelegartpositionid(artikelbestelltDto.getIBelegartpositionid());
        // }
        // catch (FinderException e) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
        // e);
        // }

    }

    public ArtikelbestelltDto artikelbestelltFindByPrimaryKey(Integer iId) throws EJBExceptionLP {
        myLogger.entry();
        if (iId == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_PKFIELD_IS_NULL, new Exception("iId == null"));
        }
        // try {
        Artikelbestellt artikelbestellt = em.find(Artikelbestellt.class, iId);
        if (artikelbestellt == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                    "Fehler bei ArtikelbestelltFindByPrimaryKey. Es gibt keine iid " + iId);
        }
        return assembleArtikelbestelltDto(artikelbestellt);
        // }
        // catch (FinderException e) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
        // e);
        // }
    }

    public ArtikelbestelltDto artikelbestelltFindByBelegartCNrBelegartPositionIId(String belegartCNr,
            Integer belegartpositionIId) throws EJBExceptionLP {
        myLogger.entry();
        if (belegartpositionIId == null || belegartCNr == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FELD_DARF_NICHT_NULL_SEIN,
                    new Exception("belegartpositionIId == null || belegartCNr == null"));
        }
        try {
            Query query = em.createNamedQuery("ArtikelbestelltfindByBelegartCNrIBelegartpositionid");
            query.setParameter(1, belegartCNr);
            query.setParameter(2, belegartpositionIId);
            Artikelbestellt artikelbestellt = (Artikelbestellt) query.getSingleResult();
            return assembleArtikelbestelltDto(artikelbestellt);
        } catch (NoResultException e) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND, e);
        } catch (NonUniqueResultException e1) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_NO_UNIQUE_RESULT,
                    "Fehler bei artikelbestelltFindByBelegartCNrBelegartPositioniid. Es gab mehr als ein Ergebnis f\u00FCr Belegart "
                            + belegartCNr + " und BelegpositionIId " + belegartpositionIId);
        }
    }

    public ArtikelbestelltDto artikelbestelltFindByBelegartCNrBelegartPositionIIdOhneExc(String belegartCNr,
            Integer belegartpositionIId) throws EJBExceptionLP {
        ArtikelbestelltDto artikelbestelltDto = null;
        if (belegartpositionIId == null || belegartCNr == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FELD_DARF_NICHT_NULL_SEIN,
                    new Exception("belegartpositionIId == null || belegartCNr == null"));
        }
        try {
            Query query = em.createNamedQuery("ArtikelbestelltfindByBelegartCNrIBelegartpositionid");
            query.setParameter(1, belegartCNr);
            query.setParameter(2, belegartpositionIId);
            Artikelbestellt artikelbestellt = (Artikelbestellt) query.getSingleResult();
            if (artikelbestellt == null) {
                return null;
            }
            // @todo getSingleResult oder getResultList ?
            artikelbestelltDto = assembleArtikelbestelltDto(artikelbestellt);
            // }
            // catch (javax.ejb.ObjectNotFoundException e) {
            // // nothing here
        } catch (NoResultException e) {

        }
        return artikelbestelltDto;
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public BigDecimal getAnzahlBestellt(Integer artikelIId) throws EJBExceptionLP {
        myLogger.entry();
        if (artikelIId == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_DTO_IS_NULL, new Exception("artikelIId == null"));
        }
        // try {
        Query query = em.createNamedQuery("ArtikelbestelltfindByArtikelIId");
        query.setParameter(1, artikelIId);
        Collection<?> allAuftragreservierungen = query.getResultList();
        // if (allAuftragreservierungen.isEmpty()) {
        // throw new EJBExceptionLP(EJBExceptionLP.
        // FEHLER_BEI_FIND, null);
        // }
        Iterator<?> iter = allAuftragreservierungen.iterator();
        BigDecimal f = new BigDecimal(0);
        while (iter.hasNext()) {
            Artikelbestellt artikelbestelltTemp = (Artikelbestellt) iter.next();

            if (artikelbestelltTemp.getNMenge() != null) {
                f = f.add(artikelbestelltTemp.getNMenge());
            }
        }

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

    }

    private void setArtikelbestelltFromArtikelbestelltDto(Artikelbestellt artikelbestellt,
            ArtikelbestelltDto artikelbestelltDto) {
        artikelbestellt.setCBelegartnr(artikelbestelltDto.getCBelegartnr());
        artikelbestellt.setIBelegartpositionid(artikelbestelltDto.getIBelegartpositionid());
        artikelbestellt.setArtikelIId(artikelbestelltDto.getArtikelIId());
        artikelbestellt.setTLiefertermin(artikelbestelltDto.getTLiefertermin());
        artikelbestellt.setNMenge(artikelbestelltDto.getNMenge());
        em.merge(artikelbestellt);
        em.flush();
    }

    private ArtikelbestelltDto assembleArtikelbestelltDto(Artikelbestellt artikelbestellt) {
        return ArtikelbestelltDtoAssembler.createDto(artikelbestellt);
    }

    private ArtikelbestelltDto[] assembleArtikelbestelltDtos(Collection<?> artikelbestellts) {
        List<ArtikelbestelltDto> list = new ArrayList<ArtikelbestelltDto>();
        if (artikelbestellts != null) {
            Iterator<?> iterator = artikelbestellts.iterator();
            while (iterator.hasNext()) {
                Artikelbestellt artikelbestellt = (Artikelbestellt) iterator.next();
                list.add(assembleArtikelbestelltDto(artikelbestellt));
            }
        }
        ArtikelbestelltDto[] returnArray = new ArtikelbestelltDto[list.size()];
        return (ArtikelbestelltDto[]) list.toArray(returnArray);
    }

    public void aktualisiereBestelltListe(Integer bestellpositionIId, TheClientDto theClientDto)
            throws EJBExceptionLP {
        try {
            // Den eventuell schon vorhandenen Eintrag in der Bestelltliste
            // suchen.
            ArtikelbestelltDto aBestelltDto = artikelbestelltFindByBelegartCNrBelegartPositionIIdOhneExc(
                    LocaleFac.BELEGART_BESTELLUNG, bestellpositionIId);
            // die Bestellposition holen
            BestellpositionDto bestposDto = getBestellpositionFac()
                    .bestellpositionFindByPrimaryKeyOhneExc(bestellpositionIId);
            if (bestposDto == null
                    || !bestposDto.getPositionsartCNr().equals(BestellpositionFac.BESTELLPOSITIONART_IDENT)) {
                // es gibt keine Bestellposition mit dieser ID oder die
                // Bestellposition ist kein Artikel
                if (aBestelltDto != null) {
                    // den Bestellteintrag loeschen.
                    removeArtikelbestellt(LocaleFac.BELEGART_BESTELLUNG, bestellpositionIId);
                }
            } else {
                // Auch der Status und die Art der Bestellung sind wichtig.
                BestellungDto bsDto = getBestellungFac().bestellungFindByPrimaryKey(bestposDto.getBestellungIId());
                boolean bRahmenbestellung = bsDto.getBestellungartCNr()
                        .equals(BestellungFac.BESTELLUNGART_RAHMENBESTELLUNG_C_NR);
                boolean bBestellungStorniert = bsDto.getStatusCNr().equals(BestellungFac.BESTELLSTATUS_STORNIERT);
                boolean bBestellungErledigt = bsDto.getStatusCNr().equals(BestellungFac.BESTELLSTATUS_ERLEDIGT);
                boolean bBestellpositionErledigt = bestposDto.getBestellpositionstatusCNr()
                        .equals(BestellpositionFac.BESTELLPOSITIONSTATUS_ERLEDIGT);
                BigDecimal bdOffeneMenge = getBestellpositionFac().berechneOffeneMenge(bestposDto);
                boolean bEsIstNichtsMehrOffen = bdOffeneMenge.compareTo(new BigDecimal(0)) <= 0;
                // Kein Eintrag fuer Rahmenbest, stornierte oder erledigte,
                // sowie bereits vollstaendig gelieferte Positionen.
                if (bRahmenbestellung || bBestellungStorniert || bBestellungErledigt || bBestellpositionErledigt
                        || bEsIstNichtsMehrOffen) {
                    if (aBestelltDto != null) {
                        // den Bestellteintrag loeschen.
                        removeArtikelbestellt(LocaleFac.BELEGART_BESTELLUNG, bestellpositionIId);
                    }
                } else {
                    // es wird ein Eintrag benoetigt.
                    if (aBestelltDto == null) {
                        aBestelltDto = new ArtikelbestelltDto();
                    }
                    aBestelltDto.setArtikelIId(bestposDto.getArtikelIId());
                    aBestelltDto.setCBelegartnr(LocaleFac.BELEGART_BESTELLUNG);
                    aBestelltDto.setIBelegartpositionid(bestposDto.getIId());
                    // offene Menge neu berechnen
                    aBestelltDto.setNMenge(bdOffeneMenge);
                    // wenn liefertermin in Bestellvorschlag uebersteuert dann
                    // von dort sonst
                    // setzen des liefertermins der bestellung
                    if (bestposDto.getTUebersteuerterLiefertermin() != null) {
                        aBestelltDto.setTLiefertermin(bestposDto.getTUebersteuerterLiefertermin());
                    } else {
                        aBestelltDto.setTLiefertermin(new Timestamp(bsDto.getDLiefertermin().getTime()));
                    }
                    if (aBestelltDto.getIId() == null) {
                        // ein neuer -> anlegen
                        createArtikelbestellt(aBestelltDto);
                    } else {
                        // update
                        updateArtikelbestellt(aBestelltDto);
                    }
                }
            }
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
        }
    }

    /**
     * Bestelltliste pruefen. 1. Bestehende Eintraege. 2. Bestellungen pruefen,
     * ob die Bestelltwerte richtig eingetragen sind.
     * 
     * @param theClientDto der aktuelle Benutzer 
     */

    @TransactionAttribute(TransactionAttributeType.NEVER)
    public void pruefeBestelltliste(TheClientDto theClientDto) {
        Session session = FLRSessionFactory.getFactory().openSession();
        try {

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

            String hqlDelete = "delete FROM FLRArtikelbestellt";
            session.createQuery(hqlDelete).executeUpdate();

            session.close();

            // ------------------------------------------------------------------
            // ----
            // Alle Eintraege in den Bestellungen pruefen
            // ------------------------------------------------------------------
            // ----

            session = FLRSessionFactory.getFactory().openSession();
            org.hibernate.Criteria besPos = session.createCriteria(FLRBestellposition.class);
            org.hibernate.Criteria best = besPos
                    .createCriteria(BestellpositionFac.FLR_BESTELLPOSITION_FLRBESTELLUNG);
            // Filter auf den Mandanten
            best.add(Restrictions.eq(BestellungFac.FLR_BESTELLUNG_MANDANT_C_NR, theClientDto.getMandant()));
            // keine Rahmenbestellungen.
            best.add(Restrictions.not(Restrictions.eq(BestellungFac.FLR_BESTELLUNG_BESTELLUNGART_C_NR,
                    BestellungFac.BESTELLUNGART_RAHMENBESTELLUNG_C_NR)));
            // keine stornierten und erledigten.
            Collection<String> cStati = new LinkedList<String>();
            cStati.add(BestellungFac.BESTELLSTATUS_STORNIERT);
            cStati.add(BestellungFac.BESTELLSTATUS_ERLEDIGT);
            best.add(Restrictions.not(Restrictions.in(BestellungFac.FLR_BESTELLUNG_BESTELLUNGSTATUS_C_NR, cStati)));
            // Query ausfuehren
            List<?> besposList = besPos.list();
            Iterator<?> besposListIterator = besposList.iterator();
            while (besposListIterator.hasNext()) {
                FLRBestellposition bespos = (FLRBestellposition) besposListIterator.next();
                if (bespos.getBestellpositionart_c_nr().equals(BestellpositionFac.BESTELLPOSITIONART_IDENT)
                        || bespos.getBestellpositionart_c_nr()
                                .equals(BestellpositionFac.BESTELLPOSITIONART_HANDEINGABE)) {
                    if (bespos.getBestellpositionstatus_c_nr() != null && (bespos.getBestellpositionstatus_c_nr()
                            .equals(BestellpositionFac.BESTELLPOSITIONSTATUS_OFFEN)
                            || bespos.getBestellpositionstatus_c_nr()
                                    .equals(BestellpositionFac.BESTELLPOSITIONSTATUS_BESTAETIGT)
                            || bespos.getBestellpositionstatus_c_nr()
                                    .equals(BestellpositionFac.BESTELLPOSITIONSTATUS_TEILGELIEFERT))) {

                        // nur fuer Artikel
                        if (bespos.getFlrartikel() != null) {
                            BigDecimal bdMenge = new BigDecimal(0);
                            if (bespos.getN_offenemenge() != null) {
                                bdMenge = bespos.getN_offenemenge();
                            } else {
                                bdMenge = bespos.getN_menge();
                            }
                            ArtikelbestelltDto artikelBestelltDto = new ArtikelbestelltDto();
                            artikelBestelltDto.setArtikelIId(bespos.getFlrartikel().getI_id());
                            artikelBestelltDto.setCBelegartnr(LocaleFac.BELEGART_BESTELLUNG);
                            artikelBestelltDto.setIBelegartpositionid(bespos.getI_id());
                            artikelBestelltDto.setNMenge(bdMenge);

                            if (bespos.getT_uebersteuerterliefertermin() != null) {
                                artikelBestelltDto.setTLiefertermin(
                                        new java.sql.Timestamp(bespos.getT_uebersteuerterliefertermin().getTime()));
                            } else {
                                artikelBestelltDto.setTLiefertermin(new java.sql.Timestamp(
                                        bespos.getFlrbestellung().getT_liefertermin().getTime()));
                            }

                            // anlegen, negative Mengen werden ignoriert
                            if (artikelBestelltDto.getNMenge().compareTo(new BigDecimal(0)) > 0) {
                                getArtikelbestelltFac().createArtikelbestellt(artikelBestelltDto);
                                myLogger.warn(theClientDto.getIDUser(),
                                        "Bestelltliste nachgetragen: " + artikelBestelltDto);
                            }
                        }

                    }
                }
                // Fuer allen anderen Stati darf es keine Reservierungen geben.
                else {
                    // Schaun, ob es eine Reservierung gibt
                    ArtikelbestelltDto artikelBestelltDto = artikelbestelltFindByBelegartCNrBelegartPositionIIdOhneExc(
                            LocaleFac.BELEGART_BESTELLUNG, bespos.getI_id());
                    // wenn ja, dann loeschen
                    if (artikelBestelltDto != null) {
                        Artikelbestellt toRemove = em.find(Artikelbestellt.class, artikelBestelltDto.getIId());
                        if (toRemove == null) {
                            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                                    "Fehler beo prufeBestelltliste. Artikelbestellt das Aufgrund von reservierung gel\u00F6scht werden soll konnte nicht gefunden werden. iid "
                                            + artikelBestelltDto.getIId());
                        }
                        try {
                            em.remove(toRemove);
                            em.flush();
                        } catch (EntityExistsException er) {
                            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, er);
                        }
                        myLogger.warn(theClientDto.getIDUser(),
                                "Bestellteintrag gel\u00F6scht: " + artikelBestelltDto);
                    }
                }
            }
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
        } finally {
            if (session != null) {
                session.close();
            }
        }

    }

    public Hashtable getAnzahlRahmenbestellt(Integer artikelIId, TheClientDto theClientDto) throws EJBExceptionLP {
        BigDecimal bdReserviert = new BigDecimal(0);
        Hashtable<String, Object> retHashtable = new Hashtable<String, Object>();
        String sBestellungCNr = null;
        Collection<String> aBestellungsCNr = new ArrayList<String>();
        Session session = null;
        try {
            SessionFactory factory = FLRSessionFactory.getFactory();
            session = factory.openSession();
            Criteria crit = session.createCriteria(FLRBestellpositionReport.class);
            Criteria critBestellung = crit.createCriteria(BestellpositionFac.FLR_BESTELLPOSITION_FLRBESTELLUNG);

            Criteria critArtikel = crit.createCriteria(BestellpositionFac.FLR_BESTELLPOSITION_FLRARTIKEL);
            // nur diesen Artikel
            critArtikel.add(Restrictions.eq("i_id", artikelIId));
            // Filter nach Mandant
            critBestellung
                    .add(Restrictions.eq(BestellungFac.FLR_BESTELLUNG_MANDANT_C_NR, theClientDto.getMandant()));
            // keine stornierten oder erledigten Bestellungen.
            Collection<String> cStati = new LinkedList<String>();
            cStati.add(BestellungFac.BESTELLSTATUS_STORNIERT);
            cStati.add(BestellungFac.BESTELLSTATUS_ERLEDIGT);
            critBestellung.add(
                    Restrictions.not(Restrictions.in(BestellungFac.FLR_BESTELLUNG_BESTELLUNGSTATUS_C_NR, cStati)));
            // Nur Rahmenbestellungen
            critBestellung.add(Restrictions.eq(BestellungFac.FLR_BESTELLUNG_BESTELLUNGART_C_NR,
                    BestellungFac.BESTELLUNGART_RAHMENBESTELLUNG_C_NR));
            // Query ausfuehren
            List<?> list = crit.list();
            FLRBestellpositionReport[] aResult = new FLRBestellpositionReport[list.size()];
            aResult = (FLRBestellpositionReport[]) list.toArray(aResult);
            for (int i = 0; i < aResult.length; i++) {
                // Rahmenbestellnr, Achtung nur einmal pro Positionen noetig.
                if (!aBestellungsCNr.contains(aResult[i].getFlrbestellung().getC_nr())) {
                    aBestellungsCNr.add(aResult[i].getFlrbestellung().getC_nr());
                }
                // negative Rahmenreservierungen bleiben unberuecksichtigt.
                if (aResult[i].getN_offenemenge() != null && aResult[i].getN_offenemenge().doubleValue() > 0) {
                    bdReserviert = bdReserviert.add(aResult[i].getN_offenemenge());
                }
            }

            if (bdReserviert != null) {
                retHashtable.put(ArtikelbestelltFac.KEY_RAHMENBESTELLT_ANZAHL, bdReserviert);
            }
            if (aBestellungsCNr.size() > 0) {
                retHashtable.put(ArtikelbestelltFac.KEY_RAHMENBESTELLT_BELEGCNR, aBestellungsCNr);
            }
        } finally {
            try {
                session.close();
            } catch (HibernateException he) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER, he);
            }
        }
        return retHashtable;
    }

    /**
     * getArtikelbestellt gibt eine List vom FLRArtikelbestellt zurueck. Achtung
     * casten notwendig.
     * 
     * @param artikelIId
     *            Integer
     * @param dVon
     *            Date
     * @param dBis
     *            Date
     * @return List
     * @throws EJBExceptionLP
     */
    public Collection<FLRArtikelbestellt> getArtikelbestellt(Integer artikelIId, java.sql.Date dVon,
            java.sql.Date dBis) throws EJBExceptionLP {

        List<FLRArtikelbestellt> aFLRArtikelbestellt = new ArrayList<FLRArtikelbestellt>();

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

        org.hibernate.Criteria bestelltliste = session.createCriteria(FLRArtikelbestellt.class);
        bestelltliste.createAlias(ArtikelbestelltFac.FLR_ARTIKELBESTELLT_FLRARTIKEL, "a")
                .add(Restrictions.eq("a.i_id", artikelIId));
        if (dVon != null) {
            bestelltliste.add(Restrictions.ge(ArtikelbestelltFac.FLR_ARTIKELBESTELLT_D_LIEFERTERMIN, dVon));
        }
        if (dBis != null) {
            bestelltliste.add(Restrictions.lt(ArtikelbestelltFac.FLR_ARTIKELBESTELLT_D_LIEFERTERMIN, dBis));
        }

        bestelltliste.addOrder(Order.asc(ArtikelbestelltFac.FLR_ARTIKELBESTELLT_D_LIEFERTERMIN));

        List<?> resultList = bestelltliste.list();
        Iterator<?> resultListIterator = resultList.iterator();
        while (resultListIterator.hasNext()) {
            FLRArtikelbestellt artikelbestellt = (FLRArtikelbestellt) resultListIterator.next();
            aFLRArtikelbestellt.add(artikelbestellt);
        }

        return aFLRArtikelbestellt;
    }

}