File: /var/www/vhost/disk-apps/teamdemo.sports-crowd.com/app/Http/Controllers/MembershipController.php
<?php
namespace App\Http\Controllers;
use App\Core\Membership\Application\MembershipService;
use App\Core\Payment\Application\PaymentTransactionService;
use App\Http\Requests\Memberships\MembershipStoreRequest;
use App\Http\Requests\Memberships\MembershipUpdateRequest;
use App\Models\Membership\Membership;
use App\PaymentTransaction;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
class MembershipController extends Controller
{
private $membershipService;
private $paymentTransactionService;
public function __construct()
{
$this->membershipService = new MembershipService();
$this->paymentTransactionService = new PaymentTransactionService();
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('memberships.list');
}
public function listMemberships(Request $request)
{
$page = ($request->start / $request->length) + 1;
$request->merge(['page' => $page]);
$orderBy = $request->columns[$request->order[0]['column']]['name'];
$orderDirection = $request->order[0]['dir'];
$response = Membership::orderBy($orderBy, $orderDirection)
->when($request->search['value'], function ($query) use ($request) {
foreach ($request->columns as $column) {
if (filter_var($column['searchable'], FILTER_VALIDATE_BOOLEAN)) {
$query->orWhere($column['name'], 'like', '%' . $request->search['value'] . '%');
}
}
})
->paginate();
return response()->json($response);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
return view('memberships.create');
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(MembershipStoreRequest $request)
{
$membership = Membership::create($request->validated());
if ($request->hasFile('image')) {
$imageUrl = $this->saveImageToS3($request->file('image'), $membership->id, 'memberships');
if ($imageUrl) {
$membership->image = $imageUrl;
$membership->save();
}
}
if (!empty($request->tags)) {
$membership->tags()->sync($request->tags);
}
if (!empty($request->list_tags)) {
$membership->list_tags()->sync($request->list_tags);
}
$this->registerLog(Auth::user()->id, 'Crear membresia', json_encode($membership), "Create", $this->getModule($request));
return $membership;
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Membership $membership
* @return \Illuminate\Http\Response
*/
public function edit(Membership $membership)
{
return view('memberships.edit', compact('membership'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Membership $membership
* @return \Illuminate\Http\Response
*/
public function update(MembershipUpdateRequest $request, Membership $membership)
{
$membership->update($request->validated());
if ($request->hasFile('image')) {
$imageUrl = $this->saveImageToS3($request->file('image'), $membership->id, 'memberships');
if ($imageUrl) {
$membership->image = $imageUrl;
$membership->save();
}
}
if (!empty($request->tags)) {
$membership->tags()->sync($request->tags);
} else {
$membership->tags()->detach();
}
if (!empty($request->list_tags)) {
$membership->list_tags()->sync($request->list_tags);
} else {
$membership->list_tags()->detach();
}
$membership->load('tags');
$this->registerLog(Auth::user()->id, 'Editar membresia', json_encode($membership), "Update", $this->getModule($request));
return $membership;
}
public function dashboard()
{
return view('memberships.dashboard');
}
public function listMembershipDashboard(Request $request)
{
return $this->membershipService->queryDashboard($request);
}
public function validatePayment(Request $request, PaymentTransaction $paymentTransaction)
{
$this->paymentTransactionService->validatePayment($paymentTransaction);
$this->registerLog(Auth::user()->id, 'Validar pago de membresia en pasarela', json_encode($paymentTransaction), "Update", $this->getModule($request));
return response()->json($paymentTransaction);
}
public function activeToogle(Request $request, Membership $membership)
{
$membership->active = !$membership->active;
$membership->save();
$this->registerLog(Auth::user()->id, 'Activar/Desactivar membresia', json_encode($membership), "Update", $this->getModule($request));
return $membership;
}
public function downloadReport(Request $request)
{
$reportData = $this->membershipService->queryDownloadReport($request);
$data = array_map(function ($row) {
$row['is_renewal'] = $row['is_renewal'] ? 'Renovación' : 'Nueva';
$row['auto_renew'] = $row['auto_renew'] ? 'Si' : 'No';
$row['start_date'] = $row['start_date'] ? Carbon::parse($row['start_date'])->format('Y-m-d') : '';
$row['end_date'] = $row['end_date'] ? Carbon::parse($row['end_date'])->format('Y-m-d') : '';
$row['created_at'] = $row['created_at'] ? Carbon::parse($row['created_at'])->format('Y-m-d H:i:s') : '';
return $row;
}, $reportData->toArray());
return response()->json(['data' => $data]);
}
public function getBySegmentation($segmentationIds)
{
return Membership::where('active', true)
->join('membership_tags', 'membership_tags.membership_id', '=', 'memberships.id')
->whereIn('membership_tags.tag_id', $segmentationIds)
->get();
}
private function saveImageToS3($file, $id, $folder)
{
try {
$extension = $file->getClientOriginalExtension();
$filenameToStore = $id . '_' . uniqid() . '.' . $extension;
Storage::disk('s3')->put(
config("s3.$folder") . $filenameToStore,
fopen($file, 'r+'),
'public'
);
return config('filesystems.disks.s3.url') . "/$folder/" . $filenameToStore;
} catch (\Throwable $th) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_updating'), "data" => $th->getMessage()));
}
}
}