CREATE OR REPLACE PROCEDURE GERA_REQUI_RETIRADAINF
(
P_CDFILIAL IN VARCHAR2,
P_NRREQUISICAOINF IN NUMBER,
P_CDOPERADOR IN VARCHAR2,
P_NRORG IN NUMBER
)
AS
   V_IDSITUACAO VARCHAR2(30);
   V_SEQ VARCHAR2(20);
   V_NRRETIRADAINF NUMBER;
   V_DTREQUISICAOINF DATE;
   V_CDSETOR VARCHAR2(4);
   V_NRTURNO VARCHAR2(2);
   V_NRPRODRETIRADAINF NUMBER;
   V_HRPREFERENCIAL VARCHAR2(4);
   V_QUANTIDADE_PRODUTOS NUMBER;
BEGIN
   SELECT MAX(IDSITUACAO), MAX(NRRETIRADAINF), MAX(DTREQUISICAOINF), MAX(CDSETOR), MAX(NRTURNO), MAX(HRPREFERENCIAL)
     INTO V_IDSITUACAO, V_NRRETIRADAINF, V_DTREQUISICAOINF, V_CDSETOR, V_NRTURNO, V_HRPREFERENCIAL
     FROM REQUISICAOINF
    WHERE CDFILIAL = P_CDFILIAL
      AND NRREQUISICAOINF = P_NRREQUISICAOINF;

   IF V_IDSITUACAO IS NULL THEN
      RETURN;
   END IF;

   IF V_NRRETIRADAINF IS NOT NULL THEN
      /*Atendimento ja gerado para a requisicao $param[0]*/
      RAISE_APPLICATION_ERROR(-20501, 'APPERRMSGSTR' || 'APP-00158' || '$$' ||
                                       TO_CHAR(P_NRREQUISICAOINF)
                                       || 'APPERRMSGEND');
   END IF;

   IF V_IDSITUACAO <> 'APROVADA' THEN
      /*Operacao bloqueada. Requisicao [NRREQUISICAOINF] nao esta aprovada.*/
      RAISE_APPLICATION_ERROR(-20501, 'APPERRMSGSTR' || 'APP-00140' || '$$' ||
                                       TO_CHAR(P_NRREQUISICAOINF)
                                       || 'APPERRMSGEND');
   END IF;

   /*Insere nova retirada*/
   NOVO_CODIGO_NT('RETIRADAINF' || P_CDFILIAL, V_SEQ);
   V_NRRETIRADAINF := TO_NUMBER(V_SEQ);

   INSERT INTO RETIRADAINF
   (CDFILIAL, NRRETIRADAINF, DTRETIRADAINF,  
   CDSETOR, NRTURNO,  
   IDSITUACAO, IDORIGEM, HRPREFERENCIAL,
   NRORG, NRORGINCLUSAO, NRORGULTATU,  
   DTINCLUSAO, DTULTATU,  
   CDOPERINCLUSAO, CDOPERULTATU, IDATIVO)
   VALUES
   (P_CDFILIAL, V_NRRETIRADAINF, V_DTREQUISICAOINF,
   V_CDSETOR, V_NRTURNO,
   'PENDENTE', 'REQUISICAOINF', V_HRPREFERENCIAL,
   P_NRORG, P_NRORG, P_NRORG,  
   SYSDATE, SYSDATE,  
   P_CDOPERADOR, P_CDOPERADOR, 'S');

   FOR CUR_PROD IN
   (
      SELECT CDPRODUTO, QTPRODUTOINF
        FROM PRODREQUISICAOINF
       WHERE CDFILIAL = P_CDFILIAL
         AND NRREQUISICAOINF = P_NRREQUISICAOINF
   ) LOOP
      /*Insere produto na requisicao*/
      NOVO_CODIGO_NT('PRODRETIRADAINF' || P_CDFILIAL, V_SEQ);
      V_NRPRODRETIRADAINF := TO_NUMBER(V_SEQ);

      INSERT INTO PRODRETIRADAINF
      (CDFILIAL, NRPRODRETIRADAINF, NRRETIRADAINF,
      CDPRODUTO, QTPRODUTOCALC, QTPRODUTOINF,
      NRORG, NRORGINCLUSAO, NRORGULTATU,  
      DTINCLUSAO, DTULTATU,  
      CDOPERINCLUSAO, CDOPERULTATU, IDATIVO)
      VALUES
      (P_CDFILIAL, V_NRPRODRETIRADAINF, V_NRRETIRADAINF,
      CUR_PROD.CDPRODUTO, CUR_PROD.QTPRODUTOINF, CUR_PROD.QTPRODUTOINF,
      P_NRORG, P_NRORG, P_NRORG,
      SYSDATE, SYSDATE,  
      P_CDOPERADOR, P_CDOPERADOR, 'S');
   END LOOP;

   SELECT COUNT(1)
     INTO V_QUANTIDADE_PRODUTOS
     FROM PRODRETIRADAINF
    WHERE CDFILIAL = P_CDFILIAL
      AND NRRETIRADAINF = V_NRRETIRADAINF;

   IF V_QUANTIDADE_PRODUTOS = 0 THEN
      /*Operacao bloqueada. Nao ha produtos na Requisicao [NRREQUISICAOINF] para atendimento.*/
      RAISE_APPLICATION_ERROR(-20501, 'APPERRMSGSTR' || 'APP-00156' || '$$' ||
                                       TO_CHAR(P_NRREQUISICAOINF)
                                       || 'APPERRMSGEND');
   END IF;

   UPDATE REQUISICAOINF
      SET NRRETIRADAINF = V_NRRETIRADAINF,
          NRORGULTATU = P_NRORG,
          CDOPERULTATU = P_CDOPERADOR,
          DTULTATU = SYSDATE
    WHERE CDFILIAL = P_CDFILIAL
      AND NRREQUISICAOINF = P_NRREQUISICAOINF;
END;
/