2010-11-29 22:41:08 +00:00
< ? 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 {
2011-05-02 12:28:17 +00:00
// This invoice Object
private $io ;
2010-11-29 22:41:08 +00:00
public static function instance () {
return new Invoice ;
}
/**
2011-05-02 12:28:17 +00:00
* Return a list of invoices for an service
2010-11-29 22:41:08 +00:00
*
* @ param $id int Service ID
* @ param $paid boolean Optionally only list the ones that are not paid .
* @ return array
*/
2011-05-02 12:28:17 +00:00
// @todo Function Not Used
2010-11-29 22:41:08 +00:00
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 ()
*/
2011-05-02 12:28:17 +00:00
// @todo Function Not Used
2010-11-29 22:41:08 +00:00
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
*/
2011-05-02 12:28:17 +00:00
// @todo Function Not Used
2010-11-29 22:41:08 +00:00
public static function servicedue ( $id ) {
$due = 0 ;
foreach ( Invoice :: servicelist ( $id , FALSE ) as $item )
if ( $due < $item [ 'due' ])
$due = $item [ 'due' ];
return $due ;
}
2011-05-02 12:28:17 +00:00
// @todo Function Not Used
2010-11-29 22:41:08 +00:00
public static function balance ( $id ) {
2011-05-02 12:28:17 +00:00
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 ();
2010-11-29 22:41:08 +00:00
}
}
?>