Coupon.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. namespace App\Traits;
  3. use App\Settings\CouponSettings;
  4. use App\Models\Coupon as CouponModel;
  5. use App\Models\ShopProduct;
  6. use App\Models\User;
  7. use Illuminate\Http\JsonResponse;
  8. use stdClass;
  9. trait Coupon
  10. {
  11. public function validateCoupon($requestUser, $couponCode, $productId): JsonResponse
  12. {
  13. $coupon = CouponModel::where('code', $couponCode)->first();
  14. $shopProduct = ShopProduct::findOrFail($productId);
  15. $coupon_settings = new CouponSettings;
  16. $response = response()->json([
  17. 'isValid' => false,
  18. 'error' => __('This coupon does not exist.')
  19. ], 404);
  20. if (!is_null($coupon)) {
  21. if ($coupon->getStatus() == 'USES_LIMIT_REACHED') {
  22. $response = response()->json([
  23. 'isValid' => false,
  24. 'error' => __('This coupon has reached the maximum amount of uses.')
  25. ], 422);
  26. return $response;
  27. }
  28. if ($coupon->getStatus() == 'EXPIRED') {
  29. $response = response()->json([
  30. 'isValid' => false,
  31. 'error' => __('This coupon has expired.')
  32. ], 422);
  33. return $response;
  34. }
  35. if ($coupon->isMaxUsesReached($requestUser, $coupon_settings)) {
  36. $response = response()->json([
  37. 'isValid' => false,
  38. 'error' => __('You have reached the maximum uses of this coupon.')
  39. ], 422);
  40. return $response;
  41. }
  42. if ($coupon->type === 'amount' && $coupon->value >= $shopProduct->price) {
  43. $response = response()->json([
  44. 'isValid' => false,
  45. 'error' => __('The coupon you are trying to use would give you 100% off, so it cannot be used for this product, sorry.')
  46. ], 422);
  47. return $response;
  48. }
  49. $response = response()->json([
  50. 'isValid' => true,
  51. 'couponCode' => $coupon->code,
  52. 'couponType' => $coupon->type,
  53. 'couponValue' => $coupon->value
  54. ]);
  55. }
  56. return $response;
  57. }
  58. public function isCouponValid(string $couponCode, User $user, string $productId): bool
  59. {
  60. if (is_null($couponCode)) return false;
  61. $coupon = CouponModel::where('code', $couponCode)->first();
  62. $shopProduct = ShopProduct::findOrFail($productId);
  63. if ($coupon->getStatus() == 'USES_LIMIT_REACHED') {
  64. return false;
  65. }
  66. if ($coupon->getStatus() == 'EXPIRED') {
  67. return false;
  68. }
  69. if ($coupon->isMaxUsesReached($user)) {
  70. return false;
  71. }
  72. if ($coupon->type === 'amount' && $coupon->value >= $shopProduct->price) {
  73. return false;
  74. }
  75. return true;
  76. }
  77. public function applyCoupon(string $couponCode, float $price)
  78. {
  79. $coupon = CouponModel::where('code', $couponCode)->first();
  80. if ($coupon->type === 'percentage') {
  81. return $price - ($price * $coupon->value / 100);
  82. }
  83. if ($coupon->type === 'amount') {
  84. // There is no discount if the value of the coupon is greater than or equal to the value of the product.
  85. if ($coupon->value >= $price) {
  86. return $price;
  87. }
  88. }
  89. return $price - $coupon->value;
  90. }
  91. }