How to avoid losing information via UPDATEs due to database design issues
The simplest way to implement the requirements inside the database would be to create two separate tables.  Then, you just don't GRANT UPDATE on the set of tables used to store the "final documents".  This assumes that the end-users are logging in with an account that does not own the tables.

create table not_final_documents ( document_id int );
grant insert,update,select,delete on not_final_documents to end_user_role;


create table final_documents ( document_id int );
grant insert,select on final_documents to end_user_role;


This enforces the requirement of "can't modify final documents" even if the users use a different application to work on the document/packages.

You'll want to create database side procedures (T-SQL, PL/SQL, etc) to handle the data management between not_final_documents and final_documents.