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.
khosb/modules/invoice/classes/invoice.php
2011-07-18 16:19:26 +10:00

230 lines
7.3 KiB
PHP

<?php defined('SYSPATH') or die('No direct access allowed.');
/**
* This class provides invoice information
*
* @package OSB
* @subpackage Invoice
* @category Helpers
* @author Deon George
* @copyright (c) 2010 Deon George
* @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 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,'
SELECT i.id AS iid,i.due_date AS due FROM ab_invoice i,ab_invoice_item ii WHERE ii.invoice_id=i.id AND service_id=:id GROUP BY i.id
')
->param(':id',$id)
->execute();
$service_invoices = array();
foreach ($invoices as $item) {
if ($bal = Invoice::balance($item['iid']) OR $paid) {
$service_invoices[$item['iid']]['id'] = $item['iid'];
$service_invoices[$item['iid']]['total'] = $bal;
$service_invoices[$item['iid']]['due'] = $item['due'];
}
}
return $service_invoices;
}
/**
* Return the total of amount outstanding for a service
*
* @param $id int Service ID
* @param $paid boolean Optionally only list the ones that are not paid.
* @return real Total amount outstanding
* @see Invoice::listservice()
*/
// @todo Function Not Used
public static function servicetotal($id,$paid=TRUE) {
$total = 0;
foreach (Invoice::servicelist($id,$paid) as $item)
$total += $item['total'];
return $total;
}
/**
* Return the earliest due date of an outstanding invoice
*
* @param $id int Service ID
* @return datetime
*/
// @todo Function Not Used
public static function servicedue($id) {
$due = 0;
foreach (Invoice::servicelist($id,FALSE) as $item)
if ($due < $item['due'])
$due = $item['due'];
return $due;
}
// @todo Function Not Used
public static function balance($id) {
return ORM::factory('invoice',$id)->due();
}
/**
* 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();
}
}
?>