Projekt

Allgemein

Profil

Herunterladen (4,06 KB) Statistiken
| Zweig: | Markierung: | Revision:
package SL::PriceSource::Price;

use strict;

use parent 'SL::DB::Object';
use Rose::Object::MakeMethods::Generic (
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
: '';
}

sub full_description {
my ($self) = @_;

$self->price_source
? $self->price_source->description . ': ' . $self->description
: $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
(9-9/12)