Ik zou kijken naar het toevoegen van een kolom aan de GroupQuoteItem-tabel, GroupQuoteItem.Priority. Deze kolom zou worden gebruikt in de zoekopdracht die de uiteindelijke prijs bepaalt. Als je N kortingen hebt met dezelfde, hoogste prioriteit, worden ze op elkaar gestapeld (de volgorde maakt niet uit, dankzij de associativiteit van vermenigvuldiging).
Als al deze kortingen met hoge prioriteit later worden verwijderd, kunnen kortingen met een lagere prioriteit hun plaats innemen. Dit zou je moeten helpen bij het opzetten van behoorlijk complexe kortingsstructuren.
Ik hoop dat dit je in ieder geval een beginpunt geeft.