|
package SL::PriceSource::Discount;
|
|
|
|
use strict;
|
|
|
|
use parent 'SL::DB::Object';
|
|
use Rose::Object::MakeMethods::Generic (
|
|
scalar => [ qw(discount description spec price_source invalid missing) ],
|
|
'scalar --get_set_init' => [ qw(priority) ],
|
|
);
|
|
|
|
require SL::DB::Helper::Attr;
|
|
SL::DB::Helper::Attr::make(__PACKAGE__,
|
|
discount => '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 ]}, discount: @{[ $_[0]->discount ]}, description: @{[ $_[0]->description ]}"
|
|
}
|
|
|
|
sub init_priority {
|
|
3
|
|
}
|
|
|
|
1;
|
|
|
|
__END__
|
|
|
|
=encoding utf-8
|
|
|
|
=head1 NAME
|
|
|
|
SL::PriceSource::Discount - container to pass calculated discounts around
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
# in PriceSource::Base implementation
|
|
$price = SL::PriceSource::Discount->new(
|
|
discount => 10,
|
|
spec => 'summersale2014', # something you can easily parse later
|
|
description => t8('10% discount during summer sale 2014'),
|
|
price_source => $self,
|
|
)
|
|
|
|
# special empty discount in SL::PriceSource, for internal use.
|
|
SL::PriceSource::Discount->new(
|
|
description => t8('None (PriceSource)'),
|
|
);
|
|
|
|
# price can't be restored
|
|
SL::PriceSource::Discount->new(
|
|
missing => t8('Um, sorry, cannot find that one'),
|
|
price_source => $self,
|
|
);
|
|
|
|
# invalid discount
|
|
SL::PriceSource::Discount->new(
|
|
discount => $original_discount,
|
|
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 discounts that are generated by L<SL::PriceSource::Base>
|
|
implementations.
|
|
|
|
=head1 CONSTRUCTOR FIELDS
|
|
|
|
=over 4
|
|
|
|
=item C<discount>
|
|
|
|
The discount in percent. A discount of 0 will be ignored. If passed as
|
|
part of C<available_prices> it will be filtered out. If returned as
|
|
C<best_discount> or C<discount_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 discount for a given
|
|
record_item.
|
|
|
|
=item C<description>
|
|
|
|
A localized short description of the origins of this discount.
|
|
|
|
=item C<price_source>
|
|
|
|
A ref to the creating algorithm.
|
|
|
|
=item C<priority>
|
|
|
|
OPTIONAL. Discounts may supply a numerical priority. Higher will trump over lower, even when
|
|
supplying lower discounts. Defaults to 3 (as in middle of 1-5).
|
|
|
|
=item C<missing>
|
|
|
|
OPTIONAL. Both indicator and localized message that the discount with this spec
|
|
could not be reproduced and should be changed.
|
|
|
|
If discount 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
|
|
discount are no longer valid, and that the discount should be changed.
|
|
|
|
If discount is missing, you do not need to supply anything except C<source>.
|
|
|
|
=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
|