OSB enhancements to date
This commit is contained in:
93
modules/invoice/classes/model/invoice/item.php
Normal file
93
modules/invoice/classes/model/invoice/item.php
Normal file
@@ -0,0 +1,93 @@
|
||||
<?php defined('SYSPATH') or die('No direct access allowed.');
|
||||
|
||||
/**
|
||||
* This class provides invoice item capabilities.
|
||||
*
|
||||
* @package OSB
|
||||
* @subpackage Invoice
|
||||
* @category Models
|
||||
* @author Deon George
|
||||
* @copyright (c) 2010 Open Source Billing
|
||||
* @license http://dev.osbill.net/license.html
|
||||
*/
|
||||
class Model_Invoice_Item extends ORMOSB {
|
||||
protected $_belongs_to = array(
|
||||
'product'=>array(),
|
||||
'invoice'=>array(),
|
||||
'service'=>array()
|
||||
);
|
||||
protected $_has_many = array(
|
||||
'invoice_item_tax'=>array()
|
||||
);
|
||||
protected $_updated_column = FALSE; // @todo No update columns
|
||||
|
||||
// Display a transaction number
|
||||
public function trannum() {
|
||||
return sprintf('%03s-%06s',$this->item_type,$this->id);
|
||||
}
|
||||
|
||||
// Display the period that a transaction applies
|
||||
public function period() {
|
||||
if ($this->date_start == $this->date_stop)
|
||||
return sprintf('%s: %s',_('Date'),Config::date($this->date_start));
|
||||
|
||||
else
|
||||
return sprintf('%s: %s -> %s',_('Period'),Config::date($this->date_start),Config::date($this->date_stop));
|
||||
}
|
||||
|
||||
/**
|
||||
* On invoices where there are multiple charges for the same item
|
||||
* (eg spanning the next invoice period), this should show the period
|
||||
* range for the additional sub-items.
|
||||
*/
|
||||
public function invoice_display() {
|
||||
return $this->period();
|
||||
}
|
||||
|
||||
public function subtotal() {
|
||||
return ($this->price_base+$this->price_setup)*$this->quantity;
|
||||
}
|
||||
|
||||
public function total() {
|
||||
return ($this->price_base+$this->price_setup)*$this->quantity+$this->tax_amt-$this->discount_amt;
|
||||
}
|
||||
|
||||
public function save() {
|
||||
// Save the invoice item
|
||||
parent::save();
|
||||
|
||||
// Need to save the taxes and discounts associated with the invoice_item
|
||||
if ($this->saved()) {
|
||||
$invoice_item_tax = ORM::factory('invoice_item_tax');
|
||||
$tax_total = 0;
|
||||
|
||||
// Save TAX details
|
||||
// @todo tax parameters should come from user session
|
||||
foreach (Tax::detail(61,NULL,$this->subtotal()) as $tax) {
|
||||
$invoice_item_tax->clear();
|
||||
$invoice_item_tax->invoice_item_id = $this->id;
|
||||
// @todo Rounding here should come from a global config
|
||||
$tax_total += ($invoice_item_tax->amount = round($tax['amount'],2));
|
||||
$invoice_item_tax->tax_id = $tax['id'];
|
||||
|
||||
if (! $invoice_item_tax->check())
|
||||
throw new Kohana_Exception('Couldnt save tax for some reason - failed check()?');
|
||||
|
||||
$invoice_item_tax->save();
|
||||
|
||||
if (! $invoice_item_tax->saved())
|
||||
throw new Kohana_Exception('Couldnt save tax for some reason - failed save()?');
|
||||
}
|
||||
|
||||
// Save DISCOUNT details
|
||||
// @todo calculate discounts
|
||||
|
||||
$this->tax_amt = $tax_total;
|
||||
$this->total_amt = $this->total();
|
||||
parent::save();
|
||||
|
||||
} else
|
||||
throw new Kohana_Exception('Couldnt save invoice_item for some reason?');
|
||||
}
|
||||
}
|
||||
?>
|
Reference in New Issue
Block a user