> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devinenterprise.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Einen PTO-Tracker für das Team erstellen

export const UseCaseHero = ({title, description, prompt, category, features, devinUrl, agent, intent, playbookId, type}) => {
  const encodedPrompt = encodeURIComponent(prompt || '');
  const tag = 'docs-use-case-gallery';
  const utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=hero-cta';
  const agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  const devinHref = type === 'schedule' ? 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + (prompt ? '&prompt=' + encodedPrompt : '') : type === 'review' ? 'https://app.devin.ai/review?' + utm : agent === 'ada' ? 'https://app.devin.ai/search?' + utm + '&noSubmit=true' + (prompt ? '&prompt=' + encodedPrompt : '') : devinUrl ? devinUrl.includes('?') ? devinUrl + '&' + utm + agentParams : devinUrl + '?' + utm + agentParams : prompt ? 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encodedPrompt : 'https://app.devin.ai/?' + utm + agentParams;
  const buttonLabel = type === 'schedule' ? 'Schedule in Devin ↗' : type === 'review' ? 'Set Up Devin Review ↗' : agent === 'advanced' ? 'Try in Devin ↗' : agent === 'dana' ? 'Try in Dana ↗' : agent === 'ada' ? 'Try in Ask Devin ↗' : 'Try in Devin ↗';
  const featureList = features ? features.split(',').map(f => f.trim()) : [];
  return <div className="uc-hero">
      <div className="uc-hero-inner">
        <div className="uc-hero-left">
          <h1 className="uc-hero-title">{title}</h1>
          <p className="uc-hero-desc">{description}</p>
          <div>
            <a href={devinHref} target="_blank" rel="noopener noreferrer" className="try-in-devin-btn">
              {buttonLabel}
            </a>
          </div>
        </div>
        <div className="uc-hero-meta">
          <div className="uc-meta-item">
            <span className="uc-meta-label">Author</span>
            <span className="uc-meta-value">Cognition</span>
          </div>
          <div className="uc-meta-item">
            <span className="uc-meta-label">Category</span>
            <span className="uc-meta-value">{category}</span>
          </div>
          {featureList.length > 0 && <div className="uc-meta-item">
              <span className="uc-meta-label">Features</span>
              <span className="uc-meta-value">{featureList.join(', ')}</span>
            </div>}
        </div>
      </div>
    </div>;
};

export const PromptBlock = ({children, type, agent, intent, playbookId}) => {
  var utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=prompt-block';
  var tag = 'docs-use-case-gallery';
  var agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  var label = type === 'schedule' ? 'Schedule in Devin' : type === 'playbook' ? 'Create Playbook' : type === 'knowledge' ? 'Add to Knowledge' : agent === 'advanced' ? 'Try in Devin' : agent === 'dana' ? 'Try in Dana' : agent === 'ada' ? 'Try in Ask Devin' : 'Try in Devin';
  var buildUrl = function (text) {
    var encoded = encodeURIComponent(text);
    if (type === 'schedule') return 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + '&prompt=' + encoded;
    if (type === 'playbook') return 'https://app.devin.ai/settings/playbooks/create?' + utm + '&body=' + encoded;
    if (type === 'knowledge') return 'https://app.devin.ai/knowledge?' + utm + '&body=' + encoded;
    if (agent === 'ada') return 'https://app.devin.ai/search?' + utm + '&noSubmit=true&prompt=' + encoded;
    return 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encoded;
  };
  const ref = React.useRef(null);
  const [href, setHref] = React.useState('#');
  React.useEffect(() => {
    if (!ref.current) return;
    var codeEl = ref.current.querySelector('pre code');
    if (codeEl) {
      var text = codeEl.textContent.trim();
      if (text) setHref(buildUrl(text));
    }
    var header = ref.current.querySelector('[data-component-part="code-block-header"]');
    if (header && !header.querySelector('.prompt-block-devin-link')) {
      var link = document.createElement('a');
      link.href = href;
      link.target = '_blank';
      link.rel = 'noopener noreferrer';
      link.className = 'prompt-block-devin-link';
      link.style.cssText = 'display:inline-flex;align-items:center;gap:6px;text-decoration:none;color:#fff;font-size:11px;font-weight:500;padding:4px 10px;border-radius:6px;white-space:nowrap;background:#317CFF;transition:background 0.2s;margin-left:8px;';
      link.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg> ' + label;
      link.onmouseenter = function () {
        link.style.background = '#2968D9';
      };
      link.onmouseleave = function () {
        link.style.background = '#317CFF';
      };
      header.appendChild(link);
    }
    var existingLink = ref.current.querySelector('.prompt-block-devin-link');
    if (existingLink && href !== '#') existingLink.href = href;
  });
  return <div className="prompt-block" ref={ref}>{children}</div>;
};

<UseCaseHero title="Erstellen Sie einen Team-PTO-Tracker" description="Beschreiben Sie Ihr Tool, und Devin erstellt, testet und verifiziert es end-to-end." prompt="Erstellen Sie einen internen PTO-Tracker für unser Team unter /internal/pto. Mitarbeitende reichen Abwesenheitsanträge mit einem Datumsbereich, einem Typ (Urlaub, krankheitsbedingt, persönlich) und einer optionalen Notiz ein. Führungskräfte sehen eine Warteschlange offener Anträge und genehmigen oder lehnen diese ab. Eine Kalenderansicht zeigt, wer abwesend ist, farblich nach Typ gekennzeichnet. Ein Dashboard zeigt das PTO-Guthaben jeder Person (20 Tage/Jahr). Mitarbeitende dürfen ihr Guthaben nicht überschreiten oder sich mit bereits bestehender PTO überschneiden. Warnen Sie, wenn Teammitglieder bereits abwesend sind. Slack-Benachrichtigungen beim Einreichen sowie bei Genehmigung/Ablehnung über SLACK_WEBHOOK_URL. Verwenden Sie unsere Next.js-App, Prisma ORM und die bestehenden DataTable- und Calendar-Komponenten. Bevor Sie Code schreiben, skizzieren Sie Ihren Plan zur Review. Schreiben Sie Tests für die Guthabenberechnungen, die Überschneidungserkennung und den Genehmigungs-Workflow. Testen Sie jede Seite und jeden Ablauf im Browser – einreichen, genehmigen, ablehnen, Kalender prüfen, Dashboard überprüfen. Öffnen Sie keinen Pull Request (PR), bevor nicht alles end-to-end funktioniert." category="Feature-Entwicklung" features="" />

<div className="uc-detail-wrapper">
  <Tip>Möchtest du das nicht manuell einrichten? Füge einen Link zu dieser Seite in eine Devin-Sitzung ein und bitte Devin, alles für dich einzurichten.</Tip>

  <Steps>
    <Step title="(Optional) Die Codebasis mit Ask Devin eingrenzen">
      Wenn du in deiner App bereits interne Tools hast, verwende [Ask Devin](https://app.devin.ai/search?utm_source=docs\&utm_medium=use-case-gallery), um die bestehenden Muster zu verstehen, bevor du deine Spezifikation schreibst. Das ist besonders hilfreich, wenn das neue Tool zur vorhandenen Architektur passen soll:

      <PromptBlock agent="ada">
        ```txt Scope Architektur interner Tools theme={null}
        Zeig mir, wie unsere bestehenden internen Tools aufgebaut sind:
        1. Welche Seiten existieren unter /internal/ und wie sind sie aufgebaut?
        2. Wie gehen interne Seiten mit Authentifizierung und rollenbasierter Zugriffskontrolle um?
        3. Welche gemeinsamen UI-Komponenten werden verwendet (Tabellen, Formulare, modale Dialoge)?
        4. Wie sind Datenbankmigrationen in unserem Prisma-Schema strukturiert?
        5. Gibt es bestehende Benachrichtigungsmuster (Slack, E-Mail)?
        ```
      </PromptBlock>

      Nutze die Antworten, um deine Spezifikation mit konkreten Dateireferenzen, Komponentennamen und Mustern zu ergänzen, damit Devin etwas erstellt, das konsistent mit deinen bestehenden Tools ist. Du kannst auch direkt aus Ask Devin eine Devin-Session starten; dabei werden alle gewonnenen Informationen als Kontext übernommen.
    </Step>

    <Step title="Detaillierte Spezifikation erstellen">
      Interne Tools – PTO-Tracker, Admin-Oberflächen, Datenskripte, CLI-Utilities – sind essenziell, werden aber selten priorisiert. Sie eignen sich ideal für Devin, weil die Anforderungen klar definiert sind, die Zielgruppe dein Team ist und „funktioniert zuverlässig“ wichtiger ist als ein pixelgenaues Design.

      Sei präzise darin, was das Tool tut, welche Daten es speichert und mit welchen Services es sich verbindet. Je mehr Details du angibst, desto näher kommt die erste Version dem, was du brauchst.

      <PromptBlock>
        ```txt Build a team PTO tracker theme={null}
        Build an internal PTO tracker for our team under /internal/pto.

        ## Features
        - Employees can submit time-off requests with a date range, type
          (vacation, sick, or personal), and an optional note
        - Managers see a queue of pending requests and can approve or deny
          each one
        - A calendar view shows who's out on which days, color-coded by type
        - A dashboard shows every employee's PTO balance: total days,
          used days, remaining days, and pending requests
        - Each employee gets 20 PTO days per year
        - Employees can't request more days than their remaining balance
        - Requests can't overlap with their own existing approved PTO
        - Show a warning (not a block) if teammates are already out during
          the same dates

        ## Notifications
        - Slack notification to the manager when a request is submitted
        - Slack notification to the employee when it's approved or denied
        - Use SLACK_WEBHOOK_URL from env vars

        ## Technical notes
        - Use our existing Next.js app and Prisma ORM
        - Follow the layout pattern in /internal/users
        - Reuse DataTable and Calendar components from src/components/ui/

        ## Planning
        - Before writing code, outline your implementation plan and share
          it with me for review

        ## Testing
        - Write tests for balance calculations, date overlap detection,
          and the approval workflow
        - After implementing, spin up the dev server and test every page
          and flow in the browser — submit a request, approve it, deny one,
          check the calendar, verify dashboard numbers, and test edge cases
          like overlapping dates and exceeding balance
        - Do not open a PR until everything works end-to-end
        ```
      </PromptBlock>

      Du kannst deine Spezifikation auch iterativ mit Ask Devin verfeinern – füge einen groben Entwurf ein und bitte es, Lücken zu identifizieren oder Verbesserungen auf Basis deiner Codebasis vorzuschlagen.
    </Step>

    <Step title="Anmeldedaten hinzufügen">
      Übergeben Sie alle API keys oder Tokens, die Devin benötigt, über [Secrets](/de/product-guides/secrets) – in diesem Fall die Slack-Webhook-URL.

      Der einfachste Ansatz ist, sie vor dem Start der Session als Organisations-Secrets zu speichern:

      1. Gehen Sie zu **Settings > Secrets** und fügen Sie `SLACK_WEBHOOK_URL` hinzu.
      2. Devin greift als Umgebungsvariablen auf Secrets zu, sodass sie niemals hart in Ihrem Quellcode codiert werden.

      <Note>Organisations-Secrets müssen **vor** dem Start der Session hinzugefügt werden – sie werden beim Start der Session injiziert. Alternativ können Sie während der Session über den Chat Secrets bereitstellen, und Devin wird Sie außerdem proaktiv nach allen benötigten Zugangsdaten fragen, wenn fehlende Umgebungsvariablen festgestellt werden.</Note>
    </Step>

    <Step title="Steuern Sie die Session mit Slash-Befehlen">
      Sobald die Session gestartet ist, kannst du Slash-Befehle verwenden, um Devins Workflow zu steuern:

      * **`/plan`** — Bitte Devin, einen ausführlichen Implementierungsplan zu erstellen, bevor es mit dem Schreiben von Code beginnt. Überprüfe den Plan und schlage Änderungen vor, bevor Devin mit der Umsetzung startet.
      * **`/test`** — Weise Devin an, alle Tests auszuführen und seine Arbeit zu überprüfen. Verwende diesen Befehl nach jedem größeren Meilenstein, um Probleme frühzeitig zu erkennen.
      * **`/review`** — Bitte Devin, seinen eigenen Code auf Bugs, Edge Cases und Stilprobleme zu überprüfen, bevor der PR (Pull Request) eröffnet wird.

      Diese Befehle kannst du jederzeit während der Session verwenden — nutze `/plan` am Anfang, `/test`, nachdem jede Funktionalität fertiggestellt ist, und `/review` vor dem finalen PR.
    </Step>

    <Step title="Devin erstellt es und prüft, ob es funktioniert">
      Devin behandelt interne Tools wie jedes andere Feature in der Produktion – es schreibt den Code, fügt Tests hinzu und öffnet dann die App in seinem integrierten Browser, um zu überprüfen, dass das UI End-to-End funktioniert.

      1. **Untersucht eure Codebase** — Findet eure `DataTable`- und `Calendar`-Komponenten, liest euer Prisma-Schema und analysiert das bestehende `/internal/`-Seitenlayout
      2. **Erstellt die Datenbankmigration** — Fügt `pto_requests`- und `pto_balances`-Tabellen mit Prisma hinzu
      3. **Baut die Seiten** — Formular zur Antragseinreichung, Warteschlange für Manager-Genehmigungen, Kalenderansicht und Guthaben-Dashboard unter `/internal/pto`
      4. **Integriert Slack** — Sendet Webhook-Benachrichtigungen, wenn Anträge eingereicht werden und wenn sie genehmigt oder abgelehnt werden
      5. **Schreibt Tests** — Unit-Tests für PTO-Guthabenberechnungen und Erkennung von Datumsüberschneidungen, API-Tests für die Request-Endpunkte, Integrationstests für den Genehmigungs-Workflow
      6. **Öffnet die App in seinem Browser** — Navigiert zu jeder Seite, reicht einen PTO-Testantrag ein, genehmigt ihn in der Manager-Ansicht, verifiziert die Aktualisierung des Kalenders, prüft die Dashboard-Zahlen und testet Randfälle wie sich überschneidende Zeiträume und überschrittene Guthaben
      7. **Öffnet einen PR (Pull Request)** — Liefert alles: Migration, Seed-Skript, Anwendungscode, Tests und einen README-Abschnitt, der erklärt, wie das Tool zu verwenden ist

      Die Browser-Verifizierung fängt Probleme ab, die automatisierte Tests übersehen – kaputte Formular-Layouts, ein Kalender, der zwar gerendert wird, aber nicht auf Klicks reagiert, oder ein Submit-Button, der das Formular nach erfolgreicher Übermittlung nicht leert.
    </Step>

    <Step title="Erweitern Sie Ihr Tool">
      Sobald das Basistool funktioniert, füge in Folgesitzungen weitere Funktionen hinzu:

      <PromptBlock>
        ```txt PTO-Konflikterkennung hinzufügen theme={null}
        Wenn ein*e Mitarbeiter*in einen Antrag auf bezahlten Urlaub (PTO) stellt,
        prüfe, ob jemand anderes aus dem Team im gleichen Zeitraum bereits abwesend ist.
        Zeige eine Warnung in der UI an:
        „2 andere Personen in deinem Team sind vom 20.–22. Nov abwesend.“
        Blockiere den Antrag nicht, sondern mache die Überschneidung nur sichtbar,
        damit Manager entsprechend planen können.
        ```
      </PromptBlock>

      <PromptBlock>
        ```txt CSV-Export für HR erstellen theme={null}
        Füge dem PTO-Dashboard eine Schaltfläche hinzu, die alle genehmigten
        Abwesenheiten für das aktuelle Quartal als CSV exportiert.
        Spalten: Name der Mitarbeiterin / des Mitarbeiters, Daten, Art,
        genutzte Tage, verbleibendes Guthaben. Die Personalabteilung (HR)
        lädt diese Datei monatlich für die Gehaltsabrechnung herunter.
        ```
      </PromptBlock>
    </Step>

    <Step title="Überprüfen Sie den PR mithilfe von Devin Review">
      Sobald Devin den PR eröffnet hat, verwenden Sie [Devin Review](https://app.devin.ai/review?utm_source=docs\&utm_medium=use-case-gallery), um die Änderungen zu überprüfen. Devin Review hat den vollständigen Kontext Ihrer Codebasis und kann Bugs, Sicherheitsprobleme und Stilinkonsistenzen im gesamten Diff erkennen.
    </Step>
  </Steps>
</div>
