public void createRateVariances(MPPCostCollector cc) { final I_M_Product product; if (cc.isCostCollectorType(X_PP_Cost_Collector.COSTCOLLECTORTYPE_ActivityControl)) { final I_AD_WF_Node node = cc.getPP_Order_Node().getAD_WF_Node(); product = MProduct.forS_Resource_ID(cc.getCtx(), node.getS_Resource_ID(), null); } else if (cc.isCostCollectorType(X_PP_Cost_Collector.COSTCOLLECTORTYPE_ComponentIssue)) { final I_PP_Order_BOMLine bomLine = cc.getPP_Order_BOMLine(); product = MProduct.get(cc.getCtx(), bomLine.getM_Product_ID()); } else { return; } I_PP_Cost_Collector ccrv = null; // Cost Collector - Rate Variance for (MAcctSchema as : getAcctSchema(cc)) { for (I_M_CostElement element : getCostElements(cc.getCtx())) { final MCostDetail cd = getCostDetail(cc, element.getM_CostElement_ID()); if (cd == null) { continue; } // final BigDecimal qty = cd.getQty(); final BigDecimal priceStd = getProductStandardCostPrice(cc, product, as, element); final BigDecimal priceActual = getProductActualCostPriceOrZero(cc, product, as, element, cc.get_TrxName()); final BigDecimal amtStd = roundCost(priceStd.multiply(qty), as.getC_AcctSchema_ID()); final BigDecimal amtActual = roundCost(priceActual.multiply(qty), as.getC_AcctSchema_ID()); if (amtStd.compareTo(amtActual) == 0) { continue; } // if (ccrv == null) { ccrv = createVarianceCostCollector(cc, X_PP_Cost_Collector.COSTCOLLECTORTYPE_RateVariance); } // createVarianceCostDetail(ccrv, amtActual.negate(), qty.negate(), cd, null, as, element); createVarianceCostDetail(ccrv, amtStd, qty, cd, null, as, element); } } // if (ccrv != null) { Services.get(IDocActionBL.class) .processEx(ccrv, DocAction.ACTION_Complete, DocAction.STATUS_Completed); } }
/** * Create Cost Detail (Material Issue, Material Receipt) * * @param model * @param mtrx Material Transaction */ public void createCostDetail(IDocumentLine model, MTransaction mtrx) { final I_PP_Cost_Collector cc = (model instanceof MPPCostCollector ? (MPPCostCollector) model : null); final Properties ctx = mtrx.getCtx(); for (I_C_AcctSchema as : getAcctSchema(mtrx)) { // Cost Detail final I_M_Product product = MProduct.get(ctx, mtrx.getM_Product_ID()); final String costingMethod = Services.get(IProductBL.class).getCostingMethod(product, as); // Check costing method if (!getCostingMethod().equals(costingMethod)) { throw new LiberoException("Costing method not supported - " + costingMethod); } // for (I_M_CostElement element : getCostElements(ctx)) { // // Delete Unprocessed zero Differences deleteCostDetail( model, as, element.getM_CostElement_ID(), mtrx.getM_AttributeSetInstance_ID()); // // Get Costs final BigDecimal qty = mtrx.getMovementQty(); final BigDecimal price = getProductActualCostPriceOrZero(cc, product, as, element, mtrx.get_TrxName()); final BigDecimal amt = roundCost(price.multiply(qty), as.getC_AcctSchema_ID()); // // Create / Update Cost Detail MCostDetail cd = getCostDetail(model, mtrx, as, element.getM_CostElement_ID()); if (cd == null) // createNew { cd = new MCostDetail( as, mtrx.getAD_Org_ID(), mtrx.getM_Product_ID(), mtrx.getM_AttributeSetInstance_ID(), element.getM_CostElement_ID(), amt, qty, model.getDescription(), mtrx.get_TrxName()); // cd.setMovementDate(mtrx.getMovementDate()); // if (cost != null) // { // cd.setCurrentCostPrice(cost.getCurrentCostPrice()); // cd.setCurrentCostPriceLL(cost.getCurrentCostPriceLL()); // } // else // { // cd.setCurrentCostPrice(Env.ZERO); // cd.setCurrentCostPriceLL(Env.ZERO); // } // cd.setM_CostType_ID(as.getM_CostType_ID()); // //cd.setCostingMethod(element.getCostingMethod()); // cd.setM_Transaction_ID(mtrx.get_ID()); if (cc != null) { cd.setPP_Cost_Collector_ID(cc.getPP_Cost_Collector_ID()); } } else { cd.setDeltaAmt(amt.subtract(cd.getAmt())); cd.setDeltaQty(mtrx.getMovementQty().subtract(cd.getQty())); if (cd.isDelta()) { cd.setProcessed(false); cd.setAmt(amt); cd.setQty(mtrx.getMovementQty()); } } cd.saveEx(); processCostDetail(cd); log.info("" + cd); } // for ELements } // Account Schema }