Shopping cart with discounts
You should have a class PriceComputer that computes prices and their discounts. This should be the central class of the whole design.

Then, make separate data types for the input and output of that class. That way the compiler prevents you from mixing these during the calculations (which will get quite complicated once you add more rules).

The input just needs to be the basket that you already have. You should change the HashMap to a LinkedHashMap, to keep the products in the same order they were inserted.

Each output element should have the properties product, quantity, resultingPrice, discount, discountPercent (only if applicable). All its fields should be final, since once computed, there is no reason to change them.

The general structure of your classes looks good. You might have a look at Project Lombok (which will save you from writing boring code), and you should make clear what the class Offer stands for, since it wasn't clear to me from the name alone.

Also, given an Offer, there are two ways of reaching a Product (offer.product and offer.discount.product). Are these products always the same? If so, one of them must be removed from the code.

Product.equals should not depend on the name of the product. Instead, only the SKU should be compared. Or, even simpler, make sure that you only have a single Product object per product, and don't override hashCode/equals at all.