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

# Appraisal Cycles

> An appraisal cycle is one round of performance reviews — "who is being appraised, against what, and over which period".

An appraisal cycle is one round of performance reviews — "who is being appraised, against what, and over which period". It is the container that pulls a set of employees together, attaches an appraisal template to each of them, generates their individual appraisals, and tracks the round through to completion. Think of it as the project plan for a quarterly or annual review; the individual scoring happens on the appraisals it spawns.

This page covers creating a cycle, fetching the employees who belong in it, generating their appraisals, and moving the whole round from *Not Started* through to *Completed*.

**You'll find this at:** `/hr/performance/cycles` (the list) and `/hr/performance/cycles/:id` (a single cycle).

> Hitaji 360 is **multi-business**: appraisal cycles, their employees, templates, and appraisals are isolated per business. Cycle names must be unique *within a business*, not across all of them. Before you create or change a cycle, confirm the correct business is selected in the switcher at the top of the app — a cycle created in the wrong business pulls in the wrong employees.

> 📷 *Screenshot: Appraisal Cycles list with the status filter and the "New Cycle" button — to be added.*

***

## The cycle lifecycle (statuses)

Every cycle carries a **status** that controls what you can do with it.

| Status          | Meaning                          | What you can do                                                                                                                             |
| --------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| **Not Started** | Just created; nothing is locked. | Edit every field, fetch employees, assign/remove appraisees and their templates, start the cycle, delete it.                                |
| **In Progress** | Employees are being appraised.   | Create appraisals, complete the cycle. The configuration form becomes read-only and the appraisee list can no longer be edited (see below). |
| **Completed**   | The round is closed.             | Nothing further — a completed cycle can no longer be edited, and you cannot add appraisees or create appraisals on it.                      |

Two things to keep in mind:

* **Fetching employees implicitly moves a *Not Started* cycle to *In Progress*.** If you pull eligible employees into a fresh cycle, the system starts it for you automatically (you don't need to press *Start* first).
* **Editing locks up once the cycle starts.** On the detail page, the **Configuration** tab and the appraisee actions (template combobox, remove button) are only active while the status is *Not Started*. Once the cycle is *In Progress* the configuration is shown as a read-only summary.

***

## Creating a cycle

From the Appraisal Cycles list choose **New Cycle**.

> 📷 *Screenshot: New Appraisal Cycle modal — to be added.*

| Field                                          | Required | Notes                                                                                                                                                                                                          |
| ---------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Cycle name**                                 | Yes      | Must be unique within the current business; the system rejects a duplicate name.                                                                                                                               |
| **Start date**                                 | Yes      | The first day of the review period.                                                                                                                                                                            |
| **End date**                                   | Yes      | **Cannot be earlier than the start date** — the form rejects it.                                                                                                                                               |
| **Description**                                | No       | Free-text notes about the round.                                                                                                                                                                               |
| **Evaluation method**                          | No       | How each appraisal's goal score is derived — **Automated (goal progress)** averages linked goal progress per KRA, or **Manual rating** lets the reviewer score each KRA row directly. Defaults to *Automated*. |
| **Calculate final score using custom formula** | No       | A toggle. When on, you can supply a custom **Final score formula** (e.g. `(goalScore * 0.6) + (selfScore * 0.2) + (feedbackScore * 0.2)`) that is applied to every appraisal in the cycle.                     |
| **Org unit (department)**                      | No       | Restricts which employees the cycle pulls in when you fetch employees. *(Set via the API / not currently exposed on the create modal — see Current state below.)*                                              |
| **Designation (job title)**                    | No       | Further restricts eligible employees to a job title. *(As above.)*                                                                                                                                             |

A cycle is created as **Not Started**. If your business uses a naming series, the cycle is also stamped with a generated identifier (e.g. `HR-APC-2026-0001`) alongside the name you typed.

> ⚠️ **Current state:** The **org unit** and **designation** scope filters exist on the cycle (they control who *Fetch employees* pulls in) but the create/edit modal does **not** currently expose them — the form collects name, dates, description, evaluation method, and the formula toggle only. Until the UI adds these fields, a cycle created from the screen pulls **all** eligible employees in the business when you fetch them. (Flagged for the team.)

***

## Editing a cycle

Open a cycle and use the **Configuration** tab.

* A **Not Started** cycle can be edited freely — change the name, dates, description, evaluation method, or formula and **Save Changes**.
* Once the cycle is **In Progress** or **Completed** the configuration is shown read-only; the system rejects edits to a completed cycle outright.
* **The evaluation method is locked once any appraisals have been created.** Even on a still-editable cycle, you cannot switch between *Automated* and *Manual rating* after appraisals exist — change it before you generate them.

***

## Working with appraisees (the Appraisees tab)

The **Appraisees** tab is where you decide which employees this cycle covers and which template each will be appraised against. These actions are only available while the cycle is **Not Started**.

> 📷 *Screenshot: Appraisees tab with the "Fetch Employees" control and the per-row template picker — to be added.*

### Fetch employees

Choose **Fetch Employees** to pull every eligible employee into the cycle as an **appraisee**. Eligibility is determined by the cycle's org-unit / designation scope (so, today, typically all employees in the business — see *Current state* above).

Each fetched employee is assigned a template using this order of preference:

1. the **default template** you picked in the *Default template (optional)* box before fetching, otherwise
2. the **employee's designation default** template, otherwise
3. **no template** (you'll need to assign one before appraisals can be created for them).

Fetching is **additive and safe to repeat** — employees already on the cycle are skipped, so re-fetching only adds anyone newly eligible. Remember, fetching on a *Not Started* cycle also **starts** it.

### Assign or change a template per appraisee

Each appraisee row has a **Template** picker. Assign or swap the template for one person directly there. An appraisee with no template will be skipped when you create appraisals (and counted as *missing template*).

### Remove an appraisee

Use the remove (bin) action on a row to take someone out of the cycle before appraisals are generated.

***

## Creating appraisals

Once your appraisees have templates, choose **Create Appraisals**. This generates **one appraisal per appraisee that has a template** and is **idempotent** — re-running it skips anyone who already has an appraisal, so it's safe to press again after fixing missing templates.

The result is reported back to you as counts:

| Count               | Meaning                                                       |
| ------------------- | ------------------------------------------------------------- |
| **created**         | New appraisals generated.                                     |
| **skipped**         | Appraisees who already had an appraisal (idempotent skip).    |
| **missingTemplate** | Appraisees with no template assigned — assign one and re-run. |
| **errors**          | Appraisees whose appraisal failed unexpectedly.               |

**Large cohorts run in the background.** Above **30 appraisees** the work is queued rather than run on the spot — the screen confirms "creating … in the background" and the **Appraisals created** figure on the summary cards climbs as the queue works through them. Refresh the summary to watch progress.

> You must fetch employees first. Creating appraisals on a cycle with no appraisees is refused with *"No appraisees on this cycle. Fetch employees first."*

***

## The summary cards

The top of the cycle detail page shows four KPI cards, fed live from the cycle summary:

| Card                        | What it counts                                            |
| --------------------------- | --------------------------------------------------------- |
| **Total Appraisees**        | Employees enrolled in the cycle.                          |
| **Pending Self-Appraisals** | Appraisals still awaiting the employee's self-submission. |
| **Missing Goals**           | Appraisees with no goals linked yet.                      |
| **Missing Feedback**        | Appraisees who have received no 360° feedback.            |

(The summary also tracks *appraisals created* and *appraisals submitted*, which is what the background-creation progress and the completion guard below rely on.)

***

## Starting and completing a cycle

* **Start Cycle** (shown on a *Not Started* cycle) moves it to *In Progress*. If you fetched employees first, the cycle is already started and this button won't appear.
* **Complete Cycle** (shown on an *In Progress* cycle) closes the round. A confirmation dialog reminds you that employees with unsubmitted appraisals may be left out of final scores.

Completion is **guarded**. The system refuses to complete a cycle unless:

1. it has **at least one appraisal**, and
2. **every appraisal has been submitted** — if any are still in draft/unsubmitted, completion is refused with a message naming how many remain (e.g. *"Cannot complete the cycle — 3 appraisal(s) are not yet submitted."*).

Once completed, the cycle is read-only.

***

## Deleting a cycle

A cycle **with no appraisals** can be deleted (it is soft-deleted, so it disappears from the list). A cycle that **has appraisals cannot be deleted** — the system refuses with *"Cannot delete a cycle that has appraisals. Cancel the appraisals first."* Delete or cancel the appraisals first, then delete the cycle.

> ⚠️ **Current state — the old "stuck cycle" deadlock (now fixed):** A cycle used to be able to get permanently stuck. A *Submitted* appraisal that had **issued no reward** could not be deleted; because the cycle in turn refused to delete while it had any appraisals, the whole cycle became a dead end. **This is fixed:** a submitted appraisal that carries **no issued reward** can now be purged, which clears the deadlock. In plain terms — if a cycle ever looks stuck because of old submitted appraisals that never produced a reward, those appraisals can now be deleted, freeing the cycle for deletion. (See [Appraisals](/hr/user/performance/appraisals) and [Appraisal rewards](/hr/user/performance/rewards).)

***

## Permissions

Actions on cycles are gated by these permission slugs (your role may have some and not others). Everything is tenant- and business-scoped; requests outside your current business fail closed.

| Action                                                                                             | Permission               |
| -------------------------------------------------------------------------------------------------- | ------------------------ |
| View list / a cycle / its summary / its appraisees                                                 | `hr-performance:read`    |
| Create, edit, fetch employees, assign/remove appraisee templates, create appraisals, start, delete | `hr-performance:config`  |
| Complete a cycle                                                                                   | `hr-performance:approve` |

***

## Behind the scenes

A cycle is stored against your **tenant and business**; reads, updates, fetch-employees, appraisal creation, and deletes are all re-checked against the business in your `X-Business-Id` context, so a cycle from another business can never be read or mutated by spoofing an ID.

When you **fetch employees**, the system resolves the cycle's org-unit / designation scope to a list of eligible employees, skips anyone already enrolled, and inserts the rest as appraisees — snapshotting each person's name, department, and designation onto the appraisee row for fast list rendering. When you **create appraisals**, it loops over those appraisees and asks the appraisal service to build one appraisal each from the assigned template; small batches run immediately and large ones (over 30) are handed to a background queue. The **complete** guard reads the same summary counts the cards show, so the numbers you see are exactly what the guard checks.

***

## Related

* [Performance overview](/hr/user/performance/overview)
* [Appraisal templates](/hr/user/performance/appraisal-templates) — the template each appraisee is scored against
* [Appraisals](/hr/user/performance/appraisals) — the individual reviews a cycle generates
* [Goals](/hr/user/performance/goals) — feed the automated goal-progress score
* [360° feedback](/hr/user/performance/feedback) — the feedback tracked per appraisee
* [Appraisal reports](/hr/user/performance/reports)
