Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Como identificar un xml con formato cfdi o cfd, en php

Estas en el tema de Como identificar un xml con formato cfdi o cfd, en php en el foro de PHP en Foros del Web. Hola que tal a todos, generalmente leo todo lo relacionado a mi problema y si no lo encuentro pues pregunto y después de leer y ...
  #1 (permalink)  
Antiguo 07/10/2013, 16:35
 
Fecha de Ingreso: octubre-2013
Mensajes: 13
Antigüedad: 10 años, 6 meses
Puntos: 0
Pregunta Como identificar un xml con formato cfdi o cfd, en php

Hola que tal a todos, generalmente leo todo lo relacionado a mi problema y si no lo encuentro pues pregunto y después de leer y he decidido preguntar debido a que hasta el momento no logro encontrar la respuesta. Explico el caso y dejo los códigos tanto de los xml como lo que he hecho en php.

Problema:

Estoy haciendo en php una funcion para validar una facutra, puedo hacerlo en formato cfd o en cfdi, siempre y cuando sean por separado, mi problema viene que actualmente debo de leer la factura en xml y al hacerlo mi funcion no identifica que tipo es, si es cfdi lo hace a la primera sin problemas pero si es cfd me manda unos errores, mi duda es como puedo hacerle para que cuando cargue el xml diga a si es cfd que haga la funcion de cfd y si es cfdi que haga la cfdi para que ya no me salgan los errores

les dejo el codigo para que los chequen...

Cita:
<?php
// $xml = simplexml_load_file('concfdi.xml');
$xml = new SimpleXMLElement ("CFD_BBCX834.xml", null,true);

foreach ($xml -> xpath ('//cfdi:Comprobante//cfdi:Emisor') as $Emisor){
echo "yo leo con cfdi<br />";
echo $Emisor['rfc'];
echo "<br />";
echo $Emisor['nombre'];
echo "<br />";
echo "saliendo de leo con cfdi<br />";
}

foreach ($xml -> Emisor as $Emisor){
echo "yo leo sin cfdi<br />";
echo $Emisor['rfc'];
echo "<br />";
echo $Emisor['nombre'];
echo "<br />";
echo "saliendo de leo sin cfdi<br />";
}
?>
Aqui les dejo el xml llamado concfdi.xml:
Cita:
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv3.xsd http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd" version="3.0" folio="85" fecha="2012-05-01T08:43:25" formaDePago="Pago en una sola exhibición" condicionesDePago="Contado" subTotal="91205.00" Moneda="MXP" total="105452.80" tipoDeComprobante="ingreso" noCertificado="20001000000100001696" certificado="v1g" sello="NVfIyB+5/C4MSJq76vlx3DPc=">
<cfdi:Emisor rfc="APR0412108C5" nombre="INSTALACIONES ELECTRICAS Y MONTAJES INDUSTRIALES, SA DE CV">
<cfdi:DomicilioFiscal calle="DOMICILIO" noExterior="31" colonia="COLONIA" localidad="LOCALIDAD" municipio="ORIZABA" estado="VERACRUZ" pais="MEXICO" codigoPostal="94350"/>
</cfdi:Emisor>
<cfdi:Receptor rfc="HECA740903131" nombre="ARTURO HERRERA CARRION">
<cfdi:Domicilio calle="NORTE 14 ENTRE OTE. 3 Y 5" noExterior="138" colonia="CENTRO" municipio="ORIZABA" estado="VERACRUZ" pais="MEXICO" codigoPostal="94300"/>
</cfdi:Receptor>
<cfdi:Conceptos>
<cfdi:Concepto cantidad="145.00" noIdentificacion="1" descripcion="PRODUCTO 1" valorUnitario="629.00" importe="91205.00"/>
</cfdi:Conceptos>
<cfdi:Impuestos totalImpuestosTrasladados="14592.8">
<cfdi:Traslados>
<cfdi:Traslado impuesto="IVA" tasa="16.00" importe="14592.8"/>
</cfdi:Traslados>
</cfdi:Impuestos>
<cfdi:Complemento>
<implocal:ImpuestosLocales xmlns:implocal="http://www.sat.gob.mx/implocal" version="1.0" TotaldeRetenciones="345" TotaldeTraslados="0.00">
<implocal:RetencionesLocales ImpLocRetenido="5 AL MILLAR" TasadeRetencion="0.05" Importe="345.00"/>
</implocal:ImpuestosLocales>
<tfd:TimbreFiscalDigital xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/TimbreFiscalDigital/TimbreFiscalDigital.xsd" version="1.0" UUID="F2298C2A-40F2-4889-B112-2B05437BBBEA" FechaTimbrado="2012-05-01T08:42:51" selloCFD="NVfIyB+5/C4MSJq76vlx3D2hn6RUYvPHqpEdk8JgtiFsMOWkS77TuBCq128 mCODplW0XydD2/IHOVN8ZmQsCX9xOGsAyV2Aw79vmBuUjp49Un3HXvxfTTJPCYWM oDTyTCs0cyucD/WV6vRiV3umHqv2nsuxRZcWw5mG/FDozkPc=" noCertificadoSAT="30001000000100000801" selloSAT="CKvN90X/5+BI2AlT1LKby8LvMcfqPzJsKn7OSy0Jq63Xqjq2xAwy5mBpex OokalzuFpNaup8ud/B8v+TKHM+v61gyUNrpfeJGW3PC7targgyN16g4MdDGjk5RX6PZ aEVTrxOzqWNzqnvHmyCyBdCrQ9V1jM764F9/8nEm4duipA="/>
</cfdi:Complemento>
</cfdi:Comprobante>
Este es el sincfdi.xml:
Cita:
<?xml version='1.0' encoding='UTF-8' ?>
<Comprobante xmlns="http://www.sat.gob.mx/cfd/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:otro="http://www.sutanos.com.mx" xsi:schemaLocation="http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv22.xsd http://www.sutanos.com.mx http://www.walmartmexico.com.mx/AddendaKioscos.xsd" version="2.2" serie="BBCX" folio="834" fecha="2013-09-30T11:37:52" sello="iJkUxY5j+pV0fQvJ+HQf6VjD82GdxFMn3vDTpY41/iT/XnCnRtDaCZx4wNVtYLM3ttG0MMlR2+2iv7MK/CcZQJlckzWkCY/cTjDLNdnrIhy0zSBWLrmbO57E1u4JiBuiL9H2IzI+3PM0og78p 7iYjTZewn1LqCJyxsswW/Y+0yk=" noAprobacion="717321" anoAprobacion="2011" formaDePago="PAGO EN UNA SOLA EXHIBICION" noCertificado="00001000000300051202" certificado="uUcV3oSSf0AXI7QpZgqlsFZkAXEXtpL5vAKCd WwS5HYISgS4eaKJ4MwWCau9pGn2jBXQoh+77HatVw2h97hVhEk usZV95eRdwgKwl3oDVM8+eN8xpWNpFo96ILgK+EEH4hoD+ltXj 4htIu/4MLiwHI=" condicionesDePago="Inmediato" subTotal="147.66" total="171.30" metodoDePago="No Identificado" tipoDeComprobante="egreso" Moneda="MXN" TipoCambio="1.00" LugarExpedicion="RIO BLANCO, VERACRUZ" NumCtaPago="No identificado">
<Emisor rfc="NWM1234244W4" nombre="sutana tienda">
<DomicilioFiscal calle="nose" noExterior="78" localidad="adsds" municipio="sepasu" estado="nose" pais="MÉXICO" codigoPostal="02770" />
<ExpedidoEn calle="AVENIDA VERACRUZ" noExterior="26" localidad="LOS PINOS" referencia="CALLE 1 PINO Y CALLE 12" municipio="RIO BLANCO" estado="VERACRUZ" pais="MÉXICO" codigoPostal="234234" />
<RegimenFiscal Regimen="Régimen de Consolidación" />
</Emisor>
<Receptor rfc="SMe123311UT8" nombre="tiendita de la esquina">
<Domicilio calle="AVENIDA " noExterior="0" colonia="asd" localidad="asd" referencia="asd asd 11" municipio="asdasd" estado="asdasd" pais="MEXICO" codigoPostal="78567" />
</Receptor>
<Conceptos>
<Concepto cantidad="1.00" unidad="PIEZA" noIdentificacion="7501058753100" descripcion="LUSTRADOR" valorUnitario="44.83" importe="44.83"></Concepto>
<Concepto cantidad="1.00" unidad="PIEZA" noIdentificacion="7501071902950" descripcion="CLOROX 5.8" valorUnitario="32.67" importe="32.67"></Concepto>
<Concepto cantidad="1.00" unidad="PIEZA" noIdentificacion="7501032903880" descripcion="MR M CRISTAL" valorUnitario="16.55" importe="16.55"></Concepto>
<Concepto cantidad="1.00" unidad="PIEZA" noIdentificacion="7501026004600" descripcion="DETERGENTE" valorUnitario="16.29" importe="16.29"></Concepto>
<Concepto cantidad="1.00" unidad="PIEZA" noIdentificacion="7501058754180" descripcion="750105875418" valorUnitario="12.93" importe="12.93"></Concepto>
<Concepto cantidad="1.00" unidad="PIEZA" noIdentificacion="7501032915470" descripcion="MR M TIRAS" valorUnitario="10.26" importe="10.26"></Concepto>
<Concepto cantidad="1.00" unidad="PIEZA" noIdentificacion="7501032908660" descripcion="GLD MINIGEL" valorUnitario="8.53" importe="8.53"></Concepto>
<Concepto cantidad="1.00" unidad="PIEZA" noIdentificacion="7509546039150" descripcion="MFP 22ML" valorUnitario="5.60" importe="5.60"><Parte cantidad="0.00" descripcion="TICKET No: 515625824973273177759" /></Concepto>
</Conceptos>
<Impuestos totalImpuestosTrasladados="23.64">
<Traslados>
<Traslado impuesto="IVA" tasa="16.00" importe="23.64" />
</Traslados>
</Impuestos>
<Addenda>
<otro:InformacionAdicionalPuntoDeVenta />
</Addenda>
</Comprobante>
Espero me puedan ayudar y muchas gracias de antemano :).
  #2 (permalink)  
Antiguo 07/10/2013, 17:41
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Como identificar un xml con formato cfdi o cfd, en php

Bienvenido al foro.

Si es como lo entendí, podrías hacer algo así:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $sxe = new SimpleXMLElement ("tu.xml", null, true);
  4.  
  5. $namespaces = $sxe->getDocNamespaces();
  6.  
  7. if (array_key_exists('cfdi', $namespaces)) {
  8.     //funciones con cfdi
  9. } else {
  10.     //funciones sin cfdi
  11. }

http://www.php.net/manual/es/simplex...namespaces.php
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #3 (permalink)  
Antiguo 07/10/2013, 19:36
 
Fecha de Ingreso: octubre-2013
Mensajes: 13
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Como identificar un xml con formato cfdi o cfd, en php

Gracias la verdad es que ya me habia chutado el manual de php sobre simple xml pero no daba como sacarle los datos al objeto namespaces, O.o andaba buscando como sacarle el arreglo pero como casi no uso php no sabia de esa funcion array_key_exist... T.T gracias en cuanto acabe de hacer las pruebas publico el codigo :D para que le sirva a alguien mas.
  #4 (permalink)  
Antiguo 07/10/2013, 19:40
 
Fecha de Ingreso: octubre-2013
Mensajes: 13
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Como identificar un xml con formato cfdi o cfd, en php

Y lo prometido aqui esta el codigo para que se vea como funciona :D gracias a Andres por sus conocimientos y experiencia... -.- ya llevaba 4 dias haciendo eso y no daba como pensando que lo podia manejar de otra manera y fue de esa forma... el codigo abajo ;)...

Cita:
<?php

$xml = new SimpleXMLElement ("concfdi.xml",null,true);
$namespaces = $xml -> getDocNamespaces();

if (array_key_exists('cfdi', $namespaces)){
foreach ($xml -> xpath ('//cfdi:Comprobante//cfdi:Emisor') as $Emisor){
echo "yo leo con cfdi<br />";
echo $Emisor['rfc'];
echo "<br />";
echo $Emisor['nombre'];
echo "<br />";
echo "saliendo de leo con cfdi<br />";
}
}
else{
foreach ($xml -> Emisor as $Emisor){
echo "yo leo sin cfdi<br />";
echo $Emisor['rfc'];
echo "<br />";
echo $Emisor['nombre'];
echo "<br />";
echo "saliendo de leo sin cfdi<br />";
}
}
?>

Etiquetas: cfdi, fecha, formato, xml
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:27.