
-- StoreProcedure {gravafdc()} Versao {01} Esquema {padrao} Descricao {Grava Cabecalho Documento}
-- -----------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.gravafdc(character varying[],character varying[])
  RETURNS bool AS
  $BODY$
  DECLARE
	p_atributo            alias for $1;
	p_dado                alias for $2;
	v_length              integer;
 	v_contador            integer;
 	v_retorna             boolean;
   
    a_controle 								bigint;
    a_tabcfop_id 							VARCHAR(20);
    a_fat_transacao_id 						INT4;
    a_serie_id 								VARCHAR(20);
    a_seriedocto_id 						INT;
    a_seriedocto_codigo 					CHAR(3);
    a_serie_natureza 						VARCHAR(20);
    a_cad_filial_id 						INT4 ;
    a_numero_docto 							INT8;
    a_emissao 								DATE;
    a_emissaoTime							TIMESTAMP;
    a_dataentradasaida 						DATE;
    a_cad_cadastro_id 						INT4;
    a_cad_cadastro_iddest 					INT4;
    a_cad_cadastro_idremet 					INT4;
    a_cad_cadastro_idconsig 				INT4;
    a_cad_mun_idorigem 						INT;
    a_cad_mun_iddestino 					INT;
    a_nome 									VARCHAR(60);
    a_endereco 								VARCHAR(60);
    a_endereco_numero						VARCHAR(20);
    a_complemento 							VARCHAR(60);
    a_bairro 								VARCHAR(60);
    a_cidade 								VARCHAR(30);
    a_uf 									VARCHAR(2);
    a_cnpj_cpf 								VARCHAR(20);
    a_ie_rg 								VARCHAR(20);
    a_cadastro_vendedor_id 					INT4;
    a_fat_listapre_id 						INT4;
    a_fat_listapre_tabela_tabela 			INT4;
    a_tipolcto 								INT;
    a_statuslcto 							INT;
    a_statusdocto 							VARCHAR(80);
    a_fat_condpg_id 						INT4;
    a_totalprodutos 						DECIMAL(16,4);
    a_totalliquidoprodutos 					DECIMAL(16,4);
    a_ipi_valor 							DECIMAL(14,2);
    a_iss_valor 							DECIMAL(14,2);
    a_icms_basecalculo 						DECIMAL(14,2);
    a_icms_valor 							DECIMAL(14,2);
    a_icmssubst_basecalculo 				DECIMAL(14,2);
    a_icmssubst_valor 						DECIMAL(14,2);
    a_ncmtotalvlimposto 					DECIMAL(14,2);
    a_irf_bc 								DECIMAL(16,4);
    a_irf_perc								DECIMAL(14,5);
    a_irf_outras 							DECIMAL(16,4);
    a_irf_isentas 							DECIMAL(16,4);
    a_funrural_perc 						DECIMAL(14,5);
    a_funrural_valor 						DECIMAL(16,4);
    a_inss_perc 							DECIMAL(14,5);
    a_inss_valor 							DECIMAL(16,4);
    a_pis_valor 							DECIMAL(16,4);
    a_cofins_valor 							DECIMAL(16,4);
    a_desconto_perc 						DECIMAL(14,5);
    a_desconto_valor 						DECIMAL(16,4);
    a_descontopromo_perc 					DECIMAL(14,5);
    a_descontopromo_valor 					DECIMAL(16,4);
    a_descontodocto_perc 					DECIMAL(14,5);
    a_descontodocto_valor 					DECIMAL(16,4);
    a_descontocliente_perc 					DECIMAL(14,5);
    a_descontocliente_valor					DECIMAL(16,4);
    a_valortotal_docto 						DECIMAL(16,4);
    a_valorarredtotaldocto 					DECIMAL(16,4);
    a_infocustodescpgto 					DECIMAL(16,4);
    a_infocustojurosvendor 					DECIMAL(16,4);
    a_infocustooutrasdesp 					DECIMAL(16,4);
    a_infocustofretepagar 					DECIMAL(16,4);
    a_icr_descontopgto 						DECIMAL(16,4);
    a_icr_jurosvendor 						DECIMAL(16,4);
    a_icr_OutrasDespesas 					DECIMAL(16,4);
    a_icr_freteapagar 						DECIMAL(16,4);
    a_comissaofaturamento 					DECIMAL(16,4);
    a_comissaorecebimento 					DECIMAL(16,4);
    a_comissao_avista 						DECIMAL(16,6);
    a_comissao_aprazo 						DECIMAL(16,6);
    a_prazoentrega 							NUMERIC;
    a_validade 								NUMERIC;
    a_frete_substvalorfrete 				DECIMAL(16,4);
    a_frete_substvaloricms 					DECIMAL(16,4);
    a_frete_valor 							DECIMAL(16,4);
    a_frete_tabtrib 						INT4;
    a_frete_tabred 							INT4;
    a_frete_basecalculo 					DECIMAL(16,4);
    a_frete_pericms 						DECIMAL(16,4);
    a_valortotal_docto_2 					DECIMAL(16,4);
    a_frete_isentos 						DECIMAL(16,4);
    a_frete_outros 							DECIMAL(16,4);
    a_frete_percipi 						DECIMAL(16,4);
    a_frete_valoripi 						DECIMAL(16,4);
    a_despesa_valor 						DECIMAL(16,4);
    a_despesa_tabtri 						INT4;
    a_despesa_tabred 						INT4;
    a_despesa_basecalculo 					DECIMAL(16,4);
    a_despesa_percicms 						DECIMAL(14,5);
    a_despesa_valoricms						DECIMAL(16,4);
    a_despesa_isentos 						DECIMAL(16,4);
    a_despesa_outros 						DECIMAL(16,4);
    a_despesa_percipi 						DECIMAL(14,5);
    a_despesa_valoripi 						DECIMAL(16,4);
    a_seguro_valor 							DECIMAL(16,4);
    a_seguro_tabtri 						INT4;
    a_seguro_tabred 						INT4;
    a_seguro_basecalculo 					DECIMAL(16,4);
    a_seguro_percicms 						DECIMAL(14,5);
    a_seguro_valoricms 						DECIMAL(16,4);
    a_seguro_isentos 						DECIMAL(16,4);
    a_seguro_outros 						DECIMAL(16,4);
    a_jnfe_lote_id 							INT;
    a_nfefinalidadeemissao 					VARCHAR(30);
    a_nfeformaemissao 						VARCHAR(30);
    a_nfetipoemissaodanfe 					VARCHAR(30);
    a_nfesituacao 							VARCHAR(150);
    a_nfedanfeimpresso 						BOOL;
    a_nfechaveacesso 						VARCHAR(44);
    a_nfeexportada 							BOOL;
    a_nfemodelo 							Varchar(20);
    a_nfedigestvalue 						VARCHAR(255);
    a_nfeambiente 							VARCHAR(20);
    a_nfeprotocolo 							VARCHAR(15);
    a_nfeprotocoloCanc 						VARCHAR(15);
    a_nfexmotivo 							VARCHAR(250);
    a_nfexmotivocanc 						VARCHAR(250);
    a_nfecstat 								VARCHAR(3);
    a_nfecstatcanc 							VARCHAR(3);
    a_nfejustificativa 						VARCHAR(250);
    a_nfedescevento							VARCHAR(30);
    a_nfeeventos 							TEXT;
    a_nfelog 								TEXT;
    a_nfe_qrcode 							VARCHAR(600);
    a_nfexml 								TEXT;
    a_nfexmldistribuicao 					TEXT;
    a_nfexmlcanc 							TEXT;
    a_nfexmlcancdistribuicao 				TEXT;
    a_nfexmlretEnviNFe 						TEXT;
    a_nfexmlretConsSitNFe 					TEXT;
    a_nferef_documento 						VARCHAR(20),
    a_nferef_chaveacesso	 				VARCHAR(44);
    a_nferef_emissao 						DATE;
    a_nferef_cad_cadastro_id 				INT;
    a_nferef_numerodocto 					INT;
    a_nferef_numerocoo 						INT;
    a_cad_veiculo_id 						INT;
    a_mdfe_totalmercadorias 				DECIMAL(16,4);
    a_mdfe_pesobrutocarga 					DECIMAL(16,4);
    a_mdfe_un_pesobrutocarga 				CHAR(3);
    a_defeitoReclamado 						TEXT;
    a_defeitoConstatado 					TEXT;
    a_volumes 								NUMERIC(14,3);
    a_especie 								VARCHAR(40);
    a_marca 								VARCHAR(40);
    a_pesobruto 							DECIMAL(16,4);
    a_pesoliquido 							DECIMAL(16,4);
    a_cad_cadastro_idtransp 				INT4;
    a_transp_nome 							VARCHAR(60);
    a_transp_endereco 						VARCHAR(60);
    a_transp_cidade 						VARCHAR(30);
    a_transp_uf 							VARCHAR(2);
    a_transp_cnpj_cpf 						VARCHAR(20);
    a_transp_ie_rg 							VARCHAR(20);
    a_transp_placaveiculo 					VARCHAR(20);
    a_transp_placaveiculo_reboque1 			VARCHAR(20);
    a_transp_placaveiculo_reboque2 			Varchar(20);
    a_transp_placaveiculo_reboque3 			Varchar(20);
    a_transp_descricaoveiculo 				VARCHAR(50);
    a_transp_ufveiculo 						VARCHAR(2);
    a_transp_rntrc 							VARCHAR(10);
    a_transp_idmotorista 					INT4;
    a_transp_tipocarroceria 				VARCHAR(30);
    a_transp_tiporodado 					VARCHAR(30);
    a_transp_taraveiculo 					NUMERIC(14,3);
    a_transp_ciot 							VARCHAR(12);
    a_frete 								VARCHAR(30);
    a_descarga 								VARCHAR(30);
    a_dadosadicionais 						TEXT;
    a_dadosadicionaiscontribuinte 			TEXT;
    a_observacao 							TEXT;
    a_dataalteracao 						DATE;
    a_horaalteracao 						TIME;
    a_usuarioalteracao 						VARCHAR(20);
    a_datainclusao 							DATE;
    a_horainclusao 							TIME;
    a_usuarioinclusao 						VARCHAR(20);
    
    
    
    r_registro   record;
  
  BEGIN
     v_length   := array_upper(p_dado,1);
  	 v_contador := 0;
  	 v_retorna = true;
  	 
    WHILE v_contador < v_length LOOP
     	v_contador := v_contador + 1;
     	IF  p_atributo[v_contador] =  'controle' 						THEN 		= CAST(p_dado[v_contador] AS bigInt			); END IF;
     	IF  p_atributo[v_contador] =  'tabcfop_id' 					    THEN 	    = CAST(p_dado[v_contador] AS int			); END IF;   
     	IF  p_atributo[v_contador] =  'fat_transacao_id' 				THEN 		= CAST(p_dado[v_contador] AS bigInt			); END IF;   
		IF  p_atributo[v_contador] =  'serie_id' 						THEN 		= CAST(p_dado[v_contador] AS DECIMAL(14,6)	); END IF;
     	                              'seriedocto_id' 					     	
		                              'seriedocto_codigo' 				     	
		                              'serie_natureza' 					     	
		                              'cad_filial_id' 					     	
		                              'numero_docto' 					     		
		                              'emissao' 							     	
		                              'emissaoTime'						     	
		                              'dataentradasaida' 				     		
		                              'cad_cadastro_id' 					     	
		                              'cad_cadastro_iddest' 				     	
		                              'cad_cadastro_idremet' 			     		
		                              'cad_cadastro_idconsig' 			     	
		                              'cad_mun_idorigem' 				     		
		                              'cad_mun_iddestino' 				     	
		                              'nome' 							     		
		                              'endereco' 						     		
		                              'endereco_numero'					     	
		                              'complemento' 						     	
		                              'bairro' 							     	
		                              'cidade' 							     	
		                              'uf'							     	
		                              'cnpj_cpf' 						     		
		                              'ie_rg' 							     	
		                              'cadastro_vendedor_id' 			     		
		                              'fat_listapre_id' 					     	
		                              'fat_listapre_tabela_tabela' 		     	
		                              'tipolcto' 						     		
		                              'statuslcto' 						     	
		                              'statusdocto' 						     	
		                              'fat_condpg_id' 					     	
		                              'totalprodutos' 					     	
		                              'totalliquidoprodutos' 			     		
		                              'ipi_valor' 						     	
		                              'iss_valor' 						     	
		                              'icms_basecalculo' 				     		
		                              'icms_valor' 						     	
		                              'icmssubst_basecalculo' 			     	
		                              'icmssubst_valor'			     	
		                              'ncmtotalvlimposto' 				     	
		                              'irf_bc' 							     	
		                              'irf_perc'							     	
		                              'irf_outras' 						     	
		                              'irf_isentas' 						     	
		                              'funrural_perc' 					     	
		                              'funrural_valor' 					     	
		                              'inss_perc' 						     	
		                              'inss_valor' 						     	
		                              'pis_valor' 						     	
		                              'cofins_valor' 					     		
		                              'desconto_perc' 					     	
		                              'desconto_valor' 					     	
		                              'descontopromo_perc' 				     	
		                              'descontopromo_valor' 				     	
		                              'descontodocto_perc' 				     	
		                              'descontodocto_valor' 				     	
		                              'descontocliente_perc' 			     		
		                              'descontocliente_valor'			     		
		                              'valortotal_docto' 				     		
		                              'valorarredtotaldocto' 			     		
		                              'infocustodescpgto' 				     	
		                              'infocustojurosvendor' 			     		
		                              'infocustooutrasdesp' 				     	
		                              'infocustofretepagar' 				     	
		                              'icr_descontopgto' 				     		
		                              'icr_jurosvendor' 					     	
		                              'icr_OutrasDespesas' 				     	
		                              'icr_freteapagar' 					     	
		                              'comissaofaturamento' 				     	
		                              'comissaorecebimento' 				     	
		                              'comissao_avista' 					     	
		                              'comissao_aprazo' 					     	
		                              'prazoentrega' 					     		
		                              'validade' 						     		
		                              'frete_substvalorfrete' 			     	
		                              'frete_substvaloricms' 			     		
		                              'frete_valor' 						     	
		                              'frete_tabtrib' 					     	
		                              'frete_tabred' 					     		
		                              'frete_basecalculo' 				     	
		                              'frete_pericms' 					     	
		                              'valortotal_docto_2' 				     	
		                              'frete_isentos' 					     	
		                              'frete_outros' 					     		
		                              'frete_percipi' 					     	
		                              'frete_valoripi' 					     	
		                              'despesa_valor' 					     	
		                              'despesa_tabtri' 					     	
		                              'despesa_tabred' 					     	
		                              'despesa_basecalculo' 				     	
		                              'despesa_percicms' 				     		
		                              'despesa_valoricms'				     		
		                              'despesa_isentos' 					     	
		                              'despesa_outros' 					     	
		                              'despesa_percipi' 					     	
		                              'despesa_valoripi' 				     		
		                              'seguro_valor' 					     		
		                              'seguro_tabtri' 					     	
		                              'seguro_tabred' 					     	
		                              'seguro_basecalculo' 				     	
		                              'seguro_percicms' 					     	
		                              'seguro_valoricms' 				     		
		                              'seguro_isentos' 					     	
		                              'seguro_outros' 					     	
		                              'jnfe_lote_id' 					     		
		                              'nfefinalidadeemissao' 			     		
		                              'nfeformaemissao' 					     	
		                              'nfetipoemissaodanfe' 				     	
		                              'nfesituacao' 						     	
		                              'nfedanfeimpresso' 				     		
		                              'nfechaveacesso' 					     	
		                              'nfeexportada' 					     		
		                              'nfemodelo' 						     	
		                              'nfedigestvalue' 					     	
		                              'nfeambiente' 						     	
		                              'nfeprotocolo' 					     		
		                              'nfeprotocoloCanc' 				     		
		                              'nfexmotivo' 						     	
		                              'nfexmotivocanc' 					     	
		                              'nfecstat' 						     		
		                              'nfecstatcanc' 					     		
		                              'nfejustificativa' 				     		
		                              'nfedescevento'					     		
		                              'nfeeventos' 						     	
		                              'nfelog' 							     	
		                              'nfe_qrcode' 						     	
		                              'nfexml' 							     	
		                              'nfexmldistribuicao' 				     	
		                              'nfexmlcanc' 						     	
		                              'nfexmlcancdistribuicao' 			     	
		                              'nfexmlretEnviNFe' 				     		
		                              'nfexmlretConsSitNFe' 				     	
		                              'nferef_documento' 				     		
		                              'nferef_chaveacesso'	 			     	
		                              'nferef_emissao' 					     	
		                              'nferef_cad_cadastro_id' 			     	
		                              'nferef_numerodocto' 				     	
		                              'nferef_numerocoo' 				     		
		                              'cad_veiculo_id' 					     	
		                              'mdfe_totalmercadorias' 			     	
		                              'mdfe_pesobrutocarga' 				     	
		                              'mdfe_un_pesobrutocarga' 			     	
		                              'defeitoReclamado' 				     		
		                              'defeitoConstatado' 				     	
		                              'volumes' 							     	
		                              'especie'							     	
		                              'marca' 							     	
		                              'pesobruto' 						     	
		                              'pesoliquido' 						     	
		                              'cad_cadastro_idtransp' 			     	
		                              'transp_nome' 						     	
		                              'transp_endereco' 					     	
		                              'transp_cidade' 					     	
		                              'transp_uf' 						     	
		                              'transp_cnpj_cpf' 					     	
		                              'transp_ie_rg' 					     		
		                              'transp_placaveiculo' 				     	
		                              'transp_placaveiculo_reboque1' 	     		
		                              'transp_placaveiculo_reboque2' 	     		
		                              'transp_placaveiculo_reboque3' 	     		
		                              'transp_descricaoveiculo' 			     	
		                              'transp_ufveiculo' 				     		
		                              'transp_rntrc' 					     		
		                              'transp_idmotorista' 				     	
		                              'transp_tipocarroceria' 			     	
		                              'transp_tiporodado' 				     	
		                              'transp_taraveiculo' 				     	
		                              'transp_ciot' 						     	
		                              'frete' 							     	
		                              'descarga' 						     		
		                              'dadosadicionais' 					     	
		                              'dadosadicionaiscontribuinte' 		     	
		                              'observacao' 						     	
		                              'dataalteracao' 					     	
		                              'horaalteracao' 					     	
		                              'usuarioalteracao' 				     		
		                              'datainclusao' 					     		
		                              'horainclusao' 					     		
		                              'usuarioinclusao' 					     	
     
  	End LOOP;
    -- Insert or update tabela financ_rp row with the new values.
    LOOP
   
       UPDATE fat_docto_pa
          SET fat_produto_id          = a_fat_produto_id,
              fat_docto_c_controle    = a_fat_docto_c_controle,
			  fat_docto_pc_controle   = a_fat_docto_pc_controle,
			  qtde                    = a_qtde,
			  qtde_naoatendida        = a_qtde_naoatendida,
			  qtde_cancelada          = a_qtde_cancelada
        WHERE fat_produto_id          = a_fat_produto_id
          AND fat_docto_pc_controle   = a_fat_docto_pc_controle;

        EXIT  WHEN found;

        BEGIN
            INSERT INTO fat_docto_pa
                      ( fat_produto_id ,
  						fat_docto_pc_controle,
  						fat_docto_c_controle,
  						qtde ,
  						qtde_naoatendida ,
  						qtde_cancelada )
                 VALUES(a_fat_produto_id ,         
                        a_fat_docto_pc_controle,   
						a_fat_docto_c_controle,    
						a_qtde ,                   
						a_qtde_naoatendida ,       
						a_qtde_cancelada);         

			EXIT ;

        EXCEPTION
            WHEN UNIQUE_VIOLATION THEN
                -- do nothing
                  v_retorna = false;
        END;
    END LOOP;
   
   RETURN v_retorna;
  END
  
  $BODY$
  
  LANGUAGE 'plpgsql' VOLATILE;

  