## MODIFIED Requirements

### Requirement: Contract Position Default on Creation
When an employee is created through the admin create API or the employee Excel import, and the provided `contract_position` is blank (absent, `null`, empty, or whitespace-only), the system SHALL set `contract_position` to the name of the position assigned to that employee at creation. A non-blank provided value SHALL be stored as given (trimmed). This default SHALL apply only at creation. Updating an employee SHALL NOT apply it. The employee Excel import SHALL NOT assign a default position. A row whose "Vị trí" is blank or cannot be resolved SHALL be rejected, so no contract position is set for it.

#### Scenario: Create API without contract_position
- **WHEN** an admin creates an employee with assigned positions and does not send `contract_position`
- **THEN** the employee's `contract_position` equals the name of the first assigned position

#### Scenario: Create API with blank contract_position
- **WHEN** an admin creates an employee with assigned positions and sends `contract_position` as `null`, an empty string, or whitespace only
- **THEN** the employee's `contract_position` equals the name of the first assigned position

#### Scenario: Create API with a contract_position value
- **WHEN** an admin creates an employee and sends a non-blank `contract_position`
- **THEN** the employee's `contract_position` equals the sent value

#### Scenario: Import row with empty "Vị trí HĐ" and a valid "Vị trí"
- **WHEN** an admin imports employees and a row's "Vị trí" resolves to exactly one position and its "Vị trí HĐ" is blank
- **THEN** the created employee's `contract_position` equals that position's name

#### Scenario: Import row with empty "Vị trí HĐ" and an empty or unknown "Vị trí"
- **WHEN** an admin imports employees and a row has a blank or unresolvable "Vị trí"
- **THEN** the row is not imported and is reported as a failed row
- **AND** no default position is assigned

#### Scenario: Import row with a "Vị trí HĐ" value
- **WHEN** an admin imports employees and a row has a non-blank "Vị trí HĐ" and a resolvable "Vị trí"
- **THEN** the created employee's `contract_position` equals the trimmed cell value, regardless of the "Vị trí" value

#### Scenario: Clearing contract_position on update
- **WHEN** an admin updates an existing employee and sends `contract_position` as `null` or an empty string
- **THEN** the employee's `contract_position` is stored as empty
- **AND** it is not replaced with the employee's current position name
