Files
api2/api/lib/prices.py
T

363 lines
9.6 KiB
Python

# coding=UTF-8
""" Price formulas """
from api.lib.utils import round_half_up
from api.models.external_print_product import get_external_print_product
from api.models.price_adjustments import get_price_adjustment
from api.models.prices import get_wallpaper_m2_price, get_external_product_price, get_own_image_wallpaper_m2_price, get_external_product_own_image_price
def wallpaper_m2_price_new(
product_id,
material_id,
market,
inquiry=None,
):
own_image = inquiry is not None and inquiry.productId is None
if own_image:
price_m2_incl_vat = get_own_image_wallpaper_m2_price(material_id, market.id)
segment = "OWN-IMAGE"
else:
prices = get_wallpaper_m2_price(product_id, material_id, market.id)
price_m2_incl_vat = prices["price"]
segment = prices["segment"]
price_m2_excl_vat = price_m2_incl_vat / market.vat
segment_price = price_m2_incl_vat
if inquiry:
inquiry_premium = (float(inquiry.pricepremium) / 100) + 1
price_m2_excl_vat = price_m2_excl_vat * inquiry_premium
price_m2_incl_vat = price_m2_excl_vat * market.vat
return {
"incl_vat": price_m2_incl_vat,
"excl_vat": price_m2_excl_vat,
"segment": segment,
"segment_price": segment_price,
}
def wallpaper_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_wallpaper) / 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
inquiry_or_product_key = "product" if inquiry is None else "inquiry"
price *= get_price_adjustment(market.name, material.name, inquiry_or_product_key)
if inc_vat:
price *= market.vat
if rounded:
price = round_half_up(price)
return price
def wallpaper_price_new(
product_id,
width,
height,
material,
market,
unit,
inquiry=None,
):
m2_prices = wallpaper_m2_price_new(product_id, material.id, market, inquiry)
if (unit == 'inch'):
width = width * 2.54
height = height * 2.54
sqm = (width / 100) * (height / 100)
# 0.09 m2 = 30x30 cm, which means we can accept 1 sq feet (0.0929 m2)
min_sqm = 0.09
sqm = max(sqm, min_sqm)
price_excl_vat = m2_prices["excl_vat"] * sqm
price_incl_vat = price_excl_vat * market.vat
return {
"incl_vat": price_incl_vat,
"excl_vat": price_excl_vat,
"m2_price_incl_vat": m2_prices["incl_vat"],
"m2_price_excl_vat": m2_prices["excl_vat"],
"segment": m2_prices["segment"],
"segment_price": m2_prices["incl_vat"],
}
def wallpaper_price(
width,
height,
material,
market,
designer=None,
reseller=None,
inquiry=None,
rounded=True,
inc_vat=True,
):
price = wallpaper_m2_price(
material, market, designer, reseller, inquiry, rounded=False, inc_vat=False
)
sqm = (width / 100) * (height / 100)
min_sqm = 1
sqm = max(sqm, min_sqm)
price *= sqm
if inc_vat:
price *= market.vat
if rounded:
price = round(price)
return price
def _designer_pricepremium(designer, group_id):
if group_id in [1,3,6]:
return designer.pricepremium_wallpaper
if group_id == 2:
return designer.pricepremium_canvas
if group_id == 7:
return designer.pricepremium_poster
if group_id == 8:
return designer.pricepremium_framed_print
raise ValueError("Unexpected group id: {}".format(group_id))
def external_product_own_image_price(external_product_id, market):
price_incl_vat = get_external_product_own_image_price(external_product_id, market.id)
price_excl_vat = price_incl_vat / market.vat
return {
'incl_vat': price_incl_vat,
'excl_vat': price_excl_vat,
'segment': 'OWN-IMAGE',
'segment_price': price_incl_vat,
}
def external_product_price_new(product_id, external_product_id, market):
prices = get_external_product_price(product_id, external_product_id, market.id)
price_incl_vat = prices['price']
price_excl_vat = price_incl_vat / market.vat
return {
'incl_vat': price_incl_vat,
'excl_vat': price_excl_vat,
'segment': prices['segment'],
'segment_price': price_incl_vat,
}
def external_product_price(
id, market, designer=None, inquiry=None, rounded=True, inc_vat=True
):
external_product = get_external_print_product(id)
price = external_product["price"]
price *= market.price_adjustments
if designer:
designer_pricepremium = _designer_pricepremium(designer, external_product["group_id"])
price *= (float(designer_pricepremium) / 100) + 1
if inquiry:
price *= (float(inquiry.pricepremium) / 100) + 1
price *= market.exchange_rate
if inc_vat:
price *= market.vat
if rounded:
price = round_half_up(price)
return price
def inquiry_price_new(
inquiry, **kwargs
):
width = kwargs.get("width", inquiry.width)
height = kwargs.get("height", inquiry.height)
unit = kwargs.get("unit", None)
material = kwargs.get("material", inquiry.material)
external_id = kwargs.get("external_id")
product_id = inquiry.productId
is_own_image = product_id is None
if external_id:
if not is_own_image:
raise ValueError("Manual inquiries only available for wallpapers")
prices = external_product_own_image_price(external_id, inquiry.market)
return prices
elif inquiry.product_group == "photo-wallpaper":
if is_own_image:
prices = wallpaper_price_new(None, width, height, material, inquiry.market, unit, inquiry)
else:
prices = wallpaper_price_new(product_id, width, height, material, inquiry.market, unit, inquiry)
else:
raise ValueError("Invalid product group: {}".format(inquiry.product_group))
price_excl_vat = prices["excl_vat"]
effect_price = inquiry.price_effect
if effect_price:
price_excl_vat += float(effect_price)
price_excl_retouch_excl_vat = price_excl_vat
price_excl_retouch_incl_vat = price_excl_retouch_excl_vat * inquiry.market.vat
retouch_price = inquiry.local_price_retouch(rounded=False, inc_vat=False)
if retouch_price:
price_excl_vat += retouch_price
price_incl_vat = price_excl_vat * inquiry.market.vat
return {
"incl_vat": price_incl_vat,
"excl_vat": price_excl_vat,
"excl_retouch_incl_vat": price_excl_retouch_incl_vat,
"excl_retouch_excl_vat": price_excl_retouch_excl_vat,
"m2_price_incl_vat": prices["m2_price_incl_vat"],
"m2_price_excl_vat": prices["m2_price_excl_vat"],
"segment": prices["segment"],
"segment_price": prices["segment_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)
reseller = kwargs.get("reseller", inquiry.dealer_store)
external_id = kwargs.get("external_id")
if external_id:
price = external_product_price(
id=external_id,
market=inquiry.market,
designer=inquiry.designer,
inquiry=inquiry,
rounded=False,
inc_vat=False,
)
elif 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,
)
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
def wallpaper_kit_price(
market, reseller=None, rounded=True, inc_vat=True
):
# Prices in local currency
prices = {
'AT': 15.91,
'AU': 23.64,
'BE': 17.25,
'CA': 24,
'CH': 20.91,
'DE': 16.36,
'DK': 132.67,
'EE': 16.96,
'ES': 17.55,
'FI': 17.34,
'FR': 16.22,
'GB': 13.31,
'GLOBAL': 13.45,
'IE': 15.52,
'IT': 17.21,
'LU': 15.88,
'NL': 16.53,
'NO': 154.26,
'PL': 19.31,
'RO': 19.96,
'SE': 159.2,
'SG': 19.81,
'US': 19.81,
}
local_price = prices.get(market.name)
if (local_price):
# Note that the local wallpaper kit prices do not follow usual behaviour of multiplying by market exchange rate
price = local_price
else:
# Default/fallback price
price = prices.get('SE')
price *= market.exchange_rate
price *= market.price_adjustments
if reseller:
price *= (float(reseller.pricepremium) / 100) + 1
if inc_vat:
price *= market.vat
if rounded:
price = round_half_up(price)
return price