]> wagnertech.de Git - kivitendo-erp.git/blobdiff - SL/PriceSource/Discount.pm
PriceSource: Rabattbehandlung
[kivitendo-erp.git] / SL / PriceSource / Discount.pm
diff --git a/SL/PriceSource/Discount.pm b/SL/PriceSource/Discount.pm
new file mode 100644 (file)
index 0000000..6c95f90
--- /dev/null
@@ -0,0 +1,142 @@
+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) ],
+);
+
+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 ]}"
+}
+
+1;
+
+__END__
+
+=encoding utf-8
+
+=head1 NAME
+
+SL::PriceSource::Price - contrainer to pass calculated prices around
+
+=head1 SYNOPSIS
+
+  # in PriceSource::Base implementation
+  $price = SL::PriceSource::Price->new(
+    discount     => 10,
+    spec         => 'summersale2014', # something you can easily parse later
+    description  => t8('10% discount during summer sale 2014'),
+    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<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_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<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>.
+
+=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