description_full,array(
'label'=>'Full Product Description',
'placeholder'=>'Full Description',
@@ -23,6 +26,7 @@
'editor'=>'wysihtml5',
'help-block'=>'Complete description of this category')); ?>
+
render_all(); ?>
render_all(); ?>
diff --git a/modules/product/views/product/admin/edit.php b/modules/product/views/product/admin/edit.php
index 3ebb5603..e511fad2 100644
--- a/modules/product/views/product/admin/edit.php
+++ b/modules/product/views/product/admin/edit.php
@@ -1,76 +1,70 @@
-
diff --git a/modules/product/views/product/view.php b/modules/product/views/product/view.php
index 1f4d1eeb..01ad6a7a 100644
--- a/modules/product/views/product/view.php
+++ b/modules/product/views/product/view.php
@@ -1,15 +1,11 @@
-
-
- description(TRUE); ?>
-
+
+ description(TRUE); ?>
-
-
-
diff --git a/modules/service/classes/Controller/Admin/Service.php b/modules/service/classes/Controller/Admin/Service.php
index 665a8ba0..237594a4 100644
--- a/modules/service/classes/Controller/Admin/Service.php
+++ b/modules/service/classes/Controller/Admin/Service.php
@@ -28,9 +28,6 @@ class Controller_Admin_Service extends Controller_Service {
Script::factory()
->type('stdin')
->data('
-var nowTemp = new Date();
-var now = new Date(nowTemp.getFullYear(), nowTemp.getMonth(), nowTemp.getDate(), 0, 0, 0, 0);
-
$(document).ready(function() {
$("select[name=product_id]").change(function() {
// If we select a blank, then dont continue
@@ -56,11 +53,10 @@ $(document).ready(function() {
$("#date_next_invoice_label").datepicker({
autoclose : true,
- startDate : now,
format : "dd-M-yyyy",
todayBtn : true,
}).on("hide",function(ev) {
- $("input[name=date_next_invoicel]").val(ev.date.valueOf()/1000);
+ $("input[name=date_next_invoice]").val(ev.date.valueOf()/1000);
});
$("input[name=account_id_label]").typeahead({
@@ -127,17 +123,29 @@ $(document).ready(function() {
Script::factory()
->type('stdin')
->data('
-var nowTemp = new Date();
-var now = new Date(nowTemp.getFullYear(), nowTemp.getMonth(), nowTemp.getDate(), 0, 0, 0, 0);
-
$(document).ready(function() {
$("#date_next_invoice_label").datepicker({
autoclose : true,
- startDate : now,
format : "dd-M-yyyy",
todayBtn : true,
}).on("hide",function(ev) {
- $("input[name=date_next_invoicel]").val(ev.date.valueOf()/1000);
+ $("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);
});
});
');
@@ -188,12 +196,12 @@ $(document).ready(function() {
public function action_listdomainservicesbydnshost() {
$svs = ORM::factory('Service')->list_bylistgroup('DOMAIN');
- Sort::MAsort($svs,'plugin()->service_plugin_host,name()');
+ Sort::MAsort($svs,'plugin()->host,name()');
$list = array();
foreach ($svs as $so)
- $list[$so->plugin()->service_plugin_host->host_server_id][] = $so;
+ $list[$so->plugin()->host->host_server_id][] = $so;
foreach (array_keys($list) as $sid)
Block::add(array(
@@ -204,8 +212,8 @@ $(document).ready(function() {
array(
'id'=>array('label'=>'ID','url'=>URL::link('user','service/view/')),
'service_name()'=>array('label'=>'Details'),
- 'plugin()->domain_registrar->id'=>array('label'=>'SID'),
- 'plugin()->domain_registrar->name'=>array('label'=>'Supplier'),
+ 'plugin()->registrar->id'=>array('label'=>'SID'),
+ 'plugin()->registrar->name'=>array('label'=>'Supplier'),
'display("date_next_invoice")'=>array('label'=>'Next Invoice'),
),
array(
@@ -218,7 +226,7 @@ $(document).ready(function() {
public function action_listhostservicesbysupplier() {
$svs = ORM::factory('Service')->list_bylistgroup('HOST');
- Sort::MAsort($svs,'plugin()->host_server,name()');
+ Sort::MAsort($svs,'plugin()->host,name()');
$list = array();
@@ -264,26 +272,28 @@ $(document).ready(function() {
// Validate the transactions
$bt = NULL;
- $save = (isset($_REQUEST['go']) && $_REQUEST['go']=1) ? 1 : 0;
- $xsid=197;
+ $pr = TRUE; // Next entry is a pro-rata
foreach ($so->transactions()->where('item_type','=',0)->find_all() as $iio) {
- if (! $iio->invoice->status) continue;
// @todo This hard coding of 3070 should be removed.
- if ($iio->service_id == $xsid AND $iio->invoice_id < 3070) continue;
- if ($iio->quantity < 0 OR $iio->price_base < 0)
- continue;
- if (in_array($iio->id,array(960)))
+// $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->invoice_id > 4000 OR $iio->product->prod_plugin_file=="ADSL")
- $a = FALSE;
- else
- $a = TRUE;
+ if ($iio->quantity < 0 OR $iio->price_base < 0) {
+ $bt = $iio->date_start;
+ $pr = TRUE;
+
+ continue;
+ }
if (is_null($bt))
$bt = $iio->date_start;
- $pdata = Period::details($iio->recurring_schedule,$a ? NULL : $iio->product->price_recurr_weekday,$bt,TRUE,TRUE);
+ $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:
@@ -295,22 +305,25 @@ $(document).ready(function() {
$iio->date_start=$pdata['start_time'];
}
- if ($iio->date_stop != $pdata['end_time']) {
+ if (! $pr AND $iio->date_stop != $pdata['end_time']) {
$doutput .= sprintf('%s: Set end_time: %s [%s]
',$iio->id,Config::date($pdata['end_time']),$pdata['end_time']);
- $iio->date_stop=$pdata['end_time'];
+ $iio->date_stop = $pdata['end_time'];
}
- $bt = $pdata['end_time']+86400;
- //$doutput .= sprintf('%s: BT now: %s (%s) [%s]
',$iio->id,Config::date($bt),Config::date($pdata['end_time']),$bt);
+ $bt = ($pr ? $iio->date_stop : $pdata['end_time'])+86400;
+
+ // $doutput .= sprintf('%s: BT now: %s (%s) [%s]
',$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 .= '
';
- if ($save) {
+ if (($x=$this->request->query('go')) AND $x==1)
$iio->save();
- }
}
if (isset($_REQUEST['go']))
diff --git a/modules/service/classes/Controller/User/Service.php b/modules/service/classes/Controller/User/Service.php
index 9da5b38a..94f37916 100644
--- a/modules/service/classes/Controller/User/Service.php
+++ b/modules/service/classes/Controller/User/Service.php
@@ -25,8 +25,8 @@ class Controller_User_Service extends Controller_Service {
$amo = $so->plugin(isset($_REQUEST['t']) ? $_REQUEST['t'] : '');
$o = array(
- 'u'=>$amo->username_value() ? $amo->username_value() : strtolower($amo->name()),
- 'p'=>(! $k OR ! $this->request->is_ajax() OR ! $so->loaded() OR ! isset($_REQUEST['k']) OR $k != $_REQUEST['k']) ? Random::char() : $amo->password_value(),
+ 'u'=>$amo->username() ? $amo->username() : strtolower($amo->name()),
+ 'p'=>(! $k OR ! $this->request->is_ajax() OR ! $so->loaded() OR ! isset($_REQUEST['k']) OR $k != $_REQUEST['k']) ? Random::char() : $amo->password(),
);
$this->response->headers('Content-Type','application/json');
diff --git a/modules/service/classes/Model/Service.php b/modules/service/classes/Model/Service.php
index 6ffbe59f..305336cf 100644
--- a/modules/service/classes/Model/Service.php
+++ b/modules/service/classes/Model/Service.php
@@ -29,6 +29,8 @@ class Model_Service extends ORM_OSB {
'account'=>array(),
);
+ protected $_save_message = TRUE;
+
// Validation rules
public function rules() {
$x = Arr::merge(parent::rules(), array(
@@ -167,7 +169,7 @@ class Model_Service extends ORM_OSB {
$iio->find();
- $x = (! $iio->loaded() AND $this->date_next_invoice) ? $this->date_next_invoice-86400 : $iio->date_stop;
+ $x = (! $iio->loaded() AND $this->date_next_invoice) ? $this->date_next_invoice-86400 : ($iio->total() < 0 ? $iio->date_start-86400 : $iio->date_stop);
return $format ? Config::date($x) : $x;
}
@@ -255,7 +257,7 @@ class Model_Service extends ORM_OSB {
* Return a descriptive name for this service
*/
public function service_name() {
- return is_null($plugin=$this->plugin()) ? $this->name() : $plugin->service_name();
+ return is_null($x=$this->plugin()) ? $this->name() : $x->service_name();
}
/**
@@ -286,16 +288,17 @@ class Model_Service extends ORM_OSB {
case 'invoice_detail_items':
return is_null($plugin) ? array() : $plugin->_details($type);
- case 'service_view':
- return is_null($plugin) ? HTML::nbsp('') : $plugin->render_view();
-
default:
throw new Kohana_Exception('Unkown detail request :type',array(':type'=>$type));
}
}
+ public function service_view() {
+ return ! is_object($x=$this->plugin()) ? HTML::nbsp('') : $x->render_view();
+ }
+
public function transactions() {
- return $this->invoice_item->order_by('date_start')->order_by('date_stop');
+ return $this->invoice_item->order_by('date_start','ASC')->order_by('product_id','ASC')->order_by('date_stop','ASC');
}
/** LIST FUNCTIONS **/
diff --git a/modules/service/classes/Model/Service/Plugin.php b/modules/service/classes/Model/Service/Plugin.php
index fad8ca39..6cb61fe7 100644
--- a/modules/service/classes/Model/Service/Plugin.php
+++ b/modules/service/classes/Model/Service/Plugin.php
@@ -13,6 +13,10 @@ abstract class Model_Service_Plugin extends ORM_OSB {
// Reset any sorting that may be defined in our parent
protected $_sorting = array();
+ protected $_belongs_to = array(
+ 'service'=>array(),
+ );
+
/**
* When does our service expire
*/
@@ -26,56 +30,43 @@ abstract class Model_Service_Plugin extends ORM_OSB {
/**
* The table attributes that provide username/password values
*/
- abstract public function password_value();
- abstract public function username_value();
-
- /**
- * Get specific service details for use in other modules
- * For Example: Invoice
- *
- * @todo Make the rendered items configurable
- * @todo Change this method name, now that it is public
- */
- public function _details($type) {
- switch ($type) {
- // Nothing to add for invoices
- case 'invoice_detail_items':
- return array();
-
- default:
- throw new Kohana_Exception('Unkown detail request :type',array(':type'=>$type));
- }
- }
+ abstract public function password();
+ abstract public function username();
/**
* Provide the button that launches the management of this service, generally from a 3rd party
*/
- public function manage_button() {
+ protected function manage() {
+ // Dont show the manage button for expired or inactive services
if (! $this->service->status OR $this->service->expiring())
return FALSE;
- static $k = '';
+ static $x = '';
- // If $k is already set, we've rendered this JS
- if ($k)
- return TRUE;
+ // If $x is already set, we've rendered this JS
+ if (! $x) {
+ $x = Random::char();
- $k = Random::char();
- Session::instance()->set('manage_button',$k);
+ Session::instance()->set('manage_button',$x);
- Script::add(array('type'=>'stdin','data'=>'
- $(document).ready(function() {
- var x=0;
- $("button[name=submit]").click(function() {
- var t=$(this).val().split(":");
- if (x++) { alert("Session expired, please refresh the page!"); return false; }
- $.getJSON("'.URL::link('user','service/ajaxmanage/'.$this->service_id,TRUE).'", { k: "'.$k.'",t: t[1] }, function(data) {
- $.each(data, function(key, val) { $("#"+key+"_"+t[0]+"_"+t[1]).val(val); });
- }).error(function() { alert("There was a problem with the request"); return false; }).success(
-function() { $("form[id=id_"+t[0]+"_"+t[1]+"]").submit(); });
- });
- });'
- ));
+ Script::factory()
+ ->type('stdin')
+ ->data('
+$(document).ready(function() {
+ var x=0;
+
+ $("button[name=submit]").click(function() {
+ var t=$(this).val().split(":");
+ if (x++) { alert("Session expired, please refresh the page!"); return false; }
+
+ $.getJSON("'.URL::link('user','service/ajaxmanage/'.$this->service_id,TRUE).'", { k: "'.$x.'",t: t[1] },
+ function(data) {$.each(data, function(key, val) { $("#"+key+"_"+t[0]+"_"+t[1]).val(val); }); })
+ .error(function() { alert("There was a problem with the request"); return false; })
+ .success(function() { $("form[id=id_"+t[0]+"_"+t[1]+"]").submit(); });
+ });
+});'
+ );
+ }
return TRUE;
}
@@ -109,5 +100,23 @@ function() { $("form[id=id_"+t[0]+"_"+t[1]+"]").submit(); });
public function service_name() {
return sprintf('%s - %s',$this->service->product->title(),$this->name());
}
+
+ /**
+ * Get specific service details for use in other modules
+ * For Example: Invoice
+ *
+ * @todo Make the rendered items configurable
+ * @todo Change this method name, now that it is public
+ */
+ public function _details($type) {
+ switch ($type) {
+ // Nothing to add for invoices
+ case 'invoice_detail_items':
+ return array();
+
+ default:
+ throw new Kohana_Exception('Unkown detail request :type',array(':type'=>$type));
+ }
+ }
}
?>
diff --git a/modules/service/views/service/admin/add.php b/modules/service/views/service/admin/add.php
index c0ef709b..acf31120 100644
--- a/modules/service/views/service/admin/add.php
+++ b/modules/service/views/service/admin/add.php
@@ -40,7 +40,7 @@