General Query: How does the LMS track the student's progress on courses?

As the title suggests, I want to understand what the LMS tracks as the requirements for it to basically decide the percentage of completion. I ask because many students in our portal come saying they’ve completed a course, they approach 100% but don’t reach it.

Does it track as per duration of stay on each lesson? Or was there some other logic at play?

If I understand that, I can better explain to them how to go about doing the lessons so that the progress is reliably tracked into the completion percentage.

Whenever I open the Desk, I get this error and when I copy it to clipboard, it contains something about course progress, so was wondering if something was amiss there.

Here’s the error code.

### App Versions

{
“frappe”: “16.0.0-dev”,
“lms”: “2.21.0”
}

### Route

Workspaces/LMS

### Traceback

Traceback (most recent call last):
File “apps/frappe/frappe/app.py”, line 115, in application
response = frappe.api.handle(request)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File “apps/frappe/frappe/api/init.py”, line 49, in handle
data = endpoint(**arguments)
^^^^^^^^^^^^^^^^^^^^^
File “apps/frappe/frappe/api/v1.py”, line 36, in handle_rpc_call
return frappe.handler.handle()
^^^^^^^^^^^^^^^^^^^^^^^
File “apps/frappe/frappe/handler.py”, line 50, in handle
data = execute_cmd(cmd)
^^^^^^^^^^^^^^^^
File “apps/frappe/frappe/handler.py”, line 86, in execute_cmd
return frappe.call(method, **frappe.form_dict)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “apps/frappe/frappe/init.py”, line 1700, in call
return fn(*args, **newargs)
^^^^^^^^^^^^^^^^^^^^
File “apps/frappe/frappe/utils/typing_validations.py”, line 32, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File “apps/frappe/frappe/init.py”, line 890, in wrapper_fn
retval = fn(*args, **get_newargs(fn, kwargs))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “apps/frappe/frappe/desk/reportview.py”, line 69, in get_count
return execute(**args)[0].get(“total_count”)
^^^^^^^^^^^^^^^
File “apps/frappe/frappe/desk/reportview.py”, line 95, in execute
return DatabaseQuery(doctype).execute(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “apps/frappe/frappe/model/db_query.py”, line 209, in execute
result = self.build_and_run()
^^^^^^^^^^^^^^^^^^^^
File “apps/frappe/frappe/model/db_query.py”, line 250, in build_and_run
return frappe.db.sql(
^^^^^^^^^^^^^^
File “apps/frappe/frappe/database/postgres/database.py”, line 233, in sql
return super().sql(modify_query(query), modify_values(values), *args, *kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “apps/frappe/frappe/database/database.py”, line 238, in sql
self._cursor.execute(query, values)
psycopg2.errors.UndefinedFunction: operator does not exist: numeric ~~
unknown
LINE 3: where “tabLMS Enrollment”.“progress” ilike ‘%%100%%’
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.

### Request Data

{
“type”: “POST”,
“args”: {
“doctype”: “LMS Enrollment”,
“filters”: “{"progress":["like","%100%"]}”,
“fields”: “”,
“distinct”: false
},
“headers”: {},
“error_handlers”: {},
“url”: “/api/method/frappe.desk.reportview.get_count”,
“request_id”: null
}

### Response Data

{
“exception”: “”,
“exc_type”: “UndefinedFunction”,
“_debug_messages”: “["Error in query:\noperator does not exist: numeric ~~* unknown\nLINE 3: where \"tabLMS Enrollment\".\"progress\" ilike ‘%%100%%’\n ^\nHINT: No operator matches the given name and argument types. You might need to add explicit type casts.\n"]”
}

The issue has been fixed after updating the site backend.