mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Merge remote-tracking branch 'inventree/master'
This commit is contained in:
commit
33ac3cdd95
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -223,7 +223,7 @@ class PurchaseOrder(Order):
|
|||||||
return reverse('po-detail', kwargs={'pk': self.id})
|
return reverse('po-detail', kwargs={'pk': self.id})
|
||||||
|
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def add_line_item(self, supplier_part, quantity, group=True, reference=''):
|
def add_line_item(self, supplier_part, quantity, group=True, reference='', purchase_price=None):
|
||||||
""" Add a new line item to this purchase order.
|
""" Add a new line item to this purchase order.
|
||||||
This function will check that:
|
This function will check that:
|
||||||
|
|
||||||
@ -254,7 +254,12 @@ class PurchaseOrder(Order):
|
|||||||
if matches.count() > 0:
|
if matches.count() > 0:
|
||||||
line = matches.first()
|
line = matches.first()
|
||||||
|
|
||||||
line.quantity += quantity
|
# update quantity and price
|
||||||
|
quantity_new = line.quantity + quantity
|
||||||
|
line.quantity = quantity_new
|
||||||
|
supplier_price = supplier_part.get_price(quantity_new)
|
||||||
|
if line.purchase_price and supplier_price:
|
||||||
|
line.purchase_price = supplier_price / quantity_new
|
||||||
line.save()
|
line.save()
|
||||||
|
|
||||||
return
|
return
|
||||||
@ -263,7 +268,9 @@ class PurchaseOrder(Order):
|
|||||||
order=self,
|
order=self,
|
||||||
part=supplier_part,
|
part=supplier_part,
|
||||||
quantity=quantity,
|
quantity=quantity,
|
||||||
reference=reference)
|
reference=reference,
|
||||||
|
purchase_price=purchase_price,
|
||||||
|
)
|
||||||
|
|
||||||
line.save()
|
line.save()
|
||||||
|
|
||||||
@ -329,7 +336,7 @@ class PurchaseOrder(Order):
|
|||||||
return self.pending_line_items().count() == 0
|
return self.pending_line_items().count() == 0
|
||||||
|
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def receive_line_item(self, line, location, quantity, user, status=StockStatus.OK):
|
def receive_line_item(self, line, location, quantity, user, status=StockStatus.OK, purchase_price=None):
|
||||||
""" Receive a line item (or partial line item) against this PO
|
""" Receive a line item (or partial line item) against this PO
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -353,7 +360,8 @@ class PurchaseOrder(Order):
|
|||||||
location=location,
|
location=location,
|
||||||
quantity=quantity,
|
quantity=quantity,
|
||||||
purchase_order=self,
|
purchase_order=self,
|
||||||
status=status
|
status=status,
|
||||||
|
purchase_price=purchase_price,
|
||||||
)
|
)
|
||||||
|
|
||||||
stock.save()
|
stock.save()
|
||||||
|
@ -776,6 +776,7 @@ class PurchaseOrderReceive(AjaxUpdateView):
|
|||||||
line.receive_quantity,
|
line.receive_quantity,
|
||||||
self.request.user,
|
self.request.user,
|
||||||
status=line.status_code,
|
status=line.status_code,
|
||||||
|
purchase_price=line.purchase_price,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -996,6 +997,14 @@ class OrderParts(AjaxView):
|
|||||||
part.order_supplier = supplier_part.id if supplier_part else None
|
part.order_supplier = supplier_part.id if supplier_part else None
|
||||||
part.order_quantity = quantity
|
part.order_quantity = quantity
|
||||||
|
|
||||||
|
# set supplier-price
|
||||||
|
if supplier_part:
|
||||||
|
supplier_price = supplier_part.get_price(quantity)
|
||||||
|
if supplier_price:
|
||||||
|
part.purchase_price = supplier_price / quantity
|
||||||
|
if not hasattr(part, 'purchase_price'):
|
||||||
|
part.purchase_price = None
|
||||||
|
|
||||||
self.parts.append(part)
|
self.parts.append(part)
|
||||||
|
|
||||||
if supplier_part is None:
|
if supplier_part is None:
|
||||||
@ -1095,7 +1104,10 @@ class OrderParts(AjaxView):
|
|||||||
sp=item.order_supplier))
|
sp=item.order_supplier))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
order.add_line_item(supplier_part, quantity)
|
# get purchase price
|
||||||
|
purchase_price = item.purchase_price
|
||||||
|
|
||||||
|
order.add_line_item(supplier_part, quantity, purchase_price=purchase_price)
|
||||||
|
|
||||||
|
|
||||||
class POLineItemCreate(AjaxCreateView):
|
class POLineItemCreate(AjaxCreateView):
|
||||||
|
@ -91,7 +91,7 @@
|
|||||||
{% if part.salable and roles.sales_order.view %}
|
{% if part.salable and roles.sales_order.view %}
|
||||||
<li class='list-group-item {% if tab == "sales-prices" %}active{% endif %}' title='{% trans "Sales Price Information" %}'>
|
<li class='list-group-item {% if tab == "sales-prices" %}active{% endif %}' title='{% trans "Sales Price Information" %}'>
|
||||||
<a href='{% url "part-sale-prices" part.id %}'>
|
<a href='{% url "part-sale-prices" part.id %}'>
|
||||||
<span class='menu-tab-icon fas fa-dollar-sign'></span>
|
<span class='menu-tab-icon fas fa-dollar-sign' style='width: 20px;'></span>
|
||||||
{% trans "Sale Price" %}
|
{% trans "Sale Price" %}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
{% load static %}
|
{% load static %}
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
|
||||||
{% block menubar %}}
|
{% block menubar %}
|
||||||
{% include 'part/navbar.html' with tab='sales-prices' %}
|
{% include 'part/navbar.html' with tab='sales-prices' %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
4
tasks.py
4
tasks.py
@ -65,7 +65,7 @@ def manage(c, cmd, pty=False):
|
|||||||
cmd - django command to run
|
cmd - django command to run
|
||||||
"""
|
"""
|
||||||
|
|
||||||
c.run('cd {path} && python3 manage.py {cmd}'.format(
|
c.run('cd "{path}" && python3 manage.py {cmd}'.format(
|
||||||
path=managePyDir(),
|
path=managePyDir(),
|
||||||
cmd=cmd
|
cmd=cmd
|
||||||
), pty=pty)
|
), pty=pty)
|
||||||
@ -185,7 +185,7 @@ def translate(c):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# Translate applicable .py / .html / .js files
|
# Translate applicable .py / .html / .js files
|
||||||
manage(c, "makemessages --all -e py,html,js")
|
manage(c, "makemessages --all -e py,html,js --no-wrap")
|
||||||
manage(c, "compilemessages")
|
manage(c, "compilemessages")
|
||||||
|
|
||||||
path = os.path.join('InvenTree', 'script', 'translation_stats.py')
|
path = os.path.join('InvenTree', 'script', 'translation_stats.py')
|
||||||
|
Loading…
Reference in New Issue
Block a user