371 lines
10 KiB
PHP
371 lines
10 KiB
PHP
<?php defined('SYSPATH') or die('No direct access allowed.');
|
|
|
|
/**
|
|
* This class provides Admin Service functions
|
|
*
|
|
* @package Service
|
|
* @category Controllers/Admin
|
|
* @author Deon George
|
|
* @copyright (c) 2009-2013 Open Source Billing
|
|
* @license http://dev.osbill.net/license.html
|
|
*/
|
|
class Controller_Admin_Service extends Controller_Service {
|
|
protected $secure_actions = array(
|
|
'add'=>TRUE,
|
|
'ajaxaddplugin'=>TRUE,
|
|
'edit'=>TRUE,
|
|
'listdomainservicesbysupplier'=>TRUE,
|
|
'listdomainservicesbydnshost'=>TRUE,
|
|
'listhostservicesbysupplier'=>TRUE,
|
|
'view'=>TRUE,
|
|
);
|
|
|
|
public function action_add() {
|
|
if ($this->request->post() AND $so=$this->add_edit() AND $so->loaded())
|
|
HTTP::redirect(URL::link('admin','service/edit/'.$so->id));
|
|
|
|
// @todo This AJAX URL should be a service one
|
|
Script::factory()
|
|
->type('stdin')
|
|
->data('
|
|
$(document).ready(function() {
|
|
$("select[name=product_id]").change(function() {
|
|
// If we select a blank, then dont continue
|
|
if (this.value == 0)
|
|
return false;
|
|
|
|
// Send the request and update sub category dropdown
|
|
$.ajax({
|
|
type: "GET",
|
|
data: "key="+$(this).val(),
|
|
dataType: "html",
|
|
cache: false,
|
|
url: "'.URL::link('admin','service/ajaxaddplugin/',TRUE).'",
|
|
timeout: 2000,
|
|
error: function(x) {
|
|
alert("Failed to submit");
|
|
},
|
|
success: function(data) {
|
|
$("div[id=plugin]").empty().append(data);
|
|
}
|
|
});
|
|
});
|
|
|
|
$("#date_next_invoice_label").datepicker({
|
|
autoclose : true,
|
|
format : "dd-M-yyyy",
|
|
todayBtn : true,
|
|
}).on("hide",function(ev) {
|
|
$("input[name=date_next_invoice]").val(ev.date.valueOf()/1000);
|
|
});
|
|
|
|
$("input[name=account_id_label]").typeahead({
|
|
minLength: 2,
|
|
source: function (query,process) {
|
|
search("'.URL::link('admin','payment/ajaxlist').'",query,process);
|
|
},
|
|
|
|
matcher: function () { return true; },
|
|
|
|
updater: function (item) {
|
|
$("input[name=account_id]").val(users[item]);
|
|
|
|
return item;
|
|
},
|
|
});
|
|
});
|
|
');
|
|
|
|
Script::factory()
|
|
->type('file')
|
|
->data('media/theme/bootstrap/vendor/datepicker/js/bootstrap-datepicker.js');
|
|
|
|
Style::factory()
|
|
->type('file')
|
|
->data('media/theme/bootstrap/vendor/datepicker/css/datepicker.css');
|
|
|
|
Block::factory()
|
|
->type('form-horizontal')
|
|
->title('Add/View Charge')
|
|
->title_icon('icon-wrench')
|
|
->body(View::factory('service/admin/add'));
|
|
}
|
|
|
|
public function action_ajaxaddplugin() {
|
|
$po = ORM::factory('Product',$this->request->query('key'));
|
|
|
|
if (! $po->loaded()) {
|
|
$output = __('Unable to find product :key',array(':key'=>$this->request->query('key')));
|
|
|
|
} else {
|
|
$output = $po->plugin()->render_order();
|
|
}
|
|
|
|
$this->template->content = $output;
|
|
}
|
|
|
|
public function action_edit() {
|
|
list($id,$output) = Table::page(__METHOD__);
|
|
|
|
$so = $this->request->post() ? $this->add_edit($id) : ORM::factory('Service',$id);
|
|
|
|
if (! $so->loaded())
|
|
HTTP::redirect('welcome/index');
|
|
|
|
Script::factory()
|
|
->type('file')
|
|
->data('media/theme/bootstrap/vendor/datepicker/js/bootstrap-datepicker.js');
|
|
|
|
Style::factory()
|
|
->type('file')
|
|
->data('media/theme/bootstrap/vendor/datepicker/css/datepicker.css');
|
|
|
|
Script::factory()
|
|
->type('stdin')
|
|
->data('
|
|
$(document).ready(function() {
|
|
$("#date_next_invoice_label").datepicker({
|
|
autoclose : true,
|
|
format : "dd-M-yyyy",
|
|
todayBtn : true,
|
|
}).on("hide",function(ev) {
|
|
$("input[name=date_next_invoice]").val(ev.date.valueOf()/1000);
|
|
});
|
|
|
|
$("#service_connect_date_label").datepicker({
|
|
autoclose : true,
|
|
format : "dd-M-yyyy",
|
|
todayBtn : true,
|
|
}).on("hide",function(ev) {
|
|
$("input[id=service_connect_date]").val(ev.date.valueOf()/1000);
|
|
});
|
|
|
|
$("#service_contract_date_label").datepicker({
|
|
autoclose : true,
|
|
format : "dd-M-yyyy",
|
|
todayBtn : true,
|
|
}).on("hide",function(ev) {
|
|
$("input[id=service_contract_date]").val(ev.date.valueOf()/1000);
|
|
});
|
|
});
|
|
');
|
|
|
|
Block::factory()
|
|
->type('form-horizontal')
|
|
->title(sprintf('%s: %s %s',_('Update Service'),$id,$so->name()))
|
|
->title_icon('icon-wrench')
|
|
->body(View::factory('service/admin/edit')
|
|
->set('o',$so)
|
|
->set('plugin_form',$so->plugin_edit())
|
|
);
|
|
|
|
}
|
|
|
|
public function action_listdomainservicesbysupplier() {
|
|
$svs = ORM::factory('Service')->list_bylistgroup('DOMAIN');
|
|
Sort::MAsort($svs,'plugin()->domain_registrar_id,name()');
|
|
|
|
$list = array();
|
|
|
|
foreach ($svs as $so)
|
|
$list[$so->plugin()->domain_registrar_id][] = $so;
|
|
|
|
foreach (array_keys($list) as $sid)
|
|
Block::add(array(
|
|
'title'=>sprintf(_('Domain Names by Supplier %s'),$sid),
|
|
'body'=>Table::display(
|
|
$list[$sid],
|
|
25,
|
|
array(
|
|
'id'=>array('label'=>'ID','url'=>URL::link('user','service/view/')),
|
|
'service_name()'=>array('label'=>'Details'),
|
|
'plugin()->display("domain_expire")'=>array('label'=>'Expire'),
|
|
'recur_schedule'=>array('label'=>'Billing'),
|
|
'price(TRUE,TRUE)'=>array('label'=>'Price','class'=>'right'),
|
|
'account->accnum()'=>array('label'=>'Cust ID'),
|
|
'account->name()'=>array('label'=>'Customer'),
|
|
'display("date_next_invoice")'=>array('label'=>'Next Invoice'),
|
|
),
|
|
array(
|
|
'page'=>TRUE,
|
|
'type'=>'select',
|
|
'form'=>URL::link('user','service/view'),
|
|
)),
|
|
));
|
|
}
|
|
|
|
public function action_listdomainservicesbydnshost() {
|
|
$svs = ORM::factory('Service')->list_bylistgroup('DOMAIN');
|
|
Sort::MAsort($svs,'plugin()->host,name()');
|
|
|
|
$list = array();
|
|
|
|
foreach ($svs as $so)
|
|
$list[$so->plugin()->host->host_server_id][] = $so;
|
|
|
|
foreach (array_keys($list) as $sid)
|
|
Block::add(array(
|
|
'title'=>sprintf(_('Domain Names by DNS Host [%s]'),$sid),
|
|
'body'=>Table::display(
|
|
$list[$sid],
|
|
25,
|
|
array(
|
|
'id'=>array('label'=>'ID','url'=>URL::link('user','service/view/')),
|
|
'service_name()'=>array('label'=>'Details'),
|
|
'plugin()->registrar->id'=>array('label'=>'SID'),
|
|
'plugin()->registrar->name'=>array('label'=>'Supplier'),
|
|
'display("date_next_invoice")'=>array('label'=>'Next Invoice'),
|
|
),
|
|
array(
|
|
'page'=>TRUE,
|
|
'type'=>'select',
|
|
'form'=>URL::link('user','service/view'),
|
|
)),
|
|
));
|
|
}
|
|
|
|
public function action_listhostservicesbysupplier() {
|
|
$svs = ORM::factory('Service')->list_bylistgroup('HOST');
|
|
Sort::MAsort($svs,'plugin()->host,name()');
|
|
|
|
$list = array();
|
|
|
|
foreach ($svs as $so)
|
|
$list[$so->plugin()->host_server_id][] = $so;
|
|
|
|
foreach (array_keys($list) as $sid)
|
|
Block::add(array(
|
|
'title'=>sprintf(_('Hosting by Supplier %s'),$sid),
|
|
'body'=>Table::display(
|
|
$list[$sid],
|
|
25,
|
|
array(
|
|
'id'=>array('label'=>'ID','url'=>URL::link('user','service/view/')),
|
|
'service_name()'=>array('label'=>'Details'),
|
|
'plugin()->display("host_expire")'=>array('label'=>'Expire'),
|
|
'recur_schedule'=>array('label'=>'Billing'),
|
|
'price(TRUE,TRUE)'=>array('label'=>'Price','class'=>'right'),
|
|
'account->accnum()'=>array('label'=>'Cust ID'),
|
|
'account->name()'=>array('label'=>'Customer'),
|
|
'display("date_next_invoice")'=>array('label'=>'Next Invoice'),
|
|
),
|
|
array(
|
|
'page'=>TRUE,
|
|
'type'=>'select',
|
|
'form'=>URL::link('user','service/view'),
|
|
)),
|
|
));
|
|
}
|
|
|
|
public function action_view() {
|
|
list($id,$output) = Table::page(__METHOD__);
|
|
|
|
$so = ORM::factory('Service',$id);
|
|
|
|
if (! $so->loaded() OR ! Auth::instance()->authorised($so->account))
|
|
throw HTTP_Exception::factory(403,'Service either doesnt exist, or you are not authorised to see it');
|
|
|
|
$doutput = $loutput = '';
|
|
|
|
$loutput .= View::factory('service/admin/view')
|
|
->set('o',$so);
|
|
|
|
// Validate the transactions
|
|
$bt = NULL;
|
|
$pr = TRUE; // Next entry is a pro-rata
|
|
foreach ($so->transactions()->where('item_type','=',0)->find_all() as $iio) {
|
|
// @todo This hard coding of 3070 should be removed.
|
|
// $xsid=197;
|
|
// if (($iio->service_id == $xsid AND $iio->invoice_id < 3070) OR in_array($iio->id,array(960))) continue;
|
|
|
|
if (! $iio->invoice->status OR $iio->void)
|
|
continue;
|
|
|
|
if ($iio->quantity < 0 OR $iio->price_base < 0) {
|
|
$bt = $iio->date_start;
|
|
$pr = TRUE;
|
|
|
|
continue;
|
|
}
|
|
|
|
if (is_null($bt))
|
|
$bt = $iio->date_start;
|
|
|
|
$a = ($iio->invoice_id > 4000 OR $iio->product->prod_plugin_file == 'ADSL') ? FALSE : TRUE;
|
|
|
|
$pdata = Period::details($iio->recurring_schedule,$a ? NULL : $iio->product->price_recurr_weekday,$bt,TRUE,$iio->product->price_recurr_strict);
|
|
|
|
switch ($iio->recurring_schedule) {
|
|
case 1:
|
|
case 2:
|
|
case 4:
|
|
case 5:
|
|
if ($iio->date_start != $pdata['start_time']) {
|
|
$doutput .= sprintf('%s: Set start_time: %s [%s]<br/>',$iio->id,Config::date($pdata['start_time']),$pdata['start_time']);
|
|
$iio->date_start=$pdata['start_time'];
|
|
}
|
|
|
|
if (! $pr AND $iio->date_stop != $pdata['end_time']) {
|
|
$doutput .= sprintf('%s: Set end_time: %s [%s] <br/>',$iio->id,Config::date($pdata['end_time']),$pdata['end_time']);
|
|
$iio->date_stop = $pdata['end_time'];
|
|
}
|
|
|
|
$bt = ($pr ? $iio->date_stop : $pdata['end_time'])+86400;
|
|
|
|
// $doutput .= sprintf('%s: BT now: %s (%s) [%s]<br/>',$iio->id,Config::date($bt),Config::date($pdata['end_time']),$bt);
|
|
break;
|
|
|
|
default:
|
|
$doutput .= sprintf('%s: %s Not handled',$iio->id,$iio->recurring_schedule);
|
|
}
|
|
|
|
$pr = FALSE;
|
|
|
|
//$doutput .= '<br/>';
|
|
if (($x=$this->request->query('go')) AND $x==1)
|
|
$iio->save();
|
|
}
|
|
|
|
if (isset($_REQUEST['go']))
|
|
HTTP::redirect(URL::link('admin','service/view/'.$so->id));
|
|
|
|
Block::add(array(
|
|
'title'=>sprintf('Transaction History for %s: %s',$so->id(),$so->name()),
|
|
'body'=>$loutput,
|
|
));
|
|
|
|
Block::add(array(
|
|
'title'=>sprintf('Transaction Debug for %s: %s',$so->id(),$so->name()),
|
|
'body'=>$doutput,
|
|
));
|
|
|
|
$output .= View::factory('service/user/view')
|
|
->set('o',$so);
|
|
|
|
Block::add(array(
|
|
'title'=>sprintf('%s: %s',$so->id(),$so->service_name()),
|
|
'body'=>$output,
|
|
));
|
|
}
|
|
|
|
private function add_edit($id=NULL,$output='') {
|
|
$so = ORM::factory('Service',$id);
|
|
|
|
if ($_POST) {
|
|
if ($so->values($this->request->post())->changed() AND ! ($this->save($so)))
|
|
$so->reload();
|
|
|
|
// Do we have plugin data to save as well
|
|
if ($this->request->post('plugin') AND $so->loaded()) {
|
|
$x = $so->plugin();
|
|
|
|
if ($x->values(Arr::merge(array('service_id'=>$so->id),$this->request->post('plugin')))->changed())
|
|
$this->save($x);
|
|
}
|
|
}
|
|
|
|
return $so;
|
|
}
|
|
}
|
|
?>
|