Open Source Billing

This commit is contained in:
Deon George
2013-10-10 13:44:53 +11:00
commit b02d70adf0
2344 changed files with 392978 additions and 0 deletions

View File

@@ -0,0 +1,17 @@
<?php defined('SYSPATH') or die('No direct access allowed.');
/**
* This class provides Admin Account management
*
* @package OSB
* @category Controllers/Admin
* @author Deon George
* @copyright (c) 2009-2013 Open Source Billing
* @license http://dev.osbill.net/license.html
*/
class Controller_Admin_Account extends Controller_Account {
protected $secure_actions = array(
'group'=>FALSE, // @todo Testing
);
}
?>

View File

@@ -0,0 +1,130 @@
<?php defined('SYSPATH') or die('No direct access allowed.');
/**
* This class provides MODULE management
*
* @package OSB
* @category Controllers/Admin
* @author Deon George
* @copyright (c) 2009-2013 Open Source Billing
* @license http://dev.osbill.net/license.html
*/
class Controller_Admin_Module extends Controller_Module {
protected $secure_actions = array(
'add'=>TRUE,
'edit'=>TRUE,
'list'=>TRUE,
);
/**
* Get the list of methods for a class
*/
protected function _methods($class) {
// Get a list of methods this module has
$ch = 'Controller_%s';
$methods = array();
// List of classes where all our methods are, including this one.
$classes = URL::$method_directory;
array_unshift($classes,'');
foreach ($classes as $c) {
$cn = Kohana::classname('Controller_'.$c ? $c.'_'.$class : $class);
if (class_exists($cn)) {
$r = new ReflectionClass($cn);
foreach ($r->getMethods() as $method)
if (preg_match('/^Controller_(.*_)?'.$class.'$/i',$method->class) AND ! preg_match('/^_/',$method->name))
array_push($methods,str_replace('action_',($c ? $c.'_' : $c),$method->name));
}
}
return $methods;
}
/**
* List our installed modules
*/
public function action_list() {
$mo = ORM::factory('Module');
Block::add(array(
'title'=>_('Defined Modules'),
'body'=>Table::display(
$mo->find_all(),
25,
array(
'id'=>array('label'=>'ID','url'=>URL::link('admin','module/edit/')),
'name'=>array('label'=>'Name'),
'status'=>array('label'=>'Active'),
),
array(
'page'=>TRUE,
'type'=>'list',
)),
));
}
/**
* Edit a Module Configuration
*
* @todo Highlight those methods that have security, but the class does not have auth_required set to YES or the method isnt defined in secure_actions
*/
public function action_edit() {
$mid = $this->request->param('id');
$mo = ORM::factory('Module',$mid);
if (! $mo->loaded()) {
SystemMessage::add(array(
'title'=>_('Invalid Module ID'),
'type'=>'error',
'body'=>sprintf(_('Module with ID %s doesnt appear to exist?'),$mid),
));
return;
}
$output = '';
$methods = $this->_methods($mo->name);
// Show methods defined in the DB already.
Block::add(array(
'title'=>sprintf('%s: %s ',_('Defined Module Methods For'),$mo->display('name')),
'body'=>Table::display(
$mo->module_method->find_all(),
25,
array(
'id'=>array('label'=>'ID','url'=>URL::link('admin','module_method/edit/')),
'name'=>array('label'=>'Name'),
'notes'=>array('label'=>'Notes'),
'menu_display'=>array('label'=>'Menu'),
),
array(
'page'=>TRUE,
'type'=>'list',
)),
));
// Show new methods NOT defined in the DB already.
foreach ($mo->module_method->find_all() as $meo)
if (($method = array_search($meo->name,$methods)) !== false)
unset($methods[$method]);
if (count($methods))
Block::add(array(
'title'=>sprintf('%s: %s ',_('Undefined Module Methods For'),$mo->display('name')),
'body'=>Table::display(
$methods,
25,
array(
'__VALUE__'=>array('label'=>'Name','url'=>URL::link('admin','module_method/add/'.$mo->id)),
),
array(
'page'=>TRUE,
'type'=>'list',
)),
));
}
}
?>

View File

@@ -0,0 +1,137 @@
<?php defined('SYSPATH') or die('No direct access allowed.');
/**
* This class provides MODULE management
*
* @package OSB
* @category Controllers/Admin
* @author Deon George
* @copyright (c) 2009-2013 Open Source Billing
* @license http://dev.osbill.net/license.html
*/
class Controller_Admin_Module_Method extends Controller_Admin_Module {
/**
* Add a method to the database
*/
public function action_add() {
$id = $this->request->param('id');
$method = $this->request->param('sid');
$mo = ORM::factory('Module',$id);
$mmo = ORM::factory('Module_Method');
if (! $mo->loaded() OR ! in_array($method,$this->_methods($mo->name)))
throw new Kohana_Exception('Method (:method) does not exist in :class',array(':method'=>$method,':class'=>$mo->name));
$mmo->name = $method;
$mmo->module_id = $mo->id;
$mmo->values($_POST);
$output = '';
if ($_POST AND $mmo->values($_POST)->check()) {
$mmo->save();
if ($mmo->saved()) {
SystemMessage::add(array(
'title'=>_('Method Added'),
'type'=>'info',
'body'=>sprintf(_('Method %s defined to database'),$mmo->name),
));
HTTP::redirect(URL::link('admin','/module/edit/'.$mo->id));
} else {
SystemMessage::add(array(
'title'=>_('Method Not Saved'),
'type'=>'error',
'body'=>sprintf(_('Unable to define Method %s to database?'),$mmo->name),
));
}
}
$output .= View::factory('module/admin/method_add')
->set('module',$mo)
->set('method',$mmo);
Block::add(array(
'title'=>sprintf(_('Add Method (%s) to Database for (%s)'),strtoupper($mmo->name),strtoupper($mo->name)),
'body'=>$output,
));
}
/**
* Edit a Module Configuration
*
* @param int $mid Module ID
*/
public function action_edit() {
$mid = $this->request->param('id');
$mmo = ORM::factory('Module_Method',$mid);
if (! $mmo->loaded()) {
SystemMessage::add(array(
'title'=>_('Invalid Method ID'),
'type'=>'error',
'body'=>sprintf(_('Method with ID %s doesnt appear to exist?'),$mid),
));
return;
}
$output = '';
// The groups that can run this method.
$groups = ORM::factory('Group');
if ($_POST) {
foreach ($groups->find_all() as $go) {
// If the group was defined and no longer
if ($mmo->has('group',$go) AND (! isset($_POST['groups']) OR ! in_array($go->id,$_POST['groups']))) {
$gm = ORM::factory('Group_Method',array('method_id'=>$mmo->id,'group_id'=>$go->id));
if (! $gm->delete())
SystemMessage::add(array(
'title'=>_('Unable to DELETE Group Method'),
'type'=>'error',
'body'=>sprintf(_('Unable to delete Group Method for method %s and group %s'),$mmo->name,$go->name),
));
// If the group was not defined and now is
} elseif (! $mmo->has('group',$go) AND isset($_POST['groups']) AND in_array($go->id,$_POST['groups'])) {
$gm = ORM::factory('Group_Method')
->values(array(
'method_id'=>$mmo->id,
'group_id'=>$go->id,
));
if (! $gm->check() OR ! $gm->save())
SystemMessage::add(array(
'title'=>_('Unable to SAVE Group Method'),
'type'=>'error',
'body'=>sprintf(_('Unable to save Group Method for method %s and group %s'),$mmo->name,$go->name),
));
}
}
}
$output .= Form::open();
$output .= View::factory('module/admin/method_detail_head');
foreach ($groups->find_all() as $go) {
$output .= View::factory('module/admin/method_detail_body')
->set('group',$go)
->set('defined',$mmo->has('group',$go));
}
$output .= View::factory('module/admin/method_detail_foot');
$output .= '<div>'.Form::submit('submit',_('Update'),array('class'=>'form_button')).'</div>';
$output .= Form::close();
Block::add(array(
'title'=>sprintf(_('%s->%s Method'),strtoupper($mmo->module->name),strtoupper($mmo->name)),
'body'=>$output,
));
}
}
?>

View File

@@ -0,0 +1,73 @@
<?php defined('SYSPATH') or die('No direct access allowed.');
/**
* This class provides Siet Configuration Setup
*
* @package OSB
* @category Controllers/Admin
* @author Deon George
* @copyright (c) 2009-2013 Open Source Billing
* @license http://dev.osbill.net/license.html
*/
class Controller_Admin_Setup extends Controller_TemplateDefault {
protected $secure_actions = array(
'edit'=>TRUE,
);
/**
* View/Update the site configuration
*/
public function action_edit() {
$o = Company::instance()->so();
$output = '';
if ($_POST) {
// Entry updated
if ($o->values($_POST)->check() AND $o->save())
SystemMessage::add(array(
'title'=>'Site Configuration Recorded',
'type'=>'info',
'body'=>'Site Config successfully recorded.',
));
}
$output .= Form::open();
// site_details
$output .= View::factory($this->viewpath())
->set('o',$o);;
$output .= '<div>'.Form::submit('submit','submit',array('class'=>'form_button')).'</div>';
$output .= Form::close();
Block::add(array(
'title'=>_('Update Site Configuration'),
'body'=>$output,
));
// module_config
$output = '';
$output .= View::factory($this->viewpath().'/module/head');
foreach ($o->module_config as $mid => $detail) {
$mo = ORM::factory('Module',$mid);
$output .= View::factory($this->viewpath().'/module/body')
->set('mo',$mo);
Script::add(array('type'=>'stdin','data'=>'
$(document).ready(function() {
$("div[id='.$mo->name.']").load("'.URL::link('admin',$mo->name.'/setup',TRUE).'");
});'
));
}
$output .= View::factory($this->viewpath().'/module/foot');
Block::add(array(
'title'=>_('Update Module Specific Configuration'),
'body'=>$output,
));
}
}
?>

View File

@@ -0,0 +1,130 @@
<?php defined('SYSPATH') or die('No direct access allowed.');
/**
* OSB Admin Main home page
*
* @package OSB
* @category Controllers/Admin
* @author Deon George
* @copyright (c) 2009-2013 Open Source Billing
* @license http://dev.osbill.net/license.html
*/
class Controller_Admin_Welcome extends Controller_Welcome {
protected $auth_required = TRUE;
public $secure_actions = array(
'index'=>TRUE,
);
public function action_index() {
$t = time();
// Show outstanding invoices
$o = ORM::factory('Invoice');
Block_Sub::add(array(
'title'=>'Invoices Overdue - No Auto Billing',
'body'=>Table::display(
$o->list_overdue_billing($t),
25,
array(
'due_date'=>array('label'=>'Due Date'),
'account->accnum()'=>array('label'=>'Num'),
'account->name()'=>array('label'=>'Account'),
'account->display("status")'=>array('label'=>'Active'),
'id'=>array('label'=>'ID','url'=>URL::link('user','invoice/view/')),
'total(TRUE)'=>array('label'=>'Total','class'=>'right'),
'due(TRUE)'=>array('label'=>'Amount Due','class'=>'right'),
),
array('page'=>TRUE)),
'position'=>1,
'order'=>1,
));
Block_Sub::add(array(
'title'=>'Invoices Overdue - Auto Billing',
'body'=>Table::display(
$o->list_overdue_billing($t,TRUE),
25,
array(
'due_date'=>array('label'=>'Due Date'),
'account->accnum()'=>array('label'=>'Num'),
'account->name()'=>array('label'=>'Account'),
'account->display("status")'=>array('label'=>'Active'),
'id'=>array('label'=>'ID','url'=>URL::link('user','invoice/view/')),
'total(TRUE)'=>array('label'=>'Total','class'=>'right'),
'due(TRUE)'=>array('label'=>'Amount Due','class'=>'right'),
),
array('page'=>TRUE)),
'position'=>2,
'order'=>1,
));
Block_Sub::add(array(
'title'=>'Invoices Due',
'body'=>Table::display(
$o->list_due(),
25,
array(
'due_date'=>array('label'=>'Due Date'),
'account->accnum()'=>array('label'=>'Num'),
'account->name()'=>array('label'),
'account->display("status")'=>array('label'=>'Active'),
'id'=>array('label'=>'ID','url'=>URL::link('user','invoice/view/')),
'total(TRUE)'=>array('label'=>'Total','class'=>'right'),
'due(TRUE)'=>array('label'=>'Amount Due','class'=>'right'),
),
array('show_other'=>'due()')),
'position'=>3,
'order'=>1,
));
// Show un-applied payments
Block_Sub::add(array(
'title'=>'Unapplied Payments',
'body'=>Table::display(
ORM::factory('Payment')->list_unapplied(),
25,
array(
'date_payment'=>array('label'=>'Pay Date'),
'account->accnum()'=>array('label'=>'Num'),
'account->name()'=>array('label'=>'Account'),
'account->display("status")'=>array('label'=>'Active'),
'id'=>array('label'=>'ID','url'=>URL::link('admin','payment/view/')),
'total_amt'=>array('label'=>'Total','class'=>'right'),
'balance(TRUE)'=>array('label'=>'Balance','class'=>'right'),
),
array('show_other'=>'balance()')),
'position'=>1,
'order'=>2,
));
Block::add(array(
'title'=>sprintf('%s: %s %s',$this->ao->accnum(),$this->ao->first_name,$this->ao->last_name),
'subtitle'=>_('Administrator Overview'),
'body'=>(string)Block_Sub::factory(),
));
// We are a site administrator
$output = '';
if ($this->ao->rtm_id == NULL) {
$rtmo = ORM::factory('RTM',array('account_id','=',$this->ao->id))->find();
// Quick validation, if we are an admin, we should have an entry in the RTM table.
if (! $rtmo->loaded())
throw new Kohana_Exception('User :aid not set up properly',array(':aid'=>$this->ao->id));
$output = View::factory('welcome/admin')
->set('o',$rtmo);
} else {
$rtmo = ORM::factory('RTM',$this->ao->rtm_id);
}
if ($output)
Block::add(array(
'title'=>sprintf('Reseller %s',$this->ao->display('company')),
'body'=>$output,
));
}
}
?>