Jump to content

[solucionado] Personalizar la factura PDF para incluir el monto total en letras


Recommended Posts

Buenas,

Estoy intentando personalizar las facturas PDF generadas por mi tienda Prestashop 1.7 para incluir el monto total a pagar en letras (en francés), lo cual es un requisito legal en mi país. He intentado modificar los siguientes archivos pero no he logrado obtener el resultado deseado. Aquí están los detalles de mi enfoque:

1. Helper.php: Agregué una función para convertir números a palabras en francés.

class Helper extends HelperCore
{
    public static function convert_number_to_words($num = false)
    {
        if (!is_numeric($num)) {
            return false;
        }

        $num = number_format($num, 2, '.', '');
        list($integerPart, $fractionPart) = explode('.', $num);

        $words = self::convert_integer_to_words_fr($integerPart);
        $currency = 'dirhams';
        $subunit = 'centimes';

        $words .= ' ' . $currency;

        if ($fractionPart > 0) {
            $words .= ' et ' . self::convert_integer_to_words_fr($fractionPart) . ' ' . $subunit;
        }

        return ucfirst(trim($words)) . '.';
    }

    private static function convert_integer_to_words_fr($num)
    {
        // Implementación de la función...
    }
}

2. invoice.note-tab.tpl: Modifiqué la plantilla para incluir el monto total en palabras.

{if isset($order_invoice->note) && $order_invoice->note}
    <tr>
        <td colspan="12" height="10">&nbsp;</td>
    </tr>

    <tr>
        <td colspan="6" class="left">
            <table id="note-tab" style="width: 100%">
                <tr>
                    <td class="grey">{l s='Note' d='Shop.Pdf' pdf='true'}</td>
                </tr>
                <tr>
                    <td class="note">{$order_invoice->note|nl2br} {$total_paid_in_words} Dirhams</td>
                </tr>
            </table>
        </td>
        <td colspan="1">&nbsp;</td>
    </tr>
{/if}

3. HTMLTemplateInvoice.php: Sobrescribí el método `getContent` para asignar el monto total en palabras a la plantilla.

class HTMLTemplateInvoice extends HTMLTemplateInvoiceCore
{
    public function getContent()
    {
        $order = new Order((int)$this->order->id);
        $total_paid = $order->total_paid;

        // Convertir el total pagado a palabras en francés
        $total_paid_in_words = Helper::convert_number_to_words($total_paid);

        // Asignar el total pagado en palabras a la plantilla
        $this->smarty->assign(array(
            'total_paid_in_words' => $total_paid_in_words,
        ));

        // Llamar al método del padre para mantener la funcionalidad existente
        return parent::getContent();
    }
}

A pesar de estas modificaciones, el monto total en palabras no aparece en las facturas PDF. ¿Alguien podría guiarme sobre qué podría estar fallando o proporcionar una solución para lograr esta personalización?

¡Gracias de antemano por su ayuda!

Link to comment
Share on other sites

 

/override/classes/helper/Helper.php

código de ejemplo:

<?php

class Helper extends HelperCore
{
    public static function convertNumberToWords($num = false)
    {
        if (!is_numeric($num)) {
            return false;
        }

        $num = number_format($num, 2, '.', '');
        list($integerPart, $fractionPart) = explode('.', $num);

        $words = self::convertIntegerToWords($integerPart);
        $currency = 'euros';
        $subunit = 'centimes';

        $words .= ' ' . $currency;

        if ($fractionPart > 0) {
            $words .= ' et ' . self::convertIntegerToWords($fractionPart) . ' ' . $subunit;
        }

        return ucfirst(trim($words)) . '.';
    }

    private static function convertIntegerToWords($number)
    {
        $dictionary = array(
            0 => 'zero',
            1 => 'one',
            2 => 'two',
            3 => 'three',
            4 => 'four',
            5 => 'five',
            6 => 'six',
            7 => 'seven',
            8 => 'eight',
            9 => 'nine',
            10 => 'ten',
            11 => 'eleven',
            12 => 'twelve',
            13 => 'thirteen',
            14 => 'fourteen',
            15 => 'fifteen',
            16 => 'sixteen',
            17 => 'seventeen',
            18 => 'eighteen',
            19 => 'nineteen',
            20 => 'twenty',
            30 => 'thirty',
            40 => 'forty',
            50 => 'fifty',
            60 => 'sixty',
            70 => 'seventy',
            80 => 'eighty',
            90 => 'ninety',
            100 => 'hundred',
            1000 => 'thousand'
        );

        if ($number < 21) {
            return $dictionary[$number];
        } elseif ($number < 100) {
            $tens = ((int) ($number / 10)) * 10;
            $units = $number % 10;
            return $dictionary[$tens] . ($units ? '-' . $dictionary[$units] : '');
        } elseif ($number < 1000) {
            $hundreds = (int) ($number / 100);
            $remainder = $number % 100;
            return $dictionary[$hundreds] . ' ' . $dictionary[100] . ($remainder ? ' and ' . self::convertIntegerToWords($remainder) : '');
        } else {
            return $number; 
        }
    }
}

 

/override/classes/pdf/HTMLTemplateInvoice.php

código de ejemplo:

<?php

class HTMLTemplateInvoice extends HTMLTemplateInvoiceCore
{
    public function getContent()
    {

        $total_paid_in_words = Helper::convertNumberToWords($this->order->total_paid);

        $this->smarty->assign('total_paid_in_words', $total_paid_in_words);

        return parent::getContent();
    }
}

 

limpiar caché de la instalación

Link to comment
Share on other sites

@ventura muchas gracias, he intentado usarlo que parece que tengo algún problema subyacente que no me deja ver los cambios por mucho que borro caché e incluso carpetas DEV.

He intentado multitud de cosas, pero a pesar que las modificaciones en otros archivos de la plantilla de PDF sí me son visibles, todo lo que hago en invoice.note-tab.tpl no causa absolutamente ningún efecto en los pdf (y no es que tenga algún override de este archivo).

Por mucha modificación que hago, no hago más que caer en errores 500 o simplemente los cambios no se reflejan en las facturas PDF. llevo muchos días con esto y no entiendo qué pasa.

Tu enfoque es bueno y funciona, pero debo seguir indagando en qué pasa con invoice.note-tab.tpl que no los muestra, ni siquiera muestra texto plano que inserto para ver si al menos eso se refleja en el PDF.

Gracias

Link to comment
Share on other sites

Asegúrate  de que se registre la información correctamente  en el campo note de la tabla order_invoice. Si en la factura correspondiente ese campo esta vacío  no se mostrara ningún contenido.

Link to comment
Share on other sites

6 hours ago, ventura said:

Asegúrate  de que se registre la información correctamente  en el campo note de la tabla order_invoice. Si en la factura correspondiente ese campo esta vacío  no se mostrara ningún contenido.

No estoy seguro de entender lo que propones. Hasta donde yo sé, el campo "note" no se usa para este caso.

Lo que hacemos es obtener el valor de total_paid_wt para el pedido (el cual está disponible en ya que en otras partes del template en los archivos de la carpeta PDF se hace uso de éste), para luego usar el código que has propuesto para escribirlo en letras y que se imprima en la sección correspondiente de invoice.note-tab.tp.

Link to comment
Share on other sites

si no hay valor note en la factura, tabla order_invoice, asociada al pedido, no se mostrara nada porque no se cumple la condición establecida para ello

{if isset($order_invoice->note) && $order_invoice->note}

<tr> <td colspan="12" height="10">&nbsp;</td> </tr> <tr> <td colspan="6" class="left"> <table id="note-tab" style="width: 100%"> <tr> <td class="grey">{l s='Note' d='Shop.Pdf' pdf='true'}</td> </tr> <tr> <td class="note">{$order_invoice->note|nl2br} {$total_paid_in_words} Dirhams</td> </tr> </table> </td> <td colspan="1">&nbsp;</td> </tr>

{/if}

sería necesario eliminar la condición o incluir otra tabla para ello 

  • Thanks 1
Link to comment
Share on other sites

31 minutes ago, ventura said:

si no hay valor note en la factura, tabla order_invoice, asociada al pedido, no se mostrara nada porque no se cumple la condición establecida para ello

{if isset($order_invoice->note) && $order_invoice->note}

<tr> <td colspan="12" height="10">&nbsp;</td> </tr> <tr> <td colspan="6" class="left"> <table id="note-tab" style="width: 100%"> <tr> <td class="grey">{l s='Note' d='Shop.Pdf' pdf='true'}</td> </tr> <tr> <td class="note">{$order_invoice->note|nl2br} {$total_paid_in_words} Dirhams</td> </tr> </table> </td> <td colspan="1">&nbsp;</td> </tr>

{/if}

sería necesario eliminar la condición o incluir otra tabla para ello 

Espera un momento que creo que le acabas de dar un vuelco a mi universo..... Me estás diciendo que llevo semanas volviéndome loco con invoice.note-tab.tp pensando que este es el archivo que imprime en el PDF la línea de "Texto libre" (admin -> pedidos -> Facturas -> Texto libre) y que lo que hace en realidad es imprimir las notas de los pedidos?! q desastre el mío!

Haciendo una comprobación rápida en el código fuente del admin creo que ese campo en cuestión se llama "legal_free_text" y es llamado dentro de la plantilla PDF en el archivo invoice.tpl, estoy en lo cierto? en tal caso, debería dejarlo asi?

	<tr>
		<td colspan="7" class="left small">

			<table>
				<tr>
					<td>
						<p>{$legal_free_text|escape:'html':'UTF-8'|nl2br} {$total_paid_in_words} Dirhams</p>
					</td>
				</tr>
			</table>

		</td>
	</tr>

Y luego entonces, HTMLTemplateInvoice.php y Helper.php los dejo tal como me has dicho al principio?

Gracias por la ayuda!

Link to comment
Share on other sites

12 minutes ago, Eutanasio said:

Espera un momento que creo que le acabas de dar un vuelco a mi universo..... Me estás diciendo que llevo semanas volviéndome loco con invoice.note-tab.tp pensando que este es el archivo que imprime en el PDF la línea de "Texto libre" (admin -> pedidos -> Facturas -> Texto libre) y que lo que hace en realidad es imprimir las notas de los pedidos?! q desastre el mío!

Haciendo una comprobación rápida en el código fuente del admin creo que ese campo en cuestión se llama "legal_free_text" y es llamado dentro de la plantilla PDF en el archivo invoice.tpl, estoy en lo cierto? en tal caso, debería dejarlo asi?

	<tr>
		<td colspan="7" class="left small">

			<table>
				<tr>
					<td>
						<p>{$legal_free_text|escape:'html':'UTF-8'|nl2br} {$total_paid_in_words} Dirhams</p>
					</td>
				</tr>
			</table>

		</td>
	</tr>

Y luego entonces, HTMLTemplateInvoice.php y Helper.php los dejo tal como me has dicho al principio?

Gracias por la ayuda!

Efectivamente era eso... 😮‍💨 no sé si llorar de felicidad o de frustración. Muchas gracias @ventura por la ayuda!

Link to comment
Share on other sites

  • Eutanasio changed the title to [solucionado] Personalizar la factura PDF para incluir el monto total en letras

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...