diff --git a/modules/purchase_trade/__init__.py b/modules/purchase_trade/__init__.py index 0a4126c..c22cc52 100755 --- a/modules/purchase_trade/__init__.py +++ b/modules/purchase_trade/__init__.py @@ -3,9 +3,10 @@ from trytond.pool import Pool -from . import ( - account, - purchase, +from . import ( + account, + configuration, + purchase, sale, global_reporting, stock, @@ -54,9 +55,10 @@ def register(): incoming.ImportSwift, lc.LCMT700, lc.LCMessage, - lc.CreateLCStart, - global_reporting.GRConfiguration, - module='purchase_trade', type_='model') + lc.CreateLCStart, + global_reporting.GRConfiguration, + configuration.Configuration, + module='purchase_trade', type_='model') Pool.register( incoming.ImportSwift, incoming.PrepareDocuments, diff --git a/modules/purchase_trade/configuration.py b/modules/purchase_trade/configuration.py new file mode 100644 index 0000000..2eda67c --- /dev/null +++ b/modules/purchase_trade/configuration.py @@ -0,0 +1,8 @@ +from trytond.model import ModelSingleton, ModelSQL, ModelView, fields + + +class Configuration(ModelSingleton, ModelSQL, ModelView): + "Purchase Trade Configuration" + __name__ = 'purchase_trade.configuration' + + pricing_rule = fields.Text("Pricing Rule") diff --git a/modules/purchase_trade/configuration.xml b/modules/purchase_trade/configuration.xml new file mode 100644 index 0000000..82bf9d7 --- /dev/null +++ b/modules/purchase_trade/configuration.xml @@ -0,0 +1,27 @@ + + + + purchase_trade.configuration + form + configuration_form + + + + Pricing Configuration + purchase_trade.configuration + + + + + + + + + + diff --git a/modules/purchase_trade/purchase.py b/modules/purchase_trade/purchase.py index 9b123ca..b9433e2 100755 --- a/modules/purchase_trade/purchase.py +++ b/modules/purchase_trade/purchase.py @@ -1026,10 +1026,18 @@ class QualityAnalysis(ModelSQL,ModelView): )) return " | ".join(filter(None, values)) -class Line(metaclass=PoolMeta): - __name__ = 'purchase.line' - - quantity_theorical = fields.Numeric("Contractual Qt", digits='unit', readonly=False) +class Line(metaclass=PoolMeta): + __name__ = 'purchase.line' + + @classmethod + def default_pricing_rule(cls): + Configuration = Pool().get('purchase_trade.configuration') + configurations = Configuration.search([], limit=1) + if configurations: + return configurations[0].pricing_rule or '' + return '' + + quantity_theorical = fields.Numeric("Contractual Qt", digits='unit', readonly=False) price_type = fields.Selection([ ('cash', 'Cash Price'), ('priced', 'Priced'), @@ -1099,7 +1107,8 @@ class Line(metaclass=PoolMeta): 'required': Eval('enable_linked_currency'), }, depends=['enable_linked_currency']) premium = fields.Numeric("Premium/Discount",digits='unit') - fee_ = fields.Many2One('fee.fee',"Fee") + fee_ = fields.Many2One('fee.fee',"Fee") + pricing_rule = fields.Text("Pricing description") attributes = fields.Dict( 'product.attribute', 'Attributes', @@ -1137,9 +1146,16 @@ class Line(metaclass=PoolMeta): ('umpire', 'Umpire'), ], "Type") - @classmethod - def default_finished(cls): - return False + @classmethod + def default_finished(cls): + return False + + @property + def report_fixing_rule(self): + pricing_rule = '' + if self.pricing_rule: + pricing_rule = self.pricing_rule + return pricing_rule @fields.depends('product') diff --git a/modules/purchase_trade/sale.py b/modules/purchase_trade/sale.py index 0b18cae..3de8ca9 100755 --- a/modules/purchase_trade/sale.py +++ b/modules/purchase_trade/sale.py @@ -746,10 +746,18 @@ class PriceComposition(metaclass=PoolMeta): sale_line = fields.Many2One('sale.line',"Sale line") -class SaleLine(metaclass=PoolMeta): - __name__ = 'sale.line' - - del_period = fields.Many2One('product.month',"Delivery Period") +class SaleLine(metaclass=PoolMeta): + __name__ = 'sale.line' + + @classmethod + def default_pricing_rule(cls): + Configuration = Pool().get('purchase_trade.configuration') + configurations = Configuration.search([], limit=1) + if configurations: + return configurations[0].pricing_rule or '' + return '' + + del_period = fields.Many2One('product.month',"Delivery Period") lots = fields.One2Many('lot.lot','sale_line',"Lots",readonly=True) fees = fields.One2Many('fee.fee', 'sale_line', 'Fees') quantity_theorical = fields.Numeric("Th. quantity", digits='unit', readonly=True) diff --git a/modules/purchase_trade/tests/test_module.py b/modules/purchase_trade/tests/test_module.py index 34ce163..699249c 100644 --- a/modules/purchase_trade/tests/test_module.py +++ b/modules/purchase_trade/tests/test_module.py @@ -156,6 +156,34 @@ class PurchaseTradeTestCase(ModuleTestCase): sale.crop.name = 'Main Crop' self.assertEqual(sale.report_crop_name, 'Main Crop') + def test_sale_line_default_pricing_rule_comes_from_configuration(self): + 'sale line pricing_rule defaults to the purchase_trade singleton value' + SaleLine = Pool().get('sale.line') + config = Mock(pricing_rule='Default pricing rule') + configuration_model = Mock() + configuration_model.search.return_value = [config] + + with patch( + 'trytond.modules.purchase_trade.sale.Pool' + ) as PoolMock: + PoolMock.return_value.get.return_value = configuration_model + self.assertEqual( + SaleLine.default_pricing_rule(), 'Default pricing rule') + + def test_purchase_line_default_pricing_rule_comes_from_configuration(self): + 'purchase line pricing_rule defaults to the purchase_trade singleton value' + PurchaseLine = Pool().get('purchase.line') + config = Mock(pricing_rule='Default pricing rule') + configuration_model = Mock() + configuration_model.search.return_value = [config] + + with patch( + 'trytond.modules.purchase_trade.purchase.Pool' + ) as PoolMock: + PoolMock.return_value.get.return_value = configuration_model + self.assertEqual( + PurchaseLine.default_pricing_rule(), 'Default pricing rule') + def test_sale_report_multi_line_helpers_aggregate_all_lines(self): 'sale report helpers aggregate quantity, price lines and shipment periods' Sale = Pool().get('sale.sale') diff --git a/modules/purchase_trade/tryton.cfg b/modules/purchase_trade/tryton.cfg index 8f43cba..29a59c3 100755 --- a/modules/purchase_trade/tryton.cfg +++ b/modules/purchase_trade/tryton.cfg @@ -10,12 +10,13 @@ depends: lot document_incoming incoterm -xml: - purchase.xml - sale.xml - lot.xml - pricing.xml - stock.xml +xml: + purchase.xml + sale.xml + lot.xml + pricing.xml + configuration.xml + stock.xml workflow.xml lc.xml optional.xml diff --git a/modules/purchase_trade/view/configuration_form.xml b/modules/purchase_trade/view/configuration_form.xml new file mode 100644 index 0000000..af617d4 --- /dev/null +++ b/modules/purchase_trade/view/configuration_form.xml @@ -0,0 +1,5 @@ + +
+