Work on invoice printing - to clean up

This commit is contained in:
Deon George
2011-05-02 22:28:17 +10:00
parent 2f7a10804e
commit 8013aadc4c
16 changed files with 1045 additions and 73 deletions

View File

@@ -11,17 +11,21 @@
* @license http://dev.leenooks.net/license.html
*/
class Invoice {
// This invoice Object
private $io;
public static function instance() {
return new Invoice;
}
/**
* Return a list of invoices for an invoice
* Return a list of invoices for an service
*
* @param $id int Service ID
* @param $paid boolean Optionally only list the ones that are not paid.
* @return array
*/
// @todo Function Not Used
public static function servicelist($id,$paid=TRUE) {
// @todo need to add the db prefix
$invoices = DB::Query(Database::SELECT,'
@@ -50,6 +54,7 @@ SELECT i.id AS iid,i.due_date AS due FROM ab_invoice i,ab_invoice_item ii WHERE
* @return real Total amount outstanding
* @see Invoice::listservice()
*/
// @todo Function Not Used
public static function servicetotal($id,$paid=TRUE) {
$total = 0;
@@ -65,6 +70,7 @@ SELECT i.id AS iid,i.due_date AS due FROM ab_invoice i,ab_invoice_item ii WHERE
* @param $id int Service ID
* @return datetime
*/
// @todo Function Not Used
public static function servicedue($id) {
$due = 0;
@@ -75,18 +81,149 @@ SELECT i.id AS iid,i.due_date AS due FROM ab_invoice i,ab_invoice_item ii WHERE
return $due;
}
// @todo Function Not Used
public static function balance($id) {
$invoice = ORM::factory('invoice')
->where('id','=',$id)
->find();
return ORM::factory('invoice',$id)->due();
}
// @todo We should call check() here to re-run the validation, which re-calcs the total
// @todo might need to cache these results for performance
#if ($invoice->loaded() AND $invoice->check())
if ($invoice->loaded())
return $invoice->total_amt-$invoice->billed_amt-$invoice->credit_amt;
else
return 0;
/**
* Generate a PDF invoice
*/
public function pdf($io) {
$invoice_class = sprintf('invoice_pdf_%s',Kohana::config('invoice.driver'));
if (! class_exists($invoice_class))
throw new Kohana_Exception('Invoice class :class doesnt exist',array(':class'=>$invoice_class));
$this->io = $io;
$pdf = new $invoice_class($io);
if ($pdf->getTemplate()) {
$pagecount = $pdf->setSourceFile($pdf->getTemplate());
$tplidx = $pdf->ImportPage(1);
}
$pdf->addPage();
# If we are using FPDI
if (isset($tplidx))
$pdf->useTemplate($tplidx);
$this->draw_summary_invoice($pdf);
# If we get here, all is OK.
return $pdf;
}
private function draw_summary_invoice($pdf) {
// Draw Invoice Basics
$pdf->drawCompanyLogo();
$pdf->drawCompanyAddress();
$pdf->drawInvoiceHeader();
// @todo Get news from DB
$pdf->drawNews('');
$pdf->drawRemittenceStub();
$pdf->drawPaymentMethods();
if ($this->io->billing_status !=1 && $this->io->suspend_billing != 1 && $this->io->due_date <= time())
$pdf->drawInvoiceDueNotice();
elseif($this->io->billing_status == 1)
$pdf->drawInvoicePaidNotice();
if ($this->io->account->invoices_due_total())
$pdf->drawSummaryInvoicesDue();
$pdf->drawSummaryLineItems();
return;
#unset($pdf->itemsSummary);
# BEGIN loop for enumerating information in multiple ways on the invoice
$iteration = 0;
while ($pdf->drawLineItems_pre($iteration)) {
foreach ($this->sInvoiceItems() as $index => $items) {
# Get the date range if set
if (! empty($items['date_start']) && ! empty($items['date_stop'])) {
global $C_translate;
$C_translate->value('invoice','start',date(UNIX_DATE_FORMAT,$items['date_start']));
$C_translate->value('invoice','stop',date(UNIX_DATE_FORMAT,$items['date_stop']));
}
$line = array(
'name'=>$this->sLineItemDesc($index),
'domain'=>$items['domain_name'],
'amount'=>$items['price_base'],
'sku'=>$items['sku'],
'qty'=>$items['quantity'],
'cost'=>$items['price_base'],
'attr'=>$items['product_attr'],
'price_type'=>$items['price_type'],
'price_base'=>$items['price_base'],
'item_type'=>$items['item_type'],
'total_amt'=>$items['total_amt']
);
if ($items['date_start'] && $items['date_stop'])
if ($items['date_start'] == $items['date_stop'])
$line['daterange'] = sprintf('%s',date(UNIX_DATE_FORMAT,$items['date_start']));
else
$line['daterange'] = sprintf('%s - %s',date(UNIX_DATE_FORMAT,$items['date_start']),date(UNIX_DATE_FORMAT,$items['date_stop']));
$pdf->drawLineItems($db,$line,$this->getRecordAttr('id'));
if ($items['price_setup']) {
$line = array(
'name'=>sprintf('%s - %s',$this->sLineItemDesc($index),_('Setup Charge')),
'amount'=>$items['price_setup'],
'qty'=>'1',
'sku'=>$items['sku'],
'cost'=>$items['price_setup'],
'price_base'=>$items['price_setup'],
'price_type'=>999
);
$pdf->drawLineItems($db,$line,$this->getRecordAttr('id'));
}
}
if ($this->print['invoice']['discount_amt']) {
$line = array(
'name'=>_('Discount'),
'amount'=>-($this->print['invoice']['discount_amt']),
'qty'=>'1',
'cost'=>-($this->print['invoice']['discount_amt']),
'price_base'=>-($this->print['invoice']['discount_amt']),
'price_type'=>999);
$pdf->drawLineItems($db,$line,$this->getRecordAttr('id'));
}
if ($this->print['invoice']['tax_amt']) {
$rs = $db->Execute(sqlSelect($db,array('invoice_item_tax','tax'),'A.amount,B.description',sprintf('A.tax_id=B.id AND A.invoice_id=%s',$this->getRecordAttr('id'))));
if ($rs && $rs->RecordCount()) {
$taxes = array();
while (! $rs->EOF) {
if (! isset($taxes[$rs->fields['description']]))
$taxes[$rs->fields['description']] = $rs->fields['amount'];
else
$taxes[$rs->fields['description']] += $rs->fields['amount'];
$rs->MoveNext();
}
foreach ($taxes as $txds => $txamt) {
$line = array('name'=>$txds,'amount'=>$txamt,'total_amt'=>$txamt,'price_type'=>999);
$pdf->drawLineItems($db,$line,$this->getRecordAttr('id'));
}
}
}
# Increment the iteration
++$iteration;
}
# Custom functions:
$pdf->drawCustom();
}
}
?>