
-- StoreProcedure {gravaanalisecred()} Versao {036} Esquema {padrao} Descricao {Atualiza analise de credito}
-- ------------------------------------------------------------

CREATE OR REPLACE FUNCTION  padrao.gravaanalisecred()  
 RETURNS trigger AS
$BODY$
DECLARE
 flag                  boolean;
 v_chk_analise_credito boolean;
 r_financ_analisecred  record;
 v_cad_cadastro_id     integer;
 r_analise             RECORD;
 r_parameters          RECORD;
 
   
BEGIN
	IF TG_OP = 'INSERT' THEN
	   v_cad_cadastro_id :=  NEW.cad_cadastro_id;
	END IF;
	IF TG_OP = 'UPDATE' THEN
	   v_cad_cadastro_id :=  OLD.cad_cadastro_id;
	END IF;
	IF TG_OP = 'DELETE' THEN
    	v_cad_cadastro_id :=  OLD.cad_cadastro_id;
    END IF;
	SELECT fatclientepadraovenda INTO r_parameters
      FROM fat_parameters
     LIMIT 1 ;
    v_chk_analise_credito := COALESCE((select chk_analise_credito from cad_cadastro where id =  v_cad_cadastro_id), TRUE);
    IF v_cad_cadastro_id = COALESCE(r_parameters.fatclientepadraovenda, 0) OR  NOT v_chk_analise_credito THEN
    	RAISE NOTICE 'CADASTRO [ % ] NÃO IRÁ FAZER ANALIZE DE CREDITO,  chk_analise_credito [%] ', v_cad_cadastro_id, v_chk_analise_credito;
        RETURN NULL;
    END IF;
	--v_cad_cadastro_id := CASE WHEN TG_OP = 'INSERT' THEN NEW.cad_cadastro_id ELSE OLD.cad_cadastro_id END;
	--v_cad_cadastro_id :=  NEW.cad_cadastro_id;
	FOR r_financ_analisecred IN SELECT * FROM cad_cadastro  WHERE id = v_cad_cadastro_id LOOP
	   BEGIN
		flag:=true;
		INSERT INTO financ_analisecred (cad_cadastro_id)
		   select cad_cadastro_id as cad_cadastro_id
		    from financ_rp
		    where  cad_cadastro_id=r_financ_analisecred.id
		    order by emissao 
		    desc limit 1;
		--
		-- Valor Ultima Compra
		--    
		UPDATE financ_analisecred
				SET valor_ultima_compra = COALESCE((select valortotal_docto
					    from fat_docto_c
					    where (substring(serie_natureza from 1 for 1)='S'
					      and cad_cadastro_id=r_financ_analisecred.id
					      and (select substring(view_transacao.propriedade from 1 for 1) AS propriedade from view_transacao where  codigo_transacao = fat_docto_c.fat_transacao_id AND diretiva = 49) = 'S'
					      and emissao <= current_date)
					    order by emissao
					    desc limit 1),0)
				WHERE cad_cadastro_id = r_financ_analisecred.id;
		
		-- 
		-- Data Ultima Compra		
		--		
		UPDATE financ_analisecred
				SET date_ultima_compra = (select emissao
					    from fat_docto_c
					    where (substring(serie_natureza from 1 for 1)='S'
					    and cad_cadastro_id=r_financ_analisecred.id
					    and (select substring(view_transacao.propriedade from 1 for 1) AS propriedade from view_transacao where  codigo_transacao = fat_docto_c.fat_transacao_id AND diretiva = 49) = 'S'
					    and emissao <= current_date)
					    order by emissao
					    desc limit 1)
				WHERE cad_cadastro_id = r_financ_analisecred.id;
		
		--
		-- Valor Primeira Compra
		--		
		UPDATE financ_analisecred
		SET valor_primeira_compra = COALESCE((select valortotal_docto
					    					    from fat_docto_c
					    					   where (substring(serie_natureza from 1 for 1)='S'
					    					   and cad_cadastro_id=r_financ_analisecred.id
					    					   and (select substring(view_transacao.propriedade from 1 for 1) AS propriedade from view_transacao where  codigo_transacao = fat_docto_c.fat_transacao_id AND diretiva = 49) = 'S'
					    					   and emissao <= current_date)
					    					   order by emissao limit 1),0)
		WHERE cad_cadastro_id = r_financ_analisecred.id;

		--
		-- Data Ultima Compra 
		--
		UPDATE financ_analisecred
		SET date_primeira_compra = (select emissao
					                  from fat_docto_c
					                 where (substring(serie_natureza from 1 for 1)='S'
					                   and cad_cadastro_id=r_financ_analisecred.id
					                   and (select substring(view_transacao.propriedade from 1 for 1) AS propriedade from view_transacao where  codigo_transacao = fat_docto_c.fat_transacao_id AND diretiva = 49) = 'S'
					                   and emissao <= current_date)
					                 order by emissao limit 1)
		WHERE cad_cadastro_id = r_financ_analisecred.id;

        --
        -- Data Maior Compra
        --
		UPDATE financ_analisecred
		SET date_maior =  (select emissao
					         from fat_docto_c
					        where (substring(serie_natureza from 1 for 1)='S'
					          and cad_cadastro_id= r_financ_analisecred.id
					          and (select substring(view_transacao.propriedade from 1 for 1) AS propriedade from view_transacao where  codigo_transacao = fat_docto_c.fat_transacao_id AND diretiva = 49) = 'S'
					          and emissao <= current_date)
					        order by valortotal_docto desc limit 1)
		WHERE cad_cadastro_id = r_financ_analisecred.id;

        --
        -- Valor Maoir Compra
        -- 
		UPDATE financ_analisecred
		SET valor_maior = (select valortotal_docto
					         from fat_docto_c
					        where (substring(serie_natureza from 1 for 1)='S'
					          and cad_cadastro_id= r_financ_analisecred.id
					          and (select substring(view_transacao.propriedade from 1 for 1) AS propriedade from view_transacao where  codigo_transacao = fat_docto_c.fat_transacao_id AND diretiva = 49) = 'S'
					          and emissao <= current_date)
					        order by valortotal_docto desc limit 1)
		WHERE cad_cadastro_id = r_financ_analisecred.id;
        
		--
		-- Maior Valor a Receber
		--
		UPDATE financ_analisecred
		SET valor_maior_receber = (select valor_total 
				  from financ_rp 
				  where (natureza='R' and cad_cadastro_id=r_financ_analisecred.id)
				  order by  valor_total 
				  desc limit 1)
		WHERE cad_cadastro_id = r_financ_analisecred.id;

        --
        -- Total valor_debito
        --
        UPDATE financ_analisecred
        SET valor_debito = (select SUM(valor_saldo)
                  from financ_rp
                  where (natureza='R' and cad_cadastro_id=r_financ_analisecred.id)
                  group by cad_cadastro_id
                  order by cad_cadastro_id)
        WHERE cad_cadastro_id = r_financ_analisecred.id;
        --
        -- Qtde de Titulos em aberto
        --
        UPDATE financ_analisecred
        SET qtde_titulos_aberto = (select COUNT(*)
                  from financ_rp
                  where (natureza='R' and cad_cadastro_id=r_financ_analisecred.id AND financ_rp.valor_saldo > 0)
                  group by cad_cadastro_id
                  order by cad_cadastro_id)
        WHERE cad_cadastro_id = r_financ_analisecred.id;
        --
        -- Limite Credito  (Saldo)
        --
        UPDATE financ_analisecred
        SET limite_credito_saldo =(select limite_credito FROM cad_cadastro WHERE id = r_financ_analisecred.id )- (select SUM(financ_rp.valor_saldo)
                                      from financ_rp
                                     where (natureza='R' and cad_cadastro_id=r_financ_analisecred.id)
                                     group by financ_rp.cad_cadastro_id
                                     order by financ_rp.cad_cadastro_id)
        WHERE cad_cadastro_id = r_financ_analisecred.id;

		--
		-- Data do maior valor a receber
		-- 
		UPDATE financ_analisecred
		SET date_maior_receber = (select emissao 
				  from financ_rp 
				  where (natureza='R' and cad_cadastro_id=r_financ_analisecred.id)
				  order by  valor_total 
				  desc limit 1)
		WHERE cad_cadastro_id = r_financ_analisecred.id;
		EXCEPTION WHEN unique_violation THEN
			BEGIN
				--
				-- Valor Ultima Compra
				--    
				UPDATE financ_analisecred
						SET valor_ultima_compra = COALESCE((select valortotal_docto
							    from fat_docto_c
							    where (substring(serie_natureza from 1 for 1)='S'
							      and cad_cadastro_id=r_financ_analisecred.id
							      and (select substring(view_transacao.propriedade from 1 for 1) AS propriedade from view_transacao where  codigo_transacao = fat_docto_c.fat_transacao_id AND diretiva = 49) = 'S'
							      and emissao <= current_date)
							    order by emissao
							    desc limit 1),0)
						WHERE cad_cadastro_id = r_financ_analisecred.id;
				
				-- 
				-- Data Ultima Compra		
				--		
				UPDATE financ_analisecred
						SET date_ultima_compra = (select emissao
							    from fat_docto_c
							    where (substring(serie_natureza from 1 for 1)='S'
							      and cad_cadastro_id=r_financ_analisecred.id
							      and (select substring(view_transacao.propriedade from 1 for 1) AS propriedade from view_transacao where  codigo_transacao = fat_docto_c.fat_transacao_id AND diretiva = 49) = 'S'
							      and emissao <= current_date)
							    order by emissao
							    desc limit 1)
						WHERE cad_cadastro_id = r_financ_analisecred.id;
				
				--
				-- Valor Primeira Compra
				--		
				UPDATE financ_analisecred
				SET valor_primeira_compra = COALESCE((select valortotal_docto
							    					    from fat_docto_c
							    					   where (substring(serie_natureza from 1 for 1)='S'
							    					     and cad_cadastro_id=r_financ_analisecred.id
							    					     and (select substring(view_transacao.propriedade from 1 for 1) AS propriedade from view_transacao where  codigo_transacao = fat_docto_c.fat_transacao_id AND diretiva = 49) = 'S'
							    					     and emissao <= current_date)
							    					   order by emissao limit 1),0)
				WHERE cad_cadastro_id = r_financ_analisecred.id;
		
				--
				-- Data Ultima Compra 
				--
				UPDATE financ_analisecred
				SET date_primeira_compra = (select emissao
							                  from fat_docto_c
							                 where (substring(serie_natureza from 1 for 1)='S'
							                   and cad_cadastro_id=r_financ_analisecred.id
							                   and (select substring(view_transacao.propriedade from 1 for 1) AS propriedade from view_transacao where  codigo_transacao = fat_docto_c.fat_transacao_id AND diretiva = 49) = 'S'
							                   and emissao <= current_date)
							                 order by emissao limit 1)
				WHERE cad_cadastro_id = r_financ_analisecred.id;
		
		        --
		        -- Data Maior Compra
		        --
				UPDATE financ_analisecred
				SET date_maior =  (select emissao
							         from fat_docto_c
							        where (substring(serie_natureza from 1 for 1)='S'
							          and cad_cadastro_id= r_financ_analisecred.id
							          and (select substring(view_transacao.propriedade from 1 for 1) AS propriedade from view_transacao where  codigo_transacao = fat_docto_c.fat_transacao_id AND diretiva = 49) = 'S'
							          and emissao <= current_date)
							        order by valortotal_docto desc limit 1)
				WHERE cad_cadastro_id = r_financ_analisecred.id;
		
		        --
		        -- Valor Maoir Compra
		        -- 
				UPDATE financ_analisecred
				SET valor_maior = (select valortotal_docto
							         from fat_docto_c
							        where (substring(serie_natureza from 1 for 1)='S'
							          and cad_cadastro_id= r_financ_analisecred.id
							          and (select substring(view_transacao.propriedade from 1 for 1) AS propriedade from view_transacao where  codigo_transacao = fat_docto_c.fat_transacao_id AND diretiva = 49) = 'S'
							          and emissao <= current_date)
							        order by valortotal_docto desc limit 1)
				WHERE cad_cadastro_id = r_financ_analisecred.id;
		        
				--
				-- Maior Valor a Receber
				--
				UPDATE financ_analisecred
				SET valor_maior_receber = (select valor_total 
						  from financ_rp 
						  where (natureza='R' and cad_cadastro_id=r_financ_analisecred.id)
						  order by  valor_total 
						  desc limit 1)
				WHERE cad_cadastro_id = r_financ_analisecred.id;

				--
				-- Total valor_debito
				--
				UPDATE financ_analisecred
				SET valor_debito = (select SUM(valor_saldo)
						  from financ_rp
						  where (natureza='R' and cad_cadastro_id=r_financ_analisecred.id)
						  group by cad_cadastro_id
						  order by cad_cadastro_id)
				WHERE cad_cadastro_id = r_financ_analisecred.id;

                --
				-- Total debitos_em_atraso
				--
				UPDATE financ_analisecred
				SET debitos_em_atraso = (select SUM(valor_saldo)
						  from financ_rp
						  where (natureza='R' and cad_cadastro_id=r_financ_analisecred.id and current_date > prorrogacao )
						  group by cad_cadastro_id
						  order by cad_cadastro_id)
				WHERE cad_cadastro_id = r_financ_analisecred.id;

				--
                -- Qtde de Titulos em aberto
                --
                UPDATE financ_analisecred
                SET qtde_titulos_aberto = (select COUNT(*)
                          from financ_rp
                          where (natureza='R' and cad_cadastro_id=r_financ_analisecred.id AND financ_rp.valor_saldo > 0)
                          group by cad_cadastro_id
                          order by cad_cadastro_id)
                WHERE cad_cadastro_id = r_financ_analisecred.id;

		        --
                -- Limite Credito  (Saldo)
                --
                UPDATE financ_analisecred
                SET limite_credito_saldo =(select limite_credito FROM cad_cadastro WHERE id = r_financ_analisecred.id )- (select SUM(financ_rp.valor_saldo)
                                              from financ_rp
                                             where (natureza='R' and cad_cadastro_id=r_financ_analisecred.id)
                                             group by financ_rp.cad_cadastro_id
                                             order by financ_rp.cad_cadastro_id)
                WHERE cad_cadastro_id = r_financ_analisecred.id;

				--
				-- Data do maoior valor a receber
				--

				UPDATE financ_analisecred
				SET date_maior_receber = (select emissao
						  from financ_rp
						  where (natureza='R' and cad_cadastro_id=r_financ_analisecred.id)
						  order by  valor_total
						  desc limit 1)
				WHERE cad_cadastro_id = r_financ_analisecred.id;
			END;
		END;

        --
        -- Grava Ocorrencia
        --

        IF r_financ_analisecred.limite_credito > 0 THEN

            -- Posiciona analise
            SELECT cad_cadastro_id, valor_ultima_compra, date_ultima_compra, valor_primeira_compra,
                   date_primeira_compra, valor_maior, date_maior, valor_maior_receber,
                   date_maior_receber, valor_debito, qtde_titulos_aberto, limite_credito_saldo
              INTO r_analise
              FROM financ_analisecred
             WHERE cad_cadastro_id =  r_financ_analisecred.id;

            IF FOUND AND r_analise.limite_credito_saldo < 0 THEN
                LOOP
                   UPDATE cad_cadastro_ocorr
                      SET data_ocorr  = current_timestamp,
                          ocorrencia  = 'LIMITE DE CREDITO: ' || to_Char(coalesce(r_financ_analisecred.limite_credito,0), '999999999.99') || ' - ' ||
                                        'VALOR EM DEBITO:   ' ||  to_Char(coalesce(r_analise.valor_debito,0), '999999999.99') ||' - ' ||
                                        'LIMITE:            ' ||  to_Char(coalesce(r_analise.limite_credito_saldo,0), '999999999.99')
                    WHERE cad_cadastro_id     = r_financ_analisecred.id
                      AND avisar_data_inicial = padrao.getfirstday(current_date)
                      AND avisar_data_final   = padrao.getlastday(current_date);

                    EXIT  WHEN found;

                    BEGIN
                        INSERT INTO cad_cadastro_ocorr
                                  ( cad_cadastro_id,
                                    avisar,
                                    status,
                                    ocorrencia,
                                    data_ocorr,
                                    avisar_data_inicial,
                                    avisar_data_final)
                             VALUES(r_financ_analisecred.id,
                                    'AVISAR_QDO_FATURAR',
                                    'A',
                                    'LIMITE DE CREDITO: ' || to_Char(coalesce(r_financ_analisecred.limite_credito,0), '999999999.99') || ' - ' ||
                                    'VALOR EM DEBITO:   ' ||  to_Char(coalesce(r_analise.valor_debito,0), '999999999.99') ||' - ' ||
                                    'LIMITE:            ' ||  to_Char(coalesce(r_analise.limite_credito_saldo,0), '999999999.99'),
                                    current_timestamp,
                                    padrao.getfirstday(current_date),
                                    padrao.getlastday(current_date));
                        EXIT ;

                    EXCEPTION
                        WHEN UNIQUE_VIOLATION THEN
                            -- do nothing
                    END;
                END LOOP;
            END IF;
        END IF;

	END LOOP;
	
   RETURN NULL;
END;      

$BODY$

LANGUAGE 'plpgsql' VOLATILE;


-- Gatilho {gravaanalisecred()} Versao {002} Esquema {empresa} Descricao {Grava apuracao de resultado (classes de competencia) }
-- ------------------------------------------------------------

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


