Example usage for java.math BigDecimal ROUND_HALF_EVEN

List of usage examples for java.math BigDecimal ROUND_HALF_EVEN

Introduction

In this page you can find the example usage for java.math BigDecimal ROUND_HALF_EVEN.

Prototype

int ROUND_HALF_EVEN

To view the source code for java.math BigDecimal ROUND_HALF_EVEN.

Click Source Link

Document

Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor.

Usage

From source file:com.lp.server.fertigung.ejbfac.FertigungFacBean.java

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public BigDecimal getAusgegebeneMengePreis(Integer lossollmaterialIId, java.sql.Timestamp tStichtag,
        TheClientDto theClientDto) throws EJBExceptionLP {
    try {/*from w  w w .  ja va  2s  .  c  om*/
        BigDecimal bdMenge = new BigDecimal(0);
        BigDecimal bdWert = new BigDecimal(0);
        LosistmaterialDto[] losist = losistmaterialFindByLossollmaterialIId(lossollmaterialIId);
        for (int i = 0; i < losist.length; i++) {

            BigDecimal bdAusgegeben = getLagerFac().getMengeEinerBelegposition(LocaleFac.BELEGART_LOS,
                    losist[i].getIId(), tStichtag);

            if (Helper.short2boolean(losist[i].getBAbgang())) {

                BigDecimal bdPreis = getLagerFac().getGemittelterGestehungspreisEinerAbgangsposition(
                        LocaleFac.BELEGART_LOS, losist[i].getIId());
                bdMenge = bdMenge.add(bdAusgegeben);
                bdWert = bdWert.add(bdPreis.multiply(bdAusgegeben));
            } else {
                BigDecimal bdPreis = getLagerFac().getGemittelterEinstandspreisEinerZugangsposition(
                        LocaleFac.BELEGART_LOS, losist[i].getIId());
                bdMenge = bdMenge.subtract(bdAusgegeben);
                bdWert = bdWert.subtract(bdPreis.multiply(bdAusgegeben));
            }
        }
        if (bdMenge.doubleValue() == 0) {
            return bdMenge;
        } else {
            return bdWert.divide(bdMenge, BigDecimal.ROUND_HALF_EVEN);
        }
    } catch (RemoteException ex) {
        throwEJBExceptionLPRespectOld(ex);
        return null;
    }
}

From source file:com.lp.server.fertigung.ejbfac.FertigungFacBean.java

@TransactionTimeout(1000)
public void aktualisiereNachtraeglichPreiseAllerLosablieferungen(Integer losIId, TheClientDto theClientDto,
        boolean bNurLetztenMaterialwertNeuBerechnen) throws EJBExceptionLP {
    LosDto losDto = losFindByPrimaryKey(losIId);

    try {//ww  w  .j ava 2s .  co  m
        ParametermandantDto parametermandantDto = getParameterFac().getMandantparameter(
                theClientDto.getMandant(), ParameterFac.KATEGORIE_FERTIGUNG,
                ParameterFac.PARAMETER_ISTZEITEN_GLEICH_SOLLZEITEN);
        boolean bSollGleichIstzeiten = false;
        if (((java.lang.Boolean) parametermandantDto.getCWertAsObject()).booleanValue() == true) {
            bSollGleichIstzeiten = true;
        }

        // AZ-Werte aktualisieren
        if (bSollGleichIstzeiten) {
            aktualisiereAZAllerLosablieferungenWennSollIstGleichIst(losIId, theClientDto);
        } else {
            aktualisiereAZAllerLosablieferungen(losIId, theClientDto);
        }

        // Preise berechnen:
        // --------------------------------------------------------------
        // ---------
        // 1. der inklusive aller bisherigen ablieferungen erledigte
        // Materialwert
        if (bNurLetztenMaterialwertNeuBerechnen == false) {
            materialwertAllerLosablieferungenNeuBerechnen(losDto, theClientDto);
        }

        // PJ 14807
        boolean bAblieferpreisIstDurchschnitspreis = false;
        ParametermandantDto parameter = getParameterFac().getMandantparameter(theClientDto.getMandant(),
                ParameterFac.KATEGORIE_FERTIGUNG,
                ParameterFac.PARAMETER_ABLIEFERUNGSPREIS_IST_DURCHSCHNITTSPREIS);
        bAblieferpreisIstDurchschnitspreis = ((Boolean) parameter.getCWertAsObject());

        BigDecimal bdMaterialwertGesamt = getErledigterMaterialwertNEU(losDto, theClientDto);

        // --------------------------------------------------------------
        // ---------
        // nun der detaillierte Arbeitszeitwert (mit Beruecksichtigung
        // der Unterlose)
        // 1. der inklusive aller bisherigen ablieferungen erledigte
        // Arbeitszeitwert
        BigDecimal bdArbeitszeitwertAusUnterlosenGesamt = getErledigterArbeitszeitwertAusUnterlosen(losDto,
                theClientDto);

        // PJ14807
        BigDecimal bdAzWertDurchschnitt = new BigDecimal(0);
        BigDecimal bdMatWertDurchschnitt = new BigDecimal(0);

        if (bAblieferpreisIstDurchschnitspreis == true) {
            BigDecimal bdGesamtkosten = new BigDecimal(0);
            // Maschinenzeiten
            AuftragzeitenDto[] zeitenMaschine = getZeiterfassungFac().getAllMaschinenzeitenEinesBeleges(losIId,
                    null, null, null, theClientDto);
            for (int j = 0; j < zeitenMaschine.length; j++) {
                bdGesamtkosten = bdGesamtkosten.add(zeitenMaschine[j].getBdKosten());
            }

            // "normale" Zeiten
            AuftragzeitenDto[] zeitenMann = getZeiterfassungFac().getAllZeitenEinesBeleges(
                    LocaleFac.BELEGART_LOS, losIId, null, null, null, null, false, false, theClientDto);
            for (int j = 0; j < zeitenMann.length; j++) {
                bdGesamtkosten = bdGesamtkosten.add(zeitenMann[j].getBdKosten());
            }

            bdGesamtkosten = bdGesamtkosten.add(bdArbeitszeitwertAusUnterlosenGesamt);

            BigDecimal bdAbgeliefertGesamt = getErledigteMenge(losDto.getIId(), theClientDto);
            if (bdAbgeliefertGesamt.doubleValue() > 0) {
                bdAzWertDurchschnitt = bdGesamtkosten.divide(bdAbgeliefertGesamt, 4,
                        BigDecimal.ROUND_HALF_EVEN);
                bdMatWertDurchschnitt = bdMaterialwertGesamt.divide(bdAbgeliefertGesamt, 4,
                        BigDecimal.ROUND_HALF_EVEN);
            }
        }

        Query query = em.createNamedQuery("LosablieferungfindByLosIId");
        query.setParameter(1, losIId);
        Collection<?> losablieferungs = query.getResultList();

        LosablieferungDto[] losabDtos = assembleLosablieferungDtosOhneSnrs(losablieferungs);

        for (Iterator<?> iter = losablieferungs.iterator(); iter.hasNext();) {
            Losablieferung losablieferung = (Losablieferung) iter.next();

            // 2. bisher erledigte duerfen aber nicht mehr beruecksichtigt
            // werden -> subtrahieren
            // Diese werden durch die "Assemblierung" neu geladen (es
            // koennten sich Werte geaendert haben), das Find faellt aber
            // weg

            BigDecimal bdMaterialwert = bdMaterialwertGesamt;

            if (bAblieferpreisIstDurchschnitspreis == false) {

                if (bNurLetztenMaterialwertNeuBerechnen == true && iter.hasNext() == false) {
                    // Ausser die betroffene Ablieferung selbst
                    for (int i = 0; i < losabDtos.length; i++) {
                        if (!losablieferung.getIId().equals(losabDtos[i].getIId())) {
                            bdMaterialwert = bdMaterialwert.subtract(
                                    losabDtos[i].getNMaterialwert().multiply(losabDtos[i].getNMenge()));
                        }
                    }
                    // 3. Nach Division durch die Menge der neuen
                    // Ablieferung
                    // hab
                    // ich den Einzelwert
                    losablieferung.setNMaterialwert(
                            bdMaterialwert.divide(losablieferung.getNMenge(), 4, BigDecimal.ROUND_HALF_EVEN));
                }
                // ----------------------------------------------------------
                // ----
                // ---------
                // Gestehungspreis: ist die Summe aus Materialwert und
                // Arbeitszeitwert
                losablieferung.setNGestehungspreis(
                        losablieferung.getNMaterialwert().add(losablieferung.getNArbeitszeitwert()));

                BigDecimal bdArbeitszeitwertAusUnterlosen = bdArbeitszeitwertAusUnterlosenGesamt;

                // 2. bisher erledigte duerfen aber nicht mehr
                // beruecksichtigt
                // werden -> subtrahieren
                for (int i = 0; i < losabDtos.length; i++) {
                    if (!losablieferung.getIId().equals(losabDtos[i].getIId())) {
                        bdArbeitszeitwertAusUnterlosen = bdArbeitszeitwertAusUnterlosen.subtract(losabDtos[i]
                                .getNArbeitszeitwertdetailliert().multiply(losabDtos[i].getNMenge()));
                    }
                }
                // 3. Nach Division durch die Menge der neuen Ablieferung
                // hab
                // ich den Einzelwert
                BigDecimal bdAZWertAusUnterlosen = bdArbeitszeitwertAusUnterlosen
                        .divide(losablieferung.getNMenge(), 4, BigDecimal.ROUND_HALF_EVEN);
                // 4. Dazu kommt noch der AZ-Wert aus diesem Los
                losablieferung.setNArbeitszeitwertdetailliert(
                        bdAZWertAusUnterlosen.add(losablieferung.getNArbeitszeitwert()));
                // ----------------------------------------------------------
                // ----
                // ---------
                // nun der detaillierte Materialwert
                // der ist einfach die Differenz zwischen Gestehungspreis
                // und
                // Detailliertem Arbeitszeitwert
                losablieferung.setNMaterialwertdetailliert(losablieferung.getNGestehungspreis()
                        .subtract(losablieferung.getNArbeitszeitwertdetailliert()));

            } else {
                losablieferung.setNMaterialwertdetailliert(bdMatWertDurchschnitt);
                losablieferung.setNMaterialwert(bdMatWertDurchschnitt);
                losablieferung.setNArbeitszeitwertdetailliert(bdAzWertDurchschnitt);
                losablieferung.setNArbeitszeitwert(bdAzWertDurchschnitt);
                losablieferung.setNGestehungspreis(bdMatWertDurchschnitt.add(bdAzWertDurchschnitt));
            }
            // speichern

            if (bNurLetztenMaterialwertNeuBerechnen == false
                    || (bNurLetztenMaterialwertNeuBerechnen == true && iter.hasNext() == false)) {

                losablieferung.setTAendern(losablieferung.getTAendern());
                losablieferung.setBGestehungspreisneuberechnen(Helper.boolean2Short(false));
                LosablieferungDto loaDot = assembleLosablieferungDto(losablieferung);
                // auch in Lagerbewegung aendern
                bucheLosAblieferungAufLager(loaDot, losDto, theClientDto);
            }
        }
    } catch (RemoteException ex1) {
        throwEJBExceptionLPRespectOld(ex1);
    }
    // catch (FinderException ex) {
    // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
    // ex);
    // }
}

From source file:com.lp.server.fertigung.ejbfac.FertigungFacBean.java

private void materialwertAllerLosablieferungenNeuBerechnen(LosDto losDto, TheClientDto theClientDto) {

    Query query = em.createNamedQuery("LosablieferungfindByLosIId");
    query.setParameter(1, losDto.getIId());
    Collection<?> losablieferungs = query.getResultList();
    LossollmaterialDto[] losmat = lossollmaterialFindByLosIId(losDto.getIId());

    BigDecimal bdAbgeliefertGesamt = getErledigteMenge(losDto.getIId(), theClientDto);

    BigDecimal bdVorherigerWertDerAblieferung = new BigDecimal(0);

    boolean bErledigt = false;

    if (losDto.getStatusCNr().equals(LocaleFac.STATUS_ERLEDIGT)
            || bdAbgeliefertGesamt.doubleValue() >= losDto.getNLosgroesse().doubleValue()) {
        bErledigt = true;/*  w  w  w.  j  ava 2s  .  c om*/
    }

    HashMap<Integer, LagerbewegungDto[]> hmLagerbewegungen = new HashMap<Integer, LagerbewegungDto[]>();

    for (int i = 0; i < losmat.length; i++) {

        BigDecimal bdPreis = getAusgegebeneMengePreis(losmat[i].getIId(), null, theClientDto);

        LosistmaterialDto[] istmatDtos = losistmaterialFindByLossollmaterialIId(losmat[i].getIId());

        ArrayList al = new ArrayList();

        for (int j = 0; j < istmatDtos.length; j++) {

            List<SeriennrChargennrMitMengeDto> snrDtos = getLagerFac()
                    .getAllSeriennrchargennrEinerBelegartposition(LocaleFac.BELEGART_LOS,
                            istmatDtos[j].getIId());

            for (int k = 0; k < snrDtos.size(); k++) {

                LagerbewegungDto bewDto = getLagerFac().getLetzteintrag(LocaleFac.BELEGART_LOS,
                        istmatDtos[j].getIId(), snrDtos.get(k).getCSeriennrChargennr());

                bewDto.setNGestehungspreis(bdPreis);

                al.add(bewDto);

            }

        }

        LagerbewegungDto[] returnArray = new LagerbewegungDto[al.size()];
        hmLagerbewegungen.put(losmat[i].getIId(), (LagerbewegungDto[]) al.toArray(returnArray));

    }

    BigDecimal abgeliefert = new BigDecimal(0);

    int iAblieferung = 0;

    for (Iterator<?> iter = losablieferungs.iterator(); iter.hasNext();) {
        Losablieferung losablieferung = (Losablieferung) iter.next();
        iAblieferung++;
        abgeliefert = abgeliefert.add(losablieferung.getNMenge());

        BigDecimal bdWertIstProAblieferung = new BigDecimal(0.0000);

        for (int i = 0; i < losmat.length; i++) {

            // Sollsatzgroesse der Position

            BigDecimal ssg = losmat[i].getNMenge()
                    .divide(losDto.getNLosgroesse(), 4, BigDecimal.ROUND_HALF_EVEN).multiply(abgeliefert);

            BigDecimal bdMengeIst = new BigDecimal(0.0000);

            BigDecimal bdWertIstProPosition = new BigDecimal(0.0000);

            if (hmLagerbewegungen.containsKey(losmat[i].getIId())) {
                LagerbewegungDto[] bewDtos = (LagerbewegungDto[]) hmLagerbewegungen.get(losmat[i].getIId());

                if (bewDtos != null) {

                    for (int l = 0; l < bewDtos.length; l++) {

                        if (bErledigt && iter.hasNext() == false) {

                            if (Helper.short2boolean(bewDtos[l].getBAbgang())) {

                                bdMengeIst = bdMengeIst.add(bewDtos[l].getNMenge());
                                bdWertIstProPosition = bdWertIstProPosition
                                        .add(bewDtos[l].getNGestehungspreis().multiply(bewDtos[l].getNMenge()));

                            } else {
                                bdMengeIst = bdMengeIst.subtract(bewDtos[l].getNMenge());
                                bdWertIstProPosition = bdWertIstProPosition.subtract(
                                        bewDtos[l].getNEinstandspreis().multiply(bewDtos[l].getNMenge()));
                            }
                        } else {
                            if (losablieferung.getTAendern().getTime() >= bewDtos[l].getTBuchungszeit()
                                    .getTime()) {

                                if (bdMengeIst.abs().add(bewDtos[l].getNMenge()).doubleValue() > ssg.abs()
                                        .doubleValue()) {

                                    BigDecimal mengeSSg = null;

                                    if (bdMengeIst.abs().doubleValue() < ssg.abs().doubleValue()) {
                                        mengeSSg = ssg.subtract(bdMengeIst);
                                    } else {
                                        mengeSSg = new BigDecimal(0);
                                    }

                                    bdMengeIst = bdMengeIst.add(bewDtos[l].getNMenge());

                                    if (Helper.short2boolean(bewDtos[l].getBAbgang())) {

                                        bdWertIstProPosition = bdWertIstProPosition
                                                .add(bewDtos[l].getNGestehungspreis().multiply(mengeSSg));
                                    } else {
                                        bdWertIstProPosition = bdWertIstProPosition
                                                .add(bewDtos[l].getNEinstandspreis().multiply(mengeSSg));
                                    }

                                } else {

                                    bdMengeIst = bdMengeIst.add(bewDtos[l].getNMenge());

                                    if (Helper.short2boolean(bewDtos[l].getBAbgang())) {

                                        bdWertIstProPosition = bdWertIstProPosition.add(bewDtos[l]
                                                .getNGestehungspreis().multiply(bewDtos[l].getNMenge()));
                                    } else {
                                        bdWertIstProPosition = bdWertIstProPosition.subtract(bewDtos[l]
                                                .getNEinstandspreis().multiply(bewDtos[l].getNMenge()));
                                    }
                                }

                            }
                        }

                        System.out.println(bewDtos[l].getIIdBuchung() + ":" + bdWertIstProPosition);
                    }

                    System.out.println(losmat[i].getArtikelIId() + ":" + bdWertIstProPosition);

                    bdWertIstProAblieferung = bdWertIstProAblieferung.add(bdWertIstProPosition);
                }

            }
        }

        losablieferung.setNMaterialwert(bdWertIstProAblieferung.subtract(bdVorherigerWertDerAblieferung)
                .divide(losablieferung.getNMenge(), 4, BigDecimal.ROUND_HALF_EVEN));

        em.merge(losablieferung);
        em.flush();

        bdVorherigerWertDerAblieferung = bdWertIstProAblieferung;

    }

}

From source file:com.lp.server.fertigung.ejbfac.FertigungFacBean.java

private void aktualisiereAZAllerLosablieferungenWennSollIstGleichIst(Integer losIId,
        TheClientDto theClientDto) {/*from  w w  w  . j av  a2s.  co m*/
    LosDto losDto = losFindByPrimaryKey(losIId);
    try {

        BigDecimal faktorFuerIstGleichSoll = new BigDecimal(0);
        BigDecimal erlMenge = getFertigungFac().getErledigteMenge(losIId, theClientDto);

        if (erlMenge.doubleValue() > 0) {
            if (losDto.getStatusCNr().equals(FertigungFac.STATUS_ERLEDIGT)
                    || losDto.getNLosgroesse().doubleValue() <= erlMenge.doubleValue()) {
                faktorFuerIstGleichSoll = new BigDecimal(1);
            } else {

                if (losDto.getNLosgroesse().doubleValue() > 0) {
                    faktorFuerIstGleichSoll = erlMenge.divide(losDto.getNLosgroesse(), 4,
                            BigDecimal.ROUND_HALF_EVEN);
                }
            }
            String sMandantWaehrung = theClientDto.getSMandantenwaehrung();
            // Sollzeiten
            LossollarbeitsplanDto[] soll = lossollarbeitsplanFindByLosIId(losDto.getIId());

            BigDecimal bdGesamtkosten = new BigDecimal(0.0000);

            // Gesamtkosten berechnen
            for (int i = 0; i < soll.length; i++) {

                // Kosten holen
                BigDecimal kosten = new BigDecimal(0.0000);
                if (soll[i].getMaschineIId() != null) {
                    kosten = getZeiterfassungFac()
                            .getMaschinenKostenZumZeitpunkt(soll[i].getMaschineIId(),
                                    Helper.cutTimestamp(new Timestamp(System.currentTimeMillis())))
                            .multiply(soll[i].getNGesamtzeit()).multiply(faktorFuerIstGleichSoll);
                }

                ArtikellieferantDto artlief = getArtikelFac().getArtikelEinkaufspreis(
                        soll[i].getArtikelIIdTaetigkeit(), new BigDecimal(1), sMandantWaehrung, theClientDto);
                if (artlief != null && artlief.getLief1Preis() != null) {
                    BigDecimal bdSollpreis = artlief.getLief1Preis();
                    kosten = kosten.add(
                            soll[i].getNGesamtzeit().multiply(bdSollpreis).multiply(faktorFuerIstGleichSoll));
                }
                bdGesamtkosten = bdGesamtkosten.add(kosten);

            }

            LosablieferungDto[] losablieferungDtos = losablieferungFindByLosIId(losIId, false, theClientDto);

            BigDecimal kostenProStueck = bdGesamtkosten.divide(erlMenge, 4, BigDecimal.ROUND_HALF_EVEN);

            for (int i = 0; i < losablieferungDtos.length; i++) {
                LosablieferungDto losablieferungDto = losablieferungDtos[i];

                // try {

                Losablieferung losablieferung = em.find(Losablieferung.class, losablieferungDto.getIId());
                if (losablieferung == null) {
                    throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, "");
                }
                losablieferung.setNArbeitszeitwert(kostenProStueck);
                losablieferung.setNArbeitszeitwertdetailliert(kostenProStueck);
                // }
                // catch (FinderException ex) {
                // throw new
                // EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY,
                // ex);
                // }

            }
        }

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

}

From source file:com.lp.server.fertigung.ejbfac.FertigungFacBean.java

private void aktualisiereAZAllerLosablieferungen(Integer losIId, TheClientDto theClientDto) {
    LosDto losDto = losFindByPrimaryKey(losIId);
    try {//from  w ww. j  a v  a2 s  . c  o  m
        // Sollzeiten
        LossollarbeitsplanDto[] soll = lossollarbeitsplanFindByLosIId(losDto.getIId());
        int SOLL = 0;
        int IST = 1;
        int WERT = 2;
        // Sollzeiten nach Artikel verdichten
        HashMap<Integer, Object[]> listSollVerdichtet = new HashMap<Integer, Object[]>();
        for (int i = 0; i < soll.length; i++) {

            if (listSollVerdichtet.containsKey(soll[i].getArtikelIIdTaetigkeit())) {
                Object[] oTemp = listSollVerdichtet.get(soll[i].getArtikelIIdTaetigkeit());
                BigDecimal sollZeit = soll[i].getNGesamtzeit();
                if (soll[i].getMaschineIId() != null) {
                    sollZeit = sollZeit.multiply(new BigDecimal(2));
                }

                oTemp[SOLL] = ((BigDecimal) oTemp[SOLL]).add(sollZeit);

                oTemp[IST] = new BigDecimal(0.00);
                oTemp[WERT] = new BigDecimal(0.00);

                listSollVerdichtet.put(soll[i].getArtikelIIdTaetigkeit(), oTemp);
            } else {
                Object[] oZeile = new Object[3];
                BigDecimal sollZeit = soll[i].getNGesamtzeit();
                if (soll[i].getMaschineIId() != null) {
                    sollZeit = sollZeit.multiply(new BigDecimal(2));
                }
                oZeile[SOLL] = sollZeit;

                oZeile[IST] = new BigDecimal(0.00);
                oZeile[WERT] = new BigDecimal(0.00);

                listSollVerdichtet.put(soll[i].getArtikelIIdTaetigkeit(), oZeile);
            }
        }

        // Maschinenzeiten
        AuftragzeitenDto[] zeitenMaschine = getZeiterfassungFac().getAllMaschinenzeitenEinesBeleges(losIId,
                null, null, null, theClientDto);

        // "normale" Zeiten
        AuftragzeitenDto[] zeitenMann = getZeiterfassungFac().getAllZeitenEinesBeleges(LocaleFac.BELEGART_LOS,
                losIId, null, null, null, null, false, false, theClientDto);

        LosablieferungDto[] losablieferungDtos = losablieferungFindByLosIIdOhneNeuberechnungUndOhneSnrChnr(
                losIId, theClientDto);

        boolean bErledigtOderUeberliefert = false;
        BigDecimal bdGesamtAbgeliefert = new BigDecimal(0.00);
        for (int i = 0; i < losablieferungDtos.length; i++) {
            LosablieferungDto losablieferungDto = losablieferungDtos[i];
            bdGesamtAbgeliefert = bdGesamtAbgeliefert.add(losablieferungDto.getNMenge());
        }

        if (losDto.getStatusCNr().equals(LocaleFac.STATUS_ERLEDIGT)
                || bdGesamtAbgeliefert.doubleValue() >= losDto.getNLosgroesse().doubleValue()) {
            bErledigtOderUeberliefert = true;
        }

        BigDecimal bdKostenGesamt = new BigDecimal(0.00);
        BigDecimal bdVerbrauchteKostenGesamt = new BigDecimal(0.00);
        HashMap<Integer, BigDecimal> hmUeberigeZeitderVorhergehendenAblieferung = new HashMap();
        HashMap bdUeberigeKostenderVorhergehendenAblieferung = new HashMap<Object, BigDecimal>();

        for (int i = 0; i < losablieferungDtos.length; i++) {
            LosablieferungDto losablieferungDto = losablieferungDtos[i];

            HashMap<Integer, Object[]> hmAblieferung = new HashMap<Integer, Object[]>();
            Iterator<?> it = listSollVerdichtet.keySet().iterator();
            while (it.hasNext()) {
                Integer key = (Integer) it.next();
                Object[] oNew = new Object[3];
                Object[] oVorhanden = listSollVerdichtet.get(key);
                oNew[SOLL] = oVorhanden[SOLL];
                oNew[IST] = oVorhanden[IST];
                oNew[WERT] = oVorhanden[WERT];
                hmAblieferung.put(key, oNew);
            }

            for (int j = 0; j < zeitenMaschine.length; j++) {
                BigDecimal bdIst = new BigDecimal(0.00);

                if (zeitenMaschine[j].getTsEnde() != null) {
                    if (i == 0 && i == losablieferungDtos.length - 1) {
                        if (zeitenMaschine[j].getTsEnde().before(losablieferungDto.getTAendern())
                                || zeitenMaschine[j].getTsEnde().after(losablieferungDtos[0].getTAendern())) {
                            bdIst = bdIst.add(new BigDecimal(zeitenMaschine[j].getDdDauer().doubleValue()));
                        }

                    } else if (i == 0) {
                        if (zeitenMaschine[j].getTsEnde().before(losablieferungDto.getTAendern())) {
                            bdIst = bdIst.add(new BigDecimal(zeitenMaschine[j].getDdDauer().doubleValue()));

                        }
                    } else if (i == losablieferungDtos.length - 1) {
                        if (zeitenMaschine[j].getTsEnde().after(losablieferungDtos[i - 1].getTAendern())) {
                            bdIst = bdIst.add(new BigDecimal(zeitenMaschine[j].getDdDauer().doubleValue()));
                        }
                    } else {
                        if (zeitenMaschine[j].getTsEnde().after(losablieferungDtos[i - 1].getTAendern())
                                && zeitenMaschine[j].getTsEnde().before(losablieferungDto.getTAendern())) {
                            bdIst = bdIst.add(new BigDecimal(zeitenMaschine[j].getDdDauer().doubleValue()));
                        }
                    }
                }

                if (bdIst.doubleValue() > 0) {
                    bdKostenGesamt = bdKostenGesamt.add(zeitenMaschine[j].getBdKosten());
                    if (hmAblieferung.containsKey(zeitenMaschine[j].getArtikelIId())) {
                        Object[] oZeile = hmAblieferung.get(zeitenMaschine[j].getArtikelIId());
                        oZeile[IST] = ((BigDecimal) oZeile[IST]).add(bdIst);
                        oZeile[WERT] = ((BigDecimal) oZeile[WERT]).add(zeitenMaschine[j].getBdKosten());
                        hmAblieferung.put(zeitenMaschine[j].getArtikelIId(), oZeile);
                    } else {
                        Object[] oZeile = new Object[3];
                        oZeile[SOLL] = new BigDecimal(0.00);
                        oZeile[IST] = bdIst;
                        oZeile[WERT] = zeitenMaschine[j].getBdKosten();
                        hmAblieferung.put(zeitenMaschine[j].getArtikelIId(), oZeile);
                    }
                }

            }

            // Zeiten Mann
            for (int j = 0; j < zeitenMann.length; j++) {
                BigDecimal bdIst = new BigDecimal(0.00);

                if (zeitenMann[j].getTsEnde() != null) {
                    if (i == 0 && i == losablieferungDtos.length - 1) {
                        if (zeitenMann[j].getTsEnde().before(losablieferungDto.getTAendern())
                                || zeitenMann[j].getTsEnde().after(losablieferungDtos[0].getTAendern())) {
                            bdIst = bdIst.add(new BigDecimal(zeitenMann[j].getDdDauer().doubleValue()));
                        }

                    }

                    else if (i == 0) {
                        if (zeitenMann[j].getTsEnde().before(losablieferungDto.getTAendern())) {
                            bdIst = bdIst.add(new BigDecimal(zeitenMann[j].getDdDauer().doubleValue()));

                        }
                    } else if (i == losablieferungDtos.length - 1) {
                        if (zeitenMann[j].getTsEnde().after(losablieferungDtos[i - 1].getTAendern())) {
                            bdIst = bdIst.add(new BigDecimal(zeitenMann[j].getDdDauer().doubleValue()));
                        }
                    } else {
                        if (zeitenMann[j].getTsEnde().after(losablieferungDtos[i - 1].getTAendern())
                                && zeitenMann[j].getTsEnde().before(losablieferungDto.getTAendern())) {
                            bdIst = bdIst.add(new BigDecimal(zeitenMann[j].getDdDauer().doubleValue()));
                        }
                    }
                }
                if (bdIst.doubleValue() > 0) {
                    bdKostenGesamt = bdKostenGesamt.add(zeitenMann[j].getBdKosten());
                    if (hmAblieferung.containsKey(zeitenMann[j].getArtikelIId())) {
                        Object[] oZeile = hmAblieferung.get(zeitenMann[j].getArtikelIId());
                        oZeile[IST] = ((BigDecimal) oZeile[IST]).add(bdIst);
                        oZeile[WERT] = ((BigDecimal) oZeile[WERT]).add(zeitenMann[j].getBdKosten());
                        hmAblieferung.put(zeitenMann[j].getArtikelIId(), oZeile);
                    } else {
                        Object[] oZeile = new Object[3];
                        oZeile[SOLL] = new BigDecimal(0.00);
                        oZeile[IST] = bdIst;
                        oZeile[WERT] = zeitenMann[j].getBdKosten();
                        hmAblieferung.put(zeitenMann[j].getArtikelIId(), oZeile);
                    }
                }
            }

            Iterator<?> itTemp = hmAblieferung.keySet().iterator();
            BigDecimal azWertDerAblieferung = new BigDecimal(0.00);
            while (itTemp.hasNext()) {
                Integer key = (Integer) itTemp.next();

                Object[] oZeile = hmAblieferung.get(key);

                // Sollsatzgroesze ermitteln
                BigDecimal bdIstAblieferung = (BigDecimal) oZeile[IST];

                // Vorherige uebrige Zeit dazuzaehlen
                if (hmUeberigeZeitderVorhergehendenAblieferung.containsKey(key)) {
                    bdIstAblieferung = bdIstAblieferung
                            .add((BigDecimal) hmUeberigeZeitderVorhergehendenAblieferung.get(key));
                }

                BigDecimal bdSollAblieferung = (BigDecimal) oZeile[SOLL];

                BigDecimal bdKostenAblieferung = (BigDecimal) oZeile[WERT];
                if (bdUeberigeKostenderVorhergehendenAblieferung.containsKey(key)) {
                    bdKostenAblieferung = bdKostenAblieferung
                            .add((BigDecimal) bdUeberigeKostenderVorhergehendenAblieferung.get(key));
                }

                if (bdSollAblieferung.doubleValue() != 0) {

                    // Sollsatzgroesse ermitteln

                    BigDecimal sollsatzgroesse = bdSollAblieferung
                            .divide(losDto.getNLosgroesse(), 4, BigDecimal.ROUND_HALF_EVEN)
                            .multiply(losablieferungDto.getNMenge());

                    BigDecimal maxSollsatzKosten = bdSollAblieferung.multiply(losablieferungDto.getNMenge());

                    BigDecimal tatsaechlicheKosten = null;
                    if (bdKostenAblieferung.doubleValue() > maxSollsatzKosten.doubleValue()) {
                        tatsaechlicheKosten = maxSollsatzKosten;

                    } else {
                        tatsaechlicheKosten = bdKostenAblieferung;
                    }

                    azWertDerAblieferung = azWertDerAblieferung.add(tatsaechlicheKosten);
                    if (bdKostenAblieferung.doubleValue() > azWertDerAblieferung.doubleValue()) {
                        bdUeberigeKostenderVorhergehendenAblieferung.put(key,
                                bdKostenAblieferung.subtract(azWertDerAblieferung));
                    }

                } else {
                    azWertDerAblieferung = azWertDerAblieferung.add(bdKostenAblieferung);
                }
                System.out.println(azWertDerAblieferung);
            }
            bdVerbrauchteKostenGesamt = bdVerbrauchteKostenGesamt.add(azWertDerAblieferung);

            // Wenn ERLEDIGT oder Ueberliefert //Den Rest hinzufuegen
            if (bErledigtOderUeberliefert && i == losablieferungDtos.length - 1) {
                BigDecimal restKosten = bdKostenGesamt.subtract(bdVerbrauchteKostenGesamt);
                azWertDerAblieferung = azWertDerAblieferung.add(restKosten);
            }
            if (losablieferungDto.getNMenge().doubleValue() != 0) {
                azWertDerAblieferung = azWertDerAblieferung.divide(losablieferungDto.getNMenge(), 4,
                        BigDecimal.ROUND_HALF_EVEN);
            }
            Losablieferung losablieferung = em.find(Losablieferung.class, losablieferungDto.getIId());
            if (losablieferung == null) {
                throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FINDBYPRIMARYKEY, "");
            }
            losablieferung.setNArbeitszeitwert(azWertDerAblieferung);
            losablieferung.setNArbeitszeitwertdetailliert(azWertDerAblieferung);
        }

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

}

From source file:com.lp.server.fertigung.ejbfac.FertigungFacBean.java

private void bucheNegativesollmengenAufLager(LosDto losDto, BigDecimal bdGesamtAbgeliefert,
        TheClientDto theClientDto) {//from  w  ww.java2 s  .c o  m

    Query query = em.createNamedQuery("LossollmaterialfindByLosIId");
    query.setParameter(1, losDto.getIId());
    Collection<?> cl = query.getResultList();

    LossollmaterialDto[] sollmat = assembleLossollmaterialDtos(cl);

    Integer lagerIId = null;

    ParametermandantDto parametermandantDto;
    try {
        parametermandantDto = getParameterFac().getMandantparameter(theClientDto.getMandant(),
                ParameterFac.KATEGORIE_FERTIGUNG,
                ParameterFac.PARAMETER_NEGATIVE_SOLLMENGEN_BUCHEN_AUF_ZIELLAGER);

        if (((java.lang.Boolean) parametermandantDto.getCWertAsObject()).booleanValue() == true) {
            lagerIId = losDto.getLagerIIdZiel();
        } else {
            // Laeger des Loses
            LoslagerentnahmeDto[] laeger = loslagerentnahmeFindByLosIId(losDto.getIId());
            lagerIId = laeger[0].getLagerIId();
        }

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

    for (int i = 0; i < sollmat.length; i++) {
        LossollmaterialDto sollmatZeile = sollmat[i];

        if (sollmatZeile.getNMenge().doubleValue() < 0) {

            // Sollsatzgroesse
            BigDecimal ssg = sollmatZeile.getNMenge().abs().divide(losDto.getNLosgroesse(), 10,
                    BigDecimal.ROUND_HALF_EVEN);

            BigDecimal soll = bdGesamtAbgeliefert.multiply(ssg);

            BigDecimal ausgegeben = getAusgegebeneMenge(sollmatZeile.getIId(), null, theClientDto).abs();

            BigDecimal mengeNeu = soll.subtract(ausgegeben);

            if (mengeNeu.doubleValue() > 0) {
                LosistmaterialDto istmat = new LosistmaterialDto();
                istmat.setLagerIId(lagerIId);
                istmat.setLossollmaterialIId(sollmat[i].getIId());
                istmat.setNMenge(mengeNeu.abs());
                istmat.setBAbgang(Helper.boolean2Short(false));

                createLosistmaterial(istmat, null, theClientDto);
            }

        }
    }
}

From source file:com.lp.server.fertigung.ejbfac.FertigungFacBean.java

public LosablieferungDto updateLosablieferung(LosablieferungDto losablieferungDto,
        boolean bMaterialZurueckbuchen, TheClientDto theClientDto) throws EJBExceptionLP {

    // losstatus pruefen

    LosDto losDto = losFindByPrimaryKey(losablieferungDto.getLosIId());
    if (losDto.getStatusCNr().equals(FertigungFac.STATUS_STORNIERT)) {
        throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FERTIGUNG_DAS_LOS_IST_STORNIERT, "");
    } else if (losDto.getStatusCNr().equals(FertigungFac.STATUS_ERLEDIGT)) {
        throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FERTIGUNG_DAS_LOS_IST_BEREITS_ERLEDIGT, "");
    } else if (losDto.getStatusCNr().equals(FertigungFac.STATUS_ANGELEGT)) {
        throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FERTIGUNG_DAS_LOS_IST_NOCH_NICHT_AUSGEGEBEN, "");
    } else if (losDto.getStatusCNr().equals(FertigungFac.STATUS_GESTOPPT)) {
        throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FERTIGUNG_DAS_LOS_IST_GESTOPPT, "");
    }/* www .ja v a 2s. co  m*/

    Losablieferung laVorher = em.find(Losablieferung.class, losablieferungDto.getIId());

    // Los updaten, wenn Mengenreduktion
    if (losablieferungDto.getNMenge().doubleValue() > 0
            && losablieferungDto.getNMenge().doubleValue() < laVorher.getNMenge().doubleValue()) {

        Losablieferung losablieferung = em.find(Losablieferung.class, losablieferungDto.getIId());
        setLosablieferungFromLosablieferungDto(losablieferung, losablieferungDto);

        try {
            bucheLosAblieferungAufLager(losablieferungDto, losDto, theClientDto);
        } catch (RemoteException e) {
            throwEJBExceptionLPRespectOld(e);
        }

        // Material zurueckbuchen
        if (bMaterialZurueckbuchen) {
            LosablieferungDto[] dtos = losablieferungFindByLosIId(losDto.getIId(), false, theClientDto);
            BigDecimal bdGesamtAbgeliefert = new BigDecimal(0.00);
            for (int i = 0; i < dtos.length; i++) {
                LosablieferungDto losablieferungenDto = dtos[i];
                bdGesamtAbgeliefert = bdGesamtAbgeliefert.add(losablieferungenDto.getNMenge());
            }

            LossollmaterialDto[] sollmatDtos = lossollmaterialFindByLosIId(losDto.getIId());
            for (int i = 0; i < sollmatDtos.length; i++) {
                LossollmaterialDto sollmatDto = sollmatDtos[i];

                if (sollmatDto.getNMenge().doubleValue() != 0) {
                    BigDecimal sollsatzgroesse = sollmatDto.getNMenge()
                            .divide(sollmatDto.getNMenge(), 6, BigDecimal.ROUND_HALF_EVEN)
                            .multiply(bdGesamtAbgeliefert);

                    // Wenn nachtraegliche position, dann auslassen
                    if (Helper.short2boolean(sollmatDto.getBNachtraeglich()) == false) {
                        LosistmaterialDto[] losistmaterialDtos = losistmaterialFindByLossollmaterialIId(
                                sollmatDto.getIId());

                        BigDecimal istMaterialPlusNachtraeglich = new BigDecimal(0);

                        for (int j = 0; j < losistmaterialDtos.length; j++) {
                            LosistmaterialDto istmaterialDto = losistmaterialDtos[j];
                            // wenn Lagerzugang, der wird ausgelassen
                            if (Helper.short2boolean(istmaterialDto.getBAbgang())) {
                                istMaterialPlusNachtraeglich = istMaterialPlusNachtraeglich
                                        .add(istmaterialDto.getNMenge());
                            }

                        }

                        // Wenn ausgegebenes Material grosser als
                        // Sollsatzgroesse
                        if (istMaterialPlusNachtraeglich.doubleValue() > sollsatzgroesse.doubleValue()) {
                            BigDecimal zuReduzieren = Helper.rundeKaufmaennisch(
                                    istMaterialPlusNachtraeglich.subtract(sollsatzgroesse), 4);

                            for (int j = losistmaterialDtos.length; j > 0; j--) {
                                if (zuReduzieren.doubleValue() > 0) {
                                    LosistmaterialDto istmaterialDto = losistmaterialDtos[j - 1];

                                    // wenn Lagerzugang, der wird
                                    // ausgelassen
                                    if (Helper.short2boolean(istmaterialDto.getBAbgang())) {

                                        LagerbewegungDto lagerbewegungDto = getLagerFac().getLetzteintrag(
                                                LocaleFac.BELEGART_LOS, istmaterialDto.getIId(), null);

                                        BigDecimal nMengeAbsolut = new BigDecimal(0);

                                        if (zuReduzieren.doubleValue() >= istmaterialDto.getNMenge()
                                                .doubleValue()) {
                                            nMengeAbsolut = istmaterialDto.getNMenge().subtract(zuReduzieren);

                                            nMengeAbsolut = new BigDecimal(0);
                                        } else {
                                            nMengeAbsolut = istmaterialDto.getNMenge().subtract(zuReduzieren);
                                            zuReduzieren = new BigDecimal(0);

                                        }

                                        // Korrekturbuchung
                                        // Belegdatum wird nicht auf
                                        // heute
                                        // gesetzt lt. WH 20090115
                                        getLagerFac().bucheAb(LocaleFac.BELEGART_LOS, losDto.getIId(),
                                                istmaterialDto.getIId(), sollmatDto.getArtikelIId(),
                                                nMengeAbsolut, lagerbewegungDto.getNVerkaufspreis(),
                                                istmaterialDto.getLagerIId(), (String) null,
                                                losablieferungDto.getTAendern(), theClientDto);

                                        // Losistmaterial updaten
                                        updateLosistmaterialMenge(istmaterialDto.getIId(), nMengeAbsolut,
                                                theClientDto);

                                        zuReduzieren = zuReduzieren.subtract(istmaterialDto.getNMenge());

                                    }
                                }
                            }

                        }
                    }
                }
            }

        }

        LosablieferungDto[] dtos = losablieferungFindByLosIId(losDto.getIId(), false, theClientDto);
        // Wenn es die letzte Ablieferung ist, nur die letzte neu berechnen,
        // ansonsten alle
        if (dtos[dtos.length - 1].getIId().equals(losablieferungDto.getIId())) {
            aktualisiereNachtraeglichPreiseAllerLosablieferungen(losDto.getIId(), theClientDto, true);
        } else {
            aktualisiereNachtraeglichPreiseAllerLosablieferungen(losDto.getIId(), theClientDto, false);
        }

    } else {
        throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FERTIGUNG_UPDATE_LOSABLIEFERUNG_FEHLER_MENGE,
                new Exception("Menge neu muss > 0 und kleiner der alten Menge sein."));
    }

    return losablieferungDto;

}

From source file:com.lp.server.fertigung.ejbfac.FertigungFacBean.java

private BigDecimal getErledigterMaterialwertEinerSollpositionNEU(BigDecimal bdLosgroesse,
        BigDecimal bdErledigteMenge, TheClientDto theClientDto, LosDto losDto, BigDecimal bdAusgegeben,
        BigDecimal gesamtpreis, BigDecimal sollmenge) {

    // wenn volle menge erledigt oder sogar mehr oder Los=erledigt
    if (bdLosgroesse.compareTo(bdErledigteMenge) <= 0
            || losDto.getStatusCNr().equals(FertigungFac.STATUS_ERLEDIGT)) {
        // dann alles
        return gesamtpreis;
    } else {/*from   ww w. j  av a 2s .  c  om*/
        // Sollsatzgroesse berechnen
        BigDecimal bdSollsatzgroesse = sollmenge.multiply(bdErledigteMenge).divide(bdLosgroesse, 6,
                BigDecimal.ROUND_HALF_EVEN);
        // weniger oder gleich wie sollmenge ausgegeben
        if (bdAusgegeben.compareTo(bdSollsatzgroesse) <= 0) {
            // dann alles
            return gesamtpreis;
        }
        // wenn mehr ausgegeben
        else {

            BigDecimal bdEinzelpreis = new BigDecimal(0);

            if (bdAusgegeben.doubleValue() > 0) {
                bdEinzelpreis = gesamtpreis.divide(bdAusgegeben, 4, BigDecimal.ROUND_HALF_EVEN);
            }

            // dann mit sollsatzgroesse
            return bdSollsatzgroesse.multiply(bdEinzelpreis);
        }
    }
}

From source file:com.lp.server.fertigung.ejbfac.FertigungFacBean.java

/**
 * Ist-Arbeitszeit fuer eine Ablieferung pro abgelieferter Einheit
 * bestimmen./*from   ww w  . ja  va2 s  .c  o m*/
 * 
 * @param losablieferungIId
 *            Integer
 * @param bWertOderZeit
 *            boolean fuer Wert = true, fuer Zeit = false
 * @param theClientDto
 *            String
 * @return BigDecimal
 * @throws EJBExceptionLP
 */
private BigDecimal getErledigteArbeitszeitEinerLosablieferung(Integer losablieferungIId, boolean bWertOderZeit,
        boolean bMitMaschinenZeit, TheClientDto theClientDto, boolean bRekursiv) throws EJBExceptionLP {
    BigDecimal bdErgebnis = new BigDecimal(0);
    LosablieferungDto losablieferungDto = losablieferungFindByPrimaryKey(losablieferungIId, false,
            theClientDto);
    try {
        // Alle Ablieferungen auf dieses Los aufsteigend nach datum sortiert

        LosablieferungDto[] abl = losablieferungFindByLosIId(losablieferungDto.getLosIId(), false,
                theClientDto);
        // Rueckwaertsschleife, da die werte der vorgaenger berechnet werden
        // muessen (rekursiv)
        for (int i = abl.length - 1; i > 0; i--) {
            // wenn ich die aktuelle gefunden hab, subtrahier ich den wert
            // des vorgaengers
            if (abl[i].getIId().equals(losablieferungIId)) {
                bdErgebnis = bdErgebnis.subtract(getErledigteArbeitszeitEinerLosablieferung(abl[i - 1].getIId(),
                        bWertOderZeit, bMitMaschinenZeit, theClientDto, true).multiply(abl[i - 1].getNMenge()));
                break;
            }
        }
        // ------------------------------------------------------------------
        // ----

        BigDecimal summeAblieferungen = new BigDecimal(0);

        // Sollsatzfaktor bestimmen
        BigDecimal bdErledigt = new BigDecimal(0);
        for (int i = 0; i < abl.length; i++) {
            summeAblieferungen = summeAblieferungen.add(abl[i].getNMenge());
            if (!abl[i].getTAendern().after(losablieferungDto.getTAendern())) {
                bdErledigt = bdErledigt.add(abl[i].getNMenge());
            }
        }

        LosDto losDto = losFindByPrimaryKey(losablieferungDto.getLosIId());
        // Wenn Los ueberliefert oder Erledigt, dann zaehlen alle Zeidaten
        // zum Arbeitszeitwert
        boolean bAlleZeitenZaehlenFuerArbeitswert = false;
        if (summeAblieferungen.doubleValue() >= losDto.getNLosgroesse().doubleValue()
                || losDto.getStatusCNr().equals(LocaleFac.STATUS_ERLEDIGT)) {
            if (bRekursiv == false) {
                bAlleZeitenZaehlenFuerArbeitswert = true;
            }
        }

        BigDecimal bdFaktor = bdErledigt.divide(losDto.getNLosgroesse(), 10, BigDecimal.ROUND_HALF_EVEN);
        // ------------------------------------------------------------------
        // ----
        // Sollzeiten
        LossollarbeitsplanDto[] soll = getFertigungFac()
                .lossollarbeitsplanFindByLosIId(losablieferungDto.getLosIId());
        // Sollzeiten nach Artikel verdichten und mit Sollsatzfaktor
        // multiplizieren
        HashMap<Integer, BigDecimal> listSollVerdichtet = new HashMap<Integer, BigDecimal>();
        for (int i = 0; i < soll.length; i++) {
            BigDecimal bdBisher = listSollVerdichtet.get(soll[i].getArtikelIIdTaetigkeit());
            if (bdBisher == null) {
                listSollVerdichtet.put(soll[i].getArtikelIIdTaetigkeit(),
                        soll[i].getNGesamtzeit().multiply(bdFaktor));
            } else {
                listSollVerdichtet.put(soll[i].getArtikelIIdTaetigkeit(),
                        bdBisher.add(soll[i].getNGesamtzeit().multiply(bdFaktor)));
            }
        }
        // ------------------------------------------------------------------
        // ----
        // gebuchte Zeiten holen
        ParametermandantDto parametermandantDto = getParameterFac().getMandantparameter(
                theClientDto.getMandant(), ParameterFac.KATEGORIE_FERTIGUNG,
                ParameterFac.PARAMETER_ISTZEITEN_GLEICH_SOLLZEITEN);
        boolean bSollGleichIstzeiten = false;
        if (((java.lang.Boolean) parametermandantDto.getCWertAsObject()).booleanValue() == true) {
            bSollGleichIstzeiten = true;
        }
        // Maschinenzeiten
        AuftragzeitenDto[] zeitenMaschine = null;
        AuftragzeitenDto[] zeiten = null;
        if (bSollGleichIstzeiten == false) {

            // Maschinenzeiten
            zeitenMaschine = getZeiterfassungFac().getAllMaschinenzeitenEinesBeleges(
                    losablieferungDto.getLosIId(), null, null, null, theClientDto);
            // "normale" Zeiten
            zeiten = getZeiterfassungFac().getAllZeitenEinesBeleges(LocaleFac.BELEGART_LOS,
                    losablieferungDto.getLosIId(), null, null, null, null, false, false, theClientDto);
        } else {
            zeiten = new AuftragzeitenDto[listSollVerdichtet.size()];
            zeitenMaschine = new AuftragzeitenDto[0];
            bAlleZeitenZaehlenFuerArbeitswert = true;
            int row = 0;
            for (Iterator<?> iter = listSollVerdichtet.keySet().iterator(); iter.hasNext();) {
                Integer artikelIId = (Integer) iter.next();
                BigDecimal gesamtzeit = listSollVerdichtet.get(artikelIId);
                AuftragzeitenDto az = new AuftragzeitenDto();
                az.setArtikelIId(artikelIId);
                az.setDdDauer(new Double(gesamtzeit.doubleValue()));
                BigDecimal bdPreis = getLagerFac()
                        .getGemittelterGestehungspreisAllerLaegerEinesMandanten(artikelIId, theClientDto);
                az.setBdKosten(gesamtzeit.multiply(bdPreis));
                zeiten[row] = az;
                row++;
            }
        }
        // ------------------------------------------------------------------
        // ----
        // relevante Ist-Zeiten nach Ident verdichten
        HashMap<Integer, BigDecimal> listIstWert = new HashMap<Integer, BigDecimal>();
        HashMap<Integer, BigDecimal> listIstZeit = new HashMap<Integer, BigDecimal>();
        if (bMitMaschinenZeit) {
            for (int i = 0; i < zeitenMaschine.length; i++) {
                // Wenn vor der Ablieferung gebucht, dann addieren
                if ((zeitenMaschine[i].getTsEnde() != null
                        && zeitenMaschine[i].getTsEnde().before(losablieferungDto.getTAendern()))
                        || bAlleZeitenZaehlenFuerArbeitswert == true) {
                    BigDecimal bdBisherWert = listIstWert.get(zeitenMaschine[i].getArtikelIId());
                    BigDecimal bdBisherZeit = listIstZeit.get(zeitenMaschine[i].getArtikelIId());
                    if (bdBisherWert == null) {
                        listIstWert.put(zeitenMaschine[i].getArtikelIId(), zeitenMaschine[i].getBdKosten());
                        listIstZeit.put(zeitenMaschine[i].getArtikelIId(),
                                new BigDecimal(zeitenMaschine[i].getDdDauer()));
                    } else {
                        listIstWert.put(zeitenMaschine[i].getArtikelIId(),
                                bdBisherWert.add(zeitenMaschine[i].getBdKosten()));
                        listIstZeit.put(zeitenMaschine[i].getArtikelIId(),
                                bdBisherZeit.add(new BigDecimal(zeitenMaschine[i].getDdDauer())));
                    }
                }
            }
        }
        // "normale" Zeiten
        for (int i = 0; i < zeiten.length; i++) {
            // Wenn vor der Ablieferung gebucht, dann addieren
            if ((zeiten[i].getTsEnde() != null && zeiten[i].getTsEnde().before(losablieferungDto.getTAendern()))
                    || bAlleZeitenZaehlenFuerArbeitswert == true) {
                BigDecimal bdBisherWert = listIstWert.get(zeiten[i].getArtikelIId());
                BigDecimal bdBisherZeit = listIstZeit.get(zeiten[i].getArtikelIId());
                if (bdBisherWert == null) {
                    listIstWert.put(zeiten[i].getArtikelIId(), zeiten[i].getBdKosten());
                    listIstZeit.put(zeiten[i].getArtikelIId(), new BigDecimal(zeiten[i].getDdDauer()));
                } else {
                    listIstWert.put(zeiten[i].getArtikelIId(), bdBisherWert.add(zeiten[i].getBdKosten()));
                    listIstZeit.put(zeiten[i].getArtikelIId(),
                            bdBisherZeit.add(new BigDecimal(zeiten[i].getDdDauer())));
                }
            }
        }
        // ------------------------------------------------------------------
        // ----
        for (Iterator<?> iter = listIstZeit.keySet().iterator(); iter.hasNext();) {
            Integer artikelIId = (Integer) iter.next();
            // Wenn das Los erledigt ist, dann zaehlen alle
            if (losDto.getStatusCNr().equals(FertigungFac.STATUS_ERLEDIGT)
                    || (bdErledigt.doubleValue() >= losDto.getNLosgroesse().doubleValue())) {
                if (bWertOderZeit) {
                    bdErgebnis = bdErgebnis.add(listIstWert.get(artikelIId));
                } else {
                    bdErgebnis = bdErgebnis.add(listIstZeit.get(artikelIId));
                }
            }
            // nicht vollstaendig erledigte Lose kriegen hoechstens die
            // anhand sollsatzgroesse errechnete zeit
            else {
                BigDecimal bdIstZeit = listIstZeit.get(artikelIId);
                BigDecimal bdSollZeit = listSollVerdichtet.get(artikelIId);
                if (bdSollZeit == null) {
                    // nothing here
                    // Taetigkeiten, die im Sollarbeitsplan nicht enthalten
                    // waren, werden hier noch nicht gezaehlt
                } else {
                    // Ist liegt unter Soll -> ganzer Wert bzw. Zeit
                    if (bdSollZeit.compareTo(bdIstZeit) >= 0) {
                        if (bWertOderZeit) {
                            bdErgebnis = bdErgebnis.add(listIstWert.get(artikelIId));
                        } else {
                            bdErgebnis = bdErgebnis.add(listIstZeit.get(artikelIId));
                        }
                    }
                    // Sollsatzzeit ueberschritten
                    else {
                        if (bWertOderZeit) {
                            bdErgebnis = bdErgebnis.add(listIstWert.get(artikelIId).multiply(bdSollZeit)
                                    .divide(bdIstZeit, 4, BigDecimal.ROUND_HALF_EVEN));
                        } else {
                            bdErgebnis = bdErgebnis.add(bdSollZeit);
                        }
                    }
                }
            }
        }
    } catch (RemoteException ex) {
        throwEJBExceptionLPRespectOld(ex);
    }
    if (losablieferungDto.getNMenge().doubleValue() != 0) {

        return bdErgebnis.divide(losablieferungDto.getNMenge(), 4, BigDecimal.ROUND_HALF_EVEN);
    } else {
        return new BigDecimal(0);
    }
}

From source file:com.lp.server.fertigung.ejbfac.FertigungFacBean.java

public AuftragNachkalkulationDto getWerteAusUnterlosen(LosDto losDto, BigDecimal bdMenge,
        AuftragNachkalkulationDto abNachkalkulationDto, TheClientDto theClientDto) {

    LossollmaterialDto[] sollmat = lossollmaterialFindByLosIId(losDto.getIId());

    try {/*from   ww  w.ja  va 2 s.  c  o m*/

        BigDecimal bdWert = new BigDecimal(0);
        for (int i = 0; i < sollmat.length; i++) {
            LossollmaterialDto lossollmaterialDto = sollmat[i];
            LosistmaterialDto[] istMatDtos = losistmaterialFindByLossollmaterialIId(
                    lossollmaterialDto.getIId());

            for (int j = 0; j < istMatDtos.length; j++) {
                LosistmaterialDto istMatDto = istMatDtos[j];
                Query query = em.createNamedQuery("LagerbewegungfindByBelegartCNrBelegartPositionIId");
                query.setParameter(1, LocaleFac.BELEGART_LOS);
                query.setParameter(2, istMatDto.getIId());
                Collection cl = query.getResultList();

                Iterator it = cl.iterator();

                while (it.hasNext()) {
                    Lagerbewegung l = (Lagerbewegung) it.next();

                    LagerabgangursprungDto[] dtos = getLagerFac()
                            .lagerabgangursprungFindByLagerbewegungIIdBuchung(l.getIIdBuchung());

                    for (int m = 0; m < dtos.length; m++) {
                        // nun die Ursprungsbuchungen suchen
                        Session session2 = FLRSessionFactory.getFactory().openSession();
                        String sQuery2 = "from FLRLagerbewegung lagerbewegung WHERE lagerbewegung.i_id_buchung="
                                + dtos[m].getILagerbewegungidursprung()
                                + " order by lagerbewegung.t_buchungszeit DESC";
                        org.hibernate.Query ursrungsbuchung = session2.createQuery(sQuery2);
                        ursrungsbuchung.setMaxResults(1);

                        java.util.List resultList2 = ursrungsbuchung.list();

                        Iterator itUrsprung = resultList2.iterator();

                        while (itUrsprung.hasNext()) {
                            com.lp.server.artikel.fastlanereader.generated.FLRLagerbewegung lagerbewegung_ursprung = (com.lp.server.artikel.fastlanereader.generated.FLRLagerbewegung) itUrsprung
                                    .next();

                            // Wenn diese aus einer Losablieferung kommt
                            if (lagerbewegung_ursprung.getC_belegartnr()
                                    .equals(LocaleFac.BELEGART_LOSABLIEFERUNG)) {

                                LosablieferungDto laDto = losablieferungFindByPrimaryKey(
                                        lagerbewegung_ursprung.getI_belegartpositionid(), true, theClientDto);

                                LosDto losDtoUnterlos = losFindByPrimaryKey(laDto.getLosIId());
                                BigDecimal sollsatzgroesse = lossollmaterialDto.getNMenge()
                                        .divide(losDto.getNLosgroesse(), 4, BigDecimal.ROUND_HALF_EVEN);

                                abNachkalkulationDto.setBdGestehungswertmaterialist(
                                        abNachkalkulationDto.getBdGestehungswertmaterialist().subtract(
                                                laDto.getNArbeitszeitwertdetailliert().multiply(bdMenge)));
                                abNachkalkulationDto.setBdGestehungswertarbeitist(
                                        abNachkalkulationDto.getBdGestehungswertarbeitist()
                                                .add(laDto.getNArbeitszeitwertdetailliert().multiply(bdMenge)));

                                BigDecimal bdGesamtAbgeliefert = getErledigteMenge(laDto.getLosIId(),
                                        theClientDto);
                                Double dPers = getZeiterfassungFac().getSummeZeitenEinesBeleges(
                                        LocaleFac.BELEGART_LOS, losDtoUnterlos.getIId(), null, null, null, null,
                                        theClientDto);

                                BigDecimal arbeitszeitsoll = new BigDecimal(0);

                                BigDecimal maschinenzeitsoll = new BigDecimal(0);
                                LossollarbeitsplanDto[] sollarbeitsplanDtos = getFertigungFac()
                                        .lossollarbeitsplanFindByLosIId(losDtoUnterlos.getIId());

                                for (int u = 0; u < sollarbeitsplanDtos.length; u++) {
                                    LossollarbeitsplanDto sollarbeitsplanDto = sollarbeitsplanDtos[u];

                                    BigDecimal menge = sollarbeitsplanDto.getNGesamtzeit()
                                            .divide(losDtoUnterlos.getNLosgroesse(), 4,
                                                    BigDecimal.ROUND_HALF_EVEN)
                                            .multiply(bdMenge);
                                    /*
                                     * ArtikelDto artikelDto =
                                     * getArtikelFac()
                                     * .artikelFindByPrimaryKeySmall(
                                     * sollarbeitsplanDto
                                     * .getArtikelIIdTaetigkeit(),
                                     * theClientDto);
                                     * 
                                     * myLogger.warn("Los:" +
                                     * losDto.getCNr() + " Unterlos:" +
                                     * losDtoUnterlos.getCNr() + " AZ:" +
                                     * artikelDto.getCNr() + " Zeit:" +
                                     * Helper.rundeKaufmaennisch( menge,
                                     * 4));
                                     */

                                    if (sollarbeitsplanDto.getMaschineIId() == null) {
                                        arbeitszeitsoll = arbeitszeitsoll.add(menge);
                                    } else {
                                        maschinenzeitsoll = maschinenzeitsoll.add(menge);
                                        if (!Helper.short2boolean(sollarbeitsplanDto.getBNurmaschinenzeit())) {
                                            arbeitszeitsoll = arbeitszeitsoll.add(menge);
                                        }

                                    }
                                }

                                abNachkalkulationDto
                                        .setDdArbeitszeitsoll(abNachkalkulationDto.getDdArbeitszeitsoll()
                                                + arbeitszeitsoll.doubleValue());
                                abNachkalkulationDto
                                        .setDdMaschinenzeitsoll(abNachkalkulationDto.getDdMaschinenzeitsoll()
                                                + maschinenzeitsoll.doubleValue());

                                // Zeit duch die Gesamtablieferungen
                                // dividieren und mal bMenge
                                dPers = dPers / bdGesamtAbgeliefert.doubleValue() * bdMenge.doubleValue();
                                abNachkalkulationDto.setDdArbeitszeitist(
                                        abNachkalkulationDto.getDdArbeitszeitist() + dPers);

                                Double dMasch = getZeiterfassungFac().getSummeMaschinenZeitenEinesBeleges(
                                        losDtoUnterlos.getIId(), null, null, theClientDto);

                                dMasch = dMasch / bdGesamtAbgeliefert.doubleValue() * bdMenge.doubleValue();
                                abNachkalkulationDto.setDdMaschinenzeitist(
                                        abNachkalkulationDto.getDdMaschinenzeitist() + dMasch);

                                /*
                                 * System.out.println("Los: " +
                                 * losDto.getCNr() + " Stueckliste: " +
                                 * stklDto.getArtikelDto().getCNr() +
                                 * " UnterlosLos: " +
                                 * losDtoUnterlos.getCNr() + " Artikel: " +
                                 * aDto.getCNr() + " Menge:" + bdMenge);
                                 */

                                abNachkalkulationDto = getWerteAusUnterlosen(losDtoUnterlos,
                                        sollsatzgroesse.multiply(bdMenge), abNachkalkulationDto, theClientDto);

                            }

                        }

                        session2.close();
                    }

                }

            }

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

    }
    return abNachkalkulationDto;
}