File "Rule.php"
Full Path: /home/jlklyejr/public_html/wp-content/test/test/test/wp-content/plugins/flexible-shipping/src/WPDesk/FS/TableRate/Rule/Rule.php
File size: 7.42 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/**
* Class Rule
*
* @package WPDesk\FS\TableRate\Calculate
*/
namespace WPDesk\FS\TableRate\Rule;
use FSVendor\WPDesk\Forms\Field;
use FSVendor\WPDesk\FS\TableRate\Settings\MethodSettings;
use Psr\Log\LoggerInterface;
use WPDesk\FS\TableRate\Rule\Condition\AbstractCondition;
use WPDesk\FS\TableRate\Rule\Condition\Condition;
use WPDesk\FS\TableRate\Rule\Cost\AbstractAdditionalCost;
use WPDesk\FS\TableRate\Rule\Cost\AdditionalCost;
use WPDesk\FS\TableRate\Rule\ShippingContents\ShippingContents;
use WPDesk\FS\TableRate\Rule\SpecialAction\None;
use WPDesk\FS\TableRate\Rule\SpecialAction\SpecialAction;
/**
* Single rule.
*/
class Rule {
const CONDITION_ID = 'condition_id';
const CONDITIONS = 'conditions';
const ADDITIONAL_COSTS = 'additional_costs';
const SPECIAL_ACTION = 'special_action';
/**
* @var array
*/
private $rule_settings;
/**
* @var Condition[]
*/
private $available_conditions;
/**
* @var Field[]
*/
private $cost_fields;
/**
* @var AdditionalCost[]
*/
private $available_additional_costs;
/**
* @var SpecialAction[]
*/
private $available_special_actions;
/**
* @var int
*/
private $cost_rounding_precision;
/**
* @var MethodSettings
*/
private $method_settings;
/**
* Rule constructor.
*
* @param array $rule_settings .
* @param Condition[] $available_conditions .
* @param Field[] $cost_fields .
* @param AdditionalCost[] $available_additional_costs .
* @param SpecialAction[] $available_special_actions .
* @param int $cost_rounding_precision .
* @param MethodSettings $method_settings .
*/
public function __construct(
$rule_settings,
array $available_conditions,
array $cost_fields,
array $available_additional_costs,
array $available_special_actions,
$cost_rounding_precision,
MethodSettings $method_settings
) {
$this->rule_settings = $rule_settings;
$this->available_conditions = $available_conditions;
$this->cost_fields = $cost_fields;
$this->available_additional_costs = $available_additional_costs;
$this->available_special_actions = $available_special_actions;
$this->cost_rounding_precision = $cost_rounding_precision;
$this->method_settings = $method_settings;
}
/**
* @param ShippingContents $shipping_contents .
*
* @return ShippingContents
*/
public function process_shipping_contents( ShippingContents $shipping_contents ): ShippingContents {
if ( $this->has_rule_conditions() ) {
foreach ( $this->rule_settings[ self::CONDITIONS ] as $condition_settings_key => $condition_settings ) {
if ( isset( $condition_settings[ self::CONDITION_ID ], $this->available_conditions[ $condition_settings[ self::CONDITION_ID ] ] ) ) {
$condition = $this->available_conditions[ $condition_settings[ self::CONDITION_ID ] ];
$shipping_contents = $condition->process_shipping_contents( $shipping_contents, $condition_settings );
}
}
}
return $shipping_contents;
}
/**
* @param ShippingContents $shipping_contents .
* @param LoggerInterface $logger .
*
* @return bool
*/
public function is_rule_triggered( ShippingContents $shipping_contents, LoggerInterface $logger ): bool {
$triggered = true;
if ( $this->has_rule_conditions() ) {
foreach ( $this->rule_settings[ self::CONDITIONS ] as $condition_settings_key => $condition_settings ) {
if ( isset( $condition_settings[ self::CONDITION_ID ], $this->available_conditions[ $condition_settings[ self::CONDITION_ID ] ] ) ) {
/** @var AbstractCondition $condition */
$condition = $this->available_conditions[ $condition_settings[ self::CONDITION_ID ] ];
$condition->set_rule( $this );
$condition_triggered = $condition->is_condition_matched_with_method_settings( $condition_settings, $shipping_contents, $logger, $this->method_settings );
$triggered = $triggered && $condition_triggered;
}
if ( ! $triggered ) {
break;
}
}
}
return $triggered;
}
/**
* @return bool
*/
public function has_rule_conditions(): bool {
return isset( $this->rule_settings[ self::CONDITIONS ] );
}
/**
* @param ShippingContents $shipping_contents .
* @param LoggerInterface $logger .
*
* @return float
*/
public function get_rule_cost( ShippingContents $shipping_contents, LoggerInterface $logger ): float {
// Translators: items.
$logger->debug( sprintf( __( ' Matched items: %1$s', 'flexible-shipping' ), $this->format_contents_for_log( $shipping_contents ) ) );
// Translators: items costs.
$logger->debug( sprintf( __( ' Matched items cost: %1$d %2$s', 'flexible-shipping' ), $shipping_contents->get_contents_cost(), $shipping_contents->get_currency() ) );
// Translators: items weight.
$logger->debug( sprintf( __( ' Matched items weight: %1$s', 'flexible-shipping' ), wc_format_weight( $shipping_contents->get_contents_weight() ) ) );
$logger->debug( sprintf( ' %1$s', __( 'Rule costs:', 'flexible-shipping' ) ) );
$cost = 0.0;
foreach ( $this->cost_fields as $cost_field ) {
if ( isset( $this->rule_settings[ $cost_field->get_name() ] ) ) {
$field_cost = (float) $this->rule_settings[ $cost_field->get_name() ];
$logger->debug( sprintf( ' %1$s: %2$s', $cost_field->get_label(), $field_cost ) );
$cost += $field_cost;
}
}
$cost += $this->get_additional_costs( $shipping_contents, $logger );
return $cost;
}
/**
* @param ShippingContents $shipping_contents
*
* @return string
*/
private function format_contents_for_log( ShippingContents $shipping_contents ): string {
$formatted_contents = [];
foreach ( $shipping_contents->get_contents() as $item ) {
$formatted_contents[] = sprintf( '%1$s (qty: %2$d)', $item['data']->get_name(), $item['quantity'] );
}
return implode( ', ', $formatted_contents );
}
/**
* @return SpecialAction
*/
public function get_special_action() {
if ( isset( $this->rule_settings[ self::SPECIAL_ACTION ], $this->available_special_actions[ $this->rule_settings[ self::SPECIAL_ACTION ] ] ) ) {
return $this->available_special_actions[ $this->rule_settings[ self::SPECIAL_ACTION ] ];
}
return new None();
}
/**
* @param ShippingContents $shipping_contents .
* @param LoggerInterface $logger .
*
* @return float
*/
private function get_additional_costs( ShippingContents $shipping_contents, LoggerInterface $logger ): float {
$additional_costs = 0.0;
$additional_costs_settings = $this->rule_settings[ self::ADDITIONAL_COSTS ] ?? [];
foreach ( $additional_costs_settings as $additional_cost_setting ) {
if ( isset( $this->available_additional_costs[ $additional_cost_setting['based_on'] ] ) ) {
/** @var AbstractAdditionalCost $additional_cost */
$additional_cost = $this->available_additional_costs[ $additional_cost_setting['based_on'] ];
$additional_cost->set_rule( $this );
$additional_costs += $additional_cost->calculate_cost_with_method_settings( $shipping_contents, $additional_cost_setting, $logger, $this->method_settings );
}
}
return $additional_costs;
}
/**
* @return array
*/
public function get_rules_settings(): array {
return $this->rule_settings;
}
/**
* @param int $rule_number .
*
* @return string
*/
public function format_for_log( $rule_number ) {
// Translators: rule number.
return sprintf( __( 'Rule %1$s:', 'flexible-shipping' ), $rule_number );
}
}