✅ Socket.IO instance set for NotificationService
🔍 [VALIDATE] source="undefined", path="/login"
🔍 Validating request data (wrapped): {
  "body": {
    "password": "admin2026",
    "identifier": "admin"
  },
  "query": {},
  "params": {},
  "path": "/login"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/login"
🔍 Validating request data (wrapped): {
  "body": {
    "password": "admin2026",
    "identifier": "admin"
  },
  "query": {},
  "params": {},
  "path": "/login"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/login"
🔍 Validating request data (wrapped): {
  "body": {
    "identifier": "admin",
    "password": "admin2026"
  },
  "query": {},
  "params": {},
  "path": "/login"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/login"
🔍 Validating request data (wrapped): {
  "body": {
    "username": "admin",
    "password": "admin2026"
  },
  "query": {},
  "params": {},
  "path": "/login"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/login"
🔍 Validating request data (wrapped): {
  "body": {
    "username": "admin",
    "password": "admin2026"
  },
  "query": {},
  "params": {},
  "path": "/login"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/login"
🔍 Validating request data (wrapped): {
  "body": {
    "identifier": "admin",
    "password": "admin2026"
  },
  "query": {},
  "params": {},
  "path": "/login"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/login"
🔍 Validating request data (wrapped): {
  "body": {
    "identifier": "admin",
    "password": "admin2026"
  },
  "query": {},
  "params": {},
  "path": "/login"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/login"
🔍 Validating request data (wrapped): {
  "body": {
    "identifier": "admin",
    "password": "admin2026"
  },
  "query": {},
  "params": {},
  "path": "/login"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/"
🔍 Validating request data (wrapped): {
  "body": {},
  "query": {
    "page": "1",
    "limit": "10"
  },
  "params": {},
  "path": "/"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/"
🔍 Validating request data (wrapped): {
  "body": {},
  "query": {
    "page": "1",
    "limit": "10"
  },
  "params": {},
  "path": "/"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/"
🔍 Validating request data (wrapped): {
  "body": {},
  "query": {
    "page": "1",
    "limit": "10"
  },
  "params": {},
  "path": "/"
}
✅ Validation passed
📥 [CBC FILTERS] getStreamsWithGrades - termId: cmp8gtpme00d68bcnq5m8mk8x
🔍 [CBC FILTERS] getStreamsWithGrades result: [
  {
    id: 'cmp8gtprm00em8bcnpu40bxxe',
    streamName: 'East',
    gradeLevelName: 'Grade 5',
    displayName: 'Grade 5 East'
  }
]
✅ [CBC FILTERS] Found 1 streams with grades
📥 [CBC FILTERS] getSubjectsWithGrades - termId: cmp8gtpme00d68bcnq5m8mk8x streamId: undefined
❌ [CBC FILTERS] Error in getSubjectsWithGrades: Table 'aereuxky_cbc_sms.LearningArea' doesn't exist
🔍 [VALIDATE] source="query", path="/grades"
📥 [VALIDATE] Parsing query params: { termId: 'cmp8gtpme00d68bcnq5m8mk8x', limit: '1000' }
✅ [VALIDATE] Query validation passed
📥 [CBC CONTROLLER] listCbcGrades called
   - Query params: { limit: '1000', termId: 'cmp8gtpme00d68bcnq5m8mk8x' }
   - User schoolId: cmp8gtb7j00008bcnd6vyf567
🔍 [CBC SERVICE] listCbcGrades query: {
  where: {
    termId: 'cmp8gtpme00d68bcnq5m8mk8x',
    schoolId: 'cmp8gtb7j00008bcnd6vyf567'
  },
  query: {
    limit: '1000',
    termId: 'cmp8gtpme00d68bcnq5m8mk8x',
    schoolId: 'cmp8gtb7j00008bcnd6vyf567'
  }
}
📥 [CBC FILTERS] getAssessmentsWithGrades - params: {
  termId: 'cmp8gtpme00d68bcnq5m8mk8x',
  streamId: undefined,
  learningAreaId: undefined
}
✅ [CBC SERVICE] Found 48 grades, returning 48 rows
✅ [CBC CONTROLLER] Returning 48 grades (total: 48)
🔍 [CBC FILTERS] getAssessmentsWithGrades result: [
  {
    id: '1bc4c141-7909-4356-9f42-2b08fdc4fb8d',
    name: 'Assement CAT 2',
    code: 'AS-C26',
    type: 'CAT'
  }
]
✅ [CBC FILTERS] Found 1 assessments with grades
📥 [CBC FILTERS] getSubjectsWithGrades - termId: cmp8gtpme00d68bcnq5m8mk8x streamId: undefined
❌ [CBC FILTERS] Error in getSubjectsWithGrades: Table 'aereuxky_cbc_sms.LearningArea' doesn't exist
📥 [CBC FILTERS] getSubjectsWithGrades - termId: cmp8gtpme00d68bcnq5m8mk8x streamId: undefined
❌ [CBC FILTERS] Error in getSubjectsWithGrades: Table 'aereuxky_cbc_sms.LearningArea' doesn't exist
🔍 [VALIDATE] source="undefined", path="/"
🔍 Validating request data (wrapped): {
  "body": {},
  "query": {},
  "params": {},
  "path": "/"
}
✅ Validation passed
🔍 [listAssessments] Query params: {}
📋 [listAssessments] WHERE clause: {
  "schoolId": "cmp8gtb7j00008bcnd6vyf567"
}
✅ [listAssessments] Found assessments: {
  total: 2,
  count: 2,
  assessments: [
    {
      id: '1bc4c141-7909-4356-9f42-2b08fdc4fb8d',
      name: 'Assement CAT 2',
      type: 'CAT',
      termId: 'cmp8gtpme00d68bcnq5m8mk8x',
      streamId: null,
      isPublished: true,
      learningAreaId: null
    },
    {
      id: 'b4c2aae0-8743-403c-97ee-2922e4e66c3a',
      name: 'Term 1 ',
      type: 'OPENER',
      termId: 'cmp8gtpme00d68bcnq5m8mk8x',
      streamId: null,
      isPublished: true,
      learningAreaId: null
    }
  ]
}
📥 [REPORT CARDS] listReportCards called with query: {
  "page": "1",
  "limit": "10",
  "assessmentId": "null"
}
   ✓ Filtering for NULL assessmentId (term-aggregated)
   📊 WHERE clause: {
  "assessmentId": {}
}
✅ [REPORT CARDS] Found 104 report cards (total: 104)
🔍 [VALIDATE] source="undefined", path="/"
🔍 Validating request data (wrapped): {
  "body": {},
  "query": {
    "termId": "cmp8gtpme00d68bcnq5m8mk8x"
  },
  "params": {},
  "path": "/"
}
✅ Validation passed
🔍 [listAssessments] Query params: { termId: 'cmp8gtpme00d68bcnq5m8mk8x' }
📋 [listAssessments] WHERE clause: {
  "schoolId": "cmp8gtb7j00008bcnd6vyf567",
  "termId": "cmp8gtpme00d68bcnq5m8mk8x"
}
📥 [REPORT CARDS] listReportCards called with query: {
  "page": "1",
  "limit": "10",
  "termId": "cmp8gtpme00d68bcnq5m8mk8x",
  "assessmentId": "null"
}
   ✓ Filtering for NULL assessmentId (term-aggregated)
   📊 WHERE clause: {
  "termId": "cmp8gtpme00d68bcnq5m8mk8x",
  "assessmentId": {}
}
✅ [listAssessments] Found assessments: {
  total: 2,
  count: 2,
  assessments: [
    {
      id: '1bc4c141-7909-4356-9f42-2b08fdc4fb8d',
      name: 'Assement CAT 2',
      type: 'CAT',
      termId: 'cmp8gtpme00d68bcnq5m8mk8x',
      streamId: null,
      isPublished: true,
      learningAreaId: null
    },
    {
      id: 'b4c2aae0-8743-403c-97ee-2922e4e66c3a',
      name: 'Term 1 ',
      type: 'OPENER',
      termId: 'cmp8gtpme00d68bcnq5m8mk8x',
      streamId: null,
      isPublished: true,
      learningAreaId: null
    }
  ]
}
✅ [REPORT CARDS] Found 104 report cards (total: 104)

📥 [GET REPORT CARD] Starting fetch for: {
  studentId: 'cmp8gtq3b00h28bcnc06i6r6w',
  termId: 'cmp8gtpme00d68bcnq5m8mk8x'
}
✅ [GET REPORT CARD] Report card found: {
  id: 'cmpgjdz42000da6gr1adetvz3',
  studentName: 'Michael Wanjiku',
  term: 'Term 1',
  stream: 'Blue',
  gradeLevel: 'PP1'
}
📊 [GET REPORT CARD] CBC Grades count: 0
🎓 [GET REPORT CARD] Grade Level ID: cmp8gtpnd00de8bcnm4rg41ey Category: PRE_PRIMARY
⚠️ [GET REPORT CARD] No subjects linked to grade cmp8gtpnd00de8bcnm4rg41ey. Falling back to stream subject assignments.
📚 [GET REPORT CARD] All Learning Areas for grade: [
  'Creative Arts',
  'English',
  'Kiswahili',
  'Mathematics',
  'Physical & Health Education',
  'Religious Education',
  'Science & Technology',
  'Social Studies'
]
📊 [GET REPORT CARD] CBC Grades count: 0
📊 [GET REPORT CARD] CBC Grades sample: []
📊 [GET REPORT CARD] CBC Grades grouped by subject: 0 subjects
📊 [GET REPORT CARD] CBC Grades by subject: []
📝 [GET REPORT CARD] Assessment Results count: 0
📝 [GET REPORT CARD] Assessment Results subjects: []
   📊 Creative Arts: Rank N/A out of 0 students
   📊 English: Rank N/A out of 0 students
   📊 Kiswahili: Rank N/A out of 0 students
   📊 Mathematics: Rank N/A out of 0 students
   📊 Physical & Health Education: Rank N/A out of 0 students
   📊 Religious Education: Rank N/A out of 0 students
   📊 Science & Technology: Rank N/A out of 0 students
   📊 Social Studies: Rank N/A out of 0 students
   ○ Creative Arts: No grades, adding placeholder
   ○ English: No grades, adding placeholder
   ○ Kiswahili: No grades, adding placeholder
   ○ Mathematics: No grades, adding placeholder
   ○ Physical & Health Education: No grades, adding placeholder
   ○ Religious Education: No grades, adding placeholder
   ○ Science & Technology: No grades, adding placeholder
   ○ Social Studies: No grades, adding placeholder
📦 [GET REPORT CARD] Subject results count: 8
📦 [GET REPORT CARD] Complete assessment results count (backward compat): 8
🏫 [GET REPORT CARD] School: CBC Model Primary School
📈 [GET REPORT CARD] Performance history: [ 'Term 1: 0.00%' ]
👥 [GET REPORT CARD] Total students in stream cmp8gtpps00e28bcnm080cx5j: 16
👨‍🏫 [GET REPORT CARD] Class Teacher: James Mwangi
✅ [GET REPORT CARD] Returning data with keys: [
  'id',                  'studentId',
  'termId',              'academicYearId',
  'streamId',            'totalMarks',
  'maxMarks',            'subjectCount',
  'percentage',          'averageGrade',
  'classRank',           'streamRank',
  'overallRank',         'kpseaScore',
  'classTeacherComment', 'principalComment',
  'attendanceDays',      'presentDays',
  'conductRating',       'overallPerformance',
  'nextTermDate',        'isPublished',
  'publishedAt',         'generatedAt',
  'generatedPdfUrl',     'pdfUrl',
  'assessmentId',        'schoolId',
  'createdAt',           'updatedAt',
  'student',             'stream',
  'term',                'grades',
  'subjectResults',      'assessmentResults',
  'allLearningAreas',    'school',
  'totalStudentsCount',  'classTeacherName',
  'performanceHistory'
]
✅ [GET REPORT CARD] Student data keys: [
  'id',          'firstName',
  'middleName',  'lastName',
  'admissionNo', 'nemisNo',
  'photoUrl',    'dateOfBirth',
  'gender',      'enrollments'
]
✅ [GET REPORT CARD] Term data keys: [ 'id', 'name', 'academicYear' ]
✅ [GET REPORT CARD] Stream data keys: [ 'id', 'name', 'gradeLevel' ]
✅ [GET REPORT CARD] Subject results count: 8
✅ [GET REPORT CARD] Assessment results count (compat): 8
✅ [GET REPORT CARD] All Learning Areas count: 8

📥 [GET REPORT CARD] Starting fetch for: {
  studentId: 'cmp8gts8z00za8bcnvoykm2o5',
  termId: 'cmp8gtpme00d68bcnq5m8mk8x'
}
✅ [GET REPORT CARD] Report card found: {
  id: 'cmpe26ab9612e3243acaa693e',
  studentName: 'Aaron Achieng',
  term: 'Term 1',
  stream: 'East',
  gradeLevel: 'Grade 5'
}
📊 [GET REPORT CARD] CBC Grades count: 8
🎓 [GET REPORT CARD] Grade Level ID: cmp8gtpoc00do8bcnolymelvn Category: UPPER_PRIMARY
⚠️ [GET REPORT CARD] No subjects linked to grade cmp8gtpoc00do8bcnolymelvn. Falling back to stream subject assignments.
📚 [GET REPORT CARD] All Learning Areas for grade: [
  'Creative Arts',
  'English',
  'Kiswahili',
  'Mathematics',
  'Physical & Health Education',
  'Religious Education',
  'Science & Technology',
  'Social Studies'
]
📊 [GET REPORT CARD] CBC Grades count: 8
📊 [GET REPORT CARD] CBC Grades sample: [
  {
    id: '64b1bf99-5b21-44a1-b36e-ab50b33dc963',
    learningAreaId: 'cmp8gtptn00f68bcnuf5wgwaf',
    learningAreaName: 'English',
    performanceLevel: 'ME',
    teacherComment: null
  },
  {
    id: 'ceb5n2418snn4k7f66enxkac',
    learningAreaId: 'cmp8gtpur00fc8bcnj59fz98i',
    learningAreaName: 'Religious Education',
    performanceLevel: 'ME',
    teacherComment: 'Good moral understanding'
  },
  {
    id: 'd4t2nbhhh528e5yjrjvtod2u',
    learningAreaId: 'cmp8gtpu700f98bcn97eb0kpc',
    learningAreaName: 'Social Studies',
    performanceLevel: 'ME',
    teacherComment: 'Participates in discussions'
  }
]
   Processing grade for LA: cmp8gtptn00f68bcnuf5wgwaf (English), Performance: ME
   Processing grade for LA: cmp8gtpur00fc8bcnj59fz98i (Religious Education), Performance: ME
   Processing grade for LA: cmp8gtpu700f98bcn97eb0kpc (Social Studies), Performance: ME
   Processing grade for LA: cmp8gtpul00fb8bcng0vpciek (Physical & Health Education), Performance: EE
   Processing grade for LA: cmp8gtpte00f58bcnn73lc1ne (Mathematics), Performance: EE
   Processing grade for LA: cmp8gtptz00f88bcn98na1x9b (Science & Technology), Performance: ME
   Processing grade for LA: cmp8gtpuc00fa8bcncotonl3e (Creative Arts), Performance: EE
   Processing grade for LA: cmp8gtptu00f78bcnktb6lamd (Kiswahili), Performance: EE
📊 [GET REPORT CARD] CBC Grades grouped by subject: 8 subjects
📊 [GET REPORT CARD] CBC Grades by subject: [
  'English: ME (1 strands)',
  'Religious Education: ME (1 strands)',
  'Social Studies: ME (1 strands)',
  'Physical & Health Education: EE (1 strands)',
  'Mathematics: EE (1 strands)',
  'Science & Technology: ME (1 strands)',
  'Creative Arts: EE (1 strands)',
  'Kiswahili: EE (1 strands)'
]
📝 [GET REPORT CARD] Assessment Results count: 0
📝 [GET REPORT CARD] Assessment Results subjects: []
   📊 Creative Arts: Rank 1 out of 6 students
   📊 English: Rank 3 out of 6 students
   📊 Kiswahili: Rank 1 out of 6 students
   📊 Mathematics: Rank 1 out of 6 students
   📊 Physical & Health Education: Rank 2 out of 6 students
   📊 Religious Education: Rank 1 out of 6 students
   📊 Science & Technology: Rank 2 out of 6 students
   📊 Social Studies: Rank 2 out of 6 students
   ✓ Creative Arts: Has data (CBC: Yes, Assessments: 0), Rank: 1/6
   ✓ English: Has data (CBC: Yes, Assessments: 0), Rank: 3/6
   ✓ Kiswahili: Has data (CBC: Yes, Assessments: 0), Rank: 1/6
   ✓ Mathematics: Has data (CBC: Yes, Assessments: 0), Rank: 1/6
   ✓ Physical & Health Education: Has data (CBC: Yes, Assessments: 0), Rank: 2/6
   ✓ Religious Education: Has data (CBC: Yes, Assessments: 0), Rank: 1/6
   ✓ Science & Technology: Has data (CBC: Yes, Assessments: 0), Rank: 2/6
   ✓ Social Studies: Has data (CBC: Yes, Assessments: 0), Rank: 2/6
📦 [GET REPORT CARD] Subject results count: 8
📦 [GET REPORT CARD] Complete assessment results count (backward compat): 8
🏫 [GET REPORT CARD] School: CBC Model Primary School
📈 [GET REPORT CARD] Performance history: [ 'Term 1: 77.50%' ]
👥 [GET REPORT CARD] Total students in stream cmp8gtprm00em8bcnpu40bxxe: 6
👨‍🏫 [GET REPORT CARD] Class Teacher: kennedy masika
✅ [GET REPORT CARD] Returning data with keys: [
  'id',                  'studentId',
  'termId',              'academicYearId',
  'streamId',            'totalMarks',
  'maxMarks',            'subjectCount',
  'percentage',          'averageGrade',
  'classRank',           'streamRank',
  'overallRank',         'kpseaScore',
  'classTeacherComment', 'principalComment',
  'attendanceDays',      'presentDays',
  'conductRating',       'overallPerformance',
  'nextTermDate',        'isPublished',
  'publishedAt',         'generatedAt',
  'generatedPdfUrl',     'pdfUrl',
  'assessmentId',        'schoolId',
  'createdAt',           'updatedAt',
  'student',             'stream',
  'term',                'grades',
  'subjectResults',      'assessmentResults',
  'allLearningAreas',    'school',
  'totalStudentsCount',  'classTeacherName',
  'performanceHistory'
]
✅ [GET REPORT CARD] Student data keys: [
  'id',          'firstName',
  'middleName',  'lastName',
  'admissionNo', 'nemisNo',
  'photoUrl',    'dateOfBirth',
  'gender',      'enrollments'
]
✅ [GET REPORT CARD] Term data keys: [ 'id', 'name', 'academicYear' ]
✅ [GET REPORT CARD] Stream data keys: [ 'id', 'name', 'gradeLevel' ]
✅ [GET REPORT CARD] Subject results count: 8
✅ [GET REPORT CARD] Assessment results count (compat): 8
✅ [GET REPORT CARD] All Learning Areas count: 8
🔍 [VALIDATE] source="undefined", path="/login"
🔍 Validating request data (wrapped): {
  "body": {
    "identifier": "admin",
    "password": "admin2026"
  },
  "query": {},
  "params": {},
  "path": "/login"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/"
🔍 Validating request data (wrapped): {
  "body": {},
  "query": {
    "limit": "500",
    "page": "1",
    "status": "ACTIVE"
  },
  "params": {},
  "path": "/"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/"
🔍 Validating request data (wrapped): {
  "body": {},
  "query": {
    "page": "1",
    "limit": "20"
  },
  "params": {},
  "path": "/"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/login"
🔍 Validating request data (wrapped): {
  "body": {
    "identifier": "admin",
    "password": "admin2026"
  },
  "query": {},
  "params": {},
  "path": "/login"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/"
🔍 Validating request data (wrapped): {
  "body": {},
  "query": {
    "role": "TEACHER",
    "limit": "100"
  },
  "params": {},
  "path": "/"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/"
🔍 Validating request data (wrapped): {
  "body": {},
  "query": {
    "page": "1",
    "limit": "10"
  },
  "params": {},
  "path": "/"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/"
🔍 Validating request data (wrapped): {
  "body": {},
  "query": {
    "page": "1",
    "limit": "10",
    "classId": "cmp8gtpnl00dg8bcnt1kx3mrd"
  },
  "params": {},
  "path": "/"
}
✅ Validation passed
🔍 [VALIDATE] source="query", path="/events"
📥 [VALIDATE] Parsing query params: {
  startDate: '2026-06-23T21:00:00.000Z',
  endDate: '2026-08-07T20:59:59.999Z'
}
✅ [VALIDATE] Query validation passed
🔍 [VALIDATE] source="query", path="/holidays"
📥 [VALIDATE] Parsing query params: { year: '2026' }
✅ [VALIDATE] Query validation passed
🔍 [VALIDATE] source="undefined", path="/"
🔍 Validating request data (wrapped): {
  "body": {},
  "query": {
    "termId": "cmp8gtpme00d68bcnq5m8mk8x",
    "streamId": "",
    "isPublished": "true",
    "limit": "100"
  },
  "params": {},
  "path": "/"
}
✅ Validation passed
🔍 [listAssessments] Query params: {
  limit: '100',
  termId: 'cmp8gtpme00d68bcnq5m8mk8x',
  streamId: '',
  isPublished: 'true'
}
📋 [listAssessments] WHERE clause: {
  "schoolId": "cmp8gtb7j00008bcnd6vyf567",
  "termId": "cmp8gtpme00d68bcnq5m8mk8x",
  "isPublished": true
}
✅ [listAssessments] Found assessments: {
  total: 2,
  count: 2,
  assessments: [
    {
      id: '1bc4c141-7909-4356-9f42-2b08fdc4fb8d',
      name: 'Assement CAT 2',
      type: 'CAT',
      termId: 'cmp8gtpme00d68bcnq5m8mk8x',
      streamId: null,
      isPublished: true,
      learningAreaId: null
    },
    {
      id: 'b4c2aae0-8743-403c-97ee-2922e4e66c3a',
      name: 'Term 1 ',
      type: 'OPENER',
      termId: 'cmp8gtpme00d68bcnq5m8mk8x',
      streamId: null,
      isPublished: true,
      learningAreaId: null
    }
  ]
}
🔍 [VALIDATE] source="undefined", path="/"
🔍 Validating request data (wrapped): {
  "body": {},
  "query": {
    "userId": "cmp8gtfff00cc8bcnm7wkpzqv",
    "limit": "1"
  },
  "params": {},
  "path": "/"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/login"
🔍 Validating request data (wrapped): {
  "body": {
    "username": "admin",
    "password": "admin2026"
  },
  "query": {},
  "params": {},
  "path": "/login"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/login"
🔍 Validating request data (wrapped): {
  "body": {
    "email": "admin",
    "password": "admin2026"
  },
  "query": {},
  "params": {},
  "path": "/login"
}
❌ Zod Validation Error: [
  {
    "validation": "email",
    "code": "invalid_string",
    "message": "Invalid email",
    "path": [
      "body",
      "email"
    ]
  }
]
❌ Formatted errors: [
  {
    field: 'body.email',
    message: 'Invalid email',
    received: undefined
  }
]
🔍 [VALIDATE] source="undefined", path="/login"
🔍 Validating request data (wrapped): {
  "body": {
    "email": "admin",
    "password": "admin2026"
  },
  "query": {},
  "params": {},
  "path": "/login"
}
❌ Zod Validation Error: [
  {
    "validation": "email",
    "code": "invalid_string",
    "message": "Invalid email",
    "path": [
      "body",
      "email"
    ]
  }
]
❌ Formatted errors: [
  {
    field: 'body.email',
    message: 'Invalid email',
    received: undefined
  }
]
🔍 [VALIDATE] source="undefined", path="/login"
🔍 Validating request data (wrapped): {
  "body": {
    "email": "admin@cbcsms.com",
    "username": "admin",
    "password": "admin2026"
  },
  "query": {},
  "params": {},
  "path": "/login"
}
✅ Validation passed
🔍 [VALIDATE] source="undefined", path="/login"
🔍 Validating request data (wrapped): {
  "body": {
    "identifier": "admin",
    "password": "admin2026"
  },
  "query": {},
  "params": {},
  "path": "/login"
}
✅ Validation passed
