171 lines
4.7 KiB
Python
171 lines
4.7 KiB
Python
# coding=UTF-8
|
|
""" Price formulas """
|
|
|
|
from api.lib.utils import round_half_up
|
|
from api.lib.limits import calculate_canvas_limits
|
|
|
|
|
|
def m2_price(material, market, designer=None, reseller=None, inquiry=None, rounded=True, inc_vat=True):
|
|
""" calculates price per square meter """
|
|
price = material.price / 100.0
|
|
|
|
if designer:
|
|
price *= (float(designer.pricepremium) / 100) + 1
|
|
|
|
if reseller:
|
|
price *= (float(reseller.pricepremium) / 100) + 1
|
|
|
|
if inquiry:
|
|
price *= (float(inquiry.pricepremium) / 100) + 1
|
|
|
|
price *= market.exchange_rate
|
|
price *= market.price_adjustments
|
|
|
|
if inc_vat:
|
|
price *= market.vat
|
|
|
|
if rounded:
|
|
price = round_half_up(price)
|
|
|
|
return price
|
|
|
|
|
|
def wallpaper_price(width, height, material, market, designer=None, reseller=None, inquiry=None, rounded=True, inc_vat=True):
|
|
price = m2_price(material, market, designer, reseller,
|
|
inquiry, rounded=rounded, inc_vat=False)
|
|
|
|
sqm = (width / 100) * (height / 100)
|
|
|
|
if market.territory == "US":
|
|
min_sqm = 2
|
|
else:
|
|
min_sqm = 1
|
|
|
|
sqm = max(sqm, min_sqm)
|
|
|
|
price *= sqm
|
|
|
|
if inc_vat:
|
|
price *= market.vat
|
|
|
|
if rounded:
|
|
price = round(price)
|
|
return price
|
|
|
|
|
|
def canvas_cm2_price(cm2):
|
|
price_cm2_at_1cm2 = 0.2461
|
|
price_cm2_at_5000cm2 = 0.144
|
|
price_cm2_at_10000cm2 = 0.096
|
|
price_cm2_at_22500cm2 = 0.064
|
|
|
|
if cm2 <= 5000:
|
|
diff = price_cm2_at_1cm2 - price_cm2_at_5000cm2
|
|
discount = (diff / 5000) * cm2
|
|
cm2_price = price_cm2_at_1cm2 - discount
|
|
|
|
elif cm2 > 5000 and cm2 <= 10000:
|
|
diff = price_cm2_at_5000cm2 - price_cm2_at_10000cm2
|
|
discount = (diff / 5000) * (cm2 - 5000)
|
|
cm2_price = price_cm2_at_5000cm2 - discount
|
|
|
|
elif cm2 > 10000:
|
|
diff = price_cm2_at_10000cm2 - price_cm2_at_22500cm2
|
|
discount = (diff / 12500) * (cm2 - 10000)
|
|
cm2_price = price_cm2_at_10000cm2 - discount
|
|
|
|
cm2_price = max(cm2_price, 0.064)
|
|
return cm2_price
|
|
|
|
|
|
def canvas_price(width, height, market, framed=True, designer=None, reseller=None, inquiry=None, rounded=True, inc_vat=True):
|
|
cm2 = width * height
|
|
|
|
cm2_price = canvas_cm2_price(cm2)
|
|
|
|
# calculate price for canvas with frame
|
|
price = cm2 * cm2_price
|
|
price = max(price, 341.4848) # the price can never go below 341.4848 SEK
|
|
|
|
if not framed:
|
|
price *= 0.7
|
|
|
|
if designer:
|
|
price *= (float(designer.pricepremium) / 100) + 1
|
|
|
|
if reseller:
|
|
price *= (float(reseller.pricepremium) / 100) + 1
|
|
|
|
if inquiry:
|
|
price *= (float(inquiry.pricepremium) / 100) + 1
|
|
|
|
price *= market.exchange_rate
|
|
price *= market.price_adjustments
|
|
|
|
if inc_vat:
|
|
price *= market.vat
|
|
|
|
if rounded:
|
|
price = round_half_up(price)
|
|
|
|
return price
|
|
|
|
|
|
def canvas_frame_price(width, height, market, reseller=None, rounded=True, inc_vat=True):
|
|
width, height = calculate_canvas_limits(width, height, framed=True)
|
|
cm2 = width * height
|
|
cm2_price = canvas_cm2_price(cm2)
|
|
price = cm2 * cm2_price
|
|
price = max(price, 317.44)
|
|
price *= 0.65
|
|
|
|
if reseller:
|
|
price *= (float(reseller.pricepremium) / 100) + 1
|
|
|
|
price *= market.exchange_rate
|
|
price *= market.price_adjustments
|
|
|
|
if inc_vat:
|
|
price *= market.vat
|
|
|
|
if rounded:
|
|
price = round_half_up(price)
|
|
|
|
return price
|
|
|
|
|
|
def inquiry_price(inquiry, inc_price_retouch=True, rounded=True, inc_vat=True, **kwargs):
|
|
width = kwargs.get('width', inquiry.width)
|
|
height = kwargs.get('height', inquiry.height)
|
|
material = kwargs.get('material', inquiry.material)
|
|
framed = kwargs.get('framed', inquiry.framed)
|
|
reseller = kwargs.get('reseller', inquiry.dealer_store)
|
|
|
|
if inquiry.product_group == 'photo-wallpaper':
|
|
price = wallpaper_price(width, height, material, inquiry.market,
|
|
designer=inquiry.designer, reseller=reseller, inquiry=inquiry, rounded=False, inc_vat=False)
|
|
elif inquiry.product_group == 'canvas':
|
|
price = canvas_price(width, height, inquiry.market,
|
|
designer=inquiry.designer, reseller=reseller, inquiry=inquiry, framed=framed, rounded=False, inc_vat=False)
|
|
else:
|
|
raise ValueError(
|
|
'Invalid product group: {}'.format(inquiry.product_group))
|
|
|
|
effect_price = inquiry.price_effect
|
|
if effect_price:
|
|
price += float(effect_price)
|
|
|
|
if inc_price_retouch:
|
|
retouch_price = inquiry.local_price_retouch(
|
|
rounded=False, inc_vat=False)
|
|
if retouch_price:
|
|
price += retouch_price
|
|
|
|
if inc_vat:
|
|
price *= inquiry.market.vat
|
|
|
|
if rounded:
|
|
price = round_half_up(price)
|
|
|
|
return price
|