Repository navigation
Technical Plugin CertifyComplete
Generates course-completion PDF certificates with configured payment/integration checks.
Audience: developers, advanced administrators and AI-assisted diagnosis. Plugin catalog.
- Review date: 2026-10-29. Method: static source analysis; runtime/provider behavior was not exercised.
- Code ownership: independently versioned plugin repository.
- Reported version:
2.8. - Source revision:
c82359bd59b2fbf6e06b236be3665348af117ec5. - Entry class file: CertifyComplete.php.
Confirm the installed plugin version independently of the Streamer version. Configuration defaults below are not a dump of this installation's saved settings.
No literal dependency declaration was extracted. This does not prove the plugin is standalone.
| Override | Implementation |
|---|---|
getPluginMenu() |
CertifyComplete.php:108 |
getPlayListButtons($playlist_id) |
CertifyComplete.php:138 |
getFooterCode() |
CertifyComplete.php:158 |
getHTMLMenuLeft() |
CertifyComplete.php:167 |
profileTabName($users_id) |
CertifyComplete.php:182 |
profileTabContent($users_id) |
CertifyComplete.php:189 |
executeEveryMinute() |
CertifyComplete.php:203 |
These are direct assignments inside getEmptyDataObject(), not evaluated effective defaults. Stored plugins.object_data, globals, structured values and conditional branches may alter runtime behavior. Private/default credential values are omitted.
| Field | Literal default or expression type | Literal source label/help | Evidence |
|---|---|---|---|
minimumWatchingPercentageToConsiderComplete |
Computed/structured; inspect source | — | source |
textTitle |
"Certificate of Completion" |
— | source |
textCertificate |
Computed/structured; inspect source | — | source |
css |
Computed/structured; inspect source | — | source |
SigningAuthorityName |
"John Smith is the official signatory responsible" |
— | source |
showCertificatesOnLeftMenu |
false |
— | source |
This inventory distinguishes implementation files from an API specification. Includes, templates, callbacks and CLI workers are not interchangeable HTTP endpoints. Request-field names below are direct source references, not a complete schema or permission declaration.
| File | Source role | Direct request fields observed |
|---|---|---|
| CertifyComplete.php | plugin entry class | — |
| HTMLMenuLeft.php | PHP page/include/worker; inspect caller | — |
| Objects/Certificate_courses.php | class/helper implementation | — |
| Objects/Certificate_pix_settings.php | class/helper implementation | — |
| Objects/Certificate_progress.php | class/helper implementation | — |
| Objects/Certified_playlist.php | class/helper implementation |
certified_playlist_id, playlists_id
|
| Objects/Certify_complete_certificates.php | class/helper implementation | — |
| Objects/User_certificate_identity.php | class/helper implementation | — |
| View/Certified_playlist/add.json.php | JSON entry point; inspect caller and guard |
add, id, playlists_id
|
| View/Certified_playlist/delete.json.php | JSON entry point; inspect caller and guard | id |
| View/Certified_playlist/index.php | PHP page/include/worker; inspect caller | — |
| View/Certified_playlist/index_body.php | PHP page/include/worker; inspect caller | — |
| View/Certified_playlist/list.json.php | JSON entry point; inspect caller and guard | draw |
| View/Certify_complete_certificates/add.json.php | JSON entry point; inspect caller and guard |
certified_playlist_id, created_php_time, date_of_certificate, id, json, modified_php_time, total_duration, users_id
|
| View/Certify_complete_certificates/delete.json.php | JSON entry point; inspect caller and guard | id |
| View/Certify_complete_certificates/index.php | PHP page/include/worker; inspect caller | — |
| View/Certify_complete_certificates/index_body.php | PHP page/include/worker; inspect caller | — |
| View/Certify_complete_certificates/list.json.php | JSON entry point; inspect caller and guard | draw |
| View/admin/delete_course.json.php | JSON entry point; inspect caller and guard | id |
| View/admin/get_course.json.php | JSON entry point; inspect caller and guard | id |
| View/admin/issue_certificate.json.php | JSON entry point; inspect caller and guard |
playlist_id, user_id
|
| View/admin/list_certificates.json.php | JSON entry point; inspect caller and guard | playlist_id |
| View/admin/list_courses.json.php | JSON entry point; inspect caller and guard | — |
| View/admin/list_identities.json.php | JSON entry point; inspect caller and guard | — |
| View/admin/list_playlists.json.php | JSON entry point; inspect caller and guard | — |
| View/admin/manage_courses.php | PHP page/include/worker; inspect caller | — |
| View/admin/manage_identities.php | PHP page/include/worker; inspect caller | — |
| View/admin/manage_identity.json.php | JSON entry point; inspect caller and guard |
action, user_id
|
| View/admin/manage_issuance.php | PHP page/include/worker; inspect caller | — |
| View/admin/pix_settings.json.php | JSON entry point; inspect caller and guard |
fixed_value, instructions_text, pix_payload, qr_code_base64
|
| View/admin/pix_settings.php | PHP page/include/worker; inspect caller | — |
| View/admin/recalc_hours.json.php | JSON entry point; inspect caller and guard | id |
| View/admin/revoke_certificate.json.php | JSON entry point; inspect caller and guard |
playlist_id, user_id
|
| View/admin/save_course.json.php | JSON entry point; inspect caller and guard |
alternate_course_name, enabled, extra_info, id, minimum_required_percent, playlist_id
|
| View/details.php | PHP page/include/worker; inspect caller | — |
| View/editor.php | PHP page/include/worker; inspect caller | — |
| View/my_certificates.php | PHP page/include/worker; inspect caller | — |
| View/profileTabContent.php | PHP page/include/worker; inspect caller | — |
| View/script.js | browser/worker JavaScript; verify loader | — |
| View/student/confirm_identity.json.php | JSON entry point; inspect caller and guard |
confirmed_cpf, confirmed_name
|
| View/student/confirm_identity.php | PHP page/include/worker; inspect caller | — |
| View/student/download_certificate.php | PHP page/include/worker; inspect caller |
playlist_id, user_id
|
| View/student/request_certificate.php | PHP page/include/worker; inspect caller | playlist_id |
| View/student/validate_certificate.php | PHP page/include/worker; inspect caller |
h, p, u
|
| assets/editor.php | PHP page/include/worker; inspect caller | — |
| assets/editorSave.php | PHP page/include/worker; inspect caller |
image, type
|
| cert.php | PHP page/include/worker; inspect caller | h |
| certificate.php | PHP page/include/worker; inspect caller | users_id |
| cli/debug_user.php | PHP page/include/worker; inspect caller | — |
| cli/update_progress.php | PHP page/include/worker; inspect caller | — |
| editCertificate.php | PHP page/include/worker; inspect caller |
html, users_id
|
| install/install.sql | schema/migration SQL | — |
| save.json.php | JSON entry point; inspect caller and guard | — |
Tables named in available CREATE TABLE statements: certificate_courses, certificate_pix_settings, certificate_progress, certified_playlist, certify_complete_certificates, user_certificate_identity.
Apply installation/update behavior through the owning plugin; this reference is not a script for running historical migrations manually.
Visibility and implementation semantics must be checked in source. Nonempty string defaults are represented as . This is a symbol reference, not a stable public API promise.
| Function or method | Source |
|---|---|
getDescription() |
44 |
getName() |
51 |
getUUID() |
56 |
getPluginVersion() |
61 |
getEmptyDataObject() |
66 |
getPluginMenu() |
108 |
canSwitchButton() |
131 |
getPlayListButtons($playlist_id) |
138 |
getFooterCode() |
158 |
getHTMLMenuLeft() |
167 |
profileTabName($users_id) |
182 |
profileTabContent($users_id) |
189 |
executeEveryMinute() |
203 |
processCertificateProgress($batchSize = null, $verbose = false, $force = false) |
222 |
cliLog($message) |
424 |
debugTimer($label, $startTime = null) |
435 |
getSqlCount($sql, $formats = '', $params = []) |
453 |
getPluginConfig() |
464 |
getMinWatchPercent() |
476 |
calculateProgressAndStatus($playlistId, $userId, $minRequired) |
493 |
calculateUserProgressPercentFast($userId, $playlistId) |
515 |
getPlaylistVideoIdsFast($playlistId) |
565 |
populateCertificateProgress($verbose = false, $batchSize = null) |
621 |
getEnabledCourses() |
724 |
findUsersWithoutProgressRecord($playlistId, $limit = null) |
742 |
createProgressRecords($users, $playlistId, $minRequired, $verbose = false) |
774 |
calculatePlaylistTotalDuration($playlist_id) |
815 |
calculateUserProgressPercent($user_id, $playlist_id) |
843 |
isUserEligible($user_id, $playlist_id) |
852 |
getCourseDisplayName($playlist_id) |
866 |
generateCertificateHash($playlist_id, $user_id) |
883 |
decodeCertificateHash($hash) |
898 |
getProgress($videos_id, $users_id) |
920 |
getVideoTotalSecondsWatching($videos_id, $users_id) |
928 |
getVideoMaxLastVideoTime($videos_id, $users_id) |
949 |
getFirstAndLastRecords($videos_id, $users_id) |
970 |
getPlaylistInfo($playlists_id, $users_id) |
1008 |
getImagesFolder() |
1107 |
getBGRelative($forceReturnAsset = false) |
1112 |
getSignatureRelative($forceReturnAsset = false) |
1123 |
getCertificateInfoFromCertifiedPlaylistId($certified_playlist_id, $users_id) |
1134 |
getCertificateInfo($playlists_id, $users_id) |
1144 |
getCertificateInfoDB($certified_playlist_id, $users_id, $refreshCache = false) |
1202 |
getPlaylistsIdFromRequest($playlists_id, $users_id) |
1211 |
These symbols are grouped by source file; inspect the class declaration and visibility before calling them.
Declared classes: Certificate_courses.
| Named symbol | Source |
|---|---|
getSearchFieldsNames() |
13 |
getTableName() |
18 |
setId($id) |
23 |
setPlaylist_id($playlist_id) |
28 |
setEnabled($enabled) |
33 |
setAlternate_course_name($alternate_course_name) |
38 |
setExtra_info($extra_info) |
43 |
setTotal_hours($total_hours) |
48 |
setMinimum_required_percent($minimum_required_percent) |
53 |
getId() |
58 |
getPlaylist_id() |
63 |
getEnabled() |
68 |
getAlternate_course_name() |
73 |
getExtra_info() |
78 |
getTotal_hours() |
83 |
getMinimum_required_percent() |
88 |
getByPlaylistId($playlist_id) |
96 |
isEnabled($playlist_id) |
109 |
getAllEnabled() |
118 |
recalculateTotalHours() |
135 |
deleteByPlaylistId($playlist_id) |
149 |
Declared classes: Certificate_pix_settings.
| Named symbol | Source |
|---|---|
getSearchFieldsNames() |
13 |
getTableName() |
18 |
setId($id) |
23 |
setQr_code_image_path($qr_code_image_path) |
28 |
setPix_payload($pix_payload) |
33 |
setFixed_value($fixed_value) |
38 |
setInstructions_text($instructions_text) |
43 |
getId() |
48 |
getQr_code_image_path() |
53 |
getPix_payload() |
58 |
getFixed_value() |
63 |
getInstructions_text() |
68 |
getSettings() |
76 |
updateSettings($qr_code_image_path, $pix_payload, $fixed_value, $instructions_text) |
100 |
Declared classes: Certificate_progress.
| Named symbol | Source |
|---|---|
getSearchFieldsNames() |
17 |
getTableName() |
22 |
setId($id) |
27 |
setPlaylist_id($playlist_id) |
32 |
setUser_id($user_id) |
37 |
setProgress_percent($progress_percent) |
42 |
setStatus($status) |
47 |
setRequested_at($requested_at) |
55 |
setIssued_at($issued_at) |
60 |
getId() |
65 |
getPlaylist_id() |
70 |
getUser_id() |
75 |
getProgress_percent() |
80 |
getStatus() |
85 |
getRequested_at() |
90 |
getIssued_at() |
95 |
getByUserAndPlaylist($user_id, $playlist_id) |
103 |
getOrCreate($user_id, $playlist_id) |
116 |
updateProgress($user_id, $playlist_id) |
138 |
markAsRequested() |
168 |
markAsIssued() |
180 |
markAsEligible() |
190 |
getAllForUser($user_id) |
202 |
ensureProgressRecordsExist($user_id) |
225 |
getAllRequested($playlist_id = null) |
252 |
Declared classes: Certified_playlist.
| Named symbol | Source |
|---|---|
getSearchFieldsNames() |
10 |
getTableName() |
15 |
getAllPlaylists() |
20 |
isSelected($playlists_id) |
46 |
deleteFrom($playlists_id) |
58 |
setId($id) |
71 |
setModified_php_time($modified_php_time) |
76 |
setCreated_php_time($created_php_time) |
81 |
setPlaylists_id($playlists_id) |
86 |
setJson($json) |
91 |
setStatus($status) |
96 |
setAlternate_course_name($alternate_course_name) |
101 |
setExtra_info($extra_info) |
106 |
setEnabled($enabled) |
111 |
getId() |
117 |
getModified_php_time() |
122 |
getCreated_php_time() |
127 |
getPlaylists_id() |
132 |
getJson() |
137 |
getStatus() |
142 |
getAlternate_course_name() |
147 |
getExtra_info() |
152 |
getEnabled() |
157 |
getAllAvailable() |
162 |
getFromPlaylist($playlists_id, $refreshCache = false) |
189 |
getFromRequest() |
206 |
Declared classes: certify_complete_certificates.
| Named symbol | Source |
|---|---|
getSearchFieldsNames() |
10 |
getTableName() |
15 |
getAllUsers() |
20 |
getAllCertified_playlist() |
45 |
setId($id) |
72 |
setDate_of_certificate($date_of_certificate) |
77 |
setTotal_duration($total_duration) |
82 |
setModified_php_time($modified_php_time) |
87 |
setCreated_php_time($created_php_time) |
92 |
setUsers_id($users_id) |
97 |
setJson($json) |
102 |
setCertified_playlist_id($certified_playlist_id) |
110 |
getId() |
116 |
getDate_of_certificate() |
121 |
getTotal_duration() |
126 |
getModified_php_time() |
131 |
getCreated_php_time() |
136 |
getUsers_id() |
141 |
getJson() |
146 |
getCertified_playlist_id() |
151 |
getStatus() |
157 |
setStatus($status) |
162 |
save() |
167 |
getFromUser($certified_playlist_id, $users_id, $refreshCache = false) |
175 |
setHTML($certified_playlist_id, $users_id, $html) |
191 |
Declared classes: User_certificate_identity.
| Named symbol | Source |
|---|---|
getSearchFieldsNames() |
13 |
getTableName() |
18 |
setUser_id($user_id) |
23 |
setConfirmed_name($confirmed_name) |
28 |
setConfirmed_cpf($confirmed_cpf) |
33 |
setLocked($locked) |
39 |
getUser_id() |
44 |
getConfirmed_name() |
49 |
getConfirmed_cpf() |
54 |
getLocked() |
59 |
getByUserId($user_id) |
67 |
isConfirmed($user_id) |
80 |
validateCPF($cpf) |
89 |
confirmIdentity($user_id, $name, $cpf) |
132 |
formatCPF($cpf) |
170 |
unlockIdentity($user_id) |
182 |
deleteIdentity($user_id) |
206 |
| Named symbol | Source |
|---|---|
getEditBtn($certified_playlist_id, $users_id) |
36 |
- Check the installed/enabled version and the dependencies/settings above.
- Identify the actual failing page, request, callback or worker and correlate its timestamp with the AVideo log.
- Follow the linked method and caller. Check business-state changes and output artifacts as well as HTTP status.
- Reproduce the relevant workflow in a test environment. External provider, Encoder, live-server, storage, payment and authenticated flows require their real integrations.
Related test filenames (name matches only; not executed by generation):
Shared diagnostic workflow. This page is not a security audit or a claim of end-to-end validation.
Start
Install and update
- Install on Ubuntu 24.04 or 26.04
- Installation Setup Page
- Scheduler cron job (required)
- Set up email
- Use HTTPS
- Own Encoder
- Docker
- Update AVideo
- Backup
- Secure file permissions
- Server command-line tools
- Hidden configuration options
Videos
- Upload a video
- Local Encoder (on your computer)
- Bulk upload by FTP
- Import a channel
- Publish on YouTube and social media
- Privacy options
- Only for logged-in users
- Resolutions by user group
- Storage options
- Move and protect video files
- Video does not play
Users
Live
- Make a live stream
- Stream with OBS
- Own live server
- One live server, many sites
- Live server install errors
- Live does not play
Plugins
Problems
Other
- Translate your site
- Write a plugin (developers)
- Technical reference (developers and advanced administrators)
Old and retired guides