Files
wp-multisite-waas/inc/helpers/validation-rules/class-price-variations.php
2025-02-07 19:02:33 -07:00

126 lines
2.2 KiB
PHP

<?php // phpcs:disable
/**
* Adds a validation rules that allows us to check if a given parameter is unique.
*
* @package WP_Ultimo
* @subpackage Helpers/Validation_Rules
* @since 2.0.0
*/
namespace WP_Ultimo\Helpers\Validation_Rules;
use Rakit\Validation\Rule;
// Exit if accessed directly
defined('ABSPATH') || exit;
/**
* Adds a validation rules that allows us to check if a given parameter is unique.
*
* @since 2.0.0
*/
class Price_Variations extends Rule {
/**
* Error message to be returned when this value has been used.
*
* @since 2.0.0
* @var string
*/
protected $message = ':attribute is wrongly setup.';
/**
* Parameters that this rule accepts.
*
* @since 2.0.0
* @var array
*/
protected $fillableParams = array('duration', 'duration_unit'); // phpcs:ignore
/**
* Performs the actual check.
*
* @since 2.0.0
*
* @param mixed $value Value being checked.
*/
public function check($value) : bool {
if (is_string($value)) {
$value = maybe_unserialize($value);
}
if (!is_array($value)) {
return false;
}
foreach ($value as $price_variation) {
/**
* Validation Duration
*/
$duration = wu_get_isset($price_variation, 'duration', false);
if (!is_numeric($duration) || (int) $duration <= 0) {
return false;
}
/**
* Validation Unit
*/
$unit = wu_get_isset($price_variation, 'duration_unit', false);
$allowed_units = array(
'day',
'week',
'month',
'year',
);
if (!in_array($unit, $allowed_units, true)) {
return false;
}
/**
* Check if it is the same as the main duration
*/
if ($this->parameter('duration') == $duration && $this->parameter('duration_unit') === $unit) {
$this->message = 'This product cannot have a price variation for the same duration and duration unit values as the product itself.';
return false;
}
/**
* Validation Amount
*/
$amount = wu_get_isset($price_variation, 'amount', false);
if ($amount) {
$amount = wu_to_float($amount);
}
if (!is_numeric($amount)) {
return false;
}
}
return true;
}
}