thegreenter / demo Goto Github PK
View Code? Open in Web Editor NEWEjemplos utilizando Greenter (UBL 2.1, SOAP, Firma digital, PDF, QR)
Home Page: https://greenter-sample.herokuapp.com
License: MIT License
Ejemplos utilizando Greenter (UBL 2.1, SOAP, Firma digital, PDF, QR)
Home Page: https://greenter-sample.herokuapp.com
License: MIT License
Saludos @giansalex,
Existe alguna forma de verificar ante la SUNAT el estado de los comprobantes emitidos (que no sea por la web de consulta validez)? ya que he podido darme cuenta que el ambiente de produccion no es tan estable como desarrollo y en algunos casos no se reciben las respuestas deseadas.
La SUNAT tiene disponibles 2 WS y no se si estan implementados en greenter
WS de consultas de validez y verificación de facturas electrónicas
https://e-factura.sunat.gob.pe/ol-it-wsconsvalidcpe/billValidService?wsdl
WS de consulta de CDR y estado de envío
https://e-factura.sunat.gob.pe/ol-it-wsconscpegem/billConsultService?wsdl
Buen dia, Esta excelente el soft que creastes
lo estado probando con xamp en mi laptop, uso windows 10 y corre de maravilla, pero cuando lo subo a mi hosting genera el xml, envia el xml, pero en el caso de generar el pdf me sale error
en la clase util
public static function getPathBin()
{
$path = DIR.'/../vendor/bin/wkhtmltopdf';
if (self::isWindows()) {
$path .= '.exe';
}
return $path;
}
como podria cambiar para solucionar ese error, porfavor si me das una mano con este tema de generacion del pdf
muchas gracias por tu colaboracion, paciencia, y tiempo
Cómo podría generar el PDF de una factura ya generada..
Digamos que el pdf se perdió, cómo lo vuelvo a generar?
try {
$pdf = $util->getPdf($invoice);
@$util->writePdf($pdf, $tmp_invoice.'.pdf');
} catch (Exception $e) {
var_dump($e);
}
Pero al ejecutar ese procedimiento cambiará el hash?
Saludos.
mi estimado vengo revisando tus librerias, y veo que envia directo a la sunat, hay alguna manera de guardarlo en formato xml y zip esas facturas ?
amigo donde puedo aprender como funcionan lo de las facturas exoneradas,gravadas, inafectas,con detraccion entre otras, se me hace complicado entender esos terminos y quisiera saber donde lo aprendiste o si pudieras darme algun link donde te expliquen eso por favor
public function getName()
{
return $this->company->getRuc().'-'.$this->getXmlId();
}
/**
* Get Id XML.
*
* @return string
*/
public function getXmlId()
{
$parts = [
'RA',
$this->getFecComunicacion()->format('Ymd'),
$this->getCorrelativo(),
];
return join('-', $parts);
}
Según el manual del programador SUNAT 2017 dice que la posición 16-23 del nombre del archivo enviado (y a la vez recibido R-) es el siguiente:
Fecha de la generación del archivo en formato
YYYYMMDD
Por lo que debería quedar así:
$parts = [
'RA',
$this->setFecGeneracion()->format('Ymd'),
$this->getCorrelativo(),
];
Y voided.php tiene dos fechas:
setFecGeneracion <-- Supuse que es la fecha en la que genera el documento de baja.
setFecComunicacion <-- La fecha del documento de baja (el día de la baja de los documentos).
¿Alguien puede aclarar qué significa setFecGeneracion y setFecComunicacion?
Saludos.
hola amigo, tengo una duda cuando se brinda "servicios" al momento de definir la unidad de medida para el comprobante electrónico cual se puede usar ? existe alguna restricción como "no aplica" o tiene que ser NIU o algo para servicios. cual seria ?
Como pueden ver en la documentaciónde PHP no debería tener efecto en el cliente SOAP porque siempre daría prioridad a la URL del fichero WSDL.
public function setService($url)
{
$this->client->__setLocation($url);
}
Llamar este método es opcional. El SoapClient utiliza la URL de conexión desde el fichero WSDL por defecto.
hola amigo, cuando se envia un comprobante puede ser aceptado, alertado o con error
object(Greenter\Model\Response\Error)#191 (2) { ["code":protected]=> string(4) "3103" ["message":protected]=> string(270) "El producto del factor y monto base de la afectación del IGV/IVAP no corresponde al monto de afectacion de linea. - Detalle: xxx.xxx.xxx value='ticket: 1540309566050 error: Error en la linea: 1 Tributo: 1000: 3103 (nodo: "cac:TaxSubtotal/cbc:TaxAmount" valor: "36.00")'" }
Respuesta SUNAT:
ID: F001-123
CODE:0
DESCRIPTION:La Factura numero F001-123, ha sido aceptada
No esta autorizado a enviar comprobantes bajo el formato UBL 2.0. El ruc: 00000000000 debe generar su comprobante en la version UBL 2.1...
EL DETALLE ES QUE ALGUNOS ERRORES CUENTAN COMO "VALIDO" Y NO PUEDES VOLVER A ENVIAR CON ESA SERIE Y NUMERACIÓN. ENTONCES ESO DA UN PROBLEMA A LA HORA DE DETERMINAR CUALES SI DEBEN ALMACENARSE EN LA BD Y CUALES NO(para que no afecte a la serie y numeración y normal funcionamiento).
YA QUE EL SISTEMA QUE PERSONALMENTE HICE SOLO ALMACENA SI SE CUMPLE:
if ($res->isSuccess()) {
PERO NO DETERMINA SI ES ERROR O NO, BASTA QUE HAYA RESPUESTA Y YA SIGUE LOS DEMAS PASOS(Y AHI ES DONDE FALLA)
ENTONCES A TODO ESTO MI PREGUNTA ES NO EXISTEN "CODIGOS" EN LAS RESPUESTAS PARA DETERMINAR CUALES DEBEN ALMACENARSE Y CUALES NO PARA EVITAR LOS ERRORES DE SERIE Y NUMERACION AUTOMATICO?
hola amigo, estoy tratando de cambiar la forma de envio de mis comprobantes por que me da muchos problemas enviarlos directamente.
genero y firmo correctamente el xml pero luego al querer enviarlo usando tu ejemplo:
$res = $see->sendXml(get_class($invoice), $invoice->getName(), file_get_contents($ruta));
la ruta la obtengo normal el detalle es en la variable "$invoice" hay alguna manera de obtener directamente los datos de esa variable del xml ya generado ?
Buenos días @giansalex , al momento de generar los resumenes la sunat me devuelve un ticket que lo consulto una hora después, ¿De qué manera puedo guardarlo sin tener que generar nuevamente todo el objeto del resumen?, adjunto foto de la función que dejaste de ejemplo.
Hola amigo me baje tu libreria de ejemplo y me sale los siguientes errores al consultar el envio de factura o cualquier otro elemento me sale este error:
Y al momento de querer generar el pdf me sale este otro error, recien estoy comenzando hacer las pruebas con la misma.
Aprovecho para agradecerte el gran trabajo que estas realizando y no dudes recibir mi donación cuand o termine mi proyecto y me caiga un billetito 👍
object(Greenter\Model\Response\Error)#948 (2) { ["code":protected]=> string(4) "2667" ["message":protected]=> string(238) "Importe total percibido debe ser igual a la suma de los importes percibidos por cada documento relacionado. - Detalle: xxx.xxx.xxx value='ticket: 1537280062772 error: INFO : 2667 (nodo: "Perception/cbc:TotalInvoiceAmount" valor: "10.00")'" }
Time: 00:00:05:626
https://github.com/giansalex/greenter-sample/blob/dbedc0257f0dd2afc7786b12191ee7bce2962cb4/examples/factura.php#L72
Hola ese isSuccess valida solo el retorno de la consulta a la SUNAT en 0 (osea sin errores, acecptando el documento), supongo que también las observaciones error>3999, ya que también son XML aceptados por la sunat y te devuelven un CDR con aceptación con errores.
Saludos.
cree un usuario secundario con los permisos para comprobantes electronicos, subi el certificado en formato .cer y cambie de ::FE_BETA A ::FE_PRODUCCION y al momento de querer generar me da este error:
"no tiene el perfil para enviar comprobantes electronicos"
hola @giansalex , estoy generando los xml y me di cuenta que me genera la fecha del dia siguiente. cbc:IssueDate2019-03-05</cbc:IssueDate>, que podria hacer para que me tome la fecha del dia??.
Hola Ginacarlos,
Estoy tratando de implementar la funcion getStatusCdr y aun no logro que funcione con tus clases.
$USER = 'XXXXXXX';//RUC Y USUARIO SUNAT
$PASS='XXXXXXXX'//CONTRASENIA
$wsClient = new SoapClient('https://e-factura.sunat.gob.pe/ol-it-wsconscpegem/billConsultService?wsdl');
//$wsClient->setService('https://e-factura.sunat.gob.pe/ol-ti-itcpfegem/billService');
$wsClient->setCredentials(USER,PASS);
$ExtService = new ExtService();
$ExtService->setClient($wsClient);
$cdr = $ExtService->getCdrStatus('20537897491','01','F001','1');
print_r($cdr->statusCdr);
y esto me devuelve error
Function ("setCredentials") is not a valid method for this service
ahora esto me funciona cuando envio el xml de ejemplo que indica sunat via la aplicacion SOAPUI
<soapenv:Envelope xmlns:ser="http://service.sunat.gob.pe" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
soapenv:Header
wsse:Security
<wsse:Username
Token>
wsse:UsernameXXXXXXXXXXXUSUARIO_SUNAT</wsse:Username>
wsse:PasswordXXXXXXXX</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
soapenv:Body
ser:getStatus
1028308796
01
f213
12345
</ser:getStatus>
</soapenv:Body>
</soapenv:Envelope>
Una consulta si de alguna manera perdí el ticket (ya sea por error del sistema o sunat) y cuando intento reenviar dice "2223 El archivo ya fue presentado anteriormente - El archivo ya fue presentado anteriormente" y al buscar dicho comprobante en la Sunat no existe.. ¿Qué medidas podría tomar?
Saludos.
tengo un codigo para convertir numero a letras para la leyenda de la factura
1203.89
1.- MIL DOSCIENTOS TRES CON 89/100 SOLES
2.- MIL DOSCIENTOS TRES CON OCHENTA Y NUEVE SOLES
mi consulta es si necesita si o si ser EL 1ro o tambien es aceptado como el 2do
Hola me manda este error talvez sea que soy principiante, pero me podria ayudar por favor
Una consulta @giansalex, el generador xml greenter, me genera esta etiqueta xml por ejemplo
<cbc:InvoiceTypeCode listID="0101">01</cbc:InvoiceTypeCode>
pero veo en otros xml y en el manual de la sunat que tiene unos datos adicionales por ejemplo:
<cbc:InvoiceTypeCode listID="0101"
listAgencyName="PE:SUNAT"
listName="SUNAT:Identificador de Tipo de Documento"
listURI="urn:pe:gob:sunat:cpe:see:gem:catalogos:catalogo01">01</cbc:InvoiceTypeCode>
La pregunta sería si de las 2 formas me la aceptaria la SUNAT en producción??
hola amigo, queria preguntarte algo, cuando emito boletas de venta, puedo poner al cliente receptor con ruc "000000000" y razon social "publico en general"? es decir me rechaza eso en modo producción o me acepta
hola amigo, ayudame con esto: al generar las boletas solo lo guardo en una bd para luego enviar el remunen diario: el problema es que al no enviar las boletas a sunat y no recibir el cdr no se si estan generadas correctamentes o tienen error como solucionaria eso, y las notas de debito o credito supongo que tampoco se envian y que se hacen en el resumen diario verdad ?
No sería mejor poner en false a Success cuando el code de un ticket no es 0 ó 99.
Porque en la actualidad devuelve contradicciones y se tiene que hacer muchas condicionales... en cambio con esa modificación cuando detecta el code en ese rango lo cambia el Success a false, lo mismo se podría aplicar a BillSender (hasta se podría leer el CDR y según su code volver a poner false) y CDRstatus.
$code = $status->statusCode;
$result
->setCode($code);
switch (true) {
case ($code == '0' || $code == '99'):
$result
->setSuccess(true);
if (!empty($cdrZip)) {
$result
->setCdrResponse($this->extractResponse($cdrZip))
->setCdrZip($cdrZip);
}
break;
case ($code == '98'):
$result->setError($this->getMessageError($code));
break;
case in_array($code, range(100 , 1999)): //excepción
$result->setError($this->getMessageError($code));
break;
case in_array($code, range(2000 , 3999)): //rechazo
$result->setError($this->getMessageError($code));
break;
}
// if ($code == '0' || $code == '99') {
// $result
// ->setCdrResponse($this->extractResponse($cdrZip))
// ->setCdrZip($cdrZip);
//}
Hola amigo, queria saber en que version de php esta desarrollado el proyecto, dado que lo probe en php 5.5 y 7.0 y en ninguna me corre
En php 5.5 me sale esto
Fatal error: Cannot use object of type DOMNodeList as array in C:\xampp\htdocs\factura\greenter-sample\vendor\greenter\ws\src\Ws\Reader\DomCdrReader.php on line 69
Time: 00:00:00:732
Y en php 7.0 en greenter-sample me sale esto
Ocurrío un error invocando el script
Time: 00:00:00:144
Gracias de antemano
Estimado, a que puede deberse el error cuando invoco a los documentos de Comunicación de Baja y Resúmenes:
En herokuapp:
"Ocurrío un error invocando el script
Time: 00:00:49:602"
El error también persiste en el localhost, estaba intentando comprender tus lineas pero algo falta en esos documentos:
Warning: Uncaught SoapFault exception: [HTTP] Error Fetching http headers in C:\xampp\htdocs\greenter-sample\vendor\greenter\ws\src\Ws\Services\SoapClient.php:61 Stack trace: #0 [internal function]: SoapClient->__doRequest('__soapCall('getStatus', Array) #2 C:\xampp\htdocs\greenter-sample\vendor\greenter\ws\src\Ws\Services\ExtService.php(33): Greenter\Ws\Services\SoapClient->call('getStatus', Array) #3 C:\xampp\htdocs\greenter-sample\vendor\greenter\greenter\src\Greenter\See.php(187): Greenter\Ws\Services\ExtService->getStatus('1528953679002') #4 C:\xampp\htdocs\greenter-sample\examples\comunicacion-baja.php(21): Greenter\See->getStatus('1528953679002') #5 {main} thrown in C:\xampp\htdocs\greenter-sample\vendor\greenter\ws\src\Ws\Services\SoapClient.php on line 61
Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\greenter-sample\vendor\greenter\ws\src\Ws\Services\ExtService.php on line 33
Time: 00:01:00:453
Gracias.
Saludos, estoy intentanto generar un xml de boleta pero me genera el archivo vacio, de que forma puedo hacer debug de este proceso ya que no me muestra ningun error de php y para la facturas si funciona sin problemas.
hola amigo, no se si solo a mi me ocurre, pero ya actualice a 2.1 y cuando le doy a enviar en modo producción otra vez me dice:
Error: No tiene el perfil para enviar comprobantes electronicos - Detalle: Rejected by policy.
y ese error ya lo había corregido(no toque nada de las credenciales)
amigo investigue y no encuentro una respuesta a esto
las notas de credito y debito de boletas de venta las genero y envio a sunat, pero investigando descubri que se deben enviar en el resumen diario, y yo los enviava como si fueran notas de credito o debito de facturas osea directamente a sunat, y normal sunat me aceptaba.
esta mal lo que estoy haciendo ?
Seguirá funcionando cuando se tenga que aplicar esto:
error Argument 1 passed to $util->getResponseFromCdr() must be an instance of Greenter\Model\Response\CdrResponse, null given.
$see = $util->getSee(SunatEndpoints::FE_PRODUCCION);
$res = $see->send($sum);
$util->writeXml($sum, $see->getFactory()->getLastXml());
if ($res->isSuccess()) {
/**@var $res \Greenter\Model\Response\SummaryResult*/
$ticket = $res->getTicket();
$result = $see->getStatus($ticket);
if ($result->isSuccess()) {
$cdr = $result->getCdrResponse();
$util->writeCdr($sum, $result->getCdrZip());
echo $util->getResponseFromCdr($cdr);
} else {
var_dump($result->getError());
}
} else {
var_dump($res->getError());
}
Hay alguna manera de usar wkhtmltopdf en un hosting o necesariamente necesito un vps?
Encontré un binario de wkhtmltopdf pero no tiene la última versión.
Hola @giansalex, creo que en el README.md se debería incluir como paso adicional activar la extensión php_soap.dll en el fichero php.ini. Prové con Xampp y Laragon y no tenian activada esa extensión por defecto.
llevo dias intentando crear las facturas,firmarlas,enviarlas desde un formulario y nada :''(
hola amigo, debido a las diferencias que hay en beta y producción estoy haciendo "pruebas solo en produccion", acabo de enviar una factura y al querer darle de baja me sale este error:
Fatal error: Uncaught TypeError: Argument 1 passed to Util::getResponseFromCdr() must be an instance of Greenter\Model\Response\CdrResponse, null given, called in C:\xampp\htdocs\mvc\models\facturas_model.php on line 106 and defined in C:\xampp\htdocs\mvc\src\Util.php:46
al parecer hay una respuesta pero con el script que tengo no logro capturarlo (no se si es succes o no o es succes false o true).
en este caso como obtendria esa respuesta ?
public function generar_baja($RA)
{
$util = Util::getInstance();
// Envio a SUNAT.
$see = $util->getSee(SunatEndpoints::FE_PRODUCCION);
$res = $see->send($RA);
if ($res->isSuccess()) {
$ticket = $res->getTicket();
$result = $see->getStatus($ticket);
if ($result->isSuccess()) {
$cdr = $result->getCdrResponse();
$nexus = "|".$util->getResponseFromCdr($cdr); - > aca da el error
$this->sms = "correcto".$nexus;
Util::writeXml($RA, $see->getFactory()->getLastXml());
$pdf = $util->getPdf($RA);
$util->showPdf($pdf, $RA->getName().'.pdf');
Util::writeCdr($RA, $result->getCdrZip());
} else {
$this->sms = $ticket."|".$nexus;
}
}else {
$this->sms = $res->getError()->getMessage();
}
return $this->sms;
}
amigo disculpa la ignorancia, en la carpeta cache esta el html que pasa a convertirse en pdf ? mi duda es ese cache solo se genera una vez para cada tipo de comprobante ? si lo edito eso, saldra asi todos los comprobantes de ese tipo ? (osea si edito el cache de facturas, todas las facturas me saldran asi o se volveran a generar esos archivos cache al generar nueva factura)
hola he intentando enviar a la sunat y me mando este error
object(Greenter\Model\Response\Error)[115]
protected 'code' => string 'env:Client' (length=10)
protected 'message' => string 'Internal Error' (length=14)
2.7.2 Para consulta de CDR en producción de Resumen Diario o
Comunicación de Baja o Resumen de Reversiones o Lotes de Facturas.getStatus (del ticket), este método recibe los datos de un ticket como
parámetro y devuelve un objeto que indica el estado del proceso y en caso de
haber terminado, devuelve adjunto el CDR.
Según el manual del programador con el método getstatus()
$result = $see->getStatus($ticket);
print_r($result);
Debo obtener el CDR de la comunicación de baja, pero esto nunca ocurre, solo me devuelve "0004La constancia existe" (aún cuando tengo la certeza de que el documento ha sido aceptado).
¿Me estoy perdiendo de algo?
Saludos
hola amigo, cuando utilize una nota de credito o debito para modificar una factura, esta factura se puede dar de baja o ya no tiene valor por que se modifico y tendria que dar de baja la nota de credito o debito(que pasa si doy de baja esa factura que fue modificada)?
hola amigo, lo subi al servidor y me da este error:
[17-Oct-2018 18:40:20 America/Lima] PHP Fatal error: Class 'ZipArchive' not found in /home/letgeahummhj/public_html/vendor/greenter/ws/src/Zip/ZipFileDecompress.php on line 28
en localhost funciona normal.
amigo si quiero guardar el xml sin firmar como seria?
hola amigo, que pasa o que se debe hacer cuando no se envian algunas boletas, mas especificamente resumenes diarios de algunos dias.
se estuvieron enviando resumenes diarios todos los dias y en algunos dias se enviaba pero no habia cdr(por error de sistema) y no fueron declarados ahora de eso ya pasaron mas de 15 o 20 dias, que se hace con esas boletas que no fueron enviadas ya que la numeración continuo y se "salteo" algunas boletas
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.