diff --git a/Layout/default/Emailtemplates/order/int_billing_info.php b/Layout/default/Emailtemplates/order/int_billing_info.php
index 01542247a..4ac1d2989 100644
--- a/Layout/default/Emailtemplates/order/int_billing_info.php
+++ b/Layout/default/Emailtemplates/order/int_billing_info.php
@@ -2,7 +2,12 @@
$term_id = $order->terminations[0]->id;
$op = OrderProductModel::getFirst(['order_id' => $order->id, 'termination_id' => $term_id]);
- $billing_start = date('U');
+ if($order->finish_date) {
+ $billing_start = $order->finish_date;
+ } else {
+ $billing_start = date('U');
+ }
+
if($op->billing_delay) {
$billing_start = strtotime("+".$op->billing_delay." months");
}
diff --git a/Layout/default/Order/Form.php b/Layout/default/Order/Form.php
index 87539939f..1a44e4417 100644
--- a/Layout/default/Order/Form.php
+++ b/Layout/default/Order/Form.php
@@ -665,7 +665,11 @@
diff --git a/application/Voicenumber/VoicenumberModel.php b/application/Voicenumber/VoicenumberModel.php
index 3ac00faa6..ea37db5ec 100644
--- a/application/Voicenumber/VoicenumberModel.php
+++ b/application/Voicenumber/VoicenumberModel.php
@@ -1,8 +1,212 @@
$value) {
+ if(property_exists(get_called_class(), $field)) {
+ $model->$field = $value;
+ }
+ }
+
+ $me = new User();
+ $me->loadMe();
+ if($model->create_by === null) {
+ $model->create_by = $me->id;
+ }
+ if($model->edit_by === null) {
+ $model->edit_by = $me->id;
+ }
+
+ return $model;
+ }
+
+ public static function getAll() {
+ $items = [];
+
+ $db = FronkDB::singleton();
+
+ $res = $db->select("Voicenumber", "*");
+ if($db->num_rows($res)) {
+ while($data = $db->fetch_object($res)) {
+ $items[] = new Voicenumber($data);
+ }
+ }
+ return $items;
+
+ }
+
+ public static function getFirst() {
+ $db = FronkDB::singleton();
+
+ $where = self::getSqlFilter($filter);
+ $res = $db->select("Voicenumber", "*", "$where ORDER BY voicenumberblock_id, number");
+ if($db->num_rows($res)) {
+ $data = $db->fetch_object($res);
+ $item = new Voicenumber($data);
+ if($item->id) {
+ return $item;
+ } else {
+ return null;
+ }
+ }
+ return null;
+ }
+
+ public static function count($filter) {
+ $db = FronkDB::singleton();
+
+ $where = self::getSqlFilter($filter);
+ $sql = "SELECT COUNT(*) as cnt FROM Voicenumber
+ WHERE $where
+ ";
+
+ $res = $db->query($sql);
+ if($db->num_rows($res)) {
+ $data = $db->fetch_object($res);
+ return $data->cnt;
+ }
+ return 0;
+ }
+
+ public static function search($filter, $limit = false) {
+ $items = [];
+ $db = FronkDB::singleton();
+
+ $where = self::getSqlFilter($filter);
+ $sql = "SELECT * FROM Voicenumber
+ WHERE $where
+ ORDER BY countrycode, areacode, first, last";
+
+ if(is_array($limit) && count($limit)) {
+ if(is_numeric($limit['start']) && is_numeric($limit['count'])) {
+ $sql .= " LIMIT ".$limit['start'].", ".$limit['count'];
+ } elseif(is_numeric($count)) {
+ $sql .= " LIMIT ".$limit['count'];
+ }
+ }
+
+ $res = $db->query($sql);
+
+ //mfLoghandler::singleton()->debug($sql);
+
+ if($db->num_rows($res)) {
+ while($data = $db->fetch_object($res)) {
+ $items[] = new Voicenumber($data);
+ }
+ }
+ return $items;
+ }
+
+ private function getSqlFilter($filter) {
+ $db = FronkDB::singleton();
+ $where = "1=1 ";
+
+ if(!is_array($filter)) {
+ return $where;
+ }
+
+ //var_dump($filter);exit;
+ if(array_key_exists("countrycode", $filter)) {
+ $countrycode = $filter['countrycode'];
+ if(is_numeric($countrycode)) {
+ $where .= " AND countrycode like '%$countrycode%'";
+ }
+ }
+
+ if(array_key_exists("areacode", $filter)) {
+ $areacode = $filter['areacode'];
+ if(is_numeric($areacode)) {
+ $where .= " AND areacode like '%$areacode%'";
+ }
+ }
+
+ if(array_key_exists("first", $filter)) {
+ $add_zero = false;
+ $first = $filter['first'];
+
+ mfLoghandler::singleton()->debug($first);
+
+ if(substr($first,0, 1) === "0") {
+ $add_zero = true;
+ $first = substr($first, 1);
+ }
+
+ if(is_numeric($first)) {
+ $where .= " AND first like '%$first%'";
+ if($add_zero) {
+ $where .= " AND number_prepend_zero = 1";
+ }
+ }
+ }
+
+ if(array_key_exists("last", $filter)) {
+ $add_zero = false;
+ $last = $filter['last'];
+
+ mfLoghandler::singleton()->debug($last);
+
+ if(substr($last,0, 1) === "0") {
+ $add_zero = true;
+ $last = substr($last, 1);
+ }
+
+ if(is_numeric($last)) {
+ $where .= " AND last like '%$last%'";
+ }
+ }
+
+ if(array_key_exists("number", $filter)) {
+ $add_zero = false;
+ $number = $filter['number'];
+
+ mfLoghandler::singleton()->debug($number);
+
+ if(substr($number,0, 1) === "0") {
+ $add_zero = true;
+ $number = substr($number, 1);
+ }
+ if(is_numeric($number)) {
+ $where .= " AND first <= $number AND last >= $number";
+
+ if($add_zero) {
+ $where .= " AND number_prepend_zero = 1";
+ }
+ }
+ }
+
+ if(array_key_exists("name", $filter)) {
+ $name = $db->escape($filter['name']);
+ if($name) {
+ $where .= " AND name like '%$name%'";
+ }
+ }
+
+ if(array_key_exists("comment", $filter)) {
+ $comment = $db->escape($filter['comment']);
+ if($comment) {
+ $where .= " AND comment like '%$comment%'";
+ }
+ }
+
+ //var_dump($filter, $where);exit;
+ return $where;
+ }
+
+}
\ No newline at end of file