nfephp-org / nfephp

PROJETO DEPRECATED use sped-nfe
https://github.com/nfephp-org/sped-nfe
Other
691 stars 686 forks source link

MDFe - Cancelamento #124

Closed icompsoftcleiton closed 10 years ago

icompsoftcleiton commented 10 years ago

boa tarde, pelo que eu vi no fonte, só tem a parte de encerramento pronta, alguém esta fazendo a de encerramento?

Caso ninguém esteja, por favor me informa, se não irei fazer.

icompsoftcleiton commented 10 years ago

segue o método ajustado para ter o cancelamento d MDFe:

/* * manifDest * Manifestação do detinatário NT2012-002. * 110111 - Cancelamento * 110112 - Encerramento * 110114 - Inclusão de Condutor * 310620 - Registro de Passagem * 510620 - Registro de Passagem BRId * @name manifDest * @param string $chMDFe Chave da MDFe * @param string $tpEvento Tipo do evento pode conter 2 ou 6 digitos ex. 00 ou 210200 * @param integer $tpAmb Tipo de ambiente * @param integer $modSOAP 1 usa sendSOP e 2 usa sendSOAP2 * @param mixed $resp variável passada como referencia e irá conter o retorno da função em um array * @param string $xJust Justificativa do Cancelamento * @return mixed false * TODO : terminar o código não funcional e não testado / public function manifDest($chMDFe='',$tpEvento='',$tpAmb='',$cMun='', $modSOAP='2',&$resp='',$xJust=''){ try { if ($chMDFe == ''){ $msg = "A chave do MDFe recebida é obrigatória."; throw new nfephpException($msg); } if ($tpEvento == ''){ $msg = "O tipo de evento não pode ser vazio."; throw new nfephpException($msg); } if (strlen($tpEvento) == 2){ $tpEvento = "1101$tpEvento"; } if ($tpEvento == '110111'){ if ($xJust == ''){ $msg = "A Justificativa não pode ser vazia."; throw new nfephpException($msg); } else if (strlen($xJust) < 15){ $msg = "A Justificativa deve conter no mínimo 15 caracteres."; throw new nfephpException($msg); } } if (strlen($tpEvento) != 6){ $msg = "O comprimento do código do tipo de evento está errado."; throw new nfephpException($msg); } $xml_ev = ''; //Busca o Número do Procotolo de Autorização da MDFe if($aRet = $this->getProtocol('', $chMDFe, $tpAmb, 2)){ for($xe = 0; $xe < count($aRet["aProt"]); $xe++){ if($aRet["aProt"][$xe]["xMotivo"] == "Autorizado o uso do MDF-e"){ $nProt = $aRet["aProt"][$xe]["nProt"]; } } } $cOrgao='43'; switch ($tpEvento){ case '110111': $descEvento = 'Cancelamento'; $xml_ev = ''; $xml_ev .= ''.$descEvento.''; $xml_ev .= ''.$nProt.''; $xml_ev .= ''.$xJust.''; $xml_ev .= ''; break; case '110112': $descEvento = 'Encerramento'; $xml_ev = ''; $xml_ev .= ''.$descEvento.''; $xml_ev .= ''.$nProt.''; $xml_ev .= ''.date("Y-m-d").''; $xml_ev .= ''.$cOrgao.''; $xml_ev .= ''.$cMun.''; $xml_ev .= ''; break; case '110114': $descEvento = 'Inclusão de Condutor'; break; default: $msg = "O código do tipo de evento informado não corresponde a nenhum evento de manifestação de destinatário."; throw new nfephpException($msg); } $resp = array('bStat'=>false,'cStat'=>'','xMotivo'=>'','arquivo'=>''); //ajusta ambiente if ($tpAmb == ''){ $tpAmb = $this->tpAmb; }

        //utilizar AN para enviar o manifesto
        $sigla = 'RS';
        $aURL = $this->loadSEFAZ( $this->raizDir . 'config' . DIRECTORY_SEPARATOR . $this->xmlURLfile,$tpAmb,$sigla);

        $numLote = substr(str_replace(',','',number_format(microtime(true)*1000000,0)),0,15);
        //Data e hora do evento no formato AAAA-MM-DDTHH:MM:SS (UTC)
        $dhEvento = date('Y-m-d').'T'.date('H:i:s');
        //montagem do namespace do serviço
        $servico = 'MDFeRecepcaoEvento';
        //recuperação da versão
        $versao = $aURL[$servico]['version'];
        //recuperação da url do serviço
        $urlservico = $aURL[$servico]['URL'];
        //recuperação do método
        $metodo = $aURL[$servico]['method'];
        //montagem do namespace do serviço
        $namespace = $this->URLPortal.'/wsdl/'.$servico;
        // 2   +    6     +    44         +   2  = 54 digitos
        //“ID” + tpEvento + chave da NF-e + nSeqEvento
        $nSeqEvento = '1';
        $id = "ID".$tpEvento.$chMDFe.'0'.$nSeqEvento;
        //monta mensagem
        $Ev='';
        $Ev .= "<eventoMDFe xmlns=\"$this->URLPortal\" versao=\"$versao\">";
        $Ev .= "<infEvento Id=\"$id\">";
        $Ev .= "<cOrgao>$cOrgao</cOrgao>";
        $Ev .= "<tpAmb>$tpAmb</tpAmb>";
        $Ev .= "<CNPJ>$this->cnpj</CNPJ>";
        $Ev .= "<chMDFe>$chMDFe</chMDFe>";
        $Ev .= "<dhEvento>$dhEvento</dhEvento>";
        $Ev .= "<tpEvento>$tpEvento</tpEvento>";
        $Ev .= "<nSeqEvento>$nSeqEvento</nSeqEvento>";
        $Ev .= "<detEvento versaoEvento=\"$versao\">";
        //$Ev .= "<versaoEvento>$versao</versaoEvento>";
        //$Ev .= "<descEvento>$descEvento</descEvento>";
        $Ev .= $xml_ev;
        $Ev .= "</detEvento></infEvento>";
        $Ev .= "</eventoMDFe>";

        //assinatura dos dados
        /*echo '<pre>';
        var_dump(htmlspecialchars( $Ev, 0, "iso-8859-1")); 
        echo '</pre>';
        */
        $tagid = 'infEvento';
        $Ev = $this->signXML($Ev, $tagid);
        $Ev = str_replace('<?xml version="1.0"?>','', $Ev);
        $Ev = str_replace('<?xml version="1.0" encoding="utf-8"?>','', $Ev);
        $Ev = str_replace('<?xml version="1.0" encoding="UTF-8"?>','', $Ev);
        $Ev = str_replace(array("\r","\n","\s"),"", $Ev);
        //montagem dos dados
        $dados = '';
        //$dados .= "<eventoMDFe xmlns=\"$this->URLPortal\" versao=\"$versao\">";
        //$dados .= "<idLote>$numLote</idLote>";
        $dados .= $Ev;
        //$dados .= "</eventoMDFe>";
        //montagem da mensagem
        $cabec = "<mdfeCabecMsg xmlns=\"$namespace\"><cUF>$this->cUF</cUF><versaoDados>$versao</versaoDados></mdfeCabecMsg>";
        $dados = "<mdfeDadosMsg xmlns=\"$namespace\">$dados</mdfeDadosMsg>";
        //grava solicitação em temp
        if (!file_put_contents($this->temDir."$chMDFe-$nSeqEvento-envMDFe.xml",$Ev)){
            $msg = "Falha na gravação do aruqivo envMDFe!!";
            throw new nfephpException($msg);
        }
        //envia dados via SOAP
        if ($modSOAP == '2'){
            $retorno = $this->__sendSOAP2($urlservico, $namespace, $cabec, $dados, $metodo, $tpAmb);
        } else {
            $retorno = $this->__sendSOAP($urlservico, $namespace, $cabec, $dados, $metodo, $tpAmb,$this->UF);
        }
        //verifica o retorno
        if (!$retorno){
            //não houve retorno
            $msg = "Nao houve retorno Soap verifique a mensagem de erro e o debug!!";
            throw new nfephpException($msg);
        }
        /**** Temporario, retirar depois dos testes ***** Lelo */
        if (!file_put_contents($this->temDir."$chMDFe-md.xml", $retorno)) {
            echo "Falha na gravação do arquivo md!!";
        }
        //tratar dados de retorno
        $xmlMDe = new DOMDocument('1.0', 'utf-8'); //cria objeto DOM
        $xmlMDe->formatOutput = false;
        $xmlMDe->preserveWhiteSpace = false;
        $xmlMDe->loadXML($retorno,LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG);
        $retEvento = $xmlMDe->getElementsByTagName("retEventoMDFe")->item(0);
        $infEvento = $xmlMDe->getElementsByTagName("infEvento")->item(0);
        $cStat = !empty($retEvento->getElementsByTagName('cStat')->item(0)->nodeValue) ? $retEvento->getElementsByTagName('cStat')->item(0)->nodeValue : '';
        $xMotivo = !empty($retEvento->getElementsByTagName('xMotivo')->item(0)->nodeValue) ? $retEvento->getElementsByTagName('xMotivo')->item(0)->nodeValue : '';
        if ($cStat == ''){
            //houve erro
            $msg = "cStat está em branco, houve erro na comunicação Soap verifique a mensagem de erro e o debug!!";
            throw new nfephpException($msg);
        }
        //tratar erro de versão do XML
        if ($cStat == '238' || $cStat == '239'){
            $this->__trata239($retorno, $sigla, $tpAmb, $servico, $versao);
            $msg = "Versão do arquivo XML não suportada no webservice!!";
            throw new nfephpException($msg);
        }
        //erro no processamento
        if ($cStat != '135' && $cStat != '136' ){
            //se cStat <> 135 houve erro e o lote foi rejeitado
            $msg = "O Lote foi rejeitado : $cStat - $xMotivo\n";
            throw new nfephpException($msg);
        }
        if ($cStat == '136'){
            $msg = "O Evento foi registrado mas a MDFe não foi localizada : $cStat - $xMotivo\n";
            throw new nfephpException($msg);
        }
        if ($cStat == '215'){
            $msg = "Erro: $cStat - $xMotivo\n";
            throw new nfephpException($msg);
        }
        //o evento foi aceito
        $xmlenvMDe = new DOMDocument('1.0', 'utf-8'); //cria objeto DOM
        $xmlenvMDe->formatOutput = false;
        $xmlenvMDe->preserveWhiteSpace = false;
        $xmlenvMDe->loadXML($Ev,LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG);
        $evento = $xmlenvMDe->getElementsByTagName("eventoMDFe")->item(0);
        //Processo completo solicitação + protocolo
        $xmlprocMDe = new DOMDocument('1.0', 'utf-8');; //cria objeto DOM
        $xmlprocMDe->formatOutput = false;
        $xmlprocMDe->preserveWhiteSpace = false;
        //cria a tag procEventoNFe
        $procEventoNFe = $xmlprocMDe->createElement('procEventoMDFe');
        $xmlprocMDe->appendChild($procEventoNFe);
        //estabele o atributo de versão
        $eventProc_att1 = $procEventoNFe->appendChild($xmlprocMDe->createAttribute('versao'));
        $eventProc_att1->appendChild($xmlprocMDe->createTextNode($versao));
        //estabelece o atributo xmlns
        $eventProc_att2 = $procEventoNFe->appendChild($xmlprocMDe->createAttribute('xmlns'));
        $eventProc_att2->appendChild($xmlprocMDe->createTextNode($this->URLPortal));
        //carrega o node evento
        $node1 = $xmlprocMDe->importNode($evento, true);
        $procEventoNFe->appendChild($node1);
        //carrega o node retEvento
        $node2 = $xmlprocMDe->importNode($retEvento, true);
        $procEventoNFe->appendChild($node2);
        //salva o xml como string em uma variável
        $procXML = $xmlprocMDe->saveXML();
        //remove as informações indesejadas
        $procXML = str_replace("xmlns:default=\"http://www.w3.org/2000/09/xmldsig#\"",'',$procXML);
        $procXML = str_replace('default:','',$procXML);
        $procXML = str_replace(':default','',$procXML);
        $procXML = str_replace("\n",'',$procXML);
        $procXML = str_replace("\r",'',$procXML);
        $procXML = str_replace("\s",'',$procXML);
        $filename = $this->evtDir."$chMDFe-$tpEvento-$nSeqEvento-procMDFe.xml";
        $resp = array('bStat'=>true,'cStat'=>$cStat,'xMotivo'=>$xMotivo,'arquivo'=>$filename);
        //salva o arquivo xml
        if (!file_put_contents($filename, $procXML)){
            $msg = "Falha na gravação do arquivo procMDFe!!";
            throw new nfephpException($msg);
        }
    } catch (nfephpException $e) {
        $this->__setError($e->getMessage());
        if ($this->exceptions) {
            throw $e;
        }
        $resp = array('bStat'=>false,'cStat'=>$cStat,'xMotivo'=>$xMotivo,'arquivo'=>'');
        return false;
    }
    return $retorno;
} //fim manifDest
robmachado commented 10 years ago

Vou incluir assim que tiver um tempo

icompsoftcleiton commented 10 years ago

Já foi incluso?