PluginProbe
Tiered Pricing Table for WooCommerce / 2.3.4
Tiered Pricing Table for WooCommerce v2.3.4
7.1.7 7.1.5 7.1.4 7.1.1 6.5.0 6.4.0 6.1.0 trunk 1.0 1.1 2.0 2.0.1 2.0.2 2.1 2.1.1 2.1.2 2.2.0 2.2.1 2.2.2 2.2.3 2.3.0 2.3.1 2.3.2 2.3.3 2.3.4 All 90 releases
tier-pricing-table / src / PriceManager.php

PriceManager.php in Tiered Pricing Table for WooCommerce 2.3.4, at src/PriceManager.php

323 lines 7.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php namespace TierPricingTable;
2
3 use WC_Product;
4
5 class PriceManager {
6
7 /**
8 * Return fixed price rules or empty array if not exist rules
9 *
10 * @param $product_id
11 * @param string $context
12 *
13 * @return array
14 */
15 public static function getFixedPriceRules( $product_id, $context = 'view' ) {
16 return self::getPriceRules( $product_id, 'fixed', $context );
17 }
18
19 /**
20 * Return percentage price rules or empty array if not exist rules
21 *
22 * @param $product_id
23 * @param string $context
24 *
25 * @return array
26 */
27 public static function getPercentagePriceRules( $product_id, $context = 'view' ) {
28 return self::getPriceRules( $product_id, 'percentage', $context );
29 }
30
31 /**
32 * Get product pricing rules
33 *
34 * @param int $product_id
35 * @param bool $type
36 * @param string $context
37 *
38 * @return array
39 */
40 public static function getPriceRules( $product_id, $type = false, $context = 'view' ) {
41
42 $type = $type ? $type : self::getPricingType( $product_id, 'fixed', $context );
43
44 if ( 'fixed' === $type ) {
45 $rules = get_post_meta( $product_id, '_fixed_price_rules', true );
46 } else {
47 $rules = get_post_meta( $product_id, '_percentage_price_rules', true );
48 }
49
50 // If no rules for variation check for product level rules.
51 if ( 'view' === $context && self::variationHasNoOwnRules( $product_id, $rules ) ) {
52
53 $product = wc_get_product( $product_id );
54
55 $product_id = $product->get_parent_id();
56
57 $type = self::getPricingType( $product_id );
58
59 if ( 'fixed' === $type ) {
60 $rules = get_post_meta( $product_id, '_fixed_price_rules', true );
61 } else {
62 $rules = get_post_meta( $product_id, '_percentage_price_rules', true );
63 }
64 }
65
66 $rules = ! empty( $rules ) ? $rules : array();
67
68 ksort( $rules );
69
70 return apply_filters( 'tier_pricing_table/price/product_price_rules', $rules, $product_id, $type );
71 }
72
73 /**
74 * Get price by product quantity
75 *
76 * @param int $quantity
77 * @param int $product_id
78 * @param string $context
79 * @param string $place
80 *
81 * @return bool|float|int
82 */
83 public static function getPriceByRules( $quantity, $product_id, $context = 'view', $place = 'shop' ) {
84
85 $rules = self::getPriceRules( $product_id );
86
87 $type = self::getPricingType( $product_id );
88
89 if ( 'fixed' === $type ) {
90 foreach ( array_reverse( $rules, true ) as $_amount => $price ) {
91 if ( $_amount <= $quantity ) {
92
93 $product_price = $price;
94
95 if ( 'view' === $context ) {
96 $product = wc_get_product( $product_id );
97
98 $product_price = self::getPriceWithTaxes( $product_price, $product, $place );
99 }
100
101 break;
102 }
103 }
104 }
105
106 if ( 'percentage' === $type ) {
107 $product = wc_get_product( $product_id );
108
109 foreach ( array_reverse( $rules, true ) as $_amount => $percentDiscount ) {
110 if ( $_amount <= $quantity ) {
111
112 $product_price = self::getPriceByPercentDiscount( $product->get_price(), $percentDiscount );
113
114 if ( 'view' === $context ) {
115
116 $product = wc_get_product( $product_id );
117
118 $product_price = self::getPriceWithTaxes( $product_price, $product, $place );
119
120 }
121
122 break;
123 }
124 }
125 }
126
127 $product_price = isset( $product_price ) ? $product_price : false;
128
129 return apply_filters( 'tier_pricing_table/price/price_by_rules', $product_price, $quantity, $product_id );
130 }
131
132 /**
133 * Calculate displayed price depend on taxes
134 *
135 * @param float $price
136 * @param WC_Product $product
137 * @param string $place
138 *
139 * @return float
140 */
141 public static function getPriceWithTaxes( $price, $product, $place = 'shop' ) {
142
143 if ( wc_tax_enabled() ) {
144
145 if ( 'cart' === $place ) {
146 $price = 'incl' === get_option( 'woocommerce_tax_display_cart' ) ?
147
148 wc_get_price_including_tax( $product, array(
149 'qty' => 1,
150 'price' => $price
151 )
152 ) :
153
154 wc_get_price_excluding_tax( $product, array(
155 'qty' => 1,
156 'price' => $price
157 )
158 );
159 } else {
160 $price = wc_get_price_to_display( $product, array(
161 'price' => $price,
162 'qty' => 1,
163 ) );
164 }
165 }
166
167 return $price;
168 }
169
170
171 /**
172 * Calculate price using percentage discount
173 *
174 * @param float|int $price
175 * @param float|int $discount
176 *
177 * @return bool|float|int
178 */
179 public static function getPriceByPercentDiscount( $price, $discount ) {
180 if ( $price > 0 && $discount <= 100 ) {
181 $discount_amount = ( $price / 100 ) * $discount;
182
183 return $price - $discount_amount;
184 }
185
186 return false;
187 }
188
189 /**
190 * Get pricing type of product. Available: fixed or percentage
191 *
192 * @param int $product_id
193 * @param string $default
194 * @param string $context
195 *
196 * @return string
197 */
198 public static function getPricingType( $product_id, $default = 'fixed', $context = 'view' ) {
199
200 $type = get_post_meta( $product_id, '_tiered_price_rules_type', true );
201
202 if ( 'view' === $context && self::variationHasNoOwnRules( $product_id ) ) {
203 $product = wc_get_product( $product_id );
204
205 $type = get_post_meta( $product->get_parent_id(), '_tiered_price_rules_type', true );
206 }
207
208 $type = in_array( $type, array( 'fixed', 'percentage' ) ) ? $type : $default;
209
210 return apply_filters( 'tier_pricing_table/price/type', $type, $product_id );
211 }
212
213 /**
214 * Update price rules
215 *
216 * @param array $amounts
217 * @param array $prices
218 * @param int $product_id
219 */
220 public static function updateFixedPriceRules( $amounts, $prices, $product_id ) {
221 $rules = array();
222
223 foreach ( $amounts as $key => $amount ) {
224 if ( ! empty( $amount ) && ! empty( $prices[ $key ] ) && ! key_exists( $amount, $rules ) ) {
225 $rules[ $amount ] = wc_format_decimal( $prices[ $key ] );
226 }
227 }
228
229 update_post_meta( $product_id, '_fixed_price_rules', $rules );
230 }
231
232 /**
233 * Update price rules
234 *
235 * @param array $amounts
236 * @param array $percents
237 * @param int $product_id
238 */
239 public static function updatePercentagePriceRules( $amounts, $percents, $product_id ) {
240 $rules = array();
241
242 foreach ( $amounts as $key => $amount ) {
243 if ( ! empty( $amount ) && ! empty( $percents[ $key ] ) && ! key_exists( $amount,
244 $rules ) && $percents[ $key ] < 99 ) {
245 $rules[ $amount ] = $percents[ $key ];
246 }
247 }
248
249 update_post_meta( $product_id, '_percentage_price_rules', $rules );
250 }
251
252 /**
253 * Update product pricing type
254 *
255 * @param int $product_id
256 * @param string $type
257 */
258 public static function updatePriceRulesType( $product_id, $type ) {
259 if ( in_array( $type, array( 'percentage', 'fixed' ) ) ) {
260 update_post_meta( $product_id, '_tiered_price_rules_type', $type );
261 }
262 }
263
264 /**
265 * Get minimum product qty for table
266 *
267 * @param int $product_id
268 * @param string $context
269 *
270 * @return int
271 */
272 public static function getProductQtyMin( $product_id, $context = 'view' ) {
273
274 if ( 'view' === $context && self::variationHasNoOwnRules( $product_id ) ) {
275 $product = wc_get_product( $product_id );
276 $product_id = $product->get_parent_id();
277 }
278
279 $min = get_post_meta( $product_id, '_tiered_price_minimum_qty', true );
280
281 $min = $min ? intval( $min ) : 1;
282
283 return apply_filters( 'tier_pricing_table/price/minimum', $min, $product_id );
284 }
285
286 /**
287 * Update product min
288 *
289 * @param int $product_id
290 * @param int $min
291 */
292 public static function updateProductQtyMin( $product_id, $min ) {
293
294 $min = intval( $min );
295
296 if ( $min > 0 ) {
297 update_post_meta( $product_id, '_tiered_price_minimum_qty', $min );
298 }
299 }
300
301 /**
302 * Check if variation has no own rules
303 *
304 * @param int $product_id
305 * @param bool $rules
306 *
307 * @return bool
308 */
309 protected static function variationHasNoOwnRules( $product_id, $rules = false ) {
310
311 $rules = $rules ? $rules : self::getPriceRules( $product_id, false, 'edit' );
312
313 if ( empty( $rules ) ) {
314
315 $product = wc_get_product( $product_id );
316
317 return $product->is_type( 'variation' );
318 }
319
320 return false;
321 }
322 }
323