/******************************************************************************/
/****              Generated by IBExpert 24/08/2022 08:19:30               ****/
/******************************************************************************/

/******************************************************************************/
/****     Following SET SQL DIALECT is just for the Database Comparer      ****/
/******************************************************************************/
SET SQL DIALECT 3;


/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/


CREATE GENERATOR GTBPDV_CONFERENCIA_TROCA;

CREATE TABLE TBPDV_CONFERENCIA_TROCA (
    ID                 INTEGER NOT NULL,
    CLIENTE_ID         INTEGER,
	COLABORADOR_ID 	   INTEGER,
    ESTABELECIMENTO_ID INTEGER,
    DATAHORA           TIMESTAMP DEFAULT 'NOW',
    USUARIO_ID         INTEGER DEFAULT 0
);

CREATE GENERATOR GTBPDV_CONFERENCIA_TROCA_ITEM;

CREATE TABLE TBPDV_CONFERENCIA_TROCA_ITEM (
    ID                       INTEGER NOT NULL,
    PDV_CONFERENCIA_TROCA_ID INTEGER NOT NULL,
    PRE_PEDIDO_ID            INTEGER NOT NULL,
    PRE_PEDIDO_ITEM_ID       INTEGER NOT NULL,
    QUANTIDADE               NUMERIC(15,2),
    DATAHORA                 TIMESTAMP DEFAULT 'NOW'
);


/******************************************************************************/
/****                             Primary keys                             ****/
/******************************************************************************/

ALTER TABLE TBPDV_CONFERENCIA_TROCA ADD CONSTRAINT PK_TBPDV_CONFERENCIA_TROCA PRIMARY KEY (ID);

ALTER TABLE TBPDV_CONFERENCIA_TROCA_ITEM ADD CONSTRAINT PK_TBPDV_CONFERENCIA_TROCA_ITEM PRIMARY KEY (ID);


/******************************************************************************/
/****                               Indices                                ****/
/******************************************************************************/

CREATE INDEX ITBPDV_CONFERENCIA_TROCA_02I ON TBPDV_CONFERENCIA_TROCA (DATAHORA, CLIENTE_ID, ESTABELECIMENTO_ID);
CREATE INDEX ITBPDV_CONFERENCIA_TROCA_03I ON TBPDV_CONFERENCIA_TROCA (CLIENTE_ID);
CREATE INDEX ITBPDV_CONFERENCIA_TROCA_04I ON TBPDV_CONFERENCIA_TROCA (ESTABELECIMENTO_ID);
CREATE INDEX ITBPDV_CONFERENCIA_TROCA_05I ON TBPDV_CONFERENCIA_TROCA (DATAHORA);

CREATE INDEX ITBPDV_CONF_TROCA_ITEM_02I ON TBPDV_CONFERENCIA_TROCA_ITEM (PDV_CONFERENCIA_TROCA_ID);
CREATE INDEX ITBPDV_CONF_TROCA_ITEM_03I ON TBPDV_CONFERENCIA_TROCA_ITEM (PRE_PEDIDO_ID);
CREATE INDEX ITBPDV_CONF_TROCA_ITEM_04I ON TBPDV_CONFERENCIA_TROCA_ITEM (PRE_PEDIDO_ITEM_ID);
CREATE INDEX ITBPDV_CONF_TROCA_ITEM_05I ON TBPDV_CONFERENCIA_TROCA_ITEM (DATAHORA);

/******************************************************************************/
/****                               Triggers                               ****/
/******************************************************************************/



SET TERM ^ ;



/******************************************************************************/
/****                         Triggers for tables                          ****/
/******************************************************************************/



/* Trigger: TTBPDV_CONFERENCIA_TROCA_B01D */
CREATE OR ALTER TRIGGER TTBPDV_CONFERENCIA_TROCA_B01D FOR TBPDV_CONFERENCIA_TROCA
ACTIVE BEFORE DELETE POSITION 3
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';
    IF(OLD.ID > 0)THEN
    BEGIN
        HISTORICO = 'REGISTRO EXCLUIDO.';
    END

    IF(HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBPDV_CONFERENCIA_TROCA', OLD.ID, HISTORICO);
    END
END
^

/* Trigger: TTBPDV_CONFERENCIA_TROCA_B01U */
CREATE OR ALTER TRIGGER TTBPDV_CONFERENCIA_TROCA_B01U FOR TBPDV_CONFERENCIA_TROCA
ACTIVE BEFORE UPDATE POSITION 3
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN
  HISTORICO = '';

  IF(NEW.ESTABELECIMENTO_ID <> OLD.ESTABELECIMENTO_ID) THEN
  BEGIN
     HISTORICO = HISTORICO||' ESTAB:'||OLD.ESTABELECIMENTO_ID||'->'||NEW.ESTABELECIMENTO_ID;
  END 

  IF(NEW.CLIENTE_ID         <> OLD.CLIENTE_ID) THEN
  BEGIN
     HISTORICO = HISTORICO||' CLIENTE:'||OLD.CLIENTE_ID||'->'||NEW.CLIENTE_ID;
  END 

  IF(NEW.COLABORADOR_ID     <> OLD.COLABORADOR_ID) THEN
  BEGIN
     HISTORICO = HISTORICO||' COLAB:'||OLD.COLABORADOR_ID||'->'||NEW.COLABORADOR_ID;
  END 
    
  IF(HISTORICO <> '') THEN
  BEGIN
     HISTORICO = 'REGISTRO ALTERADO: '||HISTORICO;
     EXECUTE PROCEDURE SPI_HISTORICO('TBPDV_CONFERENCIA_TROCA', OLD.ID, FN_ELIPSES(HISTORICO,500));
  END
END
^


/* Trigger: TTBPDV_CONFERENCIA_TROCA_B02D */
CREATE OR ALTER TRIGGER TTBPDV_CONFERENCIA_TROCA_B02D FOR TBPDV_CONFERENCIA_TROCA
ACTIVE BEFORE DELETE POSITION 5
AS
begin
  IF(OLD.ID > 0)THEN
  BEGIN
     DELETE FROM TBPDV_CONFERENCIA_TROCA_ITEM WHERE PDV_CONFERENCIA_TROCA_ID = OLD.ID;
  END
end
^


/* Trigger: TTBPDV_CONFERENCIA_TROCA_B02I */
CREATE OR ALTER TRIGGER TTBPDV_CONFERENCIA_TROCA_B02I FOR TBPDV_CONFERENCIA_TROCA
ACTIVE BEFORE INSERT POSITION 3
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';
    IF(NEW.ID > 0)THEN
    BEGIN
        HISTORICO = 'REGISTRO INCLUIDO.';
    END

    IF(HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBPDV_CONFERENCIA_TROCA', NEW.ID, HISTORICO);
    END
END
^
/* Trigger: TTBPDV_CONFERENCIA_TROCA_B0I */
CREATE OR ALTER TRIGGER TTBPDV_CONFERENCIA_TROCA_B0I FOR TBPDV_CONFERENCIA_TROCA
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF(NEW.USUARIO_ID = 0) THEN
  BEGIN
     NEW.USUARIO_ID = FN_CURRENT_USER_ID();
  END

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

ALTER TABLE TBPDV_CONFERENCIA_ITEM
ADD QUANTIDADE_ORIGINAL NUMERIC(15,2)^

ALTER TRIGGER TTBPDV_CONFERENCIA_ITEM_B99IUD INACTIVE^
ALTER TRIGGER TTBPDV_CONFERENCIA_ITEM_B03IU  INACTIVE^

UPDATE TBPDV_CONFERENCIA_ITEM A
    SET A.QUANTIDADE_ORIGINAL = A.QUANTIDADE
    WHERE A.QUANTIDADE_ORIGINAL IS NULL^

ALTER TRIGGER TTBPDV_CONFERENCIA_ITEM_B99IUD ACTIVE^
ALTER TRIGGER TTBPDV_CONFERENCIA_ITEM_B03IU  ACTIVE^

CREATE OR ALTER TRIGGER TTBPDV_CONFERENCIA_ITEM_B01I FOR TBPDV_CONFERENCIA_ITEM
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
  BEGIN
    NEW.ID = GEN_ID(GTBPDV_CONFERENCIA_ITEM,1);
  END
  IF (NEW.QUANTIDADE_ORIGINAL IS NULL) THEN
  BEGIN
    NEW.QUANTIDADE_ORIGINAL = NEW.QUANTIDADE;
  END
END^

/* Trigger: TTBPDV_CONFERENCIA_TROCA_B0I */
CREATE OR ALTER TRIGGER TTBPDV_CONF_TROCA_ITEM_B0I FOR TBPDV_CONFERENCIA_TROCA_ITEM
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE PRE_PEDIDO_ID      INTEGER;
DECLARE VARIABLE PRE_PEDIDO_ITEM_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);

BEGIN

  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

            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 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*/


                       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;
                   END ELSE
                   BEGIN
                       /*SE QUANTIDADE DEVOLVIDA FOR IGUAL AO SALDO E O ITEM NAO POSSUIR SALDO UTILIZADO*/
                      IF(:ANTIGA_QUANTIDADE = :SALDO_ITEM)THEN
                      BEGIN
                         UPDATE TBPDV_CONFERENCIA_ITEM B SET B.SITUACAO = 4 WHERE B.ID = NEW.PRE_PEDIDO_ITEM_ID;
                      END ELSE
                      BEGIN
                         /*SE QUANTIDADE DEVOLVIDA FOR IGUAL AO SALDO E O ITEM POSSUIR SALDO UTILIZADO*/

                           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;

                      END

                   END
              END
  END
END
^

CREATE OR ALTER TRIGGER TBPDV_CONF_TROCA_ITEM_B01D FOR TBPDV_CONFERENCIA_TROCA_ITEM
ACTIVE BEFORE DELETE POSITION 0
AS
DECLARE VARIABLE ITEM_ENCERRADO_ID INTEGER;
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 VALOR_UNITARIO     NUMERIC(15,2);
DECLARE VARIABLE NOVO_VALOR_TOTAL   NUMERIC(15,2);
BEGIN
  IF(OLD.PRE_PEDIDO_ITEM_ID > 0)THEN
  BEGIN
       :ITEM_ENCERRADO_ID = COALESCE((SELECT FIRST 1 B.ID FROM TBPDV_CONFERENCIA_ITEM B WHERE B.PDV_CONFERENCIA_TROCA_ITEM_ID = OLD.ID),0);

       IF(:ITEM_ENCERRADO_ID > 0)THEN
       BEGIN
          DELETE FROM TBPDV_CONFERENCIA_ITEM B WHERE B.ID = :ITEM_ENCERRADO_ID;
       END

       FOR SELECT FIRST 1
            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_TOTAL

            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                 = OLD.PRE_PEDIDO_ITEM_ID
              INTO :ANTIGA_QUANTIDADE, :SALDO_ITEM, :BASE_DESCONTO, :VALOR_UNITARIO, :NOVO_VALOR_TOTAL DO
              BEGIN
                 :NOVO_VALOR_DESC  = 0;
                 :NOVO_QUANTIDADE  = :ANTIGA_QUANTIDADE+OLD.QUANTIDADE;
                 :NOVO_VALOR_TOTAL = (:NOVO_QUANTIDADE*:VALOR_UNITARIO);

                 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((:SALDO_ITEM+OLD.QUANTIDADE) = :ANTIGA_QUANTIDADE)THEN
                 BEGIN
                    UPDATE TBPDV_CONFERENCIA_ITEM B SET B.SITUACAO = 0 WHERE B.ID = OLD.PRE_PEDIDO_ITEM_ID;
                 END ELSE
                 BEGIN

                    UPDATE TBPDV_CONFERENCIA_ITEM B
                        SET B.QUANTIDADE     = :NOVO_QUANTIDADE,
                            B.VALOR_TOTAL    = :NOVO_VALOR_TOTAL,
                            B.VALOR_LIQUIDO  = (:NOVO_VALOR_TOTAL-:NOVO_VALOR_DESC),
                            B.VALOR_DESCONTO = :NOVO_VALOR_DESC

                       WHERE B.ID = OLD.PRE_PEDIDO_ITEM_ID;
        
                    UPDATE TBPDV_CONFERENCIA_ITEM_SALDO B SET B.QUANTIDADE = (:SALDO_ITEM+OLD.QUANTIDADE)
                       WHERE B.PDV_CONFERENCIA_ITEM_ID = OLD.PRE_PEDIDO_ITEM_ID;
                 END
              END
  END
END
^

CREATE OR ALTER TRIGGER TBPDV_CONF_TROCA_ITEM_B01U FOR TBPDV_CONFERENCIA_TROCA_ITEM
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE DIFF_QUANTIDADE       NUMERIC(15,2);
DECLARE VARIABLE NOVO_QUANTIDADE       NUMERIC(15,2);
DECLARE VARIABLE ANTIGA_QUANTIDADE     NUMERIC(15,2);
DECLARE VARIABLE QUANTIDADE_ORIGINAL   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 VALOR_UNITARIO        NUMERIC(15,2);
DECLARE VARIABLE NOVO_VALOR_TOTAL      NUMERIC(15,2);

DECLARE VARIABLE ITEM_ENCERRADO_ID     INTEGER;
DECLARE VARIABLE ITEM_ENCERRADO_QTD    NUMERIC(15,2);
DECLARE VARIABLE ITEM_QUANTIDADE       NUMERIC(15,2);
DECLARE VARIABLE ITEM_NOVA_QUANTIDADE  NUMERIC(15,2);
DECLARE VARIABLE ITEM_BASE_DESCONTO    NUMERIC(15,2);
DECLARE VARIABLE ITEM_VALOR_DESC       NUMERIC(15,2);
DECLARE VARIABLE ITEM_VALOR_UNITARIO   NUMERIC(15,2);
DECLARE VARIABLE ITEM_NOVO_VALOR_TOTAL NUMERIC(15,2);
BEGIN

  IF(OLD.QUANTIDADE <> NEW.QUANTIDADE AND NEW.PRE_PEDIDO_ITEM_ID > 0)THEN
  BEGIN
       :DIFF_QUANTIDADE   = (OLD.QUANTIDADE - NEW.QUANTIDADE);
       FOR SELECT FIRST 1
            A.QUANTIDADE,
            B.QUANTIDADE,
            A.QUANTIDADE_ORIGINAL,
            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_TOTAL,
            COALESCE((SELECT FIRST 1 B.ID FROM TBPDV_CONFERENCIA_ITEM B WHERE B.PDV_CONFERENCIA_TROCA_ITEM_ID = OLD.ID),0) AS ITEM_ENCERRADO_ID,
            COALESCE((SELECT FIRST 1 B.QUANTIDADE FROM TBPDV_CONFERENCIA_ITEM B WHERE B.PDV_CONFERENCIA_TROCA_ITEM_ID = OLD.ID),0) AS ITEM_ENCERRADO_QTD

            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                 = OLD.PRE_PEDIDO_ITEM_ID
              INTO :ANTIGA_QUANTIDADE, :SALDO_ITEM, :QUANTIDADE_ORIGINAL, :BASE_DESCONTO, :VALOR_UNITARIO, :NOVO_VALOR_TOTAL, :ITEM_ENCERRADO_ID, :ITEM_ENCERRADO_QTD DO
              BEGIN
                 :NOVO_VALOR_DESC      = 0;
                 :ITEM_NOVA_QUANTIDADE = 0;
                 :NOVO_QUANTIDADE      = :ANTIGA_QUANTIDADE+:DIFF_QUANTIDADE;
                 :NOVO_VALOR_TOTAL     = (:NOVO_QUANTIDADE*:VALOR_UNITARIO);
                 IF(:NOVO_QUANTIDADE <> :QUANTIDADE_ORIGINAL)THEN
                 BEGIN
                   :ITEM_NOVA_QUANTIDADE = :QUANTIDADE_ORIGINAL - :NOVO_QUANTIDADE;
                 END

                 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(:ITEM_ENCERRADO_ID > 0)THEN
                 BEGIN
                    DELETE FROM TBPDV_CONFERENCIA_ITEM B WHERE B.ID = :ITEM_ENCERRADO_ID;
                 END

                 UPDATE TBPDV_CONFERENCIA_ITEM B
                   SET B.QUANTIDADE     = :NOVO_QUANTIDADE,
                       B.VALOR_TOTAL    = :NOVO_VALOR_TOTAL,
                       B.VALOR_LIQUIDO  = (:NOVO_VALOR_TOTAL-:NOVO_VALOR_DESC),
                       B.VALOR_DESCONTO = :NOVO_VALOR_DESC

                   WHERE B.ID           = OLD.PRE_PEDIDO_ITEM_ID;
    
                 UPDATE TBPDV_CONFERENCIA_ITEM_SALDO B
                   SET B.QUANTIDADE              = (:SALDO_ITEM+:DIFF_QUANTIDADE)
                   WHERE B.PDV_CONFERENCIA_ITEM_ID = OLD.PRE_PEDIDO_ITEM_ID;

                 IF(:ITEM_NOVA_QUANTIDADE = 0)THEN
                 BEGIN
                    UPDATE TBPDV_CONFERENCIA_ITEM B
                      SET B.SITUACAO      = 4
                     WHERE B.ID           = OLD.PRE_PEDIDO_ITEM_ID;

                 END ELSE
                 BEGIN
                     :ITEM_VALOR_DESC       = 0;
                     :ITEM_NOVO_VALOR_TOTAL = (:ITEM_NOVA_QUANTIDADE*:VALOR_UNITARIO);
                     IF(:BASE_DESCONTO > 0)THEN
                     BEGIN
                        :ITEM_VALOR_DESC = FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(:BASE_DESCONTO,100.00,'/'),:ITEM_NOVO_VALOR_TOTAL,'*',2);--CAST(((:BASE_DESCONTO/100.00)*:NOVO_VALOR_TOTAL) AS NUMERIC(15,2));
                     END

                     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 
                                IIF(:ITEM_ENCERRADO_ID > 0,:ITEM_ENCERRADO_ID,GEN_ID(GTBPDV_CONFERENCIA_ITEM,1)) 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
                                ,:ITEM_NOVA_QUANTIDADE AS QUANTIDADE
                                ,A.VALOR_UNITARIO
                                ,:ITEM_VALOR_DESC AS VALOR_DESCONTO
                                ,:ITEM_NOVO_VALOR_TOTAL AS VALOR_TOTAL
                                ,CAST((:ITEM_NOVO_VALOR_TOTAL - :ITEM_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;

                 END


              END
  END
END^

ALTER TABLE TBPDV_CONFERENCIA_ITEM
ADD PDV_CONFERENCIA_TROCA_ITEM_ID INTEGER
DEFAULT 0 ^

CREATE OR ALTER TRIGGER TTBPDV_CONFERENCIA_ITEM_BIUD02 FOR TBPDV_CONFERENCIA_ITEM
ACTIVE BEFORE INSERT OR UPDATE OR DELETE POSITION 2
AS
BEGIN
    IF(INSERTING OR UPDATING) THEN
    BEGIN
        IF(INSERTING) THEN
        BEGIN
            UPDATE OR INSERT INTO TBPDV_CONFERENCIA_ITEM_SALDO (PDV_CONFERENCIA_ID, PDV_CONFERENCIA_ITEM_ID, TAMANHO, QUANTIDADE)
                VALUES (NEW.PDV_CONFERENCIA_ID, NEW.ID, NEW.TAMANHO,IIF(NEW.PDV_CONFERENCIA_TROCA_ITEM_ID > 0, 0.00, NEW.QUANTIDADE))
            MATCHING (PDV_CONFERENCIA_ID, PDV_CONFERENCIA_ITEM_ID);
        END ELSE
        BEGIN
            IF(OLD.QUANTIDADE <> NEW.QUANTIDADE) THEN
            BEGIN
                UPDATE OR INSERT INTO TBPDV_CONFERENCIA_ITEM_SALDO (PDV_CONFERENCIA_ID, PDV_CONFERENCIA_ITEM_ID, TAMANHO, QUANTIDADE)
                    VALUES (NEW.PDV_CONFERENCIA_ID, NEW.ID, NEW.TAMANHO, IIF(NEW.PDV_CONFERENCIA_TROCA_ITEM_ID > 0, 0.00, NEW.QUANTIDADE))
                MATCHING (PDV_CONFERENCIA_ID, PDV_CONFERENCIA_ITEM_ID);
            END

        END


    END ELSE
    BEGIN
        DELETE FROM TBPDV_CONFERENCIA_ITEM_SALDO T WHERE T.PDV_CONFERENCIA_ID = OLD.PDV_CONFERENCIA_ID AND T.PDV_CONFERENCIA_ITEM_ID = OLD.ID;
    END

END^

UPDATE OR INSERT INTO TBMENU (CONTROLE, GRUPO, SUBGRUPO, TIPO, URL, DESCRICAO, DATAHORA)
                      VALUES (19090, 'PDV', 'PDV', '1   ', '', 'REGISTRO DE TROCAS DE PRE-PEDIDOS', '2022-08-24 09:08:00')
                    MATCHING (CONTROLE)

^

SET TERM ; ^