Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
b364a17
initial skel commit for transfer orders
jacobfelknor Dec 11, 2025
f182557
initial transfer order backend model
jacobfelknor Jan 7, 2026
531b976
add some serializers, rename PLACED to ISSUED for TransferOrders
jacobfelknor Jan 7, 2026
e294057
adding from admin console works
jacobfelknor Jan 8, 2026
89e4d12
simple table list almost working, but we need to add order line items…
jacobfelknor Jan 8, 2026
059c468
add other cols to table
jacobfelknor Jan 8, 2026
6276d1a
add Transfer Order from table view
jacobfelknor Jan 8, 2026
fc30da4
moving towards a detail view
jacobfelknor Jan 8, 2026
0d4ad95
wip: adding detail view
jacobfelknor Jan 8, 2026
749965c
add take from and destination serializer details
jacobfelknor Jan 9, 2026
5c9e1c5
add other detail grid items
jacobfelknor Jan 9, 2026
3bcaf77
edit/duplicate transfer order
jacobfelknor Jan 9, 2026
324f98f
more action buttons
jacobfelknor Jan 9, 2026
aff715d
first crack at adding line items
jacobfelknor Jan 9, 2026
94a413d
add to line item
jacobfelknor Jan 9, 2026
2fedab5
add filters
jacobfelknor Jan 9, 2026
3008cb7
starting work on row actions
jacobfelknor Jan 12, 2026
93e9a53
more action buttons for line items
jacobfelknor Jan 12, 2026
b176f3e
fix copy lines in duplicate
jacobfelknor Jan 13, 2026
f18da51
basic allocation works
jacobfelknor Jan 14, 2026
aad662a
allocations table actions
jacobfelknor Jan 14, 2026
845b45d
allocate serials
jacobfelknor Jan 25, 2026
f312ace
allocated serial row expansion
jacobfelknor Jan 25, 2026
d86399e
add transferred qty to serializers
jacobfelknor Jan 25, 2026
895ca93
move items on complete, show in tracking
jacobfelknor Jan 25, 2026
073a56d
change panel to transferred stock upon complete
jacobfelknor Jan 30, 2026
766c2bc
allow incomplete line items
jacobfelknor Jan 30, 2026
1a5be3f
disable edit allocations when completed
jacobfelknor Feb 2, 2026
7513f29
add ref pattern and to settings
jacobfelknor Feb 2, 2026
85b76a7
add admin to line item inline
jacobfelknor Feb 2, 2026
8229b7b
add calendar and parametric view
jacobfelknor Feb 2, 2026
dea0587
basic transfer order report
jacobfelknor Feb 6, 2026
7863bac
add transfer order ruleset
jacobfelknor Feb 6, 2026
b10d08b
starting allocation buisness logic throughout for TOs
jacobfelknor Feb 6, 2026
906d30f
disable accept incomplete logic, which was incorrect, until I fix
jacobfelknor Feb 6, 2026
dd3e2c4
fix incomplete allocation option
jacobfelknor Feb 10, 2026
46e42b0
add transferred col to default report
jacobfelknor Feb 10, 2026
ad31946
add transfer order to calendar ics view
jacobfelknor Feb 27, 2026
bb33808
chain condition for readability
jacobfelknor Feb 27, 2026
7f4d3a4
add transfer order allocations table to stockitem view
jacobfelknor Feb 27, 2026
ec99906
don't account TO allocations in availability
jacobfelknor Feb 27, 2026
9875c83
add transfer orders table for a part
jacobfelknor Feb 27, 2026
dd3d325
'consume' option by doing take_stock
jacobfelknor Feb 27, 2026
15d4674
squash migrations
jacobfelknor Feb 27, 2026
93c2ff0
starting to test transfer order
jacobfelknor Mar 3, 2026
ee4fa47
more transfer order tests
jacobfelknor Mar 4, 2026
c221629
add transfer order consume test
jacobfelknor Mar 4, 2026
528a0f0
wip, more tests
jacobfelknor Mar 5, 2026
9e88375
more transfer order tests
jacobfelknor Mar 6, 2026
fef17ee
had to refresh_from_db
jacobfelknor Mar 6, 2026
10f4c91
switch "to" to "transfer-order" in url paths
jacobfelknor Mar 10, 2026
c041246
only select non-virtual parts from transfer order
jacobfelknor Mar 10, 2026
e520bf2
add transfer order docs
jacobfelknor Mar 10, 2026
c0791de
Merge branch 'master' into transfer_order
jacobfelknor Mar 10, 2026
aa16310
deconflict migrations
jacobfelknor Mar 10, 2026
3b68ecf
fix frontend build error
jacobfelknor Mar 10, 2026
eb2cb8e
fix validation on transfer order reference pattern
jacobfelknor Mar 11, 2026
62e5d98
add oath2 scope for transfer order
jacobfelknor Mar 11, 2026
8b86fb5
fix state test to include transfer order state
jacobfelknor Mar 11, 2026
7ae49a7
Merge branch 'master' into transfer_order
jacobfelknor Mar 11, 2026
d628e8e
Merge branch 'master' into transfer_order
SchrodingersGat Mar 12, 2026
d025642
Merge branch 'master' into transfer_order
jacobfelknor Mar 14, 2026
ec0f3fa
Merge branch 'master' into transfer_order
jacobfelknor Mar 17, 2026
e3b303f
Merge branch 'master' into transfer_order
jacobfelknor Mar 24, 2026
b1df19b
add barcode_model_type_code for transfer order
jacobfelknor Mar 24, 2026
41be1a8
bump api version
jacobfelknor Mar 25, 2026
472bced
Merge branch 'master' into transfer_order
matmair Mar 27, 2026
e687501
check view role for transfer order, remove debug/commented out lines
jacobfelknor Mar 30, 2026
98eeaca
add serialized allocation test
jacobfelknor Mar 30, 2026
76777fb
Merge branch 'master' into transfer_order
jacobfelknor Apr 9, 2026
dace0eb
Merge branch 'transfer_order' of github.com:jacobfelknor/InvenTree in…
SchrodingersGat Apr 18, 2026
729313d
Merge branch 'master' into transfer_order
SchrodingersGat Apr 18, 2026
bb98c68
Fix migrations
SchrodingersGat Apr 18, 2026
d144ce3
Frontend fixes
SchrodingersGat Apr 18, 2026
ec16638
Implement required 'company' attribute
SchrodingersGat Apr 18, 2026
e0c4d25
transfer order report context
jacobfelknor Apr 20, 2026
6076102
Merge branch 'master' into transfer_order
SchrodingersGat Apr 21, 2026
cf152fb
attempt to fix tests
jacobfelknor Apr 23, 2026
6974e43
delete transfer order allocations on cancel
jacobfelknor Apr 23, 2026
1cae12b
add a few playwright tests, more incoming
jacobfelknor Apr 24, 2026
49b403e
more playwright
jacobfelknor Apr 24, 2026
12583d0
add source and destination locations to table
jacobfelknor Apr 24, 2026
5f726ac
Merge branch 'master' into transfer_order
SchrodingersGat Apr 24, 2026
45a31f8
Merge branch 'master' into transfer_order
SchrodingersGat Apr 25, 2026
2f4645e
Merge branch 'master' into transfer_order
jacobfelknor May 5, 2026
408d300
Merge branch 'master' into transfer_order
jacobfelknor May 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/docs/api/schema.md
Original file line number Diff line number Diff line change
Expand Up @@ -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: `449`
This documentation is for API version: `459`

!!! 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/).
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions docs/docs/concepts/custom_states.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@ Custom states can be defined for the following models:
- [Purchase Order](../purchasing/purchase_order.md)
- [Sales Order](../sales/sales_order.md)
- [Return Order](../sales/return_order.md)
- [Transfer Order](../stock/transfer_order.md)
4 changes: 4 additions & 0 deletions docs/docs/settings/global.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,10 @@ Refer to the [sales order settings](../sales/sales_order.md#sales-order-settings

Refer to the [return order settings](../sales/return_order.md#return-order-settings).

### Transfer Orders

Refer to the [transfer order settings](../stock/transfer_order.md#transfer-order-settings).

### Plugin Settings

| Name | Description | Default | Units |
Expand Down
150 changes: 150 additions & 0 deletions docs/docs/stock/transfer_order.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@

---
title: Transfer Orders
---

## Transfer Orders

Transfer orders provide a method for requesting stock to be moved from one location to another. It does not replace the existing on-demand stock transaction options, but lets you "document" many transactions from a single view.

### View Transfer Orders

To navigate to the Transfer Order display, select *Stock* from the main navigation menu, and *Transfer Orders* from the sidebar:

{{ image("stock/transfer_order_display.png", "Transfer Order display") }}

The following view modes are available:

#### Table View

*Table View* provides a list of Transfer Orders, which can be filtered to display a subset of orders according to user supplied parameters.

{{ image("stock/transfer_order_list.png", "Transfer Order list") }}

#### Calendar View

*Calendar View* shows a calendar display with outstanding transfer orders.

{{ image("stock/transfer_order_calendar.png", "Transfer Order calendar") }}

### Transfer Order Status Codes

Each Transfer Order has a specific status code, which represents the state of the order:

| Status | Description |
| --- | --- |
| Pending | The transfer order has been created, but has not been finalized or submitted |
| Issued | The transfer order has been issued, and is in progress |
| On Hold | The transfer order has been placed on hold, but is still active |
| Complete | The transfer order is fully completed, and is now closed |
| Cancelled | The transfer order was cancelled, and is now closed |

**Source Code**

Refer to the source code for the Transfer Order status codes:

::: order.status_codes.TransferOrderStatus
options:
show_bases: False
show_root_heading: False
show_root_toc_entry: False
show_source: True
members: []

Transfer Order Status supports [custom states](../concepts/custom_states.md).

### Transfer Order Parameters

The following parameters are available for each Transfer Order, and can be edited by the user:

| Parameter | Description |
| --- | --- |
| Reference | Transfer Order reference e.g. '001' |
| Description | Description of the Transfer Order |
| Project Code | Project Code of the Transfer Order |
| Source Location | Stock location to source stock items from (blank = all locations) |
| Destination Location | Stock location where the stock will be transferred |
| Consume Stock | Rather than transfer the stock to the destination, "consume" it by removing the specified quantity from the allocated stock item
| Start Date | The scheduled start date for the transfer |
| Target Date | Target date for transfer completion |
| External Link | Link to external webpage |
| Responsible | User (or group of users) who is responsible for the transfer |
| Notes | Transfer notes, supports markdown |

## Create a Transfer Order

Once the transfer order page is loaded, click on <span class="badge inventree add">{{ icon("plus-circle") }} New Transfer Order</span> which opens the "Create Transfer Order" form.

Fill out the rest of the form with the transfer order information then click on <span class="badge inventree confirm">Submit</span> to create the order.

### Transfer Order Reference

Each Transfer Order is uniquely identified by its *Reference* field. Read more about [reference fields](../settings/reference.md).

### Add Line Items

On the transfer order detail page, user can link parts to the transfer order selecting the <span class="badge inventree nav side">{{ icon("list") }}</span> Line Items</span> tab then clicking on the <span class="badge inventree add">{{ icon("plus-circle") }} Add Line Item</span> button.

Once the "Add Line Item" form opens, select a part in the list.

!!! warning
Only parts that have the "Virtual" attribute disabled will be shown and can be selected.

Fill out the rest of the form then click on <span class="badge inventree confirm">Submit</span>

### Allocate Stock Items

After line items were created, user can either:

* Allocate stock items for that part to the transfer order (click on {{ icon("arrow-right") }} button)
* Create a build order for that part to cover the quantity of the transfer order (click on {{ icon("tools") }} button)

### Complete Order

Once all items in the transfer order have been allocated, click on <span class="badge inventree add">{{ icon("circle-check", color="green") }} Complete Order</span> to mark the transfer order as complete. Confirm then click on <span class="badge inventree confirm">Submit</span> to complete the order.

### Transferred Stock

After completing the transfer order, a <span class="badge inventree nav side">{{ icon("list") }}</span> Transferred Stock</span> tab will appear showing which stock was affected.

!!! warning
Similar to received stock on purchase orders, this tab will only be accurate while the affected stock items still exist. Furthermore, if the stock item is depleted while using the "consume" parameter, it will not appear here unless "delete on deplete" is turned off for this stock item

### Cancel Order

To cancel the order, click on the {{ icon("tools") }} menu button next to the <span class="badge inventree add">{{ icon("circle-check", color="green") }} Complete Order</span> button, then click on the "{{ icon("tools") }} Cancel Order" menu option. Confirm then click on the <span class="badge inventree confirm">Submit</span> to cancel the order.

## Order Scheduling

Transfer orders can be scheduled for a future date, to allow for order scheduling.

### Start Date

The *Start Date* of the transfer order is the date on which the order is scheduled to be issued, allowing work to begin on the order.

### Target Date

The *Target Date* of the transfer order is the date on which the order is scheduled to be completed.

### Overdue Orders

If the *Target Date* of the transfer order has passed, the order will be marked as *overdue*.

## Calendar view

Using the button to the top right of the list of Transfer Orders, the view can be switched to a calendar view using the button {{ icon("calendar") }}. This view shows orders with a defined target date only.

This view can be accessed externally as an ICS calendar using a URL like the following:
`http://inventree.example.org/api/order/calendar/transfer-order/calendar.ics`

By default, completed orders are not exported. These can be included by appending `?include_completed=True` to the URL.

## Transfer Order Settings

The following [global settings](../settings/global.md) are available for transfer orders:

| Name | Description | Default | Units |
| ---- | ----------- | ------- | ----- |
{{ globalsetting("TRANSFERORDER_ENABLED") }}
{{ globalsetting("TRANSFERORDER_REFERENCE_PATTERN") }}
{{ globalsetting("TRANSFERORDER_REQUIRE_RESPONSIBLE") }}
1 change: 1 addition & 0 deletions docs/mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ nav:
- Stock Expiry: stock/expiry.md
- Stock Ownership: stock/owner.md
- Test Results: stock/test.md
- Transfer Orders: stock/transfer_order.md
- Manufacturing:
- Manufacturing: manufacturing/index.md
- Bill of Materials: manufacturing/bom.md
Expand Down
5 changes: 4 additions & 1 deletion src/backend/InvenTree/InvenTree/api_version.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
"""InvenTree API version information."""

# InvenTree API version
INVENTREE_API_VERSION = 483
INVENTREE_API_VERSION = 484
"""Increment this API version number whenever there is a significant change to the API that any clients need to know about."""

INVENTREE_API_TEXT = """

v484 -> 2026-03-25 : https://github.com/inventree/InvenTree/pull/11281
- Add Transfer Order model and associated API endpoint

v483 -> 2026-05-04 : https://github.com/inventree/InvenTree/pull/11861
- Enable bulk-update operations on the BomItem API endpoint, allowing multiple BOM items to be updated in a single API call

Expand Down
20 changes: 20 additions & 0 deletions src/backend/InvenTree/common/setting/system.py
Original file line number Diff line number Diff line change
Expand Up @@ -910,6 +910,26 @@ class SystemSetId:
'default': False,
'validator': bool,
},
'TRANSFERORDER_ENABLED': {
'name': _('Enable Transfer Orders'),
'description': _('Enable transfer order functionality in the user interface'),
'validator': bool,
'default': False,
},
'TRANSFERORDER_REFERENCE_PATTERN': {
'name': _('Transfer Order Reference Pattern'),
'description': _(
'Required pattern for generating Transfer Order reference field'
),
'default': 'TO-{ref:04d}',
'validator': order.validators.validate_transfer_order_reference_pattern,
},
'TRANSFERORDER_REQUIRE_RESPONSIBLE': {
'name': _('Require Responsible Owner'),
'description': _('A responsible owner must be assigned to each order'),
'default': False,
'validator': bool,
},
'PURCHASEORDER_REFERENCE_PATTERN': {
'name': _('Purchase Order Reference Pattern'),
'description': _(
Expand Down
6 changes: 3 additions & 3 deletions src/backend/InvenTree/generic/states/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,8 +232,8 @@ def test_all_states(self):
"""Test the API endpoint for listing all status models."""
response = self.get(reverse('api-status-all'))

# 10 built-in state classes, plus the added GeneralState class
self.assertEqual(len(response.data), 11)
# 11 built-in state classes, plus the added GeneralState class
self.assertEqual(len(response.data), 12)

# Test the BuildStatus model
build_status = response.data['BuildStatus']
Expand Down Expand Up @@ -273,7 +273,7 @@ def test_all_states(self):
)
response = self.get(reverse('api-status-all'))

self.assertEqual(len(response.data), 11)
self.assertEqual(len(response.data), 12)

stock_status_cstm = response.data['StockStatus']
self.assertEqual(stock_status_cstm['status_class'], 'StockStatus')
Expand Down
38 changes: 38 additions & 0 deletions src/backend/InvenTree/order/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,3 +170,41 @@ class ReturnOrderLineItemAdmin(admin.ModelAdmin):
@admin.register(models.ReturnOrderExtraLine)
class ReturnOrdeerExtraLineAdmin(GeneralExtraLineAdmin, admin.ModelAdmin):
"""Admin class for the ReturnOrderExtraLine model."""


class TransferOrderLineItemInlineAdmin(admin.StackedInline):
"""Inline admin class for the TransferOrderLineItem model."""

autocomplete_fields = ['part']

model = models.TransferOrderLineItem
extra = 0


@admin.register(models.TransferOrder)
class TransferOrderAdmin(admin.ModelAdmin):
"""Admin class for the TransferOrder model."""

exclude = ['reference_int', 'address', 'contact']

list_display = (
'reference',
'status',
'description',
'take_from',
'destination',
'consume',
'creation_date',
)

search_fields = ['reference', 'description']

inlines = [TransferOrderLineItemInlineAdmin]

autocomplete_fields = [
'created_by',
'take_from',
'destination',
'project_code',
'responsible',
]
Loading
Loading