# Instructions

- Following Playwright test failed.
- Explain why, be concise, respect Playwright best practices.
- Provide a snippet of code with the fix, if possible.

# Test info

- Name: workflows/px-employee-creates.spec.ts >> PX Employee Creates Tests >> create QI project
- Location: e2e/tests/workflows/px-employee-creates.spec.ts:128:7

# Error details

```
Error: expect(received).toBeTruthy()

Received: false
```

# Page snapshot

```yaml
- generic [ref=e2]:
  - complementary [ref=e3]:
    - generic [ref=e4]:
      - img "Al Hammadi" [ref=e6]
      - img "Al Hammadi" [ref=e8]
    - navigation [ref=e9]:
      - link [ref=e10] [cursor=pointer]:
        - /url: /analytics/dashboard/
        - img [ref=e11]
      - link [ref=e16] [cursor=pointer]:
        - /url: /
        - img [ref=e17]
      - button [ref=e20] [cursor=pointer]:
        - img [ref=e21]
      - link [ref=e22] [cursor=pointer]:
        - /url: /complaints/
        - img [ref=e23]
      - link [ref=e26] [cursor=pointer]:
        - /url: /inquiries/
        - img [ref=e27]
      - link [ref=e30] [cursor=pointer]:
        - /url: /observations/
        - img [ref=e31]
      - button [ref=e35] [cursor=pointer]:
        - img [ref=e36]
      - link [ref=e40] [cursor=pointer]:
        - /url: /appreciation/
        - img [ref=e41]
      - link [ref=e43] [cursor=pointer]:
        - /url: /suggestions/?feedback_type=suggestion
        - img [ref=e44]
      - button [ref=e47] [cursor=pointer]:
        - img [ref=e48]
      - button [ref=e52] [cursor=pointer]:
        - img [ref=e53]
      - link [ref=e58] [cursor=pointer]:
        - /url: /organizations/departments/
        - img [ref=e59]
      - link [ref=e63] [cursor=pointer]:
        - /url: /organizations/patients/
        - img [ref=e64]
      - button [ref=e68] [cursor=pointer]:
        - img [ref=e69]
      - button [ref=e74] [cursor=pointer]:
        - img [ref=e75]
      - button [ref=e82] [cursor=pointer]:
        - img [ref=e83]
      - link [ref=e86] [cursor=pointer]:
        - /url: /notifications/send-sms/
        - img [ref=e87]
      - link [ref=e89] [cursor=pointer]:
        - /url: /config/
        - img [ref=e90]
      - link [ref=e93] [cursor=pointer]:
        - /url: /config/deleted/
        - img [ref=e94]
      - link [ref=e97] [cursor=pointer]:
        - /url: /accounts/acknowledgements/my-acknowledgements/
        - img [ref=e98]
      - button [ref=e104] [cursor=pointer]:
        - img [ref=e105]
      - button [ref=e108] [cursor=pointer]:
        - img [ref=e109]
    - button [ref=e114] [cursor=pointer]:
      - img [ref=e115]
    - generic [ref=e118]:
      - link "🇬🇧" [ref=e119] [cursor=pointer]:
        - /url: /core/set-language/?language=en
        - generic [ref=e120]: 🇬🇧
      - link "🇸🇦" [ref=e121] [cursor=pointer]:
        - /url: /core/set-language/?language=ar
        - generic [ref=e122]: 🇸🇦
  - generic [ref=e123]:
    - banner [ref=e124]:
      - generic [ref=e125]:
        - heading "Good morning, E2E! ☀️" [level=2] [ref=e126]
        - paragraph [ref=e127]: Welcome to PX360 Patient Experience Management
      - generic [ref=e128]:
        - generic [ref=e129]:
          - img [ref=e130]
          - textbox "Search..." [ref=e133]
        - button "10" [ref=e135] [cursor=pointer]:
          - img [ref=e136]
          - generic [ref=e139]: "10"
        - generic [ref=e140]:
          - link "🇬🇧 English" [ref=e141] [cursor=pointer]:
            - /url: /core/set-language/?language=en
            - generic [ref=e142]: 🇬🇧
            - generic [ref=e143]: English
          - link "🇸🇦 Arabic" [ref=e144] [cursor=pointer]:
            - /url: /core/set-language/?language=ar
            - generic [ref=e145]: 🇸🇦
            - generic [ref=e146]: Arabic
        - button "E2E Hospital Admin Hospital Admin E" [ref=e148] [cursor=pointer]:
          - generic [ref=e149]:
            - generic [ref=e150]: E2E Hospital Admin
            - generic [ref=e151]: Hospital Admin
          - generic [ref=e152]: E
          - img [ref=e153]
    - main [ref=e155]:
      - link "Back to Projects" [ref=e157] [cursor=pointer]:
        - /url: /projects/
        - img [ref=e158]
        - generic [ref=e160]: Back to Projects
      - generic [ref=e163]:
        - heading "Create QI Project" [level=1] [ref=e164]:
          - img [ref=e165]
          - text: Create QI Project
        - paragraph [ref=e166]: Start a new quality improvement initiative
      - generic [ref=e167]:
        - heading "Project Information" [level=2] [ref=e168]
        - generic [ref=e169]:
          - generic [ref=e170]:
            - generic [ref=e171]:
              - generic [ref=e172]: Project Name *
              - textbox "Project Name *" [ref=e173]:
                - /placeholder: Project name
                - text: E2E QI Project 1778178889237
            - generic [ref=e174]:
              - text: Project Name (Arabic)
              - textbox "Project Name (Arabic)" [ref=e175]:
                - /placeholder: اسم المشروع
          - generic [ref=e176]:
            - generic [ref=e177]: Description *
            - textbox "Description *" [ref=e178]:
              - /placeholder: Describe the project objectives and scope...
              - text: E2E QI project test 1778178889661. Please ignore.
            - paragraph [ref=e179]: Describe the project objectives and scope
          - generic [ref=e181]:
            - text: Department
            - combobox "Department" [ref=e182]:
              - option "---------" [selected]
              - option "Academic Education and Training Affairs"
              - option "Accidents & Emergency"
              - option "Anesthesia & OR Department"
              - option "Business Development"
              - option "Community Engagement"
              - option "Contact Center Department"
              - option "Continuous Medical Education Managment"
              - option "Corporate Administration"
              - option "Corporate Communication Department"
              - option "Critical Care Department"
              - option "Dental Department"
              - option "Dermatology Department"
              - option "Emergency Department"
              - option "Executive Administration"
              - option "FAMILY MEDICINE DEPARTMENT"
              - option "Facility Management & Maintenance"
              - option "Finance Department"
              - option "Financial Collection & Claims Department"
              - option "Food Services Department"
              - option "Housekeeping & Hospitality Department"
              - option "Human Resource"
              - option "Infection Control"
              - option "Information Technology"
              - option "Innovation Communication Management"
              - option "Inpatient Department"
              - option "Internal Audit"
              - option "Internal Medicine"
              - option "Laboratory and Blood Bank"
              - option "Laundry Department"
              - option "Legal Affairs Department"
              - option "Marketing Department"
              - option "Medical Administration"
              - option "Medical Ancillary Services"
              - option "Medical Approvals Department"
              - option "Medical Records Department"
              - option "Nursing Department"
              - option "OB/Gyne Department"
              - option "ONCOLOGY"
              - option "Ophthalmology Department"
              - option "Outpatient Department"
              - option "Patient Affairs Department"
              - option "Patient Relations & Patient Experience Department"
              - option "Pediatric Department"
              - option "Pharmacy Department"
              - option "Pharmacy Warehouse AlAziziyah"
              - option "Porter Department"
              - option "Radiology Department"
              - option "Security Department"
              - option "Senior Management Offices"
              - option "Supply Chain"
              - option "Support Services"
              - option "Surgeries Department"
              - option "TRANSFORMATION AND CHANGE MANAGEMENT"
              - option "Talent Acquisition Department"
              - option "Transportation Department"
          - generic [ref=e183]:
            - generic [ref=e184]:
              - text: Project Lead
              - combobox "Project Lead" [ref=e185]:
                - option "---------" [selected]
                - option "E2E PX Employee (e2e-px-employee@px360.test)"
                - option "SHAHAD MOSLEH K ALANAZI (sh@gmail.com)"
                - option "ZEENATH ABBONU KUNHIBI (ZEENATH@hh.med.sa)"
              - paragraph [ref=e186]: This field is required.
            - generic [ref=e187]:
              - generic [ref=e188]: Status *
              - combobox "Status *" [ref=e189]:
                - option "Active"
                - option "Inactive"
                - option "Pending" [selected]
                - option "Completed"
                - option "Cancelled"
          - generic [ref=e190]:
            - text: Team Members
            - listbox "Team Members" [ref=e191]:
              - option "E2E PX Employee (e2e-px-employee@px360.test)" [ref=e192]
              - option "SHAHAD MOSLEH K ALANAZI (sh@gmail.com)" [ref=e193]
              - option "ZEENATH ABBONU KUNHIBI (ZEENATH@hh.med.sa)" [ref=e194]
            - paragraph [ref=e195]: Hold Ctrl/Cmd to select multiple team members
          - generic [ref=e196]:
            - generic [ref=e197]:
              - text: Start Date
              - textbox "Start Date" [ref=e198]
            - generic [ref=e199]:
              - text: Target Completion Date
              - textbox "Target Completion Date" [ref=e200]
          - generic [ref=e201]:
            - button "Create Project" [ref=e202] [cursor=pointer]:
              - img [ref=e203]
              - text: Create Project
            - link "Cancel" [ref=e207] [cursor=pointer]:
              - /url: /projects/
              - img [ref=e208]
              - text: Cancel
    - contentinfo [ref=e211]:
      - paragraph [ref=e212]:
        - text: Powered by
        - link "tenhal.sa" [ref=e213] [cursor=pointer]:
          - /url: https://tenhal.sa
```

# Test source

```ts
  49  |     await page.waitForTimeout(800);
  50  |   });
  51  | 
  52  |   test('create observation via internal form', async ({ page }) => {
  53  |     const auth = new RoleAuthHelper(page);
  54  |     await auth.login('px_employee');
  55  |     await page.waitForTimeout(800);
  56  | 
  57  |     const obsId = await createObsInternal(page);
  58  |     expect(obsId).toBeTruthy();
  59  |     await page.waitForTimeout(800);
  60  |   });
  61  | 
  62  |   test('create inquiry via internal form', async ({ page }) => {
  63  |     const auth = new RoleAuthHelper(page);
  64  |     await auth.login('px_employee');
  65  |     await page.waitForTimeout(800);
  66  | 
  67  |     await page.goto('/inquiries/new/');
  68  |     await page.waitForLoadState('domcontentloaded');
  69  |     await page.waitForTimeout(2500);
  70  | 
  71  |     const subjectField = page.locator('input[name="subject"], #id_subject');
  72  |     if (await subjectField.count() > 0) { await subjectField.fill(`E2E Emp Inquiry ${Date.now()}`); await page.waitForTimeout(400); }
  73  |     const msgField = page.locator('textarea[name="message"], #id_message');
  74  |     if (await msgField.count() > 0) { await msgField.fill(`E2E employee inquiry test ${Date.now()}. Please ignore.`); await page.waitForTimeout(400); }
  75  |     const categoryField = page.locator('select[name="category"], #id_category');
  76  |     if (await categoryField.count() > 0) { await categoryField.selectOption({ index: 1 }); await page.waitForTimeout(400); }
  77  | 
  78  |     await submitContentForm(page);
  79  | 
  80  |     const url = page.url();
  81  |     const ok = url.match(/\/inquiries\/[0-9a-f-]+\/?$/) || !url.includes('/new/');
  82  |     expect(ok).toBeTruthy();
  83  |     await page.waitForTimeout(800);
  84  |   });
  85  | 
  86  |   test('create suggestion via internal form', async ({ page }) => {
  87  |     const auth = new RoleAuthHelper(page);
  88  |     await auth.login('px_employee');
  89  |     await page.waitForTimeout(800);
  90  | 
  91  |     await page.goto('/suggestions/create/');
  92  |     await page.waitForLoadState('domcontentloaded');
  93  |     await page.waitForTimeout(2500);
  94  | 
  95  |     const pageText = (await page.textContent('body')) || '';
  96  |     if (pageText.includes('Page not found') || pageText.includes('404')) { test.skip(); return; }
  97  | 
  98  |     const contactName = page.locator('input[name="contact_name"], #id_contact_name');
  99  |     if (await contactName.count() > 0) { await contactName.fill('E2E Test User'); await page.waitForTimeout(300); }
  100 |     const contactPhone = page.locator('input[name="contact_phone"], #id_contact_phone');
  101 |     if (await contactPhone.count() > 0) { await contactPhone.fill('0501112233'); await page.waitForTimeout(300); }
  102 |     const msgField = page.locator('textarea[name="message"], #id_message');
  103 |     if (await msgField.count() > 0) { await msgField.fill(`E2E employee suggestion test ${Date.now()}. Please ignore.`); await page.waitForTimeout(300); }
  104 |     const hospField = page.locator('select[name="hospital"], #id_hospital');
  105 |     if (await hospField.count() > 0) {
  106 |       const hasValue = await hospField.inputValue();
  107 |       if (!hasValue) { await hospField.selectOption(HOSPITAL_ID); await page.waitForTimeout(300); }
  108 |     }
  109 | 
  110 |     await submitContentForm(page);
  111 |     expect(page.url()).not.toContain('/create/');
  112 |     await page.waitForTimeout(800);
  113 |   });
  114 | 
  115 |   test('create appreciation via public API', async ({ page }) => {
  116 |     const resp = await page.request.post('/appreciation/public/submit/', {
  117 |       data: {
  118 |         contact_name: `E2E Test ${Date.now()}`,
  119 |         contact_phone: '0504445566',
  120 |         message: `E2E employee appreciation test ${Date.now()}. Great work!`,
  121 |         hospital: HOSPITAL_ID,
  122 |       },
  123 |     });
  124 |     expect([200, 201].includes(resp.status())).toBeTruthy();
  125 |     await page.waitForTimeout(800);
  126 |   });
  127 | 
  128 |   test('create QI project', async ({ page }) => {
  129 |     const auth = new RoleAuthHelper(page);
  130 |     await auth.login('hospital_admin');
  131 |     await page.waitForTimeout(800);
  132 | 
  133 |     await page.goto('/projects/create/');
  134 |     await page.waitForLoadState('domcontentloaded');
  135 |     await page.waitForTimeout(2500);
  136 | 
  137 |     const pageText = (await page.textContent('body')) || '';
  138 |     if (pageText.includes('Page not found') || pageText.includes('403') || pageText.includes('404')) { test.skip(); return; }
  139 | 
  140 |     const nameField = page.locator('input[name="name"], #id_name');
  141 |     if (await nameField.count() > 0) { await nameField.fill(`E2E QI Project ${Date.now()}`); await page.waitForTimeout(400); }
  142 |     const descField = page.locator('textarea[name="description"], #id_description');
  143 |     if (await descField.count() > 0) { await descField.fill(`E2E QI project test ${Date.now()}. Please ignore.`); await page.waitForTimeout(400); }
  144 | 
  145 |     await submitContentForm(page);
  146 | 
  147 |     const url = page.url();
  148 |     const ok = url.match(/\/projects\/[0-9a-f-]+\/?$/) || !url.includes('/create/');
> 149 |     expect(ok).toBeTruthy();
      |                ^ Error: expect(received).toBeTruthy()
  150 |     await page.waitForTimeout(800);
  151 |   });
  152 | });
  153 | 
```