diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py
index 2872096c08..ee03848ae6 100644
--- a/InvenTree/InvenTree/urls.py
+++ b/InvenTree/InvenTree/urls.py
@@ -14,6 +14,7 @@ from company.urls import company_urls
from part.urls import part_urls
from part.urls import supplier_part_urls
+from part.urls import price_break_urls
from stock.urls import stock_urls
@@ -50,6 +51,7 @@ apipatterns = [
urlpatterns = [
url(r'^part/', include(part_urls)),
url(r'^supplier-part/', include(supplier_part_urls)),
+ url(r'^price-break/', include(price_break_urls)),
url(r'^stock/', include(stock_urls)),
diff --git a/InvenTree/InvenTree/views.py b/InvenTree/InvenTree/views.py
index 9d5e1a2dc4..f6fdbc4d46 100644
--- a/InvenTree/InvenTree/views.py
+++ b/InvenTree/InvenTree/views.py
@@ -223,6 +223,7 @@ class AjaxCreateView(AjaxMixin, CreateView):
super(CreateView, self).get(request, *args, **kwargs)
+ self.request = request
form = self.get_form()
return self.renderJsonResponse(request, form)
@@ -233,6 +234,7 @@ class AjaxCreateView(AjaxMixin, CreateView):
- If valid, save form
- Return status info (success / failure)
"""
+ self.request = request
form = self.get_form()
# Extra JSON data sent alongside form
diff --git a/InvenTree/company/templates/company/partdetail.html b/InvenTree/company/templates/company/partdetail.html
index b2fdf8aeb9..ba336fa3c5 100644
--- a/InvenTree/company/templates/company/partdetail.html
+++ b/InvenTree/company/templates/company/partdetail.html
@@ -10,7 +10,7 @@ InvenTree | {{ company.name }} - Parts
@@ -59,29 +59,41 @@ InvenTree | {{ company.name }} - Parts
- Pricing |
- Single Price | {{ part.single_price }} |
- {% if part.multiple > 1 %}
+
+ Pricing |
+
Order Multiple | {{ part.multiple }} |
- {% endif %}
{% if part.base_cost > 0 %}
Base Price (Flat Fee) | {{ part.base_cost }} |
{% endif %}
{% if part.minimum > 1 %}
Minimum Order Quantity | {{ part.minimum }} |
{% endif %}
- {% if part.price_breaks.all %}
- Price Breaks |
+
+ Price Breaks |
+
+
+
+
+ |
+
Quantity |
Price |
+ {% if part.price_breaks.all %}
{% for pb in part.price_breaks.all %}
{{ pb.quantity }} |
{{ pb.cost }} |
{% endfor %}
+ {% else %}
+
+
+ No price breaks have been added for this part
+ |
+
{% endif %}
@@ -89,9 +101,7 @@ InvenTree | {{ company.name }} - Parts
-
-
-
+
{% include 'modals.html' %}
@@ -116,4 +126,16 @@ InvenTree | {{ company.name }} - Parts
}
);
});
+
+ $('#new-price-break').click(function() {
+ launchModalForm("{% url 'price-break-create' %}",
+ {
+ reload: true,
+ data: {
+ part: {{ part.id }},
+ }
+ }
+ );
+ });
+
{% endblock %}
\ No newline at end of file
diff --git a/InvenTree/part/forms.py b/InvenTree/part/forms.py
index 988cb7aa38..96fec2a597 100644
--- a/InvenTree/part/forms.py
+++ b/InvenTree/part/forms.py
@@ -12,6 +12,7 @@ from django import forms
from .models import Part, PartCategory, PartAttachment
from .models import BomItem
from .models import SupplierPart
+from .models import SupplierPriceBreak
class PartImageForm(HelperForm):
@@ -161,3 +162,15 @@ class EditSupplierPartForm(HelperForm):
'packaging',
'lead_time'
]
+
+
+class EditPriceBreakForm(HelperForm):
+ """ Form for creating / editing a supplier price break """
+
+ class Meta:
+ model = SupplierPriceBreak
+ fields = [
+ 'part',
+ 'quantity',
+ 'cost'
+ ]
\ No newline at end of file
diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py
index 0671240e73..0d02c01918 100644
--- a/InvenTree/part/urls.py
+++ b/InvenTree/part/urls.py
@@ -12,6 +12,13 @@ from django.conf.urls import url, include
from . import views
+price_break_urls = [
+ url('^new/', views.PriceBreakCreate.as_view(), name='price-break-create'),
+
+ url(r'^(?P\d+)/edit/', views.PriceBreakEdit.as_view(), name='price-break-edit'),
+ url(r'^(?P\d+)/delete/', views.PriceBreakDelete.as_view(), name='price-break-delete'),
+]
+
supplier_part_detail_urls = [
url(r'edit/?', views.SupplierPartEdit.as_view(), name='supplier-part-edit'),
url(r'delete/?', views.SupplierPartDelete.as_view(), name='supplier-part-delete'),
diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py
index 55482d3284..7fa693ecdc 100644
--- a/InvenTree/part/views.py
+++ b/InvenTree/part/views.py
@@ -16,6 +16,7 @@ from company.models import Company
from .models import PartCategory, Part, PartAttachment
from .models import BomItem
from .models import SupplierPart
+from .models import SupplierPriceBreak
from .models import match_part_names
from . import forms as part_forms
@@ -809,3 +810,58 @@ class SupplierPartDelete(AjaxDeleteView):
ajax_template_name = 'company/partdelete.html'
ajax_form_title = 'Delete Supplier Part'
context_object_name = 'supplier_part'
+
+
+class PriceBreakCreate(AjaxCreateView):
+ """ View for creating a supplier price break """
+
+ model = SupplierPriceBreak
+ form_class = part_forms.EditPriceBreakForm
+ ajax_form_title = 'Add Price Break'
+ ajax_template_name = 'modal_form.html'
+
+ def get_data(self):
+ return {
+ 'success': 'Added new price break'
+ }
+
+ def get_part(self):
+ try:
+ return SupplierPart.objects.get(id=self.request.GET.get('part'))
+ except SupplierPart.DoesNotExist:
+ return SupplierPart.objects.get(id=self.request.POST.get('part'))
+
+ def get_form(self):
+
+ form = super(AjaxCreateView, self).get_form()
+
+ form.fields['part'].widget = HiddenInput()
+
+ return form
+
+ def get_initial(self):
+
+ initials = super(AjaxCreateView, self).get_initial()
+
+ print("GETTING INITIAL DAtA")
+
+ initials['part'] = self.get_part()
+
+ return initials
+
+
+class PriceBreakEdit(AjaxUpdateView):
+ """ View for editing a supplier price break """
+
+ model = SupplierPriceBreak
+ form_class = part_forms.EditPriceBreakForm
+ ajax_form_title = 'Edit Price Break'
+ ajax_template_name = 'modal_form.html'
+
+
+class PriceBreakDelete(AjaxDeleteView):
+ """ View for deleting a supplier price break """
+
+ model = SupplierPriceBreak
+ ajax_form_title = "Delete Price Break"
+ ajax_template_name = 'modal_delete_form.html'