# Welcome to Hesh documentation

Welcome to the official documentation for Hesh, your comprehensive solution for streamlining and optimising production workflows. This website is your one-stop resource for understanding how to use Hesh effectively and unlock its full potential.

### **Why Use This Documentation?**

Whether you're a:

* **Business Owner** looking to implement Hesh in your company and set up the system yourself.
* **Business Analyst** tasked with implementing changes in your company's production processes.
* **Current Hesh User** (manager or performer) seeking specific guidelines or a deeper understanding of how the system works.
* **Integrator or Affiliate Partner** needing to learn how to implement Hesh onboarding for your clients.

This documentation is designed to provide you with the information you need to:

* **Get Started with Hesh:** Learn about system requirements, installation, initial setup, and account configuration.
* **Master Hesh Features:** Discover how to manage products, plan and execute production workflows, track performance, and collaborate with your team.
* **Explore Advanced Functionality:** Uncover Hesh's advanced features, such as automation, reporting, and analytics.
* **Become a Hesh Expert:** Gain a deep understanding of Hesh's capabilities and best practices for maximizing its benefits.

### **Navigating the Documentation:**

This documentation is organised into clear sections and articles, making it easy to find the information you need. Use the sidebar menu to browse through the various topics, or use the search bar to quickly find specific keywords or concepts.

## How to find this **documentation in Hesh?**

Open the web application and click on the user profile in the header. In the drop-down menu, there will be a help center button that opens public documentation in a new browser tab.

<figure><img src="/files/hmbj1LI8s5zPbQ5k7gzv" alt=""><figcaption></figcaption></figure>

**Let's get started!** Explore the documentation and discover how Hesh can revolutionise your production processes.


# What is Hesh?

Hesh is a comprehensive solution designed to streamline and optimise production workflows for manufacturers and businesses of all sizes. It empowers teams to manage their production processes efficiently, improve communication, and gain valuable insights into their operations. System consists of Web and Mobile Application. The web application provides a central hub for managing production workflows, while the mobile application empowers performers and managers to manage their tasks on the go.

<figure><img src="/files/tZXLE1pGf1u4rve4rJZa" alt=""><figcaption></figcaption></figure>

Hesh is designed to fit the needs of various stakeholders, from business owners to manufacturing managers and performers. Business owners can leverage Hesh to gain a clear overview of production processes, track key performance indicators, and make informed decisions about resource allocation. Manufacturing managers can use Hesh to plan and execute production workflows, monitor progress, and identify potential bottlenecks. Performers can use Hesh to access their assigned tasks, track their progress, and communicate effectively with their team.

## Video overview

Got 2 minutes? Check out a video overview of our product:

{% embed url="<https://www.youtube.com/watch?v=AAkMLojmjS8>" %}


# Key Features

## **Production Planning and Execution**

Visual workflow canvas allows you to create and manage production workflows for your products. You can define tasks, assign responsibilities, set time limits, and track progress in real-time. The system supports both manual and automated task assignments, helping you optimise resource allocation and ensure timely production.

![](/files/WTXQz54GtYV31bUTgrQb)

## Task Management and Automated Payroll Accounting

Hesh simplifies task management within production workflows. You can create task templates to define the details, responsibilities, time limits, and rewards for recurring tasks. These templates can be reused across multiple productions, saving time and ensuring consistency. Hesh also streamlines payroll accounting by automatically calculating performer rewards based on their time spent on tasks, bonuses, and any adjustments made. This automation eliminates manual calculations and ensures accurate and timely payment for your team.

![](/files/2GEZsEOrzJGFWdeJ1h7o)

## Mobile Application

Hesh offers a dedicated mobile application that empowers performers to manage their tasks on the go. The app allows performers to view their assigned tasks, track their progress, start and pause timers, and receive notifications. It also provides performers with salary reports and access to technical documentation. The mobile app is designed to be user-friendly and intuitive, ensuring that performers can stay connected to their work, even when they're away from their desks.

<figure><img src="/files/2Ts90qki3agQEqpmdLvb" alt=""><figcaption></figcaption></figure>

## Product Management

Hesh empowers you with a robust product catalog that goes beyond simple product management. It supports Product Life Cycle Management (PLM) through versioning and drafts, allowing you to track product changes and manage multiple iterations. You can easily add, edit, delete, and organise your products, ensuring your product data is accurate and up-to-date. Hesh also facilitates the creation and management of product technical documentation and bill of operations, providing a central repository for all essential product information. This comprehensive approach ensures that your team has access to the most current and relevant product details, streamlining production and reducing errors.

<figure><img src="/files/mAC6iNH3NzpPxaH6vWP5" alt=""><figcaption></figcaption></figure>


# Before start

Every manufacturing company has its own unique way of running its production process. Different companies utilize various CRM, ERP, and MRP systems, and each has its own distinct organisational structure with unique skill sets. This makes preparation an absolutely crucial phase before implementing Hesh. While Hesh can revolutionise your production processes, it's important to assess your company's readiness to ensure a smooth and successful transition.

### **Tips:**

* **Team Buy-in:** Successful implementation requires strong team buy-in. We suggest you communicate clearly with all stakeholders the benefits they will get after Hesh implementation.
* **Responsible Person:** Designate a single responsible person for managing the Hesh implementation. This person will be your primary point of contact with Hesh support and Customer Success Manager. Consider providing additional motivation to this individual to ensure their commitment to the process.
* **Employees Loyalty:** To foster employee buy-in, ask your Customer Success Manager to provide additional materials to present the Hesh solution to your employees and help them understand its benefits.
* **Consider Expertise:** Consider utilizing Hesh affiliate partners or integrators to assist with the implementation process. Alternatively, hiring a business analyst can help manage a smooth transition.
* **Prepare Thoroughly:** Run through the guidelines related to preparation in this documentation. They will teach you how to prepare a bill of operations for all your products and how to design your organisational structure for seamless integration with Hesh.


# Product management

Product management in Hesh is the foundation for creating and managing your product data, ensuring that your team has access to the most current and accurate information. Hesh's product management features are designed to streamline your product development processes, improve communication, and provide a central repository for all essential product details.

**Hesh's product management system empowers you to:**

* **Create and Manage a Product Catalog:** Build a comprehensive catalog of your products, including details like product names, types, vendors, categories, and tags.
* **Define Product Configurations:** Create configurations for your products, specifying different combinations of options and parameters that define specific product variations.
* **Add Technical Documentation:** Store and manage technical documentation, such as product specifications, bill of materials, and manufacturing instructions, directly within Hesh. This ensures that your team has easy access to all essential product information.
* **Upload and Manage Photos and Files:** Add photos and files to your products, including technical drawings, product images, and videos. This visual representation helps your team understand the product details and facilitates better communication.
* **Manage Product Versions:** Hesh supports versioning, allowing you to track changes and manage multiple iterations of your products. This enables you to create drafts, publish new versions, and maintain a history of product updates.

**Benefits of Hesh's Product Management:**

* **Centralised Product Information:** Hesh provides a single source of truth for all product data, ensuring consistency and reducing errors.
* **Product Life Cycle Management (PLM):** Track product changes and manage multiple iterations through versioning and drafts.
* **Streamlined Production Planning:** Define clear product configurations and workflows, enabling efficient production planning.
* **Improved Communication:** Share product information and documentation seamlessly with your team.

**Next Steps:**

This introduction provides a high-level overview of product management in Hesh. To learn more, explore the following articles:

* [**Managing Products**](/manuals/product-management/managing-products-and-catalogs)**:** Learn how to create new products, delete, move products, and add categories.
* **Product Configurations:** Discover how to define product configurations and manage options and parameters.
* **Adding Technical Documentation:** Learn how to upload and manage technical documentation for your products.
* **Managing Photos and Files:** Explore Hesh's features for adding and managing product photos and files.
* **Product Versions and Publishing:** Understand how to create and manage product versions, including drafts and publishing.


# Managing products and catalogs

## Overview

Products may be organised in folders, we call them categories. You may choose any kind of structure you need, name folders by product types, collection names, authors, etc. Products can be easily moved from category to category without any affect on the current manufacturing process. You may create any kind of deep nesting structure of folders.

<figure><img src="/files/otnvcF9YXESl1QD3jj3L" alt=""><figcaption><p>Different ways to organise your products</p></figcaption></figure>

## Basics

To navigate to the "Products" page, **click on the "Products" button** on the sidebar menu of the application.

{% hint style="danger" %}
If you don't see "Products" page, you don't have the permission.
{% endhint %}

### Adding product

1. Click on the "Add Product" button
2. Enter product name&#x20;
3. Click on the :heavy\_check\_mark: button

{% hint style="warning" %}
New product is created in **draft** mode. It means that this product is not accessible in production yet and needs to be published. See [Publishing and versioning](/manuals/product-management/publishing-and-versioning)
{% endhint %}

<div align="left" data-full-width="false"><figure><img src="/files/gjzLWkbNsBZyjlGVKlJG" alt=""><figcaption><p>Adding product</p></figcaption></figure></div>

### **Adding category**

1. Click on the "New Category" button
2. Enter category name
3. Click on the :heavy\_check\_mark: button

<figure><img src="/files/atk1dNCp9zdliMaCSBxf" alt=""><figcaption><p>Adding category</p></figcaption></figure>

### Navigation

Easily **navigate through folders by clicking on them**. Navigation structure (breadcrumbs) present at the top of the page. Use it by pressing on the needed folder or move backward via "back" button.

<figure><img src="/files/7IoASjRU1nL2p2PnBipw" alt=""><figcaption><p>Use breadcrumbs for navigation</p></figcaption></figure>

### Renaming product and categories

1. Click on the "Rename" action button
2. Enter new name
3. Click on the :heavy\_check\_mark: button

<figure><img src="/files/sK7tPyvIMcdu0OaP9scK" alt=""><figcaption><p>Renaming product</p></figcaption></figure>

### Moving product and categories

1. Click on the  "Move to" button in more actions menu of the product.
2. Select a category.&#x20;
3. &#x20;Click on the "Move to" button&#x20;

<figure><img src="/files/cYqT2HK6hw5WMLJI37dC" alt=""><figcaption><p>Moving product to another category</p></figcaption></figure>

M**ove folder into another folder** by clicking on the "Move to" button in the "More actions" menu of the category you want to move.

<figure><img src="/files/NLhIeXpfnuFpNLZUoTAp" alt=""><figcaption><p>Moving category to another category</p></figcaption></figure>

M**ove multiple products and categories** into another folder **at once** by clicking on "Select" button and after selecting items, click on the "Move to" button on the top panel.

<figure><img src="/files/Of8pD5hA6KCh2uCJ4K3v" alt=""><figcaption><p>Moving multiple products to category</p></figcaption></figure>

{% hint style="info" %}
**To make it easier to navigate when moving a category, the system now shows the full path under each category name.**\
This helps you distinguish between subcategories with the same name that are located in different parent categories.

<p align="center"><img src="/files/Jmfb4iYjz1mQXZD5xMJ4" alt=""></p>
{% endhint %}

### Duplicating product

To duplicate product, click on the **"Duplicate" button** in the "More actions" menu of the product you want to duplicate.

<figure><img src="/files/tGpyeoaA7bArcyOxWDR5" alt=""><figcaption><p>"Duplicate" button</p></figcaption></figure>

After clicking on the "Duplicate" button, the duplicated product will appear at the top of the product list with "copy" badge at the end of the product name, in the **draft mode**.

<figure><img src="/files/jU68jS7CmOYPjoOJkYHL" alt=""><figcaption><p>Duplicated product</p></figcaption></figure>

### Deactivating Products

* To prevent specific product from launching into production you can deactivate it.&#x20;

To **deactivate product,** click on the **"Deactivate" button** in the "More actions" menu of the product you want to deactivate.

<figure><img src="/files/mrB28eJpRYhRpHo5Oaks" alt=""><figcaption><p>Deactivating product</p></figcaption></figure>

### Deleting products and categories

To delete product  or category, click on **"Delete" button** in the "More actions" menu of the item you want to delete.&#x20;

{% hint style="warning" %}
Note that you can not delete products that have been produced or that are used as components in other products.
{% endhint %}

<figure><img src="/files/EuPpg8uSuCPNsUxNkTV4" alt=""><figcaption><p>Deleting product</p></figcaption></figure>

### Move to another category

You can move products to categories (folders) from Product search page as well.&#x20;

1. Click on "Select" button at the top panel.
2. Tick checkboxes near products you want to move.
3. Click on "Move to" butto
4. Select the category (folder) you want products move to
5. Click on the "Move to" button

<figure><img src="/files/4PaFqH59UE4PaRniohGu" alt=""><figcaption><p>Movng products from Product search page</p></figcaption></figure>

## Additional features

### Product tags

Add tags to products to manage product catalog easily.&#x20;

<figure><img src="/files/lY2rNg9rnfGs89WLqXPb" alt=""><figcaption><p>Ways to callout the "Manage tags" pop-up</p></figcaption></figure>

### Adding tag

1. Click on "Manage tag" button in the "More Actions" menu or
2. Click on the "Products tag" icon on the product (if product already has tags)
3. Enter the tag's name into the input field
4. Click on the tag&#x20;
5. Click on the "Save" button.

{% @arcade/embed flowId="ERZvNjTznfEc4VRPzibj" url="<https://app.arcade.software/share/ERZvNjTznfEc4VRPzibj>" %}

### <mark style="color:red;">\*</mark>To add a tag that already exists in the system:&#x20;

1. Start entering the tag's name in the input field
2. Selects suitable option from the list
3. Click on the tag
4. Click on the "Save" button

{% @arcade/embed flowId="AAk0ZEyjLRRwcB6GN7s6" url="<https://app.arcade.software/share/AAk0ZEyjLRRwcB6GN7s6>" %}

### Deleting tag

1. Click on the :heavy\_multiplication\_x: button&#x20;
2. Click on "Save" button

{% hint style="info" %}
You can delete multiple tags at once
{% endhint %}

{% @arcade/embed flowId="cI3rCJMn2moIIcU1LbqW" url="<https://app.arcade.software/share/cI3rCJMn2moIIcU1LbqW>" %}

### Quick search

To search products or categories, use the search filed on the All products page.&#x20;

<figure><img src="/files/nnCWcwi4EYCcC8zM6LON" alt=""><figcaption><p>Searching on the All products page</p></figcaption></figure>

Clicking on the **"product name"** will open the product in detailed view.

<figure><img src="/files/Q4B5m1UN5D5B5r1msnph" alt=""><figcaption><p>Clicking on the "product name" </p></figcaption></figure>

Clicking on the **"category name"** will open the category in detailed view.

<figure><img src="/files/Ai1BUgibEyCm2Dp0pzE8" alt=""><figcaption><p>Clicking on the "category name" </p></figcaption></figure>

Clicking on the **"Search" button** will redirect to the Product search page. See [Searching products](/manuals/product-management/searching-products)&#x20;

<figure><img src="/files/99MJvytPvTsxn7iGM9ij" alt=""><figcaption><p>Clicking on the "Search" button</p></figcaption></figure>

***

For more information on specific product management features, refer to the related articles listed below:

* **Product Versions and Publishing:** Learn about creating and managing product versions.
* **Product Configurations:** Discover how to define product configurations and manage options and parameters.
* **Adding Technical Documentation:** Learn how to upload and manage technical documentation for your products.
* **Managing Photos and Files:** Explore Hesh's features for adding and managing product photos and files.


# Searching products

## Overview

While [Products page](/manuals/product-management/managing-products-and-catalogs) gives you tree structure of folders (categories), **Product Search** provides a single list of all products or components, allowing you to quickly find the items you need in your catalog.

By reading this article, you will learn how to effectively use product search in your catalog with a rich range of available filters and how to optimize the product management process with the help of the **Product Search page.**

## Basics

To get to the "Product search" page, **click on the "Product search" button** on the sidebar menu of the application.&#x20;

{% hint style="warning" %}
If you don't see "Product search" page, perhaps you don't have permissions
{% endhint %}

<figure><img src="/files/zP5Qx7z95kzmKH9A1kDn" alt=""><figcaption><p>How to navigate to the Product search page</p></figcaption></figure>

### Sorting

Use the **'Sort' dropdown** to arrange the product list or search results in the order that's most relevant.&#x20;

Sorting options include

* &#x20;**product name** (from A-> Z and Z-> A)
* **product type** (from A-> Z and Z-> A)
* **publish date** (Oldest first and Newest first).

{% hint style="info" %}
By hovering on the "Sort" badge, you can fing out what sorting option and sorting order is enabled.
{% endhint %}

<figure><img src="/files/v9tnHKjvGHhwrFzLUMSw" alt=""><figcaption><p>Sorting</p></figcaption></figure>

### Searching

To find the product, enter the product name into the search field.

{% hint style="info" %}
The search results are shown according to the sorting option applied.
{% endhint %}

<figure><img src="/files/unxyvukjRQzQzWS3dljw" alt=""><figcaption><p>Searching</p></figcaption></figure>

To refine your search, use filters.

## Filtering

The filters allow to narrow down the search results. You can filter by various criteria, making it easier to find the products you need.&#x20;

<figure><img src="/files/fRubur9RLe7iU50kW2Iw" alt=""><figcaption><p>List of all filters</p></figcaption></figure>

Here's a breakdown of all available filters:

* **Vendor -** filters by specific vendor and 'No vendor' option is available to find products that don't have a vendor

<figure><img src="/files/rUI2CYakXpuoEXfdK8SO" alt=""><figcaption><p>"Vendor" filter</p></figcaption></figure>

* **Tag -** filters by specific tags that have been assigned to product

<figure><img src="/files/kE0NqftcNi1FETLbX17Y" alt=""><figcaption><p>"Tag" filter</p></figcaption></figure>

* **SKU -** filters by product's unique SKU code

<figure><img src="/files/3T0iH0Ugd2XMTNwZEsUr" alt=""><figcaption><p>"SKU" filter</p></figcaption></figure>

* **Product name -** filters by product's name

<figure><img src="/files/1pSk8QTnotTtWRiSC6pm" alt=""><figcaption><p>"Product name" filter</p></figcaption></figure>

* **Publish date -** filters by product's published date. Lets you find products that were published within a specific date range.

<figure><img src="/files/zr5vKWYX535YxxmGycrD" alt=""><figcaption><p>"Publish date" filter</p></figcaption></figure>

* **Last update** - filters by product's last update date. Lets you find products that were last updated within a specific date range

<figure><img src="/files/4lGcZGH6hA9szOV38BKg" alt=""><figcaption><p>"Last update date" filter</p></figcaption></figure>

* **Options** - filters by product's specific option values (e.g., color, size, material)

<figure><img src="/files/oqXjVv5Unei2iDPnbfXA" alt=""><figcaption><p>"Option" filter</p></figcaption></figure>

* **Category** - filters by products within specific categories or 'No category' option is available to find products that don't have a category

<figure><img src="/files/qr6vdFa113QS6fweRaYR" alt=""><figcaption><p>"Category" filter</p></figcaption></figure>

* **Contains draft -** filters among products to find ones that have draft versions. You can select 'All' to see all products, 'Yes' to see only products with drafts, or 'No' to see only products without drafts.

<figure><img src="/files/9s0MbhJ2Bwk3yDaR7vie" alt=""><figcaption><p><strong>"Contains draft" filter</strong></p></figcaption></figure>

* **Production status** - filters among products that are available to be launched into production. You can select 'All' to see all products, 'Yes' to see only products that are available to be launched into production, or 'No' to see only products that aren't available to be launched into production.

<figure><img src="/files/hfGqu2Q2hescfYGN7fcv" alt=""><figcaption><p>"Production status" filter</p></figcaption></figure>

To **remove filter**, simply untick the checkbox near filter name in the filter list.

<figure><img src="/files/8hcwIzVQWIycngSekTqW" alt=""><figcaption><p>Removing filters</p></figcaption></figure>


# Product configuration

All you need to know about product configuration

## Overview

The Configurations feature empowers users to manage product variations effectively. By following this guide, you can navigate the features and functionalities available for managing configurations.

Product configuration allows you to create unique subtypes of your product, tailoring each one to meet specific needs. With this feature, you can easily set up:

* **Description:** provide specific details about the configuration
* **Attachments:** upload relevant files and documents
* **Worfklows:** define the processes associated with each configuration
* **Parameters:** specify options

<figure><img src="/files/C4Ch0ab2IkxVxkJKqOxE" alt=""><figcaption></figcaption></figure>

## Adding new configuration

1. Access Product page
2. Click ➕ button in the configuration tabs bar
3. Add name to the configuration&#x20;
4. Click :heavy\_check\_mark: button to save the configuration

{% @arcade/embed flowId="MU87upz1DYigZLwncfa4" url="<https://app.arcade.software/share/MU87upz1DYigZLwncfa4>" %}

## Editing configuration name

Configuration names can be changed in the product without creating a draft or a new version. This avoids confusion between identical products and keeps names consistent across versions.

✅ What happens when the name is changed?

* The name is updated in all versions of the product that had the same original name (case-sensitive).
* The history of changes is saved: you can see who changed the name and when.
* The name is updated in product lists and other interfaces.
* No draft is created - you work with the latest data right away.

1. Click "Edit name" in the "More actions" menu of the configuration you want to edit
2. Enter new name
3. Click :heavy\_check\_mark: button to save the name

{% @arcade/embed flowId="VB3QYIN7DdVVZMVlJJEA" url="<https://app.arcade.software/share/VB3QYIN7DdVVZMVlJJEA>" %}

## Duplicating configuration&#x20;

1. Click "Duplicate" in the "More actions" menu of the configuration you want to duplicate

{% hint style="success" %}
System creates a new configuration in this product completely duplicating the information from the original configuration: description, media, files, workflows, parameters
{% endhint %}

{% @arcade/embed flowId="WuS9C5B4ttDGnA1Fougk" url="<https://app.arcade.software/share/WuS9C5B4ttDGnA1Fougk>" %}

## Deactivating a configuration

1. Click "Deactivate" in the "More actions" menu of the configuration you want to deactivate
2. Click "Inactivate" button to confirm

{% hint style="danger" %}
Deactivated configurations can't be selected during the [production launch](/manuals/production/launching-productions) until they are activated.
{% endhint %}

{% @arcade/embed flowId="tyQQxs135IQFYaIx0Yjw" url="<https://app.arcade.software/share/tyQQxs135IQFYaIx0Yjw>" %}

## Activating a сonfiguration

1. Сlick "Activate" in the "More actions" menu of the configuration you want to activate
2. Click "Activate" button to confirm

{% @arcade/embed flowId="s5EwlorwGJ5kVl8uCOzH" url="<https://app.arcade.software/share/s5EwlorwGJ5kVl8uCOzH>" %}

## Deleting a configuration

1. Сlick "Delete" in the "More actions" menu of the configuration you want to delete
2. Click "Delete" button to confirm

{% @arcade/embed flowId="XzoTm7nLYQ7OAuY9efBE" url="<https://app.arcade.software/share/XzoTm7nLYQ7OAuY9efBE>" %}

## Things to note <a href="#h_fabf17e66d" id="h_fabf17e66d"></a>

* You can add up to 30 configurations per product.
* When creating a new product, a default configuration is automatically generated for you. This configuration will be pre-selected for your [product launch](/manuals/production/launching-productions).<br>


# Description

## Overview

The **"Description" section** is specifically designed to enable users to add detailed information about the product configuration. This allows you to include important specifications that help describe the product comprehensively. By providing thorough descriptions, you enhance the understanding of the product specifics for performers, facilitating effective task completion.

<figure><img src="/files/5Mcx9yClkCsIOwCVrbDV" alt=""><figcaption><p><strong>"Description" section</strong></p></figcaption></figure>

## Adding product description

1. Click on the "Details" field
2. Enter required text
3. Click "Save"

{% @arcade/embed flowId="vXGy9QAR2ijziY6bmHds" url="<https://app.arcade.software/share/vXGy9QAR2ijziY6bmHds>" %}

## Formating text

You can format text using the editor toolbar or keyboard shortcuts.

### The editor toolbar <a href="#the-editor-toolbar" id="the-editor-toolbar"></a>

The editor’s toolbar contains all the text formatting tools to format your text.

<figure><img src="/files/WhexEVpcFkEXmb1CX5xu" alt=""><figcaption></figcaption></figure>

<table><thead><tr><th width="201" align="center">Desired formating</th><th align="center">Toolbar option</th><th width="258" align="center">Keyboard shortcut (Windows)</th></tr></thead><tbody><tr><td align="center">Bold</td><td align="center">Highlight text + click "B"</td><td align="center">CTRL + B</td></tr><tr><td align="center">Italic</td><td align="center">Highlight text + click "I"</td><td align="center">CTRL + I</td></tr><tr><td align="center">Underline</td><td align="center">Highlight text + click "U"</td><td align="center">CTRL + U</td></tr><tr><td align="center">Unordered list</td><td align="center">Put coursor + click "Bullet list" icon</td><td align="center">"-" + space</td></tr><tr><td align="center">Ordered list</td><td align="center">Put coursor + click "Number list" icon</td><td align="center">"1." + space</td></tr><tr><td align="center">Insert link</td><td align="center">Put coursor + click "Link" icon</td><td align="center">CTRL + K</td></tr><tr><td align="center">Emoji</td><td align="center">Put coursor + click "Emoji" icon</td><td align="center"></td></tr></tbody></table>

## Web links

**Adding web links directly to the product page (PDP)** to connect external documents, tools, or references — without needing to upload files. This helps streamline your workflow and centralize important information in one place.

* Save time by linking Google Docs, spreadsheets, Figma files, etc.
* Avoid downloading and re-uploading static files.
* Keep product-related resources always up to date and accessible.

#### How It Works

#### **Add a Web Link**

1. Open the **Product Page (PDP)**.
2. Click the **“Add web link”** button.
3. In the pop-up, fill in:
   * **Link** (supports with or without `http`)
   * **Link name** (optional custom label)
4. Click **“Add”**.
5. The link appears on the product page:
   * Displaying the entered name or the URL
   * With a **🗑️ delete icon** next to it

> 📝 Adding or updating a link creates a **draft version** of the product.

{% @arcade/embed flowId="2pFtJ8Hd55OrJY6IAP6s" url="<https://app.arcade.software/share/2pFtJ8Hd55OrJY6IAP6s>" %}

#### **Delete a Link**

1. Hover over the link on the PDP.
2. Click the **delete (🗑️) icon**.
3. The link is immediately removed from the page.

#### **Open a Link**

* Click the link — it opens in a **new browser tab**.


# Workflows

## Overview

Workflow template is a powerful tool for defining and managing the production process for your products. Workflow Templates can be customized to accommodate different production needs, offering flexibility.

By reading this article, you will learn how to create new workflow templates for your products, including adding tasks, components, and relations. Also, you will learn how to modify existing workflow templates.

### Basics

To open the Workflow template, **click on the "Workflow" card** in the "Workflows" section on the Product page

<figure><img src="/files/wHLdbrbsblfAkUbmPKbq" alt=""><figcaption><p>Opening workflow </p></figcaption></figure>

### Workflow template key elements

* **Breadcrumbs -** a navigational tool that allows you to keep track of the current location and navigate to the needed location&#x20;

#### Workflow template breadcrumbs behavior:

* Clicking on the **"Back" button** returns you to the previous page from which you came to the current one
* Clicking on the **"Home" button** returns you to Homepage
* Clicking on the **"All products"** **button** redirects you to the All products page
* Clicking on the **"Category" name** redirects you to the All product page view filtered by this category
* Clicking on the **"Product name"** redirect you to the Product page first in order configuration view
* **Workflow name** displays the current workflow name

<figure><img src="/files/W0ftDsiduXP7OEvFfod4" alt=""><figcaption><p>Workflow template breadcrumbs</p></figcaption></figure>

* **Header -** shows the "Prefer to autoassign" button and "Active" toggle
  * If **"Prefer to autoassign"** button is **turned on**, then system will assign to the task users among ones that have completed at least 1 task in this production and are in the list of candidates to perform the task (after production will be launched [Launching productions](/manuals/production/launching-productions))
  * **"Active" toggle** allows to deactivate or activate workflow accordingly. &#x20;

<figure><img src="/files/MAc4LOqfAoTySpLWcocK" alt=""><figcaption><p>Workflow header</p></figcaption></figure>

* **Summary indicators -** shows the total number of tasks, worktime and costs regarding this workflow based on the information that was added in the [Task template](/manuals/product-management/product-configuration/workflows/task-template)

<figure><img src="/files/hAqhpBISXCwGmZMxLPDT" alt=""><figcaption><p>"Task", "Time", "Cost" summary indicators</p></figcaption></figure>

* **Draggable items "Add  product" and "Add task" -** allows to add operations ("components" and "tasks") of the workflow

<figure><img src="/files/md5LWBghbrhaYp70A14L" alt=""><figcaption><p><strong>Draggable items</strong></p></figcaption></figure>

* **"Additional tasks" container -** shows the number of additional tasks in the workflow and allows to add additional task to the workflow [Additional tasks](/manuals/product-management/product-configuration/workflows/additional-tasks)

<figure><img src="/files/hgE5CWkPiYJrQNc1v8rT" alt=""><figcaption><p><strong>"Additional tasks" container</strong></p></figcaption></figure>

* **Interactive minimap** - allows to resize the canvas by enabling full-screen mode

<figure><img src="/files/mLLP1BlGdJkb9Jx897Fw" alt=""><figcaption><p><strong>Interactive minimap</strong></p></figcaption></figure>

### Creating a workflow

As each product has its own workflow, Hesh allows to be flexible with crafting one you need. You can add semi-finished products (components), tasks or additional tasks ([Additional tasks](/manuals/product-management/product-configuration/workflows/additional-tasks)) to create the custom workflow.&#x20;

To do so:

1. Pull down the **"Add product"** item&#x20;
2. Select the needed product, version, configuration and workflow template&#x20;
3. Click on **"Add" button**

{% @arcade/embed flowId="1PcTkFlTzJsJUDjjjhBJ" url="<https://app.arcade.software/share/1PcTkFlTzJsJUDjjjhBJ>" %}

To add tasks to workflow:

1. Pull down the **"Add task"** item
2. Enter task name
3. Click on **"Save" button**

{% @arcade/embed flowId="oEIR6Cjk62IwnTPuEShM" url="<https://app.arcade.software/share/oEIR6Cjk62IwnTPuEShM>" %}

* Click on the **"connect point" of the component** and drag the line to the **"connect point" of the task** to creates relation between them on the canvas.

{% hint style="info" %}
To remove relation,  clicks on relation line and then ‘X’ icon, which appeared in the middle of the relation line.
{% endhint %}

<figure><img src="/files/90GDsNBJmC2i5sCLzjr3" alt=""><figcaption><p>Relation between component and task</p></figcaption></figure>

### Creating a workflow

### Additional actions

Components and tasks have "More action" menu, which allows to do following actions with the item:

* Edit (available only for components)
* Copy link
* Duplicate
* Delete
* Rename (available only for tasks)

#### "More actions" menu call out

1. Hover over the component or task
2. Click on :pencil2: button
3. Select the option from the list

{% @arcade/embed flowId="GvgqGA2t4jgGJm7JE7Ot" url="<https://app.arcade.software/share/GvgqGA2t4jgGJm7JE7Ot>" %}

#### Component editing&#x20;

Clicking on the **"Edit" button** calls out the "Edit component" pop-up to modify the settings (version, configuration, workflow template) of the component or interchange the component completely. This gives you the power to update component settings without creating a new version.&#x20;

{% @arcade/embed flowId="Z75UTZrE89KADTa2yVKV" url="<https://app.arcade.software/share/Z75UTZrE89KADTa2yVKV>" %}

#### **Component link copying**

Clicking on the **"Copy link" button** copies the link of the component's Product Details Page (PDP) to your clipboard. This is useful for sharing the component information with others.&#x20;

{% @arcade/embed flowId="2TjPvWae3UzVpuPf4mAW" url="<https://app.arcade.software/share/2TjPvWae3UzVpuPf4mAW>" %}

#### **Component duplicating**

Clicking on the **'Duplicate'** **button** creates a copy of the component item on the canvas. This is helpful for creating variations of the component.

{% hint style="warning" %}
The duplicate of the component is placed on top of the original component, therefore system shows a warning <mark style="color:orange;">‘2 items intersected’.</mark>
{% endhint %}

{% @arcade/embed flowId="tIOQ1afZBxVHxfoWjnOv" url="<https://app.arcade.software/share/tIOQ1afZBxVHxfoWjnOv>" %}

#### **Component deleting**

Clicking on the **"Delete" button** opens a confirmation modal to delete the component. Be careful, as deleting a component will also delete all of its output relations.

{% @arcade/embed flowId="etZxtsqdl6YJTlQCDfaE" url="<https://app.arcade.software/share/etZxtsqdl6YJTlQCDfaE>" %}

#### **Task link copying**

Clicking on the **"Copy link" button** copies the link of Task Template to your clipboard. This is useful for sharing the Task Template with others.&#x20;

{% @arcade/embed flowId="mrcH7ABJh3UrXj3GWiHb" url="<https://app.arcade.software/share/mrcH7ABJh3UrXj3GWiHb>" %}

#### **Task duplicating**

Clicking on the **'Duplicate'** **button** creates a copy of the Task Template item on the canvas. This is helpful for creating variations of the tasks.

{% hint style="warning" %}
The duplicate of the task is placed on top of the original task, therefore system shows a warning
{% endhint %}

{% @arcade/embed flowId="pAmuWAcdLwZSBkp6Ho1y" url="<https://app.arcade.software/share/pAmuWAcdLwZSBkp6Ho1y>" %}

#### **Task deleting**

Clicking on the **"Delete" button** opens a confirmation modal to delete the task. Be careful, as deleting a task will also delete all of its output relations.

{% @arcade/embed flowId="xYEn1ePVvW9mU1cE4e2Q" url="<https://app.arcade.software/share/xYEn1ePVvW9mU1cE4e2Q>" %}

#### **Task renaming**

Clicking on the :pencil2: button of the task, you are able to change task name without need to open Task Template page.&#x20;

{% @arcade/embed flowId="5ESTXKJnaUZFUm2dnN2Q" url="<https://app.arcade.software/share/5ESTXKJnaUZFUm2dnN2Q>" %}

### Copying a workflow to another product

Clicking on the **'Copy'** **button** creates a copy of the selected workflow to another. This is helpful to quickly duplicate settings for similar products with the same workflows.

Copying workflows is allowed for both - published and unpublished products.

1. Find the product and its workflow you want to copy.
2. Click "**More actions**" (**...**) button in the right upper corner of selected workflow.
3. Click "**Copy**".
4. Select a product you want to copy the workflow to.&#x20;
5. Choose a configuration of the product.
6. Click "**Save**".

{% @arcade/embed flowId="WqsJIEncf91T0ZKgTgbB" url="<https://app.arcade.software/share/WqsJIEncf91T0ZKgTgbB>" %}


# Task template

## Overview

Task Template defines the details, responsibilities, time limits, and rewards for a specific task. After reading this article, you will have a comprehensive understanding how use Task Template effectively. By mastering this feature, you can significantly streamline your production processes and ensure greater efficiency and consistency in your workflows.

### Basics

To open the Task template, **click on the task card** on the Workflow template page.

<figure><img src="/files/JcfC3m7eFVUuwfA74NQq" alt=""><figcaption><p>Opening task</p></figcaption></figure>

### Task template key elements

* **Breadcrumbs -** a navigational tool that allows you to keep track of the current location and navigate to the needed location&#x20;

#### Task template breadcrumbs behavior:

* Clicking on the **"Back" button** returns you to the previous page from which you came to the current one
* Clicking on the **"Home" button** returns you to Homepage
* Clicking on the **"All products"** **button** redirects you to the All products page
* Clicking on the **"Category" name** redirects you to the All product page view filtered by this category
* Clicking on the **"Product name"** redirect you to the Product page first in order configuration view
* Clicking on the **"Workflow name"** redirect you to the workflow canvas where this task is placed
* **Task name** displays the current task name

<figure><img src="/files/eEh37Xzo8GbddPTwDinO" alt=""><figcaption><p>Task template breadcrumbs</p></figcaption></figure>

* **Header -** shows the current task name and allows you to edit it if necessary&#x20;

<figure><img src="/files/nsFmM4N3WIblysGm1KsC" alt=""><figcaption><p>Task template header</p></figcaption></figure>

#### To edit task template name:

1. Click on the task name to activate the input field
2. Enter new task name&#x20;
3. Click on the :heavy\_check\_mark: to save new name

{% hint style="info" %}
Task name is limited by 255 characters.
{% endhint %}

{% @arcade/embed flowId="Qwe2apOyvuaaszxCFKVJ" url="<https://app.arcade.software/share/Qwe2apOyvuaaszxCFKVJ>" %}

* **Details -** allows you to add and format the task description

<figure><img src="/files/IeflZ7a7CnwG8LLKsuab" alt=""><figcaption><p>Task template with empty "Details" field</p></figcaption></figure>

#### Adding description

1. Click on the "Details" input field&#x20;
2. Enter the text
3. Formate added text according to needs (make text bold, add bullet points, links or emojiis)
4. Click on the :heavy\_check\_mark: to save new name

{% hint style="info" %}
The "Details" field does not have a hard limit on the number of characters.
{% endhint %}

{% @arcade/embed flowId="rj5FGdUX7tUUiI5qtZBB" url="<https://app.arcade.software/share/rj5FGdUX7tUUiI5qtZBB>" %}

* **"Files" section** - allows you to attach files in various formats so performers have all the information they need

<figure><img src="/files/Kjq7ddWXH1IncFS0lunX" alt=""><figcaption><p>Task template with empty "Files" section</p></figcaption></figure>

{% hint style="info" %}
The formats that could be uploaded - .txt, .doc, .docx, .pdf, .jpg, .jpeg, .png, .mp4, .xls, .xlsx, .mov, .webp
{% endhint %}

#### Adding files

1. Drag file or click on the "Click to upload" button
2. Select files you want to upload from the folder on the&#x20;
3. Click on the "Save" button

{% hint style="warning" %}
File limits are:

* .mp4, .mov - **2 Gb**
* .jpg, .jpeg, .png, .webp - **20 Mb**
* txt, .doc, .docx, .pdf, .xls, .xlsx - **20 Mb**
  {% endhint %}

{% @arcade/embed flowId="YeJOixIaXqWnIHoSWstH" url="<https://app.arcade.software/share/YeJOixIaXqWnIHoSWstH>" %}

* **"Related tasks" section -** allows you to see the sequence of previous and following tasks in the workflow

<figure><img src="/files/JB59iCE91jz1adN4IfTc" alt=""><figcaption><p>"Related tasks" section</p></figcaption></figure>

#### Opening previous/next task template:

* Click on the the previous/next items in the “Related tasks” section

{% @arcade/embed flowId="HRf8oXvD1y7CEHknUDMP" url="<https://app.arcade.software/share/HRf8oXvD1y7CEHknUDMP>" %}

* **"Basic parameters" section -**  allows you to set the time limit, reward, priority, and type of the task

{% hint style="info" %}
Сhanging the basic parameters, **"time limit"** and "**basic reward"**, directly affects the summary indicators on the Canvas [Workflows](/manuals/product-management/product-configuration/workflows#workflow-template-key-elements)
{% endhint %}

<figure><img src="/files/mSzidkHevIiB37X2AuNz" alt=""><figcaption><p>"Basic parameters" section </p></figcaption></figure>

#### **Setting time limit**

1. Click on the input field
2. Enter the number
3. Click outside the input area

{% hint style="info" %}
You can set time limit in **seconds, minutes, hours.**
{% endhint %}

{% @arcade/embed flowId="4IyuRZBMADHPc09QkyPe" url="<https://app.arcade.software/share/4IyuRZBMADHPc09QkyPe>" %}

#### **Setting priority**

1. Click on the "Priority" field
2. Select the option&#x20;

{% @arcade/embed flowId="sxlEUARIR7mk0dDXbNff" url="<https://app.arcade.software/share/sxlEUARIR7mk0dDXbNff>" %}

#### **Setting basic reward**

1. Click on the "Basic reward" field
2. Enter the number

{% @arcade/embed flowId="4BIFeYvsDWiBmRBk1sSW" url="<https://app.arcade.software/share/4BIFeYvsDWiBmRBk1sSW>" %}

#### **Changing task type**

1. Click on the "Type field
2. Select task type
3. Click on the "Change" button to confirm that you want to change the task type<mark style="color:red;">\*</mark>

<mark style="color:red;">\*</mark>in case you selected "Additional" task type from the dropdown

{% hint style="warning" %}
In case you changed task type from **"Workflow" to "Additional",** then system deletes all input and output relations of the task on the canvas and moves task to the "Additional tasks" container
{% endhint %}

{% @arcade/embed flowId="MQFNOeATeYknLcgbGduE" url="<https://app.arcade.software/share/MQFNOeATeYknLcgbGduE>" %}

* **"Responsibility" section -** allows you to define the responsibilities of performers (type of assignment to the task, number of performers, assignment criterias etc.)
  * Task template is created with <mark style="background-color:yellow;">**default responsibility**</mark>: 1 performer and manual assignment type.
  * Task must have <mark style="background-color:yellow;">**at lest 1 responsibility**</mark>, but also can have <mark style="background-color:yellow;">**more than 1**</mark> responsibility.
  * Task can have 3 assignment types:
    * Manual - user must assign performer themself to the task after production launch
    * Automatic - system assigns user to the task automatically after production launch
    * Self-assignment - performer assigns themselves to the task after production launch

<figure><img src="/files/u7as6H0h73YMGiI4q0gg" alt=""><figcaption><p>"Responsibility" section</p></figcaption></figure>

#### Changing responsibility title

1. Click on the :pencil2: button
2. Enter new name in the "Responsibility title" field
3. Click on the "Save settings" button

{% @arcade/embed flowId="Bo7JGFE6GuUnBchCkGgE" url="<https://app.arcade.software/share/Bo7JGFE6GuUnBchCkGgE>" %}

#### Changing number of performers

1. Click on the :pencil2: button
2. Enter new number of performers in the "Number of performers" field
3. Click on the "Save settings" button

{% hint style="info" %}
Click on the :heavy\_plus\_sign: button to increase number of performers or click on the :heavy\_minus\_sign: button to decrease number of performers.
{% endhint %}

{% @arcade/embed flowId="GQfyUcjk4RrQnfp6d5oF" url="<https://app.arcade.software/share/GQfyUcjk4RrQnfp6d5oF>" %}

#### Changing assignment type

1. Click on the :pencil2: button
2. Select new assignment type
3. Click on the "Save settings" button

{% @arcade/embed flowId="cZniH6LetG88VyGFfDuW" url="<https://app.arcade.software/share/cZniH6LetG88VyGFfDuW>" %}

#### Narrowing list of possible performers by department

1. Click on the :pencil2: button
2. Click on the "Add" button near "By department" field
3. Search the department from which you want to have performers for the task
4. Click on the :heavy\_plus\_sign: sign near the department name
5. Click on the "Save settings" button

#### Narrowing list of possible performers by position

1. Click on the :pencil2: button
2. Click on the "Add" button near "By position" field
3. Search the position of users under which you want to perform the task
4. Click on the :heavy\_plus\_sign: sign near the position name
5. Click on the "Save settings" button

{% @arcade/embed flowId="eaAfR7lRmcJsxdVmvaPP" url="<https://app.arcade.software/share/eaAfR7lRmcJsxdVmvaPP>" %}

#### Narrowing list of possible performers by user

1. Click on the :pencil2: button
2. Click on the "Add" button near "By user" field
3. Search the user which you want to perform the task
4. Click on the :heavy\_plus\_sign: sign near the department user name
5. Click on the "Save settings" button

{% @arcade/embed flowId="0OmG7S5CRCtihYNDOENK" url="<https://app.arcade.software/share/0OmG7S5CRCtihYNDOENK>" %}

#### Adding responsibility

1. Click on the "Add" button
2. Set up the number of performers, assignment type
3. Click on the "Save settings" button

{% @arcade/embed %}

#### Deleting responsibility

1. Click on the :wastebasket: button
2. Confirm by clicking on "Delete" button

{% hint style="warning" %}
Task template must have at least 2 responsibilities to :wastebasket: button became enabled.
{% endhint %}

{% @arcade/embed %}

* "**Bonuses" section -** allows you to define extra reward for the task based on the product options (size, colour, material)
  * Bonuses can be assigned in 2 types: as a <mark style="background-color:yellow;">**percentage of the basic reward**</mark> or as a <mark style="background-color:yellow;">**fixed amount**</mark>&#x20;
  * The **"Bonuses" pop-up** displays a <mark style="background-color:yellow;">**filled option list**</mark> that has been set up for this product configuration earlier
  * The number of bonuses is <mark style="background-color:yellow;">**limited by the total number of "Option" values**</mark> of the product configuration

<figure><img src="/files/vORBwunbZRh7nLGXLR4z" alt=""><figcaption><p>Task template with empty "Bonuses" section</p></figcaption></figure>

#### Adding bonus

1. Click on the "Add" button
2. Select option
3. Set the bonus for the option
4. Click on the "Save" button

{% @arcade/embed flowId="Xcv2gPml4jzKr8BiwAev" url="<https://app.arcade.software/share/Xcv2gPml4jzKr8BiwAev>" %}

#### Adding the bonus combinations

1. Click on the "Add" button
2. Select combinations of options
3. Click on the "Add combination" button
4. Set the bonus for the combinations of options
5. Click on the "Save" button

{% @arcade/embed flowId="gLj20SX61JOVN9r8anPy" url="<https://app.arcade.software/share/gLj20SX61JOVN9r8anPy>" %}

#### Deleting the bonus

* **Option 1:**

1. Hover over the bonus option
2. Click on the :heavy\_multiplication\_x: button

{% @arcade/embed flowId="5pA725bXw6XXymMpIebJ" url="<https://app.arcade.software/share/5pA725bXw6XXymMpIebJ>" %}

* **Option 2:**

1. Click on the "Edit" button
2. Click on the :wastebasket: button
3. Click on the "Save" button

{% @arcade/embed flowId="LKw3doIha9cp7fzZEecy" url="<https://app.arcade.software/share/LKw3doIha9cp7fzZEecy>" %}

#### "Bonus" editing menu call out

1. Click on the "Edit" button

{% @arcade/embed flowId="odf1DXHt8N47DGbjuL2C" url="<https://app.arcade.software/share/odf1DXHt8N47DGbjuL2C>" %}

<br>


# Additional tasks

### Overview

Additional tasks provide a flexible way to add tasks to your production process that are not directly tied to the main workflow steps.&#x20;

By reading this article, you will learn how to create new additional tasks within your workflow template and discover how to modify existing additional tasks, including renaming, duplicating, and changing their priority.

### Additional Task helps you:

* Manage tasks that don't fit into the main workflow sequence
* Add tasks that need to be completed at any point during production
* Track tasks that are not directly related to the main product workflow

### Basics

* Additional Tasks are not part of the main workflow sequence. They are independent tasks that <mark style="background-color:yellow;">**can be completed at any time**</mark> during the production process
* You can **add tasks** as needed, without having to modify the main workflow, even <mark style="background-color:yellow;">**during the production process**</mark> ([Production management](/manuals/production/production-management))
* You can <mark style="background-color:yellow;">**add an unlimited number of additional tasks**</mark> to your workflow template
* Additional tasks are located in the **"Additional task" container** on the Workflow template canvas

<figure><img src="/files/VT4Da4ffmwo1xX67eUbi" alt=""><figcaption></figcaption></figure>

### Adding additional task

1. Open the **workflow template** for the product you want to add additional tasks to
2. Click the **'Additional tasks' container**
3. Click the **'Add Task' button** to create a new task&#x20;
4. Give the task a name

{% embed url="<https://app.arcade.software/share/sOtGPoUdWcJ9Q6Mu1s4r>" %}
Adding additional task
{% endembed %}

### Additional actions

Additiona tasks have "More action" menu, which allows to do following actions with the item:

* Duplicate
* Copy link
* Delete
* Rename

#### "More actions" menu call out

1. Hover over the Additional task
2. Click on the **`⋮`** button
3. Select the option from the list

{% embed url="<https://app.arcade.software/share/aZGxjkKvX4kItkmE6cOj>" %}
"More actions" menu call out
{% endembed %}

#### **Additional task duplicating**

Clicking on the **'Duplicate'** **button** creates a copy of the Additional Task Template item. This is helpful for creating variations of the tasks.

{% embed url="<https://app.arcade.software/share/rFCotpzAnD2xRwR8x0u9>" %}
Duplicating additional task
{% endembed %}

#### **Additional task link copying**

Clicking on the **"Copy the link" button** copies the link of Task Template to your clipboard. This is useful for sharing the Task Template with others.&#x20;

{% embed url="<https://app.arcade.software/share/kX2TJNAQDYT7qiGoGYi4>" %}
Copying and pasting link of additional task&#x20;
{% endembed %}

#### **Additional task deleting**

Clicking on the **"Delete" button** opens a confirmation modal to delete the task.&#x20;

{% embed url="<https://app.arcade.software/share/XgO38l3vqfb4mOTIwWJs>" %}
Deleting additional task
{% endembed %}

#### **Additional task renaming**&#x20;

Clicking on the **additional task name**, you are able to change task name without need to open Task Template page.&#x20;

{% embed url="<https://app.arcade.software/share/oWPN7ZNzvHcCnOVSv5e3>" %}
Renaming additional task
{% endembed %}

### Extra actions

#### Dragging task to new position

You can rearrange the order of additional tasks by **dragging and dropping them** in the list.

{% embed url="<https://app.arcade.software/share/lDhO39pYcpfba4BY40m2>" %}
Dragging additional task
{% endembed %}

#### Searching Additional tasks

Use the **'Search' field** to quickly find specific additional tasks within the list.

{% embed url="<https://app.arcade.software/share/9CChXPWgfi9HOPbHnmCD>" %}
Searching
{% endembed %}

#### Changing priority of the Additional task&#x20;

Click on the **task priority indicator** to open a dropdown menu where you can select a different priority level. It saves time as you don't need to open Task Template.

{% embed url="<https://app.arcade.software/share/NFx0OEYOLI9mBFzt8VTU>" %}
Changing additional task priority
{% endembed %}


# Warnings

### Overview

Canvas warnings are like helpful little flags that appear on your workflow template to alert you to potential issues or suggest improvements.&#x20;

The article will explain the different types of warnings. By reading this article, you will learn how to interpret warnings, understand their meaning, and take appropriate actions to resolve them.

### Basics

* If workflow template has <mark style="background-color:yellow;">**at least one issue**</mark>, then system shows a warning icon with counter (on left top side of canvas)

<figure><img src="/files/rmoksPev9EUtzuniP355" alt=""><figcaption><p>Canvas with warning</p></figcaption></figure>

* To find out what issue(s) are occured with workflow, just <mark style="background-color:yellow;">**hover over a warning icon**</mark>

<figure><img src="/files/NACGt5BGHMq0L28OwABd" alt=""><figcaption><p>Tooltip with explanation </p></figcaption></figure>

### Types of canvas warnings

#### **No Tasks Warning**

If you haven't added any tasks, components, or additional tasks to your workflow template, you'll see a warning message. This reminds you to <mark style="background-color:yellow;">**add the necessary elements**</mark> to your workflow.

<figure><img src="/files/V9Oqm3EL1cl68GYor3Mo" alt=""><figcaption><p>"No tasks" warning</p></figcaption></figure>

**Items Overlapped**

If you accidentally place multiple tasks or components on top of each other, a warning icon will appear on the topmost item. This helps you identify and <mark style="background-color:yellow;">**fix any overlapping elements**</mark>.

<figure><img src="/files/u8NBzIl1XOTjHtV9PNFF" alt=""><figcaption><p>"Items overlapped" warning</p></figcaption></figure>

{% hint style="success" %}
To resolve **overlapped items**, simply drag and drop the items to different positions on the canvas until they no longer overlaped.
{% endhint %}

**Cycle Relation Error**

If you try to create a circular relationship between tasks (e.g., Task A connects to Task B, and Task B connects back to Task A), system will forbid this. This helps you <mark style="background-color:yellow;">**avoid creating invalid workflow structures**</mark>.

<figure><img src="/files/p9n9YZUiFEpRVQxYgVaA" alt=""><figcaption><p>"Cycle Relation" error</p></figcaption></figure>

{% hint style="success" %}
Review your workflow connections to **ensure that there are no circular relationships**. Remove or adjust connections as needed.
{% endhint %}

#### New Version Available

If a newer version of a component you've added to the canvas is available, system will show a suggestion icon above the component. This prompts you to consider <mark style="background-color:yellow;">**using the updated version**</mark> for your workflow.

<figure><img src="/files/FVuJny6YvQYw2GqRU8qn" alt=""><figcaption><p>"New version available" suggestion icon</p></figcaption></figure>

{% hint style="success" %}
Click the 'Editing menu' button for the component with the 'New version available' suggestion icon. You can then **select the newer version** from the **'Edit component' pop-up**.
{% endhint %}

**Inactive Component**

If you've added a component to the canvas, and its product, version, configuration, or workflow is inactive, system will show an 'Inactive' icon above the component. This prompts you to <mark style="background-color:yellow;">**select an active component**</mark> for your workflow.

<figure><img src="/files/5FpY2ONOCf72V90xJLQH" alt=""><figcaption><p>"Inactive component" suggestion icon</p></figcaption></figure>

{% hint style="success" %}
Click the 'Editing menu' button for the component with the 'Inactive' icon. You can then **select an active component** from the **'Edit component'** pop-up.
{% endhint %}


# Parameters

This page provides a comprehensive guide on how to manage product's parameter effectively.

## Overview

The "Parameter" feature empowers users to add specific characteristics to products, streamlining the process of configuring product variations. This guide will walk you through all aspects of adding parameters to a product configuration.

* **Parameter** - product's characteristic (e.g. Material)
* **Parameter's value** - product's characteristic value (e.g. Silk)

<figure><img src="/files/O91IwVr0mgY6GwH2TKGt" alt=""><figcaption></figcaption></figure>

## Adding a parameter

### Option 1. Create new parameter

1. Click "Add" button in the "Parameters" section&#x20;
2. Enter parameter's name in the "Name" field (e.g. "Colour")
3. Enter parameter's value in the "Value" field (e.g. "Red")
4. Click :heavy\_plus\_sign: near the "Value" field
5. Click "Save" button to add a parameter

{% @arcade/embed flowId="2wxJHf0nk8T4gLKSAb3b" url="<https://app.arcade.software/share/2wxJHf0nk8T4gLKSAb3b>" %}

{% hint style="info" %}
System adds these parameters as "Variants" to the product configuration automatically.
{% endhint %}

### Option 2. Use parameter from the previosly added templates

1. Click "Apply template" button in the "Add parameter" pop-up
2. Select the template
3. Click "Apply" button
4. Click "Add" button to add a parameter

Read [this ](https://app.gitbook.com/o/13N58EfuOA1zSY86pwEX/s/2iEmashkfYYrRZjhJnSk/~/changes/223/manuals/product-management/product-configuration/parameters/add-parameter-pop-up)article to find out how to configure the parameters templates

{% @arcade/embed flowId="4mHSGTA8Avz1dYBMxOik" url="<https://app.arcade.software/share/4mHSGTA8Avz1dYBMxOik>" %}

## Editing a parameter

1. Click  :pencil2: button next to the parameter you want to edit
2. Change parameter's name or value
3. Click "Save" button to apply changes

{% @arcade/embed flowId="yyzGKhUQqAqNW0kd728V" url="<https://app.arcade.software/share/yyzGKhUQqAqNW0kd728V>" %}

{% hint style="info" %}
System updates the list of "Variants" accordingly.
{% endhint %}

## Chaning parameter's position order

1. Select parameter you want to drag to another position
2. Drag it

{% @arcade/embed flowId="OeCOawFOayqVmef77EYA" url="<https://app.arcade.software/share/OeCOawFOayqVmef77EYA>" %}

{% hint style="info" %}
System updates the "parameter" that changed positions in the list of "Variants" automatically.
{% endhint %}

## Deleting a parameter

1. Click :heavy\_multiplication\_x: button next to the parameter you want to delete
2. Click "Delete" button to confirm

{% @arcade/embed flowId="EIjSF87oAghPHcAlSSWC" url="<https://app.arcade.software/share/EIjSF87oAghPHcAlSSWC>" %}

{% hint style="info" %}
System removes the "parameter" that was deleted from the list of "Variants" automatically.
{% endhint %}

## Things to note <a href="#h_fabf17e66d" id="h_fabf17e66d"></a>

* You can add up to 3 parametres per product configuration.<br>


# "Add parameter" pop-up

This page provides a comprehensive guide on how to create and manage parameter templates effectively.

## Overview

You can easily create templates with parameters to streamline your product management! By using the same parameters across different products, you'll save time and ensure consistent naming throughout the system.

<figure><img src="/files/oMfrbFGaaGH9MrS5PDYf" alt=""><figcaption><p>"Manage template" pop-up</p></figcaption></figure>

## Adding template

1. Click "Add" button in the "Parameters" section
2. Click "Manage templates" button in the "Add parameter" pop-up
3. Enter parameter's name into the input field in the "Templates" section
4. Click :heavy\_plus\_sign: button next to the input field
5. Enter parameter's value into the input field in the "Values" section
6. Click :heavy\_plus\_sign: button next to the input field
7. Click "Save" button to save the parameter's template

{% @arcade/embed flowId="LWNA8MtAc2Jh480gD4Vy" url="<https://app.arcade.software/share/LWNA8MtAc2Jh480gD4Vy>" %}

## Reordering values of the parameter

1. Select parameter's value you want to drag to another position
2. Click on D\&D area near the value
3. Drag it

{% @arcade/embed flowId="44y5amki7788J8chmUKj" url="<https://app.arcade.software/share/44y5amki7788J8chmUKj>" %}

## Deleting parameter or its value from the template

1. Click :heavy\_multiplication\_x: button next to the parameter or value you want to delete
2. Click "Save" button to save the parameter's template with updated values

{% @arcade/embed flowId="kX0j8SG4NJSZjYFOqaA2" url="<https://app.arcade.software/share/kX0j8SG4NJSZjYFOqaA2>" %}

{% hint style="warning" %}
The system prevents saving a parameter group if it does not contain at least one value.&#x20;
{% endhint %}

&#x20;


# Variants

This article covers what are product variants and how manage them

## Overview

This guide will help you efficiently manage product variants within the HESH application. Whether you're working with a default variant that is automatically created or customizing a list of variants based on specific product parameters, this documentation offers all the essential information you need.

<figure><img src="/files/7H72g46e2Lo45izIkuZD" alt=""><figcaption></figcaption></figure>

## What are product variants?

Product variants are different versions of a product that can feature various attributes, such as size, color, or other customizable options.&#x20;

## How product variants are created?

The list of variants is automatically generated based on the [parameters](/manuals/product-management/product-configuration/parameters) you add to the product's configuration. If a product does not have any parameters specified, the system will automatically create a "default" variant to ensure that there is at least one option available for customers.

## Use cases

### Updating variant's SKU

By default, variants inherit their SKU from the product's configuration value. To update a variant's SKU, follow these steps:

1. Select the variant for which you want to edit the SKU
2. Click on the "Individual SKU" field of the selected variant
3. Type in the new SKU value that you wish to assign to the variant
4. Click :heavy\_check\_mark: to save new SKU

{% embed url="<https://app.arcade.software/share/wTChDZ6U2gKmKSBwKQQc>" %}

### Updating variant's barcode

1. Select the variant for which you want to edit the barcode
2. Click on the "Barcode" field of the selected variant
3. Type in the new barcode value that you wish to assign to the variant
4. Click :heavy\_check\_mark: to save new barcode&#x20;

{% embed url="<https://app.arcade.software/share/2JZnC68IkbMscDzi1BiY>" %}

### Adding photo to the variant

1. Click on the icon for uploading a photo near product variant's name
2. Select a photo from the available options that were added to the product configuration previously
3. Click "Apply" button to add the photo to the variant

{% embed url="<https://app.arcade.software/share/lzPfDJSFLbcaLojSWUGX>" %}

{% hint style="warning" %}
To remove photo, simply click "Cancel application" button
{% endhint %}

### Deactivating variant

1. Select the variant you want to deactivate
2. Untick the checkbox

{% embed url="<https://app.arcade.software/share/a94colYShKxi9CggR9zp>" %}

{% hint style="warning" %}
Deactivated variants won't be be available for [launching in production](/manuals/production/launching-productions).
{% endhint %}

### Searching for the variant

1. Enter the value in the search field
2. Click enter

{% embed url="<https://app.arcade.software/share/gHNWdSQJt3ndpi8XDes4>" %}


# Bill of Materials

## Overview

A **Bill of Materials** **(BOM)** feature represents a structured table of all materials and components required to produce a product. It defines *what* is needed, *in what quantity*, and *how components relate to each other* within the production workflow. The BOM serves as a central source of truth for production planning and cost calculation.&#x20;

In the system, BOMs are organized by **workflows**, where each workflow contains all active **product variants** within the selected configuration. This enables to maintain different material compositions depending on how a product is produced.

Each BOM variant provides:

* a structured list of **materials and components**
* **quantities and units of measure**
* **cost information**, including both *Published cost* and *Current cost*
* **tags and filters** for easier classification and navigation

<figure><img src="/files/ZG2O7x6X5fhieMINcMRe" alt=""><figcaption></figcaption></figure>

### Permissions

1. User needs to have [Product view](/manuals/users/permissions#products) permission to be able to view “BOM” section.
2. User needs to have [Product edit](/manuals/users/permissions#products) permission to be able to edit “BOM” section.

## BOM variant table

Each BOM variant contains a **table of materials and components** that define the product structure and its associated costs within a selected workflow.

#### Search by BOM Name

Use the **search field** at the top of the section to quickly find BOM variants by name across all workflows.

* The search is applied globally, not limited to the currently selected workflow
* Results are updated dynamically as you type
* This helps quickly find specific variants when working with a large number of BOMs

<figure><img src="/files/Vi5dmnvFthGRHi7RfR49" alt=""><figcaption></figcaption></figure>

### Table c**olumns**

<table data-header-hidden="false" data-header-sticky><thead><tr><th width="147.60003662109375">Column</th><th>Description</th></tr></thead><tbody><tr><td><strong>Type</strong></td><td>Indicates whether the item is a <em>Material</em> or a <em>Component</em>.</td></tr><tr><td><strong>Name</strong></td><td><p>Displays the <strong>material / component</strong> name along with its attributes:<br></p><ul><li><strong>Material</strong>: Photo, Category, Subcategory<mark style="color:$info;">(if exists)</mark>, Parameters<mark style="color:$info;">(if exists)</mark></li><li><strong>Component</strong>: Photo, Version, Configuration, Workflow, Variant</li></ul></td></tr><tr><td><strong>Quantity</strong></td><td><p>Specifies the item amount needed and corresponding UOM</p><p></p><ol><li>Material - supports decimal values</li><li>Component - only positive integer values</li></ol></td></tr><tr><td><strong>Published cost</strong></td><td><mark style="color:$danger;"><code>Cost of the item * Quantity</code></mark> at the moment of publishing product.<br>*This value is typically used in production planning and reporting.</td></tr><tr><td><strong>Current cost</strong></td><td>The latest calculated or updated <mark style="color:$danger;"><code>Cost of the item * Quantity</code></mark>.<br>*It may differ from the published cost if changes were made but not yet approved (published).</td></tr><tr><td><strong>Tags</strong></td><td>Labels assigned to items (e.g., <em>Eco-friendly</em>, <em>Sheer</em>) for filtering and classification.</td></tr></tbody></table>

### Total material value

At the top of each BOM variant, the system displays:

* **Total material cost (Published)**
* **Total material cost (Current)**

These totals are calculated as the sum of all items in the table based on their respective cost columns.

<figure><img src="/files/CkQTNhImLFx9OtrFhRgU" alt=""><figcaption></figcaption></figure>

### Table interactions

Users can interact with the BOM variant table in the following ways:

* **Add item - a**dd new materials or components to the BOM variant.
* **Table actions (⋯ menu) -** additional actions for the table:
  * **Apply to -** copy BOM table to other variants and workflows.
  * **Remove all items** - clear the BOM table completely.
* **Edit rows -** update quantity and tags in each row.
* **Row actions (⋯ menu)** - access additional actions such duplicate or remove.
* **Filtering** - use filters (by material name or tag) to quickly find specific items within the table.

{% hint style="info" %}
Learn more about each action in the BOM table in the next article.
{% endhint %}


# BOM operations

This section describes the available actions users can perform to manage and maintain the Bill of Materials (**BOM**). These operations allow users to update product structure, adjust data, and reuse BOM configurations efficiently.

## Actions with BOM table

### Add item

Use **Add item** to include new materials or components in the BOM.

* Allows selecting an existing material or component
* Adds the item as a new row in the BOM table
* Newly added items can be further edited (e.g., quantity, tags)

<figure><img src="/files/7BpMPrmklfRRTq1IVNXp" alt=""><figcaption></figcaption></figure>

#### **Add Material**

When adding a material:

1. Click **Add item**.
2. Select **Material** in the **Type** column.
3. Choose a material from the list in the **Name** column.
   1. Use search to find materials quicker.
4. The default **Quantity** is set to 1 UOM.
5. The material is added as a single row in the BOM table.

{% @arcade/embed flowId="8qJee8JEaqoFNeug1NIR" url="<https://app.arcade.software/share/8qJee8JEaqoFNeug1NIR>" %}

#### **Add Component**

When adding a component:

1. Click **Add item**.
2. Select **Component** in the **Type** column.
3. The system opens a modal "**Add component**".
4. Choose a **Product** from the list and other attributes.
   1. Select a **Product version**, **Configuration**, **Workflow** and **Variant**.
5. Click **Add** button to save the component to BOM.
6. The component is added as a grouped item, which includes nested materials.

{% @arcade/embed flowId="9NzIg5zlUAFv1FIMKsLT" url="<https://app.arcade.software/share/9NzIg5zlUAFv1FIMKsLT>" %}

### Edit Quantity and Tags

Users can update item details directly in the table:

* **Quantity** - define how much of the item is required
* **Tags** - assign or modify labels for classification and filtering

{% hint style="warning" %}
You **CANNOT** edit the **Quantity** or **Tags** of nested items within an added component directly in this table, but only in the product where the **BOM** was created.
{% endhint %}

#### Edit Quantity

1. Click on the **Quantity** cell.
2. Enter the new value.
3. Press **Enter** or click outside the cell to apply changes.
4. The updated quantity is saved immediately.
5. **Published cost** and **Current cost** values are recalculated automatically based on the new quantity
6. **Total material costs** at the top of the BOM variant is updated accordingly

{% @arcade/embed flowId="OWO6EsucOhG9Br97mmxz" url="<https://app.arcade.software/share/OWO6EsucOhG9Br97mmxz>" %}

#### Add or Edit Tags

1. Click on the **Tag** cell.
2. The system opens a modal "**Manage tags**".
3. In the modal:
   * Use the **search field** to find existing tags
   * Select one or multiple tags using checkboxes
   * Or click **+ Add tag** to create a new tag
4. Close the modal to apply changes.
5. Selected tags are displayed in the **Tag** column for the item

{% @arcade/embed flowId="Mjwvw521ZEm7V5FEYWHz" url="<https://app.arcade.software/share/Mjwvw521ZEm7V5FEYWHz>" %}

### Open component preview

1. Click on the <i class="fa-eye">:eye:</i> button near the selected component name.
2. The system will open a **Product** preview in the new window.

{% @arcade/embed flowId="YYLgBCmuEdOCfBoNEIgb" url="<https://app.arcade.software/share/YYLgBCmuEdOCfBoNEIgb>" %}

### Duplicate item

Use the **Duplicate** action in the "**More actions**" menu (⋯) for the row to quickly copy an existing material or component.

#### Duplicate a material

1. Click on the <i class="fa-ellipsis-vertical">:ellipsis-vertical:</i> button for the selected material row to open "**More actions**" menu.
2. Click on the **Duplicate** button.
3. The system duplicates a new row with copied measurements, quantities, prices, and tags.
   1. The **Total published/current prices** are updated automatically.

{% @arcade/embed flowId="ei6jfqAWjABytKv72cKT" url="<https://app.arcade.software/share/ei6jfqAWjABytKv72cKT>" %}

#### Duplicating a component

1. Click on the <i class="fa-ellipsis-vertical">:ellipsis-vertical:</i> button for the selected component row to open "**More actions**" menu.
2. Click on the **Duplicate** button.
3. The system increases the Quantity field of the existing component by +1.
   1. The **prices** are updated automatically.

{% @arcade/embed flowId="MWXB597jc9h0JCkuyIc8" url="<https://app.arcade.software/share/MWXB597jc9h0JCkuyIc8>" %}

### Delete item

1. Click on the <i class="fa-ellipsis-vertical">:ellipsis-vertical:</i> button for the selected row to open "**More actions**" menu.
2. Click on the **Delete** button.
3. The system removes the selected row with the nested items <mark style="color:$info;">(if component)</mark>.
   1. The **prices** are updated automatically.

{% @arcade/embed flowId="IKmMi8v3e8UiBTvDzE1V" url="<https://app.arcade.software/share/IKmMi8v3e8UiBTvDzE1V>" %}

## "More actions" with BOM table

### Apply to

Use **Apply to** action in the "**More actions**" menu (⋯) to copy the current BOM variant to other variants or workflows.

1. Click on the <i class="fa-ellipsis-vertical">:ellipsis-vertical:</i> button in the BOM table header to open "**More actions**" menu.
2. Click "**Apply to**" button.
3. The system opens a "**Apply to**" modal window.
4. Select **workflows** and **variants** from the drop-down.
5. Click **Apply** button.
6. The system applies BOM to all selected variant BOMs across all selected workflows.

{% @arcade/embed flowId="TXMaSLI8nbjWSUjQlfvS" url="<https://app.arcade.software/share/TXMaSLI8nbjWSUjQlfvS>" %}

### Clear BOM

Use **Remove all items** action in the "**More actions**" menu (⋯) to completely clear the BOM table.

1. Click on the <i class="fa-ellipsis-vertical">:ellipsis-vertical:</i> button in the BOM table header to open "**More actions**" menu.
2. Click "**Remove all items**" button.
3. Confirm action by pressing "**Delete**" in "**Remove all items?**" modal.

{% @arcade/embed flowId="D2dNwRv0DIV056gOuEHK" url="<https://app.arcade.software/share/D2dNwRv0DIV056gOuEHK>" %}

### Filtering

#### Filter by Name or Tag

There are 2 available filtering options in the BOM table:

* **Material name** - filter items by material name
* **Tag** - filter items by assigned labels (tags)

1. Click on the filter to start.
2. Use **Search** field to quickly find the needed item.
3. Click on the needed options in the drop-down to apply them for filtering.

{% @arcade/embed flowId="73GUzA8wMQWrJx6UghUf" url="<https://app.arcade.software/share/73GUzA8wMQWrJx6UghUf>" %}

#### Clear filters

Use **Clear all** to reset all applied filters and return to the full BOM view.

{% @arcade/embed flowId="aAkRw3owcKcQBtFoTPZL" url="<https://app.arcade.software/share/aAkRw3owcKcQBtFoTPZL>" %}


# Publishing and versioning

## Overview

HESH's versioning system allows you to track changes and manage multiple iterations of your products.&#x20;

By reading this article you will learn how to manage your product development process efficiently and maintain a history of product updates.

## Basics

The newly added product is created in a **draft mode**.

<figure><img src="/files/sCEYXvPQPVJjvgd377SL" alt=""><figcaption><p>Draft product view on the All products page</p></figcaption></figure>

To **convert draft product to published** (ready to be taken into production), the following steps must be taken:

* fill SKU for configuration&#x20;
* add at least 1 Workflow without issues
* fill SKU for variant
* make sure that at least 1 product's variant is active

{% hint style="danger" %}
If at least one of the conditions is not met, a warning icon is shown and "Publish version" button is disabled
{% endhint %}

<figure><img src="/files/NDBJEWRDkW6a1H0CpKik" alt=""><figcaption><p>Draft product detailed view</p></figcaption></figure>

### **Filling the SKU** for configuration

1. Click on the "SKU" field
2. Enter the SKU for configuration
3. Click on :heavy\_check\_mark: button

<figure><img src="/files/YjKsY8VmdfkaFIBeIxmY" alt=""><figcaption><p>Adding SKU</p></figcaption></figure>

### **Adding workflow**

1. Click on the "Add" button
2. Enter the name of the workflow
3. Click on  :heavy\_check\_mark: button
4. Click on the workflow zone to open Workflow template canvas

<figure><img src="/files/3LwO6R7KvgDH2fe7hVn0" alt=""><figcaption><p>Click here to open workflow canvas</p></figcaption></figure>

* Fill the workflow with the tasks and components that match your manufacturing process. See [Workflows](/manuals/product-management/product-configuration/workflows) to find how to create workflows

<figure><img src="/files/yazYyBE5YtCjIv6yvPY6" alt=""><figcaption><p>Workflow with tasks</p></figcaption></figure>

* All requirements were met and **product is ready to be published**

<figure><img src="/files/kIALihrYQZeAkcZWUfRH" alt=""><figcaption><p>Product that can be published</p></figcaption></figure>

### Publish product version

1. Click on the "Publish version" button
2. Confirm by clicking on "Publish" on the confirmation modal to finish publishing

<figure><img src="/files/bA4dMvOWdhlGfc41LgyV" alt=""><figcaption><p>Publishing product</p></figcaption></figure>

:tada:**version 1** of your product is **published**

<figure><img src="/files/b0WBurZDmOdo8wQqJyoC" alt=""><figcaption><p>Published product</p></figcaption></figure>

## Versioning

Versioning helps you:&#x20;

* Track product changes over time
* Manage multiple iterations of your products
* Publish new versions without affecting current productions

To view detailed information about version, **click** on the **accordion button on the "Version" tab**&#x20;

<figure><img src="/files/wXVRLww0YjDslFHHPEFD" alt=""><figcaption><p>"Version" tab detailed view</p></figcaption></figure>

* **Date of publication** - indicates the date and time, when product version was published
* **Version publishing status** - indicates whether product is published or draft
* **"In production - \<number>"** - indicates the number of launched productions with this version
* **"Active" toggle** - allows to activate or inactivate version of the product
* **"Preview" button** - allows to open version of a product in a view mode
* **"Delete" button** - allows to delete draft version

{% hint style="warning" %}
Only **draft version** of the product **can be deleted**.

If product only has 1 draft version, "Delete" button is disabled.
{% endhint %}

* To **delete draft version**, click on the "Delete" button and confirm by clicking on "Delete" button on the confirmation modal.

<figure><img src="/files/zPNTc3Jkg2fNGvZz4usw" alt=""><figcaption><p>Deleting draft version</p></figcaption></figure>

* To **view specific version**, click on "Preview" button to open product version in the view mode.

<figure><img src="/files/R65FIEfdtwkbUkv0irP9" alt=""><figcaption><p>Opening product in view mode</p></figcaption></figure>

* To **inactivate the version**, click on the "Active" toggle and confirm by clicking on the "Inactivate" button on the confirmation modal.

<figure><img src="/files/QKhMfD1920GO18qGI6oY" alt=""><figcaption><p>Inactivating of product</p></figcaption></figure>

{% hint style="warning" %}
Inactive version can't be launched into production. It has to be activated first.
{% endhint %}

* If **product version is used as component in other workflows**, it's recomend to click on the "related products" on the confirmation modal, in order to see in which products it's used.

<figure><img src="/files/k1rqsdsuMmBfh4Ei3Y3F" alt=""><figcaption><p>Clicking on "related products"</p></figcaption></figure>

<figure><img src="/files/DCneHZF8rkR0rTxVjTE5" alt=""><figcaption><p>List of products where this product version is used as a component in workflow</p></figcaption></figure>

* You can also **inactivate** product **from view mode,** by clicking on "Active" toggle and confirm by clicking on the "Inactivate" button on the confirmation modal. See [Product version preview](/manuals/product-management/publishing-and-versioning/product-version-preview)

<figure><img src="/files/bqkiXoknknzGAVg9Xzj4" alt=""><figcaption><p>Inactivating of product version in view mode</p></figcaption></figure>

* To **activate the version**, click on the "Inactive" toggle and confirm by clicking on the "Activate" button on the confirmation modal.

{% hint style="info" %}
You can also activate product from "Product version preview modal"
{% endhint %}

<figure><img src="/files/1QVdvMhQKyY7NmPeK5Ri" alt=""><figcaption><p>Activating of product version</p></figcaption></figure>


# Product version preview

## Overview

HESH provides a powerful tool for reviewing past versions of the products. It provides a detailed view of a specific product version, allowing you to compare changes, understand past iterations, and gain valuable insights into your product development process.

You will learn how to iinteract with version preview modal, understand how to review the basic information, configurations, workflows, photos, files, and variants of the selected version.

## Basics

To open version of a product in a view mode, **click on the "Preview" button** on the "Version" tab next to the version you want to see

<figure><img src="/files/A2boGGSQ5UmN8gAmnnxH" alt=""><figcaption><p>Opening product version in a view mode</p></figcaption></figure>

{% hint style="warning" %}
In "View mode", you can not edit the basic information about the product:

* Change product "category", "type" and "vendor"
* Change product description
* Add files or media
* Add workflows
* Add variants
  {% endhint %}

### Version preview modal key elements

* **Breadcrumbs -** allows to navigate back to product detailed view or All products page

<figure><img src="/files/BYhtPf0o3ZFLtzsovpi6" alt=""><figcaption><p>Breadcrumbs</p></figcaption></figure>

* **Header -** shows the version number, published date, number of launched productions with this version, category, type, vendor and "Active" toggle&#x20;

<figure><img src="/files/xsf9gJ971VPQtv4b9Q6k" alt=""><figcaption><p>Header</p></figcaption></figure>

* **"Configuration" tab -** shows the configurations that were defined for this version. You can see the SKU, details, attached media and files, workflows, parameters and variants.

  <figure><img src="/files/5QRMeEObJZSdStvjsO9O" alt=""><figcaption><p><strong>"Configuration" tab</strong></p></figcaption></figure>

  * **"Configuration" tab** has **"More actions" menu** with following options:
    * **"Edit codes"** **button** - opens "Change identification codes?" pop-up, which allows to edit SKU for configuration and barcodes / individual SKU for variants
    * **"Deactivate"** **button** - opens "Inactivate configuration?**"** pop-up, which allows to inactivate the current configuration

<figure><img src="/files/Wzj5D1ICR0tUsZYQ13cZ" alt=""><figcaption><p>"More actions" menu</p></figcaption></figure>

To **edit SKU, barcode or variant SKU** (individual SKU) follow next steps:

1. Click on "Edit codes" button&#x20;
2. Click on SKU/ barcode/ variant SKU field&#x20;
3. Enter new value&#x20;
4. Click on check mark button
5. Click on "Save changes"&#x20;

<figure><img src="/files/Ft9bxopLXvB0OS2854lh" alt=""><figcaption><p>Editing identification codes</p></figcaption></figure>

To **deactivate configuration**, follow next steps:

1. Click on "Deactivate" button
2. Confirm by clicking on "Inactivate" button on the "Inactivate configuration?" pop-up

{% hint style="danger" %}
Deactivated configuration can't be selected for launching into production. It has to be activated first.
{% endhint %}

<figure><img src="/files/JaR67Tdg14mdaHFTljtm" alt=""><figcaption><p>Deactivating configuration</p></figcaption></figure>

To **activate configuration back**, follow next steps:

1. Click on "Activate" button
2. Confirm by clicking on "Activate" button on the "Inactivate configuration?" pop-up

<figure><img src="/files/wzlP1DcSRttezWYNXmIu" alt=""><figcaption></figcaption></figure>

* **Workflows** - allows to view and deactivate the workflows of the configuration.

To **view the workflow**, scroll to workflow section and click on workflow you want to view&#x20;

{% hint style="info" %}
You can also open Task Template in view mode, when you are viewing the Workflow template. See [Task template](/manuals/product-management/product-configuration/workflows/task-template)
{% endhint %}

<figure><img src="/files/lHCe9JvuJX9Vkxfr8DFK" alt=""><figcaption><p>Opening workflow</p></figcaption></figure>

To **deactivate workflow**, follow next steps:

1. Click on "Deactivate" button
2. Confirm by clicking on "Inactivate" button on the "Inactivate configuration?" pop-up

<figure><img src="/files/dRhuWQw9N16iO9tdwdZH" alt=""><figcaption><p>Deactivating of workflow</p></figcaption></figure>

{% hint style="warning" %}
Deactivated workflow can't be selected for launching into production. It has to be activated first.
{% endhint %}

To **activate workflow back**, follow next steps:

1. Click on "Activate" button
2. Confirm by clicking on "Activate" button on the "Inactivate configuration?" pop-up

<figure><img src="/files/TN07zlLH1HLLOVxEkRHF" alt=""><figcaption><p>Activating of workflow</p></figcaption></figure>


# Production


# Production page

## Overview

This section covers all aspects necessary **to get started with production** in our system, including creating production items, viewing their details, managing attributes, and scheduling production.&#x20;

You will also learn how to use filtering, pagination, and how the create and edit productions.

By reading this article, learn how to create and manage production items, and how to effectively [use filters efficiently](/manuals/production/searching-sorting-and-filtering-productions).

## Production creating&#x20;

* New production can be created only for the published product version
* System allows to add inactive products (or product with inactive versions, configurations) in “New production” pop-up, but prohibits to launch them further in “Product launch” pop-up.

<figure><img src="/files/EzfwL1lxPxAxNX9jOstB" alt=""><figcaption></figcaption></figure>

### Create new production

1. Click on the **"New Production"** button.
2. Select **product** and **variant** which will be produced.\
   *The latest configuration and version will be updated automatically.*
3. Select another version or configuration if necessary.
4. Select an existing **order** or leave the field blank and a new order will be created automatically.\
   *If you select an order from the list, the external order number and client can be pulled up, as these fields are co-dependent and pull up the existing values.*
5. Select item quantity.
6. Click **"Add"** button.

{% hint style="warning" %}
You can’t add  product less than 1 and more than 1000
{% endhint %}

{% embed url="<https://app.arcade.software/share/9qXi3fmVzXk4mn6U36Hs>" %}

{% hint style="danger" %}
To enable such production for this product, version or configuration, user need to activate it.
{% endhint %}

## Production item detailed view

This section describes how the user can view detailed information about a production item, including all its attributes and statuses.

<figure><img src="/files/ljDYivYappZb0fnuYwFX" alt=""><figcaption></figcaption></figure>

A newly created production item is added on the Production page in the pre-launch state:

* “Order priority” and “Production priority” are set to “Medium” ***by default***.
* “Responsible” is set as “Unassigned” ***by default***.
* “Production status” is set to “To do” ***by default***.
* “Production Progress Bar” is set to 0% ***by default***.

### Rename production

1. Click on production for changing title.
2. Rename production item.
3. Click **"Save"** on control panel to save the changes.

{% embed url="<https://app.arcade.software/share/CEZO3sq15KV9AGQhYMK8>" %}

### Set responsible to the production

1. Click on responsibility icon.
2. Choose user from the user list.

{% embed url="<https://app.arcade.software/share/8npQZBxwAyFwWsyEijjv>" %}

### Change Order Priority

1. Click on order priority icon.
2. Choose the new priority for changing.
3. Click on it for changing.

{% hint style="info" %}
If you change the priority of the order in the main production, it will change for the components. And vice versa. In other words, the order priority is inherited from top to bottom and bottom to top.
{% endhint %}

{% embed url="<https://app.arcade.software/share/FaP26ToLcdIEvPkKKCbI>" %}

### Change Production Priority

1. Click on order priority icon.
2. Choose the new priority for changing.
3. Click on it for changing.

{% embed url="<https://app.arcade.software/share/7QxFWaiNijQrdiFbkLWm>" %}

{% hint style="info" %}
In the case of the production priority, if you change the priority in the main production, the priority will not change for the components. And vice versa.
{% endhint %}


# "Info" pop-up

## Overview

The **information pop-up window** provides detailed production information, allowing you to easily copy or edit production details by simply clicking on them. It is available for all components and add-on components, offering a clear view of the production hierarchy.

By reading this article, learn how to use the information pop-up to effectively manage production details, navigate the production hierarchy, and edit production components and information in real time.

## Info pop-up

In the info pop-up you can find all the detailed information about the production. Copy or edit info about production here just by clicking on it.

The info pop-up is available for all components and additional components. In these pop-ups, you can find the production hierarchy.

{% @arcade/embed flowId="wr1NFQRzzCSpDHW87x9j" url="<https://app.arcade.software/share/wr1NFQRzzCSpDHW87x9j>" %}

***By default***, any changes to the **Order Key, External Order Number, or Marketplace Order Number** should only be applied to the current production, with no impact on other productions.

<table><thead><tr><th width="195">Attribute's Name</th><th width="386">Description</th><th width="86" data-type="checkbox">Copied</th><th data-type="checkbox">Editable</th></tr></thead><tbody><tr><td><strong>Product Name</strong></td><td>Name of finished product or service offered by a company</td><td>true</td><td>false</td></tr><tr><td><strong>Deadline</strong></td><td>The final date by which the production must be completed</td><td>true</td><td>true</td></tr><tr><td><strong>Product Type</strong></td><td>The classification or category of the product being produced</td><td>true</td><td>false</td></tr><tr><td><strong>Workflow</strong></td><td>A predefined series of steps and processes that guide production from start to finish</td><td>false</td><td>false</td></tr><tr><td><strong>Configuration</strong></td><td>The specific arrangement or set of features and specifications for a product</td><td>true</td><td>true</td></tr><tr><td><strong>Variant</strong></td><td>Combination of the parametrs like color, size, or material </td><td>true</td><td>true</td></tr><tr><td><strong>Vendor</strong></td><td>The internal supplier or manufacturer providing products</td><td>true</td><td>false</td></tr><tr><td><strong>External order ID</strong></td><td>A unique identifier for an order received from an external system or marketplace</td><td>true</td><td>false</td></tr><tr><td><strong>External order number</strong></td><td>The reference number used by external systems to track an order.</td><td>true</td><td>true</td></tr><tr><td><strong>Order key</strong></td><td>A unique key that links all productions associated with the same order</td><td>true</td><td>true</td></tr><tr><td><strong>Production key</strong></td><td>The specific identifier for a production within the system, helping to track progress and history</td><td>true</td><td>false</td></tr><tr><td><strong>Route id</strong></td><td>The unique indetefier from external system</td><td>true</td><td>true</td></tr><tr><td><strong>SKU</strong></td><td>A stock-keeping unit code assigned to the specific configuration of the product</td><td>true</td><td>false</td></tr><tr><td><strong>Variant SKU</strong></td><td>A stock-keeping unit code for a particular variant of the product.</td><td>true</td><td>false</td></tr><tr><td><strong>Creation date</strong></td><td>The date on which the production process or task was created in the system</td><td>true</td><td>false</td></tr><tr><td><strong>Creation date at the external system</strong></td><td>date, when order was created in the external system</td><td>true</td><td>false</td></tr><tr><td><strong>Started date</strong></td><td>The date when the production or task officially started - switch from status "To do" to "In Progress"</td><td>true</td><td>false</td></tr><tr><td><strong>Barcode</strong></td><td>A machine-readable code assigned to the product for tracking and identification</td><td>true</td><td>true</td></tr><tr><td><strong>Product category</strong></td><td>The general classification under which the product falls, helping to organize products in the catalog</td><td>true</td><td>false</td></tr><tr><td><strong>Created by</strong></td><td>The user who submitted “New Production” pop-up</td><td>true</td><td>false</td></tr><tr><td><strong>Responsible Departments</strong></td><td>The departments assigned to manage or complete the tasks within the production</td><td>true</td><td>false</td></tr><tr><td><strong>Estimated time without components tasks</strong></td><td>The predicted time required to complete the production, excluding tasks related to components -> sum workflow tasks + additional tasks on canvas</td><td>true</td><td>false</td></tr><tr><td><strong>Estimated time</strong></td><td>The total predicted time to complete the entire production, including all tasks and components -> sum workflow tasks + additional tasks + all component tasks</td><td>true</td><td>false</td></tr><tr><td><strong>Time spent</strong></td><td>The actual amount of time that has been spent on the production up to the current date.</td><td>true</td><td>false</td></tr><tr><td><strong>Estimated cost without components tasks</strong></td><td>The projected cost for the production, excluding the costs related to component tasks.</td><td>true</td><td>false</td></tr><tr><td><strong>Estimated cost</strong></td><td>The total projected cost for the entire production process</td><td>true</td><td>false</td></tr><tr><td><strong>Number of tasks</strong></td><td>The total number of tasks within the production workflow, excluding tasks related to components</td><td>true</td><td>false</td></tr><tr><td><strong>Number of tasks with components tasks</strong></td><td>The total number of tasks, including those related to the components in the production</td><td>true</td><td>false</td></tr><tr><td><strong>Number of components</strong></td><td>The total number of components used or required in the production process</td><td>true</td><td>false</td></tr><tr><td><strong>Performers</strong></td><td>The list of users assigned to complete the tasks in the production</td><td>true</td><td>false</td></tr><tr><td><strong>Client</strong></td><td>The customer for whom the production is being carried out</td><td>true</td><td>true</td></tr><tr><td><strong>Primary client</strong></td><td>The main client for the production, especially when multiple clients are involved</td><td>true</td><td>false</td></tr><tr><td><strong>Version</strong></td><td>The current version of the production, representing any updates or changes made</td><td>true</td><td>false</td></tr><tr><td><strong>Involved departments</strong></td><td>The departments that are actively participating in or responsible for various stages of production</td><td>true</td><td>false</td></tr></tbody></table>

More about production attributes editing collected [here](/manuals/production/production-management/production-details-editing).


# Production page view options

## Overview

The production page offers three different views: **Plane view, Product view,** and **Order view.**

The main feature of the production page is the ability to switch between different views depending on whether the production is focused on products or orders. This flexibility allows users to adapt the page to their specific needs and manage workflows more efficiently.

By reading this article, learn how to navigate the production page and use different views to optimize your production management. You will also get an idea of the standard Plane view and how to switch between views depending on your production tasks.

## Production page view

The production page can change its view among **3 options**:

* Plane view
* Product view
* Order view

Plane view - view by default, which applies to every page reloading.

<figure><img src="/files/HepZGuXH7oTc5NhhaAuZ" alt=""><figcaption></figcaption></figure>

{% tabs %}
{% tab title="Order View" %}

### Order view

***Order view*** shows all productions grouped under one order.&#x20;

<figure><img src="/files/26WVybXyKzg7dkALU4Ck" alt=""><figcaption></figcaption></figure>

There can be different or the same productions within the same order. For example, you have a customer who ordered 5 dresses. Under this order, you will immediately see all 5 productions and their progress. The progress of the order will be the total percentage of readiness of each of the productions it includes.

**To open "Order View":**

1. Click on **"Production view"** button.
2. Choose **"Order View"**.
3. Expand all productions group by order.
4. Sort the displaying of productions.
5. Open **"More actions"** menu to manage the order.

   -Change order details\
   -Change client to the order

{% @arcade/embed flowId="53BSy9xuPJhPQ1mCjZT7" url="<https://app.arcade.software/share/53BSy9xuPJhPQ1mCjZT7>" %}

In **"More action"** menu you can also change order client. Change client for all production items in this order. All changes will be applied to its components as well.

{% hint style="info" %}
Changing the details of an order or a client works as bulk actions, i.e. changings will be applied to all productions with this order.
{% endhint %}
{% endtab %}

{% tab title="Product View" %}

### Producr view

***Product view*** shows all productions grouped by one product.

<figure><img src="/files/q0QO1Ny55O0UsdHeAXrh" alt=""><figcaption></figcaption></figure>

According to this view the system shows a list of all production items in alphabetical order A→Z, where productions of similar products (have the same product ID) are grouped together in one “grouped by product item”.

**To open "Production View":**

1. Click on **"Production view"** button.
2. Choose **"Production View"**.
3. Expand all productions group by order.
4. Click **"Show more"** to see all production grouped by product item.

{% @arcade/embed flowId="ay5WglrqsJj6BDoWOr1i" url="<https://app.arcade.software/share/ay5WglrqsJj6BDoWOr1i>" %}
{% endtab %}
{% endtabs %}


# Searching, sorting and filtering productions

This section covers how to use filters and sorting to easily find the production items you need.

## Overview

The Production page allows users to searching, sorting and filtering for all existing productions according to their preferences.

The main functions include filtering, sorting, and searching by production to help you manage your production efficiently.

By reading this article, learn how to navigate the Productions page, effectively search for productions by various criteria, and manage default filters and sorting settings to optimize your workflow.

### Basics

The "Production" page can be reached by clicking on the "Production" button on the sidebar menu of the application. By accessing the page,  you will be able to see all productions and search through all existing production to find the needed one.&#x20;

<figure><img src="/files/AXlcJ5blOexzgalxlFsF" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
If you don't see "Production" page, perhaps you don't have permissions
{% endhint %}

* Default filters and sorting setup:
  1. Sorting - Deadline -> oldest first ⬆️
  2. Filter - Responsible Department - My department *&* Estimated time & Production status
* When you re-open the page, the system returns the previously selected filters, sorting, and those settings in the dropdown with extra filters that were selected.
* Search input field should work with following properties:
  * By product name (product)
  * By production title
  * By order key
  * By production key
  * By external order number
  * By workflow name
  * By configuration name
  * By primary client name

{% hint style="info" %}
Combine different filters with each other and with a specific sort or search option.
{% endhint %}

## Sorting&#x20;

Use the 'Sort' dropdown to arrange the product list or search results in the order that's most relevant. Sorting option are following:

* **Created at** (Oldest first and Newest first)
* **Deadline** (Oldest first and Newest first)
* **Estimated time** (Shortest first and Longest first)
* **Order priority** (Lowest first and Highest first)
* **Progress** (Shortest first and Longest first)
* **Responsible** (from A-> Z and Z-> A)
* **Started at** (Oldest first and Newest first)
* **Status** (from A-> Z and Z-> A)

{% hint style="info" %}
By hovering on the "Sort" badge, you can fing out what sorting option and sorting order is enabled.
{% endhint %}

{% @arcade/embed flowId="jtie4MSCZ7yDd5QMlAXD" url="<https://app.arcade.software/share/jtie4MSCZ7yDd5QMlAXD>" %}

## Searching

To find the product, enter the product name into the search field.

{% @arcade/embed flowId="dLgWdWammxy7AR07uQOX" url="<https://app.arcade.software/share/dLgWdWammxy7AR07uQOX>" %}

{% hint style="warning" %}
The search results are shown according to the sorting option applied.
{% endhint %}

## Filtering

The filters allow to narrow down the search results. You can filter by various criteria, making it easier to find the products you need.&#x20;

<figure><img src="/files/8p6vGYZeo4LFyzlFK2FT" alt=""><figcaption></figcaption></figure>

Below is a list of filters by type that are available in the system.

### **Production**

* **Production status** - filtering by specific status. Filter show all production with this status, components and additional components.

{% @arcade/embed flowId="WzYDr0dxYphQ31J9yTEt" url="<https://app.arcade.software/share/WzYDr0dxYphQ31J9yTEt>" %}

* **Production priority** -  filtering by specific priority.

{% @arcade/embed flowId="3Y75QqKtaaMFsXAcrfrA" url="<https://app.arcade.software/share/3Y75QqKtaaMFsXAcrfrA>" %}

* **Production key**  -  filtering by specific production key. Components/additional components of the main production have their own production keys.

{% @arcade/embed flowId="yYqcezIRr0pk1ST8Idm0" url="<https://app.arcade.software/share/yYqcezIRr0pk1ST8Idm0>" %}

* **Issues** - filtering by specific issue/issues and 'No issue' option is available to find production that don't have a issue.

{% @arcade/embed flowId="zscuHW4Sb2biwIh1kSZq" url="<https://app.arcade.software/share/zscuHW4Sb2biwIh1kSZq>" %}

* **Source** - filtering by source where the order came from.

{% @arcade/embed flowId="k5BsPwj8VQ8Ab6LfuY3O" url="<https://app.arcade.software/share/k5BsPwj8VQ8Ab6LfuY3O>" %}

* **Task key** - filtering by task keys which has production.

{% @arcade/embed flowId="PCnpxwCc6Cje3loZCvFA" url="<https://app.arcade.software/share/PCnpxwCc6Cje3loZCvFA>" %}

### **Time**

* **Deadline -** filtering by specific deadline, corresponds to the number of days stated in the Product.
* **Estimated time -** filters by estimated time (in minutes) of main production (incl. time on component producing).
* **Creation date -** filtering by specific creation date, corresponds to the date when Production Item was created.
* **Started date -** filtering by  specific start date, corresponds to the date when Production Status was changed to “In progress”.
* **Completion date -** filtering by  specific completion date, corresponds to the date when Production Status was changed to “Done”.

{% @arcade/embed flowId="t7xMoibzxytdT3TnzDsl" url="<https://app.arcade.software/share/t7xMoibzxytdT3TnzDsl>" %}

### **People**

* **Responsible -** filtering by specific user who can be assigned as responsible on the main production or any component. There are two responsible default options for choosing:
  * Me
  * No responsible - shows all productions without responsible at all.

Or search for specific user.

{% @arcade/embed flowId="cEQ1rJ554VtvSiYzT8C1" url="<https://app.arcade.software/share/cEQ1rJ554VtvSiYzT8C1>" %}

* **Created by -** filtering by specific user who created Production Item.

{% @arcade/embed flowId="ekd54ttiK3rPEWDw45Dc" url="<https://app.arcade.software/share/ekd54ttiK3rPEWDw45Dc>" %}

* **Users assigned -** filtering by specific user assigned to the tasks at the moment. Filter shows production where specified user is assignee as performer.

{% @arcade/embed flowId="vRI5W6IMKMcSXkwDc91Z" url="<https://app.arcade.software/share/vRI5W6IMKMcSXkwDc91Z>" %}

#### **Order**

* **Client  -** filtering by specific value “Client” that was added in the field “Client” of the “New production” pop-up.
* **External order number -** filtering by specific External order number.
* **Marketplace order number  -** filtering by specific Marketplace order number.
* **Order key -** filtering by specific order key.
* **Order priority -** filtering by specific order priority.
* **Make to stock -** filtering by specific
* **Primary client -** filtering by specific primary client. “No primary client” checkbox list of all “primary client” names that exist in the system.

{% @arcade/embed flowId="a3BXExPppTJCp64FyDFQ" url="<https://app.arcade.software/share/a3BXExPppTJCp64FyDFQ>" %}

### **Department**

* **Responsible department -** filtering by specific responsible department. My department set as default.
* **Involved departments -** filtering by specific assigned users, who is working on the task.

### **Product**&#x20;

* **Product -**&#x66;iltering by specific product name.
* **Options -** filtering by specific parametrs, for example S/Silk.
* **Product type -** filtering by specific product type.
* **Vendor -** filtering by specific vendor in the productions.
* **Workflow name -** filtering by list of all workflow names that exist in the system.
* **Configuration name -** filtering by list of all configuration names that exist in the system.

### “All” and “No” Options in Filters

To make working with filters more efficient, we’ve added two new options — **“All”** and **“No”** — in all multi-select filters.

#### ✅ How It Works

**“All” Option**

Quickly select or deselect all available values.

* **Where:** Always at the top of the dropdown list.
* **When selected:**
  * All available values are selected.
  * Items with empty (null) values are excluded.
  * A chip “All” appears in the filter field.
* **When deselected:**
  * All values are cleared.
  * Empty values are included in the results.
  * Filter stays open for further selection.
* **Manual selection:**
  * Selecting/deselecting individual values unchecks “All.”

The filter updates results **dynamically** as values are selected.

***

#### **“No” Option**

These options help you quickly find data where a value is missing.&#x20;

* **Where:** Always at the top of the dropdown list after "All" option.
* **When selected:**
  * Items with empty (null) values are included.
  * A chip “No” appears in the filter field.
* **When deselected:**
  * “No” chips is cleared.
  * All values are included in the results.
  * Filter stays open for further selection.
* **Manual selection:**
  * Selecting/deselecting individual values unchecks “No”.

These options make it much easier to navigate and work with large amounts of data. Use the new options for even faster filtering 🎯


# Launching productions

## Overview

This page covers **all aspects related to production launch**, including the process of launching products, working with launched production items, and handling performers in the production process.&#x20;

You will learn how to create and configure products for launch, manage launched production items, and assign and track performers.&#x20;

By reading this article, learn how to launch production, manage its elements, and optimize the work of performers in the production process.

## Product Launching&#x20;

Working with productions is the most interesting thing. But first, the production needs to be launched.&#x20;

<figure><img src="/files/q7eWRKuJcIT4Mvuj9lcp" alt=""><figcaption><p>Product Launch modal window</p></figcaption></figure>

Production launch can happen in following ways:

* by pressing “In progress” status from “To do” on the production item
* by pressing Launch button in More actions menu on on the production item
* by pressing “Add and Launch” button on the “New production” pop-up
* by pressing “Start” button on a production workflow canvas
* by pressing “Status” icon on a production workflow canvas
* by pressing Launch button after multi select function

{% hint style="warning" %}
New production can be launched only for products/components with active items: product, version, configuration, workflow and variant.
{% endhint %}

**Let get closer to one of the way:**&#x20;

1. Open Production page.
2. Click on production status and change it from "To do" to "In progress".
3. In lauch modal window select following parametrs - version, configuration, variant, workflow, production method.
4. Select the same parametr for components.
5. Check your product before launchig.
6. Click on "Lauch" button for saving.

{% hint style="info" %}
The system selects the same variants for the components of the main production if they are identical.&#x20;

For example, for the S/Red main production and the S/Red component. And S/Red and Red/S will be considered different.
{% endhint %}

{% @arcade/embed flowId="HXD9SiiqJoGHOeET2j8e" url="<https://app.arcade.software/share/HXD9SiiqJoGHOeET2j8e>" %}

{% hint style="info" %}
By default, the latest published production version, the first configuration, and the first available workflow are pulled up.
{% endhint %}

**Let's consider other ways to lauch productions:**

* by pressing Launch button in More actions menu on on the production item

{% @arcade/embed flowId="NFRaQcYITEdKEYTpyYby" url="<https://app.arcade.software/share/NFRaQcYITEdKEYTpyYby>" %}

* by pressing “Add and Launch” button on the “New production” pop-up

{% @arcade/embed flowId="WqCj5MG9f3gPNwV3LuFz" url="<https://app.arcade.software/share/WqCj5MG9f3gPNwV3LuFz>" %}

* by pressing “Start” button on a production workflow canvas

{% @arcade/embed flowId="ElQ2rdYWK32hBLXUUE6V" url="<https://app.arcade.software/share/ElQ2rdYWK32hBLXUUE6V>" %}

* by pressing Launch button after multi select function

{% @arcade/embed flowId="exkEiYwQFsdGGyeTPTpm" url="<https://app.arcade.software/share/exkEiYwQFsdGGyeTPTpm>" %}

## Default info about launched production item

* Production in To do status and newly launched production always have 0% progress bar

<figure><img src="/files/lhX06jpJGHc8qVTrKvJv" alt=""><figcaption></figcaption></figure>

* A production progress bar has the same color as a status icon.

<figure><img src="/files/HQdeqnHnC1lJPpyDstEp" alt=""><figcaption></figcaption></figure>

* The progress bar formula (%): 100% / number of all tasks in production) \* number of tasks in Done/From stock/Canceled statuses (*include tasks inside components)*.

<figure><img src="/files/S8iKIVYcXxk3aKiD8ms9" alt=""><figcaption></figcaption></figure>

* The progress bar of a component is calculated according to the component's readiness and affects the progress bar of the entire production.

<figure><img src="/files/9amTS1gAr4NUZd74easm" alt=""><figcaption></figcaption></figure>

* By default, the production priority is medium and priority changes are not inherited by all components or tasks.&#x20;

<figure><img src="/files/mDlQ1KgEL3gzPS6d8Je9" alt=""><figcaption></figcaption></figure>

* By default, the order's priority is medium and changes in priority are followed by all production components.&#x20;

<figure><img src="/files/UykB6uSo25S9z1wvstSw" alt=""><figcaption></figcaption></figure>

* Hesh calculates and shows "Time spent" information on every press of Info button.

<figure><img src="/files/efUfcaZKjdg9S9JqQHjO" alt=""><figcaption></figcaption></figure>

Learn more about each part of the Hesh functionality in the articles ahead...


# Bulk actions with productions

## Overview

The **Bulk Actions feature** on the Production page allows users to manage multiple productions at once. You can perform actions such as printing QR codes, starting multiple productions, managing components for several productions, managing tags and dates, or deleting productions.

By reading this article, learn how to use bulk actions to simplify your production management tasks, including starting, editing, and deleting multiple productions.

## Basics

Bulk actions that can be performed with production items:

* QR-codes print
* Launch
* Assing managers
* Manage components
* Manage tags
* Manage dates
* Delete

<figure><img src="/files/Xw7jZeUCdWKh1i1vDySk" alt=""><figcaption></figcaption></figure>

### Open bulk actions

To activate bulk actions:&#x20;

1. Open the production page&#x20;
2. Click "Select" button
3. Select one production or more productions

<figure><img src="/files/SkNmKBiFTQ247aJIDEz3" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Bulk actions can be applied for all views - order, plane, product.
{% endhint %}

### Open bulk actions in order view&#x20;

In this case selection works with the production connected to the order.&#x20;

<figure><img src="/files/CFI9jLK2HFDPKZquOEbB" alt=""><figcaption></figcaption></figure>

If it's necessary to choose all productions all productions within one order, expand the whole order and click "Select".

{% @arcade/embed flowId="sxHQRJOanbrWLlftMqD1" url="<https://app.arcade.software/share/sxHQRJOanbrWLlftMqD1>" %}

{% hint style="danger" %}
If you do not expand the order, the "Select" is not available
{% endhint %}

### Open bulk actions in product view

The rules for working with bulk actions in Product View are the same as those in Order View.

<figure><img src="/files/bTXed3X6vHuTE3oN220Z" alt=""><figcaption></figcaption></figure>

For more info about page views visit [Production page views article](/manuals/production/production-page/production-page-view-options).

### Bulk launch

1. Select productions that must be lauched
2. Click the "Launch" button

<figure><img src="/files/nMDguquFxLTuvjBrUIUC" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Only main productions in "To do" status can be launched at once. "Unknown product" can't be launched.
{% endhint %}

### Print QR codes

1. Select productions
2. Click on the "Print labels" button in the top pane (or you can click on the "More action" menu opposite the selected product)
3. Then to print or save the labels in PDF format

<figure><img src="/files/reEy4qQUR7gW5Pq8f6c7" alt=""><figcaption></figcaption></figure>

### **Assign managers**

1. Choose productions for assigning the manager.
2. Click on the "Assign manager" button.
3. Choose available user from list.

<figure><img src="/files/jkmESb7UXyh7zps6bkjo" alt=""><figcaption></figcaption></figure>

In the same way through this functionality manager can be unassigned from the productions. Below are the instructions how to do it.

### **Unassign managers**

1. Choose productions where responsible manager must be unassigned
2. Click on the responsible icon with user
3. In the list  choose "Unassigned" option

<figure><img src="/files/y0iW44tWEMHtjbFy0t8z" alt=""><figcaption></figcaption></figure>

### **Manage components**

#### Components can be moved :

* Within one production
* Between different productions

<figure><img src="/files/BdzmgScA1e4lHPJ7buV0" alt=""><figcaption></figcaption></figure>

For more info visit [Components management](/manuals/production/production-management/components-management) article.

### **Manage tags**

1. Choose productions for adding tags
2. Click on the "Manage tags" button
3. Choose available tags from list or add new one
4. Click "Apply" for saving changes

{% @arcade/embed flowId="eqFd3BSZnsqmHVSmBJTh" url="<https://app.arcade.software/share/eqFd3BSZnsqmHVSmBJTh>" %}

> In the tags modal window:
>
> 1. Tags that are present in all selected productions have a ✅.
> 2. Tags that are present in only some of the selected productions have a “-“ symbol (partial application).
> 3. Tags that are not present in any of the selected productions are not highlighted.

### **Manage dates**

1. Select productions you want to update.
2. Click "**Manage dates"**.
3. Choose the date types you want to change (Deadline / Planned start date / Shipping deadline).
4. Click **"Manage"**.
5. In the modal window set new date(s) for all selected production.
6. Check/uncheck option to **Apply** to nested components + additional components.
7. Click "**Apply**" for saving changes.
8. Review and **Apply** the changes in the confirmation window.

{% hint style="warning" %}
Updated dates are highlighted in **orange**.

* You cannot update productions with status **Cancelled** or **Done**.
* A nested production cannot have a deadline later than its parent.
* Failed items are listed in the summary.
  {% endhint %}

{% embed url="<https://services-servicess-workspace.share.arcade.software/share/HM2i8Cmzv4zpmLre67k2>" %}

### **Delete**

1. Select productions
2. Click "Delete" button&#x20;

{% hint style="warning" %}
Only main production items that are in "To do" status can be deleted.
{% endhint %}

<figure><img src="/files/NqXgm5kfYnpkU30egmj4" alt=""><figcaption></figcaption></figure>

It is **not** possible to delete a running production, it can only be **Stopped** or **Canceled**. \
But be careful, it is impossible to undo the cancellation.


# Production management

## Launched Production Items&#x20;

<figure><img src="/files/lsHl9gWlthGWpuLnEzAN" alt=""><figcaption></figcaption></figure>

## Performers Processing in Production&#x20;


# Statuses

This page lists all the statuses of the production item and explains how to update the status

## Overview

Production status indicates on which stage of the production cycle the manufacture of the certain product is.

<figure><img src="/files/EW5kMgFpDahtgkVtKq3K" alt=""><figcaption><p>Production statuses</p></figcaption></figure>

## The default statuses are: <a href="#h_117618cf41" id="h_117618cf41"></a>

* **To do -** initial status for new production. No tasks have been started as production isn't launched yet&#x20;
* **In progress** - indicates that production has been launched and tasks are actively being worked on
* **Stopped** - production was paused, therefore no one is working on the tasks right now
* **From stock** - no tasks in the production, as the product was taken from existing stock, ready for processing
* **Done** - production is completed, all tasks are finished
* **Canceled -** production has been halted, and no further actions will be taken on this item

## Actions based on status:

### To do

* Can be changed to "In progress" or "Canceled."&#x20;
* Can be deleted.

<figure><img src="/files/hTlDuVYtgcSDpRsXsHhA" alt=""><figcaption><p>"To do" status</p></figcaption></figure>

### In progress

* Can be changed to "Stopped" or "Canceled."&#x20;

<figure><img src="/files/2XcE5PfzfJyl3IKMLsJO" alt=""><figcaption><p>"In progress" status</p></figcaption></figure>

### **Stopped**&#x20;

* Can be resumed by changing to "In progress" or "Canceled".&#x20;
* A confirmation modal will appear to ensure you want to stop production.

<figure><img src="/files/kKP8qskJCZL7n8ewKyxc" alt=""><figcaption><p>"Stopped" status</p></figcaption></figure>

### From stock

* Can be transitioned to "In progress" or "Canceled."&#x20;
* This allows you to start production or halt it based on stock availability.

<figure><img src="/files/wTKE9QXG94u2hvnxpiIl" alt=""><figcaption><p>"From stock" status</p></figcaption></figure>

### Done

* This status is obtained once the last task in the production is finished; no further actions can be taken other than viewing details.&#x20;

{% hint style="info" %}
System shows when the product obtained "Done" status by hovering over the status icon.
{% endhint %}

<figure><img src="/files/SYOTj5X64VN3op2lQeJt" alt=""><figcaption><p>"Done" status</p></figcaption></figure>

### Canceled

* This status is also final; it cannot be undone. Use this status if client change or cancel the order at all.&#x20;

{% hint style="info" %}
System shows when the product obtained "Canceled" status by hovering over the status icon.
{% endhint %}

<figure><img src="/files/CCTvLQGSfjZJpTZTlxBb" alt=""><figcaption><p>"Canceled" status</p></figcaption></figure>

## Changing a production's status <a href="#h_9691e03d7d" id="h_9691e03d7d"></a>

<figure><img src="/files/a3Ijn1Eyb6a6y96xRe9l" alt=""><figcaption><p>Schema of status transaction </p></figcaption></figure>

#### To change status of production:

1. Go to Production or Production workflow page
2. Click on the status icon
3. Select a status from the dropdown

{% @arcade/embed flowId="ZPI8AY6JO6Z5VxG45MYQ" url="<https://app.arcade.software/share/ZPI8AY6JO6Z5VxG45MYQ>" %}


# Progress bar

How to understand the overall progress of the product's production cycle

## Overview

The progress bar shows how ready the product is, helping you see if production is on schedule and identify potential delays.

<figure><img src="/files/Q0Zdh3Xu7actHzNrtbni" alt=""><figcaption><p>Progress of manufacturing of different products</p></figcaption></figure>

## Specifics

### Visual aspect:

The progress bar visually represents production status, with values ranging from 0% to 100%. It is designed to match the color of the status icon for a cohesive look.

### Calculation formula:

The progress percentage is calculated based on completed tasks within the production workflow (including tasks from child and additional components).

{% hint style="info" %}
Progress (%) = (100% / Total Tasks) \* Completed Tasks
{% endhint %}

A production progress bar can have values ranging from 0 to 100%.

### Progress updates

The progress bar updates automatically based on specific events, such as

* child component status change
* task status change
* reopening task&#x20;
* adding additional task&#x20;
* adding additional component

### Status specifics

* Productions marked as "To do" have a progress bar set to 0%.&#x20;
* Productions labeled "In progress" with no completed tasks also have a progress bar set to 0%.
* Productions in "Stopped" status display the executed percentage from before they reached this status.&#x20;
* Productions categorized as "From stock" always have a progress bar set to 100%.

<figure><img src="/files/hOgEzkWHyj0PMHNunE1Q" alt=""><figcaption><p>Progress bar depending on status</p></figcaption></figure>

### Order progress calculations

When viewing productions grouped by order items, the progress is calculated according to formula:

{% hint style="info" %}
Order progress (%) = sum of of progress values of all productions in this order / number of productions in the order
{% endhint %}

<figure><img src="/files/40c4s5cgnv5Z1wJ1WrXH" alt=""><figcaption><p>Progress of whole order</p></figcaption></figure>


# Production details editing

This article offers detailed instructions on how to edit key production attributes, including order, product and time details

## Overview

This article provides an in-depth guide on editing production attributes. Understanding how to manage these attributes is crucial for users who wish to maintain accurate and flexible production data.&#x20;

By reading this article, you'll gain a thorough understanding of each attribute that can be edited and detailed instructions to enhance your important production details in ongoing production.

<figure><img src="/files/xQMtRDOH7qDd36y9zIgn" alt=""><figcaption></figcaption></figure>

## Key attributes that can be edited

## "Order" section

### Order key/ External order number/ Marketplace order number&#x20;

{% hint style="warning" %}
**Notice**:

* If the production includes components, any changes made will also be applied to those components.
* The order details associated with the following attributes - "Order key," "External order number," and "Marketplace order number"- will be updated accordingly based on the attribute that was modified.
* To apply this change across all productions associated with the specified order details, check the "Apply this change to all productions" checkbox.
  {% endhint %}

**How to edit**:

1. Navigate to the Production or Production workflow page
2. Click on the "Change order" in “More actions” menu or hover over the :pencil2: button next to the external order number value on the "Info" pop-up
3. Select an existing in the corresponding field on the "Change order for production" pop-up
4. Click "Save" button to save the changes

{% @arcade/embed flowId="RZWgkhQDTKyYMEOeop1j" url="<https://app.arcade.software/share/RZWgkhQDTKyYMEOeop1j>" %}

{% hint style="info" %}
Сhanges will be reflected on the "Info" pop-up and in mobile app accordingly.&#x20;
{% endhint %}

### Client

**How to edit**:

1. Navigate to the Production or Production workflow page
2. Click on the "Edit order client" in “More actions” menu or hover over the :pencil2: button next to the client value on the "Info" pop-up
3. Select an existing value in the corresponding field of the "Edit client info" pop-up
   1. Add new value
4. Click "Save" button to save the changes

{% @arcade/embed flowId="8a2mYOKBP8eo4LldzfQl" url="<https://app.arcade.software/share/8a2mYOKBP8eo4LldzfQl>" %}

{% hint style="info" %}
Сhanges will be reflected on the "Info" pop-up and in mobile app accordingly.&#x20;
{% endhint %}

## "Product" section

### **Variant**

{% hint style="warning" %}
**Notice:**

* If the production includes components, tick the **"Apply this change to its components" checkbox** to update the variant for those components as well.
* If the production has tasks with a bonus linked to the variant, the system will automatically adjust the bonus value accordingly.
  {% endhint %}

**How to edit**:

1. Navigate to the Production or Production workflow page
2. Click on the "Edit variant" in “More actions” menu or hover over the :pencil2: button next to the variant value on the "Info" pop-up
3. Select the value in the corresponding field of the "Edit product variant" pop-up
4. Click "Save" button to save the changes

{% @arcade/embed flowId="QnmyQQiHsY1dpWaO8kBt" url="<https://app.arcade.software/share/QnmyQQiHsY1dpWaO8kBt>" %}

{% hint style="info" %}
Сhanges will be reflected on the "Info" pop-up and in mobile app accordingly.&#x20;
{% endhint %}

### **Configuration**

{% hint style="warning" %}
**Notice:**

* The configuration itself remains unchanged; only a note indicating that it has been modified is provided for user awareness. Any changes will be visible in the "Info" pop-up and will also be reflected in the mobile app.
  {% endhint %}

**How to edit**:

1. Navigate to the Production or Production workflow page
2. Click on the :pencil2: button next to the configuration value on the "Info" pop-up
3. Enter the coment into the "Note" field
4. Click :heavy\_check\_mark: button to save the changes

{% @arcade/embed flowId="Rx1NltQ1hhm5ZW8hWsak" url="<https://app.arcade.software/share/Rx1NltQ1hhm5ZW8hWsak>" %}

{% hint style="info" %}
Сhanges will be reflected on the "Info" pop-up and in mobile app accordingly.&#x20;
{% endhint %}

## "Time" section

### **Deadline**

{% hint style="warning" %}
**Notice:**

* If the production includes components, the deadline for those components cannot be set to an earlier date.
  {% endhint %}

**How to edit:**

1. Navigate to the Production or Production workflow page
2. Click on the :pencil2: button next to the deadline on the "Info" pop-up
3. Choose new date in date picker.
4. Click **"**&#x4F;&#x6B;**"** button to save changes

{% @arcade/embed flowId="COVEDXVChyVvPM8UB0x4" url="<https://app.arcade.software/share/COVEDXVChyVvPM8UB0x4>" %}

{% hint style="info" %}
Сhanges will be reflected on the "Info" pop-up and in mobile app accordingly.
{% endhint %}

## Production icon and attachments

#### **Uploading more images to Production**

1. Open the *Production page*.
2. Click the production photo to open the **Upload photo** modal.
3. Click ⬆️ to upload a new image.
4. The updated icon appears in the list of Production attachments.

{% hint style="info" %}
On the **Upload photo** modal window there are also photos attached to products. These photos can NOT be deleted from this page.
{% endhint %}

#### Changing the Main Production Icon

1. Open the *Production page*.
2. Click the production photo to open the **Upload photo** modal.
3. Click ⬆️ to upload a new image or click on the image in the list of Production attachments.
4. Click "**Apply to production**".

{% embed url="<https://services-servicess-workspace.share.arcade.software/share/QCg4Jq04EMh7pnLQoqlp>" %}

#### **Uploading files to Production**

1. Open the **Upload photo** modal for a specific production item.
2. Select any supported file: **.pdf, .docx, .xls, .plt, .obj** (up to **25 MB**).
3. After upload, the file appears in the **Production files** section.
4. Files become automatically available in all workflow tasks (web and mobile).

{% hint style="info" %}
**Notes:**

* 📝 Only users with *Production edit* permission can upload files.
* 📝 Files uploaded to Production **do NOT** become Product files.
* 📝 There is no limit to how many files you can add.
* 📝 If a file exceeds 25 MB, the upload is blocked and a **“Too big file size”** notification appears.
  {% endhint %}

{% embed url="<https://services-servicess-workspace.share.arcade.software/share/KGX0HN2EhtMvWlFk1zHC>" %}

## Things to note <a href="#h_fabf17e66d" id="h_fabf17e66d"></a>

* Users can only edit attributes if productions are not in finished (i.e., not "Done" or "Canceled" statuses).
* Changes to main production attributes will reflect across all connected child productions, ensuring that data remains consistent.
* Changes made within HESH do not impact data in external systems. Always verify with integrated platforms to maintain data accuracy.<br>


# Components management

This page offers a thorough overview of the "Manage Components" feature and provides detailed guidance on managing ongoing production cycles.

## Overview

The "Manage components" feature allows you to handle issues that arise during the production process. By reading this article, you will gain insights into best practices, key features, and tips for optimizing your ongoing or finished production cycles.

<figure><img src="/files/BB3QNgJJIJ2JzDCVG1dO" alt=""><figcaption></figcaption></figure>

## Use cases

### Changing components' places within a single production

1. Select the production&#x20;
2. Click the "Manage components" button
3. Drag "component A" to the position of the "component B"
4. Click "Save" button to save changes
5. Click "Apply" button to confirm changes&#x20;

{% hint style="warning" %}
Components changed places on the canvas.
{% endhint %}

{% @arcade/embed flowId="hsqly0kpRkin2Iy88NmY" url="<https://app.arcade.software/share/hsqly0kpRkin2Iy88NmY>" %}

### Adding additional component to a production

1. Select the production&#x20;
2. Click the "Manage components" button
3. Click "Add new one" button to select component
4. Select component
5. Click "Add" button to add component
6. Click "Save" button to save changes
7. Click "Apply" button to confirm changes&#x20;

{% hint style="warning" %}
The progress of the production to which a component was added is recalculated.
{% endhint %}

{% @arcade/embed flowId="B7brGneUo2zPPQFavsDB" url="<https://app.arcade.software/share/B7brGneUo2zPPQFavsDB>" %}

### Moving component out of the production

1. Select the production&#x20;
2. Click the "Manage components" button
3. Drag component you want to move
4. Drop the component to the "Drop here to move component out of the production" area
5. Click "Save" button to save changes
6. Click "Apply" button to confirm changes

{% hint style="warning" %}
The progress of the production from which a component was moved is recalculated.
{% endhint %}

{% @arcade/embed flowId="E0m1xmvBH1pHiUmptXvU" url="<https://app.arcade.software/share/E0m1xmvBH1pHiUmptXvU>" %}

### Switching components between productions

1. Select productions&#x20;
2. Click the "Manage components" button
3. Drag "component A" from "production A"
4. Drop the "component A" to the position of the "component B"
5. Click "Save" button to save changes
6. Click "Apply" button to confirm changes

{% hint style="warning" %}
The progress of the main productions is recalculated, and the order details of the switched components are changed to reflect order details of their new main productions.
{% endhint %}

{% @arcade/embed flowId="KVlWSKPMXOPSemnTmweu" url="<https://app.arcade.software/share/KVlWSKPMXOPSemnTmweu>" %}

### Replacing component with a new one

1. Select the production&#x20;
2. Click the "Manage components" button
3. Drag component you want move to the "Drop here to move component out of the production" area
4. Click "Add new one" button to select component replacement&#x20;
5. Click "Add" button to add component
6. Click "Save" button to save changes
7. Click "Apply" button to confirm changes&#x20;

{% hint style="warning" %}
The progress of the production from which a component was moved is recalculated.
{% endhint %}

{% @arcade/embed flowId="Gyv08qunBy0QcGDtMDA0" url="<https://app.arcade.software/share/Gyv08qunBy0QcGDtMDA0>" %}

## Managing components in finished productions

{% hint style="danger" %}
Users can add components with "To do" or "In progress" statuses to the "Additional components" container of a main production that is marked as either "Done" or "From stock."
{% endhint %}

### Adding additional component to "Done" production

1. Select production with "Done" status
2. Click the "Manage components" button
3. Click "Add new one" button&#x20;
4. Select component you want to add
5. Click "Add" button to add component
6. Click "Save" button to save changes
7. Click "Apply" button to confirm changes&#x20;

{% hint style="warning" %}
The **status of the "Done" production** to which an additional component has been added **changes** to **"In Progress"** and the **progress is recalculated** as soon as work on the additional component begins.
{% endhint %}

{% @arcade/embed flowId="IRLK2n0oIBd7MKvP6zOR" url="<https://app.arcade.software/share/IRLK2n0oIBd7MKvP6zOR>" %}

{% hint style="info" %}
Additional component also can be added from the Production workflow canvas page.
{% endhint %}

{% @arcade/embed flowId="dYyuQw1EJZWoDs7NsK6u" url="<https://app.arcade.software/share/dYyuQw1EJZWoDs7NsK6u>" %}

### Moving a component to the "Additional components" section of a production in "From stock" status

1. Select production with "From stock" status
2. Select production from which you want to move component
3. Click the "Manage components" button
4. Drag component you want to move to the "Additional components" section of a production with "From stock" status
5. Click "Save" button to save changes
6. Click "Apply" button to confirm changes

{% hint style="warning" %}
The **status of the "From stock" production** to which an additional component has been moved remains unchanged, but the **progress is recalculated**.
{% endhint %}

{% @arcade/embed flowId="77Nd2OcJdRUvRwMIIcuq" url="<https://app.arcade.software/share/77Nd2OcJdRUvRwMIIcuq>" %}

## Viewing the history record of components management

For each main production where components have been changed, the system maintains a history record by leaving notes about newly added or removed components. To view, follow the steps:

1. Open "Info" pop-up&#x20;
2. Click on the "Components history" button

{% @arcade/embed flowId="34crRDnJNx2pQiadKWei" url="<https://app.arcade.software/share/34crRDnJNx2pQiadKWei>" %}

## Things to note <a href="#h_fabf17e66d" id="h_fabf17e66d"></a>

* Addional components can be added to existing productions only: You can’t add components in workflow templates.
* &#x20;Replaced components keep their previous statuses intact.
* Dragging an item from one production to another makes it inherit the new production’s order details.


# Tags

This page covers how to use tags to organize productions

## Overview

The **"Tags" feature** is designed to help you effectively manage tags within production items. Tags serve as a powerful tool for internal communication and organization, allowing you to categorize and identify production items easily.&#x20;

The **"Tags" feature** allows users to create, edit, and manage tags associated with production items. Only users with specific permissions can perform certain actions, ensuring that tags are secured and organized.

<figure><img src="/files/GfOI8a2znuP7uQFgjn0E" alt=""><figcaption><p>Production item with tags</p></figcaption></figure>

## Basics

**Tags management**:&#x20;

* Only users with **Admin** can add, delete and update tags in the system.&#x20;
* Only user with **"Mange tags"  permission** can view, attach and remove tags from productions.
* Only user with **"View production tags"  permission** can view tags in mobile application.

**Tag visibility**:&#x20;

* Tags are displayed on various pages - Production, Production workflow and Tasks pages

## Use cases

### Adding a tag to the system

1. Open the "Manage tags" modal&#x20;
2. Click on the **“Add Tag”** button
3. Enter a unique name for the tag
4. Choose a color for the tag (optional)
5. Click **“Save”**

{% embed url="<https://app.arcade.software/share/o9gC3pfRUveQnFuI00DI>" %}

### Editing a tag

1. Open the "Manage tags" modal
2. Click the **✏️** icon next to the tag you wish to edit&#x20;
3. Modify the tag name or color as needed
4. Click **“Save”**

{% hint style="warning" %}
The changes will be reflected across all production items that use this tag.
{% endhint %}

{% embed url="<https://app.arcade.software/share/cOTbqGbo1ZuubZfKzXcC>" %}

### Deleting a tag

1. Click the **✏️** icon next to the tag you wish to delete
2. Click the **“Delete”** button
3. Confirm the deletion in the pop-up modal

{% hint style="warning" %}
The tag will be removed from all associated production items and from the system.
{% endhint %}

{% embed url="<https://app.arcade.software/share/UO6tLS3Ql3VrHbroi7ew>" %}

### **Attaching a tag to production items**

1. Open the "Manage tags" modal
2. Tick the checkbox next to the tag you wish to attach to the production item
   1. Click on the tag

{% embed url="<https://app.arcade.software/share/aZvqzknOacGjd1dF7Hp6>" %}

### **Removing tags from production items**

1. Open the "Manage tags" modal
2. Untick the box next to the tag you wish to remove
   1. Click on the tag

{% embed url="<https://app.arcade.software/share/DdgNBvRsMHRkiP2y7dda>" %}

### Filtering productions by tags

1. Use "Tag" filter on the filter panel
2. Select a tag&#x20;

{% embed url="<https://app.arcade.software/share/9rmm8f5JQDkzfa8rWsQH>" %}


# Warnings

This page provides a comprehensive overview of all issue types and offers detailed guidance on how to resolve them

## Overview

The "Issues and warnings" feature helps quickly identify and address potential problems within production workflows. Using this feature, you can filter issues by their type and troubleshoot common warnings.

<figure><img src="/files/RPZrD9apLf5OVrLLOkB5" alt=""><figcaption><p>Issues</p></figcaption></figure>

## View issues <a href="#warningsinadvancedroadmaps-viewthewarningcenter" id="warningsinadvancedroadmaps-viewthewarningcenter"></a>

Once you reached the Production or Production worfklow page, you can view productions that have issues &#x20;

{% embed url="<https://app.arcade.software/share/rcJhFb3qJ0hodLsTDQZu>" %}
View productions with warning icons
{% endembed %}

## Issues types

* **Undefined product**

Occurs when a product is added automatically from the external system via API and there is no record about the product with such barcode in the system.&#x20;

<figure><img src="/files/qaGzHkhbUknNf9X9zer0" alt=""><figcaption><p><strong>Undefined product</strong></p></figcaption></figure>

To resolve this, add a missing barcode to a product variant and publish this product, then the system will update automatically the production item info and turn off the Undefined product state for the updated item.

* **Production deadline expired**

Occurs when a production item's deadline has been reached.&#x20;

<figure><img src="/files/jmUrLO859XjicfvJNRPM" alt=""><figcaption><p><strong>Production deadline expired</strong></p></figcaption></figure>

To address this, you can either [update the deadline](/manuals/production/production-management/production-details-editing) or keep it unchanged. This warning serves to inform you that product readiness may be impacted.

* **Issues in nested components**

Identifies problems in production components that are part of a larger production workflow.

<figure><img src="/files/9HxEgbjlvq8w5jjSzFu5" alt=""><figcaption><p><strong>Issues in nested components</strong></p></figcaption></figure>

To resolve this, you'll need to expand the production to identify the issue with the nested production.

* **Task time limit exceeded**

Occurs when a task has surpassed its allocated execution time.

<figure><img src="/files/yEPGi0GPKflVFvhXZXAh" alt=""><figcaption><p><strong>Task time limit exceeded</strong></p></figcaption></figure>

To resolve this, open the workflow, find the task and take the necessary actions.

* **Manual assignment for a task required**

Occurs when a task requires performers to be assigned.

<figure><img src="/files/9TKixFFIdybqiyKSJRly" alt=""><figcaption><p><strong>Manual assignment for a task is required</strong></p></figcaption></figure>

&#x20;  To resolve this, open the workflow, find the task and assign the performer.

## Filtering productions by issues

Users can filter production items based on specific issues, making it easier to manage workflows. To do so:

1. Open Production page
2. Click on the "Issues" filter
3. Select the issue type in the filter

{% embed url="<https://app.arcade.software/share/9pojbWKyqv84rUXdFtAJ>" %}
"Issues" filter
{% endembed %}

Clicking on the issue counter at the top of the production page will filter the view to show only items with issues.

{% embed url="<https://app.arcade.software/share/wORolzBqbPj5xbV8v90x>" %}
"Issues" counter
{% endembed %}


# Production workflow


# Canvas

## Overview

The **Production Workflow Page** provides a visual overview of the production process. It displays tasks, their statuses, assigned users, deadlines, and dependencies in a clear workflow layout.&#x20;

The page allows users to manage tasks, view progress, view cost for qhole prodcution, manage in queue and update task statuses. Key components include task cards, production details in the header (client, product info, deadlines, etc.), and the ability to monitor additional tasks or components. Intuitive navigation and action buttons make it easy to track and manage complex workflows.

## **Detailed Elements and Key Actions on the Production Workflow Page**

### **Header Section**

* **Breadcrumb Navigation:** Quickly return to the main Production or parent pages.
* **Production Details:** Displays key information like production ID, product name, client, deadline, and overall progress bar.
* **Action Buttons:** Includes "More action" menu, "Info," and more for quick production-level actions.

<figure><img src="/files/g793sOOneDVaPiML0nRd" alt=""><figcaption></figcaption></figure>

### **Workflow Area**

* **Task Cards:** Each card represents a task with attributes such as:
  * Assigned users (avatars displayed).
  * Task name and progress status (e.g., *To Do*, *In Progress*, *Done*).
  * Task due date.
  * Dependency connections between tasks.
* **Components/Additional Tasks:** Shown at the bottom, allowing for efficient management of nested or related tasks.
* **Action Buttons:** "Manage Failed Tasks"
* **Zoom and Layout Options:** Customise the view for better workflow navigation.
* **Roll-back Events:**  Specify who added the task, when, and showing the reason for adding it with a message hierarchy

<figure><img src="/files/cKdCoch5HzfFKq0XUERs" alt=""><figcaption></figcaption></figure>

## **Key Actions**

### **Launch production:** Launch production directly from canvas

* Click on production progress bar
* Click  on "Start" and launch production

{% @arcade/embed flowId="qQLp2A2CAWldIUy1wITJ" url="<https://app.arcade.software/share/qQLp2A2CAWldIUy1wITJ>" %}

### **Change Production, Component or Task Status**

Update a task's state (e.g., from *In Progress* to *Done*) and update in queue state.

{% @arcade/embed flowId="9uVM8SA0p8Qhjx6xOHmA" url="<https://app.arcade.software/share/9uVM8SA0p8Qhjx6xOHmA>" %}

### **Assign/Unassign Users**&#x20;

Manage who is responsible for each task and component.

{% @arcade/embed flowId="38oUbhUhmr7Ks0RmYJn5" url="<https://app.arcade.software/share/38oUbhUhmr7Ks0RmYJn5>" %}

### **Set /** Edit **due date for Task**

Set the task due date on the canvas at once without opening the task.

1. Click on the “**Due date**” icon for the task in the upper right corner.
2. Choose the Task due date via date-picker.
3. Click "**OK**" to save changes.

{% hint style="danger" %}
Make sure that task deadline doesn't exceed the production deadline
{% endhint %}

{% embed url="<https://services-servicess-workspace.share.arcade.software/share/qrSAh3iRaWzx17vwPR7M>" %}

### Delete **due date for Task**

Delete the task due date on the canvas at once without opening the task.

1. Find the specific Task.
2. Click on the **X** on the right of “**Due date**” icon for the task to delete the Task due date.

{% @arcade/embed flowId="HQtpt2EHfTUKmr4QytaX" url="<https://app.arcade.software/share/HQtpt2EHfTUKmr4QytaX>" %}

### **View Details**&#x20;

Expand tasks or components to see more detailed information about each item. Assign a performer, change the responsible type, start or cancel a task, and much more. \
More about Task management[ find here](/manuals/production/production-workflow/task-management-on-canvas).

{% @arcade/embed flowId="WSfXrE9u8vVJ8817GRpe" url="<https://app.arcade.software/share/WSfXrE9u8vVJ8817GRpe>" %}

{% hint style="info" %}
If a component was taken from the warehouse, there is no way to see its task. But you can also start its production, if necessary.
{% endhint %}

### **Add additional tasks or components**&#x20;

Add additional task or component to existing workflow. By these functionality, it is possible to cover scenarios when it is necessary to add tasks to a launched production.

All additional tasks and tasks of the additional component are taken into account in the total of the progress bar. More about progress bar [here](/manuals/production/production-management/progress-bar).

{% @arcade/embed flowId="dLcK0fAMbx8WEAUALhOK" url="<https://app.arcade.software/share/dLcK0fAMbx8WEAUALhOK>" %}

{% hint style="info" %}
&#x20;It is also possible to add additional tasks and components to the finished production. The progress bar of production item will be recalculated accordingly.
{% endhint %}

So this page provides intuitive controls for managing complex production workflows seamlessly!


# Task management on canvas

## Overview

This article will tell more about the statuses of tasks, components, and the order in which operations are triggered. Learn which permissions allow to manage tasks at certain levels, how to configure them correctly and what connection between tasks statuses and production.

## Main features

* Management production and statuses: To Do, Reopened, In Progress, On-Hold, Blocked, Done, Canceled
* Change the status to another one for certain sets of permissions
* Management of the "In queue" functionality
* More action in production

<figure><img src="/files/YZD2S0ldRbdEhUbmMTkq" alt=""><figcaption></figcaption></figure>

### Production status management

<figure><img src="/files/JNzpvSy0SaBem2ufCeCw" alt=""><figcaption></figcaption></figure>

After the launch, production can be switched to two statuses: ***Stopped*** and ***Canceled***.

* **Stopped status**

If a production item is ***Stopped***, the system highlights the task links in red on the canvas, indicating that production is stopped.&#x20;

<figure><img src="/files/fhNzXZDIm5BCpgzemBrB" alt=""><figcaption></figcaption></figure>

When the performer completes the last task that was unlocked for execution or the manager changes its status to “Completed” or “Canceled”, the system does not unlock the next task until the production moves to the “In progress” state.

<figure><img src="/files/OSnbVnzO6c3b64jUixim" alt=""><figcaption></figcaption></figure>

* **Canceled status**

If a production item is ***Canceled***, the system cancels all components, tasks within components, and all production tasks. And makes the bar 100% complete with progress.

<figure><img src="/files/B0nHC2dWqOGTa8EhKZQg" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}
The ***Canceled*** status cannot be undone.&#x20;
{% endhint %}

When the performer hovers over the status, the system shows hint when the production was canceled.

<figure><img src="/files/85vYrRbhgnoJytMHUE7Y" alt=""><figcaption></figcaption></figure>

### Task status management

Users can switch task statuses at any time till the task is done, including when a task is in “In queue” state. The set of following statuses depends on the status in which the task is currently.

{% hint style="warning" %}
Changing task statuses also depends on user permissions.&#x20;
{% endhint %}

In this article, all examples and use cases are presented from a user who has all permissions. More about permissions read [in this article](/manuals/users/permissions).

#### 1. Transitions from the To do status

<figure><img src="/files/uqL0vJsQvUYkrRqBnlEC" alt=""><figcaption></figcaption></figure>

A task can be transferred from the ***To do*** status to the following statuses:

* ***In progress*** - user starts the task in the application or the manager changes the status. The system starts a timer and adds user to reward table.
* ***Blocked*** - user or manager changes the status to Blocked. The system pauses the timer and blocks the task for the user.
* ***On hold*** - user stops the task tracker or the manager changes the status to On hold or clicks on the pause icon on the task control panel.
* ***Reopened*** - if the task was closed and needs to be reopened, the manager can change the status to Reopened.
* ***Canceled*** - manager changes the status to Canceled. The system immediately stops the timer, blocks user's task, updates the progress bar, and adds an data to tooltip. The task is skipped in the production process.

#### 2. Transitions from the In progress status

<figure><img src="/files/ubFGB1A4KZe7mHxvxKp4" alt=""><figcaption></figcaption></figure>

From the In progress status, a task can be transferred to the following statuses:

* ***Done*** - user completes the task or the manager changes the status to Done. The system stops the timer, updates the status of the production item, and update user data in the reward table.
* ***Blocked*** - user or manager changes the status to Blocked. The system pauses the timer and blocks the task for the user.
* ***On hold*** - user stops the task tracker or the manager changes the status to On hold or clicks on the pause icon on the task control panel.
* ***Canceled*** - manager changes the status to Canceled. The system immediately stops the timer, blocks user's task, updates the progress bar, and adds an data to tooltip. The task is skipped in the production process.

#### 3. Transitions from the Blocked status

<figure><img src="/files/UDyokK9Mf7Z9ixNQOujn" alt=""><figcaption></figcaption></figure>

From the Blocked status, a task can be transferred to the following statuses:

* ***On hold*** - user stops the task tracker or the manager changes the status to On hold or clicks on the pause icon on the task control panel.
* ***In progress*** - user starts the task in the application or the manager changes the status. The system starts a timer and adds user to reward table.
* ***Canceled*** - manager changes the status to Canceled. The system immediately stops the timer, blocks user's task, updates the progress bar, and adds an data to tooltip. The task is skipped in the production process.

{% hint style="warning" %}
If the user may not have permission to transfer a task to another status from the ***Blocked*** status
{% endhint %}

#### 4. Transitions from the On hold status

<div data-full-width="false"><figure><img src="/files/7NkN64kFrpTtPSAXUkSZ" alt=""><figcaption></figcaption></figure></div>

A task can be transferred from the On hold status to the following statuses:

* ***Blocked*** - user or manager changes the status to Blocked. The system pauses the timer and blocks the task for the user.
* ***In progress*** - user starts the task in the application or the manager changes the status. The system starts a timer and adds user to reward table.
* ***Canceled*** - manager changes the status to Canceled. The system immediately stops the timer, blocks user's task, updates the progress bar, and adds an data to tooltip. The task is skipped in the production process.

#### 5. Transitions from the Reopened status

<figure><img src="/files/Zur65jihR7xjhvfJI0Me" alt=""><figcaption></figcaption></figure>

From the Reopened status, a task can be transferred to the following statuses:

* In progress - user starts the task in the application or the manager changes the status. The system starts a timer and adds user to reward table.
* Blocked
* On hold
* Canceled

#### 6. Transitions from the Canceled status

<figure><img src="/files/jUp6ThkwZNQEakTkAJJU" alt=""><figcaption></figcaption></figure>

From the Canceled status, a task can be returned to the following statuses:

* To do
* Blocked
* On hold&#x20;

#### 7. Transitions from the Done status

<figure><img src="/files/VAW3Hbe1exULtTRLU26k" alt=""><figcaption></figcaption></figure>

From the Done status, a task can be returned to the following statuses:

* In Progress
* Reopened

#### **Returning Conditions for Task Status Change from "Done" to "In Progress"**

There are specific conditions under which a task can be moved back from "Done" to "In Progress." These conditions differ slightly depending on whether it’s a manager or a performer making the change:

***

**For Managers:**

1. The root workflow hasn’t been completed yet. This means the entire workflow must not be marked as "Done" or "Canceled."
2. The task must have been completed within the current reporting period. If the reporting period is already closed, corrections can still be made, but only if the allowed correction period hasn’t expired.
3. Managers can move a task from "Done" to "In Progress" as many times as needed, as long as the workflow is still active (not finished).

***

**For Performers:**

1. The option **"Allow undoing task status change from 'Done' to 'In Progress'"** must be enabled in the system settings.
2. The task must have been completed within the current reporting period, and the reporting period should still be open at the time of attempting to undo the task status.
3. The root workflow must still be active. If the entire workflow has already been marked as "Done" or "Canceled," the task cannot be reverted.

### In queue task management

"In queue" feature allows users to receive their tasks only after the previous one is completed.

<figure><img src="/files/2O8S3KjYzUZhBa8Wwd5J" alt=""><figcaption></figcaption></figure>

Workflow tasks displays in “In queue” state:&#x20;

* only workflow tasks that are related on canvas have an “In queue” state (not components or additional tasks)&#x20;
* tasks in “In queue” state displays for performers, but in this state they can\`t start the task tracker and accept tasks&#x20;
* tasks obtain “In queue” state at once after production launching and keep it till previous tasks are done&#x20;
* the status sequencing rule does not work for stopped productions
* the task that is next in the flow after the ***Stopped*** component does not automatically lose the "In queue" status

“In queue” state allows status sequence rule to work:

When the previous task receives the status of Done, this causes the next task in the queue to leave “In queue” state and receive the status it is in:

1. Start the task: set assignee and change status to "In Progress"
2. Finish the task
3. Next task will automaticaly unlock for performing

{% @arcade/embed flowId="Wvb21hL6UhbxTpmqNbZj" url="<https://app.arcade.software/share/Wvb21hL6UhbxTpmqNbZj>" %}

If there are several preceding tasks at the same time (several incoming connections), all of them must be in the Done status for the next task to turn off the “In queue” state.&#x20;

{% @arcade/embed flowId="hZpkkUCZTlbHz6UTMBJv" url="<https://app.arcade.software/share/hZpkkUCZTlbHz6UTMBJv>" %}

Also, “In queue” can be turned off manually if it's necessary. To manage the “In queue” state, you need to have the appropriate permission granted by the admin or manager.

To manage “In queue” state:

1. Hover over the locker near task status
2. Click on the “In queue” locker
3. Click again to return “In queue” state to the task

{% @arcade/embed flowId="tArSSVWb4ltd1kRIt1sQ" url="<https://app.arcade.software/share/tArSSVWb4ltd1kRIt1sQ>" %}

{% hint style="info" %}
If the “In queue” was removed manually and the previous task has not yet been completed, then when the task is transferred to the ***To Do*** status from the ***Canceled*** status, the lock will be returned automatically
{% endhint %}

Read on to learn more...


# Task

## Overview


# "Related tasks" section

## Overview

The "**Related tasks"** section provides a clear view of the tasks connected to your current task. It displays previous tasks that have been completed or are still in progress, as well as upcoming tasks in your workflow. This visibility helps you navigate and track the progress of tasks seamlessly.

<figure><img src="/files/H5cx6EitNr2jnsGky7hZ" alt=""><figcaption></figcaption></figure>

### Key features

* **View previous and next tasks**: Easily navigate through the tasks in the workflow in sequential order. This allows you to monitor the progression of tasks and understand their interdependencies.
* **Fail tasks**: Easily fail any tasks in the flow directly from the "Related tasks" section. Simply click on the "Manage failed tasks" button to view all tasks. This allows you to address issues promptly without navigating away from your current task.
* **Navigate to specific task/component in the flow:** There’s no need to return to the main canvas to access related tasks or components. Simply click on the task or component you wish to open. This will take you directly to the selected item, saving you time.

## **Use cases**

### **Opening task/component**

1. Click on the task/component you want to open

{% @arcade/embed flowId="KPyYClO71RezFyzvYhxx" url="<https://app.arcade.software/share/KPyYClO71RezFyzvYhxx>" %}

### Clicking "Manage failed task"

1. Click "Manage failed tasks" button

{% @arcade/embed flowId="Gx8ZRI8AYh5qYlEmfNXy" url="<https://app.arcade.software/share/Gx8ZRI8AYh5qYlEmfNXy>" %}


# "Time tracking" section

## Overview

The time tracker is designed to provide users with accurate data on task execution time. It records the duration from when performer starts working on a task to the point when task was finished, ensuring you have precise metrics. Whether you are managing tasks or monitoring the time spent on them, this documentation will give you all the essential details you need.

<figure><img src="/files/fkfkvvE4vG0zPWmGewtY" alt=""><figcaption><p>"Time tracking" section</p></figcaption></figure>

## Key elements of "Time tracking" section

* **"Time limit"** - time that was allocated for task execution. It can only be set during the creation of the [Task Template](/manuals/product-management/product-configuration/workflows/task-template#setting-time-limit).
* **"Start" button -** pressing this button initiates the time countdown and changes the task status to "In progress".&#x20;
* **"Finish" button -** pressing this button stops the time tracking and changes the task status to "Done".
* **"Started"** - indicates the date and time when the task was first marked as "In Progress".

## Use cases

### Starting timer

1. Click "Start" button

{% hint style="info" %}
System changes task status to "In progress" and starts time countdown.
{% endhint %}

{% embed url="<https://app.arcade.software/share/zqI7uMuYank1QnjXWAmf>" %}

### Pausing timer

1. Click "Pause" button

{% hint style="info" %}
System changes task status to "On hold" and pauses time counting.
{% endhint %}

{% embed url="<https://app.arcade.software/share/RbDStjLjDJSAvYWube3G>" %}

### Finishing the task

1. Click "Finish" button

{% hint style="info" %}
System changes task status to "Done", stops time counting and shows time summary.
{% endhint %}

{% embed url="<https://app.arcade.software/share/BaTafa3dHXRYNLnDRXQZ>" %}

## QA

1. **Why is the "Start" timer button disabled?**

   The button is disabled when the task is in the "In Queue" state, indicating that it cannot be started yet.
2. **What does it mean if the timer is red on the progress bar?**

   A red timer on the progress bar indicates that the allocated time limit for task execution has been reached. This means performer(-s) have exceeded the task's time limit.


# "Performers" section

### Overview

The **"Performers"** section is a crucial component of task management that enables you to efficiently assign and manage performers for each task. Here’s what you can do: add performers, manage assignment types, adjust the number of performers, change responsibilities.

Overall, the "Performers" section streamlines the process of task assignment and management, helping you to optimize your team's productivity and ensure that all tasks have assignee.

<figure><img src="/files/9XgsoZRLutPcuc2nIqYd" alt=""><figcaption></figcaption></figure>

## Managing performers

### Assigning a performer

1. Click on the "Unassigned" slot
2. Select a performer from the list of all suitable candidates
3. Click on the performer you want to assign

{% embed url="<https://app.arcade.software/share/e7dYg5sD9PvjZZ7vfZBk>" %}

### Changing a performer

1. Click on the user's slot
2. Select a performer from the list of all suitable candidates
3. Click on the performer you want to assign

{% embed url="<https://app.arcade.software/share/jPMAfjlMoqjx1bqhdYRP>" %}

### Unassigning a performer

1. Click on the user's slot&#x20;
2. Click on the "Unassigned" option in the list

{% embed url="<https://app.arcade.software/share/5srAJI4BYMva8HmIokGH>" %}

## Managing "Responsibility"

### Adding new responsibility

1. Click "Add" button
2. Add title
3. Add the number of slots
4. Select assignment type
5. Configure specific assignment criterias (if you want)
6. Click "Save settings" button

{% embed url="<https://app.arcade.software/share/ESKXHKG2o4o68bBOXvAC>" %}

### Adding a slot to the "Responsibility"

1. Click on the "Add slot" button

{% embed url="<https://app.arcade.software/share/2VhU6sevd2Hatu8Vklgd>" %}

### Removing a slot from the "Responsibility"

1. Hover over the slot you want to delete
2. Click on the "X" button

{% hint style="warning" %}
If "Responsibility" has only one slot, then system forbids to delete a slot.
{% endhint %}

{% embed url="<https://app.arcade.software/share/avtOZ2iQfQEgEXRlplfR>" %}

### Deleting the "Responsibility"

1. Click on the :wastebasket: button
2. Click "Delete" button to confirm&#x20;

{% hint style="warning" %}
If task has only 1 "Responsibility",  then system forbids to delete it.
{% endhint %}

{% embed url="<https://app.arcade.software/share/kb2JyeA46NB3tywCyBNC>" %}

## QA

1. #### Can I assign the same user to multiple slots?

   No, a user can only be assigned to one slot.
2. #### What is the maximum number of users I can assign to one responsibility?

   You can assign a maximum of **five users** to a single responsibility.
3. #### Can I change the "Assignment Type" while the task is in progress?

   Yes, it's possible.
4. **Can I assign users if task's assigment type is set to "Automatic" or "Self-assign"?**

   Yes, it's possible.
5. **Can "Responsibilities" have different "Assignment types"?**

   Yes, it's possible.


# "Rewards" section

## Overview

This guide is designed to help you handle the rewards management. You'll learn how to modify rewards for each performer, ensuring that rewards accurately reflect the work done.

## Key elements of "Rewards" section

* **Basic reward** - monetary compensation that performers receive for their work on a task. This amount is initially set during [Task Template](/manuals/product-management/product-configuration/workflows/task-template#setting-basic-reward) configuration, but can be edited from the Task page as needed.
* **Bonuses** - refer to specific attributes and amounts that can be awarded to performers for their work on a task. Unlike the basic reward, bonuses can only be configured [Task Template](/manuals/product-management/product-configuration/workflows/task-template#adding-bonus) only.&#x20;
* **Total bonus** - is the cumulative sum of all bonuses awarded to performers who have worked on the task. This value reflects the additional compensation based on the complexity of the task.
* **Total -** overall sum that performer(-s) could receives for their work, calculated by adding the "Basic Reward" to all "Bonuses"**.**&#x20;

<figure><img src="/files/99ZH1bs7bIO5AgNObreJ" alt=""><figcaption></figcaption></figure>

* **"Reward summary" table** provides an overview of the key details related to task execution.

<figure><img src="/files/r633RUquypWHbaD4slce" alt=""><figcaption></figcaption></figure>

<table><thead><tr><th>Column</th><th>Desctiption</th><th>Can be edited?<select><option value="Ssi5UEOexzgc" label="Yes" color="blue"></option><option value="joYhIuRNxYb2" label="No" color="blue"></option></select></th></tr></thead><tbody><tr><td>Performer</td><td>A person who has worked on the task</td><td><span data-option="joYhIuRNxYb2">No</span></td></tr><tr><td>Time Spent</td><td>Time that performer(-s) was working on the task.</td><td><span data-option="joYhIuRNxYb2">No</span></td></tr><tr><td>% Time spent</td><td><p>Represents the percentage of total time that each performer has contributed to the task</p><p>Calculated as: (Total ”Time spent” of each performer /”Time spent”) x 100%</p></td><td><span data-option="joYhIuRNxYb2">No</span></td></tr><tr><td>Reward</td><td><p>The monetary amount that a performer receives for their work on the task</p><p>Calculated as: (Basic reward x ”% Time spent” user)/100%</p></td><td><span data-option="joYhIuRNxYb2">No</span></td></tr><tr><td>Bonus</td><td><p>An additional sum awarded to the performer</p><p>Calculated as: (Total bonus x ”% Time spent” user)/100%</p></td><td><span data-option="joYhIuRNxYb2">No</span></td></tr><tr><td>Reward Correction</td><td>A sum that corresponds to any adjustments made to the task reward (e.g., if a manager decides to give a bonus or deduction)</td><td><span data-option="Ssi5UEOexzgc">Yes</span></td></tr><tr><td>Total</td><td>The overall sum that a performer receives for their work on the task<br>Calculated as: Reward+Bonus (+- Review)</td><td><span data-option="joYhIuRNxYb2">No</span></td></tr><tr><td>Total produced item</td><td>The total number of items produced by the performer who worked on the task. This information is displayed only for specific task types.</td><td><span data-option="Ssi5UEOexzgc">Yes</span></td></tr><tr><td>Reporting period</td><td>The accounting period during which the performer will receive payment for their work on the task. Is set to 1 month by default.</td><td><span data-option="joYhIuRNxYb2">No</span></td></tr></tbody></table>

## Use cases

### Adding basic reward

1. Click on the "Basic reward" field&#x20;
2. Enter new value&#x20;
3. Click "Enter" button

{% embed url="<https://app.arcade.software/share/GD2ZKevSp4Ghl1ZLhkyz>" %}

### Making corrections

1. Click on the "Reward correction" cell of the performer for whom you want to change the reward
2. Enter new value&#x20;
   1. put positive value if you want to add to the basic reward
   2. put negative value if you want to deduct from the basic reward
3. Click "Enter" button

{% hint style="info" %}
To remove the entered value, click on the "Clear correction" button
{% endhint %}

{% embed url="<https://app.arcade.software/share/zqhfCuexwRH8nwObaans>" %}

## QA

1. **Can I assign Performer B while Performer A is still working on the task?**

   Yes, you can assign Performer B while Performer A is still working on the task. The reward will be recalculated based on the time each performer has spent on the task.
2. **Can I make corrections to the task that has "Done" status?**

   Yes, you can make corrections to a task marked as "Done," but there are limitations based on the task's reporting period and the setting[ "Task correction days after reaching “reporting period”](/manuals/settings/production#task-correction-days-after-reaching-reporting-period).
3. **Can anyone edit the task reward?**

   No, the ability to edit the task reward is restricted by the "Task Edit Level" permission. Only users with the appropriate permissions can make changes to the reward.


# Quality control

## Overview

The **Quality control** functionality allows users to accomplish the control steps in your production. This article will tell more about the quility control and task failing, provide new instructions and deepen knowledge about the system. Fail tasks with payment or not, add reason of failure and analyze the most problematic stages of each productions.

By reading this article, learn how to use it, where to find and which permissions user need to have.&#x20;

## Basics

1. The **Quality control** button is located in the left corner of the canvas.
2. The **Quality control** button is available if there is at least one completed task (in the ***Done*** status).
3. If a task has been canceled, the **Quality control** is not available for that task.
4. Components can not be failed, but component tasks can.
5. By default, Reopen status of the task is considered as task failure without payment for re-execution.

<figure><img src="/files/c5MLIsnX2RZWDZoHfYnN" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
In order to fail any task user should have "Manage failed tasks" permission
{% endhint %}

There are two options how user can fail the task:

1. Without payment
2. With new payment

Let's getting closer to both of them.

### Fail Tasks Without Payment

1. Click on the "Quality control" button on the workflow canvas
2. Find a task with the status Done.
3. Select tasks to fail by ticking the checkbox next to the tasks you want to fail
4. After selecting the tasks, press the "Save" button.
5. A confirmation modal will appear, displaying the list of tasks for failing
6. Choose reason for failure and leave comment (optional)
7. Click the "Apply" button

{% hint style="info" %}
If task fail without payment the task wil be reopened
{% endhint %}

{% @arcade/embed flowId="x7GadRXL15tdHJhFGUD6" url="<https://app.arcade.software/share/x7GadRXL15tdHJhFGUD6>" %}

### Fail Tasks With New Payment

1. Click on the "Quality control" button on the workflow canvas
2. Find a task with the status Done
3. Select tasks to fail by ticking the checkbox next to the tasks you want to fail
4. Set the toggle on for failing task with payment
5. After selecting the tasks, press the "Save" button
6. A confirmation modal will appear, displaying the list of tasks for failing
7. Choose reason for failure and leave comment (optional)
8. Click the "Apply" button

{% hint style="info" %}
If task fail with payment the new task wil be created
{% endhint %}

{% @arcade/embed flowId="ukhV2kMcpAF8a33oTVEH" url="<https://app.arcade.software/share/ukhV2kMcpAF8a33oTVEH>" %}

Also, there is option to fail several task at once. It doesn't matter with or without payment.

{% @arcade/embed flowId="0sr5asikuqYjZdnyuWd0" url="<https://app.arcade.software/share/0sr5asikuqYjZdnyuWd0>" %}

In cases where tasks are marked as failed, the reasons for failure are configured in the database. Each company has its own separate table of reasons that can be selected when marking a task as failed. While the current list of failure reasons is pre-configured in the system, there are plans to develop a feature allowing users to add new failure reasons directly in the future.

## What types of tasks does quality control cover?

Quality control covers both main workflow tasks and additional tasks.Additional tasks can be reopened with or without payment, just like workflow tasks, and simultaneously.

To do this, go to the “Additional Tasks” tab during quality control and fail any available task in the same way.

{% @arcade/embed flowId="xRgfnWzvdJdZZPUZ1BPZ" url="<https://app.arcade.software/share/xRgfnWzvdJdZZPUZ1BPZ>" %}

### How to view failed task?

All information about the failure of the task is stored in the system and recorded in the "Roll-back events" modal. This modal can be opened from:

* canvas
* production page
* task

{% @arcade/embed flowId="zO9eOF1BSPBFYDRKx00g" url="<https://app.arcade.software/share/zO9eOF1BSPBFYDRKx00g>" %}

There are also a number of rules regarding the recording of these events. Let's get closure:

{% hint style="warning" %}
**The "Roll-back events" modal displays all failed events**, regardless of the production status.

1. The modal **respects the production hierarchy tree**:
   * **Root production**: shows all failed events for itself and all nested components.
   * **Component with nested components**: shows failed events for itself and its immediate nested components.
   * **Lowest-level component**: shows only its own failed events.
2. **When opened from a task header**, the "Roll-back events" modal:
   * Displays only **failed events related to that specific task**.
   * Includes all repeated failures (if a task failed more than once).
   * Is triggered by clicking the **“Click to see details”** button.
     {% endhint %}

"Roll-back" modal track who failed the task and for what reason. Below is an picture that explains in details what each element of the record means.

<figure><img src="/files/fdCA9NDKGkWmz6jasaIi" alt=""><figcaption></figcaption></figure>

Let's examine where to look for rollback events for tasks that were reopened without payment and with payment.

For task without payment:

1. Click on the failed task&#x20;
2. The upper left corner will show the ***1,2... failed event*** button
3. Click on the button to open the list of who failed the task and for what reason

{% @arcade/embed flowId="kRxHvXz0aurKqzbCrMuE" url="<https://app.arcade.software/share/kRxHvXz0aurKqzbCrMuE>" %}

For task with payment:

1. Click on the failed task&#x20;
2. In the Related tasks section, find Failed tasks&#x20;
3. Click on the failed task
4. The upper left corner will show the ***1,2... failed event*** button
5. Click on the button to open the list of who failed the task and for what reason

{% @arcade/embed flowId="M1sy06ZLxJxRnahS9BxN" url="<https://app.arcade.software/share/M1sy06ZLxJxRnahS9BxN>" %}

{% hint style="info" %}
The new task created after a failure with payment will display a specific icon. When you hover over it, a tooltip will appear showing detailed information about the failed task:

Created after quality control check from task ***Task key***
{% endhint %}

## Reopened Production Status: How It Works

A **"Done"** production is marked as **“Reopened”** if any of the following occurs:

* A new task (workflow or additional) is added to the production or its nested components.
* An existing task is failed within the production or its nested components.

### Reopened Status Icon

Once reopened, a **circular arrow icon (🔄)** appears on the Production page.

Hovering over the icon will show the tooltip:

> **“Production was reopened at \[time, date]”**

<figure><img src="/files/oBaPfxUVLp1HGVxFGoQl" alt=""><figcaption></figcaption></figure>

### Progress Bar Tooltip

If a reopened production includes tasks that still need to be completed, the progress bar tooltip is updated. Hovering over the progress bar will show the tooltip:

> **“Finished tasks: 5 / 7”**

<figure><img src="/files/BfZJaGPS6QBD9p8i6iK3" alt=""><figcaption></figcaption></figure>

This shows how many tasks are completed out of the total, including newly added or reopened tasks.

### “Info” Pop-up Updates

When viewing the **“Info”** pop-up for a production. If it was reopened, a warning is shown:

> **“Production was reopened at \[time, date]”**

<figure><img src="/files/LvTP1u5sa0qM1qqbDUxS" alt="" width="375"><figcaption></figcaption></figure>

This helps track changes even if the production was marked as done previously.

### Notes

* The **“Reopened”** status is purely informational and helps track task changes post-completion.
* All visual indicators (icon, tooltip, warning) are designed to help users avoid overlooking additional work that reopens the flow.

***

This feature ensures that no task goes unnoticed — even after a production is marked as complete.


# Task Table


# Introduction

Overview and User Actions

## Overview

The Tasks page serves as the central hub for managing and organizing all tasks within the system. It allows users to customize the table view, track task progress, and access essential task-related information, ensuring seamless workflow management.

The page offers flexibility through quick actions via context menus, and dynamic filters to streamline task tracking. With permissions-based access, users can securely view or edit tasks based on their roles.&#x20;

By reading this article, you will learn how to optimize the Tasks page to suit your needs and navigate its features effectively.

## Rules and Information for the Tasks Page

1. **Customizing of the Task Table**
   * You can adjust the table view to suit your needs:

     * Drag and drop columns to rearrange their order.
     * Pin columns to keep them fixed in place.
     * Select or deselect columns to choose which ones are displayed.

     *Read more about this in the article below*
2. **Saving Table Settings**
   * Your customized table settings (column order, pinned columns, selected columns, and applied filters) are saved automatically in the database for your account.
3. **Using the Context Menu**
   * Right-click on any cell to open the context menu. By default, the menu includes the following options:

     * **Copy value**: Copies the cell's value.
     * **Copy link**: Copies a direct link to the task.
     * **Open task**: Opens the task in a new window.
     * **Open root production**: Opens the main (root) production workflow in a new tab.
     * **Open production**: Opens the production workflow where the task is located in a new tab.

     <figure><img src="/files/UWUAzVkACYZPKk65sFqS" alt=""><figcaption></figcaption></figure>

     *Read more about this in the article below*
4. **More Actions Menu**
   * Each task row includes a **“More actions”** menu with the following options:

     * **Copy link**: Copies a link to the task.
     * **Open task**: Opens the task in a new window.
     * **Open root production**: Opens the root production workflow in a new tab (if applicable).
     * **Open production**: Opens the production workflow where the task is placed in a new tab.

     <figure><img src="/files/0jmxcmtaKD1YHJNWYhzI" alt=""><figcaption></figcaption></figure>

     *Read more about this in the article below*
5. **Task Information in Root Production**
   * If a task belongs to the root (main) production, the following columns will duplicate information from their corresponding root production columns:
     * **Product name** → Root product name.
     * **Product version** → Root product version.
     * **Product configuration** → Root product configuration.
     * **Product variant** → Root product variant.
     * **Production deadline** → Root product deadline.
6. **Task Counter**
   * The number next to the **Task** title indicates the total number of tasks in the system.
   * This counter updates dynamically based on any applied filters.
7. **Access Permissions**
   * Viewing the Tasks page requires the **Task view** permission.
   * Editing tasks or settings on the page requires the **Task edit level** permission.

## Actions with the Tasks table columns

Actions you can do with table columns:&#x20;

### Move a column&#x20;

This action can be done throught the sidebar or directly in the table.

1. Open the Tasks page&#x20;
2. Hold down the column you want to move&#x20;
3. Drag in the direction (right/left) you want to move the column&#x20;

{% @arcade/embed flowId="hEW8GVc9YIgu2abdBrmO" url="<https://app.arcade.software/share/hEW8GVc9YIgu2abdBrmO>" %}

**OR**&#x20;

1. Open the Tasks page
2. Open the Sidebar&#x20;
3. Hold down the column you want to move&#x20;
4. Drag in the direction (up/down) you want to move the column

{% @arcade/embed flowId="OtO5aVojMXiJL4FzYiv4" url="<https://app.arcade.software/share/OtO5aVojMXiJL4FzYiv4>" %}

### Move a section (group) of columns&#x20;

The moving principle is the same as with columns. This action also can be done throught the sidebar or directly in the table.

1. Open the Tasks page&#x20;
2. Hold down the section you want to move&#x20;
3. Drag in the direction (right/left) you want to move the column&#x20;

**OR**&#x20;

1. Open the Tasks page&#x20;
2. Open the Sidebar&#x20;
3. Hold down the section you want to move&#x20;
4. Drag in the direction (up/down) you want to move the column

And there is option to move separete column from the one section.

{% @arcade/embed flowId="6II9kvrTlg4ffRtShDJh" url="<https://app.arcade.software/share/6II9kvrTlg4ffRtShDJh>" %}

### Turn columns and section on/off&#x20;

1. Open the Tasks page
2. Open the Sidebar&#x20;
3. Click on the column or section to on it or off

{% @arcade/embed flowId="fhw1QwlELVS5OglVWHm1" url="<https://app.arcade.software/share/fhw1QwlELVS5OglVWHm1>" %}

### Pin columns&#x20;

1. Open the Tasks page
2. Choose column to pin
3. Click on the “More actions” menu on the column header
4. Hovering over the “Pin Column” option choose option for pin - Left or Right
5. Pin the column

{% @arcade/embed flowId="OIbJIvNXTonMjS02vGym" url="<https://app.arcade.software/share/OIbJIvNXTonMjS02vGym>" %}

It's possible to pin more than one column. To unpin column choose "No pin" option.

### Search column

1. Open Sidebar
2. Put a coursor intho the search field and input the search query
3. System dynamically shows all colums that correspond to the search query with the group title

{% @arcade/embed flowId="dFxocaBmSRT61uVFuDtS" url="<https://app.arcade.software/share/dFxocaBmSRT61uVFuDtS>" %}

### Multi-row selection

This action can be done with keyboard.

1. Open the Tasks page&#x20;
2. Select the row
3. Hold the "Shift" on the keyboard
4. Select the last row which is required

{% @arcade/embed flowId="FdWWDptASKMdVYyrHr1h" url="<https://app.arcade.software/share/FdWWDptASKMdVYyrHr1h>" %}

Read more about filtering and sorting the columns themselves in this [the article](/manuals/task-table/searching-sorting-and-filtering-tasks).

## Actions with the Tasks table cells

This part tells about actions you can do with table cells and provide instructions for better navigation.

### Open task&#x20;

1. Open Tasks page
2. Find a "Task key" column
3. Click on the task key
4. System opens the task in following tab

### Open production

1. Open Tasks page
2. Find a "Production key" column
3. Click on the task's production key
4. System opens the production workflow (in which this task placed) in following tab

### Open root (main) production

1. Open Tasks page
2. Find a "Production key" column
3. Click on the task's root production key
4. System opens the production workflow (in which this task placed) in following tab

{% hint style="danger" %}
&#x20;If the task is part of the root (main) production, the “Open root production” option is hidden.
{% endhint %}

### Assign the user

1. Open Tasks page
2. Find a "Assignee" column
3. Click on the icon in the ”Asignee” cell
4. Choose a user from drop-down a list of candidates

{% @arcade/embed flowId="30tqnlxcHJaTadXdJSYr" url="<https://app.arcade.software/share/30tqnlxcHJaTadXdJSYr>" %}

### Change task status

1. Open Tasks page
2. Find a "Assignee" column
3. Click on the status icon in the ”Task status” cell
4. Choose a status from drop-down a list with the possible next statuses

{% @arcade/embed flowId="5t8Mgtg4RhOk1sysTACt" url="<https://app.arcade.software/share/5t8Mgtg4RhOk1sysTACt>" %}

Read more about switching from different statuses [here](/manuals/production/production-workflow/task-management-on-canvas).

### Change task reward

1. Open Tasks page
2. Find a "Assignee" column
3. Click on the reward in the ”Basic reward” cell
4. In the modal window change the task basic reward
5. Click "Save" for changing the task basic reward

{% @arcade/embed flowId="8jnx7yYj9rRSxb6PL4yb" url="<https://app.arcade.software/share/8jnx7yYj9rRSxb6PL4yb>" %}

### Change task priority

1. Open Tasks page
2. Find a "Assignee" column
3. Click on the priority icon in the ”Task priority” cell
4. Choose a priority from drop-down a list with the possible next priorities
5. System changes priority immideately according to the select option

{% @arcade/embed flowId="LrXzQCmbJa7iHDOgRrJk" url="<https://app.arcade.software/share/LrXzQCmbJa7iHDOgRrJk>" %}

### Turn on/off task "In queue" state

1. Open Tasks page
2. Find a "Assignee" column
3. Click on the “In queue” icon
4. System turns off “In queue” state for the specified task immideately

{% @arcade/embed flowId="swOXTZEICZBw0zr8DVNL" url="<https://app.arcade.software/share/swOXTZEICZBw0zr8DVNL>" %}

To turns on “In queue” state do the same steps but for task which had been unlock for performing before.

By following these guidelines, you can efficiently navigate and manage tasks on the Tasks page.


# View

## Overview

The Tasks page is designed to customise the display of tasks to ensure effective management and analysis.&#x20;

Tasks can be grouped by **orders, productions, products,** or **performers**, depending on the selected view. Switching between different views makes it possible to adapt the page to the user's needs, simplifying workflows. The information is presented in such a way that it is convenient to find the necessary tasks, analyse data, and manage their implementation.&#x20;

This article describes the functions of changing the appearance of the tasks page, grouping by various criteria, and applying sorting to quickly access important information.

<figure><img src="/files/gox0VJ5gWbGZNpN1sKSQ" alt=""><figcaption></figcaption></figure>

## Basics

The tasks page has a customisable view that allows you to adapt the display of tasks for convenience and optimisation. Users can change the Tasks page view using the **View** drop-down.

#### Available views:

* **Default** - tasks are displayed as a regular table and organised by *task status* (more urgent → less urgent ⬆️), *task priority* (highest first ⬇️), *due date* (earliest first ⬆️), and *production deadline* (earliest first ⬆️)
* **Order** - tasks are grouped by order number.
* **Root production name** - tasks are grouped by root production name.
* **Product** - tasks are grouped by product ID.
* **Product + Configuration + Variant** - tasks are grouped using a combined key:
  * product ID;
  * configuration name;
  * variant name.
* **Assignee** - tasks are grouped by assigned user.

{% hint style="info" %}
The system remembers the selected view when the user refreshes or reopens the page.
{% endhint %}

## Grouped views

The Tasks page supports grouped views that help organise tasks by different business entities. Grouping allows users to quickly navigate large amounts of data, analyse workload, and focus on related tasks.

To change the task view:

1. Open the Tasks page.
2. Click the “**Page view**” button on the top panel.
3. Select the required grouping option from the drop-down list.

Depending on the selected view, the system automatically groups tasks into collapsible sections.

{% @arcade/embed flowId="LY3YfJv2TGC1paBj9WxU" url="<https://app.arcade.software/share/LY3YfJv2TGC1paBj9WxU>" %}

### Assignee view

In this view, tasks are grouped by assigned users.

Additional behaviour:

* tasks without assigned performers appear in the “**Unassigned**” group;
* tasks with multiple assigned users may appear in multiple groups.

Each group header displays performer information, including profile photo and user name.

<figure><img src="/files/G1MSoJRUeoay3GiIK1iM" alt=""><figcaption></figcaption></figure>

### Order view

In this view, tasks are grouped by order. Each group contains tasks related to the same order.

The collapsed group header may display:

* Order name
* External order number
* Marketplace order number
* Client information

<figure><img src="/files/4vwVH2xB51oNWmC3jv4i" alt=""><figcaption></figcaption></figure>

### Root production name view

This view groups tasks by root production.

Groups may include:

* tasks from the main production;
* tasks from nested productions;
* tasks from sub-nested productions.

This structure helps users understand the full production hierarchy and related workflow.

<figure><img src="/files/b75FqCwY4rGykJfby1lw" alt=""><figcaption></figcaption></figure>

### Product (only) view

In this view, tasks are grouped only by product.

Each group contains tasks directly related to the selected product without including nested production components.

<figure><img src="/files/IKzvagZ3ZkHAxW8yMjQG" alt=""><figcaption></figcaption></figure>

### Product (with details) view

This view groups tasks using a combination of:

* Product
* Configuration
* Variant

Each group represents a unique product setup and helps separate similar products with different configurations or variants.

<figure><img src="/files/TodLioJXYTlBL72kFhiw" alt=""><figcaption></figcaption></figure>

## Additional features in grouped views

Grouped views include additional tools that help users navigate, filter, and manage tasks more efficiently.

### Counters

Grouped views display counters that help analyse the current dataset.

* **Tasks counter** - displays the total number of tasks currently visible according to applied filters.
* **Groups counter** - displays the total number of currently visible groups for the selected grouping type.

Both counters update automatically when:

* filters are applied or removed;
* grouping changes;
* task results change.

<figure><img src="/files/4Qa7SWqZVdqMk2oU4G0O" alt="" width="563"><figcaption></figcaption></figure>

### Filtering in grouped views

Each grouped view has its own filter based on the selected grouping type.

For example:

* Assignee view → Assignee filter
* Product view → Product filter

<figure><img src="/files/Av9zCzfSdNYFwZol3l4u" alt=""><figcaption></figcaption></figure>

### Group sorting

You can organize groups in ascending or descending order depending on the selected grouping type.

Available sorting options may include:

* **Order view** - tasks can be sorted by:
  * order key (A → Z / Z → A);
  * order deadline (earliest first / latest first);
  * start date (earliest first / latest first).
* **Root production name view** - tasks can be sorted by root production name (A → Z / Z → A).
* **Product view** - tasks can be sorted by product name (A → Z / Z → A).
* **Product + Configuration + Variant view** - tasks can be sorted by:
  * product name (A → Z / Z → A);
  * configuration name (A → Z / Z → A);
  * variant name (A → Z / Z → A).
* **Assignee view** - tasks can be sorted by user's name (A → Z / Z → A).

Sorting is applied only to groups order and does not affect task sorting inside the groups.

<figure><img src="/files/6h2cjXtxEcJUYJESH7ih" alt=""><figcaption></figcaption></figure>

### Bulk selection in grouped views

Grouped views support bulk task selection.

Users can:

* select all tasks inside a group;
* deselect all tasks inside a group;
* use partial selection states for groups with partially selected tasks.

{% hint style="info" %}
Bulk selection is available only for expanded groups.
{% endhint %}

## Task display range

Users can configure how completed and cancelled tasks are displayed.

Available time ranges:

* 1 day;
* 3 days;
* 7 days;
* 30 days;
* 90 days.

{% hint style="warning" %}
Completed or cancelled tasks with deadlines outside the selected time range will be excluded from the list.
{% endhint %}

#### To change tasks display range:

1. Open the task page .
2. On the top panel of the tabs, find and click the “**Page view**” button.
3. Configure the range of tasks to be displayed (available options: 1 day, 3 days, 7 days, 30 days, 90 days).
4. The system automatically hides all completed (**Done**) and cancelled (**Cancelled**) tasks.
5. If tasks are completed or cancelled within the selected time range, they will be displayed in the list
6. To view details of the selected settings, hover over the ℹ️ Information icon

<figure><img src="/files/IKrimJhuXQD58uLrWLmG" alt=""><figcaption></figcaption></figure>

These steps allow you to optimize the display of tasks according to your current needs and focus on the tasks that matter most.


# Searching, sorting and filtering tasks

## Overview

The Tasks page allows you to view, filter, sort, and search for tasks interactively, providing convenient access to the information you need. The display is adjusted dynamically, adapting to the selected parameters.

The page supports filtering, sorting, searching, and infinite scrolling of tasks with new items loading as you browse.

This article explains how to work with filters, sorting, search, and infinite scrolling on the tasks page to help you interact with tasks more efficiently.

## Rules and Information for searching, sorting and filtering tasks

* Filters, sorting, and searching are available in the task table.
* The data is updated interactively depending on the selected filters, sorting, or search options.
* Infinite scrolling loads 25 tasks when you first open the page, and an additional 25 tasks each time the scroll reaches the bottom of the page.
* Sorting is enabled by default for all columns.
* Initial sorting is performed by root production dates in ascending order (from earliest to latest).
* The data in the columns are sorted by clicking:&#x20;
  * on the column name
  * the “More actions” button in the column header
* Not all columns are searchable. If there is no search field, so searching is disable for the column. But you can search by filter values in almost all of them.<br>

  <figure><img src="/files/Tnzr6WHMgvOsnbOJjPdC" alt=""><figcaption></figcaption></figure>

## Searching

For the field where search is enable:

1. Open the tasks page
2. Find the column that has a search field enabled (see the Search field field for details)&#x20;
3. Enter your search query in the appropriate search field located at the top of the column.
4. The system automatically displays the rows that contain values that match the search query

{% @arcade/embed flowId="t2jAmb6fjNcA5gtFgSpd" url="<https://app.arcade.software/share/t2jAmb6fjNcA5gtFgSpd>" %}

If the entered value is not in the selected column, the system displays the message ***“No results”*** and no rows are displayed in the table.

## Sorting

### Sort by column header&#x20;

1. Open the task page
2. Find the column where sorting is enabled
3. Click on the column header
4. The system automatically sorts the values in the column according to the applied sorting order
5. If the column was previously sorted in ascending order (ASC), the system will change the order to descending order (DESC)
6. A sorting indicator (arrows for ASC or DESC) is displayed next to the column header

{% @arcade/embed flowId="A11Rs4KM6DGeO7q16vfo" url="<https://app.arcade.software/share/A11Rs4KM6DGeO7q16vfo>" %}

### Change the sorting in the More actions menu&#x20;

1. Click the More Actions icon in the header of the same column
2. Options will now appear in the drop-down list:&#x20;
   1. Sort Ascending
   2. Sort Descending
   3. Clear Sort&#x20;
   4. Pin Column
3. Click Sort Descending to change the sort order to descending
4. The system changes the sort and displays a sort arrow (⬇️) next to the column name

{% @arcade/embed flowId="jK984NJcsIe2DsFRNbgH" url="<https://app.arcade.software/share/jK984NJcsIe2DsFRNbgH>" %}

{% hint style="info" %}
If the sorting was not previously applied, then there will be two options - Sort Ascending and Sort Descending, if it was, then only one - the opposite.
{% endhint %}

### Remove a sort

1. Open the More Actions menu in the header of the same column
2. &#x20;Click the Clear Sort option
3. The system removes the sort and returns to the previous state before it was applied

{% @arcade/embed flowId="ojqRo6J2ygLVbVm64X7u" url="<https://app.arcade.software/share/ojqRo6J2ygLVbVm64X7u>" %}

## Filtering

### Use a text filter with multiple options

1. Open the tasks page
2. Find a column that has a text filter with more than one enabled option&#x20;
3. Click the filter icon in the column with text filter
   1. The system opens a window with a field for selecting a filter option and an input field for searching
4. Click on a filter option to expand the list of available options
5. Select the desired option from the list
   1. The system automatically updates the selected filter option, applies it, and displays the filtered data
   2. The filter indicator will change to show the active filter

{% @arcade/embed flowId="VUC3QIBuLCRxWmMP80NQ" url="<https://app.arcade.software/share/VUC3QIBuLCRxWmMP80NQ>" %}

### Apply a filter by date&#x20;

1. Open the tasks page
2. Find the column with the date filter enabled
3. Click the filter icon in the column with date filter
   1. The system opens the calendar to select a date range
4. Select the start and end date of the range
   1. The system will show the selected dates in the corresponding fields above the calendar
5. The calendar will close automatically, the data will be filtered by the selected date range

{% @arcade/embed flowId="nyt1AeMHcb0nxrjVmRC8" url="<https://app.arcade.software/share/nyt1AeMHcb0nxrjVmRC8>" %}

### Apply a filter by a set of values (Set filter)&#x20;

1. Open the tasks page
2. Find the column with the set filter enabled
3. Click the filter icon in the column with filter by a set of values
   1. The system opens a window with an active input field, the “Select all” option, a list of available options, and the “Reset” button
4. Uncheck the “Select all” box if you want to select individual values
   1. The system applies the filter according to the selected values
5. Click the Reset button to reset the filter settings. The filter will be deleted and the data will be updated.

{% @arcade/embed flowId="onNmjm7urGZWszRgfNgl" url="<https://app.arcade.software/share/onNmjm7urGZWszRgfNgl>" %}

### Clear all filters

1. Open the task page and make sure at least one filter is active
2. Click the Clear all button
   1. The system will reset all filter values, refresh the task list, and display the full list without active filters
3. After clearing, the Clear all button will become inactive.

<figure><img src="/files/XSdBNlOGunonSCUoiED3" alt=""><figcaption></figcaption></figure>

These guidelines will help to use filters, search, and sorting efficiently and view the tasks of interest.


# Bulk actions

## Overview

The Tasks page also provides the ability to perform bulk actions, such as selecting tasks and assigning performers.

The main features include selecting multiple tasks at once to perform bulk actions, assigning performers through a pop-up menu, and changing the way tasks are displayed by expanding or collapsing groups. In this guide, you'll learn how to use the multiple selection feature, what actions are available for selected tasks, and how to assign performers.

## Basics

Bulk actions that can be performed with tasks:

* Assign user
* Change task status

<figure><img src="/files/klaZcmBshCJj1cjn8dcX" alt=""><figcaption></figcaption></figure>

## Assign user

The Assign User button allows to select tasks and assign them to a specific user via the Users pop-up menu.

* Only 1 user can be selected from the “Users” dropdown list
* The list shows all active users in the system in alphabetical order, with the “Not assigned” option always at the top
* If the task has more than one slot, the Assigning performers to tasks modal window opens

{% hint style="danger" %}
The number of slots for assigning must be equal and task statuses must be "To do"
{% endhint %}

<figure><img src="/files/gn1beSdhFpsspHwf6O5K" alt=""><figcaption></figcaption></figure>

Let's get closer to specific scenarios and how it works.

### Assigning Users to Tasks with 1 Assignment Slot

All tasks have 1 slot for assigning.

1. Select one or more tasks for assigment
2. Click "Assign user" button in the top panel ***OR*** click on the assignee icon in the "Assignee" column
   1. System displays a dropdown with users (active users listed A-Z with "Unassigned" at the top) and a search bar
3. Select a user from the dropdown list
4. System assigns the selected tasks to the selected user
   1. System updates "Assignee," "Assignee Position," and "Assignee Department" cells
   2. Notifications are sent to user in the mobile application

{% hint style="info" %}
This action allows to unassign user too. Just choose "Unassigned" option in the drop-down list.
{% endhint %}

{% @arcade/embed flowId="RuSLQ3WFfaUDAWzKnWxI" url="<https://app.arcade.software/share/RuSLQ3WFfaUDAWzKnWxI>" %}

### Assigning Users to Tasks with Multiple Assignment Slots

1. Select one or more tasks for assigment
2. Click "Assign user" button in the top panel
   1. "Assign performers to tasks" modal opens
3. Select a user for each slot from the dropdown list
4. After choosing click on the "Save" button
5. System assigns the selected tasks to the selected user
   1. System updates "Assignee," "Assignee Position," and "Assignee Department" cells
   2. Notifications are sent to user in the mobile application

{% @arcade/embed flowId="BUxFXFo1U99POVTDcFj0" url="<https://app.arcade.software/share/BUxFXFo1U99POVTDcFj0>" %}

Also there is option to assign several users through the cell. In this case assignment is made for each user separately as in the first scenario.

## Task status change

The "Change task status" button allows to bulk status change of multiple tasks that share the same status directly from the Task page. This action is restricted to tasks not associated with root productions in **Done** or **Cancelled** statuses.

Status change is possible only if:

{% hint style="info" %}

* All selected tasks have the same status
* "Tasks don’t have a lock, or if they do, user has the 'Manage “In queue” state' permission."
* Root production, where task placed isn't in "Done"/"Canceled" statuses
  {% endhint %}

If at least one of these conditions is violated, the system blocks the status change button and displays a tilt for the user.

<figure><img src="/files/37flY2sane0yBoYc42uC" alt=""><figcaption></figcaption></figure>

Also, important to know that tasks cannot be interacted with during the bulk status change to maintain data integrity and prevent conflicts.

Let's get closure to steps which must be done to change status for several tasks.

### Bulk status change

1. Select one or more tasks for status change
2. Click "Change task status" button in the top panel&#x20;
   1. System displays a dropdown with avaliable status to change
3. Select a status from the dropdown list
4. Apply the cganges for selected tasks
5. System status for selected tasks
   1. When processing is completed, the system:
      * Updates the status of the tasks on both web and mobile
      * Displays a summary badge for 30 seconds indicating the status change
      * Applies side effects based on the new status as per the system logic

{% @arcade/embed flowId="8hyJchW6od9tw9sSPVrK" url="<https://app.arcade.software/share/8hyJchW6od9tw9sSPVrK>" %}

### **Manage task due dates in bulk**

1. Select tasks you want to update.
2. Click "**Manage task due dates"**.
3. In the modal window set new due dates for all selected tasks via calendar or by typing.
4. Click "**Apply**" for saving changes.
5. Review and **Apply** the changes in the confirmation window.
6. The system shows the results of actions in a toast notification "✅Request is processed".
7. Click "<mark style="color:purple;">See details</mark>" to view the Operation summary.

{% hint style="warning" %}
Updated dates are highlighted in **orange**. Failed items are listed in the summary.
{% endhint %}

{% @arcade/embed flowId="YnfcwOlPSVl1cGqBA7DH" url="<https://app.arcade.software/share/YnfcwOlPSVl1cGqBA7DH>" %}

### **Handling Interactions During Processing**

While the bulk change is processing, tasks are locked for interaction:

* On the web, a tooltip displays: *“You can’t edit the task while the request is processing.”*
* On mobile, an information pop-up is displayed.

<figure><img src="/files/slL6hnrTxYLpo3KqXrkC" alt=""><figcaption></figcaption></figure>

### **Summary Badge & Details**

If the user clicks **See details** on the summary badge, the system opens the **Summary Details** pop-up:

* If all status changes are successful, it shows a success state.
* If any task failed to change status, it displays the failed items.

<figure><img src="/files/QvGcispxURSfrvZmK1eL" alt=""><figcaption></figcaption></figure>

Bulk status change improves efficiency by reducing manual interactions and provides more visibility during processing.


# Materials

{% columns %}
{% column %}
{% content-ref url="/pages/IS0ij6G6PuuFQJFqE3UI" %}
[Introduction](/manuals/materials/introduction)
{% endcontent-ref %}
{% endcolumn %}

{% column %}
{% content-ref url="/pages/74D3itraAZzxlYWULO0N" %}
[Interactions with Table](/manuals/materials/interactions-with-table)
{% endcontent-ref %}
{% endcolumn %}
{% endcolumns %}

{% columns %}
{% column %}
{% content-ref url="/pages/OefVgioUjS9FX6JAvxFv" %}
[Adding new Materials](/manuals/materials/adding-new-materials)
{% endcontent-ref %}
{% endcolumn %}

{% column %}
{% content-ref url="/pages/o2SKzV3XKOxeNWCUvvxA" %}
[Filters, sorting and searching Materials](/manuals/materials/filters-sorting-and-searching-materials)
{% endcontent-ref %}
{% endcolumn %}
{% endcolumns %}


# Introduction

## Overview

The Materials page serves as the centralised place for managing all material-related data within the system. It provides a single, reliable source of information that supports manufacturing operations - from inventory planning to production and procurement.

The page helps achieve more efficient and effective access to essential material details, and enhance traceability across the production process. The Materials Page provides structured layout, configurable table views, and role-based permissions, which  enables you to with securely view, manage, and maintain material records with confidence.&#x20;

By reading this article, you will learn how to navigate the Materials page, understand its core features, and use it to support efficient and error-free production workflows.

## Rules and Information for the Materials Page

1. **Material Catalogue View**
   1. Material Catalogue is presented by categories tabs
   2. Each tab shows the table with listed subcategories and materials that are related to the selected category
   3. Materials that have no category are displayed under “Without category” tab
2. **Material Information in table**:
   1. General info: name, photo, id, unit of measure, external id, description, status
   2. Cost: purchase price, actual price
   3. Characteristics: parameters, values
   4. Supplier details: supplier company, supplier country, delivery time, main contact person, email, phone number
   5. Other: tags
3. **Customising of the Materials Table to adjust the needed view**:
   * By dragging and dropping columns
   * By pinning column to left/right
   * By selecting and deselecting what columns to display
4. **Saving table settings**
   1. The configured table settings are automatically saved in the DB each time you change the view attributes:
      * columns placement
      * pinned columns
      * which columns to display
      * filters applied
5. **Using the context menu**

   *Right click* or click on *three dots* at the end of the row to open the context menu. By default, the menu includes the following options:

   * Edit material
   * Open material card
   * Used in
   * Duplicate
   * Deactivate
6. **Access Permissions**
   1. Viewing the Materials page requires the **Materials view** permission.
   2. Editing materials or settings on the page requires the **Material edit level** permission

## Categories and Subcategories

Materials in the system are organised into Categories, which are displayed as tabs at the top of the Materials page. By switching between these tabs, you can quickly view materials that belong to a selected Category. Materials that do not have any assigned Category appear under the system-defined “Without category” tab.

### System-defined “Without category” tab

* **Always visible and pinned first**:\
  The “Without category” tab is permanently displayed at the beginning of the tab list, regardless of whether it contains materials.<br>
* **NOT editable:**\
  It is NOT allowed to rename or delete this tab<br>
* **Materials behaviour:**\
  Materials located under “Without category” can not have a Subcategory. Subcategories are available only for materials that belong to custom Categories.<br>

### Custom Categories

System provides the ability to create, edit, and delete custom Categories. These Categories can contain multiple Subcategories and allow flexible structuring of material data.

* Editing a Category:
  1. To rename a Category click on its tab
  2. Apply the new name
  3. Approve or discard the changes.

<figure><img src="/files/IWZH51XclaaDoWtsWcma" alt=""><figcaption></figcaption></figure>

* Additional actions:
  1. Clicking the three-dot menu next to a Category tab.
  2. In the context menu choose to edit or delete the Category.

<figure><img src="/files/oqUv7ClKcQX18Qg6u0Gf" alt=""><figcaption></figcaption></figure>

* Deleting a Category:
  1. Click "**Delete**" in context menu
  2. Confirm the action in modal window
  3. When a Category is deleted:
     * all of its Subcategories are removed,
     * all materials previously assigned to this Category are automatically moved to the “Without category” tab.

<figure><img src="/files/hNueP1ewbgUyBena30dn" alt=""><figcaption><p>Deleting category</p></figcaption></figure>

*Detailed steps for creating new Categories and Subcategories are described in the following articles.*

### Subcategories Logic

When a new Category is created, it may include a system-generated Subcategory called “Without subcategory” if no custom Subcategories are added.

* Materials assigned to a Category without a Subcategory are automatically placed into the “Without subcategory” group inside that Category.
* This group is displayed only when needed - it appears when there are relevant materials and is not displayed if all materials have Subcategories.
* All Subcategories within a Category are collapsed by default in the table to maintain a clear and compact view'

<figure><img src="/files/neaAKHXKurywl9wr4XiA" alt="" width="563"><figcaption></figcaption></figure>

### Managing Subcategories

Subcategories provide an additional level of organisation within each Category. Users can rename or delete Subcategories as needed.

#### **Editing a Subcategory**

To edit a Subcategory:

1. Click directly on the Subcategory name
2. Enter the updated name
3. Approve or discard the changes

<figure><img src="/files/bNFPopk6HofLZl7bMdVM" alt=""><figcaption></figcaption></figure>

#### **Additional Subcategory Actions**

Right-clicking on a Subcategory group opens a context menu with options to:

* Edit the Subcategory
* Delete the Subcategory

<figure><img src="/files/HXpLRONIlakCk5ou9xZj" alt=""><figcaption></figcaption></figure>

#### **Deleting a Subcategory**

When a Subcategory is deleted:

* All materials assigned to this Subcategory are automatically moved to the “Without subcategory” group within the same Category
* The Subcategory is permanently removed from the list

{% @arcade/embed flowId="5Kp9ceAqBo3O0KTnARue" url="<https://app.arcade.software/share/5Kp9ceAqBo3O0KTnARue>" %}


# Interactions with Table

### Actions with table Columns on the Materials Page

The Materials table uses the same column management functionality as the [Task Table](/manuals/task-table). All standard actions work in the exact same way as [on this page](https://docs.hesh.app/manuals/task-table/introduction#actions-with-the-tasks-table-columns), including:

* Reordering columns in the table or through the Sidebar
* Moving column groups
* Showing or hiding columns and sections
* Pinning columns to the left or right
* Searching for specific columns using the Sidebar search
* Performing multi-row selection

The interaction patterns, drag-and-drop behaviour, Sidebar controls, and “More actions” menu options are fully aligned across both pages.

Because column customisation behaves identically, this section does not duplicate the step-by-step instructions. Instead, you can follow the detailed explanations provided in the [“Actions with the Tasks table columns”](https://docs.hesh.app/manuals/task-table/introduction#actions-with-the-tasks-table-columns) section.&#x20;

Every described action in that section applies directly to the Materials table as well.

{% @arcade/embed flowId="JFon1WCc3otBvH6VBQp3" url="<https://app.arcade.software/share/JFon1WCc3otBvH6VBQp3>" %}

### Actions with the table Cells on Materials Page&#x20;

This section explains how to interact with individual cells in the Materials table and provides instructions for easier navigation and data management.

{% hint style="info" %}
All subcategories are collapsed by default, so you can expand the required group before performing actions.
{% endhint %}

#### Open material card

You can open any material directly from the table to view or edit its full details.

1. Open the Materials page
2. Find the Material name column
3. Click on eye icon near the material name
4. The system opens the material card in a modal window

{% @arcade/embed flowId="t9vSravc2lvFWlirYscq" url="<https://app.arcade.software/share/t9vSravc2lvFWlirYscq>" %}

#### Preview / attach / delete material photo

If a material has an attached image, you can view it directly from the table. If there is no image, you will see a placeholder, which you can change using the same steps.

1. Open the Materials page
2. Find the Material name column
3. Click on the photo thumbnail (or placeholder icon)
4. A larger preview opens in a modal window
5. Delete / expand a current photo or attach a new one

{% @arcade/embed flowId="oAmF8iOBjzS2XuMT5t75" url="<https://app.arcade.software/share/oAmF8iOBjzS2XuMT5t75>" %}

#### Edit material status

Material status (Active/Inactive) can be updated directly from the table.

1. Open the Materials page
2. Find the Status column
3. Click on the status badge
4. The system opens a modal window with confirmation of the operation
5. Accept a new status or cancel the action

{% hint style="warning" %}
Deactivation of material does **NOT** remove it from the system, instead it hides it to the bottom of the list. Materials may still be referenced in other modules, so deleting such materials could break data connections or lead to inconsistencies.
{% endhint %}

{% @arcade/embed flowId="gbSn6cp4YCQ3hAlp5qF8" url="<https://app.arcade.software/share/gbSn6cp4YCQ3hAlp5qF8>" %}

#### **Change unit of measure**

You can update the Unit of measure directly from the table using a drop-down list.\
Steps:

1. Open the Materials page
2. Find the Unit of measure column
3. Click on this field for the required material
4. Select the appropriate value from the drop-down list
5. The system automatically saves the change

{% @arcade/embed flowId="1DerkbHSQJzpwTmUQubo" url="<https://app.arcade.software/share/1DerkbHSQJzpwTmUQubo>" %}

#### **Edit material external ID and description**

Both Material external ID and Description are editable text fields and follow the same logic.

1. Open the Materials page
2. Click into the Material external ID or Description field you want to update
3. Type or modify the text as needed
4. Press Enter to save your changes or click outside the field to apply them
5. The system automatically saves the change and shows the toaster notification “<mark style="color:$success;background-color:green;">✅Successfully updated</mark>”

{% @arcade/embed flowId="0MVJxFjQ9w4mJMBDFYbR" url="<https://app.arcade.software/share/0MVJxFjQ9w4mJMBDFYbR>" %}

#### Edit purchase and actual prices

Prices can be quickly updated through inline editing

1. Open the Materials page
2. Find the Purchase price or Actual price column
3. Click on the price value and enter the new value in the input field
4. Press Enter or click outside to apply changes
5. The system automatically saves the change and shows the toaster notification “<mark style="color:$success;background-color:green;">✅Successfully updated</mark>”

#### Edit material parameters

Materials may include additional structured parameters stored in a separate set.

1. Find the Parameters column on the Materials page
2. Click on the parameters name or value
3. Edit parameters in the modal window:
4. Edit existing parameters/values
5. Delete parameters from material
6. Add new parameters from drop down list

{% hint style="info" %}
Parameters that are displayed in a drop down list are taken from configured parameter templates in Settings. *Read more about Parameter Templates and their configuration here -* [Settings](/manuals/settings).
{% endhint %}

4. Click **Save**
5. The system automatically saves the change and shows the toaster notification “<mark style="color:$success;background-color:green;">✅Successfully updated</mark>”

{% @arcade/embed flowId="tcbX5PfvhofxueGyQpGV" url="<https://app.arcade.software/share/tcbX5PfvhofxueGyQpGV>" %}

#### Open / edit supplier details

You can quickly open supplier details by clicking on any cell that is related to this group - Supplier company, Supplier country, Email, Phone number, Supply delivery time, Main contact person.\
**Steps**:

1. Open the Materials page
2. Find the Supplier details group
3. Click on any cell related to this group
4. The system opens a modal window with all supplier details
5. Add or edit Supplier information&#x20;

{% hint style="warning" %}
Changes to supplier details will apply across all materials with this supplier, except from “Supply delivery time”&#x20;
{% endhint %}

6. The system automatically saves the change and shows the toaster notification “<mark style="color:$success;background-color:green;">✅Successfully updated</mark>”

{% @arcade/embed flowId="B7B77ySQYyxywoZZkt4G" url="<https://app.arcade.software/share/B7B77ySQYyxywoZZkt4G>" %}

### Manage tags

Tags help categorise and filter materials. You can assign or remove them by following these instructions.

1. Open the Materials page
2. Find the Tags column
3. Click inside the tag field
4. The system opens a modal window, where you can manage tags
5. Select or deselect tags from the list (creating new ones is available only for Admins)
6. Click **Save** to update the attribute

{% @arcade/embed flowId="7oxv02UW2PQldcFMdjBJ" url="<https://app.arcade.software/share/7oxv02UW2PQldcFMdjBJ>" %}


# Adding new Materials

The “New Material” modal allows to create and configure a new material by entering its general information, supplier details, parameters, and additional data.\
This section describes the modal structure, field behaviour, validations, and possible system responses.

## Opening the “New Material” modal

To create a new material:

1. Open the Materials page.
2. Click Add new material.
3. The modal opens in four tabs:
   * General info
   * Supplier details
   * Material parameters
   * Other

Each tab may contain required fields marked with \*.

{% @arcade/embed flowId="C4EmZxGPQRj6qfm4XKHX" url="<https://app.arcade.software/share/C4EmZxGPQRj6qfm4XKHX>" %}

## General info Tab

This tab includes the base information about the material: name, category, subcategory, purchase price, cover image, and description.

### Material details

In this section you can enter the essential information about the material:

* #### Material name\*
  1. Enter the name of the material.
  2. This field is required and must contain a unique, descriptive name.
* #### Unit of measure\*
  1. Select a measurement unit from the drop-down list.
  2. This field is required. The selected unit will be used across the system for stock, procurement, and production operations.

<figure><img src="/files/32DPYUZvsrXbjIvqoBvB" alt=""><figcaption><p>Filled Material Details (after filling required fields button "<strong>Save</strong>" becomes enables)</p></figcaption></figure>

### Cover

Upload an image to visually represent the material by choosing one of the options:

1. Drag & drop a file into the upload are
2. Click to upload a file from your device

Supported formats: JPG, JPEG, PNG, WEBP

Uploading a cover is optional, but it helps users quickly identify materials in tables and lists.

<figure><img src="/files/uG9dJcf82x6qzhtlilDD" alt=""><figcaption><p>Uploaded cover</p></figcaption></figure>

### Material metadata

This section includes additional attributes used for search, categorisation, and integrations.

* #### Material external id
  1. Enter an external UUID or another unique identifier used in your ERP or supplier system.
  2. This field is optional and can contain numbers and symbols.
* #### Category
  1. Select a category for this material from the drop-down list.
  2. You can use a search feature to find a category faster.
  3. If no category is selected, the material will appear under “Without category”.
* **Creating a new category**

  If no existing category matches your input:

  1. Type a value into the **Category** field.
  2. The system displays a **“new category”** option at the top of the drop-down list.
  3. Select it to create a new category.
  4. After creation:
     * a new category tab appears in the Materials list
     * the Subcategory field resets and becomes empty

  <mark style="background-color:$info;">ℹ️ Category names must be unique - duplicates cannot be created</mark>
* #### Subcategory
  1. This field becomes enabled only after you select or create a Category
  2. Select a subcategory by scrolling a drop-down list or using search
  3. If a subcategory is not selected, but a category is chosen, the material will be placed under **“Without subcategory”** within that category
* **Creating a new subcategory**

  If no existing category matches your input:

  1. Type a value into the **Subcategory** field.
  2. The system displays a **“new subcategory”** option at the top of the drop-down list.
  3. Select it to create a new subcategory for the chosen category.

  <mark style="background-color:$info;">ℹ️ Subcategories may repeat under different categories - names do not have to be unique across the system</mark>

<figure><img src="/files/rVbMaPV9YViIRy3MtyOw" alt=""><figcaption><p>Fields for filling Material metadata</p></figcaption></figure>

### Cost

This section allows you to specify financial attributes used in purchasing workflows.

* #### Purchase price

  The original unit price of the material when it was purchased.

  1. Enter the purchase price of the material.
  2. The currency for Materials is **USD** by default and can be configured in Settings.
  3. This value is used for cost calculations and procurement planning.
* #### <mark style="background-color:$info;">Actual price</mark>

  The adjusted unit price after applying changes.

  * This field appears only **when editing** an existing material
  * It displays the adjusted unit price after applying changes (based on purchase updates or system recalculations).

<figure><img src="/files/eb1XdhexOXi5wpqZuMWV" alt=""><figcaption><p>Cost section</p></figcaption></figure>

### Description

* In this section you can write some additional information about the material.
* The input field allows to enter up to 1000 symbols in the text box.
* Typing stops automatically once you reach the limit.

<figure><img src="/files/R0fWkAHjDAeuhLKxKSvt" alt=""><figcaption><p>Description</p></figcaption></figure>

## Material parameters tab

This tab is used to add technical or descriptive parameters for the material.

### Adding Parameters

* Click **Add** parameter to insert a new row - you may add up to 10 parameters
* If the limit is reached, the Add button becomes disabled
* Select the name and value for a parameter from drop down list
* Parameters and their values are displayed in the order they were added

{% hint style="warning" %}

## Missing parameter setup

If no parameters were configured in ⚙️**Settings**, there will appear a placeholder view and link to the **Settings → Material page**.

*Read more about configuring parameters* [*in this article*](/manuals/settings/materials)*.*
{% endhint %}

<figure><img src="/files/6QM8ymI17MDeiPCbF0mB" alt=""><figcaption><p>Add material parameters</p></figcaption></figure>

## Supplier details tab

This tab allows you to specify information about the supplier of the material, including company details and contact information for procurement and communication purposes.

### Supplier information

In this section, you can enter or select details about the supplier:

* #### Supplier company
  * Enter the name of the supplier company and select from the drop-down list of existing suppliers
  * After selecting an existing supplier, the system fills other fields (except from “Delivery time”) with available information about supplier company
  * This field is optional but recommended for tracking and integrating with procurement workflows
  * If no match is found, you can create a new supplier by selecting the “new supplier” option that appears in the drop-down list
* #### Supplier country
  * Select the country of the supplier from the drop-down list.
  * This field is optional and helps with logistics, customs, and regional filtering.
* #### Supply delivery time
  * Enter the estimated delivery time in the numeric input field.
  * Select the time period (hours, days, weeks or months) from the adjacent drop-down list.
  * This value is optional and is used for planning production schedules and inventory replenishment.

<figure><img src="/files/oZFxdK5tqNUy6PlQdr8a" alt=""><figcaption><p>Enter Supplier information</p></figcaption></figure>

### Contact information

This section includes details for the primary contact at the supplier:

* #### Main contact person
  * Enter the first name and last name of the main contact in the respective fields.
  * These fields are optional but useful for direct communication.
* #### Phone number
  * Enter the phone number of the contact person.
  * This field is optional and include the full international format if applicable.
* #### Email
  * Enter the email address of the contact person.
  * This field is optional but enables automated notifications and inquiries.

<figure><img src="/files/cwe4LLLv3Ms17StgYUXs" alt=""><figcaption><p>Enter supplier Contact information</p></figcaption></figure>

## Other tab

This tab allows you to assign and manage tags for the material. Tags help with organisation, quick filtering, and categorisation across the system, such as grouping materials by type, colour, supplier, or custom attributes.

The main view of this tab displays a "Tags" label with a "<mark style="background-color:blue;">**Manage tags**</mark>" button. If no tags are assigned yet, the area below may appear empty.

* Click "<mark style="background-color:blue;">**Manage tags**</mark>" to open a modal for selecting and managing tags.
* On the Manage tags Modal you can use <mark style="background-color:purple;">🔎Search Bar</mark> to find existing tags quickly, the search is dynamic and updates the list below as you type.
* The system displays tags list with available tags and check-boxes for selection.
* Check the boxes to assign one or more tags to the material.
* After selecting tags, close the modal to return to the **Other tab**

{% hint style="info" %}
📝*Note:* For adding new tags or editing existing ones you need the Admin permission. *Read more about “Tags”* [*in this article*](https://docs.hesh.app/manuals/production/production-management/tags)*.*&#x20;
{% endhint %}

## Saving the Material

When all required fields in all tabs are valid:

1. The Save button becomes enabled.
2. Clicking **Save** at the bottom of the modal creates the new material.
3. If successful, a "<mark style="color:$success;background-color:green;">✅Successfully created</mark>" notification appears, and the new material is added to the Materials list

{% @arcade/embed flowId="zmNcBtyv8m5jjeNRDA5Q" url="<https://app.arcade.software/share/zmNcBtyv8m5jjeNRDA5Q>" %}

#### Where the material appears:

* If no category was selected → it appears under Without category tab.
* If category is selected:
  * Subcategory is empty → it appears under Without subcategory within the chosen category.
  * Subcategory is selected → it appears under chosen subcategory within this category.

<figure><img src="/files/dbMVS30l7XClHF1irrb8" alt=""><figcaption><p>Saved material</p></figcaption></figure>


# Filters, sorting and searching Materials

The Materials page allows you to quickly find the items you need using interactive filters, sorting, and search. All changes are applied instantly, so the table updates automatically based on the selected parameters.

This guide explains how to work with search, sorting, filters, and infinite scroll on the Materials page.

### General Rules and Information

* Filters, sorting, and searching are available in the Materials table.
* The table updates interactively when you apply filters, sorting, or search queries.
* The page uses infinite scroll.
* Sorting is enabled for all columns.
* Default sorting:
  * Material name → A to Z
  * Status → A to Z
* You can sort by:
  * clicking the column header
  * selecting sorting options in the More actions menu (⋯)
* Search is enabled only for columns that have input field under the title of the column.
* If a column has no search field, it cannot be searched directly.
* Columns with active sorting or filtering are visually marked with ascending/descending arrows or dot in the right corner of filter vector.
* “Columns” sidebar shows markers for columns where filters or search are applied, including for collapsed groups.

## Searching 🔎

Searching is available only for columns where the search field is enabled.

#### How to use search

1. Open the Materials page.
2. Find a column that supports search (a search input is visible under the title of column).
3. Enter your search query in the search field.
4. The system updates the table and displays only the rows that match your query.

{% hint style="info" %}
If no materials match the search value, the table will simply show an empty table with **“No results”**.
{% endhint %}

To clear the search value, click **Clear filters** - this resets the search input and restores the full list of materials.

{% @arcade/embed flowId="NRI5XjGuNPpxa0ICe1yX" url="<https://app.arcade.software/share/NRI5XjGuNPpxa0ICe1yX>" %}

## Sorting ↕️

Sorting can be applied in two ways: by clicking the column header or through the More Actions menu.

### Sorting by clicking on the column header

1. Open the Materials page.
2. Navigate to a column that supports sorting.
3. Click the column name.

*The system*:

* sorts the data according to the column’s sorting order
* switches between **Ascending** (A → Z) and **Descending** (Z → A)
* shows an arrow indicator next to the column header

{% @arcade/embed flowId="sgxuEa3n7XWKW0W7IWR8" url="<https://app.arcade.software/share/sgxuEa3n7XWKW0W7IWR8>" %}

### Sorting from the More Actions menu

1. Click the ⋯ (More actions) icon in the column header.
2. A menu appears with sorting options:
   * Sort Ascending
   * Sort Descending
3. Select the desired option.

*The system:*

* applies sorting
* updates the sorting arrow indicator
* closes the menu

<figure><img src="/files/ZoG4e2EMMYJ7h0mnAvL6" alt=""><figcaption></figcaption></figure>

#### Clearing Sort

1. Open the More Actions menu of the same column.
2. Select Clear Sort.
3. The system:
   * removes sorting
   * restores the table to the previous state before sorting was applied

<figure><img src="/files/Nes3DxFSfy2avG5xHsor" alt=""><figcaption></figcaption></figure>

## Filtering ☰

Different filter types are available depending on the column: text filters, set filters, auto-suggest filters.

### Filters with auto-suggest (String Text filter + search)

1. Open the Materials page.
2. Click the filter icon on a column that supports auto-suggest.
3. A drop-down with filter options appears.
4. Start typing in the field to narrow the list.
5. Select one or more items.
6. *The system:*
   * filters the table based on the selected value(s)
   * shows only exact matches
   * displays a dot indicator on the filter icon

{% @arcade/embed flowId="UYZ52JT3jZYuUNqpAmxH" url="<https://app.arcade.software/share/UYZ52JT3jZYuUNqpAmxH>" %}

### Set Filter (multi-select filter)

1. Click the filter icon in a column with a set filter.
2. The filter panel appears with:
   * Search input
   * Select all checkbox
   * Checkbox for empty cells
   * List of values
   * *Reset* button

#### Applying the filter

* Choose specific values.
* The table updates immediately.

{% @arcade/embed flowId="Ju8PP8K1Dd4rRqa8sMNi" url="<https://app.arcade.software/share/Ju8PP8K1Dd4rRqa8sMNi>" %}

### Resetting the filters

#### **1. Clearing a filter for a specific column**

Use this method when you want to remove filtering only from one column.

1. Open the **filter menu** for the column where the filter is applied.
2. Click **Reset**.
3. *The system*:
   * removes the filter for that column
   * updates the table immediately
   * keeps all other filters active

<figure><img src="/files/WzGQ1zzvmpxGOn9uXyMX" alt=""><figcaption></figcaption></figure>

#### **2. Clearing all filters in the table**

Use this option when you want to remove **every active filter** at once.

1. Make sure at least one filter is currently applied.
2. Click **Clear filters** at the top of the panel.
3. The system:
   * resets **all** filters across all columns
   * refreshes the table to show the full list of materials
   * disables the **Clear filters** button until a new filter is applied

{% @arcade/embed flowId="N5iPgSXbTXzMCuvi8un1" url="<https://app.arcade.software/share/N5iPgSXbTXzMCuvi8un1>" %}


# Departments

## Basics

In the Departments section, you learn how to create and customize departments for your organization. It is very simple and allows you to build the necessary connections within the company structure.

## Department

{% hint style="info" %}

* Departments can have other sub-departments without limiting the number of nesting levels.&#x20;
* Each department can contain several positions.&#x20;
* The total number of positions, including positions in nested departments, is shown next to the department icon.

  <div align="left"><figure><img src="/files/9v065Ecvsf6KMlcfDKhb" alt="" width="123"><figcaption></figcaption></figure></div>

{% endhint %}

### **Add Department**

1. Press "Add Department".
2. Write name of department.
3. Add as necessary department as needed.
4. New departments are added in alphabetical order: A → Z ⬆️.

{% embed url="<https://app.arcade.software/share/OKIenGsNc6gi5tk4XxX2>" %}

### **Add nested department**

1. Open department where you want to add nested departments.
2. Press "Add Department".
3. Write name of department.
4. Add as necessary department as needed.
5. New departments are added in alphabetical order: A → Z ⬆️.

{% embed url="<https://app.arcade.software/share/2INL0IZgzvBdnBH11vDW>" %}

Here is the full path through your departments.

<figure><img src="/files/AyhDmtkiw8b9gITzRSCh" alt=""><figcaption><p>Department breadcrumbs</p></figcaption></figure>

### **Edit Department**

1. To edit the name of the department just press on it.
2. Edit necessary info.
3. Save changes.

{% embed url="<https://app.arcade.software/share/ZnqitNCb5oBrQ1GPEL1N>" %}

### **Move Department**

*

### **Delete Department**

1. Press ⋮ to open contex menu.
2. Choose delete option from the list.
3. You can delete main department with all nested inside or only nested.
4. If the selected department or its employees are installed in at least one automatic or manual assignment to the task, *<mark style="color:red;">deletion is prohibited</mark>*.
5. If the selected department is not involved in any automatic or manual assignments, a warning message will be displayed and deleting the department will result in the exclusion of all employees associated with it.

{% embed url="<https://app.arcade.software/share/P6kOqYW1C5eqZnilWqu9>" %}

### **Search Department**

* The search for the Department is going on globally. This means that the entered department will be searched at all nesting levels.

{% embed url="<https://app.arcade.software/share/YN7AC5yaTTY10N2uP3We>" %}

## Position

### **Add Position**

1. Open department in what you want to add user or move after creating user to a specific department.
2. You can select an item from the list or enter a new one that you need.&#x20;
3. It is mandatory to assign an employee from the user list to the entered position.&#x20;
4. You can add multiple employees with the same position.

{% embed url="<https://app.arcade.software/share/pxLJZnLSEVl3iYxr2F1N>" %}

### **Edit position**

1. To edit an item, click on the menu context on the right&#x20;
2. Select "Manage" and edit necessary info.
3. Press "Edit" to save changes.

{% embed url="<https://app.arcade.software/share/M873BMTcFI9td5m1YObN>" %}

### **Move Position**

*

### **Delete Position**

* Press ⋮ to open contex menu.
* Choose delete option from the list.
* You can create position anywhere and then move it to any department.
* If the selected position or its employees are installed in at least one automatic or manual assignment to the task, *<mark style="color:red;">deletion is prohibited</mark>*.
* If the selected department is not involved in any automatic or manual assignments, a warning message will be displayed and deleting the position will result in the exclusion of all employees associated with it.

{% embed url="<https://app.arcade.software/share/2L2DHdUvoYPM6Aic60sQ>" %}

### Managing User\`s Depatrment and Position

You can also assign a department and a position to a coworker through the **User** page.


# Users

This is manual for user managing in Hesh app.


# Managing users

In this section, you learn how to manage users in Hesh: add new users, edit their data, add them to a department and set up a position, set days off, and much more.

* New users are added with a <mark style="background-color:blue;">**Pending**</mark> status by default.
* Users have basic permissions by default (Product page - view only).

## Accessing the page

<figure><img src="/files/FzZnNOvanoK9Lu10sp4y" alt=""><figcaption><p>General view of User`s page</p></figcaption></figure>

### **Adding user**

1. Open "User" page
2. Press "Add user" button
3. Fill in basic Info needed for adding user in "Add user" modal
4. Press "Add button"
5. Find your user in the list and open user profile page with all info about this user: General info, Security settings, Position info, Permissions, Day off info

## Managing users

### **Adding user**

1. Press "Add user" button
2. Fill in basic Info needed for adding user in "Add user" modal
3. Press "Add button"
4. Find your user in the list and open user profile page with all info about this user: General info, Security settings, Position info, Permissions, Day off info

{% @arcade/embed flowId="7mrIBC75lVqZdfin9dhO" url="<https://app.arcade.software/share/7mrIBC75lVqZdfin9dhO>" %}

### Inviting users

1. **Adding Users**:
   * When you/admin add a new user, an invitation email is automatically sent to them.&#x20;
2. **Resending Invitations**:

   * If needed, Admin can easily resend invitation emails to users who are still in Pending status.

   <figure><img src="/files/7Mefik0nKhORhDQXxxom" alt="" width="563"><figcaption><p>Resend an invitation</p></figcaption></figure>
3. **Invitation Link**:
   * The link is active for <mark style="color:yellow;">24 hours</mark>.
   * The link is deleted if the manager changes the password or if the user status changes from <mark style="background-color:blue;">Pending</mark> to <mark style="background-color:red;">Inactive</mark>.
4. **Invitation Link Expiration**:
   * If the invitation link expires, the system automatically sends a notification to the admin's email with a new link.
5. **Process of accepting an invitation:**

<figure><img src="/files/DebRl0ZIViHxMi6T86NA" alt="" width="375"><figcaption><p>Invitation for new user</p></figcaption></figure>

<figure><img src="/files/QVpnb8ogZIG9L2BymumA" alt="" width="375"><figcaption><p>Setting the password</p></figcaption></figure>

<figure><img src="/files/H1uy8ldOlrhuMnSCrnJT" alt="" width="375"><figcaption><p>User status after accepting invitation</p></figcaption></figure>

### **Sorting Options for User List**

Use the "Sort" dropdown to arrange the usert list in the order that's most relevant. You can sort by User name, Status , or Create date.

Use the "Sort" dropdown to arrange the usert list in the order that's most relevant. You can sort by User name, Status , or Create date.

* **Create date**: Oldest first ⬆️, Newest first ⬇️.
* **Status**: A → Z ⬆️, Z → A ⬇️.
* **User name**: A → Z ⬆️, Z → A ⬇️.

{% @arcade/embed flowId="UuBqTmBcbZFWhNPqG7gh" url="<https://app.arcade.software/share/UuBqTmBcbZFWhNPqG7gh>" %}

### **Filtering Options for User List**

Use the "Filter\`s" dropdown to look through the usert list in the view that's most relevant. You can filter by "Status" and "Vacation".

* **Status:** All, Active, Inactive, Pending
* **Vacation:** All, At vacation, Not at vacation

### **Searching Options for User List**

Use **"**&#x53;earch by Keyword" option for searching users in your company.&#x20;

{% @arcade/embed flowId="YtdLYD5OCbjtxeqcP13B" url="<https://app.arcade.software/share/YtdLYD5OCbjtxeqcP13B>" %}

### **Inactivating user**

{% hint style="warning" %}
The user cannot be deleted, only **inactivated**.
{% endhint %}

Likewise, you can easily restore access to a user with the same profile.

{% @arcade/embed flowId="EwTHCFxcjfkmS6dNfUTU" url="<https://app.arcade.software/share/EwTHCFxcjfkmS6dNfUTU>" %}


# General Information

### **Edit user general information:**

1. Select a user from the list.
2. Open user profile by pressing on him/her.
3. Press on "General Information" side tab.
4. Press "Upload button" for profile photo.
   * If you want to remove it press "Remove button" for profile photo
5. Press on status icon on "General information".
6. Change status:
   * For Pending status - choose Inactivate button in dropdown or press "Resend invitation" button near
   * For Active status - choose "Inactivate button" in dropdown
   * For Inactive status - choose "Activate button" in dropdown
7. Press "Edit button" on General information.
8. In the "Edit" pop-up change user data: First name, Last name, phone number and external id of a selected user.

{% hint style="danger" %} <mark style="color:red;">User email can not be changed</mark>:exclamation:
{% endhint %}

{% embed url="<https://app.arcade.software/share/PhdJKN5Rig3FS1hiIqTT>" %}
Edit user general information
{% endembed %}

### User statuses

* <mark style="background-color:blue;">**Pending**</mark>:
  * Assigned when a user is added and an invitation email is sent, but has not yet accepted it.
  * Users in this status are not included in task assignments or requests.
  * The status changes to Active when the user sets their password or is manually changed by an admin.
* <mark style="background-color:green;">**Active**</mark>:
  * Assigned when the user sets their password or manually by an admin.
  * Users in this status can log in, assign tasks, to be assigned on the task and complete them.
* <mark style="background-color:red;">**Inactive**</mark>:
  * Assigned manually by an admin from either Pending or Active status.
  * Users in this status are ignored for login, task assignments, and requests but are shown in user list and historical data.


# Security

### **Edit User security info:**

1. Click the "Security" tab in the sidebar.&#x20;
2. You will see the security information for the selected user:&#x20;
   * If the user has a status of "Pending": the system will suggest to create a password for them on the security page.&#x20;
   * If the user does not have the "Pending" status: change the password manually or send a link to reset the password to the user's email so that it follows the "Forgot/reset password" process.&#x20;
3. Click the "Create password/Change password" button.&#x20;
4. In the "Create new password" pop-up window, enter a new password.&#x20;
5. Click the "Confirm password" button in the pop-up window.&#x20;
6. The system displays a message about successful password change.&#x20;
   * If the user's status was "Pending", the system will change the status to "Active".

{% @arcade/embed flowId="5MGdv5XbNhjAljBFeqZ8" url="<https://app.arcade.software/share/5MGdv5XbNhjAljBFeqZ8>" %}


# Position

This tab is a link to a separate page "Department"

### **User Position Info**

1. Open "Position" tab
2. Press "Manage User Position" button
3. Choose position title from the list or write a new one
4. Choose a user&#x20;
5. Press "Save" button
   * If you change your mind press "Cancel" button
6. Assigning a position through this tab, user will not be part of any department, so you should move her/him to the appropriate one.

{% hint style="info" %}
More about it you can find in chapter [Departments](/manuals/departments)
{% endhint %}


# Permissions

Everything about user permissions and their abilities

## Basic rules:

* Permissions are configured for each user on the User details page.&#x20;
* The administrator has all permissions by default. Only the administrator can change the permissions of other administrators.&#x20;
* The administrator cannot disable his administrative rights.
* &#x20;The first user in the company gets the role "Company owner" and the permission "System owner". \
  The company owner can transfer his rights to another user, but a company can have only one owner.
* All users have the "Products view" and "My tasks view & edit" permissions enabled by default. They cannot be switched off. To enable editing, first enable the view.&#x20;
* Enabling the edit permission will automatically enable the viewing of this object.&#x20;

## Main types of users:

* User
* Admin

{% hint style="info" %}
By default, the user has access only to the Product View page on Web. And on mobile My tasks view and edit page. \ <mark style="color:red;">The person who added the new user must set permissions for other features.</mark>
{% endhint %}

## **Web access**

{% hint style="warning" %}
*Product view can't be turn off.*
{% endhint %}

### Products

* #### **Product view**

<figure><img src="/files/SPc7zofWByEDR00hdoUV" alt=""><figcaption></figcaption></figure>

If the user is denied editing access, a modal window appears with the following notification.

<figure><img src="/files/cWdwfADaZGG3dvceEvnI" alt=""><figcaption><p>Denied access to editing</p></figcaption></figure>

* **Product edit**
  * Open "Permission" page in "User" tab.
  * Admin activate "Product edit" toggle.&#x20;
  * The user will be able to create, edit, and publish products, but not launch them into production.

<figure><img src="/files/R96JVyZL75kelWH7Luqb" alt=""><figcaption><p>Activation of Product edit</p></figcaption></figure>

### Production

* **Production view**
  * Open "Permission" page in "User" tab.
  * Admin activate "Production view" toggle.
  * The user needs to refresh the browser page.
  * The user will be able to view a page with productions and can view the planned, started and completed productions.

<figure><img src="/files/DtTjniFPehRysNoQGwbc" alt=""><figcaption><p>Activation of Production view</p></figcaption></figure>

<figure><img src="/files/L1o7qW6nce31xPnAMBMa" alt=""><figcaption><p>Production view page</p></figcaption></figure>

If the user is denied editing access, a modal window appears with the following notification.

<figure><img src="/files/sPDdtjf0VEsRcJg3Y7SM" alt=""><figcaption><p>Denied access to editing</p></figcaption></figure>

* **Production edit**
  * Open "Permission" page in "User" tab.
  * Admin activate "Production edit" toggle.&#x20;
  * The user needs to refresh the browser page.
  * The user will be able to create, edit, and publish productions.

<figure><img src="/files/pHOT2URSw9qoXGRuwo5l" alt=""><figcaption></figcaption></figure>

{% @arcade/embed flowId="GBOJpQJjJdLeQQtM5Evy" url="<https://app.arcade.software/share/GBOJpQJjJdLeQQtM5Evy>" %}

### Tasks

* **Task view and Task edit level**
  * Open "Permission" page in "User" tab.
  * Admin activate "Task view" toggle and choose "Task edit level".&#x20;
  * The user needs to refresh the browser page.
  * The user will be able to create and manage task according to chosen level.

<figure><img src="/files/uEidtxd393t05L4LGghW" alt=""><figcaption><p><strong>Task view and Task edit level permissions</strong></p></figcaption></figure>

If the user is denied editing access or the editing level does not allow editing the selected task, a modal window appears with the following message.

<figure><img src="/files/5hP0Sng1uNfilcjBsgBP" alt=""><figcaption></figcaption></figure>

* **Manage failed tasks** \
  Reopened tasks behaves similar to To do tasks, but user doesn\`t get repayment for it.
* **Manage “In queue” state**\
  This functionality allows you to unlock tasks independently of the queue. By default, the next task is unlocked when the previous one is closed. In this case, the user has permission to unlock the task, and then the next performer can start working.

<figure><img src="/files/gwbD0om47GeF9FvoDVWK" alt=""><figcaption></figcaption></figure>

### Other

In this section, the Admin/User can activate other pages for the user if necessary, but only on request, because this access to this functionality is optional and does not affect the performance of the direct functional duties of an ordinary user.

<figure><img src="/files/ElTFkGqtdfMhMaMucKi3" alt=""><figcaption><p>Section "Other"</p></figcaption></figure>

Access to these pages has the following consequences:

* the user can create and manage positions and departments.
* the user can set up permissions for other users.
* The user can configure the company profile.
* The user can see the analytics available for the company.

## **Mobile application access**

Permissions for the mobile version are configured separately. But their basic meaning is the same as in the "**Web access**".

Until you activate any of them, only "My tasks view and edit" will be available for perfomers.

<figure><img src="/files/a4bzLTeeo6xHdyux9qCB" alt=""><figcaption><p>Mobile permissions</p></figcaption></figure>


# Managing day-offs

* **Day Off**:
  * A "Day off" icon is shown with start and end dates on the Users page.
  * The system ignores users on their day off for automatic task assignments.

{% hint style="warning" %}
Adding days off is not possible without entering the time
{% endhint %}

{% embed url="<https://app.arcade.software/share/CcU71H0x7XproEAb0Neo>" %}


# Settings

{% hint style="info" %}
Page is under construction
{% endhint %}

## Overview

The Settings page in HESH provides a centralized platform for configuring system-wide options that affect both web and mobile apps. It enables customization of company-specific information, task management parameters, production deadlines, and user interface behavior to align with operational needs.

By exploring this page, you will understand how to configure company-specific settings, including auto-filled and default options, manage branding elements like logos and abbreviations for seamless identification, and set deadlines, rewards, and task card views for all users. You will also learn how to establish working schedules, notification rules, and the logic for sorting tasks based on priorities and deadlines. Moreover, the page explains how to customize the number of managers assigned to productions.

## Key Features

1. Flexible management of company branding elements, including logo uploads, order key abbreviations and currency.&#x20;
2. System-wide configuration of options such as currency, language, production deadlines, and task card views.
3. Tools for managing task corrections, reporting periods, and rewards after deadlines.&#x20;
4. Settings for user schedules, day-off management, and system notifications.

<figure><img src="/files/Zy7vb4bvUTGrmOeR5KBu" alt=""><figcaption></figcaption></figure>

The following three articles will describe each of the tabs and the settings they have.


# General

## Overview

General page is designed for setting company's basic customization. Set basic info such as company logo and name, currency and abbreviation easily.

<figure><img src="/files/DgzSMLj93nGxs6fnSviM" alt=""><figcaption></figcaption></figure>

## Company logo

A company's logo is more than just a visual symbol—it's the cornerstone of its brand identity.&#x20;

Within our system, the company logo plays a key role, appearing across various elements such as notifications, web interfaces, and mobile vendor accounts, ensuring a consistent and professional presence.&#x20;

To maintain high-quality visuals, the system supports logo uploads in multiple formats, including *SVG, JPG, JPEG, PNG,* and *WEBP*. \
However, the uploaded image must meet specific size requirements, with a minimum height of `128px` and a width of `2000px`, to guarantee optimal display across all platforms.

### Upload the logo

The default appearance of the logo is the first two letters of the first word of the company name, or the first letters of two words of the company name.&#x20;

1. Open Setting page
2. Click on the "Upload" button
3. Choose the picture

{% @arcade/embed flowId="56sXbFXyiQvEvOINXRZB" url="<https://app.arcade.software/share/56sXbFXyiQvEvOINXRZB>" %}

After adding a logo, will appear a button to remove the it.

## Web platform default language

The web platform is localized, that is, there is another language for the it - Ukrainian. To change web platform language just select the appropriate option in the list. Selected language will be applied at once without reloading the page.

1. Open Setting page
2. Click on the preffered language from the drop-down

{% @arcade/embed flowId="wDDIvlosaGOa46Sf4FfX" url="<https://app.arcade.software/share/wDDIvlosaGOa46Sf4FfX>" %}

### Remove the logo

1. Open Setting page
2. Click on the "Remove" button

{% @arcade/embed flowId="j9u4xOCu54gm03X1SfVF" url="<https://app.arcade.software/share/j9u4xOCu54gm03X1SfVF>" %}

## Company Name

When first setting up a company, the system simplifies the process by auto-filling mandatory fields like Company Name and Currency, using the information provided during registration. However, for non-mandatory fields on the Settings page, the system leaves planned spaces blank if the data is missing, allowing users to populate these fields at their convenience.

### Edit company name

1. Open the settings page&#x20;
2. Enter the company name&#x20;
3. Click "Save" to confirm the changes&#x20;
4. After saving, the new company name will be automatically updated in both the web and mobile applications

{% @arcade/embed flowId="SFVlMGgAWMjkdfjLMzmj" url="<https://app.arcade.software/share/SFVlMGgAWMjkdfjLMzmj>" %}

## Key abbreviation

The key abbreviation serves as a critical identifier for order keys, production keys, and task keys in the system. This abbreviation ensures uniformity and quick recognition across various system elements. If the key abbreviation field is not filled, the system automatically generates one by using the first two letters of the company name, shown as capital letters in the user interface.

Users can manually define the abbreviation, limited to a string of up to two characters, allowing customization while adhering. The following steps explain how to set or modify the key abbreviation effectively.

### Edit key abbreviation

1. Open the settings page&#x20;
2. Enter the key abbreviation&#x20;
3. Click "Save" to confirm changes&#x20;
4. After saving, the system updates the key abbreviation for all existing and new order, production, and task keys in accordance with the rules for generating IDs for production items and tasks&#x20;

{% @arcade/embed flowId="URbvbhMPidbyP1paXfij" url="<https://app.arcade.software/share/URbvbhMPidbyP1paXfij>" %}

{% hint style="warning" %}
If the key abbreviation is not filled in, the system automatically substitutes the first 2 letters of the company name. \
The input is limited to a string of up to 2 characters, which are displayed as capital letters in the interface.
{% endhint %}

## Currency

Currency is an essential element in managing financial aspects of the system, such as rewards, task bonuses, and performer salary information. The currency field allows a string of up to 5 characters, ensuring flexibility for different currency codes. Once defined, the currency is consistently displayed across all relevant sections of the system.

### Edit currency

1. Open the settings page&#x20;
2. Enter the name of the currency&#x20;
3. Click "Save" to confirm the changes&#x20;
4. After saving, the system automatically applies the entered currency to all financial information of the company, including task templates, bonuses, and rewards

{% @arcade/embed flowId="LFKyH1nyuYTEaqU3mIJl" url="<https://app.arcade.software/share/LFKyH1nyuYTEaqU3mIJl>" %}

## Analytics report link

This field is used to insert an embeded link to an analytical web-published reports to HESH Analytics page based on company data: production, employees, reward, etc.&#x20;

This link may be missing, in which case the Analytics page will default to the default state.

<figure><img src="/files/aT8bcMUQmLBiFYbwb28t" alt=""><figcaption></figcaption></figure>

All these instructions will guide through the process of setting up and editing company information. After that let's get closure to the next tab.


# Production

## Overview

The "Production" tab of "Settings" page contains all the settings for the production process. All these settings help to extend the flexibility of production processes and quickly make the necessary changes.  Each setting is described in more detail below.

<figure><img src="/files/31I82Jd9OdJXnYCr4Ipe" alt=""><figcaption></figcaption></figure>

### Default production deadline

This parameter defines the standard number of calendar days allocated for production completion. The value is automatically applied to each newly created product to ensure that deadlines are consistent across all productions.&#x20;

For example, if the production of a product basically takes 5 days, set 5 days in the field, and when the product is put into production, the deadline will be automatically set from the current day plus 5 days.

### Overwrite production deadline values from an external system

When enabled, this setting allows the system to override default or manually set production deadlines with values imported from an external system. This ensures that deadlines remain synchronized with external production schedules or management tools.

### Change priority of production item X days before deadline

This setting specifies the number of days before a production’s deadline when the system should automatically adjust the priority level of the production item. Adjusting the priority helps streamline workflows and ensure timely completion of high-priority items.

### Change priority of tasks of production item X days before deadline

This setting specifies the number of days prior to a production item's deadline when the system should automatically adjust the priority of associated tasks. This ensures that critical tasks receive the necessary attention as deadlines near.

### Allow to change task status from “Done” to “In progress”

When enabled, this setting permits users to revert a task’s status from “Done” back to “In Progress.” This is useful in scenarios where corrections or additional work are required on a completed task. \
This setting generally allows the system to return tasks to progress.&#x20;

However, this setting requires that you additionally give certain users the ability to return tasks to progress. This is configured [in the permissions of each user](/manuals/users/permissions). If you don't give this permission to any user and enable this setting for the company, and vice versa, if you give it to users, but don't enable it for the company, then it is impossible to return tasks to "In progress" status.

### Task correction days after reaching “reporting period”

This setting defines the number of days during which users can edit specific fields, such as “Time Spent” and “Reward Correction,” after the reporting period has ended. It allows for necessary adjustments or corrections to task rewards even after the reporting period is finalized.


# Mobile app

## Overview

The "Mobile app" tab of "Settings" page contains all the settings for the mobile application. \
Each setting is described in more detail below.

<figure><img src="/files/wYU6Dhpd8e6sW4tZp3IS" alt=""><figcaption></figcaption></figure>

## Mobile app default language

The mobile application is localized, that is, there is another language for the application - Ukrainian. To change app language just select the appropriate option in the list.

<figure><img src="/files/Ijkh9dRCYHS7lWk1jEHi" alt=""><figcaption></figcaption></figure>

## Task card management

By default, each task card displays key production attributes such as product name, version, option, client, external order number, and production deadline. However, if your company requires different information to be shown, we will now go through how to configure the task card to match your specific needs.

There are two ways to customise the appearance of a task card:

1. Add or remove extra options
2. Customise the main task card for your company

There is an list of extra option to display:

* Hierarchy
* Root product
* Production note
* Product variant photo
* Line item note

Just click on the check-box setting and refresh the mobile app after that. All these option will apper in the gray section below the main task card.

<figure><img src="/files/5njX4Qofe5nb0l67sPyV" alt=""><figcaption></figcaption></figure>

### And what about the default task card?&#x20;

Choose "Task card display settings" and select the fields to be displayed in the task card. Here detalized guide how to do it:

1. Click on the task card settings to open menu with all attributes
2. Add desired attribute to the section "Shown" or remove one to the section "Hidden"
3. Rearrange the attributes order if nesessary
4. Refresh mobile app

{% @arcade/embed flowId="nDDkV47Vq45r8eMG1ewB" url="<https://app.arcade.software/share/nDDkV47Vq45r8eMG1ewB>" %}

Here the task card view acoording to the settings:

<figure><img src="/files/7P9fpq6pFIkZxsf3mYNW" alt=""><figcaption></figcaption></figure>

The number of attributes that can be added is unlimited. You have full flexibility to configure and arrange them in the order that best aligns with your company’s structure and operational requirements.

The task card is fully adaptable — it displays only the attributes relevant to your company’s requirements, ensuring a streamlined and efficient experience. These guide covered how to configure and customize the task card layout based on company specific needs.

## Active task limits

The "**Active task limits**" settings helps ensure that users focus on completing their current tasks before starting new ones. It allows production managers to control how many tasks a user can have in progress at the same time, based on their **Department** and **Position**, so that the most important work is always completed first.

<figure><img src="/files/78aN0Xgohwo9lx8zjLtQ" alt=""><figcaption></figcaption></figure>

#### How to set up Task Limit Rules

1. Go to **Settings → Manage limits** (*available to Admins or users with “Settings view and edit” permission*).
2. Click **“Add rule”** to create a new rule.
3. Select one or more **Departments**.
4. Select the corresponding **Positions** (*only positions related to selected departments will be available*).
5. Enter the **Quantity** - the maximum number of active tasks allowed per user.
6. Click **“Apply”** to save the rule.

{% @arcade/embed flowId="U0E62Ndw8x7Fitul5rXB" url="<https://app.arcade.software/share/U0E62Ndw8x7Fitul5rXB>" %}

#### How it works

* The system counts tasks in **“In Progress”**, **“On Hold”**, and **“Blocked”** statuses as active.
* Users can only start new tasks if they are within their allowed limit.
* Only the **highest-priority tasks** are available to start - lower-priority tasks are restricted until earlier ones are completed.
* If multiple rules apply to a user, the system uses the **least restrictive limit**.
* If no rule is set for a user’s Department and Position, no limits are applied.
* When the user tries to start unavailable task, the app shows a warning banner.

<figure><img src="/files/Ca9rqkml8VzrJqWTYkyi" alt="" width="275"><figcaption></figcaption></figure>

{% hint style="info" %}

#### Manager override

* If needed, a manager can start a task for a user even if the task limit has already been reached.
* In this case, the system **does not increase the limit** and treats the situation as **overload**.
* The user will still be unable to start new tasks until the number of active tasks drops below the defined limit.
  {% endhint %}

<figure><img src="/files/SkHAMHw0GMIqTP100hp3" alt=""><figcaption></figcaption></figure>


# Materials

The **Materials** tab in Settings allows you to configure two key elements used across the Materials catalogue:

1. **Material currency** - the currency applied to all material prices.
2. **Parameter templates** - the list of attributes and their possible values that users can apply to materials.

### **1. Material Currency**

Defines the currency used across Materials catalogue and their prices. By default, the value is set to USD currency.

#### **How to change the currency**

1. Open **Settings → Materials**.
2. Click the currency field or start typing the currency name.
3. Select a currency from the drop-down list.
4. The change applies immediately to:
   * all existing materials prices
   * default currency in the “New material” modal

{% hint style="info" %}
ℹ️ **When the currency is changed, the system does not recalculate values**.\
*For example, 10 UAH becomes 10 USD, not converted.*
{% endhint %}

{% @arcade/embed flowId="VbpPeBXpERxrds8AejKJ" url="<https://app.arcade.software/share/VbpPeBXpERxrds8AejKJ>" %}

### **2.** Parameter Templates

Parameter templates define which attributes can be assigned to materials. You can add, rename, delete, search, and reorder both parameters and values.

To open the editor:

1. Go to **Settings → Materials**.
2. Click **Manage templates**.
3. You can see the **Manage templates modal** with:
   * Parameter list on the left
   * Values list for the selected parameter on the right

<figure><img src="/files/r6nOq1xQ9sbDpOybc0Y6" alt=""><figcaption></figcaption></figure>

### **Adding Parameters**

#### **Adding first parameter (empty list)**

If the system has no parameters:

1. Click **Add templates**.
2. Enter the parameter name.
3. Click ✅.
4. The parameter appears in selected state.
5. An empty “Values” area appears on the right - you must add at least one value before Apply becomes active

<figure><img src="/files/NoMyPNiE51fDS62jdnja" alt=""><figcaption></figcaption></figure>

#### **Adding additional parameters**

1. Click **Add parameter**.
2. Type the name → Click **✅**.
3. The parameter is added to the list.
4. Its Values section becomes active for editing.

{% @arcade/embed flowId="SOULJEgmNVHxEdxqW1FW" url="<https://app.arcade.software/share/SOULJEgmNVHxEdxqW1FW>" %}

### **Adding Values**

#### **Adding first value**

1. Select a parameter.
2. Enter the value name in the Value input.
3. Click  **✅**.
4. System adds the value to the bottom of the list.

{% @arcade/embed flowId="W9BH2bkgSSrigTZZxYwP" url="<https://app.arcade.software/share/W9BH2bkgSSrigTZZxYwP>" %}

#### **Adding additional values**

1. Select a parameter.
2. Click **Add value**.
3. Enter the value name in the Value input.
4. Click  **✅**.
5. Click **Apply** at the bottom of the modal to save changes.

{% @arcade/embed flowId="22vC6xSkOeVYyhZ3MqA6" url="<https://app.arcade.software/share/22vC6xSkOeVYyhZ3MqA6>" %}

### **Searching**

#### **Search parameters**

1. Type in the **Search by parameter** field.
2. The list shows only matching parameters.
3. If nothing matches → **“No results”** appears.

#### **Search values**

1. Type in **Search by value**.
2. Matching values are displayed.
3. If nothing matches → **“No results”** appears.

{% @arcade/embed flowId="8lxVVaXNnAkZPv0fJy9S" url="<https://app.arcade.software/share/8lxVVaXNnAkZPv0fJy9S>" %}

### **Editing**

#### **Editing parameter name**

1. Click the parameter name.
2. Edit the text.
3. Click ✅.
4. The new name is saved locally and becomes active after clicking **Apply**.

#### **Editing value**

1. Click the value name.
2. Edit the text.
3. Click ✅.
4. Value updates locally and becomes active after clicking **Apply**.

{% @arcade/embed flowId="qMjiqrj9bWwUyTDsDrjH" url="<https://app.arcade.software/share/qMjiqrj9bWwUyTDsDrjH>" %}

### **Deleting**

#### **Deleting a parameter or value**

1. Click on the parameter/value name.
2. Click 🗑️ to delete an attribute.
3. If parameter/value **is used in materials:**
   1. System **deactivates** it
   2. Hidden from drop downs in new materials
   3. Still shown in materials where used

{% hint style="danger" %}
If you try to delete the last parameter or value, system disables button "**Apply**".
{% endhint %}

{% @arcade/embed flowId="a1tILaDwDzK91Wmz7w39" url="<https://app.arcade.software/share/a1tILaDwDzK91Wmz7w39>" %}

### **Reordering values**

1. Grab a value using the drag handle.
2. Drag it to a new position.
3. System saves the updated order immediately locally.
4. Order is fully saved after clicking **Apply**.

{% @arcade/embed flowId="JkMqbdtnjIljffxwUgZX" url="<https://app.arcade.software/share/JkMqbdtnjIljffxwUgZX>" %}


# Mobile App


# Home

## Overview

The Home page serves as the central hub for reviewing user tasks and quickly managing their statuses. It displays tasks with statuses such as "Completed," "In Progress," or "On Hold," along with the earned balance.

The Home page allows you to view all your current tasks, update their statuses directly on the page, and quickly access your earned balance. Additionally, it displays company information, your user name, and your avatar for easy identification.

By reading this article, you will learn how to view and manage your tasks on the Home page, change task statuses to reflect their progress, and track your earned balance effectively.

<figure><img src="/files/8KHsbN6c0kZMjtqpVvke" alt="" width="280"><figcaption></figcaption></figure>


# Performer task screen


# Task list

## **Overview**

The Tasks Page in the mobile app provides a streamlined and organized view of all tasks, allowing users to manage, filter, and group tasks effectively. It adapts dynamically to user preferences and company-wide settings, ensuring an intuitive experience for tracking and updating task progress.\
\
The page enables users to view tasks grouped and filtered by their selected options, save their preferred configurations, and automatically sort tasks by priority, due date, and deadlines. Users can expand or collapse task sections, dynamically view changes in real time, and easily navigate task hierarchies. Additionally, it supports seamless updates to task information, ensuring efficient task management without manual refreshes.\
\
By reading this article, you will learn how to navigate and customize the Tasks Page, manage tasks using grouping and viewing settings, and understand how task priorities and hierarchies are displayed. You will also discover how dynamic updates ensure task accuracy and efficiency.

## Rules and Information for the Task List

<figure><img src="/files/6zl6cdJmuLLF9iOjPJ3Q" alt="" width="188"><figcaption></figcaption></figure>

1. **Default Opening State**:
   * When the user opens the mobile app **for the first time**, the system automatically navigates to the **Task List screen** with the **"In queue" filter** enabled and **"By status" grouping** option selected. More about grouping and viewing [here](/manuals/mobile-app/performer-task-screen/grouping-and-viewing).
   * The system remembers the last viewed screen, including the selected filters, groupings, and viewing options, when you open it again.
   * Tasks default sorting based on these rules:
     1. **Priority** (highest → lowest).
     2. **Task due date** (closest → farthest).
     3. **Production deadline** (closest → farthest).
   * Example: A high-priority task with the earliest deadline appears at the top of the list.
2. **Collapsible Sections**:
   * Tasks are grouped into collapsible sections based on the grouping option (e.g., by status or by priority).
   * Each section has a **counter** displaying the number of tasks in that group.
3. **Hierarchy Display Rules**:
   * Tasks linked to component or additional productions display their full hierarchy in the format:\
     **Root Production > Parent Production > Production Name.**
   * The hierarchy is displayed only for relevant tasks and is aligned across the Task List, task details, and the Home screen.
4. **Missing Information Handling**:
   * If a task lacks any of the following attributes: Client, External order number, Marketplace order number, Start date or Deadline system marks the attributes as blank.
5. **Dynamic Updates**:
   * The task list updates in real-time. Any changes (e.g., task status updates, edits to deadlines) are reflected dynamically without requiring a manual refresh.

## Actions with the task list

### Open sections

1. Open the "Tasks List" screen
2. Click on the specific section to open

{% embed url="<https://app.arcade.software/share/WRJuolWuMQFiXutRKZkh>" %}

### Open task

1. Open the "Tasks List" screen
2. Expand any section containing the task you want to view
3. Click on the specific task
4. The system will open the "Task Detailed Vie&#x77;**"**, where you can see detailed information about the task

{% embed url="<https://app.arcade.software/share/OcPAbVPsbsJoZosTxKCo>" %}

### Change assignee

1. Open the "Tasks List" screen
2. Open "To do" section or apply the **"**&#x54;o Assig&#x6E;**"** filter to the tasks list
3. Expand the "To do" or **"**&#x54;o Assig&#x6E;**"** section (if not already expanded)
4. Find a task in the section
5. Click on the **"Assign"** button or assign user if you have permission to do it
   1. The task will be assigned to you
   2. Your avatar will appear in the user slot for the task
   3. The task will move to the **"To Do"** section

{% embed url="<https://app.arcade.software/share/IZuCCyUOdke3Jc0RgI2L>" %}

### Change task status

1. Open the **Tasks List** screen
2. Expand the desired section that contains the task you want to update
3. Click on the status icon for the specific task
4. In the **"Change Status"** modal select the desired status for change
5. The system will:
   1. Update the task's status and move it to the appropriate section

{% embed url="<https://app.arcade.software/share/sAim3yJKBZh01cinzq13>" %}

### Undo task status change

If the task was transferred to Done and you have the rights to return the task to the "In Progress" status, then:

1. Press the "Undo" button
2. Or if you do not need to return the task to the In progress status, click the “ Close” button


# Grouping & Viewing

## Overview

The **Tasks List** of the mobile app provides a streamlined and organized view of all tasks, allowing users to manage, filter, and group tasks effectively. It adapts dynamically to user preferences and company-wide settings, ensuring an intuitive experience for tracking and updating task progress.\
\
The page enables users to view tasks grouped by their selected options, save their preferred configurations, and automatically sort tasks by priority, due date, and deadlines. Users can expand or collapse task sections, dynamically view changes in real time, and easily navigate task hierarchies. \
\
By reading this article, you will learn how to manage tasks using grouping and viewing settings, and understand how task priorities and hierarchies are displayed. You will also discover how dynamic updates ensure task accuracy and efficiency.

<figure><img src="/files/vCtZ8wlIFtD1y4C0XsFQ" alt=""><figcaption></figcaption></figure>

## Grouping

All tasks can be set in the groups by:

* No groups
* Status
* Status Category
* Root Product

Let's get closure and find out the tiniest details about to each of them.

### No groups

1. Click on "⋯" button
2. Click on "Grouping" option
3. In the buttom menu choose "No group" option
   1. System collects all tasks with the same status in the section
   2. All sections are open by default

{% @arcade/embed flowId="UJk7HOWBpIKiGoYw61mc" url="<https://app.arcade.software/share/UJk7HOWBpIKiGoYw61mc>" %}

If the “No groups” option is selected on the Task screen, all tasks will be displayed in a specific status order. First come those that have been **reopened**, followed by tasks that are **in progress**. Next are the ones that are **on hold**, then those that still need to be done. After that, you’ll see the **blocked** tasks, and finally, the **completed** and **canceled** ones.

### Status

1. Click on "⋯" button
2. Click on "Grouping" option
3. In the buttom menu choose "By status" option
   1. System collects all tasks with the same status in the section
   2. All sections are open by default

{% @arcade/embed flowId="5Ea0Hu9anzvDQl5leQOK" url="<https://app.arcade.software/share/5Ea0Hu9anzvDQl5leQOK>" %}

### Status Category

1. Click on "⋯" button
2. Click on "Grouping" option
3. In the buttom menu choose "By status category" option
   1. System collects all tasks with the same status category in the section
   2. All sections are open by default

{% @arcade/embed flowId="r2RWihXoxUzbE3jXxQEm" url="<https://app.arcade.software/share/r2RWihXoxUzbE3jXxQEm>" %}

In the **"By Status Category"** group, all task statuses are divided into several categories:

* **"To Perform"** – these are all tasks that still need to be done. This includes the statuses **"To do"** (not started yet) and **"Reopened"** (sent back for revision).
* **"Performing"** – tasks that are already in progress. This includes **"In progress"** (currently being worked on) and **"On hold"** (paused).
* **"Ready"** – tasks that are completed or no longer require action. This includes **"Done"** (finished) and **"Cancelled"** (called off).
* **"Blocked"** – if a task runs into issues and cannot be completed, it gets the **"Blocked"** status.

Basically, this grouping helps organize all possible task statuses into broader categories, making them easier to manage.

### Root Product

1. Click on "⋯" button
2. Click on "Grouping" option
3. In the buttom menu choose "By root product" option
   1. System collects all tasks with the same root product in the section
   2. All sections are close by default

{% @arcade/embed %}

For a task to show up in the **"By Root Product"** group, it needs to match certain key details about the root product. Specifically, it should have:

* The same **root product name**
* The same **root product variant**
* The same **root product version**
* The same **root product configuration**

In other words, if a task is linked to a particular root product, it will be grouped with other tasks related to that same product, as long as these details match. Simple as that!

## Viewing

User can set the following views:

* Plane
* Plane with sets

Let's get closure and find out the tiniest details about to each of them.

### Plane

1. Click on "⋯" button
2. Click on "Viewing" option
3. In the buttom menu choose "Plane" option

{% embed url="<https://app.arcade.software/share/x6VxUbd3TIXrXRIcNsRp>" %}

### Plane with sets

1. Click on "⋯" button
2. Click on "Viewing" option
3. In the buttom menu choose "Plane with sets" option
   1. System collects all tasks with the same task name, product name, product version, product variant, task status, assignee + root product configuration + root product variant in the set
   2. The option of bulk status change for tasks is available in the view of sets

{% embed url="<https://app.arcade.software/share/13PDHZMyL1K2lHFDAqnM>" %}

**Grouping** and **Viewing** are combined to make it easy for the executive to view their tasks and stay up to date.


# Filtering, searching and sorting

## **Overview**

This article explains the functionality of filtering, sorting and searching on the Task Page in the mobile app, covering their interactivity, the ability to save selected filters with grouping and data display work.

By reading this article learn how to filters and search work in the mobile app, how the system retains selected filters between sessions, and how to use different parameters for efficient task searching.

## **Key Features**

The system provides interactive filters and search options that update data in real time. When a user closes the app, the selected filters are automatically saved and restored upon reopening. The display of filtered data depends on the chosen grouping and viewing options.

The list of filters include:

* Status&#x20;
* Deadline&#x20;
* To assign&#x20;
* In queue&#x20;
* Priority&#x20;
* Options&#x20;
* Assignee&#x20;
* Product&#x20;
* Order Key&#x20;
* Production Key&#x20;
* Involved department&#x20;
* Root production&#x20;
* External order number&#x20;
* Marketplace order number&#x20;
* Root product barcode&#x20;
* Responsible manager

Search input field work by entering following details:

* By task name
* By task key
* By order key
* By production key
* By external order number
* By marketplace order number
* By product name
* By client
* By SKU

The following guidelines provide detailed instructions on how to use filters and task search in the mobile app.

## Filtering

### Single filter

1. Open task list in mobile app
2. Click on the “Filter” icon
3. Choose any filter&#x20;
4. Choose option to filter
   1. The system will filter tasks according to chosen option

{% embed url="<https://app.arcade.software/share/pOMDy5Qr9hAOTsHDecpq>" %}

### Combination filters&#x20;

1. Use multiple filters simultaneously by combining different options (for example, select the creator, status, and creation date at the same time)
2. The task list will update according to all the selected criteria
3. &#x20;To clear all filters, click "Clear all" button

***Note:*** If there are no tasks according to the selected parameters, the system displays the corresponding message “No results”.

{% embed url="<https://app.arcade.software/share/Haf9PNPafH41nAd9KMZP>" %}

Let's talk about one of the filters in more detail, namely the “To Assign” filter.

### To Assign

The To Assign filter shows tasks that a user can join. In such tasks, the user assigns himself to the task.

1. Open task list in mobile app
2. Click on the “Filter” icon
3. Choose "To Assign" filter&#x20;
   1. The system will show "To Assign" section and show tasks that be avaliable to start work with

{% embed url="<https://app.arcade.software/share/P9LCT4c6IJTaGLSEHp8h>" %}

## Searching

### Initiate a search&#x20;

1. Open task list in mobile app
2. Click on the “Filter” icon
3. Click the search field at the top of the page&#x20;
4. Enter keywords or attributes of the task (for example, name, ID, performer, etc.)&#x20;
   1. After entering them, the system automatically starts searching&#x20;
   2. The system displays the results that match the entered keywords or attributes

{% embed url="<https://app.arcade.software/share/cTVYyd38mR09V7fK1YL9>" %}

### Clear a search&#x20;

1. Make sure that the search field contains the keywords or attributes you entered&#x20;
2. Click the “X” button on the right side of the search field
   1. The query is deleted and the search field becomes empty
   2. The system returns the task list to its original state without the search applied

<figure><img src="/files/m4N5eBHSFNzH55bjwWLu" alt=""><figcaption></figcaption></figure>

### Clear All&#x20;

1. Scroll to the right to find the Clear All button
2. Click on the "Clear All" button
   1. The system clears all filters and search request
   2. The system returns the task list to its original state

{% embed url="<https://app.arcade.software/share/Cq3hmFK8119h0if0Hf6C>" %}

This guidelines helps to work with that tasks and see the tasks that need to be completed first.


# QR-Scan

## **Overview**

This page describes the process of working with QR tags in the HESH system, which allows users to quickly scan products and access the corresponding tasks in the mobile interface. The steps for setting up camera access and the process of scanning QR codes are described.

By reading this article learn how to create and print QR tags for products in the HESH system, set up camera access for the HESH scanner on mobile devices, QR scanning interacts with the system and opens a special view of tasks on mobile devices and how the system processes the URL after QR scanning and redirects to the workflow page.

## Basics

When the user scans the QR tag, the system automatically opens the view of production tasks in the mobile application. Access to the scan results depends on user rights and redirects the user to the workflow page.

Let's move on to the guidelines and take a closer look at each step.

### **Scanning QR Code with a Phone**

1. Make sure the label with the QR code was previously printed from HESH.
2. Open the HESH app on your device.
3. Scan the QR code using the built-in scanner in the mobile app.
   1. If you are authorized and have the HESH app installed, you will be redirected to the production tasks list based on your access rights.
   2. If you are not authorized but have the app installed, you will be redirected to the sign-in screen.
   3. If the HESH app is not installed, you will be redirected to the sign-in web page.

#### **Actions for Unauthorized Users (Without the App)**

If you are not authorized and don’t have the HESH app installed:

1. Scan the QR code.
2. You will be redirected to the web page <https://hesh.app/sign-in> for login.
3. After entering your login details, you will be directed to the production workflow canvas based on your permissions.

#### **Actions for Unauthorized Users (With the App)**

If you are not authorized but have the HESH app installed:

1. Scan the QR code.
2. The app will redirect you to the sign-in screen.
3. After logging in, you will be redirected to the production tasks list.

### **Opening the QR Code Scanner in the HESH App**

1. Open the HESH app on your mobile device.
2. Tap the QR scanner tab at the bottom of the screen.
3. If you haven't granted camera access yet, the system will ask you to allow access to the camera on your device.

### **Actions for Camera Issues**

1. If the HESH app cannot access the camera, an error pop-up will appear.
2. You can press "OK" to close the pop-up, and the system will redirect you back to the previous screen.

### **Opening Results After Scanning QR Code in the Mobile App**

1. After scanning the QR code, the HESH app will open the production tasks list, considering your permission level.

### **Actions When Scanning QR Code for a Non-Existing Production or Task**

1. If you scan a QR code for an entity that no longer exists (e.g., deleted production), the system will show an "Entity Not Found" screen.
2. If you are on a mobile device, pressing the "Back" button will take you back to the scan screen.

### **Scanning QR Code for Deleted Production**

1. If you scan the QR code for a production that has been deleted, the system will show the "Entity Not Found" screen (404 error).
2. On a mobile device, pressing the "Back" button will redirect you to the scanner screen.

These steps will help you effectively use QR code scanning to access information in the HESH app.


# Production task list


# General

## &#x20;Overview&#x20;

The Production Task List page allows users to view, sort, and interact with tasks in production, providing quick access to relevant actions through various opening options.

After reading the article, learn how the list of production tasks works, what options are available for sorting and accessing tasks, how the system restricts or allows editing data depending on user permissions, and how to conveniently customize the list view to your needs.

## Basics

Since in general, in a mobile application, a performer sees only his tasks, the production task list is a useful feature that allows you to see all the tasks and components of a particular production from a mobile application.

<figure><img src="/files/mk9WCULlDx5aQrqBh5SN" alt="" width="329"><figcaption></figcaption></figure>

The production task list also has the following main features:&#x20;

* Opening the production task list via a QR code, the “See all tasks” button, or the shortcut button in Task Actions.&#x20;
* Structured list with a title, component groups, and workflow.&#x20;
* Flexible sorting rules by status, priority, and deadline.&#x20;
* Limited access for performers and managers according to their permissions.&#x20;
* Three viewing modes (hierarchy, task groups, flat list) with the last saved selection.

Here are the rules governing the **Production Tasks List** in the mobile application:

### **Structure of the Production Tasks List**

* **Header**:\
  Contains the production key, product name, variant, configuration, deadline date, production status, production progress, responsible person, and an info button.
* **Component Productions Group**:\
  Displays component cards with the following information: production key, product name, variant, configuration, deadline date, production status, and production progress.
* **Workflow Tasks Group**:
  * Tasks are sorted by status in the following order:
    1. **Reopened**
    2. **In progress**
    3. **To do**
    4. **On hold**
    5. **Blocked**
    6. **Done**
    7. **Cancelled**
  * If there are no **In progress** tasks, the sorting order is the same but without "In Progress" tasks.
  * Within the same status, tasks are sorted by:
    * **Priority** (from highest to lowest).
    * **Production deadline** (from closest to farthest).
  * For tasks in **To do** status with the same priority and no deadline:
    * Tasks **without "In queue" state** appear at the top.
    * Tasks **with "In queue" state** appear at the bottom.
* **Additional Tasks Group**:\
  Displays a list of additional production tasks, following the same sorting rules as workflow tasks.

### **Display and Interaction Rules**

* By default, the system displays **10 elements** (tasks & components).
* If there are more tasks, user should use **"Show more"** button . On clicking, the full list is loaded.
* **Managers** can view all tasks within their permission level (e.g., for their department or all departments).
* **Performers** can only see tasks assigned to them or tasks available for self-assignment.
* The **"More actions"** menu. More about views [here](/manuals/mobile-app/production-task-list/view) and more about "More actions" find [here](/manuals/mobile-app/production-task-list/more-action).

### **Restrictions on Production Modification**

* **No one (not even a manager)** can modify production workflow statuses, priorities, assignees, or nested component statuses, priorities, or assignees.
* Users can only modify ***production task statuses*** according to their permissions.

Let's take a look at the instructions for using the production task list.

### Open production task list

1. Click on the task that avaliable
2. In the quick actions choose "Production Task List"

{% embed url="<https://app.arcade.software/share/oJEpbFlCRdQBBsNlyQQ6>" %}

Next actions with production task list depends on your permission level.&#x20;

* If permission level is set to view only own task then user sees only task where he is assignee or "To Assign" tasks where he is a candidate.
* If permission level is set to view own and user department tasks then user sees only task where he is assignee and tasks of his department or "To Assign" tasks where he is a candidate. \
  The same will be for user task permission level - for department & sub-department.
* If permission level is set to view all departments tasks then user sees all production tasks.&#x20;

According to these permissions, the user can view and change tasks status and assign a performer to the task.


# More action

## Overview

In the "More Action" menu, the user can perform additional actions with the production: copy a link, open the main production, or change the view.&#x20;

After reading this article, learn more details about More Action and learn how to use the production task list effectively.

## **Basics**

The **"More actions"** menu contains the following options:

* **Root production** – opens the Production Tasks List of the root production.
* **Parent production** – opens the Production Tasks List of the parent production. If production has component within a component, then user can view the parent production for such tasks, that is, the one that is one level higher.\
  If the **root and parent production are identical**, only one button **"Root production"** is avaliable.
* **Views** – opens the bottom sheet to select the viewing mode for the Production Tasks List. More about views [here](/manuals/mobile-app/production-task-list/view).

<figure><img src="/files/RybAVRuhcxg9KGPzpyDN" alt="" width="279"><figcaption></figcaption></figure>

### Copy link

1. Open the **Production Task List** screen
2. Click on the **“More actions”** menu (three dots in the top-right corner)
3. Select **“Copy link”** option
   1. The system will copy the link of main (root) production

{% @arcade/embed flowId="SfSNmZIDU6lsgQSC7gZH" url="<https://app.arcade.software/share/SfSNmZIDU6lsgQSC7gZH>" %}

### Root production

1. Open the **Production Task List** screen
2. Click on the **“More actions”** menu (three dots in the top-right corner)
3. Click on **“Root production”** option
   1. The system will open the main (root) production&#x20;

{% @arcade/embed %}

### Parent production

1. Open the **Production Task List** screen
2. Click on the **“More actions”** menu (three dots in the top-right corner)
3. Click on **“Parent production”** option
   1. The system will open the parent production if it present

{% @arcade/embed %}


# View

## Overview

The view option allows you to customize tasks in the production task list. Try all available options and choose the most convenient way for you to see the tasks of the entire production.&#x20;

After reading this article, learn more details about the view and learn how to customize the production task list to suit your needs.

### **Basics**

The Production Tasks List has **three view modes**:

1. **Hierarchy with components**
2. **Task group**
3. **Plane** (default option)

<figure><img src="/files/drBFytzI9doHQUQXl99N" alt="" width="282"><figcaption></figcaption></figure>

### **Plane**&#x20;

1. Open the **Production Task List** screen
2. Click on the **“More actions”** menu (three dots in the top-right corner)
3. Select **“Views”** from the dropdown menu
   1. The system opens the **“Viewing”** bottom sheet, displaying the currently selected view mode with a checkmark
4. On the **“Viewing”** bottom sheet, click on **“Plane”**
   1. The system closes the bottom sheet and updates the Production Task List screen
   2. Tasks are now displayed as a flat list, sorted according to the Task Sorting Rules

{% embed url="<https://app.arcade.software/share/c2pGpsDIPPJKuaaaeAju>" %}

### **Hierarchy with components**

1. Open the **Production Task List** screen
2. Click on the **“More actions”** menu (three dots in the top-right corner)
3. Select **“Views”** from the dropdown menu
   1. The system opens the **“Viewing”** bottom sheet, displaying the currently selected view mode with a checkmark
4. On the **“Viewing”** bottom sheet, click on **“Hierarchy with Components”**
   1. The system closes the bottom sheet and updates the Production Task List screen
   2. Tasks are now displayed in a structured hierarchy with the following groups:
      * **Component Productions** – List of component cards showing:
        * Product Name
        * Variant
        * Configuration
        * Deadline Date
        * Production Status
        * Production Progress
      * **Additional Components Productions** – List of additional component cards with the same details as above
      * **Tasks** – General production tasks, sorted accordingly
      * **Additional Tasks** – Additional production tasks, sorted accordingly

{% embed url="<https://app.arcade.software/share/OpjC4I1pzJwwlg3aU0rU>" %}

### **Task group**

1. Open the **Production Task List** screen
2. Click on the **“More actions”** menu (three dots in the top-right corner)
3. Select **“Views”** from the dropdown menu
   1. The system opens the **“Viewing”** bottom sheet, displaying the currently selected view mode with a checkmark
4. On the **“Viewing”** bottom sheet, click on **“Task Group”**
   1. The system closes the bottom sheet and updates the Production Task List screen.
   2. Tasks are now displayed in the following groups:
      * **Tasks in Components** – List of tasks in production components, sorted according to the Task Sorting Rules
      * **Tasks in Additional Components** – Tasks in additional production components, sorted accordingly
      * **Tasks** – General production tasks, sorted accordingly
      * **Additional Tasks** – Additional tasks related to production, sorted accordingly

{% embed url="<https://app.arcade.software/share/9Si9RLbbbXq9Vju6XCT8>" %}

### Notes

* **Task Sorting Rules** are applied consistently across all views.
* The selected view mode remains active until the user changes it again.


# Task screen


# Header & Quick Action

## **Overview**

The **Task Details Page** provides a structured view of task information, enabling users to track task progress, manage performers, and take quick actions. The header displays key task attributes such as priority, status, and assigned users, along with a **"More actions"** menu for additional controls. Users can start or finish tasks, leave comments, manage task quality, and access related documents efficiently.

By reading this article, find out how to navigate the **Task Details Page**, take necessary actions on a task, and utilize key features to streamline task management.

## Basics&#x20;

Interaction with a task in a mobile app is slightly different from the web version. Let's take a look at the basic possibilities.

#### **Key Features**

* View and manage task details, including priority, status, and assigned performers (with permissions).
* Perform quick actions such as starting, finishing, or failing a task (with permissions).
* Access additional options via the **"More actions"** menu, including copying links, navigating to related productions, and changing task list views.

<figure><img src="/files/PAMO4ANFjm5n7qMsMRTP" alt="" width="375"><figcaption></figcaption></figure>

So, let's move on to step-by-step instructions on how to interact with quick actions

### **Start task**

1. Open the task
2. Ensure the task status is “To do” or “Reopened”
3. Click on the “Start task” button
   1. The system changes the task status to “In progress”
   2. The “Start task” button changes to the “Pause task” button
   3. The timer starts

{% embed url="<https://app.arcade.software/share/VhQztz046VSK2s8k7sqG>" %}

### **Start self-assignment tasks**

1. Open the task
2. Ensure the following requirements are met:
   * In queue state is turned off
   * Task is in “To do” status
   * The unassigned slot is present
   * You are a candidate for the task
3. Press the “Start task” button or change the task status from “To Do” to “In progress.”
   1. The system automatically assigns you to the task.

{% embed url="<https://app.arcade.software/share/P9LCT4c6IJTaGLSEHp8h>" %}

### **Pause task**

1. Open the task
   1. Ensure the task status is “In progress”
2. Click on the “Pause task” button
   1. The system changes the task status to “On hold”
   2. The “Pause task” button changes to the “Start task” button
   3. The timer pauses

{% embed url="<https://app.arcade.software/share/OkjjxktTAKtEHxdwnXhr>" %}

### **Finish task**

1. Open the task
   1. Ensure the task status is “In progress”
2. Click on the “Finish task” button
   1. The system changes the task status to “Done”
   2. The timer stops
   3. The “Pause task” and “Finish task” buttons are disabled
   4. The system forms a summary of the task execution in the “Time tracking” section

{% embed url="<https://app.arcade.software/share/UCaMNKAjaCNDAx2iGvDS>" %}

### **Finish last task in root production**

1. Open the task
   1. Ensure the task status is “In progress”
2. Click on the “Finish task” button
   1. The system opens a confirmation modal
3. Choose “Cancel” or “Finish”
   1. The system switches the task status to “Done”
   2. The system switches the production status to “Finished”

{% embed url="<https://app.arcade.software/share/4qmWLOsckn4TKU7DddNX>" %}

### **Open documents**

1. Open the task
2. Click on the “Open documents” button
3. The system scrolls down to the “Attachments” section and expands it

{% embed url="<https://app.arcade.software/share/nsWFqPEfkL0NKBRDAaOc>" %}

### **Production tasks list view**

1. Open the detailed task screen
2. Tap on the “Production tasks list view” quick button
3. The system opens the Production tasks list based on your permission level

More about "Production task list" read [here](/manuals/mobile-app/production-task-list).

Let's move forward to Task details.


# Task details

## **Overview**

The **Task Details Page** provides a structured view of task details, product information, time tracking, related tasks, attachments, rewards, and activity logs. Sections are displayed either expanded or collapsed by default, ensuring an organized layout for efficient task management. The mobile version maintains feature parity with the web version, adapting elements for optimal mobile usability.\
\
By reading this article, learm more about the structure of the  **Task Details Page**, how different sections function, and how the web and mobile versions ensure consistency for a smooth user experience.

## **Basics**

Task details are a set of sections that contain all the important information for the performer. Let's take a look at the basic possibilities.

#### **Key Features**

* Task and product descriptions, time tracking, and detailed attributes for seamless task tracking.
* Full synchronization between web and mobile versions for descriptions, attachments, and time tracking.
* Related tasks and rewards overview, including bonuses and reward summaries.
* Dive deeper into the task and see description and details about what to do.&#x20;
* Download and view prodcut attached files and the previous and next tasks.
* View reward and make sure that the reward for the task is recorded.

<figure><img src="/files/jG9TnFM3xCsrk86w411j" alt=""><figcaption></figcaption></figure>

So, let's move on to the detailed guidelines of how to work with task details.

### Description section

In description section user can read more about product or detailed task info. This section is not editable in mobile.

1. Expand the **Description** section
2. View task and Product description

{% @arcade/embed flowId="OybkjUlA8D00ITFTip4q" url="<https://app.arcade.software/share/OybkjUlA8D00ITFTip4q>" %}

### Produced items tracker section

This section is present only if reward of the task depend on produced items.

#### Change produced items via stepper

1. Expand the **Produced items tracker** section
2. Check that the task status is **"In Progress"**
3. Click on the **"+"** or **"-"** button
4. The system will:
   1. Change the counter in steps of 1 up or down

{% @arcade/embed flowId="LnF0OEF0m5R5ZFObxzAd" url="<https://app.arcade.software/share/LnF0OEF0m5R5ZFObxzAd>" %}

#### Change produced items by entering number of produced items

1. Expand the **Produced items tracker** section
2. Check that the task status is **"In Progress"**
3. Click on the counter
4. The system will:
   1. Open buttom sheet for entering number of produced items
5. Enter number of produced items
6. Click on **"Apply"** button
7. The system will&#x20;
   1. Update counter
   2. Update number of produced items in the **Reward** table

{% @arcade/embed flowId="lECXT6UTTEwVkLexImLg" url="<https://app.arcade.software/share/lECXT6UTTEwVkLexImLg>" %}

### Time tracking section

The section shows the actual time of the task execution and allows you to manage task statuses.

#### **Start the task via Time Tracker**

1. Expand the **Time Tracking** section
2. Check that the task status is **"To do"** or **"On hold"**
3. Click on the **"Start"** button
4. The system will:
   1. Start the time tracker
   2. Change the task status to **"In progress"**
   3. Replace the **"Start"** button with a **"Pause"** button
5. Click on the **"Details"** button to view hidden time metrics

*\*Video below*

#### **Pause the task via Time Tracker**

1. Expand the **Time Tracking** section
2. Check that the task status is **"In progress"**
3. Click on the **"Pause"** button
4. The system will:
   1. Stop the time tracker
   2. Change the task status to **"On hold"**
   3. Replace the **"Pause"** button with a **"Start"** button

*\*Video below*

#### **Finish the task via Time Tracker**

1. Expand the **Time Tracking** section
2. Check that the task status is **"In progress"**
3. Click on the **"Finish"** button
4. The system will:
   1. Hide the **Time Tracking** menu
   2. Display the **time tracking summary**
   3. Change the task status to **"Done"**
   4. Disable the **"Pause task"** and **"Finish task"** buttons in the Quick Actions module
   5. Add a log entry in the **Production & Task Log** to record the status change

{% @arcade/embed flowId="UrJ9veLc30kB9Whw6Etx" url="<https://app.arcade.software/share/UrJ9veLc30kB9Whw6Etx>" %}

### **Details section**

The "Details" section contains all the information about the task and production. In this section, you can copy this data, for example, for searching.

#### **Copy Information**

1. Expand the **Details** section
2. Hover over a **Copy** button next to an attribute that can be copied
   1. Tooltip **"Copy"** will appear
3. Click on the **Copy** button
4. The system will:
   1. Copy the attribute value
   2. Change the **Copy** button to a :white\_check\_mark: with the tooltip **"Copied"**

{% @arcade/embed flowId="fQlHvPQoyuF71TlxH544" url="<https://app.arcade.software/share/fQlHvPQoyuF71TlxH544>" %}

### **Related Tasks section**

In this section, see all the tasks that have been completed before yours and the next ones that need to be completed after. Here jump straight to a task and see who is assigned to it.

**Scroll rekated tasks**

1. Expand the **Related Tasks** section
2. Check that there are **Previous** or **Next** tasks in the workflow
3. Scroll **left** in the **Previous Tasks** or **Next Tasks** subsection
   1. The system will reveal the hidden tasks in the workflow

{% @arcade/embed flowId="Sn9Up0y0Pz1zW8dVpN5y" url="<https://app.arcade.software/share/Sn9Up0y0Pz1zW8dVpN5y>" %}

#### **View Task Assignees**

1. Expand the **Related Tasks** section
2. Check that there are **Previous** or **Next** tasks in the workflow
3. Click on the **Assignee** icon next to a task
   1. The system will open the **"Members"** bottom sheet displaying assigned users

{% @arcade/embed flowId="mh9QuYgHafe6Va9uP0sC" url="<https://app.arcade.software/share/mh9QuYgHafe6Va9uP0sC>" %}

### Reward section

1. Expand the **Reward** section
2. Check that the task status is **"Done"**
3. View the recorded task reward

{% @arcade/embed flowId="UyLK7BDh9GItsMoSijWG" url="<https://app.arcade.software/share/UyLK7BDh9GItsMoSijWG>" %}

## Feature usage examples

### Using the task description as a comment

The **task description** field can be used not only for a basic description of the work, but also as a tool for recording additional information during task execution.

For example, it can be used to quickly capture issues or defects identified during the process.

#### How to record an issue using the description

1. Expand the **Task description** section.
2. Click on the input field.
3. Enter the required information.
4. Click **Save**.
5. Click **+ Add** to attach a photo.
6. Save the changes and, if needed, inform your manager.

{% @arcade/embed flowId="PMd47BYplt7NwVT1h8DF" url="<https://app.arcade.software/share/PMd47BYplt7NwVT1h8DF>" %}

These guidelines will help easilly navigate throught task details and know more about the task.


# Assignee management

## Overview

This feature allows managers to assign, change, or remove performers for tasks directly within the mobile application.

Assigning performers is available only to users who has a **Manager role**. However, the scope of editable tasks is based on their “**Edit other users’ tasks**” access level.

<table><thead><tr><th width="192.39996337890625">Access Level</th><th>Capability</th></tr></thead><tbody><tr><td>No access</td><td>The user can only change assignees for tasks where they are currently a performer. </td></tr><tr><td>User's department</td><td>The user can manage tasks assigned to their department or tasks with no assigned department.</td></tr><tr><td>User's department &#x26; sub-departments</td><td>The user can manage tasks in their department, all nested sub-departments, and tasks with no department.</td></tr><tr><td>All departments</td><td>The user can manage assignments for every task in the system.</td></tr></tbody></table>

## How to open the Members list

A manager can open the Members list in two ways:

### Option 1: From Task details page

1. Open the specific task.
2. Click the **Assignee** icon.
3. The system opens a Members list in the pop-up window.
4. Click **Back** button to return to the Task details.

{% @arcade/embed flowId="4OWsFqHH0ZcGAcduzLo5" url="<https://app.arcade.software/share/4OWsFqHH0ZcGAcduzLo5>" %}

### Option 2: From the Task list page

1. Locate the task in the list view.
2. Click the **Assignee** icon directly on the task card.
3. Check the Members list and click **Back** button to turn back.

{% @arcade/embed flowId="XjXvHZowMu1yR0JGEx1C" url="<https://app.arcade.software/share/XjXvHZowMu1yR0JGEx1C>" %}

## Managing performers

### Assigning a performer

1. Open the **Members list**.
2. Click the **Unassigned** slot.
3. In the Select performer window, choose a user from:
   * **Suggested candidates**: Recommended performers based on the task.
   * **Other users**: All other available users.
4. Click **Save**.
5. **Result:** The user is assigned to the task, receives a notification, and the task appears in their personal task list.

{% @arcade/embed flowId="W0CC8JTHRWxgAmDghzR0" url="<https://app.arcade.software/share/W0CC8JTHRWxgAmDghzR0>" %}

### Changing a performer

1. Open the **Members list.**
2. Click the slot containing the currently assigned performer.
3. Select a new performer.
4. Click **Save**.
5. **Result**: The previous performer is removed, the new performer is assigned, and both users receive relevant notifications.

{% @arcade/embed flowId="syCSbKsPF0D2JaNQ7AUd" url="<https://app.arcade.software/share/syCSbKsPF0D2JaNQ7AUd>" %}

### Unassigning a performer

1. Open the **Members list**.
2. Click the slot containing the assigned performer.
3. Select the **Unassigned** option.
4. Click **Save**.
5. **Result**: The performer is removed from the task, the task is cleared from their list, and the user receives a notification.

{% @arcade/embed flowId="PJUtEIo0c9KmwQ7Qeaw1" url="<https://app.arcade.software/share/PJUtEIo0c9KmwQ7Qeaw1>" %}

## System behaviour and specifics

### Rules

{% hint style="info" %}

* You can assign performers to a task at any stage, including when the task is in the **“In queue”** state.
* Managers can reassign a task even if a user has already self-assigned.
* Managers can override self-assignment when needed.
* Warnings highlight required actions and system limitations.
  {% endhint %}

### Warnings in assignee management

When managing performers, the system may display warnings to highlight missing assignments or important limitations.

#### **Missing performer**

For tasks with **Manual assignment** type, an assigned performer is required.

If no performer is assigned:

* A warning icon ⚠️ appears on the task
* Clicking the icon explains the issue and prompts you to assign a performer

<figure><img src="/files/LqTSAZdGHOyxjkKOzX24" alt="" width="270"><figcaption></figcaption></figure>

#### **Assignment after closed reporting period**&#x20;

If a task is reopened after the reporting period has been closed:

* A warning appears when opening the **Members list**
* You can still assign performers, but:
  * Their work **will not be counted** in the closed reporting period
  * They **will not receive compensation or rewards** for this task within that period

<figure><img src="/files/cbjSdxFinJQOmp7WN9Ch" alt="" width="272"><figcaption></figcaption></figure>


# Statistics

## Overview

The **Statistics** screen helps you track your work, completed tasks, and earnings for a selected period.

You can:

* See how many tasks you’ve completed
* Check your earnings
* Review tasks for a specific time period
* Quickly find tasks using search

<figure><img src="/files/DvtcioXxxPhBDcB7mOsS" alt="" width="272"><figcaption></figcaption></figure>

## Tabs

There are two tabs:

* **Current month** *(default)* - shows your ongoing progress
* **Previous period** - shows finalized results from the previous closed periods

Switch between tabs to compare your current performance with past results.

<figure><img src="/files/76Eb6l0IVMIGGXV70qQ8" alt="" width="272"><figcaption><p>Tabs on "Statistics" page</p></figcaption></figure>

## Calendar

Use the **Calendar** to select a specific date or period. Calendar has restrictions that depend on which tab the user is on:

* **Current month** → user can select only dates within the current month
* **Previous period** → user can select only past periods (no future dates)

#### How it works

1. Click the calendar to open it.&#x20;
2. Select a date or range.&#x20;
3. Click **Apply** to update the data.

<p align="center"><img src="/files/3I77VmUqkNYd7Zitgn9X" alt=""></p>

If there are no tasks for the selected period, the system will a message:&#x20;<mark style="background-color:cyan;">"</mark><mark style="background-color:cyan;">**No tasks for the selected period**</mark><mark style="background-color:cyan;">"</mark>. Summary values (**Earned, Total**) will update accordingly.

<figure><img src="/files/48Mks8MC46GqRjCUAiPx" alt="" width="410"><figcaption></figcaption></figure>

## Summary

Summary section is presented as cards under **Calendar** and **Search bar**.

<figure><img src="/files/yfErsL1xD0VI6kBKPRde" alt="" width="271"><figcaption></figcaption></figure>

### Earned

Shows how much you’ve earned for the selected period.

* In **Current month**:
  * The amount is **approximate** (\~) and marked with a warning icon ❗
  * Warning icon explains why the amount is not final
* In **Previous period**: the amount is **final**

<figure><img src="/files/VIjoy9wXR0jZqL4Xp05F" alt="" width="272"><figcaption></figcaption></figure>

### Total

Displays the total number of tasks the user has completed during the selected period.

<p align="center"><img src="/files/0GdshrWeu3OHjCpWNtRP" alt=""></p>

### Reopened (*Current month only*)

Shows how many tasks were reopened during the current period. Reopened tasks are also marked with a special wallet icon in the list.

<p align="center"><img src="/files/0i6PccCBsdbs15sCB3ec" alt=""></p>

## Task list

Below the summary, you’ll see a list of your tasks.

* Click on any task to open details
* Scroll to load more tasks automatically

### Task indicators

Some tasks may include additional icons:

* **Reopened icon** - task was reopened
* **Wallet icon** - task was paid in a previous period

Click on the wallet icon to see more details about payments.

<figure><img src="/files/R7sG6Qp8sznff1uEiH4v" alt="" width="404"><figcaption></figcaption></figure>

## Search

Use the search bar to quickly find tasks.

{% hint style="info" %}
If there are no tasks, the **search** field is hidden.

<p align="center"><img src="/files/ghGrB3jeRKthqF9WjSXb" alt=""></p>
{% endhint %}

You can search by:

* Product or task name
* Order or task ID
* Client or configuration

1. Click on the **Search** field and type text.
   1. Search updates results instantly as you type.
2. Click **X** to clear search.

<figure><img src="/files/CZJBio68KpfQ36dnuqcA" alt="" width="410"><figcaption></figcaption></figure>


# Settings

## Overview

The **Settings** screen allows you to manage your account, preferences, and app behavior. The **Settings** screen is divided into several sections:

* **Account info**
* **Change password**
* **Notifications**
* **Language**
* **Version**
* **Log out**

<figure><img src="/files/3PLcN1LvPJULiv5DlVkK" alt="" width="272"><figcaption></figcaption></figure>

## Account info

Displays your personal information:

* First name and last name
* Email address
* Phone number
* Profile picture

<figure><img src="/files/SJjBsek5353dtREaVKpE" alt="" width="274"><figcaption></figcaption></figure>

{% hint style="info" %}

#### Notes:

* This information is **read-only** and cannot be edited
* If no profile picture is set → your **initials** are shown
* If no phone number is provided → “–” is displayed
  {% endhint %}

## Change password

Allows you to update your password.

1. Open **Change password**.
2. Enter:
   * Old password
   * New password
   * Confirm new password
3. Follow password requirements shown on the screen.
4. Click **Confirm password** to save changes.
5. After successful change:
   * Password is updated
   * Modal closes
   * Confirmation message appears

{% @arcade/embed flowId="KFSwERHmf6iahuy5dtI6" url="<https://app.arcade.software/share/KFSwERHmf6iahuy5dtI6>" %}

## Notifications

The **Notifications** section allows you to control how the app sends updates to your device.

### Push notifications

Push notifications are enabled by default. If you disable them, the app will redirect you to your device settings, where notification permissions are managed.

{% hint style="info" %}
**If you turn notifications off in settings,** “*To Assign*” notifications will also be turned off automatically.
{% endhint %}

### “To Assign” task notifications

There is also a separate option for **“To Assign” task notifications**, which are disabled by default. “***To Assign***” task notifications informs you when new tasks become available.&#x20;

* This option works only if **Push notifications are enabled.**

<figure><img src="/files/OmWh75IKQ3eudBsCYWEN" alt="" width="274"><figcaption></figcaption></figure>

## Language

In the **Language** section, you can select the preferred language for the app. The default language is **English**. The alternative available option is **Ukrainian**. The currently selected language is marked with a checkmark.

#### Changing language

1. Open **Language** section.
2. Select a language.
3. Click **Save** button.
4. **Result**: After choosing a language and saving the changes, the interface updates immediately.

{% @arcade/embed flowId="RdmS4Hau4MK92f0Pv9MS" url="<https://app.arcade.software/share/RdmS4Hau4MK92f0Pv9MS>" %}

## Version

Displays the current version of the app.

<figure><img src="/files/6H54RIyG86crVmXMJBpX" alt="" width="268"><figcaption></figcaption></figure>

## Log out

1. Click **Log out**.
2. **Result**: you are safely signed out and returned to the login screen.

{% @arcade/embed flowId="GmPXSUTf0yAIJ7eeZv0r" url="<https://app.arcade.software/share/GmPXSUTf0yAIJ7eeZv0r>" %}


# Analytics


# Public API

### What is the Public API?&#x20;

The Hesh Public API is designed to make it easy and fast for orders to get into the Hesh system and to the contractors. Transfer orders directly from an external system to Hesh with the necessary details and in the right quantity, change order information, or cancel them.&#x20;

***

### Advantages of using the API&#x20;

Using the API allows Hesh to automate your production processes by integrating with other systems with flexible settings.&#x20;

***

### Target audience

* Developers
* Integrators
* Customers

***

### Authentication

The API is accessed through the API Key. To get the key, contact your Success Manager.

***

### Basic URL and environments

Production environment: [`https://api.hesh.app/api/v1/public`](https://api.hesh.app/api/v1/public/xxxxxx)

***

### Data formats

* JSON

***

### HTTP response codes

This API uses the following error codes:

* <mark style="color:green;">`200`</mark> `OK` - The request was successful.
* <mark style="color:green;">`201`</mark> `Created` — The resource was successfully created.
* <mark style="color:red;">`400`</mark> `Bad Request` — The request was malformed or missing the required parameters.
* <mark style="color:red;">`401`</mark> `Unauthorized` — The API key provided was invalid or missing.
* <mark style="color:red;">`404`</mark> `Not Found` — The requested resource was not found.
* <mark style="color:red;">`429`</mark>  `Too many requests` — The rate limit is reached.
* <mark style="color:red;">`500`</mark> `Internal Server Error` — An unexpected error occurred on the server.

***

### Rate Limiting and Fair Usage Policy

To ensure fair and reliable access for all integrators, the Public API enforces **multiple throttling layers**. These limits protect the stability of the platform while allowing consistent, high-volume integration.

Requests are tracked and rate-limited within the following time windows:

<table><thead><tr><th width="152.01171875">Window</th><th width="265.5625">Limit</th><th>Description</th></tr></thead><tbody><tr><td><strong>Burst</strong></td><td>15 requests / second</td><td>Handles short, high-frequency spikes without penalizing normal workloads</td></tr><tr><td><strong>Short</strong></td><td>300 requests / minute</td><td>Governs sustained request rates within a one-minute window</td></tr><tr><td><strong>Medium</strong></td><td>4,000 requests / hour</td><td>Ensures fair long-term throughput across all tenants</td></tr></tbody></table>

If these thresholds are exceeded, the API responds with HTTP <mark style="color:red;">429 Too Many Requests</mark> and temporarily blocks further requests until the limit window resets.

> ⚠️ **Important:**\
> The limits described below represent **global rate limiters** applied across most endpoints.\
> However, certain resource-intensive or high-complexity endpoints may have **stricter or separate throttling rules** to protect overall system performance.\
> Developers integrating with such endpoints should review each operation’s specific documentation for its applicable limits.

#### Response Headers Reference

<table><thead><tr><th width="239.0078125">Header</th><th>Description</th></tr></thead><tbody><tr><td>X-RateLimit-Limit</td><td>Maximum number of allowed requests during the current window</td></tr><tr><td>X-RateLimit-Remaining</td><td>Remaining number of requests before throttling occurs</td></tr><tr><td>X-RateLimit-Reset</td><td>Number of seconds until the rate limit window resets</td></tr></tbody></table>

#### Integration Recommendations

* Implement **exponential backoff** when receiving HTTP 429.
* Avoid tight retry loops - continued requests during a block window will extend the delay period.
* For continuous synchronization or high-frequency data exchange, consider batching requests or scheduling them across intervals.

## FAQ

<details>

<summary>Where does the synchronization go from here to HESH? </summary>

From an external system to Hesh.

</details>

<details>

<summary>What data comes from the external system to HESH? </summary>

An ***order*** is sent from the external system. \
In the body of the request, there is a quantity field, and these will be the production items that are already being launched for execution.&#x20;

For example, you send order 123-S for the production of 5 laptops.

More about order creation [here](broken://pages/w2ZJM6SzyOUoEazqikhT#create-order).

</details>

## Technical support

Contact your Success manager for providing needed information.&#x20;


# Clients

## Create clients in batch

> This method allows you to create one or more clients at the same time.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Clients"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicClientUpsertDto":{"type":"object","properties":{"clients":{"type":"array","items":{"$ref":"#/components/schemas/PublicClientCreateDto"}}},"required":["clients"]},"PublicClientCreateDto":{"type":"object","properties":{"name":{"type":"string","description":"Client name"},"external_client_id":{"type":"string","description":"External client identifier"},"phone":{"type":"string","nullable":true,"description":"Client's phone number"},"email":{"type":"string","nullable":true,"description":"Client's email"},"company":{"type":"string","nullable":true,"description":"Client's company name"}},"required":["name","external_client_id"]},"PublicClientResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the created client"},"external_client_id":{"type":"string","nullable":true,"description":"External client identifier"},"name":{"type":"string","description":"Client name"},"phone":{"type":"string","nullable":true,"description":"Client's phone number"},"email":{"type":"string","nullable":true,"description":"Client's email"},"company":{"type":"string","nullable":true,"description":"Client's company name"}},"required":["id","external_client_id","name","phone","email","company"]}}},"paths":{"/api/v1/public/clients/batch":{"post":{"description":"This method allows you to create one or more clients at the same time.","operationId":"PublicClientsController_upsertClients_v1","parameters":[{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicClientUpsertDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicClientResponseDto"}}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Create clients in batch","tags":["Clients"]}}}}
```


# Custom Columns

## List custom columns

> \
> Returns every custom column on the tenant — across all modules and statuses (including soft-deleted) — paginated.\
> \
> \### Query\
> \
> \- \`search\` (optional) — substring match on \`name\`, case-insensitive.\
> \- \`skip\` / \`take\` (optional) — standard offset pagination; defaults to \`skip = 0\`, \`take = 20\`.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Custom Columns"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PaginatedResult":{"type":"object","properties":{"meta":{"description":"Pagination metadata","allOf":[{"$ref":"#/components/schemas/PaginationMetadata"}]}},"required":["meta"]},"PaginationMetadata":{"type":"object","properties":{"total":{"type":"number","description":"Total number of items"},"lastPage":{"type":"number","description":"Last page number"},"currentPage":{"type":"number","description":"Current page number"},"perPage":{"type":"number","description":"Items per page"},"prev":{"type":"number","description":"Previous page number","nullable":true},"next":{"type":"number","description":"Next page number","nullable":true}},"required":["total","lastPage","currentPage","perPage","prev","next"]},"CustomColumnListItemDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"column_type":{"type":"string","enum":["text","number","date_time","people","boolean","choice"]},"is_required":{"type":"boolean"},"status":{"type":"string","enum":["active","inactive","deleted"]},"config":{"description":"Type-specific config. Shape depends on column_type.","oneOf":[{"$ref":"#/components/schemas/TextConfigDto"},{"$ref":"#/components/schemas/NumberConfigDto"},{"$ref":"#/components/schemas/DateTimeConfigDto"},{"$ref":"#/components/schemas/PeopleConfigDto"},{"$ref":"#/components/schemas/BooleanConfigDto"},{"$ref":"#/components/schemas/ChoiceConfigDto"}]},"deleted_at":{"type":"string","nullable":true,"format":"date-time","description":"Set when status = DELETED. Anchors the 30-day permanent deletion countdown."}},"required":["id","name","column_type","is_required","status","config"]},"TextConfigDto":{"type":"object","properties":{"min_chars":{"type":"number","nullable":true,"minimum":0,"description":"Minimum character limit (inclusive). Null/undefined = no limit."},"max_chars":{"type":"number","nullable":true,"minimum":1,"description":"Maximum character limit (inclusive). Null/undefined = no limit."}}},"NumberConfigDto":{"type":"object","properties":{"number_type":{"enum":["integer","decimal"],"type":"string"}},"required":["number_type"]},"DateTimeConfigDto":{"type":"object","properties":{"time_type":{"enum":["date_time","date_only","time_only"],"type":"string"}},"required":["time_type"]},"PeopleConfigDto":{"type":"object","properties":{"assignee_type":{"enum":["user","department","position"],"type":"string"}},"required":["assignee_type"]},"BooleanConfigDto":{"type":"object","properties":{"true_label":{"type":"string","minLength":1},"false_label":{"type":"string","minLength":1}},"required":["true_label","false_label"]},"ChoiceConfigDto":{"type":"object","properties":{"choice_type":{"enum":["single","multi"],"type":"string"}},"required":["choice_type"]}}},"paths":{"/api/v1/public/custom-columns":{"get":{"description":"\nReturns every custom column on the tenant — across all modules and statuses (including soft-deleted) — paginated.\n\n### Query\n\n- `search` (optional) — substring match on `name`, case-insensitive.\n- `skip` / `take` (optional) — standard offset pagination; defaults to `skip = 0`, `take = 20`.\n","operationId":"PublicCustomColumnsController_list_v1","parameters":[{"name":"search","required":false,"in":"query","description":"Substring match on name, case-insensitive.","schema":{"maxLength":200,"type":"string"}},{"name":"skip","required":false,"in":"query","schema":{"type":"number"}},{"name":"take","required":false,"in":"query","schema":{"type":"number"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PaginatedResult"},{"required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CustomColumnListItemDto"}}}}]}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"List custom columns","tags":["Custom Columns"]}}}}
```

## Create custom column

> \
> Creates a new custom column on a given module.\
> \
> \### Notes\
> \
> \- \`column\_type\` is immutable after creation.\
> \- \`status\` on create must be \`active\` or \`inactive\`. Use the delete endpoint to soft-delete.\
> \- The per-module field limit is enforced; creation fails with 409 if reached.\
> \
> \
> \### \`config\` field — what to pass for each \`column\_type\`\
> \
> The \`config\` object is polymorphic: its required shape is determined by the sibling \`column\_type\` value. The server validates the combination — sending a config that doesn't match the column type is rejected with 400.\
> \
> \*\*\`text\`\*\*\
> \
> \`\`\`json\
> { "min\_chars": 0, "max\_chars": 500 }\
> \`\`\`\
> \
> Both \`min\_chars\` and \`max\_chars\` are optional (nullable). Bounds are inclusive. \`null\` or omitted = no limit on that side. Constraints: \`min\_chars >= 0\`, \`max\_chars >= 1\`.\
> \
> \*\*\`number\`\*\*\
> \
> \`\`\`json\
> { "number\_type": "integer" }\
> \`\`\`\
> \
> Required. Allowed values: \`"integer"\`, \`"decimal"\`. Controls the input widget and validation on stored values.\
> \
> \*\*\`date\_time\`\*\*\
> \
> \`\`\`json\
> { "time\_type": "date\_time" }\
> \`\`\`\
> \
> Required. Allowed values: \`"date\_time"\` (date + time), \`"date\_only"\`, \`"time\_only"\`.\
> \
> \*\*\`people\`\*\*\
> \
> \`\`\`json\
> { "assignee\_type": "user" }\
> \`\`\`\
> \
> Required. Allowed values: \`"user"\`, \`"department"\`, \`"position"\`. Determines the kind of entity ids that \`people\_options\` (and stored values) must reference. Immutable in practice — changing it invalidates existing options.\
> \
> \*\*\`boolean\`\*\*\
> \
> \`\`\`json\
> { "true\_label": "Yes", "false\_label": "No" }\
> \`\`\`\
> \
> Both labels required and non-empty. Shown in the UI for the two states.\
> \
> \*\*\`choice\`\*\*\
> \
> \`\`\`json\
> { "choice\_type": "single" }\
> \`\`\`\
> \
> Required. Allowed values: \`"single"\` (one choice per row) or \`"multi"\` (many). Use the \`choice\_options\` array (see below) to define the options themselves.\
> \
> \### Companion arrays\
> \
> \*\*\`choice\_options\`\*\* — required for \`choice\` columns on create; ignored for other column types. Must contain at least one entry of the form:\
> \
> \`\`\`json\
> \[{ "name": "Low", "position": 0 }, { "name": "High", "position": 1 }]\
> \`\`\`\
> \
> \`position\` is the display order (integer, \`>= 0\`). On update, use the nested management object instead:\
> \
> \`\`\`json\
> {\
> &#x20; "create": \[{ "name": "New option", "position": 2 }],\
> &#x20; "update": \[{ "id": "uuid", "name": "Renamed", "position": 0 }],\
> &#x20; "remove": \["uuid-of-option-to-delete"]\
> }\
> \`\`\`\
> \
> \*\*\`people\_options\`\*\* — only valid for \`people\` columns. On create, pass an array of entity uuids matching \`config.assignee\_type\` (user / department / position ids). Empty or omitted = all active entities of that type are allowed:\
> \
> \`\`\`json\
> \["b86fa12a-76fc-46f5-8a3e-bf39e7be4c4e", "c91a..."]\
> \`\`\`\
> \
> On update, use the management object:\
> \
> \`\`\`json\
> {\
> &#x20; "create": \["uuid-of-entity-to-allow"],\
> &#x20; "remove": \["uuid-of-people-option-row-to-remove"]\
> }\
> \`\`\`\
> \
> Note: \`remove\` takes people-option row ids (as returned by the get-by-id endpoint), \*\*not\*\* entity ids.\
> \
> \### Concrete create-body examples\
> \
> \`\`\`json\
> // TEXT\
> { "module": "production", "column\_type": "text", "name": "Notes", "status": "active",\
> &#x20; "config": { "min\_chars": 0, "max\_chars": 500 } }\
> \
> // NUMBER\
> { "module": "order", "column\_type": "number", "name": "Weight", "status": "active",\
> &#x20; "config": { "number\_type": "decimal" } }\
> \
> // DATE\_TIME\
> { "module": "production", "column\_type": "date\_time", "name": "Delivered at", "status": "active",\
> &#x20; "config": { "time\_type": "date\_time" } }\
> \
> // PEOPLE (any active user is allowed)\
> { "module": "production", "column\_type": "people", "name": "Reviewer", "status": "active",\
> &#x20; "config": { "assignee\_type": "user" } }\
> \
> // PEOPLE (restricted to specific user ids)\
> { "module": "production", "column\_type": "people", "name": "Approvers", "status": "active",\
> &#x20; "config": { "assignee\_type": "user" },\
> &#x20; "people\_options": \["b86fa12a-76fc-46f5-8a3e-bf39e7be4c4e", "c91…"] }\
> \
> // BOOLEAN\
> { "module": "production", "column\_type": "boolean", "name": "QA passed", "status": "active",\
> &#x20; "config": { "true\_label": "Yes", "false\_label": "No" } }\
> \
> // CHOICE (single-select)\
> { "module": "production", "column\_type": "choice", "name": "Priority", "status": "active",\
> &#x20; "config": { "choice\_type": "single" },\
> &#x20; "choice\_options": \[\
> &#x20;   { "name": "Low", "position": 0 },\
> &#x20;   { "name": "Medium", "position": 1 },\
> &#x20;   { "name": "High", "position": 2 }\
> &#x20; ] }\
> \`\`\`\ <br>

````json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Custom Columns"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"CreateCustomColumnDto":{"type":"object","properties":{"module":{"type":"string","enum":["inventory"]},"column_type":{"type":"string","enum":["text","number","date_time","people","boolean","choice"],"description":"Immutable after create."},"name":{"type":"string","minLength":1},"status":{"type":"string","enum":["active","inactive"],"description":"Initial status. DELETED is not allowed on create."},"is_required":{"type":"boolean","default":false},"config":{"description":"Type-specific config. Shape and required fields depend on column_type.","oneOf":[{"$ref":"#/components/schemas/TextConfigDto"},{"$ref":"#/components/schemas/NumberConfigDto"},{"$ref":"#/components/schemas/DateTimeConfigDto"},{"$ref":"#/components/schemas/PeopleConfigDto"},{"$ref":"#/components/schemas/BooleanConfigDto"},{"$ref":"#/components/schemas/ChoiceConfigDto"}]},"choice_options":{"description":"Required when column_type = CHOICE (must have ≥ 1 option). Ignored for other types.","type":"array","items":{"$ref":"#/components/schemas/ChoiceOptionInputDto"}},"people_options":{"description":"List of allowed entity IDs (user.id / department.id / position.id depending on config.assignee_type). Only valid when column_type = PEOPLE. Empty/omitted = all active entities of the chosen assignee_type are allowed. Ignored for other types.","type":"array","items":{"type":"string","format":"uuid"}}},"required":["module","column_type","name","status","config"]},"TextConfigDto":{"type":"object","properties":{"min_chars":{"type":"number","nullable":true,"minimum":0,"description":"Minimum character limit (inclusive). Null/undefined = no limit."},"max_chars":{"type":"number","nullable":true,"minimum":1,"description":"Maximum character limit (inclusive). Null/undefined = no limit."}}},"NumberConfigDto":{"type":"object","properties":{"number_type":{"enum":["integer","decimal"],"type":"string"}},"required":["number_type"]},"DateTimeConfigDto":{"type":"object","properties":{"time_type":{"enum":["date_time","date_only","time_only"],"type":"string"}},"required":["time_type"]},"PeopleConfigDto":{"type":"object","properties":{"assignee_type":{"enum":["user","department","position"],"type":"string"}},"required":["assignee_type"]},"BooleanConfigDto":{"type":"object","properties":{"true_label":{"type":"string","minLength":1},"false_label":{"type":"string","minLength":1}},"required":["true_label","false_label"]},"ChoiceConfigDto":{"type":"object","properties":{"choice_type":{"enum":["single","multi"],"type":"string"}},"required":["choice_type"]},"ChoiceOptionInputDto":{"type":"object","properties":{"label":{"type":"string","minLength":1},"position":{"type":"number","minimum":0}},"required":["label","position"]},"CustomColumnListItemDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"column_type":{"type":"string","enum":["text","number","date_time","people","boolean","choice"]},"is_required":{"type":"boolean"},"status":{"type":"string","enum":["active","inactive","deleted"]},"config":{"description":"Type-specific config. Shape depends on column_type.","oneOf":[{"$ref":"#/components/schemas/TextConfigDto"},{"$ref":"#/components/schemas/NumberConfigDto"},{"$ref":"#/components/schemas/DateTimeConfigDto"},{"$ref":"#/components/schemas/PeopleConfigDto"},{"$ref":"#/components/schemas/BooleanConfigDto"},{"$ref":"#/components/schemas/ChoiceConfigDto"}]},"deleted_at":{"type":"string","nullable":true,"format":"date-time","description":"Set when status = DELETED. Anchors the 30-day permanent deletion countdown."}},"required":["id","name","column_type","is_required","status","config"]}}},"paths":{"/api/v1/public/custom-columns":{"post":{"description":"\nCreates a new custom column on a given module.\n\n### Notes\n\n- `column_type` is immutable after creation.\n- `status` on create must be `active` or `inactive`. Use the delete endpoint to soft-delete.\n- The per-module field limit is enforced; creation fails with 409 if reached.\n\n\n### `config` field — what to pass for each `column_type`\n\nThe `config` object is polymorphic: its required shape is determined by the sibling `column_type` value. The server validates the combination — sending a config that doesn't match the column type is rejected with 400.\n\n**`text`**\n\n```json\n{ \"min_chars\": 0, \"max_chars\": 500 }\n```\n\nBoth `min_chars` and `max_chars` are optional (nullable). Bounds are inclusive. `null` or omitted = no limit on that side. Constraints: `min_chars >= 0`, `max_chars >= 1`.\n\n**`number`**\n\n```json\n{ \"number_type\": \"integer\" }\n```\n\nRequired. Allowed values: `\"integer\"`, `\"decimal\"`. Controls the input widget and validation on stored values.\n\n**`date_time`**\n\n```json\n{ \"time_type\": \"date_time\" }\n```\n\nRequired. Allowed values: `\"date_time\"` (date + time), `\"date_only\"`, `\"time_only\"`.\n\n**`people`**\n\n```json\n{ \"assignee_type\": \"user\" }\n```\n\nRequired. Allowed values: `\"user\"`, `\"department\"`, `\"position\"`. Determines the kind of entity ids that `people_options` (and stored values) must reference. Immutable in practice — changing it invalidates existing options.\n\n**`boolean`**\n\n```json\n{ \"true_label\": \"Yes\", \"false_label\": \"No\" }\n```\n\nBoth labels required and non-empty. Shown in the UI for the two states.\n\n**`choice`**\n\n```json\n{ \"choice_type\": \"single\" }\n```\n\nRequired. Allowed values: `\"single\"` (one choice per row) or `\"multi\"` (many). Use the `choice_options` array (see below) to define the options themselves.\n\n### Companion arrays\n\n**`choice_options`** — required for `choice` columns on create; ignored for other column types. Must contain at least one entry of the form:\n\n```json\n[{ \"name\": \"Low\", \"position\": 0 }, { \"name\": \"High\", \"position\": 1 }]\n```\n\n`position` is the display order (integer, `>= 0`). On update, use the nested management object instead:\n\n```json\n{\n  \"create\": [{ \"name\": \"New option\", \"position\": 2 }],\n  \"update\": [{ \"id\": \"uuid\", \"name\": \"Renamed\", \"position\": 0 }],\n  \"remove\": [\"uuid-of-option-to-delete\"]\n}\n```\n\n**`people_options`** — only valid for `people` columns. On create, pass an array of entity uuids matching `config.assignee_type` (user / department / position ids). Empty or omitted = all active entities of that type are allowed:\n\n```json\n[\"b86fa12a-76fc-46f5-8a3e-bf39e7be4c4e\", \"c91a...\"]\n```\n\nOn update, use the management object:\n\n```json\n{\n  \"create\": [\"uuid-of-entity-to-allow\"],\n  \"remove\": [\"uuid-of-people-option-row-to-remove\"]\n}\n```\n\nNote: `remove` takes people-option row ids (as returned by the get-by-id endpoint), **not** entity ids.\n\n### Concrete create-body examples\n\n```json\n// TEXT\n{ \"module\": \"production\", \"column_type\": \"text\", \"name\": \"Notes\", \"status\": \"active\",\n  \"config\": { \"min_chars\": 0, \"max_chars\": 500 } }\n\n// NUMBER\n{ \"module\": \"order\", \"column_type\": \"number\", \"name\": \"Weight\", \"status\": \"active\",\n  \"config\": { \"number_type\": \"decimal\" } }\n\n// DATE_TIME\n{ \"module\": \"production\", \"column_type\": \"date_time\", \"name\": \"Delivered at\", \"status\": \"active\",\n  \"config\": { \"time_type\": \"date_time\" } }\n\n// PEOPLE (any active user is allowed)\n{ \"module\": \"production\", \"column_type\": \"people\", \"name\": \"Reviewer\", \"status\": \"active\",\n  \"config\": { \"assignee_type\": \"user\" } }\n\n// PEOPLE (restricted to specific user ids)\n{ \"module\": \"production\", \"column_type\": \"people\", \"name\": \"Approvers\", \"status\": \"active\",\n  \"config\": { \"assignee_type\": \"user\" },\n  \"people_options\": [\"b86fa12a-76fc-46f5-8a3e-bf39e7be4c4e\", \"c91…\"] }\n\n// BOOLEAN\n{ \"module\": \"production\", \"column_type\": \"boolean\", \"name\": \"QA passed\", \"status\": \"active\",\n  \"config\": { \"true_label\": \"Yes\", \"false_label\": \"No\" } }\n\n// CHOICE (single-select)\n{ \"module\": \"production\", \"column_type\": \"choice\", \"name\": \"Priority\", \"status\": \"active\",\n  \"config\": { \"choice_type\": \"single\" },\n  \"choice_options\": [\n    { \"name\": \"Low\", \"position\": 0 },\n    { \"name\": \"Medium\", \"position\": 1 },\n    { \"name\": \"High\", \"position\": 2 }\n  ] }\n```\n\n","operationId":"PublicCustomColumnsController_publicCreate_v1","parameters":[{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCustomColumnDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomColumnListItemDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Create custom column","tags":["Custom Columns"]}}}}
````

## Get custom column by id

> \
> Returns the full custom column record, including \`choice\_options\` (for \`choice\` columns) and \`people\_options\` resolved to display entities (for \`people\` columns).\
> \
> Soft-deleted columns are returned (the response includes \`deleted\_at\` and \`status = deleted\`).<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Custom Columns"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"CustomColumnDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"module":{"type":"string","enum":["inventory"]},"name":{"type":"string"},"key":{"type":"string","description":"Stable slug used in API & integrations. Immutable after create."},"column_type":{"type":"string","enum":["text","number","date_time","people","boolean","choice"]},"status":{"type":"string","enum":["active","inactive","deleted"]},"is_required":{"type":"boolean"},"config":{"description":"Type-specific config. Shape depends on column_type.","oneOf":[{"$ref":"#/components/schemas/TextConfigDto"},{"$ref":"#/components/schemas/NumberConfigDto"},{"$ref":"#/components/schemas/DateTimeConfigDto"},{"$ref":"#/components/schemas/PeopleConfigDto"},{"$ref":"#/components/schemas/BooleanConfigDto"},{"$ref":"#/components/schemas/ChoiceConfigDto"}]},"choice_options":{"description":"Present for CHOICE columns.","type":"array","items":{"$ref":"#/components/schemas/ChoiceOptionDto"}},"people_options":{"description":"Present for PEOPLE columns. Empty list = all active entities of the selected assignee_type are allowed. Options whose referenced entity has been deleted are filtered out.","type":"array","items":{"$ref":"#/components/schemas/PeopleOptionDetailDto"}},"deleted_at":{"type":"string","nullable":true,"format":"date-time","description":"Set when status = DELETED. Anchors the 30-day permanent deletion countdown."}},"required":["id","module","name","key","column_type","status","is_required","config"]},"TextConfigDto":{"type":"object","properties":{"min_chars":{"type":"number","nullable":true,"minimum":0,"description":"Minimum character limit (inclusive). Null/undefined = no limit."},"max_chars":{"type":"number","nullable":true,"minimum":1,"description":"Maximum character limit (inclusive). Null/undefined = no limit."}}},"NumberConfigDto":{"type":"object","properties":{"number_type":{"enum":["integer","decimal"],"type":"string"}},"required":["number_type"]},"DateTimeConfigDto":{"type":"object","properties":{"time_type":{"enum":["date_time","date_only","time_only"],"type":"string"}},"required":["time_type"]},"PeopleConfigDto":{"type":"object","properties":{"assignee_type":{"enum":["user","department","position"],"type":"string"}},"required":["assignee_type"]},"BooleanConfigDto":{"type":"object","properties":{"true_label":{"type":"string","minLength":1},"false_label":{"type":"string","minLength":1}},"required":["true_label","false_label"]},"ChoiceConfigDto":{"type":"object","properties":{"choice_type":{"enum":["single","multi"],"type":"string"}},"required":["choice_type"]},"ChoiceOptionDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"label":{"type":"string","minLength":1},"position":{"type":"number","minimum":0}},"required":["id","label","position"]},"PeopleOptionDetailDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"entity_id":{"type":"string","format":"uuid"},"entity":{"description":"Resolved entity. Shape depends on the parent column's config.assignee_type. Options whose referenced entity has been deleted are filtered out of the response entirely, so this is always populated when the option appears.","oneOf":[{"$ref":"#/components/schemas/PeopleOptionUserEntityDto"},{"$ref":"#/components/schemas/PeopleOptionDepartmentEntityDto"},{"$ref":"#/components/schemas/PeopleOptionPositionEntityDto"}]}},"required":["id","entity_id","entity"]},"PeopleOptionUserEntityDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"first_name":{"type":"string"},"last_name":{"type":"string"},"avatar_id":{"type":"string","nullable":true}},"required":["id","first_name","last_name","avatar_id"]},"PeopleOptionDepartmentEntityDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"path":{"description":"Populated materialized path, root → self (last element is the department itself).","type":"array","items":{"$ref":"#/components/schemas/PeopleOptionDepartmentPathItemDto"}}},"required":["id","name","path"]},"PeopleOptionDepartmentPathItemDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}},"required":["id","name"]},"PeopleOptionPositionEntityDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}},"required":["id","name"]}}},"paths":{"/api/v1/public/custom-columns/{id}":{"get":{"description":"\nReturns the full custom column record, including `choice_options` (for `choice` columns) and `people_options` resolved to display entities (for `people` columns).\n\nSoft-deleted columns are returned (the response includes `deleted_at` and `status = deleted`).\n","operationId":"PublicCustomColumnsController_publicGetById_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomColumnDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Get custom column by id","tags":["Custom Columns"]}}}}
```

## Update custom column

> \
> Updates a custom column. Any field not provided is left unchanged.\
> \
> \### Notes\
> \
> \- \`column\_type\` must match the persisted column type. Sending a different value is rejected with 400.\
> \- Status transitions: \`active\` ↔ \`inactive\` freely. \`deleted\` soft-deletes the column.\
> \- Deleted columns cannot be edited — restore first.\
> \
> \
> \### \`config\` field — what to pass for each \`column\_type\`\
> \
> The \`config\` object is polymorphic: its required shape is determined by the sibling \`column\_type\` value. The server validates the combination — sending a config that doesn't match the column type is rejected with 400.\
> \
> \*\*\`text\`\*\*\
> \
> \`\`\`json\
> { "min\_chars": 0, "max\_chars": 500 }\
> \`\`\`\
> \
> Both \`min\_chars\` and \`max\_chars\` are optional (nullable). Bounds are inclusive. \`null\` or omitted = no limit on that side. Constraints: \`min\_chars >= 0\`, \`max\_chars >= 1\`.\
> \
> \*\*\`number\`\*\*\
> \
> \`\`\`json\
> { "number\_type": "integer" }\
> \`\`\`\
> \
> Required. Allowed values: \`"integer"\`, \`"decimal"\`. Controls the input widget and validation on stored values.\
> \
> \*\*\`date\_time\`\*\*\
> \
> \`\`\`json\
> { "time\_type": "date\_time" }\
> \`\`\`\
> \
> Required. Allowed values: \`"date\_time"\` (date + time), \`"date\_only"\`, \`"time\_only"\`.\
> \
> \*\*\`people\`\*\*\
> \
> \`\`\`json\
> { "assignee\_type": "user" }\
> \`\`\`\
> \
> Required. Allowed values: \`"user"\`, \`"department"\`, \`"position"\`. Determines the kind of entity ids that \`people\_options\` (and stored values) must reference. Immutable in practice — changing it invalidates existing options.\
> \
> \*\*\`boolean\`\*\*\
> \
> \`\`\`json\
> { "true\_label": "Yes", "false\_label": "No" }\
> \`\`\`\
> \
> Both labels required and non-empty. Shown in the UI for the two states.\
> \
> \*\*\`choice\`\*\*\
> \
> \`\`\`json\
> { "choice\_type": "single" }\
> \`\`\`\
> \
> Required. Allowed values: \`"single"\` (one choice per row) or \`"multi"\` (many). Use the \`choice\_options\` array (see below) to define the options themselves.\
> \
> \### Companion arrays\
> \
> \*\*\`choice\_options\`\*\* — required for \`choice\` columns on create; ignored for other column types. Must contain at least one entry of the form:\
> \
> \`\`\`json\
> \[{ "name": "Low", "position": 0 }, { "name": "High", "position": 1 }]\
> \`\`\`\
> \
> \`position\` is the display order (integer, \`>= 0\`). On update, use the nested management object instead:\
> \
> \`\`\`json\
> {\
> &#x20; "create": \[{ "name": "New option", "position": 2 }],\
> &#x20; "update": \[{ "id": "uuid", "name": "Renamed", "position": 0 }],\
> &#x20; "remove": \["uuid-of-option-to-delete"]\
> }\
> \`\`\`\
> \
> \*\*\`people\_options\`\*\* — only valid for \`people\` columns. On create, pass an array of entity uuids matching \`config.assignee\_type\` (user / department / position ids). Empty or omitted = all active entities of that type are allowed:\
> \
> \`\`\`json\
> \["b86fa12a-76fc-46f5-8a3e-bf39e7be4c4e", "c91a..."]\
> \`\`\`\
> \
> On update, use the management object:\
> \
> \`\`\`json\
> {\
> &#x20; "create": \["uuid-of-entity-to-allow"],\
> &#x20; "remove": \["uuid-of-people-option-row-to-remove"]\
> }\
> \`\`\`\
> \
> Note: \`remove\` takes people-option row ids (as returned by the get-by-id endpoint), \*\*not\*\* entity ids.\
> \
> \### Concrete create-body examples\
> \
> \`\`\`json\
> // TEXT\
> { "module": "production", "column\_type": "text", "name": "Notes", "status": "active",\
> &#x20; "config": { "min\_chars": 0, "max\_chars": 500 } }\
> \
> // NUMBER\
> { "module": "order", "column\_type": "number", "name": "Weight", "status": "active",\
> &#x20; "config": { "number\_type": "decimal" } }\
> \
> // DATE\_TIME\
> { "module": "production", "column\_type": "date\_time", "name": "Delivered at", "status": "active",\
> &#x20; "config": { "time\_type": "date\_time" } }\
> \
> // PEOPLE (any active user is allowed)\
> { "module": "production", "column\_type": "people", "name": "Reviewer", "status": "active",\
> &#x20; "config": { "assignee\_type": "user" } }\
> \
> // PEOPLE (restricted to specific user ids)\
> { "module": "production", "column\_type": "people", "name": "Approvers", "status": "active",\
> &#x20; "config": { "assignee\_type": "user" },\
> &#x20; "people\_options": \["b86fa12a-76fc-46f5-8a3e-bf39e7be4c4e", "c91…"] }\
> \
> // BOOLEAN\
> { "module": "production", "column\_type": "boolean", "name": "QA passed", "status": "active",\
> &#x20; "config": { "true\_label": "Yes", "false\_label": "No" } }\
> \
> // CHOICE (single-select)\
> { "module": "production", "column\_type": "choice", "name": "Priority", "status": "active",\
> &#x20; "config": { "choice\_type": "single" },\
> &#x20; "choice\_options": \[\
> &#x20;   { "name": "Low", "position": 0 },\
> &#x20;   { "name": "Medium", "position": 1 },\
> &#x20;   { "name": "High", "position": 2 }\
> &#x20; ] }\
> \`\`\`\ <br>

````json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Custom Columns"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"UpdateCustomColumnDto":{"type":"object","properties":{"column_type":{"type":"string","enum":["text","number","date_time","people","boolean","choice"],"description":"Must match the column's persisted type. Sending a different value is rejected."},"name":{"type":"string","minLength":1},"is_required":{"type":"boolean"},"config":{"description":"Type-specific config. Validated against column_type at the pipe stage.","oneOf":[{"$ref":"#/components/schemas/TextConfigDto"},{"$ref":"#/components/schemas/NumberConfigDto"},{"$ref":"#/components/schemas/DateTimeConfigDto"},{"$ref":"#/components/schemas/PeopleConfigDto"},{"$ref":"#/components/schemas/BooleanConfigDto"},{"$ref":"#/components/schemas/ChoiceConfigDto"}]},"status":{"type":"string","enum":["active","inactive","deleted"],"description":"ACTIVE ↔ INACTIVE freely; DELETED soft-deletes the column. Restoring a DELETED column uses the restore endpoint."},"choice_options":{"description":"Explicit create / update / remove operations on this column's choice options. Only valid for CHOICE columns.","allOf":[{"$ref":"#/components/schemas/ChoiceOptionsManagementDto"}]},"people_options":{"description":"Explicit create / remove operations on this column's people options. Only valid for PEOPLE columns.","allOf":[{"$ref":"#/components/schemas/PeopleOptionsManagementDto"}]}},"required":["column_type"]},"TextConfigDto":{"type":"object","properties":{"min_chars":{"type":"number","nullable":true,"minimum":0,"description":"Minimum character limit (inclusive). Null/undefined = no limit."},"max_chars":{"type":"number","nullable":true,"minimum":1,"description":"Maximum character limit (inclusive). Null/undefined = no limit."}}},"NumberConfigDto":{"type":"object","properties":{"number_type":{"enum":["integer","decimal"],"type":"string"}},"required":["number_type"]},"DateTimeConfigDto":{"type":"object","properties":{"time_type":{"enum":["date_time","date_only","time_only"],"type":"string"}},"required":["time_type"]},"PeopleConfigDto":{"type":"object","properties":{"assignee_type":{"enum":["user","department","position"],"type":"string"}},"required":["assignee_type"]},"BooleanConfigDto":{"type":"object","properties":{"true_label":{"type":"string","minLength":1},"false_label":{"type":"string","minLength":1}},"required":["true_label","false_label"]},"ChoiceConfigDto":{"type":"object","properties":{"choice_type":{"enum":["single","multi"],"type":"string"}},"required":["choice_type"]},"ChoiceOptionsManagementDto":{"type":"object","properties":{"create":{"type":"array","items":{"$ref":"#/components/schemas/ChoiceOptionInputDto"}},"update":{"type":"array","items":{"$ref":"#/components/schemas/UpdateChoiceOptionInputDto"}},"remove":{"description":"Option ids to delete.","type":"array","items":{"type":"string","format":"uuid"}}}},"ChoiceOptionInputDto":{"type":"object","properties":{"label":{"type":"string","minLength":1},"position":{"type":"number","minimum":0}},"required":["label","position"]},"UpdateChoiceOptionInputDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"label":{"type":"string","minLength":1},"position":{"type":"number","minimum":0}},"required":["id"]},"PeopleOptionsManagementDto":{"type":"object","properties":{"create":{"description":"Entity ids (user/department/position, per assignee_type) to add as new people options.","type":"array","items":{"type":"string","format":"uuid"}},"remove":{"description":"People option ids to delete.","type":"array","items":{"type":"string","format":"uuid"}}}},"CustomColumnListItemDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"column_type":{"type":"string","enum":["text","number","date_time","people","boolean","choice"]},"is_required":{"type":"boolean"},"status":{"type":"string","enum":["active","inactive","deleted"]},"config":{"description":"Type-specific config. Shape depends on column_type.","oneOf":[{"$ref":"#/components/schemas/TextConfigDto"},{"$ref":"#/components/schemas/NumberConfigDto"},{"$ref":"#/components/schemas/DateTimeConfigDto"},{"$ref":"#/components/schemas/PeopleConfigDto"},{"$ref":"#/components/schemas/BooleanConfigDto"},{"$ref":"#/components/schemas/ChoiceConfigDto"}]},"deleted_at":{"type":"string","nullable":true,"format":"date-time","description":"Set when status = DELETED. Anchors the 30-day permanent deletion countdown."}},"required":["id","name","column_type","is_required","status","config"]}}},"paths":{"/api/v1/public/custom-columns/{id}":{"put":{"description":"\nUpdates a custom column. Any field not provided is left unchanged.\n\n### Notes\n\n- `column_type` must match the persisted column type. Sending a different value is rejected with 400.\n- Status transitions: `active` ↔ `inactive` freely. `deleted` soft-deletes the column.\n- Deleted columns cannot be edited — restore first.\n\n\n### `config` field — what to pass for each `column_type`\n\nThe `config` object is polymorphic: its required shape is determined by the sibling `column_type` value. The server validates the combination — sending a config that doesn't match the column type is rejected with 400.\n\n**`text`**\n\n```json\n{ \"min_chars\": 0, \"max_chars\": 500 }\n```\n\nBoth `min_chars` and `max_chars` are optional (nullable). Bounds are inclusive. `null` or omitted = no limit on that side. Constraints: `min_chars >= 0`, `max_chars >= 1`.\n\n**`number`**\n\n```json\n{ \"number_type\": \"integer\" }\n```\n\nRequired. Allowed values: `\"integer\"`, `\"decimal\"`. Controls the input widget and validation on stored values.\n\n**`date_time`**\n\n```json\n{ \"time_type\": \"date_time\" }\n```\n\nRequired. Allowed values: `\"date_time\"` (date + time), `\"date_only\"`, `\"time_only\"`.\n\n**`people`**\n\n```json\n{ \"assignee_type\": \"user\" }\n```\n\nRequired. Allowed values: `\"user\"`, `\"department\"`, `\"position\"`. Determines the kind of entity ids that `people_options` (and stored values) must reference. Immutable in practice — changing it invalidates existing options.\n\n**`boolean`**\n\n```json\n{ \"true_label\": \"Yes\", \"false_label\": \"No\" }\n```\n\nBoth labels required and non-empty. Shown in the UI for the two states.\n\n**`choice`**\n\n```json\n{ \"choice_type\": \"single\" }\n```\n\nRequired. Allowed values: `\"single\"` (one choice per row) or `\"multi\"` (many). Use the `choice_options` array (see below) to define the options themselves.\n\n### Companion arrays\n\n**`choice_options`** — required for `choice` columns on create; ignored for other column types. Must contain at least one entry of the form:\n\n```json\n[{ \"name\": \"Low\", \"position\": 0 }, { \"name\": \"High\", \"position\": 1 }]\n```\n\n`position` is the display order (integer, `>= 0`). On update, use the nested management object instead:\n\n```json\n{\n  \"create\": [{ \"name\": \"New option\", \"position\": 2 }],\n  \"update\": [{ \"id\": \"uuid\", \"name\": \"Renamed\", \"position\": 0 }],\n  \"remove\": [\"uuid-of-option-to-delete\"]\n}\n```\n\n**`people_options`** — only valid for `people` columns. On create, pass an array of entity uuids matching `config.assignee_type` (user / department / position ids). Empty or omitted = all active entities of that type are allowed:\n\n```json\n[\"b86fa12a-76fc-46f5-8a3e-bf39e7be4c4e\", \"c91a...\"]\n```\n\nOn update, use the management object:\n\n```json\n{\n  \"create\": [\"uuid-of-entity-to-allow\"],\n  \"remove\": [\"uuid-of-people-option-row-to-remove\"]\n}\n```\n\nNote: `remove` takes people-option row ids (as returned by the get-by-id endpoint), **not** entity ids.\n\n### Concrete create-body examples\n\n```json\n// TEXT\n{ \"module\": \"production\", \"column_type\": \"text\", \"name\": \"Notes\", \"status\": \"active\",\n  \"config\": { \"min_chars\": 0, \"max_chars\": 500 } }\n\n// NUMBER\n{ \"module\": \"order\", \"column_type\": \"number\", \"name\": \"Weight\", \"status\": \"active\",\n  \"config\": { \"number_type\": \"decimal\" } }\n\n// DATE_TIME\n{ \"module\": \"production\", \"column_type\": \"date_time\", \"name\": \"Delivered at\", \"status\": \"active\",\n  \"config\": { \"time_type\": \"date_time\" } }\n\n// PEOPLE (any active user is allowed)\n{ \"module\": \"production\", \"column_type\": \"people\", \"name\": \"Reviewer\", \"status\": \"active\",\n  \"config\": { \"assignee_type\": \"user\" } }\n\n// PEOPLE (restricted to specific user ids)\n{ \"module\": \"production\", \"column_type\": \"people\", \"name\": \"Approvers\", \"status\": \"active\",\n  \"config\": { \"assignee_type\": \"user\" },\n  \"people_options\": [\"b86fa12a-76fc-46f5-8a3e-bf39e7be4c4e\", \"c91…\"] }\n\n// BOOLEAN\n{ \"module\": \"production\", \"column_type\": \"boolean\", \"name\": \"QA passed\", \"status\": \"active\",\n  \"config\": { \"true_label\": \"Yes\", \"false_label\": \"No\" } }\n\n// CHOICE (single-select)\n{ \"module\": \"production\", \"column_type\": \"choice\", \"name\": \"Priority\", \"status\": \"active\",\n  \"config\": { \"choice_type\": \"single\" },\n  \"choice_options\": [\n    { \"name\": \"Low\", \"position\": 0 },\n    { \"name\": \"Medium\", \"position\": 1 },\n    { \"name\": \"High\", \"position\": 2 }\n  ] }\n```\n\n","operationId":"PublicCustomColumnsController_publicUpdate_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomColumnDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomColumnListItemDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Update custom column","tags":["Custom Columns"]}}}}
````

## Soft-delete custom column

> \
> Soft-deletes a custom column. Permanent deletion runs after 30 days.\
> \
> Calling this endpoint sets \`status = deleted\` and stamps \`deleted\_at\`. Use the restore endpoint to bring it back within the retention window.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Custom Columns"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/custom-columns/{id}":{"delete":{"description":"\nSoft-deletes a custom column. Permanent deletion runs after 30 days.\n\nCalling this endpoint sets `status = deleted` and stamps `deleted_at`. Use the restore endpoint to bring it back within the retention window.\n","operationId":"PublicCustomColumnsController_delete_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Soft-delete custom column","tags":["Custom Columns"]}}}}
```

## Restore custom column

> \
> Restores a soft-deleted custom column to \`status = active\` and clears \`deleted\_at\`.\
> \
> Fails with 409 if the per-module field limit is already reached — delete another column first.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Custom Columns"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/custom-columns/{id}/restore":{"post":{"description":"\nRestores a soft-deleted custom column to `status = active` and clears `deleted_at`.\n\nFails with 409 if the per-module field limit is already reached — delete another column first.\n","operationId":"PublicCustomColumnsController_publicRestore_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Restore custom column","tags":["Custom Columns"]}}}}
```


# Departments

## List departments

> \
> Returns departments in the tenant, paginated. Each entry carries the department's \`path\` — an ancestor chain resolved to names and joined by " / " (root ancestor first). Missing ancestors (e.g. after a reparent race) are silently skipped so the path stays a stable string.\
> \
> \### Query\
> \
> \- \`search\` — optional case-insensitive substring match on the department's own \`name\`.\
> \- \`page\` / \`limit\` — defaults \`page = 1\`, \`limit = 25\`, max \`limit = 100\`.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Departments"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicDepartmentsPageDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicDepartmentListItemDto"}},"meta":{"$ref":"#/components/schemas/PaginationMetadata"}},"required":["data","meta"]},"PublicDepartmentListItemDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"path":{"type":"string","description":"Ancestor names + this department name joined by \" / \"."}},"required":["id","name","path"]},"PaginationMetadata":{"type":"object","properties":{"total":{"type":"number","description":"Total number of items"},"lastPage":{"type":"number","description":"Last page number"},"currentPage":{"type":"number","description":"Current page number"},"perPage":{"type":"number","description":"Items per page"},"prev":{"type":"number","description":"Previous page number","nullable":true},"next":{"type":"number","description":"Next page number","nullable":true}},"required":["total","lastPage","currentPage","perPage","prev","next"]}}},"paths":{"/api/v1/public/departments":{"get":{"description":"\nReturns departments in the tenant, paginated. Each entry carries the department's `path` — an ancestor chain resolved to names and joined by \" / \" (root ancestor first). Missing ancestors (e.g. after a reparent race) are silently skipped so the path stays a stable string.\n\n### Query\n\n- `search` — optional case-insensitive substring match on the department's own `name`.\n- `page` / `limit` — defaults `page = 1`, `limit = 25`, max `limit = 100`.\n","operationId":"PublicDepartmentsController_listDepartments_v1","parameters":[{"name":"search","required":false,"in":"query","description":"Case-insensitive substring match on name.","schema":{"maxLength":100,"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":25,"type":"number"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDepartmentsPageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"List departments","tags":["Departments"]}}}}
```


# Maintenance

## GET /api/v1/public/maintenance/status

> Get current + upcoming maintenance windows

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Maintenance"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"paths":{"/api/v1/public/maintenance/status":{"get":{"operationId":"PublicMaintenanceController_publicGetStatus_v1","parameters":[{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaintenanceStatusResponseDto"}}}}},"summary":"Get current + upcoming maintenance windows","tags":["Maintenance"]}}},"components":{"schemas":{"MaintenanceStatusResponseDto":{"type":"object","properties":{"global":{"$ref":"#/components/schemas/MaintenanceWindowsBundleDto"},"tenant":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/MaintenanceWindowsBundleDto"}]}},"required":["global","tenant"]},"MaintenanceWindowsBundleDto":{"type":"object","properties":{"active":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/MaintenanceWindowDto"}]},"upcoming":{"type":"array","items":{"$ref":"#/components/schemas/MaintenanceWindowDto"}}},"required":["active","upcoming"]},"MaintenanceWindowDto":{"type":"object","properties":{"id":{"type":"string"},"tenant_id":{"type":"string","nullable":true},"scope":{"type":"string","enum":["global","tenant"]},"starts_at":{"format":"date-time","type":"string"},"ends_at":{"format":"date-time","type":"string"},"severity":{"type":"string","enum":["Warning","Critical"]},"blocks_traffic":{"type":"boolean"},"message":{"type":"string","nullable":true},"effective_status":{"enum":["Scheduled","Active","Completed","Cancelled"],"type":"string"},"status":{"type":"string","enum":["Scheduled","Cancelled"]},"created_by":{"type":"string"},"created_at":{"format":"date-time","type":"string"}},"required":["id","tenant_id","scope","starts_at","ends_at","severity","blocks_traffic","message","effective_status","status","created_by","created_at"]}}}}
```


# Material Categories

## Get material categories

> The API gives the ability to get all material categories.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material categories"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialCategoryDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier of the category"},"name":{"type":"string","description":"Category name"},"created_at":{"format":"date-time","type":"string","description":"Time when the category was created"},"updated_at":{"type":"string","nullable":true,"format":"date-time","description":"Time when the category was last updated, null if never updated"}},"required":["id","name","created_at","updated_at"]}}},"paths":{"/api/v1/public/material-categories":{"get":{"description":"The API gives the ability to get all material categories.","operationId":"PublicMaterialCategoryController_publicGetAll_v1","parameters":[{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicMaterialCategoryDto"}}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Get material categories","tags":["Material categories"]}}}}
```

## Create material category

> The API gives the ability to create new category.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material categories"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicCMaterialCategoryCreateDto":{"type":"object","properties":{"name":{"type":"string","description":"Category name"}},"required":["name"]},"PublicMaterialCategoryDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier of the category"},"name":{"type":"string","description":"Category name"},"created_at":{"format":"date-time","type":"string","description":"Time when the category was created"},"updated_at":{"type":"string","nullable":true,"format":"date-time","description":"Time when the category was last updated, null if never updated"}},"required":["id","name","created_at","updated_at"]}}},"paths":{"/api/v1/public/material-categories":{"post":{"description":"The API gives the ability to create new category.","operationId":"PublicMaterialCategoryController_publicCreate_v1","parameters":[{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCMaterialCategoryCreateDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialCategoryDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Create material category","tags":["Material categories"]}}}}
```

## Delete material category

> The API gives the ability to delete category.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material categories"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/material-categories/{id}":{"delete":{"description":"The API gives the ability to delete category.","operationId":"PublicMaterialCategoryController_publicDelete_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Material category id","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Delete material category","tags":["Material categories"]}}}}
```

## Update material category

> The API gives the ability to update an existing category’s name.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material categories"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialCategoryUpdateDto":{"type":"object","properties":{"name":{"type":"string","description":"Category name"}},"required":["name"]},"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/material-categories/{id}":{"patch":{"description":"The API gives the ability to update an existing category’s name.","operationId":"PublicMaterialCategoryController_publicUpdate_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Material category id","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialCategoryUpdateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Update material category","tags":["Material categories"]}}}}
```


# Material Parameter Values

## Get material parameter values

> The API gives the ability to get all material parameters values.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material parameter values"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialParameterValueDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier of the parameter value"},"name":{"type":"string","description":"Name of the parameter value"},"order":{"type":"number","description":"Order of the parameter value"}},"required":["id","name","order"]}}},"paths":{"/api/v1/public/material-parameters/{parameter_id}/values":{"get":{"description":"The API gives the ability to get all material parameters values.","operationId":"PublicMaterialParameterValuesController_getAll_v1","parameters":[{"name":"parameter_id","required":true,"in":"path","description":"Parameter ID","schema":{"format":"UUID","type":"string"}},{"name":"name","required":false,"in":"query","description":"Parameter value name","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicMaterialParameterValueDto"}}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Get material parameter values","tags":["Material parameter values"]}}}}
```

## Create material parameter values

> The API gives the ability to create a material’s parameter value.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material parameter values"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialParameterValueCreateDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the material parameter value"},"order":{"type":"number","description":"Display order of the parameter value (used for sorting in UI)"}},"required":["name","order"]},"PublicMaterialParameterValueDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier of the parameter value"},"name":{"type":"string","description":"Name of the parameter value"},"order":{"type":"number","description":"Order of the parameter value"}},"required":["id","name","order"]}}},"paths":{"/api/v1/public/material-parameters/{parameter_id}/values":{"post":{"description":"The API gives the ability to create a material’s parameter value.","operationId":"PublicMaterialParameterValuesController_create_v1","parameters":[{"name":"parameter_id","required":true,"in":"path","description":"Parameter ID","schema":{"format":"UUID","type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialParameterValueCreateDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialParameterValueDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Create material parameter values","tags":["Material parameter values"]}}}}
```

## Update material parameter value

> The API gives the ability to update a material’s parameter value name.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material parameter values"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialParameterValueUpdateDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the material parameter value"},"order":{"type":"number","description":"Display order of the parameter value (used for sorting in UI)"}}},"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/material-parameters/{parameter_id}/values/{value_id}":{"patch":{"description":"The API gives the ability to update a material’s parameter value name.","operationId":"PublicMaterialParameterValuesController_update_v1","parameters":[{"name":"value_id","required":true,"in":"path","description":"Material parameter value ID","schema":{"format":"UUID","type":"string"}},{"name":"parameter_id","required":true,"in":"path","description":"Parameter ID","schema":{"format":"UUID","type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialParameterValueUpdateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Update material parameter value","tags":["Material parameter values"]}}}}
```


# Material Parameters

## Get material parameters

> The API gives the ability to get all material parameters.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material parameters"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialParameterResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier of the material parameter"},"name":{"type":"string","description":"Name of the material parameter"},"created_at":{"type":"string","description":"Timestamp when the parameter was created","format":"date-time"}},"required":["id","name","created_at"]}}},"paths":{"/api/v1/public/material-parameters":{"get":{"description":"The API gives the ability to get all material parameters.","operationId":"PublicMaterialParametersController_getAll_v1","parameters":[{"name":"name","required":false,"in":"query","description":"","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicMaterialParameterResponseDto"}}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Get material parameters","tags":["Material parameters"]}}}}
```

## Create material parameter

> The API gives the ability to create a parameter for material.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material parameters"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialParameterCreateDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the material parameter"}},"required":["name"]},"PublicMaterialParameterResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier of the material parameter"},"name":{"type":"string","description":"Name of the material parameter"},"created_at":{"type":"string","description":"Timestamp when the parameter was created","format":"date-time"}},"required":["id","name","created_at"]}}},"paths":{"/api/v1/public/material-parameters":{"post":{"description":"The API gives the ability to create a parameter for material.","operationId":"PublicMaterialParametersController_create_v1","parameters":[{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialParameterCreateDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialParameterResponseDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Create material parameter","tags":["Material parameters"]}}}}
```

## Update material parameter

> The API gives the ability to update an existing material parameter’s name.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material parameters"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialParameterUpdateDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the material parameter"}}},"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/material-parameters/{parameter_id}":{"patch":{"description":"The API gives the ability to update an existing material parameter’s name.","operationId":"PublicMaterialParametersController_update_v1","parameters":[{"name":"parameter_id","required":true,"in":"path","description":"Parameter ID","schema":{"format":"UUID","type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialParameterUpdateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Update material parameter","tags":["Material parameters"]}}}}
```


# Material Subcategories

## Get material subcategories

> The API gives the ability to get all subcategories of material category.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material subcategories"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PaginatedResult":{"type":"object","properties":{"meta":{"description":"Pagination metadata","allOf":[{"$ref":"#/components/schemas/PaginationMetadata"}]}},"required":["meta"]},"PaginationMetadata":{"type":"object","properties":{"total":{"type":"number","description":"Total number of items"},"lastPage":{"type":"number","description":"Last page number"},"currentPage":{"type":"number","description":"Current page number"},"perPage":{"type":"number","description":"Items per page"},"prev":{"type":"number","description":"Previous page number","nullable":true},"next":{"type":"number","description":"Next page number","nullable":true}},"required":["total","lastPage","currentPage","perPage","prev","next"]},"PublicMaterialSubcategoryDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier of the subcategory"},"name":{"type":"string","description":"Subcategory name"},"created_at":{"format":"date-time","type":"string","description":"Time when the subcategory was created"},"updated_at":{"type":"string","nullable":true,"format":"date-time","description":"Time when the subcategory was last updated, null if never updated"},"material_category_id":{"type":"string","format":"uuid","description":"Identifier of the parent material category this subcategory belongs to"}},"required":["id","name","created_at","material_category_id"]}}},"paths":{"/api/v1/public/material-categories/{id}/subcategories":{"get":{"description":"The API gives the ability to get all subcategories of material category.","operationId":"PublicMaterialSubcategoryController_publicSearchSubcategories_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Material category id","schema":{"type":"string"}},{"name":"skip","required":false,"in":"query","description":"","schema":{"type":"number"}},{"name":"take","required":false,"in":"query","description":"","schema":{"type":"number"}},{"name":"name","required":false,"in":"query","description":"","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PaginatedResult"},{"required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicMaterialSubcategoryDto"}}}}]}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Get material subcategories","tags":["Material subcategories"]}}}}
```

## Create material subcategory

> The API gives the ability to create new subcategory within a category.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material subcategories"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicCreateMaterialSubcategoryDto":{"type":"object","properties":{"name":{"type":"string","description":"Subcategory name"}},"required":["name"]},"PublicMaterialSubcategoryDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier of the subcategory"},"name":{"type":"string","description":"Subcategory name"},"created_at":{"format":"date-time","type":"string","description":"Time when the subcategory was created"},"updated_at":{"type":"string","nullable":true,"format":"date-time","description":"Time when the subcategory was last updated, null if never updated"},"material_category_id":{"type":"string","format":"uuid","description":"Identifier of the parent material category this subcategory belongs to"}},"required":["id","name","created_at","material_category_id"]}}},"paths":{"/api/v1/public/material-categories/{id}/subcategories":{"post":{"description":"The API gives the ability to create new subcategory within a category.","operationId":"PublicMaterialSubcategoryController_publicCreate_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Material category id","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateMaterialSubcategoryDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialSubcategoryDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Create material subcategory","tags":["Material subcategories"]}}}}
```

## Delete material subcategory

> The API gives the ability to delete subcategory.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material subcategories"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/material-categories/{id}/subcategories/{subcategory_id}":{"delete":{"description":"The API gives the ability to delete subcategory.","operationId":"PublicMaterialSubcategoryController_publicDelete_v1","parameters":[{"name":"subcategory_id","required":true,"in":"path","description":"Material subcategory id","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Material category id","schema":{}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Delete material subcategory","tags":["Material subcategories"]}}}}
```

## Update material subcategory

> The API gives the ability to update an existing subcategory’s name.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material subcategories"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicUpdateMaterialSubcategoryDto":{"type":"object","properties":{"name":{"type":"string","description":"Subcategory name"}},"required":["name"]},"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/material-categories/{id}/subcategories/{subcategory_id}":{"patch":{"description":"The API gives the ability to update an existing subcategory’s name.","operationId":"PublicMaterialSubcategoryController_publicUpdate_v1","parameters":[{"name":"subcategory_id","required":true,"in":"path","description":"Material subcategory id","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Material category id","schema":{}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateMaterialSubcategoryDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Update material subcategory","tags":["Material subcategories"]}}}}
```


# Material Suppliers

## Get all material suppliers

> The API gives the ability to get all existing suppliers in the company.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material suppliers"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PaginatedResult":{"type":"object","properties":{"meta":{"description":"Pagination metadata","allOf":[{"$ref":"#/components/schemas/PaginationMetadata"}]}},"required":["meta"]},"PaginationMetadata":{"type":"object","properties":{"total":{"type":"number","description":"Total number of items"},"lastPage":{"type":"number","description":"Last page number"},"currentPage":{"type":"number","description":"Current page number"},"perPage":{"type":"number","description":"Items per page"},"prev":{"type":"number","description":"Previous page number","nullable":true},"next":{"type":"number","description":"Next page number","nullable":true}},"required":["total","lastPage","currentPage","perPage","prev","next"]},"PublicMaterialSupplierDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier of the material supplier"},"company_name":{"type":"string","description":"Company name of the material supplier"},"country":{"type":"string","nullable":true,"description":"Country where the supplier is located"},"first_name":{"type":"string","nullable":true,"description":"First name of the supplier contact person"},"last_name":{"type":"string","nullable":true,"description":"Last name of the supplier contact person"},"phone":{"type":"string","nullable":true,"description":"Phone number of the supplier"},"email":{"type":"string","nullable":true,"description":"Email address of the supplier"},"created_at":{"type":"string","description":"Timestamp when the supplier was created","format":"date-time"},"updated_at":{"type":"string","nullable":true,"description":"Timestamp when the supplier was last updated","format":"date-time"}},"required":["id","company_name","created_at"]}}},"paths":{"/api/v1/public/material-suppliers":{"get":{"description":"The API gives the ability to get all existing suppliers in the company.","operationId":"PublicMaterialSuppliersController_publicGetAll_v1","parameters":[{"name":"company_name","required":false,"in":"query","description":"The name of the company that supplies materials.","schema":{"type":"string"}},{"name":"email","required":false,"in":"query","description":"The supplier’s e-mail address.","schema":{"type":"string"}},{"name":"phone","required":false,"in":"query","description":"The supplier’s phone number.","schema":{"type":"string"}},{"name":"skip","required":false,"in":"query","description":"","schema":{"type":"number"}},{"name":"take","required":false,"in":"query","description":"","schema":{"type":"number"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/PaginatedResult"},{"required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicMaterialSupplierDto"}}}}]}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Get all material suppliers","tags":["Material suppliers"]}}}}
```

## Create material supplier

> The API gives the ability to create a new supplier.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material suppliers"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialSupplierCreateDto":{"type":"object","properties":{"company_name":{"type":"string","description":"Company name of the material supplier"},"country":{"type":"string","description":"Country where the supplier is located"},"first_name":{"type":"string","description":"First name of the supplier contact person"},"last_name":{"type":"string","description":"Last name of the supplier contact person"},"phone":{"type":"string","description":"Phone number of the supplier"},"email":{"type":"string","description":"Email address of the supplier"}},"required":["company_name"]},"PublicMaterialSupplierDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier of the material supplier"},"company_name":{"type":"string","description":"Company name of the material supplier"},"country":{"type":"string","nullable":true,"description":"Country where the supplier is located"},"first_name":{"type":"string","nullable":true,"description":"First name of the supplier contact person"},"last_name":{"type":"string","nullable":true,"description":"Last name of the supplier contact person"},"phone":{"type":"string","nullable":true,"description":"Phone number of the supplier"},"email":{"type":"string","nullable":true,"description":"Email address of the supplier"},"created_at":{"type":"string","description":"Timestamp when the supplier was created","format":"date-time"},"updated_at":{"type":"string","nullable":true,"description":"Timestamp when the supplier was last updated","format":"date-time"}},"required":["id","company_name","created_at"]}}},"paths":{"/api/v1/public/material-suppliers":{"post":{"description":"The API gives the ability to create a new supplier.","operationId":"PublicMaterialSuppliersController_publicCreate_v1","parameters":[{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialSupplierCreateDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialSupplierDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Create material supplier","tags":["Material suppliers"]}}}}
```

## Update material supplier

> The API gives the ability to update an existing supplier's information.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material suppliers"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialSupplierUpdateDto":{"type":"object","properties":{"company_name":{"type":"string","description":"Company name of the material supplier"},"country":{"type":"string","description":"Country where the supplier is located"},"first_name":{"type":"string","description":"First name of the supplier contact person"},"last_name":{"type":"string","description":"Last name of the supplier contact person"},"phone":{"type":"string","description":"Phone number of the supplier"},"email":{"type":"string","description":"Email address of the supplier"}}},"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/material-suppliers/{id}":{"patch":{"description":"The API gives the ability to update an existing supplier's information.","operationId":"PublicMaterialSuppliersController_publicUpdate_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialSupplierUpdateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Update material supplier","tags":["Material suppliers"]}}}}
```


# Material Tags

## Get all tags

> The API gives the ability to get all material tags. It is possible to filter tags by name using the 'name' query parameter.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material tags"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialTagDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier of the material tag"},"name":{"type":"string","description":"Name of the material tag"},"color":{"type":"string","description":"Color code for the tag (hex format)"},"created_at":{"type":"string","description":"Timestamp when the tag was created","format":"date-time"},"updated_at":{"type":"string","nullable":true,"description":"Timestamp when the tag was last updated","format":"date-time"}},"required":["id","name","color","created_at"]}}},"paths":{"/api/v1/public/material-tags":{"get":{"description":"The API gives the ability to get all material tags. It is possible to filter tags by name using the 'name' query parameter.","operationId":"PublicMaterialTagController_publicGetAll_v1","parameters":[{"name":"name","required":false,"in":"query","description":"Tag name","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicMaterialTagDto"}}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Get all tags","tags":["Material tags"]}}}}
```

## Create tag

> The API gives the ability to create a new material tag.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material tags"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialTagCreateDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the material tag"},"color":{"type":"string","description":"Color code for the tag (hex format)"}},"required":["name","color"]},"PublicMaterialTagDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier of the material tag"},"name":{"type":"string","description":"Name of the material tag"},"color":{"type":"string","description":"Color code for the tag (hex format)"},"created_at":{"type":"string","description":"Timestamp when the tag was created","format":"date-time"},"updated_at":{"type":"string","nullable":true,"description":"Timestamp when the tag was last updated","format":"date-time"}},"required":["id","name","color","created_at"]}}},"paths":{"/api/v1/public/material-tags":{"post":{"description":"The API gives the ability to create a new material tag.","operationId":"PublicMaterialTagController_publicCreate_v1","parameters":[{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialTagCreateDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialTagDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Create tag","tags":["Material tags"]}}}}
```

## Delete a tag

> The API gives the ability to delete an existing material tag.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material tags"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/material-tags/{tag_id}":{"delete":{"description":"The API gives the ability to delete an existing material tag.","operationId":"PublicMaterialTagController_publicDelete_v1","parameters":[{"name":"tag_id","required":true,"in":"path","description":"Tag ID","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Delete a tag","tags":["Material tags"]}}}}
```

## Update tag

> The API gives the ability to update an existing material tag.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Material tags"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialTagUpdateDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the material tag"},"color":{"type":"string","description":"Color code for the tag (hex format)"}}},"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/material-tags/{tag_id}":{"patch":{"description":"The API gives the ability to update an existing material tag.","operationId":"PublicMaterialTagController_publicUpdate_v1","parameters":[{"name":"tag_id","required":true,"in":"path","description":"Tag ID","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialTagUpdateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Update tag","tags":["Material tags"]}}}}
```


# Materials

## List materials

> \
> Returns active materials in the tenant, paginated. Each entry carries the material's display \`name\`, its \`description\`, and \`unit\` (from the material's measurement unit).\
> \
> \### Query\
> \
> \- \`search\` — optional case-insensitive substring match on the material's \`name\`.\
> \- \`page\` / \`limit\` — defaults \`page = 1\`, \`limit = 25\`, max \`limit = 100\`.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Materials"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialsPageDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicMaterialListItemDto"}},"meta":{"$ref":"#/components/schemas/PaginationMetadata"}},"required":["data","meta"]},"PublicMaterialListItemDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"unit":{"type":"string","nullable":true,"description":"Measurement unit name from the material's measurement_unit."}},"required":["id","name","description","unit"]},"PaginationMetadata":{"type":"object","properties":{"total":{"type":"number","description":"Total number of items"},"lastPage":{"type":"number","description":"Last page number"},"currentPage":{"type":"number","description":"Current page number"},"perPage":{"type":"number","description":"Items per page"},"prev":{"type":"number","description":"Previous page number","nullable":true},"next":{"type":"number","description":"Next page number","nullable":true}},"required":["total","lastPage","currentPage","perPage","prev","next"]}}},"paths":{"/api/v1/public/materials":{"get":{"description":"\nReturns active materials in the tenant, paginated. Each entry carries the material's display `name`, its `description`, and `unit` (from the material's measurement unit).\n\n### Query\n\n- `search` — optional case-insensitive substring match on the material's `name`.\n- `page` / `limit` — defaults `page = 1`, `limit = 25`, max `limit = 100`.\n","operationId":"PublicMaterialController_listMaterials_v1","parameters":[{"name":"search","required":false,"in":"query","description":"Case-insensitive substring match on name.","schema":{"maxLength":100,"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":25,"type":"number"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialsPageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"List materials","tags":["Materials"]}}}}
```

## Create material

> \
> The API gives the ability to create a new material and specify material properties.\
> \
> \## Scenarios for processing the received data\
> \
> \### 📝 All required + optional parameters were passed\
> \
> The system creates material in the system.\
> \
> \### UI\
> \
> \- Newly created material is added to the Materials page to the \*\*{Category} tab and {Subcategory} section\*\*, which were passed in the “CREATE a material” request.\
> &#x20;   \- If \`category\_name\` wasn't specified in the request, then material is added to the “Without category” tab on the Materials page.\
> &#x20;   \- If \`subcategory\_name\` wasn't specified in the request, then material is added to the \*\*{Category} tab\*\* which was passed in the “CREATE a material” request, but added to the “Without subcategory” section on the Materials page.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Materials"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialCreateDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the material"},"measurement_unit_id":{"type":"string","format":"uuid","description":"UUID of the measurement unit for this material"},"material_external_id":{"type":"string","description":"External identifier for the material from supplier or other system"},"description":{"type":"string","description":"Detailed description of the material"},"material_category_id":{"type":"string","format":"uuid","description":"UUID of the material category"},"material_subcategory_id":{"type":"string","format":"uuid","description":"UUID of the material subcategory"},"material_supplier_id":{"type":"string","format":"uuid","description":"UUID of the material supplier"},"delivery_time":{"description":"Delivery time information for the material","allOf":[{"$ref":"#/components/schemas/PublicMaterialCreateDeliveryTimeDto"}]},"purchase_price":{"type":"number","minimum":1,"description":"Purchase price of the material in base currency"},"actual_price":{"type":"number","minimum":1,"description":"Current actual price of the material in base currency"},"status":{"type":"string","description":"Status of the material (Default status if no value provided: ACTIVE)","enum":["ACTIVE","INACTIVE"]},"materialCharacteristics":{"maxItems":10,"description":"Array of material characteristic UUIDs (max 10)","type":"array","items":{"type":"string","format":"uuid"}},"tags":{"description":"Array of tag UUIDs for categorization and filtering","type":"array","items":{"type":"string","format":"uuid"}}},"required":["name","measurement_unit_id"]},"PublicMaterialCreateDeliveryTimeDto":{"type":"object","properties":{"value":{"type":"number","minimum":0},"unit":{"type":"string"}},"required":["value","unit"]},"PublicMaterialResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier of the material"},"material_category_id":{"type":"string","nullable":true,"description":"ID of the material category"},"material_subcategory_id":{"type":"string","nullable":true,"description":"ID of the material subcategory"},"material_supplier_id":{"type":"string","nullable":true,"description":"ID of the material supplier"},"image_id":{"type":"string","nullable":true,"description":"ID of the associated image"},"material_external_id":{"type":"string","nullable":true,"description":"External identifier for the material"},"measurement_unit_id":{"type":"string","format":"uuid","description":"ID of the measurement unit"},"name":{"type":"string","description":"Name of the material"},"description":{"type":"string","nullable":true,"description":"Description of the material"},"status":{"type":"string","description":"Current status of the material","enum":["ACTIVE","INACTIVE"]},"purchase_price":{"type":"number","nullable":true,"description":"Purchase price of the material"},"actual_price":{"type":"number","nullable":true,"description":"Actual price of the material"},"supply_delivery_time":{"type":"number","nullable":true,"description":"Supply delivery time value"},"supply_delivery_time_period":{"type":"string","nullable":true,"description":"Supply delivery time period unit"},"created_at":{"format":"date-time","type":"string","description":"Date when the material was created"},"updated_at":{"type":"string","nullable":true,"format":"date-time","description":"Date when the material was last updated"},"created_by":{"type":"string","nullable":true,"description":"ID of the user who created the material"},"updated_by":{"type":"string","nullable":true,"description":"ID of the user who last updated the material"}},"required":["id","material_category_id","material_subcategory_id","material_supplier_id","image_id","material_external_id","measurement_unit_id","name","description","status","purchase_price","actual_price","supply_delivery_time","supply_delivery_time_period","created_at","updated_at","created_by","updated_by"]}}},"paths":{"/api/v1/public/materials":{"post":{"description":"\nThe API gives the ability to create a new material and specify material properties.\n\n## Scenarios for processing the received data\n\n### 📝 All required + optional parameters were passed\n\nThe system creates material in the system.\n\n### UI\n\n- Newly created material is added to the Materials page to the **{Category} tab and {Subcategory} section**, which were passed in the “CREATE a material” request.\n    - If `category_name` wasn't specified in the request, then material is added to the “Without category” tab on the Materials page.\n    - If `subcategory_name` wasn't specified in the request, then material is added to the **{Category} tab** which was passed in the “CREATE a material” request, but added to the “Without subcategory” section on the Materials page.","operationId":"PublicMaterialController_create_v1","parameters":[{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialCreateDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialResponseDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Create material","tags":["Materials"]}}}}
```

## Get material measurement units

> The API gives the ability to get all material measurement units.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Materials"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMeasurementUnitDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Unique identifier of the measurement unit"},"name":{"type":"string","description":"Measurement unit name"}},"required":["id","name"]}}},"paths":{"/api/v1/public/materials/measurement_units":{"get":{"description":"The API gives the ability to get all material measurement units.","operationId":"PublicMaterialController_getMaterialMeasurementUnits_v1","parameters":[{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicMeasurementUnitDto"}}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Get material measurement units","tags":["Materials"]}}}}
```

## Add photo to material

> \
> The API gives the ability to add photo to material.\
> \
> \## Scenarios for processing the received data\
> \
> \### 📝 Photo was passed successfully\
> \
> System sets this photo as a main photo for a material.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Materials"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicAddPhotoToMaterialDto":{"type":"object","properties":{"url":{"type":"string","description":"Photo url"}},"required":["url"]},"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/materials/{material_id}/photos":{"post":{"description":"\nThe API gives the ability to add photo to material.\n\n## Scenarios for processing the received data\n\n### 📝 Photo was passed successfully\n\nSystem sets this photo as a main photo for a material.\n","operationId":"PublicMaterialController_addPhoto_v1","parameters":[{"name":"material_id","required":true,"in":"path","description":"Material ID","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAddPhotoToMaterialDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Add photo to material","tags":["Materials"]}}}}
```

## Update material

> The API gives the ability to update materials properties. Any parameters not provided will be left unchanged.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Materials"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialUpdateDto":{"type":"object","properties":{"name":{"type":"string","description":"Name of the material"},"measurement_unit_id":{"type":"string","format":"uuid","description":"UUID of the measurement unit for this material"},"material_external_id":{"type":"string","description":"External identifier for the material from supplier or other system"},"description":{"type":"string","description":"Detailed description of the material"},"material_category_id":{"type":"string","format":"uuid","description":"UUID of the material category"},"material_subcategory_id":{"type":"string","format":"uuid","description":"UUID of the material subcategory"},"material_supplier_id":{"type":"string","format":"uuid","description":"UUID of the material supplier"},"delivery_time":{"description":"Delivery time information for the material","allOf":[{"$ref":"#/components/schemas/PublicMaterialUpdateDeliveryTimeDto"}]},"purchase_price":{"type":"number","minimum":1,"description":"Purchase price of the material in base currency"},"actual_price":{"type":"number","minimum":1,"description":"Current actual price of the material in base currency"},"status":{"type":"string","description":"Status of the material","enum":["ACTIVE","INACTIVE"]}}},"PublicMaterialUpdateDeliveryTimeDto":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string"}},"required":["value","unit"]},"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/materials/{material_id}":{"patch":{"description":"The API gives the ability to update materials properties. Any parameters not provided will be left unchanged.","operationId":"PublicMaterialController_publicUpdate_v1","parameters":[{"name":"material_id","required":true,"in":"path","description":"Material ID","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialUpdateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Update material","tags":["Materials"]}}}}
```

## Add parameters to a material

> The API gives the ability to add parameter to material.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Materials"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialAddParametersDto":{"type":"object","properties":{"data":{"description":"Array of material parameters to add, each containing parameter_id and parameter_value_id","type":"array","items":{"$ref":"#/components/schemas/PublicMaterialAddParametersDataDto"}}},"required":["data"]},"PublicMaterialAddParametersDataDto":{"type":"object","properties":{"parameter_id":{"type":"string","format":"uuid","description":"Unique identifier of the parameter"},"parameter_value_id":{"type":"string","format":"uuid","description":"Unique identifier of the parameter value"}},"required":["parameter_id","parameter_value_id"]},"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/materials/{material_id}/parameters":{"post":{"description":"The API gives the ability to add parameter to material.","operationId":"PublicMaterialController_addMaterialParameter_v1","parameters":[{"name":"material_id","required":true,"in":"path","description":"Material ID","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialAddParametersDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Add parameters to a material","tags":["Materials"]}}}}
```

## Remove material parameter from material

> The API gives the ability to remove parameter from material.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Materials"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/materials/{material_id}/parameters/{parameter_id}":{"delete":{"description":"The API gives the ability to remove parameter from material.","operationId":"PublicMaterialController_removeMaterialParameter_v1","parameters":[{"name":"material_id","required":true,"in":"path","description":"Material ID","schema":{"type":"string"}},{"name":"parameter_id","required":true,"in":"path","description":"Parameter ID","schema":{"format":"UUID","type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Remove material parameter from material","tags":["Materials"]}}}}
```

## Update material parameter value for material

> The API gives the ability to update material parameter value.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Materials"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialUpdateParameterValueDto":{"type":"object","properties":{"parameter_value_id":{"type":"string","format":"uuid","description":"Unique identifier of the parameter value to update"}},"required":["parameter_value_id"]},"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/materials/{material_id}/parameters/{parameter_id}":{"patch":{"description":"The API gives the ability to update material parameter value.","operationId":"PublicMaterialController_updateParameterValue_v1","parameters":[{"name":"material_id","required":true,"in":"path","description":"Material ID","schema":{"type":"string"}},{"name":"parameter_id","required":true,"in":"path","description":"Parameter ID","schema":{"format":"UUID","type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialUpdateParameterValueDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Update material parameter value for material","tags":["Materials"]}}}}
```

## Remove all material parameters from material

> The API gives the ability to remove all parameters from material.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Materials"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/materials/{material_id}/parameters-all":{"delete":{"description":"The API gives the ability to remove all parameters from material.","operationId":"PublicMaterialController_removeAllMaterialParameters_v1","parameters":[{"name":"material_id","required":true,"in":"path","description":"Material ID","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Remove all material parameters from material","tags":["Materials"]}}}}
```

## Add tag to a material

> The API gives the ability to add tag to material.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Materials"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicMaterialAddTagsDto":{"type":"object","properties":{"tag_ids":{"description":"Array of tag UUIDs for categorization and filtering","type":"array","items":{"type":"string","format":"uuid"}}},"required":["tag_ids"]},"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/materials/{material_id}/tags":{"post":{"description":"The API gives the ability to add tag to material.","operationId":"PublicMaterialController_addMaterialTag_v1","parameters":[{"name":"material_id","required":true,"in":"path","description":"Material ID","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMaterialAddTagsDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Add tag to a material","tags":["Materials"]}}}}
```

## Remove tag from a material

> The API gives the ability to remove tag from material.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Materials"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/materials/{material_id}/tags/{tag_id}":{"delete":{"description":"The API gives the ability to remove tag from material.","operationId":"PublicMaterialController_removeMaterialTag_v1","parameters":[{"name":"material_id","required":true,"in":"path","description":"Material ID","schema":{"type":"string"}},{"name":"tag_id","required":true,"in":"path","description":"Tag ID","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Remove tag from a material","tags":["Materials"]}}}}
```

## Remove all tags from a material

> The API gives the ability to remove all tags from material.

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Materials"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/materials/{material_id}/tags-all":{"delete":{"description":"The API gives the ability to remove all tags from material.","operationId":"PublicMaterialController_removeAllMaterialTags_v1","parameters":[{"name":"material_id","required":true,"in":"path","description":"Material ID","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Remove all tags from a material","tags":["Materials"]}}}}
```


# Orders

## Get all orders

> \
> This method retrieves a list of all external orders along with their details, such as order numbers, priority, client information, and timestamps.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Orders"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicOrderResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique internal identifier of the order"},"external_order_number":{"type":"string","nullable":true,"description":"A unique string used in the UI and controlled by the user"},"marketplace_order_number":{"type":"string","nullable":true,"description":"A unique string used in the UI and controlled by the user"},"external_order_id":{"type":"string","nullable":true,"description":"A unique identifier for each order from external system"},"order_key":{"type":"string","description":"System-generated order key for internal reference"},"comment":{"type":"string","nullable":true,"description":"Additional comments or info for the order"},"to_stock":{"type":"boolean","description":"Indicates if this is an internal company order (e.g., to replenish warehouse stocks)"},"is_deleted":{"type":"boolean","description":"Indicates whether the order has been marked as deleted"},"priority":{"type":"string","description":"Priority level of the order","enum":["Highest","High","Medium","Low","Lowest"]},"client_id":{"type":"string","nullable":true,"description":"Unique identifier of the associated client"},"counterparty_id":{"type":"string","nullable":true,"description":"Unique identifier of the associated counterparty"},"created_at":{"type":"string","description":"Timestamp when the order was created","format":"date-time"}},"required":["id","external_order_number","marketplace_order_number","external_order_id","order_key","comment","to_stock","is_deleted","priority","client_id","counterparty_id","created_at"]}}},"paths":{"/api/v1/public/orders":{"get":{"description":"\nThis method retrieves a list of all external orders along with their details, such as order numbers, priority, client information, and timestamps.\n","operationId":"PublicOrdersController_publicGetAll_v1","parameters":[{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicOrderResponseDto"}}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Get all orders","tags":["Orders"]}}}}
```

## Create order

> \
> This method allows creating a new order, setting order properties, and adding order items. Production items are automatically generated based on the order items' quantity.\
> \
> \### Notes\
> \
> \- If the \`line\_item\_id\` is not provided in the request, HESH generates it and includes it in the response.\
> \
> \- If the \`line\_item\_id\` is provided, HESH uses it and includes the same ID in the response.\
> \
> \### How to check transfered data in HESH\
> \
> \#### Register in Hesh\
> \
> 1\. Go to your success manager and provide registration email\
> 2\. Receive invitation on the email  \
> 3\. Create a password and log in\
> \
> \#### Open Production Page\
> \
> 1\. If you don't have "Production" page in the sidebar or don't have access contact your success manager\
> \
> \#### Filter Productions\
> \
> 1\. Choose "Source" filter\
> 2\. Filter productions by External type\
> \
> \#### Sort Productions\
> \
> Sort productions by date, deadline and so on<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Orders"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicOrderCreateDto":{"type":"object","properties":{"external_order_number":{"type":"string","description":"A unique string used in the UI and controlled by the user"},"external_order_id":{"type":"string","description":"A unique identifier for each order"},"marketplace_order_number":{"type":"string","description":"A unique string used in the UI and controlled by the user"},"comment":{"type":"string","description":"Additional comments or info for the order"},"deadline_at":{"type":"string","description":"The date when the order should be produced (ISO 8601 format)","format":"date-time"},"external_created_at":{"type":"string","description":"The date when the order was created in an external system (ISO 8601 format)","format":"date-time"},"to_stock":{"type":"boolean","description":"Indicates if this is an internal company order (e.g., to replenish warehouse stocks)"},"client":{"description":"Client information","allOf":[{"$ref":"#/components/schemas/PublicClientCreateDto"}]},"primary_client":{"description":"Primary client information","allOf":[{"$ref":"#/components/schemas/PublicClientCreateDto"}]},"line_items":{"description":"List of line items for the order","type":"array","items":{"$ref":"#/components/schemas/CreateLineItemDto"}}},"required":["external_order_number","external_order_id","line_items"]},"PublicClientCreateDto":{"type":"object","properties":{"name":{"type":"string","description":"Client name"},"external_client_id":{"type":"string","description":"External client identifier"},"phone":{"type":"string","nullable":true,"description":"Client's phone number"},"email":{"type":"string","nullable":true,"description":"Client's email"},"company":{"type":"string","nullable":true,"description":"Client's company name"}},"required":["name","external_client_id"]},"CreateLineItemDto":{"type":"object","properties":{"line_item_id":{"type":"string","description":"Line item ID"},"barcode":{"type":"string","description":"Barcode of the item"},"deadline_at":{"format":"date-time","type":"string","description":"Deadline date and time"},"planned_start_date":{"format":"date-time","type":"string","description":"Planned start date and time"},"external_created_at":{"format":"date-time","type":"string","description":"External created date and time"},"external_user_id":{"type":"string","description":"User id from external(yours) system"},"shipping_deadline":{"format":"date-time","type":"string","description":"Shipping deadline date and time"},"quantity":{"type":"number","minimum":0,"description":"Quantity of items"},"line_item_note":{"type":"string","description":"Note or comment for the line item"},"marketplace_note":{"type":"string","description":"Note from marketplace for the line item"},"route_id":{"type":"string","description":"Route identifier for the production workflow"},"tags":{"description":"Tags for the line item","type":"array","items":{"type":"string"}},"attachments":{"description":"Attachments for the line item","type":"array","items":{"$ref":"#/components/schemas/PublicAddAttachmentToLineItemDto"}}},"required":["barcode","quantity"]},"PublicAddAttachmentToLineItemDto":{"type":"object","properties":{"file_name":{"type":"string","description":"File name"},"url":{"type":"string","description":"URL of the file"},"is_primary":{"type":"boolean","description":"Marks image as primary line item image"}},"required":["url"]},"PublicOrderCreateAndUpdateResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique internal identifier of the order"},"external_order_number":{"type":"string","description":"A unique string used in the UI and controlled by the user"},"order_key":{"type":"string","description":"System-generated order key for internal reference"},"external_order_id":{"type":"string","description":"A unique identifier for each order from external system"},"marketplace_order_number":{"type":"string","nullable":true,"description":"A unique string used in the UI and controlled by the user"},"marketplace_note":{"type":"string","nullable":true,"description":"Additional comments or info for the order"},"line_items":{"description":"List of line items associated with the order","type":"array","items":{"$ref":"#/components/schemas/LineItemDto"}}},"required":["id","external_order_number","order_key","external_order_id","marketplace_order_number","marketplace_note","line_items"]},"LineItemDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"line_item_id":{"type":"string","format":"uuid"},"barcode":{"type":"string"},"sku":{"type":"string"},"name":{"type":"string"},"quantity":{"type":"number"},"line_item_note":{"type":"string"},"marketplace_note":{"type":"string"},"productions":{"type":"array","items":{"$ref":"#/components/schemas/ProductionWithinLineItemDto"}}},"required":["id","line_item_id","barcode","quantity","productions"]},"ProductionWithinLineItemDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"production_key":{"type":"string"},"created_at":{"format":"date-time","type":"string"}},"required":["id","production_key","created_at"]}}},"paths":{"/api/v1/public/orders":{"post":{"description":"\nThis method allows creating a new order, setting order properties, and adding order items. Production items are automatically generated based on the order items' quantity.\n\n### Notes\n\n- If the `line_item_id` is not provided in the request, HESH generates it and includes it in the response.\n\n- If the `line_item_id` is provided, HESH uses it and includes the same ID in the response.\n\n### How to check transfered data in HESH\n\n#### Register in Hesh\n\n1. Go to your success manager and provide registration email\n2. Receive invitation on the email  \n3. Create a password and log in\n\n#### Open Production Page\n\n1. If you don't have \"Production\" page in the sidebar or don't have access contact your success manager\n\n#### Filter Productions\n\n1. Choose \"Source\" filter\n2. Filter productions by External type\n\n#### Sort Productions\n\nSort productions by date, deadline and so on\n","operationId":"PublicOrdersController_publicCreate_v1","parameters":[{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOrderCreateDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOrderCreateAndUpdateResponseDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Create order","tags":["Orders"]}}}}
```

## Get order by external order id

> \
> This method retrieves an order along with their details, such as order numbers, priority, client information, line items and timestamps by provided external order id.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Orders"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicOrderCreateAndUpdateResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique internal identifier of the order"},"external_order_number":{"type":"string","description":"A unique string used in the UI and controlled by the user"},"order_key":{"type":"string","description":"System-generated order key for internal reference"},"external_order_id":{"type":"string","description":"A unique identifier for each order from external system"},"marketplace_order_number":{"type":"string","nullable":true,"description":"A unique string used in the UI and controlled by the user"},"marketplace_note":{"type":"string","nullable":true,"description":"Additional comments or info for the order"},"line_items":{"description":"List of line items associated with the order","type":"array","items":{"$ref":"#/components/schemas/LineItemDto"}}},"required":["id","external_order_number","order_key","external_order_id","marketplace_order_number","marketplace_note","line_items"]},"LineItemDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"line_item_id":{"type":"string","format":"uuid"},"barcode":{"type":"string"},"sku":{"type":"string"},"name":{"type":"string"},"quantity":{"type":"number"},"line_item_note":{"type":"string"},"marketplace_note":{"type":"string"},"productions":{"type":"array","items":{"$ref":"#/components/schemas/ProductionWithinLineItemDto"}}},"required":["id","line_item_id","barcode","quantity","productions"]},"ProductionWithinLineItemDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"production_key":{"type":"string"},"created_at":{"format":"date-time","type":"string"}},"required":["id","production_key","created_at"]}}},"paths":{"/api/public/orders/{external_order_id}":{"get":{"description":"\nThis method retrieves an order along with their details, such as order numbers, priority, client information, line items and timestamps by provided external order id.\n","operationId":"PublicOrdersController_getOrder","parameters":[{"name":"external_order_id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOrderCreateAndUpdateResponseDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Get order by external order id","tags":["Orders"]}}}}
```

## Cancel external order

> \
> This method allows to cancel all productions in specified order.  \
> \
> \*\*Notes\*\*\
> \
> Productions, additional productions and tasks are not in finished states (not “Done”, “Cancelled”, “From Stock”):\
> \
> \- the system cancels all productions, tasks and additional components from this order with specified barcodes\
> \
> \- updates the deadline for the whole order according to the most short term deadline of the item in it<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Orders"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicOrderResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique internal identifier of the order"},"external_order_number":{"type":"string","nullable":true,"description":"A unique string used in the UI and controlled by the user"},"marketplace_order_number":{"type":"string","nullable":true,"description":"A unique string used in the UI and controlled by the user"},"external_order_id":{"type":"string","nullable":true,"description":"A unique identifier for each order from external system"},"order_key":{"type":"string","description":"System-generated order key for internal reference"},"comment":{"type":"string","nullable":true,"description":"Additional comments or info for the order"},"to_stock":{"type":"boolean","description":"Indicates if this is an internal company order (e.g., to replenish warehouse stocks)"},"is_deleted":{"type":"boolean","description":"Indicates whether the order has been marked as deleted"},"priority":{"type":"string","description":"Priority level of the order","enum":["Highest","High","Medium","Low","Lowest"]},"client_id":{"type":"string","nullable":true,"description":"Unique identifier of the associated client"},"counterparty_id":{"type":"string","nullable":true,"description":"Unique identifier of the associated counterparty"},"created_at":{"type":"string","description":"Timestamp when the order was created","format":"date-time"}},"required":["id","external_order_number","marketplace_order_number","external_order_id","order_key","comment","to_stock","is_deleted","priority","client_id","counterparty_id","created_at"]}}},"paths":{"/api/v1/public/orders/{external_order_id}":{"post":{"description":"\nThis method allows to cancel all productions in specified order.  \n\n**Notes**\n\nProductions, additional productions and tasks are not in finished states (not “Done”, “Cancelled”, “From Stock”):\n\n- the system cancels all productions, tasks and additional components from this order with specified barcodes\n\n- updates the deadline for the whole order according to the most short term deadline of the item in it\n","operationId":"PublicOrdersController_cancel_v1","parameters":[{"name":"external_order_id","required":true,"in":"path","description":"The unique identifier of the order","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOrderResponseDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Cancel external order","tags":["Orders"]}}}}
```

## Update order

> \
> This method allows to update order properties and separate order lines with new values. Any property not provided will be left unchanged.\
> \
> \*\*Scenarios for processing the received data\*\*\
> \
> \*\*📝 Amount updated\*\*\
> \
> \- the quantity is increased (past quantity>new quantity)\
> \
> The system counts by how many units the quantity of the product has increased and adds a separate production item to the order for each unit of the difference\
> \
> \- the number is decreased (past quantity\<new quantity)\
> \
> The system counts by how many units the quantity of the product has decreased and selects difference number with non-started productions among all in the specified order and cancels them\
> \
> If decreased difference more than number of non-started productions then system find not finished productions with low production priority and then the smallest progress bar and stops them. \
> \
> \*\*📝 Quantity is zero\*\*\
> \
> If you enter zero in the \`quantity\` value in the body of the query, the system will cancel all productions in \`To Do\` status and stop all productions in \`In Progress\` status of this line item with the specified characteristic. This way, a certain number of created productions with the specified parameters are canceled/stopped within one order.\
> \
> \*\*📝 Line item is missed in request body\*\*\
> \
> Productions are not in finished states - the system cancels all productions from this order with specified barcodes. Updates the deadline for the whole order according to the most short term deadline of the item in it.\
> \
> \*\*📝 Deadline updated\*\*\
> \
> System checks deadlines for each production item with the same barcode in specified order and rewrites them, saving the history and marks that changes were made by external system Updates deadline for the whole order according to the most short term deadline of the item in it.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Orders"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicOrderUpdateDto":{"type":"object","properties":{"external_order_number":{"type":"string","description":"A unique string used in the UI and controlled by the user"},"marketplace_order_number":{"type":"string","description":"A unique string used in the UI and controlled by the user"},"comment":{"type":"string","description":"Additional comments or info for the order"},"deadline_at":{"type":"string","description":"The date when the order should be produced (ISO 8601 format)","format":"date-time"},"external_created_at":{"type":"string","description":"The date when the order was created in an external system (ISO 8601 format)","format":"date-time"},"to_stock":{"type":"boolean","description":"Indicates if this is an internal company order (e.g., to replenish warehouse stocks)"},"client":{"description":"Client information","allOf":[{"$ref":"#/components/schemas/PublicClientCreateDto"}]},"primary_client":{"description":"Primary client information","allOf":[{"$ref":"#/components/schemas/PublicClientCreateDto"}]},"line_items":{"description":"List of line items to update for the order","type":"array","items":{"$ref":"#/components/schemas/UpdateLineItemDto"}}}},"PublicClientCreateDto":{"type":"object","properties":{"name":{"type":"string","description":"Client name"},"external_client_id":{"type":"string","description":"External client identifier"},"phone":{"type":"string","nullable":true,"description":"Client's phone number"},"email":{"type":"string","nullable":true,"description":"Client's email"},"company":{"type":"string","nullable":true,"description":"Client's company name"}},"required":["name","external_client_id"]},"UpdateLineItemDto":{"type":"object","properties":{"line_item_id":{"type":"string","description":"Line item ID"},"barcode":{"type":"string","description":"Barcode of the item"},"deadline_at":{"format":"date-time","type":"string","description":"Deadline date and time"},"external_user_id":{"type":"string","description":"User id from external(yours) system"},"planned_start_date":{"format":"date-time","type":"string","description":"Planned start date and time"},"external_created_at":{"format":"date-time","type":"string","description":"External created date and time"},"shipping_deadline":{"format":"date-time","type":"string","description":"Shipping deadline date and time"},"quantity":{"type":"number","minimum":0,"description":"Quantity of items"},"line_item_note":{"type":"string","description":"Note or comment for the line item"},"marketplace_note":{"type":"string","description":"Note or comment for the marketplace"},"route_id":{"type":"string","description":"Route identifier for the production workflow"}},"required":["barcode","quantity"]},"PublicOrderCreateAndUpdateResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique internal identifier of the order"},"external_order_number":{"type":"string","description":"A unique string used in the UI and controlled by the user"},"order_key":{"type":"string","description":"System-generated order key for internal reference"},"external_order_id":{"type":"string","description":"A unique identifier for each order from external system"},"marketplace_order_number":{"type":"string","nullable":true,"description":"A unique string used in the UI and controlled by the user"},"marketplace_note":{"type":"string","nullable":true,"description":"Additional comments or info for the order"},"line_items":{"description":"List of line items associated with the order","type":"array","items":{"$ref":"#/components/schemas/LineItemDto"}}},"required":["id","external_order_number","order_key","external_order_id","marketplace_order_number","marketplace_note","line_items"]},"LineItemDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"line_item_id":{"type":"string","format":"uuid"},"barcode":{"type":"string"},"sku":{"type":"string"},"name":{"type":"string"},"quantity":{"type":"number"},"line_item_note":{"type":"string"},"marketplace_note":{"type":"string"},"productions":{"type":"array","items":{"$ref":"#/components/schemas/ProductionWithinLineItemDto"}}},"required":["id","line_item_id","barcode","quantity","productions"]},"ProductionWithinLineItemDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"production_key":{"type":"string"},"created_at":{"format":"date-time","type":"string"}},"required":["id","production_key","created_at"]}}},"paths":{"/api/v1/public/orders/{external_order_id}":{"put":{"description":"\nThis method allows to update order properties and separate order lines with new values. Any property not provided will be left unchanged.\n\n**Scenarios for processing the received data**\n\n**📝 Amount updated**\n\n- the quantity is increased (past quantity>new quantity)\n\nThe system counts by how many units the quantity of the product has increased and adds a separate production item to the order for each unit of the difference\n\n- the number is decreased (past quantity<new quantity)\n\nThe system counts by how many units the quantity of the product has decreased and selects difference number with non-started productions among all in the specified order and cancels them\n\nIf decreased difference more than number of non-started productions then system find not finished productions with low production priority and then the smallest progress bar and stops them. \n\n**📝 Quantity is zero**\n\nIf you enter zero in the `quantity` value in the body of the query, the system will cancel all productions in `To Do` status and stop all productions in `In Progress` status of this line item with the specified characteristic. This way, a certain number of created productions with the specified parameters are canceled/stopped within one order.\n\n**📝 Line item is missed in request body**\n\nProductions are not in finished states - the system cancels all productions from this order with specified barcodes. Updates the deadline for the whole order according to the most short term deadline of the item in it.\n\n**📝 Deadline updated**\n\nSystem checks deadlines for each production item with the same barcode in specified order and rewrites them, saving the history and marks that changes were made by external system Updates deadline for the whole order according to the most short term deadline of the item in it.\n","operationId":"PublicOrdersController_publicUpdate_v1","parameters":[{"name":"external_order_id","required":true,"in":"path","description":"The unique identifier of the order","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOrderUpdateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOrderCreateAndUpdateResponseDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Update order","tags":["Orders"]}}}}
```

## Delete order

> \
> This method allows to delete a single order by its id.\
> \
> \*\*Notes\*\*\
> \
> Productions, additional productions and tasks are not in finished states (not “Done”, “Cancelled”, “From Stock”):\
> \
> \- the system cancels all productions, tasks, additional tasks and additional components from this order with specified barcodes\
> \- Payment for task that are in “In progress” status should be calculated\
> \- Add flag “is deleted” to order info in all canceled productions.\
> \- Updates the deadline for the whole order according to the most short term deadline of the item in it.\
> \- Removes order details assosiated with this order from the list in “New production” and “Change order for production” pop-ups.\
> \
> Productions, additional productions and tasks that are in finished states (not “Done”, “Cancelled”, “From Stock”) remain in the same status.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Orders"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicOrderResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique internal identifier of the order"},"external_order_number":{"type":"string","nullable":true,"description":"A unique string used in the UI and controlled by the user"},"marketplace_order_number":{"type":"string","nullable":true,"description":"A unique string used in the UI and controlled by the user"},"external_order_id":{"type":"string","nullable":true,"description":"A unique identifier for each order from external system"},"order_key":{"type":"string","description":"System-generated order key for internal reference"},"comment":{"type":"string","nullable":true,"description":"Additional comments or info for the order"},"to_stock":{"type":"boolean","description":"Indicates if this is an internal company order (e.g., to replenish warehouse stocks)"},"is_deleted":{"type":"boolean","description":"Indicates whether the order has been marked as deleted"},"priority":{"type":"string","description":"Priority level of the order","enum":["Highest","High","Medium","Low","Lowest"]},"client_id":{"type":"string","nullable":true,"description":"Unique identifier of the associated client"},"counterparty_id":{"type":"string","nullable":true,"description":"Unique identifier of the associated counterparty"},"created_at":{"type":"string","description":"Timestamp when the order was created","format":"date-time"}},"required":["id","external_order_number","marketplace_order_number","external_order_id","order_key","comment","to_stock","is_deleted","priority","client_id","counterparty_id","created_at"]}}},"paths":{"/api/v1/public/orders/{external_order_id}":{"delete":{"description":"\nThis method allows to delete a single order by its id.\n\n**Notes**\n\nProductions, additional productions and tasks are not in finished states (not “Done”, “Cancelled”, “From Stock”):\n\n- the system cancels all productions, tasks, additional tasks and additional components from this order with specified barcodes\n- Payment for task that are in “In progress” status should be calculated\n- Add flag “is deleted” to order info in all canceled productions.\n- Updates the deadline for the whole order according to the most short term deadline of the item in it.\n- Removes order details assosiated with this order from the list in “New production” and “Change order for production” pop-ups.\n\nProductions, additional productions and tasks that are in finished states (not “Done”, “Cancelled”, “From Stock”) remain in the same status.\n","operationId":"PublicOrdersController_publicDelete_v1","parameters":[{"name":"external_order_id","required":true,"in":"path","description":"The unique identifier of the order","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOrderResponseDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Delete order","tags":["Orders"]}}}}
```


# Position Types

## List position types

> \
> Returns position types in the tenant, paginated. Each entry carries \`id\`, \`name\`, and \`description\`.\
> \
> \### Query\
> \
> \- \`search\` — optional case-insensitive substring match on \`name\`.\
> \- \`page\` / \`limit\` — defaults \`page = 1\`, \`limit = 25\`, max \`limit = 100\`.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"PositionTypes"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicPositionTypesPageDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicPositionTypeListItemDto"}},"meta":{"$ref":"#/components/schemas/PaginationMetadata"}},"required":["data","meta"]},"PublicPositionTypeListItemDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}},"required":["id","name","description"]},"PaginationMetadata":{"type":"object","properties":{"total":{"type":"number","description":"Total number of items"},"lastPage":{"type":"number","description":"Last page number"},"currentPage":{"type":"number","description":"Current page number"},"perPage":{"type":"number","description":"Items per page"},"prev":{"type":"number","description":"Previous page number","nullable":true},"next":{"type":"number","description":"Next page number","nullable":true}},"required":["total","lastPage","currentPage","perPage","prev","next"]}}},"paths":{"/api/v1/public/position-types":{"get":{"description":"\nReturns position types in the tenant, paginated. Each entry carries `id`, `name`, and `description`.\n\n### Query\n\n- `search` — optional case-insensitive substring match on `name`.\n- `page` / `limit` — defaults `page = 1`, `limit = 25`, max `limit = 100`.\n","operationId":"PublicPositionTypesController_listPositionTypes_v1","parameters":[{"name":"search","required":false,"in":"query","description":"Case-insensitive substring match on name.","schema":{"maxLength":100,"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":25,"type":"number"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPositionTypesPageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"List position types","tags":["PositionTypes"]}}}}
```


# Product Categories

## List product categories

> \
> Returns categories in the tenant.\
> \
> \### Query\
> \
> \- \`parent\_id\` (optional) — when provided, returns children of that node. When omitted, returns roots.\
> \- \`tree\` (optional, default false) — when true, returns the full subtree rooted at \`parent\_id\` (or all roots + descendants when omitted) nested via \`children\[]\`. Pagination is ignored in this mode.\
> \- \`search\` (optional) — case-insensitive substring match on \`name\`.\
> \- \`page\` / \`limit\` (optional) — page-based pagination for the flat mode. Defaults: \`page = 1\`, \`limit = 25\`, max \`limit = 100\`.\
> \- \`include\_deleted\` (optional, default false) — include soft-deleted categories in the response.\
> \
> Each item includes \`id\`, \`name\`, \`parent\_id\`, \`path\` (root→parent breadcrumbs), and \`is\_active\` (computed as \`deleted\_at IS NULL\`).<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Product Categories"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}}},"paths":{"/api/v1/public/product-categories":{"get":{"description":"\nReturns categories in the tenant.\n\n### Query\n\n- `parent_id` (optional) — when provided, returns children of that node. When omitted, returns roots.\n- `tree` (optional, default false) — when true, returns the full subtree rooted at `parent_id` (or all roots + descendants when omitted) nested via `children[]`. Pagination is ignored in this mode.\n- `search` (optional) — case-insensitive substring match on `name`.\n- `page` / `limit` (optional) — page-based pagination for the flat mode. Defaults: `page = 1`, `limit = 25`, max `limit = 100`.\n- `include_deleted` (optional, default false) — include soft-deleted categories in the response.\n\nEach item includes `id`, `name`, `parent_id`, `path` (root→parent breadcrumbs), and `is_active` (computed as `deleted_at IS NULL`).\n","operationId":"PublicProductCategoriesController_list_v1","parameters":[{"name":"parent_id","required":false,"in":"query","description":"Return children of this parent id. Omit to return roots.","schema":{"format":"uuid","type":"string"}},{"name":"tree","required":false,"in":"query","description":"When true, return the full subtree as a nested tree.","schema":{"default":false,"type":"boolean"}},{"name":"search","required":false,"in":"query","description":"Case-insensitive substring match on name.","schema":{"maxLength":100,"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":25,"type":"number"}},{"name":"include_deleted","required":false,"in":"query","schema":{"default":false,"type":"boolean"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"List product categories","tags":["Product Categories"]}}}}
```

## Create category

> \
> Creates a new category.\
> \
> \### Notes\
> \
> \- \`name\` is required (1..255 chars).\
> \- \`parent\_id\` — when omitted, creates a root category. When provided, the parent must exist and be active (soft-deleted parents → 404).\
> \- \`name\` must be unique (case-insensitive) among active siblings under the same parent — \`409\` on collision.\
> \
> Tag storage is deliberately not yet modelled — do not send \`tags\`; the tag endpoints are stubbed.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Product Categories"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicCreateCategoryDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"parent_id":{"type":"string","format":"uuid","description":"Parent id. Omit for root category."}},"required":["name"]},"PublicCategoryDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"parent_id":{"type":"string","nullable":true},"path":{"description":"Root→parent breadcrumbs; empty for root categories.","type":"array","items":{"$ref":"#/components/schemas/IdNameDto"}},"is_active":{"type":"boolean","description":"Computed from deleted_at IS NULL."},"created_at":{"type":"string","nullable":true}},"required":["id","name","parent_id","path","is_active","created_at"]},"IdNameDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}},"required":["id","name"]}}},"paths":{"/api/v1/public/product-categories":{"post":{"description":"\nCreates a new category.\n\n### Notes\n\n- `name` is required (1..255 chars).\n- `parent_id` — when omitted, creates a root category. When provided, the parent must exist and be active (soft-deleted parents → 404).\n- `name` must be unique (case-insensitive) among active siblings under the same parent — `409` on collision.\n\nTag storage is deliberately not yet modelled — do not send `tags`; the tag endpoints are stubbed.\n","operationId":"PublicProductCategoriesController_create_v1","parameters":[{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateCategoryDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCategoryDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Create category","tags":["Product Categories"]}}}}
```

## Get category by id

> \
> Returns a single category with optional expansions.\
> \
> \### Query\
> \
> \- \`include\` (optional, CSV) — one or more of \`products\`, \`children\`.\
> \- \`products\_page\`, \`products\_limit\` — pagination for the \`products\` include (defaults 1 / 25, max 100).\
> \
> Soft-deleted categories return 404 unless the caller can prove the id exists — call \`GET /?include\_deleted=true\` to find them.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Product Categories"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicCategoryWithIncludesDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"parent_id":{"type":"string","nullable":true},"path":{"description":"Root→parent breadcrumbs; empty for root categories.","type":"array","items":{"$ref":"#/components/schemas/IdNameDto"}},"is_active":{"type":"boolean","description":"Computed from deleted_at IS NULL."},"created_at":{"type":"string","nullable":true},"products":{"$ref":"#/components/schemas/PublicCategoryProductsPageDto"},"children":{"type":"array","items":{"$ref":"#/components/schemas/PublicCategoryDto"}}},"required":["id","name","parent_id","path","is_active","created_at"]},"IdNameDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}},"required":["id","name"]},"PublicCategoryProductsPageDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicCategoryProductDto"}},"meta":{"$ref":"#/components/schemas/PaginationMetadata"}},"required":["data","meta"]},"PublicCategoryProductDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]},"PaginationMetadata":{"type":"object","properties":{"total":{"type":"number","description":"Total number of items"},"lastPage":{"type":"number","description":"Last page number"},"currentPage":{"type":"number","description":"Current page number"},"perPage":{"type":"number","description":"Items per page"},"prev":{"type":"number","description":"Previous page number","nullable":true},"next":{"type":"number","description":"Next page number","nullable":true}},"required":["total","lastPage","currentPage","perPage","prev","next"]},"PublicCategoryDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"parent_id":{"type":"string","nullable":true},"path":{"description":"Root→parent breadcrumbs; empty for root categories.","type":"array","items":{"$ref":"#/components/schemas/IdNameDto"}},"is_active":{"type":"boolean","description":"Computed from deleted_at IS NULL."},"created_at":{"type":"string","nullable":true}},"required":["id","name","parent_id","path","is_active","created_at"]}}},"paths":{"/api/v1/public/product-categories/{id}":{"get":{"description":"\nReturns a single category with optional expansions.\n\n### Query\n\n- `include` (optional, CSV) — one or more of `products`, `children`.\n- `products_page`, `products_limit` — pagination for the `products` include (defaults 1 / 25, max 100).\n\nSoft-deleted categories return 404 unless the caller can prove the id exists — call `GET /?include_deleted=true` to find them.\n","operationId":"PublicProductCategoriesController_getById_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"include","required":false,"in":"query","description":"Comma-separated list. Supported: products, children.","schema":{"type":"string"}},{"name":"products_page","required":false,"in":"query","description":"Page for the products include.","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"products_limit","required":false,"in":"query","description":"Page size for the products include.","schema":{"minimum":1,"maximum":100,"default":25,"type":"number"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCategoryWithIncludesDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Get category by id","tags":["Product Categories"]}}}}
```

## Soft-delete category

> \
> Marks the category as deleted. Non-cascading.\
> \
> \### Rejected with 409 when\
> \
> \- The category has any non-deleted children.\
> \- The category has any \`product\_meta\` referencing it.\
> \- The category is already soft-deleted.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Product Categories"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}}},"paths":{"/api/v1/public/product-categories/{id}":{"delete":{"description":"\nMarks the category as deleted. Non-cascading.\n\n### Rejected with 409 when\n\n- The category has any non-deleted children.\n- The category has any `product_meta` referencing it.\n- The category is already soft-deleted.\n","operationId":"PublicProductCategoriesController_softDelete_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":""},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Soft-delete category","tags":["Product Categories"]}}}}
```

## Update category

> \
> Updates a category. All fields are optional.\
> \
> \### Rules\
> \
> \- \`name\` — must not collide with an active sibling under the current or new parent (\`409\`).\
> \- \`parent\_id\` — pass \`null\` to promote to root. Cannot equal \`:id\` and cannot equal any descendant of \`:id\` (would create a cycle → \`400\`). New parent must be active.\
> \- \`is\_active\` — \`true\` restores a soft-deleted category, \`false\` soft-deletes it. Rejected (\`409\`) if the current state already matches.\
> \- Rejected with \`409\` if the record is soft-deleted and you send a non-\`is\_active\` field — restore it first.\
> \- Successful \`parent\_id\` moves recompute the materialized \`path\` for the moved node and all its descendants.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Product Categories"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicUpdateCategoryDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"parent_id":{"type":"string","nullable":true,"description":"New parent. Pass null to promote to root. Rejected if it would create a cycle."},"is_active":{"type":"boolean","description":"true → restore soft-deleted, false → soft-delete. Rejected if state is already what you set."}}},"PublicCategoryDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"parent_id":{"type":"string","nullable":true},"path":{"description":"Root→parent breadcrumbs; empty for root categories.","type":"array","items":{"$ref":"#/components/schemas/IdNameDto"}},"is_active":{"type":"boolean","description":"Computed from deleted_at IS NULL."},"created_at":{"type":"string","nullable":true}},"required":["id","name","parent_id","path","is_active","created_at"]},"IdNameDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}},"required":["id","name"]}}},"paths":{"/api/v1/public/product-categories/{id}":{"patch":{"description":"\nUpdates a category. All fields are optional.\n\n### Rules\n\n- `name` — must not collide with an active sibling under the current or new parent (`409`).\n- `parent_id` — pass `null` to promote to root. Cannot equal `:id` and cannot equal any descendant of `:id` (would create a cycle → `400`). New parent must be active.\n- `is_active` — `true` restores a soft-deleted category, `false` soft-deletes it. Rejected (`409`) if the current state already matches.\n- Rejected with `409` if the record is soft-deleted and you send a non-`is_active` field — restore it first.\n- Successful `parent_id` moves recompute the materialized `path` for the moved node and all its descendants.\n","operationId":"PublicProductCategoriesController_update_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateCategoryDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCategoryDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Update category","tags":["Product Categories"]}}}}
```

## Restore soft-deleted category

> \
> Clears \`deleted\_at\` and \`deleted\_by\`. Returns \`409\` if the category is not currently deleted.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Product Categories"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicCategoryDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"parent_id":{"type":"string","nullable":true},"path":{"description":"Root→parent breadcrumbs; empty for root categories.","type":"array","items":{"$ref":"#/components/schemas/IdNameDto"}},"is_active":{"type":"boolean","description":"Computed from deleted_at IS NULL."},"created_at":{"type":"string","nullable":true}},"required":["id","name","parent_id","path","is_active","created_at"]},"IdNameDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}},"required":["id","name"]}}},"paths":{"/api/v1/public/product-categories/{id}/restore":{"post":{"description":"\nClears `deleted_at` and `deleted_by`. Returns `409` if the category is not currently deleted.\n","operationId":"PublicProductCategoriesController_restore_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCategoryDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Restore soft-deleted category","tags":["Product Categories"]}}}}
```

## Get breadcrumbs for a category

> \
> Returns \`{ path: \[{ id, name }] }\` — the root→parent breadcrumb chain for the given category. Empty array for root categories.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Product Categories"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"PublicCategoryPathDto":{"type":"object","properties":{"path":{"type":"array","items":{"$ref":"#/components/schemas/IdNameDto"}}},"required":["path"]},"IdNameDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}},"required":["id","name"]}}},"paths":{"/api/v1/public/product-categories/{id}/path":{"get":{"description":"\nReturns `{ path: [{ id, name }] }` — the root→parent breadcrumb chain for the given category. Empty array for root categories.\n","operationId":"PublicProductCategoriesController_getPath_v1","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCategoryPathDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Get breadcrumbs for a category","tags":["Product Categories"]}}}}
```


# Production Item Tags

## Add Tags to a Specific Production Item

> \
> This method allows you to add tags to a specific production item (line item) in an order. Optionally, you can choose to apply the tags to nested (child) production items as well.\
> \
> \*\*Notes\*\*\
> \
> \- If all parameters are passed correctly, the system adds the specified tags to the selected production item (line item) and all its nested production items (child productions), if they exist, provided that the \`apply\_to\_nested\_productions\` parameter is set to \`true\`.\
> \- If the \`apply\_to\_nested\_productions parameter is not provided, the system adds the tags only to the main production item (line item), and the nested production items (child productions) remain unchanged.\
> \- If at least one parameter is missing or incorrect, the system returns a 400 Bad Request error, indicating incomplete or invalid data in the request.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Production item tags"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"ManageTagsDto":{"type":"object","properties":{"tags":{"description":"A list of tags to be added to the production item","type":"array","items":{"type":"string"}},"apply_to_nested_productions":{"type":"boolean","description":"Determines if the tags should be applied to nested (child) production items. \"true\" — Tags are inherited by nested productions. \"false\" — Tags are not inherited by nested productions. Default option: \"false\" if not specified."}},"required":["tags"]},"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/orders/{external_order_id}/line-items/{line_item_id}/tags":{"post":{"description":"\nThis method allows you to add tags to a specific production item (line item) in an order. Optionally, you can choose to apply the tags to nested (child) production items as well.\n\n**Notes**\n\n- If all parameters are passed correctly, the system adds the specified tags to the selected production item (line item) and all its nested production items (child productions), if they exist, provided that the `apply_to_nested_productions` parameter is set to `true`.\n- If the `apply_to_nested_productions parameter is not provided, the system adds the tags only to the main production item (line item), and the nested production items (child productions) remain unchanged.\n- If at least one parameter is missing or incorrect, the system returns a 400 Bad Request error, indicating incomplete or invalid data in the request.\n","operationId":"PublicProductionItemTagController_attachTagsToLineItem_v1","parameters":[{"name":"external_order_id","required":true,"in":"path","description":"The unique identifier of the order","schema":{"type":"string"}},{"name":"line_item_id","required":true,"in":"path","description":"The unique identifier of the production item","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManageTagsDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Add Tags to a Specific Production Item","tags":["Production item tags"]}}}}
```

## Replace tags for a specific production item

> \
> This method allows to replaces existing tags with the specified list of new tags for a specific line item (production). Optionally, it can also replace tags for all nested (child) productions if specified.\
> \
> \*\*Notes\*\*\
> \
> \- If all parameters are passed correctly, the system replaces the tags that were passed in this request for the line items (productions), which IDs were passed in the request with replacing tags of the subitems (child productions) if the specified line items (productions) have any.\
> \- If the \`apply\_to\_nested\_productions\` parameter is not provided, the system replaces the tags that were passed in this request for the line items (productions), which IDs were passed in the request without replacing tags of the subitems (child productions) if the specified line items (productions) have any.\
> \- If at least one parameter is missing or incorrect, the system returns a 400 Bad Request error, indicating incomplete or invalid data in the request.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Production item tags"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"ManageTagsDto":{"type":"object","properties":{"tags":{"description":"A list of tags to be added to the production item","type":"array","items":{"type":"string"}},"apply_to_nested_productions":{"type":"boolean","description":"Determines if the tags should be applied to nested (child) production items. \"true\" — Tags are inherited by nested productions. \"false\" — Tags are not inherited by nested productions. Default option: \"false\" if not specified."}},"required":["tags"]},"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/orders/{external_order_id}/line-items/{line_item_id}/tags":{"put":{"description":"\nThis method allows to replaces existing tags with the specified list of new tags for a specific line item (production). Optionally, it can also replace tags for all nested (child) productions if specified.\n\n**Notes**\n\n- If all parameters are passed correctly, the system replaces the tags that were passed in this request for the line items (productions), which IDs were passed in the request with replacing tags of the subitems (child productions) if the specified line items (productions) have any.\n- If the `apply_to_nested_productions` parameter is not provided, the system replaces the tags that were passed in this request for the line items (productions), which IDs were passed in the request without replacing tags of the subitems (child productions) if the specified line items (productions) have any.\n- If at least one parameter is missing or incorrect, the system returns a 400 Bad Request error, indicating incomplete or invalid data in the request.\n","operationId":"PublicProductionItemTagController_updateTagsOfLineItem_v1","parameters":[{"name":"external_order_id","required":true,"in":"path","description":"The unique identifier of the order","schema":{"type":"string"}},{"name":"line_item_id","required":true,"in":"path","description":"The unique identifier of the production item","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManageTagsDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Replace tags for a specific production item","tags":["Production item tags"]}}}}
```

## Delete tags for a specific production item

> \
> This method allows to delete existing tags with the specified list of new tags for a specific line item (production). Optionally, it can also delete tags for all nested (child) productions if specified.  \
> \
> \*\*Notes\*\*\
> \
> \- If all parameters are passed correctly, the system deletes the tags that were passed in this request for the line items (productions), which IDs were passed in the request with deleting tags of the subitems (child productions) if the specified line items (productions) have any.\
> \- If the \`apply\_to\_nested\_productions\` parameter is not provided, the system deletes the tags that were passed in this request for the line items (productions), which IDs were passed in the request without deleting tags of the subitems (child productions) if the specified line items (productions) have any.\
> \- If at least one parameter is missing or incorrect, the system returns a 400 Bad Request error, indicating incomplete or invalid data in the request.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Production item tags"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/orders/{external_order_id}/line-items/{line_item_id}/tags":{"delete":{"description":"\nThis method allows to delete existing tags with the specified list of new tags for a specific line item (production). Optionally, it can also delete tags for all nested (child) productions if specified.  \n\n**Notes**\n\n- If all parameters are passed correctly, the system deletes the tags that were passed in this request for the line items (productions), which IDs were passed in the request with deleting tags of the subitems (child productions) if the specified line items (productions) have any.\n- If the `apply_to_nested_productions` parameter is not provided, the system deletes the tags that were passed in this request for the line items (productions), which IDs were passed in the request without deleting tags of the subitems (child productions) if the specified line items (productions) have any.\n- If at least one parameter is missing or incorrect, the system returns a 400 Bad Request error, indicating incomplete or invalid data in the request.\n","operationId":"PublicProductionItemTagController_removeTagsFromLineItem_v1","parameters":[{"name":"external_order_id","required":true,"in":"path","description":"The unique identifier of the order","schema":{"type":"string"}},{"name":"line_item_id","required":true,"in":"path","description":"The unique identifier of the production item","schema":{"type":"string"}},{"name":"tags","required":true,"in":"query","description":"","schema":{"type":"array","items":{"type":"string"}}},{"name":"apply_to_nested_productions","required":false,"in":"query","description":"","schema":{"type":"boolean"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Delete tags for a specific production item","tags":["Production item tags"]}}}}
```

## Add Tags to All Productions Associated with the Order

> \
> Adds specified tags to all productions (line items) linked to a given order. Optionally, it can also add these tags to all nested (child) productions if specified.\
> \
> \*\*Notes\*\*\
> \
> \- If all parameters are passed correctly, The system adds the tags that were passed in this request to all line items (productions), connected with the order, which ID was passed in the request, with adding the subitems (child productions).\
> \- If the \`apply\_to\_nested\_productions\` parameter is not provided, the system adds the tags that were passed in this request to all line items (productions), connected with the order, which ID was passed in the request, without adding the subitems (child productions) if the line items (productions) have any.\
> \- If at least one parameter is missing or incorrect, the system returns a 400 Bad Request error, indicating incomplete or invalid data in the request.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Production item tags"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"ManageTagsDto":{"type":"object","properties":{"tags":{"description":"A list of tags to be added to the production item","type":"array","items":{"type":"string"}},"apply_to_nested_productions":{"type":"boolean","description":"Determines if the tags should be applied to nested (child) production items. \"true\" — Tags are inherited by nested productions. \"false\" — Tags are not inherited by nested productions. Default option: \"false\" if not specified."}},"required":["tags"]},"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/orders/{external_order_id}/tags":{"post":{"description":"\nAdds specified tags to all productions (line items) linked to a given order. Optionally, it can also add these tags to all nested (child) productions if specified.\n\n**Notes**\n\n- If all parameters are passed correctly, The system adds the tags that were passed in this request to all line items (productions), connected with the order, which ID was passed in the request, with adding the subitems (child productions).\n- If the `apply_to_nested_productions` parameter is not provided, the system adds the tags that were passed in this request to all line items (productions), connected with the order, which ID was passed in the request, without adding the subitems (child productions) if the line items (productions) have any.\n- If at least one parameter is missing or incorrect, the system returns a 400 Bad Request error, indicating incomplete or invalid data in the request.\n","operationId":"PublicProductionItemTagController_attachTagsToAllLineItems_v1","parameters":[{"name":"external_order_id","required":true,"in":"path","description":"The unique identifier of the order","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManageTagsDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Add Tags to All Productions Associated with the Order","tags":["Production item tags"]}}}}
```

## Replace tags for all productions associated with the order

> \
> This method allows to replaces existing tags with the specified list of new tags for all productions in this order. Optionally, it can also replace tags for all nested (child) productions if specified.  \
> \
> \*\*Notes\*\*\
> \
> \
> \- If all parameters are passed correctly, the system replaces the tags that were passed in this request for the all line items (productions), which IDs were passed in the request with replacing tags of the subitems (child productions) if the specified line items (productions) have any.\
> \- If the \`apply\_to\_nested\_productions\` parameter is not provided, the system replaces the tags that were passed in this request for the all line items (productions), which IDs were passed in the request without replacing tags of the subitems (child productions) if the specified line items (productions) have any.\
> \- If at least one parameter is missing or incorrect, the system returns a 400 Bad Request error, indicating incomplete or invalid data in the request.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Production item tags"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"ManageTagsDto":{"type":"object","properties":{"tags":{"description":"A list of tags to be added to the production item","type":"array","items":{"type":"string"}},"apply_to_nested_productions":{"type":"boolean","description":"Determines if the tags should be applied to nested (child) production items. \"true\" — Tags are inherited by nested productions. \"false\" — Tags are not inherited by nested productions. Default option: \"false\" if not specified."}},"required":["tags"]},"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/orders/{external_order_id}/tags":{"put":{"description":"\nThis method allows to replaces existing tags with the specified list of new tags for all productions in this order. Optionally, it can also replace tags for all nested (child) productions if specified.  \n\n**Notes**\n\n\n- If all parameters are passed correctly, the system replaces the tags that were passed in this request for the all line items (productions), which IDs were passed in the request with replacing tags of the subitems (child productions) if the specified line items (productions) have any.\n- If the `apply_to_nested_productions` parameter is not provided, the system replaces the tags that were passed in this request for the all line items (productions), which IDs were passed in the request without replacing tags of the subitems (child productions) if the specified line items (productions) have any.\n- If at least one parameter is missing or incorrect, the system returns a 400 Bad Request error, indicating incomplete or invalid data in the request.\n","operationId":"PublicProductionItemTagController_updateTagsOfAllLineItems_v1","parameters":[{"name":"external_order_id","required":true,"in":"path","description":"The unique identifier of the order","schema":{"type":"string"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManageTagsDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Replace tags for all productions associated with the order","tags":["Production item tags"]}}}}
```

## Delete tags for all productions associated with the order

> \
> This method allows to delete existing tags with the specified list of new tags for all productions in this order. Optionally, it can also delete tags for all nested (child) productions if specified.\
> \
> \*\*Notes\*\*\
> \
> \- If all parameters are passed correctly, the system deletes the tags that were passed in this request for the all line items (productions), which IDs were passed in the request with deleting tags of the subitems (child productions).\
> \- If the \`apply\_to\_nested\_productions\` parameter is not provided, the system deletes the tags that were passed in this request for the all line items (productions), which IDs were passed in the request without deleting tags of the subitems (child productions).\
> \- If at least one parameter is missing or incorrect, the system returns a 400 Bad Request error, indicating incomplete or invalid data in the request.<br>

```json
{"openapi":"3.0.0","info":{"title":"Public API","version":"1.0"},"tags":[{"name":"Production item tags"}],"servers":[{"url":"https://api-stage.hesh.tech"}],"security":[{"PublicApiKey":[]}],"components":{"securitySchemes":{"PublicApiKey":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"MessageDto":{"type":"object","properties":{"message":{"type":"string","description":"Message returned from API confirming the operation"}},"required":["message"]}}},"paths":{"/api/v1/public/orders/{external_order_id}/tags":{"delete":{"description":"\nThis method allows to delete existing tags with the specified list of new tags for all productions in this order. Optionally, it can also delete tags for all nested (child) productions if specified.\n\n**Notes**\n\n- If all parameters are passed correctly, the system deletes the tags that were passed in this request for the all line items (productions), which IDs were passed in the request with deleting tags of the subitems (child productions).\n- If the `apply_to_nested_productions` parameter is not provided, the system deletes the tags that were passed in this request for the all line items (productions), which IDs were passed in the request without deleting tags of the subitems (child productions).\n- If at least one parameter is missing or incorrect, the system returns a 400 Bad Request error, indicating incomplete or invalid data in the request.\n","operationId":"PublicProductionItemTagController_removeTagsFromAllLineItems_v1","parameters":[{"name":"external_order_id","required":true,"in":"path","description":"The unique identifier of the order","schema":{"type":"string"}},{"name":"tags","required":true,"in":"query","description":"","schema":{"type":"array","items":{"type":"string"}}},{"name":"apply_to_nested_productions","required":false,"in":"query","description":"","schema":{"type":"boolean"}},{"name":"x-tenant-id","in":"header","description":"Tenant id (uuid v4)","required":false,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageDto"}}}},"429":{"description":"Returned when the rate limit is exceeded","headers":{"X-RateLimit-Limit":{"description":"Maximum number of allowed requests during the current window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining number of requests before throttling occurs","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Number of seconds until the rate limit window resets","schema":{"type":"integer"}}}}},"summary":"Delete tags for all productions associated with the order","tags":["Production item tags"]}}}}
```




---

[Next Page](/llms-full.txt/1)

