com.lp.server.bestellung.ejbfac.BSMahnwesenFacBean.java Source code

Java tutorial

Introduction

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

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

import javax.annotation.Resource;
import javax.ejb.SessionContext;
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.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;

import com.lp.server.bestellung.ejb.Bsmahnlauf;
import com.lp.server.bestellung.ejb.Bsmahnstufe;
import com.lp.server.bestellung.ejb.BsmahnstufePK;
import com.lp.server.bestellung.ejb.Bsmahntext;
import com.lp.server.bestellung.ejb.Bsmahnung;
import com.lp.server.bestellung.fastlanereader.generated.FLRBestellpositionReport;
import com.lp.server.bestellung.fastlanereader.generated.FLRMahngruppe;
import com.lp.server.bestellung.service.BSMahnlaufDto;
import com.lp.server.bestellung.service.BSMahnlaufDtoAssembler;
import com.lp.server.bestellung.service.BSMahnstufeDto;
import com.lp.server.bestellung.service.BSMahnstufeDtoAssembler;
import com.lp.server.bestellung.service.BSMahntextDto;
import com.lp.server.bestellung.service.BSMahntextDtoAssembler;
import com.lp.server.bestellung.service.BSMahnungDto;
import com.lp.server.bestellung.service.BSMahnungDtoAssembler;
import com.lp.server.bestellung.service.BSMahnwesenFac;
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.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 BSMahnwesenFacBean extends Facade implements BSMahnwesenFac {
    @PersistenceContext
    private EntityManager em;

    @Resource
    private SessionContext context;

    public BSMahnungDto createBSMahnung(BSMahnungDto bSMahnungDto, TheClientDto theClientDto)
            throws EJBExceptionLP {

        myLogger.entry();
        // precondition
        if (bSMahnungDto == null) {
            return null;
        }
        bSMahnungDto.setPersonalIIdAendern(theClientDto.getIDPersonal());
        bSMahnungDto.setPersonalIIdAnlegen(theClientDto.getIDPersonal());
        bSMahnungDto.setIId(getPKGeneratorObj().getNextPrimaryKey(PKConst.PK_BSMAHNUNG));

        try {
            Bsmahnung bSMahnung = new Bsmahnung(bSMahnungDto.getIId(), bSMahnungDto.getMandantCNr(),
                    bSMahnungDto.getMahnlaufIId(), bSMahnungDto.getMahnstufeIId(), bSMahnungDto.getBestellungIId(),
                    bSMahnungDto.getTMahndatum(), bSMahnungDto.getPersonalIIdAnlegen(),
                    bSMahnungDto.getPersonalIIdAendern(), bSMahnungDto.getBestellpositionIId());
            em.persist(bSMahnung);
            em.flush();
            Timestamp t = new Timestamp(System.currentTimeMillis());
            bSMahnungDto.setTAendern(t);
            bSMahnungDto.setTAnlegen(t);
            setBSMahnungFromBSMahnungDto(bSMahnung, bSMahnungDto);
            BestellungDto bestellungDto = getBestellungFac()
                    .bestellungFindByPrimaryKey(bSMahnungDto.getBestellungIId());
            bestellungDto.setIMahnstufeIId(bSMahnungDto.getMahnstufeIId());
            getBestellungFac().updateBestellungMahnstufe(bSMahnungDto.getBestellungIId(),
                    bSMahnungDto.getMahnstufeIId(), theClientDto);
        } catch (Exception e) {
            if (e instanceof EJBExceptionLP) {
                throw (EJBExceptionLP) e;
            } else {
                throw new EJBExceptionLP(e);
            }
        }
        return bSMahnungDto;
    }

    private void setBSMahnstufeInBestellung(Integer BestellungId, TheClientDto theClientDto)
            throws EJBExceptionLP, RemoteException {
        // Alle restlichen Mahnungen der Bestellung holen
        BSMahnungDto[] bsMahnungDto = bsmahnungFindByBestellungIId(BestellungId, theClientDto);
        BSMahnungDto neueMahnung = null;
        if (bsMahnungDto != null) {
            // Letzes Mahndatum suchen
            for (int i = 0; i < bsMahnungDto.length; i++) {
                if (neueMahnung == null) {
                    neueMahnung = bsMahnungDto[i];
                } else {
                    if (neueMahnung.getTMahndatum().before(bsMahnungDto[i].getTMahndatum())) {
                        neueMahnung = bsMahnungDto[i];
                    }
                }
            }
        }
        // Mahnstufe setzen
        BestellungDto bestellungDto = getBestellungFac().bestellungFindByPrimaryKey(BestellungId);
        if (neueMahnung == null) {
            getBestellungFac().updateBestellungMahnstufe(bestellungDto.getIId(), null, theClientDto);
        } else {
            getBestellungFac().updateBestellungMahnstufe(bestellungDto.getIId(), neueMahnung.getMahnstufeIId(),
                    theClientDto);
            bestellungDto.setIMahnstufeIId(neueMahnung.getMahnstufeIId());
        }
    }

    public void removeBSMahnung(Integer iId, TheClientDto theClientDto) throws EJBExceptionLP {
        try {
            Bsmahnung toRemove = em.find(Bsmahnung.class, iId);
            Integer BestellungId = toRemove.getBestellungIId();
            if (toRemove == null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, "");
            }
            try {
                em.remove(toRemove);
                em.flush();
            } catch (EntityExistsException er) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, er);
            }
            setBSMahnstufeInBestellung(BestellungId, theClientDto);

        } catch (Exception e) {
            throw new EJBExceptionLP(e);
        }
    }

    /**
     * methode wird dann aufgerufen wenn man gesamten Mahnlauf loescht
     * 
     * @param bSMahnungDto
     *            BSMahnungDto
     * @param theClientDto
     *            String
     * @throws EJBExceptionLP
     */
    public void removeBSMahnungAusMahnlauf(BSMahnungDto bSMahnungDto, TheClientDto theClientDto)
            throws EJBExceptionLP {
        myLogger.entry();
        if (bSMahnungDto != null) {
            if (bSMahnungDto.getTGedruckt() != null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FINANZ_MAHNLAUF_WURDE_SCHON_UEBERNOMMEN, "");
            }
            try {
                // SK: vorhandene remove funktion statt doppeltem code
                removeBSMahnung(bSMahnungDto, theClientDto);
                /*
                 * Integer iId = bSMahnungDto.getIId(); Bsmahnung toRemove =
                 * em.find(Bsmahnung.class, iId); if (toRemove == null) { throw
                 * new
                 * EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                 * null); } try { em.remove(toRemove); em.flush(); } catch
                 * (EntityExistsException er) { throw new
                 * EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, er); }
                 */
            } catch (Exception ex) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, ex);
            }
        }
    }

    public void removeBSMahnung(BSMahnungDto bSMahnungDto, TheClientDto theClientDto) throws EJBExceptionLP {
        myLogger.entry();
        if (bSMahnungDto != null) {
            if (bSMahnungDto.getTGedruckt() != null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FINANZ_MAHNLAUF_WURDE_SCHON_UEBERNOMMEN, "");
            } else {
                // SK: vorhandene remove funktion statt doppeltem code
                removeBSMahnung(bSMahnungDto.getIId(), theClientDto);
                // try {
                /*
                 * Bsmahnung toRemove = em.find(Bsmahnung.class, ); if (toRemove
                 * == null) { throw new
                 * EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                 * null); } try { em.remove(toRemove); em.flush(); } catch
                 * (EntityExistsException er) { throw new
                 * EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, er); }
                 */
                // }
                // catch (RemoveException ex) {
                // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN,
                // ex);
                // }
            }
        }
    }

    public BSMahnungDto updateBSMahnung(BSMahnungDto bSMahnungDto, TheClientDto theClientDto)
            throws EJBExceptionLP {
        if (bSMahnungDto != null) {
            Integer iId = bSMahnungDto.getIId();
            try {
                Bsmahnung bSMahnung = em.find(Bsmahnung.class, iId);
                setBSMahnungFromBSMahnungDto(bSMahnung, bSMahnungDto);
                setBSMahnstufeInBestellung(bSMahnungDto.getBestellungIId(), theClientDto);
            } catch (Exception e) {
                throw new EJBExceptionLP(e);
            }
        }
        return bSMahnungDto;
    }

    public void updateBSMahnungs(BSMahnungDto[] bSMahnungDtos, TheClientDto theClientDto) throws EJBExceptionLP {
        if (bSMahnungDtos != null) {
            for (int i = 0; i < bSMahnungDtos.length; i++) {
                updateBSMahnung(bSMahnungDtos[i], theClientDto);
            }
        }
    }

    public BSMahnungDto bsmahnungFindByPrimaryKey(Integer iId) throws EJBExceptionLP {
        try {
            Bsmahnung bsmahnung = em.find(Bsmahnung.class, iId);
            if (bsmahnung == null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, "");
            }
            return assembleBSMahnungDto(bsmahnung);
        } catch (Exception e) {
            throw new EJBExceptionLP(e);
        }
    }

    private void setBSMahnungFromBSMahnungDto(Bsmahnung bsmahnung, BSMahnungDto bSMahnungDto) {
        bsmahnung.setMandantCNr(bSMahnungDto.getMandantCNr());
        bsmahnung.setBsmahnlaufIId(bSMahnungDto.getMahnlaufIId());
        bsmahnung.setMahnstufeIId(bSMahnungDto.getMahnstufeIId());
        bsmahnung.setBestellungIId(bSMahnungDto.getBestellungIId());
        bsmahnung.setTMahndatum(bSMahnungDto.getTMahndatum());
        bsmahnung.setTGedruckt(bSMahnungDto.getTGedruckt());
        bsmahnung.setPersonalIIdGedruckt(bSMahnungDto.getPersonalIIdGedruckt());
        bsmahnung.setTAnlegen(bSMahnungDto.getTAnlegen());
        bsmahnung.setTAendern(bSMahnungDto.getTAendern());
        bsmahnung.setPersonalIIdAnlegen(bSMahnungDto.getPersonalIIdAnlegen());
        bsmahnung.setPersonalIIdAendern(bSMahnungDto.getPersonalIIdAendern());
        bsmahnung.setNOffenemenge(bSMahnungDto.getNOffeneMenge());
        em.merge(bsmahnung);
        em.flush();
    }

    private BSMahnungDto assembleBSMahnungDto(Bsmahnung bSMahnung) {
        return BSMahnungDtoAssembler.createDto(bSMahnung);
    }

    private BSMahnungDto[] assembleBSMahnungDtos(Collection<?> bSMahnungs) {
        List<BSMahnungDto> list = new ArrayList<BSMahnungDto>();
        if (bSMahnungs != null) {
            Iterator<?> iterator = bSMahnungs.iterator();
            while (iterator.hasNext()) {
                Bsmahnung bSMahnung = (Bsmahnung) iterator.next();
                list.add(assembleBSMahnungDto(bSMahnung));
            }
        }
        BSMahnungDto[] returnArray = new BSMahnungDto[list.size()];
        return (BSMahnungDto[]) list.toArray(returnArray);
    }

    public Integer createBSMahnlauf(BSMahnlaufDto bSMahnlaufDto, TheClientDto theClientDto) throws EJBExceptionLP {
        try {
            BSMahnlaufDto bsmahnlaufDto = new BSMahnlaufDto();
            bsmahnlaufDto.setIId(getPKGeneratorObj().getNextPrimaryKey(PKConst.PK_BSMAHNLAUF));
            bsmahnlaufDto.setMandantCNr(theClientDto.getMandant());
            bsmahnlaufDto.setPersonalIIdAendern(theClientDto.getIDPersonal());
            bsmahnlaufDto.setPersonalIIdAnlegen(theClientDto.getIDPersonal());
            Bsmahnlauf bsmahnlauf = new Bsmahnlauf(bsmahnlaufDto.getIId(), bsmahnlaufDto.getMandantCNr(),
                    bsmahnlaufDto.getPersonalIIdAnlegen(), bsmahnlaufDto.getPersonalIIdAendern());
            em.persist(bsmahnlauf);
            em.flush();
            bsmahnlaufDto.setTAendern(bsmahnlauf.getTAendern());
            bsmahnlaufDto.setTAnlegen(bsmahnlauf.getTAnlegen());
            setBSMahnlaufFromBSMahnlaufDto(bsmahnlauf, bsmahnlaufDto);
            return bsmahnlaufDto.getIId();
        } catch (EntityExistsException e) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_ANLEGEN, e);
        }
    }

    @TransactionAttribute(TransactionAttributeType.NEVER)
    public void removeBSMahnlauf(Integer iId, TheClientDto theClientDto) throws EJBExceptionLP {
        // try {
        Bsmahnlauf toRemove = em.find(Bsmahnlauf.class, iId);
        if (toRemove == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, "");
        }
        BSMahnungDto[] bsmahnungen = bsmahnungFindByBSMahnlaufIId(toRemove.getIId(), theClientDto);
        for (int i = 0; i < bsmahnungen.length; i++) {
            if (bsmahnungen[i].getTGedruckt() != null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FINANZ_MAHNLAUF_WURDE_SCHON_UEBERNOMMEN, "");
            }
        }
        try {
            for (int i = 0; i < bsmahnungen.length; i++) {
                context.getBusinessObject(BSMahnwesenFac.class).removeBSMahnungAusMahnlauf(bsmahnungen[i],
                        theClientDto);
            }
            context.getBusinessObject(BSMahnwesenFac.class).removeBSMahnlauf(iId);
        } catch (RemoteException e) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, e);
        } catch (IllegalStateException e) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, e);
        }
        // }
        // catch (RemoveException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, ex);
        // }
    }

    @TransactionAttribute(TransactionAttributeType.NEVER)
    public void removeBSMahnlauf(BSMahnlaufDto bSMahnlaufDto, TheClientDto theClientDto) throws EJBExceptionLP {
        if (bSMahnlaufDto != null) {
            Integer iId = bSMahnlaufDto.getIId();
            // zuerst die angehaengten Mahnungen loeschen
            try {
                BSMahnungDto[] bsmahnungen = bsmahnungFindByBSMahnlaufIId(iId, theClientDto);
                for (int i = 0; i < bsmahnungen.length; i++) {
                    if (bsmahnungen[i].getTGedruckt() != null) {
                        throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FINANZ_MAHNLAUF_WURDE_SCHON_UEBERNOMMEN, "");
                    }
                }
                for (int i = 0; i < bsmahnungen.length; i++) {
                    context.getBusinessObject(BSMahnwesenFac.class).removeBSMahnungAusMahnlauf(bsmahnungen[i],
                            theClientDto);
                }
                context.getBusinessObject(BSMahnwesenFac.class).removeBSMahnlauf(iId);
            } catch (RemoteException e) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, e);
            } catch (IllegalStateException e) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, e);
            }
        }
    }

    public void removeBSMahnlauf(Integer id) throws EJBExceptionLP {
        Bsmahnlauf toRemove = em.find(Bsmahnlauf.class, id);
        if (toRemove == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, "");
        }
        try {
            em.remove(toRemove);
            em.flush();
        } catch (EntityExistsException er) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, er);
        }
    }

    public void updateBSMahnlauf(BSMahnlaufDto bSMahnlaufDto, TheClientDto theClientDto) throws EJBExceptionLP {
        if (bSMahnlaufDto != null) {
            Integer iId = bSMahnlaufDto.getIId();
            try {
                Bsmahnlauf bSMahnlauf = em.find(Bsmahnlauf.class, iId);
                setBSMahnlaufFromBSMahnlaufDto(bSMahnlauf, bSMahnlaufDto);
            } catch (Exception e) {
                throw new EJBExceptionLP(e);
            }
        }
    }

    public void updateBSMahnlaufs(BSMahnlaufDto[] bSMahnlaufDtos, TheClientDto theClientDto) throws EJBExceptionLP {
        if (bSMahnlaufDtos != null) {
            for (int i = 0; i < bSMahnlaufDtos.length; i++) {
                updateBSMahnlauf(bSMahnlaufDtos[i], theClientDto);
            }
        }
    }

    public BSMahnlaufDto bsmahnlaufFindByPrimaryKey(Integer iId) throws EJBExceptionLP {
        try {
            Bsmahnlauf bsmahnlauf = em.find(Bsmahnlauf.class, iId);
            if (bsmahnlauf == null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, "");
            }
            return assembleBSMahnlaufDto(bsmahnlauf);
        } catch (Exception e) {
            throw new EJBExceptionLP(e);
        }
    }

    private void setBSMahnlaufFromBSMahnlaufDto(Bsmahnlauf bSMahnlauf, BSMahnlaufDto bSMahnlaufDto) {
        bSMahnlauf.setMandantCNr(bSMahnlaufDto.getMandantCNr());
        bSMahnlauf.setPersonalIIdAnlegen(bSMahnlaufDto.getPersonalIIdAnlegen());
        bSMahnlauf.setPersonalIIdAendern(bSMahnlaufDto.getPersonalIIdAendern());
        bSMahnlauf.setTAendern(bSMahnlaufDto.getTAendern());
        bSMahnlauf.setTAnlegen(bSMahnlaufDto.getTAnlegen());
        em.merge(bSMahnlauf);
        em.flush();
    }

    private BSMahnlaufDto assembleBSMahnlaufDto(Bsmahnlauf bSMahnlauf) {
        return BSMahnlaufDtoAssembler.createDto(bSMahnlauf);
    }

    private BSMahnlaufDto[] assembleBSMahnlaufDtos(Collection<?> bSMahnlaufs) {
        List<BSMahnlaufDto> list = new ArrayList<BSMahnlaufDto>();
        if (bSMahnlaufs != null) {
            Iterator<?> iterator = bSMahnlaufs.iterator();
            while (iterator.hasNext()) {
                Bsmahnlauf bSMahnlauf = (Bsmahnlauf) iterator.next();
                list.add(assembleBSMahnlaufDto(bSMahnlauf));
            }
        }
        BSMahnlaufDto[] returnArray = new BSMahnlaufDto[list.size()];
        return (BSMahnlaufDto[]) list.toArray(returnArray);
    }

    public Integer createBSMahnstufe(BSMahnstufeDto bSMahnstufeDto, TheClientDto theClientDto)
            throws EJBExceptionLP {
        myLogger.logData(bSMahnstufeDto);
        bSMahnstufeDto.setMandantCNr(theClientDto.getMandant());
        try {
            Bsmahnstufe bSMahnstufe = new Bsmahnstufe(bSMahnstufeDto.getIId(), bSMahnstufeDto.getMandantCNr(),
                    bSMahnstufeDto.getITage());
            em.persist(bSMahnstufe);
            em.flush();
            setBSMahnstufeFromBSMahnstufeDto(bSMahnstufe, bSMahnstufeDto);
            return bSMahnstufeDto.getIId();
        } catch (EntityExistsException e) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_ANLEGEN, e);
        }
    }

    public void removeBSMahnstufe(Integer iId, TheClientDto theClientDto) throws EJBExceptionLP {
        // try {
        Bsmahnstufe toRemove = em.find(Bsmahnstufe.class, iId);
        if (toRemove == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, "");
        }
        try {
            em.remove(toRemove);
            em.flush();
        } catch (EntityExistsException er) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, er);
        }
        // }
        // catch (RemoveException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, ex);
        // }
    }

    public void removeBSMahnstufe(BSMahnstufeDto bSMahnstufeDto, TheClientDto theClientDto) throws EJBExceptionLP {
        myLogger.entry();
        if (bSMahnstufeDto == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_DTO_IS_NULL, new Exception("bSMahnstufeDto == null"));
        }
        if (bSMahnstufeDto != null) {
            // try {
            Integer iId = bSMahnstufeDto.getIId();
            if (iId.intValue() == BSMahnwesenFac.MAHNSTUFE_1 || iId.intValue() == BSMahnwesenFac.MAHNSTUFE_2
                    || iId.intValue() == BSMahnwesenFac.MAHNSTUFE_3
                    || iId.intValue() == BSMahnwesenFac.MAHNSTUFE_0) {
                throw new EJBExceptionLP(
                        EJBExceptionLP.FEHLER_FINANZ_MAHNSTUFEN_1_2_3_DUERFEN_NICHT_GELOESCHT_WERDEN,
                        new Exception("BSMahnstufe " + iId.intValue() + " darf nicht geloescht werden"));
            }
            Bsmahnstufe toRemove = em.find(Bsmahnstufe.class,
                    new BsmahnstufePK(iId, bSMahnstufeDto.getMandantCNr()));
            if (toRemove == null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, "");
            }
            try {
                em.remove(toRemove);
                em.flush();
            } catch (EntityExistsException er) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, er);
            }
            // }
            // catch (RemoveException ex) {
            // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN,
            // ex);
            // }
        }
    }

    public void updateBSMahnstufe(BSMahnstufeDto bSMahnstufeDto, TheClientDto theClientDto) throws EJBExceptionLP {
        if (bSMahnstufeDto != null) {
            // try {
            Bsmahnstufe bSMahnstufe = em.find(Bsmahnstufe.class,
                    new BsmahnstufePK(bSMahnstufeDto.getIId(), bSMahnstufeDto.getMandantCNr()));
            if (bSMahnstufe == null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_UPDATE, "");
            }
            setBSMahnstufeFromBSMahnstufeDto(bSMahnstufe, bSMahnstufeDto);
            // }
            // catch (FinderException ex) {
            // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_UPDATE, ex);
            // }
        }
    }

    public void updateBSMahnstufes(BSMahnstufeDto[] bSMahnstufeDtos, TheClientDto theClientDto)
            throws EJBExceptionLP {
        if (bSMahnstufeDtos != null) {
            for (int i = 0; i < bSMahnstufeDtos.length; i++) {
                updateBSMahnstufe(bSMahnstufeDtos[i], theClientDto);
            }
        }
    }

    public BSMahnstufeDto bsmahnstufeFindByPrimaryKeyOhneExc(BsmahnstufePK bsmahnstufePK) throws EJBExceptionLP {
        // try {
        Bsmahnstufe bsmahnstufe = em.find(Bsmahnstufe.class, bsmahnstufePK);
        if (bsmahnstufe == null) {
            return null;
        }
        return assembleBSMahnstufeDto(bsmahnstufe);
        // }
        // catch (FinderException e) {
        // return null;
        // }
    }

    private void setBSMahnstufeFromBSMahnstufeDto(Bsmahnstufe bSMahnstufe, BSMahnstufeDto bSMahnstufeDto) {
        bSMahnstufe.setITage(bSMahnstufeDto.getITage());
        em.merge(bSMahnstufe);
        em.flush();
    }

    private BSMahnstufeDto assembleBSMahnstufeDto(Bsmahnstufe bSMahnstufe) {
        return BSMahnstufeDtoAssembler.createDto(bSMahnstufe);
    }

    private BSMahnstufeDto[] assembleBSMahnstufeDtos(Collection<?> bSMahnstufes) {
        List<BSMahnstufeDto> list = new ArrayList<BSMahnstufeDto>();
        if (bSMahnstufes != null) {
            Iterator<?> iterator = bSMahnstufes.iterator();
            while (iterator.hasNext()) {
                Bsmahnstufe bSMahnstufe = (Bsmahnstufe) iterator.next();
                list.add(assembleBSMahnstufeDto(bSMahnstufe));
            }
        }
        BSMahnstufeDto[] returnArray = new BSMahnstufeDto[list.size()];
        return (BSMahnstufeDto[]) list.toArray(returnArray);
    }

    public Integer createBSMahntext(BSMahntextDto bSMahntextDto, TheClientDto theClientDto) throws EJBExceptionLP {
        myLogger.logData(bSMahntextDto);
        if (bSMahntextDto == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_DTO_IS_NULL, new Exception("bSMahntextDto == null"));
        }

        bSMahntextDto.setIId(getPKGeneratorObj().getNextPrimaryKey(PKConst.PK_BSMAHNTEXT));
        bSMahntextDto.setLocaleCNr(theClientDto.getLocUiAsString());
        bSMahntextDto.setMandantCNr(theClientDto.getMandant());
        // wenns dazu noch keine mahnstufe gibt muss ich die kreieren
        try {
            BSMahnstufeDto bsmahnstufeDto = getBSMahnwesenFac().bsmahnstufeFindByPrimaryKeyOhneExc(
                    new BsmahnstufePK(bSMahntextDto.getMahnstufeIId(), bSMahntextDto.getMandantCNr()));
            if (bsmahnstufeDto == null) {
                bsmahnstufeDto = new BSMahnstufeDto();
                bsmahnstufeDto.setIId(bSMahntextDto.getMahnstufeIId());
                /**
                 * @todo MB woher dieser Wert?
                 */
                bsmahnstufeDto.setITage(new Integer(10));
                getBSMahnwesenFac().createBSMahnstufe(bsmahnstufeDto, theClientDto);
            }
            Bsmahntext bsmahntext = new Bsmahntext(bSMahntextDto.getIId(), bSMahntextDto.getMandantCNr(),
                    bSMahntextDto.getLocaleCNr(), bSMahntextDto.getMahnstufeIId(), bSMahntextDto.getXTextinhalt());
            em.persist(bsmahntext);
            em.flush();
            setBSMahntextFromBSMahntextDto(bsmahntext, bSMahntextDto);
            return bSMahntextDto.getIId();
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
            return null;
        } catch (EntityExistsException e) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_ANLEGEN, e);
        }
    }

    public void removeBSMahntext(Integer iId, TheClientDto theClientDto) throws EJBExceptionLP {
        // try {
        Bsmahntext toRemove = em.find(Bsmahntext.class, iId);
        if (toRemove == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, "");
        }
        try {
            em.remove(toRemove);
            em.flush();
        } catch (EntityExistsException er) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, er);
        }
        // }
        // catch (RemoveException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, ex);
        // }
    }

    public void removeBSMahntext(BSMahntextDto bSMahntextDto, TheClientDto theClientDto) throws EJBExceptionLP {
        myLogger.logData(bSMahntextDto);
        if (bSMahntextDto == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_DTO_IS_NULL, new Exception("bSMahntextDto == null"));
        }
        // try {
        if (bSMahntextDto.getMahnstufeIId().intValue() == 1 || bSMahntextDto.getMahnstufeIId().intValue() == 2
                || bSMahntextDto.getMahnstufeIId().intValue() == 3) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FINANZ_MAHNTEXTE_1_2_3_DUERFEN_NICHT_GELOESCHT_WERDEN,
                    new Exception("Mahntext " + bSMahntextDto.getMahnstufeIId().intValue()
                            + " darf nicht geloescht werden"));
        }
        Integer iId = bSMahntextDto.getIId();
        Bsmahntext toRemove = em.find(Bsmahntext.class, iId);
        if (toRemove == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, "");
        }
        try {
            em.remove(toRemove);
            em.flush();
        } catch (EntityExistsException er) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, er);
        }
        // }
        // catch (RemoveException ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, ex);
        // }
    }

    public void updateBSMahntext(BSMahntextDto bSMahntextDto, TheClientDto theClientDto) throws EJBExceptionLP {
        if (bSMahntextDto != null) {
            Integer iId = bSMahntextDto.getIId();
            try {
                Bsmahntext bSMahntext = em.find(Bsmahntext.class, iId);
                setBSMahntextFromBSMahntextDto(bSMahntext, bSMahntextDto);
            } catch (Exception e) {
                throw new EJBExceptionLP(e);
            }
        }
    }

    public void updateBSMahntexts(BSMahntextDto[] bSMahntextDtos, TheClientDto theClientDto) throws EJBExceptionLP {
        if (bSMahntextDtos != null) {
            for (int i = 0; i < bSMahntextDtos.length; i++) {
                updateBSMahntext(bSMahntextDtos[i], theClientDto);
            }
        }
    }

    public BSMahntextDto bsmahntextFindByPrimaryKey(Integer iId) throws EJBExceptionLP {
        try {
            Bsmahntext bsmahntext = em.find(Bsmahntext.class, iId);
            if (bsmahntext == null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, "");
            }
            return assembleBSMahntextDto(bsmahntext);
        } catch (Exception e) {
            throw new EJBExceptionLP(e);
        }
    }

    private void setBSMahntextFromBSMahntextDto(Bsmahntext bSMahntext, BSMahntextDto bSMahntextDto) {
        bSMahntext.setMandantCNr(bSMahntextDto.getMandantCNr());
        bSMahntext.setLocaleCNr(bSMahntextDto.getLocaleCNr());
        bSMahntext.setMahnstufeIId(bSMahntextDto.getMahnstufeIId());
        bSMahntext.setXTextinhalt(bSMahntextDto.getXTextinhalt());
        em.merge(bSMahntext);
        em.flush();
    }

    private BSMahntextDto assembleBSMahntextDto(Bsmahntext bSMahntext) {
        return BSMahntextDtoAssembler.createDto(bSMahntext);
    }

    private BSMahntextDto[] assembleBSMahntextDtos(Collection<?> bSMahntexts) {
        List<BSMahntextDto> list = new ArrayList<BSMahntextDto>();
        if (bSMahntexts != null) {
            Iterator<?> iterator = bSMahntexts.iterator();
            while (iterator.hasNext()) {
                Bsmahntext bSMahntext = (Bsmahntext) iterator.next();
                list.add(assembleBSMahntextDto(bSMahntext));
            }
        }
        BSMahntextDto[] returnArray = new BSMahntextDto[list.size()];
        return (BSMahntextDto[]) list.toArray(returnArray);
    }

    public BSMahnungDto[] bsmahnungFindByBSMahnlaufIId(Integer mahnlaufIId, TheClientDto theClientDto)
            throws EJBExceptionLP {
        // @ToDo Ungueltiger Prozeduraufruf oder ungueltiges Argument
        Query query = em.createNamedQuery("BSMahnungfindByBSMahnlaufIId");
        query.setParameter(1, mahnlaufIId);
        Collection cl = query.getResultList();
        // if(cl.isEmpty()){
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND, null);
        // }
        return this.assembleBSMahnungDtos(cl);

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

    public BSMahnungDto[] bsmahnungFindByBSMahnlaufIIdLieferantIId(Integer mahnlaufIId, Integer lieferantIId,
            String MandantCNr) throws EJBExceptionLP {
        // @ToDo Ungueltiger Prozeduraufruf oder ungueltiges Argument
        Query query = em.createNamedQuery("BSMahnungfindBymahnlaufIIdLieferantIIdMandantCNr");
        query.setParameter(1, mahnlaufIId);
        query.setParameter(2, lieferantIId);
        query.setParameter(3, MandantCNr);
        Collection cl = query.getResultList();
        if (cl.isEmpty()) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND, "");
        }
        return this.assembleBSMahnungDtos(cl);
        // }
        // catch (FinderException ex) {

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

    public BSMahnstufeDto[] bsmahnstufeFindByMandantCNr(String mandantCNr, TheClientDto theClientDto)
            throws EJBExceptionLP {
        try {
            Query query = em.createNamedQuery("BSMahnstufefindByMandantCNr");
            query.setParameter(1, mandantCNr);
            Collection<?> c = query.getResultList();
            Collection<Bsmahnstufe> c2 = new LinkedList<Bsmahnstufe>();
            for (Iterator<?> iter = c.iterator(); iter.hasNext();) {
                Bsmahnstufe item = (Bsmahnstufe) iter.next();
                c2.add(item);
            }
            return assembleBSMahnstufeDtos(c2);
        } catch (Exception e) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDALL, e);
        }
    }

    public BSMahnlaufDto[] bsmahnlaufFindByMandantCNr(String mandantCNr, TheClientDto theClientDto)
            throws EJBExceptionLP {
        // try {
        Query query = em.createNamedQuery("BSMahnlauffindByMandantCNr");
        query.setParameter(1, mandantCNr);
        Collection<?> cl = query.getResultList();
        // if(cl.isEmpty()){
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND, null);
        // }

        return assembleBSMahnlaufDtos(cl);

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

    public BSMahnungDto[] bsmahnungFindByBestellungIId(Integer bestellungIId, TheClientDto theClientDto)
            throws EJBExceptionLP {
        // check(theClientDto);
        // try {
        Query query = em.createNamedQuery("BSMahnungfindByBestellungIId");
        query.setParameter(1, bestellungIId);
        Collection<?> cl = query.getResultList();
        // if(cl.isEmpty()){
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND, null);
        // }
        return assembleBSMahnungDtos(cl);

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

    public BSMahnungDto[] bsmahnungFindByBestellungBSMahnstufe(Integer bestellungIId, Integer mahnstufeIId,
            TheClientDto theClientDto) throws EJBExceptionLP {
        // try {
        Query query = em.createNamedQuery("BSMahnungfindByBestellungBSMahnstufe");
        query.setParameter(1, bestellungIId);
        query.setParameter(2, mahnstufeIId);
        Collection<?> cl = query.getResultList();
        // if(cl.isEmpty()){ // @ToDo null Pruefung?
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND, null);
        // }
        return assembleBSMahnungDtos(cl);

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

    public LinkedHashMap getAllBSMahnstufen(String mandantCNr, TheClientDto theClientDto) throws EJBExceptionLP {
        LinkedHashMap<Integer, Integer> uMap = new LinkedHashMap<Integer, Integer>();
        try {
            BSMahnstufeDto[] bsmahnstufen = bsmahnstufeFindByMandantCNr(mandantCNr, theClientDto);
            for (int i = 0; i < bsmahnstufen.length; i++) {
                uMap.put(bsmahnstufen[i].getIId(), bsmahnstufen[i].getIId());
            }
            return uMap;
        } catch (Exception e) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDALL, e);
        }
    }

    public BSMahntextDto bsmahntextFindByMandantLocaleCNr(String mandantCNr, String localeCNr,
            Integer bsmahnstufeIId) throws EJBExceptionLP {
        try {
            Query query = em.createNamedQuery("BSMahntextfindByMandantLocaleCNr");
            query.setParameter(1, mandantCNr);
            query.setParameter(2, localeCNr);
            query.setParameter(3, bsmahnstufeIId);
            Bsmahntext bsmahntext = (com.lp.server.bestellung.ejb.Bsmahntext) query.getSingleResult();

            return assembleBSMahntextDto(bsmahntext);

        } catch (NoResultException e) {
            return null;
        } catch (Exception e) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND, e);
        }
    }

    public BSMahntextDto createDefaultBSMahntext(Integer bsmahnstufeIId, String sTextinhaltI,
            TheClientDto theClientDto) throws EJBExceptionLP, RemoteException {
        BSMahntextDto oBSMahntextDto = new BSMahntextDto();
        BsmahnstufePK mahnstufePK = new BsmahnstufePK(bsmahnstufeIId, theClientDto.getMandant());
        BSMahnstufeDto bsMahnstufeDto = bsmahnstufeFindByPrimaryKeyOhneExc(mahnstufePK);
        oBSMahntextDto.setMahnstufeIId(bsmahnstufeIId);
        oBSMahntextDto.setLocaleCNr(theClientDto.getLocUiAsString());
        oBSMahntextDto.setMandantCNr(theClientDto.getMandant());
        oBSMahntextDto.setXTextinhalt(sTextinhaltI);
        oBSMahntextDto.setIId(createBSMahntext(oBSMahntextDto, theClientDto));
        return oBSMahntextDto;
    }

    public Boolean bGibtEsEinenOffenenBSMahnlauf(String mandantCNr, TheClientDto theClientDto) {
        boolean bEsGibtEinenOffenen = false;
        BSMahnlaufDto[] bsmahnlaufDtos = bsmahnlaufFindByMandantCNr(mandantCNr, theClientDto);
        for (int i = 0; i < bsmahnlaufDtos.length; i++) {
            BSMahnungDto[] bsmahnungen = bsmahnungFindByBSMahnlaufIId(bsmahnlaufDtos[i].getIId(), theClientDto);
            for (int j = 0; j < bsmahnungen.length; j++) {
                if (bsmahnungen[j].getTGedruckt() == null) {
                    bEsGibtEinenOffenen = true;
                    break;
                }
            }
        }
        return new Boolean(bEsGibtEinenOffenen);
    }

    /**
     * Alle Mahnungen eines Mahnlaufes mahnen
     * 
     * @param bsmahnlaufIId
     *            Integer
     * @param theClientDto
     *            String
     * @throws EJBExceptionLP
     */
    @TransactionAttribute(TransactionAttributeType.NEVER)
    public void mahneBSMahnlaufRueckgaengig(Integer bsmahnlaufIId, TheClientDto theClientDto)
            throws EJBExceptionLP {
        BSMahnungDto[] bsmahnungen = bsmahnungFindByBSMahnlaufIId(bsmahnlaufIId, theClientDto);
        for (int i = 0; i < bsmahnungen.length; i++) {
            mahneBSMahnungRueckgaengig(bsmahnungen[i].getIId(), theClientDto);
        }
    }

    /**
     * Eine Mahnung aus einem Mahnlauf durchfuehren.
     * 
     * @param mahnungIId
     *            Integer
     * @param theClientDto
     *            String
     * @throws EJBExceptionLP
     */
    @TransactionAttribute(TransactionAttributeType.NEVER)
    public void mahneBSMahnungRueckgaengig(Integer mahnungIId, TheClientDto theClientDto) throws EJBExceptionLP {
        BSMahnungDto bsMahnungDto = bsmahnungFindByPrimaryKey(mahnungIId);
        bsMahnungDto.setTGedruckt(null);
        bsMahnungDto.setPersonalIIdGedruckt(null);
        try {
            context.getBusinessObject(BSMahnwesenFac.class).updateBSMahnung(bsMahnungDto, theClientDto);
        } catch (RemoteException e) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_UPDATE, e);
        } catch (IllegalStateException e) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_UPDATE, e);
        }
    }

    /**
     * 
     * @param theClientDto
     *            String
     * @return BSMahnlaufDto
     * @throws EJBExceptionLP
     */
    public BSMahnlaufDto createBSMahnlaufEchteLiefermahnungen(TheClientDto theClientDto) throws EJBExceptionLP {
        Integer bsmahnlaufIId = null;
        BSMahnlaufDto bsmahnlaufDto = null;
        BSMahnungDto bsmahnungDto[] = null;

        bsmahnlaufIId = createMahnungen(true, false, false, theClientDto);

        // wenn keine Mahnungen angelegt wurden dann wird auch wieder der
        // Mahnlauf entfernt
        bsmahnungDto = bsmahnungFindByBSMahnlaufIIdOhneExc(bsmahnlaufIId, theClientDto);
        if (bsmahnungDto.length == 0) {
            this.removeBSMahnlauf(bsmahnlaufIId, theClientDto);
        } else {
            bsmahnlaufDto = bsmahnlaufFindByPrimaryKey(bsmahnlaufIId);
        }
        return bsmahnlaufDto;
    }

    public BSMahnlaufDto createBSMahnlaufLiefererinnerung(TheClientDto theClientDto) {
        Integer bsmahnlaufIId = null;
        BSMahnlaufDto bsmahnlaufDto = null;
        BSMahnungDto bsmahnungDto[] = null;

        bsmahnlaufIId = createMahnungen(false, false, true, theClientDto);

        // wenn keine Mahnungen angelegt wurden dann wird auch wieder der
        // Mahnlauf entfernt
        bsmahnungDto = bsmahnungFindByBSMahnlaufIIdOhneExc(bsmahnlaufIId, theClientDto);
        if (bsmahnungDto.length == 0) {
            this.removeBSMahnlauf(bsmahnlaufIId, theClientDto);
        } else {
            bsmahnlaufDto = bsmahnlaufFindByPrimaryKey(bsmahnlaufIId);
        }
        return bsmahnlaufDto;
    }

    /**
     * 
     * @param theClientDto
     *            String
     * @return BSMahnlaufDto
     * @throws EJBExceptionLP
     */
    public BSMahnlaufDto createBSMahnlaufABMahnungen(TheClientDto theClientDto) throws EJBExceptionLP {
        Integer bsmahnlaufIId = null;
        BSMahnlaufDto bsmahnlaufDto = null;
        BSMahnungDto bsmahnungDto[] = null;

        bsmahnlaufIId = createMahnungen(false, true, false, theClientDto);

        // wenn keine Mahnungen angelegt wurden dann wird auch wieder der
        // Mahnlauf entfernt
        bsmahnungDto = bsmahnungFindByBSMahnlaufIIdOhneExc(bsmahnlaufIId, theClientDto);
        if (bsmahnungDto.length == 0) {
            this.removeBSMahnlauf(bsmahnlaufIId, theClientDto);
        } else {
            bsmahnlaufDto = bsmahnlaufFindByPrimaryKey(bsmahnlaufIId);
        }
        return bsmahnlaufDto;
    }

    /**
     * 
     * @param theClientDto
     *            String
     * @return BSMahnlaufDto
     * @throws EJBExceptionLP
     */
    @TransactionAttribute(TransactionAttributeType.NEVER)
    public BSMahnlaufDto createABMahnungenUndLieferMahnungenUndLiefererinnerungen(TheClientDto theClientDto)
            throws EJBExceptionLP {
        Integer bsmahnlaufIId = null;
        BSMahnlaufDto bsmahnlaufDto = null;
        BSMahnungDto bsmahnungDto[] = null;

        bsmahnlaufIId = createMahnungen(true, true, true, theClientDto);
        // wenn keine Mahnungen angelegt wurden dann wird auch wieder der
        // Mahnlauf entfernt
        bsmahnungDto = bsmahnungFindByBSMahnlaufIIdOhneExc(bsmahnlaufIId, theClientDto);
        if (bsmahnungDto.length == 0) {
            this.removeBSMahnlauf(bsmahnlaufIId, theClientDto);
        } else {
            bsmahnlaufDto = bsmahnlaufFindByPrimaryKey(bsmahnlaufIId);
        }
        return bsmahnlaufDto;
    }

    /**
     * 
     * @param bestellpositionIId
     *            Integer
     * @param theClientDto
     *            String
     * @return BSMahnungDto
     */
    public BSMahnungDto[] bsmahnungFindByBestellpositionIIdOhneExc(Integer bestellpositionIId,
            TheClientDto theClientDto) {
        Collection<?> bsmahnung = null;
        BSMahnungDto[] bsmahnungDto = null;
        // try {
        Query query = em.createNamedQuery("BSMahnungfindByBestellposition");
        query.setParameter(1, bestellpositionIId);

        bsmahnung = query.getResultList();
        // if (bsmahnung.isEmpty()) {
        // nothing
        // }
        bsmahnungDto = assembleBSMahnungDtos(bsmahnung);
        // }
        // catch (FinderException ex) {
        // nothing
        // }
        return bsmahnungDto;
    }

    public void mahneBSMahnung(Integer bsmahnungIId, TheClientDto theClientDto) throws EJBExceptionLP {
        try {
            Bsmahnung bsmahnung = em.find(Bsmahnung.class, bsmahnungIId);
            BestellungDto bestellungDto = getBestellungFac()
                    .bestellungFindByPrimaryKey(bsmahnung.getBestellungIId());
            // nur dann mahnen, wenn die Bestellung keine mahnsperre hat oder
            // diese schon vorbei ist.
            if (bestellungDto.getTMahnsperreBis() == null || bestellungDto.getTMahnsperreBis().before(getDate())) {
                // jetzt kann die Mahnung als gemahnt markiert werden
                bsmahnung.setTGedruckt(getTimestamp());
                bsmahnung.setPersonalIIdGedruckt(theClientDto.getIDPersonal());
            } else {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BESTELLUNG_MAHNSPERRE,
                        new Exception("Die Bestellung " + bestellungDto.getCNr()
                                + " darf nicht gemahnt werden: Mahnsperre bis "
                                + bestellungDto.getTMahnsperreBis()));
            }
        } catch (Exception ex) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER, ex);
        }
    }

    public void mahneBSMahnlauf(Integer mahnlaufIId, TheClientDto theClientDto) throws EJBExceptionLP {
        BSMahnungDto[] bsmahnungen = bsmahnungFindByBSMahnlaufIId(mahnlaufIId, theClientDto);
        for (int i = 0; i < bsmahnungen.length; i++) {
            mahneBSMahnung(bsmahnungen[i].getIId(), theClientDto);
        }
    }

    // **************************************************************************
    // **

    private BestellungDto[] assembleABundLieferterminBestellungDtos(BestellungDto bestellungDtoABTermine[],
            BestellungDto bestellungDtoLiefertermine[]) {
        ArrayList<BestellungDto> arlist = new ArrayList<BestellungDto>();

        for (int i = 0; i < bestellungDtoABTermine.length; i++) {
            arlist.add(bestellungDtoABTermine[i]);
        }

        for (int j = 0; j < bestellungDtoLiefertermine.length; j++) {
            arlist.add(bestellungDtoLiefertermine[j]);
        }
        BestellungDto[] returnArray = new BestellungDto[arlist.size()];
        return (BestellungDto[]) arlist.toArray(returnArray);
    }

    /**
     * erstellt Liefermahnungen, ABMahnungen oder beides ruft dazu die Methoden
     * echteLiefermahnungen() und (oder) echteABMahnungen() auf
     * ------------------
     * ----------------------------------------------------------
     * 
     * @param echteLiefermahnung
     *            boolean
     * @param echteABMahnungen
     *            boolean
     * @param theClientDto
     *            String
     * @throws EJBExceptionLP
     * @return Integer
     *         ----------------------------------------------------------
     *         -----------------
     */
    @TransactionAttribute(TransactionAttributeType.NEVER)
    private Integer createMahnungen(boolean echteLiefermahnung, boolean echteABMahnungen, boolean liefererinnerung,
            TheClientDto theClientDto) throws EJBExceptionLP {

        Session session = null;
        try {
            // Mahnstufen des Mandanten holen
            BSMahnstufeDto bsmahnstufeDto[] = this.bsmahnstufeFindByMandantCNr(theClientDto.getMandant(),
                    theClientDto);
            if (bsmahnstufeDto == null || bsmahnstufeDto.length == 0) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FINANZ_KEINE_MAHNSTUFEN_EINGETRAGEN, "");
            }

            // mahnlaufIId generieren wird fuer Liefermahnung und ABMahnung
            // gebraucht
            Integer bsmahnlaufIId = null;
            BSMahnlaufDto bsmahnlaufDto = null;
            bsmahnlaufIId = context.getBusinessObject(BSMahnwesenFac.class).createBSMahnlauf(bsmahnlaufDto,
                    theClientDto);
            SessionFactory factory = FLRSessionFactory.getFactory();
            session = factory.openSession();
            Criteria crit = session.createCriteria(FLRBestellpositionReport.class);

            // folgende Positionsarten werden ignoriert.
            Collection<String> cPositionsarten = new LinkedList<String>();
            cPositionsarten.add(BestellpositionFac.BESTELLPOSITIONART_BETRIFFT);
            cPositionsarten.add(BestellpositionFac.BESTELLPOSITIONART_SEITENUMBRUCH);
            cPositionsarten.add(BestellpositionFac.BESTELLPOSITIONART_LEERZEILE);
            cPositionsarten.add(BestellpositionFac.BESTELLPOSITIONART_TEXTBAUSTEIN);
            cPositionsarten.add(BestellpositionFac.BESTELLPOSITIONART_TEXTEINGABE);
            crit.add(Restrictions.not(Restrictions
                    .in(BestellpositionFac.FLR_BESTELLPOSITION_BESTELLPOSITIONART_C_NR, cPositionsarten)));

            // PJ 16536
            String queryString = "SELECT artgru_i_id FROM FLRMahngruppe m"
                    + " WHERE m.flrartikelgruppe.mandant_c_nr ='" + theClientDto.getMandant() + "'";

            Session session2 = FLRSessionFactory.getFactory().openSession();
            org.hibernate.Query query = session2.createQuery(queryString);
            List<?> results = query.list();
            Iterator<?> resultListIterator = results.iterator();

            Integer[] ids = new Integer[results.size()];
            int row = 0;
            while (resultListIterator.hasNext()) {
                Integer artgruIId = (Integer) resultListIterator.next();
                ids[row] = artgruIId;
                row++;
            }
            session2.close();
            if (ids.length > 0) {
                crit.createAlias("flrartikel", "a");
                crit.createAlias("a.flrartikelgruppe", "ag");

                crit.add(Restrictions.in("ag.i_id", ids));
            }

            Criteria critBestellung = crit.createCriteria(BestellpositionFac.FLR_BESTELLPOSITION_FLRBESTELLUNG);
            // nach mandanten filtern
            critBestellung
                    .add(Restrictions.eq(BestellungFac.FLR_BESTELLUNG_MANDANT_C_NR, theClientDto.getMandant()));
            // PJ 15165
            critBestellung.add(Restrictions.or(Restrictions.isNull(BestellungFac.FLR_BESTELLUNG_T_MAHNSPERREBIS),
                    Restrictions.lt(BestellungFac.FLR_BESTELLUNG_T_MAHNSPERREBIS,
                            Helper.cutTimestamp(new Timestamp(System.currentTimeMillis())))));

            // nach Stati filtern
            Collection<String> cStati = new LinkedList<String>();
            cStati.add(BestellungFac.BESTELLSTATUS_OFFEN);
            cStati.add(BestellungFac.BESTELLSTATUS_BESTAETIGT);
            // SK added BESTELLSTATUS_TEILERLEDIGT
            cStati.add(BestellungFac.BESTELLSTATUS_TEILERLEDIGT);
            critBestellung.add(Restrictions.in(BestellungFac.FLR_BESTELLUNG_BESTELLUNGSTATUS_C_NR, cStati));
            List<?> list = crit.list();

            for (Iterator<?> iter = list.iterator(); iter.hasNext();) {
                FLRBestellpositionReport flrbespos = (FLRBestellpositionReport) iter.next();
                /**
                 * nur Liefermahnungen deren Status bestaetigt ist oder deren
                 * Liefertermin vor heute ist
                 */
                if (echteLiefermahnung == true && !(BestellungFac.BESTELLUNGART_RAHMENBESTELLUNG_C_NR
                        .equals(flrbespos.getFlrbestellung().getBestellungart_c_nr()))) {
                    BSMahnungDto[] bsmahnungdto = getBSMahnwesenFac()
                            .bsmahnungFindByBestellpositionIIdOhneExc(flrbespos.getI_id(), theClientDto);
                    if (bsmahnungdto.length > 0) {

                        Integer latest = 0;
                        for (int y = 0; y < bsmahnungdto.length; y++) {
                            if (bsmahnungdto[y].getMahnstufeIId() > latest) {
                                latest = bsmahnungdto[y].getMahnstufeIId();
                            }
                        }
                        for (int i = 0; i < bsmahnstufeDto.length; i++) {
                            if (latest.equals(bsmahnstufeDto[i].getIId())) {
                                echteLiefermahnungen(flrbespos, bsmahnlaufIId, bsmahnstufeDto[i], theClientDto);
                            }
                        }
                    } else {
                        echteLiefermahnungen(flrbespos, bsmahnlaufIId, null, theClientDto);
                    }
                }

                // lt. WH
                boolean bEchteLiefermahnungVorhanden = false;
                BSMahnungDto[] bsmahnungdto = getBSMahnwesenFac()
                        .bsmahnungFindByBestellpositionIIdOhneExc(flrbespos.getI_id(), theClientDto);
                if (bsmahnungdto.length > 0) {
                    for (int y = 0; y < bsmahnungdto.length; y++) {
                        if (bsmahnungdto[y].getMahnstufeIId() > 0) {
                            bEchteLiefermahnungVorhanden = true;
                        }
                    }
                }

                if (bEchteLiefermahnungVorhanden == false) {

                    /**
                     * nur ABMahnungen deren Status offen ist ausser der
                     * Liefertermin ist vor heute dann ist es eine Liefermahnung
                     */
                    if (echteABMahnungen == true) {
                        // hier wird mahnstufe 0 uebergeben
                        for (int i = 0; i < bsmahnstufeDto.length; i++) {
                            if (bsmahnstufeDto[i].getIId().equals(new Integer(BSMahnwesenFac.MAHNSTUFE_0))) {
                                echteABMahnungen(flrbespos, bsmahnstufeDto[i], bsmahnlaufIId, theClientDto);
                            }
                        }
                    }

                    // lt. WH
                    boolean bABLiefermahnungVorhanden = false;
                    bsmahnungdto = getBSMahnwesenFac().bsmahnungFindByBestellpositionIIdOhneExc(flrbespos.getI_id(),
                            theClientDto);
                    if (bsmahnungdto.length > 0) {
                        for (int y = 0; y < bsmahnungdto.length; y++) {
                            if (bsmahnungdto[y].getMahnstufeIId() == 0) {
                                bABLiefermahnungVorhanden = true;
                            }
                        }
                    }

                    if (bABLiefermahnungVorhanden == false) {

                        // lt. WH Liefererinnerung ist wie echte
                        // Liefermahnung,
                        // jedoch
                        // nur mit Mahnstufe -1
                        if (liefererinnerung == true && !(BestellungFac.BESTELLUNGART_RAHMENBESTELLUNG_C_NR
                                .equals(flrbespos.getFlrbestellung().getBestellungart_c_nr()))) {

                            if (flrbespos.getT_lieferterminbestaetigt() == null) {

                                // hier wird mahnstufe -1 uebergeben
                                for (int i = 0; i < bsmahnstufeDto.length; i++) {
                                    if (bsmahnstufeDto[i].getIId()
                                            .equals(new Integer(BSMahnwesenFac.MAHNSTUFE_MINUS1))) {

                                        liefererinnerungen(flrbespos, bsmahnlaufIId, bsmahnstufeDto[i],
                                                theClientDto);

                                    }
                                }
                            }
                        }
                    }
                }

            }
            return bsmahnlaufIId;
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
            return null;
        } finally {
            closeSession(session);
        }
    }

    /**
     * diese Methode erstellt die echten Liefermahnungen
     * 
     * @param flrbespos
     *            FLRBestellpositionReport
     * @param bsmahnlaufIId
     *            Integer
     * @param bsmahnstufeDto
     *            BSMahnstufeDto[]
     * @param theClientDto
     *            String
     * @throws EJBExceptionLP
     */
    @TransactionAttribute(TransactionAttributeType.NEVER)
    private void echteLiefermahnungen(FLRBestellpositionReport flrbespos, Integer bsmahnlaufIId,
            BSMahnstufeDto bsmahnstufeDto, TheClientDto theClientDto) throws EJBExceptionLP {
        try {
            // wenn Bestellposition bestaetigt
            // wenn Bestellposition offen und uebersteuerterLiefertermin ist vor
            // heute dann
            // ist es eine Liefermahnung
            if (((flrbespos.getBestellpositionstatus_c_nr()
                    .equals(BestellpositionFac.BESTELLPOSITIONSTATUS_BESTAETIGT))
                    || (flrbespos.getBestellpositionstatus_c_nr()
                            .equals(BestellpositionFac.BESTELLPOSITIONSTATUS_OFFEN))
                            && getDate().after(flrbespos.getT_uebersteuerterliefertermin()))) {
                BestellungDto bestellungDto = getBestellungFac()
                        .bestellungFindByPrimaryKeyOhneExc(flrbespos.getFlrbestellung().getI_id());
                anlegenVonEchterLiefermahnung(bestellungDto, bsmahnstufeDto, flrbespos, bsmahnlaufIId,
                        theClientDto);
            }
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
        }
    }

    @TransactionAttribute(TransactionAttributeType.NEVER)
    private void liefererinnerungen(FLRBestellpositionReport flrbespos, Integer bsmahnlaufIId,
            BSMahnstufeDto bsmahnstufeDto, TheClientDto theClientDto) throws EJBExceptionLP {
        try {
            // wenn Bestellposition bestaetigt
            // wenn Bestellposition offen und uebersteuerterLiefertermin ist vor
            // heute dann
            // ist es eine Liefermahnung

            java.sql.Timestamp tTermin = flrbespos.getT_uebersteuerterliefertermin();

            if (flrbespos.getT_auftragsbestaetigungstermin() != null) {
                tTermin = flrbespos.getT_auftragsbestaetigungstermin();
            }

            if (((flrbespos.getBestellpositionstatus_c_nr()
                    .equals(BestellpositionFac.BESTELLPOSITIONSTATUS_BESTAETIGT))
                    || flrbespos.getBestellpositionstatus_c_nr()
                            .equals(BestellpositionFac.BESTELLPOSITIONSTATUS_OFFEN)
                    || flrbespos.getBestellpositionstatus_c_nr()
                            .equals(BestellpositionFac.BESTELLPOSITIONSTATUS_TEILGELIEFERT))
                    && getDate().after(Helper.addiereTageZuTimestamp(tTermin, bsmahnstufeDto.getITage()))) {
                BestellungDto bestellungDto = getBestellungFac()
                        .bestellungFindByPrimaryKeyOhneExc(flrbespos.getFlrbestellung().getI_id());
                anlegenVonLiefererinnerung(bestellungDto, bsmahnstufeDto, flrbespos, bsmahnlaufIId, theClientDto);
            }
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
        }
    }

    /**
     * hier werden Kriterien ueberprueft ob Liefermahnung neu angelegt usw...
     * 
     * @param bestellungDto
     *            BestellungDto
     * @param bsmahnstufeDto
     *            BSMahnstufeDto
     * @param flrbespos
     *            FLRBestellpositionReport
     * @param bsmahnlaufIId
     *            Integer
     * @param theClientDto
     *            String
     * @throws EJBExceptionLP
     */
    @TransactionAttribute(TransactionAttributeType.NEVER)
    private void anlegenVonEchterLiefermahnung(BestellungDto bestellungDto, BSMahnstufeDto bsmahnstufeDto,
            FLRBestellpositionReport flrbespos, Integer bsmahnlaufIId, TheClientDto theClientDto)
            throws EJBExceptionLP, RemoteException {
        if (bestellungDto != null) {
            // wenn heute - letztesMahndatum kleiner als MahnstufeTage dann
            // mache nichts
            if (!(checkZeitraumVonLetzterMahnung(flrbespos, bsmahnstufeDto, theClientDto))) {
                // wenn liefertermin vor heute dann wird hier gemahnt
                Timestamp tLiefertermin = null;
                if (flrbespos.getT_auftragsbestaetigungstermin() != null) {
                    // Wenn AB-Termin zieht immer der
                    tLiefertermin = flrbespos.getT_auftragsbestaetigungstermin();
                } else {
                    tLiefertermin = flrbespos.getT_uebersteuerterliefertermin();
                }
                if (getDate().after(tLiefertermin)) {
                    // mahnen
                    BSMahnungDto bsmahnungDto = null;
                    BestellpositionDto besposDto = getBestellpositionFac()
                            .bestellpositionFindByPrimaryKey(flrbespos.getI_id());
                    bsmahnungDto = new BSMahnungDto();
                    bsmahnungDto.setMandantCNr(theClientDto.getMandant());
                    bsmahnungDto.setMahnlaufIId(bsmahnlaufIId);
                    bsmahnungDto.setBestellungIId(bestellungDto.getIId());
                    bsmahnungDto.setTMahndatum(getDate());
                    bsmahnungDto.setPersonalIIdAnlegen(theClientDto.getIDPersonal());
                    bsmahnungDto.setBestellpositionIId(besposDto.getIId());
                    if (besposDto.getNOffeneMenge() == null) {
                        // Offene Menge null = gesamt Menge ist offen
                        bsmahnungDto.setNOffeneMenge(besposDto.getNMenge());
                    } else {
                        bsmahnungDto.setNOffeneMenge(besposDto.getNOffeneMenge());
                    }
                    // wenn mahnstufeDto null oder 0 dann wird erstmals gemahnt
                    if ((bsmahnstufeDto == null) || (bsmahnstufeDto.getIId().intValue() == 0)) {
                        bsmahnungDto.setMahnstufeIId(new Integer(1));
                    } else {
                        int nextMahnstufe = bsmahnstufeDto.getIId() + 1;
                        BsmahnstufePK mahnstufePK = new BsmahnstufePK(nextMahnstufe, theClientDto.getMandant());
                        BSMahnstufeDto newBSMahnstufeDto = bsmahnstufeFindByPrimaryKeyOhneExc(mahnstufePK);
                        // Hoechste Mahnstufe ueberschritten oder in Mahnstufe
                        // 99
                        if ((newBSMahnstufeDto == null)
                                || newBSMahnstufeDto.getIId().intValue() == BSMahnwesenFac.MAHNSTUFE_99) {
                            bsmahnungDto.setMahnstufeIId(BSMahnwesenFac.MAHNSTUFE_99);
                            // Wenn alte Mahnstufe 99 dann gleich auf gedruckt
                            // setzen
                            if (BSMahnwesenFac.MAHNSTUFE_99 == bsmahnstufeDto.getIId()) {
                                if (bsmahnungDto.getTGedruckt() == null) {
                                    bsmahnungDto.setTGedruckt(getTimestamp());
                                }
                            }
                        } else {
                            bsmahnungDto.setMahnstufeIId(newBSMahnstufeDto.getIId());
                        }
                    }
                    if (!(bsmahnungDto.getNOffeneMenge() == null)) {
                        if (!(bsmahnungDto.getNOffeneMenge().intValue() < 1)) {
                            context.getBusinessObject(BSMahnwesenFac.class).createBSMahnung(bsmahnungDto,
                                    theClientDto);
                        }
                    }
                }
            }
        }
    }

    @TransactionAttribute(TransactionAttributeType.NEVER)
    private void anlegenVonLiefererinnerung(BestellungDto bestellungDto, BSMahnstufeDto bsmahnstufeDto,
            FLRBestellpositionReport flrbespos, Integer bsmahnlaufIId, TheClientDto theClientDto)
            throws EJBExceptionLP, RemoteException {
        if (bestellungDto != null) {
            // mahnen
            BSMahnungDto bsmahnungDto = null;
            BestellpositionDto besposDto = getBestellpositionFac()
                    .bestellpositionFindByPrimaryKey(flrbespos.getI_id());
            bsmahnungDto = new BSMahnungDto();
            bsmahnungDto.setMandantCNr(theClientDto.getMandant());
            bsmahnungDto.setMahnlaufIId(bsmahnlaufIId);
            bsmahnungDto.setBestellungIId(bestellungDto.getIId());
            bsmahnungDto.setTMahndatum(getDate());
            bsmahnungDto.setPersonalIIdAnlegen(theClientDto.getIDPersonal());
            bsmahnungDto.setBestellpositionIId(besposDto.getIId());
            if (besposDto.getNOffeneMenge() == null) {
                // Offene Menge null = gesamt Menge ist offen
                bsmahnungDto.setNOffeneMenge(besposDto.getNMenge());
            } else {
                bsmahnungDto.setNOffeneMenge(besposDto.getNOffeneMenge());
            }

            bsmahnungDto.setMahnstufeIId(BSMahnwesenFac.MAHNSTUFE_MINUS1);

            if (!(bsmahnungDto.getNOffeneMenge() == null)) {
                if (!(bsmahnungDto.getNOffeneMenge().intValue() < 1)) {
                    context.getBusinessObject(BSMahnwesenFac.class).createBSMahnung(bsmahnungDto, theClientDto);
                }
            }

        }
    }

    /**
     * diese Methode erstellt die echte AB-Mahnungen
     * 
     * @param flrbespos
     *            FLRBestellpositionReport
     * @param bsmahnstufeDto
     *            BSMahnstufeDto
     * @param bsmahnlaufIId
     *            Integer
     * @param theClientDto
     *            String
     * @throws EJBExceptionLP
     */
    @TransactionAttribute(TransactionAttributeType.NEVER)
    private void echteABMahnungen(FLRBestellpositionReport flrbespos, BSMahnstufeDto bsmahnstufeDto,
            Integer bsmahnlaufIId, TheClientDto theClientDto) throws EJBExceptionLP, RemoteException {
        // wenn status offen und kein AB-Termin
        // dann ist es eine ABMahnung
        if (flrbespos.getBestellpositionstatus_c_nr().equals(BestellpositionFac.BESTELLPOSITIONSTATUS_OFFEN)
                && (flrbespos.getT_auftragsbestaetigungstermin() == null)) {
            // Wenn vorher bereits Mahnstufe 1 angelegt dann keine AB Mahnung
            BSMahnungDto[] helper = getBSMahnwesenFac()
                    .bsmahnungFindByBestellpositionIIdOhneExc(flrbespos.getI_id(), theClientDto);
            // PJ 14663 solange Mahnstufe 0, trotzdem mahnen
            int maxStufe = BSMahnwesenFac.MAHNSTUFE_0;
            for (int i = 0; i < helper.length; i++) {
                if (helper[i].getMahnstufeIId().intValue() != BSMahnwesenFac.MAHNSTUFE_0) {
                    maxStufe = helper[i].getMahnstufeIId().intValue();
                    break;
                }
            }
            if (helper.length == 0 || maxStufe == BSMahnwesenFac.MAHNSTUFE_0) {
                // wenn heute Minus Mahnstufe 0 Tage groeszer als Belegdatum dann
                // mahne AB
                Timestamp tPosTerminPlusMahnstufe = new Timestamp(
                        flrbespos.getFlrbestellung().getT_belegdatum().getTime()
                                + Helper.calculateDaysBackIntoMilliseconds(bsmahnstufeDto.getITage()));
                tPosTerminPlusMahnstufe = Helper.cutTimestamp(tPosTerminPlusMahnstufe);
                if (Helper.cutTimestamp(getTimestamp()).after(tPosTerminPlusMahnstufe)) {
                    // mahnen
                    BestellungDto bestellungDto = getBestellungFac()
                            .bestellungFindByPrimaryKeyOhneExc(flrbespos.getFlrbestellung().getI_id());
                    BestellpositionDto besposDto = getBestellpositionFac()
                            .bestellpositionFindByPrimaryKey(flrbespos.getI_id());
                    BSMahnungDto bsmahnungDto = null;
                    bsmahnungDto = new BSMahnungDto();
                    bsmahnungDto.setMandantCNr(theClientDto.getMandant());
                    bsmahnungDto.setMahnlaufIId(bsmahnlaufIId);
                    bsmahnungDto.setBestellungIId(bestellungDto.getIId());
                    bsmahnungDto.setTMahndatum(getDate());
                    bsmahnungDto.setPersonalIIdAnlegen(theClientDto.getIDPersonal());
                    bsmahnungDto.setBestellpositionIId(besposDto.getIId());
                    if (besposDto.getNOffeneMenge() == null) {
                        // Wenn offene Menge null dann ist die gesamt Menge
                        // offen
                        bsmahnungDto.setNOffeneMenge(besposDto.getNMenge());
                    } else {
                        bsmahnungDto.setNOffeneMenge(besposDto.getNOffeneMenge());
                    }
                    // Mahnstufe bei AB-Mahnung ist 0
                    bsmahnungDto.setMahnstufeIId(bsmahnstufeDto.getIId());
                    if (!(bsmahnungDto.getNOffeneMenge() == null)) {
                        if (!(bsmahnungDto.getNOffeneMenge().intValue() < 1)) {
                            context.getBusinessObject(BSMahnwesenFac.class).createBSMahnung(bsmahnungDto,
                                    theClientDto);
                        }
                    }
                }
            }
        }
    }

    /**
     * ueberprueft ob die letzte Mahnung schon so lange zurueckliegt das man neu
     * mahnen muss
     * 
     * @param bestellungDto
     *            BestellungDto
     * @param bsmahnstufeDto
     *            BSMahnstufeDto
     * @return boolean
     */
    private boolean checkZeitraumVonLetzterMahnung(FLRBestellpositionReport flrbespos,
            BSMahnstufeDto bsmahnstufeDto, TheClientDto theClientDto) throws EJBExceptionLP, RemoteException {
        boolean bool = false;
        // letztes Mahndatum holen
        BSMahnungDto[] bsmahnungdto = getBSMahnwesenFac()
                .bsmahnungFindByBestellpositionIIdOhneExc(flrbespos.getI_id(), theClientDto);
        if (bsmahnungdto.length > 0) {
            Date latest = bsmahnungdto[0].getTMahndatum();
            Integer iMahnungIId = bsmahnungdto[0].getIId();
            for (int y = 1; y < bsmahnungdto.length; y++) {
                if (bsmahnungdto[y].getTMahndatum().after(latest)) {
                    latest = bsmahnungdto[y].getTMahndatum();
                    iMahnungIId = bsmahnungdto[y].getIId();
                }
            }
            BSMahnungDto lastMahnung = getBSMahnwesenFac().bsmahnungFindByPrimaryKey(iMahnungIId);
            // wenn heute - letztesMahndatum kleiner als MahnstufeTage und
            // wenn das letzteMahndatum nicht heute ist dann mache nichts
            if (getDate().equals(lastMahnung.getTMahndatum())) {
                // Wenn heute schon gemahnt nicht nochmal
                bool = true;
            } else {
                if (lastMahnung.getTMahndatum() != null && lastMahnung.getMahnstufeIId() != null
                        && ((getDate().getTime() - lastMahnung.getTMahndatum().getTime()) < Helper
                                .calculateDaysBackIntoMilliseconds(bsmahnstufeDto.getITage()))
                        && !(lastMahnung.getTMahndatum().equals(getDate()))) {
                    // do nothing
                    bool = true;
                }
            }
        } else {
            // Bisher nicht gemahnt
            bsmahnstufeDto = getBSMahnwesenFac().bsmahnstufeFindByPrimaryKeyOhneExc(
                    new BsmahnstufePK(BSMahnwesenFac.MAHNSTUFE_1, theClientDto.getMandant()));
            Timestamp tMaxPosTermin = new Timestamp(
                    getDate().getTime() - Helper.calculateDaysBackIntoMilliseconds(bsmahnstufeDto.getITage()));
            Timestamp tHelper = null;
            if (flrbespos.getT_auftragsbestaetigungstermin() == null) {
                tHelper = flrbespos.getT_uebersteuerterliefertermin();
            } else {
                tHelper = flrbespos.getT_auftragsbestaetigungstermin();
            }
            if (tHelper.after(tMaxPosTermin)) {
                // nicht mahnen
                bool = true;
            }
        }
        return bool;
    }

    /**
     * liefert das datum vom ABTermin oder sonst vom uebersteuertenLiefertermin
     * der Bestellposition
     * 
     * @param flrbespos
     *            FLRBestellpositionReport
     * @return Date
     */
    private Date getRichtigesMahndatumFuerABMahnung(FLRBestellpositionReport flrbespos) {
        // datum vom Beleg oder sonst Datum vom bestaetigen Liefertermin
        java.sql.Date date = null;
        if (flrbespos.getT_auftragsbestaetigungstermin() == null) {
            date = new Date(flrbespos.getT_uebersteuerterliefertermin().getTime());
        } else {
            date = new Date(flrbespos.getT_auftragsbestaetigungstermin().getTime());
        }
        return date;
    }

    public BSMahnungDto[] bsmahnungFindByBSMahnlaufIIdOhneExc(Integer mahnlaufIId, TheClientDto theClientDto) {
        BSMahnungDto bsmahnungDto[] = null;
        // try {
        Query query = em.createNamedQuery("BSMahnungfindByBSMahnlaufIId");
        query.setParameter(1, mahnlaufIId);
        // @todo getSingleResult oder getResultList ?
        bsmahnungDto = assembleBSMahnungDtos(query.getResultList());
        // if (bsmahnungDto.isEmpty()) {
        // nothing
        // }
        // }
        // catch (FinderException ex) {
        // nothing
        // }
        return bsmahnungDto;
    }
}