Category Archives: Change Log

Change Log of Support Management (Help Desk)

Database Structure

TABLE COLUMN
tickets
ticket_replies
products
uggroups
ugmembers
ugrights
users

 

Live URL

https://helpdesk.mobitek.my/


 

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

  1. In phpMyAdmin, create a new database “mobiteks_helpdesk”. Add 3 new tables:-
    • tickets
      • ticket_id – int(11)
      • date – datetime
      • user_id – int(11)
      • requestor – varchar(100)
      • email – varchar(255)
      • subject – varchar(255)
      • problem – longtext
      • product_id – id(11)
      • last_update – datetime
      • status – varchar(50)
    • ticket_replies
      • id – int(11)
      • date – datetime
      • staff_id – int(11)
      • staff_name – varchar(100)
      • steps_to_replicate – longtext
      • suggested_solution – longtext
      • final_solution – longtext
      • ticket_id – int(11)
    • products
      • id – int(11)
      • product_name – varchar(255)
  2. Assign “mobiteks_phprunner” to “mobiteks_helpdesk” database.
  3. Create a new domain “helpdesk.mobitek.my”.
  4. Set the PHP version for “helpdesk.sweetco.com.my” to “PHP 7.4 (ea-php74)” in “MultiPHP Manager”.
  5. Create a new project “HelpDesk” in PHPRunner and connect to “mobiteks_helpdesk” database.
  6. In “Tables” tab, enable below tables.
  7. Add relation between “tickets” and “ticket_replies” tables.
  8. In “Pages” tab, set as below:-
    • ticket_replies
    • tickets
    • products
  9. In “Misc” tab, set as below:-
    • Landing page
  10. In “Designer” tab, edit as below:-
    • ticket_replies
      • date
      • staff_id
      • staff_name
      • steps_to_replicate
      • suggested_solution
      • final_solution
    • tickets
      • user_id
      • requestor
      • email
      • date
      • problem
      • last_update
      • product_id
      • status
  11. 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
        • JavaScript OnLoad event

          window.listPage = pageObj;
      • 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)
              });
          });
      • 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)
              });
          });
      • View page
        • Before display

          if (isset($_SESSION["nonAdmin"]))
              $pageObject->hideItem("view_back_list");
    • 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)
              });
          });
      • 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)
              });
          });

 

Add email notification to “support@mobitek.my” for each support case created.

MODIFICATION in PHPRunner or cPanel or PHPMyAdmin

  1. Go to “Misc” tab -> “Email settings…” and set as below:-
  2. 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

  1. 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 permission to all users.

MODIFICATION in PHPRunner or cPanel or PHPMyAdmin

  1. Log in  to “helpdesk.mobitek.my” as “Big-Boss”.
  2. Go to “Admin Area”.
  3. Set the permission for all groups as below:-
    • <Admin>
    • <Default>

 

Add “Show/hide columns” button.

BEFORE AFTER

MODIFICATION in PHPRunner or cPanel or PHPMyAdmin

  1. 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”.
  2. 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

  1. 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

  1. 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

  1. 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

  1. Go to “Designer” tab and select “ticket_replies” in the Tables list.
  2. 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
  1. Log in to “helpdesk.mobitek.my” as:-
    • Username = Test
    • Password = test
  2. The page should redirected to “Tickets” -> “Add new” page.
  3. Enter the ticket details and click “Save”.
  4. The page will redirected to the “Tickets” -> “View” page.
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
  1. Add a new ticket.
  2. Fill up all details and click “Save”.
  3. A new email should be sent to “support@mobitek.my”.
 

 

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

  1. Add new connection to “SMSEngineVBNET.mdb”
  2. Add “Inbox” table to the project.
  3. Go to “Menu editor”. In “Menu Settings” section, select “Inbox” -> “Edit item”.
  4. In “Menu Item Editor”, rename the “Item text” to “Incoming SMS”.
  5. Go to “Pages” tab. In Tables list, select “Inbox”. Uncheck “Edit record”, “Add new” and “Delete record”.
  6. 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

  1. Add “Outbox” table to the project.
  2. Go to “Menu editor”. In “Menu Settings” section, select “Outbox” -> “Edit item”.
  3. In “Menu Item Editor”, rename the “Item text” to “Outgoing SMS”.
  4. Go to “Pages” tab. In Tables list, select “Outbox”. Uncheck “Edit record” and “Delete record”.
  5. 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

  1. 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”.
  2. 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

  1. Open “..\output\connections\ConnectionManager.php”
  2. 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 “\\”.
  3. 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”?

TESTING METHODOLOGY TEST RESULT
  1. Add “SMSEngineVBNET.mdb” in ODBC 64-bit
  2. Connect v.1.1 to “SMSEngineVBNET.mdb”
  3. Change the connection string for “$data[“ODBCString”]” in line 146 of “ConnectionManager.php” to:
    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\mobitek1\\Desktop\\SMS360 v. 1.1\\SMSEngineVBNET.mdb;Persist Security Info=False;";


 

TEST OBJECTIVE: Can v.1.1 run in localhost of HPC-8300 (http://localhost/sms360/v.1.1) ?

TESTING METHODOLOGY TEST RESULT
  1. Copy all files inside “output” folder to “C:\wamp64\www\sms360\v.1.1”
  2. Open “http://localhost/sms360/v.1.1” in browser

 

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:

  1. In “Tables” tab, right-click on the database and select “Properties”
  2. In “Connection properties”, click on “Back” button
  3. Select “ODBC Data Source”
  4. Click “ODBC Admin” button
  5. Select “System DSN” and click “Add…” button
  6. Select “Microsoft Access Driver (*.mdb, *.accdb)”
  7. Enter the “Data Source Name” and click “Select…”
  8. Locate the location of the database
  9. Click “Refresh list” button, select the new “DSN” created and click “Finish”

 

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
(source: https://stackoverflow.com/questions/1991643/microsoft-jet-oledb-4-0-provider-is-not-registered-on-the-local-machine)

 

I’ve tried to create a new blank project using MS Access database in PHPRunner and also face the same problem:

  • connection properties
  • error thrown
    “Unrecognized database format ‘C:\Users\mobitek1\Desktop\Project1\output\db\Project1.mdb’. in C:\Users\mobitek1\Desktop\Project1\output\connections\Connection.php on line 626

 

The solutions to use Microsoft Access database in PHPRunner are:

  • use “Provider=Microsoft.ACE.OLEDB.12.0” in connection string (we don’t have control for this)
  • use “Microsoft Access Database Engine 2010 Redistributable” (not sure how it works)
    https://www.microsoft.com/en-us/download/details.aspx?id=13255
  • use 32-bit version of PHPRunner (as suggested by PHPRunner)
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;