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 Rules') }
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 price_from_source {
30 my ($self, $source, $spec) = @_;
32 my $rule = SL::DB::Manager::PriceRule->find_by(id => $spec);
33 $self->make_price_from_rule($rule);
39 $self->make_price_from_rule( min_by { $self->price_for_rule($_) } max_by { $_->priority } @{ $self->available_rules });
43 my ($self, $rule) = @_;
44 $rule->price_or_discount
45 ? (1 - $rule->discount / 100) * ($rule->is_sales ? $self->part->sellprice : $self->part->lastcost)
49 sub make_price_from_rule {
50 my ($self, $rule) = @_;
52 SL::PriceSource::Price->new(
53 price => $self->price_for_rule($rule),
55 description => $rule->name,
56 price_source => $self,