Example usage for java.math BigDecimal subtract

List of usage examples for java.math BigDecimal subtract

Introduction

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

Prototype

public BigDecimal subtract(BigDecimal subtrahend) 

Source Link

Document

Returns a BigDecimal whose value is (this - subtrahend) , and whose scale is max(this.scale(), subtrahend.scale()) .

Usage

From source file:org.egov.wtms.service.es.WaterChargeCollectionDocService.java

/**
 * Prepares Collection Table Data//from w  ww .  j  a v a 2  s. c o m
 *
 * @param collectionDetailsRequest
 * @return List
 */
public List<WaterChargeDashBoardResponse> getResponseTableData(
        final WaterChargeDashBoardRequest collectionDetailsRequest) {
    final List<WaterChargeDashBoardResponse> collIndDataList = new ArrayList<>();
    Date fromDate;
    Date toDate;
    String name;
    WaterChargeDashBoardResponse collIndData;
    BigDecimal cytdDmd;
    BigDecimal performance;
    BigDecimal balance;
    BigDecimal variance;
    String aggregationField = WaterTaxConstants.REGIONNAMEAGGREGATIONFIELD;
    Map<String, BillCollectorIndex> wardWiseBillCollectors = new HashMap<>();
    final CFinancialYear financialYear = cFinancialYearService.getCurrentFinancialYear();
    /**
     * Select the grouping based on the type parameter, by default the
     * grouping is done based on Regions. If type is region, group by
     * Region, if type is district, group by District, if type is ulb, group
     * by ULB
     */
    if (StringUtils.isNotBlank(collectionDetailsRequest.getType()))
        if (collectionDetailsRequest.getType().equalsIgnoreCase(DASHBOARD_GROUPING_REGIONWISE))
            aggregationField = WaterTaxConstants.REGIONNAMEAGGREGATIONFIELD;
        else if (collectionDetailsRequest.getType().equalsIgnoreCase(DASHBOARD_GROUPING_DISTRICTWISE))
            aggregationField = WaterTaxConstants.DISTRICTNAMEAGGREGATIONFIELD;
        else if (collectionDetailsRequest.getType().equalsIgnoreCase(DASHBOARD_GROUPING_ULBWISE))
            aggregationField = WaterTaxConstants.CITYNAMEAGGREGATIONFIELD;
        else if (collectionDetailsRequest.getType().equalsIgnoreCase(DASHBOARD_GROUPING_GRADEWISE))
            aggregationField = WaterTaxConstants.CITYGRADEAGGREGATIONFIELD;
        else if (collectionDetailsRequest.getType().equalsIgnoreCase(DASHBOARD_GROUPING_WARDWISE)
                || collectionDetailsRequest.getType()
                        .equalsIgnoreCase(PropertyTaxConstants.DASHBOARD_GROUPING_BILLCOLLECTORWISE))
            aggregationField = WaterTaxConstants.REVENUEWARDAGGREGATIONFIELD;

    /**
     * As per Elastic Search functionality, to get the total collections
     * between 2 dates, add a day to the endDate and fetch the results For
     * Current day's collection if dates are sent in the request, consider
     * the toDate, else take date range between current date +1 day
     */
    if (StringUtils.isNotBlank(collectionDetailsRequest.getFromDate())
            && StringUtils.isNotBlank(collectionDetailsRequest.getToDate())) {
        fromDate = DateUtils.getDate(collectionDetailsRequest.getToDate(), DATE_FORMAT_YYYYMMDD);
        toDate = org.apache.commons.lang3.time.DateUtils
                .addDays(DateUtils.getDate(collectionDetailsRequest.getToDate(), DATE_FORMAT_YYYYMMDD), 1);
    } else {
        fromDate = new Date();
        toDate = org.apache.commons.lang3.time.DateUtils.addDays(new Date(), 1);
    }

    Long startTime = System.currentTimeMillis();
    // For today collection
    final Map<String, BigDecimal> todayCollMap = getCollectionAndDemandValues(collectionDetailsRequest,
            fromDate, toDate, WaterTaxConstants.COLLECTION_INDEX_NAME, TOTAL_AMOUNT, aggregationField);

    /**
     * For collection and demand between the date ranges if dates are sent
     * in the request, consider fromDate and toDate+1 , else calculate from
     * current year start date till current date+1 day
     */
    if (StringUtils.isNotBlank(collectionDetailsRequest.getFromDate())
            && StringUtils.isNotBlank(collectionDetailsRequest.getToDate())) {
        fromDate = DateUtils.getDate(collectionDetailsRequest.getFromDate(), DATE_FORMAT_YYYYMMDD);
        toDate = org.apache.commons.lang3.time.DateUtils
                .addDays(DateUtils.getDate(collectionDetailsRequest.getToDate(), DATE_FORMAT_YYYYMMDD), 1);
    } else {
        fromDate = DateUtils.startOfDay(financialYear.getStartingDate());
        toDate = org.apache.commons.lang3.time.DateUtils.addDays(new Date(), 1);
    }
    final int noOfMonths = DateUtils.noOfMonthsBetween(fromDate, toDate) + 1;

    final Map<String, BigDecimal> cytdCollMap = getCollectionAndDemandValues(collectionDetailsRequest, fromDate,
            toDate, COLLECTION_INDEX_NAME, TOTAL_AMOUNT, aggregationField);

    // For total demand
    final Map<String, BigDecimal> totalDemandMap = getCollectionAndDemandValues(collectionDetailsRequest,
            fromDate, toDate, WaterTaxConstants.WATER_TAX_INDEX_NAME, WaterTaxConstants.WATERCHARGETOTALDEMAND,
            aggregationField);
    // For current year demand
    final Map<String, BigDecimal> currYrTotalDemandMap = getCollectionAndDemandValues(collectionDetailsRequest,
            fromDate, toDate, WaterTaxConstants.WATER_TAX_INDEX_NAME, WaterTaxConstants.WATERCHARGETOTALDEMAND,
            aggregationField);
    // For last year's till today's date collections
    final Map<String, BigDecimal> lytdCollMap = getCollectionAndDemandValues(collectionDetailsRequest,
            org.apache.commons.lang3.time.DateUtils.addYears(fromDate, -1),
            org.apache.commons.lang3.time.DateUtils.addYears(toDate, -1),
            WaterTaxConstants.COLLECTION_INDEX_NAME, TOTAL_AMOUNT, aggregationField);
    if (DASHBOARD_GROUPING_WARDWISE.equalsIgnoreCase(collectionDetailsRequest.getType()))
        wardWiseBillCollectors = getWardWiseBillCollectors(collectionDetailsRequest);
    Long timeTaken = System.currentTimeMillis() - startTime;
    if (LOGGER.isDebugEnabled())
        LOGGER.debug("Time taken by getCollectionAndDemandValues() is (millisecs) : " + timeTaken);
    startTime = System.currentTimeMillis();
    for (final Map.Entry<String, BigDecimal> entry : cytdCollMap.entrySet()) {
        collIndData = new WaterChargeDashBoardResponse();
        name = entry.getKey();
        if (aggregationField.equals(WaterTaxConstants.REGIONNAMEAGGREGATIONFIELD))
            collIndData.setRegionName(name);
        else if (aggregationField.equals(WaterTaxConstants.DISTRICTNAMEAGGREGATIONFIELD)) {
            collIndData.setRegionName(collectionDetailsRequest.getRegionName());
            collIndData.setDistrictName(name);
        } else if (WaterTaxConstants.CITYNAMEAGGREGATIONFIELD.equals(aggregationField)) {
            collIndData.setUlbName(name);
            collIndData.setDistrictName(collectionDetailsRequest.getDistrictName());
            collIndData.setUlbGrade(collectionDetailsRequest.getUlbGrade());
        } else if (aggregationField.equals(WaterTaxConstants.CITYGRADEAGGREGATIONFIELD))
            collIndData.setUlbGrade(name);
        else if (WaterTaxConstants.REVENUEWARDAGGREGATIONFIELD.equals(aggregationField))
            collIndData.setWardName(name);
        if (DASHBOARD_GROUPING_WARDWISE.equalsIgnoreCase(collectionDetailsRequest.getType())
                && !wardWiseBillCollectors.isEmpty())
            collIndData.setBillCollector(wardWiseBillCollectors.get(name) == null ? StringUtils.EMPTY
                    : wardWiseBillCollectors.get(name).getBillCollector());
        collIndData.setTodayColl(todayCollMap.get(name) == null ? BigDecimal.ZERO : todayCollMap.get(name));
        collIndData.setCurrentYearTillDateColl(entry.getValue());
        // Proportional Demand = (totalDemand/12)*noOfmonths
        final BigDecimal currentYearTotalDemand = currYrTotalDemandMap.get(name) == null ? BigDecimal.valueOf(0)
                : currYrTotalDemandMap.get(name);
        cytdDmd = currentYearTotalDemand.divide(BigDecimal.valueOf(12), BigDecimal.ROUND_HALF_UP)
                .multiply(BigDecimal.valueOf(noOfMonths));
        collIndData.setCurrentYearTillDateDmd(cytdDmd);
        if (cytdDmd != BigDecimal.valueOf(0)) {
            balance = cytdDmd.subtract(collIndData.getCurrentYearTillDateColl());
            performance = collIndData.getCurrentYearTillDateColl().multiply(WaterTaxConstants.BIGDECIMAL_100)
                    .divide(cytdDmd, 1, BigDecimal.ROUND_HALF_UP);
            collIndData.setPerformance(performance);
            collIndData.setCurrentYearTillDateBalDmd(balance);

        }
        collIndData.setTotalDmd(totalDemandMap.get(name) == null ? BigDecimal.ZERO : totalDemandMap.get(name));
        collIndData.setLastYearTillDateColl(
                lytdCollMap.get(name) == null ? BigDecimal.ZERO : lytdCollMap.get(name));
        // variance = ((currentYearCollection -
        // lastYearCollection)*100)/lastYearCollection
        if (collIndData.getLastYearTillDateColl().compareTo(BigDecimal.ZERO) == 0)
            variance = WaterTaxConstants.BIGDECIMAL_100;
        else
            variance = collIndData.getCurrentYearTillDateColl().subtract(collIndData.getLastYearTillDateColl())
                    .multiply(WaterTaxConstants.BIGDECIMAL_100)
                    .divide(collIndData.getLastYearTillDateColl(), 1, BigDecimal.ROUND_HALF_UP);
        collIndData.setLastYearVar(variance);
        collIndDataList.add(collIndData);
    }

    timeTaken = System.currentTimeMillis() - startTime;
    if (LOGGER.isDebugEnabled())
        LOGGER.debug("Time taken for setting values in getResponseTableData() is (millisecs): " + timeTaken);
    return collIndDataList;
}

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

public void aendereLosgroesse(Integer losIId, Integer neueLosgroesse,
        boolean bUeberzaehligesMaterialZurueckgeben, TheClientDto theClientDto) {
    LosDto losDto = losFindByPrimaryKey(losIId);
    if (losDto.getStatusCNr().equals(FertigungFac.STATUS_AUSGEGEBEN)
            || losDto.getStatusCNr().equals(FertigungFac.STATUS_IN_PRODUKTION)
            || losDto.getStatusCNr().equals(FertigungFac.STATUS_GESTOPPT)
            || losDto.getStatusCNr().equals(FertigungFac.STATUS_TEILERLEDIGT)) {

        if (!losDto.getNLosgroesse().equals(new BigDecimal(neueLosgroesse))) {

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

            if (bdErledigte.doubleValue() > neueLosgroesse.doubleValue()) {
                throw new EJBExceptionLP(
                        EJBExceptionLP.FEHLER_FERTIGUNG_AENDERUNG_LOGROESSE_ZUVIELEABLIEFERUNGEN,
                        new Exception("bdErledigte.doubleValue()>neueLosgroesse.doubleValue()"));
            }/*  w ww .j  av a  2 s .co  m*/

            Los los = em.find(Los.class, losDto.getIId());
            los.setNLosgroesse(new BigDecimal(neueLosgroesse));
            em.merge(los);
            em.flush();

            // Material
            LossollmaterialDto[] dtos = lossollmaterialFindByLosIId(losIId);
            for (int i = 0; i < dtos.length; i++) {
                LossollmaterialDto dto = dtos[i];
                // Sollmengen aendern
                BigDecimal sollsatzgroesse = dto.getNMenge().divide(losDto.getNLosgroesse(), 10,
                        BigDecimal.ROUND_HALF_EVEN);
                dto.setNMenge(
                        Helper.rundeKaufmaennisch(sollsatzgroesse.multiply(new BigDecimal(neueLosgroesse)), 3));
                updateLossollmaterial(dto, theClientDto);

                // Wenn kleiner je nach parameter
                // bUeberzaehligesMaterialZurueckgeben material
                // zurueckbuchen
                if (neueLosgroesse.doubleValue() < losDto.getNLosgroesse().doubleValue()
                        && bUeberzaehligesMaterialZurueckgeben == true) {
                    BigDecimal bdAusgegeben = getAusgegebeneMenge(dto.getIId(), null, theClientDto);
                    BigDecimal diff = bdAusgegeben.subtract(dto.getNMenge());
                    if (diff.doubleValue() > 0) {

                        LosistmaterialDto[] dtosLosist = losistmaterialFindByLossollmaterialIId(dto.getIId());

                        for (int j = 0; j < dtosLosist.length; j++) {
                            if (diff.doubleValue() > 0) {
                                BigDecimal istmenge = dtosLosist[j].getNMenge();

                                BigDecimal bdMengeNeu = null;

                                if (diff.doubleValue() > istmenge.doubleValue()) {
                                    bdMengeNeu = new BigDecimal(0);
                                    diff = diff.subtract(istmenge);
                                } else {
                                    bdMengeNeu = istmenge.subtract(diff);
                                    diff = new BigDecimal(0);
                                }

                                updateLosistmaterialMenge(dtosLosist[j].getIId(), bdMengeNeu, theClientDto);
                            }
                        }
                    }
                }

                // Fehlmengen aktualisieren
                try {
                    getFehlmengeFac().aktualisiereFehlmenge(LocaleFac.BELEGART_LOS, dto.getIId(), false,
                            theClientDto);
                } catch (RemoteException e) {
                    throwEJBExceptionLPRespectOld(e);
                }
            }

            // Arbeitsplan
            LossollarbeitsplanDto[] arbeitsplan = lossollarbeitsplanFindByLosIId(losIId);
            for (int i = 0; i < arbeitsplan.length; i++) {
                LossollarbeitsplanDto dto = arbeitsplan[i];
                // Gesamtzeit wird austomatisch aktualisiert
                updateLossollarbeitsplan(dto, theClientDto);

            }

        }

    } else {
        if (losDto.getStatusCNr().equals(FertigungFac.STATUS_STORNIERT)) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FERTIGUNG_DAS_LOS_IST_STORNIERT,
                    new Exception("los " + losDto.getCNr() + " ist storniert"));
        } else if (losDto.getStatusCNr().equals(FertigungFac.STATUS_ERLEDIGT)) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FERTIGUNG_DAS_LOS_IST_BEREITS_ERLEDIGT,
                    new Exception("los " + losDto.getCNr() + " ist bereits erledigt"));
        } else if (losDto.getStatusCNr().equals(FertigungFac.STATUS_ANGELEGT)) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER_FERTIGUNG_DAS_LOS_IST_NOCH_NICHT_AUSGEGEBEN,
                    new Exception("los " + losDto.getCNr() + " ist noch nicht ausgegeben"));
        }
    }
}

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

private void bucheNegativesollmengenAufLager(LosDto losDto, BigDecimal bdGesamtAbgeliefert,
        TheClientDto theClientDto) {//from w w  w  .  j  av  a  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:org.egov.ptis.service.es.CollectionIndexElasticSearchService.java

private void setTableValuesForBillCollector(CollTableData collTableData,
        Entry<String, List<CollTableData>> entry, String aggregationLevel) {
    BigDecimal currDayColl = BigDecimal.ZERO;
    BigDecimal cytdColl = BigDecimal.ZERO;
    BigDecimal lytdColl = BigDecimal.ZERO;
    BigDecimal cytdDmd = BigDecimal.ZERO;
    BigDecimal performance;//from w  w  w .  j a v  a2s. co  m
    BigDecimal totalDmd = BigDecimal.ZERO;
    BigDecimal variance;
    BigDecimal cyArrearColl = BigDecimal.ZERO;
    BigDecimal cyCurrentColl = BigDecimal.ZERO;
    BigDecimal cyPenaltyColl = BigDecimal.ZERO;
    BigDecimal cyRebate = BigDecimal.ZERO;
    BigDecimal cyAdvance = BigDecimal.ZERO;
    BigDecimal lyArrearColl = BigDecimal.ZERO;
    BigDecimal lyCurrentColl = BigDecimal.ZERO;
    BigDecimal lyPenaltyColl = BigDecimal.ZERO;
    BigDecimal lyRebate = BigDecimal.ZERO;
    BigDecimal lyAdvance = BigDecimal.ZERO;
    BigDecimal arrearDmd = BigDecimal.ZERO;
    BigDecimal currentDmd = BigDecimal.ZERO;
    BigDecimal proportionalArrearDmd = BigDecimal.ZERO;
    BigDecimal proportionalCurrentDmd = BigDecimal.ZERO;
    BigDecimal dayTargetDmd = BigDecimal.ZERO;
    BigDecimal lyTodayColl = BigDecimal.ZERO;
    BigDecimal totalAssessments = BigDecimal.ZERO;
    BigDecimal arrearInterestDemand = BigDecimal.ZERO;
    BigDecimal currentInterestDemand = BigDecimal.ZERO;
    BigDecimal lyTotalArrearColl = BigDecimal.ZERO;
    BigDecimal lyTotalCurrentColl = BigDecimal.ZERO;
    BigDecimal lyTotalPenaltyColl = BigDecimal.ZERO;
    BigDecimal lyTotalRebate = BigDecimal.ZERO;
    BigDecimal lyTotalAdvance = BigDecimal.ZERO;
    BigDecimal lyTotalColl = BigDecimal.ZERO;

    String[] userNameNumberArr = entry.getKey().split("~");
    for (CollTableData tableData : entry.getValue()) {
        currDayColl = currDayColl
                .add(tableData.getTodayColl() == null ? BigDecimal.ZERO : tableData.getTodayColl());
        cytdColl = cytdColl.add(tableData.getCytdColl() == null ? BigDecimal.ZERO : tableData.getCytdColl());
        cytdDmd = cytdDmd.add(tableData.getCytdDmd() == null ? BigDecimal.ZERO : tableData.getCytdDmd());
        totalDmd = totalDmd.add(tableData.getTotalDmd() == null ? BigDecimal.ZERO : tableData.getTotalDmd());
        lytdColl = lytdColl.add(tableData.getLytdColl() == null ? BigDecimal.ZERO : tableData.getLytdColl());
        lyTotalColl = lyTotalColl
                .add(tableData.getLyTotalColl() == null ? BigDecimal.ZERO : tableData.getLyTotalColl());

        cyArrearColl = cyArrearColl
                .add(tableData.getCyArrearColl() == null ? BigDecimal.ZERO : tableData.getCyArrearColl());
        cyCurrentColl = cyCurrentColl
                .add(tableData.getCyCurrentColl() == null ? BigDecimal.ZERO : tableData.getCyCurrentColl());
        cyPenaltyColl = cyPenaltyColl
                .add(tableData.getCyPenaltyColl() == null ? BigDecimal.ZERO : tableData.getCyPenaltyColl());
        cyRebate = cyRebate.add(tableData.getCyRebate() == null ? BigDecimal.ZERO : tableData.getCyRebate());
        cyAdvance = cyAdvance
                .add(tableData.getCyAdvanceColl() == null ? BigDecimal.ZERO : tableData.getCyAdvanceColl());

        lyArrearColl = lyArrearColl
                .add(tableData.getLyArrearColl() == null ? BigDecimal.ZERO : tableData.getLyArrearColl());
        lyCurrentColl = lyCurrentColl
                .add(tableData.getLyCurrentColl() == null ? BigDecimal.ZERO : tableData.getLyCurrentColl());
        lyPenaltyColl = lyPenaltyColl
                .add(tableData.getLyPenaltyColl() == null ? BigDecimal.ZERO : tableData.getLyPenaltyColl());
        lyRebate = lyRebate.add(tableData.getLyRebate() == null ? BigDecimal.ZERO : tableData.getLyRebate());
        lyAdvance = lyAdvance
                .add(tableData.getLyAdvanceColl() == null ? BigDecimal.ZERO : tableData.getLyAdvanceColl());

        lyTotalArrearColl = lyTotalArrearColl.add(tableData.getLyTotalArrearsColl() == null ? BigDecimal.ZERO
                : tableData.getLyTotalArrearsColl());
        lyTotalCurrentColl = lyTotalCurrentColl.add(tableData.getLyTotalCurrentColl() == null ? BigDecimal.ZERO
                : tableData.getLyTotalCurrentColl());
        lyTotalPenaltyColl = lyTotalPenaltyColl.add(tableData.getLyTotalPenaltyColl() == null ? BigDecimal.ZERO
                : tableData.getLyTotalPenaltyColl());
        lyTotalRebate = lyTotalRebate
                .add(tableData.getLyTotalRebate() == null ? BigDecimal.ZERO : tableData.getLyTotalRebate());
        lyTotalAdvance = lyTotalAdvance.add(tableData.getLyTotalAdvanceColl() == null ? BigDecimal.ZERO
                : tableData.getLyTotalAdvanceColl());

        arrearDmd = arrearDmd
                .add(tableData.getArrearDemand() == null ? BigDecimal.ZERO : tableData.getArrearDemand());
        currentDmd = currentDmd
                .add(tableData.getCurrentDemand() == null ? BigDecimal.ZERO : tableData.getCurrentDemand());
        proportionalArrearDmd = proportionalArrearDmd
                .add(tableData.getProportionalArrearDemand() == null ? BigDecimal.ZERO
                        : tableData.getProportionalArrearDemand());
        proportionalCurrentDmd = proportionalCurrentDmd
                .add(tableData.getProportionalCurrentDemand() == null ? BigDecimal.ZERO
                        : tableData.getProportionalCurrentDemand());
        dayTargetDmd = dayTargetDmd
                .add(tableData.getDayTargetDemand() == null ? BigDecimal.ZERO : tableData.getDayTargetDemand());
        lyTodayColl = lyTodayColl
                .add(tableData.getLyTodayColl() == null ? BigDecimal.ZERO : tableData.getLyTodayColl());
        totalAssessments = totalAssessments.add(tableData.getTotalAssessments());
        arrearInterestDemand = arrearInterestDemand
                .add(tableData.getArrearInterestDemand() == null ? BigDecimal.ZERO
                        : tableData.getArrearInterestDemand());
        currentInterestDemand = currentInterestDemand
                .add(tableData.getCurrentInterestDemand() == null ? BigDecimal.ZERO
                        : tableData.getCurrentInterestDemand());

    }
    if (DASHBOARD_GROUPING_BILLCOLLECTORWISE.equalsIgnoreCase(aggregationLevel)) {
        collTableData.setBillCollector(userNameNumberArr[0]);
        collTableData.setBillCollMobNo(userNameNumberArr.length > 1 ? userNameNumberArr[1] : StringUtils.EMPTY);
    } else if (DASHBOARD_GROUPING_REVENUEINSPECTORWISE.equalsIgnoreCase(aggregationLevel)) {
        collTableData.setRevenueInspector(userNameNumberArr[0]);
        collTableData
                .setRevInspectorMobNo(userNameNumberArr.length > 1 ? userNameNumberArr[1] : StringUtils.EMPTY);
    } else if (DASHBOARD_GROUPING_REVENUEOFFICERWISE.equalsIgnoreCase(aggregationLevel)) {
        collTableData.setRevenueOfficer(userNameNumberArr[0]);
        collTableData
                .setRevOfficerMobNo(userNameNumberArr.length > 1 ? userNameNumberArr[1] : StringUtils.EMPTY);
    }
    collTableData.setTodayColl(currDayColl);
    collTableData.setCytdColl(cytdColl);
    collTableData.setCytdDmd(cytdDmd);
    collTableData.setCytdBalDmd(cytdDmd.subtract(cytdColl));
    collTableData.setTotalDmd(totalDmd);
    collTableData.setLytdColl(lytdColl);
    setCurrYearTillDateCollBreakUpForTableData(collTableData, cyArrearColl, cyCurrentColl, cyPenaltyColl,
            cyRebate, cyAdvance);
    setLastYearTillDateCollBreakUpForTableData(collTableData, lyArrearColl, lyCurrentColl, lyPenaltyColl,
            lyRebate, lyAdvance);
    setLastFinYearCollBreakUpForTableData(collTableData, lyTotalArrearColl, lyTotalCurrentColl,
            lyTotalPenaltyColl, lyTotalRebate, lyTotalAdvance);
    collTableData.setArrearDemand(arrearDmd);
    collTableData.setCurrentDemand(currentDmd);
    collTableData.setProportionalArrearDemand(proportionalArrearDmd);
    collTableData.setProportionalCurrentDemand(proportionalCurrentDmd);
    collTableData.setDayTargetDemand(dayTargetDmd);
    collTableData.setLyTodayColl(lyTodayColl);
    collTableData.setArrearInterestDemand(arrearInterestDemand);
    collTableData.setCurrentInterestDemand(currentInterestDemand);
    collTableData.setTotalAssessments(totalAssessments);
    if (cytdDmd != BigDecimal.valueOf(0)) {
        performance = (collTableData.getCytdColl().multiply(PropertyTaxConstants.BIGDECIMAL_100))
                .divide(cytdDmd, 1, BigDecimal.ROUND_HALF_UP);
        collTableData.setPerformance(performance);
    }
    if (collTableData.getLytdColl().compareTo(BigDecimal.ZERO) == 0)
        variance = PropertyTaxConstants.BIGDECIMAL_100;
    else
        variance = ((collTableData.getCytdColl().subtract(collTableData.getLytdColl()))
                .multiply(PropertyTaxConstants.BIGDECIMAL_100)).divide(collTableData.getLytdColl(), 1,
                        BigDecimal.ROUND_HALF_UP);
    collTableData.setLyVar(variance);
}

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

public void bucheMaterialAufLos(LosDto losDto, BigDecimal menge, boolean bHandausgabe,
        boolean bNurFehlmengenAnlegenUndReservierungenLoeschen, boolean bUnterstuecklistenAbbuchen,
        TheClientDto theClientDto, ArrayList<BucheSerienChnrAufLosDto> bucheSerienChnrAufLosDtos,
        boolean throwExceptionWhenCreate) {
    try {//from   w w w.  j  a v  a2  s  . co m

        Query query = em.createNamedQuery("LossollmaterialfindByLosIId");
        query.setParameter(1, losDto.getIId());
        Collection<?> cl = query.getResultList();
        // if (cl.isEmpty()) {
        // throw new EJBExceptionLP(EJBExceptionLP.FEHLER_BEI_FIND, null);
        // }
        LossollmaterialDto[] sollmat = assembleLossollmaterialDtos(cl);
        LosablieferungDto[] dtos = losablieferungFindByLosIId(losDto.getIId(), false, theClientDto);
        BigDecimal bdBereitsabgeliefert = new BigDecimal(0);
        for (int i = 0; i < dtos.length; i++) {
            bdBereitsabgeliefert = bdBereitsabgeliefert.add(dtos[i].getNMenge());
        }

        // PJ18216
        boolean bNichtLagerbewSofortAusgeben = false;
        try {
            ParametermandantDto parameterM = getParameterFac().getMandantparameter(theClientDto.getMandant(),
                    ParameterFac.KATEGORIE_FERTIGUNG,
                    ParameterFac.PARAMETER_NICHT_LAGERBEWIRTSCHAFTETE_SOFORT_AUSGEBEN);
            bNichtLagerbewSofortAusgeben = ((Boolean) parameterM.getCWertAsObject()).booleanValue();

        } catch (RemoteException ex) {
            throw new EJBExceptionLP(EJBExceptionLP.FEHLER, ex);
        }

        // Laeger des Loses
        LoslagerentnahmeDto[] laeger = loslagerentnahmeFindByLosIId(losDto.getIId());
        // nun vom lager abbuchen
        for (int i = 0; i < sollmat.length; i++) {
            ArtikelDto artikelDto = getArtikelFac().artikelFindByPrimaryKey(sollmat[i].getArtikelIId(),
                    theClientDto);
            // seriennummerntragende werden jetzt gar nicht gebucht

            if (!bNurFehlmengenAnlegenUndReservierungenLoeschen) {
                if (!bHandausgabe || (bHandausgabe == true && bNichtLagerbewSofortAusgeben == true)) {

                    // PJ18216
                    if (bHandausgabe == true && bNichtLagerbewSofortAusgeben == true) {

                        if (Helper.short2boolean(artikelDto.getBLagerbewirtschaftet())) {
                            continue;
                        }

                    }

                    StuecklisteDto stuecklisteDto = getStuecklisteFac()
                            .stuecklisteFindByMandantCNrArtikelIIdOhneExc(artikelDto.getIId(), theClientDto);
                    if (bUnterstuecklistenAbbuchen == false && stuecklisteDto != null) {
                    } else {

                        BigDecimal bdAbzubuchendeMenge = new BigDecimal(0.0000);
                        if (menge == null) {
                            bdAbzubuchendeMenge = sollmat[i].getNMenge();
                        } else {
                            if (losDto.getNLosgroesse().doubleValue() != 0) {
                                BigDecimal sollsatzGroesse = sollmat[i].getNMenge()
                                        .divide(losDto.getNLosgroesse(), 10, BigDecimal.ROUND_HALF_EVEN);

                                sollsatzGroesse = Helper.rundeKaufmaennisch(sollsatzGroesse, 3);

                                BigDecimal bdBereitsausgegeben = getAusgegebeneMenge(sollmat[i].getIId(), null,
                                        theClientDto);
                                BigDecimal bdGesamtmenge = Helper.rundeKaufmaennisch(
                                        bdBereitsabgeliefert.add(menge).multiply(sollsatzGroesse), 4);
                                if (bdGesamtmenge.subtract(bdBereitsausgegeben).doubleValue() > 0) {
                                    bdAbzubuchendeMenge = bdGesamtmenge.subtract(bdBereitsausgegeben);
                                } else {
                                    if (bdGesamtmenge.doubleValue() < 0) {
                                        bdAbzubuchendeMenge = bdGesamtmenge.subtract(bdBereitsausgegeben).abs();

                                    }
                                }
                            }
                        }

                        // wg. PJ 15370
                        if (sollmat[i].getNMenge().doubleValue() > 0) {

                            if (!Helper.short2boolean(artikelDto.getBSeriennrtragend())
                                    && !Helper.short2boolean(artikelDto.getBChargennrtragend())) {
                                for (int j = 0; j < laeger.length; j++) {
                                    // wenn noch was abzubuchen ist (Menge >
                                    // 0)
                                    if (bdAbzubuchendeMenge.compareTo(new BigDecimal(0)) == 1) {
                                        BigDecimal bdLagerstand = null;
                                        if (Helper.short2boolean(artikelDto.getBLagerbewirtschaftet())) {

                                            // PJ18290
                                            boolean bImmerAusreichendVerfuegbar = false;
                                            try {
                                                ParametermandantDto parameterM = getParameterFac()
                                                        .getMandantparameter(theClientDto.getMandant(),
                                                                ParameterFac.KATEGORIE_ARTIKEL,
                                                                ParameterFac.PARAMETER_LAGER_IMMER_AUSREICHEND_VERFUEGBAR);
                                                bImmerAusreichendVerfuegbar = ((Boolean) parameterM
                                                        .getCWertAsObject()).booleanValue();

                                            } catch (RemoteException ex) {
                                                throw new EJBExceptionLP(EJBExceptionLP.FEHLER, ex);
                                            }
                                            if (bImmerAusreichendVerfuegbar == true) {
                                                bdLagerstand = new BigDecimal(999999999);
                                            } else {
                                                bdLagerstand = getLagerFac().getLagerstand(artikelDto.getIId(),
                                                        laeger[j].getLagerIId(), theClientDto);

                                            }

                                        } else {
                                            bdLagerstand = new BigDecimal(999999999);
                                        }
                                        // wenn ein lagerstand da ist
                                        if (bdLagerstand.compareTo(new BigDecimal(0)) == 1) {
                                            BigDecimal bdMengeVonLager;
                                            if (bdLagerstand.compareTo(bdAbzubuchendeMenge) == 1) {
                                                // wenn mehr als ausreichend
                                                // auf
                                                // lager
                                                bdMengeVonLager = bdAbzubuchendeMenge;
                                            } else {
                                                // dann nur den lagerstand
                                                // entnehmen
                                                bdMengeVonLager = bdLagerstand;
                                            }
                                            LosistmaterialDto istmat = new LosistmaterialDto();
                                            istmat.setLagerIId(laeger[j].getLagerIId());
                                            istmat.setLossollmaterialIId(sollmat[i].getIId());
                                            istmat.setNMenge(bdMengeVonLager);

                                            if (sollmat[i].getNMenge().doubleValue() > 0) {
                                                istmat.setBAbgang(Helper.boolean2Short(true));
                                            } else {
                                                istmat.setBAbgang(Helper.boolean2Short(false));
                                            }

                                            // ist-wert anlegen und
                                            // lagerbuchung
                                            // durchfuehren
                                            createLosistmaterial(istmat, null, theClientDto);
                                            // menge reduzieren
                                            bdAbzubuchendeMenge = bdAbzubuchendeMenge.subtract(bdMengeVonLager);
                                        }
                                    }
                                }

                            } else {
                                if (bucheSerienChnrAufLosDtos != null) {
                                    for (int j = 0; j < bucheSerienChnrAufLosDtos.size(); j++) {
                                        BucheSerienChnrAufLosDto dtoTemp = bucheSerienChnrAufLosDtos.get(j);

                                        if (dtoTemp.getLossollmaterialIId().equals(sollmat[i].getIId())) {

                                            LosistmaterialDto istmat = new LosistmaterialDto();
                                            istmat.setLagerIId(dtoTemp.getLagerIId());
                                            istmat.setLossollmaterialIId(dtoTemp.getLossollmaterialIId());
                                            istmat.setNMenge(dtoTemp.getNMenge());
                                            if (sollmat[i].getNMenge().doubleValue() > 0) {
                                                istmat.setBAbgang(Helper.boolean2Short(true));
                                            } else {
                                                istmat.setBAbgang(Helper.boolean2Short(false));
                                            }
                                            // ist-wert anlegen und
                                            // lagerbuchung
                                            // durchfuehren
                                            createLosistmaterial(istmat, dtoTemp.getCSeriennrChargennr(),
                                                    theClientDto);

                                        }

                                    }
                                }
                            }
                        }
                    }

                }
            }

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

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

}

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

@TransactionAttribute(TransactionAttributeType.NEVER)
public ArrayList<LosAusAuftragDto> vorschlagMitUnterlosenAusAuftrag(Integer auftragIId,
        TheClientDto theClientDto) {/*from   w w  w .ja  va 2  s  .c  om*/

    ArrayList<LosAusAuftragDto> losDtos = new ArrayList<LosAusAuftragDto>();

    try {

        ParametermandantDto parameterVorlaufzeit = getParameterFac().getMandantparameter(
                theClientDto.getSMandantenwaehrung(), ParameterFac.KATEGORIE_FERTIGUNG,
                ParameterFac.PARAMETER_DEFAULT_VORLAUFZEIT_INTERNEBESTELLUNG);
        int iVorlaufzeit = (Integer) parameterVorlaufzeit.getCWertAsObject();

        Integer stdFertigungsgruppeIId = null;
        FertigungsgruppeDto[] fertigungsgruppeDtos = getStuecklisteFac()
                .fertigungsgruppeFindByMandantCNr(theClientDto.getMandant(), theClientDto);

        if (fertigungsgruppeDtos.length > 0) {
            stdFertigungsgruppeIId = fertigungsgruppeDtos[0].getIId();
        }

        AuftragDto auftragDto = getAuftragFac().auftragFindByPrimaryKey(auftragIId);
        int iLieferdauerKunde = getKundeFac()
                .kundeFindByPrimaryKey(auftragDto.getKundeIIdAuftragsadresse(), theClientDto).getILieferdauer();

        if (auftragDto.getAuftragstatusCNr().equals(LocaleFac.STATUS_ANGELEGT)
                || auftragDto.getAuftragstatusCNr().equals(LocaleFac.STATUS_OFFEN)
                || auftragDto.getAuftragstatusCNr().equals(LocaleFac.STATUS_TEILERLEDIGT)) {
            AuftragpositionDto[] dtos = getAuftragpositionFac().auftragpositionFindByAuftrag(auftragIId);
            for (int i = 0; i < dtos.length; i++) {
                ArrayList<LosAusAuftragDto> losDtosPosition = new ArrayList<LosAusAuftragDto>();
                if (dtos[i].getPositionsartCNr().equals(AuftragServiceFac.AUFTRAGPOSITIONART_HANDEINGABE)) {

                    Timestamp tAuftragsliefertermin = dtos[i].getTUebersteuerbarerLiefertermin();
                    if (tAuftragsliefertermin == null) {
                        tAuftragsliefertermin = auftragDto.getDLiefertermin();
                    }

                    Timestamp tEnde = Helper.addiereTageZuTimestamp(tAuftragsliefertermin, -iLieferdauerKunde);

                    Timestamp tBeginn = Helper.addiereTageZuTimestamp(tEnde, -iVorlaufzeit);

                    LosAusAuftragDto laDto = new LosAusAuftragDto();
                    if (tBeginn.before(Helper.cutTimestamp(new Timestamp(System.currentTimeMillis())))) {
                        laDto.setBDatumVerschoben(true);
                        tBeginn = Helper.cutTimestamp(new Timestamp(System.currentTimeMillis()));
                        tEnde = Helper.addiereTageZuTimestamp(tBeginn, iVorlaufzeit);
                    }

                    LosDto losDto = new LosDto();

                    losDto.setAuftragIId(auftragIId);
                    losDto.setAuftragpositionIId(dtos[i].getIId());

                    losDto.setTProduktionsbeginn(new java.sql.Date(tBeginn.getTime()));
                    losDto.setTProduktionsende(new java.sql.Date(tEnde.getTime()));
                    losDto.setLagerIIdZiel(getLagerFac().getHauptlagerDesMandanten(theClientDto).getIId());
                    losDto.setFertigungsgruppeIId(stdFertigungsgruppeIId);
                    losDto.setNLosgroesse(dtos[i].getNMenge());
                    losDto.setKostenstelleIId(auftragDto.getKostenstelleIId());
                    losDto.setCProjekt(dtos[i].getCBez());

                    laDto.setLosDto(losDto);

                    laDto.setAuftragpositionDto(dtos[i]);

                    laDto.setAuftragspositionsnummer(
                            getAuftragpositionFac().getPositionNummer(dtos[i].getIId()));

                    losDtos.add(laDto);

                } else {

                    // SP1107 Setartikelkopf ignorieren
                    Session session = null;
                    SessionFactory factory = FLRSessionFactory.getFactory();
                    session = factory.openSession();
                    Criteria crit = session.createCriteria(FLRAuftragposition.class);
                    crit.add(Restrictions.eq("position_i_id_artikelset", dtos[i].getIId()));

                    int iZeilen = crit.list().size();
                    session.close();
                    if (iZeilen > 0) {
                        continue;
                    }

                    StuecklisteDto stuecklisteDto = getStuecklisteFac()
                            .stuecklisteFindByMandantCNrArtikelIIdOhneExc(dtos[i].getArtikelIId(),
                                    theClientDto);
                    if (stuecklisteDto != null) {
                        if (dtos[i].getNMenge() != null && dtos[i].getNMenge().doubleValue() > 0) {

                            Timestamp tAuftragsliefertermin = dtos[i].getTUebersteuerbarerLiefertermin();
                            if (tAuftragsliefertermin == null) {
                                tAuftragsliefertermin = auftragDto.getDLiefertermin();
                            }

                            Timestamp tEnde = Helper.addiereTageZuTimestamp(tAuftragsliefertermin,
                                    -iLieferdauerKunde);

                            Timestamp tBeginn = tEnde;

                            if (stuecklisteDto.getNDefaultdurchlaufzeit() != null) {
                                tBeginn = Helper.addiereTageZuTimestamp(tEnde,
                                        -stuecklisteDto.getNDefaultdurchlaufzeit().intValue());
                            }
                            LosAusAuftragDto laDto = new LosAusAuftragDto();

                            LosDto losDto = new LosDto();

                            losDto.setAuftragIId(auftragIId);
                            losDto.setAuftragpositionIId(dtos[i].getIId());

                            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.setCProjekt(auftragDto.getCBezProjektbezeichnung());
                            losDto.setFertigungsgruppeIId(stuecklisteDto.getFertigungsgruppeIId());
                            losDto.setNLosgroesse(dtos[i].getNMenge());
                            losDto.setKostenstelleIId(auftragDto.getKostenstelleIId());

                            laDto.setLosDto(losDto);

                            laDto.setAuftragpositionDto(dtos[i]);

                            laDto.setAuftragspositionsnummer(
                                    getAuftragpositionFac().getPositionNummer(dtos[i].getIId()));

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

                            ArtikelreservierungDto eigeneReservierungDto = getReservierungFac()
                                    .artikelreservierungFindByBelegartCNrBelegartPositionIIdOhneExc(
                                            LocaleFac.BELEGART_AUFTRAG, dtos[i].getIId());

                            BigDecimal reservierungen = getReservierungFac()
                                    .getAnzahlReservierungen(stuecklisteDto.getArtikelIId(), theClientDto);

                            if (eigeneReservierungDto != null && eigeneReservierungDto.getNMenge() != null) {
                                if (reservierungen.subtract(eigeneReservierungDto.getNMenge())
                                        .doubleValue() < 0) {
                                    reservierungen = new BigDecimal(0);
                                } else {
                                    reservierungen = reservierungen.subtract(eigeneReservierungDto.getNMenge());
                                }
                            }

                            laDto.setReservierungen(reservierungen);

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

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

                            }

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

                            losDtosPosition.add(laDto);

                            ArrayList<?> stuecklisteAufegloest = getStuecklisteFac()
                                    .getStrukturDatenEinerStueckliste(stuecklisteDto.getIId(), theClientDto,
                                            StuecklisteReportFac.REPORT_STUECKLISTE_OPTION_SORTIERUNG_ARTIKELNR,
                                            0, null, false, true, dtos[i].getNMenge(), null, true);

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

                                if (strukt.getStuecklistepositionDto() != null
                                        && strukt.getStuecklistepositionDto().getArtikelIId() != null) {
                                    losDtosPosition = holeAlleMoeglichenUnterloseEinerStueckliste(
                                            strukt.getStuecklistepositionDto().getArtikelIId(),
                                            strukt.getStuecklistepositionDto().getNZielmenge(), iVorlaufzeit,
                                            tBeginn, losDtosPosition, auftragDto, dtos[i].getNMenge(),
                                            theClientDto);

                                }

                            }

                            // Wenn Termin vor Heute, dann aauf nach Heute
                            // verschieben
                            java.sql.Date fruehesterProduktionsbeginnVorHeute = Helper
                                    .cutDate(new java.sql.Date(System.currentTimeMillis()));

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

                                if (losDtosPosition.get(k).getLosDto().getTProduktionsbeginn()
                                        .before(fruehesterProduktionsbeginnVorHeute)) {
                                    fruehesterProduktionsbeginnVorHeute = losDtosPosition.get(k).getLosDto()
                                            .getTProduktionsbeginn();
                                }

                            }

                            int iDiffTage = Helper.getDifferenzInTagen(fruehesterProduktionsbeginnVorHeute,
                                    new java.sql.Date(System.currentTimeMillis()));
                            if (iDiffTage > 0) {

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

                                    losDtosPosition.get(k).getLosDto()
                                            .setTProduktionsbeginn(Helper.addiereTageZuDatum(
                                                    losDtosPosition.get(k).getLosDto().getTProduktionsbeginn(),
                                                    iDiffTage));
                                    losDtosPosition.get(k).getLosDto()
                                            .setTProduktionsende(Helper.addiereTageZuDatum(
                                                    losDtosPosition.get(k).getLosDto().getTProduktionsende(),
                                                    iDiffTage));
                                    losDtosPosition.get(k).setBDatumVerschoben(true);

                                }
                            }

                            for (int k = 0; k < losDtosPosition.size(); k++) {
                                losDtos.add(losDtosPosition.get(k));
                            }
                        }
                    }
                }
            }
        }
    } catch (RemoteException e) {
        throwEJBExceptionLPRespectOld(e);
    }
    return losDtos;
}

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 {//from  www.  j a  va 2s .  c om
        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

@TransactionAttribute(TransactionAttributeType.NEVER)
public KapazitaetsvorschauDto getKapazitaetsvorschau(TheClientDto theClientDto) throws EJBExceptionLP {
    KapazitaetsvorschauDto kapDto = null;
    Session session = null;/*from   w ww  . jav  a  2 s  .co 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

/**
 * Ist-Arbeitszeit fuer eine Ablieferung pro abgelieferter Einheit
 * bestimmen./* w  w w .  ja v a2s  .  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 BigDecimal getAusgegebeneMenge(Integer lossollmaterialIId, java.sql.Timestamp tsStichtag,
        TheClientDto theClientDto) throws EJBExceptionLP {
    try {//  w w w .  j a va2  s  .co m
        BigDecimal bdMenge = new BigDecimal(0);

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

        String query = "SELECT li.i_id,li.b_abgang FROM FLRLosistmaterial li WHERE li.lossollmaterial_i_id="
                + lossollmaterialIId;

        org.hibernate.Query qResult = session.createQuery(query);
        List<?> results = qResult.list();

        Iterator<?> resultListIterator = results.iterator();
        while (resultListIterator.hasNext()) {

            Object[] o = (Object[]) resultListIterator.next();
            BigDecimal bdAusgegeben = getLagerFac().getMengeEinerBelegposition(LocaleFac.BELEGART_LOS,
                    (Integer) o[0], tsStichtag);
            if (Helper.short2boolean((Short) o[1]) == true) {
                bdMenge = bdMenge.add(bdAusgegeben);
            } else {
                bdMenge = bdMenge.subtract(bdAusgegeben);
            }
        }

        /*
         * LosistmaterialDto[] losist =
         * losistmaterialFindByLossollmaterialIId(lossollmaterialIId); for
         * (int i = 0; i < losist.length; i++) { BigDecimal bdAusgegeben =
         * getLagerFac() .getMengeEinerBelegposition(LocaleFac.BELEGART_LOS,
         * losist[i].getIId(), tsStichtag); if
         * (Helper.short2boolean(losist[i].getBAbgang()) == true) { bdMenge
         * = bdMenge.add(bdAusgegeben); } else { bdMenge =
         * bdMenge.subtract(bdAusgegeben); } }
         */
        return bdMenge;
    } catch (RemoteException ex) {
        throwEJBExceptionLPRespectOld(ex);
        return null;
    }
}