機械翻訳について

オーダー改訂の延長

オーダー管理拡張を使用して、オーダー改訂を拡張します。

リビジョンかどうかを確認

オーダー管理拡張では、デフォルトでは、新規オーダーとオーダー改訂を区別しません。 ヘッダー・エンティティのReferenceHeaderId属性と明細エンティティのReferenceFulfillmentLineIdentifier属性を検査して、販売オーダーが新規か改訂かを決定できます。

この拡張では、保存時拡張ポイントを使用します。

/* 
   This extension compares some of the attribute of the revision line to the existing sales order.
    */
import oracle.apps.scm.doo.common.extensions.ValidationException;
import java.util.Date;

def postShippedStatuses = ["AWAIT_BILL","ASSET_COMPLETED","BILLED","SHIPPED","CLOSED"];
def startTime = context.getCurrentTime();
if (!"SNCHECKREV".equals(header.getAttribute("CustomerPONumber"))) return;

Integer changeVersionNumber = header.getAttribute("ChangeVersionNumber");
Long runningHeaderId = header.getAttribute("ReferenceHeaderId");

debug(changeVersionNumber.toString() + " ref " + runningHeaderId.toString());
//If this sales order isn't a revision, then don't run the extension.
if (changeVersionNumber == null || changeVersionNumber <= 1 || runningHeaderId == null) return;

try {

    // Create an array of order lines from the existing sales order.
    Map linesFromRunningOrder = getLinesFromRunningOrder(runningHeaderId);
    debug("Line from running order" + linesFromRunningOrder.size());

    def lines = header.getAttribute("Lines");

    while (lines.hasNext()) {

        def line = lines.next();
       
        //Skip order lines that are already cancelled or are being cancelled as part of this revision.
        if (line.isCanceled() || line.getAttribute("OrderedQuantity") == 0) continue;
      
        Long referenceFlineId = line.getAttribute("ReferenceFulfillmentLineIdentifier");
        if (referenceFlineId == null) {
            // Nothing to do here. This is a new order line in the current version of the order.
             debug("No Fline Ref");
             continue;
        }
        
        // Get the corrosponding order line from existing sales order.
        def runningLine = linesFromRunningOrder.get(referenceFlineId);

        if (runningLine == null) {
            // we have an error. The extension can't find a fulfillment line that has referenceFlineId. We should ideally never get here.
            throw new ValidationException("Something's not right. The extension can't find a fulfillment line that has referenceFlineId.");
        }

        Date priorRequestedShipDate = runningLine.getAttribute("FulfillLineRequestShipDate");
        Date priorRequestedArrivalDate = runningLine.getAttribute("FulfillLineRequestArrivalDate");
        def priorShippedQuantity = runningLine.getAttribute("FulfillLineShippedQty");
        def priorOrderedQty = runningLine.getAttribute("FulfillLineOrderedQty");
      
        def lineStatus = line.getAttribute("StatusCode");
        debug("StatusCode: " + lineStatus + priorRequestedShipDate + " " + priorRequestedArrivalDate);

        //Skip order lines that already shipped.
        if (postShippedStatuses.contains(lineStatus)) continue;

        // Skip order lines that already shipped.
        if (priorShippedQuantity != null && priorShippedQuantity > 0) continue;

        // Skip order lines that are already cancelled.
        if (priorOrderedQty != null && priorOrderedQty == 0) continue;

        Date lineRequestedShipDate = line.getAttribute("RequestedShipDate");
        Date lineRequestedArrivalDate = line.getAttribute("RequestedArrivalDate");

        def changeInRequestDateAttributes = (areDifferent(priorRequestedShipDate, lineRequestedShipDate)
                                            || areDifferent(priorRequestedArrivalDate, lineRequestedArrivalDate));

         /*
         If the requested ship date or the requested arrival date changed, then do something.
         */
        if (changeInRequestDateAttributes) {
            //Put your code here.
          debug("One of the dates is diff");
        } 
    }
} finally {
    def endTime = context.getCurrentTime();
    long diff = endTime.getTime() - startTime.getTime();
    debug("Time taken by extension " + context.getExtensionName() + ";" + diff.toString());
}


/*
 * Return a boolean value that indicates whether the two incoming dates are same or different.
 */
boolean areDifferent(def v1, def v2) {
    if (v1 == null || v2 == null) return v1 != v2;

    return v1.compareTo(v2) != 0;
}


/*
 * Use the fline id to return a map of the sales order's order lines. 
 */
Map getLinesFromRunningOrder(Long runningHeaderId) {

    //Create an Instance of the FulfillLinePVO public view object.
    def flinePVO = context.getViewObject("oracle.apps.scm.doo.publicView.analytics.FulfillLinePVO");

    // Create a view criteria object.
    def vc = flinePVO.createViewCriteria();

    // Create a view criteria row.
    def vcrow = vc.createViewCriteriaRow();

    // Set query conditions on the view criteria row.
    vcrow.setAttribute("FulfillLineHeaderId", runningHeaderId);
    vc.add(vcrow);

    def rowset = flinePVO.findByViewCriteriaWithBindVars(vc, -1, new String [0] , new String [0] );

    Map linesMap = new HashMap();

    while (rowset.hasNext()) {
        def fline = rowset.next();

        Long fLineId = fline.getAttribute("FulfillLineId");
        linesMap.put(fLineId, fline);
    }

    return linesMap;
}

void debug(String msg) {
    String text = header.getAttribute("ShippingInstructions");
    header.setAttribute("ShippingInstructions", text + ". " + msg);
}

オーダー改訂に対してのみ拡張を実行

import oracle.apps.scm.doo.common.extensions.ValidationException;   
import oracle.apps.scm.doo.common.extensions.Message;
def reference = header.getAttribute("ReferenceHeaderId");
List<Message> messages = new ArrayList<Message>();
 if(reference!=null){//firing for revisions
 //Include logic here that you want to run only for an order revision.
 }

直接出荷オーダーの改訂の検証

直接出荷フローで販売オーダーを改訂するときに、購買オーダーが保留中でないことを確認してください。

import oracle.apps.scm.doo.common.extensions.ValidationException;
import oracle.apps.scm.doo.common.extensions.Message;

def poNumber = header.getAttribute("CustomerPONumber");

if (poNumber == null) return;

if (!poNumber.startsWith("PMC TEST")) return;

List < Message > messages = new ArrayList < Message > ();

messages.add(new Message(Message.MessageType.ERROR, "In Code"));

def lines = header.getAttribute("Lines");

def headerPVO = context.getViewObject("oracle.apps.scm.doo.processOrder.publicModel.partyMerge.view.HeaderPVO");

def vc = headerPVO.createViewCriteria();
def vcrow = vc.createViewCriteriaRow();
vcrow.setAttribute("SourceOrderNumber", header.getAttribute("SourceTransactionNumber"));
vcrow.setAttribute("SourceOrderSystem", header.getAttribute("SourceTransactionSystem"));
vcrow.setAttribute("StatusCode", "OPEN");

def rowset = headerPVO.findByViewCriteria(vc, -1);
def headerPRow = rowset.first();
def headerId = null;

if (headerPRow != null)
    headerId = headerPRow.getAttribute("HeaderId");
else {
    //ValidationException ex = new ValidationException(messages);
    //throw ex;
    return;
}

while (lines.hasNext()) {
    def line = lines.next();

    def linePVO = context.getViewObject("oracle.apps.scm.doo.processOrder.publicModel.partyMerge.view.FulfillLinePVO");

    def vcLine = linePVO.createViewCriteria();
    def vcrowLine = vcLine.createViewCriteriaRow();
    vcrowLine.setAttribute("HeaderId", headerId);
    vcrowLine.setAttribute("SourceLineId", line.getAttribute("SourceTransactionLineIdentifier"));

    def rowsetLine = linePVO.findByViewCriteria(vcLine, -1);
    def linePRow = rowsetLine.first();
    def flineId = null;

    if (linePRow != null)
        flineId = linePRow.getAttribute("FulfillLineId");
    else
        continue;

    def docRefPVO = context.getViewObject("oracle.apps.scm.doo.common.pricing.integration.publicView.DocumentReferencePVO");

    def vcDr = docRefPVO.createViewCriteria();
    def vcrowDr = vcDr.createViewCriteriaRow();
    vcrowDr.setAttribute("HeaderId", headerId);
    vcrowDr.setAttribute("FulfillLineId", flineId);
    vcrowDr.setAttribute("DocRefType", "DROPSHIP_PO_REFERENCE");

    def rowsetDr = docRefPVO.findByViewCriteria(vcDr, -1);
    def drPRow = rowsetDr.first();
    def poHeaderId = null;

    if (drPRow != null)
        poHeaderId = drPRow.getAttribute("DocId");
    else
        continue;


    def poPVO = context.getViewObject("oracle.apps.prc.po.publicView.PurchasingDocumentHeaderPVO");

    def vcPo = poPVO.createViewCriteria();
    def vcrowPo = vcPo.createViewCriteriaRow();
    vcrowPo.setAttribute("PoHeaderId", poHeaderId);

    def rowsetPo = poPVO.findByViewCriteria(vcPo, -1);
    def poPRow = rowsetPo.first();

    if (poPRow != null) {
        if ("Y".equals(poPRow.getAttribute("FrozenFlag")) || "ON HOLD".equals(poPRow.getAttribute("DocumentStatus")))
            throw new ValidationException("PO is frozen. OM Change cannot be submitted");

        def pvPVO = context.getViewObject("oracle.apps.prc.po.publicView.PurchasingDocumentVersionPVO");

        def vcPv = pvPVO.createViewCriteria();
        def vcrowPv = vcPv.createViewCriteriaRow();
        vcrowPv.setAttribute("PoHeaderId", poHeaderId);
        vcrowPv.setAttribute("ChangeOrderStatus", "INCOMPLETE");

        def rowsetPv = pvPVO.findByViewCriteria(vcPv, -1);
        def pvPRow = rowsetPv.first();

        if (pvPRow != null)
            messages.add(new Message(Message.MessageType.ERROR, "PO Change is in progress. OM Change cannot be submitted"));

    } else
        continue;
}

ValidationException ex = new ValidationException(messages);
throw ex;

前のリビジョンからの属性のコピー

import oracle.apps.scm.doo.common.extensions.ValidationException;
import oracle.apps.scm.doo.common.extensions.Message;
 
def po = header.getAttribute("CustomerPONumber");
def reference = header.getAttribute("ReferenceHeaderId");
 
previousLinesMap = [:];
if (reference == null)
return;
 
def lines = header.getAttribute("Lines");
populateReferenceLines(reference);
    while (lines.hasNext()) {
        def line = lines.next();
        def sourceLineId=line.getAttribute("SourceTransactionLineIdentifier");
        def originalLine=previousLinesMap.get(sourceLineId);
        def currentTaxCode=line.getAttribute("TaxClassificationCode");
        if(originalLine!=null && currentTaxCode==null){
            def orginalTaxCode=originalLine.getAttribute("FulfillLineTaxClassificationCode");
            line.setAttribute("TaxClassificationCode",orginalTaxCode);
        }
}
 
void populateReferenceLines(Long headerId) {
    def vo =context.getViewObject("oracle.apps.scm.doo.publicView.analytics.FulfillLinePVO");
    def vc1 = vo.createViewCriteria();
    def vcrow1 = vc1.createViewCriteriaRow();
    vcrow1.setAttribute("FulfillLineHeaderId", headerId);
    rowset1 = vo.findByViewCriteria(vc1, -1);
 
    while (rowset1.hasNext()) {
        def originalFLine=rowset1.next();
 
        previousLinesMap.put(originalFLine.getAttribute("FulfillLineSourceLineId"),originalFLine);
    }
}