TA-bibit-cabai/app/Http/Controllers/ProfileController.php

201 lines
6.8 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Transaksi;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class ProfileController extends Controller
{
/**
* Halaman profil pengguna
*/
public function index()
{
$user = auth()->user();
return view('profile.index', compact('user'));
}
/**
* Update profil pengguna
*/
public function update(Request $request)
{
$user = auth()->user();
$request->validate([
'name' => ['required', 'string', 'min:8', 'regex:/^[a-zA-Z\s]+$/'],
'phone' => ['required', 'string', 'min:11', 'regex:/^(\+62|08)[0-9]+$/'],
'address' => ['required', 'string', 'min:12'],
], [
'name.required' => 'Nama lengkap wajib diisi.',
'name.min' => 'Nama lengkap minimal 8 karakter.',
'name.regex' => 'Nama hanya boleh menggunakan huruf dan spasi.',
'phone.required' => 'Nomor telepon wajib diisi.',
'phone.min' => 'Nomor telepon minimal 11 karakter.',
'phone.regex' => 'Nomor telepon harus diawali +62 atau 08 dan hanya boleh berisi angka.',
'address.required' => 'Alamat wajib diisi.',
'address.min' => 'Alamat minimal 12 karakter.',
]);
$user->update([
'name' => $request->name,
'phone' => $request->phone,
'address' => $request->address,
]);
return back()->with('success', 'Profil berhasil diperbarui.');
}
/**
* Update password pengguna
*/
public function updatePassword(Request $request)
{
$user = auth()->user();
$request->validate([
'current_password' => ['required'],
'password' => ['required', 'confirmed', 'min:8', 'regex:/^(?=.*[a-zA-Z])(?=.*[0-9])\S+$/'],
], [
'current_password.required' => 'Password lama wajib diisi.',
'password.required' => 'Password baru wajib diisi.',
'password.min' => 'Password baru minimal 8 karakter.',
'password.confirmed' => 'Konfirmasi password tidak cocok.',
'password.regex' => 'Password harus terdiri dari huruf dan angka, tanpa spasi.',
]);
if (!Hash::check($request->current_password, $user->password)) {
return back()->withErrors([
'current_password' => 'Password lama yang kamu masukkan tidak sesuai.'
])->withInput();
}
$user->update(['password' => Hash::make($request->password)]);
return back()->with('success', 'Password berhasil diperbarui.');
}
/**
* Halaman daftar pesanan pengguna
*/
public function orders(Request $request)
{
$user = auth()->user();
$status = $request->get('status', 'all');
$query = Transaksi::with(['details.product', 'cancellation']) // ← tambah cancellation
->where('user_id', $user->id)
->orderBy('created_at', 'desc');
if ($status !== 'all') {
$query->where('order_status', $status);
}
$orders = $query->paginate(10);
$totalOrders = Transaksi::where('user_id', $user->id)->count();
$pendingOrders = Transaksi::where('user_id', $user->id)->where('order_status', 'pending')->count();
$processOrders = Transaksi::where('user_id', $user->id)->where('order_status', 'processing')->count();
$shippedOrders = Transaksi::where('user_id', $user->id)->where('order_status', 'shipped')->count();
$doneOrders = Transaksi::where('user_id', $user->id)->where('order_status', 'delivered')->count();
$cancelOrders = Transaksi::where('user_id', $user->id)->where('order_status', 'cancelled')->count();
return view('profile.orders', compact(
'orders', 'status',
'totalOrders', 'pendingOrders', 'processOrders',
'shippedOrders', 'doneOrders', 'cancelOrders'
));
}
/**
* Detail pesanan — dengan relasi cancellation
*/
public function orderDetail($id)
{
$user = auth()->user();
$order = Transaksi::with(['details.product', 'cancellation']) // ← tambah cancellation
->where('user_id', $user->id)
->findOrFail($id);
return view('profile.order-detail', compact('order'));
}
// Tambahkan di ProfileController.php — setelah method orderDetail()
/**
* Tampilkan form batalkan pesanan
*/
public function cancelForm($id)
{
$user = auth()->user();
$transaksi = Transaksi::with(['details.product', 'cancellation'])
->where('user_id', $user->id)
->findOrFail($id);
if (!$transaksi->canBeCancelled()) {
return redirect()->route('orders.detail', $id)
->with('error', 'Pesanan ini tidak dapat dibatalkan.');
}
$reasons = \App\Models\OrderCancellation::reasons();
return view('profile.cancel', compact('transaksi', 'reasons'));
}
/**
* Simpan pengajuan pembatalan
*/
public function cancelStore(Request $request, $id)
{
$user = auth()->user();
$transaksi = Transaksi::with('cancellation')
->where('user_id', $user->id)
->findOrFail($id);
if (!$transaksi->canBeCancelled()) {
return redirect()->route('orders.detail', $id)
->with('error', 'Pesanan ini tidak dapat dibatalkan.');
}
$request->validate([
'reason' => ['required', 'string'],
'description' => ['nullable', 'string', 'max:500'],
], [
'reason.required' => 'Pilih alasan pembatalan terlebih dahulu.',
]);
// ── COD + pending → langsung cancel tanpa persetujuan admin ──
if ($transaksi->isAutoCancel()) {
$transaksi->update(['order_status' => 'cancelled']);
// Simpan catatan pembatalan (opsional, untuk riwayat)
\App\Models\OrderCancellation::create([
'transaksi_id' => $transaksi->id,
'user_id' => $user->id,
'reason' => $request->reason,
'description' => $request->description,
'status' => 'approved', // langsung approved
'admin_note' => 'Dibatalkan otomatis (COD, belum diproses)',
'reviewed_at' => now(),
]);
return redirect()->route('orders.my')
->with('success', 'Pesanan berhasil dibatalkan.');
}
// ── Selain itu → kirim pengajuan ke admin ──
\App\Models\OrderCancellation::create([
'transaksi_id' => $transaksi->id,
'user_id' => $user->id,
'reason' => $request->reason,
'description' => $request->description,
'status' => 'pending',
]);
return redirect()->route('orders.detail', $id)
->with('success', 'Pengajuan pembatalan berhasil dikirim. Tunggu konfirmasi admin.');
}
}