Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
78.72% covered (warning)
78.72%
37 / 47
54.55% covered (warning)
54.55%
6 / 11
CRAP
0.00% covered (danger)
0.00%
0 / 1
AccountController
78.72% covered (warning)
78.72%
37 / 47
54.55% covered (warning)
54.55%
6 / 11
17.17
0.00% covered (danger)
0.00%
0 / 1
 customer
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 orders
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 orderShow
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 orderInvoice
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 profile
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 updateProfile
81.82% covered (warning)
81.82%
9 / 11
0.00% covered (danger)
0.00%
0 / 1
2.02
 addresses
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 storeAddress
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 updateAddress
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 destroyAddress
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 validateAddress
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace App\Http\Controllers\Customer;
4
5use App\Http\Controllers\Controller;
6use App\Http\Controllers\InvoiceController;
7use App\Models\admin\Customer;
8use App\Models\CustomerAddress;
9use App\Models\Order;
10use Illuminate\Http\RedirectResponse;
11use Illuminate\Http\Request;
12use Illuminate\Support\Facades\Auth;
13use Illuminate\Support\Facades\Hash;
14use Illuminate\Validation\Rule;
15use Illuminate\Validation\Rules\Password;
16use Illuminate\View\View;
17
18class AccountController extends Controller
19{
20    private function customer(): Customer
21    {
22        return Auth::guard('customer')->user();
23    }
24
25    /* ---------------------------------------------------------------- orders */
26
27    public function orders(): View
28    {
29        $orders = Order::where('customer_id', $this->customer()->id)
30            ->latest()
31            ->paginate(10);
32
33        return view('website.account.orders', compact('orders'));
34    }
35
36    public function orderShow(Order $order): View|RedirectResponse
37    {
38        if ($order->customer_id !== $this->customer()->id) {
39            abort(403);
40        }
41
42        return view('website.account.order-show', [
43            'order' => $order->load('details.stock.product', 'payment'),
44        ]);
45    }
46
47    /** Phase 8 — customer-facing invoice PDF, same document the admin sees. */
48    public function orderInvoice(Order $order, InvoiceController $invoices)
49    {
50        if ($order->customer_id !== $this->customer()->id) {
51            abort(403);
52        }
53
54        return $invoices->download($order);
55    }
56
57    /* --------------------------------------------------------------- profile */
58
59    public function profile(): View
60    {
61        return view('website.account.profile', ['customer' => $this->customer()]);
62    }
63
64    public function updateProfile(Request $request): RedirectResponse
65    {
66        $customer = $this->customer();
67
68        $data = $request->validate([
69            'name' => ['required', 'string', 'max:255'],
70            'email' => ['required', 'email', 'max:255', Rule::unique('customers', 'email')->ignore($customer->id)],
71            'phone' => ['nullable', 'string', 'max:40'],
72        ]);
73
74        $customer->update($data);
75
76        if ($request->filled('password')) {
77            $request->validate(['password' => ['confirmed', Password::defaults()]]);
78            $customer->update(['password' => Hash::make($request->input('password'))]);
79        }
80
81        return back()->with('success', 'Profile updated.');
82    }
83
84    /* ------------------------------------------------------------- addresses */
85
86    public function addresses(): View
87    {
88        return view('website.account.addresses', ['addresses' => $this->customer()->addresses]);
89    }
90
91    public function storeAddress(Request $request): RedirectResponse
92    {
93        $data = $this->validateAddress($request);
94        $data['customer_id'] = $this->customer()->id;
95
96        CustomerAddress::create($data);
97
98        return back()->with('success', 'Address added.');
99    }
100
101    public function updateAddress(Request $request, CustomerAddress $address): RedirectResponse
102    {
103        abort_unless($address->customer_id === $this->customer()->id, 403);
104
105        $address->update($this->validateAddress($request));
106
107        return back()->with('success', 'Address updated.');
108    }
109
110    public function destroyAddress(CustomerAddress $address): RedirectResponse
111    {
112        abort_unless($address->customer_id === $this->customer()->id, 403);
113        $address->delete();
114
115        return back()->with('success', 'Address removed.');
116    }
117
118    private function validateAddress(Request $request): array
119    {
120        $data = $request->validate([
121            'label' => ['nullable', 'string', 'max:40'],
122            'name' => ['required', 'string', 'max:255'],
123            'phone' => ['required', 'string', 'max:40'],
124            'address_line' => ['required', 'string', 'max:500'],
125            'city' => ['nullable', 'string', 'max:120'],
126            'is_default' => ['nullable', 'boolean'],
127        ]);
128
129        $data['label'] = $data['label'] ?: 'Home';
130        $data['is_default'] = $request->boolean('is_default');
131
132        return $data;
133    }
134}