Coverage for src/backend/InvenTree/order/migrations/0118_transferorder.py: 100%
15 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 17:47 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 17:47 +0000
1# Generated by Django 5.2.11 on 2026-02-27 22:00
3import InvenTree.fields
4import InvenTree.models
5import django.core.validators
6import django.db.models.deletion
7import generic.states.fields
8import generic.states.states
9import generic.states.transition
10import generic.states.validators
11import order.status_codes
12import order.validators
13from django.conf import settings
14from django.db import migrations, models
17class Migration(migrations.Migration):
19 dependencies = [
20 ("common", "0041_auto_20251203_1244"),
21 ("company", "0077_delete_manufacturerpartparameter"),
22 ("order", "0117_purchaseorderextraline_line_int_and_more"),
23 ("part", "0146_auto_20251203_1241"),
24 ("stock", "0116_alter_stockitem_link"),
25 ("users", "0005_owner_model"),
26 migrations.swappable_dependency(settings.AUTH_USER_MODEL),
27 ]
29 operations = [
30 migrations.CreateModel(
31 name="TransferOrder",
32 fields=[
33 (
34 "id",
35 models.AutoField(
36 auto_created=True,
37 primary_key=True,
38 serialize=False,
39 verbose_name="ID",
40 ),
41 ),
42 (
43 "metadata",
44 models.JSONField(
45 blank=True,
46 help_text="JSON metadata field, for use by external plugins",
47 null=True,
48 verbose_name="Plugin Metadata",
49 ),
50 ),
51 ("reference_int", models.BigIntegerField(default=0)),
52 (
53 "notes",
54 InvenTree.fields.InvenTreeNotesField(
55 blank=True,
56 help_text="Markdown notes (optional)",
57 max_length=50000,
58 null=True,
59 verbose_name="Notes",
60 ),
61 ),
62 (
63 "barcode_data",
64 models.CharField(
65 blank=True,
66 help_text="Third party barcode data",
67 max_length=500,
68 verbose_name="Barcode Data",
69 ),
70 ),
71 (
72 "barcode_hash",
73 models.CharField(
74 blank=True,
75 help_text="Unique hash of barcode data",
76 max_length=128,
77 verbose_name="Barcode Hash",
78 ),
79 ),
80 (
81 "description",
82 models.CharField(
83 blank=True,
84 help_text="Order description (optional)",
85 max_length=250,
86 verbose_name="Description",
87 ),
88 ),
89 (
90 "link",
91 InvenTree.fields.InvenTreeURLField(
92 blank=True,
93 help_text="Link to external page",
94 max_length=2000,
95 verbose_name="Link",
96 ),
97 ),
98 (
99 "start_date",
100 models.DateField(
101 blank=True,
102 help_text="Scheduled start date for this order",
103 null=True,
104 verbose_name="Start date",
105 ),
106 ),
107 (
108 "target_date",
109 models.DateField(
110 blank=True,
111 help_text="Expected date for order delivery. Order will be overdue after this date.",
112 null=True,
113 verbose_name="Target Date",
114 ),
115 ),
116 (
117 "creation_date",
118 models.DateField(
119 blank=True, null=True, verbose_name="Creation Date"
120 ),
121 ),
122 (
123 "issue_date",
124 models.DateField(
125 blank=True,
126 help_text="Date order was issued",
127 null=True,
128 verbose_name="Issue Date",
129 ),
130 ),
131 (
132 "reference",
133 models.CharField(
134 default=order.validators.generate_next_transfer_order_reference,
135 help_text="Transfer Order Reference",
136 max_length=64,
137 unique=True,
138 validators=[order.validators.validate_transfer_order_reference],
139 verbose_name="Reference",
140 ),
141 ),
142 (
143 "consume",
144 models.BooleanField(
145 default=False,
146 help_text='Rather than transfer the stock to the destination, "consume" it, by removing transferred quantity from the allocated stock item',
147 verbose_name="Consume Stock",
148 ),
149 ),
150 (
151 "complete_date",
152 models.DateField(
153 blank=True,
154 help_text="Date order was completed",
155 null=True,
156 verbose_name="Completion Date",
157 ),
158 ),
159 (
160 "status_custom_key",
161 generic.states.fields.ExtraInvenTreeCustomStatusModelField(
162 blank=True,
163 default=None,
164 help_text="Additional status information for this item",
165 null=True,
166 validators=[
167 generic.states.validators.CustomStatusCodeValidator(
168 status_class=order.status_codes.TransferOrderStatus
169 )
170 ],
171 verbose_name="Custom status key",
172 ),
173 ),
174 (
175 "status",
176 generic.states.fields.InvenTreeCustomStatusModelField(
177 choices=[
178 (10, "Pending"),
179 (20, "Issued"),
180 (25, "On Hold"),
181 (30, "Complete"),
182 (40, "Cancelled"),
183 ],
184 default=10,
185 help_text="Transfer order status",
186 validators=[
187 generic.states.validators.CustomStatusCodeValidator(
188 status_class=order.status_codes.TransferOrderStatus
189 )
190 ],
191 verbose_name="Status",
192 ),
193 ),
194 (
195 "address",
196 models.ForeignKey(
197 blank=True,
198 help_text="Company address for this order",
199 null=True,
200 on_delete=django.db.models.deletion.SET_NULL,
201 related_name="+",
202 to="company.address",
203 verbose_name="Address",
204 ),
205 ),
206 (
207 "contact",
208 models.ForeignKey(
209 blank=True,
210 help_text="Point of contact for this order",
211 null=True,
212 on_delete=django.db.models.deletion.SET_NULL,
213 related_name="+",
214 to="company.contact",
215 verbose_name="Contact",
216 ),
217 ),
218 (
219 "created_by",
220 models.ForeignKey(
221 blank=True,
222 null=True,
223 on_delete=django.db.models.deletion.SET_NULL,
224 related_name="+",
225 to=settings.AUTH_USER_MODEL,
226 verbose_name="Created By",
227 ),
228 ),
229 (
230 "destination",
231 models.ForeignKey(
232 blank=True,
233 help_text="Destination for transferred items",
234 null=True,
235 on_delete=django.db.models.deletion.SET_NULL,
236 related_name="incoming_transfers",
237 to="stock.stocklocation",
238 verbose_name="Destination Location",
239 ),
240 ),
241 (
242 "project_code",
243 models.ForeignKey(
244 blank=True,
245 help_text="Select project code for this order",
246 null=True,
247 on_delete=django.db.models.deletion.SET_NULL,
248 to="common.projectcode",
249 verbose_name="Project Code",
250 ),
251 ),
252 (
253 "responsible",
254 models.ForeignKey(
255 blank=True,
256 help_text="User or group responsible for this order",
257 null=True,
258 on_delete=django.db.models.deletion.SET_NULL,
259 related_name="+",
260 to="users.owner",
261 verbose_name="Responsible",
262 ),
263 ),
264 (
265 "take_from",
266 models.ForeignKey(
267 blank=True,
268 help_text="Source for transferred items",
269 null=True,
270 on_delete=django.db.models.deletion.SET_NULL,
271 related_name="sourcing_transfers",
272 to="stock.stocklocation",
273 verbose_name="Source Location",
274 ),
275 ),
276 (
277 "updated_at",
278 models.DateTimeField(
279 blank=True,
280 help_text="Timestamp of last update",
281 null=True,
282 verbose_name="Updated At",
283 ),
284 )
285 ],
286 options={
287 "verbose_name": "Transfer Order",
288 },
289 bases=(
290 generic.states.states.StatusCodeMixin,
291 generic.states.transition.StateTransitionMixin,
292 InvenTree.models.InvenTreeAttachmentMixin,
293 InvenTree.models.InvenTreePermissionCheckMixin,
294 InvenTree.models.ContentTypeMixin,
295 InvenTree.models.PluginValidationMixin,
296 models.Model,
297 ),
298 ),
299 migrations.CreateModel(
300 name="TransferOrderLineItem",
301 fields=[
302 (
303 "id",
304 models.AutoField(
305 auto_created=True,
306 primary_key=True,
307 serialize=False,
308 verbose_name="ID",
309 ),
310 ),
311 (
312 "metadata",
313 models.JSONField(
314 blank=True,
315 help_text="JSON metadata field, for use by external plugins",
316 null=True,
317 verbose_name="Plugin Metadata",
318 ),
319 ),
320 (
321 "quantity",
322 InvenTree.fields.RoundingDecimalField(
323 decimal_places=5,
324 default=1,
325 help_text="Item quantity",
326 max_digits=15,
327 validators=[django.core.validators.MinValueValidator(0)],
328 verbose_name="Quantity",
329 ),
330 ),
331 (
332 "reference",
333 models.CharField(
334 blank=True,
335 help_text="Line item reference",
336 max_length=100,
337 verbose_name="Reference",
338 ),
339 ),
340 (
341 "notes",
342 models.CharField(
343 blank=True,
344 help_text="Line item notes",
345 max_length=500,
346 verbose_name="Notes",
347 ),
348 ),
349 (
350 "link",
351 InvenTree.fields.InvenTreeURLField(
352 blank=True,
353 help_text="Link to external page",
354 max_length=2000,
355 verbose_name="Link",
356 ),
357 ),
358 (
359 "target_date",
360 models.DateField(
361 blank=True,
362 help_text="Target date for this line item (leave blank to use the target date from the order)",
363 null=True,
364 verbose_name="Target Date",
365 ),
366 ),
367 (
368 "order",
369 models.ForeignKey(
370 help_text="Transfer Order",
371 on_delete=django.db.models.deletion.CASCADE,
372 related_name="lines",
373 to="order.transferorder",
374 verbose_name="Order",
375 ),
376 ),
377 (
378 "part",
379 models.ForeignKey(
380 help_text="Part",
381 null=True,
382 on_delete=django.db.models.deletion.SET_NULL,
383 related_name="transfer_order_line_items",
384 to="part.part",
385 verbose_name="Part",
386 ),
387 ),
388 (
389 "project_code",
390 models.ForeignKey(
391 blank=True,
392 help_text="Select project code for this order",
393 null=True,
394 on_delete=django.db.models.deletion.SET_NULL,
395 to="common.projectcode",
396 verbose_name="Project Code",
397 ),
398 ),
399 (
400 "transferred",
401 InvenTree.fields.RoundingDecimalField(
402 decimal_places=5,
403 default=0,
404 help_text="transferred quantity",
405 max_digits=15,
406 validators=[django.core.validators.MinValueValidator(0)],
407 verbose_name="transferred",
408 ),
409 ),
410 (
411 "line",
412 models.CharField(
413 blank=True,
414 default="",
415 help_text="Line number for this item (optional)",
416 max_length=20,
417 verbose_name="Line Number",
418 ),
419 )
420 ],
421 options={
422 "verbose_name": "Transfer Order Line Item",
423 },
424 bases=(
425 InvenTree.models.ContentTypeMixin,
426 InvenTree.models.PluginValidationMixin,
427 models.Model,
428 ),
429 ),
430 migrations.CreateModel(
431 name="TransferOrderAllocation",
432 fields=[
433 (
434 "id",
435 models.AutoField(
436 auto_created=True,
437 primary_key=True,
438 serialize=False,
439 verbose_name="ID",
440 ),
441 ),
442 (
443 "quantity",
444 InvenTree.fields.RoundingDecimalField(
445 decimal_places=5,
446 default=1,
447 help_text="Enter stock allocation quantity",
448 max_digits=15,
449 validators=[django.core.validators.MinValueValidator(0)],
450 verbose_name="Quantity",
451 ),
452 ),
453 (
454 "item",
455 models.ForeignKey(
456 help_text="Select stock item to allocate",
457 limit_choices_to={
458 "belongs_to": None,
459 "part__virtual": False,
460 "sales_order": None,
461 },
462 on_delete=django.db.models.deletion.CASCADE,
463 related_name="transfer_order_allocations",
464 to="stock.stockitem",
465 verbose_name="Item",
466 ),
467 ),
468 (
469 "line",
470 models.ForeignKey(
471 on_delete=django.db.models.deletion.CASCADE,
472 related_name="allocations",
473 to="order.transferorderlineitem",
474 verbose_name="Line",
475 ),
476 ),
477 ],
478 options={
479 "verbose_name": "Transfer Order Allocation",
480 },
481 ),
482 ]