mirror of
https://github.com/inventree/InvenTree.git
synced 2025-05-03 05:48:47 +00:00
Replace PurchaseOrderComplete form
This commit is contained in:
parent
e527ddcc86
commit
5afc3bfce2
@ -311,11 +311,21 @@ class PurchaseOrderCancel(PurchaseOrderContextMixin, generics.CreateAPIView):
|
|||||||
The purchase order must be in a state which can be cancelled
|
The purchase order must be in a state which can be cancelled
|
||||||
"""
|
"""
|
||||||
|
|
||||||
queryset = models.PurchaseOrderLineItem.objects.all()
|
queryset = models.PurchaseOrder.objects.all()
|
||||||
|
|
||||||
serializer_class = serializers.PurchaseOrderCancelSerializer
|
serializer_class = serializers.PurchaseOrderCancelSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class PurchaseOrderComplete(PurchaseOrderContextMixin, generics.CreateAPIView):
|
||||||
|
"""
|
||||||
|
API endpoint to 'complete' a purchase order
|
||||||
|
"""
|
||||||
|
|
||||||
|
queryset = models.PurchaseOrder.objects.all()
|
||||||
|
|
||||||
|
serializer_class = serializers.PurchaseOrderCompleteSerializer
|
||||||
|
|
||||||
|
|
||||||
class PurchaseOrderReceive(PurchaseOrderContextMixin, generics.CreateAPIView):
|
class PurchaseOrderReceive(PurchaseOrderContextMixin, generics.CreateAPIView):
|
||||||
"""
|
"""
|
||||||
API endpoint to receive stock items against a purchase order.
|
API endpoint to receive stock items against a purchase order.
|
||||||
@ -1124,6 +1134,7 @@ order_api_urls = [
|
|||||||
re_path(r'^(?P<pk>\d+)/', include([
|
re_path(r'^(?P<pk>\d+)/', include([
|
||||||
re_path(r'^receive/', PurchaseOrderReceive.as_view(), name='api-po-receive'),
|
re_path(r'^receive/', PurchaseOrderReceive.as_view(), name='api-po-receive'),
|
||||||
re_path(r'^cancel/', PurchaseOrderCancel.as_view(), name='api-po-cancel'),
|
re_path(r'^cancel/', PurchaseOrderCancel.as_view(), name='api-po-cancel'),
|
||||||
|
re_path(r'^complete/', PurchaseOrderComplete.as_view(), name='api-po-complete'),
|
||||||
re_path(r'.*$', PurchaseOrderDetail.as_view(), name='api-po-detail'),
|
re_path(r'.*$', PurchaseOrderDetail.as_view(), name='api-po-detail'),
|
||||||
])),
|
])),
|
||||||
|
|
||||||
|
@ -30,17 +30,6 @@ class IssuePurchaseOrderForm(HelperForm):
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
class CompletePurchaseOrderForm(HelperForm):
|
|
||||||
|
|
||||||
confirm = forms.BooleanField(required=True, label=_('Confirm'), help_text=_("Mark order as complete"))
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = PurchaseOrder
|
|
||||||
fields = [
|
|
||||||
'confirm',
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class CancelSalesOrderForm(HelperForm):
|
class CancelSalesOrderForm(HelperForm):
|
||||||
|
|
||||||
confirm = forms.BooleanField(required=True, label=_('Confirm'), help_text=_('Cancel order'))
|
confirm = forms.BooleanField(required=True, label=_('Confirm'), help_text=_('Cancel order'))
|
||||||
|
@ -208,6 +208,32 @@ class PurchaseOrderCancelSerializer(serializers.Serializer):
|
|||||||
order.cancel_order()
|
order.cancel_order()
|
||||||
|
|
||||||
|
|
||||||
|
class PurchaseOrderCompleteSerializer(serializers.Serializer):
|
||||||
|
"""
|
||||||
|
Serializer for completing a purchase order
|
||||||
|
"""
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
fields = []
|
||||||
|
|
||||||
|
def get_context_data(self):
|
||||||
|
"""
|
||||||
|
Custom context information for this serializer
|
||||||
|
"""
|
||||||
|
|
||||||
|
order = self.context['order']
|
||||||
|
|
||||||
|
return {
|
||||||
|
'is_complete': order.is_complete,
|
||||||
|
}
|
||||||
|
|
||||||
|
def save(self):
|
||||||
|
|
||||||
|
order = self.context['order']
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class PurchaseOrderLineItemSerializer(InvenTreeModelSerializer):
|
class PurchaseOrderLineItemSerializer(InvenTreeModelSerializer):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -252,9 +252,15 @@ $("#receive-order").click(function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
$("#complete-order").click(function() {
|
$("#complete-order").click(function() {
|
||||||
launchModalForm("{% url 'po-complete' order.id %}", {
|
|
||||||
reload: true,
|
completePurchaseOrder(
|
||||||
});
|
{{ order.pk }},
|
||||||
|
{
|
||||||
|
onSuccess: function() {
|
||||||
|
window.location.reload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
$("#cancel-order").click(function() {
|
$("#cancel-order").click(function() {
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
{% extends "modal_form.html" %}
|
|
||||||
|
|
||||||
{% load i18n %}
|
|
||||||
|
|
||||||
{% block pre_form_content %}
|
|
||||||
|
|
||||||
{% trans 'Mark this order as complete?' %}
|
|
||||||
{% if not order.is_complete %}
|
|
||||||
<div class='alert alert-warning alert-block' style='margin-top:12px'>
|
|
||||||
{% trans 'This order has line items which have not been marked as received.' %}</br>
|
|
||||||
{% trans 'Completing this order means that the order and line items will no longer be editable.' %}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% endblock %}
|
|
@ -12,8 +12,6 @@ from . import views
|
|||||||
purchase_order_detail_urls = [
|
purchase_order_detail_urls = [
|
||||||
|
|
||||||
re_path(r'^issue/', views.PurchaseOrderIssue.as_view(), name='po-issue'),
|
re_path(r'^issue/', views.PurchaseOrderIssue.as_view(), name='po-issue'),
|
||||||
re_path(r'^complete/', views.PurchaseOrderComplete.as_view(), name='po-complete'),
|
|
||||||
|
|
||||||
re_path(r'^upload/', views.PurchaseOrderUpload.as_view(), name='po-upload'),
|
re_path(r'^upload/', views.PurchaseOrderUpload.as_view(), name='po-upload'),
|
||||||
re_path(r'^export/', views.PurchaseOrderExport.as_view(), name='po-export'),
|
re_path(r'^export/', views.PurchaseOrderExport.as_view(), name='po-export'),
|
||||||
|
|
||||||
|
@ -140,44 +140,6 @@ class PurchaseOrderIssue(AjaxUpdateView):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class PurchaseOrderComplete(AjaxUpdateView):
|
|
||||||
""" View for marking a PurchaseOrder as complete.
|
|
||||||
"""
|
|
||||||
|
|
||||||
form_class = order_forms.CompletePurchaseOrderForm
|
|
||||||
model = PurchaseOrder
|
|
||||||
ajax_template_name = "order/order_complete.html"
|
|
||||||
ajax_form_title = _("Complete Order")
|
|
||||||
context_object_name = 'order'
|
|
||||||
|
|
||||||
def get_context_data(self):
|
|
||||||
|
|
||||||
ctx = {
|
|
||||||
'order': self.get_object(),
|
|
||||||
}
|
|
||||||
|
|
||||||
return ctx
|
|
||||||
|
|
||||||
def validate(self, order, form, **kwargs):
|
|
||||||
|
|
||||||
confirm = str2bool(form.cleaned_data.get('confirm', False))
|
|
||||||
|
|
||||||
if not confirm:
|
|
||||||
form.add_error('confirm', _('Confirm order completion'))
|
|
||||||
|
|
||||||
def save(self, order, form, **kwargs):
|
|
||||||
"""
|
|
||||||
Complete the PurchaseOrder
|
|
||||||
"""
|
|
||||||
|
|
||||||
order.complete_order()
|
|
||||||
|
|
||||||
def get_data(self):
|
|
||||||
return {
|
|
||||||
'success': _('Purchase order completed')
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class PurchaseOrderUpload(FileManagementFormView):
|
class PurchaseOrderUpload(FileManagementFormView):
|
||||||
''' PurchaseOrder: Upload file, match to fields and parts (using multi-Step form) '''
|
''' PurchaseOrder: Upload file, match to fields and parts (using multi-Step form) '''
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
/* exported
|
/* exported
|
||||||
allocateStockToSalesOrder,
|
allocateStockToSalesOrder,
|
||||||
cancelPurchaseOrder,
|
cancelPurchaseOrder,
|
||||||
|
completePurchaseOrder,
|
||||||
completeShipment,
|
completeShipment,
|
||||||
createSalesOrder,
|
createSalesOrder,
|
||||||
createSalesOrderShipment,
|
createSalesOrderShipment,
|
||||||
@ -142,6 +143,46 @@ function completeShipment(shipment_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function completePurchaseOrder(order_id, options={}) {
|
||||||
|
|
||||||
|
constructForm(
|
||||||
|
`/api/order/po/${order_id}/complete/`,
|
||||||
|
{
|
||||||
|
method: 'POST',
|
||||||
|
title: '{% trans "Complete Purchase Order" %}',
|
||||||
|
confirm: true,
|
||||||
|
preFormContent: function(opts) {
|
||||||
|
|
||||||
|
var html = `
|
||||||
|
<div class='alert alert-block alert-info'>
|
||||||
|
{% trans "Mark this order as complete?" %}
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
if (opts.context.is_complete) {
|
||||||
|
html += `
|
||||||
|
<div class='alert alert-block alert-success'>
|
||||||
|
{% trans "All line items have been received" %}
|
||||||
|
</div>`;
|
||||||
|
} else {
|
||||||
|
html += `
|
||||||
|
<div class='alert alert-block alert-warning'>
|
||||||
|
{% trans 'This order has line items which have not been marked as received.' %}</br>
|
||||||
|
{% trans 'Completing this order means that the order and line items will no longer be editable.' %}
|
||||||
|
</div>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return html;
|
||||||
|
},
|
||||||
|
onSuccess: function(response) {
|
||||||
|
if (options.onSuccess) {
|
||||||
|
options.onSuccess(response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function cancelPurchaseOrder(order_id, options={}) {
|
function cancelPurchaseOrder(order_id, options={}) {
|
||||||
|
|
||||||
var html = `
|
var html = `
|
||||||
|
Loading…
x
Reference in New Issue
Block a user