ConditionsFactory.php
131 lines
| 1 | <?php |
| 2 | /** |
| 3 | * Class ConditionsFactory |
| 4 | * |
| 5 | * @package WPDesk\FS\TableRate\Rule\Condition |
| 6 | */ |
| 7 | |
| 8 | namespace WPDesk\FS\TableRate\Rule\Condition; |
| 9 | |
| 10 | use WPDesk\FS\TableRate\Rule\Condition\Pro\CartLineItem; |
| 11 | use WPDesk\FS\TableRate\Rule\Condition\Pro\DayOfTheWeek; |
| 12 | use WPDesk\FS\TableRate\Rule\Condition\Pro\DimensionalWeight; |
| 13 | use WPDesk\FS\TableRate\Rule\Condition\Pro\Item; |
| 14 | use WPDesk\FS\TableRate\Rule\Condition\Pro\MaxDimension; |
| 15 | use WPDesk\FS\TableRate\Rule\Condition\Pro\Product; |
| 16 | use WPDesk\FS\TableRate\Rule\Condition\Pro\ProductCategory; |
| 17 | use WPDesk\FS\TableRate\Rule\Condition\Pro\ProductDimensionHeight; |
| 18 | use WPDesk\FS\TableRate\Rule\Condition\Pro\ProductDimensionLength; |
| 19 | use WPDesk\FS\TableRate\Rule\Condition\Pro\ProductDimensionWidth; |
| 20 | use WPDesk\FS\TableRate\Rule\Condition\Pro\ProductFieldRange; |
| 21 | use WPDesk\FS\TableRate\Rule\Condition\Pro\ProductFieldValue; |
| 22 | use WPDesk\FS\TableRate\Rule\Condition\Pro\ProductStockQuantity; |
| 23 | use WPDesk\FS\TableRate\Rule\Condition\Pro\ProductStockStatus; |
| 24 | use WPDesk\FS\TableRate\Rule\Condition\Pro\ProductTag; |
| 25 | use WPDesk\FS\TableRate\Rule\Condition\Pro\ShippingClass; |
| 26 | use WPDesk\FS\TableRate\Rule\Condition\Pro\ShippingCost; |
| 27 | use WPDesk\FS\TableRate\Rule\Condition\Pro\TimeOfTheDay; |
| 28 | use WPDesk\FS\TableRate\Rule\Condition\Pro\TotalOverallDimensions; |
| 29 | use WPDesk\FS\TableRate\Rule\Condition\Pro\UserRole; |
| 30 | use WPDesk\FS\TableRate\Rule\Condition\Pro\Volume; |
| 31 | |
| 32 | /** |
| 33 | * Can provide rules conditions. |
| 34 | */ |
| 35 | class ConditionsFactory { |
| 36 | |
| 37 | /** |
| 38 | * @return Condition[] |
| 39 | */ |
| 40 | public function get_conditions(): array { |
| 41 | $none = new None( 0 ); |
| 42 | $price = new Price( 10 ); |
| 43 | $weight = new Weight( 25 ); |
| 44 | |
| 45 | // Pro conditions. |
| 46 | $item = new Item( 15 ); |
| 47 | $volume = new Volume( 35 ); |
| 48 | $product = new Product( 30 ); |
| 49 | $product_tag = new ProductTag( 45 ); |
| 50 | $product_category = new ProductCategory( 50 ); |
| 51 | $product_field_value = new ProductFieldValue( 55 ); |
| 52 | $product_field_range = new ProductFieldRange( 56 ); |
| 53 | $product_stock_quantity = new ProductStockQuantity( 60 ); |
| 54 | $product_stock_status = new ProductStockStatus( \wc_get_product_stock_status_options(), 61 ); |
| 55 | $shipping_cost = new ShippingCost( 100 ); |
| 56 | $time_of_the_day = new TimeOfTheDay( 70 ); |
| 57 | $max_dimension = new MaxDimension( 40 ); |
| 58 | $product_length = new ProductDimensionLength( 41 ); |
| 59 | $product_width = new ProductDimensionWidth( 42 ); |
| 60 | $product_height = new ProductDimensionHeight( 43 ); |
| 61 | $cart_line_item = new CartLineItem( 20 ); |
| 62 | $shipping_class = new ShippingClass( 60 ); |
| 63 | $day_of_the_week = new DayOfTheWeek( 75 ); |
| 64 | $total_overall_dimensions = new TotalOverallDimensions( 40 ); |
| 65 | $user_role = new UserRole( 40 ); |
| 66 | $dimensional_weight = new DimensionalWeight( 30 ); |
| 67 | |
| 68 | $conditions = [ |
| 69 | $none->get_condition_id() => $none, |
| 70 | $price->get_condition_id() => $price, |
| 71 | $weight->get_condition_id() => $weight, |
| 72 | $item->get_condition_id() => $item, |
| 73 | $volume->get_condition_id() => $volume, |
| 74 | $product->get_condition_id() => $product, |
| 75 | $product_tag->get_condition_id() => $product_tag, |
| 76 | $product_category->get_condition_id() => $product_category, |
| 77 | $time_of_the_day->get_condition_id() => $time_of_the_day, |
| 78 | $max_dimension->get_condition_id() => $max_dimension, |
| 79 | $product_length->get_condition_id() => $product_length, |
| 80 | $product_width->get_condition_id() => $product_width, |
| 81 | $product_height->get_condition_id() => $product_height, |
| 82 | $cart_line_item->get_condition_id() => $cart_line_item, |
| 83 | $shipping_class->get_condition_id() => $shipping_class, |
| 84 | $day_of_the_week->get_condition_id() => $day_of_the_week, |
| 85 | $total_overall_dimensions->get_condition_id() => $total_overall_dimensions, |
| 86 | $user_role->get_condition_id() => $user_role, |
| 87 | $dimensional_weight->get_condition_id() => $dimensional_weight, |
| 88 | $product_field_value->get_condition_id() => $product_field_value, |
| 89 | $product_field_range->get_condition_id() => $product_field_range, |
| 90 | $product_stock_quantity->get_condition_id() => $product_stock_quantity, |
| 91 | $product_stock_status->get_condition_id() => $product_stock_status, |
| 92 | $shipping_cost->get_condition_id() => $shipping_cost, |
| 93 | ]; |
| 94 | |
| 95 | $conditions = apply_filters( 'flexible_shipping_rule_conditions', $conditions ); |
| 96 | $conditions = $this->filter_conditions( $conditions ); |
| 97 | |
| 98 | return $this->sort_conditions( $conditions ); |
| 99 | } |
| 100 | |
| 101 | /** |
| 102 | * @param Condition[] $conditions . |
| 103 | * |
| 104 | * @return Condition[] |
| 105 | */ |
| 106 | private function filter_conditions( array $conditions ): array { |
| 107 | return array_filter( |
| 108 | $conditions, |
| 109 | function ( $condition ) { |
| 110 | return $condition instanceof Condition; |
| 111 | } |
| 112 | ); |
| 113 | } |
| 114 | |
| 115 | /** |
| 116 | * @param Condition[] $conditions . |
| 117 | * |
| 118 | * @return Condition[] |
| 119 | */ |
| 120 | private function sort_conditions( array $conditions ): array { |
| 121 | uasort( |
| 122 | $conditions, |
| 123 | function ( Condition $condition1, Condition $condition2 ) { |
| 124 | return $condition1->get_priority() <=> $condition2->get_priority(); // phpcs:ignore. |
| 125 | } |
| 126 | ); |
| 127 | |
| 128 | return $conditions; |
| 129 | } |
| 130 | } |
| 131 |