Post


Sobre la Factura electronica de SUNAT

Ante todo no fue dificil, pero si agobiante. Dificil seria ponerme hacer calculo tras calculo para obtener una respuesta a una pregunta desconocida.

Sobre la facturacion electronica hay muchos datos, no del Peru, pues podriamos ser los ultimo en implementar.

Mi idea fue simple, ya no queria mandar hacer mas impresiones de comprobante de pago, si no directamente de la computadora, y le mando el Link al cliente, asi que cuando hace 3 años escuche que se estaba implementando, me dije a mi mismo que seria uno de los primero en tener facturacion electronica.

Las cosas no son como debieron serlo, me mude supuestamente a un lugar mejor y mas tranquilo, grave error, si tu alguna vez pensaste que en La Molina todo es bonito, te equivocas, yo ya tenia referencia que aqui la gente era muy osca, aspera, sobre todo cuando era estudiante y por casualidad me tocaba pasar por la Molina, simplemente eran horribles, la verdad ahora se por que lo son. Pero no todos felizmente, solo los que vienen a vivir aqui con plata de procedencia dudosa.

Por eso a mi tambien me entusiasma mucho la facturacion electronica, simplemente es mas dificil hacer lo que habitualmente hace la gente indecente hace, lavar dinero.

Pero como dije, pesaba comensar en el 2014, paso 2015, y recien me puse las pilas en Enero del 2016. Realmente perdi tiempo y oportunidades todo por la culpa de unos vecinos  feos que tengo.

Por que para mi me resulto facil la implementacion, yo ya tenia operando un sistema electronico para la llevada de boletas y factura, asi como el llenado de libros. Lo de libros electronicos fue un paseo, por que ya lo tenia implementado, simplemente era adecuar a los requerimiento de la SUNAT para el correcto formato, ha ser validado por su aplicativo "PLE". Alli no tenia nada que ganar, tenia el sistema pero sin otras cosas, dificilmente podria ofrecer mi sistema a otras personas, simplemente el mio es muy diferente y basico, pues mi negocio lo mantengo muy basico. Emito Facturas, Boletas, anoto a veces DUA, Exportafacil, y un libro sobre el envio y recepcion de productos ya sea para comercializacion o uso propio, en general me gusta solo vender electrones.

Me topo entonces con la tarea de adecuar mi sistema a los requerimientos de la SUNAT, primero he dicho que mantenia todo basico, pero luego la Sunat hace requerimientos, como descuentos parciales, descuentos globales, codigo de producto(yo ya lo tenia, pero no se visualizaba), clase de impuesto aplicados, alli es donde me detuve por algun tiempo.

Deberia o no hacer el impuesto selectivo al consumo ISC, es decir si pensaria en vender un producto con ISC simplemente no lo haria, es muy complicado. Asi que me quede pensando. Despues de 2 semanas decidi que deberia implementarlo, aun cuando yo no lo use, pero si agregaria valor agreado a mi sistema.

La Reforma fue agobiante, no dificil, pues debia ver se bonito a mi vista. Despues de pasar muchas horas, dias, y hasta 2 semanas, pense que ya tenia mi primer documento de pago listo, La Factura electronica, ahora era tiempo de indagar como deberia enviarlo. Sin embargo la documentacion es mediocre y casi no dice nada.

Al final me doy cuenta que ellos(los de la SUNAT) esperan a que uses alguna libreria para adecuar los XML a sus requerimiento, para quien no sepa el XML es un archivo de texto que tiene varios tag, y basicamente indica a algunos programas como deben procesar la data.

Primero punto: Fue la adecuacion tremendamente agobiante, pero al final lo hice(esperen que no acabo aqui).

Segundo punto: resolver el DigestValue, SignatureValue, X509SubjectName, X509Certificate.

En lo que son X509, en eso si estaba muy atrasado con respecto a otras personas, no sabia, o sabia poco, hace bastante tiempo debia haber implementado los certificados para que mis sitios sean seguros, para que me entiendan de http a https. Pero de que seguridad estamos hablando, bueno de que ahora nadie deberia leer lo que uno esta escribiendo o leyendo, por que la informacion en servidores https viaja encriptada.

Alli me demore en saber mas acerca de los certificados, y bueno como no sabia mucho, me temia que te todas maneras deberia usar algunas librerias para implementar, mas tarde me doy cuenta que no fue necesario.

Ahora el DigestValue, pero que es eso?, la informacion de la Sunat es simplemte y basicamente; un archivo XML generado sin los tag de la firma,  y a eso se le hace un hash.

El hash se hace con sha1() en php, y es transformar mediante ecuaciones matematicas en este caso un archivo de 3000 a 5000 byte a una variable(la palabra seria constante) de apenas unas decenas de datos algo asi como byte parity, o una comprobancion que se usa para la transmision de datos, que en este caso se usa para verificar la no variacion de la data. Es curioso, si uno lo pone a pensar, tratan a la manipulacion de la data(por el hombre en el medio) como una perturbacion mas.

Pero alli viene el problema, antes de hacer el hash, debes canonizar el archivo XML. que no es mas que adecuarlo a ciertos criterios establecidos, o lo haces mirando cuales son esos criterios o usas una funcion en php que lo hace por ti, C14N que es una funcion de un objeto DOM.

Esto por cierto no te lo dicen, debes convertirlo en hexagecimal el hash calculado, y luego pasarlo a base 64 que en php seria base64_encode.

Alli obtienes el digest, seguro que ahora pensaras dos veces antes de usar una libreria sabiendo que no era tan dificil obtenerlo, me tomo dos horas de buscar informacion y quede agotado, solo por no ser claros con respecto a eso.

Ahora el SignatureValue. se obtiene de esta forma, desde los tag que contiene signature, incluido el DigestValue calculado anteriormente, le haces una canonizacion, depues tienes que firmarlo con el certificado que comprastes, y luego lo pasas a base64.

Asi es el SignatureValue fue mas dificil por que confie en lo que decia un sitio web que parecia bien documentado pero que despues me doy cuenta que solo usaban un programa cuyo codigo fuente tambien ofrecen para hacer el calculo, tuve que convertir el codigo fuente de visual basic a php para entenderlo, eso tambien fue dificil, aun cuando te podria sorprender de por que no se visual basic, simplemente me oxide, pues no tengo el compilador desde hace 20 años.

De aqui vino la parte mas agobiante, los envios interminables para obtener una respues como lo indica la SUNAT. Yo obteneia primero error 500, es decir un error grave en la parte de servidor, me demore 2 o 3 dias en enterarme que asi responde el servidor SOAP ante las excepcion, bueno lo hicieron en java seguramente.

No sabia por que no me salia algun error conocido hasta que pude encontrar una relacion de numeros, SOAP-ENV.Server.0158, el ultimo numero 0158 si esta documentado, pero lo esperaba en otro formato, tal como lo indica en los documentos de la Sunat, asi que perdi tiempo, en reformar y reformar el codigo hasta darme cuenta que ya el servidor me estaba respondiendo en forma adecuada, pero no esperada, yo esperaba exito.

Como obtenia SOAP-ENV.Server.0158, SOAP-ENV.Server.0300, hasta que me salio un error en el formato esperado el 0100. Asi que bueno como dije perdi tiempo.

Lei mucho, alguien habia publicado que el PHP simplemente no puede enviar archivos ZIP a servidores SOAP., el PHP en los objetos SOAP no puede manejar archivos binarios, y que se debe convertir a base64 antes de usarlo...............que no esta implemada bien la transferencia de archivos binarios en los objetos SOAP de php.

iw3h3893d3d3dh3          deberia ir asi

o asi

Como me podran entender perdi tiempo, solo por que los errores que esperaban no estaban en el formato que indica la SUNAT.

De todo lo anterior, los objetos SOAP de PHP si manejan archivos binarios, y estos automaticamente son convertidos a base64, es decir no es necesario ni aconsejable hacer la transformacion.

Despues de darme cuenta que si obtenia respuesta del servidor, me quedaba con la duda si tenia algo que ver con el ZIP enviado, asi que empese a probar con la lectura de los ticket getStatus, y obtuve una respuesta esperada.  El ticket no existe, asi que para ese entonces sabia que el SOAP client de PHP funcionaba bien con todo y sus credenciales.

Obtuve un error 0306, que significa que el archivo no puede leerse, y nuevamente me preguntaba si era el ZIP, asi que copia el ejemplo que daba la Sunat y en el servidor beta, lo mande, y me dio un satisfactorio.

Basicamente mi problema era el orden de los tag, aqui debe ser bien ordenado, pues poner primero un sac:additionalproperty antes que un sac:additionalmonetarytotal es suficiente para que el pobre servidor SOAP en Java no pueda parsearlo(leerlo)

Y luego el otro error era la fecha necesariamente debe ser de esta forma 2016-01-28, no puede ser 2016-1-28 ni menos 16-1-28, muy duro su servidor. Si no, da error  que no puede leer el XML.

Despues de haber superado esto, no me da mas errores. Ahora falta saber si las credenciales y las operaciones funcionan.

Sin embargo despues de esperar a que sea un Lunes, un dia muy temidos por algunos(aquellos que veiamos Garfield), no les falta razon para no soportarlo. Me estrello con la realidad peruana, no es la implementacion o lo que tu sepas de programacion lo mas dificil de sortear si no el costos muy elevado de un archivo de 1000 o 2000 bytes, de los llamados certificados que uno debe comprar y no debe hacerse en cualquier parte si no en los "designados" por el estado peruano. Es decir si tu pensabas en usar un certificado gratis de Cacert.org te equivocaste.

Si alguien no sabe o piensa que un certificado es muy dificil de obtener, la verdad no es asi. Son un par de instrucciones que uno da, para obtener ese certificado que en algunos sitios de internet lo puedes obtener en forma online, supuestamente el alto costo es por que ellos verifican que tu eres tu, y no otra persona

Todo!!! regulado en la Ley 27269, a la empresa a la que compres el certificado debe ser reconocida por Indecopi.

Para la gente que no es del Peru se preguntaran y cuanto es eso, el costo es cercano a los 100 USD por unos 1000 byte de informacion, y solo para ser usado en el firmado de los archivos que uno envia a la Sunat. es decir o sacas de tu bolsillo 100 USD por año a pagar por unos 1000 byte, o te acostumbras a simpre logearte a la SUNAT para emitir tus facturas y boletas, creo que uno siempre puede acostumbrarse a lo que sea. Es algo parecido a conducir en el Peru, mientras que un conduce y lo hace responsablemente, basta que cruces la linea amarilla para que te pongan multa, mientras que otros hasta son buscados por la SUNAT y no les pasa absolutamente nada.

Sin embargo para mi no es opcion no puedo perder tiempo en eso, es simplemente eso. Ya mucho tiempo me toma usar el PLE para enviar mis libros electronicos a la SUNAT(algo que tambien debio ser implementado algun API para hacer desde los propios sistemas del contribuyente), y encima estar al pendiente de algun pago en Linea e inmediatamente hacer la respectiva factura, en vez de esta se haga en forma automatica, no es una opcion. Por que los libros no lo hago manualmente?, primero no es cualquier cosa, basta que te equivocaste en algun numero o algun nombre, para que la hoja entera no sirva, y tienes que volverla a escribir, lo de los libros electronicos aun con todo es un alivio.

En otras partes del mundo lo de las firma electronicas para los contribuyentes es alentado, pues se desea facilidad a las personas, aca se lo ve como un negocio.

Claro, si una empresa esta acostumbrada a pagar hasta por el aireacondicionada en sus locales, el costo de una firma electronico le resulta ridiculo, verdad.

Opciones, y si varios negocios se juntan?, la respuesta es no. La firma digital debe contener informacion del contribuyente a si como de la persona responsable, en el area de SUBJECT, el OU debe estar el RUC, O debe estas la razon social o en mi caso el nombre completo, en el CN(y no esta muy claro) que normalmente va el dominio de un sitio de internet, debe ir el nombre de la persona responsable del certificado. El DNI de esa persona no se donde ve, ni tampoco se si lo estan poniendo.

Con respecto a lo anterior, si se permite que empresas usen sus certificados para firmar los documentos de otros contribuyentes, algo asi como una tercerizacion, que seria una buena alternativa, hasta que uno lee que requisitos tienen que tener esas empresas para dar ese tipo de servicio, uno de esos requisitos es tener un activo o un capital a nombre de la empresa de medio millon de soles, con eso, tengo la seguridad que sus servicios no seran nada baratos.

Una ultima opcion es juntarse(como lo harias para hacer una empresa) y constituir una empresa que emite certificados digitales reconocidos por el estado peruano, pero requiere de inspecciones que de Indecopi, que segun he leido el costo de cada inspeccion es de 3600 soles. Ademas al parecer necesitas algun respaldo del exterior, de alguna AC reconocida mundialmente, es decir algo no tan facil.

Queda solo pagar, asi significa un costo oneroso y desproporcionado, pero igual debe ser asi, por que estamos en el Peru.

 



INICIO ---------------------------------------------------------------------------------------------------------------------------