Android mobile client for the Axelliant HRIS platform backed by ERPNext/Frappe custom methods hosted at https://hris.axelliant.com/api/method/.
Repository: HRMS-Axelliant-Android
See ARCHITECTURE.md for runtime boundaries, data flows, and the modernization path. See COMPATIBILITY-MATRIX.md for the current shared backend/client support matrix.
This app should do four things reliably:
- Let employees complete daily HR actions in under a minute.
- Let managers approve or reject requests without opening the web portal.
- Keep users informed with real notifications, not just passive screens.
- Feel modern, stable, and trustworthy enough to use every day.
The codebase is functional but behind modern product expectations.
- Dashboard, attendance, leave, expense, and approvals are implemented through custom ERPNext/Frappe methods.
- Microsoft login is wired through MSAL.
- The app still has legacy fragility in screen state and payload handling.
- Native push notifications are not implemented. There is no FCM dependency, no notification permission flow, and no delivery pipeline yet. The backend now exposes a registration and inbox contract, but Android runtime delivery still needs to be built.
android:usesCleartextTraffic="true"is enabled in the manifest and should be removed unless there is a documented non-HTTPS dependency.- Build verification currently depends on local Java/Android SDK setup.
The app now targets the versioned mobile contract under:
hrms.api.mobile_v1.*
This is valid for Frappe because custom whitelisted methods can be exposed under /api/method/..., but it creates product risk when there is no explicit API contract, schema validation, or versioning policy.
Official references:
- Frappe REST API: https://docs.frappe.io/framework/user/en/api/rest
- Frappe document API: https://docs.frappe.io/framework/user/en/api/document
- Frappe webhooks: https://docs.frappe.io/framework/user/en/guides/integration/webhooks
Base URL:
https://hris.axelliant.com/api/method/
Authentication:
- Microsoft login exchange:
POST hrms.api.mobile_v1.get_set_user_token
- all other authenticated calls use:
Authorization: token <api_key>:<api_secret>
Core endpoint groups:
- Dashboard and attendance
POST hrms.api.mobile_v1.get_dashboard_overviewGET hrms.api.mobile_v1.mobile_dashboardGET hrms.api.mobile_v1.get_week_attendance_statsPOST hrms.api.mobile_v1.get_month_attendance_statsPOST hrms.api.mobile_v1.get_filtered_attendancePOST hrms.api.mobile_v1.get_team_attendanceGET hrms.api.mobile_v1.get_team_checkin_detailPOST hrms.api.mobile_v1.get_team_checkin_detail_list
- Check-in and attendance requests
GET hrms.api.mobile_v1.get_checkin_select_fieldPOST hrms.api.mobile_v1.create_checkinPOST hrms.api.mobile_v1.get_employee_checkins(replaces legacyget_checkin_request)POST hrms.api.mobile_v1.update_checkin_requestPOST hrms.api.mobile_v1.removed_checkinPOST hrms.api.mobile_v1.get_checkin_approvalsPOST hrms.api.mobile_v1.update_checkin_approval_status
- Leave
POST hrms.api.mobile_v1.get_leave_details_selfPOST hrms.api.mobile_v1.get_leave_application_requestsPOST hrms.api.mobile_v1.get_leave_application_requests_teamGET hrms.api.mobile_v1.get_leave_typeGET hrms.api.mobile_v1.get_leaves_detailPOST hrms.api.mobile_v1.create_leave_applicationPOST hrms.api.mobile_v1.update_leave_applicationPOST hrms.api.mobile_v1.removed_leave_applicationPOST hrms.api.mobile_v1.update_leave_statusPOST hrms.api.mobile_v1.get_leave_daysPOST hrms.api.mobile_v1.upcoming_leave_self
- Expense
POST hrms.api.mobile_v1.get_expense_claim_requestsGET hrms.api.mobile_v1.get_expense_typePOST hrms.api.mobile_v1.create_expensesPOST hrms.api.mobile_v1.update_expensePOST hrms.api.mobile_v1.delete_expense_claimPOST hrms.api.mobile_v1.delete_attachmentPOST hrms.api.mobile_v1.get_expense_approvalsPOST hrms.api.mobile_v1.change_status_of_expensePOST hrms.api.mobile_v1.upload_file_attachment
- Aggregate approvals and requests
POST hrms.api.mobile_v1.get_approvalsPOST hrms.api.mobile_v1.take_approval_actionPOST hrms.api.mobile_v1.get_requests
- Notifications
GET hrms.api.mobile_v1.get_notification_capabilitiesPOST hrms.api.mobile_v1.get_notificationsPOST hrms.api.mobile_v1.mark_notification_readPOST hrms.api.mobile_v1.mark_all_notifications_readPOST hrms.api.mobile_v1.register_notification_devicePOST hrms.api.mobile_v1.disable_notification_device
API rules for developers:
- keep the Android app pointed at
mobile_v1, not legacyhrms.hr.doctype.employee.* - preserve current payload shapes when changing backend wrappers unless you are coordinating a client migration
- approval/update endpoints now enforce owner or approver scope on the backend
- the aggregate approval API makes approval ownership explicit by
approval_type - malformed backend errors must be translated to user-safe UI text, not shown raw
- The home grid was relying on fragile runtime ordering. Initial fixes have started.
- Some request flows assume perfect payload formatting and index directly into split arrays.
- Notification UX exists visually, but delivery capability does not exist technically.
- The app has no typed backend compatibility layer, no contract tests, and very limited crash-prevention around malformed payloads.
- Approval flows exist, but they are only as reliable as the custom ERPNext methods behind them.
This repo should move in the following order.
- Remove brittle list indexing and unsafe payload parsing across dashboard, request, approval, and detail screens.
- Add central API error normalization so backend messages do not surface as raw technical toasts.
- Audit every custom endpoint for nullable and missing-field behavior.
- Remove cleartext traffic unless explicitly required.
- Add smoke tests for login, dashboard load, check-in request, leave request, and approval actions.
- Add real push notifications using FCM.
- Register device tokens against the backend user profile.
- Define notification event types for approvals, leave status, expense status, missed punch-outs, and announcements.
- Add a notification inbox screen backed by ERPNext Notification Log or a custom notification doctype.
- Add badge counts and deep links into approval and request detail screens.
- Redesign the dashboard around "today" rather than a static tile grid.
- Show pending approvals, next action, current attendance status, and team risk signals above the fold.
- Improve empty states, skeleton loading, retry behavior, and offline messaging.
- Add analytics and crash reporting before expanding feature scope.
- Introduce a typed domain layer for
Dashboard,Attendance,Leave,Expense, andApproval. - Replace screen-specific payload parsing with mapper classes and sealed result states.
- Version the ERPNext custom methods or place them behind a BFF layer if backend ownership allows it.
- Add feature flags for rollout of notifications, approvals redesign, and dashboard refresh.
Prerequisites:
- JDK 17 or the version required by your Android Gradle setup
- Android Studio Hedgehog or newer
- Android SDK for
compileSdk 34
Run:
bash ./gradlew assembleDebugUseful commands:
bash ./gradlew lint
bash ./gradlew testDebugUnitTest
bash ./gradlew assembleDebug
bash ./gradlew bundleReleaseRelease workflow:
git checkout develop
git pull --rebase origin develop
git push origin develop
git tag android-v1.5.0
git push origin android-v1.5.0Notes:
- CI validation runs on pull requests and pushes.
- the release workflow is triggered by tags matching
android-v*or by manual workflow dispatch - cut release tags from the branch you intend to ship after CI is green
This repo now includes:
android-ci.ymlfor PR and main-branch validationandroid-release.ymlfor tagged or manually triggered release builds
Store-ready release signing and Google Play publishing are driven by GitHub configuration.
GitHub secrets:
ANDROID_KEYSTORE_BASE64ANDROID_KEYSTORE_PASSWORDANDROID_KEY_ALIASANDROID_KEY_PASSWORDGOOGLE_PLAY_SERVICE_ACCOUNT_JSON
GitHub variables:
ANDROID_PACKAGE_NAMEANDROID_PLAY_TRACKANDROID_PLAY_RELEASE_STATUS
Recommended values:
ANDROID_PACKAGE_NAME=com.axelliant.hrisANDROID_PLAY_TRACK=internalANDROID_PLAY_RELEASE_STATUS=completed
If the signing secrets are not configured, the release workflow still builds artifacts, but they will not be signed for store distribution. If GOOGLE_PLAY_SERVICE_ACCOUNT_JSON and ANDROID_PACKAGE_NAME are configured, the workflow will also push the generated .aab to Google Play.
If we are funding only the next small release, the order should be:
- Approval reliability
- Notification capability
- Dashboard redesign
- Test coverage and crash prevention
Recent engineering work has already started to reduce home-screen fragility and unsafe indexing. The next engineering pass should target approval workflows, notification plumbing, and payload hardening across all manager flows.
