Eutanasio Posted August 2 Share Posted August 2 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"> </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"> </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 More sharing options...
ventura Posted August 3 Share Posted August 3 /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 More sharing options...
Eutanasio Posted August 3 Author Share Posted August 3 @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 More sharing options...
ventura Posted August 4 Share Posted August 4 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 More sharing options...
Eutanasio Posted August 4 Author Share Posted August 4 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 More sharing options...
ventura Posted August 4 Share Posted August 4 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"> </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"> </td> </tr> {/if} sería necesario eliminar la condición o incluir otra tabla para ello 1 Link to comment Share on other sites More sharing options...
Eutanasio Posted August 4 Author Share Posted August 4 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"> </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"> </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 More sharing options...
Eutanasio Posted August 4 Author Share Posted August 4 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now