Oi William! Tudo bem?
O problema que você possui é bem comum em sistemas, principalmente se os modelos de precificação vão se tornando complexos.
A melhor maneira de desenhar um sistema que precisa aplicar descontos de forma encadeada é criar um modelo de desconto e um modelo de regras que dizem se esse desconto se aplica ou não. Cada regra está associada a uma implementação que armazena informações relevantes, tais quais:
1) Código do desconto. Ex. #OFMAL2019
2) Nome amigável do desconto. Ex. Oferta Maluca 2019
3) Tipo de desconto. Ex. Percentual ou Valor
4) Target do desconto: Produto, Pedido, Frete, ...
5) Desconto: Ex. 100 ou 0.10 (10%)
6) Stackable: Esse produto permite que se apliquem outros descontos.
7) Prioridade: Define a regra com a qual uma promoção será aplicada.
8) Condição: Define qual é a classe de implementação que determina se a regra se aplica ou não.
Imagine um carrinho de compras, tudo bem?
O usuário adiciona um produto a esse carrinho
O sistema varre seu sistema de regras de preço e verifica as condições do carrinho e se aplicam ou não.
Ao final, ele consegue determinar descontos e quais descontos ele aplicou e os respectivos nomes.
Para isso recomendo fortemente que estude design patterns, mais especificamente Strategy, para cada tipo de promoção que você necessitar.
Outro ponto importante é que descontos em geral se aplicam de formas bastantes distintas:
1) Dar um desconto em um produto
2) Dar um desconto no total de um carrinho se atingir um limite de compras
3) Dar desconto no frete baseado em um produto
4) Oferecer produtos grátis se comprar um ou mais produtos.
5) Descontos do tipo cash back.
6) Descontos por tipo de pagamento.
Espero que tenha ajudado,
Abraço e sucesso,
Rodrigo