Advertisement
DjonathanKrause

procedure usf_cancel_po corrigida

Feb 22nd, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION     USF_CANCEL_PO (in_vchwhid     VARCHAR2
  2.                            ,in_vchponumber VARCHAR2
  3.                            ,in_vchuserid   VARCHAR2
  4.                            ,in_vchobs      VARCHAR2)
  5. RETURN VARCHAR2 IS
  6. PRAGMA AUTONOMOUS_TRANSACTION;
  7.  
  8.   -- Error handling and logging variables.
  9.   v_nlogerrornum INT; -- The # that uniquely tags the error message.
  10.   v_vcherrormsg  VARCHAR2(500 CHAR);
  11.   e_genprocerror EXCEPTION;
  12.   v_nCount             INT;
  13.   v_vchOutMsg          VARCHAR2(500 CHAR);
  14.   v_vchDisplayPONumber VARCHAR2(30 CHAR);
  15.   v_vchHostGroupID     VARCHAR2(500 CHAR);
  16.   V_RECEIPT_ID         NUMBER(10);
  17.  
  18.   CURSOR C_PO_DETAIL(P_PONUMBER IN VARCHAR2, P_WHID IN VARCHAR2) IS
  19.     SELECT MAS.WH_ID,
  20.            MAS.PO_NUMBER,
  21.            'P-'||MAS.DISPLAY_PO_NUMBER AS SCAC_CODE,
  22.            DET.ITEM_NUMBER,
  23.            DET.LINE_NUMBER,
  24.            DET.QTY
  25.       FROM T_PO_DETAIL DET, T_PO_MASTER MAS
  26.      WHERE MAS.PO_NUMBER = P_PONUMBER
  27.        AND MAS.PO_NUMBER = DET.PO_NUMBER
  28.        AND MAS.WH_ID = DET.WH_ID
  29.        AND MAS.WH_ID = P_WHID;
  30.  
  31. BEGIN
  32.   -- Verifica se algum item foi recebido
  33.   SELECT COUNT(*)
  34.     INTO v_nCount
  35.     FROM t_receipt
  36.    WHERE wh_id = in_vchwhid
  37.      AND po_number = in_vchponumber;
  38.  
  39.   IF v_nCount <> 0 THEN
  40.     v_vchOutMsg := 'OE nao foi cancelada pois ha itens ja recebidos na Ordem de Entrada';
  41.     GOTO retorno;
  42.   END IF;
  43.  
  44.   --Captura infromações para LOG
  45.   SELECT display_po_number
  46.     INTO v_vchDisplayPONumber
  47.     FROM t_po_master
  48.    WHERE wh_id = in_vchwhid
  49.      AND po_number = in_vchponumber;
  50.  
  51.   --Verifica se PO tem mais de uma ordem em aberto
  52.   SELECT COUNT(*)
  53.     INTO v_nCount
  54.     FROM t_po_master
  55.    WHERE wh_id = in_vchwhid
  56.      AND display_po_number = v_vchDisplayPONumber
  57.      AND status = 'O';
  58.  
  59.   IF v_nCount > 1 THEN
  60.     v_vchOutMsg := 'OE nao foi cancelada pois ha mais uma de Ordem de Entrada em aberto para a PO';
  61.     GOTO retorno;
  62.   END IF;
  63.  
  64.   -- Verifica se algum item já foi separado
  65.   SELECT COUNT(*)
  66.     INTO v_nCount
  67.     FROM t_pick_detail
  68.    WHERE (pick_id) IN (SELECT pkd.pick_id
  69.                          FROM t_pick_detail pkd, t_order orm
  70.                         WHERE pkd.order_number = orm.order_number
  71.                           AND pkd.wh_id = orm.wh_id
  72.                           AND orm.wh_id = in_vchwhid
  73.                           AND orm.cust_po_number = v_vchDisplayPONumber
  74.                           AND pkd.picked_quantity > 0);
  75.  
  76.   IF v_nCount <> 0 THEN
  77.     v_vchOutMsg := 'OE nao foi cancelada pois ha itens ja separados dessa Ordem de Entrada';
  78.     GOTO retorno;
  79.   END IF;
  80.  
  81.   -- Verifica se existem tarefas de separação associada
  82.   SELECT COUNT(*)
  83.     INTO v_nCount
  84.     FROM t_work_q wkq
  85.    WHERE (wkq.wh_id, wkq.work_q_id) IN
  86.          (SELECT pkd.wh_id, pkd.work_q_id
  87.             FROM t_pick_detail pkd, t_order orm
  88.            WHERE pkd.order_number = orm.order_number
  89.              AND pkd.wh_id = orm.wh_id
  90.              AND orm.wh_id = in_vchwhid
  91.              AND orm.cust_po_number = v_vchDisplayPONumber)
  92.      AND wkq.work_status IN ('A', 'C');
  93.  
  94.   IF v_nCount <> 0 THEN
  95.     v_vchOutMsg := 'OE não foi cancelada pois há tarefas de separação atribuídas aos usuários';
  96.     GOTO retorno;
  97.   END IF;
  98.  
  99.   -- Problema 400-892 - Adicionado a validação para verificar se contém ASN para a PO Mencionada.
  100.   SELECT COUNT(*)
  101.     INTO v_nCount
  102.   FROM t_hu_master hum
  103.   WHERE hum.wh_id = in_vchwhid
  104.     AND hum.hu_id IN (SELECT asn.hu_id
  105.                       FROM t_al_host_transfer_asn asn
  106.                       WHERE asn.wh_id = hum.wh_id
  107.                         AND asn.hu_id = hum.hu_id
  108.                         AND asn.display_po_number = v_vchDisplayPONumber);
  109.  
  110.   IF v_nCount <> 0 THEN
  111.     v_vchOutMsg := 'OE nao foi cancelada, Efetuar primeiramente o cancelamento de ASN para essa PO';
  112.     GOTO retorno;
  113.   END IF;
  114.   -- Fim Problema 400-892
  115.  
  116.   /* Problem 400-1807 - Begin */
  117.   -- Clear aux variable v_nCount
  118.   v_nCount := 0;
  119.  
  120.   -- Check if t_al_host_transfer_asn.display_po_number is null
  121.   SELECT COUNT(1)
  122.   INTO v_nCount
  123.   FROM t_po_master
  124.   WHERE wh_id = in_vchwhid
  125.   AND po_number IN (SELECT po_number
  126.                     FROM t_al_host_transfer_asn
  127.                     WHERE display_po_number IS NULL
  128.                     AND po_number = in_vchponumber
  129.                     AND wh_id = in_vchwhid);
  130.  
  131.   IF (v_nCount <> 0) THEN
  132.     -- Delete t_stored_item
  133.     DELETE t_stored_item
  134.     WHERE wh_id = in_vchwhid
  135.     AND hu_id IN (SELECT hu_id
  136.                   FROM t_al_host_transfer_asn
  137.                   WHERE display_po_number IS NULL
  138.                   AND po_number = in_vchponumber
  139.                   AND wh_id = in_vchwhid);
  140.    
  141.     -- Delete t_hu_master
  142.     DELETE t_hu_master
  143.     WHERE wh_id = in_vchwhid
  144.     AND hu_id IN (SELECT hu_id
  145.                   FROM t_al_host_transfer_asn
  146.                   WHERE display_po_number IS NULL
  147.                   AND po_number = in_vchponumber
  148.                   AND wh_id = in_vchwhid);
  149.                  
  150.     -- Delete t_al_host_transfer_asn
  151.     DELETE t_al_host_transfer_asn
  152.     WHERE display_po_number IS NULL
  153.     AND po_number = in_vchponumber
  154.     AND wh_id = in_vchwhid;    
  155.   END IF;
  156.   /* Problem 400-1807 - End */
  157.  
  158.  
  159.   --- Implementa validacao tipo de PO de importados.
  160.   SELECT COUNT(*)
  161.     INTO v_nCount
  162.     FROM t_po_master mas, v_type tpe
  163.    WHERE mas.po_number = in_vchponumber
  164.      AND mas.wh_id = in_vchwhid
  165.      AND mas.TYPE_ID = tpe.TYPE_ID
  166.      AND tpe.TYPE = 'IP';
  167.  
  168.   IF v_nCount <> 0 THEN
  169.     v_vchOutMsg := 'Nao e possivel cancelar PO de importados.';
  170.     GOTO retorno;
  171.   END IF;
  172.  
  173.   /* ***** Bloco abaixo foi retirado conforme definicoes do PJ00088 - SIM ********* */
  174.   /*
  175.   DELETE t_po_detail
  176.   WHERE wh_id = in_vchwhid
  177.          AND po_number = in_vchponumber;
  178.  
  179.   DELETE t_po_detail_dest
  180.   WHERE wh_id = in_vchwhid
  181.          AND po_number = in_vchponumber;
  182.  
  183.   DELETE t_po_master
  184.   WHERE wh_id = in_vchwhid
  185.          AND po_number = in_vchponumber;
  186.   */
  187.  
  188.   DELETE t_hu_audit
  189.   WHERE wh_id = in_vchwhid
  190.     AND po_number = in_vchponumber;
  191.  
  192.   DELETE t_work_q_assignment
  193.   WHERE (wh_id, work_q_id) IN (SELECT pkd.wh_id
  194.                                     , pkd.work_q_id
  195.                                FROM t_pick_detail pkd,
  196.                                     t_order orm
  197.                                WHERE pkd.order_number = orm.order_number
  198.                                  AND pkd.wh_id = orm.wh_id
  199.                                  AND orm.wh_id = in_vchwhid
  200.                                  AND orm.cust_po_number = v_vchDisplayPONumber
  201.                               );
  202.  
  203.   DELETE t_work_q
  204.   WHERE (wh_id, work_q_id) IN (SELECT pkd.wh_id
  205.                                     , pkd.work_q_id
  206.                                FROM t_pick_detail pkd,
  207.                                     t_order orm
  208.                                WHERE pkd.order_number = orm.order_number
  209.                                  AND pkd.wh_id = orm.wh_id
  210.                                  AND orm.wh_id = in_vchwhid
  211.                                  AND orm.cust_po_number = v_vchDisplayPONumber
  212.                               );
  213.  
  214.   DELETE t_pick_detail
  215.   WHERE (pick_id) IN (SELECT pkd.pick_id
  216.                       FROM t_pick_detail pkd,
  217.                              t_order orm
  218.                       WHERE pkd.order_number = orm.order_number
  219.                         AND pkd.wh_id = orm.wh_id
  220.                         AND orm.wh_id = in_vchwhid
  221.                         AND orm.cust_po_number = v_vchDisplayPONumber
  222.                       );
  223.  
  224.   DELETE t_order_detail
  225.   WHERE (wh_id, order_number) IN (SELECT wh_id
  226.                                        , order_number
  227.                                   FROM   t_order
  228.                                   WHERE wh_id = in_vchwhid
  229.                                     AND cust_po_number = v_vchDisplayPONumber
  230.                                   );
  231.  
  232.   DELETE t_order
  233.   WHERE wh_id = in_vchwhid
  234.     AND cust_po_number = v_vchDisplayPONumber;
  235.  
  236.   --- iNSERE DADOS DA PO NA T_RECEIPT
  237.   SELECT next_value
  238.     INTO V_RECEIPT_ID
  239.     FROM T_CONTROL
  240.    WHERE control_type = 'RECEIPT_ID';
  241.  
  242.   V_RECEIPT_ID := V_RECEIPT_ID + 1;
  243.  
  244.   UPDATE T_CONTROL
  245.      SET next_value = V_RECEIPT_ID
  246.    WHERE control_type = 'RECEIPT_ID';
  247.  
  248.   FOR R_PO_DETAIL IN C_PO_DETAIL(in_vchponumber, in_vchwhid) LOOP
  249.  
  250.     INSERT INTO T_RECEIPT
  251.       (RECEIPT_ID,
  252.        PO_NUMBER,
  253.        RECEIPT_DATE,
  254.        ITEM_NUMBER,
  255.        LINE_NUMBER,
  256.        SCHEDULE_NUMBER,
  257.        QTY_RECEIVED,
  258.        QTY_DAMAGED,
  259.        HU_ID,
  260.        FORK_ID,
  261.        TRAN_STATUS,
  262.        WH_ID,
  263.        SCAC_CODE)
  264.     VALUES
  265.       (V_RECEIPT_ID,
  266.        R_PO_DETAIL.PO_NUMBER,
  267.        TRUNC(SYSDATE),
  268.        R_PO_DETAIL.ITEM_NUMBER,
  269.        R_PO_DETAIL.LINE_NUMBER,
  270.        NULL,
  271.        0,  --R_PO_DETAIL.QTY,
  272.        NULL,
  273.        NULL,
  274.        NULL,
  275.        'O',
  276.        R_PO_DETAIL.WH_ID,
  277.        R_PO_DETAIL.SCAC_CODE);
  278.  
  279.   END LOOP;
  280.  
  281.   -- Gerando transação 159
  282.   INSERT INTO t_tran_log_holding
  283.     (TRAN_TYPE,
  284.      DESCRIPTION,
  285.      START_TRAN_DATE,
  286.      START_TRAN_TIME,
  287.      END_TRAN_DATE,
  288.      END_TRAN_TIME,
  289.      EMPLOYEE_ID,
  290.      CONTROL_NUMBER,
  291.      LINE_NUMBER,
  292.      CONTROL_NUMBER_2,
  293.      OUTSIDE_ID,
  294.      WH_ID,
  295.      LOCATION_ID,
  296.      HU_ID,
  297.      NUM_ITEMS,
  298.      ITEM_NUMBER,
  299.      LOT_NUMBER,
  300.      UOM,
  301.      TRAN_QTY,
  302.      WH_ID_2,
  303.      LOCATION_ID_2,
  304.      VERIFY_STATUS,
  305.      EMPLOYEE_ID_2,
  306.      ROUTING_CODE,
  307.      HU_ID_2,
  308.      RETURN_DISPOSITION,
  309.      ELAPSED_TIME,
  310.      SOURCE_STORAGE_TYPE,
  311.      DESTINATION_STORAGE_TYPE,
  312.      GENERIC_ATTRIBUTE_1,
  313.      GENERIC_ATTRIBUTE_2,
  314.      GENERIC_ATTRIBUTE_3,
  315.      GENERIC_ATTRIBUTE_4,
  316.      GENERIC_ATTRIBUTE_5,
  317.      GENERIC_ATTRIBUTE_6,
  318.      GENERIC_ATTRIBUTE_7,
  319.      GENERIC_ATTRIBUTE_8,
  320.      GENERIC_ATTRIBUTE_9,
  321.      GENERIC_ATTRIBUTE_10,
  322.      GENERIC_ATTRIBUTE_11)
  323.   VALUES (
  324.     '159'
  325.     , NVL((SELECT description FROM t_transaction WHERE tran_type = '159'), 'Cancel Web PO')
  326.     , TRUNC(SYSDATE)
  327.     , TO_DATE(TO_CHAR(TRUNC(SYSDATE, 'MM'), 'DD/MM/YYYY')||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'), 'DD/MM/YYYY HH24:MI:SS') --START_TRAN_TIME
  328.     , TRUNC(SYSDATE) --TO_DATE('01/01/1900','MM/DD/YYYY')END_TRAN_DATE
  329.     , TO_DATE(TO_CHAR(TRUNC(SYSDATE, 'MM'), 'DD/MM/YYYY')||' '||TO_CHAR(SYSDATE,'HH24:MI:SS'), 'DD/MM/YYYY HH24:MI:SS') --END_TRAN_TIME
  330.     , in_vchuserid --EMPLOYEE_ID
  331.     , in_vchponumber --CONTROL_NUMBER
  332.     , NULL --LINE_NUMBER
  333.     , v_vchDisplayPONumber --CONTROL_NUMBER_2
  334.     , NULL --OUTSIDE_ID
  335.     , in_vchwhid --WH_ID
  336.     , NULL --LOCATION_ID
  337.     , NULL --HU_ID
  338.     , NULL --NUM_ITEMS
  339.     , NULL --ITEM_NUMBER
  340.     , NULL --LOT_NUMBER
  341.     , NULL --UOM
  342.     , NULL --TRAN_QTY
  343.     , NULL --WH_ID_2
  344.     , NULL --LOCATION_ID_2
  345.     , NULL --VERIFY_STATUS
  346.     , NULL --EMPLOYEE_ID_2
  347.     , NULL --ROUTING_CODE
  348.     , NULL --HU_ID_2
  349.     , NULL --RETURN_DISPOSITION
  350.     , NULL --ELAPSED_TIME
  351.     , NULL --SOURCE_STORAGE_TYPE
  352.     , NULL --DESTINATION_STORAGE_TYPE
  353.     , SUBSTR(in_vchobs, 1, 250) --GENERIC_ATTRIBUTE_1
  354.     , NULL --GENERIC_ATTRIBUTE_2
  355.     , NULL --GENERIC_ATTRIBUTE_3
  356.     , NULL --GENERIC_ATTRIBUTE_4
  357.     , NULL --GENERIC_ATTRIBUTE_5
  358.     , NULL --GENERIC_ATTRIBUTE_6
  359.     , NULL --GENERIC_ATTRIBUTE_7
  360.     , NULL --GENERIC_ATTRIBUTE_8
  361.     , NULL --GENERIC_ATTRIBUTE_9
  362.     , NULL --GENERIC_ATTRIBUTE_10
  363.     , NULL --GENERIC_ATTRIBUTE_11
  364.     );
  365.  
  366.   -- Atualiza o Status da PO
  367.   UPDATE t_po_master
  368.      SET status = 'X'
  369.    WHERE wh_id = in_vchwhid
  370.      AND po_number = in_vchponumber;
  371.  
  372.   <<retorno>>
  373.   COMMIT;
  374.   RETURN v_vchoutmsg;
  375. EXCEPTION
  376.   WHEN e_genprocerror THEN
  377.     v_nlogerrornum := -20001;
  378.     v_vchOutMsg    := 'Ocorreu um erro ao tentar cancelar a Ordem';
  379.     ROLLBACK;
  380.     raise_application_error(v_nlogerrornum, v_vcherrormsg);
  381.   WHEN OTHERS THEN
  382.     v_nlogerrornum := SQLCODE; -- Unknown Error Occured Executing Procedure
  383.     v_vcherrormsg  := 'Unknown Stored Procedure Error - SQLERRM: '||SQLERRM;
  384.     v_vchOutMsg    := 'Ocorreu um erro ao tentar cancelar a Ordem';
  385.     ROLLBACK;
  386.     raise_application_error(v_nlogerrornum, SQLERRM);
  387. END USF_CANCEL_PO;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement