This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
Deon George 04ebda2aaa Theme work with focusbusiness and baseadmin
Improvements to NAVBAR, updates to StaticList methods, other minor items
Enable product category rendering and other minor improvements
Added ADSL-large category price plan
2013-10-10 13:56:13 +11:00

519 lines
16 KiB
PHP

<?php defined('SYSPATH') or die('No direct access allowed.');
/**
* This class provides invoice rending use TCPDF
*
* @package Invoice
* @category Helpers
* @author Deon George
* @copyright (c) 2009-2013 Open Source Billing
* @license http://dev.osbill.net/license.html
*/
class Invoice_TCPDF_Default extends Invoice_Tcpdf {
// Current line being printed
public $sum_y = 0;
private $max_lines_page = 51;
protected $show_service_range = TRUE;
/**
* Draw the logo
*/
public function drawCompanyLogo() {
$x = 9; $y = 7;
$size = 25;
$logo = $this->co->logo_file();
if (is_file($logo))
$this->Image($logo,$x,$y,$size);
}
/**
* Draw the Company Address
*/
public function drawCompanyAddress() {
// Add the company address next to the logo
$x = 40; $y = 7;
$this->SetFont('helvetica','B',10);
$this->SetXY($x,$y); $this->Cell(0,0,$this->co->name()); $y += 4;
$this->SetFont('helvetica','',10);
$this->SetXY($x,$y); $this->Cell(0,0,$this->co->taxid()); $y += 6;
$this->SetXY($x,$y); $this->Cell(0,0,$this->co->street(', ')); $y += 4;
$this->SetXY($x,$y); $this->Cell(0,0,sprintf('%s, %s %s',$this->co->city(),$this->co->state(),$this->co->pcode())); $y += 4;
$y += 2;
$this->SetXY($x,$y); $this->Cell(0,0,'Phone:'); $this->SetXY($x+16,$y); $this->Cell(0,0,$this->co->phone()); $y += 4;
$this->SetXY($x,$y); $this->Cell(0,0,'Fax:'); $this->SetXY($x+16,$y); $this->Cell(0,0,$this->co->fax()); $y += 4;
$this->SetXY($x,$y); $this->Cell(0,0,'Web:'); $this->SetXY($x+16,$y); $this->addHtmlLink(URL::base(TRUE,TRUE),URL::base(TRUE,TRUE)); $y += 4;
}
/**
* Draw the remmittence stub
*/
public function drawRemittenceStub() {
// Draw the remittance line
$this->Line(9,195,200,195);
$x = 18; $y = 200;
$this->SetFont('helvetica','B',13);
$this->SetXY($x,$y); $this->Cell(0,0,_('Payment Remittence')); $y +=5;
$this->SetFont('helvetica','',8);
$this->SetXY($x,$y); $this->Cell(0,0,_('Please return this portion with your cheque or money order')); $y +=3;
$this->SetXY($x,$y); $this->Cell(0,0,_('made payable to').' '.$this->co->name());
// Due Date
$x = 110; $y = 200;
$this->SetFont('helvetica','',10);
$this->SetXY($x,$y); $this->Cell(0,0,_('Issue Date'));
$this->SetFont('helvetica','B',11);
$this->SetXY($x,$y); $this->Cell(0,0,$this->io->display('date_orig'),0,0,'R');
// Account ID
$y = 205;
$this->SetFont('helvetica','',10);
$this->SetXY($x,$y); $this->Cell(0,0,_('Account Number'));
$this->SetFont('helvetica','B',11);
$this->SetXY($x,$y); $this->Cell(0,0,$this->io->account->accnum(),0,0,'R');
// Invoice number
$y = 210;
$this->SetFont('helvetica','',10);
$this->SetXY($x,$y); $this->Cell(0,0,_('Invoice Number'));
$this->SetFont('helvetica','B',11);
$this->SetXY($x,$y); $this->Cell(0,0,$this->io->id(),0,0,'R');
// Company Address
$y = 216;
$this->SetFont('helvetica','',10);
$this->SetXY(18,$y); $this->Cell(0,0,$this->co->name()); $y += 4;
$this->SetXY(18,$y); $this->Cell(0,0,$this->co->street(', ')); $y += 4;
$this->SetXY(18,$y); $this->Cell(0,0,sprintf('%s, %s %s',$this->co->city(),$this->co->state(),$this->co->pcode())); $y += 4;
// Previous Due
$y = 215;
$this->SetFont('helvetica','',9);
$this->SetXY($x,$y); $this->Cell(0,0,_('Previous Due'));
$this->SetXY($x,$y); $this->Cell(0,0,$this->io->account->invoices_due_total($this->io->date_orig,TRUE),0,0,'R');
$y = 219;
$this->SetFont('helvetica','',9);
$this->SetXY($x,$y); $this->Cell(0,0,_('Amount Due').' '.$this->io->display('due_date'));
$this->SetXY($x,$y); $this->Cell(0,0,$this->io->due(TRUE),0,0,'R');
// Total Due
$y = 224;
$this->SetFont('helvetica','B',10);
$this->SetXY($x,$y); $this->Cell(0,0,_('Total Payable'));
$this->SetXY($x,$y); $this->Cell(0,0,Currency::display($this->io->due() ? $this->io->total()+$this->io->account->invoices_due_total($this->io->date_orig,TRUE) : 0),0,0,'R');
// Draw the Customers Address
$x = 25; $y = 248;
$this->SetFont('helvetica','B',12);
if ($this->billToCompany && ! empty($this->io->account->company))
$name = $this->io->account->company;
else
$name = $this->io->account->name();
$this->SetXY($x,$y); $this->Cell(0,0,html_entity_decode($name,ENT_NOQUOTES)); $y += 5;
$this->SetXY($x,$y); $this->Cell(0,0,sprintf('%s %s ',$this->io->account->address1,$this->io->account->address2)); $y += 5;
$this->SetXY($x,$y); $this->Cell(0,0,sprintf('%s, %s %s',$this->io->account->city,$this->io->account->state,$this->io->account->zip)); $y += 5;
}
/**
* Draw the invoice header
*/
public function drawInvoiceHeader() {
$x = 125; $y = 10;
// Draw a box.
$this->SetFillColor(245);
$this->SetXY($x-1,$y-1); $this->Cell(0,35+5+($this->io->total_credits() ? 5 : 0),'',1,0,'',1);
// Draw a box around the invoice due date and amount due.
$this->SetFont('helvetica','B',11);
$this->SetXY($x,$y); $this->Cell(0,0,'TAX INVOICE');
$this->SetFont('helvetica','B',11);
$this->SetXY($x,$y); $this->Cell(0,0,$this->io->id(),0,0,'R');
// Invoice number at top of page.
$y += 7;
$this->SetFont('helvetica','',10);
$this->SetXY($x,$y); $this->Cell(0,0,_('Issue Date')); $y += 5;
$this->SetXY($x,$y); $this->Cell(0,0,_('Amount Due'));
$y -= 5;
$this->SetFont('helvetica','B',11);
$this->SetXY($x,$y); $this->Cell(0,0,$this->io->display('date_orig'),0,0,'R'); $y += 5;
$this->SetXY($x,$y); $this->Cell(0,0,$this->io->display('due_date'),0,0,'R');
$y += 5;
$this->SetFont('helvetica','',10);
$this->SetXY($x,$y); $this->Cell(0,0,_('Previous Due'));
$this->SetFont('helvetica','B',11);
$this->SetXY($x+55,$y); $this->Cell(0,0,$this->io->account->invoices_due_total($this->io->date_orig,TRUE),0,0,'R');
$y += 5;
$this->SetFont('helvetica','',10);
$this->SetXY($x,$y); $this->Cell(0,0,_('Current Charges'));
$this->SetFont('helvetica','B',11);
$this->SetXY($x+55,$y); $this->Cell(0,0,$this->io->total(TRUE),0,0,'R');
$y += 5;
$this->SetFont('helvetica','',10);
$this->SetXY($x,$y); $this->Cell(0,0,'Payments Received');
$this->SetFont('helvetica','B',11);
$this->SetXY($x+55,$y); $this->Cell(0,0,$this->io->payments_total('TRUE'),0,0,'R');
if ($this->io->total_credits()) {
$y += 5;
$this->SetFont('helvetica','',10);
$this->SetXY($x,$y); $this->Cell(0,0,'Credits Received');
$this->SetFont('helvetica','B',11);
$this->SetXY($x+55,$y); $this->Cell(0,0,$this->io->total_credits(TRUE),0,0,'R');
}
$y += 5;
$this->SetFont('helvetica','',10);
$this->SetXY($x,$y); $this->Cell(0,0,'Total Payable');
$this->SetFont('helvetica','B',11);
$this->SetXY($x+55,$y); $this->Cell(0,0,Currency::display($this->io->due() ? $this->io->total()+$this->io->account->invoices_due_total($this->io->date_orig) : 0),0,0,'R');
}
/**
* Draw any news messages
* @todo Limit the size of the news to 6 lines
*/
public function drawNews($news) {
if (! $news)
return;
$x = 9; $y = 170;
# Draw a box.
$this->SetFillColor(243);
$this->SetXY($x-1,$y-1); $this->Cell(0,20,'',1,0,'',1);
$this->SetFont('helvetica','',8);
$this->SetXY($x,$y); $this->MultiCell(0,3,str_replace('\n',"\n",$news),0,'L',0);
}
/**
* Draw our available payment methods
* @todo make this list dynamic
*/
public function drawPaymentMethods() {
$x = 120; $y = 242;
# Draw a box.
$this->SetFillColor(235);
$this->SetXY($x-1,$y-2); $this->Cell(0,32,'',1,0,'',1);
$this->SetFont('helvetica','B',8);
$this->SetXY($x,$y); $this->Cell(0,0,'This invoice can be paid by:'); $y += 4;
# Direct Credit
$logo = Kohana::find_file('media','img/invoice-payment-dd','png');
$this->Image($logo,$x+1,$y,8);
$this->SetFont('helvetica','B',8);
$this->SetXY($x+10,$y); $this->Cell(0,0,'Direct Credit to our Bank Account'); $y += 3;
$this->SetFont('helvetica','',8);
$this->SetXY($x+10,$y); $this->Cell(0,0,'BSB:'); $y += 3;
$this->SetXY($x+10,$y); $this->Cell(0,0,'ACCOUNT:'); $y += 3;
$this->SetXY($x+10,$y); $this->Cell(0,0,'REF:'); $y += 3;
$y -= 9;
$this->SetFont('helvetica','B',8);
$this->SetXY($x+30,$y); $this->Cell(0,0,Company::bsb()); $y += 3;
$this->SetXY($x+30,$y); $this->Cell(0,0,Company::account()); $y += 3;
$this->SetXY($x+30,$y); $this->Cell(0,0,$this->io->refnum()); $y += 3;
/*
# Direct Debit
$y += 3;
$logo = sprintf('%s/%s',PATH_THEMES.DEFAULT_THEME,'invoice/invoice-payment-dd.png');
$this->Image($logo,$x+1,$y,8);
$this->SetFont('helvetica','B',8);
$this->SetXY($x+10,$y); $this->Cell(0,0,'Direct Debit'); $y += 3;
$this->SetFont('helvetica','',8);
$this->SetXY($x+10,$y); $this->Cell(0,0,'Please visit '); $this->SetXY($x+30,$y); $this->addHtmlLink($inv->print['site']['URL'].'?_page=invoice:user_view&id='.$inv->getPrintInvoiceNum(),$inv->print['site']['URL']); $y += 3;
*/
# Paypal
$y += 3;
$logo = Kohana::find_file('media','img/invoice-payment-pp','png');
$this->Image($logo,$x+1,$y,8);
$this->SetFont('helvetica','B',8);
$this->SetXY($x+10,$y); $this->Cell(0,0,'Pay Pal/Credit Card'); $y += 3;
$this->SetFont('helvetica','',8);
$this->SetXY($x+10,$y); $this->Cell(0,0,'Please visit '); $this->SetXY($x+30,$y); $this->addHtmlLink(URL::base(TRUE,TRUE),URL::base(TRUE,TRUE)); $y += 3;
}
/**
* Draw previous invoices due
*/
public function drawSummaryInvoicesDue() {
$x = 125; $y = $this->sum_y ? $this->sum_y : 50;
$items = $this->io->account->invoices_due($this->io->date_orig);
# Calculate the box size
$box = count($items) < $this->itemsPreviousMax ? count($items) : $this->itemsPreviousMax;
# Draw a box.
$this->SetFillColor(245);
$this->SetXY($x-1,$y-1); $this->Cell(0,5*(1+$box)+1,'',1,0,'',1);
$this->SetFont('helvetica','B',11);
$this->SetXY($x,$y); $this->Cell(0,0,_('Previous Invoices Due')); $y += 5;
$this->SetFont('helvetica','',11);
$i = 0;
$sum_total = 0;
foreach ($items as $line) {
if (++$i < $this->itemsPreviousMax) {
$this->SetXY($x,$y);
$this->Cell(0,0,sprintf('%s %s',$line->display('date_orig'),$line->id()));
$this->Cell(0,0,$line->due(TRUE),0,0,'R'); $y += 5;
} else {
$sum_total += $line->due();
}
}
if ($sum_total) {
$this->SetXY($x,$y);
$this->SetFont('helvetica','I',11);
$this->Cell(0,0,'Other invoices');
$this->SetFont('helvetica','',11);
$this->Cell(0,0,Currency::display($sum_total),0,0,'R'); $y += 5;
}
$this->sum_y = $y+5;
}
/**
* This will draw the Summary Box, with the summary of the items
* on the invoice.
*/
public function drawSummaryLineItems() {
if (! $this->show_itemized)
return;
$items = $this->io->items_summary();
// Calculate the box size
$box = count($items) < $this->itemsSummaryMax ? count($items) : $this->itemsSummaryMax;
// Our starting position
$x = 10; $y = $this->sum_y ? $this->sum_y : 55;
// Draw a box.
$this->SetFillColor(245);
$this->SetXY($x-1,$y-1);
$this->Cell(0,5*(
1+1+1+3+($this->io->total_discounts() ? 1 : 0)+1+($this->io->total_credits() ? 1 : 0)+$box
)+1+4,'',1,0,'',1);
$this->SetFont('helvetica','B',11);
$this->SetXY($x,$y);
$this->Cell(0,0,_('Current Charges Summary')); $y += 5;
$this->SetY($y);
$this->SetFont('helvetica','',9);
$i = $subtotal = 0;
foreach ($items as $name => $line) {
if ($i < $this->itemsSummaryMax) {
$this->SetX($x);
$this->Cell(0,0,sprintf('%3.2f',$line['quantity']));
$this->SetX($x+8);
$this->Cell(0,0,$name);
$this->SetX($x+135);
$this->Cell(0,0,Currency::display($line['subtotal']),0,0,'R');
$y += 5;
$this->SetY($y);
}
$i++;
if ($i == $this->itemsSummaryMax) {
$this->SetFont('helvetica','B',11);
$this->SetX($x);
$this->Cell(0,0,_('The above is just a summary. To view a detailed list of charges, please visit our website.'));
}
$subtotal += $line['subtotal'];
}
// Calculate our rounding error
// @todo This shouldnt be required.
#$subtotal = Currency::round($subtotal-$this->io->total_discounts());
if (Currency::round($this->io->subtotal()) != $subtotal) {
$this->SetFont('helvetica','',9);
$this->SetX($x);
$this->Cell(0,0,'Other');
$this->SetX($x+135);
$this->Cell(0,0,Currency::display($this->io->subtotal()-$subtotal),0,0,'R');
$y += 5;
$this->SetY($y);
}
// Draw Discounts.
if ($this->io->total_discounts()) {
$y += 5;
$this->SetY($y);
$this->SetFont('helvetica','B',9);
$this->SetX($x+8);
$this->Cell(0,0,_('Discount'));
$this->SetX($x+135);
$this->Cell(0,0,Currency::display(-$this->io->total_discounts()),0,0,'R');
}
// Subtotal and tax.
$y += 5;
$this->SetY($y);
$this->SetFont('helvetica','B',9);
$this->SetX($x+8);
$this->Cell(0,0,'Sub Total');
$this->SetX($x+135);
$this->Cell(0,0,Currency::display($this->io->subtotal()),0,0,'R');
$y += 5;
$this->SetY($y);
$this->SetX($x+8);
$this->Cell(0,0,'Taxes');
$this->SetX($x+135);
$this->Cell(0,0,Currency::display($this->io->tax()),0,0,'R');
$y += 5;
$this->SetY($y);
$this->SetX($x+8);
$this->Cell(0,0,'Total Charges This Invoice');
$this->SetX($x+135);
$this->Cell(0,0,Currency::display($this->io->total()),0,0,'R');
// Show payments already received for this invoice
$y += 5;
$this->SetY($y);
$this->SetX($x+8);
$this->Cell(0,0,'Payments Received');
$this->SetX($x+135);
$this->Cell(0,0,$this->io->payments_total(TRUE),0,0,'R');
if ($this->io->total_credits()) {
$y += 5;
$this->SetY($y);
$this->SetFont('helvetica','B',9);
$this->SetX($x+8);
$this->Cell(0,0,_('Less Credits'));
$this->SetX($x+135);
$this->Cell(0,0,Currency::display(-$this->io->total_credits()),0,0,'R');
}
$y += 5;
$this->SetY($y);
$this->SetX($x+8);
$this->Cell(0,0,'Balance Due');
$this->SetX($x+135);
$this->Cell(0,0,$this->io->due(TRUE),0,0,'R');
}
/**
* This will draw the Summary Box, with the summary of the items
* on the invoice.
*/
public function drawDetailLineItems() {
$this->i = 0;
foreach ($this->io->items() as $io)
$this->drawLineItem($io);
}
/**
* Draws Invoice Detail Item
*
* @todo need to make sure that this pages well, when there are many items (with many sub details).
*/
private function drawLineItem($ito) {
$x = 10;
if ($this->i == 0 || $this->i%$this->max_lines_page == 0) {
$this->y = 5;
$this->AddPage();
$this->SetFont('helvetica','B',12);
$this->SetXY($x,$this->y); $this->Cell(0,0,_('Itemised Charges'));
$this->Cell(0,0,_('Page #').$this->PageNo(),0,0,'R');
$this->SetXY($x,$this->y); $this->Cell(0,0,_('Invoice #').$this->io->id(),0,0,'C');
// Draw table headers
$this->y += 10;
$this->SetFont('helvetica','B',8);
$this->SetXY($x,$this->y);
$this->Cell(0,0,_('Description'));
$this->SetX($x+135);
$this->Cell(0,0,_('Quantity'));
$this->SetX($x+160);
$this->Cell(10,0,_('Unit Cost'),0,0,'R');
$this->SetX($x+135);
$this->Cell(0,0,_('Amount'),0,0,'R');
$this->Line($x,$this->y+4,200,$this->y+4);
$this->y += 5;
$this->SetY($this->y);
}
$this->SetFont('helvetica','',8);
$this->SetX($x);
$this->Cell(0,0,sprintf('%s - %s',$ito->product->title(),$ito->service->name()));
if ($ito->price_base) {
$this->SetX($x+160);
$this->Cell(10,0,Currency::display($ito->price_base),0,0,'R');
}
if ($ito->quantity) {
$this->SetX($x+130);
$this->Cell(10,0,$ito->quantity,0,0,'R');
}
$this->SetX($x+130);
$this->Cell(0,0,Currency::display($ito->total()),0,0,'R');
if ($this->show_service_range && $ito->period()) {
$this->SetFont('helvetica','I',7);
$this->y += 3;
$this->SetXY($x+10,$this->y); $this->Cell(0,0,'Service Period');
$this->SetFont('helvetica','',7);
$this->SetXY($x+40,$this->y); $this->Cell(0,0,$ito->period());
}
if ($ito->invoice_detail_items())
foreach ($ito->invoice_detail_items() as $k=>$v) {
$this->SetFont('helvetica','I',7);
$this->y += 3;
$this->SetXY($x+10,$this->y); $this->Cell(0,0,$k);
$this->SetFont('helvetica','',7);
$this->SetXY($x+40,$this->y); $this->Cell(0,0,$v);
}
$this->y += 5;
$this->SetY($this->y);
$this->i++;
}
}
?>