Form for creating a new price break for a supplier part

This commit is contained in:
Oliver Walters 2019-05-18 16:42:57 +10:00
parent 1163f60b23
commit fc3072a459
6 changed files with 112 additions and 10 deletions

View File

@ -14,6 +14,7 @@ from company.urls import company_urls
from part.urls import part_urls from part.urls import part_urls
from part.urls import supplier_part_urls from part.urls import supplier_part_urls
from part.urls import price_break_urls
from stock.urls import stock_urls from stock.urls import stock_urls
@ -50,6 +51,7 @@ apipatterns = [
urlpatterns = [ urlpatterns = [
url(r'^part/', include(part_urls)), url(r'^part/', include(part_urls)),
url(r'^supplier-part/', include(supplier_part_urls)), url(r'^supplier-part/', include(supplier_part_urls)),
url(r'^price-break/', include(price_break_urls)),
url(r'^stock/', include(stock_urls)), url(r'^stock/', include(stock_urls)),

View File

@ -223,6 +223,7 @@ class AjaxCreateView(AjaxMixin, CreateView):
super(CreateView, self).get(request, *args, **kwargs) super(CreateView, self).get(request, *args, **kwargs)
self.request = request
form = self.get_form() form = self.get_form()
return self.renderJsonResponse(request, form) return self.renderJsonResponse(request, form)
@ -233,6 +234,7 @@ class AjaxCreateView(AjaxMixin, CreateView):
- If valid, save form - If valid, save form
- Return status info (success / failure) - Return status info (success / failure)
""" """
self.request = request
form = self.get_form() form = self.get_form()
# Extra JSON data sent alongside form # Extra JSON data sent alongside form

View File

@ -10,7 +10,7 @@ InvenTree | {{ company.name }} - Parts
<div class='row'> <div class='row'>
<div class='col-sm-6'> <div class='col-sm-6'>
<h3>Supplier Part</h3> <h3>Supplier Part</h3>
<p>{{ part.SKU }} - <a href="{% url 'company-detail-parts' part.supplier.id %}">{{ part.supplier.name }}</a></p> <p><a href="{% url 'company-detail-parts' part.supplier.id %}">{{ part.supplier.name }}</a> - {{ part.SKU }}</p>
</div> </div>
<div class='col-sm-6'> <div class='col-sm-6'>
<h3> <h3>
@ -59,29 +59,41 @@ InvenTree | {{ company.name }} - Parts
<div class='col-sm-6'> <div class='col-sm-6'>
<table class="table table-striped table-condensed"> <table class="table table-striped table-condensed">
<tr><th colspan='2'>Pricing</th></tr> <tr>
<tr><td>Single Price</td><td>{{ part.single_price }}</td></tr> <th colspan='2'>Pricing</th>
{% if part.multiple > 1 %} </tr>
<tr><td>Order Multiple</td><td>{{ part.multiple }}</td></tr> <tr><td>Order Multiple</td><td>{{ part.multiple }}</td></tr>
{% endif %}
{% if part.base_cost > 0 %} {% if part.base_cost > 0 %}
<tr><td>Base Price (Flat Fee)</td><td>{{ part.base_cost }}</td></tr> <tr><td>Base Price (Flat Fee)</td><td>{{ part.base_cost }}</td></tr>
{% endif %} {% endif %}
{% if part.minimum > 1 %} {% if part.minimum > 1 %}
<tr><td>Minimum Order Quantity</td><td>{{ part.minimum }}</td></tr> <tr><td>Minimum Order Quantity</td><td>{{ part.minimum }}</td></tr>
{% endif %} {% endif %}
{% if part.price_breaks.all %} <tr>
<tr><th colspan='2'>Price Breaks</th></tr> <th>Price Breaks</th>
<th>
<div style='float: right;'>
<button class='btn btn-primary' id='new-price-break' type='button'>New Price Break</button>
</div>
</th>
</tr>
<tr> <tr>
<th>Quantity</th> <th>Quantity</th>
<th>Price</th> <th>Price</th>
</tr> </tr>
{% if part.price_breaks.all %}
{% for pb in part.price_breaks.all %} {% for pb in part.price_breaks.all %}
<tr> <tr>
<td>{{ pb.quantity }}</td> <td>{{ pb.quantity }}</td>
<td>{{ pb.cost }}</td> <td>{{ pb.cost }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
{% else %}
<tr>
<td colspan='2'>
<span class='warning-msg'><i>No price breaks have been added for this part</i></span>
</td>
</tr>
{% endif %} {% endif %}
</table> </table>
</div> </div>
@ -89,9 +101,7 @@ InvenTree | {{ company.name }} - Parts
<br> <br>
<div>
<button class='btn btn-primary' type='button'>New Price Break</button>
</div>
{% include 'modals.html' %} {% 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 %} {% endblock %}

View File

@ -12,6 +12,7 @@ from django import forms
from .models import Part, PartCategory, PartAttachment from .models import Part, PartCategory, PartAttachment
from .models import BomItem from .models import BomItem
from .models import SupplierPart from .models import SupplierPart
from .models import SupplierPriceBreak
class PartImageForm(HelperForm): class PartImageForm(HelperForm):
@ -161,3 +162,15 @@ class EditSupplierPartForm(HelperForm):
'packaging', 'packaging',
'lead_time' 'lead_time'
] ]
class EditPriceBreakForm(HelperForm):
""" Form for creating / editing a supplier price break """
class Meta:
model = SupplierPriceBreak
fields = [
'part',
'quantity',
'cost'
]

View File

@ -12,6 +12,13 @@ from django.conf.urls import url, include
from . import views from . import views
price_break_urls = [
url('^new/', views.PriceBreakCreate.as_view(), name='price-break-create'),
url(r'^(?P<pk>\d+)/edit/', views.PriceBreakEdit.as_view(), name='price-break-edit'),
url(r'^(?P<pk>\d+)/delete/', views.PriceBreakDelete.as_view(), name='price-break-delete'),
]
supplier_part_detail_urls = [ supplier_part_detail_urls = [
url(r'edit/?', views.SupplierPartEdit.as_view(), name='supplier-part-edit'), url(r'edit/?', views.SupplierPartEdit.as_view(), name='supplier-part-edit'),
url(r'delete/?', views.SupplierPartDelete.as_view(), name='supplier-part-delete'), url(r'delete/?', views.SupplierPartDelete.as_view(), name='supplier-part-delete'),

View File

@ -16,6 +16,7 @@ from company.models import Company
from .models import PartCategory, Part, PartAttachment from .models import PartCategory, Part, PartAttachment
from .models import BomItem from .models import BomItem
from .models import SupplierPart from .models import SupplierPart
from .models import SupplierPriceBreak
from .models import match_part_names from .models import match_part_names
from . import forms as part_forms from . import forms as part_forms
@ -809,3 +810,58 @@ class SupplierPartDelete(AjaxDeleteView):
ajax_template_name = 'company/partdelete.html' ajax_template_name = 'company/partdelete.html'
ajax_form_title = 'Delete Supplier Part' ajax_form_title = 'Delete Supplier Part'
context_object_name = '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'