Example usage for java.math BigDecimal multiply

List of usage examples for java.math BigDecimal multiply

Introduction

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

Prototype

public BigDecimal multiply(BigDecimal multiplicand) 

Source Link

Document

Returns a BigDecimal whose value is (this × multiplicand), and whose scale is (this.scale() + multiplicand.scale()) .

Usage

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 {//w w  w  .  ja va2 s.c  o m
        // 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

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public HashMap<Integer, StuecklistepositionDto> holeAlleLossollmaterialFuerStuecklistenAktualisierung(
        Integer stuecklisteIId, BigDecimal bdLosgroesse, int iEbene,
        HashMap<Integer, StuecklistepositionDto> hmPositionen, TheClientDto theClientDto) {
    iEbene++;/*w ww . j  a v  a  2s  .  co m*/

    if (hmPositionen == null) {
        hmPositionen = new HashMap<Integer, StuecklistepositionDto>();
    }
    try {
        StuecklistepositionDto[] stkPos = getStuecklisteFac()
                .stuecklistepositionFindByStuecklisteIId(stuecklisteIId, theClientDto);

        StuecklisteDto stklDto = getStuecklisteFac().stuecklisteFindByPrimaryKey(stuecklisteIId, theClientDto);

        for (int i = 0; i < stkPos.length; i++) {
            // alle stuecklistenpositionen ins los uebernehmen

            // W02451
            if (stkPos[i].getArtikelIId() == 6093) {
                int u = 0;
            }

            // Einheit umrechnen
            ArtikelDto artikelDto = getArtikelFac().artikelFindByPrimaryKeySmall(stkPos[i].getArtikelIId(),
                    theClientDto);

            BigDecimal bdFaktor = getSystemFac().rechneUmInAndereEinheit(new BigDecimal(1),
                    stkPos[i].getEinheitCNr(), artikelDto.getEinheitCNr(), stkPos[i].getIId(), theClientDto);

            // nun die Dimensionen
            BigDecimal bdDimProdukt = new BigDecimal(1);
            EinheitDto einheitDto = getSystemFac().einheitFindByPrimaryKey(stkPos[i].getEinheitCNr(),
                    theClientDto);
            if (einheitDto.getIDimension().intValue() >= 1) {
                if (stkPos[i].getFDimension1() != null) {
                    bdDimProdukt = bdDimProdukt
                            .multiply(new BigDecimal(stkPos[i].getFDimension1().floatValue()));
                }
            }
            if (einheitDto.getIDimension().intValue() >= 2) {
                if (stkPos[i].getFDimension2() != null) {
                    bdDimProdukt = bdDimProdukt
                            .multiply(new BigDecimal(stkPos[i].getFDimension2().floatValue()));
                }
            }
            if (einheitDto.getIDimension().intValue() >= 3) {
                if (stkPos[i].getFDimension3() != null) {
                    bdDimProdukt = bdDimProdukt
                            .multiply(new BigDecimal(stkPos[i].getFDimension3().floatValue()));
                }
            }
            // verschnitt
            BigDecimal bdMenge = Helper.berechneMengeInklusiveVerschnitt(stkPos[i].getNMenge(),
                    artikelDto.getFVerschnittfaktor(), artikelDto.getFVerschnittbasis(), bdLosgroesse);

            // endgueltige Menge berechnen
            BigDecimal posMenge = bdMenge.multiply(bdDimProdukt).multiply(bdLosgroesse).multiply(bdFaktor)
                    .divide(new BigDecimal(stklDto.getIErfassungsfaktor().doubleValue()),
                            BigDecimal.ROUND_HALF_EVEN);

            if (posMenge.doubleValue() < 0.001 && posMenge.doubleValue() > 0.000001) {
                posMenge = new BigDecimal("0.001");
                posMenge = posMenge.setScale(3, BigDecimal.ROUND_HALF_EVEN);
            } else {
                posMenge = posMenge.setScale(3, BigDecimal.ROUND_HALF_EVEN);
            }

            stkPos[i].setNMenge(posMenge);

            StuecklisteDto stuecklisteDto = getStuecklisteFac()
                    .stuecklisteFindByMandantCNrArtikelIIdOhneExc(stkPos[i].getArtikelIId(), theClientDto);

            if (stuecklisteDto != null && stuecklisteDto.getStuecklisteartCNr()
                    .equals(StuecklisteFac.STUECKLISTEART_HILFSSTUECKLISTE)) {
                if (iEbene < 10) {
                    holeAlleLossollmaterialFuerStuecklistenAktualisierung(stuecklisteDto.getIId(), posMenge,
                            iEbene, hmPositionen, theClientDto);
                }

            } else {

                if (stkPos[i].getNMenge().doubleValue() > 0) {

                    if (hmPositionen.containsKey(stkPos[i].getArtikelIId())) {

                        StuecklistepositionDto p = hmPositionen.get(stkPos[i].getArtikelIId());
                        p.setNMenge(stkPos[i].getNMenge().add(p.getNMenge()));
                        hmPositionen.put(stkPos[i].getArtikelIId(), p);
                    } else {
                        hmPositionen.put(stkPos[i].getArtikelIId(), stkPos[i]);
                    }
                }

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

    return hmPositionen;

}

From source file:org.openbravo.common.actionhandler.SetNewBPCurrency.java

@Override
protected JSONObject doExecute(Map<String, Object> parameters, String content) {

    JSONObject jsonRequest = null;//from ww  w  .ja  va  2  s. co m
    OBContext.setAdminMode(true);
    try {
        jsonRequest = new JSONObject(content);
        JSONObject params = jsonRequest.getJSONObject("_params");
        final String strOrgId = jsonRequest.getString("inpadOrgId");
        final String strFromCurrencyId = jsonRequest.getString("inpbpCurrencyId");
        final String strToCurrencyId = params.getString("C_Currency_ID");
        final String strRate = params.getString("Rate");
        final String strAmount = params.getString("Foreign_Amount");
        final boolean strSetAmount = params.getBoolean("Amount");
        final boolean strUseDefaultConversion = params.getBoolean("Default_Conversion_Rate");
        final String strBpartnerId = jsonRequest.getString("C_BPartner_ID");
        final String glItemId = params.getString("c_glitem_id");
        BigDecimal creditUsed = BigDecimal.ZERO;
        BigDecimal rate = BigDecimal.ZERO;
        Double amount = new Double(0);
        if (strSetAmount && !"null".equals(strAmount)) {
            amount = Double.parseDouble(strAmount);
        }

        if (strUseDefaultConversion && !strSetAmount) {
            rate = getConversionRate(strOrgId, strFromCurrencyId, strToCurrencyId);
            if (rate == BigDecimal.ZERO && !strFromCurrencyId.equals(strToCurrencyId)) {
                try {
                    jsonRequest = new JSONObject();
                    String message = OBMessageUtils.messageBD("NoCurrencyConversion");
                    JSONObject errorMessage = new JSONObject();
                    errorMessage.put("severity", "error");
                    errorMessage.put("text", message);
                    jsonRequest.put("message", errorMessage);
                } catch (Exception e) {
                    OBDal.getInstance().rollbackAndClose();
                    log.error(e.getMessage(), e);
                }
                return jsonRequest;
            }
        } else {
            rate = "null".equals(strRate) ? BigDecimal.ZERO : BigDecimal.valueOf(Double.parseDouble(strRate));
        }
        BusinessPartner businessPartner = OBDal.getInstance().get(BusinessPartner.class, strBpartnerId);
        creditUsed = businessPartner.getCreditUsed();

        ScrollableResults scroll = null;
        GLItem glItem = OBDal.getInstance().get(GLItem.class, glItemId);
        Currency currency = OBDal.getInstance().get(Currency.class, strToCurrencyId);
        BigDecimal creditAmount = BigDecimal.ZERO;
        BigDecimal creditRate = BigDecimal.ONE;

        // Convert available credit automatically
        if (!StringUtils.equals(strFromCurrencyId, strToCurrencyId) && !StringUtils.isEmpty(glItemId)
                && !StringUtils.equals(glItemId, "null")) {

            // Get the rate
            if (!strSetAmount) {
                creditRate = rate;
            } else if (creditUsed.compareTo(BigDecimal.ZERO) != 0) {
                creditRate = BigDecimal.valueOf(amount).divide(creditUsed,
                        FIN_Utility.getConversionRatePrecision(RequestContext.get().getVariablesSecureApp()),
                        RoundingMode.HALF_UP);
            }

            // Loop through all payment documents which generate credit
            scroll = FinancialUtils.getPaymentsWithCredit(businessPartner.getId(), strFromCurrencyId);
            int i = 0;
            try {
                while (scroll.next()) {
                    final String paymentCreditId = (String) scroll.get()[0];
                    final FIN_Payment paymentCredit = OBDal.getInstance().get(FIN_Payment.class,
                            paymentCreditId);
                    creditAmount = paymentCredit.getGeneratedCredit().subtract(paymentCredit.getUsedCredit());

                    // Create a payment to consume the credit with a glitem
                    FIN_Payment payment1 = (FIN_Payment) DalUtil.copy(paymentCredit, false);
                    payment1.setPaymentDate(new Date());
                    payment1.setAmount(creditAmount);
                    payment1.setDocumentNo(FIN_Utility.getDocumentNo(payment1.getOrganization(),
                            payment1.getDocumentType().getDocumentCategory(), "DocumentNo_FIN_Payment"));
                    payment1.setProcessed(false);
                    payment1.setPosted("N");
                    payment1.setDescription(null);
                    payment1.setGeneratedCredit(BigDecimal.ZERO);
                    payment1.setUsedCredit(BigDecimal.ZERO);

                    // Create a payment detail to consume the credit with a glitem
                    FIN_PaymentDetail paymentDetail1 = OBProvider.getInstance().get(FIN_PaymentDetail.class);
                    paymentDetail1.setClient(paymentCredit.getClient());
                    paymentDetail1.setOrganization(paymentCredit.getOrganization());
                    paymentDetail1.setFinPayment(payment1);
                    paymentDetail1.setAmount(creditAmount);
                    paymentDetail1.setRefund(false);
                    paymentDetail1.setGLItem(glItem);
                    paymentDetail1.setPrepayment(false);

                    // Create a payment schedule detail to consume the credit with a glitem
                    FIN_PaymentScheduleDetail paymentScheduleDetail1 = OBProvider.getInstance()
                            .get(FIN_PaymentScheduleDetail.class);
                    paymentScheduleDetail1.setClient(paymentCredit.getClient());
                    paymentScheduleDetail1.setOrganization(paymentCredit.getOrganization());
                    paymentScheduleDetail1.setPaymentDetails(paymentDetail1);
                    paymentScheduleDetail1.setAmount(creditAmount);

                    // Process the payment
                    paymentDetail1.getFINPaymentScheduleDetailList().add(paymentScheduleDetail1);
                    payment1.getFINPaymentDetailList().add(paymentDetail1);
                    OBDal.getInstance().save(payment1);
                    OBDal.getInstance().save(paymentDetail1);
                    OBDal.getInstance().save(paymentScheduleDetail1);
                    FIN_PaymentProcess.doProcessPayment(payment1, "D", false, null, null);

                    // Modify description of original credit payment
                    String paymentCreditDesc = paymentCredit.getDescription() + "\n" + String.format(
                            OBMessageUtils.messageBD("APRM_CreditUsedPayment"), payment1.getDocumentNo());
                    paymentCredit.setDescription((paymentCreditDesc.length() > 255)
                            ? paymentCreditDesc.substring(0, 251).concat("...").toString()
                            : paymentCreditDesc.toString());

                    // Create a payment to refund the credit
                    FIN_Payment payment2 = (FIN_Payment) DalUtil.copy(paymentCredit, false);
                    payment2.setPaymentDate(new Date());
                    payment2.setAmount(creditAmount.negate());
                    payment2.setDocumentNo(FIN_Utility.getDocumentNo(payment2.getOrganization(),
                            payment2.getDocumentType().getDocumentCategory(), "DocumentNo_FIN_Payment"));
                    payment2.setProcessed(false);
                    payment2.setPosted("N");
                    payment2.setDescription(
                            OBMessageUtils.messageBD("APRM_RefundPayment") + ": " + payment1.getDocumentNo());
                    payment2.setGeneratedCredit(BigDecimal.ZERO);
                    payment2.setUsedCredit(creditAmount);

                    // Create a payment credit to refund the credit
                    FIN_Payment_Credit paymentCredit2 = OBProvider.getInstance().get(FIN_Payment_Credit.class);
                    paymentCredit2.setClient(paymentCredit.getClient());
                    paymentCredit2.setOrganization(paymentCredit.getOrganization());
                    paymentCredit2.setPayment(payment2);
                    paymentCredit2.setCreditPaymentUsed(paymentCredit);
                    paymentCredit2.setAmount(creditAmount);
                    paymentCredit2.setCurrency(paymentCredit.getCurrency());

                    // Create a payment detail to refund the credit
                    FIN_PaymentDetail paymentDetail2 = OBProvider.getInstance().get(FIN_PaymentDetail.class);
                    paymentDetail2.setClient(paymentCredit.getClient());
                    paymentDetail2.setOrganization(paymentCredit.getOrganization());
                    paymentDetail2.setFinPayment(payment2);
                    paymentDetail2.setAmount(creditAmount.negate());
                    paymentDetail2.setRefund(true);
                    paymentDetail2.setPrepayment(true);

                    // Create a payment schedule detail to refund the credit
                    FIN_PaymentScheduleDetail paymentScheduleDetail2 = OBProvider.getInstance()
                            .get(FIN_PaymentScheduleDetail.class);
                    paymentScheduleDetail2.setClient(paymentCredit.getClient());
                    paymentScheduleDetail2.setOrganization(paymentCredit.getOrganization());
                    paymentScheduleDetail2.setPaymentDetails(paymentDetail2);
                    paymentScheduleDetail2.setAmount(creditAmount.negate());

                    // Process the payment
                    paymentDetail2.getFINPaymentScheduleDetailList().add(paymentScheduleDetail2);
                    payment2.getFINPaymentDetailList().add(paymentDetail2);
                    payment2.getFINPaymentCreditList().add(paymentCredit2);
                    paymentCredit.setUsedCredit(creditAmount);
                    OBDal.getInstance().save(paymentCredit);
                    OBDal.getInstance().save(payment2);
                    OBDal.getInstance().save(paymentCredit2);
                    OBDal.getInstance().save(paymentDetail2);
                    OBDal.getInstance().save(paymentScheduleDetail2);
                    FIN_PaymentProcess.doProcessPayment(payment2, "D", false, null, null);

                    i++;
                    if (i % 100 == 0) {
                        OBDal.getInstance().flush();
                        OBDal.getInstance().getSession().clear();
                    }
                }

                // Set the new currency
                businessPartner.setCurrency(currency);

                // Loop through all payment documents which generate credit
                scroll.beforeFirst();
                i = 0;
                while (scroll.next()) {
                    final String paymentCreditId = (String) scroll.get()[0];
                    final FIN_Payment paymentCredit = OBDal.getInstance().get(FIN_Payment.class,
                            paymentCreditId);

                    // Create a payment to create the credit with a glitem
                    FIN_Payment payment3 = (FIN_Payment) DalUtil.copy(paymentCredit, false);
                    payment3.setPaymentDate(new Date());
                    payment3.setCurrency(currency);
                    payment3.setAmount(BigDecimal.ZERO);
                    payment3.setDocumentNo(FIN_Utility.getDocumentNo(payment3.getOrganization(),
                            payment3.getDocumentType().getDocumentCategory(), "DocumentNo_FIN_Payment"));
                    payment3.setProcessed(false);
                    payment3.setPosted("N");
                    payment3.setDescription(null);
                    final BigDecimal generatedCredit = creditAmount.multiply(creditRate)
                            .setScale(currency.getStandardPrecision().intValue(), RoundingMode.HALF_UP);
                    payment3.setGeneratedCredit(generatedCredit);
                    payment3.setUsedCredit(BigDecimal.ZERO);

                    // Create a payment detail to create the credit with a glitem
                    FIN_PaymentDetail paymentDetail3 = OBProvider.getInstance().get(FIN_PaymentDetail.class);
                    paymentDetail3.setClient(paymentCredit.getClient());
                    paymentDetail3.setOrganization(paymentCredit.getOrganization());
                    paymentDetail3.setFinPayment(payment3);
                    paymentDetail3.setAmount(generatedCredit);
                    paymentDetail3.setRefund(false);
                    paymentDetail3.setPrepayment(true);

                    // Create a payment detail to create the credit with a glitem
                    FIN_PaymentDetail paymentDetail4 = OBProvider.getInstance().get(FIN_PaymentDetail.class);
                    paymentDetail4.setClient(paymentCredit.getClient());
                    paymentDetail4.setOrganization(paymentCredit.getOrganization());
                    paymentDetail4.setFinPayment(payment3);
                    paymentDetail4.setAmount(generatedCredit.negate());
                    paymentDetail4.setGLItem(glItem);
                    paymentDetail4.setRefund(false);
                    paymentDetail4.setPrepayment(false);

                    // Create a payment schedule detail to create the credit with a glitem
                    FIN_PaymentScheduleDetail paymentScheduleDetail3 = OBProvider.getInstance()
                            .get(FIN_PaymentScheduleDetail.class);
                    paymentScheduleDetail3.setClient(paymentCredit.getClient());
                    paymentScheduleDetail3.setOrganization(paymentCredit.getOrganization());
                    paymentScheduleDetail3.setPaymentDetails(paymentDetail3);
                    paymentScheduleDetail3.setAmount(generatedCredit);

                    // Create a payment schedule detail to create the credit with a glitem
                    FIN_PaymentScheduleDetail paymentScheduleDetail4 = OBProvider.getInstance()
                            .get(FIN_PaymentScheduleDetail.class);
                    paymentScheduleDetail4.setClient(paymentCredit.getClient());
                    paymentScheduleDetail4.setOrganization(paymentCredit.getOrganization());
                    paymentScheduleDetail4.setPaymentDetails(paymentDetail4);
                    paymentScheduleDetail4.setAmount(generatedCredit.negate());

                    // Process the payment
                    paymentDetail3.getFINPaymentScheduleDetailList().add(paymentScheduleDetail3);
                    paymentDetail4.getFINPaymentScheduleDetailList().add(paymentScheduleDetail4);
                    payment3.getFINPaymentDetailList().add(paymentDetail3);
                    payment3.getFINPaymentDetailList().add(paymentDetail4);
                    OBDal.getInstance().save(payment3);
                    OBDal.getInstance().save(paymentDetail3);
                    OBDal.getInstance().save(paymentDetail4);
                    OBDal.getInstance().save(paymentScheduleDetail3);
                    OBDal.getInstance().save(paymentScheduleDetail4);
                    OBDal.getInstance().save(paymentCredit);
                    FIN_PaymentProcess.doProcessPayment(payment3, "D", false, null, null);

                    i++;
                    if (i % 100 == 0) {
                        OBDal.getInstance().flush();
                        OBDal.getInstance().getSession().clear();
                    }
                }
            } finally {
                scroll.close();
            }
        }

        if (strSetAmount && creditUsed.compareTo(BigDecimal.valueOf(amount)) != 0) {
            businessPartner.setCreditUsed(BigDecimal.valueOf(amount));
        }
        if (!strToCurrencyId.equals(strFromCurrencyId) && strToCurrencyId != null
                && !"null".equals(strToCurrencyId)) {
            businessPartner.setCurrency(OBDal.getInstance().get(Currency.class, strToCurrencyId));
            if (rate.compareTo(BigDecimal.ZERO) != 0 && creditUsed.compareTo(BigDecimal.ZERO) != 0
                    && !strSetAmount) {
                businessPartner.setCreditUsed(creditUsed.multiply(rate));
            }
        }

        String messageText = OBMessageUtils.messageBD("CurrencyUpdated");
        JSONObject msg = new JSONObject();
        msg.put("severity", "success");
        msg.put("text", OBMessageUtils.parseTranslation(messageText));
        jsonRequest.put("message", msg);

    } catch (Exception e) {
        OBDal.getInstance().rollbackAndClose();
        log.error("Error in set new currency Action Handler", e);

        try {
            jsonRequest = new JSONObject();
            Throwable ex = DbUtility.getUnderlyingSQLException(e);
            String message = OBMessageUtils.translateError(ex.getMessage()).getMessage();
            JSONObject errorMessage = new JSONObject();
            errorMessage.put("severity", "error");
            errorMessage.put("text", message);
            jsonRequest.put("message", errorMessage);
        } catch (Exception e2) {
            log.error(e.getMessage(), e2);
            // do nothing, give up
        }
    } finally {
        OBContext.restorePreviousMode();
    }
    return jsonRequest;
}

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

private void erstelleLossollmaterial(Integer losIId, Integer stuecklisteIId, BigDecimal bdPositionsMenge,
        Integer lagerIId_Hauptlager, boolean bFlachdruecken, int iEbene, TheClientDto theClientDto) {
    iEbene++;/*from w w w  .  j ava 2  s.  c o  m*/
    try {
        StuecklistepositionDto[] stkPos = getStuecklisteFac()
                .stuecklistepositionFindByStuecklisteIId(stuecklisteIId, theClientDto);

        StuecklisteDto stklDto = getStuecklisteFac().stuecklisteFindByPrimaryKey(stuecklisteIId, theClientDto);

        for (int i = 0; i < stkPos.length; i++) {
            // alle stuecklistenpositionen ins los uebernehmen

            LossollmaterialDto losMatDto = new LossollmaterialDto();
            losMatDto.setArtikelIId(stkPos[i].getArtikelIId());
            losMatDto.setBNachtraeglich(Helper.boolean2Short(false));
            losMatDto.setCKommentar(stkPos[i].getCKommentar());
            losMatDto.setCPosition(stkPos[i].getCPosition());
            losMatDto.setFDimension1(stkPos[i].getFDimension1());
            losMatDto.setFDimension2(stkPos[i].getFDimension2());
            losMatDto.setFDimension3(stkPos[i].getFDimension3());
            losMatDto.setILfdnummer(stkPos[i].getILfdnummer());
            losMatDto.setIBeginnterminoffset(stkPos[i].getIBeginnterminoffset());
            losMatDto.setISort(stkPos[i].getISort());
            losMatDto.setLosIId(losIId);
            losMatDto.setMontageartIId(stkPos[i].getMontageartIId());
            // Einheit umrechnen
            ArtikelDto artikelDto = getArtikelFac().artikelFindByPrimaryKey(stkPos[i].getArtikelIId(),
                    theClientDto);
            losMatDto.setEinheitCNr(artikelDto.getEinheitCNr());
            BigDecimal bdFaktor = getSystemFac().rechneUmInAndereEinheit(new BigDecimal(1),
                    artikelDto.getEinheitCNr(), stkPos[i].getEinheitCNr(), stkPos[i].getIId(), theClientDto);

            // nun die Dimensionen
            BigDecimal bdDimProdukt = new BigDecimal(1);
            EinheitDto einheitDto = getSystemFac().einheitFindByPrimaryKey(stkPos[i].getEinheitCNr(),
                    theClientDto);
            if (einheitDto.getIDimension().intValue() >= 1) {
                if (stkPos[i].getFDimension1() != null) {
                    bdDimProdukt = bdDimProdukt
                            .multiply(new BigDecimal(stkPos[i].getFDimension1().floatValue()));
                }
            }
            if (einheitDto.getIDimension().intValue() >= 2) {
                if (stkPos[i].getFDimension2() != null) {
                    bdDimProdukt = bdDimProdukt
                            .multiply(new BigDecimal(stkPos[i].getFDimension2().floatValue()));
                }
            }
            if (einheitDto.getIDimension().intValue() >= 3) {
                if (stkPos[i].getFDimension3() != null) {
                    bdDimProdukt = bdDimProdukt
                            .multiply(new BigDecimal(stkPos[i].getFDimension3().floatValue()));
                }
            }
            // verschnitt
            BigDecimal bdMenge = Helper.berechneMengeInklusiveVerschnitt(stkPos[i].getNMenge(),
                    artikelDto.getFVerschnittfaktor(), artikelDto.getFVerschnittbasis(), bdPositionsMenge);

            // endgueltige Menge berechnen
            if (bdFaktor.doubleValue() != 0) {

                bdMenge = bdMenge.divide(bdFaktor, BigDecimal.ROUND_HALF_EVEN);

                BigDecimal losSollMenge = bdMenge.multiply(bdDimProdukt).multiply(bdPositionsMenge).divide(
                        new BigDecimal(stklDto.getIErfassungsfaktor().doubleValue()),
                        BigDecimal.ROUND_HALF_EVEN);

                if (losSollMenge.doubleValue() < 0.001 && losSollMenge.doubleValue() > 0.000001) {
                    losSollMenge = new BigDecimal("0.001");
                    losSollMenge = losSollMenge.setScale(3, BigDecimal.ROUND_HALF_EVEN);
                } else {
                    losSollMenge = losSollMenge.setScale(3, BigDecimal.ROUND_HALF_EVEN);
                }

                losMatDto.setNMenge(losSollMenge);

            }

            BigDecimal bdSollpreis = getLagerFac().getGemittelterGestehungspreisEinesLagers(
                    stkPos[i].getArtikelIId(), lagerIId_Hauptlager, theClientDto);
            losMatDto.setNSollpreis(bdSollpreis);
            // Datensatz speichern

            // Wenn Unterstueckliste und Hilfsstueckliste:

            StuecklisteDto stuecklisteDto = getStuecklisteFac()
                    .stuecklisteFindByMandantCNrArtikelIIdOhneExc(stkPos[i].getArtikelIId(), theClientDto);

            if (stuecklisteDto != null && stuecklisteDto.getArtikelIId() == 3376) {
                int u = 0;

            }

            if (stuecklisteDto != null && stuecklisteDto.getStuecklisteartCNr()
                    .equals(StuecklisteFac.STUECKLISTEART_HILFSSTUECKLISTE) && bFlachdruecken == true) {
                if (iEbene < 10) {
                    erstelleLossollmaterial(losIId, stuecklisteDto.getIId(), losMatDto.getNMenge(),
                            lagerIId_Hauptlager, true, iEbene, theClientDto);

                }

            } else {

                LossollmaterialDto lossollmaterialDto = createLossollmaterial(losMatDto, theClientDto);

                Integer iOriginal_IId = new Integer(lossollmaterialDto.getIId());

                // Ersatztypen anlegen
                PosersatzDto[] posersatzDtos = getStuecklisteFac()
                        .posersatzFindByStuecklistepositionIId(stkPos[i].getIId());
                if (iEbene < 10) {
                    for (int k = 0; k < posersatzDtos.length; k++) {

                        losMatDto.setArtikelIId(posersatzDtos[k].getArtikelIIdErsatz());
                        losMatDto.setNMenge(new BigDecimal(0));
                        losMatDto.setLossollmaterialIIdOriginal(iOriginal_IId);
                        createLossollmaterial(losMatDto, theClientDto);

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

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

public void bucheTOPSArtikelAufHauptLager(Integer losIId, TheClientDto theClientDto,
        BigDecimal zuzubuchendeSatzgroesse) {
    LossollmaterialDto[] dtos = lossollmaterialFindByLosIId(losIId);
    try {//  w  w  w.  j a v a  2 s.  c o m
        Integer hauptlagerIId = getLagerFac().getHauptlagerDesMandanten(theClientDto).getIId();

        LosDto losDto = losFindByPrimaryKey(losIId);

        for (int i = 0; i < dtos.length; i++) {
            Integer artklaIId = null;

            ArtikelDto artikelDto = getArtikelFac().artikelFindByPrimaryKeySmall(dtos[i].getArtikelIId(),
                    theClientDto);
            artklaIId = artikelDto.getArtklaIId();

            if (artklaIId != null) {
                boolean bTops = Helper.short2boolean(
                        getArtikelFac().artklaFindByPrimaryKey(artklaIId, theClientDto).getBTops());

                if (bTops == true) {

                    BigDecimal sollsatzgroesse = dtos[i].getNMenge().divide(losDto.getNLosgroesse(), 4,
                            BigDecimal.ROUND_HALF_EVEN);
                    BigDecimal zuzubuchendeMenge = null;

                    if (zuzubuchendeSatzgroesse == null) {
                        zuzubuchendeMenge = dtos[i].getNMenge()
                                .subtract(getAusgegebeneMenge(dtos[i].getIId(), null, theClientDto));
                    } else {
                        zuzubuchendeMenge = sollsatzgroesse.multiply(zuzubuchendeSatzgroesse);
                    }

                    if (zuzubuchendeMenge.doubleValue() > 0) {

                        HandlagerbewegungDto handDto = new HandlagerbewegungDto();
                        handDto.setArtikelIId(dtos[i].getArtikelIId());
                        handDto.setNMenge(zuzubuchendeMenge);
                        handDto.setBAbgang(Helper.boolean2Short(false));
                        handDto.setCKommentar("TOPS " + losDto.getCNr());
                        handDto.setLagerIId(hauptlagerIId);
                        handDto.setNEinstandspreis(getLagerFac().getGemittelterGestehungspreisDesHauptlagers(
                                dtos[i].getArtikelIId(), theClientDto));
                        getLagerFac().createHandlagerbewegung(handDto, theClientDto);
                        // CK:13872
                        // Dann aufs Los buchen

                        LosistmaterialDto istmat = new LosistmaterialDto();
                        istmat.setLagerIId(hauptlagerIId);
                        istmat.setLossollmaterialIId(dtos[i].getIId());
                        istmat.setNMenge(zuzubuchendeMenge);
                        istmat.setBAbgang(Helper.boolean2Short(true));
                        // ist-wert anlegen und lagerbuchung
                        // durchfuehren
                        createLosistmaterial(istmat, null, theClientDto);

                        // Reservierung loeschen
                        removeReservierung(artikelDto, dtos[i].getIId());
                        // Fehlmenge anlegen
                        getFehlmengeFac().aktualisiereFehlmenge(LocaleFac.BELEGART_LOS, dtos[i].getIId(), false,
                                theClientDto);

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

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

/**
 * Ist-Arbeitszeit fuer eine Ablieferung pro abgelieferter Einheit
 * bestimmen./*w w  w  . j  av a 2  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

@TransactionAttribute(TransactionAttributeType.NEVER)
public KapazitaetsvorschauDto getKapazitaetsvorschau(TheClientDto theClientDto) throws EJBExceptionLP {
    KapazitaetsvorschauDto kapDto = null;
    Session session = null;/*from ww  w.  j  a v a 2s . c o  m*/
    try {

        // ------------------------------------------------------------------
        // -----
        // Benoetigte Parameter holen
        // ------------------------------------------------------------------
        // -----
        // Default Sicht nach Wochen
        // final int iSicht = FertigungFac.KAPAZITAETSVORSCHAU_NACH_WOCHEN;
        // Anzahl der angezeigten Vatergruppen. Alles andere wird nach
        // "Sonstige" verdichtet
        final ParametermandantDto parameterAnzahlGruppen = getParameterFac().getMandantparameter(
                theClientDto.getMandant(), ParameterFac.KATEGORIE_FERTIGUNG,
                ParameterFac.PARAMETER_FERTIGUNG_KAPAZITAETSVORSCHAU_ANZAHL_GRUPPEN);
        final int iParamAnzahlGruppen = (Integer) parameterAnzahlGruppen.getCWertAsObject();
        // Angezeigter Zeitraum = Anzahl der Spalten
        final ParametermandantDto parameterZeitraum = getParameterFac().getMandantparameter(
                theClientDto.getMandant(), ParameterFac.KATEGORIE_FERTIGUNG,
                ParameterFac.PARAMETER_FERTIGUNG_KAPAZITAETSVORSCHAU_ZEITRAUM);
        final int iParamZeitraum = (Integer) parameterZeitraum.getCWertAsObject();

        // ------------------------------------------------------------------
        // -----
        // Hibernate-Session erstellen
        // ------------------------------------------------------------------
        // -----
        SessionFactory factory = FLRSessionFactory.getFactory();
        session = factory.openSession();
        // ------------------------------------------------------------------
        // -----
        // Artikel- / Maschinen-Vatergruppen holen
        // ------------------------------------------------------------------
        // -----
        // Alle Artikel-Vatergruppen
        Criteria cArtikelVatergruppen = session.createCriteria(FLRArtikelgruppe.class);
        cArtikelVatergruppen.add(Restrictions.isNull(ArtikelFac.FLR_ARTIKELGRUPPE_FLRARTIKELGRUPPE));
        List<?> listArtikelgruppen = cArtikelVatergruppen.list();
        // Alle Maschinen-Vatergruppen
        Criteria cMaschinengruppen = session.createCriteria(FLRMaschinengruppe.class);
        List<?> listMaschinengruppen = cMaschinengruppen.list();
        // ------------------------------------------------------------------
        // -----
        // Anzahl der sub-Diagramme bestimmen
        // das ist grundsaetzlich (iParamAnzahlGruppen + 1) x 2 ...
        // (Anzahl d. anzuzeigenden Vatergruppen + Sonstige) f. AZ und
        // Maschinen
        // wenn es weniger Vatergruppen als anzuzeigende gibt, reduziert
        // sich das aber
        // Gibt es keine Vatergruppe, wird daher alles nach "Sonstige"
        // verdichtet
        // ------------------------------------------------------------------
        // -----
        final int iAnzuzeigendeArtikelgruppen = Math.min(iParamAnzahlGruppen, listArtikelgruppen.size());

        final int iAnzuzeigendeMaschinengruppen = Math.min(iParamAnzahlGruppen, listMaschinengruppen.size());

        final int iAnzahlZeilen = iAnzuzeigendeArtikelgruppen + 1 + iAnzuzeigendeMaschinengruppen + 1;

        // ------------------------------------------------------------------
        // -----
        // Dto initialisieren
        // ------------------------------------------------------------------
        // -----
        kapDto = new KapazitaetsvorschauDto(iAnzahlZeilen, iParamZeitraum);
        // ------------------------------------------------------------------
        // -----
        // Beschriftung der x-Achse ermitteln. das sind die Kalenderwochen
        // ------------------------------------------------------------------
        // -----
        HashMap<Integer, Integer> hmKWIndizes = new HashMap<Integer, Integer>();

        String[] kw = new String[iParamZeitraum];
        GregorianCalendar gc = new GregorianCalendar();
        for (int i = 0; i < kw.length; i++) {
            int iKw = gc.get(GregorianCalendar.WEEK_OF_YEAR);
            kw[i] = "" + iKw;
            kapDto.setISpaltenueberschrift(i, kw[i]);
            hmKWIndizes.put(gc.get(GregorianCalendar.WEEK_OF_YEAR), i);
            gc.setTimeInMillis(gc.getTimeInMillis() + 7 * 24 * 60 * 60 * 1000); // 1 Woche dazu
        }
        // ------------------------------------------------------------------
        // -----
        // Beschriftung der y-Achse ermitteln. das sind die Namen der
        // Vatergruppen bzw. 2 x "Sonstige".
        // Weiters werden die Indizes im Daten-Array fuer die jeweiligen
        // Gruppen festgelegt.
        // ------------------------------------------------------------------
        // -----
        String sSonstige = getTextRespectUISpr("lp.sonstige", theClientDto.getMandant(),
                theClientDto.getLocUi());

        HashMap<Integer, Integer> hmArtikelGruppenIndizes = new HashMap<Integer, Integer>();
        HashMap<Integer, Integer> hmMaschinenGruppenIndizes = new HashMap<Integer, Integer>();

        // zuerst die Artikelvatergruppen
        for (int i = 0; i < iAnzuzeigendeArtikelgruppen; i++) {
            FLRArtikelgruppe item = (FLRArtikelgruppe) listArtikelgruppen.get(i);
            kapDto.setIZeilenueberschrift(i, item.getC_nr());
            hmArtikelGruppenIndizes.put(item.getI_id(), i);
        }
        // Dann Sonstige Artikelgruppen
        final int indexSonstigeArtikelGruppen = iAnzuzeigendeArtikelgruppen;
        kapDto.setIZeilenueberschrift(indexSonstigeArtikelGruppen, sSonstige);
        // Maschinengruppen
        for (int i = 0; i < iAnzuzeigendeMaschinengruppen; i++) {
            FLRMaschinengruppe item = (FLRMaschinengruppe) listMaschinengruppen.get(i);
            int index = iAnzuzeigendeArtikelgruppen + 1 + i;
            kapDto.setIZeilenueberschrift(index, item.getC_bez());
            hmMaschinenGruppenIndizes.put(item.getI_id(), index);
        }
        // zuletzt Sonstige Maschinengruppen
        final int indexSonstigeMaschinenGruppen = iAnzuzeigendeArtikelgruppen + 1
                + iAnzuzeigendeMaschinengruppen;
        kapDto.setIZeilenueberschrift(indexSonstigeMaschinenGruppen, sSonstige);

        // ------------------------------------------------------------------
        // -----
        // Lose holen
        // ------------------------------------------------------------------
        // -----
        Criteria cLose = session.createCriteria(FLRLos.class);
        // Filter nach Mandant
        cLose.add(Restrictions.eq(FertigungFac.FLR_LOS_MANDANT_C_NR, theClientDto.getMandant()));
        // Alle Stati ausser Erledigt, Gestoppt, Storniert
        Collection<String> cLoseStati = new LinkedList<String>();
        cLoseStati.add(FertigungFac.STATUS_ERLEDIGT);
        cLoseStati.add(FertigungFac.STATUS_GESTOPPT);
        cLoseStati.add(FertigungFac.STATUS_STORNIERT);
        cLose.add(Restrictions.not(Restrictions.in(FertigungFac.FLR_LOS_STATUS_C_NR, cLoseStati)));
        List<?> listLose = cLose.list();
        // ------------------------------------------------------------------
        // -----
        // Auswertungszeitraum und verfuegbare Kapazitaeten ermitteln
        // ------------------------------------------------------------------
        // -----

        // 3 Monate in die zukunft
        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(System.currentTimeMillis());
        c.set(Calendar.MONTH, c.get(Calendar.MONTH) + 3);
        java.util.Date dMax = Helper.cutDate(new java.sql.Date(c.getTimeInMillis()));

        java.sql.Timestamp tVon = Helper.cutTimestamp(new java.sql.Timestamp(System.currentTimeMillis()));
        java.sql.Timestamp tBis = Helper.cutTimestamp(new java.sql.Timestamp(dMax.getTime()));
        // Verfuegbare Zeiten holen
        SollverfuegbarkeitDto[] oVerfuegbar = getZeiterfassungFac().getVerfuegbareSollzeit(tVon, tBis,
                theClientDto);
        // diese nun aufteilen
        for (int i = 0; i < oVerfuegbar.length; i++) {
            SollverfuegbarkeitDto svDto = oVerfuegbar[i];
            // "normale" AZ
            if (svDto.isBMannarbeitszeit()) {
                // die sind einer Artikelgruppe zugeordnet
                if (svDto.getIGruppeid() != null) {
                    Integer iZeile = hmArtikelGruppenIndizes.get(svDto.getIGruppeid());
                    // ist das eine sichtbare Gruppe
                    if (iZeile != null) {
                        for (int iSpalte = 0; iSpalte < kapDto.getDetails()[iZeile].length; iSpalte++) {
                            // mal 5 Tage
                            kapDto.addBdVerfuegbareStunden(iZeile, iSpalte,
                                    svDto.getNSollstunden().multiply(new BigDecimal(5)));
                        }
                    }
                    // wenn nicht, dann zu den sonstigen
                    else {
                        for (int iSpalte = 0; iSpalte < kapDto
                                .getDetails()[indexSonstigeArtikelGruppen].length; iSpalte++) {
                            // mal 5 Tage
                            kapDto.addBdVerfuegbareStunden(indexSonstigeArtikelGruppen, iSpalte,
                                    svDto.getNSollstunden().multiply(new BigDecimal(5)));
                        }
                    }
                }
                // Rest = Sonstige Artikelgruppen
                else {
                    if (svDto.getTDatum() != null) {
                        // Die KW dieses Datums ermitteln, damit das
                        // zugeordnet werden kann
                        GregorianCalendar gcSV = new GregorianCalendar();
                        gcSV.setTime(svDto.getTDatum());
                        int kwSV = gcSV.get(Calendar.WEEK_OF_YEAR);
                        Integer iIndexDerKW = hmKWIndizes.get(kwSV);
                        if (iIndexDerKW != null) {
                            // Hier nicht mit 5 multiplizieren, da es fuer
                            // jeden Tag einen eigenen Eintrag gibt
                            kapDto.addBdVerfuegbareStunden(indexSonstigeArtikelGruppen, iIndexDerKW,
                                    svDto.getNSollstunden());
                        } else {
                            // diese KW wird nicht mehr angezeigt - brauch
                            // ich nicht einrechnen
                        }
                    }
                }
            }
            // Maschinenzeit - die Verfuegbarkeit ist jeden Tag gleich
            else {
                Integer iZeile = hmMaschinenGruppenIndizes.get(svDto.getIGruppeid());
                // ist das eine sichtbare Gruppe
                if (iZeile != null) {
                    for (int iSpalte = 0; iSpalte < kapDto.getDetails()[iZeile].length; iSpalte++) {
                        // mal 5 Tage
                        kapDto.addBdVerfuegbareStunden(iZeile, iSpalte,
                                svDto.getNSollstunden().multiply(new BigDecimal(5)));
                    }
                }
                // wenn nicht, dann zu den sonstigen
                else {
                    for (int iSpalte = 0; iSpalte < kapDto
                            .getDetails()[indexSonstigeMaschinenGruppen].length; iSpalte++) {
                        // mal 5 Tage
                        kapDto.addBdVerfuegbareStunden(indexSonstigeMaschinenGruppen, iSpalte,
                                svDto.getNSollstunden().multiply(new BigDecimal(5)));
                    }
                }
            }
        }
        // ------------------------------------------------------------------
        // -----
        // Offene Zeiten ermitteln
        // ------------------------------------------------------------------
        // -----
        for (Iterator<?> iter = listLose.iterator(); iter.hasNext();) {
            FLRLos los = (FLRLos) iter.next();
            // Offene Menge ermitteln
            BigDecimal bdOffen = los.getN_losgroesse();
            for (Iterator<?> iterAblieferung = los.getAblieferungset().iterator(); iterAblieferung.hasNext();) {
                FLRLosablieferung item = (FLRLosablieferung) iterAblieferung.next();
                bdOffen = bdOffen.subtract(item.getN_menge());
            }
            // nur Lose mit tatsaechlich offener Menge>0
            if (bdOffen.compareTo(new BigDecimal(0)) > 0) {
                // Faktor zur Berechnung der offenen Zeiten = offene Menge /
                // Losgroesse. 2 Nachkommastellen sollten reichen.
                BigDecimal bdFaktor = bdOffen.divide(los.getN_losgroesse(), 2, BigDecimal.ROUND_HALF_EVEN);
                // Arbeitsplan holen
                Criteria cLosAZ = session.createCriteria(FLRLossollarbeitsplan.class);
                cLosAZ.add(Restrictions.eq(FertigungFac.FLR_LOSSOLLARBEITSPLAN_LOS_I_ID, los.getI_id()));
                List<?> listLosAZ = cLosAZ.list();
                // fuer alle Taetigkeiten
                for (Iterator<?> iterAZ = listLosAZ.iterator(); iterAZ.hasNext();) {
                    FLRLossollarbeitsplan losAZ = (FLRLossollarbeitsplan) iterAZ.next();
                    BigDecimal bdOffeneStunden = losAZ.getN_gesamtzeit().multiply(bdFaktor);
                    // ------------------------------------------------------
                    // -----------------
                    // Index der Gruppe bestimmen, der ich das zuordnen muss
                    // ------------------------------------------------------
                    // -----------------
                    int iZeilenIndex;
                    // 1. nach Maschinengruppe
                    // 2. nach Artikelgruppe der Taetigkeit
                    FLRMaschine flrMaschine = losAZ.getFlrmaschine();
                    Integer iMaschinengruppeIId = null;
                    Integer iArtikelgruppeIId = null;
                    if (flrMaschine != null) {
                        FLRMaschinengruppe flrMaschinengruppe = flrMaschine.getFlrmaschinengruppe();
                        if (flrMaschinengruppe != null) {
                            // Wenn diese Maschinengruppe dargestellt wird,
                            // dann kommt hier der index raus.
                            Integer i = hmMaschinenGruppenIndizes.get(flrMaschinengruppe.getI_id());
                            iMaschinengruppeIId = flrMaschinengruppe.getI_id();
                            if (i != null) {
                                iZeilenIndex = i;
                            }
                            // wenn nicht -> sonstige.
                            else {
                                iZeilenIndex = indexSonstigeMaschinenGruppen;
                            }
                        }
                        // Maschinen ohne Maschinengruppe werden nach
                        // "Sonstige" verdichtet.
                        else {
                            iZeilenIndex = indexSonstigeMaschinenGruppen;
                        }
                    } else {
                        FLRArtikel flrArtikel = losAZ.getFlrartikel();
                        FLRArtikelgruppe flrArtikelgruppe = flrArtikel.getFlrartikelgruppe();
                        if (flrArtikelgruppe != null) {
                            // Wenn diese Artikelgruppe dargestellt wird,
                            // dann kommt hier der index raus.
                            Integer i = hmArtikelGruppenIndizes.get(flrArtikelgruppe.getI_id());
                            iArtikelgruppeIId = flrArtikelgruppe.getI_id();
                            if (i != null) {
                                iZeilenIndex = i;
                            }
                            // wenn nicht -> sonstige.
                            else {
                                iZeilenIndex = indexSonstigeArtikelGruppen;
                            }
                        }
                        // Taetigkeiten ohne Artikelgruppe werden nach
                        // "Sonstige" verdichtet.
                        else {
                            iZeilenIndex = indexSonstigeArtikelGruppen;
                        }
                    }
                    // ------------------------------------------------------
                    // -----------------
                    // Jetzt hab ich die Gruppe, der ich das zuordnen muss
                    // nun muss die Zeit aufgeteilt werden
                    // ------------------------------------------------------
                    // -----------------
                    java.util.Date tLosStarttermin = los.getT_produktionsbeginn();
                    java.util.Date tLosEndetermin = los.getT_produktionsende();
                    // beide Termine duerfen nicht vor heute liegen
                    if (tLosStarttermin.before(getDate())) {
                        tLosStarttermin = getDate();
                    }
                    if (tLosEndetermin.before(getDate())) {
                        tLosEndetermin = getDate();
                    }
                    // Anzahl der betroffenen Kalenderwochen bestimmen
                    GregorianCalendar gcStart = new GregorianCalendar();
                    gcStart.setTime(tLosStarttermin);
                    GregorianCalendar gcEnde = new GregorianCalendar();
                    gcEnde.setTime(tLosEndetermin);
                    int iStartKW = gcStart.get(Calendar.WEEK_OF_YEAR);
                    int iEndeKW = gcEnde.get(Calendar.WEEK_OF_YEAR);
                    int iAnzahlKW = 1 + iEndeKW - iStartKW;
                    // nun auf die Wochen aufteilen
                    BigDecimal bdOffeneStundenJeWoche = bdOffeneStunden;

                    if (iAnzahlKW > 0) {
                        bdOffeneStundenJeWoche = bdOffeneStunden.divide(new BigDecimal(iAnzahlKW), 2,
                                RoundingMode.HALF_UP);
                    }

                    for (int iAktuelleKW = iStartKW; iAktuelleKW <= iEndeKW; iAktuelleKW++) {
                        Integer indexDerKW = hmKWIndizes.get(iAktuelleKW);
                        // wird diese Woche auch angezeigt?
                        if (indexDerKW != null) {
                            KapazitaetsvorschauDetailDto detailDto = new KapazitaetsvorschauDetailDto();
                            detailDto.setArtikelgruppeIId(iArtikelgruppeIId);
                            detailDto.setArtikelIIdTaetigkeit(losAZ.getFlrartikel().getI_id());
                            detailDto.setBdDauer(bdOffeneStundenJeWoche);
                            detailDto.setLosIId(los.getI_id());
                            detailDto.setLossollarbeitsplanIId(losAZ.getI_id());
                            detailDto.setMaschinengruppeIId(iMaschinengruppeIId);
                            kapDto.addDetail(iZeilenIndex, indexDerKW, detailDto);
                        }
                    }
                }
            }
        }

        // ------------------------------------------------------------------
        // -----
        // Diagramm aus den Daten erstellen
        // ------------------------------------------------------------------
        // -----
        SymbolAxis xAchse = new SymbolAxis("KW", kw);
        CombinedDomainXYPlot plot = new CombinedDomainXYPlot(xAchse);
        for (int iZeile = 0; iZeile < kapDto.getDetails().length; iZeile++) {
            XYSeries datenZeile = new XYSeries(kapDto.getIZeilenueberschrift(iZeile));
            // Balkenfarben festlegen ( >100% = rot, sonst hellgrau)
            // fuer jede zeile und jede spalte
            Paint[][] paints = new Paint[1][kapDto.getDetails()[iZeile].length];
            for (int iSpalte = 0; iSpalte < kapDto.getDetails()[iZeile].length; iSpalte++) {
                BigDecimal bdVerfuegbar = kapDto.getBdVerfuegbareStunden()[iZeile][iSpalte];
                BigDecimal bdBenoetigt = new BigDecimal(0);
                // Benoetigte Zeit jet Gruppe je Woche ermitteln
                for (Iterator<?> iter = kapDto.getDetails()[iZeile][iSpalte].iterator(); iter.hasNext();) {
                    KapazitaetsvorschauDetailDto item = (KapazitaetsvorschauDetailDto) iter.next();
                    bdBenoetigt = bdBenoetigt.add(item.getBdDauer());
                }
                BigDecimal value = new BigDecimal(0);
                if (bdVerfuegbar.compareTo(new BigDecimal(0)) > 0) {
                    value = (bdBenoetigt.multiply(new BigDecimal(100))).divide(bdVerfuegbar, 4,
                            BigDecimal.ROUND_HALF_EVEN);
                    if (value.doubleValue() > 100.0) {
                        paints[0][iSpalte] = Color.red;
                    } else {
                        paints[0][iSpalte] = Color.lightGray;
                    }
                }
                // tage ohne Verfuegbarkeit mach ich 100% und weisz
                else {
                    value = new BigDecimal(100.0);
                    // Wochen ohne Kapazitaet aber mit geplanter Zeit
                    if (bdBenoetigt.compareTo(new BigDecimal(0)) > 0) {
                        paints[0][iSpalte] = Color.MAGENTA;
                    }
                    // Wenn nichts verfuegbar aber auch nichts benoetigt ->
                    // weiss
                    else {
                        paints[0][iSpalte] = Color.white;
                    }
                }
                XYDataItem data = new XYDataItem(iSpalte, value.doubleValue());
                datenZeile.add(data);
            }
            // Zur Collection
            XYSeriesCollection xyDataset = new XYSeriesCollection();
            xyDataset.addSeries(datenZeile);

            // subplot erstellen
            XYItemRenderer renderer1 = new CustomXYBarRenderer(paints);

            // renderer1.setItemLabelsVisible(true);
            // Legende nicht anzeigen
            renderer1.setBaseSeriesVisibleInLegend(false);
            NumberAxis zeilenAchse = new NumberAxis(kapDto.getIZeilenueberschrift(iZeile));
            // Beschriftung der Y-Achse um 90 grad drehen
            zeilenAchse.setLabelAngle(Math.PI / 2.0);
            zeilenAchse.setAutoRange(true);
            XYPlot subplot1 = new XYPlot(xyDataset, null, zeilenAchse, renderer1);
            subplot1.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT);
            // Markierung bei 100%
            final Marker target = new ValueMarker(100.0);
            target.setPaint(Color.darkGray);
            // target.setLabel("100 %"); // Label
            // target.setLabelAnchor(RectangleAnchor.TOP_RIGHT);
            // target.setLabelTextAnchor(TextAnchor.BOTTOM_RIGHT);
            subplot1.addRangeMarker(target);

            plot.add(subplot1); // plot.add(subplot1, 1);
        }
        JFreeChart lStackedBarChart = new JFreeChart(plot);

        kapDto.setJfcKapazitaetsvorschau(lStackedBarChart);
    } catch (RemoteException ex) {
        throwEJBExceptionLPRespectOld(ex);
    } finally {
        if (session != null) {
            session.close();
        }
    }
    return kapDto;
}

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

private void bucheNegativesollmengenAufLager(LosDto losDto, BigDecimal bdGesamtAbgeliefert,
        TheClientDto theClientDto) {//from   ww  w.j a  va 2 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 ArrayList<LosAusAuftragDto> holeAlleMoeglichenUnterloseEinerStueckliste(Integer artikelIId,
        BigDecimal zielmenge, int stdVorlaufzeit, Timestamp tLetzterBeginn, ArrayList<LosAusAuftragDto> losDtos,
        AuftragDto auftragDto, BigDecimal bdLosgroesse, TheClientDto theClientDto) {
    try {/*from w w  w  . j a  v  a 2  s  . c  o m*/
        StuecklisteDto stuecklisteDto = getStuecklisteFac()
                .stuecklisteFindByMandantCNrArtikelIIdOhneExc(artikelIId, theClientDto);

        if (stuecklisteDto != null && !stuecklisteDto.getStuecklisteartCNr()
                .equals(StuecklisteFac.STUECKLISTEART_HILFSSTUECKLISTE)) {
            ArrayList<?> stuecklisteAufegloest = getStuecklisteFac().getStrukturDatenEinerStueckliste(
                    stuecklisteDto.getIId(), theClientDto,
                    StuecklisteReportFac.REPORT_STUECKLISTE_OPTION_SORTIERUNG_ARTIKELNR, 0, null, false, true,
                    zielmenge, null, true);

            Timestamp tEnde = Helper.addiereTageZuTimestamp(tLetzterBeginn, -stdVorlaufzeit);

            if (stuecklisteDto.getNDefaultdurchlaufzeit() == null) {
                stuecklisteDto.setNDefaultdurchlaufzeit(new BigDecimal(0));
            }
            Timestamp tBeginn = Helper.addiereTageZuTimestamp(tEnde,
                    -stuecklisteDto.getNDefaultdurchlaufzeit().intValue());

            LosAusAuftragDto laDto = new LosAusAuftragDto();

            LosDto losDto = new LosDto();

            losDto.setTProduktionsbeginn(new java.sql.Date(tBeginn.getTime()));
            losDto.setTProduktionsende(new java.sql.Date(tEnde.getTime()));
            losDto.setStuecklisteIId(stuecklisteDto.getIId());
            losDto.setLagerIIdZiel(stuecklisteDto.getLagerIIdZiellager());
            losDto.setFertigungsgruppeIId(stuecklisteDto.getFertigungsgruppeIId());
            losDto.setNLosgroesse(zielmenge.multiply(bdLosgroesse));
            losDto.setKostenstelleIId(auftragDto.getKostenstelleIId());
            losDto.setCProjekt(auftragDto.getCBezProjektbezeichnung());
            laDto.setLosDto(losDto);

            laDto.setFehlmengen(getFehlmengeFac()
                    .getAnzahlFehlmengeEinesArtikels(stuecklisteDto.getArtikelIId(), theClientDto));
            laDto.setReservierungen(
                    getReservierungFac().getAnzahlReservierungen(stuecklisteDto.getArtikelIId(), theClientDto));

            BigDecimal lagerstand = new BigDecimal(0);
            LagerDto[] allelaegerDtos = getLagerFac().lagerFindByMandantCNr(theClientDto.getMandant());

            for (int i = 0; i < allelaegerDtos.length; i++) {
                if (Helper.short2boolean(allelaegerDtos[i].getBInternebestellung())) {
                    lagerstand = lagerstand.add(getLagerFac().getLagerstand(stuecklisteDto.getArtikelIId(),
                            allelaegerDtos[i].getIId(), theClientDto));
                }

            }

            laDto.setLagerstand(lagerstand);
            laDto.setOffeneFertigungsmenge(
                    getFertigungFac().getAnzahlInFertigung(stuecklisteDto.getArtikelIId(), theClientDto));

            losDtos.add(laDto);

            for (int j = 0; j < stuecklisteAufegloest.size(); j++) {
                StuecklisteMitStrukturDto strukt = (StuecklisteMitStrukturDto) stuecklisteAufegloest.get(j);

                if (strukt.getStuecklistepositionDto() != null
                        && strukt.getStuecklistepositionDto().getArtikelIId() != null) {

                    losDtos = holeAlleMoeglichenUnterloseEinerStueckliste(
                            strukt.getStuecklistepositionDto().getArtikelIId(),
                            strukt.getStuecklistepositionDto().getNZielmenge().multiply(zielmenge),
                            stdVorlaufzeit, tBeginn, losDtos, auftragDto, bdLosgroesse, theClientDto);

                }
            }

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

From source file:org.openbravo.test.costing.TestCosting.java

@Test
public void testCostingGG() throws Exception {

    final int day0 = 0;
    final int day1 = 5;
    final int day2 = 10;
    final int day3 = 15;
    final int day4 = 20;
    final int day5 = 25;
    final BigDecimal price1 = new BigDecimal("15.00");
    final BigDecimal price2 = new BigDecimal("12.00");
    final BigDecimal price3 = new BigDecimal("13.50");
    final BigDecimal quantity1 = new BigDecimal("100");
    final BigDecimal quantity2 = new BigDecimal("200");

    try {/* w  ww. ja  v a  2s  .com*/

        OBContext.setOBContext(USER_ID, ROLE_ID, CLIENT_ID, ORGANIZATION_ID);
        OBContext.setAdminMode(true);

        // Create a new product for the test
        Product product = createProduct(price1);

        // Create purchase order and book it
        Order purchaseOrder1 = createPurchaseOrder(product, price1, quantity1, day0);

        // Create purchase order and book it
        Order purchaseOrder2 = createPurchaseOrder(product, price2, quantity1, day1);

        // Create goods receipt, run costing background, post it and assert it
        ShipmentInOut goodsReceipt1 = createGoodsReceipt(purchaseOrder1, price1, quantity1, day2);

        // Create goods receipt, run costing background, post it and assert it
        ShipmentInOut goodsReceipt2 = createGoodsReceipt(purchaseOrder2, price2, quantity1, day3);

        // Create purchase invoice, post it and assert it
        List<ShipmentInOut> goodsReceiptList = new ArrayList<ShipmentInOut>();
        goodsReceiptList.add(goodsReceipt1);
        goodsReceiptList.add(goodsReceipt2);
        List<BigDecimal> priceList = new ArrayList<BigDecimal>();
        priceList.add(price1);
        priceList.add(price2);
        createPurchaseInvoice(goodsReceiptList, priceList, quantity2, day5);

        // Update transaction total cost amount
        manualCostAdjustment(getProductTransactions(product.getId()).get(1), quantity1.multiply(price1), false,
                day4);

        // Assert product transactions
        List<ProductTransactionAssert> productTransactionAssertList = new ArrayList<ProductTransactionAssert>();
        productTransactionAssertList.add(
                new ProductTransactionAssert(OBDal.getInstance().get(ShipmentInOut.class, goodsReceipt1.getId())
                        .getMaterialMgmtShipmentInOutLineList().get(0), price1, price1, true, false));
        productTransactionAssertList.add(
                new ProductTransactionAssert(OBDal.getInstance().get(ShipmentInOut.class, goodsReceipt2.getId())
                        .getMaterialMgmtShipmentInOutLineList().get(0), price2, price1, true, true));
        assertProductTransaction(product.getId(), productTransactionAssertList);

        // Assert product costing
        List<MaterialTransaction> transactionList = getProductTransactions(product.getId());
        List<ProductCostingAssert> productCostingAssertList = new ArrayList<ProductCostingAssert>();
        productCostingAssertList
                .add(new ProductCostingAssert(transactionList.get(0), price1, null, price1, quantity1));
        productCostingAssertList
                .add(new ProductCostingAssert(transactionList.get(1), price1, price3, price1, quantity2));
        assertProductCosting(product.getId(), productCostingAssertList);

        // Assert cost adjustment
        List<CostAdjustment> costAdjustmentList = getCostAdjustment(product.getId());
        List<List<CostAdjustmentAssert>> costAdjustmentAssertList = new ArrayList<List<CostAdjustmentAssert>>();
        List<CostAdjustmentAssert> costAdjustmentAssertLineList = new ArrayList<CostAdjustmentAssert>();
        costAdjustmentAssertLineList.add(new CostAdjustmentAssert(transactionList.get(1), "MCC",
                quantity1.multiply(price1).add(quantity1.multiply(price2).negate()), day4, true));
        costAdjustmentAssertList.add(costAdjustmentAssertLineList);
        assertCostAdjustment(costAdjustmentList, costAdjustmentAssertList);

        // Post cost adjustment 1 and assert it
        postDocument(costAdjustmentList.get(0));
        List<DocumentPostAssert> documentPostAssertList = new ArrayList<DocumentPostAssert>();
        documentPostAssertList.add(new DocumentPostAssert("61000", amount0,
                quantity1.multiply(price1).add(quantity1.multiply(price2).negate()), null));
        documentPostAssertList.add(new DocumentPostAssert("35000",
                quantity1.multiply(price1).add(quantity1.multiply(price2).negate()), amount0, null));
        CostAdjustment costAdjustment = OBDal.getInstance().get(CostAdjustment.class,
                costAdjustmentList.get(0).getId());
        assertDocumentPost(costAdjustment, product.getId(), documentPostAssertList);

        OBDal.getInstance().commitAndClose();

    } catch (Exception e) {
        System.out.println(e.getMessage());
        throw new OBException(e);
    }

    finally {
        OBContext.restorePreviousMode();
    }
}