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
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>
47 lines
1.5 KiB
PHP
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 );
|
|
}
|
|
}
|