-- FUNÇÃO PARA ATUALIZAR O SALDO DO CTR ANTES DE CONFIRMAR INCLUSÃO/ALTERAÇÃO NO CTR
CREATE OR REPLACE FUNCTION gerente.atual_saldo_ctr() RETURNS trigger AS 
$BODY$
    DECLARE vvlrec       numeric(15,2);
            vvl_desconto numeric(15,2);
	    vvl_juros numeric(15,2);
            vdtbaixa     date;

    BEGIN
      IF TG_OP='UPDATE' THEN
        IF NOT old.id_ctr=new.id_ctr THEN
          RAISE EXCEPTION 'Tentativa de alteração da Id do contas a receber. Operação cancelada!';
        END IF;
      END IF;
      SELECT SUM(CASE WHEN forma=9 THEN -valor ELSE valor END),SUM(vl_desconto),SUM(vl_juros),max(data) INTO vvlrec,vvl_desconto,vvl_juros,vdtbaixa FROM ONLY gerente.recbtos WHERE id_ctr=new.id_ctr;

      IF vvlrec IS NULL THEN
        vvlrec := 0 ;
      END IF;

      IF vvl_desconto IS NULL THEN
        vvl_desconto := 0 ;
      END IF;

      IF vvl_juros IS NULL THEN
        vvl_juros := 0 ;
      END IF;

      IF new.nbanco='' THEN
        new.nbanco := null ;
      END IF;

      new.recbt := vvlrec;
      new.desco := vvl_desconto;
      new.juros := vvl_juros;
      new.saldo := new.valor + new.juros + new.despcart - new.desco - new.recbt;
      
      IF new.situacao='C' THEN
        new.saldo=0;
        IF new.recbt>0 THEN 
	  RAISE EXCEPTION 'Título cancelado! Impossivel vincular recebimento em título cancelado!|Prefixo: % Número: %', new.prefixo, new.numero;
        END IF;
      ELSIF new.situacao='F' THEN
        new.saldo=0;
        --IF new.recbt>0 THEN 
	  --RAISE EXCEPTION 'Impossivel vincular recebimento em título que foi gerada fatura!|Prefixo: % Número: %', new.prefixo, new.numero;
        --END IF;
      ELSIF new.saldo=0 THEN
	new.situacao := 'Q';
	new.dt_baixa := vdtbaixa;
      ELSE
	new.situacao := 'A';
	new.dt_baixa := Null;
      END IF; 
      -- ATUALIZA SITUACAO DO DESCONTO
      IF new.data_desconto IS NULL AND new.data_recompra IS NULL THEN
        new.sit_desconto = 'N';
      ELSIF new.data_desconto IS NOT NULL AND new.data_recompra IS NULL THEN
        new.sit_desconto = 'D';
      ELSIF new.data_desconto IS NOT NULL AND new.data_recompra IS NOT NULL THEN
        new.sit_desconto = 'R';
      ELSE
        RAISE EXCEPTION 'Título não foi descontado! Impossível gravar data da recompra!';
      END IF;
      IF new.num_fatura=0 THEN
        new.num_fatura = NULL;
      END IF;
            
      RETURN NEW;  
    END;
$BODY$
 LANGUAGE plpgsql;
--RUN--

-- FUNÇÃO PARA CORRIGIR O SALDO DO CTR 
CREATE OR REPLACE FUNCTION gerente.corrige_saldo_ctr() RETURNS int4 AS '
DECLARE
    vctr RECORD;
    vsituacao CHAR(1);
    vqtd INT4;

BEGIN

  vqtd := 0;
  FOR vctr IN select a.id_ctr,a.id_empresa,a.numero,a.recbt,a.valor,a.juros,a.despcart,a.desco,sum(CASE WHEN b.forma=9 THEN -b.valor ELSE b.valor END) as totrec
                from gerente.ctr A
                left outer join gerente.recbtos B on (a.id_ctr=b.id_ctr)
                group by a.id_ctr,a.id_empresa,a.numero,a.recbt,a.valor,a.juros,a.despcart,a.desco
                having not a.recbt=sum(CASE WHEN b.forma=9 THEN -b.valor ELSE b.valor END) 

  LOOP
     vqtd := vqtd + 1;
     IF (vctr.valor+vctr.juros+vctr.despcart-vctr.desco-vctr.totrec)=0 THEN
       vsituacao=''Q'';
     ELSE
       vsituacao=''A'';
     END IF;
     EXECUTE ''UPDATE ONLY gerente.ctr SET recbt='' || vctr.totrec || '', saldo=valor+juros+despcart-desco-'' || vctr.totrec || '', situacao='''''' || vsituacao || '''''' WHERE id_ctr='' || vctr.id_ctr ;
  END LOOP;

  FOR vctr IN select a.id_ctr,a.id_empresa,a.numero,a.recbt,a.valor,a.juros,a.despcart,a.desco
                from gerente.ctr A
                left outer join gerente.recbtos B on (a.id_ctr=b.id_ctr)
                where a.recbt>0 and b.valor is NULL
  LOOP
     vqtd := vqtd + 1;
     IF (vctr.valor+vctr.juros+vctr.despcart-vctr.desco)=0 THEN
       vsituacao=''Q'';
     ELSE
       vsituacao=''A'';
     END IF;
     EXECUTE ''UPDATE ONLY gerente.ctr SET recbt=0, saldo=valor+juros+despcart-desco, situacao='''''' || vsituacao || '''''' WHERE id_ctr='' || vctr.id_ctr ;
  END LOOP;


  RETURN vqtd;

END;
' LANGUAGE plpgsql;

--RUN--

DROP TRIGGER atual_saldo_ctr ON gerente.recbtos;

--RUN--IGNORE ERRO

DROP TRIGGER atual_vlrecebido_ctr ON gerente.recbtos;

--RUN--IGNORE ERRO

CREATE TRIGGER atual_vlrecebido_ctr
  AFTER INSERT OR UPDATE OR DELETE
  ON gerente.recbtos
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.atual_vlrecebido_ctr();

--RUN--

DROP TRIGGER atual_saldo_ctr ON gerente.ctr;

--RUN--IGNORE ERRO

CREATE TRIGGER atual_saldo_ctr
  BEFORE INSERT OR UPDATE 
  ON gerente.ctr
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.atual_saldo_ctr();

--RUN--

-- FUNÇÃO PARA CALCULAR JUROS NO CTR 
CREATE OR REPLACE FUNCTION gerente.calc_juros_ctr(int4,char,numeric(15,4),date) RETURNS NUMERIC(15,2) AS 
$BODY$
DECLARE
    pidctr 	ALIAS FOR $1;
    pforma 	ALIAS FOR $2;
    ptaxa  	ALIAS FOR $3;
    pdata  	ALIAS FOR $4;
    vmeses1 	NUMERIC(15,4);
    vmeses2 	NUMERIC(12,4);
    vttrec 	NUMERIC(15,2);
    vvlrec 	NUMERIC(15,2);
    voutrosrec 	NUMERIC(15,2);
    vjuros 	NUMERIC(15,2);
    vpv		NUMERIC(15,2);
    vfv		NUMERIC(15,2);
    vsaldo	NUMERIC(15,2);
    vvalor	NUMERIC(15,2);
    vdesco	NUMERIC(15,2);
    vdespcart	NUMERIC(15,2);

BEGIN

  SELECT 
    sum(CASE WHEN forma IN (1,2,3) THEN (((EXTRACT(DAY FROM age(a.bom,b.vecto))/30)+EXTRACT(MONTH FROM age(a.bom,b.vecto))+(EXTRACT(YEAR FROM age(a.bom,b.vecto))*12)) * a.valor) ELSE 0 END),
    sum(CASE WHEN forma IN (1,2,3) THEN a.valor ELSE 0 END),
    sum(CASE WHEN forma IN (1,2,3) THEN a.valor ELSE 0 END) ,
    sum(CASE WHEN forma IN (1,2,3) THEN 0 WHEN forma=9 THEN -a.valor ELSE a.valor END)
    INTO vmeses1, vttrec, vvlrec, voutrosrec
    FROM ONLY gerente.recbtos a
    LEFT OUTER JOIN ONLY gerente.ctr b on (a.id_ctr=b.id_ctr)
    WHERE a.id_ctr=pidctr;
  IF vmeses1 IS NULL THEN
    vmeses1    = 0;
    vvlrec     = 0;
    voutrosrec = 0;  
  ELSEIF vttrec>0 THEN
    vmeses1    = vmeses1/vttrec;
  END IF;
  IF vmeses1<0 THEN
    vmeses1    = 0;
  END IF;
  SELECT 
    (EXTRACT(DAY FROM age(pdata,a.vecto))/30)+EXTRACT(MONTH FROM age(pdata,a.vecto))+(EXTRACT(YEAR FROM age(pdata,a.vecto))*12),
    valor,desco,despcart
    INTO vmeses2,vvalor,vdesco,vdespcart
    FROM ONLY gerente.ctr a
    where a.id_ctr=pidctr;
--  RAISE NOTICE 'Meses 1: % , Meses : %, Vl Rec: %, Outros Rec: %',vmeses1,vmeses2,vvlrec,voutrosrec;
  IF pforma='S' THEN
    vpv    = vvlrec/(1+(ptaxa*vmeses1/100));

--  ALTERADO POR JCS EM 18/06/2012 AS 14:45
--  vsaldo = vvalor - vdesco + vdespcart - vpv;
    vsaldo = vvalor - vdesco + vdespcart - vpv - voutrosrec;

    vfv    = vsaldo*(1+(ptaxa*vmeses2/100));
  ELSEIF pforma='C' THEN
    vpv    = vvlrec/((1+(ptaxa/100))^vmeses1);

--  ALTERADO POR JCS EM 18/06/2012 AS 14:45
--  vsaldo = vvalor - vdesco + vdespcart - vpv;
    vsaldo = vvalor - vdesco + vdespcart - vpv - voutrosrec;

    vfv    = vsaldo*((1+(ptaxa/100))^vmeses2);
  ELSE
    RAISE EXCEPTION 'Forma de cálculo juros só pode ser Simples ou Composta (S/C).';
  END IF;
  vjuros = (vvlrec-vpv)+(vfv-vsaldo);    
  IF vjuros<0 THEN
    vjuros = 0 ;
  END IF;   
--  RAISE NOTICE 'Valor Presente: % ',vpv;
  RETURN vjuros;
END;
$BODY$
 LANGUAGE plpgsql;
--RUN--

-- FUNÇÃO PARA GRAVAR SITUAÇÃO NO OVOCLA BEM COMO VINCULAR OVOEXPD AO OVOREC e OVOCLA.
CREATE OR REPLACE FUNCTION gerente.at_situacao_ovocla()
  RETURNS "trigger" AS
$BODY$
    DECLARE 
      vid_empresa     int4;
      vnum_ovocla     int4;
      vid_ovoexpd     int4;
      vid_ovoexp      int4;
      vnum_ovorec     int4;
      vqt_cla         NUMERIC(15,3);
      vqtd            NUMERIC(15,3);
      vsit            CHAR(1);

    BEGIN
      IF TG_OP='INSERT' THEN
        vid_empresa   = new.id_empresa;
        vnum_ovocla   = new.num_ovocla;
        vid_ovoexpd   = new.id_ovoexpd;
      ELSIF TG_OP='UPDATE' THEN
        IF NOT new.id_empresa=old.id_empresa THEN
          RAISE EXCEPTION 'Impossivel alterar empresa. Operação cancelada!';
        END IF;
        IF NOT new.num_ovocla=old.num_ovocla THEN
          RAISE EXCEPTION 'Impossivel alterar número da classificação. Operação cancelada!';
        END IF;
        vid_empresa   = new.id_empresa;
        vnum_ovocla   = new.num_ovocla;
        vid_ovoexpd   = new.id_ovoexpd;
      ELSIF TG_OP='DELETE' THEN
        vid_empresa   = old.id_empresa;
        vnum_ovocla   = old.num_ovocla;
        vid_ovoexpd   = old.id_ovoexpd;
      END IF;
      -- EFETUA CALCULO DA QTDADE EXPEDIDA
      SELECT INTO vqtd SUM(qtdade) FROM gerente.ovoexpd WHERE num_ovocla=vnum_ovocla AND id_empresa=vid_empresa AND NOT id_ovoexpd=vid_ovoexpd;
      IF vqtd IS NULL THEN
        vqtd = 0;
      END IF;
      IF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        vqtd = vqtd + new.qtdade;
      END IF;
      -- GRAVA ID_OVOEXP e SITUACAO NA OVOCLA
      SELECT INTO vqt_cla,vid_ovoexp,vnum_ovorec qtdade,id_ovoexp,numero_recepcao FROM gerente.ovocla WHERE numero=vnum_ovocla AND id_empresa=vid_empresa;
      IF vqt_cla = vqtd THEN
        vsit = 'E';
      ELSE
        vsit = 'P';
      END IF;
      IF vqtd = 0 THEN 
        vid_ovoexp = NULL;
      ELSIF vid_ovoexp IS NULL THEN
        vid_ovoexp = new.id_ovoexp;
      END IF; 
--      RAISE EXCEPTION 'vqtd: % - vqt_cla: %',vqtd,vqt_cla;
      UPDATE gerente.ovocla SET situacao=vsit, id_ovoexp=vid_ovoexp WHERE numero=vnum_ovocla AND id_empresa=vid_empresa;

      -- GRAVA ID_OVOEXP NA OVOREC
      SELECT INTO vid_ovoexp id_ovoexp FROM gerente.ovorec WHERE numero=vnum_ovorec AND id_empresa=vid_empresa;
      IF TG_OP='INSERT' AND vid_ovoexp IS NULL THEN
        UPDATE gerente.ovorec SET id_ovoexp=new.id_ovoexp WHERE numero=vnum_ovorec AND id_empresa=vid_empresa;
      END IF;

      -- GRAVA NULO NA ID_OVOEXP NA OVOREC SE FOR O CASO
      IF TG_OP='DELETE' AND vid_ovoexp IS NOT NULL THEN
        IF vid_ovoexp=OLD.id_ovoexp THEN
          SELECT INTO vid_ovoexpd id_ovoexpd FROM gerente.ovoexpd a
            LEFT OUTER JOIN gerente.ovocla b ON (a.id_empresa=b.id_empresa AND a.num_ovocla=b.numero)
            LEFT OUTER JOIN gerente.ovorec c ON (b.id_empresa=c.id_empresa AND b.numero_recepcao=c.numero)
            WHERE a.id_ovoexp=OLD.id_ovoexp AND c.id_ovoexp=OLD.id_ovoexp AND NOT a.id_ovoexpd=OLD.id_ovoexpd;
          IF vid_ovoexpd IS NULL THEN
            UPDATE gerente.ovorec SET id_ovoexp=NULL WHERE numero=vnum_ovorec AND id_empresa=vid_empresa;
          END IF;
        END IF;
      END IF;

      IF TG_OP='DELETE' THEN
        RETURN OLD;
      ELSE
        RETURN NEW;
      END IF;
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
--RUN--

-- ATUALIZA DATA DA BAIXA DO CTR NOS PEDIDOS DEPOIS CONFIRMAR INCLUSÃO/ALTERAÇÃO/EXCLUSÃO NO CTR
CREATE OR REPLACE FUNCTION gerente.atual_dt_baixa_ctr_pedido1() RETURNS trigger AS 
$BODY$
    DECLARE vidpedido    int4;
            vdtbaixa     date;
            vaberto      int4;
    BEGIN
      IF TG_OP='DELETE' THEN
        vidpedido    := old.id_pedido;
      ELSE
        vidpedido    := new.id_pedido;
      END IF;
      IF vidpedido IS NOT NULL THEN
        SELECT max(dt_baixa),sum(CASE WHEN situacao='A' THEN 1 ELSE 0 END) INTO vdtbaixa,vaberto FROM ONLY gerente.ctr WHERE id_pedido=vidpedido;
        IF vaberto>0 THEN
          vdtbaixa = NULL;  
        END IF;  
        UPDATE gerente.pedidos SET dt_baixa_ctr=vdtbaixa WHERE id_pedido=vidpedido;
      END IF; 
      IF TG_OP='DELETE' THEN
        RETURN OLD; 
      ELSE
        RETURN NEW; 
      END IF;
    END;
$BODY$
 LANGUAGE plpgsql;
--RUN--

DROP TRIGGER atual_dt_baixa_ctr_pedido1 ON gerente.ctr;
--RUN--IGNORE ERRO

-- CRIA TRIGGER PARA ATUALIZAR DATA BAIXA DO CTR NO PEDIDO
CREATE TRIGGER atual_dt_baixa_ctr_pedido1 
  AFTER INSERT OR UPDATE OR DELETE 
  ON gerente.ctr
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.atual_dt_baixa_ctr_pedido1();
--RUN--

-- ATUALIZA DATA DA BAIXA DO CTR NOS PEDIDOS ANTES CONFIRMAR INCLUSÃO/ALTERAÇÃO NO PEDIDO
CREATE OR REPLACE FUNCTION gerente.atual_dt_baixa_ctr_pedido2() RETURNS trigger AS 
$BODY$
    DECLARE vexistectr   int4;

    BEGIN
      IF new.tipo='O' THEN
        new.dt_baixa_ctr= NULL;
      ELSIF new.tipo='D' THEN
        IF new.situa=3  THEN
          new.dt_baixa_ctr= new.dtemi;
        ELSE
          new.dt_baixa_ctr= NULL;
        END IF;
      ELSE
        SELECT count(*) INTO vexistectr FROM ONLY gerente.ctr WHERE id_pedido=new.id_pedido;
        IF vexistectr=0 THEN 
          IF new.situa=3  THEN
            new.dt_baixa_ctr= new.dtemi;
          ELSE
            new.dt_baixa_ctr= NULL;
          END IF;
        END IF;
      END IF;    

      -- VERIFICA SE TEM NUM PEDIDO ORIGEM SE NÃO DEIXA NULO
      IF new.num_pedido_origem =0 THEN
        new.num_pedido_origem = NULL;           
      END IF;           

      RETURN NEW;  
    END;
$BODY$
 LANGUAGE plpgsql;
--RUN--

DROP TRIGGER atual_dt_baixa_ctr_pedido2 ON gerente.pedidos;
--RUN--IGNORE ERRO

-- CRIA TRIGGER PARA ATUALIZAR DATA BAIXA DO CTR NO PEDIDO
CREATE TRIGGER atual_dt_baixa_ctr_pedido2 
  BEFORE INSERT OR UPDATE 
  ON gerente.pedidos
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.atual_dt_baixa_ctr_pedido2();
--RUN--

-- FUNÇÃO PARA GRAVAR ATUALIZAR QTDADE PRODUZIDA E SITUAÇÃO NA TABLE OP
-- DISPARARA DEPOIS DE INC/ALT/EXC NA TABELA PRODUÇÃO
CREATE OR REPLACE FUNCTION gerente.at_qtdade_produzida_op()
  RETURNS "trigger" AS
$BODY$
    DECLARE 
      vid_empresa     int4;
      vnum_op         int4;
      vqtd            numeric(15,3);
      vqtd_plan       numeric(15,3);
      vqtd_canc       numeric(15,3);
      vsituacao       int4;
      vfluxo_continuo smallint;

    BEGIN
      IF TG_OP='INSERT' THEN
        IF new.num_op=0 THEN
           new.num_op = NULL;
        END IF;        vid_empresa   = new.id_empresa;
        vnum_op       = new.num_op;
      ELSIF TG_OP='UPDATE' THEN
        IF new.num_op=0 THEN
           new.num_op = NULL;
        END IF;    
        vid_empresa   = new.id_empresa;
        vnum_op       = new.num_op;
        IF NOT new.id_empresa=old.id_empresa THEN
          RAISE EXCEPTION 'Impossivel alterar empresa. Operação cancelada!';
        END IF;
        IF NOT new.num_op=old.num_op THEN
          RAISE EXCEPTION 'Impossivel alterar número da ordem de produção. Operação cancelada!';
        END IF;
      ELSIF TG_OP='DELETE' THEN
        vid_empresa   = old.id_empresa;
        vnum_op       = old.num_op;
      END IF;
      IF vnum_op IS NOT NULL THEN
        -- LE CONFIGURAÇÃO NA OP
        SELECT INTO vqtd_plan,vqtd_canc,vfluxo_continuo qtd_planejada,qtd_cancelada,COALESCE(fluxo_continuo,0) FROM gestao.op WHERE numero=vnum_op AND id_empresa=vid_empresa;
        IF NOT FOUND THEN
          RAISE EXCEPTION 'Ordem de produção inválida: % Operação cancelada!',vnum_op;
        END IF;
        -- EFETUA CALCULO DA QTDADE PRODUZIDA
        SELECT INTO vqtd SUM(qtd) FROM gerente.producao WHERE num_op=vnum_op AND id_empresa=vid_empresa;
        IF vqtd IS NULL THEN
          vqtd = 0;
        END IF;


        -- VERIFICA NOVA SITUACAO OP
		-- ALTERADO POR JCS EM 25/05/2020 AS 21:30
--        IF vqtd>=(vqtd_plan-vqtd_canc) THEN
--          vsituacao = 4;
--        ELSIF vqtd>0 THEN
--          vsituacao = 3;        
--        ELSE
--          vsituacao = 2;
--        END IF;      

        IF vqtd>=(vqtd_plan) AND vfluxo_continuo=0 THEN
          vsituacao = 4;
    	ELSIF vqtd>=(vqtd_plan-vqtd_canc) AND vfluxo_continuo=0 THEN
          vsituacao = 3;
        ELSIF vqtd>0 THEN
          vsituacao = 2;
        ELSE
          vsituacao = 1;
        END IF;

        -- GRAVA DADOS NA OP
        UPDATE gestao.op SET qtd_produzida=vqtd,situacao=vsituacao WHERE numero=vnum_op AND id_empresa=vid_empresa;
      END IF;

      IF TG_OP='DELETE' THEN
        RETURN OLD;
      ELSE
        RETURN NEW;
      END IF;
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
--RUN--


DROP TRIGGER at_qtdade_produzida_op ON gerente.producao;
--RUN--IGNORE ERRO

-- DISPARA TRIIGER at_qtdade_produzida_op NA TABELA gerente.producao
CREATE TRIGGER at_qtdade_produzida_op 
  AFTER INSERT OR UPDATE OR DELETE 
  ON gerente.producao
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.at_qtdade_produzida_op();
--RUN--


CREATE OR REPLACE FUNCTION gerente.fk_proddet_estmovto()
  RETURNS "trigger" AS
$BODY$
    DECLARE 
      vid_empresa     int4;
      vid_estmovto    int4;

    BEGIN
      IF TG_OP='UPDATE' THEN
        IF NOT NEW.id_producao=OLD.id_producao OR
           NOT NEW.ordem=OLD.ordem OR
           NOT NEW.id_produto=OLD.id_produto THEN
          SELECT id_empresa  INTO vid_empresa FROM gerente.producao WHERE id_producao=OLD.id_producao;
          SELECT id_estmovto INTO vid_estmovto FROM gestao.estmovto WHERE id_empresa=vid_empresa AND origem_prefixo='PR' AND origem_id=OLD.id_producao AND origem_ordem=OLD.ordem LIMIT 1;
          IF vid_estmovto IS NOT NULL THEN
            RAISE EXCEPTION 'Alteração não permitida! Item da produção tem vinculo com movimento de estoque # %!',vid_estmovto;
          END IF;
        END IF;
        RETURN NEW;
      ELSIF TG_OP='DELETE' THEN
        SELECT id_empresa  INTO vid_empresa FROM gerente.producao WHERE id_producao=OLD.id_producao;
        SELECT id_estmovto INTO vid_estmovto FROM gestao.estmovto WHERE id_empresa=vid_empresa AND origem_prefixo='PR' AND origem_id=OLD.id_producao AND origem_ordem=OLD.ordem LIMIT 1;
        IF vid_estmovto IS NOT NULL THEN
          RAISE EXCEPTION 'Exclusão não permitida! Item da produção tem vinculo com movimento de estoque # %!',vid_estmovto;
        END IF;
        RETURN OLD;
      END IF;
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
--RUN--

DROP TRIGGER fk_proddet_estmovto ON gerente.proddet;
--RUN--IGNORE ERRO

-- DISPARA TRIIGER at_qtdade_produzida_op NA TABELA gerente.producao
CREATE TRIGGER fk_proddet_estmovto 
  AFTER UPDATE OR DELETE 
  ON gerente.proddet
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.fk_proddet_estmovto();
--RUN--

---------------------------------------------------------------------------------
--- FUNÇÃO PARA ATUALIZAR O VALOR RECEBIDO DO CTR APOS INC/ALT/EXC DE RECBTOS ---
--- ATUALIZADA POR JCS EM 19/08/2010 10:20                                    ---
---------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION gerente.atual_vlrecebido_ctr() RETURNS trigger AS 
$BODY$
    DECLARE vid_ctr       int4;
            vid_pedido    int4;
            vnumped       int4;
            vvlped        numeric(15,2);
            vvlrec        numeric(15,2);
    BEGIN
	IF TG_OP='INSERT' THEN
           vid_ctr    := new.id_ctr; 
           vid_pedido := new.id_pedido;
        ELSIF TG_OP='UPDATE' THEN
           IF NOT old.id_ctr=new.id_ctr THEN
              RAISE EXCEPTION 'Tentativa de alteração da Id do contas a receber. Operação cancelada!';
           END IF;
           IF NOT old.id_pedido=new.id_pedido THEN
              RAISE EXCEPTION 'Tentativa de alteração da Id do pedido. Operação cancelada!';
           END IF;
           vid_ctr    := new.id_ctr; 
           vid_pedido := new.id_pedido;
	ELSIF TG_OP='DELETE' THEN
           vid_ctr    := old.id_ctr; 
           vid_pedido := old.id_pedido;
        END IF;
        
	IF vid_pedido IS NOT NULL THEN
           SELECT INTO vvlrec SUM(CASE WHEN forma=9 THEN -valor ELSE valor END) FROM ONLY gerente.recbtos WHERE id_pedido=vid_pedido;
           SELECT INTO vvlped total FROM gerente.pedidos WHERE id_pedido=vid_pedido;
           IF vvlrec>vvlped AND NOT TG_OP='DELETE' THEN
              SELECT INTO vnumped numero FROM gerente.pedidos WHERE id_pedido=vid_pedido;
              RAISE EXCEPTION 'O total recebido (%) é maior que o valor (%) do pedido (%) vínculado. Operação cancelada!', vvlrec, vvlped, vnumped;
           END IF;
        END IF;

	IF vid_ctr IS NOT NULL THEN
--        O UPDATE ABAIXO É USADO DISPARA A TRIGGER "gerente.atual_saldo_ctr"  
--        QUE ATUALIZA O VALOR RECEBIDO E VL DE DESCONTO
	  UPDATE ONLY gerente.ctr SET valor=valor WHERE id_ctr=vid_ctr;
	END IF;
        IF TG_OP='DELETE' THEN
            RETURN OLD;
        ELSE       
            RETURN NEW;  
        END IF;
    END;
$BODY$
  LANGUAGE plpgsql;
--RUN--

CREATE OR REPLACE FUNCTION gerente.valida_pedido()
  RETURNS "trigger" AS
$BODY$
    DECLARE vnum_pv   int8;
            vvl_flex  numeric(15,2);
            vid_vendedor   INT;
            vid_flex       INT;
			vtx_custo_frete numeric(6,2);

    BEGIN
      IF TG_OP='DELETE' THEN
        IF OLD.mod_docfiscal_vinc='2D' AND OLD.num_pv IS NOT NULL THEN
          RAISE EXCEPTION 'Impossivel excluir Pedido! Pré-venda já foi gerada!';
        END IF; 
        RETURN OLD;        
      END IF;

      --Confere Numero dia
      IF TG_OP='INSERT' THEN
        IF (SELECT count(*) FROM gerente.pedidos where id_empresa=NEW.id_empresa and data=NEW.data and numero_dia=New.numero_dia)>0 THEN
          NEW.numero_dia=(select max(numero_dia) from gerente.pedidos where id_empresa=NEW.id_empresa and data=NEW.data)+1;
        END IF;      

        IF NEW.situa=5 THEN -- Pedidos Inseridos pelo SAR - Atualiza Desconto de Rede
          NEW.desc_cliente_rede = (select coalesce(desc_cliente_rede,0) from gerente.clientes where id_cliente=NEW.clien);
	      NEW.acrep = (select coalesce(acresc,0) from gestao.formapag where codigo=NEW.cod_formapag and id_empresa=(select id_matriz from gestao.empresa where id_empresa=NEW.id_empresa));
        END IF;        
		
        -- LANÇA CUSTO FRETE PADRÃO
        vtx_custo_frete = (select coalesce(valor::int,0) from gestao.registro where chave=NEW.id_empresa||'/ConfigSIS' and nome='Custo Frete');
        IF vtx_custo_frete IS NULL THEN
          vtx_custo_frete = 0;
        END IF;        
        IF vtx_custo_frete>0 THEN
          NEW.tx_custo_frete = vtx_custo_frete;
        END IF;                		
      END IF;

      -- controle do saldo do flex
      IF TG_OP='UPDATE' THEN
        IF NOT OLD.cod_vendedor=NEW.cod_vendedor OR NOT OLD.ped_flex=NEW.ped_flex THEN
          vvl_flex = (SELECT sum(COALESCE(vl_flex,0)) FROM gerente.peditens WHERE id_pedido=NEW.id_pedido);

          -- estorno flex
          IF OLD.ped_flex=1 THEN
            vid_vendedor = (SELECT id_vendedor FROM gestao.vendedor WHERE id_empresa=(SELECT id_matriz FROM gestao.empresa WHERE id_empresa=OLD.id_empresa) AND codigo=OLD.cod_vendedor);
            vid_flex     = (SELECT id_flex FROM gestao.flex WHERE id_empresa=OLD.id_empresa AND id_vendedor=vid_vendedor);
            IF vid_flex IS NOT NULL THEN 
              UPDATE gestao.flex SET saldo_flex=saldo_flex-vvl_flex WHERE id_flex=vid_flex;
            END IF;
          END IF;

          -- lança flex
          IF NEW.ped_flex=1 THEN
            vid_vendedor = (SELECT id_vendedor FROM gestao.vendedor WHERE id_empresa=(SELECT id_matriz FROM gestao.empresa WHERE id_empresa=NEW.id_empresa) AND codigo=NEW.cod_vendedor);
            vid_flex     = (SELECT id_flex FROM gestao.flex WHERE id_empresa=NEW.id_empresa AND id_vendedor=vid_vendedor);

            IF vid_flex IS NULL THEN 
              IF NOT vvl_flex=0 AND vvl_flex IS NOT NULL THEN 
                INSERT INTO gestao.flex(id_empresa, id_vendedor, saldo_flex) VALUES (NEW.id_empresa, vid_vendedor, vvl_flex);
              END IF;
            ELSE
              UPDATE gestao.flex SET saldo_flex=saldo_flex+vvl_flex WHERE id_flex=vid_flex;
            END IF;
          END IF;
        END IF;
      END IF;


      IF NEW.mod_docfiscal_vinc='2D' AND NEW.situa=2 AND NEW.total>0 THEN
        IF NEW.num_pv IS NULL OR NEW.num_pv=0 THEN
          NEW.num_pv = (SELECT COALESCE(max(num_pv),0) FROM gerente.pedidos WHERE id_empresa in(NEW.id_empresa,NEW.id_empresa-9000))+1;
        END IF;
      ELSIF NEW.num_pv=0 THEN
        NEW.num_pv = NULL;
      END IF;
      IF NEW.num_pv IS NOT NULL THEN
        IF NOT NEW.mod_docfiscal_vinc='2D' THEN
          RAISE EXCEPTION 'Impossivel mudar modelo docto fiscal! Pré-venda já foi gerada!';
        END IF;
        IF NOT NEW.situa=2 and NEW.id_empresa<9000 THEN
          DELETE FROM gestao.estmovto WHERE id_empresa=NEW.id_empresa AND origem_prefixo='PE' AND origem_id=NEW.id_pedido;          
        END IF;
      END IF;

      IF new.num_pauta='' THEN
        new.num_pauta := null;
      END IF;
	  
      IF new.id_estlocal=0 THEN
        new.id_estlocal := null;
      END IF;	  
	  
      IF TG_OP='UPDATE' AND NEW.situa=4 THEN
        DELETE FROM gerente.recbtos WHERE id_pedido=NEW.id_pedido and origem='P' and forma=21;
      END IF; 

      IF TG_OP='UPDATE' OR TG_OP='INSERT' THEN
        IF (NEW.tx_desc_fatura=0 or NEW.tx_desc_fatura is null) and (select sum(COALESCE(tx_desc_fatura,0)) from gerente.clientes where id_cliente=NEW.clien)>0 THEN
          NEW.tx_desc_fatura = (select tx_desc_fatura from gerente.clientes where id_cliente=NEW.clien);
        END IF;
      END IF;

      RETURN NEW;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

--RUN--

DROP TRIGGER valida_pedido ON gerente.pedidos;
--RUN--IGNORE ERRO

CREATE TRIGGER valida_pedido
  BEFORE INSERT OR UPDATE OR DELETE
  ON gerente.pedidos
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.valida_pedido();
--RUN--

CREATE OR REPLACE FUNCTION gerente.valida_peditens()
  RETURNS "trigger" AS
$BODY$
    DECLARE rped RECORD;
            vid_vendedor   INT;
            vid_flex       INT;
            vdesc_formapag NUMERIC(7,2);
            vid_matriz     INT;

    BEGIN
      IF TG_OP='DELETE' OR TG_OP='UPDATE' THEN
        SELECT id_empresa,cod_vendedor,ped_flex INTO rped FROM ONLY gerente.pedidos WHERE id_pedido=OLD.id_pedido;
        vid_vendedor = (SELECT id_vendedor FROM gestao.vendedor WHERE id_empresa=(SELECT id_matriz FROM gestao.empresa WHERE id_empresa=rped.id_empresa) AND codigo=rped.cod_vendedor);
        vid_flex     = (SELECT id_flex FROM gestao.flex WHERE id_empresa=rped.id_empresa AND id_vendedor=vid_vendedor);
        IF vid_flex IS NOT NULL AND rped.ped_flex=1 AND OLD.vl_flex IS NOT NULL THEN 
          UPDATE gestao.flex SET saldo_flex=saldo_flex-OLD.vl_flex WHERE id_flex=vid_flex;
        END IF;
      END IF;

      IF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        SELECT id_empresa,cod_vendedor,ped_flex,cod_formapag,situa INTO rped FROM ONLY gerente.pedidos WHERE id_pedido=NEW.id_pedido;
        vid_vendedor = (SELECT id_vendedor FROM gestao.vendedor WHERE id_empresa=(SELECT id_matriz FROM gestao.empresa WHERE id_empresa=rped.id_empresa) AND codigo=rped.cod_vendedor);
        vid_flex     = (SELECT id_flex FROM gestao.flex WHERE id_empresa=rped.id_empresa AND id_vendedor=vid_vendedor);
        IF vid_flex IS NULL THEN 
          IF NOT NEW.vl_flex=0 AND NEW.vl_flex IS NOT NULL AND rped.ped_flex=1 THEN 
            INSERT INTO gestao.flex(id_empresa, id_vendedor, saldo_flex) VALUES (rped.id_empresa, vid_vendedor, NEW.vl_flex);
          END IF;
        ELSIF rped.ped_flex=1 AND NEW.vl_flex IS NOT NULL THEN
          UPDATE gestao.flex SET saldo_flex=saldo_flex+NEW.vl_flex WHERE id_flex=vid_flex;
        END IF;

        IF NEW.preco_pauta IS NULL OR NEW.preco_pauta=0 AND NOT rped.situa=4 THEN
	  NEW.preco_pauta = NEW.pruni;
	END IF;

        IF NEW.pr_pauta_liq IS NULL OR NEW.pr_pauta_liq=0 AND NOT rped.situa=4 THEN
          vid_matriz     = (SELECT id_matriz FROM gestao.empresa WHERE id_empresa=rped.id_empresa);
          vdesc_formapag = (select desco from gestao.formapag where id_empresa=vid_matriz and codigo=rped.cod_formapag);
          NEW.pr_pauta_liq = NEW.preco_pauta - (NEW.preco_pauta / 100 * vdesc_formapag);
        END IF;
      END IF;
      
      IF TG_OP='DELETE' THEN
        RETURN OLD;
      ELSE
        RETURN NEW;
      END IF;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE;
--RUN--

DROP TRIGGER valida_peditens ON gerente.peditens;
--RUN--IGNORE ERRO

CREATE TRIGGER valida_peditens
  BEFORE INSERT OR UPDATE OR DELETE
  ON gerente.peditens
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.valida_peditens();
--RUN--

CREATE OR REPLACE FUNCTION gerente.valida_cliente()
  RETURNS "trigger" AS
$BODY$
    BEGIN

      IF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        IF new.cod_pauta=0 THEN
	      new.cod_pauta := null;
	    END IF;
		IF NEW.id_tes = 0 THEN
          NEW.id_tes := null;
        END IF;
        RETURN NEW;
      ELSE  
        RETURN OLD;      
      END IF;      
      
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION gerente.valida_cliente() OWNER TO postgres;
--RUN--

DROP TRIGGER valida_cliente ON gerente.clientes;
--RUN--IGNORE ERRO

CREATE TRIGGER valida_cliente
  BEFORE INSERT OR UPDATE OR DELETE
  ON gerente.clientes
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.valida_cliente();
--RUN--

CREATE OR REPLACE FUNCTION gestao.calc_juros_ctp(integer, bpchar, numeric, date)
  RETURNS numeric AS
$BODY$
DECLARE
    pidctp      ALIAS FOR $1;
    pforma      ALIAS FOR $2;
    ptaxa       ALIAS FOR $3;
    pdata       ALIAS FOR $4;
    vdias1      NUMERIC(15,0);
    vdias2      NUMERIC(15,0);
    vmeses1     NUMERIC(15,6);
    vmeses2     NUMERIC(15,6);
    vttrec      NUMERIC(15,2);
    vvlrec      NUMERIC(15,2);
    voutrosrec  NUMERIC(15,2);
    vjuros      NUMERIC(15,2);
    vpv         NUMERIC(15,2);
    vfv         NUMERIC(15,2);
    vsaldo      NUMERIC(15,2);
    vvalor      NUMERIC(15,2);
    vdesco      NUMERIC(15,2);
    vdespcart   NUMERIC(15,2);

BEGIN

  SELECT
    sum(CASE WHEN forma IN (1,2,3) THEN ((a.data-b.vecto) * a.valor) ELSE 0 END),
    sum(CASE WHEN forma IN (1,2,3) THEN a.valor ELSE 0 END),
    sum(CASE WHEN forma IN (1,2,3) THEN a.valor ELSE 0 END) ,
    sum(CASE WHEN forma IN (1,2,3) THEN 0 WHEN forma=9 THEN -a.valor ELSE a.valor END)
    INTO vdias1, vttrec, vvlrec, voutrosrec
    FROM ONLY gestao.pagtos a
    LEFT OUTER JOIN ONLY gestao.ctp b on (a.id_ctp=b.id_ctp)
    WHERE a.id_ctp=pidctp AND a.data<=pdata;
  IF vdias1 IS NULL THEN
    vdias1     = 0;
    vmeses1    = 0;
    vvlrec     = 0;
    voutrosrec = 0;
  ELSIF vttrec>0 THEN
    vmeses1    = (vdias1/30)/vttrec;
  END IF;
  IF vmeses1<0 THEN
    vmeses1    = 0;
  END IF;
  SELECT
    pdata-a.vecto,
    valor,desco,vl_despesas
    INTO vdias2,vvalor,vdesco,vdespcart
    FROM ONLY gestao.ctp a
    where a.id_ctp=pidctp;
  vmeses2 = vdias2/30;
  --RAISE NOTICE 'vdias2: %, Meses 1: % , Meses : %, Vl Rec: %, Outros Rec: %',vdias2,vmeses1,vmeses2,vvlrec,voutrosrec;
  IF pforma='S' THEN
    vpv    = vvlrec/(1+(ptaxa*vmeses1/100));

    vsaldo = vvalor - vdesco + vdespcart - vpv - voutrosrec;

    vfv    = vsaldo*(1+(ptaxa*vmeses2/100));
  ELSEIF pforma='C' THEN
    vpv    = vvlrec/((1+(ptaxa/100))^vmeses1);

--  ALTERADO POR JCS EM 18/06/2012 AS 14:45
--  vsaldo = vvalor - vdesco + vdespcart - vpv;
    vsaldo = vvalor - vdesco + vdespcart - vpv - voutrosrec;

    vfv    = vsaldo*((1+(ptaxa/100))^vmeses2);
  ELSE
    RAISE EXCEPTION 'Forma de cálculo juros só pode ser Simples ou Composta (S/C).';
  END IF;
  vjuros = (vvlrec-vpv)+(vfv-vsaldo);
  IF vjuros<0 THEN
    vjuros = 0 ;
  END IF;
--  RAISE NOTICE 'Valor Presente: % ',vpv;
  RETURN vjuros;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
--RUN--

CREATE OR REPLACE FUNCTION gerente.valida_ctr()
  RETURNS "trigger" AS
$BODY$
    BEGIN

      IF TG_OP='DELETE' THEN
        IF (select count(*) from gestao.boleto where id_origem='CTR'||OLD.id_ctr)>0 THEN
          RAISE EXCEPTION 'Impossivel excluir contas a receber! Já existe boleto vinculado!';
        END IF;
      END IF;
      
      IF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        RETURN NEW;
      ELSE
        RETURN OLD;
      END IF;
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
--RUN--

DROP TRIGGER valida_ctr ON gerente.ctr;
--RUN--IGNORE ERRO

CREATE TRIGGER valida_ctr
  BEFORE INSERT OR UPDATE OR DELETE
  ON gerente.ctr
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.valida_ctr();
--RUN--

CREATE OR REPLACE FUNCTION gestao.replica_produto()
  RETURNS trigger AS
$BODY$

    DECLARE
      vempresa     integer;
      vemp_prod    integer;
      vatualiza    smallint;
      vschema      character varying(20);
      vid_produto  integer;
      vdt_icmsst   character varying(15);
      vdt_reajuste character varying(15);
      vdt1_promo   character varying(15);
      vdt2_promo   character varying(15);
      vflag        int;
      vdescricao   character varying(75);
      vdescr_det   character varying(150);


    BEGIN

      --FAZ VERIFICAÇÃO PARA NÃO ENTRAR EM LOOP ENTRE AS TRIGGERS
      EXECUTE 'SELECT count(*) FROM pg_stat_activity WHERE datname=current_database() AND application_name=''postgres_fdw'' AND state=''active'' AND client_port=inet_client_port();' INTO vflag;
      IF vflag>0 THEN
        IF TG_OP='DELETE' THEN
          RETURN OLD;
        ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN        
          RETURN NEW;
        END IF;        
      END IF;
    
      IF TG_OP='DELETE' THEN
        vempresa= OLD.id_empresa;
      ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        vempresa= NEW.id_empresa;
      END IF;

      vatualiza = (SELECT valor FROM gestao.registro WHERE chave='Empresa:'||vempresa||'/Tab. Estrangeira' AND nome='Produto');
      vschema   = (SELECT trim(valor)||'.produto' FROM gestao.registro WHERE chave='Empresa:'||vempresa||'/Tab. Estrangeira' AND nome='Nome');
      vemp_prod = (SELECT valor FROM gestao.registro WHERE chave='Empresa:'||vempresa||'/Tab. Estrangeira' AND nome='Empresa');

      IF vatualiza IS NULL THEN
        vatualiza=0;
      END IF;
      
      IF vatualiza=1 THEN

        IF TG_OP='DELETE' THEN
          EXECUTE 'DELETE FROM '||vschema||' WHERE id_erp='||OLD.id_erp||' AND id_empresa='||vemp_prod||';';         
        ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
               
          EXECUTE 'SELECT id_produto FROM '||vschema||' WHERE id_erp='||NEW.id_erp||' AND id_empresa='||vemp_prod||';' INTO vid_produto;          

          IF NEW.data_icmsst_cobrant IS NOT NULL THEN
            vdt_icmsst = ''''||NEW.data_icmsst_cobrant||'''';
          ELSE
            vdt_icmsst = 'null';
          END IF;
          IF NEW.data_reajuste IS NOT NULL THEN
            vdt_reajuste = ''''||NEW.data_reajuste||'''';
          ELSE
            vdt_reajuste = 'null';
          END IF;
          IF NEW.dt1_promocao IS NOT NULL THEN
            vdt1_promo = ''''||NEW.dt1_promocao||'''';
          ELSE
            vdt1_promo = 'null';
          END IF;
          IF NEW.dt2_promocao IS NOT NULL THEN
            vdt2_promo = ''''||NEW.dt2_promocao||'''';
          ELSE
            vdt2_promo = 'null';
          END IF;
          vdescricao = replace(NEW.descricao,'''',' ');
          vdescr_det = replace(NEW.descr_det,'''',' ');
          vdescricao = replace(vdescricao,'"',' ');
          vdescr_det = replace(vdescr_det,'"',' ');
                              
          IF vid_produto IS NULL OR vid_produto=0 THEN
                    
            EXECUTE format('INSERT INTO '||vschema||
                     ' (id_produto, id_empresa, codigo, descricao, referencia, cod_barra, cod_anterior, unidade,'
                     'tipo, cod_ncm, ex_ipi, cod_genero, cod_class_servico, aliq_icms, id_ctbconta, utilizacao, cod_grupo,'
                     'cod_subgrupo, cod_st, data_cadastro, ativo, bc_icmsst_cobrant, vl_icmsst_cobrant,'
                     'data_icmsst_cobrant, docto_icmsst_cobrant, aliq_ipi, red_bc_icms, bc_icms_st, cod_classificacao,'
                     'id_ctbconta_ept, id_ctbconta_dtp, id_ctbconta_desp, vol_m3, id_prodvinc, cod_marca, descr_det,'
                     'data_reajuste, lista_pauta, preco_promocional, peso_liquido, peso_bruto, qtd_volume,'
                     'cod_estlocal, dt_atual, taxa_comissao, id_erp, carac1, carac2, carac3, carac4, carac5, cod_acess1,'
                     'cod_acess2, cod_acess3, classe_abc, subcategoria, cod_secao, taxa_margem1, dt1_promocao, dt2_promocao,'
                     'pr_sugerido, vendido_peso, exportar_balanca, validade_dias, usuario_atual, estoque_minimo, data, hora,'
                     'qtd_und_compra, custo_rep, origem, cod_base_cred_pis_cofins, produto_grade, id_gradev, id_gradeh,'
                     'id_produto_grade, id_gradedetv, id_gradedeth, controlar_estoque, cod_estrutura, cst_pis, aliq_pis,'
                     'aliq_vl_pis, cst_cofins, aliq_cofins, aliq_vl_cofins, largura, altura, id_acabamento, id_vidro, id_vista,'
                     'l1, l2, l3, l4, h1, h2, h3, h4, comprimento, peso_metro, nat_receita, cfop_ecf, certsanit_obs, prod_lei12546,'
                     'cod_ativ_lei12546, obs_preco, enviar_web, liga, tempera, dimensoes, site_produto, anotacao_produto,'
                     'cod_contrib, nao_custo_entrada, familia, id_erp_estoque, tx_perda_proc, vl_parc_imp, num_fci, tx_cont_imp,'
                     'vl_imp, permite_acessorios, lote_min, lote_mul, cod_uen, descr_nf, aplicacao, ind_est, cod_original,'
                     'qtd_embalagem, grupo_st, cest, cod_prod_anp, taxa_margem2, taxa_margem3, preco_pratic_sug, temp_armaz,'
                     'est_pedido, est_maximo, complemento, local_estoque, preco_dif_grade, req_insumos_estrutura, versao_estrutura,'
                     'peso_embal, markup_despfixas1, markup_impostos1, markup_comissao1, markup_lucro1, markup_desconto1, markup_financ1,'
                     'markup_frete1, desc_adic, cnpj_produtor, codigo_selo, qtd_selo_und, qtd_trib_ipi_und, produto_especifico,'
                     'vl_unid_trib_ipi, qtd_trib_pis_und, vl_unid_trib_pis, qtd_trib_pisst_und, vl_unid_trib_pisst, qtd_trib_cofins_und,'
                     'vl_unid_trib_cofins, qtd_trib_cofinsst_und, vl_unid_trib_cofinsst, preco_max_cons, markup_marketing, cod_ccusto,'
                     'id_natureza, lote_mul_venda, permitir_dif_lote, transelevador, tipo_caixa, ind_escala, cnpj_fab, cod_prod_anvisa,'
                     'descr_prod_anp, tx_desc_lote, cest_ex, vl_icms_cobrant, mot_isen_anvisa)'
               'VALUES ((SELECT max(id_produto)+1 from '||vschema||'),'||vemp_prod||','''||NEW.codigo||''','''||vdescricao||''','''||coalesce(NEW.referencia,'')||''','''||coalesce(NEW.cod_barra,'')||''','
                   ''''||coalesce(NEW.cod_anterior,'')||''','''||NEW.unidade||''','''||NEW.tipo||''','||NEW.cod_ncm||','''||NEW.ex_ipi||''','''||NEW.cod_genero||''','
                   ''''||coalesce(NEW.cod_class_servico,'')||''','||coalesce(NEW.aliq_icms,0)||','||coalesce(NEW.id_ctbconta::text,'null')||','''||coalesce(NEW.utilizacao,'')||''','
                   ''||NEW.cod_grupo||','||NEW.cod_subgrupo||','||NEW.cod_st||','''||NEW.data_cadastro||''','||NEW.ativo||','
                   ''||coalesce(NEW.bc_icmsst_cobrant,0)||','||coalesce(NEW.vl_icmsst_cobrant,0)||','||vdt_icmsst||','||coalesce(NEW.docto_icmsst_cobrant::text,'null')||','||coalesce(NEW.aliq_ipi::text,'null')||','||coalesce(NEW.red_bc_icms::text,'null')||','
                   ''||coalesce(NEW.bc_icms_st,0)||','||coalesce(NEW.cod_classificacao::text,'null')||','||coalesce(NEW.id_ctbconta_ept::text,'null')||','||coalesce(NEW.id_ctbconta_dtp::text,'null')||','
                   ''||coalesce(NEW.id_ctbconta_desp::text,'null')||','||coalesce(NEW.vol_m3,0)||','||coalesce(NEW.id_prodvinc::text,'null')||','
                   ''||NEW.cod_marca||','''||vdescr_det||''','||vdt_reajuste||','||NEW.lista_pauta||','||NEW.preco_promocional||','
                   ''||NEW.peso_liquido||','||NEW.peso_bruto||','||NEW.qtd_volume||','||NEW.cod_estlocal||','''||NEW.dt_atual||''','
                   ''||coalesce(NEW.taxa_comissao,0)||','||NEW.id_erp||','''||coalesce(NEW.carac1,'')||''','''||coalesce(NEW.carac2,'')||''','''||coalesce(NEW.carac3,'')||''','
                   ''''||coalesce(NEW.carac4,'')||''','''||coalesce(NEW.carac5,'')||''','||coalesce(NEW.cod_acess1::text,'null')||','||coalesce(NEW.cod_acess2::text,'null')||','||coalesce(NEW.cod_acess3::text,'null')||','
                   ''''||coalesce(NEW.classe_abc,'')||''','||coalesce(NEW.subcategoria::text,'null')||','||coalesce(NEW.cod_secao::text,'null')||','||NEW.taxa_margem1||','
                   ''||vdt1_promo||','||vdt2_promo||','||coalesce(NEW.pr_sugerido,0)||','||coalesce(NEW.vendido_peso,0)||','
                   ''||coalesce(NEW.exportar_balanca,0)||','||coalesce(NEW.validade_dias,0)||','''||coalesce(NEW.usuario_atual,'')||''','
                   ''||coalesce(NEW.estoque_minimo,0)||','''||NEW.data||''','''||NEW.hora||''','||coalesce(NEW.qtd_und_compra,0)||','||coalesce(NEW.custo_rep,0)||','
                   ''||coalesce(NEW.origem::text,'null')||','''||coalesce(NEW.cod_base_cred_pis_cofins,'')||''','||coalesce(NEW.produto_grade::text,'null')||','
                   ''||coalesce(NEW.id_gradev::text,'null')||','||coalesce(NEW.id_gradeh::text,'null')||','||coalesce(NEW.id_produto_grade::text,'null')||','||coalesce(NEW.id_gradedetv::text,'null')||','
                   ''||coalesce(NEW.id_gradedeth::text,'null')||','||NEW.controlar_estoque||','''||coalesce(NEW.cod_estrutura,'')||''','''||coalesce(NEW.cst_pis,'')||''','
                   ''||coalesce(NEW.aliq_pis,0)||','||coalesce(NEW.aliq_vl_pis,0)||','''||coalesce(NEW.cst_cofins,'')||''','||coalesce(NEW.aliq_cofins,0)||','
                   ''||coalesce(NEW.aliq_vl_cofins,0)||','||coalesce(NEW.largura,0)||','||coalesce(NEW.altura,0)||','||coalesce(NEW.id_acabamento::text,'null')||','||coalesce(NEW.id_vidro::text,'null')||','
                   ''||coalesce(NEW.id_vista::text,'null')||','||coalesce(NEW.l1::text,'null')||','||coalesce(NEW.l2::text,'null')||','||coalesce(NEW.l3::text,'null')||','||coalesce(NEW.l4::text,'null')||','||coalesce(NEW.h1::text,'null')||','||coalesce(NEW.h2::text,'null')||','||coalesce(NEW.h3::text,'null')||','||coalesce(NEW.h4::text,'null')||','
                   ''||coalesce(NEW.comprimento,0)||','||coalesce(NEW.peso_metro,0)||','''||coalesce(NEW.nat_receita,'')||''','||coalesce(NEW.cfop_ecf::text,'null')||','
                   ''||coalesce(NEW.certsanit_obs::text,'null')||','||NEW.prod_lei12546||','''||coalesce(NEW.cod_ativ_lei12546,'')||''','''||coalesce(NEW.obs_preco,'')||''','
                   ''||coalesce(NEW.enviar_web,0)||','''||coalesce(NEW.liga,'')||''','''||coalesce(NEW.tempera,'')||''','''||coalesce(NEW.dimensoes,'')||''','''||coalesce(NEW.site_produto,'')||''','
                   ''''||coalesce(NEW.anotacao_produto,'')||''','''||coalesce(NEW.cod_contrib,'')||''','||coalesce(NEW.nao_custo_entrada::text,'null')||','''||coalesce(NEW.familia,'')||''','
                   ''||coalesce(NEW.id_erp_estoque::text,'null')||','||coalesce(NEW.tx_perda_proc,0)||','||coalesce(NEW.vl_parc_imp,0)||','''||coalesce(NEW.num_fci,'')||''','
                   ''||coalesce(NEW.tx_cont_imp,0)||','||coalesce(NEW.vl_imp,0)||','''||coalesce(NEW.permite_acessorios,'')||''','||coalesce(NEW.lote_min::text,'null')||','
                   ''||coalesce(NEW.lote_mul,0)||','||coalesce(NEW.cod_uen::text,'null')||','''||coalesce(NEW.descr_nf,'')||''','||coalesce(NEW.aplicacao::text,'null')||','||coalesce(NEW.ind_est,0)||','
                   ''''||coalesce(NEW.cod_original,'')||''','||coalesce(NEW.qtd_embalagem,0)||','''||coalesce(NEW.grupo_st,'')||''','||coalesce(NEW.cest::text,'null')||','||coalesce(NEW.cod_prod_anp::text,'null')||','
                   ''||coalesce(NEW.taxa_margem2,0)||','||coalesce(NEW.taxa_margem3,0)||','||coalesce(NEW.preco_pratic_sug,0)||','||coalesce(NEW.temp_armaz::text,'null')||','
                   ''||coalesce(NEW.est_pedido::text,'null')||','||coalesce(NEW.est_maximo::text,'null')||','''||coalesce(NEW.complemento,'')||''','''||coalesce(NEW.local_estoque,'')||''','
                   ''||coalesce(NEW.preco_dif_grade::text,'null')||','||coalesce(NEW.req_insumos_estrutura::text,'null')||','''||coalesce(NEW.versao_estrutura,'')||''','
                   ''||coalesce(NEW.peso_embal::text,'null')||','||coalesce(NEW.markup_despfixas1::text,'null')||','||coalesce(NEW.markup_impostos1::text,'null')||','
                   ''||coalesce(NEW.markup_comissao1::text,'null')||','||coalesce(NEW.markup_lucro1::text,'null')||','||coalesce(NEW.markup_desconto1::text,'null')||','
                   ''||coalesce(NEW.markup_financ1::text,'null')||','||coalesce(NEW.markup_frete1::text,'null')||','||coalesce(NEW.desc_adic::text,'null')||','''||coalesce(NEW.cnpj_produtor,'')||''','
                   ''''||coalesce(NEW.codigo_selo,'')||''','||coalesce(NEW.qtd_selo_und::text,'null')||','||coalesce(NEW.qtd_trib_ipi_und::text,'null')||','
                   ''''||coalesce(NEW.produto_especifico,'')||''','||coalesce(NEW.vl_unid_trib_ipi::text,'null')||','||coalesce(NEW.qtd_trib_pis_und::text,'null')||','
                   ''||coalesce(NEW.vl_unid_trib_pis::text,'null')||','||coalesce(NEW.qtd_trib_pisst_und::text,'null')||','||coalesce(NEW.vl_unid_trib_pisst::text,'null')||','
                   ''||coalesce(NEW.qtd_trib_cofins_und::text,'null')||','||coalesce(NEW.vl_unid_trib_cofins::text,'null')||','||coalesce(NEW.qtd_trib_cofinsst_und::text,'null')||','
                   ''||coalesce(NEW.vl_unid_trib_cofinsst::text,'null')||','||coalesce(NEW.preco_max_cons::text,'null')||','||coalesce(NEW.markup_marketing::text,'null')||','
                   ''||coalesce(NEW.cod_ccusto::text,'null')||','||coalesce(NEW.id_natureza::text,'null')||','||coalesce(NEW.lote_mul_venda::text,'null')||','||NEW.permitir_dif_lote||','
                   ''||coalesce(NEW.transelevador,0)||','''||coalesce(NEW.tipo_caixa,'')||''','''||coalesce(NEW.ind_escala,'')||''','''||coalesce(NEW.cnpj_fab,'')||''','
                   ''''||coalesce(NEW.cod_prod_anvisa,'')||''','''||coalesce(NEW.descr_prod_anp,'')||''','||coalesce(NEW.tx_desc_lote::text,'null')||','
                   ''||coalesce(NEW.cest_ex::text,'null')||','||coalesce(NEW.vl_icms_cobrant::text,'null')||','''||coalesce(NEW.mot_isen_anvisa,'')||''');');

          ELSE
            EXECUTE format('UPDATE '||vschema||
                   ' SET codigo='''||NEW.codigo||''',descricao='''||vdescricao||''',referencia='''||coalesce(NEW.referencia,'')||''',cod_barra='''||coalesce(NEW.cod_barra,'')||''','
                   'cod_anterior='''||coalesce(NEW.cod_anterior,'')||''',unidade='''||NEW.unidade||''',tipo='''||NEW.tipo||''',cod_ncm='||NEW.cod_ncm||',ex_ipi='''||coalesce(NEW.ex_ipi,'')||''','
                   'cod_genero='''||coalesce(NEW.cod_genero,'')||''',cod_class_servico='''||coalesce(NEW.cod_class_servico,'')||''',aliq_icms='||coalesce(NEW.aliq_icms,0)||','
                   'id_ctbconta='||coalesce(NEW.id_ctbconta::text,'null')||',utilizacao='''||coalesce(NEW.utilizacao,'')||''',cod_grupo='||NEW.cod_grupo||',cod_subgrupo='||NEW.cod_subgrupo||','
                   'cod_st='||NEW.cod_st||',data_cadastro='''||NEW.data_cadastro||''',ativo='||NEW.ativo||','
                   'bc_icmsst_cobrant='||coalesce(NEW.bc_icmsst_cobrant,0)||',vl_icmsst_cobrant='||coalesce(NEW.vl_icmsst_cobrant,0)||',data_icmsst_cobrant='||vdt_icmsst||','
                   'docto_icmsst_cobrant='||coalesce(NEW.docto_icmsst_cobrant::text,'null')||',aliq_ipi='||coalesce(NEW.aliq_ipi::text,'null')||',red_bc_icms='||coalesce(NEW.red_bc_icms::text,'null')||','
                   'bc_icms_st='||coalesce(NEW.bc_icms_st::text,'null')||',cod_classificacao='||coalesce(NEW.cod_classificacao::text,'null')||',id_ctbconta_ept='||coalesce(NEW.id_ctbconta_ept::text,'null')||','
                   'id_ctbconta_dtp='||coalesce(NEW.id_ctbconta_dtp::text,'null')||',id_ctbconta_desp='||coalesce(NEW.id_ctbconta_desp::text,'null')||',vol_m3='||coalesce(NEW.vol_m3,0)||',id_prodvinc='||coalesce(NEW.id_prodvinc::text,'null')||','
                   'cod_marca='||NEW.cod_marca||',descr_det='''||vdescr_det||''',data_reajuste='||vdt_reajuste||',lista_pauta='||coalesce(NEW.lista_pauta,0)||','
                   'preco_promocional='||coalesce(NEW.preco_promocional,0)||',peso_liquido='||coalesce(NEW.peso_liquido,0)||','
                   'peso_bruto='||coalesce(NEW.peso_bruto,0)||',qtd_volume='||coalesce(NEW.qtd_volume,0)||',cod_estlocal='||NEW.cod_estlocal||',dt_atual='''||NEW.dt_atual||''','
                   'taxa_comissao='||coalesce(NEW.taxa_comissao,0)||',id_erp='||NEW.id_erp||',carac1='''||coalesce(NEW.carac1,'')||''',carac2='''||coalesce(NEW.carac2,'')||''',carac3='''||coalesce(NEW.carac3,'')||''','
                   'carac4='''||coalesce(NEW.carac4,'')||''',carac5='''||coalesce(NEW.carac5,'')||''',cod_acess1='||coalesce(NEW.cod_acess1::text,'null')||',cod_acess2='||coalesce(NEW.cod_acess2::text,'null')||',cod_acess3='||coalesce(NEW.cod_acess3::text,'null')||','
                   'classe_abc='''||coalesce(NEW.classe_abc,'')||''',subcategoria='||coalesce(NEW.subcategoria::text,'null')||',cod_secao='||coalesce(NEW.cod_secao::text,'null')||',taxa_margem1='||coalesce(NEW.taxa_margem1::text,'null')||','
                   'dt1_promocao='||vdt1_promo||',dt2_promocao='||vdt2_promo||',pr_sugerido='||coalesce(NEW.pr_sugerido,0)||',vendido_peso='||coalesce(NEW.vendido_peso,0)||','
                   'exportar_balanca='||coalesce(NEW.exportar_balanca,0)||',validade_dias='||coalesce(NEW.validade_dias,0)||',usuario_atual='''||coalesce(NEW.usuario_atual,'')||''','
                   'estoque_minimo='||coalesce(NEW.estoque_minimo,0)||',data='''||NEW.data||''',hora='''||NEW.hora||''',qtd_und_compra='||coalesce(NEW.qtd_und_compra,0)||',custo_rep='||coalesce(NEW.custo_rep,0)||','
                   'origem='||coalesce(NEW.origem::text,'null')||',cod_base_cred_pis_cofins='''||coalesce(NEW.cod_base_cred_pis_cofins,'')||''',produto_grade='||coalesce(NEW.produto_grade::text,'null')||','
                   'id_gradev='||coalesce(NEW.id_gradev::text,'null')||',id_gradeh='||coalesce(NEW.id_gradeh::text,'null')||',id_produto_grade='||coalesce(NEW.id_produto_grade::text,'null')||',id_gradedetv='||coalesce(NEW.id_gradedetv::text,'null')||','
                   'id_gradedeth='||coalesce(NEW.id_gradedeth::text,'null')||',controlar_estoque='||NEW.controlar_estoque||',cod_estrutura='''||coalesce(NEW.cod_estrutura,'')||''',cst_pis='''||coalesce(NEW.cst_pis,'')||''','
                   'aliq_pis='||coalesce(NEW.aliq_pis,0)||',aliq_vl_pis='||coalesce(NEW.aliq_vl_pis,0)||',cst_cofins='''||coalesce(NEW.cst_cofins::text,'')||''',aliq_cofins='||coalesce(NEW.aliq_cofins,0)||','
                   'aliq_vl_cofins='||coalesce(NEW.aliq_vl_cofins,0)||',largura='||coalesce(NEW.largura,0)||',altura='||coalesce(NEW.altura,0)||',id_acabamento='||coalesce(NEW.id_acabamento::text,'null')||',id_vidro='||coalesce(NEW.id_vidro::text,'null')||','
                   'id_vista='||coalesce(NEW.id_vista::text,'null')||',l1='||coalesce(NEW.l1::text,'null')||',l2='||coalesce(NEW.l2::text,'null')||',l3='||coalesce(NEW.l3::text,'null')||',l4='||coalesce(NEW.l4::text,'null')||',h1='||coalesce(NEW.h1::text,'null')||', h2='||coalesce(NEW.h2::text,'null')||',h3='||coalesce(NEW.h3::text,'null')||',h4='||coalesce(NEW.h4::text,'null')||','
                   'comprimento='||coalesce(NEW.comprimento,0)||',peso_metro='||coalesce(NEW.peso_metro,0)||',nat_receita='''||coalesce(NEW.nat_receita,'')||''',cfop_ecf='||coalesce(NEW.cfop_ecf::text,'null')||','
                   'certsanit_obs='||coalesce(NEW.certsanit_obs::text,'null')||', prod_lei12546='||NEW.prod_lei12546||',cod_ativ_lei12546='''||coalesce(NEW.cod_ativ_lei12546,'')||''',obs_preco='''||coalesce(NEW.obs_preco,'')||''','
                   'enviar_web='||coalesce(NEW.enviar_web,0)||',liga='''||coalesce(NEW.liga,'')||''',tempera='''||coalesce(NEW.tempera,'')||''',dimensoes='''||coalesce(NEW.dimensoes,'')||''',site_produto='''||coalesce(NEW.site_produto,'')||''','
                   'anotacao_produto='''||coalesce(NEW.anotacao_produto,'')||''',cod_contrib='''||coalesce(NEW.cod_contrib,'')||''',nao_custo_entrada='||coalesce(NEW.nao_custo_entrada::text,'null')||',familia='''||coalesce(NEW.familia,'')||''','
                   'id_erp_estoque='||coalesce(NEW.id_erp_estoque::text,'null')||',tx_perda_proc='||coalesce(NEW.tx_perda_proc,0)||',vl_parc_imp='||coalesce(NEW.vl_parc_imp,0)||',num_fci='''||coalesce(NEW.num_fci,'')||''','
                   'tx_cont_imp='||coalesce(NEW.tx_cont_imp,0)||',vl_imp='||coalesce(NEW.vl_imp,0)||',permite_acessorios='''||coalesce(NEW.permite_acessorios,'')||''',lote_min='||coalesce(NEW.lote_min::text,'null')||','
                   'lote_mul='||coalesce(NEW.lote_mul,0)||',cod_uen='||coalesce(NEW.cod_uen::text,'null')||',descr_nf='''||coalesce(NEW.descr_nf,'')||''',aplicacao='||coalesce(NEW.aplicacao::text,'null')||',ind_est='||coalesce(NEW.ind_est,0)||','
                   'cod_original='''||coalesce(NEW.cod_original,'')||''',qtd_embalagem='||coalesce(NEW.qtd_embalagem,0)||',grupo_st='''||coalesce(NEW.grupo_st,'')||''',cest='||coalesce(NEW.cest::text,'null')||',cod_prod_anp='||coalesce(NEW.cod_prod_anp::text,'null')||','
                   'taxa_margem2='||coalesce(NEW.taxa_margem2,0)||',taxa_margem3='||coalesce(NEW.taxa_margem3,0)||',preco_pratic_sug='||coalesce(NEW.preco_pratic_sug,0)||',temp_armaz='||coalesce(NEW.temp_armaz::text,'null')||','
                   'est_pedido='||coalesce(NEW.est_pedido::text,'null')||',est_maximo='||coalesce(NEW.est_maximo::text,'null')||',complemento='''||coalesce(NEW.complemento,'')||''',local_estoque='''||coalesce(NEW.local_estoque,'')||''','
                   'preco_dif_grade='||coalesce(NEW.preco_dif_grade::text,'null')||',req_insumos_estrutura='||coalesce(NEW.req_insumos_estrutura::text,'null')||',versao_estrutura='''||coalesce(NEW.versao_estrutura,'')||''','
                   'peso_embal='||coalesce(NEW.peso_embal::text,'null')||',markup_despfixas1='||coalesce(NEW.markup_despfixas1::text,'null')||',markup_impostos1='||coalesce(NEW.markup_impostos1::text,'null')||','
                   'markup_comissao1='||coalesce(NEW.markup_comissao1::text,'null')||',markup_lucro1='||coalesce(NEW.markup_lucro1::text,'null')||',markup_desconto1='||coalesce(NEW.markup_desconto1::text,'null')||','
                   'markup_financ1='||coalesce(NEW.markup_financ1::text,'null')||',markup_frete1='||coalesce(NEW.markup_frete1::text,'null')||',desc_adic='||coalesce(NEW.desc_adic::text,'null')||',cnpj_produtor='''||coalesce(NEW.cnpj_produtor,'')||''','
                   'codigo_selo='''||coalesce(NEW.codigo_selo,'')||''',qtd_selo_und='||coalesce(NEW.qtd_selo_und::text,'null')||',qtd_trib_ipi_und='||coalesce(NEW.qtd_trib_ipi_und::text,'null')||','
                   'produto_especifico='''||coalesce(NEW.produto_especifico,'')||''',vl_unid_trib_ipi='||coalesce(NEW.vl_unid_trib_ipi::text,'null')||',qtd_trib_pis_und='||coalesce(NEW.qtd_trib_pis_und::text,'null')||','
                   'vl_unid_trib_pis='||coalesce(NEW.vl_unid_trib_pis::text,'null')||',qtd_trib_pisst_und='||coalesce(NEW.qtd_trib_pisst_und::text,'null')||',vl_unid_trib_pisst='||coalesce(NEW.vl_unid_trib_pisst::text,'null')||','
                   'qtd_trib_cofins_und='||coalesce(NEW.qtd_trib_cofins_und::text,'null')||',vl_unid_trib_cofins='||coalesce(NEW.vl_unid_trib_cofins::text,'null')||',qtd_trib_cofinsst_und='||coalesce(NEW.qtd_trib_cofinsst_und::text,'null')||','
                   'vl_unid_trib_cofinsst='||coalesce(NEW.vl_unid_trib_cofinsst::text,'null')||',preco_max_cons='||coalesce(NEW.preco_max_cons::text,'null')||',markup_marketing='||coalesce(NEW.markup_marketing::text,'null')||','
                   'cod_ccusto='||coalesce(NEW.cod_ccusto::text,'null')||',id_natureza='||coalesce(NEW.id_natureza::text,'null')||',lote_mul_venda='||coalesce(NEW.lote_mul_venda::text,'null')||',permitir_dif_lote='||NEW.permitir_dif_lote||','
                   'transelevador='||coalesce(NEW.transelevador,0)||',tipo_caixa='''||coalesce(NEW.tipo_caixa,'')||''',ind_escala='''||coalesce(NEW.ind_escala,'')||''',cnpj_fab='''||coalesce(NEW.cnpj_fab,'')||''','
                   'cod_prod_anvisa='''||coalesce(NEW.cod_prod_anvisa,'')||''',descr_prod_anp='''||coalesce(NEW.descr_prod_anp,'')||''',tx_desc_lote='||coalesce(NEW.tx_desc_lote::text,'null')||','
                   'cest_ex='||coalesce(NEW.cest_ex::text,'null')||',vl_icms_cobrant='||coalesce(NEW.vl_icms_cobrant::text,'null')||',mot_isen_anvisa='''||coalesce(NEW.mot_isen_anvisa,'')||''''
                   ' WHERE id_produto='||vid_produto||';');
          END IF;                    
        END IF;  
      END IF;  

      IF TG_OP='DELETE' THEN
        RETURN OLD;
      ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN        
        RETURN NEW;
      END IF;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION gestao.replica_produto()
  OWNER TO postgres;
--RUN--

CREATE OR REPLACE FUNCTION gestao.replica_grupo()
  RETURNS trigger AS
$BODY$

    DECLARE
      vempresa  integer;
      vemp_prod integer;
      vatualiza smallint;
      vschema   character varying(20);
      vid_grupo integer;
      vflag     int;

    BEGIN

      --FAZ VERIFICAÇÃO PARA NÃO ENTRAR EM LOOP ENTRE AS TRIGGERS
      EXECUTE 'SELECT count(*) FROM pg_stat_activity WHERE datname=current_database() AND application_name=''postgres_fdw'' AND state=''active'' AND client_port=inet_client_port();' INTO vflag;
      IF vflag>0 THEN
        IF TG_OP='DELETE' THEN
          RETURN OLD;
        ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN        
          RETURN NEW;
        END IF;        
      END IF;
    
      IF TG_OP='DELETE' THEN
        vempresa= OLD.id_empresa;
      ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        vempresa= NEW.id_empresa;
      END IF;

      vatualiza = (SELECT valor FROM gestao.registro WHERE chave='Empresa:'||vempresa||'/Tab. Estrangeira' AND nome='Produto');
      vschema   = (SELECT trim(valor)||'.grupo' FROM gestao.registro WHERE chave='Empresa:'||vempresa||'/Tab. Estrangeira' AND nome='Nome');
      vemp_prod = (SELECT valor FROM gestao.registro WHERE chave='Empresa:'||vempresa||'/Tab. Estrangeira' AND nome='Empresa');

      IF vatualiza IS NULL THEN
        vatualiza=0;
      END IF;      

      IF vatualiza=1 THEN

        IF TG_OP='DELETE' THEN
          EXECUTE 'DELETE FROM '||vschema||' WHERE codigo='||OLD.codigo||' AND id_empresa='||vemp_prod||';';
        ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
               
          EXECUTE 'SELECT id_grupo FROM '||vschema||' WHERE codigo='||NEW.codigo||' AND id_empresa='||vemp_prod||';' INTO vid_grupo;
                              
          IF vid_grupo IS NULL OR vid_grupo=0 THEN
                    
            EXECUTE format('INSERT INTO '||vschema||
                     ' (id_grupo, id_empresa, codigo, nome, tipo, estmi, estma, estpe, '
                     'da, ha, nao_imp_pauta, desc_padrao, desc_max, sobre_preco, int_sar, '
                     'resultado, id_nat_estoque, vip, subgrupo_acessorios, mascara_referencia, '
                     'taxa_comissao, taxa_contrib, gerar_cod_ean, cod_ean1, '
                     'cod_ean2, produto_variacao, ordem_pauta, id_ctbconta, id_ctbconta_desp, '
                     'id_ctbconta_ept, id_ctbconta_dtp, ativo, cod_ccusto, id_natureza, '
                     'taxa_margem1, taxa_margem2, taxa_margem3, preco_pratic_sug)'
               'VALUES ((SELECT max(id_grupo)+1 from '||vschema||'),'||vemp_prod||','||NEW.codigo||','''||NEW.nome||''','||NEW.tipo||','||coalesce(NEW.estmi,0)||','
                   ''||coalesce(NEW.estma,0)||','||coalesce(NEW.estpe,0)||','''||NEW.da||''','''||NEW.ha||''','||coalesce(NEW.nao_imp_pauta,0)||','||coalesce(NEW.desc_padrao,0)||','
                   ''||coalesce(NEW.desc_max,0)||','||coalesce(NEW.sobre_preco,0)||','||coalesce(NEW.int_sar,0)||','||coalesce(NEW.resultado,0)||','
                   ''||coalesce(NEW.id_nat_estoque::text,'null')||','||coalesce(NEW.vip,0)||','''||NEW.subgrupo_acessorios||''','''||coalesce(NEW.mascara_referencia,'')||''','
                   ''||coalesce(NEW.taxa_comissao,0)||','||coalesce(NEW.taxa_contrib,0)||','||coalesce(NEW.gerar_cod_ean,0)||','''||coalesce(NEW.cod_ean1,'')||''','
                   ''''||coalesce(NEW.cod_ean2,'')||''','||coalesce(NEW.produto_variacao,0)||','||coalesce(NEW.ordem_pauta::text,'null')||','||coalesce(NEW.id_ctbconta::text,'null')||','
                   ''||coalesce(NEW.id_ctbconta_desp::text,'null')||','||coalesce(NEW.id_ctbconta_ept::text,'null')||','||coalesce(NEW.id_ctbconta_dtp::text,'null')||','
                   ''||NEW.ativo||','||coalesce(NEW.cod_ccusto::text,'null')||','||coalesce(NEW.id_natureza::text,'null')||','||coalesce(NEW.taxa_margem1::text,'null')||','
                   ''||coalesce(NEW.taxa_margem2::text,'null')||','||coalesce(NEW.taxa_margem3::text,'null')||','||coalesce(NEW.preco_pratic_sug::text,'null')||');');
                   
          ELSE
            EXECUTE format('UPDATE '||vschema||
                   ' SET codigo='||NEW.codigo||', nome='''||NEW.nome||''', tipo='||NEW.tipo||', estmi='||coalesce(NEW.estmi,0)||', estma='||coalesce(NEW.estma,0)||','
                   'estpe='||coalesce(NEW.estpe,0)||', da='''||NEW.da||''', ha='''||NEW.ha||''', nao_imp_pauta='||coalesce(NEW.nao_imp_pauta,0)||', desc_padrao='||coalesce(NEW.desc_padrao,0)||','
                   'desc_max='||coalesce(NEW.desc_max,0)||', sobre_preco='||coalesce(NEW.sobre_preco,0)||', int_sar='||coalesce(NEW.int_sar,0)||', resultado='||coalesce(NEW.resultado,0)||','
                   'id_nat_estoque='||coalesce(NEW.id_nat_estoque::text,'null')||', vip='||coalesce(NEW.vip,0)||', subgrupo_acessorios='''||NEW.subgrupo_acessorios||''','
                   'mascara_referencia='''||coalesce(NEW.mascara_referencia,'')||''', taxa_comissao='||coalesce(NEW.taxa_comissao,0)||', taxa_contrib='||coalesce(NEW.taxa_contrib,0)||','
                   'gerar_cod_ean='||coalesce(NEW.gerar_cod_ean,0)||', cod_ean1='''||coalesce(NEW.cod_ean1,'')||''', cod_ean2='''||coalesce(NEW.cod_ean2,'')||''','
                   'produto_variacao='||coalesce(NEW.produto_variacao,0)||', ordem_pauta='||coalesce(NEW.ordem_pauta::text,'null')||', id_ctbconta='||coalesce(NEW.id_ctbconta::text,'null')||','
                   'id_ctbconta_desp='||coalesce(NEW.id_ctbconta_desp::text,'null')||', id_ctbconta_ept='||coalesce(NEW.id_ctbconta_ept::text,'null')||', id_ctbconta_dtp='||coalesce(NEW.id_ctbconta_dtp::text,'null')||','
                   'ativo='||NEW.ativo||', cod_ccusto='||coalesce(NEW.cod_ccusto::text,'null')||', id_natureza='||coalesce(NEW.id_natureza::text,'null')||','
                   'taxa_margem1='||coalesce(NEW.taxa_margem1::text,'null')||', taxa_margem2='||coalesce(NEW.taxa_margem2::text,'null')||', taxa_margem3='||coalesce(NEW.taxa_margem3::text,'null')||','
                   'preco_pratic_sug='||coalesce(NEW.preco_pratic_sug::text,'null')||''
                   ' WHERE id_grupo='||vid_grupo||';');
          END IF;
        END IF;
      END IF;

      IF TG_OP='DELETE' THEN
        RETURN OLD;
      ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN        
        RETURN NEW;
      END IF;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION gestao.replica_grupo()
  OWNER TO postgres;
--RUN--

CREATE OR REPLACE FUNCTION gestao.replica_marca()
  RETURNS trigger AS
$BODY$

    DECLARE
      vempresa  integer;
      vemp_prod integer;
      vatualiza smallint;
      vschema   character varying(20);
      vid_marca integer;
      vflag     int;

    BEGIN

      --FAZ VERIFICAÇÃO PARA NÃO ENTRAR EM LOOP ENTRE AS TRIGGERS
      EXECUTE 'SELECT count(*) FROM pg_stat_activity WHERE datname=current_database() AND application_name=''postgres_fdw'' AND state=''active'' AND client_port=inet_client_port();' INTO vflag;
      IF vflag>0 THEN
        IF TG_OP='DELETE' THEN
          RETURN OLD;
        ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN        
          RETURN NEW;
        END IF;
      END IF;
    
      IF TG_OP='DELETE' THEN
        vempresa= OLD.id_empresa;
      ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        vempresa= NEW.id_empresa;
      END IF;

      vatualiza = (SELECT valor FROM gestao.registro WHERE chave='Empresa:'||vempresa||'/Tab. Estrangeira' AND nome='Produto');
      vschema   = (SELECT trim(valor)||'.marca' FROM gestao.registro WHERE chave='Empresa:'||vempresa||'/Tab. Estrangeira' AND nome='Nome');
      vemp_prod = (SELECT valor FROM gestao.registro WHERE chave='Empresa:'||vempresa||'/Tab. Estrangeira' AND nome='Empresa');

      IF vatualiza IS NULL THEN
        vatualiza=0;
      END IF;

      IF vatualiza=1 THEN

        IF TG_OP='DELETE' THEN
          EXECUTE 'DELETE FROM '||vschema||' WHERE codigo='||OLD.codigo||' AND id_empresa='||vemp_prod||';';
        ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN

          EXECUTE 'SELECT id_marca FROM '||vschema||' WHERE codigo='||NEW.codigo||' AND id_empresa='||vemp_prod||';' INTO vid_marca;

          IF vid_marca IS NULL OR vid_marca=0 THEN

            EXECUTE format('INSERT INTO '||vschema||
                     ' (id_marca, id_empresa, codigo, nome, da, ha, ativo)'
               'VALUES ((SELECT max(id_marca)+1 from '||vschema||'),'||vemp_prod||','||NEW.codigo||','''||NEW.nome||''','''||NEW.da||''','''||NEW.ha||''','||NEW.ativo||');');

          ELSE
            EXECUTE format('UPDATE '||vschema||
                   ' SET codigo='||NEW.codigo||', nome='''||NEW.nome||''', da='''||NEW.da||''', ha='''||NEW.ha||''', ativo='||NEW.ativo||''
                   ' WHERE id_marca='||vid_marca||';');
          END IF;
        END IF;
      END IF;

      IF TG_OP='DELETE' THEN
        RETURN OLD;
      ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        RETURN NEW;
      END IF;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION gestao.replica_marca()
  OWNER TO postgres;
--RUN--


/* *******************************************************
   * BLOQUEIO MÓDULO CTR                                 *
   * POR JCS EM 04/02/2020                               *
   * TABELAS: CTR, RECBTOS, OCORRENCIA, CHEQUES, REMESSA *
   ******************************************************* */

-------------------------------------
-- TABELA: CTR                     --
-------------------------------------
CREATE OR REPLACE FUNCTION gerente.bloqmovto_ctr()
  RETURNS trigger AS
$BODY$
    DECLARE
      v_data1        DATE;
      v_data2        DATE;
      v_empresa      INT4;
      v_modulo       VARCHAR(30);
      v_bloq         CHAR(1);
      v_periodo      DATE;

    BEGIN
      -- parametros para consulta
      v_modulo = 'CTR';
      IF TG_OP='INSERT' THEN
        v_data1   = NEW.emiss;
        v_empresa = NEW.id_empresa;
      ELSIF  TG_OP='UPDATE' THEN
        -- CONFERENCIA CAMPOS PRINCIPAIS
        IF NEW.prefixo=OLD.prefixo AND
           NEW.numero =OLD.numero  AND
           NEW.emiss  =OLD.emiss   AND
           NEW.deved  =OLD.deved   AND
           NEW.valor  =OLD.valor THEN
          RETURN NEW;
        END IF;
        v_data1   = NEW.emiss;
        v_data2   = OLD.emiss;
        v_empresa = NEW.id_empresa;
      ELSE
        v_data1   = OLD.emiss;
        v_empresa = OLD.id_empresa;
      END IF;
      -- fim parametros

      v_data1 = to_char(v_data1,'YYYY-MM')||'-01';
      v_data2 = to_char(v_data2,'YYYY-MM')||'-01';
      SELECT bloqueado,periodo INTO v_bloq,v_periodo FROM gestao.bloqmovto WHERE id_empresa=v_empresa AND modulo=v_modulo AND periodo IN (v_data1,v_data2) AND bloqueado='S' LIMIT 1;
      IF v_bloq='S' THEN
        RAISE EXCEPTION 'Movimento bloqueado para a tabela "%" do módulo "%" no período de %.', TG_RELNAME, v_modulo, to_char(v_periodo,'MM/YYYY');
      END IF;
      IF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        RETURN NEW; 
      ELSE
        RETURN OLD; 
      END IF;
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
--RUN--

DROP TRIGGER bloqmovto_ctr ON gerente.ctr;
--RUN--IGNORE ERRO

CREATE TRIGGER bloqmovto_ctr
  BEFORE INSERT OR UPDATE OR DELETE
  ON gerente.ctr
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.bloqmovto_ctr();
--RUN--


-------------------------------------
-- TABELA: RECBTOS                 --
-------------------------------------
CREATE OR REPLACE FUNCTION gerente.bloqmovto_recbtos()
  RETURNS trigger AS
$BODY$
    DECLARE
      v_data1        DATE;
      v_data2        DATE;
      v_empresa      INT4;
      v_modulo       VARCHAR(30);
      v_bloq         CHAR(1);
      v_periodo      DATE;

    BEGIN
      -- ajusta campos
      IF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
  	     IF NEW.id_entrada=0 THEN
	       NEW.id_entrada = NULL;
  	     END IF;
      END IF;	

      -- parametros para consulta
      v_modulo = 'CTR';

      IF TG_OP='INSERT' THEN
        -- SER FOR ATUALIZAÇÃO DO GERENCIAL, NÃO BLOQUEAR
        IF NEW.id_recbto>90000000 THEN 
          RETURN NEW;
        END IF;
        v_data1   = NEW.data;
        SELECT id_empresa INTO v_empresa FROM gerente.ctr WHERE id_ctr=NEW.id_ctr;
      ELSIF  TG_OP='UPDATE' THEN
        -- SER FOR ATUALIZAÇÃO DO GERENCIAL, NÃO BLOQUEAR
        IF NEW.id_recbto>90000000 THEN 
          RETURN NEW;
        END IF;
        -- CONFERENCIA CAMPOS PRINCIPAIS
        IF NEW.id_ctr      = OLD.id_ctr  AND
           NEW.data        = OLD.data    AND
           NEW.valor       = OLD.valor   AND
           NEW.forma       = OLD.forma   AND
           NEW.banco       = OLD.banco   AND
           NEW.bom         = OLD.bom     AND
           NEW.tarifa      = OLD.tarifa  AND
           NEW.vl_desconto = OLD.vl_desconto THEN
          RETURN NEW;
        END IF;
        v_data1   = NEW.data;
        v_data2   = OLD.data;
        SELECT id_empresa INTO v_empresa FROM gerente.ctr WHERE id_ctr=NEW.id_ctr;
      ELSE
        -- SER FOR ATUALIZAÇÃO DO GERENCIAL, NÃO BLOQUEAR
        IF OLD.id_recbto>90000000 THEN 
          RETURN OLD;
        END IF;
        v_data1   = OLD.data;
        SELECT id_empresa INTO v_empresa FROM gerente.ctr WHERE id_ctr=OLD.id_ctr;
      END IF;
      -- fim parametros

      v_data1 = to_char(v_data1,'YYYY-MM')||'-01';
      v_data2 = to_char(v_data2,'YYYY-MM')||'-01';
      SELECT bloqueado,periodo INTO v_bloq,v_periodo FROM gestao.bloqmovto WHERE id_empresa=v_empresa AND modulo=v_modulo AND periodo IN (v_data1,v_data2) AND bloqueado='S' LIMIT 1;
      IF v_bloq='S' THEN
        RAISE EXCEPTION 'Movimento bloqueado para a tabela "%" do módulo "%" no período de % - Operação: %.', TG_RELNAME, v_modulo, to_char(v_periodo,'MM/YYYY'),TG_OP;
      END IF;
      IF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        RETURN NEW; 
      ELSE
        RETURN OLD; 
      END IF;
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
--RUN--

DROP TRIGGER bloqmovto_recbtos ON gerente.recbtos;
--RUN--IGNORE ERRO

CREATE TRIGGER bloqmovto_recbtos
  BEFORE INSERT OR UPDATE OR DELETE
  ON gerente.recbtos
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.bloqmovto_recbtos();
--RUN--

-------------------------------------
-- TABELA: OCORRENCIA             --
-------------------------------------
CREATE OR REPLACE FUNCTION gestao.bloqmovto_ocorrencia()
  RETURNS trigger AS
$BODY$
    DECLARE
      v_data1        DATE;
      v_data2        DATE;
      v_empresa      INT4;
      v_modulo       VARCHAR(30);
      v_bloq         CHAR(1);
      v_periodo      DATE;

    BEGIN
      -- parametros para consulta
      v_modulo = 'CTR';
      IF TG_OP='INSERT' THEN
        -- SER FOR ATUALIZAÇÃO DO GERENCIAL, NÃO BLOQUEAR
        IF NEW.id_ocorrencia>90000000 THEN 
          RETURN NEW;
        END IF;
        v_data1   = NEW.data;
        IF NEW.id_ctr IS NOT NULL THEN
          SELECT id_empresa INTO v_empresa FROM gerente.ctr WHERE id_ctr=NEW.id_ctr;
        ELSIF NEW.id_cheque IS NOT NULL THEN
          SELECT id_empresa INTO v_empresa FROM gerente.cheques WHERE id_cheque=NEW.id_cheque;
        ELSE
          SELECT id_empresa INTO v_empresa FROM gestao.remessa WHERE id_remessa=NEW.id_remessa;
        END IF;
      ELSIF  TG_OP='UPDATE' THEN
        -- SER FOR ATUALIZAÇÃO DO GERENCIAL, NÃO BLOQUEAR
        IF NEW.id_ocorrencia>90000000 THEN 
          RETURN NEW;
        END IF;
        -- CONFERENCIA CAMPOS PRINCIPAIS
        IF NEW.data        = OLD.data   AND
           NEW.tipo        = OLD.tipo   AND
           NEW.valor       = OLD.valor  THEN
          RETURN NEW;
        END IF;
        v_data1   = NEW.data;
        v_data2   = OLD.data;
        IF NEW.id_ctr IS NOT NULL THEN
          SELECT id_empresa INTO v_empresa FROM gerente.ctr WHERE id_ctr=NEW.id_ctr;
        ELSIF NEW.id_cheque IS NOT NULL THEN
          SELECT id_empresa INTO v_empresa FROM gerente.cheques WHERE id_cheque=NEW.id_cheque;
        ELSE
          SELECT id_empresa INTO v_empresa FROM gestao.remessa WHERE id_remessa=NEW.id_remessa;
        END IF;
      ELSE
        -- SER FOR ATUALIZAÇÃO DO GERENCIAL, NÃO BLOQUEAR
        IF OLD.id_ocorrencia>90000000 THEN 
          RETURN OLD;
        END IF;
        v_data1   = OLD.data;
        IF OLD.id_ctr IS NOT NULL THEN
          SELECT id_empresa INTO v_empresa FROM gerente.ctr WHERE id_ctr=OLD.id_ctr;
        ELSIF OLD.id_cheque IS NOT NULL THEN
          SELECT id_empresa INTO v_empresa FROM gerente.cheques WHERE id_cheque=OLD.id_cheque;
        ELSE
          SELECT id_empresa INTO v_empresa FROM gestao.remessa WHERE id_remessa=OLD.id_remessa;
        END IF;
      END IF;
      -- fim parametros

      v_data1 = to_char(v_data1,'YYYY-MM')||'-01';
      v_data2 = to_char(v_data2,'YYYY-MM')||'-01';
      SELECT bloqueado,periodo INTO v_bloq,v_periodo FROM gestao.bloqmovto WHERE id_empresa=v_empresa AND modulo=v_modulo AND periodo IN (v_data1,v_data2) AND bloqueado='S' LIMIT 1;
      IF v_bloq='S' THEN
        RAISE EXCEPTION 'Movimento bloqueado para a tabela "%" do módulo "%" no período de %.', TG_RELNAME, v_modulo, to_char(v_periodo,'MM/YYYY');
      END IF;
      IF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        RETURN NEW; 
      ELSE
        RETURN OLD; 
      END IF;
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
--############################################-- ESTA TRIGGER SO É PARA FUNCIONAR NO GERENTE --#####################################################
--RUN--

DROP TRIGGER bloqmovto_ocorrencia ON gestao.ocorrencia;
--RUN--IGNORE ERRO

CREATE TRIGGER bloqmovto_ocorrencia
  BEFORE INSERT OR UPDATE OR DELETE
  ON gestao.ocorrencia
  FOR EACH ROW
  EXECUTE PROCEDURE gestao.bloqmovto_ocorrencia();
--RUN--

-------------------------------------
-- TABELA: CHEQUES                 --
-------------------------------------
CREATE OR REPLACE FUNCTION gerente.bloqmovto_cheques()
  RETURNS trigger AS
$BODY$
    DECLARE
      v_data1        DATE;
      v_data2        DATE;
      v_empresa      INT4;
      v_modulo       VARCHAR(30);
      v_bloq         CHAR(1);
      v_periodo      DATE;

    BEGIN
      -- parametros para consulta
      v_modulo = 'CTR';
      IF TG_OP='INSERT' THEN
        v_data1      = NEW.data;
        v_empresa = NEW.id_empresa;
      ELSIF  TG_OP='UPDATE' THEN
        -- CONFERENCIA CAMPOS PRINCIPAIS
        IF NEW.data        = OLD.data   AND
           NEW.sit         = OLD.sit    AND
           NEW.valor       = OLD.valor  THEN
          RETURN NEW;
        END IF;
        v_data1      = NEW.data;
        v_data2      = OLD.data;
        v_empresa = NEW.id_empresa;
      ELSE
        v_data1      = OLD.data;
        v_empresa = OLD.id_empresa;
      END IF;
      -- fim parametros

      v_data1 = to_char(v_data1,'YYYY-MM')||'-01';
      v_data2 = to_char(v_data2,'YYYY-MM')||'-01';
      SELECT bloqueado,periodo INTO v_bloq,v_periodo FROM gestao.bloqmovto WHERE id_empresa=v_empresa AND modulo=v_modulo AND periodo IN (v_data1,v_data2) AND bloqueado='S' LIMIT 1;
      IF v_bloq='S' THEN
        RAISE EXCEPTION 'Movimento bloqueado para a tabela "%" do módulo "%" no período de %.', TG_RELNAME, v_modulo, to_char(v_periodo,'MM/YYYY');
      END IF;
      IF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        RETURN NEW; 
      ELSE
        RETURN OLD; 
      END IF;
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
--RUN--

DROP TRIGGER bloqmovto_cheques ON gerente.cheques;
--RUN--IGNORE ERRO

CREATE TRIGGER bloqmovto_cheques
  BEFORE INSERT OR UPDATE OR DELETE
  ON gerente.cheques
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.bloqmovto_cheques();
--RUN--

-------------------------------------
-- TABELA: REMESSA                 --
-------------------------------------
CREATE OR REPLACE FUNCTION gestao.bloqmovto_remessa()
  RETURNS trigger AS
$BODY$
    DECLARE
      v_data1        DATE;
      v_data2        DATE;
      v_empresa      INT4;
      v_modulo       VARCHAR(30);
      v_bloq         CHAR(1);
      v_periodo      DATE;

    BEGIN
      -- parametros para consulta
      v_modulo = 'CTR';
      IF TG_OP='INSERT' THEN
        v_data1      = NEW.data;
        v_empresa    = NEW.id_empresa;
      ELSIF  TG_OP='UPDATE' THEN
        -- CONFERENCIA CAMPOS PRINCIPAIS
        IF NEW.data          = OLD.data   AND
           NEW.id_banco      = OLD.id_banco    AND
           NEW.tpcobra       = OLD.tpcobra AND
           NEW.vl_tot_tarifa = OLD.vl_tot_tarifa AND
           NEW.vl_servicos   = OLD.vl_servicos AND
           NEW.vl_juros      = OLD.vl_juros AND
           NEW.vl_iof        = OLD.vl_iof  AND
           NEW.vl_cpmf       = OLD.vl_cpmf  AND
           NEW.vl_iss        = OLD.vl_iss  AND
           NEW.vl_nominal    = OLD.vl_nominal  AND
           NEW.vl_nf_servicos = OLD.vl_nf_servicos  AND
           NEW.vl_tarifa_inc_nfs = OLD.vl_tarifa_inc_nfs  AND
           NEW.carteira      = OLD.carteira  THEN
          RETURN NEW;
        END IF;
        v_data1      = NEW.data;
        v_data2      = OLD.data;
        v_empresa = NEW.id_empresa;
      ELSE
        v_data1      = OLD.data;
        v_empresa    = OLD.id_empresa;
      END IF;
      -- fim parametros

      v_data1 = to_char(v_data1,'YYYY-MM')||'-01';
      v_data2 = to_char(v_data2,'YYYY-MM')||'-01';
      SELECT bloqueado,periodo INTO v_bloq,v_periodo FROM gestao.bloqmovto WHERE id_empresa=v_empresa AND modulo=v_modulo AND periodo IN (v_data1,v_data2) AND bloqueado='S' LIMIT 1;
      IF v_bloq='S' THEN
        RAISE EXCEPTION 'Movimento bloqueado para a tabela "%" do módulo "%" no período de %.', TG_RELNAME, v_modulo, to_char(v_periodo,'MM/YYYY');
      END IF;
      IF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        RETURN NEW; 
      ELSE
        RETURN OLD; 
      END IF;
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
--############################################-- ESTA TRIGGER SO É PARA FUNCIONAR NO GERENTE --#####################################################
--RUN--

DROP TRIGGER bloqmovto_remessa ON gestao.remessa;
--RUN--IGNORE ERRO

CREATE TRIGGER bloqmovto_remessa
  BEFORE INSERT OR UPDATE OR DELETE
  ON gestao.remessa
  FOR EACH ROW
  EXECUTE PROCEDURE gestao.bloqmovto_remessa();
--RUN--


/* ****************************************************
   * BLOQUEIO MÓDULO FATURAMENTO                      *
   * POR ALAN EM 04/02/2021                           *
   * TABELAS: PEDIDOS, PEDITENS                       *
   **************************************************** */

-------------------------------------
-- TABELA: PEDIDOS                 --
-------------------------------------
CREATE OR REPLACE FUNCTION gerente.bloqmovto_pedidos()
  RETURNS trigger AS
$BODY$
    DECLARE
      v_data1        DATE;
      v_data2        DATE;
      v_empresa      INT4;
      v_modulo       VARCHAR(30);
      v_bloq         CHAR(1);
      v_periodo      DATE;

    BEGIN
      -- parametros para consulta
      v_modulo = 'FATURAMENTO';
      IF TG_OP='INSERT' THEN
        v_data1   = NEW.data;
        v_empresa = NEW.id_empresa;
      ELSIF  TG_OP='UPDATE' THEN

        -- POR JCS EM 02/06/2016 AS 19:45
        -- RAISE NOTICE 'TIPO % NUMERO % SIT_ANT % SIT_ATUAL %',NEW.tipo,NEW.numero,OLD.situa,NEW.situa;
        IF NOT OLD.situa=NEW.situa THEN
          UPDATE gerente.peditens SET qtd=qtd WHERE id_pedido=NEW.id_pedido;
        END IF;

        -- CONFERENCIA CAMPOS PRINCIPAIS
        IF NEW.numero =OLD.numero    AND
           NEW.data   =OLD.data      AND
           (NEW.dtemi =OLD.dtemi or NEW.dtemi IS NULL) AND
           NEW.clien  =OLD.clien     AND
           NEW.cod_formapag=OLD.cod_formapag AND
           NEW.total  =OLD.total THEN
          RETURN NEW;
        END IF;

        v_data1    = NEW.data;
        v_data2    = OLD.data;
        v_empresa = NEW.id_empresa;
      ELSE
        v_data1    = OLD.data;
        v_empresa = OLD.id_empresa;
      END IF;
      -- fim parametros

      v_data1 = to_char(v_data1,'YYYY-MM')||'-01';
      v_data2 = to_char(v_data2,'YYYY-MM')||'-01';
     
      SELECT bloqueado,periodo INTO v_bloq,v_periodo FROM gestao.bloqmovto WHERE id_empresa=v_empresa AND modulo=v_modulo AND periodo IN (v_data1,v_data2) AND bloqueado='S' LIMIT 1;
        
      IF v_bloq='S' THEN
        RAISE EXCEPTION 'Movimento bloqueado para a tabela "%" do módulo "%" no período de %.', TG_RELNAME, v_modulo, to_char(v_periodo,'MM/YYYY');
      END IF;

      IF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        RETURN NEW;
      ELSE
        RETURN OLD;
      END IF;
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
--RUN--

DROP TRIGGER bloqmovto_pedidos ON gerente.pedidos;
--RUN--IGNORE ERRO

CREATE TRIGGER bloqmovto_pedidos
  AFTER INSERT OR UPDATE OR DELETE
  ON gerente.pedidos
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.bloqmovto_pedidos();
--RUN--

-------------------------------------
-- TABELA: PEDITENS                --
-------------------------------------
CREATE OR REPLACE FUNCTION gerente.bloqmovto_peditens()
  RETURNS trigger AS
$BODY$
    DECLARE
      v_data         DATE;
      v_empresa      INT4;
      v_modulo       VARCHAR(30);
      v_periodo      DATE;
      v_bloq         CHAR(1);

    BEGIN
      -- parametros para consulta
      v_modulo = 'FATURAMENTO';
      IF TG_OP='INSERT' THEN
        SELECT data, id_empresa INTO v_data, v_empresa FROM gerente.pedidos WHERE id_pedido=NEW.id_pedido;
      ELSIF TG_OP='UPDATE' THEN
        IF NEW.produ  =OLD.produ   AND
           NEW.qtd    =OLD.qtd     AND
           NEW.total  =OLD.total   AND
           NEW.ipi    =OLD.ipi     AND
           NEW.comis  =OLD.comis THEN
          RETURN NEW;
        ELSE  
          SELECT data, id_empresa INTO v_data, v_empresa FROM gerente.pedidos WHERE id_pedido=NEW.id_pedido;                
        END IF;
      ELSE
        SELECT data, id_empresa INTO v_data, v_empresa FROM gerente.pedidos WHERE id_pedido=OLD.id_pedido;
      END IF;
      -- fim parametros

      v_periodo = to_char(v_data,'YYYY-MM')||'-01';
      SELECT bloqueado INTO v_bloq FROM gestao.bloqmovto WHERE id_empresa=v_empresa AND modulo=v_modulo AND periodo=v_periodo;
      IF v_bloq='S' THEN
        RAISE EXCEPTION 'Movimento bloqueado para a tabela "%" do módulo "%" no período de %.', TG_RELNAME, v_modulo, to_char(v_periodo,'MM/YYYY');
      END IF;
      IF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        RETURN NEW; 
      ELSE
        RETURN OLD; 
      END IF;
    END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
--RUN--

DROP TRIGGER bloqmovto_peditens ON gerente.peditens;
--RUN--IGNORE ERRO

CREATE TRIGGER bloqmovto_peditens
  BEFORE INSERT OR UPDATE OR DELETE
  ON gerente.peditens
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.bloqmovto_peditens();
--RUN--

CREATE OR REPLACE FUNCTION gerente.picking_bloq_alt_peditens()
  RETURNS trigger AS
$BODY$
    DECLARE
      vsit_picking  CHAR(2);

    BEGIN
      IF TG_OP='INSERT' THEN        
        SELECT sit_picking INTO vsit_picking FROM gerente.pedidos WHERE id_pedido=NEW.id_pedido;
        IF vsit_picking='S' THEN 
          RAISE EXCEPTION 'Picking/Packing já iniciado! Inclusão de item no pedido não permitido!';
        END IF;
        RETURN NEW;
      ELSIF TG_OP='UPDATE' THEN
        SELECT sit_picking INTO vsit_picking FROM gerente.pedidos WHERE id_pedido=NEW.id_pedido;
        IF vsit_picking='S' AND (NOT NEW.produ=OLD.produ OR NOT NEW.qtd=OLD.qtd) THEN
          RAISE EXCEPTION 'Picking/Packing já iniciado! Alteração de item no pedido não permitido!';
        END IF;
        RETURN NEW;
      ELSIF TG_OP='DELETE' THEN
        SELECT sit_picking INTO vsit_picking FROM gerente.pedidos WHERE id_pedido=OLD.id_pedido;
        IF vsit_picking='S' THEN 
          RAISE EXCEPTION 'Picking/Packing já iniciado! Exclusão de item do pedido não permitido!';
        END IF;
        RETURN OLD;
      END IF;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE;
--RUN--

DROP TRIGGER picking_bloq_alt_peditens ON gerente.peditens; 
--RUN--IGNORE ERRO

CREATE TRIGGER picking_bloq_alt_peditens
  BEFORE INSERT OR UPDATE OR DELETE
  ON gerente.peditens
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.picking_bloq_alt_peditens();
--RUN--

CREATE OR REPLACE FUNCTION gerente.valida_cheque()
  RETURNS trigger AS
$BODY$
    DECLARE
      vid_recbto INT;
    BEGIN
      IF TG_OP='UPDATE' THEN
        IF NOT NEW.bom = OLD.bom THEN
          SELECT id_recbto INTO vid_recbto FROM gerente.recbtos WHERE id_cheque=NEW.id_cheque LIMIT 1;
          IF vid_recbto IS NOT NULL AND vid_recbto>0 THEN
            UPDATE gerente.recbtos SET bom=NEW.bom WHERE id_cheque=NEW.id_cheque;
          END IF;
        END IF;      
      END IF;     
      IF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        RETURN NEW;
      ELSE
        RETURN OLD;
      END IF;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION gerente.valida_cheque()
  OWNER TO postgres;
--RUN--

DROP TRIGGER valida_cheque ON gerente.cheques;
--RUN--IGNORE ERRO

CREATE TRIGGER valida_cheque
  BEFORE INSERT OR UPDATE
  ON gerente.cheques
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.valida_cheque();
--RUN--

CREATE OR REPLACE FUNCTION gestao.replica_unidade()
  RETURNS trigger AS
$BODY$

    DECLARE
      vempresa    integer;
      vemp_prod   integer;
      vatualiza   smallint;
      vschema     character varying(20);
      vid_unidade integer;
      vflag       int;

    BEGIN

      --FAZ VERIFICAÇÃO PARA NÃO ENTRAR EM LOOP ENTRE AS TRIGGERS
      EXECUTE 'SELECT count(*) FROM pg_stat_activity WHERE datname=current_database() AND application_name=''postgres_fdw'' AND state=''active'' AND client_port=inet_client_port();' INTO vflag;
      IF vflag>0 THEN
        IF TG_OP='DELETE' THEN
          RETURN OLD;
        ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
          RETURN NEW;
        END IF;
      END IF;

      IF TG_OP='DELETE' THEN
        vempresa= OLD.id_empresa;
      ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        vempresa= NEW.id_empresa;
      END IF;

      vatualiza = (SELECT valor FROM gestao.registro WHERE chave='Empresa:'||vempresa||'/Tab. Estrangeira' AND nome='Produto');
      vschema   = (SELECT trim(valor)||'.unidade' FROM gestao.registro WHERE chave='Empresa:'||vempresa||'/Tab. Estrangeira' AND nome='Nome');
      vemp_prod = (SELECT valor FROM gestao.registro WHERE chave='Empresa:'||vempresa||'/Tab. Estrangeira' AND nome='Empresa');

      IF vatualiza IS NULL THEN
        vatualiza=0;
      END IF;

      IF vatualiza=1 THEN

        IF TG_OP='DELETE' THEN
          EXECUTE 'DELETE FROM '||vschema||' WHERE codigo='||OLD.codigo||' AND id_empresa='||vemp_prod||';';
        ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN

          EXECUTE 'SELECT id_unidade FROM '||vschema||' WHERE unidade='''||NEW.unidade||''' AND id_empresa='||vemp_prod||';' INTO vid_unidade;

          IF vid_unidade IS NULL OR vid_unidade=0 THEN

            EXECUTE format('INSERT INTO  '||vschema||
                     '(id_unidade, id_empresa, unidade, descricao, ativa)'
               'VALUES ((SELECT max(id_unidade)+1 from '||vschema||'),'||vemp_prod||','''||NEW.unidade||''','''||NEW.descricao||''','||NEW.ativa||');');                     

          ELSE
            EXECUTE format('UPDATE '||vschema||
                   ' SET unidade='''||NEW.unidade||''', descricao='''||NEW.descricao||''', ativa='||NEW.ativa||''
                   ' WHERE id_unidade='||vid_unidade||';');
          END IF;
        END IF;
      END IF;

      IF TG_OP='DELETE' THEN
        RETURN OLD;
      ELSIF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        RETURN NEW;
      END IF;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION gestao.replica_unidade()
  OWNER TO postgres;
--RUN--

CREATE OR REPLACE FUNCTION gerente.atual_ped_agrupado()
  RETURNS trigger AS
$BODY$
    DECLARE

    BEGIN

      IF TG_OP='UPDATE' THEN
        IF NEW.cod_agrupador>0 AND NEW.cod_agrupador IS NOT NULL THEN
          UPDATE gerente.pedidos SET cod_formapag=NEW.cod_formapag, cod_vendedor=NEW.cod_vendedor WHERE id_empresa=NEW.id_empresa AND cod_agrupador=NEW.cod_agrupador AND NOT id_pedido=NEW.id_pedido AND (NOT cod_formapag=NEW.cod_formapag OR NOT cod_vendedor=NEW.cod_vendedor);
        END IF;
      END IF;

      IF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        RETURN NEW;
      ELSE
        RETURN OLD;
      END IF;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION gerente.atual_ped_agrupado()
  OWNER TO postgres;
--RUN--

DROP TRIGGER atual_ped_agrupado ON gerente.pedidos;
--RUN--IGNORE ERRO

CREATE TRIGGER atual_ped_agrupado
  AFTER INSERT OR UPDATE OR DELETE
  ON gerente.pedidos
  FOR EACH ROW
  EXECUTE PROCEDURE gerente.atual_ped_agrupado();
--RUN--

CREATE OR REPLACE FUNCTION gerente.valida_pedido_magazord()
  RETURNS trigger AS
$BODY$
 DECLARE
    vnumero      INT4;

    BEGIN

      IF TG_OP='INSERT' OR TG_OP='UPDATE' THEN
        IF substr(new.num_client_vend,1,9)='MAGAZORD:' THEN        
          vnumero = COALESCE((SELECT numero FROM gerente.pedidos WHERE id_empresa=new.id_empresa AND num_client_vend=new.num_client_vend and id_pedido<>new.id_pedido),0);
          IF vnumero>0 THEN
            RAISE EXCEPTION 'Número do Magazord já existe no Pedido(%)!',vnumero;
          END IF;
        END IF;
        RETURN NEW;
      ELSE
        RETURN OLD;
      END IF;

    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION gerente.valida_pedido_magazord()
  OWNER TO postgres;
--RUN--IGNORE ERRO

CREATE OR REPLACE FUNCTION gestao.fk_produto()
  RETURNS trigger AS
$BODY$
    DECLARE
      vid_empresa int4;
      vid         int4;

    BEGIN

      IF TG_OP='UPDATE' THEN
    
        IF NOT NEW.id_empresa=OLD.id_empresa OR NOT NEW.id_erp=OLD.id_erp THEN

          SELECT id_empresa_tabcomp INTO vid_empresa from gestao.tabcomp where nome_tabcomp='produtos' and id_empresa=OLD.id_empresa;
          if vid_empresa is null then
            vid_empresa=OLD.id_empresa;
          end if;

	  SELECT a.id_proddet INTO vid  FROM gerente.proddet as a
	  left outer join gerente.producao as b on(b.id_producao=a.id_producao)
	  left outer join gestao.tabcomp as c ON(c.nome_tabcomp='produtos' and c.id_empresa_tabcomp=b.id_empresa)
	  WHERE a.id_produto=OLD.id_erp and b.id_empresa=CASE WHEN c.id_empresa_tabcomp>0 THEN c.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
	  IF vid IS NOT NULL THEN
	    RAISE EXCEPTION 'Alteração não permitida! Produto vinculado no Detalhe da Produção # %!',vid;
	  END IF;        

	  SELECT a.id_nfdet INTO vid FROM gestao.nfdet as a
	  left outer join gestao.nf as b on(b.id_nf=a.id_nf)
          left outer join gestao.tabcomp as c ON(c.nome_tabcomp='produtos' and c.id_empresa_tabcomp=b.id_empresa)
          WHERE a.id_produto=OLD.id_erp and b.id_empresa=CASE WHEN c.id_empresa_tabcomp>0 THEN c.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
          IF vid IS NOT NULL THEN
            RAISE EXCEPTION 'Alteração não permitida! Produto vinculado no Item da NF # %!',vid;
          END IF;

	  SELECT a.id_reqd INTO vid FROM gestao.reqd as a
          left outer join gestao.req as b on(b.id_req=a.id_req)
          left outer join gestao.tabcomp as c ON(c.nome_tabcomp='produtos' and c.id_empresa_tabcomp=b.id_empresa)
          WHERE a.id_produto=OLD.id_erp and b.id_empresa=CASE WHEN c.id_empresa_tabcomp>0 THEN c.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
          IF vid IS NOT NULL THEN
            RAISE EXCEPTION 'Alteração não permitida! Produto vinculado no Item da Requisição # %!',vid;
          END IF;

      	  SELECT a.id_estruturad INTO vid FROM gestao.estruturad as a
	  left outer join gestao.estrutura as b on(b.id_estrutura=a.id_estrutura)
          left outer join gestao.tabcomp as c ON(c.nome_tabcomp='produtos' and c.id_empresa_tabcomp=b.id_empresa)
          WHERE a.id_produto=OLD.id_erp and b.id_empresa=CASE WHEN c.id_empresa_tabcomp>0 THEN c.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
          IF vid IS NOT NULL THEN
            RAISE EXCEPTION 'Alteração não permitida! Produto vinculado no Item da Estrutura # %!',vid;
          END IF;
       
          SELECT a.id_estrutura INTO vid  FROM gestao.estrutura as a
          left outer join gestao.tabcomp as b ON(b.nome_tabcomp='produtos' and b.id_empresa_tabcomp=a.id_empresa)
          WHERE a.id_produto=OLD.id_erp and a.id_empresa=CASE WHEN b.id_empresa_tabcomp>0 THEN b.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
          IF vid IS NOT NULL THEN
            RAISE EXCEPTION 'Alteração não permitida! Produto vinculado na Estrutura # %!',vid;
          END IF;        

          SELECT a.id_cstpadrao INTO vid  FROM gestao.cstpadrao as a
          left outer join gestao.tabcomp as b ON(b.nome_tabcomp='produtos' and b.id_empresa_tabcomp=a.id_empresa)
          WHERE a.id_produto=OLD.id_erp and a.id_empresa=CASE WHEN b.id_empresa_tabcomp>0 THEN b.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
          IF vid IS NOT NULL THEN
            RAISE EXCEPTION 'Alteração não permitida! Produto vinculado na CSTPadrao # %!',vid;
          END IF;

	  SELECT a.id_peditens INTO vid FROM gerente.peditens as a
	  left outer join gerente.pedidos as b on(b.id_pedido=a.id_pedido)
          left outer join gestao.tabcomp as c ON(c.nome_tabcomp='produtos' and c.id_empresa_tabcomp=b.id_empresa)
          WHERE a.produ=OLD.id_erp and b.id_empresa=CASE WHEN c.id_empresa_tabcomp>0 THEN c.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
          IF vid IS NOT NULL THEN
            RAISE EXCEPTION 'Alteração não permitida! Produto vinculado no Item do Pedido # %!',vid;
          END IF;
    
	  SELECT a.id_entradet INTO vid FROM gestao.entradet as a
          left outer join gestao.entradas as b on(b.id_entrada=a.id_entrada)
          left outer join gestao.tabcomp as c ON(c.nome_tabcomp='produtos' and c.id_empresa_tabcomp=b.id_empresa)
          WHERE a.id_produto=OLD.id_erp and b.id_empresa=CASE WHEN c.id_empresa_tabcomp>0 THEN c.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
          IF vid IS NOT NULL THEN
            RAISE EXCEPTION 'Alteração não permitida! Produto vinculado no Item da Entrada # %!',vid;
          END IF;

          SELECT a.id_pauxpro INTO vid FROM gestao.pauxpro as a
          left outer join gestao.pauta as b on(b.id_pauta=a.id_pauta)
          left outer join gestao.tabcomp as c ON(c.nome_tabcomp='produtos' and c.id_empresa_tabcomp=b.id_empresa)
          WHERE a.id_produto=OLD.id_erp and b.id_empresa=CASE WHEN c.id_empresa_tabcomp>0 THEN c.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
          IF vid IS NOT NULL THEN
            RAISE EXCEPTION 'Alteração não permitida! Produto vinculado no Item de Pauta # %!',vid;
          END IF;
        
          SELECT a.id_estmovto INTO vid  FROM gestao.estmovto as a
          left outer join gestao.tabcomp as b ON(b.nome_tabcomp='produtos' and b.id_empresa_tabcomp=a.id_empresa)
          WHERE a.id_produto=OLD.id_erp and a.id_empresa=CASE WHEN b.id_empresa_tabcomp>0 THEN b.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
          IF vid IS NOT NULL THEN
            RAISE EXCEPTION 'Alteração não permitida! Produto vinculado com movimento de estoque # %!',vid;
          END IF;
          
        END IF;
        RETURN NEW;
        
      ELSIF TG_OP='DELETE' THEN

        SELECT id_empresa_tabcomp INTO vid_empresa from gestao.tabcomp where nome_tabcomp='produtos' and id_empresa=OLD.id_empresa;
        if vid_empresa is null then
          vid_empresa=OLD.id_empresa;
        end if;

        SELECT a.id_proddet INTO vid  FROM gerente.proddet as a
	left outer join gerente.producao as b on(b.id_producao=a.id_producao)
	left outer join gestao.tabcomp as c ON(c.nome_tabcomp='produtos' and c.id_empresa_tabcomp=b.id_empresa)
	WHERE a.id_produto=OLD.id_erp and b.id_empresa=CASE WHEN c.id_empresa_tabcomp>0 THEN c.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
	IF vid IS NOT NULL THEN
	  RAISE EXCEPTION 'Exclusão não permitida! Produto vinculado no Detalhe da Produção # %!',vid;
	END IF;        

	SELECT a.id_nfdet INTO vid FROM gestao.nfdet as a
	left outer join gestao.nf as b on(b.id_nf=a.id_nf)
        left outer join gestao.tabcomp as c ON(c.nome_tabcomp='produtos' and c.id_empresa_tabcomp=b.id_empresa)
        WHERE a.id_produto=OLD.id_erp and b.id_empresa=CASE WHEN c.id_empresa_tabcomp>0 THEN c.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
        IF vid IS NOT NULL THEN
          RAISE EXCEPTION 'Exclusão não permitida! Produto vinculado no Item da NF # %!',vid;
        END IF;

	SELECT a.id_reqd INTO vid FROM gestao.reqd as a
	left outer join gestao.req as b on(b.id_req=a.id_req)
        left outer join gestao.tabcomp as c ON(c.nome_tabcomp='produtos' and c.id_empresa_tabcomp=b.id_empresa)
        WHERE a.id_produto=OLD.id_erp and b.id_empresa=CASE WHEN c.id_empresa_tabcomp>0 THEN c.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
        IF vid IS NOT NULL THEN
          RAISE EXCEPTION 'Exclusão não permitida! Produto vinculado no Item da Requisição # %!',vid;
        END IF;

      	SELECT a.id_estruturad INTO vid FROM gestao.estruturad as a
	left outer join gestao.estrutura as b on(b.id_estrutura=a.id_estrutura)
        left outer join gestao.tabcomp as c ON(c.nome_tabcomp='produtos' and c.id_empresa_tabcomp=b.id_empresa)
        WHERE a.id_produto=OLD.id_erp and b.id_empresa=CASE WHEN c.id_empresa_tabcomp>0 THEN c.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
        IF vid IS NOT NULL THEN
          RAISE EXCEPTION 'Exclusão não permitida! Produto vinculado no Item da Estrutura # %!',vid;
        END IF;
       
        SELECT a.id_estrutura INTO vid  FROM gestao.estrutura as a
        left outer join gestao.tabcomp as b ON(b.nome_tabcomp='produtos' and b.id_empresa_tabcomp=a.id_empresa)
        WHERE a.id_produto=OLD.id_erp and a.id_empresa=CASE WHEN b.id_empresa_tabcomp>0 THEN b.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
        IF vid IS NOT NULL THEN
          RAISE EXCEPTION 'Exclusão não permitida! Produto vinculado na Estrutura # %!',vid;
        END IF;        

        SELECT a.id_cstpadrao INTO vid  FROM gestao.cstpadrao as a
        left outer join gestao.tabcomp as b ON(b.nome_tabcomp='produtos' and b.id_empresa_tabcomp=a.id_empresa)
        WHERE a.id_produto=OLD.id_erp and a.id_empresa=CASE WHEN b.id_empresa_tabcomp>0 THEN b.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
        IF vid IS NOT NULL THEN
          RAISE EXCEPTION 'Exclusão não permitida! Produto vinculado na CSTPadrao # %!',vid;
        END IF;

	SELECT a.id_peditens INTO vid FROM gerente.peditens as a
	left outer join gerente.pedidos as b on(b.id_pedido=a.id_pedido)
        left outer join gestao.tabcomp as c ON(c.nome_tabcomp='produtos' and c.id_empresa_tabcomp=b.id_empresa)
        WHERE a.produ=OLD.id_erp and b.id_empresa=CASE WHEN c.id_empresa_tabcomp>0 THEN c.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
        IF vid IS NOT NULL THEN
          RAISE EXCEPTION 'Exclusão não permitida! Produto vinculado no Item do Pedido # %!',vid;
        END IF;

	SELECT a.id_entradet INTO vid FROM gestao.entradet as a
	left outer join gestao.entradas as b on(b.id_entrada=a.id_entrada)
        left outer join gestao.tabcomp as c ON(c.nome_tabcomp='produtos' and c.id_empresa_tabcomp=b.id_empresa)
        WHERE a.produ=OLD.id_erp and b.id_empresa=CASE WHEN c.id_empresa_tabcomp>0 THEN c.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
        IF vid IS NOT NULL THEN
          RAISE EXCEPTION 'Exclusão não permitida! Produto vinculado no Item da Entrada # %!',vid;
        END IF;        

        SELECT a.id_pauxpro INTO vid FROM gestao.pauxpro as a
        left outer join gestao.pauta as b on(b.id_pauta=a.id_pauta)
        left outer join gestao.tabcomp as c ON(c.nome_tabcomp='produtos' and c.id_empresa_tabcomp=b.id_empresa)
        WHERE a.id_prod=OLD.id_erp and b.id_empresa=CASE WHEN c.id_empresa_tabcomp>0 THEN c.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
        IF vid IS NOT NULL THEN
          RAISE EXCEPTION 'Exclusão não permitida! Produto vinculado no Item de Pauta # %!',vid;
        END IF;
        
        SELECT a.id_estmovto INTO vid  FROM gestao.estmovto as a
        left outer join gestao.tabcomp as b ON(b.nome_tabcomp='produtos' and b.id_empresa_tabcomp=a.id_empresa)
        WHERE a.id_produto=OLD.id_erp and a.id_empresa=CASE WHEN b.id_empresa_tabcomp>0 THEN b.id_empresa_tabcomp ELSE vid_empresa END LIMIT 1;
        IF vid IS NOT NULL THEN
          RAISE EXCEPTION 'Exclusão não permitida! Produto vinculado com movimento de estoque # %!',vid;
        END IF;

        RETURN OLD;
        
      END IF;
      
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION gestao.fk_produto()
  OWNER TO postgres;
--RUN--IGNORE ERRO

CREATE TRIGGER fk_produto AFTER UPDATE OR DELETE ON gestao.produto FOR EACH ROW EXECUTE PROCEDURE gestao.fk_produto();
--RUN--
