diff --git a/modules/purchase_trade/pricing.py b/modules/purchase_trade/pricing.py index f5ef713..b0e8262 100755 --- a/modules/purchase_trade/pricing.py +++ b/modules/purchase_trade/pricing.py @@ -1551,10 +1551,12 @@ class Trigger(ModelSQL,ModelView): def default_average(cls): return True - @fields.depends('pricing_period') - def on_change_with_application_period(self): - if not self.application_period and self.pricing_period: - return self.pricing_period + @fields.depends('pricing_period', 'application_period') + def on_change_with_application_period(self): + if self.application_period: + return self.application_period + if self.pricing_period: + return self.pricing_period @fields.depends('from_p', 'from_a', 'application_period') def on_change_from_p(self): @@ -1727,14 +1729,16 @@ class Period(ModelSQL,ModelView): current -= datetime.timedelta(days=7) elif self.nb_quotation: - current = t - datetime.timedelta(days=1) + step = 1 if self.nb_quotation > 0 else -1 + current = t + datetime.timedelta(days=step) while len(dates) < abs(self.nb_quotation): date = datetime.datetime( current.year, current.month, current.day) if self._calendar_is_quote(cal, date): dates.append(date) - current -= datetime.timedelta(days=1) - dates.reverse() + current += datetime.timedelta(days=step) + if self.nb_quotation < 0: + dates.reverse() else: if self.startday == 'before': date_from = t - datetime.timedelta(days=(self.nbds if self.nbds else 0)) diff --git a/modules/purchase_trade/tests/test_module.py b/modules/purchase_trade/tests/test_module.py index e5dd075..d78c226 100644 --- a/modules/purchase_trade/tests/test_module.py +++ b/modules/purchase_trade/tests/test_module.py @@ -3359,13 +3359,13 @@ class PurchaseTradeTestCase(ModuleTestCase): datetime.date(2026, 4, 3), ]) - def test_pricing_period_blank_every_uses_available_dates_before_trigger(self): - 'Blank Every and Nb quotation returns available dates before trigger' + def test_pricing_period_blank_every_positive_uses_available_dates_after_trigger(self): + 'Blank Every and positive Nb quotation returns dates after trigger' Period = Pool().get('pricing.period') calendar = Mock() excluded = { - datetime.date(2026, 4, 8), - datetime.date(2026, 4, 10), + datetime.date(2026, 5, 14), + datetime.date(2026, 5, 16), } calendar.IsQuote = Mock( side_effect=lambda date: date.date() not in excluded) @@ -3374,15 +3374,15 @@ class PurchaseTradeTestCase(ModuleTestCase): period.every = None period.nb_quotation = 4 - _, _, dates = period.getDates(datetime.date(2026, 4, 13), calendar) + _, _, dates = period.getDates(datetime.date(2026, 5, 12), calendar) self.assertEqual( [date.date() for date in dates], [ - datetime.date(2026, 4, 6), - datetime.date(2026, 4, 7), - datetime.date(2026, 4, 9), - datetime.date(2026, 4, 12), + datetime.date(2026, 5, 13), + datetime.date(2026, 5, 15), + datetime.date(2026, 5, 17), + datetime.date(2026, 5, 18), ]) def test_pricing_period_blank_every_negative_uses_available_dates_before_trigger(self): @@ -3393,17 +3393,40 @@ class PurchaseTradeTestCase(ModuleTestCase): period.every = None period.nb_quotation = -4 - _, _, dates = period.getDates(datetime.date(2026, 4, 13)) + _, _, dates = period.getDates(datetime.date(2026, 5, 12)) self.assertEqual( [date.date() for date in dates], [ - datetime.date(2026, 4, 9), - datetime.date(2026, 4, 10), - datetime.date(2026, 4, 11), - datetime.date(2026, 4, 12), + datetime.date(2026, 5, 8), + datetime.date(2026, 5, 9), + datetime.date(2026, 5, 10), + datetime.date(2026, 5, 11), ]) + def test_pricing_trigger_application_period_defaults_to_pricing_period(self): + 'application period defaults to pricing period without being cleared' + Trigger = Pool().get('pricing.trigger') + trigger = Trigger() + trigger.pricing_period = Mock(id=21) + trigger.application_period = None + + self.assertEqual( + trigger.on_change_with_application_period(), + trigger.pricing_period) + + def test_pricing_trigger_application_period_keeps_existing_value(self): + 'application period keeps explicit value when pricing period changes' + Trigger = Pool().get('pricing.trigger') + application_period = Mock(id=22) + trigger = Trigger() + trigger.pricing_period = Mock(id=21) + trigger.application_period = application_period + + self.assertEqual( + trigger.on_change_with_application_period(), + application_period) + def test_purchase_line_get_avg_accepts_decimal_matrix_prices(self): 'purchase pricing averages Decimal matrix prices without float mixing' PurchaseLine = Pool().get('purchase.line')