From e821fb05671cacfe2ecdb465b70604d0ca41d920 Mon Sep 17 00:00:00 2001 From: Claude Project Manager Date: Mon, 29 Sep 2025 19:56:34 +0200 Subject: [PATCH] Zertifizierung erforderlich ist weg --- ANWENDUNGSBESCHREIBUNG.txt | 2 +- CLAUDE_PROJECT_README.md | 5 +-- VOLLSTAENDIGE_DOKUMENTATION.txt | 3 +- admin-panel/src/views/SkillManagement.tsx | 38 ++------------------ backend/scripts/seed-skills-from-frontend.js | 7 ++-- backend/scripts/seed-skills-from-shared.js | 9 ++--- backend/src/config/secureDatabase.ts | 1 - backend/src/routes/skills.ts | 15 ++++---- backend/src/services/skillSeeder.ts | 9 ++--- backend/src/services/sync/applier.ts | 6 ++-- backend/src/services/syncService.ts | 8 ++--- 11 files changed, 30 insertions(+), 73 deletions(-) diff --git a/ANWENDUNGSBESCHREIBUNG.txt b/ANWENDUNGSBESCHREIBUNG.txt index 5cce393..066e377 100644 --- a/ANWENDUNGSBESCHREIBUNG.txt +++ b/ANWENDUNGSBESCHREIBUNG.txt @@ -65,7 +65,7 @@ Shared (Ordner `shared`): ----------------------------- - `users`: Benutzer (username, email verschlüsselt + Hash, password (bcrypt), role, employee_id, is_active, …) - `employees`: Mitarbeitende (first_name, last_name, employee_number, photo, position, department, email/phone verschlüsselt+Hash, availability, …) -- `skills`: Skills (id, name, category = `catId.subId`, description, requires_certification, expires_after) +- `skills`: Skills (id, name, category = `catId.subId`, description, expires_after) - `employee_skills`: Zuordnung Mitarbeitende↔Skills mit Level/Verifikation - `language_skills`: Sprachkenntnisse (Kompatibilitäts- und Suchzwecke) - `specializations`: Freitext-Spezialisierungen je Mitarbeitendem diff --git a/CLAUDE_PROJECT_README.md b/CLAUDE_PROJECT_README.md index b517bec..2d1e72a 100644 --- a/CLAUDE_PROJECT_README.md +++ b/CLAUDE_PROJECT_README.md @@ -6,8 +6,8 @@ - **Path**: `A:\GiTea\SkillMate` - **Files**: 189 files -- **Size**: 5.3 MB -- **Last Modified**: 2025-09-28 01:28 +- **Size**: 4.6 MB +- **Last Modified**: 2025-09-29 01:39 ## Technology Stack @@ -248,3 +248,4 @@ This project is managed with Claude Project Manager. To work with this project: - README updated on 2025-09-25 22:01:37 - README updated on 2025-09-27 12:01:06 - README updated on 2025-09-28 18:39:07 +- README updated on 2025-09-29 19:21:55 diff --git a/VOLLSTAENDIGE_DOKUMENTATION.txt b/VOLLSTAENDIGE_DOKUMENTATION.txt index 730f560..1d85db6 100644 --- a/VOLLSTAENDIGE_DOKUMENTATION.txt +++ b/VOLLSTAENDIGE_DOKUMENTATION.txt @@ -122,7 +122,6 @@ id TEXT PRIMARY KEY name TEXT NOT NULL category TEXT NOT NULL description TEXT -requires_certification INTEGER DEFAULT 0 expires_after INTEGER # Tage bis Ablauf TABELLE: employee_skills (Verknüpfungstabelle) @@ -686,4 +685,4 @@ MONITORING ================================================================================ ENDE DER DOKUMENTATION -================================================================================ \ No newline at end of file +================================================================================ diff --git a/admin-panel/src/views/SkillManagement.tsx b/admin-panel/src/views/SkillManagement.tsx index 04d4ab5..ffec2d2 100644 --- a/admin-panel/src/views/SkillManagement.tsx +++ b/admin-panel/src/views/SkillManagement.tsx @@ -13,8 +13,6 @@ type Skill = { intermediate: number expert: number } - requires_certification?: boolean - certification_months?: number typeKey?: string typeName?: string typeIcon?: string @@ -69,9 +67,7 @@ export default function SkillManagement() { description: '', category: '', typeKey: '', - tags: [] as string[], - requires_certification: false, - certification_months: 0 + tags: [] as string[] }) // Category icon and color mapping @@ -408,9 +404,7 @@ export default function SkillManagement() { description: skill.description || '', category: categoryId, typeKey, - tags: skill.tags || [], - requires_certification: skill.requires_certification || false, - certification_months: skill.certification_months || 0 + tags: skill.tags || [] }) } else { setEditingSkill(null) @@ -419,9 +413,7 @@ export default function SkillManagement() { description: '', category: '', typeKey: '', - tags: [], - requires_certification: false, - certification_months: 0 + tags: [] }) } setShowSkillModal(true) @@ -970,30 +962,6 @@ export default function SkillManagement() { -
- - - {skillForm.requires_certification && ( -
- - setSkillForm(prev => ({ ...prev, certification_months: parseInt(e.target.value) || 0 }))} - className="w-20 px-2 py-1 border border-gray-300 rounded dark:bg-gray-700 dark:border-gray-600" - /> - Monaten -
- )} -
diff --git a/backend/scripts/seed-skills-from-frontend.js b/backend/scripts/seed-skills-from-frontend.js index 6abf276..fbd2e61 100644 --- a/backend/scripts/seed-skills-from-frontend.js +++ b/backend/scripts/seed-skills-from-frontend.js @@ -31,8 +31,8 @@ function main() { } const insert = db.prepare(` - INSERT OR IGNORE INTO skills (id, name, category, description, requires_certification, expires_after) - VALUES (?, ?, ?, ?, ?, ?) + INSERT OR IGNORE INTO skills (id, name, category, description, expires_after) + VALUES (?, ?, ?, ?, ?) `) let count = 0 @@ -43,9 +43,8 @@ function main() { const id = `${categoryKey}.${sk.id}` const name = sk.name const description = null - const requires = cat.id === 'certifications' || sub.id === 'weapons' ? 1 : 0 const expires = cat.id === 'certifications' ? 36 : null - const res = insert.run(id, name, categoryKey, description, requires, expires) + const res = insert.run(id, name, categoryKey, description, expires) if (res.changes > 0) count++ } } diff --git a/backend/scripts/seed-skills-from-shared.js b/backend/scripts/seed-skills-from-shared.js index 1586e3a..66706b1 100644 --- a/backend/scripts/seed-skills-from-shared.js +++ b/backend/scripts/seed-skills-from-shared.js @@ -43,7 +43,6 @@ function ensureTables(db) { name TEXT NOT NULL, category TEXT NOT NULL, description TEXT, - requires_certification INTEGER DEFAULT 0, expires_after INTEGER ) `) @@ -71,8 +70,8 @@ function seed(db, hierarchy) { `) const insertSkill = db.prepare(` - INSERT OR IGNORE INTO skills (id, name, category, description, requires_certification, expires_after) - VALUES (?, ?, ?, ?, ?, ?) + INSERT OR IGNORE INTO skills (id, name, category, description, expires_after) + VALUES (?, ?, ?, ?, ?) `) let catCount = 0 @@ -101,9 +100,8 @@ function seed(db, hierarchy) { for (const sk of (sub.skills || [])) { const sId = `${key}.${sk.id}` const sName = String(sk.name || sk.id) - const requires = (catId === 'certifications' || subId === 'weapons') ? 1 : 0 const expires = (catId === 'certifications') ? 36 : null - const sRes = insertSkill.run(sId, sName, key, null, requires, expires) + const sRes = insertSkill.run(sId, sName, key, null, expires) if (sRes.changes > 0) skillCount++ } } @@ -131,4 +129,3 @@ function main() { } main() - diff --git a/backend/src/config/secureDatabase.ts b/backend/src/config/secureDatabase.ts index 9d69202..5534712 100644 --- a/backend/src/config/secureDatabase.ts +++ b/backend/src/config/secureDatabase.ts @@ -237,7 +237,6 @@ export function initializeSecureDatabase() { name TEXT NOT NULL, category TEXT NOT NULL, description TEXT, - requires_certification INTEGER DEFAULT 0, expires_after INTEGER ) `) diff --git a/backend/src/routes/skills.ts b/backend/src/routes/skills.ts index aa9da1e..ad0ebcd 100644 --- a/backend/src/routes/skills.ts +++ b/backend/src/routes/skills.ts @@ -11,7 +11,7 @@ const router = Router() router.get('/', authenticate, async (req: AuthRequest, res, next) => { try { const skills = db.prepare(` - SELECT id, name, category, description, requires_certification, expires_after + SELECT id, name, category, description, expires_after FROM skills ORDER BY category, name `).all() @@ -116,8 +116,8 @@ router.post('/initialize', async (req: AuthRequest, res, next) => { try { const insertSkill = db.prepare(` - INSERT OR IGNORE INTO skills (id, name, category, description, requires_certification, expires_after) - VALUES (?, ?, ?, ?, ?, ?) + INSERT OR IGNORE INTO skills (id, name, category, description, expires_after) + VALUES (?, ?, ?, ?, ?) `) let count = 0 @@ -128,7 +128,6 @@ router.post('/initialize', skillName, category, null, - category === 'certificates' || category === 'weapons' ? 1 : 0, category === 'certificates' ? 36 : null // 3 years for certificates ) if (result.changes > 0) count++ @@ -151,7 +150,7 @@ router.post('/', authorize('admin', 'superuser'), async (req: AuthRequest, res, next) => { try { - const { id, name, category, description, requiresCertification, expiresAfter } = req.body + const { id, name, category, description, expiresAfter } = req.body // Optional custom id to keep stable let skillId = id && typeof id === 'string' && id.length > 0 ? id : uuidv4() @@ -171,14 +170,13 @@ router.post('/', return res.status(400).json({ success: false, error: { message: 'Unknown subcategory' } }) } db.prepare(` - INSERT INTO skills (id, name, category, description, requires_certification, expires_after) - VALUES (?, ?, ?, ?, ?, ?) + INSERT INTO skills (id, name, category, description, expires_after) + VALUES (?, ?, ?, ?, ?) `).run( skillId, name, category, description || null, - requiresCertification ? 1 : 0, expiresAfter || null ) @@ -188,7 +186,6 @@ router.post('/', name, category, description: description || null, - requiresCertification: requiresCertification || false, expiresAfter: expiresAfter || null } diff --git a/backend/src/services/skillSeeder.ts b/backend/src/services/skillSeeder.ts index da80138..68d6e7c 100644 --- a/backend/src/services/skillSeeder.ts +++ b/backend/src/services/skillSeeder.ts @@ -49,7 +49,6 @@ export function ensureSkillsSeeded() { name TEXT NOT NULL, category TEXT NOT NULL, description TEXT, - requires_certification INTEGER DEFAULT 0, expires_after INTEGER ) `) @@ -63,8 +62,8 @@ export function ensureSkillsSeeded() { VALUES (?, ?, ?, ?, ?, ?) `) const insertSkill = db.prepare(` - INSERT OR IGNORE INTO skills (id, name, category, description, requires_certification, expires_after) - VALUES (?, ?, ?, ?, ?, ?) + INSERT OR IGNORE INTO skills (id, name, category, description, expires_after) + VALUES (?, ?, ?, ?, ?) `) let cats = 0, subs = 0, skills = 0 @@ -87,9 +86,8 @@ export function ensureSkillsSeeded() { for (const sk of (sub.skills || [])) { const sId = `${key}.${sk.id}` const sName = String(sk.name || sk.id) - const requires = (catId === 'certifications' || subId === 'weapons') ? 1 : 0 const expires = (catId === 'certifications') ? 36 : null - insertSkill.run(sId, sName, key, null, requires, expires) + insertSkill.run(sId, sName, key, null, expires) skills++ } } @@ -109,4 +107,3 @@ function cryptoRandomUUID() { return v.toString(16) }) } - diff --git a/backend/src/services/sync/applier.ts b/backend/src/services/sync/applier.ts index def93d6..15f096d 100644 --- a/backend/src/services/sync/applier.ts +++ b/backend/src/services/sync/applier.ts @@ -74,9 +74,9 @@ async function syncSkill(action: string, data: any) { switch (action) { case 'create': db.prepare(` - INSERT INTO skills (id, name, category, description, requires_certification, expires_after) - VALUES (?, ?, ?, ?, ?, ?) - `).run(data.id, data.name, data.category, data.description || null, data.requiresCertification ? 1 : 0, data.expiresAfter || null) + INSERT INTO skills (id, name, category, description, expires_after) + VALUES (?, ?, ?, ?, ?) + `).run(data.id, data.name, data.category, data.description || null, data.expiresAfter || null) break case 'update': db.prepare(` diff --git a/backend/src/services/syncService.ts b/backend/src/services/syncService.ts index 034e5e8..b2aa3e6 100644 --- a/backend/src/services/syncService.ts +++ b/backend/src/services/syncService.ts @@ -388,11 +388,11 @@ export class SyncService { switch (action) { case 'create': db.prepare(` - INSERT INTO skills (id, name, category, description, requires_certification, expires_after) - VALUES (?, ?, ?, ?, ?, ?) + INSERT INTO skills (id, name, category, description, expires_after) + VALUES (?, ?, ?, ?, ?) `).run( data.id, data.name, data.category, data.description, - data.requiresCertification ? 1 : 0, data.expiresAfter + data.expiresAfter ) break @@ -570,4 +570,4 @@ export class SyncService { } } -export const syncService = SyncService.getInstance() \ No newline at end of file +export const syncService = SyncService.getInstance()