From ae821d3870e62674797c1c3569ec6430ebc9a153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CVeLiTi=E2=80=9D?= <“info@veliti.nl”> Date: Wed, 25 Sep 2024 12:01:18 +0200 Subject: [PATCH] CM89 - expired contract handling --- api/v1/get/application.php | 38 ++- api/v1/post/contracts.php | 22 +- api/v2/get/application.php | 310 ++++++++++++++++++++++ api/v2/get/history.php | 141 ++++++++++ api/v2/post/contracts.php | 24 +- assets/functions.php | 85 +++++- contract.php | 116 +++++++- contract_manage.php | 32 ++- contracts.php | 2 + maintenance.php | 79 ++++++ settings.php | 2 - settings/settingsmenu.php | 12 +- settings/translations/translations_DE.php | 16 ++ settings/translations/translations_NL.php | 16 ++ settings/translations/translations_US.php | 15 ++ test.php | 172 +++--------- 16 files changed, 923 insertions(+), 159 deletions(-) create mode 100644 api/v2/get/application.php create mode 100644 api/v2/get/history.php create mode 100644 maintenance.php diff --git a/api/v1/get/application.php b/api/v1/get/application.php index 80c6bc4..b250af3 100644 --- a/api/v1/get/application.php +++ b/api/v1/get/application.php @@ -65,7 +65,7 @@ if(isset($get_content) && $get_content!=''){ $v = explode("=", $y); //INCLUDE VARIABLES IN ARRAY $criterias[$v[0]] = $v[1]; - if ($v[0] == 'page' || $v[0] =='p' || $v[0] =='totals' || $v[0] =='history' || $v[0] =='target' || $v[0] =='success_msg'){ + if ($v[0] == 'page' || $v[0] =='p' || $v[0] =='between' || $v[0] =='totals' || $v[0] =='history' || $v[0] =='target' || $v[0] =='success_msg'){ //do nothing } elseif ($v[0] == 'serialnumber') { @@ -89,15 +89,42 @@ if(isset($get_content) && $get_content!=''){ $clause .= ' AND e.serialnumber IN ('.$new_querystring.')'; //remove original key/value from array unset($criterias[$v[0]]); - } + } else { $clause .= ' AND e.serialnumber IN (:'.$v[0].')'; } } + elseif ($v[0] == 'ignore') { + //build up serialnumbers to ignore + //check if multiple serialnumbers are provided + if (str_contains($v[1], ',')){ + $inputs = explode(",",$v[1]); + $x=0; + foreach($inputs as $input){ + //create key + $new_key = $v[0].'_'.$x; + //inject new key/value to array + $criterias[$new_key] = '%serialnumber%'.$input.'%'; + $clause .= ' AND h.description not like :'.$new_key.''; + $x++; + } + //remove original key/value from array + unset($criterias[$v[0]]); + } + else { + $criterias[$v[0]] = '%serialnumber%'.$v[1].'%'; + $clause .= ' AND h.description not like :'.$v[0].''; + } + } else {//create clause $clause .= ' AND '.$v[0].' = :'.$v[0]; } } + if (isset($criterias['between']) && $criterias['between'] !=''){ + //ADD BETWEEN STATEMENT IF BETWEEN IS IN URL + //BETWEEN delim || + $clause .= ' AND (h.created BETWEEN :start AND :end)'; + } if ($whereclause == '' && $clause !=''){ $whereclause = 'WHERE '.substr($clause, 4); } else { @@ -221,6 +248,13 @@ if (!empty($criterias)){ if (str_contains($whereclause, $key_condition)){ $stmt->bindValue($key, $value, PDO::PARAM_STR); } + //CHECK IF BETWEEN STATEMENT IS SENT + if (str_contains($whereclause, ':start') && str_contains($whereclause, ':end')){ + //DATES ARE DELIM WITH || + $dates = explode("||", $value); + $stmt->bindValue('start', $dates[0], PDO::PARAM_STR); + $stmt->bindValue('end', $dates[1], PDO::PARAM_STR); + } } } diff --git a/api/v1/post/contracts.php b/api/v1/post/contracts.php index e7d5458..02e8301 100644 --- a/api/v1/post/contracts.php +++ b/api/v1/post/contracts.php @@ -53,6 +53,11 @@ if (isset($post_content['assigned_users'])){ $post_content['assigned_users'] = array_map('trim', $post_content['assigned_users']); $post_content['assigned_users'] = array_filter($post_content['assigned_users'], 'strlen'); } +if (isset($post_content['ignore_list'])){ + $post_content['ignore_list'] = array_map('trim', $post_content['ignore_list']); + $post_content['ignore_list'] = array_filter($post_content['ignore_list'], 'strlen'); +} + if ($id != ''){ //DEFINE ACCOUNTHIERARCHY @@ -165,6 +170,13 @@ if ($command == 'insert' && !isset($post_content['delete'])){ if (isset($post_content['servicetool'])){ $post_content['servicetool'] = json_encode($post_content['servicetool'], JSON_UNESCAPED_UNICODE); } +if (isset($post_content['ignore_list'])){ + $post_content['ignore_list'] = json_encode($post_content['ignore_list'], JSON_UNESCAPED_UNICODE); + //ONLY ADMINS ARE ALLOWED TO UPDATE IGNORE LIST + if ($permission != 3 && $permission != 4){ + unset($post_content['ignore_list']); + } +} if (isset($post_content['assigned_users'])){ //Check for all users in array if exist then update service or create foreach ($post_content['assigned_users'] as $user_assigned){ @@ -177,10 +189,16 @@ if (isset($post_content['assigned_users'])){ if (count($response) != 0){ $id_exist_user = $response[0]['id']; $generate_service = bin2hex(random_bytes(25)); - //Remove serviceflag from user $sql = 'UPDATE users SET service = ? WHERE id = ? '; $stmt = $pdo->prepare($sql); - $stmt->execute([$generate_service,$id_exist_user]); + if (isset($post_content['status']) && $post_content['status'] != 2){ + //Add serviceflag from user + $stmt->execute([$generate_service,$id_exist_user]); + } + else { + //Remove serviceflag from user when status is Closed + $stmt->execute(['',$id_exist_user]); + } } else { //Decode the account structure of the contract and create user $ah_array = json_decode($post_content['accounthierarchy'],true); diff --git a/api/v2/get/application.php b/api/v2/get/application.php new file mode 100644 index 0000000..3e35d1a --- /dev/null +++ b/api/v2/get/application.php @@ -0,0 +1,310 @@ +soldto) || $partner->soldto == ''){$soldto_search = '%';} else {$soldto_search = '-%';} + +//------------------------------------------ +//default whereclause +//------------------------------------------ +$whereclause = ''; + +switch ($permission) { + case '4': + $whereclause = ''; + break; + case '3': + $whereclause = ''; + break; + case '2': + $condition = '__salesid___'.$partner->salesid.'___soldto___'.substr($partner->soldto, 0, strpos($partner->soldto, "-")).$soldto_search; + $whereclause = 'WHERE e.accounthierarchy like "'.$condition.'"'; + break; + default: + $condition = '__salesid___'.$partner->salesid.'___soldto___'.substr($partner->soldto, 0, strpos($partner->soldto, "-")).$soldto_search.'___shipto___'.substr($partner->shipto, 0, strpos($partner->shipto, "-")).'%___location___'.substr($partner->location, 0, strpos($partner->location, "-")).'%'; + $whereclause = 'WHERE e.accounthierarchy like "'.$condition.'"'; + break; +} + +//------------------------------------------ +//NEW ARRAY +//------------------------------------------ +$criterias = []; +$clause = ''; + +//------------------------------------------ +//Check for $_GET variables and build up clause +//------------------------------------------ +if(isset($get_content) && $get_content!=''){ + //GET VARIABLES FROM URL + $requests = explode("&", $get_content); + //Check for keys and values + foreach ($requests as $y){ + $v = explode("=", $y); + //INCLUDE VARIABLES IN ARRAY + $criterias[$v[0]] = $v[1]; + if ($v[0] == 'page' || $v[0] =='p' || $v[0] =='between' || $v[0] =='totals' || $v[0] =='history' || $v[0] =='target' || $v[0] =='success_msg'){ + //do nothing + } + elseif ($v[0] == 'serialnumber') { + //build up serialnumber + //check if multiple serialnumbers are provided + if (str_contains($v[1], ',')){ + $inputs = explode(",",$v[1]); + $new_querystring = ''; //empty querystring + $x=0; + foreach($inputs as $input){ + //create key + $new_key = $v[0].'_'.$x; + //inject new key/value to array + $criterias[$new_key] = $input; + $new_querystring .= ':'.$new_key.','; + $x++; + } + //remove obsolete last character from new_querystring + $new_querystring = substr($new_querystring,0, -1); + //add new_querystring to clause + $clause .= ' AND e.serialnumber IN ('.$new_querystring.')'; + //remove original key/value from array + unset($criterias[$v[0]]); + } + else { + $clause .= ' AND e.serialnumber IN (:'.$v[0].')'; + } + } + elseif ($v[0] == 'ignore') { + //build up serialnumbers to ignore + //check if multiple serialnumbers are provided + if (str_contains($v[1], ',')){ + $inputs = explode(",",$v[1]); + $x=0; + foreach($inputs as $input){ + //create key + $new_key = $v[0].'_'.$x; + //inject new key/value to array + $criterias[$new_key] = '%serialnumber%'.$input.'%'; + $clause .= ' AND h.description not like :'.$new_key.''; + $x++; + } + //remove original key/value from array + unset($criterias[$v[0]]); + } + else { + $criterias[$v[0]] = '%serialnumber%'.$v[1].'%'; + $clause .= ' AND h.description not like :'.$v[0].''; + } + } + else {//create clause + $clause .= ' AND '.$v[0].' = :'.$v[0]; + } + } + if (isset($criterias['between']) && $criterias['between'] !=''){ + //ADD BETWEEN STATEMENT IF BETWEEN IS IN URL + //BETWEEN delim || + $clause .= ' AND (h.created BETWEEN :start AND :end)'; + } + if ($whereclause == '' && $clause !=''){ + $whereclause = 'WHERE '.substr($clause, 4); + } else { + $whereclause .= $clause; + } +} + +//------------------------------------------ +// QUERY define query +//------------------------------------------ +switch ($action) { + case 'get_rowID': + $sql = 'SELECT e.rowID, p.productcode, p.productname from equipment e LEFT JOIN products p ON e.productrowid = p.rowID '.$whereclause.''; + break; + + + case 'firmwareCommunication': + if (isset($criterias['hw_version']) && $criterias['hw_version'] != ''){ + + include './settings/systemfirmware.php'; + + $target = $criterias['target'] ?? '0'; + + //FILTER VARIABLES FOR SQL + $filter1 = 'soldto":"'; + $filter2 = '","shipto'; + $filter3 = 'shipto":"'; + $filter4 = '","location'; + + //ADD additional createria to whereclause (Firmware and Active) + $whereclause .= " AND c.type_1='1' AND c.status='1' AND e.status != 5 AND (e.sw_version != '$FirmwarenameR06' OR e.sw_version != '$FirmwarenameR06A' OR e.sw_version != '$FirmwarenameR07A' OR e.sw_version != '$FirmwarenameR07B' OR e.sw_version != '$FirmwarenameR07' OR e.sw_version != '$FirmwarenameR08')"; + + //get target + switch ($target) { + case '0': // Both + $onclause ="SUBSTRING_INDEX(SUBSTRING_INDEX(e.accounthierarchy, '$filter1', -1),'$filter2',1) = c.partnerID or SUBSTRING_INDEX(SUBSTRING_INDEX(e.accounthierarchy, '$filter3', -1),'$filter4',1) = c.partnerID"; + break; + + case '1': // SoldTO only + $onclause ="SUBSTRING_INDEX(SUBSTRING_INDEX(e.accounthierarchy, '$filter1', -1),'$filter2',1) = c.partnerID"; + break; + + case '2': // ShipTO only + $onclause =" SUBSTRING_INDEX(SUBSTRING_INDEX(e.accounthierarchy, '$filter3', -1),'$filter4',1) = c.partnerID"; + break; + } + + $sql = "SELECT e.sw_version, c.email from equipment e join communication c on $onclause $whereclause group by c.email"; + + } + else { + http_response_code(400); + } + + break; + + case 'serviceforecast': + + $sql = 'SELECT YEAR(e.service_date) AS year, QUARTER(e.service_date) AS quarter, count(e.rowID) AS count FROM equipment e '.$whereclause.' GROUP BY YEAR(e.service_date), QUARTER(e.service_date)'; + + break; + + case 'warrantyforecast': + + $sql = 'SELECT YEAR(e.warranty_date) AS year, QUARTER(e.warranty_date) AS quarter, count(e.rowID) AS count FROM equipment e '.$whereclause.' GROUP BY YEAR(e.warranty_date), QUARTER(e.warranty_date)'; + + break; + + case 'geolocation': + + if ($whereclause == ''){ + $whereclause = 'WHERE geolocation is not null OR geolocation != "["",""]"'; + } else { + $whereclause .= ' AND geolocation is not null OR geolocation != "["",""]'; + } + $sql = 'SELECT distinct(geolocation) FROM equipment e '.$whereclause.''; + + break; + + case 'report_usage_servicereports': + $sql = 'SELECT YEAR(h.created) AS year, QUARTER(h.created) AS quarter, MONTH(h.created) as month, count(h.rowID) AS count FROM history h LEFT JOIN equipment e ON h.equipmentid = e.rowID where h.type = "ServiceReport" AND NOT e.productrowid = "31" GROUP BY YEAR(h.created), QUARTER(h.created), MONTH(h.created)'; + break; + + case 'contract_usage_servicereports': + $sql = 'SELECT YEAR(h.created) AS year, QUARTER(h.created) AS quarter, MONTH(h.created) as month, count(h.rowID) AS count FROM history h LEFT JOIN equipment e ON h.equipmentid = e.rowID '.$whereclause.' GROUP BY YEAR(h.created), QUARTER(h.created), MONTH(h.created)'; + break; + + case 'report_usage_firmware': + $sql = 'SELECT YEAR(h.created) AS year,QUARTER(h.created) AS quarter, MONTH(h.created) as month, count(h.rowID) AS count FROM history h LEFT JOIN equipment e ON h.equipmentid=e.rowID where h.type="Firmware" AND NOT e.productrowid="31" GROUP BY YEAR(h.created),QUARTER(h.created), MONTH(h.created)'; + break; + + case 'report_usage_warranty': + $sql = 'SELECT YEAR(h.created) AS year, QUARTER(h.created) AS quarter, MONTH(h.created) as month, count(h.rowID) AS count FROM history h LEFT JOIN equipment e ON h.equipmentid = e.rowID where h.type = "Warranty" AND NOT e.productrowid = "31" GROUP BY YEAR(h.created), QUARTER(h.created), MONTH(h.created)'; + break; + + case 'report_usage_other': + $sql = 'SELECT YEAR(h.created) AS year, QUARTER(h.created) AS quarter, MONTH(h.created) as month, count(h.rowID) AS count FROM history h LEFT JOIN equipment e ON h.equipmentid = e.rowID where NOT h.type = "Warranty" OR NOT h.type = "Firmware" OR NOT h.type = "ServiceReport" GROUP BY YEAR(h.created), QUARTER(h.created), MONTH(h.created)'; + break; + + case 'report_usage_equipment': + $sql = 'SELECT YEAR(created) AS year, QUARTER(created) AS quarter, MONTH(created) as month, count(rowID) AS count FROM equipment GROUP BY YEAR(created), QUARTER(created), MONTH(created)'; + break; + + case 'report_usage_changes': + $sql = 'SELECT YEAR(created) AS year, QUARTER(created) AS quarter, MONTH(created) as month, count(rowID) AS count FROM changelog GROUP BY YEAR(created), QUARTER(created), MONTH(created)'; + break; + + case 'report_usage_users': + $sql = 'SELECT count(id) AS count FROM users WHERE NOT view = "3"'; + break; + +} + +$stmt = $pdo->prepare($sql); +//------------------------------------------ +// BIND VARIABELS +//------------------------------------------ +if (!empty($criterias)){ + foreach ($criterias as $key => $value){ + $key_condition = ':'.$key; + if (str_contains($whereclause, $key_condition)){ + $stmt->bindValue($key, $value, PDO::PARAM_STR); + } + //CHECK IF BETWEEN STATEMENT IS SENT + if (str_contains($whereclause, ':start') && str_contains($whereclause, ':end')){ + //DATES ARE DELIM WITH || + $dates = explode("||", $value); + $stmt->bindValue('start', $dates[0], PDO::PARAM_STR); + $stmt->bindValue('end', $dates[1], PDO::PARAM_STR); + } + } +} + +//------------------------------------------ +//Excute Query +//------------------------------------------ +$stmt->execute(); + +//------------------------------------------ +//Get results +//------------------------------------------ +switch ($action) { + case 'get_rowID': + $messages = $stmt->fetch(); + break; + + case 'report_usage_users': + $messages = $stmt->fetch(); + break; + + case 'firmwareCommunication': + $result = $stmt->fetchAll(PDO::FETCH_ASSOC); + if ($result) { + $messages = json_encode(array("firmware_scope"=> count($result))); + } + else { + $messages = json_encode(array("firmware_scope"=> '0')); + } + break; + + default: + $messages = $stmt->fetchAll(PDO::FETCH_ASSOC); + break; +} + +//------------------------------------------ +//JSON_ENCODE +//------------------------------------------ +$messages = json_encode($messages, JSON_UNESCAPED_UNICODE); + +//Send results +echo $messages; + + +//------------------------------------------ +// END APPLICATION API +//------------------------------------------ +} +else +{ + echo null; +} + diff --git a/api/v2/get/history.php b/api/v2/get/history.php new file mode 100644 index 0000000..301e1c1 --- /dev/null +++ b/api/v2/get/history.php @@ -0,0 +1,141 @@ +soldto) || $partner->soldto == ''){$soldto_search = '%';} else {$soldto_search = '-%';} + +//default whereclause +$whereclause = ''; + +switch ($permission) { + case '4': + $whereclause = ''; + break; + case '3': + $whereclause = ''; + break; + case '2': + $condition = '__salesid___'.$partner->salesid.'___soldto___'.substr($partner->soldto, 0, strpos($partner->soldto, "-")).$soldto_search; + $whereclause = 'WHERE e.accounthierarchy like :condition AND (type = "'.$type1.'" or type = "'.$type2.'" or type = "'.$type3.'" or type = "'.$type9.'" or type = "'.$type14.'" or type = "'.$type16.'")'; + break; + default: + $condition = '__salesid___'.$partner->salesid.'___soldto___'.substr($partner->soldto, 0, strpos($partner->soldto, "-")).$soldto_search.'___shipto___'.substr($partner->shipto, 0, strpos($partner->shipto, "-")).'%___location___'.substr($partner->location, 0, strpos($partner->location, "-")).'%'; + $whereclause = 'WHERE e.accounthierarchy like :condition AND (type = "'.$type1.'" or type = "'.$type2.'" or type = "'.$type3.'" or type = "'.$type14.'" or type = "'.$type16.'")'; + break; +} +//NEW ARRAY +$criterias = []; +$clause = ''; + +//Check for $_GET variables and build up clause +if(isset($get_content) && $get_content!=''){ + //GET VARIABLES FROM URL + $requests = explode("&", $get_content); + //Check for keys and values + foreach ($requests as $y){ + $v = explode("=", $y); + //INCLUDE VARIABLES IN ARRAY + $criterias[$v[0]] = $v[1]; + + if ($v[0] == 'page' || $v[0] =='p' || $v[0] =='totals' || $v[0] =='history'){ + //do nothing + } + elseif ($v[0] == 'equipmentid' || $v[0] == 'equipmentID') { + //build up search + $clause .= ' AND e.rowID = :'.$v[0]; + } + elseif ($v[0] == 'historyid') { + //build up search + $clause .= ' AND h.rowID = :'.$v[0]; + } + elseif ($v[0] == 'status') { + //Update status based on status + $clause .= ' AND e.'.$v[0].' = :'.$v[0]; + } + elseif ($v[0] == 'search') { + //build up search + $clause .= ' AND (h.rowID like :'.$v[0].' OR h.createdby like :'.$v[0].')'; + } + elseif ($v[0] == 'type' && $v[1] == 'servicereport') { + //Filter out only relevant servicereports + $filter_key_1 = '"%serialnumber%"'; + $filter_key_2 = '"ServiceReport"'; + $clause .= ' AND h.type = '.$filter_key_2.' AND h.description like '.$filter_key_1; + } + else {//create clause + $clause .= ' AND '.$v[0].' = :'.$v[0]; + } + } + if ($whereclause == '' && $clause !=''){ + $whereclause = 'WHERE '.substr($clause, 4); + } else { + $whereclause .= $clause; + } +} + +if(isset($criterias['totals']) && $criterias['totals'] ==''){ +//Request for total rows + $sql ='SELECT count(h.rowID) as historyID from history h LEFT JOIN equipment e ON h.equipmentid = e.rowID '.$whereclause.''; +} +else { + //request history + $sql ='SELECT h.rowID as historyID, e.rowID as equipmentID, e.serialnumber, h.type, h.description, h.created, h.createdby from history h LEFT JOIN equipment e ON h.equipmentid = e.rowID '.$whereclause.' ORDER BY h.created DESC LIMIT :page,:num_products'; +} + +$stmt = $pdo->prepare($sql); + +//Bind to query +if (str_contains($whereclause, ':status')){ + $stmt->bindValue('status', $status, PDO::PARAM_INT); +} +if (str_contains($whereclause, ':condition')){ + $stmt->bindValue('condition', $condition, PDO::PARAM_STR); +} + +if (!empty($criterias)){ + foreach ($criterias as $key => $value){ + $key_condition = ':'.$key; + if (str_contains($whereclause, $key_condition)){ + if ($key == 'search'){ + $search_value = '%'.$value.'%'; + $stmt->bindValue($key, $search_value, PDO::PARAM_STR); + } + else { + $stmt->bindValue($key, $value, PDO::PARAM_STR); + } + } + } +} + +//Add paging details +if(isset($criterias['totals']) && $criterias['totals']==''){ + $stmt->execute(); + $messages = $stmt->fetch(); + $messages = $messages[0]; +} +else { + $current_page = isset($criterias['p']) && is_numeric($criterias['p']) ? (int)$criterias['p'] : 1; + $stmt->bindValue('page', ($current_page - 1) * $page_rows_history, PDO::PARAM_INT); + $stmt->bindValue('num_products', $page_rows_history, PDO::PARAM_INT); + + //Excute Query + $stmt->execute(); + //Get results + $messages = $stmt->fetchAll(PDO::FETCH_ASSOC); +} + +//------------------------------------------ +//JSON_ENCODE +//------------------------------------------ +$messages = json_encode($messages, JSON_UNESCAPED_UNICODE); + +//Send results +echo $messages; +?> \ No newline at end of file diff --git a/api/v2/post/contracts.php b/api/v2/post/contracts.php index 5d86d55..7ecae4a 100644 --- a/api/v2/post/contracts.php +++ b/api/v2/post/contracts.php @@ -53,6 +53,11 @@ if (isset($post_content['assigned_users'])){ $post_content['assigned_users'] = array_map('trim', $post_content['assigned_users']); $post_content['assigned_users'] = array_filter($post_content['assigned_users'], 'strlen'); } +if (isset($post_content['ignore_list'])){ + $post_content['ignore_list'] = array_map('trim', $post_content['ignore_list']); + $post_content['ignore_list'] = array_filter($post_content['ignore_list'], 'strlen'); +} + if ($id != ''){ //DEFINE ACCOUNTHIERARCHY @@ -165,6 +170,14 @@ if ($command == 'insert' && !isset($post_content['delete'])){ if (isset($post_content['servicetool'])){ $post_content['servicetool'] = json_encode($post_content['servicetool'], JSON_UNESCAPED_UNICODE); } +if (isset($post_content['ignore_list'])){ + $post_content['ignore_list'] = json_encode($post_content['ignore_list'], JSON_UNESCAPED_UNICODE); + + //ONLY ADMINS ARE ALLOWED TO UPDATE IGNORE LIST + if ($permission != 3 && $permission != 4){ + unset($post_content['ignore_list']); + } +} if (isset($post_content['assigned_users'])){ //Check for all users in array if exist then update service or create foreach ($post_content['assigned_users'] as $user_assigned){ @@ -177,10 +190,17 @@ if (isset($post_content['assigned_users'])){ if (count($response) != 0){ $id_exist_user = $response[0]['id']; $generate_service = bin2hex(random_bytes(25)); - //Remove serviceflag from user + $sql = 'UPDATE users SET service = ? WHERE id = ? '; $stmt = $pdo->prepare($sql); - $stmt->execute([$generate_service,$id_exist_user]); + if (isset($post_content['status']) && $post_content['status'] != 2){ + //Add serviceflag from user + $stmt->execute([$generate_service,$id_exist_user]); + } + else { + //Remove serviceflag from user when status is Closed + $stmt->execute(['',$id_exist_user]); + } } else { //Decode the account structure of the contract and create user $ah_array = json_decode($post_content['accounthierarchy'],true); diff --git a/assets/functions.php b/assets/functions.php index d1d36dc..ddb464e 100644 --- a/assets/functions.php +++ b/assets/functions.php @@ -2343,7 +2343,90 @@ function usageView($messages){ $view .=' - '; + '; return $view; +} + +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// overview of service events per servicekit ++++++++++++++ +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++ +function usageBilling($messages){ + // Create an array to store sums by year, quarter, and month + $totals = []; + + // Loop through the data and aggregate the counts by year, quarter, and month + foreach ($messages as $entry) { + $year = $entry['year']; + $quarter = $entry['quarter']; + $dateObj = DateTime::createFromFormat('!m', $entry['month']); + $month = $dateObj->format('F'); + $count = $entry['count']; + + // Initialize arrays if not already set for year, quarter, and month + if (!isset($totals[$year])) { + $totals[$year] = ['total' => 0, 'quarters' => []]; + } + + if (!isset($totals[$year]['quarters'][$quarter])) { + $totals[$year]['quarters'][$quarter] = ['total' => 0, 'months' => []]; + } + + if (!isset($totals[$year]['quarters'][$quarter]['months'][$month])) { + $totals[$year]['quarters'][$quarter]['months'][$month] = 0; + } + + // Add count to the corresponding year, quarter, and month + $totals[$year]['total'] += $count; + $totals[$year]['quarters'][$quarter]['total'] += $count; + $totals[$year]['quarters'][$quarter]['months'][$month] += $count; + } + + return $totals; +} +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// close contract when expired +++++++++++++++ +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++ +function closeContract(){ + +include dirname(__FILE__,2).'/settings/settings.php'; + +$pdo = dbConnect($dbname); + +//SELECT ALL ACTIVE CONTRACTS +$sql = 'SELECT * FROM contracts WHERE status = 1'; +$stmt = $pdo->prepare($sql); +$stmt->execute(); +$messages = $stmt->fetchAll(PDO::FETCH_ASSOC); + +foreach ($messages as $message){ + //Calculate contract end date + $end_date = date('Y-m-d', strtotime('+'.$message['duration'].' months', strtotime($message['start_date']))); + + //Validate if contract end date is in the past change contact status to closed and set users to not active + if (date("Y-m-d") > $end_date){ + //Contract expired -> change status to closed (2) + $sql = 'UPDATE contracts SET status = ? WHERE rowID = ?'; + $stmt = $pdo->prepare($sql); + $stmt->execute([2,$message['rowID']]); + + //CHECK FOR ASSIGNED USER END SET SERVICE TO INACTIVE + foreach (json_decode($message['assigned_users']) as $user_assigned){ + + //check user exist + $sql = 'SELECT * FROM users WHERE username = ?'; + $stmt = $pdo->prepare($sql); + $stmt->execute([$user_assigned]); + $user_assigned = $stmt->fetch(); + + if (!empty($user_assigned)){ + $id_exist_user = $user_assigned['id']; + $sql = 'UPDATE users SET service = ? WHERE id = ? '; + $stmt = $pdo->prepare($sql); + //Remove serviceflag from user when status is Closed + $stmt->execute(['',$id_exist_user]); + } + } + } + } } \ No newline at end of file diff --git a/contract.php b/contract.php index e84a037..d97e2ce 100644 --- a/contract.php +++ b/contract.php @@ -48,8 +48,11 @@ $responses = $responses[0]; //------------------------------ $contract_status_text = 'contract_status'.$responses->status ?? ''; $contract_type_text = 'contract_type'.$responses->type ?? ''; +$contract_billingplan_text = 'contract_billing'.$responses->billing_plan ?? ''; + $servicetools = json_decode($responses->servicetool,true) ?? ''; $assigned_users = json_decode($responses->assigned_users,true) ?? ''; +$ignore_lists = json_decode($responses->ignore_list,true) ?? ''; //Partnerdata $partner_data = json_decode($responses->accounthierarchy); @@ -114,7 +117,11 @@ $view .= '
'.$$contract_type_text.'
'.($$contract_billingplan_text ?? '').'
+'.$responses->start_date.'
'.$date.'
-'.$responses->service_count.'
+| '.$general_year.' | +'.$general_total.' | +billing_plan && $responses->billing_plan == 2) ? '' :'style="display:none;"').'>'.$general_quarter.' | +billing_plan && $responses->billing_plan == 2) ? '' :'style="display:none;"').'>'.$general_total.' | +billing_plan && $responses->billing_plan == 1) ? '' :'style="display:none;"').'>'.$general_month.' | +billing_plan && $responses->billing_plan == 1) ? '' :'style="display:none;"').'>'.$general_total.' | +
|---|---|---|---|---|---|
| '.$key.' | +'.$value['total'].' | ++ | + | + | |
| + | + | '.$key.' | +'.$value['total'].' | +billing_plan && $responses->billing_plan == 1) ? '' :'style="display:none;"').'> | +billing_plan && $responses->billing_plan == 1) ? '' :'style="display:none;"').'> | +
| + | + | billing_plan && $responses->billing_plan == 2) ? '' :'style="display:none;"').'> | +billing_plan && $responses->billing_plan == 2) ? '' :'style="display:none;"').'> | +billing_plan && $responses->billing_plan == 1) ? '' :'style="display:none;"').'>'.$key.' | +billing_plan && $responses->billing_plan == 1) ? '' :'style="display:none;"').'>'.$value.' | +
| '.$list.' |
'.$success_msg.'
+ +