Closed icompsoftcleiton closed 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 = '
//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
Vou incluir assim que tiver um tempo
Já foi incluso?
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.