Skip to content

Review & Awards

The review process moves applications through stages from initial receipt to final decision. Once awards are granted, disbursements track the financial outflow with categorization for reporting.

Applications move through the ApplicationStage pipeline:

new → under_review → accepted → (disbursement created)
→ declined

The ScholarshipService::updateStage() method handles transitions:

public function updateStage(
ScholarshipApplication $application,
ApplicationStage $stage,
?string $notes = null,
): void;

Each stage transition triggers:

  1. Application updatestage field updated, reviewer_notes optionally updated
  2. Activity logging — Records the transition on the contact’s timeline
  3. Applicant notification — Sends a status email with stage-specific messaging:
    • under_review — “Your application is now under review”
    • accepted — “Your application has been accepted”
    • declined — “Your application has been declined”

The ScholarshipService::awardScholarship() method handles the full award process:

public function awardScholarship(ScholarshipApplication $application): Disbursement;

This method:

  1. Accepts the application — Calls updateStage() with ApplicationStage::Accepted
  2. Creates a disbursement — Records the financial outflow linked to the scholarship and contact
  3. Logs activity — Records ActivityType::ScholarshipAwarded with the award amount
$disbursement = $scholarshipService->awardScholarship($application);
// Disbursement created for the scholarship's full award amount
// Application stage set to 'accepted'
// Applicant notified via email
// Activity logged on contact timeline

Disbursements track outgoing payments from a foundation.

FieldTypeDescription
idUUIDPrimary key
foundation_idUUIDOwning foundation
contact_idUUID?Recipient contact
scholarship_idUUID?Linked scholarship (for scholarship awards)
amountintegerAmount in cents
categoryDisbursementCategoryAccounting category
descriptionstring?Description of the disbursement
disbursed_atdatetime?When the payment was made

The DisbursementCategory enum provides accounting classification:

CategoryValueDescription
ScholarshipscholarshipScholarship award payment
GrantgrantGrant to an individual or organization
OperationaloperationalOperating expenses
ProgramprogramProgram-related expenses
AdminadminAdministrative costs

When a scholarship is awarded via awardScholarship(), the category is automatically set to scholarship.

RelationshipTypeTarget
foundation()BelongsToFoundation
contact()BelongsToContact (the recipient)
scholarship()BelongsToScholarship
MethodPathDescription
GET/api/scholarships/{id}/applicationsList applications for a scholarship
GET/api/applications/{id}Show application details
PATCH/api/applications/{id}/stageUpdate application stage
DELETE/api/applications/{id}Delete an application
MethodPathDescription
GET/api/disbursementsList all disbursements
POST/api/disbursementsCreate a disbursement
GET/api/disbursements/{id}Show a disbursement
DELETE/api/disbursements/{id}Delete a disbursement

The Scholarship model provides direct access to its disbursements:

$scholarship->disbursements(); // HasMany<Disbursement>

This allows reporting on total funds disbursed per scholarship program, remaining budget (comparing amount * max_awards against actual disbursements), and per-recipient award history.