thegreenter / demo

Ejemplos utilizando Greenter (UBL 2.1, SOAP, Firma digital, PDF, QR)
https://greenter-sample.herokuapp.com
MIT License
60 stars 52 forks source link

dudas y consultas #13

Closed abelnexus closed 6 years ago

abelnexus commented 6 years ago

hola amigo tengo algunas dudas que quisiera me ayudaras: primero en nota_credito ese esta variable ->setCodMotivo('07')

se refiere a esto? captura

abelnexus commented 6 years ago

el otro seria en $legend $legend = new Legend(); $legend->setCode('1000') ->setValue('SON CIEN CON 00/100 SOLES');

ese setcode(1000) es determinado ?

abelnexus commented 6 years ago

el otro seria si quiero ser emisor electronico escuche que sunat te pide el certificado digital y su clave pero el certificado que usamos con extension .pem no requiere clave como se hace en ese caso y que y como solicito a sunat para ser emisor

abelnexus commented 6 years ago

otro seria en el codigo qr de la representacion impresa debe ir ese contendio? cuando lo escaneo me bota los atributos de la factura como en un texto plano. y tambien escuche que se debe enviar a su correo del cliente la representacion impresa

giansalex commented 6 years ago
abelnexus commented 6 years ago

entonces el codigo motivo solo es '07' y '08 ?'

abelnexus commented 6 years ago

->setTipoDoc('07') este si se que es 07 por que es nota_credito ->setCodMotivo('07') estaba seguro que era ese cuadro que te meustro arriba

giansalex commented 6 years ago

el código motivo puede ser de 2 listas, para NCR es del catalogo 9 y para NDB es del catalogo 10

abelnexus commented 6 years ago

amigo como saco el status o descripcion de un xml ya creado (la factura nro f001-000001 ha sido aceptada) y mostrarlo con un echo

giansalex commented 6 years ago

Esa respuesta se obtiene del xml de respuesta que te devuelve sunat (dentro de zip - CDR), para ello puedes usar

$path = __DIR__ . '/R-20600995805-01-F001-1.xml';
$xml = file_get_contents($path);
$reader = new DomCdrReaderInterface();
$cdr = $reader->getCdrResponse($xml);

echo $cdr->getDescription();

DomCdrReaderInterface forma parte de greenter/ws el cual ya esta incluido en greenter

abelnexus commented 6 years ago

stoy usando estas clases use Greenter\Model\DocumentInterface; use Greenter\Model\Response\CdrResponse; y no me reconoce el 'DomCdrReaderInterface'

giansalex commented 6 years ago

Disculpa el namespace es este:

use Greenter\Ws\Reader\DomCdrReaderInterface;
abelnexus commented 6 years ago

no entiendo que esta mal este es el codigo <?php include '../vendor/autoload.php';

use Greenter\Ws\Reader\DomCdrReaderInterface;

$path = DIR.'../files/R-20491037785-01-F001-000112.xml'; $xml = file_get_contents($path); $reader = new DomCdrReaderInterface(); $cdr = $reader->getCdrResponse($xml);

echo $cdr->getDescription(); ?>

abelnexus commented 6 years ago

y este el error captura

abelnexus commented 6 years ago

y este el archivo que quiero abrir captura

giansalex commented 6 years ago

el codigo que te mostre es explicitamente para obtenerlo de un XML no de ZIP, el codigo completo seria este.

use Greenter\Ws\Reader\DomCdrReaderInterface;
use Greenter\Zip\ZipHelper;

$path = DIR.'../files/R-20491037785-01-F001-000112.zip';
$zip  = file_get_contents($path);
$helper = new ZipHelper();
$xml = $helper->decompressXmlFile($zip);

$reader = new DomCdrReaderInterface();
$cdr = $reader->getCdrResponse($xml);

echo $cdr->getDescription();
abelnexus commented 6 years ago

ya salio gracias papi :D

abelnexus commented 6 years ago

D: amigo como evito que me muestre el mensaje de error captura

abelnexus commented 6 years ago
              <?php

$path = 'files/R-20491037785-01-'.$valor['serie'].'-'.$valor['numeracion'].'.zip'; if(isset($path)){ $zip = file_get_contents($path); $helper = new ZipHelper(); $xml = $helper->decompressXmlFile($zip);

$reader = new DomCdrReaderInterface(); $cdr = $reader->getCdrResponse($xml);

echo $cdr->getDescription(); } else{ echo 'no existe respeusta'; }

?>

abelnexus commented 6 years ago

ya lo solucione amigo: <?php

$path = 'files/R-20491037785-01-'.$valor['serie'].'-'.$valor['numeracion'].'.zip'; if(file_exists($path)){ $zip = file_get_contents($path); $helper = new ZipHelper(); $xml = $helper->decompressXmlFile($zip);

$reader = new DomCdrReaderInterface(); $cdr = $reader->getCdrResponse($xml);

echo $cdr->getDescription(); } else{ echo 'no existe respeusta'; }

?>

abelnexus commented 6 years ago

ahora si bien me muestra que se envio se puede saber si tiene errores o falta enviar ?

abelnexus commented 6 years ago

pero eso tendria que ir directo al xml verdad ?

giansalex commented 6 years ago

esa información de estados debes alojarla en la base de datos, cuando envias recibes la respuesta, si fue aceptada, tiene errores o es rechazada. De alli actualizas el estado de la venta.

abelnexus commented 6 years ago

si pensaba hacer eso pero al momento de recibir el error solo me mustra objet objet nada mas: $this->sms = $util->getResponseFromCdr($cdr);
} else { $this->sms = $res->getError();

abelnexus commented 6 years ago

solo me muestra ese error captura

giansalex commented 6 years ago

es que ambos te devuelven un object, en el primero debes obtener $util->getResponseFromCdr($cdr)->getDescription(); y del error $res->getError()->getMessage();

abelnexus commented 6 years ago

:o amigo donde aprendiste a programar o como sabes tanto, que debo leer para saber estas cosas

giansalex commented 6 years ago

Lo normal - de libros, cursos, tutoriales.

Tambien es bueno usar un buen IDE, por ejemplo para php uso PhpStorm de esa forma no tienes que buscar documentación, los metodos hablan por si solos. Y ya que greenter no tiene un documentación general aun, esto es una buena ayuda. image

Ya puse la primera piedra para la documentación en esta pagina https://giansalex.github.io/greenter/

abelnexus commented 6 years ago

seguir estudiando duro entoces :D gracias

abelnexus commented 6 years ago

hola amigo una duda para las facturas que son mayores de 700 tiene que haber detracción o retencion creo es eso se debe programar tambien al momento de crear la factura ?

giansalex commented 6 years ago

la detracción se aplica cuando tiene servicios, la retención depende si la empresa es agente de retención.

abelnexus commented 6 years ago

de lo que estoy haciendo es prestacion de servicios como aplico esa detraccion en mi factura (solo si es mayor de 700 el monto) debo sacarle el mondot de detraccion o solo envio el monto total y sunat ya ve que hace ?

giansalex commented 6 years ago

hay un campo para la detraccion.

$invoice = new Invoice();
$invoice->setDetraccion((new Detraction())
    ->setMount(2228.3)
    ->setPercent(9)
);
abelnexus commented 6 years ago

hola amigo las notas de debito y credito son para facturas y boletas ?

abelnexus commented 6 years ago

que es 'Nro.R.I. Emisor: 212321' ? '

giansalex commented 6 years ago

Es la resolución de Sunat que te autoriza como Emisor Electronico

abelnexus commented 6 years ago

amigo como hago para que windows.open(url) funcione despues de 5 seg ?

giansalex commented 6 years ago
setTimeout(function(){ 
windows.open(url);
}, 5000); // 5000 ms
abelnexus commented 6 years ago

hola amigo gracias funcione en window.open ahora tengo un problema mayorrrrr: ya resulta que si puedo abrir el pdf pero no es dinamico

abelnexus commented 6 years ago

tengo este codigo $(".frm-ventas").submit(function(event) { event.preventDefault(); var url = $(this).attr('action'); var data = $(this).serialize(); $.ajax({ type:'POST', dataType:'json', url:url, data:data, success:function(response){ $('#caja').toggle(); $("span").remove( ".mensaje" ); $("i").remove('.glyphicon'); $("#caja").fadeOut(5000);

            if (response.respuesta == true) {
                $(".box-pago").hide();
               setTimeout(function(){ 
              window.open("examples/report/factura.php");
               }, 5000); // 5000 ms                  
                $('#caja').removeClass('alert-danger').addClass('alert-info');
                $("#caja").append("<i class='glyphicon glyphicon-info-sign' aria-hidden='true'></i>");
                $("#caja").append("<span class='mensaje'>"+" RESPUESTA SUNAT: "+response.mensaje+"</span>");
                $('.cargando').toggle();
                $('.cargando p').html('Limpiando el carrito...');
                setTimeout(llenar_tabla_json, 2000);
                limpiarformulario($(".frm-ventas"));

            }else{
                $('#caja').removeClass('alert-info').addClass('alert-danger');
                $("#caja").append("<i class='glyphicon glyphicon-exclamation-sign' aria-hidden='true'></i>");
                $("#caja").append("<span class='mensaje'>"+" Error: "+response.mensaje+"</span>");
            }
        },error:function(){
            alert("Ha ocurrido un error");
        }
    });
});
abelnexus commented 6 years ago

captura el momento de enviar el submit y me bota el mensaje de confirmacion y eso ahora $invoice->setDetails($items) ->setLegends([$legend]);

                        $mensaje = $this->model->generar_factura($invoice);
                        $mensajeError = $mensaje;

alguna manera de enviar esa variable $invoice mediante el codigo de arriba y asi sea dinamico el pdf ?

abelnexus commented 6 years ago

Fatal error: Uncaught TypeError: Argument 1 passed to Util::getPdf() must be an instance of Greenter\Model\DocumentInterface, string given, called in C:\xampp\htdocs\invoice\examples\report\factura.php on line 9 and defined in C:\xampp\htdocs\invoice\src\Util.php:74 Stack trace: #0 C:\xampp\htdocs\invoice\examples\report\factura.php(9): Util->getPdf('[object Object]') #1 {main} thrown in C:\xampp\htdocs\invoice\src\Util.php on line 74

giansalex commented 6 years ago

Segun el error estas pasando un string en vez de un object (Invoice por ejemplo)

abelnexus commented 6 years ago

este codigoe stoy usando amigo

require DIR . '/../../vendor/autoload.php';

$data = $_GET['invoice']; $util = Util::getInstance();

    $pdf = $util->getPdf($data);
    $util->showPdf($pdf, $data->getName().'.pdf');
abelnexus commented 6 years ago

y este es la url localhost:82/invoice/examples/report/factura.php?invoice=[object%20Object]

giansalex commented 6 years ago

de donde obtienes $data, en la url envias invoice=[object%20Object], ese valor no debe ser valido, que valor pretendes enviar en invoice.

abelnexus commented 6 years ago

$data es la variable que captura por get la variable invoice que envie desde ajax

abelnexus commented 6 years ago

pretendo enviar la variable $invoice

                           $client->setTipoDoc('6')
                              ->setNumDoc(trim($_POST['ruc']))
                              ->setRznSocial(trim($_POST['cliente']))
                              ->setAddress((new Address())
                              ->setDireccion(trim($_POST['direccion'])));
                              // Emisor
                       $address = new Address();
                       $address->setUbigueo($ubigeo)
                              ->setDepartamento($departamento)
                              ->setProvincia($provincia)
                              ->setDistrito($distrito)
                              ->setUrbanizacion($urbanizacion)
                              ->setDireccion($direccionempresa);

                       $company = new Company();
                       $company->setRuc($rucempresa)
                              ->setRazonSocial($razonempresa)
                              ->setNombreComercial($nombre_comercial)
                              ->setAddress($address);
                              // Venta

                       $invoice = new Invoice();
                       $invoice
                              ->setFecVencimiento(new DateTime())
                              ->setTipoDoc($tipo_documento)
                              ->setSerie(trim($_POST['serie']))
                              ->setCorrelativo(trim($_POST['numero']))
                              ->setFechaEmision(new DateTime())
                              ->setTipoMoneda(trim($_POST['pago']))
                              ->setClient($client)
                              ->setMtoOperGravadas($gravadas)                                
                              ->setMtoIGV($importeIGV)
                              ->setMtoImpVenta($importe)
                              ->setCompany($company);
                               $leyenda = trim($_POST['total']);
                       $centimos = substr($leyenda, -2);
                       $legn = validar::convertir($leyenda,'CON '.$centimos.'/100 SOLES');                          
                       $legend = new Legend();
                       $legend->setCode('1000')
                              ->setValue($legn);

                       $invoice->setDetails($items)
                              ->setLegends([$legend]);
giansalex commented 6 years ago

para enviar objetos complejos deberias enviarlos por POST

abelnexus commented 6 years ago

lo envio de esta manera amigo: $salidaJson=array('respuesta' => $mensajeOk,'mensaje' => $mensajeError, 'invoice' => $invoice); echo json_encode($salidaJson);

abelnexus commented 6 years ago
$(".frm-ventas").submit(function(event) {
    event.preventDefault();
    var url = $(this).attr('action');
    var data = $(this).serialize();
    $.ajax({
        type:'POST',
        dataType:'json',
        url:url,
        data:data,
        success:function(response){
            $('#caja').toggle();
            $("span").remove( ".mensaje" );
            $("i").remove('.glyphicon');
            $("#caja").fadeOut(5000);

            if (response.respuesta == true) {
                $(".box-pago").hide();
               setTimeout(function(){ 
               window.open("examples/report/factura.php?invoice="+response.invoice);
               }, 5000); // 5000 ms                  
                $('#caja').removeClass('alert-danger').addClass('alert-info');
                $("#caja").append("<i class='glyphicon glyphicon-info-sign' aria-hidden='true'></i>");
                $("#caja").append("<span class='mensaje'>"+" ok: "+response.mensaje+"</span>");
                $('.cargando').toggle();
                $('.cargando p').html('Limpiando el carrito...');
                setTimeout(llenar_tabla_json, 2000);
                limpiarformulario($(".frm-ventas"));

            }else{
                $('#caja').removeClass('alert-info').addClass('alert-danger');
                $("#caja").append("<i class='glyphicon glyphicon-exclamation-sign' aria-hidden='true'></i>");
                $("#caja").append("<span class='mensaje'>"+" Error: "+response.mensaje+"</span>");
            }
        },error:function(){
            alert("Ha ocurrido un error");
        }
    });
});