Let's say that this is all wrapped up in a Requests list. This list would have a Status column with several states like: "Accepted", "Pending to accept", "Pending to modify", "Denied" etc., but default value when creating an item would be "Pending to accept".
This list will have four views:
- Accepted requests. This view will show all entries with Status as "Accepted".
- Pending to accept. This view will show all entries with Status as "Pending to accept".
- Pending to modification. This view will show all entries with Status as "Pending to modification".
- Pending to delete. This view will show all entries with Status as "Pending to delete".
Only approver would have permission to see the four views. Normal user will only be able to see the view Accepted requests.
- First case: As created items will have Status column as "Pending to accept", approver will be able to see these items in the Pending to accept view. Approver will be able to delete this item if item isn't valid, or accept, by changing Status column to "Accepted". So no need to use workflow or Event receiver in this case.
- Second case: Here I would code an Event receiver to know if some field has changed. If some field has changed, change the Status column to "Pending to modify" by code. If approver doesn't approve, approver can restore item to a previous version (Here how), so item will be like it was (like denied modification), otherwise, if approver approves, approver just needs to change the Status column's item to "Accepted".
- Third case: For this case, delete action cannot be enabled for users. I would create a checkbox field called Request to delete. If user checks that checkbox and saves the item, in the same Event Receiver described in the second case, Status column would change to "Pending to delete". So, when approver goes to "Pending to delete" view, he will be able to accept (by deleting that item), or restore item to a previous version (Here how), so item will be like it was (Request to delete = No and Status = "Accepted")