mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Sales order can now be completed via the API
This commit is contained in:
parent
008c52ef39
commit
31398b4c10
@ -683,7 +683,7 @@ class SalesOrderComplete(generics.CreateAPIView):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
queryset = models.SalesOrder.objects.all()
|
queryset = models.SalesOrder.objects.all()
|
||||||
serializer_class = serializers.SalesOrderShipmentCompleteSerializer
|
serializer_class = serializers.SalesOrderCompleteSerializer
|
||||||
|
|
||||||
def get_serializer_context(self):
|
def get_serializer_context(self):
|
||||||
|
|
||||||
|
@ -621,23 +621,43 @@ class SalesOrder(Order):
|
|||||||
|
|
||||||
return self.lines.count() > 0 and all([line.is_completed() for line in self.lines.all()])
|
return self.lines.count() > 0 and all([line.is_completed() for line in self.lines.all()])
|
||||||
|
|
||||||
|
def can_complete(self, raise_error=False):
|
||||||
|
"""
|
||||||
|
Test if this SalesOrder can be completed.
|
||||||
|
|
||||||
|
Throws a ValidationError if cannot be completed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Order without line items cannot be completed
|
||||||
|
if self.lines.count() == 0:
|
||||||
|
if raise_error:
|
||||||
|
raise ValidationError(_('Order cannot be completed as no parts have been assigned'))
|
||||||
|
|
||||||
|
# Only a PENDING order can be marked as SHIPPED
|
||||||
|
elif self.status != SalesOrderStatus.PENDING:
|
||||||
|
if raise_error:
|
||||||
|
raise ValidationError(_('Only a pending order can be marked as complete'))
|
||||||
|
|
||||||
|
elif self.pending_shipment_count > 0:
|
||||||
|
if raise_error:
|
||||||
|
raise ValidationError(_("Order cannot be completed as there are incomplete shipments"))
|
||||||
|
|
||||||
|
elif self.pending_line_count > 0:
|
||||||
|
if raise_error:
|
||||||
|
raise ValidationError(_("Order cannot be completed as there are incomplete line items"))
|
||||||
|
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
def complete_order(self, user):
|
def complete_order(self, user):
|
||||||
"""
|
"""
|
||||||
Mark this order as "complete"
|
Mark this order as "complete"
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if self.lines.count() == 0:
|
if not self.can_complete():
|
||||||
# Order without line items cannot be completed
|
return
|
||||||
raise ValidationError(_('Order cannot be completed as no parts have been assigned'))
|
|
||||||
|
|
||||||
if self.status != SalesOrderStatus.PENDING:
|
|
||||||
# Only a PENDING order can be marked as SHIPPED
|
|
||||||
raise ValidationError(_('Only a pending order can be marked as complete'))
|
|
||||||
|
|
||||||
# Check if there are any incomplete shipments
|
|
||||||
for shipment in self.shipments.all():
|
|
||||||
if not shipment.shipment_date:
|
|
||||||
raise ValidationError(_('Order cannot be completed as there are pending shipments'))
|
|
||||||
|
|
||||||
self.status = SalesOrderStatus.SHIPPED
|
self.status = SalesOrderStatus.SHIPPED
|
||||||
self.shipped_by = user
|
self.shipped_by = user
|
||||||
|
@ -749,11 +749,20 @@ class SalesOrderCompleteSerializer(serializers.Serializer):
|
|||||||
DRF serializer for manually marking a sales order as complete
|
DRF serializer for manually marking a sales order as complete
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def validate(self, data):
|
||||||
|
|
||||||
|
data = super().validate(data)
|
||||||
|
|
||||||
|
order = self.context['order']
|
||||||
|
|
||||||
|
order.can_complete(raise_error=True)
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
|
|
||||||
request = self.context['request']
|
request = self.context['request']
|
||||||
order = self.context['order']
|
order = self.context['order']
|
||||||
# data = self.validated_data
|
|
||||||
|
|
||||||
user = getattr(request, 'user', None)
|
user = getattr(request, 'user', None)
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ src="{% static 'img/blank_image.png' %}"
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
{% if order.status == SalesOrderStatus.PENDING %}
|
{% if order.status == SalesOrderStatus.PENDING %}
|
||||||
<button type='button' class='btn btn-success' id='complete-order' title='{% trans "Complete Sales Order" %}'>
|
<button type='button' class='btn btn-success' id='complete-order' title='{% trans "Complete Sales Order" %}'{% if not order.is_completed %} disabled{% endif %}>
|
||||||
<span class='fas fa-check-circle'></span> {% trans "Complete Order" %}
|
<span class='fas fa-check-circle'></span> {% trans "Complete Order" %}
|
||||||
</button>
|
</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -224,7 +224,12 @@ $("#cancel-order").click(function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
$("#complete-order").click(function() {
|
$("#complete-order").click(function() {
|
||||||
completeSalesOrder({{ order.pk }});
|
constructForm('{% url "api-so-complete" order.id %}', {
|
||||||
|
method: 'POST',
|
||||||
|
title: '{% trans "Complete Sales Order" %}',
|
||||||
|
confirm: true,
|
||||||
|
reload: true,
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
{% if report_enabled %}
|
{% if report_enabled %}
|
||||||
|
Loading…
Reference in New Issue
Block a user