ALTER TABLE TBPEDIDO
ADD CUPOM_CODIGO VARCHAR(20) CHARACTER SET UTF8 
COLLATE UTF8;

CREATE INDEX ITBPEDIDO_21
ON TBPEDIDO (CUPOM_CODIGO);

CREATE OR ALTER TRIGGER TTBPEDIDO_B16U FOR TBPEDIDO
ACTIVE BEFORE UPDATE POSITION 15
AS
DECLARE VARIABLE STATUS_CUPOM     VARCHAR(1);
DECLARE VARIABLE CUPOM_USADO      INTEGER;
DECLARE VARIABLE CONTROLE         INTEGER;
DECLARE VARIABLE DESCONTO_FAMILIA NUMERIC(10,5);
DECLARE VARIABLE DESCONTO_GERAL   NUMERIC(10,5);
BEGIN
     IF(NEW.CUPOM_CODIGO <> '' AND NEW.CUPOM_CODIGO IS NOT NULL) THEN
     BEGIN
         CUPOM_USADO = COALESCE((SELECT FIRST 1 PEDIDO FROM TBPEDIDO WHERE CUPOM_CODIGO = NEW.CUPOM_CODIGO AND PEDIDO <> NEW.PEDIDO),0);
         IF(:CUPOM_USADO > 0)THEN
         BEGIN
            EXCEPTION "..." 'CUPOM JÁ UTILIZADO NO PEDIDO '||:CUPOM_USADO||'. OPERAÇÃO CANCELADA.';
         END
         ELSE
         BEGIN
            UPDATE TBPEDIDO_CUPOM SET STATUS = 0 WHERE CUPOM_CODIGO = NEW.CUPOM_CODIGO;

            FOR
            SELECT A.CONTROLE,
               COALESCE((SELECT FIRST 1 E.PERCENTUAL_DESCONTO FROM TBPEDIDO_CUPOM_ITEM E
               WHERE E.FAMILIA_ID = D.FAMILIA_CODIGO
               AND E.PEDIDO_CUPOM_ID = (SELECT F.ID FROM TBPEDIDO_CUPOM F WHERE F.CUPOM_CODIGO = NEW.CUPOM_CODIGO)),0) DESCONTO_FAMILIA,
               COALESCE((SELECT FIRST 1 E.PERCENTUAL_DESCONTO FROM TBPEDIDO_CUPOM_ITEM E
               WHERE E.PEDIDO_CUPOM_ID = (SELECT F.ID FROM TBPEDIDO_CUPOM F WHERE F.CUPOM_CODIGO = NEW.CUPOM_CODIGO)),0) DESCONTO_GERAL
               FROM TBPEDIDO_ITEM A
               LEFT JOIN TBPRODUTO D ON D.CODIGO = A.PRODUTO_CODIGO
               WHERE A.PEDIDO = NEW.PEDIDO INTO :CONTROLE, :DESCONTO_FAMILIA, :DESCONTO_GERAL DO
               BEGIN
                  IF(:DESCONTO_FAMILIA > 0)THEN
                  BEGIN
                     UPDATE TBPEDIDO_ITEM B
                       SET B.VALOR_DESCONTO  = FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(B.VALOR,B.QUANTIDADE,'*'),:DESCONTO_FAMILIA,'*'),
                       B.PERCENTUAL_DESCONTO = FN_CALC_PRECISION_V2(100,:DESCONTO_FAMILIA,'*')
                       WHERE B.CONTROLE = :CONTROLE;
                  END
                  IF(:DESCONTO_GERAL > 0)THEN
                  BEGIN
                     UPDATE TBPEDIDO_ITEM B
                       SET B.VALOR_DESCONTO  = FN_CALC_PRECISION_V2(FN_CALC_PRECISION_V2(B.VALOR,B.QUANTIDADE,'*'),:DESCONTO_GERAL,'*'),
                       B.PERCENTUAL_DESCONTO = FN_CALC_PRECISION_V2(100,:DESCONTO_GERAL,'*')
                       WHERE B.CONTROLE = :CONTROLE;
                  END

               END
         END
     END
END;

CREATE INDEX ITBPEDIDO_CUPOM_ITEM_01
ON TBPEDIDO_CUPOM_ITEM (FAMILIA_ID);

CREATE OR ALTER TRIGGER TTBPEDIDO_CUPOM_B01U FOR TBPEDIDO_CUPOM
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(5000);
DECLARE VARIABLE PEDIDO INTEGER;
BEGIN
    
    HISTORICO = '';

    PEDIDO  = COALESCE((SELECT FIRST 1 A.PEDIDO FROM TBPEDIDO A WHERE A.CUPOM_CODIGO = OLD.CUPOM_CODIGO), 0);

    IF (OLD.STATUS = 0 AND NEW.STATUS = 1 AND PEDIDO > 0) THEN
    BEGIN
        EXCEPTION "..." 'CUPOM JÁ UTILIZADO NO PEDIDO '||PEDIDO||'. OPERAÇÃO CANCELADA.';
    END

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

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

    IF (OLD.DATA_REGISTRO <> NEW.DATA_REGISTRO) THEN
    BEGIN
        HISTORICO = HISTORICO||' DT.REG:'||FORMATDATE(OLD.DATA_REGISTRO)||'->'||FORMATDATE(NEW.DATA_REGISTRO);
    END

    IF (OLD.DATA_VALIDADE <> NEW.DATA_VALIDADE) THEN
    BEGIN
        HISTORICO = HISTORICO||' DT.VALID:'||FORMATDATE(OLD.DATA_VALIDADE)||'->'||FORMATDATE(NEW.DATA_VALIDADE);
    END

    IF (OLD.CUPOM_CODIGO <> NEW.CUPOM_CODIGO) THEN
    BEGIN
        HISTORICO = HISTORICO||' COD.CUPOM:'||FORMATDATE(OLD.CUPOM_CODIGO)||'->'||FORMATDATE(NEW.CUPOM_CODIGO);
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        HISTORICO = 'REGISTRO ALTERADO:'||HISTORICO;
        EXECUTE PROCEDURE SPI_HISTORICO('TBPEDIDO_CUPOM', OLD.ID, FN_ELIPSE(HISTORICO, 500));
    END
END;

CREATE OR ALTER TRIGGER TTBPEDIDO_CUPOM_B01D FOR TBPEDIDO_CUPOM
ACTIVE BEFORE DELETE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE PEDIDO INTEGER;
BEGIN
    
    HISTORICO = '';

    PEDIDO  = COALESCE((SELECT FIRST 1 A.PEDIDO FROM TBPEDIDO A WHERE A.CUPOM_CODIGO = OLD.CUPOM_CODIGO), 0);

    IF (OLD.STATUS = 0 AND PEDIDO > 0) THEN
    BEGIN
        EXCEPTION "..." 'CUPOM JÁ UTILIZADO NO PEDIDO '||PEDIDO||'. OPERAÇÃO CANCELADA.';
    END

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

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