CREATE OR ALTER PROCEDURE SP_NF_ITEM_ESTOQUE (
    ORIGEM VARCHAR(3),
    NF_ITEM_ID INTEGER,
    NF_ID INTEGER,
    ACAO INTEGER)
AS
DECLARE VARIABLE CONTROLE INTEGER;
DECLARE VARIABLE NUMERO_NOTAFISCAL INTEGER;
DECLARE VARIABLE ESTABELECIMENTO_CODIGO INTEGER;
DECLARE VARIABLE LOCALIZACAO_CODIGO INTEGER;
DECLARE VARIABLE PRODUTO_CODIGO INTEGER;
DECLARE VARIABLE DATA DATE;
DECLARE VARIABLE TIPO CHAR(1);
DECLARE VARIABLE QUANTIDADE NUMERIC(10,5);
DECLARE VARIABLE T01 NUMERIC(10,5);
DECLARE VARIABLE T02 NUMERIC(10,5);
DECLARE VARIABLE T03 NUMERIC(10,5);
DECLARE VARIABLE T04 NUMERIC(10,5);
DECLARE VARIABLE T05 NUMERIC(10,5);
DECLARE VARIABLE T06 NUMERIC(10,5);
DECLARE VARIABLE T07 NUMERIC(10,5);
DECLARE VARIABLE T08 NUMERIC(10,5);
DECLARE VARIABLE T09 NUMERIC(10,5);
DECLARE VARIABLE T10 NUMERIC(10,5);
DECLARE VARIABLE T11 NUMERIC(10,5);
DECLARE VARIABLE T12 NUMERIC(10,5);
DECLARE VARIABLE T13 NUMERIC(10,5);
DECLARE VARIABLE T14 NUMERIC(10,5);
DECLARE VARIABLE T15 NUMERIC(10,5);
DECLARE VARIABLE T16 NUMERIC(10,5);
DECLARE VARIABLE T17 NUMERIC(10,5);
DECLARE VARIABLE T18 NUMERIC(10,5);
DECLARE VARIABLE T19 NUMERIC(10,5);
DECLARE VARIABLE T20 NUMERIC(10,5);
DECLARE VARIABLE OPERACAO_CODIGO VARCHAR(3);
DECLARE VARIABLE CUSTO_UNITARIO NUMERIC(10,5);
DECLARE VARIABLE EMPRESA_CODIGO INTEGER;
DECLARE VARIABLE VEMPRESA_CODIGO INTEGER;
DECLARE VARIABLE VALOR_UNITARIO NUMERIC(15,4);
DECLARE VARIABLE VCUSTO_MEDIO INTEGER;
DECLARE VARIABLE NF_EXTERNO INTEGER;
DECLARE VARIABLE NF_EXTERNO_ITEM_CONTROLE INTEGER;
DECLARE VARIABLE NFE INTEGER;
DECLARE VARIABLE NFE_ITEM_CONTROLE INTEGER;
DECLARE VARIABLE NFS INTEGER;
DECLARE VARIABLE NFS_ITEM_CONTROLE INTEGER;
DECLARE VARIABLE NF_CONSIGNACAO INTEGER;
DECLARE VARIABLE NF_CONSIGNACAO_ITEM INTEGER;
DECLARE VARIABLE CONTROLE_ESTOQUE_EXTERNO CHAR(1);
DECLARE VARIABLE EXIGE_NF_REFERENCIA CHAR(1);
DECLARE VARIABLE CONTROLE_ESTOQUE CHAR(1);
DECLARE VARIABLE CONTROLE_CONSIGNACAO CHAR(1);
DECLARE VARIABLE BLOQ_MOV_EST CHAR(1);
BEGIN

  IF (ORIGEM = 'NFS') THEN
      BEGIN

      SELECT T.CONTROLE, T.NUMERO_NOTAFISCAL, T.ESTABELECIMENTO_CODIGO,
            T.LOCALIZACAO_CODIGO, T.DATA_EMISSAO, T.PRODUTO_CODIGO, T.QUANTIDADE,
            T.T01, T.T02, T.T03, T.T04, T.T05, T.T06, T.T07, T.T08, T.T09, T.T10, T.T11, T.T12,
            T.T13, T.T14, T.T15, T.T16, T.T17, T.T18, T.T19, T.T20, T.OPERACAO_CODIGO, T.EMPRESA_CODIGO,
            T.VALOR_UNITARIO, T.VALOR_CUSTO, T.NF_EXTERNO, T.NF_EXTERNO_ITEM_CONTROLE,
            T.NFE, T.NFE_ITEM_CONTROLE, T.NF_CONSIGNACAO, T.NF_CONSIGNACAO_ITEM,
            O.CONTROLE_ESTOQUE_EXTERNO, O.EXIGE_NF_REFERENCIA, O.CONTROLE_ESTOQUE, O.CONTROLE_CONSIGNACAO
            FROM TBNFS_ITEM T, TBOPERACAO O
           WHERE O.CODIGO = T.OPERACAO_CODIGO
           AND T.NFS_CONTROLE = :NF_ID
           AND T.CONTROLE = :NF_ITEM_ID
      INTO :CONTROLE, :NUMERO_NOTAFISCAL, :ESTABELECIMENTO_CODIGO, :LOCALIZACAO_CODIGO, :DATA, :PRODUTO_CODIGO, :QUANTIDADE,
           :T01, :T02, :T03, :T04, :T05, :T06, :T07, :T08, :T09, :T10, :T11, :T12, :T13, :T14, :T15, :T16, :T17, :T18, :T19, :T20,
           :OPERACAO_CODIGO, :EMPRESA_CODIGO, :VALOR_UNITARIO, :CUSTO_UNITARIO, :NF_EXTERNO, :NF_EXTERNO_ITEM_CONTROLE,
           :NFE, :NFE_ITEM_CONTROLE, :NF_CONSIGNACAO, :NF_CONSIGNACAO_ITEM,
           :CONTROLE_ESTOQUE_EXTERNO, :EXIGE_NF_REFERENCIA, :CONTROLE_ESTOQUE, :CONTROLE_CONSIGNACAO;

       IF(ACAO = 1) THEN -- INCLUSAO
       BEGIN

           IF(CONTROLE_ESTOQUE = '1' OR CONTROLE_ESTOQUE_EXTERNO = '1') THEN
           BEGIN
                VCUSTO_MEDIO     = 0;
                VEMPRESA_CODIGO  = 0;
                TIPO             = 'B';

                IF(CONTROLE_ESTOQUE = '1') THEN
                   TIPO = 'S';
    
                        /*  ATUALIZA TABELAS DE ESTOQUE DE TERCEIROS POR EMPRESA */
                        BLOQ_MOV_EST = (SELECT TRIM(FN_PARAMETRO('SISTEMA.5')) FROM RDB$DATABASE);
                        IF(BLOQ_MOV_EST = '1') THEN
                        BEGIN
                           IF(CONTROLE_ESTOQUE_EXTERNO = '1') THEN
                           BEGIN
                             IF(EXIGE_NF_REFERENCIA = '1') THEN
                                BEGIN
                                    IF(CONTROLE_CONSIGNACAO <> '1') THEN
                                       BEGIN
                                        VEMPRESA_CODIGO     = (SELECT FIRST 1 A.EMPRESA_CODIGO FROM TBNFE_ITEM A, TBNFE B WHERE A.NFE_CONTROLE = B.CONTROLE AND A.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_CODIGO AND A.NUMERO_NOTAFISCAL = :NF_EXTERNO AND A.CONTROLE = :NF_EXTERNO_ITEM_CONTROLE);
                                        VCUSTO_MEDIO        = 0;
                                       END
            
                                    IF(CONTROLE_CONSIGNACAO = '1') THEN
                                       BEGIN
                                       TIPO                 = 'B';
                                       VEMPRESA_CODIGO      =  EMPRESA_CODIGO;
                                       END
                                END
                            IF(EXIGE_NF_REFERENCIA = '0') THEN
                                BEGIN
                                VEMPRESA_CODIGO  =  EMPRESA_CODIGO;
                                VCUSTO_MEDIO     = VALOR_UNITARIO;
                                END
                           END
                        END

                /* REGISTRA TRANSACAO DE ESTOQUE */
                EXECUTE PROCEDURE SPI_ESTOQUE_SALDO(
                ESTABELECIMENTO_CODIGO, LOCALIZACAO_CODIGO, PRODUTO_CODIGO, TIPO, DATA, QUANTIDADE,
                T01, T02, T03, T04, T05, T06, T07, T08, T09, T10, T11, T12,
                T13, T14, T15, T16, T17, T18, T19, T20, 0, NUMERO_NOTAFISCAL, CONTROLE, 0,
                OPERACAO_CODIGO, NULL, NULL, 0, CUSTO_UNITARIO, FN_CURRENT_USER_ID(), CURRENT_DATE,
                0, '', '', 0, 0, NULL, VEMPRESA_CODIGO, VCUSTO_MEDIO);
           END

           /* BAIXAR SALDO DA PECA DO LOTE */
           IF (:CONTROLE > 0) THEN
               BEGIN
                EXECUTE PROCEDURE SPU_SALDO_PECA(:CONTROLE, 1);
               END

           IF (:NF_EXTERNO_ITEM_CONTROLE > 0 OR :NFE_ITEM_CONTROLE > 0) THEN
               BEGIN
                  UPDATE TBNFE_ITEM_SALDO SET
                  QUANTIDADE = QUANTIDADE - :QUANTIDADE,
                  T01 = T01 - :T01, T02 = T02 - :T02, T03 = T03 - :T03, T04 = T04 - :T04,
                  T05 = T05 - :T05, T06 = T06 - :T06, T07 = T07 - :T07, T08 = T08 - :T08,
                  T09 = T09 - :T09, T10 = T10 - :T10, T11 = T11 - :T11, T12 = T12 - :T12,
                  T13 = T13 - :T13, T14 = T14 - :T14, T15 = T15 - :T15, T16 = T16 - :T16,
                  T17 = T17 - :T17, T18 = T18 - :T18, T19 = T19 - :T19, T20 = T20 - :T20
                  WHERE NFE_ITEM_CONTROLE = IIF(:NF_EXTERNO_ITEM_CONTROLE>0,:NF_EXTERNO_ITEM_CONTROLE,:NFE_ITEM_CONTROLE);
               END
        
           IF (:NF_CONSIGNACAO_ITEM > 0) THEN
               BEGIN
                  UPDATE TBNFS_ITEM_SALDO SET
                  QUANTIDADE = QUANTIDADE - :QUANTIDADE,
                  T01 = T01 - :T01, T02 = T02 - :T02, T03 = T03 - :T03, T04 = T04 - :T04,
                  T05 = T05 - :T05, T06 = T06 - :T06, T07 = T07 - :T07, T08 = T08 - :T08,
                  T09 = T09 - :T09, T10 = T10 - :T10, T11 = T11 - :T11, T12 = T12 - :T12,
                  T13 = T13 - :T13, T14 = T14 - :T14, T15 = T15 - :T15, T16 = T16 - :T16,
                  T17 = T17 - :T17, T18 = T18 - :T18, T19 = T19 - :T19, T20 = T20 - :T20
                  WHERE NFS_ITEM_CONTROLE = :NF_CONSIGNACAO_ITEM;
               END

    END ELSE

    IF (ACAO = 2) THEN -- ALTERAÇÃO
        BEGIN

          /* DESFAZER BAIXAR DE SALDO DA PECA DO LOTE */
          EXECUTE PROCEDURE SPU_SALDO_PECA(CONTROLE, 2);
          /* EXCLUI TRANSACAO DE ESTOQUE */
          EXECUTE PROCEDURE SPD_ESTOQUE_TRANSACAO2(ESTABELECIMENTO_CODIGO, LOCALIZACAO_CODIGO, DATA, PRODUTO_CODIGO, NUMERO_NOTAFISCAL, 0, CONTROLE, 0, 0, 0, 0);

           IF (:NF_EXTERNO_ITEM_CONTROLE > 0 OR :NFE_ITEM_CONTROLE > 0) THEN
               BEGIN
                  UPDATE TBNFE_ITEM_SALDO SET
                  QUANTIDADE = QUANTIDADE + :QUANTIDADE,
                  T01 = T01 + :T01, T02 = T02 + :T02, T03 = T03 + :T03, T04 = T04 + :T04,
                  T05 = T05 + :T05, T06 = T06 + :T06, T07 = T07 + :T07, T08 = T08 + :T08,
                  T09 = T09 + :T09, T10 = T10 + :T10, T11 = T11 + :T11, T12 = T12 + :T12,
                  T13 = T13 + :T13, T14 = T14 + :T14, T15 = T15 + :T15, T16 = T16 + :T16,
                  T17 = T17 + :T17, T18 = T18 + :T18, T19 = T19 + :T19, T20 = T20 + :T20
                  WHERE NFE_ITEM_CONTROLE = IIF(:NF_EXTERNO_ITEM_CONTROLE>0,:NF_EXTERNO_ITEM_CONTROLE,:NFE_ITEM_CONTROLE);
               END
        
           IF (:NF_CONSIGNACAO_ITEM > 0) THEN
               BEGIN
                  UPDATE TBNFS_ITEM_SALDO SET
                  QUANTIDADE = QUANTIDADE + :QUANTIDADE,
                  T01 = T01 + :T01, T02 = T02 + :T02, T03 = T03 + :T03, T04 = T04 + :T04,
                  T05 = T05 + :T05, T06 = T06 + :T06, T07 = T07 + :T07, T08 = T08 + :T08,
                  T09 = T09 + :T09, T10 = T10 + :T10, T11 = T11 + :T11, T12 = T12 + :T12,
                  T13 = T13 + :T13, T14 = T14 + :T14, T15 = T15 + :T15, T16 = T16 + :T16,
                  T17 = T17 + :T17, T18 = T18 + :T18, T19 = T19 + :T19, T20 = T20 + :T20
                  WHERE NFS_ITEM_CONTROLE = :NF_CONSIGNACAO_ITEM;
               END
        END

      END -- FIM PARA NFS



  IF (ORIGEM = 'NFE') THEN
      BEGIN

      SELECT T.CONTROLE, T.NUMERO_NOTAFISCAL, T.ESTABELECIMENTO_CODIGO,
            T.LOCALIZACAO_CODIGO, T.DATA_ENTRADA, T.PRODUTO_CODIGO, T.QUANTIDADE,
            T.T01, T.T02, T.T03, T.T04, T.T05, T.T06, T.T07, T.T08, T.T09, T.T10, T.T11, T.T12,
            T.T13, T.T14, T.T15, T.T16, T.T17, T.T18, T.T19, T.T20, T.OPERACAO_CODIGO, T.EMPRESA_CODIGO,
            T.VALOR_UNITARIO, T.VALOR_CUSTO, T.NF_EXTERNO, T.NF_EXTERNO_ITEM_CONTROLE,
            T.NFS, T.NFS_ITEM_CONTROLE,
            O.CONTROLE_ESTOQUE_EXTERNO, O.EXIGE_NF_REFERENCIA, O.CONTROLE_ESTOQUE
            FROM TBNFE_ITEM T, TBOPERACAO O
           WHERE O.CODIGO = T.OPERACAO_CODIGO
           AND NFE_CONTROLE = :NF_ID
           AND CONTROLE = :NF_ITEM_ID
      INTO :CONTROLE, :NUMERO_NOTAFISCAL, :ESTABELECIMENTO_CODIGO, :LOCALIZACAO_CODIGO, :DATA, :PRODUTO_CODIGO, :QUANTIDADE,
           :T01, :T02, :T03, :T04, :T05, :T06, :T07, :T08, :T09, :T10, :T11, :T12, :T13, :T14, :T15, :T16, :T17, :T18, :T19, :T20,
           :OPERACAO_CODIGO, :EMPRESA_CODIGO, :VALOR_UNITARIO, :CUSTO_UNITARIO, :NF_EXTERNO, :NF_EXTERNO_ITEM_CONTROLE,
           :NFS, :NFS_ITEM_CONTROLE,
           :CONTROLE_ESTOQUE_EXTERNO, :EXIGE_NF_REFERENCIA, :CONTROLE_ESTOQUE;


       IF (ACAO = 1) THEN -- INCLUSAO
           BEGIN

               IF(CONTROLE_ESTOQUE = '1' OR CONTROLE_ESTOQUE_EXTERNO = '1') THEN
               BEGIN
    
                   VCUSTO_MEDIO     = 0;
                   VEMPRESA_CODIGO  = 0;
                   TIPO    = 'B';
                   IF(CONTROLE_ESTOQUE = 1) THEN
                      TIPO = 'E';
        
                               /*  ATUALIZA TABELAS DE ESTOQUE DE TERCEIROS POR EMPRESA */
                               BLOQ_MOV_EST = (SELECT TRIM(FN_PARAMETRO('SISTEMA.5')) FROM RDB$DATABASE);
                               IF(BLOQ_MOV_EST = '1') THEN
                               BEGIN
                                   IF(CONTROLE_ESTOQUE_EXTERNO = 1) THEN
                                   BEGIN
                                     IF(EXIGE_NF_REFERENCIA = 1) THEN
                                        VEMPRESA_CODIGO     = (SELECT FIRST 1 A.EMPRESA_CODIGO FROM TBNFS_ITEM A WHERE A.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_CODIGO AND A.NUMERO_NOTAFISCAL = :NF_EXTERNO AND A.CONTROLE = :NF_EXTERNO_ITEM_CONTROLE);
                                        VCUSTO_MEDIO        = 0;
                                     IF(EXIGE_NF_REFERENCIA = 0) THEN
                                        VEMPRESA_CODIGO     =  EMPRESA_CODIGO;
                                        VCUSTO_MEDIO        = VALOR_UNITARIO;
                                   END
                               END
    
                   /* INSERT SALDO */
                   EXECUTE PROCEDURE SPI_ESTOQUE_SALDO(
                    ESTABELECIMENTO_CODIGO, LOCALIZACAO_CODIGO, PRODUTO_CODIGO, TIPO, DATA, QUANTIDADE,
                    T01, T02, T03, T04, T05, T06, T07, T08, T09, T10, T11, T12,
                    T13, T14, T15, T16, T17, T18, T19, T20, 0, NUMERO_NOTAFISCAL, 0, CONTROLE,
                    OPERACAO_CODIGO, NULL, NULL, 0, CUSTO_UNITARIO, FN_CURRENT_USER_ID(), CURRENT_DATE,
                    0, '', '', 0, 0, NULL, VEMPRESA_CODIGO, VCUSTO_MEDIO);
        
               END

           IF (:NF_EXTERNO_ITEM_CONTROLE > 0 OR :NFS_ITEM_CONTROLE > 0) THEN
               BEGIN
                  UPDATE TBNFS_ITEM_SALDO SET
                  QUANTIDADE = QUANTIDADE - :QUANTIDADE,
                  T01 = T01 - :T01, T02 = T02 - :T02, T03 = T03 - :T03, T04 = T04 - :T04,
                  T05 = T05 - :T05, T06 = T06 - :T06, T07 = T07 - :T07, T08 = T08 - :T08,
                  T09 = T09 - :T09, T10 = T10 - :T10, T11 = T11 - :T11, T12 = T12 - :T12,
                  T13 = T13 - :T13, T14 = T14 - :T14, T15 = T15 - :T15, T16 = T16 - :T16,
                  T17 = T17 - :T17, T18 = T18 - :T18, T19 = T19 - :T19, T20 = T20 - :T20
                  WHERE NFS_ITEM_CONTROLE = IIF(:NF_EXTERNO_ITEM_CONTROLE>0,:NF_EXTERNO_ITEM_CONTROLE,:NFS_ITEM_CONTROLE);
               END

          END ELSE
      IF (ACAO = 2) THEN -- ALTERAÇÃO
          BEGIN

           EXECUTE PROCEDURE SPD_ESTOQUE_TRANSACAO2(ESTABELECIMENTO_CODIGO, LOCALIZACAO_CODIGO, DATA, PRODUTO_CODIGO, NUMERO_NOTAFISCAL, CONTROLE, 0, 0, 0, 0, 0);

           IF (:NF_EXTERNO_ITEM_CONTROLE > 0 OR :NFS_ITEM_CONTROLE > 0) THEN
               BEGIN
                  UPDATE TBNFS_ITEM_SALDO SET
                  QUANTIDADE = QUANTIDADE + :QUANTIDADE,
                  T01 = T01 + :T01, T02 = T02 + :T02, T03 = T03 + :T03, T04 = T04 + :T04,
                  T05 = T05 + :T05, T06 = T06 + :T06, T07 = T07 + :T07, T08 = T08 + :T08,
                  T09 = T09 + :T09, T10 = T10 + :T10, T11 = T11 + :T11, T12 = T12 + :T12,
                  T13 = T13 + :T13, T14 = T14 + :T14, T15 = T15 + :T15, T16 = T16 + :T16,
                  T17 = T17 + :T17, T18 = T18 + :T18, T19 = T19 + :T19, T20 = T20 + :T20
                  WHERE NFS_ITEM_CONTROLE = IIF(:NF_EXTERNO_ITEM_CONTROLE>0,:NF_EXTERNO_ITEM_CONTROLE,:NFS_ITEM_CONTROLE);
               END

          END

      END -- FIM PARA NFE

END;