PriceSources: discount_from_source analog zu price_from_source implemeniert.
authorBernd Bleßmann <bernd@kivitendo-premium.de>
Fri, 23 Oct 2015 19:28:23 +0000 (21:28 +0200)
committerBernd Bleßmann <bernd@kivitendo-premium.de>
Fri, 23 Oct 2015 19:50:00 +0000 (21:50 +0200)
Wenn keine zur Rabatt-Quelle passende Klasse gefunden werden kann, wird auch
hier ein spezieller leerer Rabatt zurückgeliefert.

SL/PriceSource.pm
SL/PriceSource/Base.pm
SL/PriceSource/Business.pm
SL/PriceSource/Customer.pm
SL/PriceSource/Makemodel.pm
SL/PriceSource/MasterData.pm
SL/PriceSource/PriceRules.pm
SL/PriceSource/Pricegroup.pm
SL/PriceSource/Vendor.pm
bin/mozilla/io.pl

index 681210c..66daad2 100644 (file)
@@ -31,6 +31,17 @@ sub price_from_source {
     : empty_price();
 }
 
+sub discount_from_source {
+  my ($self, $source) = @_;
+  my ($source_name, $spec) = split m{/}, $source, 2;
+
+  my $class = SL::PriceSource::ALL->price_source_class_by_name($source_name);
+
+  return $class
+    ? $class->new(record_item => $self->record_item, record => $self->record)->discount_from_source($source, $spec)
+    : empty_discount();
+}
+
 sub available_prices {
   map { $_->available_prices } $_[0]->all_price_sources;
 }
@@ -54,6 +65,12 @@ sub empty_price {
   );
 }
 
+sub empty_discount {
+  SL::PriceSource::Discount->new(
+    description => t8('None (PriceSource Discount)'),
+  );
+}
+
 1;
 
 __END__
@@ -136,25 +153,43 @@ not have to be registered in C<record>.
 
 Attempts to retrieve a formerly calculated price with the same conditions
 
+=item C<discount_from_source>
+
+Attempts to retrieve a formerly calculated discount with the same conditions
+
 =item C<available_prices>
 
 Returns all available prices.
 
+=item C<available_discounts>
+
+Returns all available discounts.
+
 =item C<best_price>
 
 Attempts to get the best available price. returns L<empty_price> if no price is found.
 
+=item C<best_discount>
+
+Attempts to get the best available discount. returns L<empty_discount> if no discount is found.
+
 =item C<empty_price>
 
 A special empty price, that does not change the previously entered price, and
 opens the price field to manual changes.
 
+=item C<empty_discount>
+
+A special empty discount, that does not change the previously entered discount, and
+opens the discount field to manual changes.
+
 =back
 
 =head1 SEE ALSO
 
 L<SL::PriceSource::Base>,
 L<SL::PriceSource::Price>,
+L<SL::PriceSource::Discount>,
 L<SL::PriceSource::ALL>
 
 =head1 BUGS AND CAVEATS
index 8233c58..1e8f20d 100644 (file)
@@ -21,6 +21,8 @@ sub best_discounts { die 'best_discounts needs to be implemented' }
 
 sub price_from_source { die 'price_from_source needs to be implemented:' . "@_" }
 
+sub discount_from_source { die 'discount_from_source needs to be implemented:' . "@_" }
+
 sub part {
   $_[0]->record_item->part;
 }
index fc7b298..20a1d54 100644 (file)
@@ -28,7 +28,9 @@ sub available_discounts {
   );
 }
 
-sub price_from_source {
+sub price_from_source { }
+
+sub discount_from_source {
   my ($self, $source, $spec) = @_;
 
   my $business = SL::DB::Business->load_cached($spec);
index 52d35ee..c0cfbc0 100644 (file)
@@ -29,7 +29,9 @@ sub available_discounts {
   );
 }
 
-sub price_from_source {
+sub price_from_source { }
+
+sub discount_from_source {
   my ($self, $source, $spec) = @_;
 
   my $customer = SL::DB::Customer->load_cached($spec);
index 3c5031d..bda7b81 100644 (file)
@@ -39,6 +39,8 @@ sub price_from_source {
 
 }
 
+sub discount_from_source { }
+
 sub best_price {
   my ($self, %params) = @_;
 
index 14fe88f..1305f4b 100644 (file)
@@ -31,6 +31,8 @@ sub price_from_source {
   : do { die "unknown spec '$spec'" };
 }
 
+sub discount_from_source { }
+
 sub best_price {
   $_[0]->record->is_sales
   ? $_[0]->make_sellprice
index e1d1c12..6685578 100644 (file)
@@ -44,12 +44,23 @@ sub available_discounts {
 sub price_from_source {
   my ($self, $source, $spec) = @_;
 
+  my $rule = SL::DB::Manager::PriceRule->find_by(id => $spec);
+  if ($rule->price_type != SL::DB::Manager::PriceRule::PRICE_DISCOUNT()) {
+    return $self->make_price_from_rule($rule);
+  }
+
+  return;
+}
+
+sub discount_from_source {
+  my ($self, $source, $spec) = @_;
+
   my $rule = SL::DB::Manager::PriceRule->find_by(id => $spec);
   if ($rule->price_type == SL::DB::Manager::PriceRule::PRICE_DISCOUNT()) {
     return $self->make_discount_from_rule($rule);
-  } else {
-    return $self->make_price_from_rule($rule);
   }
+
+  return;
 }
 
 sub best_price {
index 2a8adae..6408300 100644 (file)
@@ -44,6 +44,8 @@ sub price_from_source {
   return $self->make_price($price);
 }
 
+sub discount_from_source { }
+
 sub best_price {
   my ($self, %params) = @_;
 
index 0b09ad6..7eee130 100644 (file)
@@ -28,7 +28,9 @@ sub available_discounts {
   );
 }
 
-sub price_from_source {
+sub price_from_source { }
+
+sub discount_from_source {
   my ($self, $source, $spec) = @_;
 
   my $vendor = SL::DB::Vendor->load_cached($spec);
index 4ad3cbf..f42db46 100644 (file)
@@ -345,7 +345,7 @@ sub display_row {
     if ($form->{"id_${i}"} && !$is_delivery_order) {
       my $price_source  = SL::PriceSource->new(record_item => $record_item, record => $record);
       my $price         = $price_source->price_from_source($::form->{"active_price_source_$i"});
-      my $discount      = $price_source->price_from_source($::form->{"active_discount_source_$i"});
+      my $discount      = $price_source->discount_from_source($::form->{"active_discount_source_$i"});
       my $best_price    = $price_source->best_price;
       my $best_discount = $price_source->best_discount;
       $column_data{price_source} .= $cgi->button(-value => $price->source_description, -onClick => "kivi.io.price_chooser($i)");