From 1c1933b694c477f7dedea718252d27e32f8970b1 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 10 Feb 2026 21:54:35 +1100 Subject: [PATCH] [enhancements] Stock tracking enhancements (#11260) * Data migrations for StockItemTracking - Propagate the 'part' links * Enable filtering of stock tracking entries by part * Enable filtering by date range * Display stock tracking for part * Table enhancements * Bump API version * Display stock item column * Ensure 'quantity' is recorded for stock tracking entries * Add new global settings * Adds background task for deleting old stock tracking entries * Docs updates * Enhanced docs * Cast quantity to float * Rever data migration * Ensure part link gets created * Improved prefetch for API * Playwright testing * Tweak unit test thresholds --------- Co-authored-by: Matthias Mair --- docs/docs/api/schema.md | 2 +- .../images/stock/part_tracking_history.png | Bin 0 -> 111740 bytes .../stock/stock_item_tracking_history.png | Bin 0 -> 59318 bytes docs/docs/hooks.py | 2 +- docs/docs/part/stocktake.md | 22 +-- docs/docs/stock/index.md | 26 ++- docs/docs/stock/status.md | 2 + docs/docs/stock/traceability.md | 152 +++++++++++++++++ docs/docs/stock/tracking.md | 154 +++--------------- docs/mkdocs.yml | 1 + .../InvenTree/InvenTree/api_version.py | 6 +- src/backend/InvenTree/build/models.py | 7 +- .../InvenTree/common/setting/system.py | 31 +++- src/backend/InvenTree/order/models.py | 7 +- src/backend/InvenTree/order/test_api.py | 2 +- src/backend/InvenTree/part/models.py | 2 +- src/backend/InvenTree/part/tasks.py | 2 +- src/backend/InvenTree/stock/api.py | 53 +++++- ...cking_part_alter_stockitemtracking_item.py | 36 ++++ .../migrations/0118_auto_20260205_1218.py | 57 +++++++ src/backend/InvenTree/stock/models.py | 63 +++++-- src/backend/InvenTree/stock/serializers.py | 14 +- src/backend/InvenTree/stock/status_codes.py | 2 +- src/backend/InvenTree/stock/tasks.py | 30 +++- .../src/components/settings/SettingList.tsx | 24 ++- .../pages/Index/Settings/SystemSettings.tsx | 31 ++-- .../src/pages/part/PartStockHistoryDetail.tsx | 34 +++- .../src/tables/stock/StockTrackingTable.tsx | 66 +++++++- src/frontend/tests/pages/pui_stock.spec.ts | 49 ++++++ 29 files changed, 669 insertions(+), 208 deletions(-) create mode 100644 docs/docs/assets/images/stock/part_tracking_history.png create mode 100644 docs/docs/assets/images/stock/stock_item_tracking_history.png create mode 100644 docs/docs/stock/traceability.md create mode 100644 src/backend/InvenTree/stock/migrations/0117_stockitemtracking_part_alter_stockitemtracking_item.py create mode 100644 src/backend/InvenTree/stock/migrations/0118_auto_20260205_1218.py diff --git a/docs/docs/api/schema.md b/docs/docs/api/schema.md index f4ce2837f3..ba610a0773 100644 --- a/docs/docs/api/schema.md +++ b/docs/docs/api/schema.md @@ -7,7 +7,7 @@ The API schema as documented below is generated using the [drf-spectactular](htt ## API Version -This documentation is for API version: `352` +This documentation is for API version: `449` !!! tip "API Schema History" We track API schema changes, and provide a snapshot of each API schema version in the [API schema repository](https://github.com/inventree/schema/). diff --git a/docs/docs/assets/images/stock/part_tracking_history.png b/docs/docs/assets/images/stock/part_tracking_history.png new file mode 100644 index 0000000000000000000000000000000000000000..cf31097ffe8afa7f77f24145eeee8e65cefa220b GIT binary patch literal 111740 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 ANB{r; literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/stock/stock_item_tracking_history.png b/docs/docs/assets/images/stock/stock_item_tracking_history.png new file mode 100644 index 0000000000000000000000000000000000000000..895fb61e0479c1dbbde503a98f427529fae4c66b GIT binary patch literal 59318 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
!rld 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 literal 0 HcmV?d00001 diff --git a/docs/docs/hooks.py b/docs/docs/hooks.py index 52e5998e51..2cd00cd586 100644 --- a/docs/docs/hooks.py +++ b/docs/docs/hooks.py @@ -304,6 +304,6 @@ def on_post_build(*args, **kwargs): if missing: raise NotImplementedError( 'Missing Settings:\n' - + f"There are {len(missing)} missing settings in the '{group}' group:\n" + + f"There are {len(missing)} missing settings in the '{group}' group:\n- " + '\n- '.join(missing) ) diff --git a/docs/docs/part/stocktake.md b/docs/docs/part/stocktake.md index e38e514d24..a226587b91 100644 --- a/docs/docs/part/stocktake.md +++ b/docs/docs/part/stocktake.md @@ -1,10 +1,10 @@ --- -title: Part Stock History +title: Part Stocktake --- -## Part Stock History +## Part Stocktake -InvenTree can track the historical stock levels of parts, allowing users to view past stocktake data and generate reports based on this information. +InvenTree can record the historical stock levels of parts, allowing users to view past stocktake data and generate reports based on this information. A *Stocktake* refers to a "snapshot" of stock levels for a particular part, at a specific point in time. Stocktake information is used for tracking a historical record of the quantity and value of part stock. @@ -75,9 +75,9 @@ A dashboard widget is available for generating stocktake reports, which can be a Here, the user can specify the report parameters, and then click the *Generate Report* button to generate a new stocktake report based on the specified parameters. -## Stock History Settings +## Stocktake Settings -There are a number of configuration options available in the [settings view](../settings/global.md): +There are a number of configuration options available for controlling the behavior of part stocktake functionality in the [system settings view](../settings/global.md): | Name | Description | Default | Units | | ---- | ----------- | ------- | ----- | @@ -87,9 +87,9 @@ There are a number of configuration options available in the [settings view](../ {{ globalsetting("STOCKTAKE_DELETE_OLD_ENTRIES")}} {{ globalsetting("STOCKTAKE_DELETE_DAYS") }} -{{ image("part/part_stocktake_settings.png", "Stock history settings") }} +{{ image("part/part_stocktake_settings.png", "Stocktake settings") }} -### Enable Stock History +### Enable Stocktake Enable or disable stocktake functionality. Note that by default, stocktake functionality is disabled. @@ -97,10 +97,10 @@ Enable or disable stocktake functionality. Note that by default, stocktake funct Configure the number of days between generation of [automatic stocktake reports](#automatic-stocktake). If this value is set to zero, automatic stocktake reports will not be generated. -### Delete Old Stock History Entries +### Delete Old Stocktake Entries -If enabled, stock history entries older than the specified number of days will be automatically deleted from the database. +If enabled, stocktake entries older than the specified number of days will be automatically deleted from the database. -### Stock History Deletion Interval +### Stocktake Deletion Interval -Configure how many days historical stock records are retained in the database. +Configure how many days historical stocktake records are retained in the database. diff --git a/docs/docs/stock/index.md b/docs/docs/stock/index.md index d020dd67d1..d3c544a3c8 100644 --- a/docs/docs/stock/index.md +++ b/docs/docs/stock/index.md @@ -2,13 +2,15 @@ title: Stock --- -## Stock Items +## Stock Item A *Stock Item* is an actual instance of a [*Part*](../part/index.md) item. It represents a physical quantity of the *Part* in a specific location. +Each Part instance may have multiple stock items associated with it, in various quantities and locations. Additionally, each stock item may have a serial number (if the part is tracked by serial number) and may be associated with a particular supplier part (if the item was purchased from a supplier). + ### Stock Item Details -The *Stock Item* detail view shows information regarding the particular stock item: +Each *Stock Item* is linked to the following information: **Part** - Which *Part* this stock item is an instance of @@ -26,17 +28,27 @@ The *Stock Item* detail view shows information regarding the particular stock it **Status** - Status of this stock item -### Stock Availability +**Serial Number** - If the part is tracked by serial number, the unique serial number of this stock item + +**Batch Code** - If the part is tracked by batch code, the batch code of this stock item + +## Stock Availability InvenTree has a number of different mechanisms to determine whether stock is available for use. See the [Stock Availability](./availability.md) page for more information. -### Stock Tracking +## Traceability + +Stock items can be associated with a unique serial number and / or a batch code, which allows for traceability of individual stock items. This is particularly useful for tracking the history of specific items, and for ensuring that items can be traced back to their source (e.g. supplier, purchase order, etc). + +Refer to the [traceability](./traceability.md) page for more information on how serial numbers and batch codes work in InvenTree. + +## Stock Tracking Every time a *Stock Item* is adjusted, a *Stock Tracking* entry is automatically created. This ensures a complete history of the *Stock Item* is maintained as long as the item is in the system. Each stock tracking historical item records the user who performed the action. [Read more about stock tracking here](./tracking.md). -## Stock Location +## Stock Locations A stock location represents a physical real-world location where *Stock Items* are stored. Locations are arranged in a cascading manner and each location may contain multiple sub-locations, or stock, or both. @@ -60,3 +72,7 @@ in the build order line items view where the material is allocated. {{ image("stock/stock_external_icon.png", title="External stock indication") }} The external flag does not get inherited to sublocations. + +### Structural Locations + +A stock location may be optionally marked as *structural*. Structural locations are used to represent physical locations which are not directly associated with stock items, but rather serve as a means of organizing the stock location hierarchy. For example, a structural location might represent a particular shelf or drawer within a warehouse, while the actual stock items are stored in sub-locations within that location. diff --git a/docs/docs/stock/status.md b/docs/docs/stock/status.md index 8a50d02a5e..d153047941 100644 --- a/docs/docs/stock/status.md +++ b/docs/docs/stock/status.md @@ -36,6 +36,8 @@ Refer to the source code for the Stock status codes: show_source: True members: [] +### Custom Status Codes + Stock Status supports [custom states](../concepts/custom_states.md). ### Default Status Code diff --git a/docs/docs/stock/traceability.md b/docs/docs/stock/traceability.md new file mode 100644 index 0000000000..5fb21aa608 --- /dev/null +++ b/docs/docs/stock/traceability.md @@ -0,0 +1,152 @@ +--- +title: Stock Traceability +--- + +## Stock Traceability + +It may be desirable to track individual stock items, or groups of stock items, with unique identifier values. Stock items may be *tracked* using either *Batch Codes* or *Serial Numbers*. + +Individual stock items can be assigned a batch code, or a serial number, or both, or neither, as requirements dictate. + +{{ image("stock/batch_and_serial.png", title="Batch and Serial Number Tracking") }} + +Out of the box, the default implementations for both batch codes and serial numbers are (intentionally) simplistic. + +As the particular requirements for serial number or batch code conventions may vary significantly from one application to another, InvenTree provides the ability for custom plugins to determine exactly how batch codes and serial numbers are implemented. + +### Batch Codes + +Batch codes can be used to specify a particular "group" of items, and can be assigned to any stock item without restriction. Batch codes are tracked even as stock items are split into separate items. + +Multiple stock items may share the same batch code without restriction, even across different parts. + +#### Generating Batch Codes + +Batch codes can be generated automatically based on a provided pattern. The default pattern simply uses the current date-code as the batch number, however this can be customized within a certain scope. + +{{ image("stock/batch_code_template.png", title="Batch code pattern") }} + +#### Context Variables + +The following context variables are available by default when generating a batch code using the builtin generation functionality: + +| Variable | Description | +| --- | --- | +| year | The current year e.g. `2024` | +| month | The current month number, e.g. `5` | +| day | The current day of month, e.g. `21` | +| hour | The current hour of day, in 24-hour format, e.g. `23` | +| minute | The current minute of hour, e.g. `17` | +| week | The current week of year, e.g. `51` | + +#### Plugin Support + +To implement custom batch code functionality, refer to the details on the [Validation Plugin Mixin](../plugins/mixins/validation.md#batch-codes). + +### Serial Numbers + +A serial "number" is used to uniquely identify a single, unique stock item. Note that while *number* is used throughout the documentation, these values are not required to be numeric. + +#### Uniqueness Requirements + +By default, serial numbers must be unique across any given [Part](../part/index.md) instance (including any variants of that part). + +However, it is also possible to specify that serial numbers must be globally unique across all types of parts. This is configurable in the settings display (see below): + +{{ image("stock/serial_numbers_unique.png", title="Serial number uniqueness") }} + +#### Generating Serial Numbers + +When creating a group of serialized stock items, it can be very useful for the user to be able to generate a group of unique serial numbers, with one serial number for each serialized stock item. + +{{ image("stock/serial_next.png", title="Serial number entry") }} + +For a given serial number *schema* (either the in-built schema or a custom schema defined by a plugin), a group (or *range*) of serial numbers can be generated using a number of possible patterns: + +##### Comma Separated Values + +Individual serial numbers can be specified by separating using a comma character (`,`). + +| Pattern | Serial Numbers | +| --- | --- | +| `1, 2, 45, 99, 101` | `1, 2, 45, 99, 101` | + +##### Hyphen Separated Range + +Use a hyphen character (`-`) to specify a *range* of sequential values, inclusive of the two values separated by the hyphen. + +| Pattern | Serial Numbers | +| --- | --- | +| `10-15` | `10, 11, 12, 13, 14, 15` | + +##### Starting Value Range + +A *starting value* can be supplied, followed by the plus (`+`) character to indicate a number of sequential values following the provided starting value. The `+` character should be followed by an integer value to indicate the number of serial numbers which will be generated. + +| Pattern | Serial Numbers | +| --- | --- | +| `10+3` | `10, 11, 12, 13` | +| `100 + 2` | `100, 101, 102` | + +##### Next Value + +When specifying serial numbers, the tilde (`~`) character is replaced with the next available serial number. It can be used in combination with the available patterns specified above. + +For example, if the *next* available serial number is `100`, the following patterns can be used: + +| Pattern | Serial Numbers | +| --- | --- | +| `~` | `100` | +| `~, ~, ~` | `100, 101, 102` | +| `800, ~, 900` | `800, 100, 900` | +| `~+5` | `100, 101, 102, 103, 104, 105` | + +##### Combination Groups + +Any of the above patterns can be combined using multiple groups separated by the comma (`,`) character: + +| Pattern | Serial Numbers | +| --- | --- | +| `1, 2, 4-7, 10` | `1, 2, 4, 5, 6, 7, 10` | +| `40+4, 50+4` | `40, 41, 42, 43, 44, 50, 51, 52, 53, 54` | +| `10, 14, 20+3, 30-35` | `10, 14, 20, 21, 22, 23, 30, 31, 32, 33, 34, 35` | + +In the default implementation, InvenTree assumes that serial "numbers" are integer values in a simple incrementing sequence e.g. `{1, 2, 3, 4, 5, 6}`. When generating the *next* value for a serial number, the algorithm looks for the *most recent* serial number, and attempts to coerce that value into an integer, and then increment that value. + +While this approach is reasonably robust, it is definitely simplistic and is not expected to meet the requirements of every installation. For this reason, more complex serial number management is intended to be implemented using a custom plugin (see below). + +#### Serial Number Errors + +If a provided serial number (or group of numbers) is not considered valid, an error message is provided to the user. + +##### Example: Invalid Quantity + +{{ image("stock/serial_error_quantity.png", title="Serial number - invalid quantity") }} + +##### Example: Duplicate Serial Numbers + +{{ image("stock/serial_error_unique.png", title="Serial number - duplicate values") }} + +##### Example: Invalid Serial Numbers + +!!! tip "Serial Number Validation" + Custom serial number validation can be implemented using an external plugin + +#### Adjusting Serial Numbers + +Once a stock item has been created with a serial number, it is possible to adjust that serial number value if required. This can be achieved by navigating to the stock item's detail page, and selecting the "Edit" option from the actions menu. Here, the serial number value can be modified as required: + +{{ image("stock/serial_edit.png", title="Editing a serial number") }} + +Note that any serial number adjustments are subject to the same validation rules as when the stock item was created. If the new serial number value is not valid, an error message will be displayed to the user: + +{{ image("stock/serial_edit_error.png", title="Error while editing a serial number") }} + + +#### Plugin Support + +Custom serial number functionality, with any arbitrary requirements or level of complexity, can be implemented using the [Validation Plugin Mixin class](../plugins/mixins/validation.md#serial-numbers). Refer to the documentation for this plugin for technical details. + +A custom plugin allows the user to determine how a "valid" serial number is defined, and (crucially) how any given serial number value is incremented to provide the next value in the sequence. + +Implementing custom methods for these two considerations allows for complex serial number schema to be supported with minimal effort. diff --git a/docs/docs/stock/tracking.md b/docs/docs/stock/tracking.md index 5ce0809602..309c682ba7 100644 --- a/docs/docs/stock/tracking.md +++ b/docs/docs/stock/tracking.md @@ -4,149 +4,47 @@ title: Stock Tracking ## Stock Tracking -It may be desirable to track individual stock items, or groups of stock items, with unique identifier values. Stock items may be *tracked* using either *Batch Codes* or *Serial Numbers*. +Stock tracking entries record the history of stock item adjustments, including the user who performed the action, the date of the action, and the quantity change. This allows users to maintain a complete history of stock item movements and adjustments over time. -Individual stock items can be assigned a batch code, or a serial number, or both, or neither, as requirements dictate. +### Tracking Events -{{ image("stock/batch_and_serial.png", title="Batch and Serial Number Tracking") }} +Stock tracking entries are created automatically whenever a stock item is adjusted, either through manual adjustments or through automated processes such as order fulfillment or build completion. -Out of the box, the default implementations for both batch codes and serial numbers are (intentionally) simplistic. +Some examples of events that may trigger stock tracking entries include: -As the particular requirements for serial number or batch code conventions may vary significantly from one application to another, InvenTree provides the ability for custom plugins to determine exactly how batch codes and serial numbers are implemented. +- Manual stock adjustments (e.g. correcting inventory counts) +- Creation of new stock items (e.g. receiving new inventory) +- Allocation of stock items to orders (e.g. shipping items against sales orders) +- Consumption of stock items during build processes (e.g. using items to complete a build order) -### Batch Codes +## Viewing Stock Tracking History -Batch codes can be used to specify a particular "group" of items, and can be assigned to any stock item without restriction. Batch codes are tracked even as stock items are split into separate items. +There are multiple ways to view the stock tracking history for a particular stock item or part via the user interface. -Multiple stock items may share the same batch code without restriction, even across different parts. +### Stock Item Tracking History -#### Generating Batch Codes +The stock tracking history for a particular stock item can be viewed on the *Stock Item Detail* page, under the *Stock Tracking* tab: -Batch codes can be generated automatically based on a provided pattern. The default pattern simply uses the current date-code as the batch number, however this can be customized within a certain scope. +{{ image("stock/stock_item_tracking_history.png", title="Stock tracking tab") }} -{{ image("stock/batch_code_template.png", title="Batch code pattern") }} +This view displays all tracking entries associated with the particular stock item. -#### Context Variables +### Part Tracking History -The following context variables are available by default when generating a batch code using the builtin generation functionality: +Additionally, the stock tracking history for a particular part can be viewed on the *Part Detail* page, under the *Stock History* tab: -| Variable | Description | -| --- | --- | -| year | The current year e.g. `2024` | -| month | The current month number, e.g. `5` | -| day | The current day of month, e.g. `21` | -| hour | The current hour of day, in 24-hour format, e.g. `23` | -| minute | The current minute of hour, e.g. `17` | -| week | The current week of year, e.g. `51` | +{{ image("stock/part_tracking_history.png", title="Part stock tracking history") }} -#### Plugin Support +This view displays all tracking entries associated with any stock item linked to the particular part. -To implement custom batch code functionality, refer to the details on the [Validation Plugin Mixin](../plugins/mixins/validation.md#batch-codes). +!!! info "Deleted Stock Items" + Even if a stock item is deleted from the system, the associated stock tracking entries are retained for historical reference. They will be visible in the part tracking history, but not in the stock item tracking history (as the stock item itself has been deleted). -### Serial Numbers +## Stock Tracking Settings -A serial "number" is used to uniquely identify a single, unique stock item. Note that while *number* is used throughout the documentation, these values are not required to be numeric. +There are a number of configuration options available for controlling the behavior of stock tracking functionality in the [system settings view](../settings/global.md): -#### Uniqueness Requirements - -By default, serial numbers must be unique across any given [Part](../part/index.md) instance (including any variants of that part). - -However, it is also possible to specify that serial numbers must be globally unique across all types of parts. This is configurable in the settings display (see below): - -{{ image("stock/serial_numbers_unique.png", title="Serial number uniqueness") }} - -#### Generating Serial Numbers - -When creating a group of serialized stock items, it can be very useful for the user to be able to generate a group of unique serial numbers, with one serial number for each serialized stock item. - -{{ image("stock/serial_next.png", title="Serial number entry") }} - -For a given serial number *schema* (either the in-built schema or a custom schema defined by a plugin), a group (or *range*) of serial numbers can be generated using a number of possible patterns: - -##### Comma Separated Values - -Individual serial numbers can be specified by separating using a comma character (`,`). - -| Pattern | Serial Numbers | -| --- | --- | -| `1, 2, 45, 99, 101` | `1, 2, 45, 99, 101` | - -##### Hyphen Separated Range - -Use a hyphen character (`-`) to specify a *range* of sequential values, inclusive of the two values separated by the hyphen. - -| Pattern | Serial Numbers | -| --- | --- | -| `10-15` | `10, 11, 12, 13, 14, 15` | - -##### Starting Value Range - -A *starting value* can be supplied, followed by the plus (`+`) character to indicate a number of sequential values following the provided starting value. The `+` character should be followed by an integer value to indicate the number of serial numbers which will be generated. - -| Pattern | Serial Numbers | -| --- | --- | -| `10+3` | `10, 11, 12, 13` | -| `100 + 2` | `100, 101, 102` | - -##### Next Value - -When specifying serial numbers, the tilde (`~`) character is replaced with the next available serial number. It can be used in combination with the available patterns specified above. - -For example, if the *next* available serial number is `100`, the following patterns can be used: - -| Pattern | Serial Numbers | -| --- | --- | -| `~` | `100` | -| `~, ~, ~` | `100, 101, 102` | -| `800, ~, 900` | `800, 100, 900` | -| `~+5` | `100, 101, 102, 103, 104, 105` | - -##### Combination Groups - -Any of the above patterns can be combined using multiple groups separated by the comma (`,`) character: - -| Pattern | Serial Numbers | -| --- | --- | -| `1, 2, 4-7, 10` | `1, 2, 4, 5, 6, 7, 10` | -| `40+4, 50+4` | `40, 41, 42, 43, 44, 50, 51, 52, 53, 54` | -| `10, 14, 20+3, 30-35` | `10, 14, 20, 21, 22, 23, 30, 31, 32, 33, 34, 35` | - -In the default implementation, InvenTree assumes that serial "numbers" are integer values in a simple incrementing sequence e.g. `{1, 2, 3, 4, 5, 6}`. When generating the *next* value for a serial number, the algorithm looks for the *most recent* serial number, and attempts to coerce that value into an integer, and then increment that value. - -While this approach is reasonably robust, it is definitely simplistic and is not expected to meet the requirements of every installation. For this reason, more complex serial number management is intended to be implemented using a custom plugin (see below). - -#### Serial Number Errors - -If a provided serial number (or group of numbers) is not considered valid, an error message is provided to the user. - -##### Example: Invalid Quantity - -{{ image("stock/serial_error_quantity.png", title="Serial number - invalid quantity") }} - -##### Example: Duplicate Serial Numbers - -{{ image("stock/serial_error_unique.png", title="Serial number - duplicate values") }} - -##### Example: Invalid Serial Numbers - -!!! tip "Serial Number Validation" - Custom serial number validation can be implemented using an external plugin - -#### Adjusting Serial Numbers - -Once a stock item has been created with a serial number, it is possible to adjust that serial number value if required. This can be achieved by navigating to the stock item's detail page, and selecting the "Edit" option from the actions menu. Here, the serial number value can be modified as required: - -{{ image("stock/serial_edit.png", title="Editing a serial number") }} - -Note that any serial number adjustments are subject to the same validation rules as when the stock item was created. If the new serial number value is not valid, an error message will be displayed to the user: - -{{ image("stock/serial_edit_error.png", title="Error while editing a serial number") }} - - -#### Plugin Support - -Custom serial number functionality, with any arbitrary requirements or level of complexity, can be implemented using the [Validation Plugin Mixin class](../plugins/mixins/validation.md#serial-numbers). Refer to the documentation for this plugin for technical details. - -A custom plugin allows the user to determine how a "valid" serial number is defined, and (crucially) how any given serial number value is incremented to provide the next value in the sequence. - -Implementing custom methods for these two considerations allows for complex serial number schema to be supported with minimal effort. +| Name | Description | Default | Units | +| ---- | ----------- | ------- | ----- | +{{ globalsetting("STOCK_TRACKING_DELETE_OLD_ENTRIES") }} +{{ globalsetting("STOCK_TRACKING_DELETE_DAYS") }} diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index b43acc31df..a79df4ce30 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -138,6 +138,7 @@ nav: - Stock: - Stock Items: stock/index.md - Availability: stock/availability.md + - Traceability: stock/traceability.md - Stock Tracking: stock/tracking.md - Stock Status: stock/status.md - Adjusting Stock: stock/adjust.md diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py index dae49d459d..a844018e94 100644 --- a/src/backend/InvenTree/InvenTree/api_version.py +++ b/src/backend/InvenTree/InvenTree/api_version.py @@ -1,11 +1,15 @@ """InvenTree API version information.""" # InvenTree API version -INVENTREE_API_VERSION = 449 +INVENTREE_API_VERSION = 450 """Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" INVENTREE_API_TEXT = """ +v450 -> 2026-02-10 : https://github.com/inventree/InvenTree/pull/11260 + - Adds "part" field to the StockItemTracking model and API endpoints + - Additional filtering options for the StockItemTracking API endpoint + v449 -> 2026-02-07 : https://github.com/inventree/InvenTree/pull/11266 - Add missing nullable annotations to PartStocktakeSerializer diff --git a/src/backend/InvenTree/build/models.py b/src/backend/InvenTree/build/models.py index 03219f62a4..497aeeece6 100644 --- a/src/backend/InvenTree/build/models.py +++ b/src/backend/InvenTree/build/models.py @@ -1173,6 +1173,7 @@ class Build( user, notes=notes, deltas={ + 'quantity': float(quantity), 'location': location.pk, 'status': StockStatus.REJECTED.value, 'buildorder': self.pk, @@ -1267,7 +1268,11 @@ class Build( output.save(add_note=False) - deltas = {'status': status, 'buildorder': self.pk} + deltas = { + 'status': status, + 'buildorder': self.pk, + 'quantity': float(output.quantity), + } if location: deltas['location'] = location.pk diff --git a/src/backend/InvenTree/common/setting/system.py b/src/backend/InvenTree/common/setting/system.py index a216b5d1f5..3d02e9ccfd 100644 --- a/src/backend/InvenTree/common/setting/system.py +++ b/src/backend/InvenTree/common/setting/system.py @@ -1099,7 +1099,7 @@ SYSTEM_SETTINGS: dict[str, InvenTreeSettingsKeyType] = { 'validator': bool, }, 'STOCKTAKE_ENABLE': { - 'name': _('Enable Stock History'), + 'name': _('Enable Stocktake'), 'description': _( 'Enable functionality for recording historical stock levels and value' ), @@ -1109,30 +1109,47 @@ SYSTEM_SETTINGS: dict[str, InvenTreeSettingsKeyType] = { 'STOCKTAKE_EXCLUDE_EXTERNAL': { 'name': _('Exclude External Locations'), 'description': _( - 'Exclude stock items in external locations from stock history calculations' + 'Exclude stock items in external locations from stocktake calculations' ), 'validator': bool, 'default': False, }, 'STOCKTAKE_AUTO_DAYS': { 'name': _('Automatic Stocktake Period'), - 'description': _('Number of days between automatic stock history recording'), + 'description': _('Number of days between automatic stocktake recording'), 'validator': [int, MinValueValidator(1)], 'default': 7, 'units': _('days'), }, 'STOCKTAKE_DELETE_OLD_ENTRIES': { - 'name': _('Delete Old Stock History Entries'), + 'name': _('Delete Old Stocktake Entries'), 'description': _( - 'Delete stock history entries older than the specified number of days' + 'Delete stocktake entries older than the specified number of days' ), 'default': False, 'validator': bool, }, 'STOCKTAKE_DELETE_DAYS': { - 'name': _('Stock History Deletion Interval'), + 'name': _('Stocktake Deletion Interval'), 'description': _( - 'Stock history entries will be deleted after specified number of days' + 'Stocktake entries will be deleted after specified number of days' + ), + 'default': 365, + 'units': _('days'), + 'validator': [int, MinValueValidator(30)], + }, + 'STOCK_TRACKING_DELETE_OLD_ENTRIES': { + 'name': _('Delete Old Stock Tracking Entries'), + 'description': _( + 'Delete stock tracking entries older than the specified number of days' + ), + 'default': False, + 'validator': bool, + }, + 'STOCK_TRACKING_DELETE_DAYS': { + 'name': _('Stock Tracking Deletion Interval'), + 'description': _( + 'Stock tracking entries will be deleted after specified number of days' ), 'default': 365, 'units': _('days'), diff --git a/src/backend/InvenTree/order/models.py b/src/backend/InvenTree/order/models.py index 6a54c2b277..2d06ca09ef 100644 --- a/src/backend/InvenTree/order/models.py +++ b/src/backend/InvenTree/order/models.py @@ -2915,7 +2915,12 @@ class ReturnOrder(TotalPriceMixin, Order): if status is None: status = StockStatus.QUARANTINED.value - deltas = {'status': status, 'returnorder': self.pk, 'location': location.pk} + deltas = { + 'status': status, + 'returnorder': self.pk, + 'location': location.pk, + 'quantity': float(line.quantity), + } if stock_item.customer: deltas['customer'] = stock_item.customer.pk diff --git a/src/backend/InvenTree/order/test_api.py b/src/backend/InvenTree/order/test_api.py index 3166ca3134..9b3a4283de 100644 --- a/src/backend/InvenTree/order/test_api.py +++ b/src/backend/InvenTree/order/test_api.py @@ -1267,7 +1267,7 @@ class PurchaseOrderReceiveTest(OrderTest): ], 'location': location.pk, }, - max_query_count=104 + 2 * N_LINES, + max_query_count=104 + 3 * N_LINES, ).data # Check for expected response diff --git a/src/backend/InvenTree/part/models.py b/src/backend/InvenTree/part/models.py index e36b8e36db..2d040e539c 100644 --- a/src/backend/InvenTree/part/models.py +++ b/src/backend/InvenTree/part/models.py @@ -4128,7 +4128,7 @@ class BomItem(InvenTree.models.MetadataMixin, InvenTree.models.InvenTreeModel): # Normalize decimal values to ensure consistent representation # These values are only included if they are non-zero - # This is to provide some backwards compatibility from before these fields were addede + # This is to provide some backwards compatibility from before these fields were added if value is not None and field in [ 'quantity', 'attrition', diff --git a/src/backend/InvenTree/part/tasks.py b/src/backend/InvenTree/part/tasks.py index a7008f7576..87bc6a2f84 100644 --- a/src/backend/InvenTree/part/tasks.py +++ b/src/backend/InvenTree/part/tasks.py @@ -329,7 +329,7 @@ def scheduled_stocktake_reports(): threshold = datetime.now() - timedelta(days=delete_n_days) old_entries = PartStocktake.objects.filter(date__lt=threshold) - if old_entries.count() > 0: + if old_entries.exists(): logger.info('Deleting %s old stock entries', old_entries.count()) old_entries.delete() diff --git a/src/backend/InvenTree/stock/api.py b/src/backend/InvenTree/stock/api.py index baa1be9b38..88d25a9130 100644 --- a/src/backend/InvenTree/stock/api.py +++ b/src/backend/InvenTree/stock/api.py @@ -1490,6 +1490,54 @@ class StockTrackingOutputOptions(OutputConfiguration): ] +class StockTrackingFilter(FilterSet): + """API filter options for the StockTrackingList endpoint.""" + + class Meta: + """Metaclass options.""" + + model = StockItemTracking + fields = ['item', 'user'] + + include_variants = rest_filters.BooleanFilter( + label=_('Include Part Variants'), method='filter_include_variants' + ) + + def filter_include_variants(self, queryset, name, value): + """Filter by whether or not to include part variants. + + Note: + - This filter does nothing by itself, and is only used to modify the behavior of the 'part' filter. + - Refer to the 'filter_part' method for more information on how this works. + """ + return queryset + + part = rest_filters.ModelChoiceFilter( + label=_('Part'), queryset=Part.objects.all(), method='filter_part' + ) + + def filter_part(self, queryset, name, part): + """Filter StockTracking entries by the linked part. + + Note: + - This filter behavior also takes into account the 'include_variants' filter, which determines whether or not to include part variants in the results. + """ + include_variants = str2bool(self.data.get('include_variants', False)) + + if include_variants: + return queryset.filter(part__in=part.get_descendants(include_self=True)) + else: + return queryset.filter(part=part) + + min_date = InvenTreeDateFilter( + label=_('Date after'), field_name='date', lookup_expr='gt' + ) + + max_date = InvenTreeDateFilter( + label=_('Date before'), field_name='date', lookup_expr='lt' + ) + + class StockTrackingList( SerializerContextMixin, DataExportViewMixin, OutputOptionsMixin, ListAPI ): @@ -1501,8 +1549,9 @@ class StockTrackingList( - GET: Return list of StockItemTracking objects """ - queryset = StockItemTracking.objects.all() + queryset = StockItemTracking.objects.all().prefetch_related('item', 'part') serializer_class = StockSerializers.StockTrackingSerializer + filterset_class = StockTrackingFilter output_options = StockTrackingOutputOptions def get_delta_model_map(self) -> dict: @@ -1598,8 +1647,6 @@ class StockTrackingList( filter_backends = SEARCH_ORDER_FILTER - filterset_fields = ['item', 'user'] - ordering = '-date' ordering_fields = ['date'] diff --git a/src/backend/InvenTree/stock/migrations/0117_stockitemtracking_part_alter_stockitemtracking_item.py b/src/backend/InvenTree/stock/migrations/0117_stockitemtracking_part_alter_stockitemtracking_item.py new file mode 100644 index 0000000000..9091c57a30 --- /dev/null +++ b/src/backend/InvenTree/stock/migrations/0117_stockitemtracking_part_alter_stockitemtracking_item.py @@ -0,0 +1,36 @@ +# Generated by Django 5.2.10 on 2026-02-05 12:17 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("part", "0146_auto_20251203_1241"), + ("stock", "0116_alter_stockitem_link"), + ] + + operations = [ + migrations.AddField( + model_name="stockitemtracking", + name="part", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="stock_tracking_info", + to="part.part", + ), + ), + migrations.AlterField( + model_name="stockitemtracking", + name="item", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="tracking_info", + to="stock.stockitem", + ), + ), + ] diff --git a/src/backend/InvenTree/stock/migrations/0118_auto_20260205_1218.py b/src/backend/InvenTree/stock/migrations/0118_auto_20260205_1218.py new file mode 100644 index 0000000000..9e5c4bcee9 --- /dev/null +++ b/src/backend/InvenTree/stock/migrations/0118_auto_20260205_1218.py @@ -0,0 +1,57 @@ +# Generated by Django 5.2.10 on 2026-02-05 12:18 + +from django.db import migrations + + +def add_part_links(apps, schema_editor): + """Add links to the Part model for all existing StockItemTracking entries.""" + + StockItemTracking = apps.get_model('stock', 'StockItemTracking') + + history_entries = [] + + for tracking in StockItemTracking.objects.all(): + + item = tracking.item + + if item is None: + continue + + part = item.part + + if part is None: + continue + + tracking.part = part + history_entries.append(tracking) + + if len(history_entries) > 0: + StockItemTracking.objects.bulk_update(history_entries, ['part']) + print(f"\nUpdated {len(history_entries)} StockItemTracking entries with part links") + + +def remove_null_items(apps, schema_editor): + """Reverse migration - remove any StockItemTracking entries which have a null item link.""" + + StockItemTracking = apps.get_model('stock', 'StockItemTracking') + + null_items = StockItemTracking.objects.filter(item__isnull=True) + + count = null_items.count() + + if count > 0: + null_items.delete() + print(f"\nDeleted {count} StockItemTracking entries with null item links") + +class Migration(migrations.Migration): + + dependencies = [ + ("stock", "0117_stockitemtracking_part_alter_stockitemtracking_item"), + ] + + operations = [ + migrations.RunPython( + add_part_links, + reverse_code=remove_null_items, + ) + ] diff --git a/src/backend/InvenTree/stock/models.py b/src/backend/InvenTree/stock/models.py index 913bc1a11b..68c5b53416 100644 --- a/src/backend/InvenTree/stock/models.py +++ b/src/backend/InvenTree/stock/models.py @@ -1360,7 +1360,7 @@ class StockItem( item.save(add_note=False) code = StockHistoryCode.SENT_TO_CUSTOMER - deltas = {} + deltas = {'quantity': float(quantity)} if customer is not None: deltas['customer'] = customer.pk @@ -1441,7 +1441,11 @@ class StockItem( # Split the stock item item = self.splitStock(quantity, None, user) - tracking_info = {} + tracking_info = { + 'quantity': float(quantity) + if quantity is not None + else float(item.quantity) + } if location: tracking_info['location'] = location.pk @@ -1651,7 +1655,7 @@ class StockItem( stock_item.location = None stock_item.save(add_note=False) - deltas = {'stockitem': self.pk} + deltas = {'stockitem': self.pk, 'quantity': float(quantity)} if build is not None: deltas['buildorder'] = build.pk @@ -1666,7 +1670,7 @@ class StockItem( StockHistoryCode.INSTALLED_CHILD_ITEM, user, notes=notes, - deltas={'stockitem': stock_item.pk}, + deltas={'stockitem': stock_item.pk, 'quantity': float(quantity)}, ) trigger_event( @@ -1692,11 +1696,14 @@ class StockItem( self.belongs_to.add_tracking_entry( StockHistoryCode.REMOVED_CHILD_ITEM, user, - deltas={'stockitem': self.pk}, + deltas={'stockitem': self.pk, 'quantity': float(self.quantity)}, notes=notes, ) - tracking_info = {'stockitem': self.belongs_to.pk} + tracking_info = { + 'stockitem': self.belongs_to.pk, + 'quantity': float(self.quantity), + } self.add_tracking_entry( StockHistoryCode.REMOVED_FROM_ASSEMBLY, @@ -1835,6 +1842,7 @@ class StockItem( entry = StockItemTracking( item=self, + part=self.part, tracking_type=entry_type.value, user=user, date=InvenTree.helpers.current_time(), @@ -1964,7 +1972,7 @@ class StockItem( # Remove the equivalent number of items self.take_stock( - quantity, user, code=StockHistoryCode.STOCK_SERIZALIZED, notes=notes + quantity, user, code=StockHistoryCode.STOCK_SERIALIZED, notes=notes ) return items @@ -2175,7 +2183,10 @@ class StockItem( user, quantity=self.quantity, notes=notes, - deltas={'location': location.pk if location else None}, + deltas={ + 'location': location.pk if location else None, + 'quantity': self.quantity, + }, ) # Update the location of the item @@ -2416,7 +2427,7 @@ class StockItem( self.location = location - tracking_info = {} + tracking_info = {'quantity': float(quantity)} tracking_code = StockHistoryCode.STOCK_MOVE @@ -2869,21 +2880,18 @@ def after_save_stock_item(sender, instance: StockItem, created, **kwargs): class StockItemTracking(InvenTree.models.InvenTreeModel): """Stock tracking entry - used for tracking history of a particular StockItem. - Note: 2021-05-11 - The legacy StockTrackingItem model contained very little information about the "history" of the item. - In fact, only the "quantity" of the item was recorded at each interaction. - Also, the "title" was translated at time of generation, and thus was not really translatable. - The "new" system tracks all 'delta' changes to the model, - and tracks change "type" which can then later be translated - - Attributes: item: ForeignKey reference to a particular StockItem + part: ForeignKey reference to the Part associated with this StockItem date: Date that this tracking info was created tracking_type: The type of tracking information notes: Associated notes (input by user) user: The user associated with this tracking info deltas: The changes associated with this history item + + Notes: + If the underlying stock item is deleted, the "item" field will be set to null, but the tracking information will be retained. + The tracking data will be removed if the associated part is deleted, as the tracking information is not relevant without the part context. """ class Meta: @@ -2896,6 +2904,13 @@ class StockItemTracking(InvenTree.models.InvenTreeModel): """Return API url.""" return reverse('api-stock-tracking-list') + def save(self, *args, **kwargs): + """Ensure that the 'part' link is always correct.""" + if self.item: + self.part = self.item.part + + super().save(*args, **kwargs) + def get_absolute_url(self): """Return url for instance.""" return InvenTree.helpers.pui_url(f'/stock/item/{self.item.id}') @@ -2910,7 +2925,19 @@ class StockItemTracking(InvenTree.models.InvenTreeModel): tracking_type = models.IntegerField(default=StockHistoryCode.LEGACY) item = models.ForeignKey( - StockItem, on_delete=models.CASCADE, related_name='tracking_info' + StockItem, + on_delete=models.SET_NULL, + null=True, + blank=False, + related_name='tracking_info', + ) + + part = models.ForeignKey( + 'part.part', + on_delete=models.CASCADE, + related_name='stock_tracking_info', + null=True, + blank=True, ) date = models.DateTimeField(auto_now_add=True, editable=False) diff --git a/src/backend/InvenTree/stock/serializers.py b/src/backend/InvenTree/stock/serializers.py index a1025ed536..11ac344e1e 100644 --- a/src/backend/InvenTree/stock/serializers.py +++ b/src/backend/InvenTree/stock/serializers.py @@ -1248,6 +1248,8 @@ class StockTrackingSerializer( 'pk', 'item', 'item_detail', + 'part', + 'part_detail', 'date', 'deltas', 'label', @@ -1256,13 +1258,21 @@ class StockTrackingSerializer( 'user', 'user_detail', ] - read_only_fields = ['date', 'user', 'label', 'tracking_type'] + read_only_fields = ['date', 'part', 'user', 'label', 'tracking_type'] label = serializers.CharField(read_only=True) item_detail = enable_filter( StockItemSerializer(source='item', many=False, read_only=True, allow_null=True), - prefetch_fields=['item'], + prefetch_fields=['item', 'item__part'], + ) + + part_detail = enable_filter( + part_serializers.PartBriefSerializer( + source='part', many=False, read_only=True, allow_null=True + ), + default_include=False, + prefetch_fields=['part'], ) user_detail = enable_filter( diff --git a/src/backend/InvenTree/stock/status_codes.py b/src/backend/InvenTree/stock/status_codes.py index 978bca0b0e..50cad87a90 100644 --- a/src/backend/InvenTree/stock/status_codes.py +++ b/src/backend/InvenTree/stock/status_codes.py @@ -53,7 +53,7 @@ class StockHistoryCode(StatusCode): STOCK_COUNT = 10, _('Stock counted') STOCK_ADD = 11, _('Stock manually added') STOCK_REMOVE = 12, _('Stock manually removed') - STOCK_SERIZALIZED = 13, _('Serialized stock items') + STOCK_SERIALIZED = 13, _('Serialized stock items') RETURNED_TO_STOCK = 15, _('Returned to stock') # Stock item returned to stock diff --git a/src/backend/InvenTree/stock/tasks.py b/src/backend/InvenTree/stock/tasks.py index e3b4f5e4ab..d8b647152f 100644 --- a/src/backend/InvenTree/stock/tasks.py +++ b/src/backend/InvenTree/stock/tasks.py @@ -1,8 +1,13 @@ """Background tasks for the stock app.""" +from datetime import datetime, timedelta + import structlog from opentelemetry import trace +from common.settings import get_global_setting +from InvenTree.tasks import ScheduledTask, offload_task, scheduled_task + tracer = trace.get_tracer(__name__) logger = structlog.get_logger('inventree') @@ -43,7 +48,6 @@ def rebuild_stock_item_tree(tree_id: int, rebuild_on_fail: bool = True) -> bool: """ from InvenTree.exceptions import log_error from InvenTree.sentry import report_exception - from InvenTree.tasks import offload_task from stock.models import StockItem if tree_id: @@ -65,3 +69,27 @@ def rebuild_stock_item_tree(tree_id: int, rebuild_on_fail: bool = True) -> bool: # No tree_id provided, so rebuild the entire tree StockItem.objects.rebuild() return True + + +@tracer.start_as_current_span('delete_old_stock_tracking') +@scheduled_task(ScheduledTask.DAILY) +def delete_old_stock_tracking(): + """Remove old stock tracking entries before a certain date.""" + from stock.models import StockItemTracking + + if not get_global_setting('STOCK_TRACKING_DELETE_OLD_ENTRIES', False): + return + + delete_n_days = int(get_global_setting('STOCK_TRACKING_DELETE_DAYS', 365)) + + threshold = datetime.now() - timedelta(days=delete_n_days) + + old_entries = StockItemTracking.objects.filter(date__lte=threshold) + + if old_entries.exists(): + logger.info( + 'Deleting old stock tracking entries', + count=old_entries.count(), + threshold=threshold, + ) + old_entries.delete() diff --git a/src/frontend/src/components/settings/SettingList.tsx b/src/frontend/src/components/settings/SettingList.tsx index db5a3492bb..a0eb5ebd18 100644 --- a/src/frontend/src/components/settings/SettingList.tsx +++ b/src/frontend/src/components/settings/SettingList.tsx @@ -1,6 +1,6 @@ import { t } from '@lingui/core/macro'; import { Trans } from '@lingui/react/macro'; -import { Alert, Skeleton, Stack, Text } from '@mantine/core'; +import { Alert, Divider, Skeleton, Stack, Text, Title } from '@mantine/core'; import { notifications } from '@mantine/notifications'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useStore } from 'zustand'; @@ -24,11 +24,13 @@ import { SettingItem } from './SettingItem'; * Display a list of setting items, based on a list of provided keys */ export function SettingList({ + heading, settingsState, keys, onChange, onLoaded }: Readonly<{ + heading?: string; settingsState: SettingsStateProps; keys?: string[]; onChange?: () => void; @@ -162,6 +164,8 @@ export function SettingList({ <> {editSettingModal.modal} + {heading && {heading}} + {heading && } {(keys || allKeys)?.map((key, i) => { const setting = settingsState?.settings?.find( (s: any) => s.key === key @@ -198,16 +202,26 @@ export function SettingList({ ); } -export function UserSettingList({ keys }: Readonly<{ keys: string[] }>) { +export function UserSettingList({ + keys, + heading +}: Readonly<{ keys: string[]; heading?: string }>) { const userSettings = useUserSettingsState(); - return ; + return ( + + ); } -export function GlobalSettingList({ keys }: Readonly<{ keys: string[] }>) { +export function GlobalSettingList({ + keys, + heading +}: Readonly<{ keys: string[]; heading?: string }>) { const globalSettings = useGlobalSettingsState(); - return ; + return ( + + ); } export function PluginSettingList({ diff --git a/src/frontend/src/pages/Index/Settings/SystemSettings.tsx b/src/frontend/src/pages/Index/Settings/SystemSettings.tsx index 0e3ef515d7..e27fb6aa9e 100644 --- a/src/frontend/src/pages/Index/Settings/SystemSettings.tsx +++ b/src/frontend/src/pages/Index/Settings/SystemSettings.tsx @@ -1,5 +1,5 @@ import { t } from '@lingui/core/macro'; -import { Skeleton, Stack } from '@mantine/core'; +import { Divider, Skeleton, Stack } from '@mantine/core'; import { IconBellCog, IconCategory, @@ -254,15 +254,26 @@ export default function SystemSettings() { label: t`Stock History`, icon: , content: ( - + + + + + ) }, { diff --git a/src/frontend/src/pages/part/PartStockHistoryDetail.tsx b/src/frontend/src/pages/part/PartStockHistoryDetail.tsx index 6ddc9571ef..dfca4baa2b 100644 --- a/src/frontend/src/pages/part/PartStockHistoryDetail.tsx +++ b/src/frontend/src/pages/part/PartStockHistoryDetail.tsx @@ -7,6 +7,7 @@ import type { TableColumn } from '@lib/types/Tables'; import { t } from '@lingui/core/macro'; import { type ChartTooltipProps, LineChart } from '@mantine/charts'; import { + Accordion, Center, Divider, Loader, @@ -16,6 +17,7 @@ import { } from '@mantine/core'; import dayjs from 'dayjs'; import { useCallback, useMemo, useState } from 'react'; +import { StylishText } from '../../components/items/StylishText'; import { formatDate, formatPriceRange } from '../../defaults/formatters'; import { partStocktakeFields } from '../../forms/PartForms'; import { @@ -27,6 +29,7 @@ import { useTable } from '../../hooks/UseTable'; import { useUserState } from '../../states/UserState'; import { DateColumn, DecimalColumn } from '../../tables/ColumnRenderers'; import { InvenTreeTable } from '../../tables/InvenTreeTable'; +import { StockTrackingTable } from '../../tables/stock/StockTrackingTable'; /* * Render a tooltip for the chart, with correct date information @@ -64,9 +67,7 @@ function ChartTooltip({ label, payload }: Readonly) { ); } -export default function PartStockHistoryDetail({ - partId -}: Readonly<{ partId: number }>) { +export function PartStocktakePanel({ partId }: Readonly<{ partId: number }>) { const user = useUserState(); const table = useTable('part-stocktake'); @@ -208,7 +209,7 @@ export default function PartStockHistoryDetail({ {newStocktakeEntry.modal} {editStocktakeEntry.modal} {deleteStocktakeEntry.modal} - + ); } + +export default function PartStockHistoryDetail({ + partId +}: Readonly<{ partId: number }>) { + return ( + + + + {t`Stock Tracking`} + + + + + + + + {t`Stocktake Entries`} + + + + + + + ); +} diff --git a/src/frontend/src/tables/stock/StockTrackingTable.tsx b/src/frontend/src/tables/stock/StockTrackingTable.tsx index 52e909994e..0a6f4f1166 100644 --- a/src/frontend/src/tables/stock/StockTrackingTable.tsx +++ b/src/frontend/src/tables/stock/StockTrackingTable.tsx @@ -24,8 +24,13 @@ import { } from '../../components/render/Stock'; import { RenderUser } from '../../components/render/User'; import { useTable } from '../../hooks/UseTable'; -import { DateColumn, DescriptionColumn } from '../ColumnRenderers'; -import { UserFilter } from '../Filter'; +import { DateColumn, DescriptionColumn, PartColumn } from '../ColumnRenderers'; +import { + IncludeVariantsFilter, + MaxDateFilter, + MinDateFilter, + UserFilter +} from '../Filter'; import { InvenTreeTable } from '../InvenTreeTable'; type StockTrackingEntry = { @@ -34,9 +39,15 @@ type StockTrackingEntry = { details: ReactNode; }; -export function StockTrackingTable({ itemId }: Readonly<{ itemId: number }>) { +export function StockTrackingTable({ + itemId, + partId +}: Readonly<{ + itemId?: number; + partId?: number; +}>) { const navigate = useNavigate(); - const table = useTable('stock_tracking'); + const table = useTable(partId ? 'part_stock_tracking' : 'stock_tracking'); // Render "details" for a stock tracking record const renderDetails = useCallback( @@ -200,6 +211,9 @@ export function StockTrackingTable({ itemId }: Readonly<{ itemId: number }>) { const filters: TableFilter[] = useMemo(() => { return [ + MinDateFilter(), + MaxDateFilter(), + IncludeVariantsFilter(), UserFilter({ name: 'user', label: t`User`, @@ -213,6 +227,43 @@ export function StockTrackingTable({ itemId }: Readonly<{ itemId: number }>) { DateColumn({ switchable: false }), + PartColumn({ + title: t`Part`, + part: 'part_detail', + switchable: true, + hidden: !partId + }), + { + title: t`IPN`, + accessor: 'part_detail.IPN', + sortable: true, + defaultVisible: false, + switchable: true, + hidden: !partId + }, + { + accessor: 'item', + title: t`Stock Item`, + sortable: false, + switchable: false, + hidden: !partId, + render: (record: any) => { + const item = record.item_detail; + if (!item) { + return ( + {t`Stock item no longer exists`} + ); + } else if (item.serial && item.quantity == 1) { + return `${t`Serial`} #${item.serial}`; + } else { + return `${t`Item ID`} ${item.pk}`; + } + } + }, DescriptionColumn({ accessor: 'label' }), @@ -250,10 +301,15 @@ export function StockTrackingTable({ itemId }: Readonly<{ itemId: number }>) { props={{ params: { item: itemId, + part: partId, + part_detail: partId ? true : undefined, + item_detail: partId ? true : undefined, user_detail: true }, enableDownload: true, - tableFilters: filters + tableFilters: filters, + modelType: partId ? ModelType.stockitem : undefined, + modelField: 'item' }} /> ); diff --git a/src/frontend/tests/pages/pui_stock.spec.ts b/src/frontend/tests/pages/pui_stock.spec.ts index 57e485a76a..ec330474e3 100644 --- a/src/frontend/tests/pages/pui_stock.spec.ts +++ b/src/frontend/tests/pages/pui_stock.spec.ts @@ -423,6 +423,55 @@ test('Stock - Tracking', async ({ browser }) => { await page.getByText('- - Factory/Office Block/Room').first().waitFor(); await page.getByRole('link', { name: 'Widget Assembly' }).waitFor(); await page.getByRole('cell', { name: 'Installed into assembly' }).waitFor(); + + /* Add some more stock items and tracking information: + * - Duplicate this stock item + * - Give it a unique serial number + * - Ensure the tracking information is duplicated correctly + * - Delete the new stock item + * - Ensure that the tracking information is retained against the base part + */ + + // Duplicate the stock item + await page + .getByRole('button', { name: 'action-menu-stock-item-actions' }) + .click(); + await page + .getByRole('menuitem', { name: 'action-menu-stock-item-actions-duplicate' }) + .click(); + await page + .getByRole('textbox', { name: 'text-field-serial_numbers' }) + .fill('9876'); + await page.getByRole('button', { name: 'Submit' }).click(); + + // Check stock tracking information is correct + await page.getByText('Serial Number: 9876').first().waitFor(); + await loadTab(page, 'Stock Tracking'); + await page + .getByRole('cell', { name: 'Stock item created' }) + .first() + .waitFor(); + + // Delete this stock item + await page + .getByRole('button', { name: 'action-menu-stock-item-actions' }) + .click(); + await page + .getByRole('menuitem', { name: 'action-menu-stock-item-actions-delete' }) + .click(); + await page.getByRole('button', { name: 'Delete' }).click(); + + // Check stock tracking for base part + await loadTab(page, 'Stock History'); + await page.getByRole('button', { name: 'Stock Tracking' }).click(); + + await page.getByText('Stock item no longer exists').first().waitFor(); + await page + .getByRole('cell', { name: 'Thumbnail Blue Widget' }) + .first() + .waitFor(); + await page.getByRole('cell', { name: 'Item ID 232' }).first().waitFor(); + await page.getByRole('cell', { name: 'Serial #116' }).first().waitFor(); }); test('Stock - Location', async ({ browser }) => {