/home/optimumoperation/digitalcard.optimumoperations.top/app/Http/Controllers/NfcCardController.php
<?php
namespace App\Http\Controllers;
use App\Models\NfcCard;
use App\Models\NfcCardOrderRequest;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Inertia\Inertia;
class NfcCardController extends Controller
{
public function index(Request $request)
{
$user = auth()->user();
if ($user->isSuperAdmin()) {
return $this->adminIndex($request);
} else {
return $this->companyIndex($request);
}
}
private function adminIndex(Request $request)
{
$query = NfcCard::query()->with('creator');
// Apply search filter
if ($request->has('search') && !empty($request->search)) {
$query->where('name', 'like', "%{$request->search}%");
}
// Apply status filter
if ($request->has('status') && $request->status !== 'all') {
$query->where('is_enabled', $request->status === 'enabled');
}
// Apply date filters
if ($request->has('start_date') && !empty($request->start_date)) {
$query->whereDate('created_at', '>=', $request->start_date);
}
if ($request->has('end_date') && !empty($request->end_date)) {
$query->whereDate('created_at', '<=', $request->end_date);
}
// Apply sorting
$sortField = $request->input('sort_field', 'created_at');
$sortDirection = $request->input('sort_direction', 'desc');
$query->orderBy($sortField, $sortDirection);
// Get paginated results
$perPage = $request->input('per_page', 10);
$nfcCards = $query->paginate($perPage)->withQueryString();
// Convert image paths to URLs for display
$nfcCards->getCollection()->transform(function ($nfcCard) {
if ($nfcCard->front_image) {
$nfcCard->front_image = $this->convertPathToUrl($nfcCard->front_image);
}
if ($nfcCard->back_image) {
$nfcCard->back_image = $this->convertPathToUrl($nfcCard->back_image);
}
return $nfcCard;
});
return Inertia::render('nfc-cards/index', [
'nfcCards' => $nfcCards,
'filters' => $request->only(['search', 'status', 'start_date', 'end_date', 'sort_field', 'sort_direction', 'per_page']),
'isAdmin' => true
]);
}
private function companyIndex(Request $request)
{
$user = auth()->user();
$query = NfcCard::where('is_enabled', true);
// Apply search filter
if ($request->has('search') && !empty($request->search)) {
$query->where('name', 'like', "%{$request->search}%");
}
// Apply date filters
if ($request->has('start_date') && !empty($request->start_date)) {
$query->whereDate('created_at', '>=', $request->start_date);
}
if ($request->has('end_date') && !empty($request->end_date)) {
$query->whereDate('created_at', '<=', $request->end_date);
}
// Apply sorting
$sortField = $request->input('sort_field', 'created_at');
$sortDirection = $request->input('sort_direction', 'desc');
$query->orderBy($sortField, $sortDirection);
// Get paginated results
$perPage = $request->input('per_page', 10);
$nfcCards = $query->paginate($perPage)->withQueryString();
$businesses = $user->businesses ?? [];
// Convert image paths to URLs for display
$nfcCards->getCollection()->transform(function ($nfcCard) {
if ($nfcCard->front_image) {
$nfcCard->front_image = $this->convertPathToUrl($nfcCard->front_image);
}
if ($nfcCard->back_image) {
$nfcCard->back_image = $this->convertPathToUrl($nfcCard->back_image);
}
return $nfcCard;
});
return Inertia::render('nfc-cards/index', [
'nfcCards' => $nfcCards,
'businesses' => $businesses,
'filters' => $request->only(['search', 'start_date', 'end_date', 'sort_field', 'sort_direction', 'per_page', 'view']),
'isAdmin' => false
]);
}
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'price' => 'required|numeric|min:0',
'quantity' => 'required|integer|min:0',
'front_image' => 'nullable|string',
'back_image' => 'nullable|string',
'is_enabled' => 'boolean',
]);
// Handle MediaPicker URLs - convert to relative paths
if (!empty($validated['front_image'])) {
$validated['front_image'] = $this->convertToRelativePath($validated['front_image']);
}
if (!empty($validated['back_image'])) {
$validated['back_image'] = $this->convertToRelativePath($validated['back_image']);
}
$validated['created_by'] = auth()->id();
NfcCard::create($validated);
return redirect()->back()->with('success', __('NFC Card created successfully'));
}
public function update(Request $request, NfcCard $nfcCard)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'price' => 'required|numeric|min:0',
'quantity' => 'required|integer|min:0',
'front_image' => 'nullable|string',
'back_image' => 'nullable|string',
'is_enabled' => 'boolean',
]);
// Handle MediaPicker URLs - convert to relative paths
if (isset($validated['front_image'])) {
if (!empty($validated['front_image'])) {
$validated['front_image'] = $this->convertToRelativePath($validated['front_image']);
} else {
$validated['front_image'] = null;
}
}
if (isset($validated['back_image'])) {
if (!empty($validated['back_image'])) {
$validated['back_image'] = $this->convertToRelativePath($validated['back_image']);
} else {
$validated['back_image'] = null;
}
}
$nfcCard->update($validated);
return redirect()->back()->with('success', __('NFC Card updated successfully'));
}
public function edit(NfcCard $nfcCard)
{
// Convert image paths to full URLs for editing
if ($nfcCard->front_image) {
$nfcCard->front_image = $this->convertPathToUrl($nfcCard->front_image);
}
if ($nfcCard->back_image) {
$nfcCard->back_image = $this->convertPathToUrl($nfcCard->back_image);
}
return response()->json($nfcCard);
}
public function destroy(NfcCard $nfcCard)
{
$nfcCard->delete();
return redirect()->back()->with('success', __('NFC Card deleted successfully'));
}
public function toggleStatus(NfcCard $nfcCard)
{
$nfcCard->is_enabled = !$nfcCard->is_enabled;
$nfcCard->save();
return redirect()->back()->with('success', __('NFC Card status updated successfully'));
}
public function orderRequest(Request $request)
{
$request->validate([
'nfc_card_id' => 'required|exists:nfc_cards,id',
'quantity' => 'required|integer|min:1',
'logo' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
'shipping_address' => 'nullable|string',
'business_id' => 'nullable|exists:businesses,id'
]);
$nfcCard = NfcCard::findOrFail($request->nfc_card_id);
if ($nfcCard->quantity <= 0) {
return back()->with('error', 'NFC Card is out of stock');
}
$originalPrice = $nfcCard->price;
$totalPrice = $originalPrice * $request->quantity;
$data = [
'user_id' => auth()->id(),
'nfc_card_id' => $request->nfc_card_id,
'quantity' => $request->quantity,
'original_price' => $originalPrice,
'total_price' => $totalPrice,
'shipping_address' => $request->shipping_address,
'business_id' => $request->business_id,
'status' => 'pending'
];
if ($request->hasFile('logo')) {
$data['logo'] = $request->file('logo')->store('nfc-order-logos', 'public');
}
NfcCardOrderRequest::create($data);
return back()->with('success', __('NFC Card order request submitted successfully'));
}
public function orderRequests(Request $request)
{
$user = auth()->user();
if ($user->isSuperAdmin()) {
return $this->adminOrderRequests($request);
} else {
return $this->companyOrderRequests($request);
}
}
private function adminOrderRequests(Request $request)
{
$query = NfcCardOrderRequest::with(['user', 'nfcCard', 'business']);
// Apply search filter
if ($request->has('search') && !empty($request->search)) {
$query->where(function($q) use ($request) {
$q->whereHas('user', function($userQuery) use ($request) {
$userQuery->where('name', 'like', "%{$request->search}%");
})
->orWhereHas('nfcCard', function($cardQuery) use ($request) {
$cardQuery->where('name', 'like', "%{$request->search}%");
})
->orWhereHas('business', function($businessQuery) use ($request) {
$businessQuery->where('name', 'like', "%{$request->search}%");
});
});
}
// Apply status filter
if ($request->has('status') && $request->status !== 'all' && !empty($request->status)) {
$query->where('status', $request->status);
}
// Apply sorting
$sortField = $request->input('sort_field', 'created_at');
$sortDirection = $request->input('sort_direction', 'desc');
// Handle nested sorting
if (str_contains($sortField, '.')) {
$parts = explode('.', $sortField);
if ($parts[0] === 'user' && $parts[1] === 'name') {
$query->join('users', 'nfc_card_order_requests.user_id', '=', 'users.id')
->orderBy('users.name', $sortDirection)
->select('nfc_card_order_requests.*');
} elseif ($parts[0] === 'nfc_card' && $parts[1] === 'name') {
$query->join('nfc_cards', 'nfc_card_order_requests.nfc_card_id', '=', 'nfc_cards.id')
->orderBy('nfc_cards.name', $sortDirection)
->select('nfc_card_order_requests.*');
} elseif ($parts[0] === 'business' && $parts[1] === 'name') {
$query->leftJoin('businesses', 'nfc_card_order_requests.business_id', '=', 'businesses.id')
->orderBy('businesses.name', $sortDirection)
->select('nfc_card_order_requests.*');
}
} else {
$query->orderBy($sortField, $sortDirection);
}
// Get paginated results
$perPage = $request->input('per_page', 10);
$orderRequests = $query->paginate($perPage)->withQueryString();
return Inertia::render('nfc-cards/order-requests', [
'orderRequests' => $orderRequests,
'filters' => $request->only(['search', 'status', 'sort_field', 'sort_direction', 'per_page'])
]);
}
private function companyOrderRequests(Request $request)
{
$user = auth()->user();
// Only show order requests created by the current user
$query = NfcCardOrderRequest::with(['user', 'nfcCard', 'business'])
->where('user_id', $user->id);
// Apply search filter
if ($request->has('search') && !empty($request->search)) {
$query->where(function($q) use ($request) {
$q->whereHas('nfcCard', function($cardQuery) use ($request) {
$cardQuery->where('name', 'like', "%{$request->search}%");
})
->orWhereHas('business', function($businessQuery) use ($request) {
$businessQuery->where('name', 'like', "%{$request->search}%");
});
});
}
// Apply status filter
if ($request->has('status') && $request->status !== 'all' && !empty($request->status)) {
$query->where('status', $request->status);
}
// Apply sorting
$sortField = $request->input('sort_field', 'created_at');
$sortDirection = $request->input('sort_direction', 'desc');
// Handle nested sorting
if (str_contains($sortField, '.')) {
$parts = explode('.', $sortField);
if ($parts[0] === 'nfc_card' && $parts[1] === 'name') {
$query->join('nfc_cards', 'nfc_card_order_requests.nfc_card_id', '=', 'nfc_cards.id')
->orderBy('nfc_cards.name', $sortDirection)
->select('nfc_card_order_requests.*');
} elseif ($parts[0] === 'business' && $parts[1] === 'name') {
$query->leftJoin('businesses', 'nfc_card_order_requests.business_id', '=', 'businesses.id')
->orderBy('businesses.name', $sortDirection)
->select('nfc_card_order_requests.*');
}
} else {
$query->orderBy($sortField, $sortDirection);
}
// Get paginated results
$perPage = $request->input('per_page', 10);
$orderRequests = $query->paginate($perPage)->withQueryString();
return Inertia::render('nfc-cards/order-requests', [
'orderRequests' => $orderRequests,
'filters' => $request->only(['search', 'status', 'sort_field', 'sort_direction', 'per_page'])
]);
}
public function approveOrderRequest(NfcCardOrderRequest $orderRequest)
{
$orderRequest->nfcCard->decrement('quantity', $orderRequest->quantity);
$orderRequest->update(['status' => 'approved']);
return back()->with('success', __('Order request approved successfully'));
}
public function rejectOrderRequest(NfcCardOrderRequest $orderRequest)
{
$orderRequest->update(['status' => 'rejected']);
return back()->with('success', __('Order request rejected successfully'));
}
public function destroyOrderRequest(NfcCardOrderRequest $orderRequest)
{
$user = auth()->user();
// Only allow deletion of pending requests by the owner or a superadmin
if ($orderRequest->status !== 'pending' && !$user->isSuperAdmin()) {
return back()->with('error', __('Only pending order requests can be deleted'));
}
if ($orderRequest->user_id !== $user->id && !$user->isSuperAdmin()) {
return back()->with('error', __('You can only delete your own order requests'));
}
$orderRequest->delete();
return back()->with('success', __('Order request deleted successfully'));
}
/**
* Convert full URL to relative path for storage
*/
private function convertToRelativePath(string $url): string
{
if (!$url) return $url;
// If it's already a relative path, return as is
if (!str_starts_with($url, 'http')) {
return $url;
}
// Extract the path after /storage/
$storageIndex = strpos($url, '/storage/');
if ($storageIndex !== false) {
return substr($url, $storageIndex);
}
return $url;
}
/**
* Convert relative path to full URL for display
*/
private function convertPathToUrl(string $path): string
{
if (!$path) return $path;
// If it's already a full URL, return as is
if (str_starts_with($path, 'http')) {
return $path;
}
// If it starts with /storage/, use it as is
if (str_starts_with($path, '/storage/')) {
return url($path);
}
// For paths like images/nfc/nfc-front10.png, add /storage/ prefix
return url('/storage/' . $path);
}
}