TOTVS CRM | SFA - 12.1.2501
.public
Tables
(current)
Columns
Constraints
Relationships
Orphan Tables
Anomalies
Routines
processarflex()
Parameters
Name
Type
Mode
Definition
DECLARE movimento_ bigint; processado_ integer; saldoALiberar_ numeric(12,2); totalProcessado_ numeric(12,2); totalAProcessar_ numeric(12,2); extraAProcessar_ numeric(12,2); faltaProcessar_ numeric(12,2); operacao_ integer; curDate_ date:=CURRENT_DATE; cf_alterado ControleFlex%ROWTYPE; BEGIN if (TG_OP = 'INSERT') then operacao_:=0; processado_ = new.idnprocessado; end if; if (TG_OP = 'UPDATE') then operacao_:=1; processado_ = new.idnprocessado; end if; if (TG_OP = 'DELETE') then operacao_:=2; movimento_:=null; saldoALiberar_:=0; raise notice ' saldoALiberar_: %', saldoALiberar_; --seleciona o controleflex para gravar na tabela de auditoria select into cf_alterado* from controleflex where idcontroleflex = old.idControleFlex; if(old.idnLiberado=0) then saldoALiberar_:= cf_alterado.saldoliberar-old.valorPrevisto; raise notice ' saldoALiberar_: %', saldoALiberar_; -- atualiza o saldo a liberar e o saldo disponivel do ControleFlex if(saldoALiberar_>=0) then update ControleFlex set saldoLiberar = saldoALiberar_ where idControleFlex = old.idControleFlex; end if; end if; insert into controleflex_aud (id, idnativo, saldodisponivel, saldoliberar, saldoflex, codigoerp, wsversao, idflex, idusuario, idparceiro, idlocal, idlocalfilial, idcontroleflex, rev, revtype) values(nextval('seqcontroleflex_aud'), cf_alterado.idnativo, cf_alterado.saldodisponivel, cf_alterado.saldoliberar, cf_alterado.saldoflex, cf_alterado.codigoerp, cf_alterado.wsversao, cf_alterado.idflex, cf_alterado.idusuario, cf_alterado.idparceiro, cf_alterado.idlocal, cf_alterado.idlocalfilial, cf_alterado.idcontroleflex, nextval('seqwsreventity'), operacao_); return old; end if; movimento_ := new.idcontroleflexmovimento; raise notice '<Processar movimento flex>'; raise notice 'Movimento id= % ', movimento_; if (movimento_ is not null) then -- se o movimento está ativo e liberado if new.idnAtivo=1 and new.idnLiberado=1 and new.valorAProcessar<>0 then -- se não estiver processado if processado_=0 then -- se valor menor que zero if(new.valorPrevisto<0) then new.valorProcessado:=new.valorPrevisto; else new.valorProcessado:= new.valorProcessado + new.valorAProcessar; end if; -- processa o movimento new.idnProcessado:=1; new.valorAProcessar:=0; new.dataUltimaAtualizacao:= curDate_; raise notice 'valor processado: % ; valor a processar: %', new.valorProcessado, new.valorAProcessar; insert into controleflexmovimento_aud (id, idnativo, data, dataultimaatualizacao, valor, valorprevisto, idnprocessado, idnliberado, observacao, valoraprocessar, valorprocessado, codigoerp, wsversao, sglorigem, idpedidoproduto, idpedido, idnotafiscalproduto, idcontroleflex, idusuario, idcontroleflexmovimento, rev, revtype) values (nextval('seqcontroleflexmovimento_aud'), new.idnativo, new.data, new.dataultimaatualizacao, new.valor, new.valorprevisto, new.idnprocessado, new.idnliberado, new.observacao, new.valoraprocessar, new.valorprocessado, new.codigoerp, new.wsversao, 'SIM3GBD', new.idpedidoproduto, new.idpedido, new.idnotafiscalproduto, new.idcontroleflex, new.idusuario, new.idcontroleflexmovimento, nextval('seqwsreventity'), operacao_); end if; end if; -- Busca a soma dos valores dos movimentos ativos pertencentes ao ControleFlex de idControleFlex= controleFlex select SUM(cfm.valorProcessado) into totalProcessado_ from ControleFlexMovimento cfm where cfm.idControleFlex = new.idControleFlex and cfm.idnAtivo=1 and cfm.idControleFlexMovimento<>new.idControleFlexMovimento; select SUM(cfm.valorPrevisto) into saldoALiberar_ from ControleFlexMovimento cfm where cfm.idControleFlex = new.idControleFlex and cfm.valorProcessado=0 and cfm.idnAtivo=1 and cfm.idnLiberado=0 and cfm.idControleFlexMovimento<>new.idControleFlexMovimento; select SUM(cfm.valorAProcessar) into extraAProcessar_ from ControleFlexMovimento cfm where cfm.idControleFlex = new.idControleFlex and cfm.valorProcessado>=cfm.valorPrevisto and cfm.idnAtivo=1 and cfm.idnLiberado=0 and cfm.idControleFlexMovimento<>new.idControleFlexMovimento; select ( SUM(cfm.valorPrevisto) - SUM(cfm.valorProcessado)) into totalAProcessar_ from ControleFlexMovimento cfm where cfm.idControleFlex = new.idControleFlex and cfm.valorProcessado<>0 and cfm.valorProcessado<cfm.valorPrevisto and cfm.idnAtivo=1 and cfm.idnLiberado=0 and cfm.idControleFlexMovimento<>new.idControleFlexMovimento; select SUM(cfm.valorPrevisto - cfm.valorProcessado) into faltaProcessar_ from ControleFlexMovimento cfm where cfm.idControleFlex = new.idControleFlex and cfm.idnLiberado=1 and cfm.valorProcessado<>0 and cfm.valorProcessado<cfm.valorPrevisto and cfm.idnAtivo=1 and cfm.idControleFlexMovimento<>new.idControleFlexMovimento; if (saldoALiberar_ is null )then saldoALiberar_:=0; end if; if (totalAProcessar_ is null )then totalAProcessar_:=0; end if; if (extraAProcessar_ is null )then extraAProcessar_:=0; end if; if (faltaProcessar_ is null )then faltaProcessar_:=0; end if; totalProcessado_:= totalProcessado_ + new.valorProcessado; totalAProcessar_:=totalAProcessar_ + extraAProcessar_ + faltaProcessar_; raise notice ' saldoALiberar: %', saldoALiberar_; raise notice ' totalAProcessar outros movimentos: %', totalAProcessar_; if(new.idnLiberado=0 ) then if (new.valorProcessado=0) then saldoALiberar_:=saldoALiberar_ + new.valorPrevisto; elsif( new.valorProcessado<>0 and new.valorProcessado < new.valorPrevisto) then saldoALiberar_:=saldoALiberar_ + ( new.valorPrevisto - new.valorProcessado); elsif( new.valorProcessado<>0 and new.valorProcessado>=new.valorPrevisto) then saldoALiberar_:=saldoALiberar_ + new.valorAProcessar; end if; else if (new.valorProcessado< new.valorPrevisto) then saldoALiberar_:=saldoALiberar_ + ( new.valorPrevisto - new.valorProcessado); end if; end if; saldoALiberar_:= saldoALiberar_ + totalAProcessar_ ; raise notice ' saldoALiberar final: %', saldoALiberar_; if (saldoALiberar_<0) then saldoALiberar_:=0; end if; -- seleciona o controleflex para gravar na tabela de auditoria select into cf_alterado* from controleflex where idcontroleflex = new.idControleFlex; -- atualiza o saldo a liberar e o saldo disponivel do ControleFlex update ControleFlex set saldoLiberar = saldoALiberar_ where idControleFlex = new.idControleFlex; if (new.idnProcessado =1) then update ControleFlex set saldoDisponivel = totalProcessado_ where idControleFlex = new.idControleFlex; end if; -- registrar nas tabelas de auditoria if((operacao_=0 and new.idnprocessado=1) or (operacao_=1 and processado_<>new.idnProcessado) ) then insert into controleflex_aud (id, idnativo, saldodisponivel, saldoliberar, saldoflex, codigoerp, wsversao, idflex, idusuario, idparceiro, idlocal, idlocalfilial, idcontroleflex, rev, revtype) values(nextval('seqcontroleflex_aud'), cf_alterado.idnativo, cf_alterado.saldodisponivel, cf_alterado.saldoliberar, cf_alterado.saldoflex, cf_alterado.codigoerp, cf_alterado.wsversao, cf_alterado.idflex, cf_alterado.idusuario, cf_alterado.idparceiro, cf_alterado.idlocal, cf_alterado.idlocalfilial, cf_alterado.idcontroleflex, nextval('seqwsreventity'), operacao_); end if; end if; raise notice '</Processar movimento flex>'; return new ; END;