CREATE OR ALTER procedure SPI_ESTOQUE_SALDO (
    ESTABELECIMENTO integer,
    LOCALIZACAO integer,
    PRODUTO integer,
    TIPO char(1),
    DATA date,
    QUANTIDADE numeric(10,5),
    T01 numeric(10,5),
    T02 numeric(10,5),
    T03 numeric(10,5),
    T04 numeric(10,5),
    T05 numeric(10,5),
    T06 numeric(10,5),
    T07 numeric(10,5),
    T08 numeric(10,5),
    T09 numeric(10,5),
    T10 numeric(10,5),
    T11 numeric(10,5),
    T12 numeric(10,5),
    T13 numeric(10,5),
    T14 numeric(10,5),
    T15 numeric(10,5),
    T16 numeric(10,5),
    T17 numeric(10,5),
    T18 numeric(10,5),
    T19 numeric(10,5),
    T20 numeric(10,5),
    CONTROLE integer,
    DOCUMENTO integer,
    NFS_ITEM_CONTROLE integer,
    NFE_ITEM_CONTROLE integer,
    OPERACAO_CODIGO varchar(3),
    REMESSA_ITEM_CONTROLE integer,
    TRANSACAO_CONTROLE integer,
    CONSUMO char(1),
    CUSTO_UNITARIO numeric(10,5),
    USUARIO_CODIGO integer,
    USUARIO_DATA date,
    TURNO_CODIGO integer,
    CCUSTO varchar(10),
    OBSERVACAO varchar(500),
    ESPUMACAO char(1),
    CLASSIFICACAO smallint,
    REVISAO_CONTROLE integer,
    EMPRESA_CODIGO integer,
    CUSTO_MEDIO numeric(15,4))
as
BEGIN

    INSERT INTO TBESTOQUE_TRANSACAO_ITEM (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 ) VALUES(
    :ESTABELECIMENTO,:LOCALIZACAO,:PRODUTO,: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,
    :CCUSTO, :OBSERVACAO, :ESPUMACAO, :CLASSIFICACAO,
    :REVISAO_CONTROLE,:EMPRESA_CODIGO,:CUSTO_MEDIO);

END;


CREATE OR ALTER procedure SPU_ESTOQUE_SALDO4 (
    ESTABELECIMENTO_1 integer,
    LOCALIZACAO_1 integer,
    PRODUTO_1 integer,
    TIPO char(1),
    DATA_1 date,
    QUANTIDADE numeric(10,5),
    T01 numeric(10,5),
    T02 numeric(10,5),
    T03 numeric(10,5),
    T04 numeric(10,5),
    T05 numeric(10,5),
    T06 numeric(10,5),
    T07 numeric(10,5),
    T08 numeric(10,5),
    T09 numeric(10,5),
    T10 numeric(10,5),
    T11 numeric(10,5),
    T12 numeric(10,5),
    T13 numeric(10,5),
    T14 numeric(10,5),
    T15 numeric(10,5),
    T16 numeric(10,5),
    T17 numeric(10,5),
    T18 numeric(10,5),
    T19 numeric(10,5),
    T20 numeric(10,5),
    CONTROLE integer,
    DOCUMENTO integer,
    NFS_ITEM_CONTROLE integer,
    NFE_ITEM_CONTROLE integer,
    OPERACAO_CODIGO varchar(3),
    REMESSA_ITEM_CONTROLE integer,
    TRANSACAO_CONTROLE integer,
    CONSUMO char(1),
    CUSTO_UNITARIO numeric(10,5),
    USUARIO_CODIGO integer,
    USUARIO_DATA date,
    TURNO_CODIGO integer,
    CCUSTO varchar(10),
    OBSERVACAO varchar(500),
    ESPUMACAO char(1),
    CLASSIFICACAO smallint,
    REVISAO_CONTROLE integer,
    EMPRESA_CODIGO integer,
    CUSTO_MEDIO numeric(15,4))
as
BEGIN

    INSERT INTO TbEstoque_Transacao_Item (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 ) VALUES(
    :ESTABELECIMENTO_1,:LOCALIZACAO_1,:PRODUTO_1,:CONTROLE,:DATA_1,
    :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,
    :CCUSTO, :OBSERVACAO, :ESPUMACAO, :CLASSIFICACAO,
    :REVISAO_CONTROLE,:EMPRESA_CODIGO,:Custo_Medio);

END;

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(500),
    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)
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,
        0,
        0,
        0,
        :REGRA_ID,
        :CONFERENCIA,
        :PECA_ID,
        :OPERADOR_ID
    );
END;

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';

ALTER TABLE TBESTOQUE_TRANSACAO_ITEM
ALTER COLUMN OBSERVACAO TYPE VARCHAR(500); 






