Skip to content
← Back to Snippets
Code

Discount Rule Evaluation Trace

Traces discount-rule eligibility decisions so an admin can see why each rule passed or failed.

Purpose

Traces discount-rule eligibility decisions so an admin can see why each rule passed or failed.

Snippet details

ContextEcommerceLevelAdvancedCopy-and-paste statusMarked safe after review.

Categories

  • Security

Code

<?php

/*
 * Copyright (c) 2026 Jeffery L. Paris <jparis@phpog.com>.
 * Free for personal and internal use. Paid project use requires visible credit
 * to Jeffery L. Paris. Corporate use requires a paid license fee unless a
 * separate written license states otherwise.
 */

/**
 * Discount Rule Evaluation Trace.
 *
 * Purpose:
 * Traces discount-rule eligibility decisions so an admin can see why each rule passed or failed.
 *
 * @param array $rules Discount rules.
 * @param array $cart Cart facts.
 * @return array Rule evaluation trace.
 */
function ogSnippetDiscountRuleEvaluationTrace(array $rules, array $cart): array {
	$trace = array();
	foreach ($rules as $rule) {
		$passed = true;
		$reasons = array();
		if (isset($rule['min_cents']) && (int) $cart['subtotal_cents'] < (int) $rule['min_cents']) {
			$passed = false;
			$reasons[] = 'subtotal_below_minimum';
		}
		if (isset($rule['required_sku']) && !in_array($rule['required_sku'], $cart['skus'], true)) {
			$passed = false;
			$reasons[] = 'required_sku_missing';
		}
		$trace[] = array('code' => (string) $rule['code'], 'passed' => $passed, 'reasons' => $reasons);
	}
	return $trace;
}

$trace = ogSnippetDiscountRuleEvaluationTrace(array(array('code' => 'TYLIUM10', 'min_cents' => 5000)), array('subtotal_cents' => 4200, 'skus' => array('FUEL-CELL')));
echo $trace[0]['reasons'][0];