Envio de notas nfs-e

1,064 views
Skip to first unread message

Alexandre Azevedo

unread,
Feb 14, 2012, 8:44:23 AM2/14/12
to nfe...@googlegroups.com
Pessoal e possivel eu usar o NFePHP, ao menos para enviar as notas NFS-e ( prefeituras ) ?


att,

Alexandre Azevedo
Graduado em Sistema de Informação pela FIB
Graduando em Sistemas Para Internet pela Unifacs
Desenvolvedor Web / Analista de Sistemas

Empresa: www.nixonline.com.br
Contatos:
E-mail: 
alexandr...@gmail.com  
msn: alexandr...@hotmail.com
Skype: alexandreazevedo4

Tel: (71) 8738-6638 (tim) / 9662-4552 (vivo)
twitter: @_aaoliveira


Roberto Leite Machado

unread,
Feb 14, 2012, 9:54:47 AM2/14/12
to nfe...@googlegroups.com
Infelizmente NÃO, Alexandre;

Mas pode ser usado como base para desenvolver para os webservices das prefeituras, e aproveito para solicitar a quem quer que já tenha feito isso que compartilhe conosco que eu posto para distribuição.

Abraço
Roberto




--
___________________________________________
Roberto
Nisi utile est quod facimus, stulta est gloria (Julius Phaedous)

Giuliano

unread,
Feb 14, 2012, 10:12:22 AM2/14/12
to nfe...@googlegroups.com
Tenho uma versão NFSe pra Salvador, mas está muito personalizada pra minha aplicação.
Se tiver alguém disposto a dar uma limpada, posso disponibilizar, pois estou sem tempo.
Sds,

Giuliano Nascimento

Em 14/02/12 12:54, Roberto Leite Machado escreveu:
Infelizmente NÃO, Alexandre;

Mas pode ser usado como base para desenvolver para os webservices das prefeituras, e aproveito para solicitar a quem quer que já tenha feito isso que compartilhe conosco que eu posto para distribuição.

Abraço
Roberto

Em 14 de fevereiro de 2012 11:44, Alexandre Azevedo <alexandr...@gmail.com> escreveu:
Pessoal e possivel eu usar o NFePHP, ao menos para enviar as notas NFS-e ( prefeituras ) ?


att,

Alexandre Azevedo

unread,
Feb 14, 2012, 10:15:07 AM2/14/12
to nfe...@googlegroups.com
Giuliano, poderia disponibilizar? assim posso ver no que consigo ajudar a melhorar.

att,

Alexandre Azevedo
Graduado em Sistema de Informação pela FIB
Graduando em Sistemas Para Internet pela Unifacs
Desenvolvedor Web / Analista de Sistemas

Empresa: www.nixonline.com.br
Contatos:
E-mail: 
alexandr...@gmail.com  
msn: alexandr...@hotmail.com
Skype: alexandreazevedo4

Tel: (71) 8738-6638 (tim) / 9662-4552 (vivo)
twitter: @_aaoliveira




Roberto Leite Machado

unread,
Feb 14, 2012, 10:34:53 AM2/14/12
to nfe...@googlegroups.com
Giuliano;

Todos do grupo agradecemos muito sua contribuição, sua contribuição pode servir de embrião para grandes inclusões e ajudar muitos que tem necessidade de acessar os webservices de prefeituras.

Grande Abraço 

Alexandre;

Não deixe de passar para que possamos publicar para outros colegas, depois que você fizer a limpesa.

Abraço
Roberto

Alexandre Azevedo

unread,
Feb 14, 2012, 10:36:47 AM2/14/12
to nfe...@googlegroups.com
Sem problemas... passarei sim, caso o Giuliano disponibilize o que ele tem...


att,

Alexandre Azevedo
Graduado em Sistema de Informação pela FIB
Graduando em Sistemas Para Internet pela Unifacs
Desenvolvedor Web / Analista de Sistemas

Empresa: www.nixonline.com.br
Contatos:
E-mail: 
alexandr...@gmail.com  
msn: alexandr...@hotmail.com
Skype: alexandreazevedo4

Tel: (71) 8738-6638 (tim) / 9662-4552 (vivo)
twitter: @_aaoliveira




Giuliano

unread,
Feb 14, 2012, 11:50:43 AM2/14/12
to nfe...@googlegroups.com, Alexandre Azevedo

Segue abaixo...









    function geraNfse()
    {
        // Preparando...

        $idRps="rps1";
        $idLote="lote1";
        //cria o objeto DOM para o xml
        $dom = new DOMDocument('1.0', 'UTF-8');
        $dom->formatOutput = true;
        $dom->preserveWhiteSpace = false;

        $Rps=$dom->createElement("Rps");
        //$Rps->setAttribute("xmlns", "http://www.portalfiscal.inf.br/nfe");
        //$Rps->setAttribute("xmlns", "http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd");

        $infRps = $dom->createElement("InfRps");
        $infRps->setAttribute("id", $idRps);

        // Identificação
        $IdentificacaoRps = $dom->createElement("IdentificacaoRps");
        $Numero= $dom->createElement("Numero",$this->c['numeroNota']);
        $Serie= $dom->createElement("Serie",$this->c['serie']);
        $Tipo= $dom->createElement("Tipo",$this->c['tipo']);
        $IdentificacaoRps->appendChild($Numero);
        $IdentificacaoRps->appendChild($Serie);
        $IdentificacaoRps->appendChild($Tipo);

        $infRps->appendChild($IdentificacaoRps);
        $infRps->appendChild($dom->createElement("DataEmissao",date("Y-m-d")."T".date("H:i:s")));
        $infRps->appendChild($dom->createElement("NaturezaOperacao",$this->c['naturezaOperacao']));
        $infRps->appendChild($dom->createElement("OptanteSimplesNacional",$this->c['optanteSimplesNacional']));
        $infRps->appendChild($dom->createElement("IncentivadorCultural",$this->c['incentivadorCultural']));
        $infRps->appendChild($dom->createElement("Status",$this->c['status']));


        $qtd=$v_total=$total_itens=$t_icms=$t_ipi=$total_pb=$total_pl=0;
        $temIcms=false;
        foreach ($this->i as $item)
        {
            $qtd++;
            $Servico= $dom->createElement("Servico");

            // Valores

            $Valores=$dom->createElement("Valores");
            $ValorServicos=$dom->createElement("ValorServicos",number_format($item['valor'],2, '.', ''));
            $ValorDeducoes=$dom->createElement("ValorDeducoes",number_format($item['valorDeducoes'],2, '.', ''));
            $ValorPis=$dom->createElement("ValorPis",number_format($item['valorPis'],2, '.', ''));
            $ValorCofins=$dom->createElement("ValorCofins",number_format($item['valorCofins'],2, '.', ''));
            $ValorIr=$dom->createElement("ValorIr",number_format($item['valorIr'],2, '.', ''));
            $ValorCsll=$dom->createElement("ValorCsll",number_format($item['valorCsll'],2, '.', ''));
            $IssRetido=$dom->createElement("IssRetido",$item['issRetido']);
            $ValorIss=$dom->createElement("ValorIss",number_format($item['valorIss'],2, '.', ''));
            $ValorIssRetido=$dom->createElement("ValorIssRetido",number_format($item['valorIssRetido'],2, '.', ''));
            $OutrasRetencoes=$dom->createElement("OutrasRetencoes",number_format($item['outrasRetencoes'],2, '.', ''));
            $BaseCalculo=$dom->createElement("BaseCalculo",number_format($item['baseCalculo'],2, '.', ''));
            $Aliquota=$dom->createElement("Aliquota",number_format($item['aliquota'],2, '.', ''));
            $ValorLiquidoNfse=$dom->createElement("ValorLiquidoNfse",number_format($item['valorLiquidoNfse'],2, '.', ''));
            $DescontoIncondicionado=$dom->createElement("DescontoIncondicionado",number_format($item['descontoIncondicionado'],2, '.', ''));
            $DescontoCondicionado=$dom->createElement("DescontoCondicionado",number_format($item['descontoCondicionado'],2, '.', ''));

            $Valores->appendChild($ValorServicos);
            $Valores->appendChild($ValorDeducoes);
            //$Valores->appendChild($ValorPis);
            //$Valores->appendChild($ValorCofins);
            //$Valores->appendChild($ValorIr);
            //$Valores->appendChild($ValorCsll);
            $Valores->appendChild($IssRetido);
            $Valores->appendChild($ValorIss);
            $Valores->appendChild($ValorIssRetido);
            //$Valores->appendChild($OutrasRetencoes);
            $Valores->appendChild($BaseCalculo);
            $Valores->appendChild($Aliquota);
            //$Valores->appendChild($ValorLiquidoNfse);
            //$Valores->appendChild($DescontoIncondicionado);
            //$Valores->appendChild($DescontoCondicionado);


            // Detalhes do serviço

            $ItemListaServico=$dom->createElement("ItemListaServico",trim($item['itemListaServico']));
            //$ItemListaServico=$dom->createElement("ItemListaServico",'11.4');

            $CodigoTributacaoMunicipio=$dom->createElement("CodigoCnae",trim($item['codigoCnae']));
            //$CodigoTributacaoMunicipio=$dom->createElement("CodigoTributacaoMunicipio",$this->c['propriaEnderecoIbgeMunicipio']);
            //$CodigoTributacaoMunicipio=$dom->createElement("CodigoTributacaoMunicipio","Codigo Tributario");
            $Discriminacao=$dom->createElement("Discriminacao",$this->tiraAcentos($item['discriminacao']));
            //$CodigoMunicipio=$dom->createElement("CodigoMunicipio",$this->c['propriaEnderecoIbgeMunicipio']);
            $CodigoMunicipio=$dom->createElement("CodigoMunicipio",'2927408');

            $Servico->appendChild($Valores);
            $Servico->appendChild($ItemListaServico);
            $Servico->appendChild($CodigoTributacaoMunicipio);
            $Servico->appendChild($Discriminacao);
            $Servico->appendChild($CodigoMunicipio);
            $infRps->appendChild($Servico);

        }

        // Prestador

        $Prestador=$dom->createElement("Prestador");
        $Cnpj=$dom->createElement("Cnpj",$this->c['propriaCnpj']);
        $InscricaoMunicipal=$dom->createElement("InscricaoMunicipal",$this->soNumerosIsento($this->tiraPontos($this->c['propriaInscricaoMunicipal'])));

        $Prestador->appendChild($Cnpj);
        $Prestador->appendChild($InscricaoMunicipal);

        // TSomador
        $Tomador=$dom->createElement("Tomador");
        $IdentificacaoTomador=$dom->createElement("IdentificacaoTomador");
        $CpfCnpj=$dom->createElement("CpfCnpj");

        $TomadorCpf=$dom->createElement("Cpf",$this->soNumeros($this->c['cpf']));
        $TomadorCnpj=$dom->createElement("Cnpj",$this->soNumeros($this->c['cnpj']));
        if ($this->c['cpf']<>"")
            $CpfCnpj->appendChild($TomadorCpf);
        else
            $CpfCnpj->appendChild($TomadorCnpj);
        $IdentificacaoTomador->appendChild($CpfCnpj);

        $RazaoSocial=$dom->createElement("RazaoSocial",$this->tiraAcentos($this->c['razaoSocial']));
        $EEndereco=$dom->createElement("Endereco");
        $Endereco=$dom->createElement("Endereco",$this->tiraAcentos(trim($this->c['endereco'])));
        $Numero=$dom->createElement("Numero",$this->tiraAcentos(trim($this->c['enderecoNumero'])));
        $Bairro=$dom->createElement("Bairro",$this->tiraAcentos(trim($this->c['enderecoBairro'])));
        $CodigoMunicipio=$dom->createElement("CodigoMunicipio",$this->soNumeros($this->c['enderecoIbgeMunicipio']));
        $Uf=$dom->createElement("Uf",trim($this->c['enderecoUf']));
        $Cep=$dom->createElement("Cep",$this->soNumeros($this->c['enderecoCep']));

        $EEndereco->appendChild($Endereco);
        $EEndereco->appendChild($Numero);
        $EEndereco->appendChild($Bairro);
        $EEndereco->appendChild($CodigoMunicipio);
        $EEndereco->appendChild($Uf);
        $EEndereco->appendChild($Cep);

        $Tomador->appendChild($IdentificacaoTomador);
        $Tomador->appendChild($RazaoSocial);
        $Tomador->appendChild($EEndereco);
        if ($this->c['email']<>"")
        {
            $Contato=$dom->createElement("Contato");
            $Email=$dom->createElement("Email",$this->tiraAcentos($this->c['email']));
            $Contato->appendChild($Email);
            $Tomador->appendChild($Contato);
        }
        $infRps->appendChild($Prestador);
        $infRps->appendChild($Tomador);


        // Serviços

        $Rps->appendChild($infRps);
       
        $ListaRps=$dom->createElement("ListaRps");
        $ListaRps->appendChild($Rps);

        $LoteRps=$dom->createElement("LoteRps");
        $LoteRps->setAttribute("id", $idLote);

        $NumeroLote=$dom->createElement("NumeroLote",$this->c['numeroLote']);
        $QuantidadeRps=$dom->createElement("QuantidadeRps",1);
        $Cnpj=$dom->createElement("Cnpj",$this->c['propriaCnpj']);
        $InscricaoMunicipal=$dom->createElement("InscricaoMunicipal",$this->soNumerosIsento($this->tiraPontos($this->c['propriaInscricaoMunicipal'])));

        $EnviarLoteRpsEnvio=$dom->createElement("EnviarLoteRpsEnvio");
        //$EnviarLoteRpsEnvio->setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
        $EnviarLoteRpsEnvio->setAttribute("xmlns", "http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd");

        $LoteRps->appendChild($NumeroLote);
        $LoteRps->appendChild($Cnpj);
        $LoteRps->appendChild($InscricaoMunicipal);
        $LoteRps->appendChild($QuantidadeRps);
        $LoteRps->appendChild($ListaRps);

        $EnviarLoteRpsEnvio->appendChild($LoteRps);

        $dom->appendChild($EnviarLoteRpsEnvio);


        //$dom->appendChild($Rps);
        //$dom->appendChild($infRps);

        $xml= $dom->saveXML();

        $xml = str_replace('<?xml version="1.0" encoding="UTF-8"?>','<?xml version="1.0" encoding="UTF-8" standalone="no"?>',$xml);
        $xml = str_replace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>','',$xml);
        $xml = str_replace('<?xml version="1.0" encoding="UTF-8"?>','',$xml);
        $xml = str_replace("\n","",$xml);
        $xml = str_replace("  "," ",$xml);
        $xml = str_replace("  "," ",$xml);
        $xml = str_replace("  "," ",$xml);
        $xml = str_replace("  "," ",$xml);
        $xml = str_replace("  "," ",$xml);
        $xml = str_replace("> <","><",$xml);

        $this->nfexml =$xml;
        $this->assina("InfRps");
        $this->assina("LoteRps");
        $this->nfexml=str_replace('<?xml version="1.0"?>','',$this->nfexml);
//echo "\n\n".$this->nfexml."\n\n";exit;
        /*
        $this->assina("InfRps");
        $this->nfexml=str_replace('<?xml version="1.0"?>','',$this->nfexml);
        $this->nfexml = '<?xml version="1.0" encoding="UTF-8"?><Rps>'.trim($this->nfexml)."</Rps>";
         *
         */
    }

        //Gera arquivo TXT para importação da SEFAZ
        function geraTxtNFSE()
        {
                $hoje=date("Ymd");
                $dataHora=date("YmdHis");
               
                // REGISTRO 1 - Header do arquivo
                $s="1"; // Tipo de Registro
                $s.="103"; // Vesão do Layout
                $s.=padrl($this->c['propriaInscricaoMunicipal'], 26, "r"); // Insc. Municipal do prestador
                $s.="2"; // Indicador de CPF/CNPJ -> 1 = CPF , 2 = CNPJ
                $s.=padrl($this->c['propriaCnpj'], 14,"l"); // CPF / CNPJ do prestador
                $s.=$this->c['propriaOptante'] ; // Optante pelo simples
                $s.=$hoje; // Data de início do período
                $s.=$hoje; // Data de fim do período
                $s.=padrl("1", 5, "l", "0"); // Qtd de NFS-e informadas
                $s.=padrl(" ", 324, "l"); // Preencher com 324 espações em branco
                $s.=padrl($this->c['numeroLote'], 8, "l","0"); // Sequencial do registro
                $s.=NL;
                //var_dump($this->i);
                foreach ($this->i as $item)
        {
                        // REGISTRO 2 - Cabeçalho da NFS-e
                        $s.="2"; // Tipo de registro
                        $s.=padrl($this->nfeid, 20, "l", "0"); // Sequencial da NFS-e
                        $s.=$dataHora; // Data e Hora da NFS-e
                        $s.=$item['tipoRecolhimento']; // Tipo de recolhimento (N - Normal ou R - Retido na fonte)
                        $s.="T"; // Situação da nota fiscal (T - I - F - C - E - J)
                        $s.=padrl(" ", 8, "r"," "); // Data de cancelamento
                        $s.=$this->c['propriaEnderecoIbgeMunicipio']; // Codigo IBGE do municipio de prestação do serviço
                        $s.=padrl(number_format($item['valor'],2,"",""), 15, "l", "0"); // Valor do serviço
                        $s.=padrl(number_format($item['valorDeducoes'],2,"",""), 15, "l", "0"); // valor das deduções
                        $s.=padrl(number_format($item['valorIss'],2,"",""), 15, "l", "0"); // Valor da retenção do PIS
                        $s.=padrl(number_format($item['valorCofins'],2,"",""), 15, "l", "0"); // Valor da retenção do COFINS
                        $s.=padrl(number_format($item['valorInss'],2,"",""), 15, "l", "0"); // Valor da retenção do INSS
                        $s.=padrl(number_format($item['valorIr'],2,"",""), 15, "l", "0"); // Valor da retenção do IR
                        $s.=padrl(number_format($item['valorRetCsll'],2,"",""), 15, "l", "0"); // Valor da retenção do CSLL
                        $s.=padrl(number_format($item['valorIssqn'],2,"",""), 15, "l", "0"); // Valor do ISSQN
                        $s.=padrl(" ", 219, "l"); // Preencher com 219 espações em branco
                        $s.=padrl($this->c['numeroLote'], 8, "l","0"); // Sequencial do registro
                        $s.=NL;

                        // REGISTRO 3 - Identificação do tomador da NFS-e
                        $s.="3"; // Tipo de registro
                        $s.=padrl($this->nfeid, 20, "r", "0"); // Sequencial da NFS-e
                        $s.="2"; // Indicador de CPF/CNPJ do Tomador
                        $s.=padrl($this->soNumeros($this->c['cnpj']), 14,"l"); // CPF/CNPJ do tomador
                        $s.=padrl($this->tiraAcentos($this->c['razaoSocial']), 50, "r"); // Nome do tomador (Nome ou razão social)
                        $s.=padrl($this->tiraAcentos($this->c['empresa']), 50, "r"); // Nome fantasia
                        $s.=padrl(" ", 3, "l"); // Tipo de endereço do tomador
                        $s.=padrl($this->tiraAcentos($this->c['endereco']), 50, "r"); // Endereço do tomador
                        $s.=padrl($this->c['enderecoNumero'], 10, "l","0"); // Número do endereço do tomador
                        $s.=padrl($this->tiraAcentos($this->c['enderecoComplemento']), 20, "r"); // Complemento do endereço do tomador
                        $s.=padrl($this->tiraAcentos($this->c['enderecoBairro']), 30, "r"); // Bairro do tomador
                        $s.=padrl($this->tiraAcentos($this->c['enderecoCidade']), 50, "r"); // Cidade do tomador
                        $s.=padrl($this->tiraAcentos($this->c['enderecoUf']), 2, "r");; // UF do tomador
                        $s.=padrl($this->soNumeros($this->c['enderecoCep']), 8, "r"); // CEP do tomador
                        $s.=padrl($this->tiraAcentos($this->c['email']), 60, "r"); // Email do tomador
                        $s.=padrl(" ", 22, "l"); // Preencher com 22 espações em branco
                        $s.=padrl($this->c['numeroLote'], 8, "l","0"); // Sequencial do registro
                        $s.=NL;

                        // REGISTRO 4 - Descrição da NFS-e
                        $s.="4"; // Tipo de registro
                        $s.=padrl($this->nfeid, 20, "l", "0"); // Sequencial da NFS-e
                        $s.=padrl(" ", 255, "l"); // Descrição da nota
                        $s.=padrl(" ", 115, "l"); // Preencher com 22 espações em branco
                        $s.=padrl($this->c['numeroLote'], 8, "l","0"); // Sequencial do registro
                        $s.=NL;

                        // REGISTRO 5 - Descrição do serviço realizado
                        $s.="5"; // Tipo de registro
                        $s.=padrl($this->nfeid, 20, "l", "0"); // Sequencial da NFS-e
                        $s.=padrl($this->soNumeros($item['codigo']), 4, "l"); // Codigo do serviço pretasdo
                        $s.=padrl($this->soNumeros($item['codigoMunicipio']), 20, "l"); // Código tributação município
                        $s.=padrl(number_format($item['valor'],2,"",""), 15, "l", "0"); // Valor do serviço
                        $s.=padrl(number_format($item['valorDeducoes'],2,"",""), 15, "l", "0"); // Valor dedução
                        $s.=padrl(number_format($item['aliquota'],2,"",""), 4, "l", "0"); // Alíquota
                        $s.=padrl($item['unidade'], 20, "l"); // Unidade
                        $s.=padrl(number_format($item['quantidade'],2,"",""),8,"l","0"); // Quantidade
                        $s.=padrl($this->tiraAcentos($item['discriminacao']), 255, "r"," "); // Descrição do serviço
                        $s.=padrl(" ",20,"l"); // Alvará               
                        $s.=padrl(" ", 9, "l"); // Preencher com 9 espações em branco
                        $s.=padrl($this->c['numeroLote'], 8, "l","0"); // Sequencial do registro
                        $s.=NL;
                }
                // REGISTRO 6 - Indicador de final de arquivo
                $s.="6"; // Tipo de registro
                $s.=padrl(" ", 390, "l"); // Preencher com 390 espações em branco
                $s.=padrl($this->c['numeroLote'], 8, "l","0"); // Sequencial do registro
                $s.=NL;
               
                $sql="update nfse set txt='$s' where id=".$this->nfeid;
                gQuery($sql);
               
                $this->arqtxt=$s;
        }

    function envelopa()
    {
        // Envelopa
        $idLote="1";

        // cria DOM pro nfexml
        $dom = new DOMDocument();
        $dom->formatOutput = true;
        $dom->preserveWhiteSpace = false;
        //echo $this->nfexml;exit;
        $dom->loadXML($this->nfexml,LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG);

        //cria o objeto DOM para o novo xml
        $dom2 = new DOMDocument('1.0', 'UTF-8');
        $dom2->formatOutput = true;
        $dom2->preserveWhiteSpace = false;


        $node = $dom->getElementsByTagName("Rps")->item(0);
        $Rps=$node->C14N(FALSE,FALSE,NULL,NULL);
       
        $l.='<LoteRps id="'.$idLote.'">';
        $l.='<NumeroLote>'.$this->c['numero'].'</NumeroLote>';
        $l.='<Cnpj>'.$this->c['propriaCnpj'].'</Cnpj>';
        $l.='<InscricaoMunicipal>'.$this->soNumerosIsento($this->tiraPontos($this->c['propriaInscricaoMunicipal'])).'</InscricaoMunicipal>';
        $l.='<QuantidadeRps>1</QuantidadeRps>';
        $l.='<ListaRps>'.$Rps.'</ListaRps>';
        $l.='</LoteRps>';
        $this->nfexml=$l;
        $this->assina("LoteRps");
        $this->nfexml=str_replace('<?xml version="1.0"?>','',$this->nfexml);
        $this->nfexml='<?xml version="1.0" encoding="UTF-8"?><EnviarLoteRpsEnvio xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd">'.$this->nfexml.'</EnviarLoteRpsEnvio>';

    }
               
    function limpaNumero($num)
    {
        return(str_replace(".00","",floatval($num)));
    }

    // Assina XML
    function assina($tag='infNFe')
    {
        global $http_lib;
        $sai=false;
        $nfefile=$this->nfexml;
        //$nfefile = file_get_contents($this->arqxml);
        $this->nfeTools= new gNFeTools($this->config());
        if ($tag=='infNFe')
        {
            if ($this->nfeTools->errMsg=="")
            {
                if ( $signn = $this->nfeTools->signXML($nfefile, $tag) )
                {
                    unlink($this->arqxml);
                    if ( !file_put_contents($this->arqxml , $signn) )
                    {
                        $this->erros[]=M."Houve uma falha ao salvar a NFe assinada.";
                    } else
                    {
                        $this->nfexml=$signn;
                        $sai=true;
                    }
                } else
                {
                    $this->erros[]=M."Houve uma falha ao assinar a NFe.";
                }
            } else
            {
                $this->erros[]=M.$this->nfeTools->errMsg." (".$this->nfeTools->cert.")";
            }
        } else
        {
            $this->nfexml=$this->nfeTools->__signXMLNFSe($nfefile, $tag);
        }
        return($sai);
    }


    // Valida XML assinado
    function valida($tipo="nfe")
    {
        global $gPathLib,$gPathDefault;
        /*
        $this->nfeTools= new gNFeTools($this->c['propriaCnpj'].".pfx");
        $this->nfeTools->tpAmb=$this->c['ambiente'];
        $this->nfeTools->empName=$this->c['propriaRazaoSocial'];
        $this->nfeTools->cUF=$this->c['propriaEnderecoIbgeMunicipio'];
        $this->nfeTools->UF=$this->c['propriaEnderecoMunicipio'];
        $this->nfeTools->cnpj=$this->c['propriaCnpj'];
        $this->nfeTools->keyPass=$this->c['senhaCertificado'];
        */

        if ($gPathLib<>"")
        {
            $arq=$gPathLib.NFEPHP."/schemes/";
        } else
        {
            $arq=$gPathDefault.NFEPHP."/schemes/";
        }

        if ($tipo=="nfe")
            $xsd=$arq.$this->schemes.'/nfe_v2.00.xsd';
        else
            $xsd=$arq.'/NFSE_SSA/nfse.xsd';
        $sai=$this->nfeTools->validXML($this->nfexml, $xsd);
                //echo $xsd;exit;
        //$sai=$nfe->validXML($this->nfexml, $xsd);
                //echo var_dump($sai);exit;
        if ($sai['error']<>'')
        {
            $e=explode(";",$sai['error']);
            foreach ($e as $el)
                $this->erros[]=trim($el);
        }
        return($sai);
    }


    // Enviar para Sefaz
    function envia($xml="",$numero="")
    {
        $sai=true;
        if (!is_object($this->nfeTools))
        {
            $this->nfeTools= new gNFeTools($this->config());
        }
        $sql="select * from nfe_numeros where id_armazens=0"; // numero do lote
        $rs=gQuery($sql);
        if ($rs->EOF)
        {
            $sql="insert into nfe_numeros (id_armazens,numero) values (0,0)";
            gQuery($sql);
            $numeroLote=1;
        } else
        {
            $numeroLote=intval($rs->fields['numero'])+1;
        }
        $sql="update nfe_numeros set numero=$numeroLote where id_armazens=0";
        gQuery($sql);
       
        if ($xml=="")
        {
            $xml=$this->nfexml;
           
        }
        if ($ret = $this->nfeTools->sendLot(array($xml),$numeroLote))
        {
            if ($ret['cStat']=='103')
            {
                $this->recibo=$ret['nRec'];
                $this->dataRecibo=$ret['dhRecbto'];
            } else
            {
                $this->erros[]=M.str_pad($ret['cStat'],10,' ')." ".$ret['xMotivo'];
                $sai=false;
            }
        }
        return($sai);
    }

    // Enviar para Sefaz
    function enviaNfse($xml="",$numero="")
    {
        $sai=true;
        if (!is_object($this->nfeTools))
        {
            $this->nfeTools= new gNFeTools($this->config());
        }

        if ($xml=="")
        {
            $xml=$this->nfexml;

        }
        //$xml=file_get_contents('/tmp/envio.xml');
        $xml=str_replace("\n",'',$xml);
                //echo "<textarea rows='20' cols='80'>$xml<textarea><br><br>";
        if ($ret = $this->nfeTools->sendRps($xml,$this->c['numeroLote']))
        {
                   
            if ($ret['Protocolo']<>'')
            {
                // Nova aceita... Salva no banco
                $sql="update nfse_numeros set numero_nota=".$this->c['numeroNota']." where ambiente=".$this->c['ambiente']." and id_empresa=".$this->id_empresa;
                gQuery($sql);
                $sql="update nfse set situacao='Aceita',xml='$xml',data_recibo='".$ret['DataRecebimento']."',protocolo='".$ret['Protocolo']."' where id=".$this->nfeid;
                gQuery($sql);
                $this->protocolo=$ret['Protocolo'];
                $this->numeroNota=$numeroNota;
                $this->numeroLote=$numeroLote;
            } else
            {
                $sql="update nfse set situacao='Rejeitada',xml='$xml',mensagens='Codigo ".$ret['Codigo']."<br>".$ret['Mensagem']."<br>".$ret['Correcao']."' where id=".$this->nfeid;
                gQuery($sql);
                $this->erros[]=str_pad($ret['Codigo'],10,' ')." ".$ret['Mensagem']."<br>".$ret['Correcao'];
                $sai=false;
            }
        } else
                {
                    $sql="update nfse set situacao='Nao enviada',xml='$xml',mensagens='Codigo ".$ret['Codigo']."<br>".$ret['Mensagem']."<br>".$ret['Correcao']."' where id=".$this->nfeid;
                    gQuery($sql);
                    $this->erros[]=str_pad('E000',10,' ')." Nao foi possivel enviar para a SEFAZ, provavelmente por problema no certificado.";
                    $sai=false;
                }
        return($sai);
    }

    function consultaRps($protocolo)
    {
        $sai=true;
        if (!is_object($this->nfeTools))
        {
            $this->nfeTools= new gNFeTools($this->config());
        }
        $sai=$this->nfeTools->consultRps($this->c['propriaCnpj'],$this->soNumerosIsento($this->tiraPontos($this->c['propriaInscricaoMunicipal'])),trim($protocolo));
        return($sai);
    }

    function consultaSituacaoRps($protocolo)
    {
        $sai=true;
        if (!is_object($this->nfeTools))
        {
            $this->nfeTools= new gNFeTools($this->config());
        }
        $sai=$this->nfeTools->consultSitRps($this->c['propriaCnpj'],$this->soNumerosIsento($this->tiraPontos($this->c['propriaInscricaoMunicipal'])),trim($protocolo));
/*
Código de situação de lote de RPS
1 – Não Recebido
2 – Não Processado
3 – Processado com Erro
4 – Processado com Sucesso
 */
        return($sai['Situacao']);
    }











Sds,

Giuliano Nascimento

Em 14/02/12 13:36, Alexandre Azevedo escreveu:

Alexandre Azevedo

unread,
Feb 14, 2012, 12:02:20 PM2/14/12
to nfe...@googlegroups.com
Giulino,
Essas funções são dependentes de alguma classe, ou são independentes, posso usar elas tranquilamente?


att,

Alexandre Azevedo
Graduado em Sistema de Informação pela FIB
Graduando em Sistemas Para Internet pela Unifacs
Desenvolvedor Web / Analista de Sistemas

Empresa: www.nixonline.com.br
Contatos:
E-mail: 
alexandr...@gmail.com  
msn: alexandr...@hotmail.com
Skype: alexandreazevedo4

Tel: (71) 8738-6638 (tim) / 9662-4552 (vivo)
twitter: @_aaoliveira




alexandre

unread,
Feb 14, 2012, 12:10:57 PM2/14/12
to NFePHP
Giuliano, posso adicionar seu e-mails nos meus para sanar possiveis
dúvidas?

On 14 fev, 14:50, Giuliano <gius...@hotmail.com> wrote:
> Segue abaixo...
>
>      function geraNfse()
>      {
>          // Preparando...
>
>          $idRps="rps1";
>          $idLote="lote1";
>          //cria o objeto DOM para o xml
>          $dom = new DOMDocument('1.0', 'UTF-8');
>          $dom->formatOutput = true;
>          $dom->preserveWhiteSpace = false;
>
>          $Rps=$dom->createElement("Rps");
>          //$Rps->setAttribute("xmlns",
> "http://www.portalfiscal.inf.br/nfe");
>          //$Rps->setAttribute("xmlns",
> "http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd");
>
>          $infRps = $dom->createElement("InfRps");
>          $infRps->setAttribute("id", $idRps);
>
>          // Identifica��o
>              // Detalhes do servi�o
>          // Servi�os
> ...
>
> mais »

Giuliano

unread,
Feb 14, 2012, 12:39:33 PM2/14/12
to nfe...@googlegroups.com
Pode...


class gNFe extends ConvertNFePHP

Sds,

Giuliano Nascimento


Em 14/02/12 15:10, alexandre escreveu:


> Giuliano, posso adicionar seu e-mails nos meus para sanar possiveis

> d�vidas?


>
> On 14 fev, 14:50, Giuliano<gius...@hotmail.com> wrote:
>> Segue abaixo...
>>
>> function geraNfse()
>> {
>> // Preparando...
>>
>> $idRps="rps1";
>> $idLote="lote1";
>> //cria o objeto DOM para o xml
>> $dom = new DOMDocument('1.0', 'UTF-8');
>> $dom->formatOutput = true;
>> $dom->preserveWhiteSpace = false;
>>
>> $Rps=$dom->createElement("Rps");
>> //$Rps->setAttribute("xmlns",
>> "http://www.portalfiscal.inf.br/nfe");
>> //$Rps->setAttribute("xmlns",
>> "http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd");
>>
>> $infRps = $dom->createElement("InfRps");
>> $infRps->setAttribute("id", $idRps);
>>

>> // Identifica��o

>> // Detalhes do servi�o

>> // Servi�os

>> mais �

Daniel Chaves

unread,
Feb 14, 2012, 2:27:58 PM2/14/12
to nfe...@googlegroups.com
sem querer abusar da sua boa vontade mas da pra mandar anexo?:


Em 14 de fevereiro de 2012 15:39, Giuliano <giu...@hotmail.com> escreveu:
Pode...


class gNFe extends ConvertNFePHP



Sds,

Giuliano Nascimento


Em 14/02/12 15:10, alexandre escreveu:
Giuliano, posso adicionar seu e-mails nos meus para sanar possiveis
dúvidas?
mais »

--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com

Giuliano

unread,
Feb 14, 2012, 3:47:11 PM2/14/12
to nfe...@googlegroups.com, Daniel Chaves
Acontece que este arquivo tem uma série de classes e métodos misturados que não tem nada a ver com NFePHP e sim com meus sistemas...
Portanto só dá pra cortar o código e colar.
Não estou com tempo pra arrumar em um arquivo pra poder anexar.

Sds,

Giuliano Nascimento

Em 14/02/12 17:27, Daniel Chaves escreveu:
sem querer abusar da sua boa vontade mas da pra mandar anexo?:
Em 14 de fevereiro de 2012 15:39, Giuliano <giu...@hotmail.com> escreveu:
Pode...


class gNFe extends ConvertNFePHP



Sds,

Giuliano Nascimento


Em 14/02/12 15:10, alexandre escreveu:
Giuliano, posso adicionar seu e-mails nos meus para sanar possiveis
dúvidas?

On 14 fev, 14:50, Giuliano<gius...@hotmail.com>  wrote:
Segue abaixo...

     function geraNfse()
     {
         // Preparando...

         $idRps="rps1";
         $idLote="lote1";
         //cria o objeto DOM para o xml
         $dom = new DOMDocument('1.0', 'UTF-8');
         $dom->formatOutput = true;
         $dom->preserveWhiteSpace = false;

         $Rps=$dom->createElement("Rps" );
         //$Rps->setAttribute("xmlns",


         $infRps = $dom->createElement("InfRps");
         $infRps->setAttribute("id", $idRps);

         // Identifica��o

         $IdentificacaoRps = $dom->createElement(" IdentificacaoRps");
         $Numero= $dom->createElement("Numero",$ this->c['numeroNota']);
         $Serie= $dom->createElement("Serie",$ this->c['serie']);
         $Tipo= $dom->createElement("Tipo",$ this->c['tipo']);

         $IdentificacaoRps-> appendChild($Numero);
         $IdentificacaoRps-> appendChild($Serie);
         $IdentificacaoRps-> appendChild($Tipo);

         $infRps->appendChild($ IdentificacaoRps);

$infRps->appendChild($dom-> createElement("DataEmissao", date("Y-m-d")."T".date("H:i:s" )));


$infRps->appendChild($dom-> createElement(" NaturezaOperacao",$this->c[' naturezaOperacao']));

$infRps->appendChild($dom-> createElement(" OptanteSimplesNacional",$this- >c['optanteSimplesNacional'])) ;

$infRps->appendChild($dom-> createElement(" IncentivadorCultural",$this-> c['incentivadorCultural']));

$infRps->appendChild($dom-> createElement("Status",$this-> c['status']));

         $qtd=$v_total=$total_itens=$t_ icms=$t_ipi=$total_pb=$total_ pl=0;
         $temIcms=false;
         foreach ($this->i as $item)
         {
             $qtd++;
             $Servico= $dom->createElement("Servico") ;

             // Valores

             $Valores=$dom->createElement(" Valores");

$ValorServicos=$dom-> createElement("ValorServicos", number_format($item['valor'], 2,
'.', ''));

$ValorDeducoes=$dom-> createElement("ValorDeducoes", number_format($item[' valorDeducoes'],2,
'.', ''));

$ValorPis=$dom->createElement( "ValorPis",number_format($ item['valorPis'],2,
'.', ''));

$ValorCofins=$dom-> createElement("ValorCofins", number_format($item[' valorCofins'],2,

'.', ''));

$ValorIr=$dom->createElement(" ValorIr",number_format($item[' valorIr'],2,
'.', ''));

$ValorCsll=$dom-> createElement("ValorCsll", number_format($item[' valorCsll'],2,
'.', ''));
             $IssRetido=$dom-> createElement("IssRetido",$ item['issRetido']);

$ValorIss=$dom->createElement( "ValorIss",number_format($ item['valorIss'],2,

'.', ''));

$ValorIssRetido=$dom-> createElement("ValorIssRetido" ,number_format($item[' valorIssRetido'],2,
'.', ''));

$OutrasRetencoes=$dom-> createElement(" OutrasRetencoes",number_ format($item['outrasRetencoes' ],2,
'.', ''));

$BaseCalculo=$dom-> createElement("BaseCalculo", number_format($item[' baseCalculo'],2,
'.', ''));

$Aliquota=$dom->createElement( "Aliquota",number_format($ item['aliquota'],2,
'.', ''));

$ValorLiquidoNfse=$dom-> createElement(" ValorLiquidoNfse",number_ format($item[' valorLiquidoNfse'],2,
'.', ''));

$DescontoIncondicionado=$dom-> createElement(" DescontoIncondicionado", number_format($item[' descontoIncondicionado'],2,
'.', ''));

$DescontoCondicionado=$dom-> createElement(" DescontoCondicionado",number_ format($item[' descontoCondicionado'],2,

'.', ''));

             $Valores->appendChild($ ValorServicos);
             $Valores->appendChild($ ValorDeducoes);
             //$Valores->appendChild($ ValorPis);
             //$Valores->appendChild($ ValorCofins);
             //$Valores->appendChild($ ValorIr);
             //$Valores->appendChild($ ValorCsll);
             $Valores->appendChild($ IssRetido);
             $Valores->appendChild($ ValorIss);
             $Valores->appendChild($ ValorIssRetido);
             //$Valores->appendChild($ OutrasRetencoes);
             $Valores->appendChild($ BaseCalculo);
             $Valores->appendChild($ Aliquota);
             //$Valores->appendChild($ ValorLiquidoNfse);
             //$Valores->appendChild($ DescontoIncondicionado);
             //$Valores->appendChild($ DescontoCondicionado);

             // Detalhes do servi�o


$ItemListaServico=$dom-> createElement(" ItemListaServico",trim($item[' itemListaServico']));

//$ItemListaServico=$dom-> createElement(" ItemListaServico",'11.4');

$CodigoTributacaoMunicipio=$ dom->createElement(" CodigoCnae",trim($item[' codigoCnae']));


//$CodigoTributacaoMunicipio=$ dom->createElement(" CodigoTributacaoMunicipio",$ this->c[' propriaEnderecoIbgeMunicipio'] );

//$CodigoTributacaoMunicipio=$ dom->createElement(" CodigoTributacaoMunicipio"," Codigo
Tributario");

$Discriminacao=$dom-> createElement("Discriminacao", $this->tiraAcentos($item[' discriminacao']));
$RazaoSocial=$dom-> createElement("RazaoSocial",$ this->tiraAcentos($this->c[' razaoSocial']));
         $EEndereco=$dom-> createElement("Endereco");

$Endereco=$dom->createElement( "Endereco",$this->tiraAcentos( trim($this->c['endereco'])));

$Numero=$dom->createElement(" Numero",$this->tiraAcentos( trim($this->c['enderecoNumero' ])));

$Bairro=$dom->createElement(" Bairro",$this->tiraAcentos( trim($this->c['enderecoBairro' ])));


$CodigoMunicipio=$dom-> createElement(" CodigoMunicipio",$this-> soNumeros($this->c[' enderecoIbgeMunicipio']));
         $Uf=$dom->createElement("Uf", trim($this->c['enderecoUf']));


$Cep=$dom->createElement("Cep" ,$this->soNumeros($this->c[' enderecoCep']));

         $EEndereco->appendChild($ Endereco);
         $EEndereco->appendChild($ Numero);
         $EEndereco->appendChild($ Bairro);
         $EEndereco->appendChild($ CodigoMunicipio);
         $EEndereco->appendChild($Uf);
         $EEndereco->appendChild($Cep);

         $Tomador->appendChild($ IdentificacaoTomador);
         $Tomador->appendChild($ RazaoSocial);
         $Tomador->appendChild($ EEndereco);
         if ($this->c['email']<>"")
         {
             $Contato=$dom->createElement(" Contato");

$Email=$dom->createElement(" Email",$this->tiraAcentos($ this->c['email']));

             $Contato->appendChild($Email);
             $Tomador->appendChild($ Contato);
         }
         $infRps->appendChild($ Prestador);
         $infRps->appendChild($Tomador) ;

         // Servi�os


         $Rps->appendChild($infRps);

         $ListaRps=$dom->createElement( "ListaRps");
         $ListaRps->appendChild($Rps);

         $LoteRps=$dom->createElement(" LoteRps");
         $LoteRps->setAttribute("id", $idLote);

$NumeroLote=$dom-> createElement("NumeroLote",$ this->c['numeroLote']);

         $QuantidadeRps=$dom-> createElement("QuantidadeRps", 1);
         $Cnpj=$dom->createElement(" Cnpj",$this->c['propriaCnpj']) ;

$InscricaoMunicipal=$dom-> createElement(" InscricaoMunicipal",$this-> soNumerosIsento($this-> tiraPontos($this->c[' propriaInscricaoMunicipal']))) ;

         $EnviarLoteRpsEnvio=$dom-> createElement(" EnviarLoteRpsEnvio");
         //$EnviarLoteRpsEnvio-> setAttribute("xmlns:xsi",
Para Sair do Grupo: nfephp+un...@googlegroups.com

Alexandre Azevedo

unread,
Feb 14, 2012, 4:38:04 PM2/14/12
to nfe...@googlegroups.com
E verdade, tens uns metodos que não achei e para poder usar ela legal tenho que fazer mudanças no codigos e entender oq foi feito...


att,

Alexandre Azevedo
Graduado em Sistema de Informação pela FIB
Graduando em Sistemas Para Internet pela Unifacs
Desenvolvedor Web / Analista de Sistemas

Empresa: www.nixonline.com.br
Contatos:
E-mail: 
alexandr...@gmail.com  
msn: alexandr...@hotmail.com
Skype: alexandreazevedo4

Tel: (71) 8738-6638 (tim) / 9662-4552 (vivo)
twitter: @_aaoliveira




Daniel Chaves

unread,
Feb 14, 2012, 5:22:45 PM2/14/12
to nfe...@googlegroups.com
mas ja ta valendo... eu tava começando a desenvolver essa semana ja vai poupar umas linhas de código kkk


Valeu :)

Giuliano

unread,
Feb 15, 2012, 4:56:54 AM2/15/12
to nfe...@googlegroups.com
Em anexo segue pasta pra ser colocada dentro da pasta schemes do projeto para a NFSe.

Além disto, aguns métodos modificados da ToolsNFePHP:


    /**
     * sendRps
     * Envia lote de Notas Fiscais de Serviço para a SEFAZ.
     * Este método pode enviar uma ou mais NFe para o SEFAZ, desde que,
     * o tamanho do arquivo de envio não ultrapasse 500kBytes
     * Este processo enviará somente até 50 NFe em cada Lote
     *
     * @name sendRps
     * @version 1.0
     * @package NFePHP
     * @param    array   $aNFe notas fiscais em xml uma em cada campo do array unidimensional MAX 50
     * @param   integer $idLote o id do lote e um numero que deve ser gerado pelo sistema
     *                          a cada envio mesmo que seja de apenas uma NFe
     * @return    mixed    False ou array ['cStat'=>103,','xMotivo'=>'Lote aceito']
    **/
    public function sendRps($aNFSe,$idLote) {

        // carga das variaveis da funçao do webservice envio de Ne em lote
        //identificação do serviço
        $servico = 'EnvioLoteRPS';
        //recuperação da versão
        $versao = $this->mURL[$servico]['version'];
        //recuperação da url do serviço
        $urlservico = $this->mURL[$servico]['URL'];
        //recuperação do método
        $metodo = $this->mURL[$servico]['method'];

        //montagem do namespace do serviço
        $namespace = $this->URLPortal.'/wsdl/'.$servico;
          $namespace = 'http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd';

        // monta string com todas as NFe enviadas no array
        //$sNFSe = implode('',$aNFSe);
        //remover <?xml version="1.0" encoding=... das NFe pois somente uma dessas tags pode exitir na mensagem
        $sNFSe = str_ireplace('<?xml version="1.0" encoding="utf-8"?>','',$aNFSe);
        $sNFSe = str_ireplace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>','',$sNFSe);

        //envia dados via SOAP
        //montagem do cabeçalho da comunicação SOAP
        $cabec = '<cabecalho xmlns="'. $namespace . '"><versaoDados>' . $versao . '</versaoDados></cabecalho>';
        //montagem dos dados da mensagem SOAP
        $dados = trim(str_replace("\n","",$sNFSe));

          $retorno = $this->__sendSOAPNFSe($urlservico, $cabec, $dados, $metodo);
        if ($this->errStatus)
        {
            return;
        }
        if ( isset($retorno) ) {
            //pega os dados do array retornado pelo NuSoap
              $retorno=str_replace('&lt;','<',$retorno);
              $retorno=str_replace('&gt;','>',$retorno);
              $retorno=str_replace('<?xml version="1.0" encoding="utf-8"?>','',$retorno);
            $xmlresp = utf8_encode($retorno);
            if ($xmlresp == ''){
                //houve uma falha na comunicação SOAP
                $this->errStatus = true;
                $this->errMsg = 'Houve uma falha na comunicação SOAP!!';
                return FALSE;
            }
            //tratar dados de retorno
            $doc = new DOMDocument(); //cria objeto DOM
            $doc->formatOutput = false;
            $doc->preserveWhiteSpace = false;
            $doc->loadXML($retorno,LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG);
            // status do recebimento ou mensagem de erro
            $aRet['DataRecebimento'] = $doc->getElementsByTagName('DataRecebimento')->item(0)->nodeValue;
               
            $aRet['Codigo'] = $doc->getElementsByTagName('Codigo')->item(0)->nodeValue;
            $aRet['Mensagem'] = $doc->getElementsByTagName('Mensagem')->item(0)->nodeValue;
            $aRet['Correcao'] = $doc->getElementsByTagName('Correcao')->item(0)->nodeValue;

            $aRet['NumeroLote'] = $doc->getElementsByTagName('NumeroLote')->item(0)->nodeValue;
            $aRet['Protocolo'] = $doc->getElementsByTagName('Protocolo')->item(0)->nodeValue;
         } else {
            $this->errStatus = true;
            $this->errMsg = 'Nao houve retorno do SOAP!';
            return FALSE;
        }
        // em caso de fracasso  cStat != 103
        return $aRet;
    }// fim sendLot


       /**
     * Consulta NFSe enviada po Lote
     *
     * @name cancelNFS
     * @version 2.0
     * @package NFePHP
     * @param    string  $idNFe ID da NFe com 44 digitos (sem o NFe na frente dos numeros)
     * @param   string  $protId Numero do protocolo de aceitaçao da NFe enviado anteriormente pelo SEFAZ
     * @param   boolean $bSave
     * @return    boolean TRUE se sucesso ou FALSE se falha
    **/
    public function consultRps($cnpj,$inscricaoMunicipal,$protocolo){
        // carga das variaveis da funçao do webservice envio de Ne em lote
        //identificação do serviço
        $servico = 'ConsultaLoteRPS';
        //recuperação da versão
        $versao = $this->mURL[$servico]['version'];
        //recuperação da url do serviço
        $urlservico = $this->mURL[$servico]['URL'];
        //recuperação do método
        $metodo = $this->mURL[$servico]['method'];

        //montagem do namespace do serviço
        $namespace = $this->URLPortal.'/WSDL/'.$metodo;
          $namespace = 'http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd';

          $sNFSe = "<ConsultarLoteRpsEnvio xmlns=\"http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd\"><Prestador><Cnpj>$cnpj</Cnpj><InscricaoMunicipal>$inscricaoMunicipal</InscricaoMunicipal></Prestador><Protocolo>$protocolo</Protocolo></ConsultarLoteRpsEnvio>";
        // monta string com todas as NFe enviadas no array
        //$sNFSe = implode('',$aNFSe);
        //remover <?xml version="1.0" encoding=... das NFe pois somente uma dessas tags pode exitir na mensagem

          /*
          $sNFSe = str_ireplace('<?xml version="1.0" encoding="utf-8"?>','',$aNFSe);
        $sNFSe = str_ireplace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>','',$sNFSe);
          */
        //envia dados via SOAP
        //montagem do cabeçalho da comunicação SOAP
        $cabec = '<?xml version="1.0" encoding="UTF-8"?><cabecalho xmlns="'. $namespace . '"><versaoDados>' . $versao . '</versaoDados></cabecalho>';
        //montagem dos dados da mensagem SOAP
        $dados = trim(str_replace("\n","",$sNFSe));
          $retorno = $this->__sendSOAPNFSe($urlservico, $cabec, $dados, $metodo);

        if ($this->errStatus)
        {
            return;
        }
        if ( isset($retorno) ) {
            //pega os dados do array retornado pelo NuSoap
              $retorno=str_replace('&lt;','<',$retorno);
              $retorno=str_replace('&gt;','>',$retorno);
              $retorno=str_replace('<?xml version="1.0" encoding="utf-8"?>','',$retorno);
            $xmlresp = utf8_encode($retorno);
            if ($xmlresp == ''){
                //houve uma falha na comunicação SOAP
                $this->errStatus = true;
                $this->errMsg = 'Houve uma falha na comunicação SOAP!!';
                return FALSE;
            }
            //tratar dados de retorno
            $doc = new DOMDocument(); //cria objeto DOM
            $doc->formatOutput = false;
            $doc->preserveWhiteSpace = false;
            $doc->loadXML($retorno,LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG);
            // status do recebimento ou mensagem de erro
            $aRet['Numero'] = $doc->getElementsByTagName('Numero')->item(0)->nodeValue;

            $aRet['CodigoVerificacao'] = $doc->getElementsByTagName('CodigoVerificacao')->item(0)->nodeValue;
            $aRet['DataEmissao'] = $doc->getElementsByTagName('DataEmissao')->item(0)->nodeValue;
         } else {
            $this->errStatus = true;
            $this->errMsg = 'Nao houve retorno do SOAP!';
            return FALSE;
        }
        // em caso de fracasso  cStat != 103
        return $aRet;
    }




       /**
     * Consulta NFS enviada po Lote
     *
     * @name cancelNFS
     * @version 2.0
     * @package NFePHP
     * @param    string  $idNFe ID da NFe com 44 digitos (sem o NFe na frente dos numeros)
     * @param   string  $protId Numero do protocolo de aceitaçao da NFe enviado anteriormente pelo SEFAZ
     * @param   boolean $bSave
     * @return    boolean TRUE se sucesso ou FALSE se falha
    **/
    public function consultSitRps($cnpj,$inscricaoMunicipal,$protocolo){
        // carga das variaveis da funçao do webservice envio de Ne em lote
        //identificação do serviço
        $servico = 'ConsultaSituacaoLoteRPS';
        //recuperação da versão
        $versao = $this->mURL[$servico]['version'];
        //recuperação da url do serviço
        $urlservico = $this->mURL[$servico]['URL'];
        //recuperação do método
        $metodo = $this->mURL[$servico]['method'];

        //montagem do namespace do serviço
        $namespace = $this->URLPortal.'/WSDL/'.$metodo;
          $namespace = 'http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd';

          $sNFSe = "<ConsultarSituacaoLoteRpsEnvio xmlns=\"http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd\"><Prestador><Cnpj>$cnpj</Cnpj><InscricaoMunicipal>$inscricaoMunicipal</InscricaoMunicipal></Prestador><Protocolo>$protocolo</Protocolo></ConsultarSituacaoLoteRpsEnvio>";
        // monta string com todas as NFe enviadas no array
        //$sNFSe = implode('',$aNFSe);
        //remover <?xml version="1.0" encoding=... das NFe pois somente uma dessas tags pode exitir na mensagem

          /*
          $sNFSe = str_ireplace('<?xml version="1.0" encoding="utf-8"?>','',$aNFSe);
        $sNFSe = str_ireplace('<?xml version="1.0" encoding="UTF-8" standalone="no"?>','',$sNFSe);
          */
        //envia dados via SOAP
        //montagem do cabeçalho da comunicação SOAP
        $cabec = '<?xml version="1.0" encoding="UTF-8"?><cabecalho xmlns="'. $namespace . '"><versaoDados>' . $versao . '</versaoDados></cabecalho>';
        //montagem dos dados da mensagem SOAP
        $dados = trim(str_replace("\n","",$sNFSe));
          $retorno = $this->__sendSOAPNFSe($urlservico, $cabec, $dados, $metodo);

        if ($this->errStatus)
        {
            return;
        }
        if ( isset($retorno) ) {
            //pega os dados do array retornado pelo NuSoap
              $retorno=str_replace('&lt;','<',$retorno);
              $retorno=str_replace('&gt;','>',$retorno);
              $retorno=str_replace('<?xml version="1.0" encoding="utf-8"?>','',$retorno);
            $xmlresp = utf8_encode($retorno);
            if ($xmlresp == ''){
                //houve uma falha na comunicação SOAP
                $this->errStatus = true;
                $this->errMsg = 'Houve uma falha na comunicação SOAP!!';
                return FALSE;
            }
            //tratar dados de retorno
            $doc = new DOMDocument(); //cria objeto DOM
            $doc->formatOutput = false;
            $doc->preserveWhiteSpace = false;
            $doc->loadXML($retorno,LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG);
            // status do recebimento ou mensagem de erro
            $aRet['NumeroLote'] = $doc->getElementsByTagName('NumeroLote')->item(0)->nodeValue;
            $aRet['Situacao'] = $doc->getElementsByTagName('Situacao')->item(0)->nodeValue;
         } else {
            $this->errStatus = true;
            $this->errMsg = 'Nao houve retorno do SOAP!';
            return FALSE;
        }
        // em caso de fracasso  cStat != 103
        return $aRet;
    }






    /**
     * __sendSOAPNFSe
     * Estabelece comunicaçao com servidor SOAP 1.1 ou 1.2 da SEFAZ,
     * usando as chaves publica e privada parametrizadas na contrução da classe.
     * Conforme Manual de Integração Versão 4.0.1
     *
     * @name __sendSOAPNFSe
     * @version 1.0
     * @package NFePHP
     * @param string $urlsefaz
     * @param string $namespace
     * @param string $cabecalho
     * @param string $dados
     * @param string $metodo
     * @param numeric $ambiente
     * @return mixed False se houve falha ou o retorno em xml do SEFAZ
     */
    public function __sendSOAPNFSe($urlsefaz,$cabecalho,$dados,$metodo,$ambiente){

        use_soap_error_handler(true);
        //ini_set("soap.wsdl_cache_enabled", "0");

        if($ambiente == 1){
         $ambiente = 'producao';
        $URL = $urlsefaz.'?wsdl';
        } else {
        $ambiente = 'homologacao';
        $URL = $urlsefaz.'?WSDL';
        }
        //completa a url do serviço
        $soapver = SOAP_1_1;

        $options = array(
            'encoding'      => 'UTF-8',
            'verifypeer'    => false,
            'verifyhost'    => false,
            'soap_version'  => $soapver,
            'style'         => SOAP_DOCUMENT,
            'use'           => SOAP_LITERAL,
            'local_cert'    => $this->certKEY,
            'trace'         => true,
            'compression'   => 0,
            'exceptions'    => true,
            'cache_wsdl'    => WSDL_CACHE_NONE
        );
        //instancia a classe soap
//echo "<pre>$URL\n\n";print_r($options);exit;
        try{
            $oSoapClient = new NFeSOAP2ClientNFSe($URL,$options);
        } catch (Exception $e) {
            $this->errStatus = True;
            $this->errMsg = $e->__toString();
            return false;
        }
       
        /*
            $varCabec = new SoapVar($cabecalho,XSD_ANYXML);
            //$headerbody = array('cUF' => 35, 'versaoDados' => '2.00');
            $header = new SoapHeader($namespace,'cabecalho',$varCabec);
            $oSoapClient->__setSoapHeaders($header);
            //monta o corpo da mensagem soap
            $varBody = new SoapVar($dados,XSD_ANYXML);
              $varCabec = new SoapVar($cabecalho,XSD_ANYXML);
            $header = new SoapHeader($namespace,'cabecalho',$varCabec);
            $oSoapClient->__setSoapHeaders($header);
                $varBody=new SoapVar('<?xml version="1.0" encoding="utf-8"?>'.$dados,XSD_ANYXML);
            //faz a chamada ao metodo do webservices
            try{
                $resp = $oSoapClient->__soapCall($metodo, array($varBody) );
                $resposta = $oSoapClient->__getLastResponse();
            } catch (Exception $e){
                     echo "erro:\n<br>".$e->__toString();;
                $this->errStatus = True;
                $this->errMsg = $e->__toString();
                return false;
            }
        */
            //faz a chamada ao metodo do webservices
            try{
                 //$resp = $oSoapClient->$metodo($aBody);
                 //$varBody = new SoapVar($dados,XSD_ANYXML);
                /*
                $varBody='<?xml version="1.0" encoding="utf-8"?>'.$cabecalho.$dados;
                 *
                 */
                // não precisa enviar cabecalho...
                $varBody=$dados;
                //$varBody=file_get_contents("/tmp/servico_enviar_lote_rps_envio.xml");
                $aBody = array("","loteXML"=>$varBody);
                 $resp = $oSoapClient->__soapCall($metodo, $aBody);
                 $resposta = $oSoapClient->__getLastResponse();
                $this->soapRequest=$oSoapClient->soapRequest;
            } catch (Exception $e){
                $this->soapRequest=$oSoapClient->soapRequest;
                $this->errStatus = True;
                $this->errMsg = $e->__toString();
                return false;
            }

        $this->soapDebug = $oSoapClient->__getLastRequestHeaders();
        $this->soapDebug .= "\n" . $oSoapClient->__getLastRequest();
        $this->soapDebug .= "\n" . $oSoapClient->__getLastResponseHeaders();
        $this->soapDebug .= "\n" . $oSoapClient->__getLastResponse();
//echo "<pre>";print_r($resposta);exit;
        return $resposta;
    } //fim __sendSOAPNFSe




/**
 * Classe complementar
 * necessária para a comunicação SOAP 1.2
 * Remove algumas tags para adequar a comunicação
 * ao padrão Ruindows utilizado
 */
class NFeSOAP2ClientNFSe extends SoapClient {
    public $soapRequest;
    function __doRequest($request, $location, $action, $version) {
        $request = str_replace(':ns1', '', $request);
        $request = str_replace('ns1:', '', $request);
        $request = str_replace("\n", '', $request);
        $request = str_replace("\r", '', $request);
        if (strpos($request,"EnviarLoteRpsEnvio")!==false)
        {
            $request=str_replace("<EnviarLoteRPS/><param1>",'<EnviarLoteRPS xmlns="http://tempuri.org/"><loteXML>',$request);
            $request=str_replace("</param1>","</loteXML></EnviarLoteRPS>",$request);
        }
        if (strpos($request,"ConsultarLoteRps")!==false)
        {
            $request=str_replace("<ConsultarLoteRPS/><param1>",'<ConsultarLoteRPS xmlns="http://tempuri.org/"><loteXML>',$request);
            $request=str_replace("</param1>","</loteXML></ConsultarLoteRPS>",$request);
        }
        if (strpos($request,"ConsultarSituacaoLoteRps")!==false)
        {
            $request=str_replace("<ConsultarSituacaoLoteRPS/><param1>",'<ConsultarSituacaoLoteRPS xmlns="http://tempuri.org/"><loteXML>',$request);
            $request=str_replace("</param1>","</loteXML></ConsultarSituacaoLoteRPS>",$request);
        }
        //$request=str_replace('&gt;','>',$request);
        //$request=str_replace('&lt;','<',$request);

//echo "<textarea style='width:100%; height: 200pt'>".($request)."</textarea>";exit;
        $this->soapRequest=$request;
        return (parent::__doRequest($request, $location, $action, $version));
    }
}











Sds,

Giuliano Nascimento

Em 14/02/12 18:47, Giuliano escreveu:
NFSE_SSA.zip

Daniel Chaves

unread,
Feb 15, 2012, 8:37:56 AM2/15/12
to nfe...@googlegroups.com
problema de nfse é que cada prefeitura usa um padrao kkk

divonei Macedo

unread,
Feb 15, 2012, 11:02:55 AM2/15/12
to nfe...@googlegroups.com
eu fiz um modelo aqui para nos da empresa que envia os lotes aqui para curitiba,

funcionou perfeitamente.



2012/2/15 Daniel Chaves <danie...@gmail.com>

Daniel Chaves

unread,
Feb 15, 2012, 11:06:45 AM2/15/12
to nfe...@googlegroups.com
eu to fazendo pra SP, 

Silas Ribas Martins

unread,
Feb 15, 2012, 11:14:19 AM2/15/12
to nfe...@googlegroups.com
Salve,

Acho que, quem já tem as NFSe para varias prefeituras, poderiam se juntar e planejar um pacote com uma interface ou abstrata e dai cada prefeitura seria um subpacote, tipo: 

NFSe_SalvadorBA, NFSe_SaoPauloSP, NFSe_CuritibaPR ou algo como: NFSe::cidade('Salvador_BA')

-- 
Silas Ribas Martins
Sent with Sparrow

divonei Macedo

unread,
Feb 15, 2012, 11:25:05 AM2/15/12
to nfe...@googlegroups.com
seria muito interessante isso, mas por enquanto cada uma tem sua receita e modo de preparo..rs

2012/2/15 Silas Ribas Martins <sil...@gmail.com>

Daniel Chaves

unread,
Feb 15, 2012, 11:28:11 AM2/15/12
to nfe...@googlegroups.com
até poderia mesmo mas eu ja ouvi esse papo aqui mais de uma vez kkkk

quem sabe cada um disponibilizando o que tem nao se chega a algo pra todos.

Silas Ribas Martins

unread,
Feb 15, 2012, 11:28:14 AM2/15/12
to nfe...@googlegroups.com
Salve,

Sim agora sim, mas uma hora, na minha visao, vai ter que pensar nisso ou vai gerar muita confusao.

Ainda mais que cada prefeitura pode colocar o que quiser, tipo pegue todas as grandes cidades do Brasil e vamos dizer que algumas ainda usem a mesma solucao, nada nada chega a varias para umas 10 tipos de NFS quando o negocio comecar a funfar.

-- 
Silas Ribas Martins
Sent with Sparrow

Daniel Chaves

unread,
Feb 15, 2012, 11:43:03 AM2/15/12
to nfe...@googlegroups.com
eu acho q dificilmente irá se adotar um padrao nacional pra isso até porque muitas prefeitura como a de Sp ja tem esse sistema a muito tempo, acho muito dificil mudar.

Daniel Chaves

unread,
Feb 15, 2012, 1:27:07 PM2/15/12
to nfe...@googlegroups.com
meu tem umas coisas sinistras veja um dos erros q eu tenho em validacao do XML pra prefeitura de Sp
array(2) {
["status"]=>
bool(false)
["error"]=>
string(374) " Erro 1839: Element 'EmailTomador': [facet 'pattern'] The value 'dch...@leaderportal.com.br' is not accepted by the pattern '^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$'.
; Erro 1824: Element 'EmailTomador': 'dch...@leaderportal.com.br' is not a valid value of the atomic type '{http://www.prefeitura.sp.gov.br/nfe/tipos}tpEmail'.
;"

Giuliano

unread,
Feb 15, 2012, 2:05:17 PM2/15/12
to nfe...@googlegroups.com
O padrão ABRASF é utilizado por quase todas as prefeituras, portanto deve funcionar com pequenas modificações.

Minha sugestão é que sejam criados os métodos padrões em uma classe, e sejam criadas outras classes extendidas para cada município com suas particularidades.

Exemplo:

class NFSe
{
   ... enviaLote
   ... outras...
}

class NFSe_Salvador extends NFSe
{
   function enviaLote()
   {
      ... particularidades deste município
      parent::enviaLote();
      ... particularidades deste município
   }
}

Sds,

Giuliano Nascimento

Em 15/02/12 14:14, Silas Ribas Martins escreveu:

Daniel Chaves

unread,
Feb 15, 2012, 2:57:34 PM2/15/12
to nfe...@googlegroups.com
a unica coisa q eu nao sei se seria bom para o grupo ai é que eu uso o Zend Soap Client pra fazer as comunicações

Daniel Chaves

unread,
Feb 15, 2012, 3:23:17 PM2/15/12
to nfe...@googlegroups.com
guiliano.

pra assinar o xml vc usa o método do nfephp sem alterar nada?

o seu aqui da muito pau de  Rejeição: Assinatura - Digest difere do calculado. 

Giuliano

unread,
Feb 16, 2012, 4:49:42 AM2/16/12
to nfe...@googlegroups.com, Daniel Chaves
Praticamente sim.

Só tem uma pequena alteração...

Olha a rotina de assintaura:

    /**
     * __signXMLNFSe
     * Assinador TOTALMENTE baseado em PHP para arquivos XML
     * este assinador somente utiliza comandos nativos do PHP para assinar
     * os arquivos XML
     *
     * @name __signXMLNFSe
     * @version 2.1
     * @package NFePHP
     * @param    string $docxml String contendo o arquivo XML a ser assinado
     * @param   string $tagid TAG do XML que devera ser assinada
     * @return    mixed FALSE se houve erro ou string com o XML assinado
     */
    public function __signXMLNFSe($docxml, $tagid=''){
            if ( $tagid == '' ){
                $this->errMsg = 'Uma tag deve ser indicada para que seja assinada!!';
                $this->errStatus = TRUE;
                return FALSE;
            }
            if ( $docxml == '' ){
                $this->errMsg = 'Um xml deve ser passado para que seja assinado!!';
                $this->errStatus = TRUE;
                return FALSE;
            }
//echo $tagid."<pre>$docxml</pre><hr>";exit;
            // obter o chave privada para a ssinatura
            $fp = fopen($this->priKEY, "r");
            $priv_key = fread($fp, 8192);
            fclose($fp);
            $pkeyid = openssl_get_privatekey($priv_key);
            // limpeza do xml com a retirada dos CR, LF e TAB
            $order = array("\r\n", "\n", "\r", "\t");
            $replace = '';


            $docxml = str_replace($order, $replace, $docxml);
                // carrega o documento no DOM
            $xmldoc = new DOMDocument();
            $xmldoc->preservWhiteSpace = FALSE; //elimina espaços em branco
            $xmldoc->formatOutput = FALSE;
            // muito importante deixar ativadas as opçoes para limpar os espacos em branco
            // e as tags vazias
            $xmldoc->loadXML($docxml,LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG);
            $root = $xmldoc->documentElement;

            //extrair a tag com os dados a serem assinados
            $node = $xmldoc->getElementsByTagName($tagid)->item(0);
                if ($tagid=="InfRps"){
                    $nodeSignature = $xmldoc->getElementsByTagName('Rps')->item(0);
                } else {
                    $nodeSignature = $xmldoc->getElementsByTagName('EnviarLoteRpsEnvio')->item(0);
                }
                $id = trim($node->getAttribute("id"));
            $idnome = preg_replace('/[^0-9]/','', $id);
            //extrai os dados da tag para uma string
            $dados = $node->C14N(FALSE,FALSE,NULL,NULL);

                $digValue = base64_encode(hash('sha1',$dados,TRUE));
//echo "\n\n$dadosHash\n\ndigValue=$digValue<br>\n\n-------------\n\n<br>";

            //monta a tag da assinatura digital
            $Signature = $xmldoc->createElementNS($this->URLdsig,'Signature');
                $nodeSignature->appendChild($Signature);

             //if ($tagid=='LoteRps'){
            //} else {
                //$nodeSignature->appendChild($Signature);
            //    }
            $SignedInfo = $xmldoc->createElement('SignedInfo');
            $Signature->appendChild($SignedInfo);
            //Cannocalization
            $newNode = $xmldoc->createElement('CanonicalizationMethod');
            $SignedInfo->appendChild($newNode);
            $newNode->setAttribute('Algorithm', $this->URLCanonMeth);
            //SignatureMethod
            $newNode = $xmldoc->createElement('SignatureMethod');
            $SignedInfo->appendChild($newNode);
            $newNode->setAttribute('Algorithm', $this->URLSigMeth);
            //Reference
            $Reference = $xmldoc->createElement('Reference');
            $SignedInfo->appendChild($Reference);
            $Reference->setAttribute('URI', '#'.$id);
            //Transforms
            $Transforms = $xmldoc->createElement('Transforms');
            $Reference->appendChild($Transforms);
            //Transform
            $newNode = $xmldoc->createElement('Transform');
            $Transforms->appendChild($newNode);
            $newNode->setAttribute('Algorithm', $this->URLTransfMeth_1);
                if (($tagid<>'InfRps') && ($tagid<>'LoteRps'))
                {
                    //Transform
                    $newNode = $xmldoc->createElement('Transform');
                    $Transforms->appendChild($newNode);
                    $newNode->setAttribute('Algorithm', $this->URLTransfMeth_2);
                }
            //DigestMethod
            $newNode = $xmldoc->createElement('DigestMethod');
            $Reference->appendChild($newNode);
            $newNode->setAttribute('Algorithm', $this->URLDigestMeth);
            //DigestValue
            $newNode = $xmldoc->createElement('DigestValue',$digValue);
            $Reference->appendChild($newNode);
            // extrai os dados a serem assinados para uma string
            $dados = $SignedInfo->C14N(FALSE,FALSE,NULL,NULL);
            //inicializa a variavel que irá receber a assinatura
            $signature = '';
            //executa a assinatura digital usando o resource da chave privada
            $resp = openssl_sign($dados,$signature,$pkeyid);
            //codifica assinatura para o padrao base64
            $signatureValue = base64_encode($signature);
            //SignatureValue
            $newNode = $xmldoc->createElement('SignatureValue',$signatureValue);
            $Signature->appendChild($newNode);
            //KeyInfo
            $KeyInfo = $xmldoc->createElement('KeyInfo');
            $Signature->appendChild($KeyInfo);
            //X509Data
            $X509Data = $xmldoc->createElement('X509Data');
            $KeyInfo->appendChild($X509Data);
            //carrega o certificado sem as tags de inicio e fim
            $cert = $this->__cleanCerts($this->pubKEY);
            //X509Certificate
            $newNode = $xmldoc->createElement('X509Certificate',$cert);
            $X509Data->appendChild($newNode);
            //grava na string o objeto DOM
                //$xmldoc2->appendChild($Signature);
               
            $docxml2 = $xmldoc->saveXML();
            // libera a memoria
            openssl_free_key($pkeyid);
            //retorna o documento assinado
//echo "\n\n$docxml2\n\n ";
            return trim($docxml2);
    } //fim signXML









Sds,

Giuliano Nascimento

Em 15/02/12 18:23, Daniel Chaves escreveu:

Daniel Chaves

unread,
Feb 16, 2012, 6:39:57 AM2/16/12
to nfe...@googlegroups.com
valeu assim q eu terminar aqui eu ja mando o codigo

Geisel Sebrão Sierote

unread,
Feb 16, 2012, 7:15:26 AM2/16/12
to nfe...@googlegroups.com
Estou acompanhando as ideias levantadas aqui e gostaria de participar, pois estou montando para São Leopoldo/RS e esta é padrão ABRASF como modificações.

Sds,

Geisel

Frederico Fonseca

unread,
Apr 20, 2012, 11:02:43 AM4/20/12
to nfe...@googlegroups.com
Geisel,

também estou implementando uma solução para São Leopoldo. Queria trocar uma idéia contigo. Me add aí no gtalk que a gente se fala e depois colabora aqui com o pessoal.


Até mais !




2012/2/15 Daniel Chaves <danie...@gmail.com>
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com

--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com

--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com

--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com




2012/2/15 Daniel Chaves <danie...@gmail.com>
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com

--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com

--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com

--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages