diff --git a/android/app/src/main/java/io/mosip/registration_client/HostApiModule.java b/android/app/src/main/java/io/mosip/registration_client/HostApiModule.java index 47c06f31b..c762251d7 100644 --- a/android/app/src/main/java/io/mosip/registration_client/HostApiModule.java +++ b/android/app/src/main/java/io/mosip/registration_client/HostApiModule.java @@ -72,7 +72,6 @@ import io.mosip.registration_client.api_services.ProcessSpecDetailsApi; import io.mosip.registration_client.api_services.RegistrationApi; import io.mosip.registration_client.api_services.UserDetailsApi; - @Module public class HostApiModule { diff --git a/android/app/src/main/java/io/mosip/registration_client/MainActivity.java b/android/app/src/main/java/io/mosip/registration_client/MainActivity.java index b43343ae3..2437ee835 100644 --- a/android/app/src/main/java/io/mosip/registration_client/MainActivity.java +++ b/android/app/src/main/java/io/mosip/registration_client/MainActivity.java @@ -360,6 +360,7 @@ public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { super.configureFlutterEngine(flutterEngine); GeneratedPluginRegistrant.registerWith(flutterEngine); initializeAppComponent(); + auditManagerService.audit(AuditEvent.NAV_REDIRECT_HOME, Components.REGISTRATION); MachinePigeon.MachineApi.setup(flutterEngine.getDartExecutor().getBinaryMessenger(), machineDetailsApi); UserPigeon.UserApi.setup(flutterEngine.getDartExecutor().getBinaryMessenger(), userDetailsApi); CommonDetailsPigeon.CommonDetailsApi.setup(flutterEngine.getDartExecutor().getBinaryMessenger(),commonDetailsApi); diff --git a/android/app/src/main/java/io/mosip/registration_client/api_services/AuthenticationApi.java b/android/app/src/main/java/io/mosip/registration_client/api_services/AuthenticationApi.java index 0a314a18e..5055dc69c 100644 --- a/android/app/src/main/java/io/mosip/registration_client/api_services/AuthenticationApi.java +++ b/android/app/src/main/java/io/mosip/registration_client/api_services/AuthenticationApi.java @@ -106,6 +106,7 @@ public void onResponse(Call call, Response response) { loginService.saveAuthToken(wrapper.getResponse(), username); loginService.setPasswordHash(username, password); loginService.resetFailedLoginAttempts(username); + auditManagerService.audit(AuditEvent.NAV_HOME, Components.REGISTRATION); String preferredUsername = sharedPreferences.getString(PREFERRED_USERNAME, username); String fullName = sharedPreferences.getString(USER_NAME, preferredUsername); AuthResponsePigeon.AuthResponse authResponse = new AuthResponsePigeon.AuthResponse.Builder() @@ -175,6 +176,7 @@ private void offlineLogin(final String username, final String password, AuthResp String token = loginService.saveUserAuthTokenOffline(username); String preferredUsername = sharedPreferences.getString(PREFERRED_USERNAME, username); String fullName = sharedPreferences.getString(USER_NAME, preferredUsername); + auditManagerService.audit(AuditEvent.NAV_HOME, Components.REGISTRATION); AuthResponsePigeon.AuthResponse authResponse = new AuthResponsePigeon.AuthResponse.Builder() .setResponse(token) .setUserId(username) @@ -212,6 +214,7 @@ public void login(@NonNull String username, @NonNull String password, @NonNull B @Override public void logout(@NonNull AuthResponsePigeon.Result result) { loginService.clearAuthToken(this.context); + auditManagerService.audit(AuditEvent.LOGOUT_USER, Components.LOGIN); result.success("Logout Success"); } diff --git a/android/app/src/main/java/io/mosip/registration_client/api_services/BiometricsDetailsApi.java b/android/app/src/main/java/io/mosip/registration_client/api_services/BiometricsDetailsApi.java index 7d958892d..98589b7da 100644 --- a/android/app/src/main/java/io/mosip/registration_client/api_services/BiometricsDetailsApi.java +++ b/android/app/src/main/java/io/mosip/registration_client/api_services/BiometricsDetailsApi.java @@ -518,6 +518,7 @@ public void getBioAttempt(@NonNull String fieldId, @NonNull String modality, @Override public void startOperatorOnboarding(@NonNull BiometricsPigeon.Result result) { + auditManagerService.audit(AuditEvent.NAV_ON_BOARD_USER, Components.REGISTRATION); try { OPERATOR_EXCEPTIONS.clear(); userOnboardService.getOperatorBiometrics().clear(); diff --git a/android/app/src/main/java/io/mosip/registration_client/api_services/DynamicDetailsApi.java b/android/app/src/main/java/io/mosip/registration_client/api_services/DynamicDetailsApi.java index a3fabd25e..a5ffbbaaa 100644 --- a/android/app/src/main/java/io/mosip/registration_client/api_services/DynamicDetailsApi.java +++ b/android/app/src/main/java/io/mosip/registration_client/api_services/DynamicDetailsApi.java @@ -48,6 +48,8 @@ import io.mosip.registration.packetmanager.dto.PacketWriter.DocumentType; import io.mosip.registration.packetmanager.dto.SimpleType; import io.mosip.registration_client.model.DynamicResponsePigeon; +import io.mosip.registration.clientmanager.constant.AuditEvent; +import io.mosip.registration.clientmanager.constant.Components; @Singleton public class DynamicDetailsApi implements DynamicResponsePigeon.DynamicResponseApi { @@ -231,6 +233,7 @@ public void getLocationHierarchyMap(@NonNull DynamicResponsePigeon.Result> result) { + auditManagerService.audit(AuditEvent.REG_DEMO_PRE_REG_DATA_FETCH, Components.REGISTRATION); Map preRegistrationData = new HashMap<>(); try { this.preRegistrationData.getPreRegistration(preRegId,false); diff --git a/android/app/src/main/java/io/mosip/registration_client/api_services/MachineDetailsApi.java b/android/app/src/main/java/io/mosip/registration_client/api_services/MachineDetailsApi.java index 8f6578977..0b8f4a487 100644 --- a/android/app/src/main/java/io/mosip/registration_client/api_services/MachineDetailsApi.java +++ b/android/app/src/main/java/io/mosip/registration_client/api_services/MachineDetailsApi.java @@ -24,6 +24,8 @@ import io.mosip.registration.clientmanager.spi.AuditManagerService; import io.mosip.registration.keymanager.spi.ClientCryptoManagerService; import io.mosip.registration_client.model.MachinePigeon; +import io.mosip.registration.clientmanager.constant.AuditEvent; +import io.mosip.registration.clientmanager.constant.Components; @Singleton @@ -43,6 +45,7 @@ public MachineDetailsApi(ClientCryptoManagerService clientCryptoManagerService, @Override public void getMachineDetails(@NonNull MachinePigeon.Result result) { + auditManagerService.audit(AuditEvent.SYNC_MACHINE_DETAILS,Components.REGISTRATION); Map machineDetails = new HashMap<>(); Map details = clientCryptoManagerService.getMachineDetails(); diff --git a/android/app/src/main/java/io/mosip/registration_client/api_services/MasterDataSyncApi.java b/android/app/src/main/java/io/mosip/registration_client/api_services/MasterDataSyncApi.java index 551c86628..ee5236dce 100644 --- a/android/app/src/main/java/io/mosip/registration_client/api_services/MasterDataSyncApi.java +++ b/android/app/src/main/java/io/mosip/registration_client/api_services/MasterDataSyncApi.java @@ -72,7 +72,8 @@ import io.mosip.registration_client.UploadBackgroundService; import io.mosip.registration_client.model.MasterDataSyncPigeon; import io.mosip.registration_client.utils.NetworkUtils; - +import io.mosip.registration.clientmanager.constant.AuditEvent; +import io.mosip.registration.clientmanager.constant.Components; @Singleton public class MasterDataSyncApi implements MasterDataSyncPigeon.SyncApi { private static final String MASTER_DATA_LAST_UPDATED = "masterdata.lastupdated"; @@ -193,6 +194,10 @@ public void getPolicyKeySync(@NonNull Boolean isManualSync, @NonNull String jobI public void getGlobalParamsSync(@NonNull Boolean isManualSync, @NonNull String jobId, @NonNull MasterDataSyncPigeon.Result result) { try { masterDataService.syncGlobalParamsData(() -> { + auditManagerService.audit( + AuditEvent.SYNC_CLIENT_STATE, + Components.REGISTRATION + ); Log.i(TAG, "Sync Global Params Completed."); result.success(syncResult("GlobalParamsSync", 1, masterDataService.onResponseComplete())); }, isManualSync, jobId); @@ -205,6 +210,10 @@ public void getGlobalParamsSync(@NonNull Boolean isManualSync, @NonNull String j public void getUserDetailsSync(@NonNull Boolean isManualSync, @NonNull String jobId, @NonNull MasterDataSyncPigeon.Result result) { try { masterDataService.syncUserDetails(() -> { + auditManagerService.audit( + AuditEvent.SYNC_USER_MAPPING, + Components.REGISTRATION + ); Log.i(TAG, "User details sync Completed."); result.success(syncResult("UserDetailsSync", 3, masterDataService.onResponseComplete())); }, isManualSync, jobId); @@ -228,8 +237,10 @@ public void getIDSchemaSync(@NonNull Boolean isManualSync, @NonNull MasterDataSy @Override public void getMasterDataSync(@NonNull Boolean isManualSync, @NonNull String jobId, @NonNull MasterDataSyncPigeon.Result result) { + auditManagerService.audit(AuditEvent.NAV_SYNC_DATA, Components.REGISTRATION); try { masterDataService.syncMasterData(() -> { + auditManagerService.audit(AuditEvent.SYNC_MASTER_DATA,Components.REGISTRATION); Log.i(TAG, "Master Data Sync Completed."); result.success(syncResult("MasterDataSync", 2, masterDataService.onResponseComplete())); }, 0, isManualSync, jobId); diff --git a/android/app/src/main/java/io/mosip/registration_client/api_services/PacketAuthenticationApi.java b/android/app/src/main/java/io/mosip/registration_client/api_services/PacketAuthenticationApi.java index 20743216d..0f93260df 100644 --- a/android/app/src/main/java/io/mosip/registration_client/api_services/PacketAuthenticationApi.java +++ b/android/app/src/main/java/io/mosip/registration_client/api_services/PacketAuthenticationApi.java @@ -37,7 +37,6 @@ import io.mosip.registration_client.MainActivity; import io.mosip.registration_client.R; import io.mosip.registration_client.model.PacketAuthPigeon; - @Singleton public class PacketAuthenticationApi implements PacketAuthPigeon.PacketAuthApi { SyncRestService syncRestService; @@ -48,7 +47,6 @@ public class PacketAuthenticationApi implements PacketAuthPigeon.PacketAuthApi { RegistrationRepository registrationRepository; private Activity activity; - public void setCallbackActivity(MainActivity mainActivity) { this.activity = mainActivity; } @@ -95,6 +93,7 @@ public void authenticate(@NonNull String username, @NonNull String password, @No @Override public void syncPacketAll(@NonNull List packetIds, @NonNull PacketAuthPigeon.Result result) { + auditManagerService.audit(AuditEvent.SYNC_REGISTRATION_PACKET_STATUS,Components.REGISTRATION); Integer packetSize = packetIds.size(); final Integer[] remainingPack = {packetSize, 0}; @@ -168,6 +167,7 @@ public void inProgress(String RID) { public void onComplete(String RID, PacketTaskStatus status) { if (status.equals(PacketTaskStatus.UPLOAD_COMPLETED) || status.equals(PacketTaskStatus.UPLOAD_ALREADY_COMPLETED)) { remainingPack[1] += 1; + auditManagerService.audit(AuditEvent.PACKET_UPLOAD, Components.REGISTRATION); } remainingPack[0] -= 1; diff --git a/android/app/src/main/java/io/mosip/registration_client/api_services/UserDetailsApi.java b/android/app/src/main/java/io/mosip/registration_client/api_services/UserDetailsApi.java index f584affbf..46f08b540 100644 --- a/android/app/src/main/java/io/mosip/registration_client/api_services/UserDetailsApi.java +++ b/android/app/src/main/java/io/mosip/registration_client/api_services/UserDetailsApi.java @@ -18,8 +18,6 @@ import javax.inject.Inject; import javax.inject.Singleton; -import io.mosip.registration.clientmanager.constant.AuditEvent; -import io.mosip.registration.clientmanager.constant.Components; import io.mosip.registration.clientmanager.dto.CenterMachineDto; import io.mosip.registration.clientmanager.entity.RegistrationCenter; import io.mosip.registration.clientmanager.entity.UserDetail; diff --git a/android/clientmanager/src/main/java/io/mosip/registration/clientmanager/constant/AuditEvent.java b/android/clientmanager/src/main/java/io/mosip/registration/clientmanager/constant/AuditEvent.java index f98a9f10c..acec2ebd3 100644 --- a/android/clientmanager/src/main/java/io/mosip/registration/clientmanager/constant/AuditEvent.java +++ b/android/clientmanager/src/main/java/io/mosip/registration/clientmanager/constant/AuditEvent.java @@ -22,11 +22,30 @@ public enum AuditEvent { LOADED_DATA_ENTRY_LANG("REG-LOAD-006", USER_EVENT.getCode(), "LOADED_DATA_ENTRY_LANG", "DataEntry Language selection activity loaded"), //Login - LOGIN_WITH_PASSWORD("REG-AUTH-001", USER_EVENT.getCode(), "LOGIN_WITH_PASSWORD", + LOGIN_AUTHENTICATE_USER_ID("REG-AUTH-001", USER_EVENT.getCode(), "LOGIN_AUTHENTICATE_USER_ID", + "Login authenticating user id: Click of Submit"), + LOGIN_WITH_PASSWORD("REG-AUTH-002", USER_EVENT.getCode(), "LOGIN_WITH_PASSWORD", "Login with password: Click of Submit"), - ABOUT_CLIENT("REG-AUTH-002", USER_EVENT.getCode(), "ABOUT_CLIENT", "Press and hold on logo to navigate: About activity"), - LOGOUT_USER("REG-AUTH-003", USER_EVENT.getCode(), "LOGOUT_USER", "Logout"), - + ABOUT_CLIENT("REG-AUTH-003", USER_EVENT.getCode(), "ABOUT_CLIENT", "Press and hold on logo to navigate: About activity"), + LOGOUT_USER("REG-AUTH-009", USER_EVENT.getCode(), "LOGOUT_USER", "Logout"), + + // Navigation + NAV_LOST_UIN("REG-EVT-001", USER_EVENT.getCode(), "NAV_LOST_UIN", "Click of navigation link: Lost UIN"), + NAV_NEW_REG("REG-EVT-002", USER_EVENT.getCode(), "NAV_NEW_REG", "Click of navigation link: New Registration"), + NAV_UIN_UPDATE("REG-EVT-003", USER_EVENT.getCode(), "NAV_UIN_UPDATE", "Navigation link: UIN Update"), + NAV_APPROVE_REG("REG-EVT-004", USER_EVENT.getCode(), "NAV_APPROVE_REG", "Navigation link: Approve Registration"), + NAV_UPLOAD_PACKETS("REG-EVT-005", USER_EVENT.getCode(), "NAV_UPLOAD_PACKETS", "Navigation link: Upload Packets"), + NAV_CORRECTION("REG-EVT-007", USER_EVENT.getCode(), "NAV_CORRECTION", "Navigation link: CORRECTION"), + NAV_SYNC_PACKETS("REG-NAV-001", USER_EVENT.getCode(), "NAV_SYNC_PACKETS", "Navigation link: Sync Packet IDs"), + NAV_SYNC_DATA("REG-NAV-003", USER_EVENT.getCode(), "NAV_SYNC_DATA", "Navigation link: Sync Data"), + NAV_DOWNLOAD_PRE_REG_DATA("REG-NAV-004", USER_EVENT.getCode(), "NAV_DOWNLOAD_PRE_REG_DATA", + "Navigation link: Download Pre-registration Data"), + NAV_GEO_LOCATION("REG-NAV-005", USER_EVENT.getCode(), "NAV_GEO_LOCATION", "Navigation link: Geo-location"), + NAV_ON_BOARD_USER("REG-NAV-006", USER_EVENT.getCode(), "NAV_ON_BOARD_USER", "Navigation link: On-board Users"), + NAV_HOME("REG-NAV-007", SYSTEM_EVENT.getCode(), "NAV_HOME", "Navigation link: Home"), + NAV_REDIRECT_HOME("REG-NAV-008", SYSTEM_EVENT.getCode(), "NAV_REDIRECT_HOME", "Navigation link: Redirect to Home"), + NAV_ON_BOARD_DEVICES("REG-NAV-009", USER_EVENT.getCode(), "NAV_ON_BOARD_DEVICES", + "Navigation link: On-board Devices"), //Home MASTER_DATA_SYNC("REG-HOME-001", USER_EVENT.getCode(), "MASTER_DATA_SYNC", "Master data sync clicked"), NEW_REGISTRATION("REG-HOME-002", USER_EVENT.getCode(), "NEW_REGISTRATION", "New registration clicked"), @@ -35,7 +54,7 @@ public enum AuditEvent { //REG_PACKET_LIST SYNC_PACKET("REG-PKT-001", USER_EVENT.getCode(), "SYNC_PACKET", "Packet sync clicked"), - UPLOAD_PACKET("REG-PKT-002", USER_EVENT.getCode(), "UPLOAD_PACKET", "Upload packet clicked"), + UPLOAD_PACKET("REG-UPL-PKT-001", USER_EVENT.getCode(), "UPLOAD_PACKET", "Upload packet clicked"), SYNC_AND_UPLOAD_PACKET("REG-PKT-003", USER_EVENT.getCode(), "SYNC_AND_UPLOAD_PACKET", "sync and upload started"), //JOB_SERVICE @@ -44,28 +63,94 @@ public enum AuditEvent { CANCEL_JOB("REG-JOB-003", USER_EVENT.getCode(), "CANCEL_JOB", "Cancel scheduled job service clicked"), //REGISTRATION USER EVENT - REGISTRATION_START("REG-EVT-001", USER_EVENT.getCode(), "REGISTRATION_START", "Registration start event initiated"), - LOADED_REGISTRATION_SCREEN("REG-EVT-002", USER_EVENT.getCode(), "LOADED_REGISTRATION_SCREEN", "Registration screen activity loaded"), - NEXT_BUTTON_CLICKED("REG-EVT-003", USER_EVENT.getCode(), "NEXT_BUTTON_CLICKED", "Next button clicked"), - DOCUMENT_SCAN("REG-EVT-004", USER_EVENT.getCode(), "DOCUMENT_SCAN", "Scan document button clicked"), - DOCUMENT_SCAN_FAILED("REG-EVT-005", USER_EVENT.getCode(), "DOCUMENT_SCAN_FAILED", "Document scan failed"), + REGISTRATION_START("REG-EVT-104", USER_EVENT.getCode(), "REGISTRATION_START", "Registration start event initiated"), + LOADED_REGISTRATION_SCREEN("REG-EVT-111", USER_EVENT.getCode(), "LOADED_REGISTRATION_SCREEN", "Registration screen activity loaded"), + NEXT_BUTTON_CLICKED("REG-EVT-069", USER_EVENT.getCode(), "NEXT_BUTTON_CLICKED", "Next button clicked"), + DOCUMENT_SCAN("REG-EVT-106", USER_EVENT.getCode(), "DOCUMENT_SCAN", "Scan document button clicked"), + DOCUMENT_SCAN_FAILED("REG-EVT-050", USER_EVENT.getCode(), "DOCUMENT_SCAN_FAILED", "Document scan failed"), DOCUMENT_PREVIEW("REG-EVT-006", USER_EVENT.getCode(), "DOCUMENT_PREVIEW", "Document preview button clicked"), - BIOMETRIC_CAPTURE("REG-EVT-007", USER_EVENT.getCode(), "BIOMETRIC_CAPTURE_INITIATED", "Biometric capture initiated"), - LOADED_REGISTRATION_PREVIEW("REG-EVT-008", USER_EVENT.getCode(), "LOADED_REGISTRATION_PREVIEW", "Registration preview loaded"), - CREATE_PACKET_AUTH("REG-EVT-009", USER_EVENT.getCode(), "CREATE_PACKET_AUTH", "Packet create authentication clicked"), - CREATE_PACKET_AUTH_FAILED("REG-EVT-010", USER_EVENT.getCode(), "CREATE_PACKET_AUTH_FAILED", "Packet create authentication failed"), - LOADED_ACKNOWLEDGEMENT_SCREEN("REG-EVT-011", USER_EVENT.getCode(), "LOADED_ACKNOWLEDGEMENT_SCREEN", "Acknowledgement Activity loaded"), - PRINT_ACKNOWLEDGEMENT("REG-EVT-012", USER_EVENT.getCode(), "PRINT_ACKNOWLEDGEMENT", "Print acknowledgement"), + BIOMETRIC_CAPTURE("REG-EVT-107", USER_EVENT.getCode(), "BIOMETRIC_CAPTURE_INITIATED", "Biometric capture initiated"), + LOADED_REGISTRATION_PREVIEW("REG-EVT-108", USER_EVENT.getCode(), "LOADED_REGISTRATION_PREVIEW", "Registration preview loaded"), + CREATE_PACKET_AUTH("REG-EVT-109", USER_EVENT.getCode(), "CREATE_PACKET_AUTH", "Packet create authentication clicked"), + CREATE_PACKET_AUTH_FAILED("REG-EVT-043", USER_EVENT.getCode(), "CREATE_PACKET_AUTH_FAILED", "Packet create authentication failed"), + LOADED_ACKNOWLEDGEMENT_SCREEN("REG-EVT-044", USER_EVENT.getCode(), "LOADED_ACKNOWLEDGEMENT_SCREEN", "Acknowledgement Activity loaded"), + PRINT_ACKNOWLEDGEMENT("REG-EVT-045", USER_EVENT.getCode(), "PRINT_ACKNOWLEDGEMENT", "Print acknowledgement"), + + // Registration : Demographics Details + REG_DEMO_CAPTURE("REG-EVT-110", USER_EVENT.getCode(), "REG_DEMO_NEXT", "FvStarted capturing demographic details"), + REG_DEMO_PRE_REG_DATA_FETCH("REG-EVT-008", USER_EVENT.getCode(), "REG_DEMO_PRE_REG_DATA_FETCH", "Pre-registration: Fetch data for selected Pre-registration"), + REG_DEMO_NEXT("REG-EVT-105", USER_EVENT.getCode(), "REG_DEMO_NEXT", "Click of Next after capturing demographic details"), + + // Registration Preview + REG_PREVIEW_DEMO_EDIT("REG-EVT-114", USER_EVENT.getCode(), "REG_PREVIEW_DEMO_EDIT", "Click of Edit demographics"), + REG_PREVIEW_DOC_EDIT("REG-EVT-112", USER_EVENT.getCode(), "REG_PREVIEW_DOC_EDIT", "Click of Edit documents"), + REG_PREVIEW_BIO_EDIT("REG-EVT-113", USER_EVENT.getCode(), "REG_PREVIEW_BIO_EDIT", "Click of Biometrics Edit"), + REG_PREVIEW_SUBMIT("REG-EVT-046", USER_EVENT.getCode(), "REG_PREVIEW_SUBMIT", + "Click of Next after Registration Preview"), + REG_PREVIEW_BACK("REG-EVT-047", USER_EVENT.getCode(), "REG_PREVIEW_BACK","Click of Back from registration preview screen"), //REGISTRATION SYSTEM EVENT - DISCOVER_SBI_FAILED("REG-EVT-013", SYSTEM_EVENT.getCode(), "DISCOVER_SBI_FAILED", "SBI discovery failed"), - DEVICE_INFO_FAILED("REG-EVT-014", SYSTEM_EVENT.getCode(), "DEVICE_INFO_FAILED", "Device info failed"), - R_CAPTURE_FAILED("REG-EVT-015", SYSTEM_EVENT.getCode(), "R_CAPTURE_FAILED", "R_capture failed"), - DISCOVER_SBI_PARSE_FAILED("REG-EVT-016", SYSTEM_EVENT.getCode(), "DISCOVER_SBI_PARSE_FAILED", "SBI discovery response parsing failed"), - DEVICE_INFO_PARSE_FAILED("REG-EVT-017", SYSTEM_EVENT.getCode(), "DEVICE_INFO_PARSE_FAILED", "Device info response parsing failed"), - R_CAPTURE_PARSE_FAILED("REG-EVT-018", SYSTEM_EVENT.getCode(), "R_CAPTURE_PARSE_FAILED", "R_capture response parsing failed"), - CREATE_PACKET_FAILED("REG-EVT-019", USER_EVENT.getCode(), "CREATE_PACKET_FAILED", "Packet creation failed"); - + DISCOVER_SBI_FAILED("REG-EVT-070", SYSTEM_EVENT.getCode(), "DISCOVER_SBI_FAILED", "SBI discovery failed"), + DEVICE_INFO_FAILED("REG-EVT-049", SYSTEM_EVENT.getCode(), "DEVICE_INFO_FAILED", "Device info failed"), + R_CAPTURE_FAILED("REG-EVT-077", SYSTEM_EVENT.getCode(), "R_CAPTURE_FAILED", "R_capture failed"), + DISCOVER_SBI_PARSE_FAILED("REG-EVT-051", SYSTEM_EVENT.getCode(), "DISCOVER_SBI_PARSE_FAILED", "SBI discovery response parsing failed"), + DEVICE_INFO_PARSE_FAILED("REG-EVT-052", SYSTEM_EVENT.getCode(), "DEVICE_INFO_PARSE_FAILED", "Device info response parsing failed"), + R_CAPTURE_PARSE_FAILED("REG-EVT-053", SYSTEM_EVENT.getCode(), "R_CAPTURE_PARSE_FAILED", "R_capture response parsing failed"), + CREATE_PACKET_FAILED("REG-EVT-054", USER_EVENT.getCode(), "CREATE_PACKET_FAILED", "Packet creation failed"), + + // Packet Upload + PACKET_UPLOAD("REG-EVT-083", USER_EVENT.getCode(), "PACKET_UPLOAD", "Upload the local packets to the server"), + + // Registration : Documents + REG_DOC_NEXT("REG-EVT-025", USER_EVENT.getCode(), "REG_DOC_NEXT", "Click of Next after uploading documents"), + REG_DOC_BACK("REG-EVT-026", USER_EVENT.getCode(), "REG_DOC_BACK", "Click of Back to demographic details"), + + // MDM + REG_DOC_SCAN("REG-EVT-089", USER_EVENT.getCode(), "REG_DOC_SCAN", "Doc: Click of Scan"), + REG_DOC_VIEW("REG-EVT-090", USER_EVENT.getCode(), "REG_DOC_VIEW", "Doc: View"), + REG_DOC_DELETE("REG-EVT-091", USER_EVENT.getCode(), "REG_DOC_DELETE", "Doc: Delete"), + + // Approve Registration + APPR_VIEW_REG("REG-EVT-066", USER_EVENT.getCode(), "APPR_VIEW_REG", "View registration detail"), + APPR_REG("REG-EVT-067", USER_EVENT.getCode(), "APPR_REG", "Approve registration"), + REJECT_REG("REG-EVT-068", USER_EVENT.getCode(), "REJECT_REG", "Reject registration"), + + // Geo-Location + GEO_LOCATION_CAPTURE("REG-GEO-LOC-001", SYSTEM_EVENT.getCode(), "GEO_LOCATION_CAPTURE", "Capture geo-location"), + GEO_LOCATION_DENIED("REG-GEO-LOC-002", SYSTEM_EVENT.getCode(), "GEO_LOCATION_DENIED", "Denied geo-location"), + + // Client To Server Sync + SYNC_USER_MAPPING("REG-SYNC-008", USER_EVENT.getCode(), "SYNC_USER_MAPPING", "Sync user mapping"), + SYNC_DEVICE_MAPPING("REG-SYNC-009", USER_EVENT.getCode(), "SYNC_DEVICE_MAPPING", "Sync device mapping"), + SYNC_CLIENT_STATE("REG-SYNC-010", USER_EVENT.getCode(), "SYNC_CLIENT_STATE", "Sync client state"), + + // Export Packets + EXPORT_REG_PACKETS("REG-EXPT-PKT-001", USER_EVENT.getCode(), "EXPORT_REGISTRATION_PACKETS", + "Export Packets: To external device"), + + // Sync Packet Ids + SYNC_PACKET_IDS("REG-SYNC-PKTS-001", SYSTEM_EVENT.getCode(), "SYNC_PACKET_IDS", "Send Packet IDs to server"), + + // Sync Packets + SYNC_SERVER("REG-SYNC-014", USER_EVENT.getCode(), "SYNC_SERVER", "Synchronize the packet status to the server"), + + // Server To Client Sync + SYNC_MASTER_DATA("REG-SYNC-001", USER_EVENT.getCode(), "SYNC_MASTER_DATA", "Sync master data"), + SYNC_REGISTRATION_CENTER_DETAILS("REG-SYNC-002", USER_EVENT.getCode(), "SYNC_REGISTRATION_CENTER_DETAILS", + "Sync registration centre details"), + SYNC_MACHINE_DETAILS("REG-SYNC-003", USER_EVENT.getCode(), "SYNC_MACHINE_DETAILS", "Sync machine details"), + SYNC_DEVICE_DETAILS("REG-SYNC-004", USER_EVENT.getCode(), "SYNC_DEVICE_DETAILS", "Sync device details"), + SYNC_USER_DETAILS("REG-SYNC-005", USER_EVENT.getCode(), "SYNC_USER_DETAILS", "Sync user details"), + SYNC_REGISTRATION_PACKET_STATUS("REG-SYNC-006", USER_EVENT.getCode(), "SYNC_REGISTRATION_PACKET_STATUS", + "Sync registration packet status"), + SYNC_PRE_REGISTRATION_PACKET("REG-SYNC-007", USER_EVENT.getCode(), "SYNC_PRE_REGISTRATION_PACKET", + "Sync pre-registration data"), + + // Scheduler Util + SCHEDULER_REFRESHED_TIMEOUT("REG-SCH-002", SYSTEM_EVENT.getCode(), "REFRESHED_TIMEOUT", + "The time task remainder alert"), + SCHEDULER_SESSION_TIMEOUT("REG-SCH-003", SYSTEM_EVENT.getCode(), "SESSION_TIMEOUT", + "The time task session expires"); AuditEvent(String id, String type, String name, String description) { this.id = id; this.type = type; diff --git a/lib/provider/global_provider.dart b/lib/provider/global_provider.dart index 6b5dae46d..3d3b0a507 100644 --- a/lib/provider/global_provider.dart +++ b/lib/provider/global_provider.dart @@ -930,6 +930,10 @@ class GlobalProvider with ChangeNotifier { // Check and request permission LocationPermission permission = await Geolocator.checkPermission(); if (permission == LocationPermission.denied) { + audit.performAudit( + "REG-NAV-005", + "REG-MOD-102", + ); permission = await Geolocator.requestPermission(); if (permission == LocationPermission.denied) { // Permissions still denied diff --git a/lib/ui/approve_packet/widget/template_bottom_sheet.dart b/lib/ui/approve_packet/widget/template_bottom_sheet.dart index 9e6173cc4..1903a2bd8 100644 --- a/lib/ui/approve_packet/widget/template_bottom_sheet.dart +++ b/lib/ui/approve_packet/widget/template_bottom_sheet.dart @@ -10,6 +10,7 @@ import 'package:webview_flutter_plus/webview_flutter_plus.dart'; import '../../../model/registration.dart'; import '../../../provider/approve_packets_provider.dart'; +import '../../../provider/global_provider.dart'; import 'reject_dialogbox.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -32,6 +33,7 @@ class TemplateBottomSheet { return ChangeNotifierProvider.value( value: context.watch(), builder: (context, _) { + final globalProvider = context.read(); int currentInd = context.watch().currentInd; Registration regCurrent = context .read() @@ -67,6 +69,8 @@ class TemplateBottomSheet { context .read() .setWebViewPlusController(controller); + context.read() + .getAudit("REG-EVT-066", "REG-MOD-103"); loadHtmlData(controller, regCurrent.id!); }, javascriptMode: JavascriptMode.unrestricted, @@ -140,6 +144,7 @@ class TemplateBottomSheet { onPressed: reviewStatus == ReviewStatus.APPROVED.name ? null : () { + globalProvider.getAudit("REG-EVT-067", "REG-MOD-103"); context .read() .approvePacket(regCurrent.packetId); @@ -177,6 +182,7 @@ class TemplateBottomSheet { onPressed: reviewStatus == ReviewStatus.REJECTED.name ? null : () { + globalProvider.getAudit("REG-EVT-068", "REG-MOD-103"); showDialog( context: context, builder: (BuildContext context) { diff --git a/lib/ui/export_packet/widgets/export_button.dart b/lib/ui/export_packet/widgets/export_button.dart index c0257d47e..b9d682e9e 100644 --- a/lib/ui/export_packet/widgets/export_button.dart +++ b/lib/ui/export_packet/widgets/export_button.dart @@ -7,7 +7,7 @@ import '../../../provider/export_packet_provider.dart'; import '../../../utils/app_config.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import '../../../provider/global_provider.dart'; class ExportButton extends StatefulWidget { const ExportButton({super.key}); @@ -47,6 +47,10 @@ class _ExportButtonState extends State { }else{ await exportPacketsProvider.packetSyncAll(); } + await context.read().getAudit( + "REG-EXPT-PKT-001", + "REG-MOD-103" + ); await exportPacketsProvider.exportSelected(); exportPacketsProvider.searchedList(); }, diff --git a/lib/ui/export_packet/widgets/upload_button.dart b/lib/ui/export_packet/widgets/upload_button.dart index 151b09cfa..6460c4285 100644 --- a/lib/ui/export_packet/widgets/upload_button.dart +++ b/lib/ui/export_packet/widgets/upload_button.dart @@ -5,6 +5,7 @@ import '../../../provider/connectivity_provider.dart'; import '../../../provider/export_packet_provider.dart'; import '../../../utils/app_config.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import '../../../provider/global_provider.dart'; class UploadButton extends StatefulWidget { const UploadButton({super.key}); @@ -38,6 +39,8 @@ class _UploadButtonState extends State { return OutlinedButton( onPressed:(context.watch().countSelected==0)?null: () async { + Provider.of(context, listen: false).getAudit("REG-SYNC-014", "REG-MOD-102"); + await connectivityProvider.checkNetworkConnection(); if (!connectivityProvider.isConnected) { _showInSnackBar(appLocalizations.network_error); diff --git a/lib/ui/login_page.dart b/lib/ui/login_page.dart index c150cade3..4c1f0895c 100644 --- a/lib/ui/login_page.dart +++ b/lib/ui/login_page.dart @@ -247,7 +247,7 @@ class _LoginPageState extends State with WidgetsBindingObserver { _showInSnackBar(appLocalizations.username_incorrect); return; } - + globalProvider.getAudit("REG-AUTH-001","REG-MOD-101"); final User user = authProvider.currentUser; globalProvider.setCenterId(user.centerId!); globalProvider.setName(user.name!); diff --git a/lib/ui/onboard/home_page.dart b/lib/ui/onboard/home_page.dart index 98dfc5efb..3c1b47e19 100644 --- a/lib/ui/onboard/home_page.dart +++ b/lib/ui/onboard/home_page.dart @@ -92,6 +92,7 @@ class _HomePageState extends State { await registrationTaskProvider.getListOfProcesses(); await globalProvider.getRegCenterName( globalProvider.centerId, globalProvider.selectedLanguage); + await globalProvider.getAudit("REG-SYNC-002", "REG-MOD-102"); await globalProvider.initializeLanguageDataList(true); await globalProvider.initializeLocationHierarchyMap(); } @@ -132,7 +133,23 @@ class _HomePageState extends State { } } globalProvider.createRegistrationLanguageMap(); - globalProvider.getAudit("REG-HOME-002", "REG-MOD-102"); + //globalProvider.getAudit("REG-HOME-002", "REG-MOD-102"); + String auditeventid="REG-EVT-002"; + switch(process.flow){ + case "NEW": + auditeventid="REG-EVT-002"; + break; + case "UPDATE": + auditeventid="REG-EVT-003"; + break; + case "LOST": + auditeventid="REG-EVT-001"; + break; + case "CORRECTION": + auditeventid="REG-EVT-007"; + break; + } + globalProvider.getAudit(auditeventid, "REG-MOD-102"); showDialog( context: context, builder: (BuildContext context) => LanguageSelector( @@ -236,7 +253,8 @@ class _HomePageState extends State { "assets/svg/Uploading Local - Registration Data.svg", ), "title": appLocalizations.appliction_upload, - "onTap": (context) { + "onTap": (context){ + Provider.of(context, listen: false).getAudit("REG-EVT-005", "REG-MOD-102"); Navigator.push( context, MaterialPageRoute( @@ -289,7 +307,7 @@ class _HomePageState extends State { return MobileHomePage( operationalTasks: operationalTasks, getProcessUI: (BuildContext context, Process process) { - getProcessUI(context, process); + return getProcessUI(context, process); }, syncData: (BuildContext context) { syncData(context); diff --git a/lib/ui/process_ui/generic_process.dart b/lib/ui/process_ui/generic_process.dart index a8ee190cb..933207425 100644 --- a/lib/ui/process_ui/generic_process.dart +++ b/lib/ui/process_ui/generic_process.dart @@ -100,6 +100,25 @@ class _GenericProcessState extends State }, )); _registrationScreenLoadedAudit(); + WidgetsBinding.instance.addPostFrameCallback((_) async { + await _fetchLocation(); + }); + } + + bool _locationFetched = false; + + Future _fetchLocation() async { + if (_locationFetched) return; + _locationFetched = true; + + Position? position = await globalProvider.fetchLocation(); + if (position != null) { + globalProvider.getAudit("REG-GEO-LOC-001", "REG-MOD-103"); + registrationTaskProvider.setCurrentLocation(position.latitude, position.longitude); + } else { + debugPrint("Location unavailable — permission denied or service off."); + globalProvider.getAudit("REG-GEO-LOC-002", "REG-MOD-103"); + } } @override @@ -208,7 +227,7 @@ class _GenericProcessState extends State } _nextButtonClickedAudit() async { - await globalProvider.getAudit("REG-EVT-003", "REG-MOD-103"); + await globalProvider.getAudit("REG-EVT-069", "REG-MOD-103"); } setScrollToTop() { @@ -633,9 +652,11 @@ class _GenericProcessState extends State } if (globalProvider.newProcessTabIndex < size) { - await ageDateChangeValidation(globalProvider.newProcessTabIndex, process, size); + await ageDateChangeValidation( + globalProvider.newProcessTabIndex, process, size); bool customValidator = - await customValidation(globalProvider.newProcessTabIndex, process, size); + await customValidation( + globalProvider.newProcessTabIndex, process, size); if (customValidator) { if (globalProvider.formKey.currentState!.validate()) { // Additional info validation - prevent navigation if required but not filled diff --git a/lib/ui/process_ui/widgets/document_upload_control.dart b/lib/ui/process_ui/widgets/document_upload_control.dart index 57bd4509c..1e8e08fc8 100644 --- a/lib/ui/process_ui/widgets/document_upload_control.dart +++ b/lib/ui/process_ui/widgets/document_upload_control.dart @@ -49,6 +49,28 @@ class _DocumentUploadControlState extends State { } int maxFileSize = 2 * 1024 * 1024; // Default 2MB + Future _documentAudit(String action) async { + String event=""; + + switch (action) { + case "SCAN": + event = "REG-EVT-089"; + break; + case "VIEW": + event = "REG-EVT-090"; + break; + case "DELETE": + event = "REG-EVT-091"; + break; + default: + event =""; + } + + if (event.isNotEmpty) { + await context.read() + .getAudit(event, "REG-MOD-103"); + } + } _fetchMaxFileSize() async { try { @@ -269,8 +291,8 @@ class _DocumentUploadControlState extends State { } } - _documentScanClickedAudit() async { - await context.read().getAudit("REG-EVT-004", "REG-MOD-103"); + _documentScanClickedAudit() { + _documentAudit("SCAN"); } Future> getImageBytes(String imagePath) async { @@ -499,19 +521,19 @@ class _DocumentUploadControlState extends State { onPressed: (documentController.text == "") ? null : () async { - _documentScanClickedAudit(); - var doc = await Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - CustomScanner( - field: widget.field)), - ); - - await addDocument( - doc, widget.field, referenceNumber); - await getScannedDocuments(widget.field); - }, + _documentScanClickedAudit(); + var doc = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + CustomScanner( + field: widget.field)), + ); + + await addDocument( + doc, widget.field, referenceNumber); + await getScannedDocuments(widget.field); + }, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -548,6 +570,7 @@ class _DocumentUploadControlState extends State { children: [ InkWell( onTap: () { + _documentAudit("VIEW"); Navigator.push( context, MaterialPageRoute( @@ -568,7 +591,8 @@ class _DocumentUploadControlState extends State { ), SizedBox(height: 2.h), GestureDetector( - onTap: () { + onTap: () { + _documentAudit("DELETE"); _deleteImage(widget.field, item); _removeFieldValue(widget.field, item); _setRemoveScannedPages(widget.field, @@ -768,18 +792,18 @@ class _DocumentUploadControlState extends State { onPressed: (documentController.text == "") ? null : () async { - _documentScanClickedAudit(); - var doc = await Navigator.push( - context, - MaterialPageRoute( - builder: (context) => CustomScanner( - field: widget.field)), - ); - await addDocument( - doc, widget.field, referenceNumber); + _documentScanClickedAudit(); + var doc = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => CustomScanner( + field: widget.field)), + ); + await addDocument( + doc, widget.field, referenceNumber); - await getScannedDocuments(widget.field); - }, + await getScannedDocuments(widget.field); + }, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -814,7 +838,8 @@ class _DocumentUploadControlState extends State { child: Column( children: [ InkWell( - onTap: () { + onTap: () { + _documentAudit("VIEW"); Navigator.push( context, MaterialPageRoute( @@ -835,7 +860,8 @@ class _DocumentUploadControlState extends State { ), SizedBox(height: 10.h), GestureDetector( - onTap: () { + onTap: () { + _documentAudit("DELETE"); _deleteImage(widget.field, item); _removeFieldValue(widget.field, item); _setRemoveScannedPages(widget.field, diff --git a/lib/ui/process_ui/widgets/pre_reg_data_control.dart b/lib/ui/process_ui/widgets/pre_reg_data_control.dart index 756235519..ec985dfdd 100644 --- a/lib/ui/process_ui/widgets/pre_reg_data_control.dart +++ b/lib/ui/process_ui/widgets/pre_reg_data_control.dart @@ -273,6 +273,7 @@ class _PreRegDataControlState extends State { ), ), onPressed: () async { + globalProvider.getAudit("REG-SYNC-007", "REG-MOD-102"); widget.onFetched(); // Validate form field first if (!_formFieldKey.currentState!.validate()) { @@ -348,6 +349,7 @@ class _PreRegDataControlState extends State { ), ), onPressed: () async { + globalProvider.getAudit("REG-SYNC-007", "REG-MOD-102"); widget.onFetched(); var data = await Navigator.push( context, diff --git a/lib/ui/scanner/custom_scanner.dart b/lib/ui/scanner/custom_scanner.dart index 4597caa6a..4d923b42c 100644 --- a/lib/ui/scanner/custom_scanner.dart +++ b/lib/ui/scanner/custom_scanner.dart @@ -38,7 +38,7 @@ class _CustomScannerState extends State { ImageFormat format = ImageFormat.jpg; _documentScanFailedAudit() async { - await context.read().getAudit("REG-EVT-005", "REG-MOD-103"); + await context.read().getAudit("REG-EVT-050", "REG-MOD-103"); } _documentPreviewAudit() async { @@ -110,7 +110,6 @@ class _CustomScannerState extends State { : const SizedBox.shrink(); if (_pickedFile != null) { - _documentPreviewAudit(); return Column( children: [ Expanded( @@ -200,6 +199,7 @@ class _CustomScannerState extends State { final pickedFile = await ImagePicker().pickImage(source: ImageSource.camera); if (pickedFile != null) { _pickedFile = await pickedFile.readAsBytes(); + context.read().getAudit("REG-EVT-006", "REG-MOD-103"); setState(() {}); } else { Navigator.pop(context); diff --git a/lib/utils/inactivity_tracker.dart b/lib/utils/inactivity_tracker.dart index 3c1bfee90..014ccb6a9 100644 --- a/lib/utils/inactivity_tracker.dart +++ b/lib/utils/inactivity_tracker.dart @@ -94,12 +94,13 @@ class _InactivityTrackerState extends State with WidgetsBindi _warningShown = true; _dialogOpen = true; _countdown.value = widget.gracePeriod.inSeconds; - + globalProvider.getAudit("REG-SCH-002", "REG-MOD-103"); _logoutTicker = Timer.periodic(const Duration(seconds: 1), (t) { _countdown.value -= 1; if (_countdown.value <= 0) { t.cancel(); // Clear registration process data on auto logout + globalProvider.getAudit("REG-SCH-003", "REG-MOD-103"); globalProvider.clearRegistrationProcessData(); widget.onTimeout(); }