How do I stop users from removing products from an active (read-only) quote? It doesn't make sense that users can do this. The quote total remains unchanged, but the products no longer add up.
You can create real-time workflow or plugin that will handle Delete message for QuoteDetail product, check state of parent quote and throw an error if state is Active.