IEE Edu does not integrate with an online payment gateway. Instead it uses a manual bank transfer and proof-of-payment (comprobante) model: students transfer the purchase amount to IEE’s bank account, then upload a screenshot or image of the transfer receipt inside the platform. An admin reviews the comprobante and either approves or rejects the payment. On approval, the system automatically grants the appropriate access — enrolling the student in a course, fulfilling a book order, or activating a subscription plan. This approach is common in Latin American e-commerce markets where bank transfers are the dominant payment method.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/RigbySawGame/ieeEdu_Wen/llms.txt
Use this file to discover all available pages before exploring further.
Payment Types
A singlePayment record covers all three purchasable items. The type is inferred from which foreign key is populated:
| Type | FK Field | On Approval |
|---|---|---|
| Course purchase | course_id is set | EnrollmentService::enroll() creates a permanent enrollment |
| Book purchase | book_id is set | BookOrderService::createForPayment() creates a book order and decrements stock |
| Subscription | subscription_type is set (trimestral, semestral, or anual) | A Subscription record is created/updated and SubscriptionAccessService::sync() grants course access |
Payment Model Fields
ThePayment model’s fillable attributes are:
User, Course, and Book, and has one BookOrder via bookOrder().
Payment Status Flow
A payment moves through the following statuses:| Status | Meaning | Who Sets It |
|---|---|---|
pendiente | Payment created, comprobante not yet uploaded | System (on creation) |
en_revision | Comprobante uploaded, awaiting admin review | Student (on comprobante upload) or admin (on revert) |
aprobado | Admin has verified the proof and granted access | Admin |
rechazado | Admin has rejected the proof | Admin |
Only payments in
pendiente or en_revision status can be approved. Attempting to approve an already-approved payment throws a validation exception: "Solo se pueden aprobar pagos pendientes o en revisión.".Student Workflow
Browse and initiate payment
The student visits a course detail page or the public
/planes page. They click the purchase or subscribe button, which redirects them to the payment initiation flow.Create payment record
The student submits the payment form. A A
POST request is sent to student.payments.store:Payment record is created with status = 'pendiente' and the relevant course_id, book_id, or subscription_type populated.Upload comprobante
After completing the bank transfer, the student uploads the proof-of-payment image:The file is stored and the payment status moves to
en_revision. The student can also view all their payment records at GET /student/payments.Admin Workflow
View payment queue
The admin navigates to the payments list:Payments can be filtered by status. The admin sees the student name, payment type, amount, and comprobante thumbnail.
Approve or reject
Based on the review, the admin takes one of two actions:Approve:
PaymentService::approve() sets status = 'aprobado', then triggers the appropriate downstream action (enrollment, book order, or subscription activation). A PaymentApprovedNotification is sent to the student.Reject:PaymentService::reject() sets status = 'rechazado' and sends a PaymentRejectedNotification to the student.Access is granted automatically
On approval, the system handles the full downstream workflow without further admin input:
- Course → enrollment created, student gains classroom access
- Book → book order created, stock decremented (if applicable)
- Subscription →
Subscriptionrecord created/updated,SubscriptionAccessService::sync()enrolls student in all published courses
Reverting an Approval
If an admin approved a payment in error, they can revert it:PaymentService::revert() only works on payments with status = 'aprobado'. It sets the status back to en_revision and undoes the access grant:
| Payment Type | Revert Action |
|---|---|
| Course | Enrollment row is deleted (only the one tied to this payment_id and not subscription-granted) |
| Subscription | If no other approved subscription payment exists, the Subscription is set to cancelada and SubscriptionAccessService::sync() revokes access |
| Book | BookOrderService::cancelForPayment() cancels the order; stock is incremented if the book has limited stock |
Quiz and Certificate Environment Variables
After a course payment is approved and the student gains classroom access, they must pass the course quiz to unlock their certificate. Two environment variables control the global quiz evaluation rules that apply across all paid and subscription courses:| Variable | Default | Description |
|---|---|---|
EDUCATION_PASSING_SCORE | 14 | Minimum score a student must achieve to pass a quiz and unlock their certificate. |
EDUCATION_MAX_ATTEMPTS | 3 | Maximum number of times a student may attempt a quiz before being locked out. |
These variables apply globally to all courses. Per-course overrides are not currently supported. Adjust them in your
.env file and restart the application for changes to take effect.