Category Archives: Support
Change Log of Support Management (Help Desk)
Database Structure
| TABLE | COLUMN |
| tickets | ![]() |
| ticket_replies | ![]() |
| products | ![]() |
| uggroups | ![]() |
| ugmembers | ![]() |
| ugrights | ![]() |
| users | ![]() |
Live URL
v. 1.0 Kaizen Completed on 2025-11-20
Replicate the ticketing system in “https://test.mobitek-system.com/helpdeskz/staff/login”:-
- Admin Username: mobitek-admin
- Admin Password: 2022@A32@w
The support case management will be able to record these additional information:-
- PROBLEM
- STEPS TO REPLICATE THE ERROR
- SUGGESTED SOLUTION
- FINAL SOLUTION
MODIFICATION in PHPRunner or cPanel or PHPMyAdmin
- In phpMyAdmin, create a new database “mobiteks_helpdesk”. Add 3 new tables:-
- tickets
- ticket_replies
- products
- Assign “mobiteks_phprunner” to “mobiteks_helpdesk” database.

- Create a new domain “helpdesk.mobitek.my”.


- Set the PHP version for “helpdesk.sweetco.com.my” to “PHP 7.4 (ea-php74)” in “MultiPHP Manager”.

- Create a new project “HelpDesk” in PHPRunner and connect to “mobiteks_helpdesk” database.

- In “Tables” tab, enable below tables.

- Add relation between “tickets” and “ticket_replies” tables.


- In “Pages” tab, set as below:-
- In “Misc” tab, set as below:-
- In “Designer” tab, edit as below:-
- In “Events” tab, edit as below:-
- “Login page” -> “After successful login”
$_SESSION["username"] = $username; $_SESSION["userID"] = $data["ID"]; $_SESSION["email"] = $data["email"]; // Note: Security::isAdmin() is not working, so need to find a way to identify Admin $ugData["UserName"] = $_SESSION["username"]; $check = DB::SELECT("ugmembers", $ugData); $result = $check->fetchAssoc(); if ($result) { header("Location: tickets_list.php"); $_SESSION["admin"] = true; } else { header("Location: tickets_add.php"); $_SESSION["nonAdmin"] = true; } exit(); - tickets
- List page
- Add page
- JavaScript OnLoad event
// To refresh the list page withoud reloading the page after record added this.on('afterSave', function() { var pageObj = window.listPage; Runner.runnerAJAX(Runner.pages.getUrl(pageObj.tName, pageObj.pageType)+"?a=return", pageObj.ajaxBaseParams, function(respObj){ pageObj.pageReloadHn.call(pageObj, respObj) }); });
- JavaScript OnLoad event
- Edit page
- JavaScript OnLoad event
// To refresh the list page withoud reloading the page after record edited this.on('afterSave', function() { var pageObj = window.listPage; Runner.runnerAJAX(Runner.pages.getUrl(pageObj.tName, pageObj.pageType)+"?a=return", pageObj.ajaxBaseParams, function(respObj){ pageObj.pageReloadHn.call(pageObj, respObj) }); });
- JavaScript OnLoad event
- View page
- ticket_replies
- Add page
- Before record added
// Update "last_update" field in "Tickets" table $fieldValues = array(); $keyValues = array(); $fieldValues["last_update"] = $values["date"]; $keyValues["id"] = $values["ticket_id"]; DB::Update("tickets", $fieldValues, $keyValues); - JavaScript OnLoad event
/ To refresh the list page withoud reloading the page after record added this.on('afterSave', function() { var pageObj = window.listPage; Runner.runnerAJAX(Runner.pages.getUrl(pageObj.tName, pageObj.pageType)+"?a=return", pageObj.ajaxBaseParams, function(respObj){ pageObj.pageReloadHn.call(pageObj, respObj) }); });
- Before record added
- Edit page
- Before record updated
// Update "last_update" field in "Tickets" table $fieldValues = array(); $keyValues = array(); $fieldValues["last_update"] = $values["date"]; $keyValues["id"] = $values["ticket_id"]; DB::Update("tickets", $fieldValues, $keyValues); - JavaScript OnLoad event
// To refresh the list page withoud reloading the page after record added this.on('afterSave', function() { var pageObj = window.listPage; Runner.runnerAJAX(Runner.pages.getUrl(pageObj.tName, pageObj.pageType)+"?a=return", pageObj.ajaxBaseParams, function(respObj){ pageObj.pageReloadHn.call(pageObj, respObj) }); });
- Before record updated
- Add page
- “Login page” -> “After successful login”
Add email notification to “support@mobitek.my” for each support case created.
MODIFICATION in PHPRunner or cPanel or PHPMyAdmin
- Go to “Misc” tab -> “Email settings…” and set as below:-

- Go to “Events” tab -> “tickets” -> “Add page” -> “After record added” and add below code:-
// Get the record values from the $values array $newRecordData = $values; // $values contains the data of the newly added record // Get the produdct name $query = DB::Query("SELECT product_name FROM products WHERE id = " . $values["product_id"]); $data = $query->fetchAssoc(); $productName = $data["product_name"]; // Define email parameters $from = $newRecordData['email']; $to = "support@mobitek.my"; $subject = "[Ticket ID: #" . $newRecordData['ticket_id'] . " ] --> " . $newRecordData['subject']; $body = "A new ticket has been raised.\n\n"; $body .= "Requestor: " . $newRecordData['requestor'] . "\n"; $body .= "Product: " . $productName . "\n"; $body .= "Link: https://" . $_SERVER[HTTP_HOST] . "/v.1.0/tickets_list.php?q=%28ticket_id~equals~" . $newRecordData['ticket_id'] . "%29&orderby=dticket_id\n"; // Send the email $ret = runner_mail(array( 'from' => $from, 'to' => $to, 'subject' => $subject, 'body' => $body )); // Optional: Display an error message if the email failed to send if (!$ret["mailed"]) { echo $ret["message"]; } // Redirect to view page if not logged in using "Big-Boss" if (isset($_SESSION["nonAdmin"])) { header("Location: tickets_view.php"); exit(); }
Implement “Database” Security Method.
MODIFICATION in PHPRunner or cPanel or PHPMyAdmin
- Go to “Security” tab:-
- set the “JWT secret key” in “Session keys…” to “YaaBF0qi8Wy7X9Wns2Ci” to match the key in “SSO”.

- use “Database” to store login information

- add a new user “Big-Boss”.


- set “Dynamic Permissions”.


- build and upload the project. Login using the “Big-Boss” account.
- go back to the project, use the encryption for password.

- build and upload the project again and change the password for “Big-Boss”.
- set the “JWT secret key” in “Session keys…” to “YaaBF0qi8Wy7X9Wns2Ci” to match the key in “SSO”.
Set permission to all users.
MODIFICATION in PHPRunner or cPanel or PHPMyAdmin
- Log in to “helpdesk.mobitek.my” as “Big-Boss”.
- Go to “Admin Area”.

- Set the permission for all groups as below:-
Add “Show/hide columns” button.
- Add in the page/table — https://helpdesk.mobitek.my/v.1.0/tickets_list.php?orderby=dticket_id
| BEFORE | AFTER |
![]() |
MODIFICATION in PHPRunner or cPanel or PHPMyAdmin
- Go to”Designer” tab, select “tickets” in Tables list and click on “list” tab. Under the “Options” section, click on the button next to the “list”.

- Check “Allow show/hide fields on page”.

Rename “Problem” to “Description of Problem” in the UI (there is no need to rename it in database).
| BEFORE | AFTER |
|
![]() |
MODIFICATION in PHPRunner or cPanel or PHPMyAdmin
- Go to “Designer” tab, select “tickets” in Tables list, click on “Problem” label and rename it to “Description of Problem”.

Rename “HelpDesk” to “Help Desk”.
| BEFORE | AFTER |
![]() |
![]() |
MODIFICATION in PHPRunner or cPanel or PHPMyAdmin
- Go to “Editor” tab, double-click on “HelpDesk Version 1.0” logo and rename it to “Help Desk Version 1.0”.

Add these information (column) into the message body of e-mail notification:-
- Product
- Requestor
| BEFORE | AFTER |
![]() |
MODIFICATION in PHPRunner or cPanel or PHPMyAdmin
- Go to “Events” tab, click on “tickets” -> “Add page” -> “After record added” and add code as below:-

Add border for the “ticket_replies” list page.
| BEFORE | AFTER |
![]() |
![]() |
MODIFICATION in PHPRunner or cPanel or PHPMyAdmin
- Go to “Designer” tab and select “ticket_replies” in the Tables list.

- Select all cells in “ticket_replies” grid and set the border to black 1px.

v. 1.0 Beta Testing Completed on 2025-11-20
TEST OBJECTIVE: Does other users except “Big-Boss” can only see the ticket’s add page and not the ticket’s list page?
| TESTING METHODOLOGY | TEST RESULT |
|
Page redirected to “https://helpdesk.mobitek.my/v.1.0/tickets_add.php” after logged in
The page redirected to “https://helpdesk.mobitek.my/v.1.0/tickets_view.php” after the ticket has been added |
TEST OBJECTIVE: Does an email send to “support@mobitek.my” for each new ticket created?
| TESTING METHODOLOGY | TEST RESULT |
|
How To Automatically Run MySQL Dump in Windows and Linux to Backup MySQL Database
Windows
- Create a batch file “sweetcoc_ams_backup.bat” for mysqldump. Copy below code into the batch file:-
@echo off REM set mysqldump path SET mysqldump_path="C:\wamp64\bin\mysql\mysql5.7.26\bin\mysqldump.exe" REM credentials to connect to MySQL server SET mysql_user=root SET mysql_password= REM backup storage location SET backup_folder="C:\wamp64\www\database_backups" REM backup file name SET backup_name=%backup_folder%\sweetcoc_ams_%DATE:~-4%-%DATE:~7,2%-%DATE:~4,2%.sql REM create backup "C:\wamp64\bin\mysql\mysql5.7.26\bin\mysqldump.exe" -u %mysql_user% sweetcoc_ams > %backup_name% - Create a new Task Scheduler that executes the batch file.




Linux
- Create a new PHP file and copy below code into it.
<?php ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); $database = '*****'; $user = '*****'; $pass = '*****'; $host = '*****'; //$dir = dirname(__FILE__) . '/dump.sql'; $dir = dirname(__FILE__); echo "Backing up database to {$dir}."; echo "\n"; exec("mysqldump --user={$user} --password={$pass} --host={$host} --no-tablespaces {$database} | zip > \${HOME}/database_backup/{$database}_`date '+%Y-%m-%d_%H:%M'`.sql.zip", $output); echo "\n"; echo "Backup completed."; ?> - Create a new Cron Job and point to the path where the PHP file is saved.
/usr/local/bin/php
/home4/sweetcoc/database_backup/mysqldump.php - The Cron Job will save the database as below:-

Restoring a Back-Up Database
- Go to “D:\” drive in UBS-SERVER.
- Compress “AMS Back-Up” folder to “AMS Back-Up.zip”.

- Copy “AMS Back-Up.zip” into “C:\wamp64\www\” folder in HP-6305-W7PRO and extract it.
- After extracted, move all folders inside “AMS Back-Up” folder to the root folder of “C:\wamp64\www\”. The folder hierarchy should be as below:-

- Go to “Start”, search for “wampserver” and run “Wampserver64”.

- Wait and ensure the icon is green in “System Tray” that indicates all services are running.

- If not then click on “Wampserver64” icon and select “Restart All Services”.

- Click on Windows “System Tray” dropdown -> click “Wamserver64” icon -> click “phpMyAdmin”. “phpMyAdmin” will be opened on the browser.

- Enter the “username = root” and leave the password empty. Click “Go”.

- Click on “sweetcoc_ams” database -> click “Import”.

- Click “Choose file”.

- Browse “C:\wamp64\www\database_backups”, sort the files by “Date modified” and open the latest SQL file.

- Leave everything as it is and click “Go”.

- Go to browser and open “http://localhost/punchcard”.

- Finally HP-6305-W7PRO” will have the latest version of “E-Punch Card” and “sweetcoc_ams” database.
How to Set Automatic Power On After Power is Resumed in BIOS
| BEFORE | AFTER | REMARK |
| Set to reboot after power has restored by TNB.
source: https://support.hp.com/gb-en/document/ish_3912651-2318005-16 |
How to Upgrade SERVERLINK
- Firstly, create a restore point.

- Open SERVERLINK, in “HOME”, click on the update.

- Let SERVERLINK download the update.
- After the download has been completed, a popup will appear. Click “Yes”.

- Click “Next” on each Setup.

Note: if you choose “Only dowload setup (do not install)” , then the setup file is downloaded into this folder “C:\Users\…\AppData\Local\Temp\UpdateRelease.exe“. Run the “UpdateRelease.exe” at a later date.
- Restart UBS-SERVER.

- Finally, check the version displayed is the latest version (s.c.).

Comparison of E-mail API used in PHP
| Runner_Mail() | PHPMailer() | PHP Mail() |
| SMTP, user name, password, port, etc. are set inside the PHPRunner UI | PHPMailer() is called by Runner_Mail()
SMTP is set inside the PHP code itself |
SMTP is set in “PHP.ini” |
| <?php
require_once(“include/dbcommon.php”);
$email = “t1@mobitek.my”; $msg = “”; $subject = “New data record”;
$msg.= “Message: [Message]\r\n”; $msg.= “Recipient: Recipient\r\n”; $msg.= “Date/Time: DateTimeQueue\r\n”; runner_mail(array(‘to’ => ‘$email’, ‘subject’ => $subject, ‘body’ => $msg)); ?> |
<?php include_once(‘libs/phpmailer/class.phpmailer.php’); include_once(‘libs/phpmailer/class.smtp.php’);$mail = new PHPMailer( true ); // Mail settings $mail->isSMTP(); //Send using SMTP $mail->Host = ‘mail.sweetco.com.my’; //Set the SMTP server to send through $mail->SMTPAuth = true; //Enable SMTP authentication $mail->Username = ‘factory@sweetco.com.my‘; //SMTP username $mail->Password = ‘2022@Beranang@Factory’; //SMTP password //$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; //Enable implicit TLS encryption $mail->Port = 587; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS` $mail->setFrom(‘support@mobitek.my‘, ‘MOBITEK Support’); $mail->isHTML(false);$mail->To = “t1@mobitek.my”; $mail->Subject = “This is Subject”; $mail->Body = “This the body”; $mail->Send();?> |
Open “php.ini” and search for “smtp” (there are no entries for no username and password)
[mail function] ; For Win32 only. ; For Unix only. You may supply arguments as well (default: “sendmail -t -i”). ; Force the addition of the specified parameters to be passed as extra parameters ; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename ; The path to a log file that will log all mail() calls. Log entries include |
How to Implement Log-In Page using “Database” for a Web Application
- Edit “Email settings…” in “Misc” tab.

- Add new table “users” in “Security” tab.

- Set “Dynamic permissions” in “Security” tab. Add a new user.


- Build and run the PHPRunner project in localhost. Log in using the username and password added previously. Let the PHPRunner project open in localhost.
- Go to PHPRunner project again. Enable “Password hashing (encryption)” in “Registration and passwords…”.

- Build and run PHPRunner project again in localhost.
- Go to “Admin Area”.

- Go to “Add/Edit users”, edit the password. To use back the same password, first change the password to another password. Save it and then edit it back to change to the original password.

USR-VCOM for MOBITEK S80 and MOBITEK Q25 Works in Windows 11
LAN driver (USR-VCOM) for MOBITEK S80 and MOBITEK Q25 supports Windows 11.
However, the USB driver of MOBITEK S80 3G Modem does not work in Windows 11. Use LAN port (LAN driver) of MOBITEK S80 instead.
USR-VCOM for MOBITEK S80 and MOBITEK Q25 Works in Windows 11
| TEST OBJECTIVE | TESTING METHODOLOGY | TEST RESULT |
| Does MOBITEK S80’s USR-VCOM (ELTIMA virtual serial port) support Windows 11? | USR-VCOM version = 3.7.1.520 | |
| Does MOBITEK Q25’s USR-VCOM (ELTIMA virtual serial port) support Windows 11? | USR-VCOM version = 3.7.1.520 |
Change Log of SMS360
v. 1.1 2024-01-03 Kaizen Completed
Add “Incoming SMS” tab
| BEFORE | AFTER |
| “Incoming SMS” tab that display ‘Inbox” table in grid format. |
MODIFICATION in PHPRunner
- Add new connection to “SMSEngineVBNET.mdb”

- Add “Inbox” table to the project.

- Go to “Menu editor”. In “Menu Settings” section, select “Inbox” -> “Edit item”.


- In “Menu Item Editor”, rename the “Item text” to “Incoming SMS”.

- Go to “Pages” tab. In Tables list, select “Inbox”. Uncheck “Edit record”, “Add new” and “Delete record”.

- Go to “Designer” tab, select “Inbox” in Tables list, set the page properties as below:

Add “Outgoing SMS” tab
| BEFORE | AFTER |
| “Outgoing SMS” tab that display “Outbox” table in grid format. |
MODIFICATION in PHPRunner
- Add “Outbox” table to the project.

- Go to “Menu editor”. In “Menu Settings” section, select “Outbox” -> “Edit item”.

- In “Menu Item Editor”, rename the “Item text” to “Outgoing SMS”.

- Go to “Pages” tab. In Tables list, select “Outbox”. Uncheck “Edit record” and “Delete record”.

- Go to “Designer” tab, select “Outbox” in Tables list, set the “Page layout” as below:

Add button “Send SMS” into “Incoming SMS” tab
| BEFORE | AFTER |
| “Outgoing SMS” tab has a button “Send SMS” that insert a new record into “Outbox” table so that a SMS can be send out by SMS Engine — Basic Edition. |
MODIFICATION in PHPRunner
- Go to “Designer” tab. Select “Outbox” in Tables list. Click on “list” tab, click “Add new” button. Rename the text in “label” to “Send SMS”.

- In the same “Designer” tab, select “add” tab. Click “Remove field” dropdown and remove all fields except “Message”, “Recipient” and “DateTimeQueue”.

Add “http://localhost/sms360/v.1.1”
| BEFORE | AFTER |
| Localhost in HPC-8300 can access the PHP files on “http://localhost/sms360/v.1.1” |
MODIFICATION in PHPRunner
- Open “..\output\connections\ConnectionManager.php”
- Go to the line “$data[“ODBCString”]” and change the value to:
- “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\mobitek1\\Desktop\\SMS360 v. 1.1\\SMSEngineVBNET.mdb;Persist Security Info=False;”;
- “Data Source” is where the “SMSEngineVBNET.mdb” located.
- Each directory must be separated by double backslash “\\”.
- Copy all files inside “output” folder to “C:\wamp64\www\sms360\v.1.1”
v. 1.1 2024-01-03 Beta Testing Completed
TEST OBJECTIVE: Can v.1.1 work with “SMSEngineVBNET.mdb”?
TEST OBJECTIVE: Can v.1.1 run in localhost of HPC-8300 (http://localhost/sms360/v.1.1) ?
| TESTING METHODOLOGY | TEST RESULT |
|
![]() |
PROBLEM
| SOLUTION | SOLVED? |
| According to PHPRunner documentation, to use PHPRunner with Access database, we need to use 32-bit version (source: https://xlinesoft.com/phprunner/docs/connecting_to_ms_access_db.htm) |
Not tested |
| Enable “php_com_dotnet.dll” extension in “php.ini” file (source: https://xlinesoft.com/phprunner/docs/connecting_to_ms_access_db.htm)
|
NO |
| Use ODBC in PHPRunner
refer to |
NO. ODBC does not work.
“ADODB.Connection” problem has disappeared but new error thrown Steps to use ODBC in PHPRunner:
It seems like PHPRunner still use Microsoft.Jet.OLEDB driver to connect to Access database which only work with 32-bit application as suggested by PHPRunner The problem with Microsoft.Jet.OLEDB driver also discussed by others
I’ve tried to create a new blank project using MS Access database in PHPRunner and also face the same problem:
The solutions to use Microsoft Access database in PHPRunner are:
|
| Edit the “ConnectionManager.php” to force it to use “Provider=Microsoft.ACE.OLEDB.12.0” instead of “Provider=Microsoft.Jet.OLEDB.4.0”
|
YES
Overwrite “..\output\connections\ConnectionManager.php” in line 146 from: Provider=Microsoft.Jet.OLEDB.4.0;DSN=SMSEngineVBNET;UID=;PWD=;Driver=C:\\PROGRA~1\\COMMON~1\\MICROS~1\\OFFICE15\\ACEODBC.DLL;DBQ=C:\\Users\\mobitek1\\Desktop\\SMS360 v. 1.1\\SMSEngineVBNET.mdb;DriverId=25;FIL=\”MS Access;\”;SafeTransactions=0″ to Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\mobitek1\\Desktop\\Project1\\SMSEngineVBNET.mdb;Persist Security Info=False; |











































































































