- Remove pagination from ValueSetController::index() and ValueSetModel::getValueSets()
- Delete duplicate AGENTS.md documentation (consolidated into CLAUDE.md)
- Update .gitignore to exclude .claude folder
- Add CLAUDE.md with comprehensive agent instructions for Valueset queries
- Document new Lookups static library in README.md
175 lines
6.4 KiB
Markdown
175 lines
6.4 KiB
Markdown
# CLQMS Backend - Claude Code Instructions
|
|
|
|
**Project:** Clinical Laboratory Quality Management System (CLQMS) Backend
|
|
**Framework:** CodeIgniter 4 (PHP)
|
|
**Platform:** Windows - Use PowerShell or CMD for terminal commands
|
|
**Frontend:** Alpine.js (views/v2 directory contains Alpine.js components)
|
|
|
|
### Views/V2 Structure
|
|
```
|
|
app/Views/v2/
|
|
├── layout/
|
|
│ └── main_layout.php # Main layout with sidebar, navbar, Alpine.js layout() component
|
|
├── auth/
|
|
│ └── login.php # Login page
|
|
├── dashboard/
|
|
│ └── dashboard_index.php # Dashboard view
|
|
├── patients/
|
|
│ ├── patients_index.php # Patient list with x-data="patients()" component
|
|
│ └── dialog_form.php # Patient form dialog
|
|
├── requests/
|
|
│ └── requests_index.php # Lab requests
|
|
├── settings/
|
|
│ └── settings_index.php # Settings page
|
|
└── master/
|
|
├── organization/ # Organization management (accounts, sites, disciplines, departments, workstations)
|
|
├── specimen/ # Specimen management (containers, preparations)
|
|
├── tests/ # Lab tests (tests_index, param_dialog, grp_dialog, calc_dialog)
|
|
└── valuesets/ # Value sets management
|
|
```
|
|
|
|
### Alpine.js Patterns
|
|
- **Global layout:** `layout()` function in `main_layout.php` handles sidebar state, theme toggle, and navigation
|
|
- **Page components:** Each page uses `x-data="componentName()"` (e.g., `x-data="patients()"`)
|
|
- **API calls:** Use `fetch()` with `BASEURL` global variable and `credentials: 'include'`
|
|
- **Dialogs:** Modals use `x-show` with `@click.self` backdrop click to close
|
|
- **TailwindCSS 4:** Loaded via CDN with custom CSS variables for theming
|
|
|
|
## Quick Reference
|
|
|
|
**Static Library:**
|
|
- [`Lookups`](app/Libraries/Lookups.php) - Static lookup constants (no database queries)
|
|
|
|
**Usage:**
|
|
```php
|
|
use App\Libraries\Lookups;
|
|
|
|
// Get formatted lookup [{value: 'KEY', label: 'Label'}, ...]
|
|
Lookups::get('gender');
|
|
|
|
// Get raw associative array ['KEY' => 'Label', ...]
|
|
Lookups::getRaw('gender');
|
|
|
|
// Get all lookups for frontend
|
|
Lookups::getAll();
|
|
```
|
|
|
|
## Agent Workflow for Valueset Queries
|
|
|
|
Use `Lookups` class for all lookup queries - no database queries needed.
|
|
|
|
### Step 1: Identify the Lookup Constant
|
|
|
|
**By Category Name:** Match VSName to constant name (e.g., "Gender" → `Lookups::GENDER`)
|
|
**By Reference:** Match VSDesc to constant name (e.g., `testdefsite.TestType` → `Lookups::TEST_TYPE`)
|
|
**By VSetDefID:** Map VSetDefID to constant (see Common Lookups table below)
|
|
|
|
### Step 2: Retrieve Values
|
|
|
|
```php
|
|
// Formatted for frontend dropdowns
|
|
Lookups::get('gender'); // [{value: '1', label: 'Female'}, ...]
|
|
|
|
// Raw key-value pairs
|
|
Lookups::getRaw('gender'); // ['1' => 'Female', '2' => 'Male', ...]
|
|
```
|
|
|
|
### Step 3: Return Results
|
|
|
|
**Response Format (formatted):**
|
|
```json
|
|
[
|
|
{ "value": "1", "label": "Female" },
|
|
{ "value": "2", "label": "Male" },
|
|
{ "value": "3", "label": "Unknown" }
|
|
]
|
|
```
|
|
|
|
## Common Lookups
|
|
|
|
| VSetDefID | Constant | Search Keywords |
|
|
|-----------|----------|-----------------|
|
|
| 1 | `WS_TYPE` | workstation, type |
|
|
| 2 | `ENABLE_DISABLE` | enable, disable |
|
|
| 3 | `GENDER` | gender, sex |
|
|
| 4 | `MARITAL_STATUS` | marital, status |
|
|
| 5 | `DEATH_INDICATOR` | death, indicator |
|
|
| 6 | `IDENTIFIER_TYPE` | identifier, type, KTP, passport |
|
|
| 7 | `OPERATION` | operation, CRUD |
|
|
| 8 | `DID_TYPE` | device, ID, AAID, IDFA |
|
|
| 9 | `REQUESTED_ENTITY` | requested, entity, patient, insurance |
|
|
| 10 | `ORDER_PRIORITY` | priority, order, stat, ASAP |
|
|
| 11 | `ORDER_STATUS` | status, order |
|
|
| 12 | `LOCATION_TYPE` | location, type |
|
|
| 13 | `ADDITIVE` | additive, heparin, EDTA |
|
|
| 14 | `CONTAINER_CLASS` | container, class |
|
|
| 15 | `SPECIMEN_TYPE` | specimen, type, blood, urine |
|
|
| 16 | `UNIT` | unit |
|
|
| 17 | `GENERATE_BY` | generate, by |
|
|
| 18 | `SPECIMEN_ACTIVITY` | specimen, activity |
|
|
| 19 | `ACTIVITY_RESULT` | activity, result |
|
|
| 20 | `SPECIMEN_STATUS` | specimen, status |
|
|
| 21 | `SPECIMEN_CONDITION` | specimen, condition |
|
|
| 22 | `SPECIMEN_ROLE` | specimen, role |
|
|
| 23 | `COLLECTION_METHOD` | collection, method |
|
|
| 24 | `BODY_SITE` | body, site |
|
|
| 25 | `CONTAINER_SIZE` | container, size |
|
|
| 26 | `FASTING_STATUS` | fasting, status |
|
|
| 27 | `TEST_TYPE` | test, type, testdefsite |
|
|
| 28 | `RESULT_UNIT` | result, unit |
|
|
| 29 | `FORMULA_LANGUAGE` | formula, language |
|
|
| 30 | `RACE` | race, ethnicity |
|
|
| 31 | `RELIGION` | religion |
|
|
| 32 | `ETHNIC` | ethnic |
|
|
| 33 | `COUNTRY` | country (loaded from external file) |
|
|
| 34 | `CONTAINER_CAP_COLOR` | container, cap, color |
|
|
| 35 | `TEST_ACTIVITY` | test, activity |
|
|
| 36 | `ADT_EVENT` | ADT, event |
|
|
| 37 | `SITE_TYPE` | site, type |
|
|
| 38 | `SITE_CLASS` | site, class |
|
|
| 39 | `ENTITY_TYPE` | entity, type |
|
|
| 40 | `AREA_CLASS` | area, class |
|
|
| 41 | `MATH_SIGN` | math, sign |
|
|
| 42 | `V_CATEGORY` | category |
|
|
| 43 | `RESULT_TYPE` | result, type |
|
|
| 44 | `REFERENCE_TYPE` | reference, type |
|
|
| 45 | `RANGE_TYPE` | range, type |
|
|
| 46 | `NUMERIC_REF_TYPE` | numeric, reference |
|
|
| 47 | `TEXT_REF_TYPE` | text, reference |
|
|
|
|
**Convenience Aliases:**
|
|
- `Lookups::PRIORITY` → alias for `ORDER_PRIORITY`
|
|
- `Lookups::TEST_STATUS` → Test status values
|
|
- `Lookups::REQUEST_STATUS` → alias for `SPECIMEN_STATUS`
|
|
- `Lookups::RESULT_STATUS` → Result status values
|
|
|
|
## Example Agent Conversations
|
|
|
|
**User:** "Show me Gender values"
|
|
**Agent:**
|
|
1. `Lookups::get('gender')` → Returns formatted array
|
|
2. Output: Female, Male, Unknown
|
|
|
|
**User:** "What values for testdefsite.TestType?"
|
|
**Agent:**
|
|
1. `Lookups::get('test_type')` → Returns formatted array
|
|
2. Output: TEST, PARAM, CALC, GROUP, TITLE
|
|
|
|
**User:** "Find specimen status options"
|
|
**Agent:**
|
|
1. `Lookups::get('specimen_status')` → Returns formatted array
|
|
2. Output: To be collected, Collected, In-transport, Arrived, etc.
|
|
|
|
---
|
|
|
|
## Commanding Officer Persona Mode
|
|
|
|
When the user addresses you as their commanding officer or in a starship context, respond accordingly:
|
|
|
|
- Address the officer respectfully ("Commander", "Captain", "Sir/Ma'am")
|
|
- Use military/space command terminology ("affirmative", "reporting", "orders", "status")
|
|
- Frame technical responses in mission-ops format ("Systems operational", "Data retrieved", "Report ready")
|
|
- Keep responses crisp and professional, befitting ship command
|
|
- Example: "Commander, the valueset data you requested is ready for review."
|
|
- Start something with basmalah and end with hamdalah
|