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

Supplier Part

-

{{ part.SKU }} - {{ part.supplier.name }}

+

{{ part.supplier.name }} - {{ part.SKU }}

@@ -59,29 +59,41 @@ InvenTree | {{ company.name }} - Parts
- - - {% if part.multiple > 1 %} + + + - {% endif %} {% if part.base_cost > 0 %} {% endif %} {% if part.minimum > 1 %} {% endif %} - {% if part.price_breaks.all %} - + + + + + {% if part.price_breaks.all %} {% for pb in part.price_breaks.all %} {% endfor %} + {% else %} + + + {% endif %}
Pricing
Single Price{{ part.single_price }}
Pricing
Order Multiple{{ part.multiple }}
Base Price (Flat Fee){{ part.base_cost }}
Minimum Order Quantity{{ part.minimum }}
Price Breaks
Price Breaks +
+ +
+
Quantity Price
{{ pb.quantity }} {{ pb.cost }}
+ No price breaks have been added for this part +
@@ -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'