SET TERM ^ ;

CREATE OR ALTER trigger tbpdv_confer_item_saldo_b01u for tbpdv_conferencia_item_saldo
active before update position 1
AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE QUANTIDADE NUMERIC(15,4);
DECLARE VARIABLE QUANT_ALOC NUMERIC(15,4);
DECLARE VARIABLE SALDO NUMERIC(15,4);
DECLARE VARIABLE ESTOQUE_DETALHE_ID INTEGER;
BEGIN

    IF(OLD.QUANTIDADE >= 0 AND NEW.QUANTIDADE >= 0) THEN
    BEGIN

      QUANTIDADE = ABS(OLD.QUANTIDADE - NEW.QUANTIDADE);
    
      IF (:QUANTIDADE > 0) THEN
          BEGIN
            FOR
            SELECT A.ID, A.QUANTIDADE, A.SALDO, A.ESTOQUE_DETALHE_ID
            FROM TBESTOQUE_DETALHE_ALOCACAO A
            WHERE A.TABELA_ID = OLD.PDV_CONFERENCIA_ID
              AND A.TAB_ITEM_ID = OLD.PDV_CONFERENCIA_ITEM_ID
              AND A.TAMANHO = OLD.TAMANHO
              AND A.TIPO = 'O'
            INTO :ID, :QUANT_ALOC, :SALDO, :ESTOQUE_DETALHE_ID
            DO
            BEGIN
              --SAIDA/BAIXA
              IF (NEW.QUANTIDADE < OLD.QUANTIDADE) THEN
                  BEGIN
                  IF (:QUANTIDADE > 0 AND :SALDO > 0) THEN
                      BEGIN
                          IF (:SALDO <= :QUANTIDADE) THEN
                          BEGIN
                            UPDATE TBESTOQUE_DETALHE_ALOCACAO A
                                SET SALDO = 0
                            WHERE ID = :ID AND TABELA_ID = OLD.PDV_CONFERENCIA_ID
                            AND TAB_ITEM_ID = OLD.PDV_CONFERENCIA_ITEM_ID
                            AND TAMANHO = OLD.TAMANHO AND TIPO = 'O';
        
                            QUANTIDADE = :QUANTIDADE - :SALDO;
                          END ELSE
                          IF (:SALDO > :QUANTIDADE) THEN
                          BEGIN
                            UPDATE TBESTOQUE_DETALHE_ALOCACAO A
                                SET SALDO = SALDO - :QUANTIDADE
                            WHERE ID = :ID AND TABELA_ID = OLD.PDV_CONFERENCIA_ID
                            AND TAB_ITEM_ID = OLD.PDV_CONFERENCIA_ITEM_ID
                            AND TAMANHO = OLD.TAMANHO AND TIPO = 'O';
        
                            QUANTIDADE = 0;
                          END
                      END
                  END ELSE
              --ENTRADA/CANCELAMENTO DA SA??DA
              IF (NEW.QUANTIDADE > OLD.QUANTIDADE) THEN
                  BEGIN
                  IF (:QUANTIDADE > 0 AND :SALDO < :QUANT_ALOC) THEN
                      BEGIN
                          IF (:QUANT_ALOC-:SALDO <= :QUANTIDADE) THEN
                          BEGIN
                            UPDATE TBESTOQUE_DETALHE_ALOCACAO A SET
                                SALDO = QUANTIDADE
                            WHERE ID = :ID AND TABELA_ID = OLD.PDV_CONFERENCIA_ID
                            AND TAB_ITEM_ID = OLD.PDV_CONFERENCIA_ITEM_ID
                            AND TAMANHO = OLD.TAMANHO AND TIPO = 'O';
                            QUANTIDADE = :QUANTIDADE - (:QUANT_ALOC-:SALDO);
                          END ELSE
                          IF (:QUANT_ALOC-:SALDO > :QUANTIDADE) THEN
                          BEGIN
                            UPDATE TBESTOQUE_DETALHE_ALOCACAO A SET
                                SALDO = SALDO + :QUANTIDADE
                            WHERE ID = :ID AND TABELA_ID = OLD.PDV_CONFERENCIA_ID
                            AND TAB_ITEM_ID = OLD.PDV_CONFERENCIA_ITEM_ID
                            AND TAMANHO = OLD.TAMANHO AND TIPO = 'O';
                            QUANTIDADE = 0;
                          END
                      END
                  END
            END
        END
    END
END
^

SET TERM ; ^



SET TERM ^ ;

CREATE OR ALTER procedure SP_CFE_CONFERENCIA (
    PDV_CFE_ID integer,
    ACAO integer)
as
declare variable PDV_CFE_ITEM_ID integer;
declare variable CONFERENCIA_ITEM_ID integer;
declare variable QUANTIDADE numeric(10,5);
declare variable TAMANHO integer;
BEGIN

    FOR SELECT
        A.ID,
        A.CONFERENCIA_ITEM_ID,
        A.QUANTIDADE,
        A.TAMANHO
    FROM TBPDV_CFE_ITEM A
    WHERE A.CONFERENCIA_ITEM_ID > 0
      AND A.PDV_CFE_ID = :PDV_CFE_ID
    INTO
    :PDV_CFE_ITEM_ID, :CONFERENCIA_ITEM_ID, :QUANTIDADE, :TAMANHO
    DO BEGIN

        /* REALIZAR BAIXA DE CONFERENCIA */
        IF (:ACAO = 1) THEN
           BEGIN
                UPDATE TBPDV_CONFERENCIA_ITEM_SALDO T
                    SET T.QUANTIDADE = IIF(QUANTIDADE = 0, 0, QUANTIDADE - :QUANTIDADE)
                WHERE T.PDV_CONFERENCIA_ITEM_ID = :CONFERENCIA_ITEM_ID
                AND T.TAMANHO = :TAMANHO;

                UPDATE TBPDV_CONFERENCIA_ITEM T SET T.SITUACAO = 3 WHERE T.ID = :CONFERENCIA_ITEM_ID;

           END
           /* DESFAZ BAIXA DE CONFERENCIA */
           ELSE IF(:ACAO = 2) THEN
           BEGIN
                UPDATE TBPDV_CONFERENCIA_ITEM_SALDO T
                    SET T.QUANTIDADE = QUANTIDADE + :QUANTIDADE
                WHERE T.PDV_CONFERENCIA_ITEM_ID = :CONFERENCIA_ITEM_ID
                AND T.TAMANHO = :TAMANHO;

                UPDATE TBPDV_CONFERENCIA_ITEM T SET T.SITUACAO = 0 WHERE T.ID = :CONFERENCIA_ITEM_ID;

           END

       END

END
^

SET TERM ; ^



SET TERM ^ ;

CREATE OR ALTER procedure SP_CFE_ITEM_CONFERENCIA (
    PDV_CFE_ID integer,
    PDV_CFE_ITEM_ID integer,
    ACAO integer)
as
declare variable ITEM_ID integer;
declare variable CONFERENCIA_ITEM_ID integer;
declare variable QUANTIDADE numeric(10,5);
declare variable TAMANHO integer;
BEGIN

    FOR SELECT
        A.ID,
        A.CONFERENCIA_ITEM_ID,
        A.QUANTIDADE,
        A.TAMANHO
    FROM TBPDV_CFE_ITEM A
    WHERE A.CONFERENCIA_ITEM_ID > 0
      AND A.PDV_CFE_ID = :PDV_CFE_ID
      AND A.ID = :PDV_CFE_ITEM_ID
    INTO
    :ITEM_ID, :CONFERENCIA_ITEM_ID, :QUANTIDADE, :TAMANHO
    DO BEGIN

        /* REALIZAR BAIXA DE CONFERENCIA */
        IF (:ACAO = 1) THEN
           BEGIN
                UPDATE TBPDV_CONFERENCIA_ITEM_SALDO T
                    SET T.QUANTIDADE = IIF(QUANTIDADE = 0, 0, QUANTIDADE - :QUANTIDADE)
                WHERE T.PDV_CONFERENCIA_ITEM_ID = :CONFERENCIA_ITEM_ID
                AND T.TAMANHO = :TAMANHO;

                UPDATE TBPDV_CONFERENCIA_ITEM T SET T.SITUACAO = 3 WHERE T.ID = :CONFERENCIA_ITEM_ID;

           END
           /* DESFAZ BAIXA DE CONFERENCIA */
           ELSE IF(:ACAO = 2) THEN
           BEGIN
                UPDATE TBPDV_CONFERENCIA_ITEM_SALDO T
                    SET T.QUANTIDADE = QUANTIDADE + :QUANTIDADE
                WHERE T.PDV_CONFERENCIA_ITEM_ID = :CONFERENCIA_ITEM_ID
                AND T.TAMANHO = :TAMANHO;

                UPDATE TBPDV_CONFERENCIA_ITEM T SET T.SITUACAO = 0 WHERE T.ID = :CONFERENCIA_ITEM_ID;

           END

       END

END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SP_CFE_BAIXA_AUTOMATICA
as
declare variable PDV_CFE_ID integer;
declare variable PDV_CFE_ITEM_ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable CLIENTE_ID integer;
declare variable CAIXA_ID integer;
declare variable NUMERO_CFE integer;
declare variable SERIE_CFE varchar(3);
declare variable DATA_EMISSAO date;
declare variable PEDIDO_ITEM_ID integer;
declare variable CHECK_PEDIDO integer;
declare variable CHECK_ESTOQUE integer;
declare variable ESTOQUE_ID integer;
BEGIN

        FOR

            SELECT
                C.ID AS PDV_CFE_ID,
                ITEM.ID,
                C.ESTABELECIMENTO_ID,
                COALESCE(C.CLIENTE_ID, 0) AS CLIENTE_ID,
                COALESCE((SELECT T.PDV_CAIXA_ID FROM TBPDV_MOVIMENTO_CAIXA T WHERE T.ID = C.PDV_MOVIMENTO_CAIXA_ID), 0) AS CAIXA_ID,
                C.NUMERO_CFE,
                C.SERIE,
                C.DATA_EMISSAO,
                ITEM.PEDIDO_ITEM_ID,
                T.PEDIDO,
                T.ESTOQUE,
                ITEM.ESTOQUE_ID
    
            FROM TBPDV_CFE_ITEM_TRATAMENTO T
            INNER JOIN TBPDV_CFE_ITEM ITEM ON ITEM.ID = T.PDV_CFE_ITEM_ID
            INNER JOIN TBPDV_CFE C ON C.ID = ITEM.PDV_CFE_ID
            WHERE ((T.PEDIDO = 0 AND ITEM.PEDIDO_ITEM_ID > 0) OR T.ESTOQUE = 0)
            AND C.SITUACAO = 2
            INTO :PDV_CFE_ID, :PDV_CFE_ITEM_ID, :ESTABELECIMENTO_ID, :CLIENTE_ID, :CAIXA_ID,
                :NUMERO_CFE, :SERIE_CFE, :DATA_EMISSAO, :PEDIDO_ITEM_ID, :CHECK_PEDIDO, :CHECK_ESTOQUE, :ESTOQUE_ID

        DO BEGIN

            IF(:CHECK_PEDIDO = 0 AND :PEDIDO_ITEM_ID > 0) THEN
            BEGIN
                EXECUTE PROCEDURE SP_CFE_ITEM_PEDIDO(:PDV_CFE_ID, :PDV_CFE_ITEM_ID, 1);
            END

            IF(:CHECK_ESTOQUE = 0 AND :ESTOQUE_ID = 0) THEN
            BEGIN
                EXECUTE PROCEDURE SP_CFE_ITEM_CONFERENCIA(:PDV_CFE_ID, :PDV_CFE_ITEM_ID, 1);

                EXECUTE PROCEDURE SP_CFE_ITEM_ESTOQUE(:PDV_CFE_ID, :PDV_CFE_ITEM_ID, :ESTABELECIMENTO_ID, :CLIENTE_ID, :CAIXA_ID, :NUMERO_CFE, :SERIE_CFE, :DATA_EMISSAO, 1);
            END

            IF(:CHECK_ESTOQUE = 0 AND :ESTOQUE_ID > 0) THEN
            BEGIN
               UPDATE TBPDV_CFE_ITEM_TRATAMENTO SET ESTOQUE = 1 WHERE PDV_CFE_ITEM_ID = :PDV_CFE_ITEM_ID;
            END
        END
END
^

SET TERM ; ^

