tax_rate(); if ( 0 === $rate->percent() || $rate->is_inclusive() ) { return $running; } return $running->add( $this->tax_amount( $ctx, $running ) ); } /** * Tax component for the given post-discount amount. * * @param PriceContext $ctx Context. * @param Money $running Post-discount amount (tax-inclusive or exclusive base). * * @since 0.1.0 */ public function tax_amount( PriceContext $ctx, Money $running ): Money { $rate = $ctx->tax_rate(); if ( 0 === $rate->percent() ) { return Money::zero( $running->currency() ); } if ( $rate->is_inclusive() ) { // tax = gross × rate / (100 + rate), half-away-from-zero. $tax_minor = Money::divide_round( $running->amount_minor() * $rate->percent(), 100 + $rate->percent() ); return new Money( $tax_minor, $running->currency() ); } return $running->percent( $rate->percent() ); } }