251 lines
12 KiB
PHP
Executable File
251 lines
12 KiB
PHP
Executable File
<?php
|
|
class XmlGen extends Producto{
|
|
|
|
function CargaAtt(&$nodo, $attr)
|
|
{
|
|
foreach ($attr as $key => $val)
|
|
{
|
|
if (strlen($val)>0)
|
|
{
|
|
$nodo->setAttribute($key,$val);
|
|
}
|
|
}
|
|
}
|
|
|
|
function GenerateXML($data, $serie, $totales, $nodoEmisor, $nodoReceptor, $nodosConceptos,$emp)
|
|
{
|
|
global $rfc;
|
|
|
|
$xml = new DOMdocument("1.0","UTF-8");
|
|
$root = $xml->createElement("cfdi:Comprobante");
|
|
$root = $xml->appendChild($root);
|
|
|
|
$root->setAttribute("xmlns:cfdi", "http://www.sat.gob.mx/cfd");
|
|
$root->setAttribute("xmlns:cfdi", "http://www.sat.gob.mx/cfd/3");
|
|
$root->setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
|
|
|
|
|
|
$data["fecha"] = explode(" ", $data["fecha"]);
|
|
$data["fecha"] = $data["fecha"][0]."T".$data["fecha"][1];
|
|
// $data["fecha"] = "2010-09-22T07:45:09";
|
|
$this->CargaAtt($root, array("version"=>"3.2",
|
|
"serie"=>$this->Util()->CadenaOriginalVariableFormat($serie["serie"],false,false),
|
|
"folio"=>$this->Util()->CadenaOriginalVariableFormat($data["folio"],false,false),
|
|
"fecha"=>$this->Util()->CadenaOriginalVariableFormat($data["fecha"],false,false),
|
|
"sello"=>$data["sello"],
|
|
// "noAprobacion"=>$this->Util()->CadenaOriginalVariableFormat($serie["noAprobacion"],false,false),
|
|
// "anoAprobacion"=>$this->Util()->CadenaOriginalVariableFormat($serie["anoAprobacion"],false,false),
|
|
"tipoDeComprobante"=>$this->Util()->CadenaOriginalVariableFormat($data["tipoDeComprobante"],false,false),
|
|
"formaDePago"=>$this->Util()->CadenaOriginalVariableFormat($data["formaDePago"],false,false),
|
|
"metodoDePago"=>$this->Util()->CadenaOriginalVariableFormat($data["metodoDePago"],false,false),
|
|
"LugarExpedicion"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["sucursal"]["nombre"],false,false),
|
|
"NumCtaPago"=>$this->Util()->CadenaOriginalVariableFormat($data["numCtaPago"],false,false),
|
|
"condicionesDePago"=>$this->Util()->CadenaOriginalVariableFormat($data["condicionesDePago"],false,false),
|
|
"noCertificado"=>$this->Util()->CadenaOriginalVariableFormat($serie["noCertificado"],false,false),
|
|
"certificado"=>$data["certificado"],
|
|
"subTotal"=>$this->Util()->CadenaOriginalVariableFormat($totales["subtotal"],true,false),
|
|
"descuento"=>$this->Util()->CadenaOriginalVariableFormat($totales["descuento"], true,false),
|
|
//tipos de cambio
|
|
"TipoCambio"=>$this->Util()->CadenaOriginalVariableFormat($data["tipoDeCambio"], true,false),
|
|
"Moneda"=>$this->Util()->CadenaOriginalVariableFormat($data["tiposDeMoneda"], false,false),
|
|
//tipos de cambio
|
|
"total"=>$this->Util()->CadenaOriginalVariableFormat($totales["total"], true,false)
|
|
)
|
|
);
|
|
|
|
|
|
$emisor = $xml->createElement("cfdi:Emisor");
|
|
$emisor = $root->appendChild($emisor);
|
|
$this->CargaAtt($emisor, array("rfc"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["rfc"]["rfc"],false,false),
|
|
"nombre"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["rfc"]["razonSocial"],false,false)
|
|
)
|
|
);
|
|
|
|
$domfis = $xml->createElement("cfdi:DomicilioFiscal");
|
|
$domfis = $emisor->appendChild($domfis);
|
|
|
|
//echo $data["nodoEmisor"]["rfc"]["pais"];
|
|
$this->CargaAtt($domfis, array("calle"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["rfc"]["calle"],false,false),
|
|
"noExterior"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["rfc"]["noExt"],false,false),
|
|
"noInterior"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["rfc"]["noInt"],false,false),
|
|
"colonia"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["rfc"]["colonia"],false,false),
|
|
"localidad"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["rfc"]["localidad"],false,false),
|
|
"referencia"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["rfc"]["referencia"],false,false),
|
|
"municipio"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["rfc"]["municipio"],false,false),
|
|
"estado"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["rfc"]["estado"],false,false),
|
|
"pais"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["rfc"]["pais"],false,false),
|
|
"codigoPostal"=>$this->Util()->CadenaOriginalVariableFormat($this->Util()->PadStringLeft($data["nodoEmisor"]["rfc"]["cp"], 5, "0"),false,false)
|
|
)
|
|
);
|
|
|
|
if($data["nodoEmisor"]["sucursal"]["sucursalActiva"] == 'no'){
|
|
|
|
$suc = $xml->createElement("cfdi:ExpedidoEn");
|
|
$suc = $emisor->appendChild($suc);
|
|
|
|
$this->CargaAtt($suc, array("calle"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["sucursal"]["calle"],false,false),
|
|
"noExterior"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["sucursal"]["noExt"],false,false),
|
|
"noInterior"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["sucursal"]["noInt"],false,false),
|
|
"colonia"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["sucursal"]["colonia"],false,false),
|
|
"localidad"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["sucursal"]["localidad"],false,false),
|
|
"referencia"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["sucursal"]["referencia"],false,false),
|
|
"municipio"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["sucursal"]["municipio"],false,false),
|
|
"estado"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["sucursal"]["estado"],false,false),
|
|
"pais"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["sucursal"]["pais"],false,false),
|
|
"codigoPostal"=>$this->Util()->CadenaOriginalVariableFormat($this->Util()->PadStringLeft($data["nodoEmisor"]["sucursal"]["cp"], 5, "0"),false,false)
|
|
)
|
|
);
|
|
|
|
}//if
|
|
|
|
//expedido en aun no porque asumiremos todas las facruras en domicilio fiscal
|
|
$regfis = $xml->createElement("cfdi:RegimenFiscal");
|
|
$regfis = $emisor->appendChild($regfis);
|
|
|
|
//echo $data["nodoEmisor"]["rfc"]["pais"];
|
|
$this->CargaAtt($regfis, array("Regimen"=>$this->Util()->CadenaOriginalVariableFormat($data["nodoEmisor"]["rfc"]["regimenFiscal"],false,false)
|
|
)
|
|
);
|
|
|
|
$receptor = $xml->createElement("cfdi:Receptor");
|
|
$receptor = $root->appendChild($receptor);
|
|
$this->CargaAtt($receptor, array("rfc"=>$this->Util()->CadenaOriginalVariableFormat($nodoReceptor["rfc"],false,false),
|
|
"nombre"=>$this->Util()->CadenaOriginalVariableFormat($nodoReceptor["nombre"],false,false)
|
|
)
|
|
);
|
|
$domicilio = $xml->createElement("cfdi:Domicilio");
|
|
$domicilio = $receptor->appendChild($domicilio);
|
|
$this->CargaAtt($domicilio, array("calle"=>$this->Util()->CadenaOriginalVariableFormat($nodoReceptor["calle"],false,false),
|
|
"noExterior"=>$this->Util()->CadenaOriginalVariableFormat($nodoReceptor["noExt"],false,false),
|
|
"noInterior"=>$this->Util()->CadenaOriginalVariableFormat($nodoReceptor["noInt"],false,false),
|
|
"colonia"=>$this->Util()->CadenaOriginalVariableFormat($nodoReceptor["colonia"],false,false),
|
|
"localidad"=>$this->Util()->CadenaOriginalVariableFormat($nodoReceptor["localidad"],false,false),
|
|
"referencia"=>$this->Util()->CadenaOriginalVariableFormat($nodoReceptor["referencia"],false,false),
|
|
"municipio"=>$this->Util()->CadenaOriginalVariableFormat($nodoReceptor["municipio"],false,false),
|
|
"estado"=>$this->Util()->CadenaOriginalVariableFormat($nodoReceptor["estado"],false,false),
|
|
"pais"=>$this->Util()->CadenaOriginalVariableFormat($nodoReceptor["pais"],false,false),
|
|
"codigoPostal"=>$this->Util()->CadenaOriginalVariableFormat($this->Util()->PadStringLeft($nodoReceptor["cp"], 5, "0"),false,false),
|
|
)
|
|
);
|
|
|
|
|
|
$conceptos = $xml->createElement("cfdi:Conceptos");
|
|
$conceptos = $root->appendChild($conceptos);
|
|
foreach($nodosConceptos as $concepto)
|
|
{
|
|
$myConcepto = $xml->createElement("cfdi:Concepto");
|
|
$myConcepto = $conceptos->appendChild($myConcepto);
|
|
$this->CargaAtt($myConcepto, array("cantidad"=>$this->Util()->CadenaOriginalVariableFormat($concepto["cantidad"],true,false),
|
|
"unidad"=>$this->Util()->CadenaOriginalVariableFormat($concepto["unidad"],false,false),
|
|
"noIdentificacion"=>$this->Util()->CadenaOriginalVariableFormat($concepto["noIdentificacion"],false,false),
|
|
"descripcion"=>$this->Util()->CadenaOriginalVariableFormat($concepto["descripcion"],false,false),
|
|
"valorUnitario"=>$this->Util()->CadenaOriginalVariableFormat($concepto["valorUnitario"],true,false),
|
|
"importe"=>$this->Util()->CadenaOriginalVariableFormat($concepto["importe"],true,false),
|
|
)
|
|
);
|
|
// aca falta la informacion aduanera
|
|
// aca falta cuenta predial
|
|
}
|
|
|
|
// todo complementoconcepto
|
|
|
|
$impuestos = $xml->createElement("cfdi:Impuestos");
|
|
$impuestos = $root->appendChild($impuestos);
|
|
|
|
$this->CargaAtt($impuestos, array(
|
|
"totalImpuestosRetenidos" => $this->Util()->CadenaOriginalVariableFormat($totales["retIsr"]+$totales["retIva"],true,false),
|
|
"totalImpuestosTrasladados" => $this->Util()->CadenaOriginalVariableFormat($totales["iva"]+$totales["ieps"],true,false))
|
|
);
|
|
|
|
$retenciones = $xml->createElement("cfdi:Retenciones");
|
|
$retenciones = $impuestos->appendChild($retenciones);
|
|
|
|
$retencion = $xml->createElement("cfdi:Retencion");
|
|
$retencion = $retenciones->appendChild($retencion);
|
|
|
|
$this->CargaAtt($retencion, array(
|
|
"impuesto" => $this->Util()->CadenaOriginalVariableFormat("IVA",false,false),
|
|
"importe" => $this->Util()->CadenaOriginalVariableFormat($totales["retIva"],true,false))
|
|
);
|
|
|
|
$retencion = $xml->createElement("cfdi:Retencion");
|
|
$retencion = $retenciones->appendChild($retencion);
|
|
|
|
$this->CargaAtt($retencion, array(
|
|
"impuesto" => $this->Util()->CadenaOriginalVariableFormat("ISR",false,false),
|
|
"importe" => $this->Util()->CadenaOriginalVariableFormat($totales["retIsr"],true,false))
|
|
);
|
|
|
|
|
|
$traslados = $xml->createElement("cfdi:Traslados");
|
|
$traslados = $impuestos->appendChild($traslados);
|
|
|
|
$traslado = $xml->createElement("cfdi:Traslado");
|
|
$traslado = $traslados->appendChild($traslado);
|
|
|
|
$this->CargaAtt($traslado, array(
|
|
"impuesto" => $this->Util()->CadenaOriginalVariableFormat("IVA",false,false),
|
|
"tasa" => $this->Util()->CadenaOriginalVariableFormat($totales["tasaIva"],true,false),
|
|
"importe" => $this->Util()->CadenaOriginalVariableFormat($totales["iva"],true,false))
|
|
);
|
|
|
|
$traslado = $xml->createElement("cfdi:Traslado");
|
|
$traslado = $traslados->appendChild($traslado);
|
|
|
|
$this->CargaAtt($traslado, array(
|
|
"impuesto" => $this->Util()->CadenaOriginalVariableFormat("IEPS",false,false),
|
|
"tasa" => $this->Util()->CadenaOriginalVariableFormat($totales["porcentajeIEPS"],true,false),
|
|
"importe" => $this->Util()->CadenaOriginalVariableFormat($totales["ieps"],true,false))
|
|
);
|
|
|
|
/* Addenda
|
|
if($_SESSION["impuestos"])
|
|
{
|
|
|
|
$addenda = $xml->createElement("cfdi:Addenda");
|
|
$addenda = $root->appendChild($addenda);
|
|
|
|
foreach($_SESSION["impuestos"] as $impuesto)
|
|
{
|
|
$factura = $xml->createElement("impuesto");
|
|
$factura = $addenda->appendChild($factura);
|
|
|
|
$this->CargaAtt($factura, array(
|
|
"impuesto" => $impuesto["impuesto"],
|
|
"tasa" => $impuesto["tasa"],
|
|
"tipo" => $impuesto["tipo"]
|
|
)
|
|
);
|
|
}
|
|
}*/
|
|
$complemento = $xml->createElement("cfdi:Complemento");
|
|
$complemento = $root->appendChild($complemento);
|
|
|
|
$root->setAttribute("xsi:schemaLocation", "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd");
|
|
|
|
// falta nodo complemento
|
|
/**/
|
|
//$xml->formatOutput = true;
|
|
$nufa = $emp["empresaId"]."_".$serie["serie"]."_".$data["folio"];
|
|
|
|
$rfcActivo = $rfc->getRfcActive();
|
|
$root = DOC_ROOT."/empresas/".$_SESSION["empresaId"]."/certificados/".$rfcActivo."/facturas/xml/";
|
|
$rootFacturas = DOC_ROOT."/empresas/".$_SESSION["empresaId"]."/certificados/".$rfcActivo."/facturas/";
|
|
|
|
if(!is_dir($rootFacturas))
|
|
{
|
|
mkdir($rootFacturas, 0777);
|
|
}
|
|
|
|
if(!is_dir($root))
|
|
{
|
|
mkdir($root, 0777);
|
|
}
|
|
|
|
$xml->save($root.$nufa.".xml");
|
|
return $nufa;
|
|
}
|
|
|
|
}
|
|
?>
|