Files
2024-02-12 22:54:20 -05:00

164 lines
5.3 KiB
PHP

<?php
namespace Modules\Subscription\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Subscription\Repositories\SubscriptionCouponsRepository;
use Modules\Subscription\Entities\SubscriptionPlan;
use Modules\Subscription\Entities\SubscriptionPlanPrice;
use Carbon\Carbon;
use Exception;
use Log;
class SubscriptionCouponController extends Controller
{
private $subscriptionCouponsRepository;
private $stripePayment;
public function __construct()
{
$this->subscriptionCouponsRepository = new SubscriptionCouponsRepository();
}
public function index()
{
return view('subscription::coupons.index');
}
public function data()
{
try {
$coupons = $this->subscriptionCouponsRepository->all();
$subscription_plans = SubscriptionPlanPrice::with('plan')->whereHas('plan', function ($query) {
$query->where('status', 1);
})->get()->map(function($price, $key) {
return [
'id' => $price->id,
'label' => $price->plan->title.' - $'.($price->payment == 'monthly' ? number_format($price->price / $price->custom_interval,2) : number_format($price->price,2)).' for '.$price->custom_interval.' Months'
];
});
return response()->json([
'coupons' => $coupons,
'subscription_plans' => $subscription_plans
]);
} catch (\Exception $e) {
return response()->json([
'message' => 'An error occurred.'
], 500);
}
}
public function store(Request $request)
{
$request->validate([
'name' => 'required|unique:subscription_coupons,name,NULL,id,deleted_at,NULL',
'code' => 'required|unique:subscription_coupons,code,NULL,id,deleted_at,NULL',
'applied_to' => 'required',
'subscription_plan_price_id' => 'required_if:applied_to,subscription',
'alacarte_id' => 'required_if:applied_to,alacarte',
'payment_mode' => 'required_if:applied_to,subscription',
'type' => 'required',
'amount' => 'required',
'duration' => 'required',
'duration_in_months' => 'required',
'max_redemptions' => 'required'
]);
//try {
$this->subscriptionCouponsRepository->create($request);
return response()->json([
'message' => 'Coupon has been successfully saved.'
]);
// } catch (\Exception $e) {
// return response()->json([
// 'message' => $e->getMessage()
// ], 500);
// }
}
public function delete(Request $request)
{
try {
$ret = $this->subscriptionCouponsRepository->delete($request->id);
if ($ret === true) {
return response()->json([
'message' => 'Coupon has been successfully deleted.'
]);
}
else {
if ($ret == 'in_use') {
return response()->json([
'message' => 'Unable to delete coupon. Coupon is in use.'
], 403);
}
else {
return response()->json([
'message' => 'Failed to delete coupon. Coupon not found.'
], 500);
}
}
}
catch (\Exception $e) {
return response()->json([
'message' => $e->getMessage()
], 500);
}
}
public function validate(Request $request)
{
$request->validate([
'code' => 'required',
'storefront' => !auth()->check() ? 'required' : ''
]);
try {
$storefront = $request->storefront;
if(auth()->check()){
$storefront = auth()->user()->company_details['storefront'];
}
$response = $this->subscriptionCouponsRepository->validate($request->code, $storefront);
if($response == 'already_redeemed_once'){
return response()->json([
'error' => 'Promo Code can be used once only with same strore front!'
], 500);
} else if($response == 'not_found'){
return response()->json([
'error' => 'Promo Code Not Found!'
], 500);
} else if($response){
return response()->json([
'message' => 'Coupon Successfully Applied',
'plan_ids' => $response->subscription_plan_price_id,
'type' => $response->type,
'duration' => $response->duration,
'discount' => $response->discount,
'payment_mode' => $response->payment_mode,
], 200);
} else {
return response()->json([
'error' => 'Promo Code Not Valid!'
], 500);
}
}
catch (\Exception $e) {
return response()->json([
'message' => $e->getMessage()
], 500);
}
}
}