
-- StoreProcedure {rpbaixa()} Versao {002} Esquema {padrao} Descricao {Grava baixa contas receber e pagar}
-- ------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.rpbaixa(char(1), Integer, Integer, Integer, Integer, Integer, Date, Date, Numeric(14,2), Numeric(14,2), Numeric(14,2), Numeric(14,2), Numeric(14,2), Numeric(14,2), VarChar, Text, Integer, Integer)
RETURNS bool AS
$BODY$
DECLARE
 --Parameters
   p_opcao               alias for $1;
   cadastro_codigo       alias for $2;
   fatura                alias for $3;
   parcela               alias for $4;
   lcto                  alias for $5;  
   filial_Codigo         alias for $6;
   datapgto              alias for $7;
   vcto                  alias for $8;
   valor_pago            alias for $9;
   valor_juros           alias for $10;
   valor_despesasac      alias for $11;
   valor_devolucaom      alias for $12;
   valor_descontos       alias for $13;
   valor_liquido         alias for $14;
   docto                 alias for $15;
   historico             alias for $16;
   transacao             alias for $17;
   cc_codigo             alias for $18;
 --Variaveis
   dia                   double precision;
   mes                   double precision;
   ano                   double precision;
   v_retorna             boolean; 
   ultimoVcto            DATE;
   vencimento            DATE;
   valorNFsaldo          NUMERIC(14,2); -- Valor Total da NF
   valorPA               NUMERIC(14,2); -- Valor da PArcela
   valorComissao         NUMERIC(14,2); -- Valor da Comissao pelo recebimento
   Receber_Pagar         CHAR(1);
   aCampos               character varying[];
   aDados                character varying[];
   aCamposCl             character varying[];
   aDadosCl              character varying[];
   sCampos               VARCHAR;
   sDados                VARCHAR;
 --Faturamento
   d11_perc_comissao     NUMERIC(14,5); 
   d12_natureza          CHAR(1); --Natureza: Entrada/Saida
   d13_tipo_docto        CHAR(1); --Tipo Docto: Nota Fiscao/Pedido/Orcamento
   d14_calcularICMS      CHAR(1); --Calcular ICMS: Sim/Nao
   d15_calcularIPI       CHAR(1); --Calcular IPI: Sim/Nao
   d16_calcularFUNRURAL  CHAR(1); --Calcular FUNRURAL: Sim/Nao
   d17_CFOP              VARCHAR; --Classificacao Fiscal(CFOP) da transacao
   d18_usarCFOP          CHAR(1); --Usar classificacao fiscal(CFOP) do:(1-Cadastro de Transacao/2-Cadastro do produtos
   d19_devolucao         CHAR(1); --devolucao de mercadorias (Sim - Nao)
   d115_NFE              CHAR(1); --Nota Fiscal Eletronica: (Sim/Nao)
 --Estoque 
   d26_atualiza_estoque  CHAR(1); --Atualiza estouque:(Sim/Nao)
   d27_tipo_mvto         CHAR(1); --Tipo de Movimento :0-Normal/1-Consignacao - Envio/ ...
   d28_alterarCM         CHAR(1); --Alterar Custo Medio : Sim/Nao
   d29_alterrrCUC        CHAR(1); --Alterar Custo Ultima compra: Sim/Nao
   d210_checarestoque    CHAR(1); --Checar Estoque: 0-Checar saldo negativo/1-Vetar saida com saldo negativo 
 --Financeiro    
   d47_ImpComprovante    CHAR(1); --Imnprimir comprovante de recebimento: Sim/Nao          
   d48_GerarCHPD         CHAR(1); --Lancar CHPD: Sim/Nao          
   d49_lancarCRP         CHAR(1); --Lancar contas a receber/pagar: Sim/Nao
   d410_atualizarsaldoCC CHAR(1); --Atualizar saldo do C/C: Sim/Nao
   d411_tipolcto         CHAR(1); --Tipo lancamento: 0-Normal/1-Transferencia
   d412_natureza         CHAR(1); --Natureza: Creditol/Debito
   d413_comissao         CHAR(1); --Comissao: 0-Creditar comissao/1-Debitar comissao/2-Nao comissionar
   d414_conciliar        CHAR(1); --Conciliar automatico: Sim/Nao
--Classificacao Gerencial
   d71_codigoclasse1      VARCHAR(5); --Codigo classificacacao gerencial 1
   d72_codigoclasse2      VARCHAR(5); --Codigo classificacacao gerencial 2
   d73_codigoclasse3      VARCHAR(5); --Codigo classificacacao gerencial 3  
   
   r_transacao      RECORD;
   r_lctoitens      RECORD;
   r_condpgto       RECORD; -- Condicao de pgto
   r_condpgtop      RECORD; -- Condicao de pgto - parcelas
   r_finaceiro      RECORD; -- Financeiro - Gravar classificacao gerencial

BEGIN

-- LOOP 
   FOR r_transacao IN SELECT * FROM view_transacao WHERE codigo_transacao = transacao ORDER BY diretiva LOOP
       ----RAISE NOTICE 'Propriedade:% (%)',  r_transacao.diretiva, r_transacao.propriedade;
    -- diretiva/Regra 11 -( (%) Comissao vendedores) 
       IF r_transacao.diretiva = 11 THEN
           
       	  d11_perc_comissao = CAST(r_transacao.propriedade AS DECIMAL(14,5));
       END IF; 

    -- diretiva/Regra 12 - ( Natureza: Entrada/Saida) 
       IF r_transacao.diretiva = 12 THEN
       	  d12_natureza = substring(r_transacao.propriedade from 1 for 1);
       END IF; 

    -- diretiva/Regra 13 - ( Tipo Docto: Nota Fiscao/Pedido/Orcamento) 
       IF r_transacao.diretiva = 13 THEN
       	  d13_tipo_docto = substring(r_transacao.propriedade from 1 for 1);
       END IF;

    -- diretiva/Regra 14 - ( Calcular ICMS: Sim/Nao) 
       IF r_transacao.diretiva = 14 THEN
       	  d14_calcularICMS = substring(r_transacao.propriedade from 1 for 1);
       END IF;  
        
    -- diretiva/Regra 15 - ( Calcular IPI: Sim/Nao) 
       IF r_transacao.diretiva = 15 THEN
       	  d15_calcularIPI = substring(r_transacao.propriedade from 1 for 1);
       END IF; 
       
    -- diretiva/Regra 16 - ( Calcular FUNRURAL: Sim/Nao) 
       IF r_transacao.diretiva = 16 THEN
       	  d16_calcularFUNRURAL = substring(r_transacao.propriedade from 1 for 1);
       END IF;   

    -- diretiva/Regra 17 - ( Classificacao Fiscal(CFOP)) 
       IF r_transacao.diretiva = 17 THEN
       	  d17_CFOP = Trim(both ' ' from r_transacao.propriedade);
       END IF;  

    -- diretiva/Regra 18 - ( Usar classificacao fiscal(CFOP) do:(1-Cadastro de Transacao/2-Cadastro do produtos ) 
       IF r_transacao.diretiva = 18 THEN
       	  d18_usarCFOP = substring(r_transacao.propriedade from 1 for 1);
       END IF;  
	-- diretiva/Regra 19 - (Devolucao:( Sim/Nao ) 
       IF r_transacao.diretiva = 19 THEN
       	  d19_devolucao = substring(r_transacao.propriedade from 1 for 1);
       END IF;  
     -- diretiva/Regra 115 - (Nota Fiscal Eletronica: Sim/Nao) 
       IF r_transacao.diretiva = 115 THEN
       	  d115_NFE = substring(r_transacao.propriedade from 1 for 1);
       END IF;   
    -- diretiva/Regra 26 - ( Atualiza estoque: Sim/Nao.) 
       IF r_transacao.diretiva = 26 THEN
       	  d26_atualiza_estoque = substring(r_transacao.propriedade from 1 for 1);
       END IF;        
 	-- diretiva/Regra 27 - ( Tipo de Movimentacao: 0-Normal/1-Consignacao - Envio/ ...) 
       IF r_transacao.diretiva = 27 THEN
       	  d27_tipo_mvto = substring(r_transacao.propriedade from 1 for 1);
       END IF;  
       
  	-- diretiva/Regra 28 - ( Alterar Custo Medio: Sim/Nao) 
       IF r_transacao.diretiva = 28 THEN
       	  d28_alterarCM = substring(r_transacao.propriedade from 1 for 1) ;
       END IF;  

  	-- diretiva/Regra 29 - ( Alterar Custo Ultima compra: Sim/Nao) 
       IF r_transacao.diretiva = 29 THEN
       	  d29_alterrrCUC = substring(r_transacao.propriedade from 1 for 1) ;
       END IF;  
    -- diretiva/Regra 210 - ( Checar Saldo Negativo:  0-Checar saldo negativo/1-Vetar saida com saldo negativo) 
       IF r_transacao.diretiva = 210 THEN
       	  d210_checarestoque = substring(r_transacao.propriedade from 1 for 1) ;
       END IF;
    -- diretiva/Regra 47 - ( Imprimir Comprovante de recebimento: Sim/Nao) 
       IF r_transacao.diretiva = 47 THEN
       	 d47_ImpComprovante =  substring(r_transacao.propriedade from 1 for 1);
       END IF;     
	-- diretiva/Regra 48 - ( Lancar CHPD: Sim/Nao) 
       IF r_transacao.diretiva = 48 THEN
       	 d48_GerarCHPD =  substring(r_transacao.propriedade from 1 for 1);
       END IF;           
  	-- diretiva/Regra 49 - ( Lancar contas a receber/pagar: Sim/Nao) 
       IF r_transacao.diretiva = 49 THEN
       	 d49_lancarCRP =  substring(r_transacao.propriedade from 1 for 1);
       END IF;       
    -- diretiva/Regra 71 - ( -codigo classificacacao gerencial 1 ) 
       IF r_transacao.diretiva = 71 THEN
       	 d71_codigoclasse1 =  r_transacao.propriedade;
       END IF; 
    -- diretiva/Regra 72 - ( -codigo classificacacao gerencial 2 ) 
       IF r_transacao.diretiva = 72 THEN
       	 d72_codigoclasse2 =  r_transacao.propriedade;
       END IF;      
     -- diretiva/Regra 73 - ( -codigo classificacacao gerencial 3 ) 
       IF r_transacao.diretiva = 73 THEN
       	 d73_codigoclasse3 =  r_transacao.propriedade;
       END IF;         
   	-- diretiva/Regra 410 - ( Atualiza saldo do C/C: Sim/Nao) 
       IF r_transacao.diretiva = 410 THEN
       	  d410_atualizarsaldoCC = substring(r_transacao.propriedade from 1 for 1)  ;
       END IF;            
  
  	-- diretiva/Regra 411 - ( Tipo lancamento: 0-Normal/1-Transferencia) 
       IF r_transacao.diretiva = 411 THEN
       	  d411_tipolcto =  substring(r_transacao.propriedade from 1 for 1);
       END IF;      
       
  	-- diretiva/Regra 412 - ( Natureza: Creditol/Debito) 
       IF r_transacao.diretiva = 412 THEN
       	  d412_natureza = substring(r_transacao.propriedade from 1 for 1);
       END IF;       
            
  	-- diretiva/Regra 413 - ( Comissao: 0-Creditar comissao/1-Debitar comissao/2-Nao comissionar) 
       IF r_transacao.diretiva = 413 THEN
       	  d413_comissao =  substring(r_transacao.propriedade from 1 for 1);
       END IF;         
   
    -- diretiva/Regra 414 - (Regra Conciliar automatico: Sim/Nao) 
       IF r_transacao.diretiva = 414 THEN
       	  d414_conciliar = substring(r_transacao.propriedade from 1 for 1);
       END IF;   
   END LOOP;
   
   
   
   --********************************************************
   -- Lanca Contas a receber/ Pagar
   --********************************************************
   v_retorna = true;
   IF d49_lancarCRP = 'S' THEN

   	      aCampos =  '{cadastro_codigo,  
	                   fatura,     		
	                   parcela,     		
	                   lancamento,       
	                   filial_codigo,    
	                   datapgto,         
	                   valor_pago,       
	                   valor_juros,      
	                   valor_despesasac, 
	                   valor_devolucaom, 
	                   valor_descontos,  
	                   valor_liquido,    
	                   docto,            
	                   historico,        
	                   docto_c_controle, 
	                   transacao_codigo }';
	     
             --RAISE EXCEPTION 'aCampos: (%)',    to_Char(valor_liquido,   'FM999999999.99'); 
          	                  
	      aDados  =   '{'|| to_char(cadastro_codigo,'99999')             ||','
	                      || to_char(fatura,  '9999999999')              ||',' 
	                      || to_char(parcela,  '999')                    ||',' 
	     			      || to_Char(filial_codigo, '999')               ||','
	     			      || to_char(lcto,  '9999999999')              ||',' 
	     			      || to_Char(datapgto, 'dd/MM/yyyy')             ||','
	     			      || to_Char(valor_pago,       'FM999999999.99')   ||','
	     			      || to_Char(valor_juros,      'FM999999999.99')   ||','
	     			      || to_Char(valor_despesasac, 'FM999999999.99')   ||','
	     			      || to_Char(valor_devolucaom, 'FM999999999.99')   ||','
	     			      || to_Char(valor_descontos,  'FM999999999.99')   ||','
	     			      || to_Char(valor_liquido,    'FM999999999.99')    ||','
	     			      || docto                                       ||',' 
	     			      || historico                                   ||',' 
	     			      || to_char(fatura,  '9999999999')              ||','
	     			      || to_char(transacao,  '9999999999')    ||'}';
	     			          
	     ----RAISE NOTICE 'aCampos: (%)',     aCampos;
	     ----RAISE NOTICE 'aDados: (%)',      aDados;
	     
	     IF NOT gravabaixa(p_opcao, aCampos, aDados)THEN
	        RAISE EXCEPTION 'nao possivel persistir baixa (docto:% - Fatura:%)!', docto , fatura ;
	        v_retorna = false;
	     END IF;
	     
	   --Gravar  classificacao gerencial
	   -- ????  
	  
	   
   END IF;   
   
   RETURN v_retorna;
END;

$BODY$

LANGUAGE 'plpgsql' VOLATILE;
