Skip to content

Commit

Permalink
Stamp configurator imp p9 ala (oerp-odoo#35)
Browse files Browse the repository at this point in the history
* [ADD] product_stamp_configurator_sale_stock: init

Integrates with inventory:

* Can specify default ``Product Routes`` in stamp configurator, to set
  it when creating stamp products via configurator.

* [ADD] product_stamp_configurator_sale_purchase:init

Integrates with purchase:

* Can select default vendor to set on created products via configurator.
* Can set ``Subcontract Service`` as default in stamp configurator, to
  set it when creating stamp products via configurator for mold
  products. If this option is set, default vendor will need to be
  selected as well.

* [ADD] product_stamp_configurator: cost

Now we have margin_ratio to differentiate between selling price and cost
if margin ratio is chosen different than 1.0.

We also use calculated cost to set vendor price on product if vendor
is used.
  • Loading branch information
oerp-odoo authored Mar 27, 2024
1 parent ecaf7d2 commit 9dc3083
Show file tree
Hide file tree
Showing 30 changed files with 649 additions and 90 deletions.
33 changes: 15 additions & 18 deletions product_stamp_configurator/stamp/price.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,37 @@
from ..const import DEFAULT_PRICE_DIGITS


def calc_die_price(stamp_cfg, digits=DEFAULT_PRICE_DIGITS):
def calc_die_price(stamp_cfg, digits=DEFAULT_PRICE_DIGITS, with_margin=True):
material_price = _calc_material_price(stamp_cfg)
pricelist_price = _calc_pricelist_die_price(stamp_cfg)
coefficient = stamp_cfg.difficulty_id.coefficient
if stamp_cfg.design_id.flat_embossed_foiling:
pricelist_price = _calc_flat_embossed_foiling_price(stamp_cfg, pricelist_price)
finishing_price = _calc_finishing_price(stamp_cfg)
price = material_price + pricelist_price * coefficient + finishing_price
# TODO: its a bit redundant to copy paste this part in all three
# price calc functions.
if with_margin:
price = _calc_price_with_margin(stamp_cfg, price)
return float_round(price, precision_digits=digits)


def calc_counter_die_price(stamp_cfg, digits=DEFAULT_PRICE_DIGITS):
def calc_counter_die_price(stamp_cfg, digits=DEFAULT_PRICE_DIGITS, with_margin=True):
pricelist = stamp_cfg.partner_id.property_stamp_pricelist_id
price = stamp_cfg.area_priced * pricelist.price_counter_die
if with_margin:
price = _calc_price_with_margin(stamp_cfg, price)
return float_round(price, precision_digits=digits)


def calc_mold_price(stamp_cfg, digits=DEFAULT_PRICE_DIGITS):
def calc_mold_price(stamp_cfg, digits=DEFAULT_PRICE_DIGITS, with_margin=True):
if _calc_is_mold_free(stamp_cfg):
return 0.0
die_price = calc_die_price(stamp_cfg)
pricelist = stamp_cfg.partner_id.property_stamp_pricelist_id
price = die_price * pricelist.mold_of_die_perc / 100
if with_margin:
price = _calc_price_with_margin(stamp_cfg, price)
return float_round(price, precision_digits=digits)


Expand All @@ -54,21 +62,6 @@ def convert_price_sqcm_to_unit(stamp_cfg, price_sqcm, digits=DEFAULT_PRICE_DIGIT
return float_round(price_unit, precision_digits=digits)


def calc_price_sqcm_and_price_unit(
stamp_cfg, price_sqcm_custom, price_unit_suggested, digits=DEFAULT_PRICE_DIGITS
):
"""Get prices either using custom square cm price or suggested unit price."""
if price_sqcm_custom:
price_unit = convert_price_sqcm_to_unit(
stamp_cfg, price_sqcm_custom, digits=digits
)
return (price_sqcm_custom, price_unit)
price_sqcm = convert_price_unit_to_sqcm(
stamp_cfg, price_unit_suggested, digits=digits
)
return (price_sqcm, price_unit_suggested)


def calc_discount_percent(orig_price, discounted_price):
if not orig_price:
return 0
Expand All @@ -92,6 +85,10 @@ def _calc_material_price(stamp_cfg):
return stamp_cfg.area_priced * stamp_cfg.material_id.price


def _calc_price_with_margin(stamp_cfg, price):
return stamp_cfg.margin_ratio * price


def _calc_pricelist_die_price(stamp_cfg, design=None):
partner = stamp_cfg.partner_id
pricelist = partner.property_stamp_pricelist_id
Expand Down
50 changes: 49 additions & 1 deletion product_stamp_configurator/tests/test_stamp_configure.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ def test_01_stamp_configure_die_with_counter_die_and_mold(self):
self.assertEqual(cfg.price_unit_die, 33.0)
self.assertEqual(cfg.price_unit_counter_die, 12.0)
self.assertEqual(cfg.price_unit_mold, 0.0)
self.assertEqual(cfg.cost_unit_die, 33.0)
self.assertEqual(cfg.cost_unit_counter_die, 12.0)
self.assertEqual(cfg.cost_unit_mold, 0.0)
# Other asserts.
self.assertEqual(cfg.category_counter_die_id, self.product_categ_furniture)
self.assertEqual(cfg.category_mold_id, self.product_categ_service)
Expand Down Expand Up @@ -427,6 +430,9 @@ def test_10_stamp_configure_die_with_counter_die_and_mold_custom_prices(self):
self.assertEqual(cfg.price_unit_die, 15.0)
self.assertEqual(cfg.price_unit_counter_die, 30.0)
self.assertEqual(cfg.price_unit_mold, 45.0)
self.assertEqual(cfg.cost_unit_die, 15.0)
self.assertEqual(cfg.cost_unit_counter_die, 30.0)
self.assertEqual(cfg.cost_unit_mold, 45.0)
# Other asserts.
self.assertEqual(cfg.category_counter_die_id, self.product_categ_furniture)
self.assertEqual(cfg.category_mold_id, self.product_categ_service)
Expand Down Expand Up @@ -476,7 +482,49 @@ def test_10_stamp_configure_die_with_counter_die_and_mold_custom_prices(self):
self.assertEqual(product_mold.categ_id, self.product_categ_service)
self.assertFalse(cfg.is_insert_die)

def test_11_stamp_configure_die_translated_products(self):
def test_11_stamp_price_cost_with_margin(self):
# GIVEN, WHEN
cfg = self.StampConfigure.create(
{
'sequence': 1,
'partner_id': self.partner_azure.id,
# die_id omitted, expecting to use default from settings.
'design_id': self.stamp_design_f.id,
'material_id': self.stamp_material_brass_7.id,
'material_counter_id': self.stamp_material_plastic_05.id,
'difficulty_id': self.stamp_difficulty_a.id,
'size_length': 15,
'size_width': 10,
'quantity_dies': 10,
'quantity_spare_dies': 3,
'quantity_counter_dies': 10,
'quantity_counter_spare_dies': 10,
'origin': '1111',
'ref': '2222',
'quantity_mold': 1,
'price_sqcm_die_custom': 0.1,
'price_sqcm_counter_die_custom': 0.2,
'price_sqcm_mold_custom': 0.3,
# To make price higher than cost.
'margin_ratio': 1.2,
}
)
# THEN
# Prices on configurator itself.
self.assertEqual(cfg.price_sqcm_die_suggested, 0.26)
self.assertEqual(cfg.price_sqcm_counter_die_suggested, 0.1)
self.assertEqual(cfg.price_sqcm_mold_suggested, 0.0)
self.assertEqual(cfg.price_sqcm_die_custom, 0.1)
self.assertEqual(cfg.price_sqcm_counter_die_custom, 0.2)
self.assertEqual(cfg.price_sqcm_mold_custom, 0.3)
self.assertEqual(cfg.price_unit_die, 18.0)
self.assertEqual(cfg.price_unit_counter_die, 36.0)
self.assertEqual(cfg.price_unit_mold, 54.0)
self.assertEqual(cfg.cost_unit_die, 15.0)
self.assertEqual(cfg.cost_unit_counter_die, 30.0)
self.assertEqual(cfg.cost_unit_mold, 45.0)

def test_12_stamp_configure_die_translated_products(self):
# GIVEN
self.stamp_die_default.update_field_translations('name', {'lt_LT': 'Klišė'})
self.stamp_design_f.update_field_translations('name', {'lt_LT': 'HFS_LT'})
Expand Down
Loading

0 comments on commit 9dc3083

Please sign in to comment.