ALTER TABLE TBESTOQUE_DETALHE_ALOCACAO
    ADD IGNORAR_BLOQUEIO INTEGER DEFAULT 0;
	
/**************************************************************************/

COMMENT ON COLUMN TBESTOQUE_DETALHE_ALOCACAO.IGNORAR_BLOQUEIO IS
'0 - NAO IGNORA AS TRIGGERS DE BLOQUEIO;
1 - IGNORAR AS TRIGGERS DE BLOQUEIO;';

/**************************************************************************/
/**************************************************************************/
/**************************************************************************/

SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_detalhe_aloc_b01iud for tbestoque_detalhe_alocacao
active before insert or update or delete position 0
AS
DECLARE VARIABLE CONFERENCIA VARCHAR(500);
DECLARE VARIABLE CONFERENCIA_STATUS INTEGER;
BEGIN

    IF (INSERTING) THEN
    BEGIN

        IF (COALESCE(OLD.IGNORAR_BLOQUEIO, 0) <> 1) THEN
        BEGIN

            IF (NEW.ESTOQUE_DETALHE_ID > 0) THEN
            BEGIN
    
                EXCEPTION "..." 'ESTOQUE VINCULADO A UMA COMANDA DE PEDIDO. INCLUSAO NAO AUTORIZADA!';
    
            END

        END

    END

    IF (UPDATING) THEN
    BEGIN
        
        IF (COALESCE(OLD.IGNORAR_BLOQUEIO, 0) <> 1) THEN
        BEGIN

            IF (OLD.ESTOQUE_DETALHE_ID <> NEW.ESTOQUE_DETALHE_ID AND OLD.ESTOQUE_DETALHE_ID > 0 AND NEW.ESTOQUE_DETALHE_ID > 0) THEN
            BEGIN
                IF ((OLD.SALDO <> NEW.SALDO) OR (OLD.ESTOQUE_DETALHE_ID <> NEW.ESTOQUE_DETALHE_ID)) THEN
                BEGIN
    
                END ELSE
                BEGIN
                    EXCEPTION "..." 'ESTOQUE VINCULADO A UMA COMANDA DE PEDIDO. ALTERACAO NAO AUTORIZADA!';
                END
            END
    
            CONFERENCIA             = COALESCE((SELECT FIRST 1 FN_LPAD(B.TABELA_ID, 8, '0')||'-'||FN_IS_EMPTY(B.SEQUENCIA) FROM TBCONFERENCIA_ITEM A INNER JOIN TBCONFERENCIA B ON B.ID = A.CONFERENCIA_ID WHERE A.TABELA_ITEM_ID = OLD.TAB_ITEM_ID AND B.TABELA = 'COM' AND B.TABELA_ID = OLD.ESTOQUE_DETALHE_ID), '');
            CONFERENCIA_STATUS      = COALESCE((SELECT FIRST 1 B.STATUS FROM TBCONFERENCIA_ITEM A INNER JOIN TBCONFERENCIA B ON B.ID = A.CONFERENCIA_ID WHERE A.TABELA_ITEM_ID = OLD.TAB_ITEM_ID AND B.TABELA = 'COM' AND B.TABELA_ID = OLD.ESTOQUE_DETALHE_ID), 0);
    
            IF (CONFERENCIA <> '') THEN
            BEGIN
    
                IF (CONFERENCIA_STATUS > 1) THEN
                BEGIN
                    IF (OLD.SALDO <> NEW.SALDO) THEN
                    BEGIN
        
                    END ELSE
                    BEGIN
                        EXCEPTION "..." 'CONFERENCIA '||CONFERENCIA||' FINALIZADA OU JA FATURADA. ALTERACAO NAO AUTORIZADA!';
                    END
                END
    
            END

        END

    END

    IF (DELETING) THEN
    BEGIN

        IF (COALESCE(OLD.IGNORAR_BLOQUEIO, 0) <> 1) THEN
        BEGIN

            IF (OLD.ESTOQUE_DETALHE_ID > 0) THEN
            BEGIN
    
                EXCEPTION "..." 'ESTOQUE VINCULADO A UMA COMANDA DE PEDIDO. EXCLUSAO NAO AUTORIZADA!';
    
            END
    
            CONFERENCIA             = COALESCE((SELECT FIRST 1 FN_LPAD(B.TABELA_ID, 8, '0')||'-'||FN_IS_EMPTY(B.SEQUENCIA) FROM TBCONFERENCIA_ITEM A INNER JOIN TBCONFERENCIA B ON B.ID = A.CONFERENCIA_ID WHERE A.TABELA_ITEM_ID = OLD.TAB_ITEM_ID AND B.TABELA = 'COM' AND B.TABELA_ID = OLD.ESTOQUE_DETALHE_ID), '');
            CONFERENCIA_STATUS      = COALESCE((SELECT FIRST 1 B.STATUS FROM TBCONFERENCIA_ITEM A INNER JOIN TBCONFERENCIA B ON B.ID = A.CONFERENCIA_ID WHERE A.TABELA_ITEM_ID = OLD.TAB_ITEM_ID AND B.TABELA = 'COM' AND B.TABELA_ID = OLD.ESTOQUE_DETALHE_ID), 0);
    
            IF (CONFERENCIA <> '') THEN
            BEGIN
                EXCEPTION "..." 'ITEM VINCULADO A CONFERENCIA '||CONFERENCIA||'. EXCLUSAO NAO AUTORIZADA!';
            END

        END

    END
END
^

SET TERM ; ^

/**************************************************************************/
/**************************************************************************/
/**************************************************************************/

SET TERM ^ ;

CREATE OR ALTER procedure SP_AJUSTE_ALOCACAO_CONF_COMANDA (
    COMANDA_ID integer)
as
declare variable AJ_ESTABELECIMENTO_ID integer;
declare variable AJ_LOCALIZACAO_ID integer;
declare variable AJ_TABELA_ID integer;
declare variable AJ_TAB_ITEM_ID integer;
declare variable AJ_COUNT_ID integer;
declare variable AJ_PRODUTO_ID integer;
declare variable AJ_TAMANHO integer;
declare variable AJ_QTD_TOTAL numeric(15,4);
declare variable AJ_TIPO char(1);
declare variable AJ_SALDO_TOTAL numeric(15,4);
declare variable AJ_TAMANHO_ITEM integer;
declare variable AJ_ESTOQUE_DETALHE_ID integer;
declare variable ESTABELECIMENTO_ID integer;
declare variable LOCALIZACAO_ID integer;
declare variable TABELA_ID integer;
declare variable TAB_ITEM_ID integer;
declare variable ID integer;
declare variable PRODUTO_ID integer;
declare variable TAMANHO integer;
declare variable QUANTIDADE numeric(15,4);
declare variable TIPO char(1);
declare variable SALDO numeric(15,4);
declare variable ALOCACAO_ID integer;
declare variable TAMANHO_ITEM integer;
declare variable DATAHORA timestamp;
declare variable ESTOQUE_DETALHE_ID integer;
declare variable NEW_EST_DET_ALOC_ID integer;
declare variable NEW_DADOS_BACKUP blob sub_type 1 segment size 80;
BEGIN

    FOR
        SELECT
            A.ESTABELECIMENTO_ID,
            A.LOCALIZACAO_ID,
            A.TABELA_ID,
            A.TAB_ITEM_ID,
            COUNT(A.ID) AS COUNT_ID,
            A.PRODUTO_ID,
            A.TAMANHO,
            SUM(A.QUANTIDADE) AS QTD_TOTAL,
            A.TIPO,
            SUM(A.SALDO) AS SALDO_TOTAL,
            A.TAMANHO_ITEM,
            A.ESTOQUE_DETALHE_ID
        
        FROM TBESTOQUE_DETALHE_ALOCACAO A
        INNER JOIN TBESTOQUE_DETALHE T ON T.ID = A.ESTOQUE_DETALHE_ID
        WHERE T.ID = :COMANDA_ID

        GROUP BY
            A.ESTABELECIMENTO_ID,
            A.LOCALIZACAO_ID,
            A.TABELA_ID,
            A.TAB_ITEM_ID,
            A.PRODUTO_ID,
            A.TAMANHO,
            A.TIPO,
            A.TAMANHO_ITEM,
            A.ESTOQUE_DETALHE_ID

    INTO
        :AJ_ESTABELECIMENTO_ID,
        :AJ_LOCALIZACAO_ID,
        :AJ_TABELA_ID,
        :AJ_TAB_ITEM_ID,
        :AJ_COUNT_ID,
        :AJ_PRODUTO_ID,
        :AJ_TAMANHO,
        :AJ_QTD_TOTAL,
        :AJ_TIPO,
        :AJ_SALDO_TOTAL,
        :AJ_TAMANHO_ITEM,
        :AJ_ESTOQUE_DETALHE_ID

    DO
    BEGIN

        IF (COALESCE(:AJ_COUNT_ID, 1) > 1) THEN
        BEGIN

            :NEW_EST_DET_ALOC_ID = GEN_ID(GTBESTOQUE_DETALHE_ALOCACAO, 1);

            /*////////////////////////////////////////////////////////////////*/
        
            FOR
                SELECT
                    A.ESTABELECIMENTO_ID,
                    A.LOCALIZACAO_ID,
                    A.TABELA_ID,
                    A.TAB_ITEM_ID,
                    A.ID,
                    A.PRODUTO_ID,
                    A.TAMANHO,
                    A.QUANTIDADE,
                    A.TIPO,
                    A.SALDO,
                    A.ALOCACAO_ID,
                    A.TAMANHO_ITEM,
                    A.DATAHORA,
                    A.ESTOQUE_DETALHE_ID
                
                FROM TBESTOQUE_DETALHE_ALOCACAO A
                INNER JOIN TBESTOQUE_DETALHE T ON T.ID = A.ESTOQUE_DETALHE_ID
                WHERE T.ID = :COMANDA_ID
        
            INTO
                :ESTABELECIMENTO_ID,
                :LOCALIZACAO_ID,
                :TABELA_ID,
                :TAB_ITEM_ID,
                :ID,
                :PRODUTO_ID,
                :TAMANHO,
                :QUANTIDADE,
                :TIPO,
                :SALDO,
                :ALOCACAO_ID,
                :TAMANHO_ITEM,
                :DATAHORA,
                :ESTOQUE_DETALHE_ID
        
            DO
            BEGIN
        
                :NEW_DADOS_BACKUP = FN_TO_JSON_V3(
                                        FN_TO_PAR_JSON_V3('ESTABELECIMENTO_ID', :ESTABELECIMENTO_ID),
                                        FN_TO_PAR_JSON_V3('LOCALIZACAO_ID', :LOCALIZACAO_ID),
                                        FN_TO_PAR_JSON_V3('TABELA_ID', :TABELA_ID),
                                        FN_TO_PAR_JSON_V3('TAB_ITEM_ID', :TAB_ITEM_ID),
                                        FN_TO_PAR_JSON_V3('ID', :ID),
                                        FN_TO_PAR_JSON_V3('PRODUTO_ID', :PRODUTO_ID),
                                        FN_TO_PAR_JSON_V3('TAMANHO', :TAMANHO),
                                        FN_TO_PAR_JSON_V3('QUANTIDADE', :QUANTIDADE),
                                        FN_TO_PAR_JSON_V3('TIPO', :TIPO),
                                        FN_TO_PAR_JSON_V3('SALDO', :SALDO),
                                        FN_TO_PAR_JSON_V3('ALOCACAO_ID', :ALOCACAO_ID),
                                        FN_TO_PAR_JSON_V3('TAMANHO_ITEM', :TAMANHO_ITEM),
                                        FN_TO_PAR_JSON_V3('DATAHORA', :DATAHORA),
                                        FN_TO_PAR_JSON_V3('ESTOQUE_DETALHE_ID', :ESTOQUE_DETALHE_ID)
                                        );
        
                EXECUTE PROCEDURE SPI_BACKUP('TBESTOQUE_DETALHE_ALOCACAO', :NEW_EST_DET_ALOC_ID, :NEW_DADOS_BACKUP);


                UPDATE TBESTOQUE_DETALHE_ALOCACAO
                    SET IGNORAR_BLOQUEIO = 1
                    WHERE ID = :ID
                    AND ESTOQUE_DETALHE_ID = :ESTOQUE_DETALHE_ID;

                DELETE FROM TBESTOQUE_DETALHE_ALOCACAO WHERE ID = :ID AND ESTOQUE_DETALHE_ID = :ESTOQUE_DETALHE_ID;
        
            END

            /*////////////////////////////////////////////////////////////////*/

            INSERT INTO TBESTOQUE_DETALHE_ALOCACAO (ESTABELECIMENTO_ID, LOCALIZACAO_ID, TABELA_ID, TAB_ITEM_ID, ID, PRODUTO_ID, TAMANHO, QUANTIDADE, TIPO, SALDO, ALOCACAO_ID, TAMANHO_ITEM, DATAHORA, ESTOQUE_DETALHE_ID)
                VALUES (:AJ_ESTABELECIMENTO_ID, :AJ_LOCALIZACAO_ID, :AJ_TABELA_ID, :AJ_TAB_ITEM_ID, :NEW_EST_DET_ALOC_ID, :AJ_PRODUTO_ID, :AJ_TAMANHO, :AJ_QTD_TOTAL, :AJ_TIPO, :AJ_SALDO_TOTAL, 0, :AJ_TAMANHO_ITEM, CURRENT_TIMESTAMP, 0);

            UPDATE TBESTOQUE_DETALHE_ALOCACAO
                SET ESTOQUE_DETALHE_ID = :AJ_ESTOQUE_DETALHE_ID
                WHERE ID = :NEW_EST_DET_ALOC_ID;

        END
    END
END
^

SET TERM ; ^

