use parent 'SL::DB::Object';
use Rose::Object::MakeMethods::Generic (
- scalar => [ qw(price description spec price_source) ],
- array => [ qw(depends_on) ]
+ scalar => [ qw(price description spec price_source invalid missing unknown) ],
+ 'scalar --get_set_init' => [ qw(priority editable) ],
+);
+
+require SL::DB::Helper::Attr;
+SL::DB::Helper::Attr::make(__PACKAGE__,
+ price => 'numeric(15,5)',
);
sub source {
$_[0]->price_source
- ? $_[0]->price_source->name . '/' . $_[0]->spec
+ ? $_[0]->price_source->name . '/' . $_[0]->spec
: '';
}
: $self->description
}
+sub source_description {
+ my ($self) = @_;
+
+ $self->price_source
+ ? $self->price_source->description
+ : $self->description
+}
+
+sub to_str {
+ "source: @{[ $_[0]->source ]}, price: @{[ $_[0]->price ]}, description: @{[ $_[0]->description ]}"
+}
+
+sub init_priority {
+ 3
+}
+
+sub init_editable {
+ 0
+}
+
1;
+
+__END__
+
+=encoding utf-8
+
+=head1 NAME
+
+SL::PriceSource::Price - container to pass calculated prices around
+
+=head1 SYNOPSIS
+
+ # in PriceSource::Base implementation
+ $price = SL::PriceSource::Price->new(
+ price => 10.3,
+ spec => '3', # something you can easily parse later
+ description => t8('Fix price 10.3 for customer 3'),
+ price_source => $self,
+ )
+
+ # special empty price in SL::PriceSource, for internal use.
+ SL::PriceSource::Price->new(
+ description => t8('None (PriceSource)'),
+ );
+
+ # price can't be restored
+ SL::PriceSource::Price->new(
+ missing => t8('Um, sorry, cannot find that one'),
+ price_source => $self,
+ );
+
+ # invalid price
+ SL::PriceSource::Price->new(
+ price => $original_price,
+ spec => $original_spec,
+ description => $original_description,
+ invalid => t8('Offer expired #1 weeks ago', $dt->delta_weeks),
+ price_source => $self,
+ );
+
+=head1 DESCRIPTION
+
+See L<SL::PriceSource> for information about the mechanism.
+
+This is a container for prices that are generated by L<SL::PriceSource::Base>
+implementations.
+
+=head1 CONSTRUCTOR FIELDS
+
+=over 4
+
+=item C<price>
+
+The price. A price of 0 is special and is considered undesirable. If passed as
+part of C<available_prices> it will be filtered out. If returned as
+C<best_price> or C<price_from_source> it will trigger a warning.
+
+=item C<spec>
+
+A unique string that can later be understood by the creating implementation.
+Can be empty if the implementation only supports one price for a given
+record_item.
+
+=item C<description>
+
+A localized short description of the origins of this price.
+
+=item C<price_source>
+
+A ref to the creating algorithm.
+
+=item C<priority>
+
+OPTIONAL. Prices may supply a numerical priority. Higher will trump lower, even when
+supplying higher prices. Defaults to 3 (as in middle of 1-5).
+
+=item C<editable>
+
+OPTIONAL. Prices may flag themselves as editable. An editable price will still
+be subject to checks for higher or lower prices, but will be rendered in a
+fashion that allows the user to overwrite it.
+
+This is potentially very distracting if the price is usually a default price
+and will be changed in a lot of instances so use with caution.
+
+On the other hand it can provide the capability that users unfamiliar with the
+system will intuitively expect so it can be a good way to introduce the system.
+
+=item C<missing>
+
+OPTIONAL. Both indicator and localized message that the price with this spec
+could not be reproduced and should be changed.
+
+If price is missing, you do not need to supply anything except C<source>.
+
+=item C<invalid>
+
+OPTIONAL. Both indicator and localized message that the conditions for this
+price are no longer valid, and that the price should be changed.
+
+If price is missing, you do not need to supply anything except C<source>.
+
+=item C<unknown>
+
+OPTIONAL. Boolean indicator that this price was not computed for performance
+reasons. This is only valid for PriceSources flagged as C<fast>. This price
+must be ignored.
+
+=back
+
+=head1 SEE ALSO
+
+L<SL::PriceSource>,
+L<SL::PriceSource::Base>,
+L<SL::PriceSource::ALL>
+
+=head1 BUGS
+
+None yet. :)
+
+=head1 AUTHOR
+
+Sven Schoeling E<lt>s.schoeling@linet-services.deE<gt>
+
+=cut