sale_provenance = $sale_provenance ? $sale_provenance : new SaleProvenanceResolver(); } /** * Detect promotion signal from a WC_Order. * * @param \WC_Order $order Order. * @return array{signal:string,confidence:string,sale_evidence?:array} */ public function detect( $order ) { $has_coupon = false; foreach ( $order->get_items( 'coupon' ) as $item ) { $has_coupon = true; break; } $sale = $this->sale_provenance->resolve( $order ); $has_sale = ! empty( $sale['has_sale'] ); if ( $has_coupon && $has_sale ) { // PRD 8.2: both → verified only when coupon AND sale are verified. $sale_conf = isset( $sale['confidence'] ) ? $sale['confidence'] : 'suspected'; return array( 'signal' => 'both', 'confidence' => ( 'verified' === $sale_conf ) ? 'verified' : 'suspected', 'sale_evidence' => isset( $sale['evidence'] ) ? $sale['evidence'] : array(), ); } if ( $has_coupon ) { return array( 'signal' => 'coupon', 'confidence' => 'verified', ); } if ( $has_sale ) { return array( 'signal' => 'sale_price', 'confidence' => isset( $sale['confidence'] ) ? $sale['confidence'] : 'suspected', 'sale_evidence' => isset( $sale['evidence'] ) ? $sale['evidence'] : array(), ); } return array( 'signal' => 'none', 'confidence' => 'none', ); } }