Audit Logging of State Changes

Objective: The purpose of audit logging within OpenLMIS is to create a complete picture of all relative state changes as they occur within the system in order to encourage confidence on behalf of the user community. 

Description: A record of all state changes for all objects within OpenLMIS. For all records within OpenLMIS, one should be able to trace backwards from a records present state, all the way back to its initialized state. Records of state changes should be immutable. There is no expectation that all possible state changes should be shown in a report or available via the UI. It is sufficient for these state change records to be persisted and available via API call, (i.e. /program/{programId}/show-audit-history). The preference is to use an existing tool such as Envers if possible. Additionally, writing an audit logging strategy that is easily leveraged by future independent OpenLMIS services is highly desirable. 


Example:

If a facility has the following attributes when instantiated:

Facility

FacilityNameFacilityIdTypeLatCoordLonCoord
Steinbach HospitalF123Hospital30.11319.210

and it is updated to be:

Facility

FacilityNameFacilityIdTypelatCoordlonCoord
Steinbach HospitalF123Clinic30.11119.210

There should be a record of the change, when the change occured, and who made the change. That is, our original table should be extended to show the following state data:

Facility

FacilityNameFacilityIdTypeLatCoordLonCoordCreatedByCreatedDateLastModByLastModDate
Steinbach HospitalF123Hospital30.11319.210KevinCussen2016-01-01 01:01:01nullnull

When the change is made, this table row should be updated to reflect the new data. For example, if John Smith has made the changes to Steinbach Hospital record on January 20th, the updated record would show the following:

Facility

FacilityNameFacilityIdTypeLatCoordLonCoordCreatedByCreatedDateLastModByLastModDate
Steinbach HospitalF123Clinic30.11119.210KevinCussen2016-01-01JohnSmith2016-01-20 12:34:56

Additionally, the previous state of the record should be recorded as a historical entity. Any time an update is made to a record, a log of the previous state should be persisted. One approach is as follows (though no approach is proscribed):

Facility_StateChangeRecord

FacilityNameFacilityName_ChangedToFacilityIdFacilityId_ChangedToTypeType_ChangedToLatCoordLatCoord_ChangedToLonCoordLonCoord_ChangedToCreatedByCreatedBy_ChangedToCreatedDateCreatedDate_ChangedToUpdatedByUpdatedBy_ChangedToLastModDateLastModDate_ChangedTo
Steinbach HospitalnullF123nullHospitalClinic30.11330.11119.210nullKevinCussennull2016-01-01nullnullJohnSmithnull2016-01-20 12:34:56

OpenLMIS: the global initiative for powerful LMIS software