purityselect/app/Http/Controllers/Admin/Api/SubscriptionController.php
2024-10-25 01:05:27 +05:00

226 lines
8.1 KiB
PHP

<?php
namespace App\Http\Controllers\Admin\Api;
use Agence104\LiveKit\VideoGrant;
use App\Classes\Constant;
use App\Events\AppointmentBooked;
use App\Events\PaymentProcessed;
use App\Http\Controllers\Controller;
use App\Models\Admin;
use App\Models\Appointment;
use App\Models\Cart;
use App\Models\Item;
use App\Models\ItemHistory;
use App\Models\Lab;
use App\Models\LabKit;
use App\Models\LabkitOrderItem;
use App\Models\LicenseNumberModel;
use App\Models\MedicalHistoryAnswer;
use App\Models\Patient;
use App\Models\PatientNote;
use App\Models\PatientPlan;
use App\Models\PatientPrescription;
use App\Models\PatientRegActivity;
use App\Models\Plan;
use App\Models\PlanV1;
use App\Models\Prescription;
use App\Models\ProfileAnswer;
use App\Models\ProfileCategory;
use App\Models\QuestionBuilder;
use App\Models\Setting;
use App\Models\Subscription;
use App\Models\Telemedpro;
use Carbon\Carbon;
use Carbon\CarbonTimeZone;
use DateTime;
use DateTimeZone;
use Error;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File;
use Illuminate\Routing\UrlGenerator;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Yajra\DataTables\DataTables;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Validator;
use Agence104\LiveKit\AccessToken;
use Agence104\LiveKit\AccessTokenOptions;
use Agence104\LiveKit\RoomCreateOptions;
use Agence104\LiveKit\RoomServiceClient;
use Illuminate\Auth\Access\AuthorizationException;
class SubscriptionController extends Controller
{
protected $url;
protected $user;
public function __construct(UrlGenerator $url)
{
$this->url = $url;
$this->user = Auth::guard('admin')->user();
}
public function getSubscriptionList()
{
try {
$this->authorizeForUser($this->user, 'list', new Subscription);
$subscriptions = Subscription::with(['cart', 'item.plansV1', 'patient'])
->join('patients', 'subscription.patient_id', '=', 'patients.id') // Join with the patient table
->join('items', 'subscription.item_id', '=', 'items.id') // Join with the plansV1 table
->join('plans_v1', 'items.plans_id', '=', 'plans_v1.id') // Join with the plansV1 table
->select([
'subscription.*',
'patients.first_name',
'patients.last_name',
'plans_v1.title as product_title',
'plans_v1.price as price'
]); // Select necessary columns
return DataTables::of($subscriptions)
->addColumn('product_title', function ($subscription) {
return $subscription->item?->plansV1?->title ?? 'N/A';
})
->addColumn('price', function ($subscription) {
return $subscription->item?->plansV1?->price ?? 'N/A';
})
->addColumn('currency', function ($subscription) {
$plan = $subscription->item?->plansV1;
return $plan ? $plan->currency : 'N/A';
})
->addColumn('first_name', function ($subscription) {
return $subscription->first_name ?? 'N/A';
})
->addColumn('last_name', function ($subscription) {
return $subscription->last_name ?? 'N/A';
})
->filterColumn('first_name', function ($query, $keyword) {
$query->where('patients.first_name', 'like', "%{$keyword}%");
})
->filterColumn('last_name', function ($query, $keyword) {
$query->where('patients.last_name', 'like', "%{$keyword}%");
})
->filterColumn('product_title', function ($query, $keyword) {
$query->where('plans_v1.title', 'like', "%{$keyword}%");
})
->filterColumn('product_price', function ($query, $keyword) {
$query->where('plans_v1.price', 'like', "%{$keyword}%");
})
->make(true);
} catch (AuthorizationException $e) {
return $e->getMessage();
}
}
public function updateSubscription(Request $request, $subid)
{
try {
$this->authorizeForUser($this->user, 'edit', new Subscription);
// Find the subscription
$subscription = Subscription::find($subid);
if (!$subscription) {
return response()->json(['message' => 'Subscription not found'], 404);
}
// Define the fillable fields
$fillable = [
'subscription_start_date',
'subscription_renewal_date',
'subscription_status',
'cart_id',
'item_id',
'patient_id',
'status'
];
// Filter the request data to only include fillable fields that are present
$dataToUpdate = array_filter(
$request->only($fillable),
function ($value) {
return $value !== null;
}
);
// Validate the filtered data
$validator = Validator::make($dataToUpdate, [
'subscription_start_date' => 'required',
'subscription_renewal_date' => 'required',
'subscription_status' => 'string',
'cart_id' => 'exists:carts,id',
'item_id' => 'exists:items,id',
'patient_id' => 'exists:patients,id',
'status' => 'string',
]);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
// Update the subscription
$subscription->update($dataToUpdate);
return response()->json(['message' => 'Subscription updated successfully', 'data' => $subscription], 200);
} catch (AuthorizationException $e) {
return $e->getMessage();
}
}
public function CreateSubscription(Request $request)
{
try {
$this->authorizeForUser($this->user, 'add', new Subscription);
// Validate the incoming request data
$validator = Validator::make($request->all(), [
'subscription_start_date' => 'required',
'subscription_renewal_date' => 'required',
'subscription_status' => 'required',
'cart_id' => 'required|exists:carts,id',
'item_id' => 'required|exists:items,id',
'patient_id' => 'required|exists:patients,id',
//'status' => 'required'
]);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
// Create the subscription
$subscription = Subscription::create($request->all());
return response()->json([
'message' => 'Subscription created successfully',
'data' => $subscription
], 201);
} catch (AuthorizationException $e) {
return $e->getMessage();
}
}
public function getSubscription(Subscription $subscription, Request $request)
{
try {
$this->authorizeForUser($this->user, 'list', new Subscription);
return response()->json([
'data' => $subscription
], 201);
} catch (AuthorizationException $e) {
return $e->getMessage();
}
}
public function deleteSubscription(Subscription $subscription, Request $request)
{
try {
$this->authorizeForUser($this->user, 'delete', new Subscription);
$subscription->delete();
return response()->json([
'status' => 'deleted',
'message' => 'subscription deleted'
], 201);
} catch (AuthorizationException $e) {
return $e->getMessage();
}
}
}