diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index 403b3a9430..e8263285b1 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -8,17 +8,19 @@ import decimal import os from datetime import datetime +from django import dispatch -from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import User from django.core.exceptions import ValidationError - -from django.urls import reverse +from django.core.validators import MinValueValidator from django.db import models, transaction from django.db.models import Sum, Q from django.db.models.functions import Coalesce -from django.core.validators import MinValueValidator +from django.db.models.signals import post_save +from django.dispatch.dispatcher import receiver +from django.urls import reverse +from django.utils.translation import ugettext_lazy as _ from markdownx.models import MarkdownxField @@ -27,16 +29,17 @@ from mptt.exceptions import InvalidMove from InvenTree.status_codes import BuildStatus, StockStatus, StockHistoryCode from InvenTree.helpers import increment, getSetting, normalize, MakeBarcode -from InvenTree.validators import validate_build_order_reference from InvenTree.models import InvenTreeAttachment, ReferenceIndexingMixin +from InvenTree.validators import validate_build_order_reference import common.models import InvenTree.fields import InvenTree.helpers +import InvenTree.tasks -from stock import models as StockModels from part import models as PartModels +from stock import models as StockModels from users import models as UserModels @@ -1014,6 +1017,19 @@ class Build(MPTTModel, ReferenceIndexingMixin): return self.status == BuildStatus.COMPLETE +@receiver(post_save, sender=Build, dispatch_uid='build_post_save_log') +def after_save_build(sender, instance: Build, created: bool, **kwargs): + """ + Callback function to be executed after a Build instance is saved + """ + + if created: + # A new Build has just been created + + # Run checks on required parts + InvenTree.tasks.offload_task('build.tasks.check_build_stock', instance) + + class BuildOrderAttachment(InvenTreeAttachment): """ Model for storing file attachments against a BuildOrder object diff --git a/InvenTree/build/tasks.py b/InvenTree/build/tasks.py index a087b66129..8b5a0a1831 100644 --- a/InvenTree/build/tasks.py +++ b/InvenTree/build/tasks.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +from decimal import Decimal import logging from django.utils.translation import ugettext_lazy as _ @@ -39,7 +40,7 @@ def check_build_stock(build: build.models.Build): available = max(0, in_stock - allocated) - required = bom_item.quantity * build.quantity + required = Decimal(bom_item.quantity) * Decimal(build.quantity) if available < required: # There is not sufficient stock for this part diff --git a/InvenTree/templates/email/build_order_required_stock.html b/InvenTree/templates/email/build_order_required_stock.html index 6b28d39f8e..5f4015da27 100644 --- a/InvenTree/templates/email/build_order_required_stock.html +++ b/InvenTree/templates/email/build_order_required_stock.html @@ -21,7 +21,9 @@ {% for line in lines %} - {{ line.part.full_name }} + + {{ line.part.full_name }}{% if part.description %} - {{ part.description }}{% endif %} + {% decimal line.required %} {% if line.part.units %}{{ line.part.units }}{% endif %}