
-- StoreProcedure {atualizaprodutoatendido()} Versao {018} Esquema {padrao} Descricao {Grava atendimento dos produtos em consegnacao/entrega futura/etc}
-- ------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.atualizaProdutoAtendido()
  RETURNS trigger AS
$BODY$

DECLARE
 --Variaveis
   aCampos                character varying[];
   aDados                 character varying[];

   r_docto_pc         RECORD; -- Pedito Cabec
   r_docto_pa         RECORD; -- Pedido Atend
   r_docto_pi         RECORD; -- Pedido Itens

BEGIN
-- SE FOR UMA EXCLUSAO
  IF TG_OP = 'DELETE'  THEN

	  --Totaliza atendido
	  SELECT sum(qtde) as tot_qtde, sum(qtde_naoatendida) as tot_qtde_naoqtend, sum (qtde_cancelada) as tot_qtde_cancelada
	 	INTO r_docto_pa
	  	FROM fat_docto_pa
	   WHERE fat_docto_pc_controle = OLD.fat_docto_pc_controle AND fat_produto_id = OLD.fat_produto_id
	   GROUP BY  fat_docto_pc_controle, fat_produto_id;
      --Atualiza pendencia
	  UPDATE fat_docto_pi
	     SET qtde_pendente  = qtde - coalesce(r_docto_pa.tot_qtde,0) - coalesce(r_docto_pa.tot_qtde_cancelada,0) ,
	         qtde_atendida  = coalesce(r_docto_pa.tot_qtde, 0),
	         qtde_cancelada = coalesce(r_docto_pa.tot_qtde_cancelada)
	   WHERE fat_produto_id = OLD.fat_produto_id
	     AND fat_docto_pc_fat_docto_c_controle = OLD.fat_docto_pc_controle;

	  --Atualiza status do pedido
	  UPDATE fat_docto_pc
	     SET status_p = 'P'
	   WHERE fat_docto_c_controle = OLD.fat_docto_pc_controle;

  ELSE
     --RAISE NOTICE 'Atualizando PEDIDO ATENDIDO';
     --Totaliza atendido
	 SELECT sum(qtde) as tot_qtde, sum(qtde_naoatendida) as tot_qtde_naoqtend, sum (qtde_cancelada) as tot_qtde_cancelada
	   INTO r_docto_pa
	   FROM fat_docto_pa
	  WHERE fat_docto_pc_controle = NEW.fat_docto_pc_controle AND fat_produto_id = NEW.fat_produto_id
	  GROUP BY  fat_docto_pc_controle, fat_produto_id;
    --Atualiza pendencia
	  UPDATE fat_docto_pi
	     SET qtde_pendente  = qtde - coalesce(r_docto_pa.tot_qtde,0) - coalesce(r_docto_pa.tot_qtde_cancelada,0) ,
	         qtde_atendida  = coalesce(r_docto_pa.tot_qtde, 0),
	         qtde_cancelada = coalesce(r_docto_pa.tot_qtde_cancelada)
	   WHERE fat_produto_id = NEW.fat_produto_id
	     AND fat_docto_pc_fat_docto_c_controle = NEW.fat_docto_pc_controle;
	  --Totaliza Pendencia (fat_docto_pi)
	 SELECT sum(qtde_pendente) as TOTAL_PENDENTE
	   INTO r_docto_pi
       FROM fat_docto_pi
      WHERE fat_docto_pc_fat_docto_c_controle = NEW.fat_docto_pc_controle
      GROUP BY  fat_docto_pc_fat_docto_c_controle
      ORDER BY fat_docto_pc_fat_docto_c_controle;

	 --Atualiza status fat_docto_pc
	 IF r_docto_pi.TOTAL_PENDENTE > 0 THEN
	  	UPDATE fat_docto_pc
	  	   SET status_p = 'P' WHERE fat_docto_c_controle = NEW.fat_docto_pc_controle;
	 ELSE
	 	UPDATE fat_docto_pc
	  	   SET status_p = 'A' WHERE fat_docto_c_controle = NEW.fat_docto_pc_controle;
     END IF;
  END IF;
   
  
  RETURN NULL;
END;

$BODY$

LANGUAGE 'plpgsql' VOLATILE;

-- Gatilho {atualizaprodutoatendido()} Versao {003} Esquema {empresa} Descricao {Grava atendimento dos produtos em consegnacao/entrega futura/etc }
-- ------------------------------------------------------------

CREATE TRIGGER atualizaProdutoAtendido AFTER INSERT OR UPDATE OR DELETE ON fat_docto_pa
       FOR EACH ROW EXECUTE PROCEDURE padrao.atualizaProdutoAtendido();
              