From e923e42a656f540df9e72dec92f7fbbf33c7fe7f Mon Sep 17 00:00:00 2001 From: richardtekula Date: Thu, 29 Jan 2026 17:15:44 +0100 Subject: [PATCH] feat: Add 8 certificate templates with different courses and lecturers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Templates: - AIcertifikat (Zdarílek), AIcertifikatGablas, AIcertifikatPatrik - ScrumMaster, ScrumProductOwner (blue background) - ITILFoundation (green background) - PRINCE2Foundation, PRINCE2Practitioner (orange background) Co-Authored-By: Claude Opus 4.5 --- src/assets/certificate/signature-patrik.png | Bin 0 -> 11171 bytes src/services/ai-kurzy/certificate.service.js | 62 +++++-- .../certificates/AIcertifikatGablas.html | 163 ++++++++++++++++++ .../certificates/AIcertifikatPatrik.html | 163 ++++++++++++++++++ .../{ITIL.html => ITILFoundation.html} | 35 +--- .../{PRINCE2.html => PRINCE2Foundation.html} | 35 +--- ...mGeneric.html => PRINCE2Practitioner.html} | 35 +--- src/templates/certificates/ScrumMaster.html | 94 ++++++++++ .../certificates/ScrumProductOwner.html | 94 ++++++++++ whattotest.txt | 62 +++++-- 10 files changed, 630 insertions(+), 113 deletions(-) create mode 100644 src/assets/certificate/signature-patrik.png create mode 100644 src/templates/certificates/AIcertifikatGablas.html create mode 100644 src/templates/certificates/AIcertifikatPatrik.html rename src/templates/certificates/{ITIL.html => ITILFoundation.html} (75%) rename src/templates/certificates/{PRINCE2.html => PRINCE2Foundation.html} (75%) rename src/templates/certificates/{ScrumGeneric.html => PRINCE2Practitioner.html} (75%) create mode 100644 src/templates/certificates/ScrumMaster.html create mode 100644 src/templates/certificates/ScrumProductOwner.html diff --git a/src/assets/certificate/signature-patrik.png b/src/assets/certificate/signature-patrik.png new file mode 100644 index 0000000000000000000000000000000000000000..7e7d9c759837a66001bd28c605b5122e6e081c6a GIT binary patch literal 11171 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 literal 0 HcmV?d00001 diff --git a/src/services/ai-kurzy/certificate.service.js b/src/services/ai-kurzy/certificate.service.js index d51f63d..4a7f261 100644 --- a/src/services/ai-kurzy/certificate.service.js +++ b/src/services/ai-kurzy/certificate.service.js @@ -16,28 +16,56 @@ const TEMPLATES_DIR = path.join(process.cwd(), 'src', 'templates', 'certificates * Available certificate templates */ export const CERTIFICATE_TEMPLATES = { + // AI certifikáty s dynamickým názvom kurzu a rôznymi lektormi AIcertifikat: { - name: 'AI Certifikát', + name: 'AI Certifikát (Zdarílek)', file: 'AIcertifikat.html', - description: 'Osvedčenie o absolvovaní AI kurzu', + description: 'AI kurz - lektor Zdarílek + Gablasová', background: 'background.jpeg', }, - ScrumGeneric: { - name: 'Scrum (Gablas)', - file: 'ScrumGeneric.html', - description: 'Scrum Master / Product Owner - lektor Gablas', + AIcertifikatGablas: { + name: 'AI Certifikát (Gablas)', + file: 'AIcertifikatGablas.html', + description: 'AI kurz - lektor Gablas + Gablasová', + background: 'background.jpeg', + }, + AIcertifikatPatrik: { + name: 'AI Certifikát (Patrik)', + file: 'AIcertifikatPatrik.html', + description: 'AI kurz - lektor Patrik + Gablasová', + background: 'background.jpeg', + }, + // Scrum certifikáty - fixný názov kurzu, podpisy v pozadí + ScrumMaster: { + name: 'Scrum Master', + file: 'ScrumMaster.html', + description: 'Scrum Master - Gablas + Gablasová', background: 'background-blue.jpeg', }, - ITIL: { - name: 'ITIL (Husam)', - file: 'ITIL.html', - description: 'ITIL Foundation - lektor Husam', + ScrumProductOwner: { + name: 'Scrum Product Owner', + file: 'ScrumProductOwner.html', + description: 'Scrum Product Owner - Gablas + Gablasová', + background: 'background-blue.jpeg', + }, + // ITIL certifikát - fixný názov kurzu, podpisy v pozadí + ITILFoundation: { + name: 'ITIL® 4 Foundation', + file: 'ITILFoundation.html', + description: 'ITIL Foundation - Husam + Gablasová', background: 'background-green.jpeg', }, - PRINCE2: { - name: 'PRINCE2 (Gablas)', - file: 'PRINCE2.html', - description: 'PRINCE2 Foundation/Practitioner - lektor Gablas', + // PRINCE2 certifikáty - fixný názov kurzu, podpisy v pozadí + PRINCE2Foundation: { + name: 'PRINCE2® Foundation', + file: 'PRINCE2Foundation.html', + description: 'PRINCE2 Foundation - Gablas + Gablasová', + background: 'background-orange.jpeg', + }, + PRINCE2Practitioner: { + name: 'PRINCE2® Practitioner', + file: 'PRINCE2Practitioner.html', + description: 'PRINCE2 Practitioner - Gablas + Gablasová', background: 'background-orange.jpeg', }, }; @@ -74,16 +102,20 @@ const loadAssets = async (templateName) => { const template = CERTIFICATE_TEMPLATES[templateName]; const backgroundFile = template?.background || 'background.jpeg'; - const [background, signatureGablasova, signatureZdarilek] = await Promise.all([ + const [background, signatureGablasova, signatureZdarilek, signatureGablas, signaturePatrik] = await Promise.all([ fs.readFile(path.join(ASSETS_DIR, backgroundFile)), fs.readFile(path.join(ASSETS_DIR, 'signature-gablasova.png')), fs.readFile(path.join(ASSETS_DIR, 'signature-zdarilek.png')), + fs.readFile(path.join(ASSETS_DIR, 'signature-gablas.png')), + fs.readFile(path.join(ASSETS_DIR, 'signature-patrik.png')), ]); return { backgroundImage: `data:image/jpeg;base64,${background.toString('base64')}`, signatureGablasova: `data:image/png;base64,${signatureGablasova.toString('base64')}`, signatureZdarilek: `data:image/png;base64,${signatureZdarilek.toString('base64')}`, + signatureGablas: `data:image/png;base64,${signatureGablas.toString('base64')}`, + signaturePatrik: `data:image/png;base64,${signaturePatrik.toString('base64')}`, }; }; diff --git a/src/templates/certificates/AIcertifikatGablas.html b/src/templates/certificates/AIcertifikatGablas.html new file mode 100644 index 0000000..ed0e0a8 --- /dev/null +++ b/src/templates/certificates/AIcertifikatGablas.html @@ -0,0 +1,163 @@ + + + + + + Osvedčenie - {{participantName}} + + + +
+
+

O S V E D Č E N I E

+

o absolvovaní kurzu

+ +
+

{{courseTitle}}

+ {{#if courseModules}} +

{{courseModules}}

+ {{/if}} + {{#if dateRange}} +

{{dateRange}}

+ {{/if}} +
+ +

{{participantName}}

+
+ + + +
ID: {{certificateId}}
+
+ + diff --git a/src/templates/certificates/AIcertifikatPatrik.html b/src/templates/certificates/AIcertifikatPatrik.html new file mode 100644 index 0000000..614f864 --- /dev/null +++ b/src/templates/certificates/AIcertifikatPatrik.html @@ -0,0 +1,163 @@ + + + + + + Osvedčenie - {{participantName}} + + + +
+
+

O S V E D Č E N I E

+

o absolvovaní kurzu

+ +
+

{{courseTitle}}

+ {{#if courseModules}} +

{{courseModules}}

+ {{/if}} + {{#if dateRange}} +

{{dateRange}}

+ {{/if}} +
+ +

{{participantName}}

+
+ + + +
ID: {{certificateId}}
+
+ + diff --git a/src/templates/certificates/ITIL.html b/src/templates/certificates/ITILFoundation.html similarity index 75% rename from src/templates/certificates/ITIL.html rename to src/templates/certificates/ITILFoundation.html index edc24f2..caab3d5 100644 --- a/src/templates/certificates/ITIL.html +++ b/src/templates/certificates/ITILFoundation.html @@ -7,27 +7,10 @@ + + +
+
+

{{participantName}}

+

Scrum Master

+ {{#if dateRange}} +

{{dateRange}}

+ {{/if}} +

v rozsahu 16 hodín

+
+ +
{{issueDate}}
+
ID: {{certificateId}}
+
+ + diff --git a/src/templates/certificates/ScrumProductOwner.html b/src/templates/certificates/ScrumProductOwner.html new file mode 100644 index 0000000..8a79cd7 --- /dev/null +++ b/src/templates/certificates/ScrumProductOwner.html @@ -0,0 +1,94 @@ + + + + + + Osvedčenie - {{participantName}} + + + +
+
+

{{participantName}}

+

Scrum Product Owner

+ {{#if dateRange}} +

{{dateRange}}

+ {{/if}} +

v rozsahu 16 hodín

+
+ +
{{issueDate}}
+
ID: {{certificateId}}
+
+ + diff --git a/whattotest.txt b/whattotest.txt index 262ced6..b45706d 100644 --- a/whattotest.txt +++ b/whattotest.txt @@ -1,15 +1,49 @@ -Refactoring Smoke Test Checklist -================================= + Task 1: Changed "Todos" to "Úlohy" in Sidebar -1. [x] Start server (npm run dev) — does it boot without import errors? -2. [x] Login — check audit log entry exists -3. [x] Create a company — check audit log -4. [x] Add a note to the company -5. [x] Add a reminder to the company -6. [x] Assign a user to the company -7. [x] Create a project, assign user -8. [x] Create a todo with assigned users — check push notification -9. [x] Start/stop/pause/resume a timer -10. [x] Generate a monthly timesheet XLSX — open and verify -11. [x] Upload a file to a project (check size/type limits) -12. [x] AI Kurzy: create course, participant, registration + Task 2: Fixed EventDetail panel width from w-max to w-80 + + Task 3: Chat Online Indicator: + - Added sendHeartbeat() to userApi + - Added heartbeat interval (30s) in AppDataContext + - Added green dot indicator in ChatList for users online < 60s + + Task 4: Updated search placeholder in CompaniesPage + + Task 5: Calendar Notification Badge: + - Created CalendarCountContext.jsx + - Added getTodayCount() to eventApi + - Added badge to Calendar button in Sidebar + + Task 6: Calendar Reminders Display: + - Added reminders state to useCalendarData + - Display reminders in CalendarGrid with orange styling and bell icon + + Task 7: team_leader role access in Sidebar + + Task 8: Changed "AI Kurzy" to "Všetky kurzy" in Sidebar + + Task 9: User Flagging System: + - Added needsFollowup checkbox column to RegistrationsTable + - Added red ring around rows when needsFollowup is true + + Task 10: Sidebar Reorganization with logical sections: + - Quick Access: Profil, Dashboard, Chat, Kalendár + - Work Management: Úlohy, Sledovanie času, Výkazy + - CRM: Firmy, Projekty, Kontakty + - Communication: Emaily, Doručené + - Services: Služby + - Admin: Používatelia, História akcií, Všetky kurzy + + --- + Next Steps: + + 1. Run npm run db:push in crm-server to apply database changes + 2. Test all features + 3. Commit changes when ready + +- i cant see online users there is not any green indicator and should be there +- i wanted to search comapny by her title,number , email address or website linked to company + now when i type phone nuber for exasmle it not display any company +- badge was added to kalendar button in Sidebar but i want to show number for whole day todos,reminders,dostupnost not only meetings/events +- i cant see the new role team_leader why ?? i cant create user with that role or edit role to team team_leader +-