> ## 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.

# Crea uno strumento di monitoraggio ferie del team

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="Crea un tracker PTO per il team" description="Descrivi il tuo strumento e Devin lo crea, testa e verifica end-to-end." prompt="Crea un tracker PTO interno per il nostro team in /internal/pto. I dipendenti inviano richieste di ferie con un intervallo di date, un tipo (vacanza, malattia, personale) e una nota facoltativa. I manager vedono una coda di richieste in sospeso e le approvano o rifiutano. La vista calendario mostra chi è assente, con colori diversi in base al tipo. La dashboard mostra il saldo PTO di ogni dipendente (20 giorni/anno). I dipendenti non possono superare il proprio saldo o sovrapporsi a PTO esistenti. Avvisa se dei colleghi sono già assenti. Notifiche Slack all'invio e all'approvazione/rifiuto tramite SLACK_WEBHOOK_URL. Usa la nostra app Next.js, Prisma ORM e i componenti DataTable e Calendar esistenti. Prima di scrivere codice, definisci il tuo piano per la revisione. Scrivi test per i calcoli dei saldi, il rilevamento delle sovrapposizioni e il flusso di approvazione. Verifica ogni pagina e flusso nel browser: invia, approva, rifiuta, controlla il calendario, verifica la dashboard. Non aprire una PR (pull request) finché tutto non funziona end-to-end." category="Sviluppo funzionalità" features="" />

<div className="uc-detail-wrapper">
  <Tip>Non vuoi configurarlo manualmente? Incolla un collegamento a questa pagina in una sessione di Devin e chiedigli di configurare tutto per te.</Tip>

  <Steps>
    <Step title="(Facoltativo) Delimita l'ambito della codebase con Ask Devin">
      Se nella tua app utilizzi già strumenti interni, usa [Ask Devin](https://app.devin.ai/search?utm_source=docs\&utm_medium=use-case-gallery) per capire i pattern esistenti prima di scrivere la tua specifica. Questo è particolarmente utile se vuoi che il nuovo strumento rispecchi l'architettura di ciò che è già presente:

      <PromptBlock agent="ada">
        ```txt Scope internal tools architecture theme={null}
        Mostrami come sono strutturati i nostri strumenti interni esistenti:
        1. Quali pagine esistono sotto /internal/ e come sono organizzate?
        2. In che modo le pagine interne gestiscono l'autenticazione e il controllo degli accessi basato sui ruoli?
        3. Quali componenti UI condivisi utilizzano (tabelle, form, modali)?
        4. Come sono strutturate le migrazioni del database nel nostro schema Prisma?
        5. Esistono già schemi di notifica (Slack, email)?
        ```
      </PromptBlock>

      Usa le risposte per completare la tua specifica con riferimenti a file specifici, nomi di componenti e pattern, così che Devin crei qualcosa di coerente con i tuoi strumenti interni esistenti. Puoi anche avviare direttamente una sessione di Devin da Ask Devin, e verrà riportato tutto ciò che ha appreso come contesto.
    </Step>

    <Step title="Scrivi una specifica dettagliata">
      Gli strumenti interni — PTO tracker, pannelli di amministrazione, script per i dati, utility da CLI — sono essenziali ma ricevono raramente la priorità che meritano. Sono ideali per Devin perché i requisiti sono ben definiti, gli utenti sono le persone del tuo team e il fatto che “funzioni correttamente” conta più di un design perfetto al pixel.

      Sii specifico su cosa fa lo strumento, quali dati memorizza e a quali servizi si collega. Più dettagli includi, più la prima versione sarà vicina a ciò di cui hai bisogno.

      <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>

      Puoi anche iterare sulla tua specifica usando Ask Devin: incolla una bozza e chiedi a Devin di identificare eventuali lacune o suggerire miglioramenti in base alla tua codebase.
    </Step>

    <Step title="Aggiungi credenziali">
      Passa tutte le API key e i token di cui Devin ha bisogno tramite [Secrets](/it/product-guides/secrets) — in questo caso, l'URL del webhook di Slack.

      L'approccio più semplice è memorizzarli come segreti dell'organizzazione prima di avviare la sessione:

      1. Vai su **Settings > Secrets** e aggiungi `SLACK_WEBHOOK_URL`
      2. Devin accede ai segreti come variabili d'ambiente, quindi non finiscono mai hardcoded nel tuo codice sorgente.

      <Note>I segreti dell'organizzazione devono essere aggiunti **prima** di avviare la sessione — vengono iniettati all'avvio della sessione. In alternativa, puoi fornire i segreti durante la sessione usando la chat e Devin ti chiederà in modo proattivo le credenziali di cui ha bisogno quando rileva variabili d'ambiente mancanti.</Note>
    </Step>

    <Step title="Gestisci la sessione tramite comandi slash">
      Una volta avviata la sessione, puoi usare i comandi slash per guidare il flusso di lavoro di Devin:

      * **`/plan`** — Chiedi a Devin di creare un piano di implementazione dettagliato prima di scrivere qualsiasi codice. Esamina il piano e suggerisci modifiche prima che inizi a implementare.
      * **`/test`** — Chiedi a Devin di eseguire tutti i test e verificare il suo lavoro. Usalo dopo ogni traguardo importante per individuare i problemi in anticipo.
      * **`/review`** — Chiedi a Devin di rivedere il proprio codice per bug, casi limite e problemi di stile prima di aprire la pull request (PR).

      Questi comandi funzionano in qualsiasi momento durante la sessione: usa `/plan` all'inizio, `/test` dopo che ogni funzionalità è stata implementata e `/review` prima della PR finale.
    </Step>

    <Step title="Devin lo sviluppa e verifica che funzioni">
      Devin tratta gli strumenti interni come qualsiasi funzionalità di produzione — scrive il codice, aggiunge i test e poi apre l'app nel suo browser integrato per verificare che l'interfaccia utente funzioni end-to-end.

      1. **Esamina la tua codebase** — Trova i componenti `DataTable` e `Calendar`, legge il tuo schema Prisma e studia il layout esistente della pagina `/internal/`
      2. **Crea la migrazione del database** — Aggiunge le tabelle `pto_requests` e `pto_balances` tramite Prisma
      3. **Costruisce le pagine** — Modulo per l'invio delle richieste, coda di approvazione per i manager, vista calendario e dashboard dei saldi sotto `/internal/pto`
      4. **Integra Slack** — Invia notifiche webhook quando le richieste vengono inviate e quando vengono approvate o rifiutate
      5. **Scrive i test** — Test unitari per i calcoli dei saldi PTO e il rilevamento delle sovrapposizioni di date, test API per gli endpoint delle richieste, test di integrazione per il flusso di approvazione
      6. **Apre l'app nel suo browser** — Naviga in ogni pagina, invia una richiesta PTO di test, la approva dalla vista del manager, verifica che il calendario si aggiorni, controlla i numeri nella dashboard e testa casi limite come date sovrapposte e saldi superati
      7. **Apre una PR** — Consegna tutto: migrazione, script di seed, codice dell'applicazione, test e una sezione del README che spiega come usare lo strumento

      La verifica nel browser intercetta problemi che i test automatizzati non rilevano — layout dei moduli non corretti, un calendario che viene visualizzato ma non risponde ai clic, o un pulsante di invio che non svuota il modulo dopo l'invio riuscito.
    </Step>

    <Step title="Estendi il tuo tool">
      Una volta che il tool di base funziona, aggiungi funzionalità nelle sessioni successive:

      <PromptBlock>
        ```txt Add PTO conflict detection theme={null}
        Quando un dipendente invia una richiesta di PTO, verifica se qualcun altro del suo
        team è già assente nelle stesse date. Mostra un avviso nella UI:
        "Altri 2 membri del tuo team sono assenti dal 20 al 22 novembre." Non bloccare la richiesta,
        limita­ti a segnalare la sovrapposizione così che i manager possano pianificare.
        ```
      </PromptBlock>

      <PromptBlock>
        ```txt Build a CSV export for HR theme={null}
        Aggiungi un pulsante nella dashboard PTO che esporti tutti i periodi di assenza approvati
        del trimestre corrente come CSV. Colonne: nome del dipendente, date, tipo,
        giorni utilizzati, saldo residuo. HR lo scarica ogni mese per le buste paga.
        ```
      </PromptBlock>
    </Step>

    <Step title="Rivedi la PR con Devin Review">
      Quando Devin apre la PR, utilizza [Devin Review](https://app.devin.ai/review?utm_source=docs\&utm_medium=use-case-gallery) per esaminare le modifiche. Devin Review ha il contesto completo della tua codebase e può individuare bug, problemi di sicurezza e incoerenze di stile in tutto il diff.
    </Step>
  </Steps>
</div>
