diff --git a/gitea-custom/templates/home.tmpl b/gitea-custom/templates/home.tmpl index a5e349ad..53d9b27c 100644 --- a/gitea-custom/templates/home.tmpl +++ b/gitea-custom/templates/home.tmpl @@ -89,6 +89,21 @@ .sf-footnote { padding: 34px 0 60px; font-size: 12.5px; color: #8a8a99; text-align: center; } +/* Integration (Zeiterfassung.CLOUD) */ +.sf-int-grid { display: grid; grid-template-columns: .9fr 1.1fr; gap: 26px; margin-top: 36px; align-items: start; } +.sf-int-person { background: #fff; border: 1px solid #ececee; border-radius: 16px; padding: 24px 26px; } +.sf-int-name { font-size: 19px; font-weight: 700; color: #25253d; margin-bottom: 10px; } +.sf-int-role { font-size: 14px; color: #515164; padding: 6px 0; border-bottom: 1px solid #f4f4f5; } +.sf-int-role code { background: #fff0f3; color: #b30d32; border-radius: 6px; padding: 1px 7px; font-size: 12.5px; } +.sf-int-loads { margin: 14px 0 10px; font-size: 11.5px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: #8a8a99; } +.sf-int-chips { display: flex; flex-direction: column; gap: 8px; } +.sf-int-chip { display: block; text-decoration: none; font: 500 13px/1.5 ui-monospace, Consolas, monospace; color: #25253d !important; background: #f4f4f5; border: 1px solid #ececee; border-radius: 10px; padding: 9px 13px; } +.sf-int-chip small { color: #8a8a99; font-family: "DM Sans", sans-serif; margin-left: 6px; } +.sf-int-chip:hover { border-color: #ff355e; } +.sf-int-chip-main { background: #fff0f3; border-color: #ffd6de; } +.sf-int-chip-main small { color: #b30d32; } +@media (max-width: 1000px) { .sf-int-grid { grid-template-columns: 1fr; } } + /* Live-Status-Panel */ .sf-live-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 14px; } .sf-live-card { background: #fff; border: 1px solid #ffd6de; border-radius: 12px; padding: 14px 16px; display: block; } @@ -390,6 +405,55 @@ a.sf-live-card:hover { border-color: #ff355e; box-shadow: 0 8px 24px rgba(255,53 + +
+
+
+ Integration +

Works with Zeiterfassung.CLOUD

+

The HR API knows every profession a person has — practiced, trained, or just loved. + The agent loads them all.

+
+
+
👥

Many professions, one person

+

relation_type: practiced · trained · secondary · hobby. The payroll answer stays + unambiguous (is_primary, Tätigkeitsschlüssel/KldB); the agent still sees the whole human.

+
🧩

Hobby skills count

+

Skills attach to the person, not the diploma. Self-assessed abilities flow in with provenance + (self · supervisor · imported · skillfactor) — hidden abilities get a structured data + source, not just observation.

+
🎯

Right person, right slot

+

skill_requirements per project, team or shift; the matching engine + (find_matching_employees) returns who qualifies, with match percentage.

+
+
+
+
Mustermann Max
+
Industriemechaniker · practiced · primary · KldB 24522
+
Fotograf · hobby · self-declared
+
agent loads ↓
+ +
+
+
GET /employees/1017/professions
+
[
+  { "profession": "Industriemechaniker", "slug": "industrial-machinery-mechanic",
+    "relation_type": "practiced", "is_primary": true,  "kldb_code": "24522" },
+  { "profession": "Fotograf",           "slug": "photographer",
+    "relation_type": "hobby",     "is_primary": false, "source": "self-declared" }
+]
+
One call — the agent's full package + list. Slugs resolve to skills-core/{slug}.
+
+
+

Mapped via ESCO URI · O*NET-SOC · KldB 2010 (Tätigkeitsschlüssel digits 1–5) — no proprietary IDs.

+

Explore the HR data model →

+
+
+