From bb4a2fc6205d4e732d4e9899e13faea7e1038ab8 Mon Sep 17 00:00:00 2001 From: techsavvy185 Date: Mon, 12 Oct 2026 20:11:45 +0530 Subject: [PATCH 1/2] PR to implement ELM --- .importlinter | 15 + client/package-lock.json | 23 + client/package.json | 1 + client/src/app/registry.ts | 5 + client/src/modules/leave_elm/api.ts | 57 + .../leave_elm/pages/LeaveAdminPage.tsx | 144 + .../leave_elm/pages/LeaveTasksPage.tsx | 60 + .../modules/leave_elm/pages/MyLeavePage.tsx | 81 + client/src/modules/leave_elm/routes.tsx | 19 + client/src/modules/leave_elm/types.ts | 37 + config/celery.py | 6 +- config/settings/base.py | 1 + config/urls.py | 1 + devtools/elm_trial_check.py | 60 + devtools/qwen_elm_trial.py | 191 + .../elm-qwen-trial/PR_DESCRIPTION.md | 20 + docs/08-delivery/elm-qwen-trial/README.md | 41 + .../elm-qwen-trial/TRIAL_RECORD.md | 106 + .../application-model-context.md | 91 + .../elm-qwen-trial/check-environment.json | 5 + .../check-settings/qwen_build_settings.py | 3 + .../check-settings/qwen_build_urls.py | 2 + .../check-settings/qwen_isolated_settings.py | 6 + docs/08-delivery/elm-qwen-trial/checks.jsonl | 24 + docs/08-delivery/elm-qwen-trial/checks.log | 797 ++ .../elm-qwen-trial/file-inventory.json | 32 + .../final-model-differences.patch | 1001 ++ .../integration-registration.patch | 154 + .../elm-qwen-trial/jobs/01-foundation.json | 20 + .../elm-qwen-trial/jobs/01b-models.json | 14 + .../elm-qwen-trial/jobs/01c-registry.json | 20 + .../elm-qwen-trial/jobs/01d-contracts.json | 12 + .../elm-qwen-trial/jobs/02-services.json | 21 + .../jobs/02b-registry-interface.json | 14 + .../elm-qwen-trial/jobs/02c-core-service.json | 17 + .../jobs/02d-registry-task-last.json | 13 + .../jobs/02e-service-task-last.json | 16 + .../jobs/02f-domain-placement.json | 19 + .../elm-qwen-trial/jobs/02g-followups.json | 16 + .../jobs/02h-queries-small.json | 20 + .../elm-qwen-trial/jobs/03-api.json | 24 + .../elm-qwen-trial/jobs/03a-serializers.json | 14 + .../elm-qwen-trial/jobs/04-frontend-api.json | 23 + .../jobs/11-application-create.json | 20 + .../elm-qwen-trial/jobs/12-actions.json | 21 + .../elm-qwen-trial/jobs/13-serializers.json | 18 + .../elm-qwen-trial/jobs/14-api-views.json | 23 + .../elm-qwen-trial/jobs/15-configuration.json | 20 + .../elm-qwen-trial/jobs/16-api-urls.json | 16 + .../jobs/16b-configuration-build.json | 19 + .../elm-qwen-trial/jobs/17-events.json | 19 + .../elm-qwen-trial/jobs/18-tasks.json | 21 + .../elm-qwen-trial/jobs/18b-schedule.json | 16 + .../jobs/19-record-serializers.json | 16 + .../elm-qwen-trial/jobs/20-frontend-api.json | 21 + .../elm-qwen-trial/jobs/21-mine-page.json | 20 + .../elm-qwen-trial/jobs/21b-mine-build.json | 18 + .../elm-qwen-trial/jobs/21c-mine-raw.json | 19 + .../elm-qwen-trial/jobs/22-queue-page.json | 20 + .../elm-qwen-trial/jobs/22b-queue-raw.json | 21 + .../elm-qwen-trial/jobs/23-admin-page.json | 20 + .../elm-qwen-trial/jobs/23b-admin-raw.json | 21 + .../jobs/24-frontend-routes.json | 17 + .../elm-qwen-trial/jobs/25-api-types.json | 17 + .../jobs/26-queue-compiler.json | 20 + .../jobs/27-admin-compiler.json | 20 + .../elm-qwen-trial/jobs/28-mine-compiler.json | 20 + .../elm-qwen-trial/jobs/29-module-readme.json | 21 + .../elm-qwen-trial/jobs/30-trial-report.json | 20 + .../elm-qwen-trial/mechanical-001.patch | 100 + .../elm-qwen-trial/mechanical-002.patch | 21 + .../elm-qwen-trial/mechanical-corrections.md | 49 + .../elm-qwen-trial/observed-results.json | 691 + .../problem-statement-context.md | 123 + docs/08-delivery/elm-qwen-trial/prompts.md | 11116 ++++++++++++++++ .../elm-qwen-trial/responses/001.request.json | 59 + .../elm-qwen-trial/responses/001.response.txt | 5 + .../responses/001.statistics.json | 27 + .../elm-qwen-trial/responses/002.before.json | 3 + .../elm-qwen-trial/responses/002.request.json | 35 + .../elm-qwen-trial/responses/002.response.txt | 5 + .../responses/002.statistics.json | 22 + .../responses/003.recovery-before.json | 7 + .../responses/003.recovery.json | 18 + .../elm-qwen-trial/responses/003.request.json | 55 + .../elm-qwen-trial/responses/003.response.txt | 8 + .../responses/003.statistics.json | 24 + .../elm-qwen-trial/responses/004.before.json | 3 + .../elm-qwen-trial/responses/004.request.json | 35 + .../elm-qwen-trial/responses/004.response.txt | 1 + .../responses/004.statistics.json | 22 + .../elm-qwen-trial/responses/005.request.json | 47 + .../elm-qwen-trial/responses/005.response.txt | 4 + .../responses/005.statistics.json | 22 + .../elm-qwen-trial/responses/006.before.json | 3 + .../elm-qwen-trial/responses/006.request.json | 35 + .../elm-qwen-trial/responses/006.response.txt | 5 + .../responses/006.statistics.json | 22 + .../elm-qwen-trial/responses/007.request.json | 35 + .../elm-qwen-trial/responses/007.response.txt | 3 + .../responses/007.statistics.json | 19 + .../elm-qwen-trial/responses/008.before.json | 3 + .../elm-qwen-trial/responses/008.request.json | 35 + .../elm-qwen-trial/responses/008.response.txt | 5 + .../responses/008.statistics.json | 22 + .../elm-qwen-trial/responses/009.request.json | 35 + .../elm-qwen-trial/responses/009.response.txt | 3 + .../responses/009.statistics.json | 19 + .../elm-qwen-trial/responses/010.before.json | 3 + .../elm-qwen-trial/responses/010.request.json | 37 + .../elm-qwen-trial/responses/010.response.txt | 5 + .../responses/010.statistics.json | 22 + .../elm-qwen-trial/responses/011.before.json | 3 + .../elm-qwen-trial/responses/011.request.json | 37 + .../elm-qwen-trial/responses/011.response.txt | 5 + .../responses/011.statistics.json | 22 + .../elm-qwen-trial/responses/012.before.json | 3 + .../elm-qwen-trial/responses/012.request.json | 37 + .../elm-qwen-trial/responses/012.response.txt | 5 + .../responses/012.statistics.json | 22 + .../elm-qwen-trial/responses/013.before.json | 3 + .../elm-qwen-trial/responses/013.request.json | 37 + .../elm-qwen-trial/responses/013.response.txt | 4 + .../responses/013.statistics.json | 22 + .../elm-qwen-trial/responses/014.before.json | 3 + .../elm-qwen-trial/responses/014.request.json | 37 + .../elm-qwen-trial/responses/014.response.txt | 5 + .../responses/014.statistics.json | 22 + .../elm-qwen-trial/responses/015.before.json | 3 + .../elm-qwen-trial/responses/015.request.json | 37 + .../elm-qwen-trial/responses/015.response.txt | 5 + .../responses/015.statistics.json | 22 + .../elm-qwen-trial/responses/016.before.json | 3 + .../elm-qwen-trial/responses/016.request.json | 37 + .../elm-qwen-trial/responses/016.response.txt | 5 + .../responses/016.statistics.json | 22 + .../elm-qwen-trial/responses/017.before.json | 3 + .../elm-qwen-trial/responses/017.request.json | 37 + .../elm-qwen-trial/responses/017.response.txt | 5 + .../responses/017.statistics.json | 22 + .../elm-qwen-trial/responses/018.before.json | 3 + .../elm-qwen-trial/responses/018.request.json | 37 + .../elm-qwen-trial/responses/018.response.txt | 5 + .../responses/018.statistics.json | 22 + .../elm-qwen-trial/responses/019.before.json | 3 + .../elm-qwen-trial/responses/019.request.json | 37 + .../elm-qwen-trial/responses/019.response.txt | 5 + .../responses/019.statistics.json | 22 + .../elm-qwen-trial/responses/020.before.json | 4 + .../elm-qwen-trial/responses/020.request.json | 41 + .../elm-qwen-trial/responses/020.response.txt | 4 + .../responses/020.statistics.json | 24 + .../elm-qwen-trial/responses/021.before.json | 3 + .../elm-qwen-trial/responses/021.request.json | 37 + .../elm-qwen-trial/responses/021.response.txt | 5 + .../responses/021.statistics.json | 22 + .../elm-qwen-trial/responses/022.before.json | 3 + .../elm-qwen-trial/responses/022.request.json | 37 + .../elm-qwen-trial/responses/022.response.txt | 5 + .../responses/022.statistics.json | 22 + .../elm-qwen-trial/responses/023.before.json | 3 + .../elm-qwen-trial/responses/023.request.json | 37 + .../elm-qwen-trial/responses/023.response.txt | 5 + .../responses/023.statistics.json | 22 + .../elm-qwen-trial/responses/024.before.json | 3 + .../elm-qwen-trial/responses/024.request.json | 37 + .../elm-qwen-trial/responses/024.response.txt | 2 + .../responses/024.statistics.json | 22 + .../elm-qwen-trial/responses/025.before.json | 3 + .../elm-qwen-trial/responses/025.request.json | 37 + .../elm-qwen-trial/responses/025.response.txt | 3 + .../responses/025.statistics.json | 22 + .../elm-qwen-trial/responses/026.before.json | 3 + .../elm-qwen-trial/responses/026.request.json | 37 + .../elm-qwen-trial/responses/026.response.txt | 1 + .../responses/026.statistics.json | 22 + .../elm-qwen-trial/responses/027.before.json | 3 + .../elm-qwen-trial/responses/027.request.json | 16 + .../elm-qwen-trial/responses/027.response.txt | 83 + .../responses/027.statistics.json | 22 + .../elm-qwen-trial/responses/028.before.json | 3 + .../elm-qwen-trial/responses/028.request.json | 16 + .../elm-qwen-trial/responses/028.response.txt | 60 + .../responses/028.statistics.json | 22 + .../elm-qwen-trial/responses/029.before.json | 3 + .../elm-qwen-trial/responses/029.request.json | 16 + .../elm-qwen-trial/responses/029.response.txt | 146 + .../responses/029.statistics.json | 22 + .../elm-qwen-trial/responses/030.before.json | 3 + .../elm-qwen-trial/responses/030.request.json | 16 + .../elm-qwen-trial/responses/030.response.txt | 21 + .../responses/030.statistics.json | 22 + .../elm-qwen-trial/responses/031.before.json | 3 + .../elm-qwen-trial/responses/031.request.json | 16 + .../elm-qwen-trial/responses/031.response.txt | 39 + .../responses/031.statistics.json | 22 + .../elm-qwen-trial/responses/032.before.json | 3 + .../elm-qwen-trial/responses/032.request.json | 16 + .../elm-qwen-trial/responses/032.response.txt | 60 + .../responses/032.statistics.json | 22 + .../elm-qwen-trial/responses/033.before.json | 3 + .../elm-qwen-trial/responses/033.request.json | 16 + .../elm-qwen-trial/responses/033.response.txt | 172 + .../responses/033.statistics.json | 22 + .../elm-qwen-trial/responses/034.before.json | 3 + .../elm-qwen-trial/responses/034.request.json | 16 + .../elm-qwen-trial/responses/034.response.txt | 82 + .../responses/034.statistics.json | 22 + .../elm-qwen-trial/responses/035.before.json | 3 + .../elm-qwen-trial/responses/035.request.json | 16 + .../elm-qwen-trial/responses/035.response.txt | 60 + .../responses/035.statistics.json | 22 + .../elm-qwen-trial/responses/036.before.json | 3 + .../elm-qwen-trial/responses/036.request.json | 16 + .../elm-qwen-trial/responses/036.response.txt | 117 + .../responses/036.statistics.json | 22 + .../specification-context-compact.md | 397 + .../elm-qwen-trial/specification-context.md | 525 + .../elm-qwen-trial/specification-source.json | 13 + .../elm-qwen-trial/trial-metadata.json | 87 + .../08-delivery/elm-qwen-trial/trial-notes.md | 18 + modules/leave_elm/README.md | 61 + modules/leave_elm/__init__.py | 0 modules/leave_elm/api/__init__.py | 0 modules/leave_elm/api/configuration.py | 52 + modules/leave_elm/api/record_serializers.py | 12 + modules/leave_elm/api/serializers.py | 32 + modules/leave_elm/api/urls.py | 13 + modules/leave_elm/api/views.py | 48 + modules/leave_elm/apps.py | 6 + modules/leave_elm/contracts.py | 14 + modules/leave_elm/domain/__init__.py | 0 modules/leave_elm/domain/policy.py | 10 + modules/leave_elm/migrations/0001_initial.py | 208 + modules/leave_elm/migrations/__init__.py | 0 modules/leave_elm/models.py | 142 + modules/leave_elm/registry.py | 41 + modules/leave_elm/schedule.py | 16 + modules/leave_elm/selectors/__init__.py | 0 modules/leave_elm/services/__init__.py | 0 modules/leave_elm/services/actions.py | 150 + modules/leave_elm/services/applications.py | 43 + modules/leave_elm/services/events.py | 57 + modules/leave_elm/services/queries.py | 20 + modules/leave_elm/tasks.py | 10 + 245 files changed, 20854 insertions(+), 2 deletions(-) create mode 100644 client/src/modules/leave_elm/api.ts create mode 100644 client/src/modules/leave_elm/pages/LeaveAdminPage.tsx create mode 100644 client/src/modules/leave_elm/pages/LeaveTasksPage.tsx create mode 100644 client/src/modules/leave_elm/pages/MyLeavePage.tsx create mode 100644 client/src/modules/leave_elm/routes.tsx create mode 100644 client/src/modules/leave_elm/types.ts create mode 100644 devtools/elm_trial_check.py create mode 100644 devtools/qwen_elm_trial.py create mode 100644 docs/08-delivery/elm-qwen-trial/PR_DESCRIPTION.md create mode 100644 docs/08-delivery/elm-qwen-trial/README.md create mode 100644 docs/08-delivery/elm-qwen-trial/TRIAL_RECORD.md create mode 100644 docs/08-delivery/elm-qwen-trial/application-model-context.md create mode 100644 docs/08-delivery/elm-qwen-trial/check-environment.json create mode 100644 docs/08-delivery/elm-qwen-trial/check-settings/qwen_build_settings.py create mode 100644 docs/08-delivery/elm-qwen-trial/check-settings/qwen_build_urls.py create mode 100644 docs/08-delivery/elm-qwen-trial/check-settings/qwen_isolated_settings.py create mode 100644 docs/08-delivery/elm-qwen-trial/checks.jsonl create mode 100644 docs/08-delivery/elm-qwen-trial/checks.log create mode 100644 docs/08-delivery/elm-qwen-trial/file-inventory.json create mode 100644 docs/08-delivery/elm-qwen-trial/final-model-differences.patch create mode 100644 docs/08-delivery/elm-qwen-trial/integration-registration.patch create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/01-foundation.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/01b-models.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/01c-registry.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/01d-contracts.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/02-services.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/02b-registry-interface.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/02c-core-service.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/02d-registry-task-last.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/02e-service-task-last.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/02f-domain-placement.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/02g-followups.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/02h-queries-small.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/03-api.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/03a-serializers.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/04-frontend-api.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/11-application-create.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/12-actions.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/13-serializers.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/14-api-views.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/15-configuration.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/16-api-urls.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/16b-configuration-build.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/17-events.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/18-tasks.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/18b-schedule.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/19-record-serializers.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/20-frontend-api.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/21-mine-page.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/21b-mine-build.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/21c-mine-raw.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/22-queue-page.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/22b-queue-raw.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/23-admin-page.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/23b-admin-raw.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/24-frontend-routes.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/25-api-types.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/26-queue-compiler.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/27-admin-compiler.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/28-mine-compiler.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/29-module-readme.json create mode 100644 docs/08-delivery/elm-qwen-trial/jobs/30-trial-report.json create mode 100644 docs/08-delivery/elm-qwen-trial/mechanical-001.patch create mode 100644 docs/08-delivery/elm-qwen-trial/mechanical-002.patch create mode 100644 docs/08-delivery/elm-qwen-trial/mechanical-corrections.md create mode 100644 docs/08-delivery/elm-qwen-trial/observed-results.json create mode 100644 docs/08-delivery/elm-qwen-trial/problem-statement-context.md create mode 100644 docs/08-delivery/elm-qwen-trial/prompts.md create mode 100644 docs/08-delivery/elm-qwen-trial/responses/001.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/001.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/001.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/002.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/002.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/002.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/002.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/003.recovery-before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/003.recovery.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/003.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/003.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/003.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/004.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/004.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/004.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/004.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/005.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/005.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/005.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/006.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/006.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/006.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/006.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/007.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/007.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/007.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/008.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/008.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/008.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/008.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/009.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/009.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/009.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/010.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/010.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/010.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/010.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/011.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/011.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/011.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/011.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/012.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/012.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/012.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/012.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/013.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/013.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/013.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/013.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/014.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/014.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/014.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/014.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/015.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/015.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/015.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/015.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/016.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/016.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/016.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/016.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/017.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/017.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/017.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/017.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/018.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/018.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/018.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/018.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/019.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/019.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/019.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/019.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/020.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/020.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/020.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/020.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/021.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/021.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/021.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/021.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/022.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/022.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/022.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/022.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/023.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/023.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/023.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/023.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/024.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/024.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/024.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/024.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/025.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/025.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/025.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/025.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/026.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/026.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/026.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/026.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/027.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/027.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/027.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/027.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/028.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/028.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/028.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/028.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/029.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/029.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/029.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/029.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/030.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/030.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/030.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/030.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/031.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/031.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/031.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/031.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/032.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/032.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/032.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/032.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/033.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/033.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/033.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/033.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/034.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/034.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/034.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/034.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/035.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/035.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/035.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/035.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/036.before.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/036.request.json create mode 100644 docs/08-delivery/elm-qwen-trial/responses/036.response.txt create mode 100644 docs/08-delivery/elm-qwen-trial/responses/036.statistics.json create mode 100644 docs/08-delivery/elm-qwen-trial/specification-context-compact.md create mode 100644 docs/08-delivery/elm-qwen-trial/specification-context.md create mode 100644 docs/08-delivery/elm-qwen-trial/specification-source.json create mode 100644 docs/08-delivery/elm-qwen-trial/trial-metadata.json create mode 100644 docs/08-delivery/elm-qwen-trial/trial-notes.md create mode 100644 modules/leave_elm/README.md create mode 100644 modules/leave_elm/__init__.py create mode 100644 modules/leave_elm/api/__init__.py create mode 100644 modules/leave_elm/api/configuration.py create mode 100644 modules/leave_elm/api/record_serializers.py create mode 100644 modules/leave_elm/api/serializers.py create mode 100644 modules/leave_elm/api/urls.py create mode 100644 modules/leave_elm/api/views.py create mode 100644 modules/leave_elm/apps.py create mode 100644 modules/leave_elm/contracts.py create mode 100644 modules/leave_elm/domain/__init__.py create mode 100644 modules/leave_elm/domain/policy.py create mode 100644 modules/leave_elm/migrations/0001_initial.py create mode 100644 modules/leave_elm/migrations/__init__.py create mode 100644 modules/leave_elm/models.py create mode 100644 modules/leave_elm/registry.py create mode 100644 modules/leave_elm/schedule.py create mode 100644 modules/leave_elm/selectors/__init__.py create mode 100644 modules/leave_elm/services/__init__.py create mode 100644 modules/leave_elm/services/actions.py create mode 100644 modules/leave_elm/services/applications.py create mode 100644 modules/leave_elm/services/events.py create mode 100644 modules/leave_elm/services/queries.py create mode 100644 modules/leave_elm/tasks.py diff --git a/.importlinter b/.importlinter index d964dc3c..95276395 100644 --- a/.importlinter +++ b/.importlinter @@ -12,10 +12,15 @@ include_external_packages = True name = Modules may reach each other ONLY through contracts.py type = forbidden source_modules = + modules.leave_elm modules.placement modules.directory modules.accesscontrol forbidden_modules = + modules.leave_elm.models + modules.leave_elm.services + modules.leave_elm.api + modules.leave_elm.domain modules.placement.models modules.placement.services modules.placement.selectors @@ -38,6 +43,7 @@ type = forbidden source_modules = # Every module's domain, not just the first one written. modules.placement.domain + modules.leave_elm.domain forbidden_modules = django rest_framework @@ -66,3 +72,12 @@ layers = modules.placement.selectors modules.placement.models modules.placement.domain + +[importlinter:contract:elm-layers] +name = Layering inside ELM +type = layers +layers = + modules.leave_elm.api + modules.leave_elm.services + modules.leave_elm.models + modules.leave_elm.domain diff --git a/client/package-lock.json b/client/package-lock.json index 04403fdb..99073660 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -15,6 +15,7 @@ "dayjs": "^1.11.21", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-hook-form": "^7.90.0", "react-icons": "^5.3.0", "react-router-dom": "^6.27.0" }, @@ -3111,6 +3112,28 @@ "react": "^18.3.1" } }, + "node_modules/react-hook-form": { + "version": "7.90.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.90.0.tgz", + "integrity": "sha512-+NdG0FLzCPhFOp2NNxaUYLF9fyZhNjx9FTBBSYWF71/l6BBlmIc/j6xlp3DbaHWLJbIG7Zd8oznA19xJClU97w==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-icons": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz", diff --git a/client/package.json b/client/package.json index 5d4d3a9a..9b9e6ea7 100644 --- a/client/package.json +++ b/client/package.json @@ -21,6 +21,7 @@ "dayjs": "^1.11.21", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-hook-form": "^7.90.0", "react-icons": "^5.3.0", "react-router-dom": "^6.27.0" }, diff --git a/client/src/app/registry.ts b/client/src/app/registry.ts index e76d32bf..7a4e519f 100644 --- a/client/src/app/registry.ts +++ b/client/src/app/registry.ts @@ -12,6 +12,11 @@ export interface ModuleManifest { } export const MODULE_REGISTRY: Record = { + leave_elm: { + code: "leave_elm", + basePath: "/leave", + load: () => import("../modules/leave_elm/routes"), + }, placement_cell: { code: "placement_cell", basePath: "/placement", diff --git a/client/src/modules/leave_elm/api.ts b/client/src/modules/leave_elm/api.ts new file mode 100644 index 00000000..eb152021 --- /dev/null +++ b/client/src/modules/leave_elm/api.ts @@ -0,0 +1,57 @@ +import type { LeaveApplication, LeaveBalance, LeaveTask, LeaveHistory, LeaveNotification } from "./types"; +export type { LeaveApplication, LeaveBalance, LeaveTask, LeaveHistory, LeaveNotification } from "./types"; + + +import { http } from '../../lib/http'; + + + + +export interface Configuration { + policy?: Record[]; + calendar?: Record[]; +} + +export interface NewApplication { + leave_type: number; + start_date: string; + end_date: string; + purpose: string; +} + +export async function listApplications(): Promise { + const response = await http.get('/leave/applications'); + return response.data as LeaveApplication[]; +} + +export async function listBalances(): Promise { + const response = await http.get('/leave/balances'); + return response.data as LeaveBalance[]; +} + +export async function listTasks(): Promise { + const response = await http.get('/leave/tasks'); + return response.data as LeaveTask[]; +} + +export async function submitApplication(data: NewApplication): Promise { + await http.post('/leave/applications', data); +} + +export async function applicationAction(id: number, action: string, data: Record): Promise { + await http.post(`/leave/applications/${id}/action`, { action, data }); +} + +export async function getConfiguration(): Promise { + const response = await http.get('/leave/configuration'); + return response.data as Configuration; +} + +export async function saveConfiguration(data: Configuration): Promise { + await http.post('/leave/configuration', data); +} + +export async function getRecords(): Promise<{ history?: LeaveHistory[], notifications?: LeaveNotification[] }> { + const response = await http.get('/leave/records'); + return response.data as { history?: LeaveHistory[], notifications?: LeaveNotification[] }; +} diff --git a/client/src/modules/leave_elm/pages/LeaveAdminPage.tsx b/client/src/modules/leave_elm/pages/LeaveAdminPage.tsx new file mode 100644 index 00000000..72a75fa1 --- /dev/null +++ b/client/src/modules/leave_elm/pages/LeaveAdminPage.tsx @@ -0,0 +1,144 @@ +import { useEffect, useState } from 'react'; +import { useMutation, useQuery } from '@tanstack/react-query'; +import { Button, Group, Title, Textarea, LoadingOverlay, Alert, Container, Paper, Table } from "@mantine/core"; +import { errorMessage } from "../../../lib/http"; +import { PageHeader } from "../../../ui/components/PageHeader"; +import { getConfiguration, saveConfiguration, getRecords, type Configuration } from "../api"; + +const LeaveAdminPage = () => { + const [policyJSON, setPolicyJSON] = useState(''); + const [calendarJSON, setCalendarJSON] = useState(''); + + // Fetch configuration data initially + const { isLoading, isError, error, data } = useQuery({ queryKey: ['configuration'], queryFn: async () => { + return await getConfiguration(); + } }); + + useEffect(() => { + if (data) { + setPolicyJSON(JSON.stringify(data.policy || [], null, 2)); + setCalendarJSON(JSON.stringify(data.calendar || [], null, 2)); + } + }, [data]); + + const saveConfigurationMutation = useMutation({ + mutationFn: async (newData: Configuration) => { + return await saveConfiguration(newData); + }, + onSuccess: () => { + alert('Configuration saved successfully!'); + }, + onError: (error) => { + console.error(error); + alert('Failed to save configuration.'); + }, + }); + + const handleSavePolicyClick = () => { + try { + const parsedPolicy = JSON.parse(policyJSON); + saveConfigurationMutation.mutate({ policy: parsedPolicy }); + } catch (e) { + alert('Invalid JSON format for policy'); + } + }; + + const handleSaveCalendarClick = () => { + try { + const parsedCalendar = JSON.parse(calendarJSON); + saveConfigurationMutation.mutate({ calendar: parsedCalendar }); + } catch (e) { + alert('Invalid JSON format for calendar'); + } + }; + + // Fetch records + const { isLoading: isLoadingRecords, isError: isErrorRecords, data: dataRecords } = useQuery({ queryKey: ['records'], queryFn: async () => { + return await getRecords(); + } }); + + useEffect(() => { + if (dataRecords && dataRecords.history) { + setHistory(dataRecords.history); + } + + if (dataRecords && dataRecords.notifications) { + setNotifications(dataRecords.notifications); + } + }, [dataRecords]); + + const [history, setHistory] = useState[]>([]); + const [notifications, setNotifications] = useState[]>([]); + + return ( + + + + {/* Policy Editor */} + + Policy +