PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.6.1
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.6.1
1.6.5 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.4 1.5.5 1.5.3 1.5.2 1.5.1 1.5.0 1.4.2 1.4.1 1.4.0 1.3.28 1.3.27 1.3.26 1.3.25 1.3.23 1.3.22 1.3.21 1.3.20 1.3.19 trunk All 48 releases
fluent-cart / app / Helpers / Status.php

Status.php in FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler 1.6.1, at app/Helpers/Status.php

511 lines 18.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentCart\App\Helpers;
4
5 class Status
6 {
7 // product statuses: publish, draft, pending, private, future
8 public const PRODUCT_PUBLISH = 'publish';
9 public const PRODUCT_DRAFT = 'draft';
10 public const PRODUCT_PRIVATE = 'private';
11 public const PRODUCT_FUTURE = 'future';
12 public const PRODUCT_TRASH = 'trash';
13
14 // Order Statuses
15 public const ORDER_PROCESSING = 'processing';
16 public const ORDER_COMPLETED = 'completed';
17 public const ORDER_ON_HOLD = 'on-hold';
18 public const ORDER_CANCELED = 'canceled';
19 public const ORDER_FAILED = 'failed';
20
21 public const ORDER_MODE_TEST = 'test';
22 public const ORDER_MODE_LIVE = 'live';
23
24 // Payment Statuses
25 public const PAYMENT_PENDING = 'pending';
26 public const PAYMENT_PAID = 'paid';
27 public const PAYMENT_PARTIALLY_PAID = 'partially_paid';
28 public const PAYMENT_FAILED = 'failed';
29 public const PAYMENT_REFUNDED = 'refunded';
30 public const PAYMENT_PARTIALLY_REFUNDED = 'partially_refunded';
31 public const PAYMENT_AUTHORIZED = 'authorized';
32 public const PAYMENT_SCHEDULED = 'payment_scheduled';
33
34 // Transaction Statuses
35 public const TRANSACTION_SUCCEEDED = 'succeeded';
36 public const TRANSACTION_AUTHORIZED = 'authorized';
37 public const TRANSACTION_PENDING = 'pending';
38 public const TRANSACTION_REFUNDED = 'refunded';
39 public const TRANSACTION_FAILED = 'failed';
40 public const TRANSACTION_DISPUTE_LOST = 'dispute_lost';
41
42
43 // Transaction table transaction_type status
44 public const TRANSACTION_TYPE_CHARGE = 'charge';
45 public const TRANSACTION_TYPE_REFUND = 'refund';
46 public const TRANSACTION_TYPE_DISPUTE = 'dispute';
47
48 // todo: will remove after some necessary test
49 public const TRANSACTION_TYPE_SIGNUP = 'signup_fee';
50
51 // Subscription Statuses
52 public const SUBSCRIPTION_PENDING = 'pending';
53 public const SUBSCRIPTION_INTENDED = 'intended';
54 public const SUBSCRIPTION_TRIALING = 'trialing';
55 public const SUBSCRIPTION_ACTIVE = 'active';
56
57 public const SUBSCRIPTION_CANCELED = 'canceled';
58 public const SUBSCRIPTION_PAUSED = 'paused';
59 public const SUBSCRIPTION_PAST_DUE = 'past_due';
60 public const SUBSCRIPTION_EXPIRED = 'expired';
61 public const SUBSCRIPTION_FAILING = 'failing';
62 public const SUBSCRIPTION_EXPIRING = 'expiring';
63 public const SUBSCRIPTION_COMPLETED = 'completed';
64 public const SUBSCRIPTION_AUTHENTICATED = 'authenticated';
65 public const SUBSCRIPTION_CREATED = 'created';
66
67 public const SUBSCRIPTION_METHOD_MANUAL = 'manual';
68 public const SUBSCRIPTION_METHOD_AUTOMATIC = 'automatic';
69 public const SUBSCRIPTION_METHOD_SYSTEM = 'system';
70
71 // billing interval
72 public const BILLING_YEARLY = 'yearly';
73 public const BILLING_HALF_YEARLY = 'half_yearly';
74 public const BILLING_QUARTERLY = 'quarterly';
75 public const BILLING_MONTHLY = 'monthly';
76 public const BILLING_WEEKLY = 'weekly';
77 public const BILLING_DAILY = 'daily';
78
79 // Shipping Statuses
80 public const SHIPPING_UNSHIPPED = 'unshipped';
81 public const SHIPPING_SHIPPED = 'shipped';
82 public const SHIPPING_DELIVERED = 'delivered';
83 public const SHIPPING_UNSHIPPABLE = 'unshippable';
84
85 // Customer Statuses
86 public const CUSTOMER_ACTIVE = 'active';
87 public const CUSTOMER_INACTIVE = 'inactive';
88
89 // Stock Statuses
90 public const STOCK_INSTOCK = 'instock';
91 public const STOCK_OUTOFSTOCK = 'outofstock';
92 public const STOCK_ONBACKORDER = 'onbackorder';
93
94
95 public const SCHEDULE_PENDING = 'pending';
96 public const SCHEDULE_COMPLETED = 'completed';
97 public const SCHEDULE_FAILED = 'failed';
98
99 public const SCHEDULE_PROCESSING = 'processing';
100
101 public const LICENSE_ACTIVE = 'active';
102 public const LICENSE_DISABLED = 'disabled';
103 public const LICENSE_EXPIRED = 'expired';
104
105 public const FULFILLMENT_TYPE_PHYSICAL = 'physical';
106 public const FULFILLMENT_TYPE_DIGITAL = 'digital';
107
108 public const ORDER_TYPE_PAYMENT = 'payment';
109 public const ORDER_TYPE_SUBSCRIPTION = 'subscription';
110 public const ORDER_TYPE_RENEWAL = 'renewal';
111
112
113 public static function getProductStatuses($withLabel = true)
114 {
115 return apply_filters('fluent_cart/product_statuses', [
116 self::PRODUCT_PUBLISH => __('Publish', 'fluent-cart'),
117 self::PRODUCT_DRAFT => __('Draft', 'fluent-cart'),
118 self::PRODUCT_PRIVATE => __('Private', 'fluent-cart'),
119 self::PRODUCT_FUTURE => __('Scheduled', 'fluent-cart'),
120 self::PRODUCT_TRASH => __('Trashed', 'fluent-cart'),
121 ], []);
122
123 if ($withLabel) {
124 return $statues;
125 }
126
127 return array_keys($statues);
128 }
129
130 public static function getScheduleStatus($status): string
131 {
132 $statuses = [
133 'pending' => Status::SCHEDULE_PENDING,
134 'processing' => Status::SCHEDULE_PROCESSING,
135 'completed' => Status::SCHEDULE_COMPLETED,
136 'failed' => Status::SCHEDULE_FAILED,
137 ];
138
139 return $statuses[$status] ?? Status::SCHEDULE_PENDING;
140 }
141
142 public static function getLicenseStatus($status): string
143 {
144 $statuses = [
145 'active' => Status::LICENSE_ACTIVE,
146 'disabled' => Status::LICENSE_DISABLED,
147 'expired' => Status::LICENSE_EXPIRED,
148 ];
149
150 return $statuses[$status] ?? Status::LICENSE_ACTIVE;
151 }
152
153 public static function productAdminAllStatuses()
154 {
155 $statuses = self::getProductStatuses();
156 unset($statuses[self::PRODUCT_TRASH]);
157 return array_keys($statuses);
158 }
159
160
161 // Order statuses
162 public static function getOrderStatuses()
163 {
164 return apply_filters('fluent_cart/order_statuses', [
165 self::ORDER_PROCESSING => __('Processing', 'fluent-cart'),
166 self::ORDER_COMPLETED => __('Completed', 'fluent-cart'),
167 self::ORDER_ON_HOLD => __('On Hold', 'fluent-cart'),
168 self::ORDER_CANCELED => __('Canceled', 'fluent-cart'),
169 self::ORDER_FAILED => __('Failed', 'fluent-cart'),
170 ], []);
171 }
172
173 public static function getEditableOrderStatuses()
174 {
175 $statuses = apply_filters_deprecated('fluent-cart/editable_order_statuses', [
176 [
177 self::ORDER_ON_HOLD => __('On Hold', 'fluent-cart'),
178 self::ORDER_PROCESSING => __('Processing', 'fluent-cart'),
179 self::ORDER_COMPLETED => __('Completed', 'fluent-cart'),
180 // 'archived' => __('Archived', 'fluent-cart'),
181 self::ORDER_CANCELED => __('Canceled', 'fluent-cart')
182 ], []
183 ], '1.3.16', 'fluent_cart/editable_order_statuses', 'Use fluent_cart/editable_order_statuses instead of fluent-cart/editable_order_statuses. It will be removed in v1.4.3.');
184
185 return apply_filters('fluent_cart/editable_order_statuses', $statuses, []);
186 }
187
188
189 // Payment statuses
190 public static function getPaymentStatuses()
191 {
192 return apply_filters('fluent_cart/payment_statuses', [
193 self::PAYMENT_PENDING => __('Pending', 'fluent-cart'),
194 self::PAYMENT_PAID => __('Paid', 'fluent-cart'),
195 self::PAYMENT_PARTIALLY_PAID => __('Partially Paid', 'fluent-cart'),
196 self::PAYMENT_FAILED => __('Failed', 'fluent-cart'),
197 self::PAYMENT_REFUNDED => __('Refunded', 'fluent-cart'),
198 self::PAYMENT_PARTIALLY_REFUNDED => __('Partially Refunded', 'fluent-cart'),
199 self::PAYMENT_AUTHORIZED => __('Authorized', 'fluent-cart'),
200 self::PAYMENT_SCHEDULED => __('Payment Scheduled', 'fluent-cart'),
201 ], []);
202 }
203
204 // Transaction statuses
205 public static function getTransactionStatuses($withLabel = true)
206 {
207 return apply_filters('fluent_cart/transaction_statuses', [
208 self::TRANSACTION_PENDING => __('Pending', 'fluent-cart'),
209 self::TRANSACTION_SUCCEEDED => __('Succeeded', 'fluent-cart'),
210 self::TRANSACTION_AUTHORIZED => __('Authorized', 'fluent-cart'),
211 self::TRANSACTION_FAILED => __('Failed', 'fluent-cart'),
212 self::TRANSACTION_REFUNDED => __('Refunded', 'fluent-cart'),
213 ], []);
214
215 if ($withLabel) {
216 return $statuses;
217 }
218
219 return array_keys($statuses);
220 }
221
222 public static function getEditableTransactionStatuses($withLabel = true)
223 {
224 $statuses = apply_filters_deprecated('fluent-cart/editable_transaction_statuses', [
225 [
226 self::TRANSACTION_PENDING => __('Pending', 'fluent-cart'),
227 self::TRANSACTION_SUCCEEDED => __('Succeeded', 'fluent-cart'),
228 self::TRANSACTION_AUTHORIZED => __('Authorized', 'fluent-cart'),
229 self::TRANSACTION_FAILED => __('Failed', 'fluent-cart'),
230 self::TRANSACTION_REFUNDED => __('Refunded', 'fluent-cart'),
231 ], []
232 ], '1.3.16', 'fluent_cart/editable_transaction_statuses', 'Use fluent_cart/editable_transaction_statuses instead of fluent-cart/editable_transaction_statuses. It will be removed in v1.4.3.');
233
234 $statuses = apply_filters('fluent_cart/editable_transaction_statuses', $statuses, []);
235
236 if ($withLabel) {
237 return $statuses;
238 }
239
240 return array_keys($statuses);
241 }
242
243 // Shipping statuses
244 public static function getShippingStatuses()
245 {
246 return apply_filters('fluent_cart/shipping_statuses', [
247 self::SHIPPING_UNSHIPPED => __('Unshipped', 'fluent-cart'),
248 self::SHIPPING_SHIPPED => __('Shipped', 'fluent-cart'),
249 self::SHIPPING_DELIVERED => __('Delivered', 'fluent-cart'),
250 self::SHIPPING_UNSHIPPABLE => __('Unshippable', 'fluent-cart'),
251 ], []);
252 }
253
254 public static function getEditableShippingStatuses()
255 {
256 $statuses = apply_filters_deprecated('fluent-cart/editable_order_statuses', [
257 [
258 self::SHIPPING_UNSHIPPED => __('Unshipped', 'fluent-cart'),
259 self::SHIPPING_SHIPPED => __('Shipped', 'fluent-cart'),
260 self::SHIPPING_DELIVERED => __('Delivered', 'fluent-cart'),
261 self::SHIPPING_UNSHIPPABLE => __('Unshippable', 'fluent-cart'),
262 ], []
263 ], '1.3.16', 'fluent_cart/editable_shipping_statuses', 'Use fluent_cart/editable_shipping_statuses instead of fluent-cart/editable_order_statuses. It will be removed in v1.4.3.');
264
265 return apply_filters('fluent_cart/editable_shipping_statuses', $statuses, []);
266 }
267
268 // Subscription statuses
269 public static function getSubscriptionStatuses()
270 {
271 return apply_filters('fluent_cart/subscription_statuses', [
272 self::SUBSCRIPTION_PENDING => __('Pending', 'fluent-cart'),
273 self::SUBSCRIPTION_ACTIVE => __('Active', 'fluent-cart'),
274 self::SUBSCRIPTION_FAILING => __('Failing', 'fluent-cart'),
275 self::SUBSCRIPTION_PAUSED => __('Paused', 'fluent-cart'),
276 self::SUBSCRIPTION_EXPIRED => __('Expired', 'fluent-cart'),
277 self::SUBSCRIPTION_EXPIRING => __('Expiring', 'fluent-cart'),
278 self::SUBSCRIPTION_CANCELED => __('Canceled', 'fluent-cart'),
279 self::SUBSCRIPTION_TRIALING => __('Trialing', 'fluent-cart'),
280 self::SUBSCRIPTION_INTENDED => __('Intended', 'fluent-cart'),
281 self::SUBSCRIPTION_PAST_DUE => __('Past Due', 'fluent-cart'),
282 self::SUBSCRIPTION_COMPLETED => __('Completed', 'fluent-cart'),
283 ], []);
284 }
285
286 // Get Validable Subscription Statuses
287 public static function getValidableSubscriptionStatuses()
288 {
289 return apply_filters('fluent_cart/validable_subscription_statuses', [
290 self::SUBSCRIPTION_ACTIVE,
291 self::SUBSCRIPTION_TRIALING,
292 ], []);
293 }
294
295
296 // Stock statuses
297 public static function getStockStatuses($withLabel = true)
298 {
299 $statues = [
300 self::STOCK_INSTOCK => __('In Stock', 'fluent-cart'),
301 self::STOCK_OUTOFSTOCK => __('Out Of Stock', 'fluent-cart'),
302 ];
303
304 if ($withLabel) {
305 return $statues;
306 }
307
308 return array_keys($statues);
309 }
310
311 public static function getOrderSuccessStatuses()
312 {
313 return [
314 self::ORDER_COMPLETED,
315 self::ORDER_PROCESSING,
316 ];
317 }
318
319 public static function getOrderFailedStatuses()
320 {
321 return [
322 self::ORDER_FAILED,
323 //'refunded',
324 self::ORDER_CANCELED,
325 ];
326 }
327
328 public static function getOrderPaymentSuccessStatuses()
329 {
330 return [
331 self::PAYMENT_PAID,
332 self::PAYMENT_PARTIALLY_REFUNDED,
333 self::PAYMENT_PARTIALLY_PAID,
334 ];
335 }
336
337 public static function getPaymentRetryableStatuses()
338 {
339 return [
340 self::PAYMENT_PENDING,
341 self::PAYMENT_FAILED
342 ];
343 }
344
345 public static function getReportStatuses()
346 {
347 return [
348 self::PAYMENT_PAID,
349 self::PAYMENT_REFUNDED,
350 self::PAYMENT_PARTIALLY_PAID,
351 self::PAYMENT_PARTIALLY_REFUNDED,
352 ];
353 }
354
355 public static function getTransactionSuccessStatuses()
356 {
357 return apply_filters('fluent_cart/transaction_success_statuses', [self::TRANSACTION_SUCCEEDED, self::TRANSACTION_AUTHORIZED], []);
358 }
359
360 // Get all statuses (optional utility)
361 public static function all()
362 {
363 return [
364 'product' => self::getProductStatuses(),
365 'order' => self::getOrderStatuses(),
366 'payment' => self::getPaymentStatuses(),
367 'transaction' => self::getTransactionStatuses(),
368 'shipping' => self::getShippingStatuses(),
369 'customer' => self::getEditableCustomerStatuses(),
370 'subscription' => self::getSubscriptionStatuses(),
371 ];
372 }
373
374 public static function getEditableCustomerStatuses()
375 {
376 $statuses = apply_filters_deprecated('fluent-cart/editable_customer_statuses', [
377 [
378 self::CUSTOMER_ACTIVE => __('Active', 'fluent-cart'),
379 self::CUSTOMER_INACTIVE => __('Inactive', 'fluent-cart'),
380 ], []
381 ], '1.3.16', 'fluent_cart/editable_customer_statuses', 'Use fluent_cart/editable_customer_statuses instead of fluent-cart/editable_customer_statuses. It will be removed in v1.4.3.');
382
383 return apply_filters('fluent_cart/editable_customer_statuses', $statuses, []);
384 }
385
386 // call when syncing status from external services, ex:
387 public static function syncPaymentStatus($status)
388 {
389 $status = strtolower($status);
390 $statuses = self::getPaymentStatuses();
391
392 if (isset($statuses[$status])) {
393 return $status;
394 }
395
396 if ('completed' === $status) {
397 return self::PAYMENT_PAID;
398 }
399
400 if ('succeeded' === $status) {
401 return self::PAYMENT_PAID;
402 }
403
404 return $status;
405 }
406
407 public static function syncTransactionStatus($status)
408 {
409 $status = strtolower($status);
410 $statuses = self::getTransactionStatuses();
411
412 if (isset($statuses[$status])) {
413 return $status;
414 }
415
416 if ('paid' === $status) {
417 return self::TRANSACTION_SUCCEEDED;
418 } else if ('succeeded' === $status) {
419 return self::TRANSACTION_SUCCEEDED;
420 }
421
422 return $status;
423 }
424
425 public static function syncSubscriptionStatus($status)
426 {
427 if ('cancelled' === $status || 'canceled' === $status) {
428 return self::SUBSCRIPTION_CANCELED;
429 }
430
431 return $status;
432 }
433
434 public static function eventTriggers(): array
435 {
436 return [
437 'require_list' => false,
438 'required' => true,
439 'key' => 'event_trigger',
440 'options' => [
441 'order' => [
442 'label' => __('Orders', 'fluent-cart'),
443 'options' => [
444 [
445 'value' => 'order_paid_done',
446 'label' => __('Order Paid (Payment / Subscription)', 'fluent-cart')
447 ],
448 [
449 'value' => 'order_status_changed_to_canceled',
450 'label' => __('Order Canceled', 'fluent-cart')
451 ],
452 [
453 'value' => 'order_fully_refunded',
454 'label' => __('Order Refunded (Full)', 'fluent-cart')
455 ]
456 ]
457 ],
458 'subscription' => [
459 'label' => __('Subscriptions', 'fluent-cart'),
460 'options' => [
461 [
462 'value' => 'subscription_activated',
463 'label' => __('Subscription Activated', 'fluent-cart')
464 ],
465 [
466 'value' => 'subscription_reactivated',
467 'label' => __('Subscription Reactivated', 'fluent-cart')
468 ],
469 [
470 'value' => 'subscription_canceled',
471 'label' => __('Subscription Canceled', 'fluent-cart')
472 ],
473 [
474 'value' => 'subscription_renewed',
475 'label' => __('Subscription Renewed', 'fluent-cart')
476 ],
477 [
478 'value' => 'subscription_eot',
479 'label' => __('Subscription End of Term (Completed)', 'fluent-cart')
480 ],
481 [
482 'value' => 'subscription_expired_validity',
483 'label' => __('Subscription Expired / End of Access Validity', 'fluent-cart')
484 ]
485 ]
486 ],
487 'product' => [
488 'label' => __('Shipping', 'fluent-cart'),
489 'options' => [
490 [
491 'value' => 'shipping_status_changed_to_shipped',
492 'label' => __('Order Shipped', 'fluent-cart')
493 ],
494 [
495 'value' => 'shipping_status_changed_to_delivered',
496 'label' => __('Order Delivered', 'fluent-cart')
497 ]
498 ]
499 ]
500 ],
501 'inline_tip' => __('Select in which event you want to trigger this feed', 'fluent-cart'),
502 'label' => __('Event Trigger', 'fluent-cart'),
503 'placeholder' => __('Select Event', 'fluent-cart'),
504 'component' => 'selection_group',
505 'checkbox_label' => __('Event Trigger For This Feed', 'fluent-cart'),
506 ];
507 }
508
509 // Additional statuses can be added here as needed
510 }
511