us_offerings table in Schema.php (kind, title, duration, price/currency, billing_mode one_time/full_term, allow_weekly, capacity, term dates, schedule_note, is_active)
Studio admin caps in Auth/RoleManager — new us_studio_admin role and capability strings (manage_instructors, manage_offerings, manage_questions, manage_policies, manage_billing, view_all_payments, view_own_payments, export_payments); instructor granted manage_offerings
Wiring — Plugin, RestRegistrar, AdminMenu register the new components; Offerings admin menu page
REST API
Method
Endpoint
Permission
GET
/offerings
public (active only)
POST
/offerings
manage_offerings
PATCH
/offerings/{id}
manage_offerings + owner/studio-admin
DELETE
/offerings/{id}
manage_offerings + owner/studio-admin
Tests
tests/Unit/Offering/ — value object + repository (14 tests)
Studio-admin case added to RoleManagerTest
composer test (44 tests), composer cs, and PHPStan level 6 all pass
Note: composer lint needs --memory-limit=512M on some machines (default 128M crashes the parallel worker).
Implements the offerings catalog (#1): private-lesson types and group
classes carrying pricing, billing mode (one_time/full_term), duration,
capacity, and term details. Adds the src/Offering/ domain (value object,
repository, REST endpoint, admin controller + template), the us_offerings
table, and an Offerings admin page.
Also lands the capability slice of #9: registers the us_studio_admin role
and the new capability strings (manage_instructors, manage_offerings,
manage_questions, manage_policies, manage_billing, view_all_payments,
view_own_payments, export_payments) so offering management gates correctly.
Tests: tests/Unit/Offering/ (value object + repository) and a studio-admin
case in RoleManagerTest. composer test, cs, and PHPStan level 6 all pass.
Refs #1#9
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Implements #1 (Offerings) plus the capability slice of #9 (Studio Admin role).
What's included
src/Offering/domain —Offeringvalue object,OfferingRepository(CRUD + filters),OfferingEndpoint(REST),OfferingController+templates/admin/offerings.phpus_offeringstable inSchema.php(kind, title, duration, price/currency, billing_modeone_time/full_term, allow_weekly, capacity, term dates, schedule_note, is_active)Auth/RoleManager— newus_studio_adminrole and capability strings (manage_instructors,manage_offerings,manage_questions,manage_policies,manage_billing,view_all_payments,view_own_payments,export_payments); instructor grantedmanage_offeringsPlugin,RestRegistrar,AdminMenuregister the new components; Offerings admin menu pageREST API
/offerings/offeringsmanage_offerings/offerings/{id}manage_offerings+ owner/studio-admin/offerings/{id}manage_offerings+ owner/studio-adminTests
tests/Unit/Offering/— value object + repository (14 tests)RoleManagerTestcomposer test(44 tests),composer cs, and PHPStan level 6 all passRefs #1 #9
🤖 Generated with Claude Code