SET TERM ^ ;

ALTER TABLE TBPDV_CONFERENCIA_TROCA
ADD PRE_PEDIDO_ID INTEGER
DEFAULT 0^

ALTER TABLE TBPDV_DEVOLUCAO_TROCA
ADD PRE_PEDIDO_ID INTEGER
DEFAULT 0^

CREATE INDEX ITBPDV_DEVOLUCAO_TROCA_07I
ON TBPDV_DEVOLUCAO_TROCA (PRE_PEDIDO_ID)^

CREATE INDEX ITBPDV_CONFERENCIA_TROCA_06I
ON TBPDV_CONFERENCIA_TROCA (PRE_PEDIDO_ID)^

CREATE INDEX ITBPDV_CONFERENCIA_18
ON TBPDV_CONFERENCIA (DATA_FECHAMENTO)^

CREATE OR ALTER TRIGGER TBPDV_CONFERENCIA_B01D FOR TBPDV_CONFERENCIA
ACTIVE BEFORE DELETE POSITION 1
AS
DECLARE VARIABLE VINCULO_ID INTEGER;
BEGIN
  IF(OLD.ID > 0) THEN
  BEGIN
        DELETE FROM TBPDV_CONFERENCIA_ITEM T WHERE T.PDV_CONFERENCIA_ID = OLD.ID;

        UPDATE TBPDV_DEVOLUCAO_TROCA   TR SET TR.PRE_PEDIDO_ID = 0 WHERE TR.PRE_PEDIDO_ID = OLD.ID;

        UPDATE TBPDV_CONFERENCIA_TROCA TR SET TR.PRE_PEDIDO_ID = 0 WHERE TR.PRE_PEDIDO_ID = OLD.ID;

        IF (OLD.CODIGO_PED > 0) THEN
        BEGIN
        
            :VINCULO_ID = COALESCE((SELECT FIRST 1 A.ID FROM TBCATALOGO_PRODUTO_VINCULO A WHERE A.CODIGO_PED = OLD.CODIGO_PED AND A.PDV_CONFERENCIA_ID = OLD.ID), 0);

            IF (:VINCULO_ID > 0) THEN
            BEGIN
                DELETE FROM TBCATALOGO_PRODUTO_VINCULO WHERE ID = :VINCULO_ID;
            END

        END
  END
END^

CREATE OR ALTER trigger ttbpdv_conf_troca_item_b0i for tbpdv_conferencia_troca_item
active before insert position 0
AS
declare variable verifica_pre_pedido INTEGER;
declare variable pre_pedido_id       INTEGER;
declare variable pre_pedido_item_id  integer;
declare VARIABLE pdv_conferencia_id  INTEGER;
declare variable FSEQUENCIA          VARCHAR(10);
declare variable FPREPEDIDO          VARCHAR(10);
declare variable DESC_PRODUTO        VARCHAR(500);
declare variable TAM_DESCRICAO       VARCHAR(10);
declare variable novo_quantidade     numeric(15,2);
declare variable antiga_quantidade   numeric(15,2);
declare variable saldo_item          numeric(15,2);
declare variable base_desconto       numeric(15,2);
declare variable novo_valor_desc     numeric(15,2);
declare variable novo_valor_desc2    numeric(15,2);
declare variable valor_unitario      numeric(15,2);
declare variable novo_valor_total    numeric(15,2);
declare variable novo_valor_total2   numeric(15,2);
declare variable quantidade_alocado  numeric(15,2);

BEGIN

  if(new.pdv_conferencia_troca_id > 0)then
  begin
    verifica_pre_pedido = coalesce((SELECT FIRST 1 A.PRE_PEDIDO_ID FROM tbpdv_conferencia_troca A WHERE A.pre_pedido_id > 0 AND A.id = NEW.pdv_conferencia_troca_id),0);
    IF(verifica_pre_pedido > 0)THEN
    BEGIN
       EXCEPTION "..." 'EXISTEM PRE-PEDIDOS VINCULADOS A ESTE REGISTRO DE TROCA, INCLUSAO DE ITENS CANCELADA!';
    END
  end

  IF(NEW.pre_pedido_item_id > 0)THEN
  BEGIN

      FOR SELECT FIRST 1
            FN_LPAD(A.sequencia,3,0) AS FSEQUENCIA,
            FN_LPAD(A.pdv_conferencia_id,6,0) AS FPREPEDIDO,
            FN_LPAD(A.produto_id,6,0)||' - '||A.produto_descricao AS DESC_PRODUTO,
            FN_TAMANHO_PRODUTO(A.produto_id,A.tamanho) AS TAM_DESCRICAO,
            A.QUANTIDADE,
            b.QUANTIDADE,
            IIF(A.VALOR_DESCONTO > 0,FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(A.VALOR_DESCONTO,100.00,'*'),A.VALOR_TOTAL,'/'),0.00) AS PESO_DESCONTO,
            A.valor_unitario,
            A.VALOR_DESCONTO,
            A.valor_total,
            A.pdv_conferencia_id,
            a.qtd_estoque

            FROM TBPDV_CONFERENCIA_ITEM A, TBPDV_CONFERENCIA_ITEM_SALDO B
            WHERE A.ID = B.pdv_conferencia_item_id
              AND A.pdv_conferencia_id = B.pdv_conferencia_id
              AND A.ID                 = NEW.pre_pedido_item_id
              INTO :fsequencia, :fprepedido, :DESC_PRODUTO, :TAM_DESCRICAO, :antiga_quantidade, :saldo_item, :base_desconto,
                :valor_unitario, :novo_valor_desc, :novo_valor_total, :pdv_conferencia_id, :quantidade_alocado DO
              BEGIN
                  :novo_valor_desc   = 0;
                  :novo_valor_desc2  = 0;
                  :novo_quantidade   = :antiga_quantidade-new.quantidade;
                  :novo_valor_total  = CAST((:valor_unitario*NEW.QUANTIDADE) AS NUMERIC(15,2));
                  :novo_valor_total2 = CAST((:valor_unitario*:novo_quantidade) AS NUMERIC(15,2));
                  if(:base_desconto > 0)THEN
                  BEGIN
                     :novo_valor_desc = FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(:base_desconto,100.00,'/'),:novo_valor_total,'*',2);--CAST(((:base_desconto/100.00)*:novo_valor_total) AS NUMERIC(15,2));
                  END

                  IF(:base_desconto > 0)THEN
                  BEGIN
                       :novo_valor_desc2 = FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(:base_desconto,100.00,'/'),:novo_valor_total2,'*',2);
                  END

                  if(:saldo_item <= 0) then
                  begin
                    EXCEPTION "..." '<h4>ATENCAO</h4>PRE-PEDIDO: '||:fprepedido||',ITEM SEQ.'||:fsequencia||'<BR> PRODUTO: <br> <strong>'||:DESC_PRODUTO||' '||:TAM_DESCRICAO||' COM SALDO NEGATIVO!<BR>OPERACAO CANCELADA!</strong>';
                  end

                  IF(NEW.ID IS NULL) THEN
                  BEGIN
                    NEW.ID = GEN_ID(GTBPDV_CONFERENCIA_TROCA_ITEM,1);
                  END

                  IF(:saldo_item <> NEW.QUANTIDADE)THEN
                  BEGIN
                      :pre_pedido_item_id = GEN_ID(GTBPDV_CONFERENCIA_ITEM,1);
                      /*INSERIR QUANTIDADE DA DEVOLUCAO COMO ENCERRADA*/
                      INSERT INTO TBPDV_CONFERENCIA_ITEM(
                             ID
                            ,PDV_CONFERENCIA_ID
                            ,SEQUENCIA
                            ,PRODUTO_ID
                            ,PRODUTO_DESCRICAO
                            ,TAM_DESCRICAO
                            ,EAN
                            ,QUANTIDADE
                            ,VALOR_UNITARIO
                            ,VALOR_DESCONTO
                            ,VALOR_TOTAL
                            ,VALOR_LIQUIDO
                            ,DATAHORA
                            ,SITUACAO
                            ,OFFLINE_ID
                            ,TAMANHO
                            ,QTD_ESTOQUE
                            ,MODELO_ID
                            ,MODELO_DESCRICAO
                            ,COR_ID
                            ,COR_DESCRICAO
                            ,PDV_CONFERENCIA_TROCA_ITEM_ID)
                            SELECT 
                                :pre_pedido_item_id AS ID
                                ,A.PDV_CONFERENCIA_ID
                                ,(COALESCE((SELECT MAX(B.SEQUENCIA) FROM TBPDV_CONFERENCIA_ITEM B WHERE B.pdv_conferencia_id = A.PDV_CONFERENCIA_ID),0)+1) AS SEQUENCIA
                                ,A.PRODUTO_ID
                                ,A.PRODUTO_DESCRICAO
                                ,A.TAM_DESCRICAO
                                ,A.EAN
                                ,NEW.QUANTIDADE AS QUANTIDADE
                                ,A.VALOR_UNITARIO
                                ,:novo_valor_desc AS VALOR_DESCONTO
                                ,:novo_valor_total AS VALOR_TOTAL
                                ,CAST((:novo_valor_total - :novo_valor_desc) AS NUMERIC(15,2)) AS VALOR_LIQUIDO
                                ,A.DATAHORA
                                ,4 AS SITUACAO
                                ,A.OFFLINE_ID
                                ,A.TAMANHO
                                ,0 AS QTD_ESTOQUE
                                ,A.MODELO_ID
                                ,A.MODELO_DESCRICAO
                                ,A.COR_ID
                                ,A.COR_DESCRICAO
                                ,NEW.ID AS PDV_CONFERENCIA_TROCA_ITEM_ID
    
                                FROM TBPDV_CONFERENCIA_ITEM A
                                WHERE A.ID = NEW.pre_pedido_item_id;

                       /*ATUALIZAR SALDO E QUANTIDADE DO ITEM ORIGINAL*/

                       if(:quantidade_alocado > 0)then
                        begin
                            NEW.PRE_PEDIDO_ITEM_ALOCADO = 1;
                            EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, NEW.pre_pedido_item_id, 'D');
                        end

                       UPDATE tbpdv_conferencia_item B
                        SET B.quantidade     = :novo_quantidade,
                            B.VALOR_TOTAL    = :novo_valor_total2,
                            B.VALOR_LIQUIDO  = CAST(((:novo_valor_total2)-:novo_valor_desc2) AS NUMERIC(15,2)),
                            B.VALOR_DESCONTO = :novo_valor_desc2

                          WHERE B.ID = NEW.pre_pedido_item_id;

                       UPDATE tbpdv_conferencia_item_saldo B SET B.quantidade = (:saldo_item-NEW.quantidade)
                          WHERE B.pdv_conferencia_item_id = NEW.pre_pedido_item_id;

                          
                       if(:quantidade_alocado > 0)then
                       begin
                            EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, NEW.pre_pedido_item_id, 'A');
                       end


                   END ELSE
                   BEGIN
                       /*SE QUANTIDADE DEVOLVIDA FOR IGUAL AO SALDO E O ITEM NAO POSSUIR SALDO UTILIZADO*/
                      if(:antiga_quantidade = :saldo_item)then
                      begin
                      
                        if(:quantidade_alocado > 0)then
                        begin
                            NEW.PRE_PEDIDO_ITEM_ALOCADO = 1;
                            EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, NEW.pre_pedido_item_id, 'D');
                        end

                         update tbpdv_conferencia_item B set b.situacao = 4 where b.id = new.pre_pedido_item_id;

                        
                        /*if(:quantidade_alocado > 0)then
                        begin
                            EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, NEW.pre_pedido_item_id, 'A');
                        end*/
                      end else
                      begin
                         /*SE QUANTIDADE DEVOLVIDA FOR IGUAL AO SALDO E O ITEM POSSUIR SALDO UTILIZADO*/
                         
                          if(:quantidade_alocado > 0)then
                          begin
                            NEW.PRE_PEDIDO_ITEM_ALOCADO = 1;
                            EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, NEW.pre_pedido_item_id, 'D');
                          end

                          UPDATE tbpdv_conferencia_item B
                            SET B.quantidade     = :novo_quantidade,
                                B.VALOR_TOTAL    = :novo_valor_total2,
                                B.VALOR_LIQUIDO  = CAST(((:novo_valor_total2)-:novo_valor_desc2) AS NUMERIC(15,2)),
                                B.VALOR_DESCONTO = :novo_valor_desc2
    
                              WHERE B.ID = NEW.pre_pedido_item_id;
    
                           UPDATE tbpdv_conferencia_item_saldo B SET B.quantidade = (:saldo_item-NEW.quantidade)
                              WHERE B.pdv_conferencia_item_id = NEW.pre_pedido_item_id;

                         if(:quantidade_alocado > 0)then
                         begin
                            EXECUTE PROCEDURE SPU_CONFERENCIA_ESTOQUE(:pdv_conferencia_id, NEW.pre_pedido_item_id, 'A');
                         end
                      end

                   END
              END
  END
END^

CREATE OR ALTER trigger ttbpdv_devolucao_troca_item_b0i for tbpdv_devolucao_troca_item
active before insert position 0
AS
declare variable ITEM_EXISTENTE INTEGER;
declare variable verifica_pre_pedido INTEGER;
begin
    ITEM_EXISTENTE = COALESCE((SELECT FIRST 1 A.ID FROM TBPDV_DEVOLUCAO_TROCA_ITEM A
                               WHERE A.ITEM_SEQUENCIA     = NEW.ITEM_SEQUENCIA
                               AND A.ITEM_ID            = NEW.ITEM_ID
                               AND A.DOCUMENTO_CONTROLE = NEW.DOCUMENTO_CONTROLE
                               AND A.TIPO_DOCUMENTO     = NEW.TIPO_DOCUMENTO
                               AND A.ID                <> NEW.ID
                               and a.PDV_DEVOLUCAO_ID   = new.PDV_DEVOLUCAO_ID),0);

    IF(ITEM_EXISTENTE > 0)THEN
    BEGIN
       EXCEPTION "..." 'ITEM SEQ.'||FN_LPAD(NEW.ITEM_SEQUENCIA,3,0)||
                        IIF(NEW.TIPO_DOCUMENTO = '1',COALESCE((SELECT FIRST 1 'NF.'||FN_LPAD(B.NUMERO_NOTAFISCAL,7,0)||', SERIE:'||FN_LPAD(B.SERIE,3,0)||', DT.EMISSAO:'||FN_DATE(B.DATA_EMISSAO,'DD/MM/YYYY') FROM TBNFS B, TBNFS_ITEM C WHERE B.CONTROLE = C.NFS_CONTROLE AND C.CONTROLE = NEW.ITEM_ID),''),
                        COALESCE((SELECT FIRST 1 'CF.'||FN_LPAD(D.NUMERO_CFE,6,0)||', SERIE:'||FN_LPAD(D.SERIE,3,0)||', DT.EMISSAO:'||FN_DATE(D.DATA_EMISSAO,'DD/MM/YYYY') FROM TBPDV_CFE D, TBPDV_CFE_ITEM E WHERE D.ID = E.PDV_CFE_ID AND E.ID = NEW.ITEM_ID),''))
                        ||'<BR>'||IIF(NEW.TIPO_DOCUMENTO = '1',COALESCE((SELECT FIRST 1 'PRODUTO: '||FN_LPAD(P.CODIGO,6,0)||' - '||P.DESCRICAO FROM TBNFS_ITEM C, TBPRODUTO P WHERE P.CODIGO = C.PRODUTO_CODIGO AND C.CONTROLE = NEW.ITEM_ID),''),
                        COALESCE((SELECT FIRST 1 'PRODUTO: '||FN_LPAD(P.CODIGO,6,0)||' - '||P.DESCRICAO FROM TBPDV_CFE_ITEM E, TBPRODUTO P WHERE P.CODIGO = e.PRODUTO_ID AND E.ID = NEW.ITEM_ID),''))||'<BR> VALOR R$ '||COALESCE((NEW.QUANTIDADE*NEW.VALOR_UNITARIO),0.00)||' <BR> JA EXISTENTE NESTA DEVOLUCAO, INCLUSAO CANCELADA.';
    END

    if(new.pdv_devolucao_id > 0)then
      begin
        verifica_pre_pedido = coalesce((SELECT FIRST 1 A.PRE_PEDIDO_ID FROM tbpdv_DEVOLUCAO_TROCA A WHERE A.pre_pedido_id > 0 AND A.id = NEW.pdv_devolucao_id),0);
        IF(verifica_pre_pedido > 0)THEN
        BEGIN
           EXCEPTION "..." 'EXISTEM PRE-PEDIDOS VINCULADOS A ESTE REGISTRO DE TROCA, INCLUSAO DE ITENS CANCELADA!';
        END
      end

    IF(NEW.ID IS NULL) THEN
    BEGIN
      NEW.ID = GEN_ID(GTBPDV_DEVOLUCAO_TROCA_ITEM,1);
    END
END^

^ SET TERM ; ^