A discount is an important business concept. It can be for various
reasons and a discount being applied doesn't changed the original
retail price (it applies a discount on top of a retail price).
Discounts can be of various types and may even be cumulative or
mutually exclusive. As such, depending on complexity, it may be worth
adding a new Aggregate (and if complex enough, have a Saga that
receives various discount events and fires command to various
Aggregates).
For your scenario, it seems you can simply create a
DiscountAppliedEvent directly from the command handler and have a
projection update the readmodel. You could also (specially if your
infrastructure requires it) create a new Discount Aggregate instance
(or have a singleton DiscountManager Aggregate) that simply creates
the event. The projection class would still simply do an update. The
point is that your product classes don't seem to need to know about
discounts. So don't make it a concern of the Product class. UI wise,
it's not a batch operation anymore :)
Does that help?