mirror of
https://github.com/inventree/InvenTree.git
synced 2025-06-18 21:15:41 +00:00
Merge pull request #1535 from eeintech/get_price
Added support for fractional price and lower price break
This commit is contained in:
@ -6,7 +6,7 @@ Company database model definitions
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import os
|
||||
|
||||
import decimal
|
||||
import math
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
@ -566,12 +566,15 @@ class SupplierPart(models.Model):
|
||||
- If order multiples are to be observed, then we need to calculate based on that, too
|
||||
"""
|
||||
|
||||
price_breaks = self.price_breaks.filter(quantity__lte=quantity)
|
||||
price_breaks = self.price_breaks.all()
|
||||
|
||||
# No price break information available?
|
||||
if len(price_breaks) == 0:
|
||||
return None
|
||||
|
||||
# Check if quantity is fraction and disable multiples
|
||||
multiples = (quantity % 1 == 0)
|
||||
|
||||
# Order multiples
|
||||
if multiples:
|
||||
quantity = int(math.ceil(quantity / self.multiple) * self.multiple)
|
||||
@ -584,7 +587,12 @@ class SupplierPart(models.Model):
|
||||
# Default currency selection
|
||||
currency = common.models.InvenTreeSetting.get_setting('INVENTREE_DEFAULT_CURRENCY')
|
||||
|
||||
pb_min = None
|
||||
for pb in self.price_breaks.all():
|
||||
# Store smallest price break
|
||||
if not pb_min:
|
||||
pb_min = pb
|
||||
|
||||
# Ignore this pricebreak (quantity is too high)
|
||||
if pb.quantity > quantity:
|
||||
continue
|
||||
@ -598,6 +606,17 @@ class SupplierPart(models.Model):
|
||||
# Convert everything to the selected currency
|
||||
pb_cost = pb.convert_to(currency)
|
||||
|
||||
# Use smallest price break
|
||||
if not pb_found and pb_min:
|
||||
# Update price break information
|
||||
pb_quantity = pb_min.quantity
|
||||
pb_cost = pb_min.convert_to(currency)
|
||||
# Trigger cost calculation using smallest price break
|
||||
pb_found = True
|
||||
|
||||
# Convert quantity to decimal.Decimal format
|
||||
quantity = decimal.Decimal(f'{quantity}')
|
||||
|
||||
if pb_found:
|
||||
cost = pb_cost * quantity
|
||||
return normalize(cost + self.base_cost)
|
||||
|
@ -5,6 +5,7 @@ from django.test import TestCase
|
||||
from django.core.exceptions import ValidationError
|
||||
|
||||
import os
|
||||
from decimal import Decimal
|
||||
|
||||
from .models import Company, Contact, ManufacturerPart, SupplierPart
|
||||
from .models import rename_company_image
|
||||
@ -103,8 +104,9 @@ class CompanySimpleTest(TestCase):
|
||||
self.assertEqual(p(100), 350)
|
||||
|
||||
p = self.acme0002.get_price
|
||||
self.assertEqual(p(1), None)
|
||||
self.assertEqual(p(2), None)
|
||||
self.assertEqual(p(0.5), 3.5)
|
||||
self.assertEqual(p(1), 7)
|
||||
self.assertEqual(p(2), 14)
|
||||
self.assertEqual(p(5), 35)
|
||||
self.assertEqual(p(45), 315)
|
||||
self.assertEqual(p(55), 68.75)
|
||||
@ -112,6 +114,7 @@ class CompanySimpleTest(TestCase):
|
||||
def test_part_pricing(self):
|
||||
m2x4 = Part.objects.get(name='M2x4 LPHS')
|
||||
|
||||
self.assertEqual(m2x4.get_price_info(5.5), "38.5 - 41.25")
|
||||
self.assertEqual(m2x4.get_price_info(10), "70 - 75")
|
||||
self.assertEqual(m2x4.get_price_info(100), "125 - 350")
|
||||
|
||||
@ -121,7 +124,8 @@ class CompanySimpleTest(TestCase):
|
||||
|
||||
m3x12 = Part.objects.get(name='M3x12 SHCS')
|
||||
|
||||
self.assertIsNone(m3x12.get_price_info(3))
|
||||
self.assertEqual(m3x12.get_price_info(0.3), Decimal('2.4'))
|
||||
self.assertEqual(m3x12.get_price_info(3), Decimal('24'))
|
||||
self.assertIsNotNone(m3x12.get_price_info(50))
|
||||
|
||||
def test_currency_validation(self):
|
||||
|
Reference in New Issue
Block a user