What is the best practice for ensuring that page layouts are read only? It seems like there are three options:
1) Create a seperate page layout and record type where all the fields on that page layout are set to 'read only'. Can automate the record to be set to this read only record type via workflow, Process Builder, code etc.
Benefit: the user on the page (unless a SysAdmin) sees that the fields are not editable.
Downside: multiple page layouts, multiple record types, also have to remember to add a field onto the layout and change its property to 'read only'. Multiple record types will be seen in the UI when running reports.
2) Create a validation rule preventing a record from being edited if a certain criteria is met (for example, if the Stage became 'Closed Won').
Benefit: straight forward and database level (so SysAdmins will hit the error too, as well as any DML update via Data Loader). Keeps concise number of record types and page layouts.
Downside: user could potentially have multiple fields ready to edit if inline editing is enabled, presses 'Save' and hits the validation rule and has therefore wasted time.
3) Visualforce page:
Benefit: can have the benefit of 'read only' but on one record type
Downside: higher technical debt, high maintainability cost, code not clicks
Is there a best practice here or is there an option that I've omitted which would work better?