Artificial Intelligence in ZMI Solutions

AI for Time Tracking and HR Management

:root{ /* ---- Marke ---- */ --zki-blue: var(--e-global-color-primary, #1A54F9); --zki-blue-deep: var(--e-global-color-ef2cd4b, #3359A5); --zki-blue-tint: var(--e-global-color-a3eba1e, #E1EBFF); --zki-yellow: var(--e-global-color-secondary, #FCBC0F); --zki-yellow-tint: var(--e-global-color-dc08c37, #FFF3B7); --zki-ink: var(--e-global-color-text, #222727); --zki-grey: var(--e-global-color-a843588, #F3F6F7); --zki-white: var(--e-global-color-28f8675, #fff); /* ---- Chatbot-Widget (aus dem Produkt-Screenshot gemessen) ---- */ --zki-bot-body: #F9F9FA; --zki-bot-foot: #F0F0F0; --zki-bot-field: #F8F9FA; --zki-bot-scroll:#C8CDCD; --zki-bot-h: 660px; /* ---- Abgeleitete Töne (kein Pendant im Kit) ---- */ --zki-ink-700:#4A5252; --zki-ink-500:#646E6E; --zki-line:#E3E8EA; --zki-line-2:#D3DCE6; /* ---- Ampel der Abwesenheitsprognose (Farbwerte wie im Produkt) ---- */ --zki-amp-good:#A5D46A; --zki-amp-warn:#F8D775; --zki-amp-crit:#E4707E; --zki-amp-good-tx:#3F6B14; /* ---- Statusfarben für UI-Feedback in den Mockups ---- */ --zki-ok:#0C7A46; --zki-ok-bg:#E6F5ED; /* ---- WebClient Schicht-/Urlaubsplaner ---- */ --zki-wc-head:#E8EEF6; --zki-wc-name:#EDF2F9; --zki-wc-line:#C9D3DF; --zki-wc-sel:#4A7CB5; --zki-wc-fr:#D9EAD3; --zki-wc-sbs:#FFFB8F; --zki-wc-num:#FCE4D6; --zki-wc-abw:#DDDDDD; /* ---- Typografie ---- */ --zki-font-text: var(--e-global-typography-text-font-family, "Switzer Variable"), "Switzer", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; --zki-font-size: var(--e-global-typography-text-font-size, 18px); /* ---- Form ---- Radien leiten sich vom Basis-Radius der Seite ab (1.25rem = 20px). */ --zki-radius: var(--standard-radius, 1.25rem); --zki-r-card: var(--zki-radius); /* 20px */ --zki-r-bot: calc(var(--zki-radius) * .9); /* 18px */ --zki-r-sm: calc(var(--zki-radius) * .8); /* 16px */ --zki-r-msg: calc(var(--zki-radius) * .75); /* 15px */ --zki-r-pill: 99px; --zki-shadow-md:0 10px 30px rgba(34,39,39,.09); --zki-shadow-lg:0 24px 60px rgba(34,39,39,.14); --zki-ease:cubic-bezier(.22,.68,.35,1); --zki-pace:1; } /* ============================================================================ 2 · Grundlagen der Mockups ========================================================================= */ :is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) *,:is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) *::before,:is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) *::after{ box-sizing:border-box; } :is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend){ color:var(--zki-ink); font-family:var(--zki-font-text); font-size:var(--zki-font-size); line-height:1.62; -webkit-font-smoothing:antialiased; } :is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) img,:is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) svg{ max-width:100%; display:block; } :is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) h3,:is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) h4{ font-family:var(--zki-font-text); font-weight:600; line-height:1.07; letter-spacing:-.015em; margin:0 0 .5em; color:inherit; } :is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) p{ margin:0 0 1.1em; } :is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) strong,:is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) b{ font-weight:600; } :is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) :focus-visible{ outline:3px solid var(--zki-blue); outline-offset:3px; border-radius:4px; } .zki-vh{ position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; } .zki-mock{ position:relative; } /* ============================================================================ 3 · Chatbot-/Assistant-Fenster ========================================================================= */ .zki-bot{ width:100%; max-width:380px; height:var(--zki-bot-h); margin-inline:auto; background:var(--zki-bot-body); border-radius:var(--zki-r-bot); overflow:hidden; box-shadow:var(--zki-shadow-lg); display:flex; flex-direction:column; } .zki-bot__head{ background:var(--zki-blue); color:var(--zki-white); display:flex; align-items:center; gap:13px; padding:16px 18px; } .zki-bot__logo{ display:flex; } .zki-bot__logo svg{ width:50px; height:auto; color:var(--zki-white); } .zki-bot__head h3{ font-size:19px; font-weight:700; color:var(--zki-white); margin:0; letter-spacing:-.01em; } .zki-bot__max{ margin-left:auto; width:19px; height:19px; opacity:.92; } .zki-bot__body{ padding:18px; flex:1 1 auto; min-height:0; display:flex; flex-direction:column; overflow-y:auto; scrollbar-gutter:stable; scrollbar-width:thin; scrollbar-color:var(--zki-bot-scroll) transparent; } .zki-bot__body::-webkit-scrollbar{ width:9px; } .zki-bot__body::-webkit-scrollbar-track{ background:transparent; } .zki-bot__body::-webkit-scrollbar-thumb{ background:var(--zki-bot-scroll); border-radius:var(--zki-r-pill); border:3px solid transparent; background-clip:content-box; } .zki-bot__av{ width:34px; height:34px; border-radius:8px; background:var(--zki-blue); display:grid; place-items:center; margin-bottom:11px; } .zki-bot__av svg{ width:19px; height:19px; color:var(--zki-white); } .zki-bot__msg{ opacity:0; transform:translateY(12px); } .zki-wait{ display:none !important; } .zki-on .zki-bot__msg{ animation:zkiFadeUp .55s var(--zki-ease) forwards; } @keyframes zkiFadeUp{ to{ opacity:1; transform:none; } } .zki-bot__bubble{ background:var(--zki-white); border-radius:var(--zki-r-msg); padding:14px 17px; font-size:15px; line-height:1.5; box-shadow:0 1px 3px rgba(34,39,39,.07); } .zki-bot__bubble p{ margin:0 0 .7em; } .zki-bot__bubble p:last-child{ margin:0; } .zki-bot__bubble h4{ font-family:var(--zki-font-text); font-size:15.5px; font-weight:700; margin:0 0 .6em; letter-spacing:-.01em; line-height:1.25; } .zki-bot__bubble ol{ margin:0; padding-left:1.15em; font-size:14.5px; } .zki-bot__bubble ol > li{ margin-bottom:.55em; font-weight:600; } .zki-bot__bubble ul{ margin:.35em 0 0; padding-left:1.1em; } .zki-bot__bubble ul li{ font-weight:400; margin-bottom:.3em; } .zki-bot__user{ background:var(--zki-blue); color:var(--zki-white); border-radius:var(--zki-r-bot); padding:12px 19px; font-size:15px; line-height:1.45; max-width:88%; margin-left:auto; } .zki-bot__sugg.zki-bot__sugg{ display:block; width:100% !important; background:var(--zki-white) !important; border:1px solid var(--zki-blue) !important; color:var(--zki-blue) !important; border-radius:var(--zki-r-pill) !important; padding:13px 22px !important; font-family:var(--zki-font-text) !important; font-size:15px !important; font-weight:400 !important; line-height:1.45 !important; text-align:left !important; margin-top:11px !important; cursor:pointer; white-space:normal !important; overflow-wrap:break-word; max-width:100% !important; text-transform:none !important; letter-spacing:normal !important; appearance:none !important; -webkit-appearance:none !important; box-shadow:none !important; text-decoration:none !important; transition:background-color .2s var(--zki-ease); } .zki-bot__sugg.zki-bot__sugg:hover{ background:var(--zki-blue-tint) !important; } .zki-bot__src{ display:inline-flex; align-items:center; gap:6px; margin-top:11px; font-size:12px; font-weight:500; color:var(--zki-blue-deep); background:var(--zki-blue-tint); padding:4px 10px; border-radius:var(--zki-r-pill); } .zki-bot__src svg{ width:12px; height:12px; flex:none; } .zki-bot__foot{ background:var(--zki-bot-foot); padding:14px 16px 11px; margin-top:auto; } .zki-bot__inrow{ display:flex; align-items:center; gap:12px; } .zki-bot__tune,.zki-bot__send{ width:21px; height:21px; flex:none; } .zki-bot__tune{ color:var(--zki-ink-700); } .zki-bot__send{ color:var(--zki-blue); } .zki-bot__field{ flex:1; background:var(--zki-bot-field); border:1px solid #E4E6E8; border-radius:var(--zki-r-pill); padding:11px 19px; font-size:15px; color:#7E8686; } .zki-bot__privacy{ text-align:center; font-size:12.5px; color:var(--zki-ink-500); margin:9px 0 0; } .zki-soon{ display:inline-block; vertical-align:middle; margin-left:10px; font-family:var(--zki-font-text); font-size:12px; font-weight:600; line-height:1.4; letter-spacing:0; text-transform:none; white-space:nowrap; color:#7A5200; background:var(--zki-yellow-tint); border:1px solid #F0D98A; padding:3px 10px; border-radius:var(--zki-r-pill); } .zki-bot__head .zki-soon{ margin-left:0; flex:none; } .zki-late{ opacity:0; transform:translateY(10px); } .zki-on .zki-late{ animation:zkiFadeUp .5s var(--zki-ease) forwards; } /* Anklickbare Vorschlagsfragen */ .zki-bot__answer{ display:none; } .zki-bot__answer.zki-shown{ display:block; } .zki-bot__sugglist.zki-hidden{ display:none; } .zki-bot__body.zki-answered > .zki-bot__msg{ display:none; } .zki-bot__back.zki-bot__back{ display:inline-flex; align-items:center; gap:6px; margin-top:12px !important; padding:0 !important; width:auto !important; background:none !important; border:0 !important; border-radius:0 !important; font-family:var(--zki-font-text) !important; font-size:12.5px !important; font-weight:600 !important; line-height:1.4 !important; color:var(--zki-blue) !important; cursor:pointer; text-transform:none !important; letter-spacing:normal !important; appearance:none !important; -webkit-appearance:none !important; box-shadow:none !important; text-decoration:none !important; } .zki-bot__back.zki-bot__back svg{ width:12px; height:12px; } .zki-bot__back.zki-bot__back:hover{ text-decoration:underline !important; } :is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) button{ appearance:none !important; -webkit-appearance:none !important; background:none !important; background-image:none !important; border:0 !important; border-radius:0 !important; margin:0 !important; padding:0 !important; width:auto !important; min-width:0 !important; min-height:0 !important; font:inherit !important; color:inherit !important; text-transform:none !important; letter-spacing:normal !important; text-decoration:none !important; text-shadow:none !important; box-shadow:none !important; outline-offset:3px; white-space:normal !important; overflow-wrap:break-word; max-width:100% !important; } :is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) button:hover,:is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) button:focus,:is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) button:active{ background:none !important; box-shadow:none !important; transform:none; } /* ============================================================================ 4 · Datenübertragung (Assistant) ========================================================================= */ .zki-fetch{ position:relative; display:flex; align-items:center; gap:9px; overflow:hidden; background:var(--zki-grey); border:1px solid var(--zki-line); border-radius:9px; padding:8px 11px; margin-bottom:7px; font-size:12.5px; color:var(--zki-ink-700); } .zki-fetch::before{ content:""; position:absolute; inset:0; transform-origin:left; transform:scaleX(0); background:linear-gradient(90deg, rgba(26,84,249,.16), rgba(26,84,249,.03)); } .zki-on .zki-fetch::before{ animation:zkiFetch 1.1s var(--zki-ease) forwards; } @keyframes zkiFetch{ to{ transform:scaleX(1); } } .zki-fetch > *{ position:relative; } .zki-fetch__i{ width:15px; height:15px; flex:none; color:var(--zki-blue); } .zki-fetch__t{ line-height:1.3; } .zki-fetch__c{ margin-left:auto; width:14px; height:14px; flex:none; color:var(--zki-ok); opacity:0; transform:scale(.5); } .zki-on .zki-fetch__c{ animation:zkiCheck .35s var(--zki-ease) forwards; animation-delay:.95s; } @keyframes zkiCheck{ to{ opacity:1; transform:scale(1); } } .zki-fetch--wait{ background:var(--zki-white); border-style:dashed; color:var(--zki-ink-500); } .zki-fetch--wait::before{ display:none; } .zki-fetch--wait .zki-fetch__i{ color:var(--zki-ink-500); } .zki-appv{ border:2px solid var(--zki-yellow); border-radius:12px; overflow:hidden; } .zki-appv__h{ background:var(--zki-yellow-tint); padding:9px 12px; font-size:13px; font-weight:600; display:flex; align-items:center; gap:8px; } .zki-appv__h > svg{ width:15px; height:15px; flex:none; } .zki-appv__r{ display:flex; align-items:center; gap:10px; padding:8px 12px; border-top:1px solid var(--zki-line); font-size:13.5px; background:var(--zki-white); } .zki-appv__r span:last-child{ margin-left:auto; color:var(--zki-ink-700); font-size:12.5px; } .zki-appv__c{ display:flex; align-items:center; flex-wrap:wrap; gap:7px; padding:11px 12px; border-top:1px solid var(--zki-line); background:var(--zki-white); } .zki-appv__b.zki-appv__b{ font-family:var(--zki-font-text) !important; font-size:13.5px !important; font-weight:600 !important; border-radius:var(--zki-r-pill) !important; padding:9px 15px !important; border:2px solid transparent !important; width:auto !important; line-height:1.3 !important; cursor:pointer; white-space:normal !important; max-width:100% !important; text-transform:none !important; letter-spacing:normal !important; appearance:none !important; -webkit-appearance:none !important; box-shadow:none !important; text-decoration:none !important; } .zki-appv__b--y.zki-appv__b--y{ background:var(--zki-ink) !important; color:var(--zki-white) !important; } .zki-appv__b--n.zki-appv__b--n{ background:var(--zki-white) !important; border-color:var(--zki-line-2) !important; color:var(--zki-ink-700) !important; } .zki-appv__b--y.zki-appv__b--y:is(:hover,:focus,:active){ background:var(--zki-ink) !important; color:var(--zki-white) !important; } .zki-appv__b--n.zki-appv__b--n:is(:hover,:focus,:active){ background:var(--zki-white) !important; border-color:var(--zki-line-2) !important; color:var(--zki-ink-700) !important; } .zki-appv__date{ margin-left:auto; font-size:12px; font-weight:600; color:#7A5200; background:var(--zki-white); border-radius:var(--zki-r-pill); padding:4px 10px; } /* Datei-Ergebnis */ .zki-file{ display:flex; align-items:center; gap:11px; margin-top:11px; padding:11px; border:1px solid var(--zki-line); border-radius:11px; } .zki-file__i{ width:34px; height:34px; border-radius:9px; background:var(--zki-ok-bg); color:var(--zki-ok); display:grid; place-items:center; flex:none; } .zki-file__i svg{ width:16px; height:16px; } .zki-file__n{ font-size:14px; font-weight:600; } .zki-file__s{ font-size:12px; color:var(--zki-ink-500); } .zki-prompts{ display:flex; flex-wrap:wrap; gap:8px; margin-top:20px; max-width:45ch; } .zki-prompts span{ font-size:13px; background:var(--zki-grey); color:var(--zki-ink-700); padding:7px 13px; border-radius:var(--zki-r-pill); } /* ============================================================================ 5 · Prognose · ESS-Antragskarte ========================================================================= */ .zki-ess{ background:var(--zki-white); border:1px solid var(--zki-line); border-radius:14px; padding:clamp(16px,2.4vw,22px); box-shadow:var(--zki-shadow-lg); } .zki-ess__lbl{ font-size:12.5px; font-weight:600; color:var(--zki-ink-700); } .zki-ess__val{ font-size:17px; margin:0 0 14px; } .zki-ess__band{ border:1px solid var(--zki-line); border-radius:8px; overflow:hidden; margin:16px 0 18px; } .zki-ess__bh.zki-ess__bh{ display:flex; align-items:center; gap:11px; width:100% !important; padding:11px 14px !important; font-size:15px !important; font-weight:400 !important; font-family:var(--zki-font-text) !important; color:inherit !important; background:none !important; border:0 !important; border-radius:0 !important; text-align:left !important; text-transform:none !important; cursor:pointer; white-space:normal !important; overflow-wrap:break-word; } .zki-ess__bh > i{ width:11px; height:11px; border-radius:50%; flex:none; } .zki-ess__chev{ margin-left:auto; color:var(--zki-ink-500); width:15px; height:15px; flex:none; transition:transform .3s var(--zki-ease); } .zki-ess__band.zki-closed .zki-ess__chev{ transform:rotate(180deg); } .zki-ess__days{ display:grid; grid-template-columns:repeat(5,1fr); border-top:1px solid var(--zki-line); overflow:hidden; max-height:130px; transition:max-height .35s var(--zki-ease), border-top-width .35s var(--zki-ease); } .zki-ess__band.zki-closed .zki-ess__days{ max-height:0; border-top-width:0; } .zki-ess__day{ text-align:center; padding:11px 2px 14px; border-left:1px solid var(--zki-line); opacity:0; transform:translateY(10px); } .zki-ess__day:first-child{ border-left:0; } .zki-on .zki-ess__day{ animation:zkiFadeUp .65s var(--zki-ease) forwards; animation-delay:calc(var(--d,0s) * var(--zki-pace)); } .zki-ess__dow{ font-size:12.5px; color:var(--zki-ink-500); } .zki-ess__date{ font-size:clamp(16px,2vw,19px); font-weight:600; font-family:var(--zki-font-text); margin:1px 0 8px; } .zki-ess__dot{ display:block; width:15px; height:15px; border-radius:50%; margin:0 auto; } .zki-ess__foot{ display:flex; flex-wrap:wrap; gap:8px 48px; } .zki-ess__created{ margin:16px 0 0; padding-top:14px; border-top:1px solid var(--zki-line); font-size:13.5px; color:var(--zki-ink-700); } .zki-legend{ display:flex; flex-wrap:wrap; gap:9px 20px; margin-top:14px; font-size:13px; color:var(--zki-ink-700); } .zki-legend span{ display:inline-flex; align-items:center; gap:8px; } .zki-legend i{ width:13px; height:13px; border-radius:50%; flex:none; } /* ============================================================================ 6 · Prognose · WebClient Schicht-/Urlaubsplaner ========================================================================= */ .zki-wc{ background:var(--zki-white); border:1px solid var(--zki-wc-line); border-radius:10px; overflow:hidden; box-shadow:var(--zki-shadow-lg); } .zki-wc__scroll{ overflow:hidden; } .zki-wc__t{ border-collapse:collapse; table-layout:fixed; width:100%; font-size:11px; } .zki-wc__t th,.zki-wc__t td{ border:1px solid var(--zki-wc-line); padding:5px 2px; text-align:center; white-space:nowrap; overflow:hidden; } .zki-wc__kw{ background:var(--zki-wc-head); font-weight:600; font-size:11.5px; padding:6px 2px; } .zki-wc__dh{ position:relative; background:#F7F9FC; font-weight:500; line-height:1.25; padding:6px 2px 5px; } .zki-wc__dh b{ display:block; font-weight:700; font-size:11.5px; } .zki-wc__dh em{ display:block; font-style:normal; color:var(--zki-ink-500); font-size:11px; font-weight:600; } /* Markierter Tag (im Planer der angeklickte Tag) */ .zki-wc__dh--sel{ background:var(--zki-wc-sel); } .zki-wc__dh--sel b,.zki-wc__dh--sel em{ color:var(--zki-white); } .zki-wc__dh--sel .zki-wc__dot{ box-shadow:0 0 0 2px var(--zki-white); } /* Tage mit hohem Risiko färben sich nach dem Einblenden leicht ein */ .zki-wc__dh--crit::after{ content:""; position:absolute; inset:0; background:rgba(228,112,126,.18); opacity:0; pointer-events:none; } .zki-on .zki-wc__dh--crit::after{ animation:zkiTint .5s var(--zki-ease) forwards; animation-delay:calc(var(--d,0s) * var(--zki-pace) + .7s); } @keyframes zkiTint{ to{ opacity:1; } } .zki-wc__dot{ position:relative; display:block; width:9px; height:9px; border-radius:50%; margin:4px auto 0; transform:scale(0); } .zki-on .zki-wc__dot{ animation:zkiPop .5s var(--zki-ease) forwards; animation-delay:calc(var(--d,0s) * var(--zki-pace)); } @keyframes zkiPop{ to{ transform:scale(1); } } /* … und ihr Punkt pulsiert dezent weiter */ .zki-on .zki-wc__dot--crit{ animation:zkiPop .5s var(--zki-ease) forwards, zkiRingRed 2.8s var(--zki-ease) infinite; animation-delay:calc(var(--d,0s) * var(--zki-pace)), calc(var(--d,0s) * var(--zki-pace) + .9s); } @keyframes zkiRingRed{ 0%{ box-shadow:0 0 0 0 rgba(228,112,126,.8); } 60%,100%{ box-shadow:0 0 0 7px rgba(228,112,126,0); } } /* Namensspalte ist Kopfspalte: eingefärbt wie die KW- und Tagesleiste */ .zki-wc__n{ width:21%; text-align:left; padding-left:9px; background:var(--zki-wc-head); } .zki-wc__t td.zki-wc__n{ background:var(--zki-wc-name); font-weight:700; } .zki-wc__t td.fr{ background:var(--zki-wc-fr); } .zki-wc__t td.sbs{ background:var(--zki-wc-sbs); } .zki-wc__t td.num{ background:var(--zki-wc-num); } .zki-wc__t td.abw{ background:var(--zki-wc-abw); } /* ============================================================================ 7 · Prognose · Konzeptgrafik Datenbasis ========================================================================= */ .zki-flow{ background:var(--zki-blue-tint); border-radius:var(--zki-r-card); padding:clamp(20px,3vw,26px); } .zki-flow__t{ font-family:var(--zki-font-text); font-size:16px; font-weight:600; margin:0 0 18px; } .zki-flow__s{ display:flex; align-items:center; gap:13px; background:var(--zki-white); border-radius:var(--zki-r-sm); padding:13px 15px; opacity:0; transform:translateX(-12px); } .zki-on .zki-flow__s{ animation:zkiSlide .65s var(--zki-ease) forwards; animation-delay:calc(var(--d,0s) * var(--zki-pace)); } @keyframes zkiSlide{ to{ opacity:1; transform:none; } } .zki-flow__n{ width:26px; height:26px; border-radius:8px; display:grid; place-items:center; background:var(--zki-blue); color:var(--zki-white); font-size:12px; font-weight:700; flex:none; } .zki-flow__x{ font-size:14.5px; font-weight:500; } .zki-flow__a{ width:2px; height:14px; margin-left:26px; background:var(--zki-blue); opacity:.35; } .zki-flow__note{ margin:18px 0 0; font-size:13px; color:var(--zki-blue-deep); display:flex; align-items:center; gap:8px; } .zki-flow__note svg{ width:15px; height:15px; flex:none; } /* ============================================================================ 8 · Prognose · Tageskachel (Einzeltag aus dem Planer) ========================================================================= */ .zki-cal{ width:162px; margin:0; background:var(--zki-white); border:1px solid var(--zki-wc-line); border-radius:10px; overflow:hidden; box-shadow:var(--zki-shadow-md); animation:zkiBob 7s ease-in-out infinite; } @keyframes zkiBob{ 0%,100%{ transform:translateY(0); } 50%{ transform:translateY(-9px); } } .zki-cal__h{ background:var(--zki-wc-head); border-bottom:1px solid var(--zki-wc-line); padding:6px 11px; font-size:11px; font-weight:600; color:var(--zki-blue-deep); display:flex; align-items:center; gap:7px; } .zki-cal__h svg{ width:12px; height:12px; flex:none; } .zki-cal__day{ text-align:center; padding:13px 10px 15px; } .zki-cal__day em{ display:block; font-style:normal; font-size:11.5px; color:var(--zki-ink-500); } .zki-cal__day b{ display:block; font-family:var(--zki-font-text); font-size:25px; font-weight:600; line-height:1.1; margin:2px 0 11px; } .zki-cal__dot{ display:block; width:16px; height:16px; border-radius:50%; margin:0 auto 9px; background:var(--zki-amp-good); box-shadow:0 0 0 0 rgba(165,212,106,.85); animation:zkiRing 2.8s var(--zki-ease) infinite; } @keyframes zkiRing{ 60%,100%{ box-shadow:0 0 0 11px rgba(165,212,106,0); } } .zki-cal__day strong{ display:block; font-size:11.5px; font-weight:600; color:var(--zki-amp-good-tx); } .zki-cal__f{ border-top:1px solid var(--zki-wc-line); padding:6px 11px; font-size:10.5px; color:var(--zki-ink-500); } /* ============================================================================ 9 · Responsive (Elementor-Breakpoints) ========================================================================= */ @media (max-width:767px){ :root{ --zki-bot-h:660px; } .zki-bot{ max-width:100%; } .zki-ess__foot{ gap:8px 28px; } .zki-legend{ gap:8px 14px; font-size:12.5px; } .zki-cal{ animation:none; } .zki-wc__t .wk2{ display:none; } .zki-wc__t{ font-size:10px; } .zki-wc__t th,.zki-wc__t td{ padding:4px 1px; } .zki-wc__kw{ font-size:10.5px; } .zki-wc__dh b{ font-size:10.5px; } .zki-wc__dh em{ font-size:10px; } .zki-wc__n{ width:30%; padding-left:6px; } .zki-bot__sugg.zki-bot__sugg { font-size: 14px !important; } } /* ============================================================================ 10 · Reduzierte Bewegung ========================================================================= */ @media (prefers-reduced-motion: reduce){ :is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) *,:is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) *::before,:is(.zki-mock,.zmi-ki,.zki-bot,.zki-ess,.zki-wc,.zki-flow,.zki-cal,.zki-legend) *::after{ animation-duration:.001ms !important; animation-iteration-count:1 !important; transition-duration:.001ms !important; } .zki-bot__msg,.zki-late,.zki-ess__day,.zki-flow__s{ opacity:1; transform:none; } .zki-wait{ display:none !important; } .zki-wc__dot{ transform:scale(1); } }
/* ============================================================================ ZMI · KI-Mockups — Script ---------------------------------------------------------------------------- Vanilla JS, keine Abhängigkeiten. Übernimmt nur, was die Mockups selbst brauchen: 1. Tagesaktuelle Datumsangaben (data-zki-date / data-zki-range) 2. Autoscroll im Nachrichtenbereich – das Fenster hat eine feste Höhe (--zki-bot-h), längere Verläufe scrollen darin mit 3. Animationsstart, sobald ein Mockup im Viewport steht (.zki-on) – mit kurzer Verzögerung und genau einem Durchlauf 4. Anklickbare Vorschlagsfragen Einbinden mit `defer` oder am Seitenende. ========================================================================= */ (function () { "use strict"; function init() { var root = document; if (!root.querySelector("[data-zki-mock]")) return; var reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches; /* ---------------------------------------------------------------- 1 Tagesaktuelle Datumsangaben. Elemente mit data-zki-date="" bzw. data-zki-range=".." bekommen ihren Text beim Laden gesetzt. Token-Schema: w0-today = heute wN-mo|di|mi|do|fr|sa|so = Wochentag der Woche in N Wochen (w2-… ist damit immer die uebernaechste Woche – der Planer zeigt so bei jedem Aufruf zwei Wochen in der Zukunft.) Formate über data-zki-fmt (siehe fmtDate/fmtRange). Ohne JavaScript bleibt der im HTML hinterlegte Fallback stehen. */ var DOW_LONG = ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"]; var DOW_SHORT = ["So","Mo","Di","Mi","Do","Fr","Sa"]; var MONTHS = ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"]; function pad(n){ return n < 10 ? "0" + n : "" + n; } function isoWeek(d){ var t = new Date(d.getFullYear(), d.getMonth(), d.getDate()); t.setDate(t.getDate() + 3 - ((t.getDay() + 6) % 7)); var week1 = new Date(t.getFullYear(), 0, 4); return 1 + Math.round(((t - week1) / 86400000 - 3 + ((week1.getDay() + 6) % 7)) / 7); } function resolveToken(token){ var now = new Date(); var base = new Date(now.getFullYear(), now.getMonth(), now.getDate()); if (token === "w0-today") return base; var m = /^w(\d+)-(mo|di|mi|do|fr|sa|so)$/.exec(token); if (!m) return base; var weeks = parseInt(m[1], 10); var idx = { mo: 0, di: 1, mi: 2, do: 3, fr: 4, sa: 5, so: 6 }[m[2]]; var monday = new Date(base); monday.setDate(base.getDate() - ((base.getDay() + 6) % 7) + weeks * 7); monday.setDate(monday.getDate() + idx); return monday; } function fmtDate(d, fmt){ switch (fmt) { case "dow": return DOW_LONG[d.getDay()]; case "dow-short": return DOW_SHORT[d.getDay()]; case "d.": return pad(d.getDate()) + "."; case "d.m.": return pad(d.getDate()) + "." + pad(d.getMonth() + 1) + "."; case "d.m.y": return pad(d.getDate()) + "." + pad(d.getMonth() + 1) + "." + d.getFullYear(); case "d.m.yy": return pad(d.getDate()) + "." + pad(d.getMonth() + 1) + "." + String(d.getFullYear()).slice(2); case "kw": return "KW " + isoWeek(d); case "kw-month": return "KW " + isoWeek(d) + " · " + MONTHS[d.getMonth()]; case "month": return MONTHS[d.getMonth()] + " " + d.getFullYear(); case "ym-prev": var p = new Date(d.getFullYear(), d.getMonth() - 1, 1); return p.getFullYear() + "-" + pad(p.getMonth() + 1); default: return fmtDate(d, "d.m.y"); } } function fmtRange(a, b, fmt){ if (fmt === "dow-range") { return DOW_SHORT[a.getDay()] + ", " + fmtDate(a, "d.m.") + " – " + DOW_SHORT[b.getDay()] + ", " + fmtDate(b, "d.m.y"); } return fmtDate(a, "d.m.y") + " – " + fmtDate(b, "d.m.y"); } root.querySelectorAll("[data-zki-date]").forEach(function (el) { el.textContent = fmtDate(resolveToken(el.getAttribute("data-zki-date")), el.getAttribute("data-zki-fmt")); }); root.querySelectorAll("[data-zki-range]").forEach(function (el) { var parts = el.getAttribute("data-zki-range").split(".."); el.textContent = fmtRange(resolveToken(parts[0]), resolveToken(parts[1]), el.getAttribute("data-zki-fmt")); }); /* ---------------------------------------------------------------- 2 Autoscroll im Nachrichtenbereich. Das Fenster hat eine feste Höhe (--zki-bot-h). Wird der Verlauf länger, scrollt nur .zki-bot__body – wie in einem echten Chatfenster. Jede Nachricht zieht den Bereich beim Einblenden ans Ende nach. Scrollt der Nutzer selbst, hat das Vorrang: dann wird nicht mehr nachgezogen, bis der Ablauf neu startet. */ var chats = [].slice.call(root.querySelectorAll("[data-zki-chat]")); var bodies = [].slice.call(root.querySelectorAll(".zki-bot__body")); function toBottom(body) { body.scrollTo({ top: body.scrollHeight, behavior: reduce ? "auto" : "smooth" }); } /* ------------------------------------------------------------------ Zeitachse der Chatfenster. Jedes Element mit eigenem --d startet verborgen (.zki-wait) und wird zu seinem Zeitpunkt ins Layout genommen. Erst dadurch waechst die Scrollhoehe mit dem Gespraech mit: sonst stuende der ganze Verlauf von Anfang an im Layout, das Fenster haette sofort eine Scrollleiste und das Autoscroll wuerde die erste Frage direkt abschneiden. --d ist die Startsekunde, --zki-pace streckt oder staucht global. */ var PACE = parseFloat( window.getComputedStyle(document.documentElement).getPropertyValue("--zki-pace") ) || 1; function cueNodes(scope, ownAnswer) { return [].slice.call(scope.querySelectorAll("[style*='--d']")).filter(function (el) { // Nur im Chatfenster steuert das Script die Zeitachse. ESS-Karte, // Planer und Flow-Grafik bleiben rein per CSS getaktet: dort sind // alle Elemente von Anfang an im Layout, nur unsichtbar - sonst // wuerde die Karte beim Einblenden in der Hoehe springen. if (!el.closest(".zki-bot__body")) return false; var ans = el.closest(".zki-bot__answer"); return ownAnswer ? true : !ans; }); } function arm(nodes) { nodes.forEach(function (el) { el.classList.add("zki-wait"); }); } function play(host, nodes) { cancelCues(host); host.zkiCues = nodes.map(function (el) { var d = parseFloat(el.style.getPropertyValue("--d")) || 0; return window.setTimeout(function () { el.classList.remove("zki-wait"); var body = el.closest(".zki-bot__body"); if (body && !body.zkiHold) toBottom(body); }, reduce ? 0 : d * PACE * 1000); }); } function cancelCues(host) { (host.zkiCues || []).forEach(window.clearTimeout); host.zkiCues = []; } function resetScroll(el) { var list = el.classList.contains("zki-bot__body") ? [el] : el.querySelectorAll(".zki-bot__body"); [].slice.call(list).forEach(function (body) { body.zkiHold = false; body.scrollTop = 0; }); } bodies.forEach(function (body) { // Eigene Scroll-Eingaben des Nutzers stoppen das Nachziehen function hold() { body.zkiHold = true; } body.addEventListener("wheel", hold, { passive: true }); body.addEventListener("touchmove", hold, { passive: true }); body.addEventListener("keydown", hold); // animationend blubbert von jeder eingeblendeten Nachricht hoch body.addEventListener("animationend", function (ev) { if (ev.animationName !== "zkiFadeUp" || body.zkiHold) return; toBottom(body); }); }); /* ---------------------------------------------------------------- 3 Animationsstart im Viewport – einmalig. Die --d-Werte im Markup sind Sekunden auf der Zeitachse des jeweiligen Mockups; --zki-pace streckt oder staucht sie global. */ var mocks = [].slice.call(root.querySelectorAll("[data-zki-mock]")); function replay(el) { el.classList.remove("zki-on"); resetScroll(el); var nodes = cueNodes(el, false); arm(nodes); void el.offsetWidth; el.classList.add("zki-on"); play(el, nodes); } // Erst wenn das Mockup weitgehend steht, und dann noch eine kurze // Atempause – sonst ist der Ablauf vorbei, bevor der Blick ankommt. var START_DELAY = reduce ? 0 : 500; function stop(el) { if (el.zkiStart) { window.clearTimeout(el.zkiStart); el.zkiStart = null; } } // Jedes Mockup läuft genau einmal. Danach bleibt es im Endzustand // stehen – kein Loop, kein Neustart beim Zurückscrollen. var mockIO = new IntersectionObserver( function (entries) { entries.forEach(function (e) { var el = e.target; if (!e.isIntersecting) { stop(el); return; } if (el.zkiStart || el.zkiPlayed) return; el.zkiStart = window.setTimeout(function () { el.zkiStart = null; el.zkiPlayed = true; mockIO.unobserve(el); replay(el); }, START_DELAY); }); }, { threshold: 0.45, rootMargin: "0px 0px -5% 0px" } ); mocks.forEach(function (el) { arm(cueNodes(el, false)); [].slice.call(el.querySelectorAll(".zki-bot__answer")).forEach(function (a) { arm(cueNodes(a, true)); }); mockIO.observe(el); }); /* ---------------------------------------------------------------- 4 Zeitraum-Band der ESS-Karte auf- und zuklappen. Standard offen. */ root.querySelectorAll("[data-zki-band]").forEach(function (btn) { var band = btn.closest(".zki-ess__band"); btn.addEventListener("click", function () { var closed = band.classList.toggle("zki-closed"); btn.setAttribute("aria-expanded", closed ? "false" : "true"); }); }); /* ---------------------------------------------------------------- 5 Anklickbare Vorschlagsfragen im Chatbot-Mockup. */ chats.forEach(function (chat) { var list = chat.querySelector(".zki-bot__sugglist"); var answers = [].slice.call(chat.querySelectorAll(".zki-bot__answer")); var mock = chat.closest("[data-zki-mock]"); function show(key) { // Solange der Nutzer selbst klickt, soll die Schleife nicht dazwischenfunken if (mock) stop(mock); resetScroll(chat); answers.forEach(function (a) { var on = a.getAttribute("data-zki-answer") === key; cancelCues(a); a.classList.toggle("zki-shown", on); var nodes = cueNodes(a, true); arm(nodes); if (on) { a.classList.remove("zki-on"); void a.offsetWidth; a.classList.add("zki-on"); play(a, nodes); } }); if (list) list.classList.add("zki-hidden"); chat.classList.add("zki-answered"); } function reset() { resetScroll(chat); answers.forEach(function (a) { cancelCues(a); a.classList.remove("zki-shown", "zki-on"); arm(cueNodes(a, true)); }); if (list) list.classList.remove("zki-hidden"); chat.classList.remove("zki-answered"); // Begruessung und Vorschlagsliste stehen schon - nicht neu animieren cueNodes(chat, false).forEach(function (el) { el.classList.remove("zki-wait"); }); } chat.querySelectorAll("[data-zki-ask]").forEach(function (btn) { btn.addEventListener("click", function () { show(btn.getAttribute("data-zki-ask")); }); }); chat.querySelectorAll("[data-zki-back]").forEach(function (btn) { btn.addEventListener("click", reset); }); }); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init); } else { init(); } })();

Chatbot

How do I correct accounting errors?

Correcting Posting Errors – Step by Step

  1. Open the Proofing Assistant
    • Open the WebClientBookingsCorrection Wizard.
    • Open the red error entry by clicking the Play icon—the affected tag will be highlighted.
  2. Correct the reservation
    • Pencil icon to edit; + to make an online reservation for a new entry.
  3. Adjust the booking type and times, then save

Without editing rights, this automatically becomes a correction request; requested times are highlighted in green.

WebClient 6.6 Manual
Send a message…

Powered by AI

Week 33
Tuesday Aug. 11 low risk
Absence Forecast
Coming soon

AI Absence Forecast

The AI absence forecast shows, down to the day, how critical staffing will become. It appears as a traffic-light indicator directly in the vacation request via Employee Self-Service (ESS) and as a monthly view in the shift and vacation planner, which also displays already approved and requested vacations.

Coming soon

ZMI - Chatbot

The ZMI chatbot answers questions about how to use the software. Its extensive knowledge base is based on the manuals and FAQ entries. Answers are provided as step-by-step instructions. The knowledge base grows with every update to the manuals and FAQs—ensuring that all answers are up to date with the current version.

Coming soon

ZMI - Assistant

The ZMI Assistant is an AI agent with access to ZMI functions. It works directly with the data in ZMI: It answers questions about absences and accounts, exports reports, and creates entries once they have been approved. In doing so, it uses the logged-in user’s account and can only view data that the user is authorized to access.

AI Absence Forecasts

Coming soon

Applicant

Thorsten Basler

Tree View

Management › Headquarters › Production

Application Type

Vacation

Mon
10.08.
Low risk
Tue
11.08.
Low risk
Wed
12.08.
Low risk
Thu
13.08.
Increased Risk
Fri
14.08.
High Risk
Current Flexible Work Schedule Account

01:36

Remaining Vacation Days

26

Created by: Thorsten Basler, July 29, 2026, 9:14 a.m.

low increased high

Concrete Forecasts Instead of Gut Feelings

Absence forecasts provided at the time of application—transparent for both parties

When a vacation request comes in, managers can immediately see whether approving it would pose a risk. The color-coded system helps employees identify alternative vacation dates early on. This helps prevent overlaps and makes it easier for both sides to coordinate vacation requests more efficiently.

Monthly View in the Shift/Vacation Planner

To help you plan beyond individual requests, use the traffic light feature located below each day in the shift scheduler/vacation scheduler. This allows you to identify bottlenecks weeks in advance—and schedule training sessions, maintenance windows, or company outings on the green days.

Excerpt from the shift/vacation scheduler showing a traffic-light icon for each day
Last Name, First Name Week 33 Week 34
Aug. 10Mon. Aug. 11Tue. Aug. 12Wed. Aug. 13Thu. Aug. 14Fri. Aug. 17Mon. Aug. 18Tue. Aug. 19Wed. Aug. 20Thu. Aug. 21Fri.
Basler, ThorstenN1N1N1N1N1ABWN1N1N1N1
Berger, TobiasN1N1N1N1ABWN1N1N1N1N1
Novak, Petra240240240240240240240240240240
Pfeiffer, JonasHA5HA5HA5HA5FRHA5HA5HA5HA5FR
Reuter, KatrinN1N1N1ABWABWABWN1N1N1N1
Sandner, MarkusSBSSBSSBSSBSSBSN1N1N1N1ABW
Yildiz, AylinABWABWABWABWABWABWN1N1N1N1
low increased high

What Goes Into the Traffic Light Rating

1Previously Approved Vacations and Absences
2Requested, Pending Vacation Time
3Forecast of Unplanned Outages – Aggregated and Anonymized
4Daily traffic light score for the organizational unit
No individual profiling, no evaluation of individuals. Data processing within the EU.

Planned and unplanned outages combined

The traffic-light rating takes into account not only potential cases of illness but also approved and requested leave. The forecast of unplanned absences is calculated based on aggregated, anonymized data—no individual profiles are created.

ZMI - Chatbot

Coming soon

Chatbot

Hi 👋 I'm the ZMI chatbot. How can I help you?
How can I enter holidays in ZMI - Time?

Setting Up Holidays – Step-by-Step

  1. Open the Client Master
    • ZMI - Time → Administration → Client Master, Holidays tab.
  2. Create a Holiday
    • Click "New," then enter the date, description, and category.
  3. Save

Prerequisite: Permissions for the client master data; and for a new year, the year-end closing must have been completed.

ZMI - Time 6.6 Manual
How do I create a new rate plan?

Create a New Rate Plan – Step-by-Step

  1. Open the Employee Master Data
    • Open the " Rate " tab.
  2. Click "New " and name the plan
    • e.g., “Full-time, 40 hours per week.”
  3. Set and Save Validity
    • Set the "From" date; enter the "To" date only if the term is limited.

When changing your rate plan, create a new entry—do not overwrite the existing one.

ZMI - Time 6.6 Manual
How do I correct accounting errors?

Correcting Posting Errors – Step by Step

  1. Open the Proofing Assistant
    • WebClient → Reservations → Correction Wizard.
    • Open the red error entry by clicking the Play icon.
  2. Correct the reservation
    • Pencil icon to edit, + Online booking for a new entry.
  3. Adjust the booking type and times, then save

Without editing rights, this automatically becomes a correction request.

WebClient 6.6 Manual
Send a message…
Powered by AI

The Handbook That Answers

Questions Instead of Keyword Searches

Set holidays, create a rate plan, correct booking errors: The chatbot answers questions about how to use the system in natural language. Suggested starting questions show right away how it can help—if you need something else, just start typing.

Tip: You can click on the questions in the window.

Instructions Instead of a Sea of Text

Answers are provided as numbered steps with specific menu paths—not as a paragraph that you first have to apply to your own question. The reference in the manual is listed below, for anyone who wants more details.

Chatbot

How do I correct accounting errors?

Correcting Posting Errors – Step by Step

  1. Open the Proofing Assistant
    • Open the WebClientBookingsCorrection Wizard.
    • Open the red error entry by clicking the Play icon—the affected tag will be highlighted.
  2. Correct the reservation
    • Pencil icon to edit; + Online booking for a new entry.
  3. Adjust the booking type and times, then save

Without editing rights, this automatically becomes a correction request; requested times appear highlighted in green.

WebClient 6.6 Manual
Send a message…
Powered by AI

Chatbot

Does that also apply to the current version?

Yes. The instructions refer to ZMI - Time 6.6. My knowledge base is updated along with every update to the manuals and FAQ entries—so outdated menu paths are automatically removed.

As of July 2026
Send a message…
Powered by AI

Always Up to Date

The knowledge base grows with every update to the manuals and FAQ entries. This ensures that answers correspond to the version that is actually in use—and that no one accidentally follows instructions that no longer exist in that form.

ZMI - Assistant

Coming soon

Assistant

How much vacation time do I have left?
Vacation values are retrieved
You still have 18.5 vacation days left—4 of which, carried over from last year, will expire on March 31.
And who from Sales will be on vacation on August 11, 2026?
Employees in the Sales Department are being identified
Absences are retrieved
3 out of 9 people from Sales: S. Klein, T. Berger, and A. Yildiz.
Send a message…
Powered by AI

Ask practical questions. Complete assignments.

A Dedicated Application for Your Data

The Assistant is a standalone application separate from the chatbot. It accesses ZMI’s features directly and operates using the logged-in user’s account—it can only view data that the user is authorized to access. Every instance of data access is recorded in the activity log.

Data will be processed only after approval

The Assistant never directly performs write operations. It displays a preview of all planned changes—person by person, with dates. Only after you confirm will the data actually be written to ZMI. Alternatively, the process can be canceled at any time.

Assistant

Enter a business trip for all employees in the Development Department for August 11, 2026.
Employees in the Development Department are being identified
Loading available booking types
Preview · 4 bookings August 11, 2026
L. HoffmannBusiness trip
P. NovakBusiness trip
C. EbertBusiness trip
M. SandnerBusiness trip
Bookings are not recorded until you confirm them
Send a message…
Powered by AI

Assistant

Please export last month's entries from the Sales Department as a CSV file.
Bookings are being read · 9 employees
bookings-sales-2026-06.csv
412 rows · 30 days
Who at our Elfershausen location is certified as a first responder?
Qualifications at each location are compared
K. Reuter, M. Sandner, and J. Pfeiffer are certified first responders.
Send a message…
Powered by AI

Analyze, Export, Find

From exporting a department’s CSV file to searching for qualifications at a specific location: Whatever you can see in ZMI, you can also ask the Assistant—and nothing more.

"How much vacation time do I have left?" “Who on the sales team is on vacation next week?” “Who is certified as a first aider?” “Schedule a business trip for the Development Team on July 29, 2026”

AI That You Can Explain to the Works Council

Time and attendance data is among the most sensitive information a company holds. That is why ZMI’s AI features focus not on model size, but on the question of who sees which data and when.

Processing in the EU

Data processing takes place within the European Union—we do not transfer data to third countries for the purpose of responding to your inquiries.

GDPR- and AI Act-compliant

Designed to meet the requirements of the General Data Protection Regulation and the EU AI Regulation—including transparency regarding where AI is being used.

Aggregated and anonymized

The forecast of unplanned absences is based on aggregated, anonymized data. No profile or evaluation of individual employees is created.

No model training using your data

Customer data is not used to train AI models. The Assistant works with the logged-in user’s account and can only view data that the user is authorized to access.

Over 1,700 customers
already rely on ZMI.

Even more functions for every requirement

App

Mobile booking tool
always and everywhere with you.

Work flexibly and transparently with the ZMI – WebClient.

Cloud-based time tracking – test it now.

Frequently asked questions

Answers to your most important questions

Where is the data from the ZMI-KI features processed?

Data processing takes place within the EU. The features are designed to comply with the GDPR and the requirements of the EU AI Act.

The ZMI Chatbot answers questions about the software—its knowledge base consists of the ZMI manuals and FAQ entries, and it provides step-by-step instructions. The ZMI Assistant works with your data: It accesses ZMI’s functions directly, allowing it to query absences, export reports, and create entries once they’ve been approved. The chatbot and the Assistant are two separate applications.

Typical assignments include, for example:

  • “Who in the sales department is going on vacation next week?”
  • “How much vacation time do I have left?”
  • “Please export last month’s entries from the sales department as a CSV file.”
  • “Who at our Elfershausen location is certified as a first aider?”
  • “Schedule a business trip for all employees in the Development Department for next Tuesday.”

Writing assignments like the last one are always carried out only after explicit confirmation. The Assistant works with the logged-in user’s account and can view only the data that the user is authorized to access.

No. The Assistant never performs write operations immediately. It first displays a preview of all planned changes; these changes are written to ZMI only after you explicitly confirm them. You can cancel the process at any time. In addition, every instance of data access by the Assistant is clearly displayed in the history.

The absence forecast assesses how critical staffing is for each day within an organizational unit and displays the result using a traffic-light system: Green indicates a low risk, yellow an elevated risk, and red a high risk of understaffing. The assessment takes into account both approved and requested vacation time, as well as the probability of unplanned absences calculated based on aggregated, anonymized historical data.

Question not answered?

Would you like to learn more about the AI features of our software?

My team and I will be happy to advise you!
– Markus Welsch (Head of Sales)

ZMI employee Markus Welsch
ZMI employee Markus Welsch