| @@ -28,10 +28,22 @@ | ||
| 28 | 28 | public const PAYMENT_FAILED = 'failed'; |
| 29 | 29 | public const PAYMENT_REFUNDED = 'refunded'; |
| 30 | 30 | public const PAYMENT_PARTIALLY_REFUNDED = 'partially_refunded'; |
| 31 | 31 | public const PAYMENT_AUTHORIZED = 'authorized'; |
| 32 | + public const PAYMENT_SCHEDULED = 'payment_scheduled'; | |
| 32 | 33 | |
| 33 | 34 | // Transaction Statuses |
| 35 | + // Product review statuses — fct_product_reviews.status values | |
| 36 | + public const REVIEW_APPROVED = 'approved'; | |
| 37 | + public const REVIEW_PENDING = 'pending'; | |
| 38 | + public const REVIEW_SPAM = 'spam'; | |
| 39 | + public const REVIEW_TRASH = 'trash'; | |
| 40 | + | |
| 41 | + // Review permission modes — who may submit a review | |
| 42 | + public const REVIEW_PERMISSION_VERIFIED_BUYERS = 'verified_buyers'; | |
| 43 | + public const REVIEW_PERMISSION_LOGGED_IN = 'logged_in'; | |
| 44 | + public const REVIEW_PERMISSION_ANYONE = 'anyone'; | |
| 45 | + | |
| 34 | 46 | public const TRANSACTION_SUCCEEDED = 'succeeded'; |
| 35 | 47 | public const TRANSACTION_AUTHORIZED = 'authorized'; |
| 36 | 48 | public const TRANSACTION_PENDING = 'pending'; |
| 37 | 49 | public const TRANSACTION_REFUNDED = 'refunded'; |
| @@ -62,8 +74,12 @@ | ||
| 62 | 74 | public const SUBSCRIPTION_COMPLETED = 'completed'; |
| 63 | 75 | public const SUBSCRIPTION_AUTHENTICATED = 'authenticated'; |
| 64 | 76 | public const SUBSCRIPTION_CREATED = 'created'; |
| 65 | 77 | |
| 78 | + public const SUBSCRIPTION_METHOD_MANUAL = 'manual'; | |
| 79 | + public const SUBSCRIPTION_METHOD_AUTOMATIC = 'automatic'; | |
| 80 | + public const SUBSCRIPTION_METHOD_SYSTEM = 'system'; | |
| 81 | + | |
| 66 | 82 | // billing interval |
| 67 | 83 | public const BILLING_YEARLY = 'yearly'; |
| 68 | 84 | public const BILLING_HALF_YEARLY = 'half_yearly'; |
| 69 | 85 | public const BILLING_QUARTERLY = 'quarterly'; |
| @@ -166,17 +182,15 @@ | ||
| 166 | 182 | } |
| 167 | 183 | |
| 168 | 184 | public static function getEditableOrderStatuses() |
| 169 | 185 | { |
| 170 | - $statuses = apply_filters_deprecated('fluent-cart/editable_order_statuses', [ | |
| 171 | - [ | |
| 172 | - self::ORDER_ON_HOLD => __('On Hold', 'fluent-cart'), | |
| 173 | - self::ORDER_PROCESSING => __('Processing', 'fluent-cart'), | |
| 174 | - self::ORDER_COMPLETED => __('Completed', 'fluent-cart'), | |
| 175 | - // 'archived' => __('Archived', 'fluent-cart'), | |
| 176 | - self::ORDER_CANCELED => __('Canceled', 'fluent-cart') | |
| 177 | - ], [] | |
| 178 | - ], '1.3.16', 'fluent_cart/editable_order_statuses', 'Use fluent_cart/editable_order_statuses instead of fluent-cart/editable_order_statuses.'); | |
| 186 | + $statuses = [ | |
| 187 | + self::ORDER_ON_HOLD => __('On Hold', 'fluent-cart'), | |
| 188 | + self::ORDER_PROCESSING => __('Processing', 'fluent-cart'), | |
| 189 | + self::ORDER_COMPLETED => __('Completed', 'fluent-cart'), | |
| 190 | + // 'archived' => __('Archived', 'fluent-cart'), | |
| 191 | + self::ORDER_CANCELED => __('Canceled', 'fluent-cart') | |
| 192 | + ]; | |
| 179 | 193 | |
| 180 | 194 | return apply_filters('fluent_cart/editable_order_statuses', $statuses, []); |
| 181 | 195 | } |
| 182 | 196 | |
| @@ -191,8 +205,9 @@ | ||
| 191 | 205 | self::PAYMENT_FAILED => __('Failed', 'fluent-cart'), |
| 192 | 206 | self::PAYMENT_REFUNDED => __('Refunded', 'fluent-cart'), |
| 193 | 207 | self::PAYMENT_PARTIALLY_REFUNDED => __('Partially Refunded', 'fluent-cart'), |
| 194 | 208 | self::PAYMENT_AUTHORIZED => __('Authorized', 'fluent-cart'), |
| 209 | + self::PAYMENT_SCHEDULED => __('Payment Scheduled', 'fluent-cart'), | |
| 195 | 210 | ], []); |
| 196 | 211 | } |
| 197 | 212 | |
| 198 | 213 | // Transaction statuses |
| @@ -214,17 +229,15 @@ | ||
| 214 | 229 | } |
| 215 | 230 | |
| 216 | 231 | public static function getEditableTransactionStatuses($withLabel = true) |
| 217 | 232 | { |
| 218 | - $statuses = apply_filters_deprecated('fluent-cart/editable_transaction_statuses', [ | |
| 219 | - [ | |
| 220 | - self::TRANSACTION_PENDING => __('Pending', 'fluent-cart'), | |
| 221 | - self::TRANSACTION_SUCCEEDED => __('Succeeded', 'fluent-cart'), | |
| 222 | - self::TRANSACTION_AUTHORIZED => __('Authorized', 'fluent-cart'), | |
| 223 | - self::TRANSACTION_FAILED => __('Failed', 'fluent-cart'), | |
| 224 | - self::TRANSACTION_REFUNDED => __('Refunded', 'fluent-cart'), | |
| 225 | - ], [] | |
| 226 | - ], '1.3.16', 'fluent_cart/editable_transaction_statuses', 'Use fluent_cart/editable_transaction_statuses instead of fluent-cart/editable_transaction_statuses.'); | |
| 233 | + $statuses = [ | |
| 234 | + self::TRANSACTION_PENDING => __('Pending', 'fluent-cart'), | |
| 235 | + self::TRANSACTION_SUCCEEDED => __('Succeeded', 'fluent-cart'), | |
| 236 | + self::TRANSACTION_AUTHORIZED => __('Authorized', 'fluent-cart'), | |
| 237 | + self::TRANSACTION_FAILED => __('Failed', 'fluent-cart'), | |
| 238 | + self::TRANSACTION_REFUNDED => __('Refunded', 'fluent-cart'), | |
| 239 | + ]; | |
| 227 | 240 | |
| 228 | 241 | $statuses = apply_filters('fluent_cart/editable_transaction_statuses', $statuses, []); |
| 229 | 242 | |
| 230 | 243 | if ($withLabel) { |
| @@ -246,16 +259,14 @@ | ||
| 246 | 259 | } |
| 247 | 260 | |
| 248 | 261 | public static function getEditableShippingStatuses() |
| 249 | 262 | { |
| 250 | - $statuses = apply_filters_deprecated('fluent-cart/editable_order_statuses', [ | |
| 251 | - [ | |
| 252 | - self::SHIPPING_UNSHIPPED => __('Unshipped', 'fluent-cart'), | |
| 253 | - self::SHIPPING_SHIPPED => __('Shipped', 'fluent-cart'), | |
| 254 | - self::SHIPPING_DELIVERED => __('Delivered', 'fluent-cart'), | |
| 255 | - self::SHIPPING_UNSHIPPABLE => __('Unshippable', 'fluent-cart'), | |
| 256 | - ], [] | |
| 257 | - ], '1.3.16', 'fluent_cart/editable_shipping_statuses', 'Use fluent_cart/editable_shipping_statuses instead of fluent-cart/editable_order_statuses.'); | |
| 263 | + $statuses = [ | |
| 264 | + self::SHIPPING_UNSHIPPED => __('Unshipped', 'fluent-cart'), | |
| 265 | + self::SHIPPING_SHIPPED => __('Shipped', 'fluent-cart'), | |
| 266 | + self::SHIPPING_DELIVERED => __('Delivered', 'fluent-cart'), | |
| 267 | + self::SHIPPING_UNSHIPPABLE => __('Unshippable', 'fluent-cart'), | |
| 268 | + ]; | |
| 258 | 269 | |
| 259 | 270 | return apply_filters('fluent_cart/editable_shipping_statuses', $statuses, []); |
| 260 | 271 | } |
| 261 | 272 | |
| @@ -350,8 +361,61 @@ | ||
| 350 | 361 | { |
| 351 | 362 | return apply_filters('fluent_cart/transaction_success_statuses', [self::TRANSACTION_SUCCEEDED, self::TRANSACTION_AUTHORIZED], []); |
| 352 | 363 | } |
| 353 | 364 | |
| 365 | + /** | |
| 366 | + * All product review statuses (fct_product_reviews.status values). | |
| 367 | + */ | |
| 368 | + public static function getReviewStatuses(): array | |
| 369 | + { | |
| 370 | + return [ | |
| 371 | + self::REVIEW_APPROVED, | |
| 372 | + self::REVIEW_PENDING, | |
| 373 | + self::REVIEW_SPAM, | |
| 374 | + self::REVIEW_TRASH, | |
| 375 | + ]; | |
| 376 | + } | |
| 377 | + | |
| 378 | + /** | |
| 379 | + * Review statuses that count as an existing review for duplicate | |
| 380 | + * detection. Spam and trash are deliberately excluded — a review the | |
| 381 | + * store rejected does not block the customer from submitting a fresh | |
| 382 | + * one. Every surface that projects "can this user review?" must use | |
| 383 | + * this set so it never contradicts the | |
| 384 | + * ProductReviewService::canSubmitReview() write-path guard. | |
| 385 | + */ | |
| 386 | + public static function getReviewDuplicateStatuses(): array | |
| 387 | + { | |
| 388 | + return apply_filters('fluent_cart/review_duplicate_statuses', [ | |
| 389 | + self::REVIEW_APPROVED, | |
| 390 | + self::REVIEW_PENDING, | |
| 391 | + ]); | |
| 392 | + } | |
| 393 | + | |
| 394 | + /** | |
| 395 | + * Review statuses the author may see in their own history: everything | |
| 396 | + * except spam and trash. | |
| 397 | + * | |
| 398 | + * Derived by exclusion, not by listing, so a status added later is | |
| 399 | + * visible to its author by default — only the two that mean "this is not | |
| 400 | + * really a review" are held back, and a customer who has been silently | |
| 401 | + * spammed or trashed is not shown that judgement. | |
| 402 | + * | |
| 403 | + * Deliberately NOT getReviewDuplicateStatuses(). The two sets happen to | |
| 404 | + * hold the same values today, but they answer different questions, and | |
| 405 | + * that one is filterable: a site narrowing its duplicate rules would | |
| 406 | + * otherwise hide customers' pending reviews from them as a side effect. | |
| 407 | + * | |
| 408 | + * @return array | |
| 409 | + */ | |
| 410 | + public static function getReviewAuthorVisibleStatuses(): array | |
| 411 | + { | |
| 412 | + return array_values(array_diff( | |
| 413 | + static::getReviewStatuses(), | |
| 414 | + [self::REVIEW_SPAM, self::REVIEW_TRASH] | |
| 415 | + )); | |
| 416 | + } | |
| 417 | + | |
| 354 | 418 | // Get all statuses (optional utility) |
| 355 | 419 | public static function all() |
| 356 | 420 | { |
| 357 | 421 | return [ |
| @@ -366,14 +430,12 @@ | ||
| 366 | 430 | } |
| 367 | 431 | |
| 368 | 432 | public static function getEditableCustomerStatuses() |
| 369 | 433 | { |
| 370 | - $statuses = apply_filters_deprecated('fluent-cart/editable_customer_statuses', [ | |
| 371 | - [ | |
| 372 | - self::CUSTOMER_ACTIVE => __('Active', 'fluent-cart'), | |
| 373 | - self::CUSTOMER_INACTIVE => __('Inactive', 'fluent-cart'), | |
| 374 | - ], [] | |
| 375 | - ], '1.3.16', 'fluent_cart/editable_customer_statuses', 'Use fluent_cart/editable_customer_statuses instead of fluent-cart/editable_customer_statuses.'); | |
| 434 | + $statuses = [ | |
| 435 | + self::CUSTOMER_ACTIVE => __('Active', 'fluent-cart'), | |
| 436 | + self::CUSTOMER_INACTIVE => __('Inactive', 'fluent-cart'), | |
| 437 | + ]; | |
| 376 | 438 | |
| 377 | 439 | return apply_filters('fluent_cart/editable_customer_statuses', $statuses, []); |
| 378 | 440 | } |
| 379 | 441 | |