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

Java tutorial

Introduction

Here is the source code for com.lp.server.artikel.ejbfac.FehlmengeFacBean.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.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
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.Order;
import org.hibernate.criterion.Restrictions;

import com.lp.server.artikel.ejb.Artikelfehlmenge;
import com.lp.server.artikel.fastlanereader.generated.FLRFehlmenge;
import com.lp.server.artikel.service.ArtikelFac;
import com.lp.server.artikel.service.ArtikelfehlmengeDto;
import com.lp.server.artikel.service.ArtikelfehlmengeDtoAssembler;
import com.lp.server.artikel.service.FehlmengeFac;
import com.lp.server.fertigung.fastlanereader.generated.FLRLossollmaterial;
import com.lp.server.fertigung.service.FertigungFac;
import com.lp.server.fertigung.service.LosDto;
import com.lp.server.fertigung.service.LossollmaterialDto;
import com.lp.server.system.pkgenerator.PKConst;
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;
import com.lp.util.Helper;

@Stateless
public class FehlmengeFacBean extends Facade implements FehlmengeFac {
    @PersistenceContext
    private EntityManager em;

    @Resource
    private SessionContext context;

    public void createArtikelfehlmenge(ArtikelfehlmengeDto artikelfehlmengeDto) throws EJBExceptionLP {
        // primary key
        Integer iId = getPKGeneratorObj().getNextPrimaryKey(PKConst.PK_FEHLMENGE);
        artikelfehlmengeDto.setIId(iId);
        try {
            Artikelfehlmenge artikelfehlmenge = new Artikelfehlmenge(artikelfehlmengeDto.getIId(),
                    artikelfehlmengeDto.getCBelegartnr(), artikelfehlmengeDto.getIBelegartpositionid(),
                    artikelfehlmengeDto.getArtikelIId(), artikelfehlmengeDto.getNMenge(),
                    artikelfehlmengeDto.getTLiefertermin());
            em.persist(artikelfehlmenge);
            em.flush();
            setArtikelfehlmengeFromArtikelfehlmengeDto(artikelfehlmenge, artikelfehlmengeDto);
        } catch (EntityExistsException ex) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_ANLEGEN, ex);
        }
    }

    private void removeArtikelfehlmenge(ArtikelfehlmengeDto artikelfehlmengeDto) throws EJBExceptionLP {
        // try {
        if (artikelfehlmengeDto != null) {
            Integer iId = artikelfehlmengeDto.getIId();
            Artikelfehlmenge toRemove = em.find(Artikelfehlmenge.class, iId);
            if (toRemove == null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                        "Fehler bei removeArtikelfehlmenge. Es gibt keine iid " + iId + "\ndto.toString: "
                                + artikelfehlmengeDto.toString());
            }
            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);
        // }
    }

    private void updateArtikelfehlmenge(ArtikelfehlmengeDto artikelfehlmengeDto) throws EJBExceptionLP {
        if (artikelfehlmengeDto != null) {
            Integer iId = artikelfehlmengeDto.getIId();
            // try {
            Artikelfehlmenge artikelfehlmenge = em.find(Artikelfehlmenge.class, iId);
            if (artikelfehlmenge == null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_UPDATE,
                        "Fehler bei updateArtikelfehlmenge. Es gibt keine iid " + iId + "\ndto.toString: "
                                + artikelfehlmengeDto.toString());
            }
            setArtikelfehlmengeFromArtikelfehlmengeDto(artikelfehlmenge, artikelfehlmengeDto);
            // }
            // catch (FinderException ex) {
            // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_UPDATE, ex);
            // }
        }
    }

    public void aktualisiereFehlmenge(String belegartCNr, Integer belegpositionIId,
            boolean throwExceptionWhenCreate, TheClientDto theClientDto) throws EJBExceptionLP, RemoteException {
        // try {
        if (belegartCNr.equals(LocaleFac.BELEGART_LOS)) {
            // die position holen
            LossollmaterialDto losmat = getFertigungFac().lossollmaterialFindByPrimaryKeyOhneExc(belegpositionIId);
            if (losmat == null) {
                // entweder falsche id uebergeben oder die position wurde gerade
                // geloescht
                // also auch den eintrag in der fehlmengenliste loeschen
                try {
                    removeArtikelfehlmenge(LocaleFac.BELEGART_LOS, belegpositionIId);

                } catch (Throwable ex) {
                    // nix tun
                    // das kann passieren wenn eine position geloescht wird, die
                    // keinen artikel hat
                }
                return;
            }

            // nur fuer Artikel
            if (losmat.getArtikelIId() != null) {
                LosDto losDto = getFertigungFac().losFindByPrimaryKey(losmat.getLosIId());
                boolean bFehlmengeZulaessig = true;
                if (losDto.getStatusCNr().equals(FertigungFac.STATUS_STORNIERT)
                        || losDto.getStatusCNr().equals(FertigungFac.STATUS_ANGELEGT)
                        || losDto.getStatusCNr().equals(FertigungFac.STATUS_ERLEDIGT)) {
                    bFehlmengeZulaessig = false;
                }
                // Eintrag suchen
                ArtikelfehlmengeDto aFehlmengeDto = null;
                try {
                    Query query = em.createNamedQuery("ArtikelfehlmengefindByBelegartCNrBelegartPositionIId");
                    query.setParameter(1, LocaleFac.BELEGART_LOS);
                    query.setParameter(2, losmat.getIId());
                    Artikelfehlmenge aFehlmenge = (Artikelfehlmenge) query.getSingleResult();
                    aFehlmengeDto = assembleArtikelfehlmengeDto(aFehlmenge);
                    aFehlmengeDto.setArtikelIId(losmat.getArtikelIId());
                    // fuer Stati, in denen es keine Fehlmengen gibt, wird der
                    // fehlmengeneintrag geloescht
                    if (!bFehlmengeZulaessig) {
                        removeArtikelfehlmenge(aFehlmengeDto);
                    }
                } catch (NoResultException ex) {
                    // gibts noch nicht, also muss ein neuer her
                    aFehlmengeDto = new ArtikelfehlmengeDto();
                    aFehlmengeDto.setArtikelIId(losmat.getArtikelIId());
                    aFehlmengeDto.setCBelegartnr(LocaleFac.BELEGART_LOS);
                    aFehlmengeDto.setIBelegartpositionid(losmat.getIId());
                }
                // Weitere Aktionen nur dann, wenn das anlegen einer Fehlmenge
                // auch zulaessig ist
                if (bFehlmengeZulaessig) {
                    java.sql.Date dTermin;

                    BigDecimal bdAusgegeben = getFertigungFac().getAusgegebeneMenge(losmat.getIId(), null,
                            theClientDto);

                    if (losmat.getNMenge().compareTo(new BigDecimal(0)) > 0) {
                        // Positive Fehlmenge: produktionsstart
                        dTermin = losDto.getTProduktionsbeginn();

                        if (losmat.getNMenge().subtract(bdAusgegeben).doubleValue() > 0) {

                            aFehlmengeDto.setNMenge(losmat.getNMenge().subtract(bdAusgegeben));
                        } else {
                            aFehlmengeDto.setNMenge(new BigDecimal(0));
                            if (aFehlmengeDto.getIId() != null) {
                                removeArtikelfehlmenge(aFehlmengeDto);
                                return;
                            }
                        }

                    } else {
                        // Negative Fehlmenge: produktionsende
                        dTermin = losDto.getTProduktionsende();
                        BigDecimal fehlmenge = losmat.getNMenge().abs().subtract(bdAusgegeben.abs());

                        if (fehlmenge.doubleValue() > 0) {
                            aFehlmengeDto.setNMenge(losmat.getNMenge().subtract(bdAusgegeben));
                        } else {
                            aFehlmengeDto.setNMenge(new BigDecimal(0));
                        }

                    }

                    // PJ17994
                    dTermin = Helper.addiereTageZuDatum(dTermin, losmat.getIBeginnterminoffset());
                    aFehlmengeDto.setTLiefertermin(dTermin);

                    // eintraege mit menge 0 loeschen bzw. gar nicht speichern
                    if (aFehlmengeDto.getNMenge().compareTo(new BigDecimal(0)) == 0) {
                        if (aFehlmengeDto.getIId() != null) {
                            removeArtikelfehlmenge(aFehlmengeDto.getCBelegartnr(),
                                    aFehlmengeDto.getIBelegartpositionid());
                        } else {
                            // steht eh nicht in der db
                        }
                    } else {
                        if (aFehlmengeDto.getIId() == null) {
                            // ein neuer -> anlegen
                            if (throwExceptionWhenCreate) {
                                throw new EJBExceptionLP(
                                        EJBExceptionLP.FEHLER_FERTIGUNG_AUSGABE_ES_WUERDEN_FEHLMENGEN_ENTSTEHEN,
                                        "FEHLER_FERTIGUNG_AUSGABE_ES_WUERDEN_FEHLMENGEN_ENTSTEHEN");
                            }

                            createArtikelfehlmenge(aFehlmengeDto);
                        } else {
                            // steht eh nicht in der db
                            updateArtikelfehlmenge(aFehlmengeDto);
                        }
                    }
                } else {
                    // wenn nicht zulaessig, dann loeschen.

                    try {
                        Query query = em.createNamedQuery("ArtikelfehlmengefindByBelegartCNrBelegartPositionIId");
                        query.setParameter(1, aFehlmengeDto.getCBelegartnr());
                        query.setParameter(2, aFehlmengeDto.getIBelegartpositionid());
                        Artikelfehlmenge fehlmenge = (Artikelfehlmenge) query.getSingleResult();
                        if (fehlmenge != null) {
                            try {
                                em.remove(fehlmenge);
                                em.flush();
                            } catch (EntityExistsException ex2) {
                                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEIM_LOESCHEN, ex2);
                            }
                        }
                    } catch (NoResultException ex1) {
                        // Wenn nicht gefunden, dann brauchts auch nicht
                        // geloescht zu werden
                    }
                    // }
                    // }
                    // }
                    // }
                    // catch (RemoteException ex) {
                    // throwEJBExceptionLPRespectOld(ex);
                }
            }
        }
    }

    public ArtikelfehlmengeDto artikelfehlmengeFindByPrimaryKey(Integer iId) throws EJBExceptionLP {
        try {
            Artikelfehlmenge artikelfehlmenge = em.find(Artikelfehlmenge.class, iId);
            if (artikelfehlmenge == null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                        "Fehler bei artikelfehlmengeFindByPrimaryKey. Es gibt keine iid " + iId);
            }
            return assembleArtikelfehlmengeDto(artikelfehlmenge);
        } catch (Exception ex) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, ex);
        }
    }

    public ArtikelfehlmengeDto[] artikelfehlmengeFindByArtikelIId(Integer artikelIId) throws EJBExceptionLP {
        // try {
        Query query = em.createNamedQuery("ArtikelfehlmengefindByArtikelIId");
        query.setParameter(1, artikelIId);
        // @todo getSingleResult oder getResultList ?
        Collection<?> cl = query.getResultList();
        // if (cl.isEmpty()) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
        // null);
        // }
        return assembleArtikelfehlmengeDtos(cl);
        // }
        // catch (Exception ex) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
        // ex);
        // }
    }

    private void setArtikelfehlmengeFromArtikelfehlmengeDto(Artikelfehlmenge artikelfehlmenge,
            ArtikelfehlmengeDto artikelfehlmengeDto) {
        artikelfehlmenge.setCBelegartnr(artikelfehlmengeDto.getCBelegartnr());
        artikelfehlmenge.setIBelegartpositionid(artikelfehlmengeDto.getIBelegartpositionid());
        artikelfehlmenge.setArtikelIId(artikelfehlmengeDto.getArtikelIId());
        artikelfehlmenge.setNMenge(artikelfehlmengeDto.getNMenge());
        artikelfehlmenge.setTLiefertermin(artikelfehlmengeDto.getTLiefertermin());
        em.merge(artikelfehlmenge);
        em.flush();
    }

    private ArtikelfehlmengeDto assembleArtikelfehlmengeDto(Artikelfehlmenge artikelfehlmenge) {
        return ArtikelfehlmengeDtoAssembler.createDto(artikelfehlmenge);
    }

    private ArtikelfehlmengeDto[] assembleArtikelfehlmengeDtos(Collection<?> artikelfehlmenges) {
        List<ArtikelfehlmengeDto> list = new ArrayList<ArtikelfehlmengeDto>();
        if (artikelfehlmenges != null) {
            Iterator<?> iterator = artikelfehlmenges.iterator();
            while (iterator.hasNext()) {
                Artikelfehlmenge artikelfehlmenge = (Artikelfehlmenge) iterator.next();
                list.add(assembleArtikelfehlmengeDto(artikelfehlmenge));
            }
        }
        ArtikelfehlmengeDto[] returnArray = new ArtikelfehlmengeDto[list.size()];
        return (ArtikelfehlmengeDto[]) list.toArray(returnArray);
    }

    public BigDecimal getAnzahlFehlmengeEinesArtikels(Integer artikelIId, TheClientDto theClientDto)
            throws EJBExceptionLP {
        BigDecimal bdFehlmenge = new BigDecimal(0);

        ArrayList<?> al = getFehlmengen(artikelIId, theClientDto.getMandant(), theClientDto);

        for (int i = 0; i < al.size(); i++) {
            FLRFehlmenge flr = (FLRFehlmenge) al.get(i);
            bdFehlmenge = bdFehlmenge.add(flr.getN_menge());
        }
        return bdFehlmenge;
    }

    public BigDecimal getAnzahlderPositivenFehlmengenEinesArtikels(Integer artikelIId, TheClientDto theClientDto) {
        BigDecimal bdFehlmenge = new BigDecimal(0);

        ArrayList<?> al = getFehlmengen(artikelIId, theClientDto.getMandant(), theClientDto);

        for (int i = 0; i < al.size(); i++) {
            FLRFehlmenge flr = (FLRFehlmenge) al.get(i);
            if (flr.getN_menge().doubleValue() > 0) {
                bdFehlmenge = bdFehlmenge.add(flr.getN_menge());
            }
        }
        return bdFehlmenge;
    }

    public ArrayList getFehlmengen(Integer artikelIId, String mandantCNr, TheClientDto theClientDto)
            throws EJBExceptionLP {
        Session session = null;
        try {
            SessionFactory factory = FLRSessionFactory.getFactory();
            session = factory.openSession();
            Criteria c = session.createCriteria(FLRFehlmenge.class);
            // Filter nach Artikel
            c.add(Restrictions.eq(ArtikelFac.FLR_FEHLMENGE_ARTIKEL_I_ID, artikelIId));
            // Filter nach Mandant
            c.createCriteria(ArtikelFac.FLR_FEHLMENGE_FLRLOSSOLLMATERIAL)
                    .createCriteria(FertigungFac.FLR_LOSSOLLMATERIAL_FLRLOS)
                    .add(Restrictions.eq(FertigungFac.FLR_LOS_MANDANT_C_NR, mandantCNr));
            // Sortierung nach Liefertermin
            c.addOrder(Order.asc(ArtikelFac.FLR_FEHLMENGE_T_LIEFERTERMIN));
            List<?> list = c.list();
            return new ArrayList(list);
        } finally {
            if (session != null) {
                session.close();
            }
        }
    }

    public ArtikelfehlmengeDto artikelfehlmengeFindByBelegartCNrBelegartPositionIId(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("ArtikelfehlmengefindByBelegartCNrBelegartPositionIId");
        query.setParameter(1, belegartCNr);
        query.setParameter(2, belegartpositionIId);
        // @todo getSingleResult oder getResultList ?
        Artikelfehlmenge artikelfehlmenge = (Artikelfehlmenge) query.getSingleResult();
        if (artikelfehlmenge == null) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND,
                    "Fehler bei artikelfehlmengeFindByBelegartCNrBelegartPositionIId. Es gibt keine Artikelfehlmenge"
                            + "mit belegartpositionIId " + belegartpositionIId + " und belegart " + belegartCNr);
        }
        return assembleArtikelfehlmengeDto(artikelfehlmenge);
        // }
        // catch (FinderException e) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND, e);
        // }
    }

    public ArtikelfehlmengeDto artikelfehlmengeFindByBelegartCNrBelegartPositionIIdOhneExc(String belegartCNr,
            Integer belegartpositionIId) throws EJBExceptionLP {
        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("ArtikelfehlmengefindByBelegartCNrBelegartPositionIId");
            query.setParameter(1, belegartCNr);
            query.setParameter(2, belegartpositionIId);
            Artikelfehlmenge artikelfehlmenge = (Artikelfehlmenge) query.getSingleResult();
            return assembleArtikelfehlmengeDto(artikelfehlmenge);
        } catch (NoResultException ex) {
            return null;
        }
    }

    private void removeArtikelfehlmenge(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"));
        }
        ArtikelfehlmengeDto a = artikelfehlmengeFindByBelegartCNrBelegartPositionIId(belegartCNr,
                belegartpositionIId);
        removeArtikelfehlmenge(a);
    }

    /**
     * Fehlmengen komplett neu erzeugen
     * 
     * @param theClientDto der aktuelle Benutzer 
     * @throws EJBExceptionLP
     */
    @TransactionAttribute(TransactionAttributeType.NEVER)
    public void pruefeFehlmengen(TheClientDto theClientDto) throws EJBExceptionLP {
        Session session = null;
        try {
            session = FLRSessionFactory.getFactory().openSession();

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

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

            Criteria cLosmat = session.createCriteria(FLRLossollmaterial.class);
            Criteria cLos = cLosmat.createCriteria(FertigungFac.FLR_LOSSOLLMATERIAL_FLRLOS);
            // Filter nach Status
            Collection<String> cStati = new LinkedList<String>();
            cStati.add(FertigungFac.STATUS_AUSGEGEBEN);
            cStati.add(FertigungFac.STATUS_GESTOPPT);
            cStati.add(FertigungFac.STATUS_IN_PRODUKTION);
            cStati.add(FertigungFac.STATUS_TEILERLEDIGT);
            cLos.add(Restrictions.in(FertigungFac.FLR_LOS_STATUS_C_NR, cStati));

            // Query ausfuehren
            List<?> listLosmat = cLosmat.list();
            for (Iterator<?> iter = listLosmat.iterator(); iter.hasNext();) {
                FLRLossollmaterial item = (FLRLossollmaterial) iter.next();
                BigDecimal bdAusgegeben = getFertigungFac().getAusgegebeneMenge(item.getI_id(), null, theClientDto);
                BigDecimal bdFehlmenge = item.getN_menge().subtract(bdAusgegeben.abs());

                // gibt es ein Fehlmenge?
                if (bdFehlmenge.compareTo(new BigDecimal(0)) > 0) {
                    // Eintrag suchen
                    ArtikelfehlmengeDto fmDto = new ArtikelfehlmengeDto();
                    fmDto.setArtikelIId(item.getFlrartikel().getI_id());
                    fmDto.setCBelegartnr(LocaleFac.BELEGART_LOS);
                    fmDto.setIBelegartpositionid(item.getI_id());
                    fmDto.setNMenge(bdFehlmenge);
                    fmDto.setTLiefertermin(new java.sql.Date(item.getFlrlos().getT_produktionsbeginn().getTime()));

                    // PJ17994
                    fmDto.setTLiefertermin(Helper.addiereTageZuDatum(
                            new java.sql.Date(item.getFlrlos().getT_produktionsbeginn().getTime()),
                            item.getI_beginnterminoffset()));

                    context.getBusinessObject(FehlmengeFac.class).createArtikelfehlmenge(fmDto);
                    myLogger.warn(theClientDto.getIDUser(), "Fehlmenge nachgetragen: " + fmDto);

                } else {

                    BigDecimal fehlmenge = item.getN_menge().abs().subtract(bdAusgegeben.abs());

                    if (fehlmenge.doubleValue() > 0) {
                        ArtikelfehlmengeDto fmDto = new ArtikelfehlmengeDto();
                        fmDto.setArtikelIId(item.getFlrartikel().getI_id());
                        fmDto.setCBelegartnr(LocaleFac.BELEGART_LOS);
                        fmDto.setIBelegartpositionid(item.getI_id());

                        fmDto.setNMenge(item.getN_menge().subtract(bdAusgegeben));
                        // PJ17994
                        fmDto.setTLiefertermin(Helper.addiereTageZuDatum(
                                new java.sql.Date(item.getFlrlos().getT_produktionsende().getTime()),
                                item.getI_beginnterminoffset()));

                        context.getBusinessObject(FehlmengeFac.class).createArtikelfehlmenge(fmDto);
                        myLogger.warn(theClientDto.getIDUser(), "Fehlmenge nachgetragen: " + fmDto);
                    }
                }
            }
        } catch (RemoteException ex) {
            throwEJBExceptionLPRespectOld(ex);
        } finally {
            if (session != null) {
                session.close();
            }
        }
    }
}