Search in sources :

Example 1 with MRfQResponseLine

use of org.compiere.model.MRfQResponseLine in project adempiere by adempiere.

the class RfQServlet method updateResponse.

//  doPost
/**
	 * 	Update Response
	 *	@param request request
	 *	@param rfqResponse response
	 *	@return msg
	 */
private String updateResponse(HttpServletRequest request, MRfQResponse rfqResponse) {
    log.fine("updateResponse - " + rfqResponse);
    String saveError = "RfQ NOT updated";
    String msg = "RfQ updated";
    //	RfQ Response
    rfqResponse.setName(WebUtil.getParameter(request, "Name"));
    rfqResponse.setDescription(WebUtil.getParameter(request, "Description"));
    rfqResponse.setHelp(WebUtil.getParameter(request, "Help"));
    rfqResponse.setDateWorkStart(WebUtil.getParameterAsDate(request, "DateWorkStart"));
    rfqResponse.setDateWorkComplete(WebUtil.getParameterAsDate(request, "DateWorkComplete"));
    rfqResponse.setDeliveryDays(WebUtil.getParameterAsInt(request, "DeliveryDays"));
    rfqResponse.setPrice(WebUtil.getParameterAsBD(request, "Price"));
    rfqResponse.setIsSelfService(true);
    rfqResponse.setDateResponse(new Timestamp(System.currentTimeMillis()));
    //	Check for Completeness
    if (WebUtil.getParameterAsBoolean(request, "IsComplete")) {
        String msgComplete = rfqResponse.checkComplete();
        if (msgComplete != null && msgComplete.length() > 0)
            msg = msgComplete;
    }
    if (!rfqResponse.save())
        return saveError;
    //	RfQ Response Line
    MRfQResponseLine[] lines = rfqResponse.getLines(false);
    for (int i = 0; i < lines.length; i++) {
        MRfQResponseLine line = lines[i];
        if (!line.isActive())
            continue;
        String paraAdd = "_" + line.getC_RfQResponseLine_ID();
        line.setDescription(WebUtil.getParameter(request, "Description" + paraAdd));
        line.setHelp(WebUtil.getParameter(request, "Help" + paraAdd));
        line.setDateWorkStart(WebUtil.getParameterAsDate(request, "DateWorkStart" + paraAdd));
        line.setDateWorkComplete(WebUtil.getParameterAsDate(request, "DateWorkComplete" + paraAdd));
        line.setDeliveryDays(WebUtil.getParameterAsInt(request, "DeliveryDays" + paraAdd));
        line.setIsSelfService(true);
        if (!line.save())
            return saveError;
        //	RfQ Response Line Qty
        MRfQResponseLineQty[] qtys = line.getQtys(true);
        for (int j = 0; j < qtys.length; j++) {
            MRfQResponseLineQty qty = qtys[j];
            if (!qty.isActive())
                continue;
            paraAdd = "_" + qty.getC_RfQResponseLineQty_ID();
            qty.setDiscount(WebUtil.getParameterAsBD(request, "Discount" + paraAdd));
            qty.setPrice(WebUtil.getParameterAsBD(request, "Price" + paraAdd));
            if (!qty.save())
                return saveError;
        }
    }
    log.fine("complete - " + rfqResponse);
    return msg;
}
Also used : Timestamp(java.sql.Timestamp) MRfQResponseLineQty(org.compiere.model.MRfQResponseLineQty) MRfQResponseLine(org.compiere.model.MRfQResponseLine)

Example 2 with MRfQResponseLine

use of org.compiere.model.MRfQResponseLine in project adempiere by adempiere.

the class RfQResponseRank method rankLines.

//	doIt
/**************************************************************************
	 * 	Rank Lines
	 *	@param rfq RfQ 
	 *	@param responses responses
	 */
@SuppressWarnings("unchecked")
private void rankLines(MRfQ rfq, MRfQResponse[] responses) {
    MRfQLine[] rfqLines = rfq.getLines();
    if (rfqLines.length == 0)
        throw new IllegalArgumentException("No RfQ Lines found");
    //	 for all lines
    for (int i = 0; i < rfqLines.length; i++) {
        //	RfQ Line
        MRfQLine rfqLine = rfqLines[i];
        if (!rfqLine.isActive())
            continue;
        log.fine("rankLines - " + rfqLine);
        MRfQLineQty[] rfqQtys = rfqLine.getQtys();
        for (int j = 0; j < rfqQtys.length; j++) {
            //	RfQ Line Qty
            MRfQLineQty rfqQty = rfqQtys[j];
            if (!rfqQty.isActive() || !rfqQty.isRfQQty())
                continue;
            log.fine("rankLines Qty - " + rfqQty);
            MRfQResponseLineQty[] respQtys = rfqQty.getResponseQtys(false);
            for (int kk = 0; kk < respQtys.length; kk++) {
                //	Response Line Qty
                MRfQResponseLineQty respQty = respQtys[kk];
                if (!respQty.isActive() || !respQty.isValidAmt()) {
                    respQty.setRanking(999);
                    respQty.saveEx();
                    log.fine("  - ignored: " + respQty);
                }
            }
            //	for all respones line qtys
            //	Rank RfQ Line Qtys
            respQtys = rfqQty.getResponseQtys(false);
            if (respQtys.length == 0)
                log.fine("  - No Qtys with valid Amounts");
            else {
                Arrays.sort(respQtys, respQtys[0]);
                //	multiple rank #1
                int lastRank = 1;
                BigDecimal lastAmt = Env.ZERO;
                int rank = 0;
                for (int k = 0; k < respQtys.length; k++) {
                    MRfQResponseLineQty qty = respQtys[k];
                    if (!qty.isActive() || qty.getRanking() == 999) {
                        continue;
                    }
                    BigDecimal netAmt = qty.getNetAmt();
                    if (netAmt == null) {
                        qty.setRanking(999);
                        qty.saveEx();
                        log.fine("  - Rank 999: " + qty);
                        continue;
                    }
                    if (lastAmt.compareTo(netAmt) != 0) {
                        lastRank = rank + 1;
                        lastAmt = qty.getNetAmt();
                    }
                    qty.setRanking(lastRank);
                    log.fine("  - Rank " + lastRank + ": " + qty);
                    qty.saveEx();
                    //	
                    if (//	Update RfQ
                    rank == 0) {
                        rfqQty.setBestResponseAmt(qty.getNetAmt());
                        rfqQty.saveEx();
                    }
                    rank++;
                }
            }
        }
    //	for all rfq line qtys
    }
    //	 for all rfq lines
    //	Select Winner based on line ranking
    MRfQResponse winner = null;
    for (int ii = 0; ii < responses.length; ii++) {
        MRfQResponse response = responses[ii];
        if (response.isSelectedWinner())
            response.setIsSelectedWinner(false);
        int ranking = 0;
        MRfQResponseLine[] respLines = response.getLines(false);
        for (int jj = 0; jj < respLines.length; jj++) {
            //	Response Line
            MRfQResponseLine respLine = respLines[jj];
            if (!respLine.isActive())
                continue;
            if (respLine.isSelectedWinner())
                respLine.setIsSelectedWinner(false);
            MRfQResponseLineQty[] respQtys = respLine.getQtys(false);
            for (int kk = 0; kk < respQtys.length; kk++) {
                //	Response Line Qty
                MRfQResponseLineQty respQty = respQtys[kk];
                if (!respQty.isActive())
                    continue;
                ranking += respQty.getRanking();
                if (respQty.getRanking() == 1 && respQty.getRfQLineQty().isPurchaseQty()) {
                    respLine.setIsSelectedWinner(true);
                    respLine.saveEx();
                    break;
                }
            }
        }
        response.setRanking(ranking);
        response.saveEx();
        log.fine("- Response Ranking " + ranking + ": " + response);
        if (//	no total selected winner if not all lines
        !rfq.isQuoteSelectedLines()) {
            if (winner == null && ranking > 0)
                winner = response;
            if (winner != null && response.getRanking() > 0 && response.getRanking() < winner.getRanking())
                winner = response;
        }
    }
    if (winner != null) {
        winner.setIsSelectedWinner(true);
        winner.saveEx();
        log.fine("- Response Winner: " + winner);
    }
}
Also used : MRfQLine(org.compiere.model.MRfQLine) MRfQLineQty(org.compiere.model.MRfQLineQty) MRfQResponse(org.compiere.model.MRfQResponse) MRfQResponseLineQty(org.compiere.model.MRfQResponseLineQty) BigDecimal(java.math.BigDecimal) MRfQResponseLine(org.compiere.model.MRfQResponseLine)

Example 3 with MRfQResponseLine

use of org.compiere.model.MRfQResponseLine in project adempiere by adempiere.

the class RfQCreatePO method doIt.

//	prepare
/**
	 * 	Process.
	 * 	Create purchase order(s) for the resonse(s) and lines marked as 
	 * 	Selected Winner using the selected Purchase Quantity (in RfQ Line Quantity) . 
	 * 	If a Response is marked as Selected Winner, all lines are created 
	 * 	(and Selected Winner of other responses ignored).  
	 * 	If there is no response marked as Selected Winner, the lines are used.
	 *	@return message
	 */
protected String doIt() throws Exception {
    MRfQ rfq = new MRfQ(getCtx(), p_C_RfQ_ID, get_TrxName());
    if (rfq.get_ID() == 0)
        throw new IllegalArgumentException("No RfQ found");
    log.info(rfq.toString());
    //	Complete 
    MRfQResponse[] responses = rfq.getResponses(true, true);
    log.config("#Responses=" + responses.length);
    if (responses.length == 0)
        throw new IllegalArgumentException("No completed RfQ Responses found");
    //	Winner for entire RfQ
    for (int i = 0; i < responses.length; i++) {
        MRfQResponse response = responses[i];
        if (!response.isSelectedWinner())
            continue;
        //
        MBPartner bp = new MBPartner(getCtx(), response.getC_BPartner_ID(), get_TrxName());
        log.config("Winner=" + bp);
        MOrder order = new MOrder(getCtx(), 0, get_TrxName());
        order.setIsSOTrx(false);
        if (p_C_DocType_ID != 0)
            order.setC_DocTypeTarget_ID(p_C_DocType_ID);
        else
            order.setC_DocTypeTarget_ID();
        order.setBPartner(bp);
        order.setC_BPartner_Location_ID(response.getC_BPartner_Location_ID());
        order.setSalesRep_ID(rfq.getSalesRep_ID());
        if (response.getDateWorkComplete() != null)
            order.setDatePromised(response.getDateWorkComplete());
        else if (rfq.getDateWorkComplete() != null)
            order.setDatePromised(rfq.getDateWorkComplete());
        order.saveEx();
        //
        MRfQResponseLine[] lines = response.getLines(false);
        for (int j = 0; j < lines.length; j++) {
            //	Respones Line
            MRfQResponseLine line = lines[j];
            if (!line.isActive())
                continue;
            MRfQResponseLineQty[] qtys = line.getQtys(false);
            //	Response Line Qty
            for (int k = 0; k < qtys.length; k++) {
                MRfQResponseLineQty qty = qtys[k];
                //	Create PO Lline for all Purchase Line Qtys
                if (qty.getRfQLineQty().isActive() && qty.getRfQLineQty().isPurchaseQty()) {
                    MOrderLine ol = new MOrderLine(order);
                    ol.setM_Product_ID(line.getRfQLine().getM_Product_ID(), qty.getRfQLineQty().getC_UOM_ID());
                    ol.setDescription(line.getDescription());
                    ol.setQty(qty.getRfQLineQty().getQty());
                    BigDecimal price = qty.getNetAmt();
                    ol.setPrice();
                    ol.setPrice(price);
                    ol.saveEx();
                }
            }
        }
        response.setC_Order_ID(order.getC_Order_ID());
        response.saveEx();
        return order.getDocumentNo();
    }
    //	Selected Winner on Line Level
    int noOrders = 0;
    for (int i = 0; i < responses.length; i++) {
        MRfQResponse response = responses[i];
        MBPartner bp = null;
        MOrder order = null;
        //	For all Response Lines
        MRfQResponseLine[] lines = response.getLines(false);
        for (int j = 0; j < lines.length; j++) {
            MRfQResponseLine line = lines[j];
            if (!line.isActive() || !line.isSelectedWinner())
                continue;
            //	New/different BP
            if (bp == null || bp.getC_BPartner_ID() != response.getC_BPartner_ID()) {
                bp = new MBPartner(getCtx(), response.getC_BPartner_ID(), get_TrxName());
                order = null;
            }
            log.config("Line=" + line + ", Winner=" + bp);
            //	New Order
            if (order == null) {
                order = new MOrder(getCtx(), 0, get_TrxName());
                order.setIsSOTrx(false);
                order.setC_DocTypeTarget_ID();
                order.setBPartner(bp);
                order.setC_BPartner_Location_ID(response.getC_BPartner_Location_ID());
                order.setSalesRep_ID(rfq.getSalesRep_ID());
                order.saveEx();
                noOrders++;
                addLog(0, null, null, order.getDocumentNo());
            }
            //	For all Qtys
            MRfQResponseLineQty[] qtys = line.getQtys(false);
            for (int k = 0; k < qtys.length; k++) {
                MRfQResponseLineQty qty = qtys[k];
                if (qty.getRfQLineQty().isActive() && qty.getRfQLineQty().isPurchaseQty()) {
                    MOrderLine ol = new MOrderLine(order);
                    ol.setM_Product_ID(line.getRfQLine().getM_Product_ID(), qty.getRfQLineQty().getC_UOM_ID());
                    ol.setDescription(line.getDescription());
                    ol.setQty(qty.getRfQLineQty().getQty());
                    BigDecimal price = qty.getNetAmt();
                    ol.setPrice();
                    ol.setPrice(price);
                    ol.saveEx();
                }
            }
        //	for all Qtys
        }
        //	for all Response Lines
        if (order != null) {
            response.setC_Order_ID(order.getC_Order_ID());
            response.saveEx();
        }
    }
    return "#" + noOrders;
}
Also used : MBPartner(org.compiere.model.MBPartner) MRfQResponseLineQty(org.compiere.model.MRfQResponseLineQty) MRfQResponseLine(org.compiere.model.MRfQResponseLine) BigDecimal(java.math.BigDecimal) MOrder(org.compiere.model.MOrder) MRfQ(org.compiere.model.MRfQ) MRfQResponse(org.compiere.model.MRfQResponse) MOrderLine(org.compiere.model.MOrderLine)

Aggregations

MRfQResponseLine (org.compiere.model.MRfQResponseLine)3 MRfQResponseLineQty (org.compiere.model.MRfQResponseLineQty)3 BigDecimal (java.math.BigDecimal)2 MRfQResponse (org.compiere.model.MRfQResponse)2 Timestamp (java.sql.Timestamp)1 MBPartner (org.compiere.model.MBPartner)1 MOrder (org.compiere.model.MOrder)1 MOrderLine (org.compiere.model.MOrderLine)1 MRfQ (org.compiere.model.MRfQ)1 MRfQLine (org.compiere.model.MRfQLine)1 MRfQLineQty (org.compiere.model.MRfQLineQty)1