Files
unsupervised-scheduler/src/Payment/ReceiptMailer.php
T
thatguygriff 553cfafa49
CI / Tests (PHP 8.1) (pull_request) Successful in 51s
CI / Coding Standards (pull_request) Successful in 1m1s
CI / Tests (PHP 8.2) (pull_request) Successful in 58s
CI / No Debug Code (pull_request) Successful in 4s
CI / PHPStan (pull_request) Successful in 1m16s
CI / Tests (PHP 8.3) (pull_request) Successful in 45s
CI / Build Plugin Zip (pull_request) Has been skipped
Add HST/tax support and payment reporting with HST aggregation
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 <noreply@anthropic.com>
2026-06-08 11:29:48 -03:00

47 lines
1.5 KiB
PHP

<?php
declare(strict_types=1);
namespace Unsupervised\Schedular\Payment;
class ReceiptMailer {
/**
* Email a numbered receipt to the student. Returns false when there is no
* recipient.
*/
public function send( Payment $payment, ?\WP_User $student ): bool {
if ( null === $student || '' === (string) $student->user_email ) {
return false;
}
$subject = sprintf(
/* translators: %s: receipt number */
__( 'Payment receipt %s', 'unsupervised-schedular' ),
(string) $payment->receiptNumber
);
if ( $payment->taxAmount > 0 ) {
$body = sprintf(
/* translators: 1: currency, 2: subtotal, 3: HST rate, 4: HST amount, 5: total, 6: receipt number */
__( "Thank you. We have recorded your payment.\n\nSubtotal: %1\$s %2\$s\nHST (%3\$s%%): %1\$s %4\$s\nTotal: %1\$s %5\$s\n\nReceipt: %6\$s", 'unsupervised-schedular' ),
$payment->currency,
number_format( $payment->amount, 2 ),
number_format( $payment->taxRate, 2 ),
number_format( $payment->taxAmount, 2 ),
number_format( $payment->total(), 2 ),
(string) $payment->receiptNumber
);
} else {
$body = sprintf(
/* translators: 1: amount, 2: currency, 3: receipt number */
__( "Thank you. We have recorded your payment of %1\$s %2\$s.\n\nReceipt: %3\$s", 'unsupervised-schedular' ),
number_format( $payment->total(), 2 ),
$payment->currency,
(string) $payment->receiptNumber
);
}
return (bool) wp_mail( $student->user_email, $subject, $body );
}
}