sub available_prices { die 'available_prices needs to be implemented' }
+sub available_discounts { die 'available_discounts needs to be implemented' }
+
sub best_price { die 'best_price needs to be implemented' }
+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;
}
+sub customer_vendor {
+ $_[0]->record->is_sales ? $_[0]->record->customer : $_[0]->record->vendor;
+}
+
1;
__END__
Shortcut to C<< record_item->part >>
+=item C<customer_vendor>
+
+Shortcut to C<< record->is_sales ? record->customer : record->vendor >>
+
=back
=head1 INTERFACE METHODS
=item C<description>
-Must return a translated name to be used in frontend. Will be used, to
+Must return a translated name to be used in the frontend. Will be used to
distinguish the origin of different prices.
=item C<available_prices>
-Must return a list of all prices that you algorithm can recommend the user
+Must return a list of all prices that your algorithm can recommend to the user
for the current situation. Each price must have a unique spec that can be used
to recreate it later. Try to be brief, no one needs 20 different price
suggestions.
+=item C<available_discounts>
+
+Must return a list of all prices that your algorithm can recommend to the user
+for the current situation. Each discount must have a unique spec that can be
+used to recreate it later. Try to be brief, no one needs 20 different discount
+suggestions.
+
=item C<best_price>
Must return what you think of as the best matching price in your
C<available_prices>. This does not have to be the lowest price, but it will be
compared later to other price sources, and the lowest will be set.
+=item C<best_discount>
+
+Must return what you think of as the best matching discount in your
+C<available_discounts>. This does not have to be the highest discount, but it
+will be compared later to other price sources, and the highest will be set.
+
=item C<price_from_source SOURCE, SPEC>
-Must recreate the price from C<SPEC> and return. For reference, the complete
-C<SOURCE> entry from C<record_item.active_price_source> is included.
+Must recreate the price or discount from C<SPEC> and return. For reference, the
+complete C<SOURCE> entry from C<record_item.active_price_source> or
+C<record_item.active_discount_source> is included.
Note that constraints from the rest of the C<record> do not apply anymore. If
information needed for the retrieval can be deleted elsewhere, then you must
=item *
Be aware that all 8 types of record will be passed to your algorithm. If you
-don't serve some of them, just return emptry lists on C<available_prices> and
+don't serve some of them, just return empty lists on C<available_prices> and
C<best_price>
=item *
=item *
Records will not be calculated. If you need tax data or position totals, you
-need to invoke that for yourself.
+need to invoke that yourself.
=item *
=item *
You do not need to do price factor and row discount calculation. These will be
-done automatically afterwards. You do have to include customer/vendor discount
+done automatically afterwards. You do have to include customer/vendor discounts
if your price interacts with those.
=item *
C<source> and C<spec> are tainted. If you store data directly in C<spec>, sanitize.
+=back
+
=head1 SEE ALSO
L<SL::PriceSource>,