Invoice.php Broken

  • Posts: 603
  • Thank you received: 12
  • Hikashop Business Vessel Template
4 hours 51 minutes ago #373403

-- HikaShop version -- : 6.6.0
-- Joomla version -- : 5.4.8
-- PHP version -- : 8.4.24
-- Browser(s) name and version -- : Chrome

Hi, Updated to the new version of Invoice PDF and its now completely broken!

For some time when updating I have to save a copy of invoice.php as when updating it always overwrites my own version which far more professional.

This is the php I have been using since 2022 without issue!

<?php
/**
 * @package	PDF invoice plugin for HikaShop
 * @version	1.1.4
 * @author	Adrien Baborier, Hikari Software
 * @copyright	(C) 2010-2022 HIKARI SOFTWARE. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><style type="text/css">
<!--
.invoicetitle{ text-align:left; font-size:30px; font-weight:bold; padding-top:30px;padding-bottom:30px}
legend { padding:5px 20px; background-color:#5471B5;color:white;font-weight:bold;border-color:#ccc}
fieldset { padding:10px; border-color:#ffffff; }

div.date{color:#333;padding-left:  500px}

div.width{max-width: 490px}

div.date{text-align:right;color:#333;}

.storeaddress{
	color:#333;
}
.addresses{padding-top:10px;}
.addresses td{padding-left:15px;}
.addresses fieldset {float:left;width:320px;}

table.products{margin:auto;margin-top:40px;width:580px;border-collapse:collapse}
.price{text-align:center;}

.products td, .products th{border:1px solid #ccc;padding:7px 4px;}
.products th{background-color:#5471B5;color:white;}
td.newarea{text-align:right;padding-right:20px;}
tr.total{font-weight:bold;}

.products tr.limitation td{background-color:#ccc;padding:1px 0px;}

.hikashop_order_custom_fields_fieldset{margin-top : 20px;}
.hikashop_order_custom_fields_table tr{width: 800px;}	

.footer{font-size:10px;color:#aaa;text-align:center;}
-->
</style>
<page style="font-size: 14px" backtop="4mm" backbottom="8mm" backleft="10mm" backright="10mm">
	<page_footer>
	<div class="footer">
		<?php
		$name = $this->params->get('footer');
		$trans = hikashop_translate($name);
		echo str_replace(array("\r\n","\n","\r"),array('<br/>','<br/>','<br/>'), $trans); ?>
	</div>
	</page_footer>
	
		<?php
echo "INVOICE SUMMARY";
?>
<br>
<br>

<?php
	$image_address_path = trim($config->get('image_address_path'));
	$img_style_css = trim($config->get('img_style_css'));

	if ($image_address_path != '') {
		$img_style = '';
		if ($img_style_css != '') {
			$img_style = $img_style_css;
		}
?>
			<div class="hika_invoice_img">
				<img src="<?php echo $image_address_path; ?>" style="<?php echo $img_style; ?>">
			</div>
<?php
	}
?>
	<div class="storeaddress">
		<?php
			$store = str_replace(array("\r\n","\n","\r"),array('<br/>','<br/>','<br/>'),$config->get('store_address',''));
			if(JText::_($store)!=$store){
				$store = JText::_($store);
			}
			echo $store;
		?>
	</div>
	<?php if(empty($order->order_invoice_number)){
		$order->order_invoice_number = $order->order_number;
	}
	if(empty($order->order_invoice_created)){
		$order->order_invoice_created = $order->order_created;
	}

	if($this->shipping_invoice){
		$number = JText::_('SHIPPING_INVOICE').' n° ';
		if(JText::_('SHIPPING_INVOICE_NUMBER') != 'SHIPPING_INVOICE_NUMBER'){
			$number = JText::_('SHIPPING_INVOICE_NUMBER').' ';
		}
		$item_type = 'display:back_shipping_invoice=1';
	}else{
		$number = JText::_('INVOICE').' n° ';
		if(JText::_('INVOICE_NUMBER') != 'INVOICE_NUMBER'){
			$number = JText::_('INVOICE_NUMBER').' ';
		}
		$item_type = 'display:back_invoice=1';
	}
?> 
	<div class="date"><?php echo JText::_('INVOICE').': '.$order->order_invoice_number; ?></div>
	<div class="date"><?php echo JText::_('DATE').': '.hikashop_getDate($order->order_invoice_created,'%d %B %Y ');?></div>	

	<table class="addresses">
		<tr>
			<?php
			$addresses = array('billing_address','shipping_address');
			foreach($addresses as $oneAddress){
			if(empty($order->$oneAddress)) continue;
			if ($oneAddress=='shipping_address' && empty($pluginsShipping)) continue; ?>
			<td valign="top">
				<fieldset>
				<legend><?php echo JText::_('HIKASHOP_'.strtoupper($oneAddress)); ?></legend>
					<?php
						$override = false;
						if(!empty($order->override_shipping_address) && $oneAddress=='shipping_address') {
							$override = $order->override_shipping_address;
						}
						if($override !== false ) {
							echo $override;
						} else {
							$addressClass = hikashop_get('class.address');
							if(hikashop_isClient('administrator')){
								$view = 'order';
							}else{
								$view = 'address';
							}
							echo $addressClass->displayAddress($order->fields,$order->$oneAddress,$view);
						}
					?>
				</fieldset>
			</td>
			<?php } ?>
		</tr>
	</table>
<?php
		$shipping_invoice = '';
		if($this->shipping_invoice){
			$shipping_invoice = 'shipping_';
		}
		$weight = bccomp((float)$order->order_weight, 0, 3);
		$unit_weight = false;
		if($weight && $config->get('show_'.$shipping_invoice.'invoice_unit_weight',0))
			$unit_weight = true;
		$total_weight = false;
		if($weight && $config->get('show_'.$shipping_invoice.'invoice_total_weight',0))
			$total_weight = true;
		$order_weight = false;
		if($weight && $config->get('show_'.$shipping_invoice.'invoice_weight',0))
			$order_weight = true;
	
?>
		
	
	<table class="products">
		<tr class="products_title">
			<?php if($this->shipping_invoice){ ?>
			<th style="width:500px">
<?php }else{ ?>
			<th style="width:380px">
<?php } ?>
				<?php echo JText::_('PRODUCT'); ?>
			</th>
<?php	
			
if($unit_weight) {
	echo '<th style="width:80px" class="price">' . JText::_('PRODUCT_WEIGHT') . '</th>';
}
			
?>
			
<th style="width:50px" class="price">
				<?php echo JText::_('PRODUCT_QUANTITY'); ?>
			</th>				
<?php			
			
			
if(!$this->shipping_invoice){ ?>
			<th style="width:80px" class="price">
				<?php echo JText::_('UNIT_PRICE'); ?>
			</th>
<?php } 
			


	if($total_weight) {
		echo '<th style="width:40px" class="price">' . JText::_('TOTAL_WEIGHT') . '</th>';
	}
	if(!$this->shipping_invoice){ ?>
			<th style="width:80px" class="price">
				<?php echo JText::_('PRICE'); ?>
			</th>
<?php } ?>
		</tr>
	<?php
		$fieldsClass = hikashop_get('class.field');
		$group = $config->get('group_options',0);
		foreach($order->products as $product){
			if($group && $product->order_product_option_parent_id) continue;
			?>
			<tr>
				<td>

					<?php echo implode('<br/>',$this->str_split_unicode(strip_tags($product->order_product_name),80));
					if($group && !$this->shipping_invoice){
						$display_item_price=false;
						foreach($order->products as $j => $optionElement){
							if($optionElement->order_product_option_parent_id != $product->order_product_id) continue;
							if($optionElement->order_product_price>0){
								$display_item_price = true;
							}

						}
						if($display_item_price){
							if($config->get('price_with_tax')){
								echo ' '.$currencyHelper->format($product->order_product_price+$product->order_product_tax,$order->order_currency_id);
							}else{
								echo ' '.$currencyHelper->format($product->order_product_price,$order->order_currency_id);
							}
						}
					}
					$itemFields = $fieldsClass->getFields($item_type,$product,'item');
					if(!empty($itemFields)){
						foreach($itemFields as $field){
							$namekey = $field->field_namekey;
							if(!empty($product->$namekey) && strlen($product->$namekey)) {
								echo '<p>'.implode('<br/>',$this->str_split_unicode(strip_tags($fieldsClass->getFieldName($field).': '.$fieldsClass->show($field,$product->$namekey,'user_email')),50)).'</p>';
							}
						}
					}
					if($group){
						foreach($order->products as $j => $optionElement){
							if($optionElement->order_product_option_parent_id != $product->order_product_id) continue;

							$product->order_product_weight += $optionElement->order_product_weight;
							$product->order_product_price +=$optionElement->order_product_price;
							$product->order_product_tax +=$optionElement->order_product_tax;
							$product->order_product_total_price+=$optionElement->order_product_total_price;
							$product->order_product_total_price_no_vat+=$optionElement->order_product_total_price_no_vat;
							?><br/><?php
							$option_name = $optionElement->order_product_name;
							if($optionElement->order_product_price>0 && !$this->shipping_invoice){
								if($config->get('price_with_tax')){
									$option_name .= ' ( + '.$currencyHelper->format($optionElement->order_product_price+$optionElement->order_product_tax,$order->order_currency_id).' )';
								}else{
									$option_name .= ' ( + '.$currencyHelper->format($optionElement->order_product_price,$order->order_currency_id).' )';
								}
							}
							echo '<p>'.implode('<br/>', $this->str_split_unicode(strip_tags($option_name),50)).'</p>';
						}
					}
					if ($config->get('show_code')) {
						echo '<br/>'.$product->order_product_code;
					} ?>
				</td>
<?php
	if($unit_weight) {
		echo '<td class="price">' . rtrim(rtrim($product->order_product_weight,'0'),',.').' '.JText::_($product->order_product_weight_unit) . '</td>';
	}
?>
				
				
                <td  class="price">
					<?php echo $product->order_product_quantity;?>
				</td>				
				
<?php if(!$this->shipping_invoice){ ?>
				<td  class="price">
				<?php
				if($config->get('price_with_tax')){
					echo $currencyHelper->format($product->order_product_price+$product->order_product_tax,$order->order_currency_id);
				}else{
					echo $currencyHelper->format($product->order_product_price,$order->order_currency_id);
				} ?>
				</td>
<?php } ?>
				
<?php
		if($total_weight) {
			echo '<td class="price">' . rtrim(rtrim($product->order_product_weight*$product->order_product_quantity,'0'),',.').' '.JText::_($product->order_product_weight_unit) . '</td>';
		}
?>
<?php if(!$this->shipping_invoice){ ?>
				<td  class="price">
					<?php
					if($config->get('price_with_tax')){
						echo $currencyHelper->format($product->order_product_total_price,$order->order_currency_id);
					}else{
						echo $currencyHelper->format($product->order_product_total_price_no_vat,$order->order_currency_id);
					} ?>
				</td>
<?php } ?>
			</tr>
			<?php
		}
	?>
<?php if(!$this->shipping_invoice){ ?>
		<tr class="limitation"><td colspan="4"></td></tr>
		<tr>
			<td colspan="3" class="newarea">
					<?php echo JText::_( 'SUBTOTAL' ); ?>
			</td>
			<td  class="price">
				<?php
				if($config->get('price_with_tax')){
					echo $currencyHelper->format($order->order_subtotal,$order->order_currency_id);
				}else{
					echo $currencyHelper->format($order->order_subtotal_no_vat,$order->order_currency_id);
				} ?>
			</td>
		</tr>
		<?php $taxes = $currencyHelper->round($order->order_subtotal - $order->order_subtotal_no_vat - $order->order_discount_tax + $order->order_shipping_tax + $order->order_payment_tax, $currencyHelper->getRounding($order->order_currency_id,true));

		if(!empty($order->order_discount_code)){ ?>
		<tr>
			<td colspan="3" class="newarea">
				<?php echo JText::_( 'HIKASHOP_COUPON' ); ?>
			</td>
			<td  class="price">
				<?php
				if($config->get('price_with_tax')){
					echo $currencyHelper->format($order->order_discount_price*-1,$order->order_currency_id);
				}else{
					echo $currencyHelper->format(($order->order_discount_price-@$order->order_discount_tax)*-1,$order->order_currency_id);
				}
				?>
			</td>
		</tr>
		<?php }

		if(!empty($order->order_shipping_method)){ ?>
		<tr>
			<td colspan="3" class="newarea">
					<?php echo JText::_( 'SHIPPING' ); ?>
			</td>
			<td  class="price" >
				<?php
				if($config->get('price_with_tax')){
					echo $currencyHelper->format($order->order_shipping_price,$order->order_currency_id);
				}else{
					echo $currencyHelper->format($order->order_shipping_price-@$order->order_shipping_tax,$order->order_currency_id);
				} ?>
			</td>
		</tr>
		<?php }
		if(!empty($order->additional)) {
			$exclude_additionnal = explode(',', $config->get('order_additional_hide', ''));
			foreach($order->additional as $additional) {
				if(in_array(@$additional->name, $exclude_additionnal)) continue;
				echo '<tr><td colspan="3" class="newarea">'. JText::_($additional->order_product_name).'</td><td  class="price">';
				if(!empty($additional->order_product_price) || empty($additionaltionnal->order_product_options)) {
					if($config->get('price_with_tax')){
						echo $currencyHelper->format($additional->order_product_price+@$additional->order_product_tax, $order->order_currency_id);
					}else{
						echo $currencyHelper->format($additional->order_product_price, $order->order_currency_id);
					}
				} else {
					echo $additional->order_product_options;
				}
				echo '</td></tr>';
			}
		}

		if(!empty($order->order_payment_method) && $order->order_payment_price != 0){ ?>
		<tr>
			<td colspan="3" class="newarea">
				<?php echo JText::_( 'HIKASHOP_PAYMENT' ); ?>
			</td>
			<td class="price"><?php
				if($config->get('price_with_tax')) {
					echo $currencyHelper->format($order->order_payment_price, $order->order_currency_id);
				} else {
					echo $currencyHelper->format($order->order_payment_price - @$order->order_payment_tax, $order->order_currency_id);
				}
			?></td>
		</tr>
		<?php }

		if($taxes > 0){
			if($config->get('detailed_tax_display') && !empty($order->order_tax_info)){
				foreach($order->order_tax_info as $tax){ ?>
				<tr>
					<td colspan="3" class="newarea">
						<?php
						if( function_exists('hikashop_translate'))
							echo hikashop_translate($tax->tax_namekey);
						else
							echo $tax->tax_namekey;
						?>
					</td>
					<td  class="price">
						<?php echo $currencyHelper->format($tax->tax_amount,$order->order_currency_id); ?>
					</td>
				</tr>
			<?php
				}
			}else{ ?>
				<tr>
					<td colspan="3" class="newarea">
						<?php echo JText::_( 'VAT' ); ?>
					</td>
					<td  class="price">
						<?php echo $currencyHelper->format($taxes,$order->order_currency_id); ?>
					</td>
				</tr>
		<?php }
		} ?>
		<tr class="total">
			<td colspan="3" class="newarea">
				<?php echo JText::_( 'HIKASHOP_TOTAL' ); ?>
			</td>
			<td  class="price" >
				<?php echo $currencyHelper->format($order->order_full_price,$order->order_currency_id); ?>
			</td>
		</tr>
<?php } ?>
	</table>
	<p>
	<?php
		if (!empty($pluginsShipping))
			echo JText::_('HIKASHOP_SHIPPING_METHOD1').' : '.$pluginsShipping->getName($order->order_shipping_method, $order->order_shipping_id).'<br/>' ;
		if(!empty($pluginsPayment))
			echo JText::_('HIKASHOP_PAYMENT_METHOD1').' : '.$pluginsPayment->getName($order->order_payment_method, $order->order_payment_id).'<br/>';
	?>
	</p>
	<br/>
	<?php if(hikashop_level(2) && !empty($fields['order'])){
			ob_start();
			foreach($fields['order'] as $fieldName => $oneExtraField) {
				if(!@$oneExtraField->field_frontcomp || empty($order->$fieldName)) continue;
			?>
				<tr class="hikashop_order_custom_field_<?php echo $fieldName;?>_line">
					<td class="key">
						<?php echo $fieldsClass->getFieldName($oneExtraField);?>
					</td>
					<td>
						<?php echo $fieldsClass->show($oneExtraField,$order->$fieldName,'user_email'); ?>
					</td>
				</tr>
			<?php
			}
			$additionalInfo = ob_get_clean();
			if(!empty($additionalInfo)){ ?>
			<fieldset class="hikashop_order_custom_fields_fieldset">
				<legend><?php echo JText::_('ADDITIONAL_INFORMATION'); ?></legend>
				<table class="hikashop_order_custom_fields_table adminlist" cellpadding="1" width="100%">
				<?php echo $additionalInfo; ?>
				</table>
			</fieldset>
			<br/>
			<?php
			}
		} ?>
</page>
Please see what happen now! there is my version (how it should look), your version and whats happening when now when I use my version.

Attachments:
Last edit: 4 hours 12 minutes ago by nicolas.

Please Log in or Create an account to join the conversation.

  • Posts: 86177
  • Thank you received: 14212
  • MODERATOR
4 hours 13 minutes ago #373405

Hi,

Thank you for the screenshots, they made it easy to find. Your invoice.php was written for the previous PDF engine and its styles are most likely wrapped between <!-- and --> inside the <style> tag, as in older versions of the default layout. The new engine of the PDF invoice plugin 5.0.x reads that as a comment, so all your styles are ignored and one CSS rule added by the plugin ends up printed at the top of the invoice.

We fixed this in version 5.0.3 of the plugin. Once you update it, your layout should display as it did before.

So that updates stop overwriting your layout, you can make your changes via the "You can edit the PDF layouts here" link in the settings of the PDF invoice plugin instead of editing the file in the plugin folder: your version is then saved as an override that the updates should leave alone.

Please Log in or Create an account to join the conversation.

  • Posts: 603
  • Thank you received: 12
  • Hikashop Business Vessel Template
3 hours 8 minutes ago #373407

Hi, I only downloaded and installed on Thursday, the PDF is showing version 4.1.4??

Attachments:

Please Log in or Create an account to join the conversation.

  • Posts: 86177
  • Thank you received: 14212
  • MODERATOR
2 hours 1 minute ago #373409

Hi,

Read carefully both blue buttons. The first one is for the latest version. The second one is for the old 4.1.4 version.

Please Log in or Create an account to join the conversation.

  • Posts: 603
  • Thank you received: 12
  • Hikashop Business Vessel Template
1 hour 42 minutes ago #373411

Hi I did wonder?

Sort of worked but there are still changes to it that were not there before I first updated last week?
Look at my good one I send against this one?
1. Lines/box around the addresses
2. The product columns should be wider to accommodate long product titles, the width used to run the width of the page

Thanks

Attachments:

Please Log in or Create an account to join the conversation.

Time to create page: 0.783 seconds
Powered by Kunena Forum