conflict resolve
This commit is contained in:
@@ -10,6 +10,10 @@ use App\Models\MarkList;
|
||||
use App\Models\Invoice;
|
||||
use App\Models\InvoiceItem;
|
||||
use App\Models\User;
|
||||
use PDF; // barryvdh/laravel-dompdf facade
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use App\Exports\OrdersExport;
|
||||
|
||||
|
||||
class AdminOrderController extends Controller
|
||||
{
|
||||
@@ -87,8 +91,8 @@ class AdminOrderController extends Controller
|
||||
'status' => 'pending',
|
||||
]);
|
||||
|
||||
// If you want to auto-create an invoice at order creation, uncomment:
|
||||
// $this->createInvoice($order);
|
||||
//If you want to auto-create an invoice at order creation, uncomment:
|
||||
$this->createInvoice($order);
|
||||
|
||||
return redirect()->route('admin.orders.show', $order->id)
|
||||
->with('success', 'Order created successfully.');
|
||||
@@ -164,30 +168,46 @@ class AdminOrderController extends Controller
|
||||
return redirect()->back()->with('success', 'Item deleted and totals updated.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore soft-deleted item and recalc totals
|
||||
*/
|
||||
public function restoreItem($id)
|
||||
{
|
||||
$item = OrderItem::withTrashed()->findOrFail($id);
|
||||
$order = Order::findOrFail($item->order_id);
|
||||
|
||||
$item->restore();
|
||||
|
||||
// recalc totals
|
||||
$this->recalcTotals($order);
|
||||
|
||||
return redirect()->back()->with('success', 'Item restored and totals updated.');
|
||||
}
|
||||
|
||||
// ---------------------------
|
||||
// ORDER CRUD: update / destroy
|
||||
// ---------------------------
|
||||
public function updateItem(Request $request, $id)
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$item = OrderItem::findOrFail($id);
|
||||
$order = Order::findOrFail($id);
|
||||
|
||||
$item->update([
|
||||
'description' => $request->description,
|
||||
'ctn' => $request->ctn,
|
||||
'qty' => $request->qty,
|
||||
'ttl_qty' => $request->ttl_qty,
|
||||
'unit' => $request->unit,
|
||||
'price' => $request->price,
|
||||
'ttl_amount' => $request->ttl_amount,
|
||||
'cbm' => $request->cbm,
|
||||
'ttl_cbm' => $request->ttl_cbm,
|
||||
'kg' => $request->kg,
|
||||
'ttl_kg' => $request->ttl_kg,
|
||||
'shop_no' => $request->shop_no,
|
||||
$data = $request->validate([
|
||||
'mark_no' => 'required|string',
|
||||
'origin' => 'nullable|string',
|
||||
'destination' => 'nullable|string',
|
||||
]);
|
||||
|
||||
return back()->with('success', 'Item updated successfully!');
|
||||
$order->update([
|
||||
'mark_no' => $data['mark_no'],
|
||||
'origin' => $data['origin'] ?? null,
|
||||
'destination' => $data['destination'] ?? null,
|
||||
]);
|
||||
|
||||
// optionally recalc totals (not necessary unless you change item-level fields here)
|
||||
$this->recalcTotals($order);
|
||||
|
||||
return redirect()->route('admin.orders.show', $order->id)
|
||||
->with('success', 'Order updated successfully.');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -324,10 +344,6 @@ class AdminOrderController extends Controller
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Popup function
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
public function popup($id)
|
||||
{
|
||||
@@ -342,27 +358,8 @@ class AdminOrderController extends Controller
|
||||
|
||||
return view('admin.popup', compact('order', 'user'));
|
||||
}
|
||||
// -------------------------------------------------------------------------
|
||||
// Restore Item
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
public function restoreItem($id)
|
||||
{
|
||||
$item = OrderItem::onlyTrashed()->findOrFail($id);
|
||||
$item->restore();
|
||||
|
||||
if (request()->ajax()) {
|
||||
return response()->json([
|
||||
'status' => 'ok',
|
||||
'message' => 'Item restored.'
|
||||
]);
|
||||
}
|
||||
|
||||
return back()->belongsTo(Order::class)->with('success', 'Item restored successfully.');
|
||||
}
|
||||
// -------------------------------------------------------------------------
|
||||
// Reset temp
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
|
||||
public function resetTemp()
|
||||
@@ -373,11 +370,6 @@ class AdminOrderController extends Controller
|
||||
->with('success', 'Order reset successfully.');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// ORDER SHOW PAGE
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
|
||||
public function orderShow()
|
||||
{
|
||||
$orders = Order::with([
|
||||
@@ -391,55 +383,79 @@ class AdminOrderController extends Controller
|
||||
return view('admin.orders', compact('orders'));
|
||||
}
|
||||
|
||||
//====================================================
|
||||
// Download Pdf
|
||||
//=================================================
|
||||
public function downloadPdf(Request $request)
|
||||
{
|
||||
$query = Order::with(['markList', 'invoice', 'shipments']);
|
||||
|
||||
// Apply filters
|
||||
if ($request->has('search') && $request->search) {
|
||||
$search = $request->search;
|
||||
$query->where(function($q) use ($search) {
|
||||
$q->where('order_id', 'like', "%{$search}%")
|
||||
->orWhereHas('markList', function($q) use ($search) {
|
||||
$q->where('company_name', 'like', "%{$search}%");
|
||||
})
|
||||
->orWhereHas('invoice', function($q) use ($search) {
|
||||
$q->where('invoice_number', 'like', "%{$search}%");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if ($request->has('status') && $request->status) {
|
||||
$query->whereHas('invoice', function($q) use ($request) {
|
||||
$q->where('status', $request->status);
|
||||
});
|
||||
}
|
||||
|
||||
if ($request->has('shipment') && $request->shipment) {
|
||||
$query->whereHas('shipments', function($q) use ($request) {
|
||||
$q->where('status', $request->shipment);
|
||||
});
|
||||
}
|
||||
|
||||
$orders = $query->get();
|
||||
|
||||
$pdf = PDF::loadView('admin.orders.pdf', compact('orders'));
|
||||
return $pdf->download('orders-report-' . date('Y-m-d') . '.pdf');
|
||||
}
|
||||
// inside AdminOrderController
|
||||
|
||||
public function downloadExcel(Request $request)
|
||||
{
|
||||
return Excel::download(new OrdersExport($request), 'orders-report-' . date('Y-m-d') . '.xlsx');
|
||||
}
|
||||
private function buildOrdersQueryFromRequest(Request $request)
|
||||
{
|
||||
$query = Order::with(['markList', 'invoice', 'shipments']);
|
||||
|
||||
//====================================================
|
||||
// add Temp Item
|
||||
//=================================================
|
||||
// Search across order_id, markList.company_name, markList.customer_id, invoice.invoice_number
|
||||
if ($request->filled('search')) {
|
||||
$search = $request->search;
|
||||
$query->where(function($q) use ($search) {
|
||||
$q->where('order_id', 'like', "%{$search}%")
|
||||
->orWhereHas('markList', function($q2) use ($search) {
|
||||
$q2->where('company_name', 'like', "%{$search}%")
|
||||
->orWhere('customer_id', 'like', "%{$search}%");
|
||||
})
|
||||
->orWhereHas('invoice', function($q3) use ($search) {
|
||||
$q3->where('invoice_number', 'like', "%{$search}%");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
public function addTempItem(Request $request)
|
||||
// Invoice status filter
|
||||
if ($request->filled('status')) {
|
||||
$query->whereHas('invoice', function($q) use ($request) {
|
||||
$q->where('status', $request->status);
|
||||
});
|
||||
}
|
||||
|
||||
// Shipment status filter
|
||||
if ($request->filled('shipment')) {
|
||||
$query->whereHas('shipments', function($q) use ($request) {
|
||||
$q->where('status', $request->shipment);
|
||||
});
|
||||
}
|
||||
|
||||
// optional ordering
|
||||
$query->latest('id');
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
public function downloadPdf(Request $request)
|
||||
{
|
||||
// Build same filtered query used for table
|
||||
$query = $this->buildOrdersQueryFromRequest($request);
|
||||
|
||||
$orders = $query->get();
|
||||
|
||||
// optional: pass filters to view for header
|
||||
$filters = [
|
||||
'search' => $request->search ?? null,
|
||||
'status' => $request->status ?? null,
|
||||
'shipment' => $request->shipment ?? null,
|
||||
];
|
||||
|
||||
$pdf = PDF::loadView('admin.orders.pdf', compact('orders', 'filters'))
|
||||
->setPaper('a4', 'landscape'); // adjust if needed
|
||||
|
||||
$fileName = 'orders-report'
|
||||
. ($filters['status'] ? "-{$filters['status']}" : '')
|
||||
. '-' . date('Y-m-d') . '.pdf';
|
||||
|
||||
return $pdf->download($fileName);
|
||||
}
|
||||
|
||||
public function downloadExcel(Request $request)
|
||||
{
|
||||
// pass request to OrdersExport which will build Filtered query internally
|
||||
return Excel::download(new OrdersExport($request), 'orders-report-' . date('Y-m-d') . '.xlsx');
|
||||
}
|
||||
|
||||
|
||||
public function addTempItem(Request $request)
|
||||
{
|
||||
// Validate item fields
|
||||
$item = $request->validate([
|
||||
@@ -484,11 +500,15 @@ class AdminOrderController extends Controller
|
||||
session()->push('temp_order_items', $item);
|
||||
|
||||
return redirect()->to(route('admin.orders.index') . '#createOrderForm')
|
||||
->with('success', 'Item added.');
|
||||
|
||||
->with('success', 'Item added.');
|
||||
}
|
||||
|
||||
|
||||
public function finishOrder(Request $request)
|
||||
// -------------------------------------------------------------------------
|
||||
// STEP 3 : FINISH ORDER
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
public function finishOrder(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'mark_no' => 'required',
|
||||
@@ -644,5 +664,29 @@ class AdminOrderController extends Controller
|
||||
return redirect()->route('admin.orders.index')
|
||||
->with('success', 'Order + Invoice created successfully.');
|
||||
}
|
||||
// ---------------------------
|
||||
// ORDER CRUD: update / destroy
|
||||
// ---------------------------
|
||||
public function updateItem(Request $request, $id)
|
||||
{
|
||||
$item = OrderItem::findOrFail($id);
|
||||
|
||||
}
|
||||
$item->update([
|
||||
'description' => $request->description,
|
||||
'ctn' => $request->ctn,
|
||||
'qty' => $request->qty,
|
||||
'ttl_qty' => $request->ttl_qty,
|
||||
'unit' => $request->unit,
|
||||
'price' => $request->price,
|
||||
'ttl_amount' => $request->ttl_amount,
|
||||
'cbm' => $request->cbm,
|
||||
'ttl_cbm' => $request->ttl_cbm,
|
||||
'kg' => $request->kg,
|
||||
'ttl_kg' => $request->ttl_kg,
|
||||
'shop_no' => $request->shop_no,
|
||||
]);
|
||||
|
||||
return back()->with('success', 'Item updated successfully!');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -65,4 +65,52 @@ class UserRequestController extends Controller
|
||||
|
||||
return redirect()->back()->with('info', 'Request rejected successfully.');
|
||||
}
|
||||
|
||||
public function profileUpdateRequests()
|
||||
{
|
||||
$requests = \App\Models\UpdateRequest::where('status', 'pending')
|
||||
->orderBy('id', 'desc')
|
||||
->get();
|
||||
|
||||
return view('admin.profile_update_requests', compact('requests'));
|
||||
}
|
||||
|
||||
public function approveProfileUpdate($id)
|
||||
{
|
||||
$req = \App\Models\UpdateRequest::findOrFail($id);
|
||||
$user = \App\Models\User::findOrFail($req->user_id);
|
||||
|
||||
// FIX: Ensure data is array
|
||||
$newData = is_array($req->data) ? $req->data : json_decode($req->data, true);
|
||||
|
||||
foreach ($newData as $key => $value) {
|
||||
if ($value !== null && $value !== "") {
|
||||
if (in_array($key, ['customer_name','company_name','designation','email','mobile_no','address','pincode'])) {
|
||||
$user->$key = $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$user->save();
|
||||
|
||||
$req->status = 'approved';
|
||||
$req->admin_note = 'Approved by admin on ' . now();
|
||||
$req->save();
|
||||
|
||||
return back()->with('success', 'Profile updated successfully.');
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function rejectProfileUpdate($id)
|
||||
{
|
||||
$req = \App\Models\UpdateRequest::findOrFail($id);
|
||||
$req->status = 'rejected';
|
||||
$req->admin_note = 'Rejected by admin on ' . now();
|
||||
$req->save();
|
||||
|
||||
return back()->with('info', 'Profile update request rejected.');
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -12,19 +12,68 @@ class UserAuthController extends Controller
|
||||
|
||||
public function refreshToken()
|
||||
{
|
||||
\Log::info('🔄 refreshToken() called');
|
||||
|
||||
try {
|
||||
$newToken = JWTAuth::refresh(JWTAuth::getToken());
|
||||
// Get current token
|
||||
$currentToken = JWTAuth::getToken();
|
||||
|
||||
if (!$currentToken) {
|
||||
\Log::warning('⚠ No token provided in refreshToken()');
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Token not provided',
|
||||
], 401);
|
||||
}
|
||||
|
||||
\Log::info('📥 Current Token:', ['token' => (string) $currentToken]);
|
||||
|
||||
// Try refreshing token
|
||||
$newToken = JWTAuth::refresh($currentToken);
|
||||
|
||||
\Log::info('✅ Token refreshed successfully', ['new_token' => $newToken]);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'token' => $newToken,
|
||||
]);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
} catch (\Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {
|
||||
\Log::error('❌ TokenExpiredException in refreshToken()', [
|
||||
'message' => $e->getMessage(),
|
||||
]);
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Token expired, cannot refresh.',
|
||||
], 401);
|
||||
|
||||
} catch (\Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {
|
||||
\Log::error('❌ TokenInvalidException in refreshToken()', [
|
||||
'message' => $e->getMessage(),
|
||||
]);
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Invalid token.',
|
||||
], 401);
|
||||
|
||||
} catch (\Tymon\JWTAuth\Exceptions\JWTException $e) {
|
||||
\Log::error('❌ JWTException in refreshToken()', [
|
||||
'message' => $e->getMessage(),
|
||||
]);
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Could not refresh token.',
|
||||
], 401);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
\Log::error('❌ General Exception in refreshToken()', [
|
||||
'message' => $e->getMessage(),
|
||||
'trace' => $e->getTraceAsString(),
|
||||
]);
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Unexpected error while refreshing token.',
|
||||
], 500);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,14 +4,17 @@ namespace App\Http\Controllers\User;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\UpdateRequest;
|
||||
use PHPOpenSourceSaver\JWTAuth\Facades\JWTAuth;
|
||||
|
||||
class UserProfileController extends Controller
|
||||
{
|
||||
/**
|
||||
* Get user profile
|
||||
*/
|
||||
public function profile()
|
||||
{
|
||||
// Get logged-in user using JWT
|
||||
try {
|
||||
try {
|
||||
$user = JWTAuth::parseToken()->authenticate();
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
@@ -20,7 +23,6 @@ class UserProfileController extends Controller
|
||||
], 401);
|
||||
}
|
||||
|
||||
|
||||
if (! $user) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
@@ -28,7 +30,6 @@ class UserProfileController extends Controller
|
||||
], 401);
|
||||
}
|
||||
|
||||
// Format response
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => [
|
||||
@@ -49,7 +50,67 @@ class UserProfileController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
public function updateProfile(Request $request)
|
||||
|
||||
|
||||
/**
|
||||
* Update profile IMAGE only (no admin approval)
|
||||
*/
|
||||
public function updateProfileImage(Request $request)
|
||||
{
|
||||
$user = JWTAuth::parseToken()->authenticate();
|
||||
|
||||
if (! $user) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Unauthorized'
|
||||
], 401);
|
||||
}
|
||||
|
||||
$request->validate([
|
||||
'profile_image' => 'required|image|mimes:jpg,jpeg,png|max:2048'
|
||||
]);
|
||||
|
||||
// DELETE OLD IMAGE
|
||||
if ($user->profile_image && file_exists(public_path($user->profile_image))) {
|
||||
@unlink(public_path($user->profile_image));
|
||||
}
|
||||
|
||||
// SAVE NEW IMAGE
|
||||
$file = $request->file('profile_image');
|
||||
$filename = 'profile_' . time() . '.' . $file->getClientOriginalExtension();
|
||||
$folder = 'profile_upload/';
|
||||
$file->move(public_path($folder), $filename);
|
||||
|
||||
$user->profile_image = $folder . $filename;
|
||||
$user->save();
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Profile image updated successfully',
|
||||
'data' => [
|
||||
'customer_id' => $user->customer_id,
|
||||
'customer_name' => $user->customer_name,
|
||||
'company_name' => $user->company_name,
|
||||
'designation' => $user->designation,
|
||||
'email' => $user->email,
|
||||
'mobile' => $user->mobile_no,
|
||||
'address' => $user->address,
|
||||
'pincode' => $user->pincode,
|
||||
'status' => $user->status,
|
||||
'customer_type' => $user->customer_type,
|
||||
'profile_image' => url($user->profile_image),
|
||||
'date' => $user->date,
|
||||
]
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Submit profile update request (requires admin approval)
|
||||
*/
|
||||
public function updateProfileRequest(Request $request)
|
||||
{
|
||||
$user = JWTAuth::parseToken()->authenticate();
|
||||
|
||||
@@ -60,53 +121,28 @@ class UserProfileController extends Controller
|
||||
], 401);
|
||||
}
|
||||
|
||||
// Validate ONLY profile image
|
||||
// Validate input
|
||||
$request->validate([
|
||||
'profile_image' => 'required|image|mimes:jpg,jpeg,png|max:2048'
|
||||
'customer_name' => 'nullable|string|max:255',
|
||||
'company_name' => 'nullable|string|max:255',
|
||||
'designation' => 'nullable|string|max:255',
|
||||
'email' => 'nullable|email',
|
||||
'mobile_no' => 'nullable|string|max:15',
|
||||
'address' => 'nullable|string',
|
||||
'pincode' => 'nullable|string|max:10'
|
||||
]);
|
||||
|
||||
// If new image uploaded
|
||||
if ($request->hasFile('profile_image')) {
|
||||
|
||||
// DELETE OLD IMAGE
|
||||
if ($user->profile_image && file_exists(public_path($user->profile_image))) {
|
||||
@unlink(public_path($user->profile_image));
|
||||
}
|
||||
|
||||
// NEW FILE
|
||||
$file = $request->file('profile_image');
|
||||
$filename = 'profile_' . time() . '.' . $file->getClientOriginalExtension();
|
||||
|
||||
// Correct folder name (from your message)
|
||||
$folder = 'profile_upload/';
|
||||
$fullPath = $folder . $filename;
|
||||
|
||||
// Move file
|
||||
$file->move(public_path($folder), $filename);
|
||||
|
||||
// Save in DB (same pattern you said)
|
||||
$user->profile_image = $fullPath;
|
||||
}
|
||||
|
||||
$user->save();
|
||||
// SAVE AS ARRAY (NOT JSON STRING!)
|
||||
$updateReq = \App\Models\UpdateRequest::create([
|
||||
'user_id' => $user->id,
|
||||
'data' => $request->all(), // <---- FIXED
|
||||
'status' => 'pending',
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'Profile image updated successfully',
|
||||
'data' => [
|
||||
'customer_id' => $user->customer_id,
|
||||
'customer_name' => $user->customer_name,
|
||||
'company_name' => $user->company_name,
|
||||
'designation' => $user->designation,
|
||||
'email' => $user->email,
|
||||
'mobile' => $user->mobile_no,
|
||||
'address' => $user->address,
|
||||
'pincode' => $user->pincode,
|
||||
'status' => $user->status,
|
||||
'customer_type' => $user->customer_type,
|
||||
'profile_image' => $user->profile_image ? url($user->profile_image) : null,
|
||||
'date' => $user->date,
|
||||
]
|
||||
'message' => 'Profile update request submitted. Waiting for admin approval.',
|
||||
'request_id' => $updateReq->id
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user