Revert "Remove listprice code and read price adjustments from database (#56)" (#57)

This reverts commit cdcefda954.
This commit is contained in:
Fredrik Ringqvist
2022-06-08 14:34:11 +02:00
committed by GitHub
parent cdcefda954
commit 292726e8c3
4 changed files with 83 additions and 39 deletions
+12 -3
View File
@@ -1,10 +1,15 @@
# coding=UTF-8 # coding=UTF-8
""" Price formulas """ """ Price formulas """
from api.lib.utils import round_half_up import yaml
from api.lib.utils import lru_with_ttl, round_half_up
from api.models.external_print_product import get_external_print_product from api.models.external_print_product import get_external_print_product
from api.models.price_adjustments import get_price_adjustment
@lru_with_ttl(ttl_seconds=3600)
def get_adjustment_config():
with open("api/resources/price-adjustments.yaml") as f:
return yaml.load(f, Loader=yaml.FullLoader)
def wallpaper_m2_price( def wallpaper_m2_price(
material, material,
market, market,
@@ -29,8 +34,12 @@ def wallpaper_m2_price(
price *= market.exchange_rate price *= market.exchange_rate
price *= market.price_adjustments price *= market.price_adjustments
adjustment_config = get_adjustment_config()
inquiry_or_product_key = "product" if inquiry is None else "inquiry" inquiry_or_product_key = "product" if inquiry is None else "inquiry"
price *= get_price_adjustment(market.name, material.name, inquiry_or_product_key)
adj_value = adjustment_config.get(material.name).get(inquiry_or_product_key).get(market.name, 1.0)
price *= adj_value
if inc_vat: if inc_vat:
price *= market.vat price *= market.vat
-34
View File
@@ -1,34 +0,0 @@
# coding=UTF-8
from api.extensions import db
from api.lib.utils import lru_with_ttl
@lru_with_ttl(ttl_seconds=3600)
def get_adjustment_config():
sql = """
select
material, product_type, markets.name, price_adjustments.value
from
price_adjustments
join "product-materials" on material_id = materialid
join markets on market_id = markets.id
"""
result = db.session.execute(sql)
rows = result.fetchall()
config = {}
for row in rows:
[material, product_type, market, value] = row
if material not in config:
config[material] = {}
if product_type not in config[material]:
config[material][product_type] = {}
config[material][product_type][market] = float(value)
return config
def get_price_adjustment(market, product_type, material):
config = get_adjustment_config()
return config.get(material, {}).get(product_type, {}).get(market, 1.0)
+20
View File
@@ -0,0 +1,20 @@
standard-wallpaper:
inquiry:
IT: 1.1034
GB: 1.1154
DE: 1.0625
product:
GB: 1.1154
DE: 1.0625
premium-wallpaper:
inquiry:
IT: 1.1250
SE: 1.0462
GB: 1.1034
DE: 1.1143
NL: 1.0833
product:
GB: 1.1034
DE: 1.1143
SE: 1.0462
NL: 1.0833
+51 -2
View File
@@ -1,12 +1,13 @@
from api.models.external_print_product import get_cheapest_canvas_product, get_cheapest_poster_product from api.models.external_print_product import get_cheapest_canvas_product, get_cheapest_poster_product
from flask import Blueprint, request, jsonify from flask import Blueprint, request, jsonify, abort
from api.helpers import check_api_key from api.helpers import check_api_key
from api.validators import validate_number, validate_exists from api.validators import validate_number, validate_any_of, validate_exists
from api.models import ( from api.models import (
Inquiry, Inquiry,
Market, Market,
Material, Material,
Product, Product,
PrintProduct,
ContractCustomer, ContractCustomer,
) )
from api.lib.prices import ( from api.lib.prices import (
@@ -261,6 +262,54 @@ def inquiry(inquiry_id):
return jsonify(data) return jsonify(data)
@mod.route("/list-prices/<int:market_id>/wallpaper")
def list_prices_wallpaper(market_id):
wallpapers = PrintProduct.query.wallpapers().all()
result = {}
material = Material.query.filter(Material.name == "standard-wallpaper").one()
market = Market.query.get_or_404(market_id)
for wallpaper in wallpapers:
result[wallpaper.id] = wallpaper_m2_price(
material=material, market=market, designer=wallpaper.product.designer
)
return jsonify(result)
@mod.route("/list-prices/<int:market_id>/canvas_external")
def list_prices_canvas_external(market_id):
canvases = PrintProduct.query.canvases().all()
market = Market.query.get_or_404(market_id)
external_product_id = get_cheapest_canvas_product()
result = {}
for canvas in canvases:
result[canvas.id] = external_product_price(
id = external_product_id,
market=market,
designer=canvas.product.designer
)
return jsonify(result)
@mod.route("/list-prices/<int:market_id>/poster_external")
def list_prices_poster_external(market_id):
posters = PrintProduct.query.posters().all()
market = Market.query.get_or_404(market_id)
external_product_id = get_cheapest_poster_product()
result = {}
for poster in posters:
result[poster.id] = external_product_price(
id = external_product_id,
market=market,
designer=poster.product.designer
)
return jsonify(result)
@mod.route("/external-product", methods=["GET"]) @mod.route("/external-product", methods=["GET"])
@validate_exists("market") @validate_exists("market")
@validate_exists("id") @validate_exists("id")