Sunday, 12 October 2014

Script to create Missing Workflow Activities for SO Lines

DECLARE
   l_result              VARCHAR2 (30);
   p_line_rec            OE_Order_PUB.Line_Rec_Type;
   l_line_process_name   VARCHAR2 (30);
   l_item_type           VARCHAR2 (30);
   l_aname               wf_engine.nametabtyp;
   l_aname2              wf_engine.nametabtyp;
   l_avalue              wf_engine.numtabtyp;
   l_avaluetext          wf_engine.texttabtyp;
   l_process_activity    NUMBER;
   line                  VARCHAR2 (240);
   l_org_id              NUMBER := -99;

   CURSOR items
   IS
        SELECT l.org_id,
               h.order_number,
               TO_CHAR (l.line_id) item_key,
               l.line_id,
               l.flow_status_code,
               l.open_flag,
               l.booked_flag,
               l.creation_date,
               l.line_type_id,
               h.order_type_id,
               l.item_type_code,
               l.shipped_quantity shq,
               l.line_category_code cat,
               l.fulfilled_flag,
               l.invoice_interface_status_code,
               l.cancelled_flag,
               l.ato_line_id
          FROM oe_order_lines_all l, oe_order_headers_all h, wf_items hdr_wf
         WHERE     l.header_id = h.header_id
               AND TO_CHAR (l.header_id) = hdr_wf.item_key
               AND hdr_wf.item_type = OE_GLOBALS.G_WFI_HDR
               AND l.line_id IN (7446995, 7447003, 7447004) -- Input sales order line_id
               AND (l.open_flag = 'Y' AND NVL (l.cancelled_flag, 'N') = 'N')
               AND NOT EXISTS
                          (SELECT 1
                             FROM wf_items itm
                            WHERE     itm.item_type = OE_GLOBALS.G_WFI_LIN
                                  AND itm.item_key = TO_CHAR (l.line_id))
      ORDER BY l.org_id, h.order_number, l.line_id;

   FUNCTION Get_ProcessName (
      p_itemtype           IN VARCHAR2,
      p_itemkey            IN VARCHAR2,
      p_wfasgn_item_type   IN VARCHAR2 := FND_API.G_MISS_CHAR)
      RETURN VARCHAR2
   IS
      l_process_name           VARCHAR2 (30);

      CURSOR find_HdrProcessname (
         itemkey VARCHAR2)
      IS
         SELECT wf_assign.process_name
           FROM oe_workflow_assignments wf_assign, oe_order_headers header
          WHERE     header.header_id = TO_NUMBER (itemkey)
                AND header.order_type_id = wf_assign.order_type_id
                AND SYSDATE >= wf_assign.start_date_active
                AND SYSDATE <= NVL (wf_assign.end_date_active, SYSDATE)
                AND wf_assign.line_type_id IS NULL;


      CURSOR find_LineProcessname (
         itemkey VARCHAR2)
      IS
           SELECT wf_assign.process_name
             FROM oe_workflow_assignments wf_assign,
                  oe_order_headers header,
                  oe_order_lines line
            WHERE     line.line_id = TO_NUMBER (itemkey)
                  AND NVL (p_wfasgn_item_type, '-99') =
                         NVL (wf_assign.item_type_code,
                              NVL (p_wfasgn_item_type, '-99'))
                  AND header.header_id = line.header_id
                  AND header.order_type_id = wf_assign.order_type_id
                  AND line.line_type_id = wf_assign.line_type_id
                  AND wf_assign.line_type_id IS NOT NULL
                  AND SYSDATE >= wf_assign.start_date_active
                  AND SYSDATE <= NVL (wf_assign.end_date_active, SYSDATE)
         ORDER BY wf_assign.item_type_code;

      --
      l_debug_level   CONSTANT NUMBER := 5;      --oe_debug_pub.g_debug_level;
   --
   BEGIN
      IF (p_itemtype = OE_GLOBALS.G_WFI_HDR)
      THEN
         OPEN find_HdrProcessname (p_itemkey);

         FETCH find_HdrProcessname INTO l_process_name;

         CLOSE find_HdrProcessname;
      ELSE
         OPEN find_LineProcessname (p_itemkey);

         FETCH find_LineProcessname INTO l_process_name;

         CLOSE find_LineProcessname;
      END IF;

      /*
         IF l_process_name IS NULL THEN
            RAISE NO_DATA_FOUND;
         END IF;
      */

      IF l_debug_level > 0
      THEN
         oe_debug_pub.add ('PROCESS NAME IS ' || L_PROCESS_NAME);
      END IF;

      IF l_debug_level > 0
      THEN
         oe_debug_pub.add ('EXITING GET_PROCESSNAME');
      END IF;

      RETURN l_process_name;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         oe_debug_pub.add ('Could not find root flow');
         RAISE;
      WHEN OTHERS
      THEN
         RAISE;
   END Get_ProcessName;
BEGIN
   DBMS_OUTPUT.put_line (
      'Org id: order number: line id: status: booked flag: open flag: created: WF process');
   DBMS_OUTPUT.put_line ('----------------------------------');


   DELETE FROM wf_items
         WHERE     item_key IN
                      (7446995, 7447003, 7447004) -- Input sales order line_id
               AND item_type = 'OEOL';

   COMMIT;

   DELETE FROM WF_ITEM_ATTRIBUTE_VALUES ATV
         WHERE     ATV.ITEM_TYPE = 'OEOL'
               AND ATV.ITEM_KEY IN
                      (7446995, 7447003, 7447004); -- Input sales order line_id

   COMMIT;

   FOR c IN items
   LOOP
      BEGIN
         SAVEPOINT loop_start;

         IF NVL (l_org_id, -99) <> NVL (c.org_id, -99)
         THEN
            l_org_id := c.org_id;
            fnd_client_info.set_org_context (c.org_id);
         END IF;

         --FND_PROFILE.PUT( 'OE_DEBUG_LOG_DIRECTORY', '/sqlcom/out/omptmast' );

         oe_debug_pub.setdebuglevel (5);

         p_line_rec := OE_LINE_UTIL.query_row (c.line_id);

         l_item_type := OE_Order_Wf_Util.get_wf_item_type (p_line_rec);

         l_line_process_name := NULL;
         l_line_process_name :=
            Get_ProcessName (OE_GLOBALS.G_WFI_LIN,
                             p_Line_rec.line_id,
                             l_item_type);

         DBMS_OUTPUT.put_line (
               TO_CHAR (c.org_id)
            || ': '
            || TO_CHAR (c.order_number)
            || ': '
            || c.item_key
            || ': '
            || c.flow_status_code
            || ': '
            || c.booked_flag
            || ': '
            || c.open_flag
            || ': '
            || TO_CHAR (c.creation_date)
            || ': '
            || l_line_process_name
            || ':');

         IF     l_line_process_name IS NOT NULL
            AND l_line_process_name NOT LIKE 'UPG%'
         THEN
            OE_Order_Wf_Util.Set_Line_User_Key (p_line_rec);
            line := SUBSTRB (fnd_message.get, 1, 240);

            -- Create Line Work item
            WF_ENGINE.CreateProcess (OE_Globals.G_WFI_LIN,
                                     TO_CHAR (p_Line_rec.line_id),
                                     l_line_process_name,
                                     line);
            oe_debug_pub.add ('After WF_ENGINE.CreateProcess');
            oe_debug_pub.add ('G_ORG_ID : ' || OE_GLOBALS.G_ORG_ID);
            oe_debug_pub.add ('l_org_id : ' || c.org_id);


            -- Set various Line Attributes

            l_aname (1) := 'USER_ID';
            l_avalue (1) :=
               wf_engine.GetItemAttrNumber (OE_GLOBALS.G_WFI_HDR,
                                            TO_CHAR (p_line_rec.header_id),
                                            'USER_ID');
            l_aname (2) := 'APPLICATION_ID';
            l_avalue (2) :=
               wf_engine.GetItemAttrNumber (OE_GLOBALS.G_WFI_HDR,
                                            TO_CHAR (p_line_rec.header_id),
                                            'APPLICATION_ID');
            l_aname (3) := 'RESPONSIBILITY_ID';
            l_avalue (3) :=
               wf_engine.GetItemAttrNumber (OE_GLOBALS.G_WFI_HDR,
                                            TO_CHAR (p_line_rec.header_id),
                                            'RESPONSIBILITY_ID');
            fnd_global.apps_initialize (l_avalue (1),
                                        l_avalue (3),
                                        l_avalue (2));

            l_aname (4) := 'ORG_ID';
            l_avalue (4) := c.org_id;

            oe_debug_pub.add ('Setting Item Attr Number');
            wf_engine.SetItemAttrNumberArray (OE_GLOBALS.G_WFI_LIN,
                                              p_line_rec.line_id,
                                              l_aname,
                                              l_avalue);

            l_aname2 (1) := 'LINE_CATEGORY';
            l_avaluetext (1) := p_line_rec.line_category_code;
            l_aname2 (2) := 'NOTIFICATION_APPROVER';
            l_avaluetext (2) :=
               FND_PROFILE.VALUE_SPECIFIC ('OE_NOTIFICATION_APPROVER',
                                           l_avalue (1),
                                           l_avalue (3),
                                           l_avalue (2));

            oe_debug_pub.add ('user id : ' || l_avalue (1));
            oe_debug_pub.add ('appl id : ' || l_avalue (2));
            oe_debug_pub.add ('resp id : ' || l_avalue (3));
            oe_debug_pub.add ('catgr code : ' || l_avaluetext (1));
            oe_debug_pub.add ('notif approver : ' || l_avaluetext (2));

            oe_debug_pub.add ('Setting Item Attr Text');
            wf_engine.SetItemAttrTextArray (OE_GLOBALS.G_WFI_LIN,
                                            p_line_rec.line_id,
                                            l_aname2,
                                            l_avaluetext);

            oe_debug_pub.add ('Setting Parrent');
            WF_ITEM.Set_Item_Parent (OE_Globals.G_WFI_LIN,
                                     TO_CHAR (p_Line_rec.line_id),
                                     OE_GLOBALS.G_WFI_HDR,
                                     TO_CHAR (p_Line_rec.header_id),
                                     '');

            oe_debug_pub.add ('Starting a process');

            IF c.flow_status_code = 'AWAITING_SHIPPING'
            THEN
               wf_engine.handleerror ('OEOL',
                                      c.item_key,
                                      'SHIP_LINE',
                                      'RETRY',
                                      NULL);

               BEGIN
                  SELECT st.process_activity
                    INTO l_process_activity
                    FROM wf_item_activity_statuses st,
                         wf_process_activities wpa
                   WHERE     wpa.instance_id = st.process_activity
                         AND st.item_type = 'OEOL'
                         AND wpa.activity_name = 'SHIP_LINE'
                         AND st.activity_status = 'ERROR'
                         AND st.item_key = c.item_key
                         AND EXISTS
                                (SELECT 1
                                   FROM wsh_delivery_details
                                  WHERE     source_line_id =
                                               TO_NUMBER (item_key)
                                        AND source_code = 'OE'
                                        --  and    released_status = 'C'
                                        AND oe_interfaced_flag = 'N');

                  WF_ITEM_ACTIVITY_STATUS.Create_Status (
                     itemtype    => 'OEOL',
                     itemkey     => c.item_key,
                     actid       => l_process_activity,
                     status      => wf_engine.eng_notified,
                     result      => wf_engine.eng_null,
                     beginning   => SYSDATE,
                     ending      => NULL);
               EXCEPTION
                  WHEN NO_DATA_FOUND
                  THEN
                     NULL;
               END;
            ELSIF c.flow_status_code = 'SHIPPED' AND NVL (c.shq, 0) > 0
            THEN
               wf_engine.handleerror ('OEOL',
                                      c.item_key,
                                      'SHIP_LINE',
                                      'SKIP',
                                      'SHIP_CONFIRM');
            ELSIF     c.flow_status_code IN
                         ('AWAITING_FULFILLMENT', 'SHIPPED')
                  AND c.cat = 'ORDER'
                  AND NVL (c.shq, 0) > 0
            THEN
               wf_engine.handleerror ('OEOL',
                                      c.item_key,
                                      'SHIP_LINE',
                                      'SKIP',
                                      'SHIP_CONFIRM');
            ELSIF     c.flow_status_code = 'AWAITING_FULFILLMENT'
                  AND c.cat = 'ORDER'
                  AND NVL (c.shq, 0) = 0
            THEN
               wf_engine.handleerror ('OEOL',
                                      c.item_key,
                                      'SHIP_LINE',
                                      'SKIP',
                                      'NON_SHIPPABLE');
            ELSIF     c.flow_status_code = 'AWAITING_FULFILLMENT'
                  AND c.cat = 'RETURN'
                  AND c.shq IS NOT NULL
            THEN
               wf_engine.handleerror ('OEOL',
                                      c.item_key,
                                      'RMA_WAIT_FOR_RECEIVING',
                                      'SKIP',
                                      'COMPLETE');
               wf_engine.handleerror ('OEOL',
                                      c.item_key,
                                      'RMA_WAIT_FOR_INSPECTION',
                                      'SKIP',
                                      'COMPLETE');
            ELSIF     c.flow_status_code = 'AWAITING_FULFILLMENT'
                  AND c.cat = 'RETURN'
                  AND c.shq IS NULL
            THEN
               wf_engine.handleerror ('OEOL',
                                      c.item_key,
                                      'RMA_WAIT_FOR_RECEIVING',
                                      'SKIP',
                                      'NOT_ELIGIBLE');
            ELSIF c.flow_status_code = 'FULFILLED' AND c.fulfilled_flag = 'Y'
            THEN
               wf_engine.handleerror ('OEOL',
                                      c.item_key,
                                      'FULFILL_LINE',
                                      'SKIP',
                                      NULL);
            ELSIF     c.flow_status_code = 'INVOICED'
                  AND c.invoice_interface_status_code = 'YES'
            THEN
               wf_engine.handleerror ('OEOL',
                                      c.item_key,
                                      'INVOICE_INTERFACE',
                                      'SKIP',
                                      'COMPLETE');
            ELSIF c.flow_status_code = 'CLOSED' AND c.open_flag = 'N'
            THEN
               wf_engine.handleerror ('OEOL',
                                      c.item_key,
                                      'CLOSE_CONT_H',
                                      'RETRY',
                                      NULL);
            ELSIF     c.flow_status_code = 'CANCELLED'
                  AND c.open_flag = 'N'
                  AND c.cancelled_flag = 'Y'
            THEN
               wf_engine.handleerror ('OEOL',
                                      c.item_key,
                                      'CLOSE_CONT_H',
                                      'RETRY',
                                      NULL);
            ELSIF     c.open_flag = 'Y'
                  AND NVL (c.cancelled_flag, 'N') = 'N'
                  AND (   c.flow_status_code = 'ENTERED'
                       OR (    c.flow_status_code = 'BOOKED'
                           AND c.booked_flag = 'Y'
                           AND (   c.ato_line_id IS NULL
                                OR c.ato_line_id <> c.line_id)))
            THEN
               wf_engine.startprocess ('OEOL', c.item_key);
            END IF;
         ELSE
            DBMS_OUTPUT.put_line ('No eligible workflow assignment found.');
         END IF;                                     -- WF process is not null
      EXCEPTION
         WHEN OTHERS
         THEN
            DBMS_OUTPUT.put_line (SQLERRM);
            ROLLBACK TO loop_start;
      END;
   END LOOP;

   DBMS_OUTPUT.put_line (
      'File name ' || OE_DEBUG_PUB.G_DIR || '/' || OE_DEBUG_PUB.G_FILE);

   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      oe_debug_pub.add ('Exception raised');
      RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
END;

No comments:

Post a Comment