P5-6370 inquires should use markets instead of territores for calculating prices #36
This commit is contained in:
@@ -4,7 +4,7 @@ from .designer import Designer
|
|||||||
from .category import Category
|
from .category import Category
|
||||||
from .contract_customer import ContractCustomer
|
from .contract_customer import ContractCustomer
|
||||||
from .inquiry import Inquiry
|
from .inquiry import Inquiry
|
||||||
from .product import Material, Product
|
from .product import Material, Product, Currencies
|
||||||
from .order import (
|
from .order import (
|
||||||
Order,
|
Order,
|
||||||
OrderField,
|
OrderField,
|
||||||
|
|||||||
@@ -9,7 +9,9 @@ class Inquiry(db.Model):
|
|||||||
__tablename__ = "inquiries"
|
__tablename__ = "inquiries"
|
||||||
|
|
||||||
id = db.Column("inquiryid", db.Integer, primary_key=True)
|
id = db.Column("inquiryid", db.Integer, primary_key=True)
|
||||||
territory = db.Column(db.String(2))
|
market_id = db.Column(db.Integer, db.ForeignKey("markets.id"))
|
||||||
|
market = db.relationship("Market", backref="inquiries")
|
||||||
|
|
||||||
product_group = db.Column(db.String(100))
|
product_group = db.Column(db.String(100))
|
||||||
price_m2 = db.Column(db.Numeric)
|
price_m2 = db.Column(db.Numeric)
|
||||||
price_effect = db.Column(db.Numeric)
|
price_effect = db.Column(db.Numeric)
|
||||||
@@ -36,13 +38,6 @@ class Inquiry(db.Model):
|
|||||||
product = db.relationship("Product", uselist=False)
|
product = db.relationship("Product", uselist=False)
|
||||||
automated = db.Column(db.Integer, nullable=False, default=0)
|
automated = db.Column(db.Integer, nullable=False, default=0)
|
||||||
|
|
||||||
@property
|
|
||||||
def market(self):
|
|
||||||
market = market_model.from_territory(self.territory)
|
|
||||||
if not market:
|
|
||||||
raise ValueError("Invalid territory: {}".format(self.territory))
|
|
||||||
return market
|
|
||||||
|
|
||||||
def local_price_retouch(self, rounded=True, inc_vat=False):
|
def local_price_retouch(self, rounded=True, inc_vat=False):
|
||||||
""" returns the retouch price in the inquiry local currency """
|
""" returns the retouch price in the inquiry local currency """
|
||||||
if not self.price_retouch:
|
if not self.price_retouch:
|
||||||
|
|||||||
+11
-7
@@ -12,25 +12,29 @@ class Market(db.Model):
|
|||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
name = db.Column(db.String(255))
|
name = db.Column(db.String(255))
|
||||||
vat = db.Column(db.Float, nullable=False)
|
vat = db.Column(db.Float, nullable=False)
|
||||||
price_adjustment = db.Column(db.Float, nullable=False)
|
price_adjustments = db.Column("price_adjustment", db.Float, nullable=False)
|
||||||
currency = db.Column(db.String(3), db.ForeignKey("product-currencies.iso3char"))
|
currency = db.Column(db.String(3), db.ForeignKey("product-currencies.iso3char"))
|
||||||
_pc = db.relationship(Currencies, uselist=False)
|
_pc = db.relationship(Currencies, uselist=False)
|
||||||
exchange_rate = association_proxy("_pc", "exchange_rate", creator=lambda v: Currencies(exchange_rate=v))
|
exchange_rate = association_proxy("_pc", "exchange_rate")
|
||||||
|
|
||||||
@validates("name")
|
|
||||||
def validate_name(self, key, value):
|
|
||||||
raise ValueError("Name can not be modified")
|
|
||||||
|
|
||||||
def to_json(self):
|
def to_json(self):
|
||||||
return {
|
return {
|
||||||
"id": self.id,
|
"id": self.id,
|
||||||
"name": self.name,
|
"name": self.name,
|
||||||
"price_adjustment": str(self.price_adjustment),
|
"price_adjustment": str(self.price_adjustments),
|
||||||
"vat": str(self.vat),
|
"vat": str(self.vat),
|
||||||
"currency": self.currency,
|
"currency": self.currency,
|
||||||
"exchange_rate": str(self.exchange_rate),
|
"exchange_rate": str(self.exchange_rate),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# hack: market need a territory to make it compatible with current price calculations code
|
||||||
|
# this will be removed in P5-6491
|
||||||
|
@property
|
||||||
|
def territory(self):
|
||||||
|
if self.name == 'GLOBAL':
|
||||||
|
return 'EU'
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
class PriceAdjustments(db.Model):
|
class PriceAdjustments(db.Model):
|
||||||
|
|
||||||
|
|||||||
@@ -340,7 +340,6 @@ class TestPrice(unittest2.TestCase):
|
|||||||
with mock.patch.object(Inquiry, "market", nl):
|
with mock.patch.object(Inquiry, "market", nl):
|
||||||
inquiry = Inquiry(
|
inquiry = Inquiry(
|
||||||
product_group="photo-wallpaper",
|
product_group="photo-wallpaper",
|
||||||
territory="NL",
|
|
||||||
pricepremium=0,
|
pricepremium=0,
|
||||||
width=350,
|
width=350,
|
||||||
height=270,
|
height=270,
|
||||||
@@ -373,7 +372,6 @@ class TestPrice(unittest2.TestCase):
|
|||||||
with mock.patch.object(Inquiry, "market", sweden):
|
with mock.patch.object(Inquiry, "market", sweden):
|
||||||
inquiry = Inquiry(
|
inquiry = Inquiry(
|
||||||
product_group="photo-wallpaper",
|
product_group="photo-wallpaper",
|
||||||
territory="SE",
|
|
||||||
pricepremium=0,
|
pricepremium=0,
|
||||||
width=350,
|
width=350,
|
||||||
height=280,
|
height=280,
|
||||||
@@ -393,7 +391,6 @@ class TestPrice(unittest2.TestCase):
|
|||||||
with mock.patch.object(Inquiry, "market", sweden):
|
with mock.patch.object(Inquiry, "market", sweden):
|
||||||
inquiry = Inquiry(
|
inquiry = Inquiry(
|
||||||
product_group="photo-wallpaper",
|
product_group="photo-wallpaper",
|
||||||
territory="SE",
|
|
||||||
pricepremium=25,
|
pricepremium=25,
|
||||||
width=250,
|
width=250,
|
||||||
height=400,
|
height=400,
|
||||||
@@ -412,7 +409,6 @@ class TestPrice(unittest2.TestCase):
|
|||||||
with mock.patch.object(Inquiry, "market", sweden):
|
with mock.patch.object(Inquiry, "market", sweden):
|
||||||
inquiry = Inquiry(
|
inquiry = Inquiry(
|
||||||
product_group="canvas",
|
product_group="canvas",
|
||||||
territory="SE",
|
|
||||||
width=100,
|
width=100,
|
||||||
height=100,
|
height=100,
|
||||||
framed=True,
|
framed=True,
|
||||||
@@ -472,7 +468,6 @@ class TestPrice(unittest2.TestCase):
|
|||||||
with mock.patch.object(Inquiry, "market", sweden):
|
with mock.patch.object(Inquiry, "market", sweden):
|
||||||
inquiry = Inquiry(
|
inquiry = Inquiry(
|
||||||
product_group="poster",
|
product_group="poster",
|
||||||
territory="SE",
|
|
||||||
width=30,
|
width=30,
|
||||||
height=40,
|
height=40,
|
||||||
hanger=True,
|
hanger=True,
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
# coding=UTF-8
|
|
||||||
|
|
||||||
import unittest2
|
|
||||||
from api.models import Market
|
|
||||||
|
|
||||||
|
|
||||||
class TestMarket(unittest2.TestCase):
|
|
||||||
def test_exchange_rate(self):
|
|
||||||
market = Market(exchange_rate=0.123)
|
|
||||||
self.assertEqual(0.123, market.exchange_rate)
|
|
||||||
@@ -1,9 +1,8 @@
|
|||||||
import json
|
import json
|
||||||
import flask_testing
|
import flask_testing
|
||||||
from api import create_app, db
|
from api import create_app, db
|
||||||
from api.models.product import Material, Product
|
from api.models.product import Material, Product, Currencies
|
||||||
from api.models.inquiry import Inquiry
|
from api.models import Inquiry, Designer, Market
|
||||||
from api.models.designer import Designer
|
|
||||||
from api.lib import pwinty
|
from api.lib import pwinty
|
||||||
|
|
||||||
|
|
||||||
@@ -24,9 +23,12 @@ class TestEndpoints(flask_testing.TestCase):
|
|||||||
db.session.commit()
|
db.session.commit()
|
||||||
return material
|
return material
|
||||||
|
|
||||||
def _add_inquiry(self, territory, product_group, price_retouch=100):
|
def _add_inquiry(self, product_group, price_retouch=100):
|
||||||
|
currency = Currencies(iso3char="SEK", exchange_rate=1)
|
||||||
|
db.session.add(currency)
|
||||||
|
market = Market(name="SE", vat=1.25, currency='SEK', price_adjustments=1)
|
||||||
inquiry = Inquiry(
|
inquiry = Inquiry(
|
||||||
territory=territory,
|
market=market,
|
||||||
product_group=product_group,
|
product_group=product_group,
|
||||||
price_retouch=price_retouch,
|
price_retouch=price_retouch,
|
||||||
)
|
)
|
||||||
@@ -192,20 +194,20 @@ class TestEndpoints(flask_testing.TestCase):
|
|||||||
def test_inquiry_wallpaper(self):
|
def test_inquiry_wallpaper(self):
|
||||||
self._add_material("standard-wallpaper", 1, 236)
|
self._add_material("standard-wallpaper", 1, 236)
|
||||||
self._add_material("premium-wallpaper", 1, 260)
|
self._add_material("premium-wallpaper", 1, 260)
|
||||||
self._add_inquiry(territory="SE", product_group="photo-wallpaper")
|
self._add_inquiry(product_group="photo-wallpaper")
|
||||||
response = self.client.get("/prices/inquiry/1?width=100&height=100")
|
response = self.client.get("/prices/inquiry/1?width=100&height=100")
|
||||||
self.assert200(response)
|
self.assert200(response)
|
||||||
self.assertEqual("wallpaper", response.json["group"])
|
self.assertEqual("wallpaper", response.json["group"])
|
||||||
|
|
||||||
def test_inquiry_canvas(self):
|
def test_inquiry_canvas(self):
|
||||||
self._add_material("standard-canvas", 2, 799.2)
|
self._add_material("standard-canvas", 2, 799.2)
|
||||||
self._add_inquiry(territory="SE", product_group="canvas")
|
self._add_inquiry(product_group="canvas")
|
||||||
response = self.client.get("/prices/inquiry/1?width=100&height=100")
|
response = self.client.get("/prices/inquiry/1?width=100&height=100")
|
||||||
self.assert200(response)
|
self.assert200(response)
|
||||||
self.assertEqual("canvas", response.json["group"])
|
self.assertEqual("canvas", response.json["group"])
|
||||||
|
|
||||||
def test_inquiry_poster(self):
|
def test_inquiry_poster(self):
|
||||||
self._add_inquiry(territory="SE", product_group="poster")
|
self._add_inquiry(product_group="poster")
|
||||||
response = self.client.get("/prices/inquiry/1?width=100&height=100")
|
response = self.client.get("/prices/inquiry/1?width=100&height=100")
|
||||||
self.assert200(response)
|
self.assert200(response)
|
||||||
self.assertEqual("poster", response.json["group"])
|
self.assertEqual("poster", response.json["group"])
|
||||||
|
|||||||
Reference in New Issue
Block a user