Adds HST/tax to the payment system and builds the monthly payments report (roadmap #8) with HST aggregation.
HST / tax
Studio Settings gains a default HST rate (%) option (us_hst_rate, manage_billing).
us_payments gains tax_rate + tax_amount; the rate is frozen onto the payment at booking and tax is computed against the pre-tax subtotal. Payment::total() = subtotal + tax.
Overridable per booking on My Lessons while unpaid (recomputes tax_amount via PaymentRepository::updateTax), matching the e-transfer-email override pattern.
Comped registrations are never taxed; receipts break out subtotal / HST / total when tax applies.
PaymentReport — pure aggregator: subtotal, HST collected, grand total, and CSV rendering.
PaymentReportController — month + instructor filters; studio admins see all instructors, instructors are scoped to their own rows; CSV via a nonce-protected admin-post.php handler.
New Payment Report admin menu, gated on export_payments so instructors (who lack manage_billing) can reach it.
PaymentRepository::findPaidBetween — paid-in-month query with optional instructor filter.
Tests & docs
New PaymentReportTest; added updateTax/findPaidBetween, HST computation, comp-not-taxed, and HST-receipt cases.
Updated payments.md, payment-reporting.md, and the README status table.
All green: 160 tests, PHPCS clean, PHPStan no errors, no debug statements.
## Summary
Adds HST/tax to the payment system and builds the monthly payments report (roadmap #8) with HST aggregation.
### HST / tax
- **Studio Settings** gains a default **HST rate (%)** option (`us_hst_rate`, `manage_billing`).
- `us_payments` gains `tax_rate` + `tax_amount`; the rate is **frozen onto the payment at booking** and tax is computed against the pre-tax subtotal. `Payment::total()` = subtotal + tax.
- Overridable **per booking** on **My Lessons** while unpaid (recomputes `tax_amount` via `PaymentRepository::updateTax`), matching the e-transfer-email override pattern.
- Comped registrations are never taxed; receipts break out subtotal / HST / total when tax applies.
### Payment reporting (#8)
- `PaymentReport` — pure aggregator: subtotal, **HST collected**, grand total, and CSV rendering.
- `PaymentReportController` — month + instructor filters; studio admins see all instructors, instructors are scoped to their own rows; CSV via a nonce-protected `admin-post.php` handler.
- New **Payment Report** admin menu, gated on `export_payments` so instructors (who lack `manage_billing`) can reach it.
- `PaymentRepository::findPaidBetween` — paid-in-month query with optional instructor filter.
### Tests & docs
- New `PaymentReportTest`; added `updateTax`/`findPaidBetween`, HST computation, comp-not-taxed, and HST-receipt cases.
- Updated `payments.md`, `payment-reporting.md`, and the README status table.
All green: 160 tests, PHPCS clean, PHPStan no errors, no debug statements.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Studio Settings gains a default HST rate; the rate is frozen onto each
payment at booking and computed against the pre-tax subtotal, with the
total billed as subtotal + tax. The rate is overridable per booking on
My Lessons while unpaid (recomputing the tax amount), comped
registrations are never taxed, and receipts break out subtotal/HST/total.
Builds the payments report (roadmap #8) from us_payments: a monthly
per-instructor view with subtotal, HST collected, and grand-total
aggregation, plus a nonce-protected CSV export via admin-post. Studio
admins see all instructors and can filter; instructors are scoped to
their own rows. The Payment Report menu is gated on export_payments so
instructors (who lack manage_billing) can reach it.
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.
Summary
Adds HST/tax to the payment system and builds the monthly payments report (roadmap #8) with HST aggregation.
HST / tax
us_hst_rate,manage_billing).us_paymentsgainstax_rate+tax_amount; the rate is frozen onto the payment at booking and tax is computed against the pre-tax subtotal.Payment::total()= subtotal + tax.tax_amountviaPaymentRepository::updateTax), matching the e-transfer-email override pattern.Payment reporting (#8)
PaymentReport— pure aggregator: subtotal, HST collected, grand total, and CSV rendering.PaymentReportController— month + instructor filters; studio admins see all instructors, instructors are scoped to their own rows; CSV via a nonce-protectedadmin-post.phphandler.export_paymentsso instructors (who lackmanage_billing) can reach it.PaymentRepository::findPaidBetween— paid-in-month query with optional instructor filter.Tests & docs
PaymentReportTest; addedupdateTax/findPaidBetween, HST computation, comp-not-taxed, and HST-receipt cases.payments.md,payment-reporting.md, and the README status table.All green: 160 tests, PHPCS clean, PHPStan no errors, no debug statements.
🤖 Generated with Claude Code