Skip to main content

Overview

After events conclude, organizers must submit comprehensive post-event reports including attendance records, photos, feedback, and budget information. Administrators review and approve these reports before issuing participation certificates.

Youth Union

Requires 5 photos, 14-day deadline

Student Association

Requires 10 photos + 50% feedback, 7-day deadline

Get Report by Event

Retrieve the post-event report for a specific event.

Endpoint

GET /api/reports/{eventID}
eventID
long
required
ID of the event

Response

200 OK
{
  "statusCode": 200,
  "message": "Report retrieved successfully",
  "data": {
    "reportID": 89,
    "eventID": 123,
    "eventType": "YOUTH_UNION",
    "affiliatedOrg": "Computer Science Club",
    "status": "NOT_SUBMITTED",
    "deadlineAt": "2024-04-29T23:59:00",
    "isLate": false,
    "organizerCount": null,
    "attendeeCount": null,
    "photos": [],
    "createdAt": "2024-04-15T18:00:00"
  },
  "timestamp": "2024-04-16T10:00:00"
}

Submit Post-Event Report

Submit a comprehensive post-event report with attendance, photos, and feedback.

Endpoint

POST /api/reports/{eventID}/submit
eventID
long
required
ID of the completed event

Authorization

Required Role: ORGANIZERMust be the event organizer

Request Format

Content-Type: multipart/form-data

Required Parameters

photos
file[]
required
Event photos (5 for Youth Union, 10 for Student Association)Naming Convention:
  • Youth Union: EVT{id}_{EventName}_01 through _05 (2-digit padded)
  • Student Association: EVT{id}_{EventName}_1 through _10
attendanceExcel
file
required
Excel file containing attendance recordsMust include columns: MSSV (Student ID), Full Name, Faculty/Class
organizerCount
integer
required
Number of organizers who managed the event
attendeeCount
integer
required
Total number of attendees (registered + walk-in)
walkInCount
integer
required
Number of walk-in participants

Optional Parameters

feedbackFile
file
Compiled feedback document
feedbackCount
integer
Number of feedback responses collectedRequired for Student Association: Must be at least 50% of attendeeCount
iuyouthArticleURL
string
URL to IUYouth article covering the event
socialMediaURL
string
URL to social media posts about the event
Google Drive link to additional event materials
totalBudget
string
Total budget spent (numeric string)
submitterName
string
Name of person submitting the report
submitterRole
string
Role of person submitting (e.g., “President”, “Event Coordinator”)

Request Example

cURL
curl -X POST http://localhost:8080/api/reports/123/submit \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -F 'photos=@EVT123_Workshop_01.jpg' \
  -F 'photos=@EVT123_Workshop_02.jpg' \
  -F 'photos=@EVT123_Workshop_03.jpg' \
  -F 'photos=@EVT123_Workshop_04.jpg' \
  -F 'photos=@EVT123_Workshop_05.jpg' \
  -F '[email protected]' \
  -F '[email protected]' \
  -F 'organizerCount=5' \
  -F 'attendeeCount=42' \
  -F 'walkInCount=8' \
  -F 'feedbackCount=30' \
  -F 'totalBudget=500000' \
  -F 'submitterName=John Doe' \
  -F 'submitterRole=Event Coordinator'

Response

200 OK
{
  "statusCode": 200,
  "message": "Report submitted successfully",
  "data": {
    "reportID": 89,
    "eventID": 123,
    "eventType": "YOUTH_UNION",
    "status": "SUBMITTED",
    "organizerCount": 5,
    "attendeeCount": 42,
    "walkInCount": 8,
    "feedbackCount": 30,
    "totalBudget": 500000,
    "photos": [
      {
        "photoID": 1,
        "fileID": "/uploads/reports/123/photos/EVT123_Workshop_01.jpg",
        "label": "Photo 1",
        "orderIndex": 0
      }
    ],
    "attendeeCountTotal": 42,
    "certEligibleCount": 38,
    "submittedAt": "2024-04-20T14:30:00",
    "deadlineAt": "2024-04-29T23:59:00",
    "isLate": false
  },
  "timestamp": "2024-04-20T14:30:00"
}

Validation Rules

Photo Count Validation:
  • Youth Union events: Exactly 5 photos required
  • Student Association events: Exactly 10 photos required
Feedback Threshold (Student Association only):
  • Must collect feedback from at least 50% of attendees
  • Example: 42 attendees requires minimum 21 feedback responses

Get All Reports (Admin)

Retrieve all post-event reports, optionally filtered by status.

Endpoint

GET /api/reports

Authorization

Required Role: ADMINDepartment-based filtering applies automatically

Query Parameters

status
enum
Filter by report statusValues: NOT_SUBMITTED, SUBMITTED, LATE_SUBMITTED, APPROVED, REJECTED, CERT_TEMPLATE_PENDING

Request Example

curl -X GET "http://localhost:8080/api/reports?status=SUBMITTED" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"

Response

200 OK
{
  "statusCode": 200,
  "message": "Reports retrieved successfully",
  "data": [
    {
      "reportID": 89,
      "eventID": 123,
      "eventType": "YOUTH_UNION",
      "affiliatedOrg": "Computer Science Club",
      "status": "SUBMITTED",
      "attendeeCount": 42,
      "submittedAt": "2024-04-20T14:30:00",
      "deadlineAt": "2024-04-29T23:59:00",
      "isLate": false
    }
  ],
  "timestamp": "2024-04-21T09:00:00"
}
Admins only see reports for events matching their department (Youth Union or Student Association).

Get Report Details

Retrieve detailed information about a specific report.

Endpoint

GET /api/reports/detail/{reportID}
reportID
long
required
ID of the report

Authorization

Required Role: ADMIN

Response

200 OK
{
  "statusCode": 200,
  "message": "Report retrieved",
  "data": {
    "reportID": 89,
    "eventID": 123,
    "eventType": "YOUTH_UNION",
    "affiliatedOrg": "Computer Science Club",
    "submitterEmail": "[email protected]",
    "submitterName": "John Doe",
    "submitterRole": "Event Coordinator",
    "organizerCount": 5,
    "attendeeCount": 42,
    "walkInCount": 8,
    "iuyouthArticleURL": "https://iuyouth.com/article/123",
    "socialMediaURL": "https://facebook.com/post/456",
    "driveLink": "https://drive.google.com/folder/789",
    "totalBudget": 500000,
    "feedbackCount": 30,
    "feedbackFileID": "/uploads/reports/123/feedback/feedback.pdf",
    "status": "SUBMITTED",
    "photos": [
      {
        "photoID": 1,
        "fileID": "/uploads/reports/123/photos/EVT123_Workshop_01.jpg",
        "label": "Photo 1",
        "orderIndex": 0
      }
    ],
    "walkInAttendees": [
      {
        "recordID": 1,
        "studentID": "S123456",
        "fullName": "Jane Smith",
        "className": "CS2024",
        "attendanceType": "WALK_IN"
      }
    ],
    "attendeeCountTotal": 42,
    "certEligibleCount": 38,
    "submittedAt": "2024-04-20T14:30:00",
    "deadlineAt": "2024-04-29T23:59:00",
    "isLate": false
  },
  "timestamp": "2024-04-21T10:00:00"
}

Approve Report

Approve a submitted post-event report.

Endpoint

POST /api/reports/{reportID}/approve
reportID
long
required
ID of the report to approve

Authorization

Required Role: ADMINMust match event’s organization type

Query Parameters

adminID
long
ID of the approving administrator

Response

200 OK
{
  "statusCode": 200,
  "message": "Report approved successfully",
  "data": {
    "reportID": 89,
    "status": "APPROVED",
    "approvedAt": "2024-04-21T15:00:00",
    "approvedBy": 5
  },
  "timestamp": "2024-04-21T15:00:00"
}
Organizer receives email notification upon approval.

Reject Report

Reject a submitted report with a reason.

Endpoint

POST /api/reports/{reportID}/reject
reportID
long
required
ID of the report to reject

Authorization

Required Role: ADMIN

Query Parameters

reason
string
required
Explanation for rejection
adminID
long
ID of the rejecting administrator

Request Example

curl -X POST "http://localhost:8080/api/reports/89/reject?reason=Insufficient%20photo%20quality&adminID=5" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"

Response

200 OK
{
  "statusCode": 200,
  "message": "Report rejected",
  "data": {
    "reportID": 89,
    "status": "REJECTED",
    "rejectionReason": "Insufficient photo quality"
  },
  "timestamp": "2024-04-21T15:30:00"
}

Resubmit Report

Resubmit a rejected report with corrections.

Endpoint

POST /api/reports/{reportID}/resubmit
reportID
long
required
ID of the rejected report

Authorization

Required Role: ORGANIZERMust be the event organizer

Request Format

Same as initial submission - all parameters from /submit endpoint apply.
Cannot modify photos, feedback, or attendance if certExportLocked is true (after certificate template download).

Response

200 OK
{
  "statusCode": 200,
  "message": "Report resubmitted successfully",
  "data": {
    "reportID": 89,
    "status": "SUBMITTED",
    "submittedAt": "2024-04-22T10:00:00",
    "rejectionReason": null,
    "previousRejectionReason": "Insufficient photo quality"
  },
  "timestamp": "2024-04-22T10:00:00"
}

Upload Certificate Template

Upload the certificate template for approved reports.

Endpoint

POST /api/reports/{reportID}/upload-cert-template
reportID
long
required
ID of the approved report

Authorization

Required Role: ADMIN

Request Parameters

certTemplate
file
required
Excel template with student names for certificates
adminID
long
ID of the uploading administrator

Response

200 OK
{
  "statusCode": 200,
  "message": "Cert template uploaded successfully",
  "data": {
    "reportID": 89,
    "status": "CERT_TEMPLATE_PENDING",
    "certExportLocked": true,
    "certTemplateFileID": "/uploads/reports/89/cert-templates/template.xlsx"
  },
  "timestamp": "2024-04-23T11:00:00"
}
Organizer receives email notification when template is ready for download.

Download Certificate Template

Download the certificate template to fill in student information.

Endpoint

GET /api/reports/{reportID}/download-cert-template
reportID
long
required
ID of the report

Authorization

Required Role: ORGANIZERMust be the event organizer

Response

200 OK
{
  "statusCode": 200,
  "message": "Certificate template download initiated",
  "data": "/api/uploads/cert-templates/template_123.xlsx",
  "timestamp": "2024-04-23T14:00:00"
}
First download locks the report - photos, feedback, and attendance cannot be modified after this point.

Workflow

1

Event Completion

Event concludes and status changes to COMPLETED. Report deadline is set (7 or 14 days).
2

Report Submission

Organizer uploads photos, attendance Excel, feedback, and budget information.
3

Validation

System validates photo count, feedback threshold, and required fields.
4

Admin Review

Administrator reviews accuracy of attendance, photos, and documentation.
5

Approval/Rejection

Admin approves or rejects with feedback. Organizer can resubmit if rejected.
6

Certificate Generation

Admin uploads certificate template. Organizer downloads and completes.

Report Statuses

StatusDescription
NOT_SUBMITTEDReport created but not yet submitted
SUBMITTEDReport submitted on time, awaiting review
LATE_SUBMITTEDReport submitted after deadline
APPROVEDReport approved by administrator
REJECTEDReport rejected, needs resubmission
CERT_TEMPLATE_PENDINGCertificate template uploaded, awaiting organizer download

Best Practices

Submit Early: Don’t wait until the deadline. Submit as soon as possible after the event.
Photo Naming: Follow the exact naming convention for your organization type to ensure proper processing.
Attendance Accuracy: Double-check attendance Excel for completeness and accuracy before submission.
Feedback Collection: For Student Association events, collect feedback during the event to meet the 50% threshold.

Error Responses

{
  "statusCode": 400,
  "message": "Photo count validation failed. YOUTH_UNION requires exactly 5 photos, but got 3",
  "timestamp": "2024-04-20T14:30:00"
}
{
  "statusCode": 400,
  "message": "Feedback count insufficient. Required: at least 21 (50% of 42 attendees), got 15",
  "timestamp": "2024-04-20T14:30:00"
}
{
  "statusCode": 400,
  "message": "Report has already been submitted",
  "timestamp": "2024-04-20T14:30:00"
}
{
  "statusCode": 400,
  "message": "Failed to parse attendance Excel: Missing required column MSSV",
  "timestamp": "2024-04-20T14:30:00"
}

Organizer Guide

Complete guide for submitting reports

Admin Guide

Administrator review process

Events API

Event management endpoints

File Upload Guide

File storage configuration

Build docs developers (and LLMs) love