1 package SL::PriceSource::PriceRules;
4 use parent qw(SL::PriceSource::Base);
6 use SL::PriceSource::Price;
7 use SL::Locale::String;
9 use List::UtilsBy qw(min_by max_by);
11 sub name { 'price_rules' }
13 sub description { t8('Price Rule') }
16 my ($self, %params) = @_;
18 SL::DB::Manager::PriceRule->get_all_matching(record => $self->record, record_item => $self->record_item);
21 sub available_prices {
22 my ($self, %params) = @_;
24 my $rules = $self->available_rules;
26 map { $self->make_price_from_rule($_) } @$rules;
29 sub available_discounts { }
31 sub price_from_source {
32 my ($self, $source, $spec) = @_;
34 my $rule = SL::DB::Manager::PriceRule->find_by(id => $spec);
35 $self->make_price_from_rule($rule);
41 my $rules = $self->available_rules;
43 return unless @$rules;
45 my @max_prio = max_by { $_->priority } @$rules;
46 my $min_price = min_by { $self->price_for_rule($_) } @max_prio;
48 $self->make_price_from_rule($min_price);
54 my ($self, $rule) = @_;
55 $rule->price_or_discount
56 ? (1 - $rule->discount / 100) * ($rule->is_sales ? $self->part->sellprice : $self->part->lastcost)
60 sub make_price_from_rule {
61 my ($self, $rule) = @_;
63 SL::PriceSource::Price->new(
64 price => $self->price_for_rule($rule),
66 description => $rule->name,
67 price_source => $self,