## 1. Database

- [x] 1.1 Create migration adding a nullable `contract_position` string column to `employees`
- [x] 1.2 In the same migration, backfill `contract_position` with a single `UPDATE` SQL statement (correlated subquery over `account_position`/`positions`, ordered by `account_position.id` and `LIMIT 1`, guarded by `WHERE contract_position IS NULL`) — no PHP loop over employees (see design.md - Decisions)

## 2. Model & Template Mapping

- [x] 2.1 Add `contract_position` to `Employee`'s `$fillable`
- [x] 2.2 Update `Field::$defaultKeyByCodes['employee_position']` in `app/Models/Field.php` to `account->employee->contract_position`

## 3. Admin API

- [x] 3.1 Add `contract_position` to the employee create/update validation rules and persistence in `app/Http/Controllers/Api/V1/Admin/EmployeeController.php`
- [x] 3.2 Ensure `contract_position` is included in employee show/index API responses
- [x] 3.3 Add a `contract_position` filter (partial match) to `AccountTrait::getEmployeeListByRequest()`, following the same pattern as the existing `q`/`position_id` filters, and document it as an OpenAPI query param on the employee list endpoint

## 4. Export

- [x] 4.1 Add `'contract_position' => 'Vị trí HĐ'` to `EmployeeExport::$exportFields`
- [x] 4.2 Add a `contract_position` case to `EmployeeExport::getDataByKey()` returning `$account->employee->contract_position ?? ''`

## 5. Verification

- [x] 5.1 Run the backfill migration against seeded/sample data and confirm `contract_position` matches each employee's prior current position name
- [x] 5.2 Generate/preview a contract for an employee and confirm `${employee_position}` renders from `contract_position`, including for an employee whose current position was changed after backfill (value should stay frozen to `contract_position`, not the new live position)
- [x] 5.3 Filter the employee list by `contract_position` and confirm only matching employees are returned
- [x] 5.4 Export the employee list and confirm the output includes both "Vị trí" (live position) and "Vị trí HĐ" (`contract_position`) columns with correct, independent values
- [x] 5.5 Confirm `openspec validate --change add-contract-position --strict` passes
