SET TERM ^ ;

CREATE OR ALTER procedure SPI_ESTOQUE_TRANSACAO (
    TABELA varchar(32),
    TABELA_NIVEL integer,
    TABELA_ID integer,
    ESTABELECIMENTO_ID integer,
    LOCALIZACAO_ID integer,
    DATA date,
    PRODUTO_ID integer,
    TAMANHO integer,
    QUANTIDADE numeric(10,5),
    TIPO char(1),
    OPERACAO varchar(3),
    CONSUMO char(1),
    CCUSTO varchar(10),
    OBSERVACAO varchar(100),
    TRANSACAO_ID integer = null,
    DOCUMENTO integer = null,
    TALAO integer = null,
    REGRA_ID integer = null,
    CONFERENCIA integer = 0,
    PECA_ID varchar(100) = '0',
    NFS_ITEM_CONTROLE integer = 0,
    NFE_ITEM_CONTROLE integer = 0,
    OPERADOR_ID integer = 0,
    REVISAO_ID INTEGER = 0)
as
declare variable USUARIO_ID integer;
declare variable T01 numeric(10,5);
declare variable T02 numeric(10,5);
declare variable T03 numeric(10,5);
declare variable T04 numeric(10,5);
declare variable T05 numeric(10,5);
declare variable T06 numeric(10,5);
declare variable T07 numeric(10,5);
declare variable T08 numeric(10,5);
declare variable T09 numeric(10,5);
declare variable T10 numeric(10,5);
declare variable T11 numeric(10,5);
declare variable T12 numeric(10,5);
declare variable T13 numeric(10,5);
declare variable T14 numeric(10,5);
declare variable T15 numeric(10,5);
declare variable T16 numeric(10,5);
declare variable T17 numeric(10,5);
declare variable T18 numeric(10,5);
declare variable T19 numeric(10,5);
declare variable T20 numeric(10,5);
BEGIN

    USUARIO_ID = COALESCE((SELECT FIRST 1 CODIGO FROM TBUSUARIO U WHERE U.USUARIO = CURRENT_USER),0);

    IF ( COALESCE(TRANSACAO_ID,0) = 0 ) THEN
    BEGIN
        TRANSACAO_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
    END

    IF ( COALESCE(TABELA,'') = '' ) THEN
    BEGIN
        EXCEPTION "..." 'TABELA DEVE SER INFORMADA';
    END
    IF ( COALESCE(TABELA_NIVEL,-1) <= -1 ) THEN
    BEGIN
        EXCEPTION "..." 'TABELA NIVEL DEVE SER MAIOR QUE -1';
    END
    IF ( COALESCE(TABELA_ID,0) <= 0 ) THEN
    BEGIN
        EXCEPTION "..." 'TABELA ID DEVE SER MAIOR QUE ZERO';
    END

    IF ( COALESCE(DOCUMENTO,-1) = -1 ) THEN
    BEGIN
        DOCUMENTO = TABELA_ID;
    END

    IF ( NOT COALESCE(QUANTIDADE,0) > 0 ) THEN
    BEGIN
        EXCEPTION "..." 'NAO É PERMITIDO QUANTIDADE ZERADA NA TRANSACAO DE ESTOQUE.';
    END

    TALAO = COALESCE(TALAO,0);

    T01 = IIF(TAMANHO = 01, QUANTIDADE, 0);
    T02 = IIF(TAMANHO = 02, QUANTIDADE, 0);
    T03 = IIF(TAMANHO = 03, QUANTIDADE, 0);
    T04 = IIF(TAMANHO = 04, QUANTIDADE, 0);
    T05 = IIF(TAMANHO = 05, QUANTIDADE, 0);
    T06 = IIF(TAMANHO = 06, QUANTIDADE, 0);
    T07 = IIF(TAMANHO = 07, QUANTIDADE, 0);
    T08 = IIF(TAMANHO = 08, QUANTIDADE, 0);
    T09 = IIF(TAMANHO = 09, QUANTIDADE, 0);
    T10 = IIF(TAMANHO = 10, QUANTIDADE, 0);
    T11 = IIF(TAMANHO = 11, QUANTIDADE, 0);
    T12 = IIF(TAMANHO = 12, QUANTIDADE, 0);
    T13 = IIF(TAMANHO = 13, QUANTIDADE, 0);
    T14 = IIF(TAMANHO = 14, QUANTIDADE, 0);
    T15 = IIF(TAMANHO = 15, QUANTIDADE, 0);
    T16 = IIF(TAMANHO = 16, QUANTIDADE, 0);
    T17 = IIF(TAMANHO = 17, QUANTIDADE, 0);
    T18 = IIF(TAMANHO = 18, QUANTIDADE, 0);
    T19 = IIF(TAMANHO = 19, QUANTIDADE, 0);
    T20 = IIF(TAMANHO = 20, QUANTIDADE, 0);


    INSERT INTO TBESTOQUE_TRANSACAO_ITEM (
        TABELA,
        TABELA_ID,
        TABELA_NIVEL,
        ESTABELECIMENTO_CODIGO,
        LOCALIZACAO_CODIGO,
        PRODUTO_CODIGO,
        CONTROLE,
        DATA,
        DOCUMENTO,
        NFS_ITEM_CONTROLE,
        NFE_ITEM_CONTROLE,
        OPERACAO_CODIGO,
        TIPO,
        QUANTIDADE,
        REMESSA_ITEM_CONTROLE,
        T01,
        T02,
        T03,
        T04,
        T05,
        T06,
        T07,
        T08,
        T09,
        T10,
        T11,
        T12,
        T13,
        T14,
        T15,
        T16,
        T17,
        T18,
        T19,
        T20,
        CUSTO_UNITARIO,
        TRANSACAO_CONTROLE,
        CONSUMO,
        USUARIO_CODIGO,
        USUARIO_DATA,
        TURNO_CODIGO,
        CENTRO_DE_CUSTO,
        OBSERVACAO,
        ESPUMACAO,
        CLASSIFICACAO,
        REVISAO_CONTROLE,
        EMPRESA_CODIGO,
        CUSTO_MEDIO,
        ESTOQUE_TRANSACAO_REGRA_ID,
        CONFERENCIA,
        PECA_ID,
        OPERADOR
    ) VALUES(
        :TABELA,
        :TABELA_ID,
        :TABELA_NIVEL,
        :ESTABELECIMENTO_ID,
        :LOCALIZACAO_ID,
        :PRODUTO_ID,
        :TRANSACAO_ID,
        :DATA,
        :DOCUMENTO,
        :NFS_ITEM_CONTROLE,
        :NFE_ITEM_CONTROLE,
        :OPERACAO,
        :TIPO,
        :QUANTIDADE,
        :TALAO,
        :T01,
        :T02,
        :T03,
        :T04,
        :T05,
        :T06,
        :T07,
        :T08,
        :T09,
        :T10,
        :T11,
        :T12,
        :T13,
        :T14,
        :T15,
        :T16,
        :T17,
        :T18,
        :T19,
        :T20,
        0,
        0,
        :CONSUMO,
        :USUARIO_ID,
        CURRENT_DATE,
        0,
        :CCUSTO,
        :OBSERVACAO,
        '0',
        0,
        :REVISAO_ID,
        0,
        0,
        :REGRA_ID,
        :CONFERENCIA,
        :PECA_ID,
        :OPERADOR_ID
    );
END
^

SET TERM ; ^

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO.TABELA IS
'Nome da tabela que realizou a transacao de estoque';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO.TABELA_ID IS
'Id da tabela que realizou a transacao de estoque';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO.DATA IS
'Data da transacao de estoque ( Podera ser retroativa )';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO.TIPO IS
'Tipo de transacao para o estoque. E = Entrada; S = SAIDA';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO.OPERACAO IS
'Codigo da operacao de estoque (Referente TBOPERACAO)';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO.CONSUMO IS
'Identifica se eh operacao de consumo. 1 = SIM; 0 = NAO';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO.CCUSTO IS
'Centro de custo responsavel pela transacao';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO.TRANSACAO_ID IS
'Id da transacao. NAO OBRIGATORIO';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO.DOCUMENTO IS
'Numero do Documento de Identificacao. NAO OBRIGATORIO';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO.TALAO IS
'Id do talao. NAO OBRIGATORIO';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO.REGRA_ID IS
'Id da regra (NAO OBRIGATORIO)';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO.CONFERENCIA IS
'0-sem cinferencia 1-com conferencia';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO.PECA_ID IS
'cod barras da peca';

SET TERM ^ ;

CREATE OR ALTER procedure SPI_ESTOQUE_TRANSACAO_REGRA (
    REGRA_TIPO integer,
    GP_ID integer,
    PERFIL_UP varchar(10),
    FAMILIA_ID integer,
    LOCALIZACAO_ID integer,
    TABELA varchar(32),
    TABELA_NIVEL integer,
    TABELA_ID integer,
    ESTABELECIMENTO_ID integer,
    DATA date,
    PRODUTO_ID integer,
    TAMANHO integer,
    QUANTIDADE numeric(10,5),
    TIPO char(1),
    CONSUMO char(1),
    CCUSTO varchar(10),
    OBSERVACAO varchar(100),
    TRANSACAO_ID integer = null,
    DOCUMENTO integer = null,
    TALAO integer = 0,
    PECA_ID varchar(100) = null,
    OPERADOR_ID integer = 0,
    REVISAO_ID INTEGER = 0)
as
declare variable REGRAS integer;
declare variable REGRA_ID integer;
declare variable LOCALIZACAO_ID_SAIDA integer;
declare variable LOCALIZACAO_ID_ENTRADA integer;
declare variable OPERACAO_ESTOQUE_SAIDA varchar(40);
declare variable OPERACAO varchar(40);
declare variable OPERACAO_ESTOQUE_ENTRADA varchar(40);
declare variable USUARIO_ID integer;
declare variable T01 numeric(10,5);
declare variable T02 numeric(10,5);
declare variable T03 numeric(10,5);
declare variable T04 numeric(10,5);
declare variable T05 numeric(10,5);
declare variable T06 numeric(10,5);
declare variable T07 numeric(10,5);
declare variable T08 numeric(10,5);
declare variable T09 numeric(10,5);
declare variable T10 numeric(10,5);
declare variable T11 numeric(10,5);
declare variable T12 numeric(10,5);
declare variable T13 numeric(10,5);
declare variable T14 numeric(10,5);
declare variable T15 numeric(10,5);
declare variable T16 numeric(10,5);
declare variable T17 numeric(10,5);
declare variable T18 numeric(10,5);
declare variable T19 numeric(10,5);
declare variable T20 numeric(10,5);
declare variable CONFERENCIA integer;
declare variable ALOCACAO_TIPO varchar(10);
declare variable ALOCACAO_TABELA_ID integer;
declare variable ALOCACAO_TAB_ITEM_ID integer;
declare variable V_PECA_ID integer;
declare variable V_PECA_TIPO varchar(10);
declare variable COR_ENTRADA_ESTOQUE integer;
declare variable NEW_PRODUTO integer;
declare variable MODELO_ID integer;
BEGIN


    SELECT
        REGRA_ID,
        LOCALIZACAO_ID,
        OPERACAO,
        CONFERENCIA,
        PECA_BARRAS,
        COR_ENTRADA_ESTOQUE
    FROM
        SPC_ESTOQUE_TRANSACAO_REGRA (
            :regra_tipo,
            :GP_ID,
            :PERFIL_UP,
            :PRODUTO_ID,
            :TIPO,
            :TALAO,
            :PECA_ID,
            :LOCALIZACAO_ID
        )
    INTO
        REGRA_ID,
        LOCALIZACAO_ID,
        OPERACAO,
        CONFERENCIA,
        PECA_ID,
        COR_ENTRADA_ESTOQUE
        ;

    if(coalesce(COR_ENTRADA_ESTOQUE,0) > 0)then
    begin
        MODELO_ID = coalesce((select first 1 p.modelo_codigo from tbproduto p where p.codigo = :PRODUTO_ID),0);

        NEW_PRODUTO = coalesce((
            select first 1 p.codigo from tbproduto p
            where p.modelo_codigo = :MODELO_ID
            and p.cor_codigo = :COR_ENTRADA_ESTOQUE
        ),0);

        if(coalesce(NEW_PRODUTO,0) <= 0)then
        begin
            exception "..." 'PRODUTO NAO ENCONTRADO, REGRA DE TRANSACAO DE ESTOQUE CONFIGURADA PARA ENTRADA NA COR '||coalesce(COR_ENTRADA_ESTOQUE,0)||'. PRODUTO:'||coalesce(:PRODUTO_ID,0);
        end

    end else
    begin
       NEW_PRODUTO = :PRODUTO_ID;
    end

    EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO(
        :TABELA,
        :TABELA_NIVEL,
        :TABELA_ID,
        :ESTABELECIMENTO_ID,
        :LOCALIZACAO_ID,
        :DATA,
        :NEW_PRODUTO,
        :TAMANHO,
        :QUANTIDADE,
        :TIPO,
        :OPERACAO,
        :CONSUMO,
        :CCUSTO,
        :OBSERVACAO,
        :TRANSACAO_ID,
        :DOCUMENTO,
        :TALAO,
        :REGRA_ID,
        :CONFERENCIA,
        :PECA_ID,
        0,
        0,
        :OPERADOR_ID,
        :REVISAO_ID
    );
           --
--    IF ( PECA_ID is not null ) THEN
--    begin
--        select first 1
--               tipo,
--               id
--          from spc_peca(:PECA_ID)
--          into V_peca_tipo,
--               V_peca_id;
--
--        if ( V_peca_tipo = 'R' ) then
--        begin
--            update tbrevisao r set r.localizacao_entrada = :LOCALIZACAO_ID  where r.id = :V_peca_id;
--        end
--        else
--        if ( V_peca_tipo = 'D' ) then
--        begin
--            update vwremessa_talao_detalhe d set d.localizacao_id = :LOCALIZACAO_ID  where d.id = :V_peca_id;
--        end
--        else
--        begin
--            exception "..." 'TIPO DE PECA NAO IDENTIFICADO.';
--        end
--
--
--    end

END
^

SET TERM ; ^

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO_REGRA.TABELA IS
'Nome da tabela que realizou a transacao de estoque';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO_REGRA.TABELA_ID IS
'Id da tabela que realizou a transacao de estoque';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO_REGRA.DATA IS
'Data da transacao de estoque ( Podera ser retroativa )';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO_REGRA.TIPO IS
'Tipo de transacao para o estoque. E = Entrada; S = SAIDA';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO_REGRA.CONSUMO IS
'Identifica se eh operacao de consumo. 1 = SIM; 0 = NAO';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO_REGRA.CCUSTO IS
'Centro de custo responsavel pela transacao';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO_REGRA.TRANSACAO_ID IS
'Id da transacao. NAO OBRIGATORIO';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO_REGRA.DOCUMENTO IS
'Numero do Documento de Identificacao. NAO OBRIGATORIO';

COMMENT ON PARAMETER SPI_ESTOQUE_TRANSACAO_REGRA.TALAO IS
'Id do talao. NAO OBRIGATORIO';

