Make salabale and purchasable domain temporal
If you remove salable or purchasable on a product that is used in a sale or purchase still processing, the processing will fail on the domain validation (even if the product is not changed because it depends on Function field which make it always validated).
I think those domain clause should only be enforced with the sale or purchase are still in draft or quotation.
Another option would be to use date range for salable and purchasable. But I think it makes the UX too complex for the benefit. And also it does not completely solve the problem is the dates are modified.
PS: I think it applies also to product_suppliers clause.