physiotherapy-clinic/app/Http/Controllers/Api/PackageController.php

112 lines
3.4 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Resources\PackageResource;
use App\Http\Resources\PatientPackageResource;
use App\Models\Package;
use App\Models\PatientPackage;
use Illuminate\Http\Request;
class PackageController extends Controller
{
public function index(Request $request)
{
$query = Package::with('currency')->where('is_active', true);
if ($request->has('search')) {
$query->where('name', 'like', "%{$request->search}%");
}
$packages = $query->orderBy('name')->paginate($request->per_page ?? 20);
return PackageResource::collection($packages);
}
public function store(Request $request)
{
$data = $request->validate([
'name' => 'required|string|max:255',
'number_of_sessions' => 'required|integer|min:1',
'price' => 'required|numeric|min:0',
'currency_id' => 'required|exists:currencies,id',
'validity_days' => 'required|integer|min:1',
'description' => 'nullable|string',
]);
$package = Package::create($data);
return new PackageResource($package);
}
public function show(Package $package)
{
return new PackageResource($package);
}
public function update(Request $request, Package $package)
{
$data = $request->validate([
'name' => 'sometimes|string|max:255',
'number_of_sessions' => 'sometimes|integer|min:1',
'price' => 'sometimes|numeric|min:0',
'currency_id' => 'sometimes|exists:currencies,id',
'validity_days' => 'sometimes|integer|min:1',
'description' => 'nullable|string',
'is_active' => 'sometimes|boolean',
]);
$package->update($data);
return new PackageResource($package);
}
public function destroy(Package $package)
{
$package->delete();
return response()->json(['message' => 'Package deleted successfully']);
}
// Patient Package Assignment
public function assignToPatient(Request $request)
{
$data = $request->validate([
'patient_id' => 'required|exists:patients,id',
'package_id' => 'required|exists:packages,id',
'start_date' => 'required|date',
]);
$package = Package::findOrFail($data['package_id']);
$patientPackage = PatientPackage::create([
'patient_id' => $data['patient_id'],
'package_id' => $data['package_id'],
'total_sessions' => $package->number_of_sessions,
'remaining_sessions' => $package->number_of_sessions,
'start_date' => $data['start_date'],
'end_date' => \Carbon\Carbon::parse($data['start_date'])->addDays($package->validity_days),
'status' => 'active',
]);
return new PatientPackageResource($patientPackage);
}
public function patientPackages(Request $request)
{
$query = PatientPackage::with(['patient', 'package']);
if ($request->has('patient_id')) {
$query->where('patient_id', $request->patient_id);
}
if ($request->has('status')) {
$query->where('status', $request->status);
}
$packages = $query->orderByDesc('created_at')->paginate($request->per_page ?? 20);
return PatientPackageResource::collection($packages);
}
}