thegreenter / demo

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

Generar PDF de un XML ya generado #25

Closed thefantas closed 6 years ago

thefantas commented 6 years ago

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.

giansalex commented 6 years ago

El hash se obtiene a partir del XML, si la información es la misma probablemente el hash sea igual. talvez deberias cambiar ese metodo, y solo enviarle el hash del XML previamente generado, y evitar que vuelva a generarlo.

thefantas commented 6 years ago

Confirmado el hash es el mismo, entonces si regenero el proceso con los mismos datos el hash no cambia.

Hasta donde he podido comprobar getPdf($invoice) no coge el hash del XML como afirmas sino del de la clase $invoice, el cuál pude corroborar al crear un XML con el PDF y no se genera el XML sin antes enviarlo con $res = $see->send($invoice); Hasta ahora tengo dos opciones, generar el PDF leyendo los datos de la factura sin modificar (mantiene el hash) y volver a generar tanto XML, PDF y CDR. Se podrá hacer la transacción con la sunat ya teniendo el XML?

Saludos.

giansalex commented 6 years ago

Te refieres a enviar un XML ya generado?

thefantas commented 6 years ago

El mié., 22 de ago. de 2018 9:14 a. m., Giancarlos Salas < notifications@github.com> escribió:

Te refieres a enviar un XML ya generado?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/giansalex/greenter-sample/issues/25#issuecomment-415046613, or mute the thread https://github.com/notifications/unsubscribe-auth/ACr6Ws-8tKtlVISvWE540fi6t7IE215fks5uTWdEgaJpZM4WGx04 .

giansalex commented 6 years ago

Se puede realizar pero actualmente no hay un ejemplo, seria útil que podamos agregarlo.

thefantas commented 6 years ago

Tal vez directamente con la función de BillSender

    public function send($filename, $content)
    {
        $client = $this->getClient();
        $result = new BillResult();

        try {
            $zipContent = $this->compress($filename.'.xml', $content);
            $params = [
                'fileName' => $filename.'.zip',
                'contentFile' => $zipContent,
            ];
            $response = $client->call('sendBill', ['parameters' => $params]);
            $cdrZip = $response->applicationResponse;
            $result
                ->setCdrResponse($this->extractResponse($cdrZip))
                ->setCdrZip($cdrZip)
                ->setSuccess(true);
        } catch (\SoapFault $e) {
            $result->setError($this->getErrorFromFault($e));
        }

        return $result;
    }
giansalex commented 6 years ago

Asi es, solo que no hay el ejemplo, allí tendría primero que configurarse el cliente, con las credenciales y ruta del servicio.

thefantas commented 6 years ago

Con esto podemos crear XML y PDF sin enviar a Sunat, útil para las boletas, saludos.

        try {
            $pdf = $util->getPdf($invoice);
            $util->writePdf($pdf, $tmp_invoice.'.pdf');
            $res = $see->genXML($invoice);
            $util->writeXml($invoice, $see->getFactory()->getLastXml());
        } catch (Exception $e) {
            @$response_sunat['MESSAGE'] .= $e;
        }

FeFactory.php <-- Agregar

    public function genXML(DocumentInterface $document)
    {
        $this->lastXml = $this->getXmmlSigned($document);
    }

See.php <-- Agregar

    public function genXML(DocumentInterface $document)
    {
        $classDoc = get_class($document);
        $this->factory
            ->setBuilder($this->getBuilder($classDoc));

        return $this->factory->genXML($document);
    }
giansalex commented 6 years ago

Gracias @thefantas , seria utili si hicieras un fork, y realices los cambios en esos archivos de https://github.com/giansalex/greenter

thefantas commented 6 years ago

Y para enviar el xml ya generado sólo tienes que agregar y usar esta función.

$res = $see->sendForce($invoice, file_get_contents($ruta_XML));

FeFactory.php <-- Agregar

    public function sendForce(DocumentInterface $document, $dir_xml)
    {
        return $this->sender->send($document->getName(), $dir_xml);
    }

See.php <-- Agregar

    public function sendForce(DocumentInterface $document, $dir_xml)
    {
        $classDoc = get_class($document);
        $this->factory
            ->setBuilder($this->getBuilder($classDoc))
            ->setSender($this->getSender($classDoc));

        return $this->factory->send($document, $dir_xml);
    }

Saludos :)

thefantas commented 6 years ago

Ya lo modifiqué en el fork, saludos.