/* Procedure na ThaisFerreira - PROCEDURE_TESTE_REAJUSTE */

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

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_LIST_ID varchar(5000);
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,
            LIST(A.ID) AS LIST_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_LIST_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
                AND A.ID IN (
                    SELECT
                        SP.OSPLIT AS ID
                    FROM SPLIT_V2(:AJ_LIST_ID, ',') SP
                )
        
            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

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

--            IF (:AJ_PRODUTO_ID = 15395 AND :AJ_TAMANHO = 7) THEN
--            BEGIN
--                EXCEPTION "..." ' QTD.TOTAL: '|| :AJ_QTD_TOTAL ||' | QTD.SALDO: '|| :AJ_SALDO_TOTAL ||'';
--            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 ; ^

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

SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_det_alocacao_b1i_01 for tbestoque_detalhe_alocacao
active before insert position 1
AS
declare variable HISTORICO VARCHAR(500);
declare variable QUANTIDADE_SALDO numeric(15,4);
begin

    HISTORICO = '';

  UPDATE OR insert into tbestoque_saldo_alocacao (
  estabelecimento_id, localizacao_id, produto_id, tamanho)
  values (NEW.estabelecimento_id,
          NEW.localizacao_id,
          NEW.produto_id,
          NEW.tamanho);

  :QUANTIDADE_SALDO = IIF(NEW.SALDO > 0 AND NEW.SALDO < NEW.QUANTIDADE, NEW.SALDO, NEW.QUANTIDADE);

  UPDATE tbestoque_saldo_alocacao set
  Quantidade = Quantidade + :QUANTIDADE_SALDO
  Where Estabelecimento_Id = NEW.Estabelecimento_Id
    and Localizacao_Id = NEW.Localizacao_id
    and Produto_Id = NEW.Produto_Id
    and Tamanho = NEW.Tamanho;

    if (New.Tipo = 'P') then
        Begin
        UPDATE tbpedido_item set
        Qtd_Est = Qtd_Est + New.Saldo
          Where Estabelecimento_Codigo = NEW.Estabelecimento_Id
            and Pedido = NEW.Tabela_Id
            and Controle = NEW.Tab_Item_Id
            and Produto_Codigo = NEW.Produto_Id
            and Tamanho = NEW.Tamanho;

          HISTORICO = 'ALOC.EST. PED/ITEM:'||NEW.Tabela_Id||'/'||NEW.Tab_item_Id||' QTD/TAM/LOC.'||TRUNC(NEW.SALDO)||'/'||NEW.TAMANHO||'/'||NEW.LOCALIZACAO_ID;
        End

   if (New.Tipo = 'O') then
        Begin
        UPDATE tbpdv_conferencia_item set
        QTD_ESTOQUE = QTD_ESTOQUE + New.Saldo
          Where id = NEW.Tab_Item_Id;

          HISTORICO = 'ALOC.EST. PRE PED/ITEM:'||NEW.Tabela_Id||'/'||NEW.Tab_item_Id||' QTD/TAM/LOC.'||TRUNC(NEW.SALDO)||'/'||NEW.TAMANHO||'/'||NEW.LOCALIZACAO_ID;
        End

   if (HISTORICO <> '') Then
       Begin
       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPRODUTO_ALOCADO', NEW.PRODUTO_ID,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);

       INSERT INTO TBHISTORICO (
       TABELA, TABELA_ID, USUARIO, IP, HISTORICO) VALUES (
      'TBPEDIDO_ALOCADO', NEW.Tabela_Id,
      (Select First 1 MON$USER from mon$attachments where mon$attachment_id = current_connection),
      (Select First 1 MON$REMOTE_ADDRESS from mon$attachments where mon$attachment_id = current_connection),
       :Historico);
       End

End
^

SET TERM ; ^

