Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
34.09% covered (danger)
34.09%
15 / 44
16.67% covered (danger)
16.67%
1 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
CommissionController
34.09% covered (danger)
34.09%
15 / 44
16.67% covered (danger)
16.67%
1 / 6
61.39
0.00% covered (danger)
0.00%
0 / 1
 index
80.00% covered (warning)
80.00%
8 / 10
0.00% covered (danger)
0.00%
0 / 1
3.07
 payouts
75.00% covered (warning)
75.00%
6 / 8
0.00% covered (danger)
0.00%
0 / 1
3.14
 createPayout
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
6
 markPaid
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 marketplaceSettings
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 saveMarketplaceSettings
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace App\Http\Controllers\admin;
4
5use App\Http\Controllers\Controller;
6use App\Models\Commission;
7use App\Models\Payout;
8use App\Models\Vendor;
9use App\Services\Marketplace\PayoutService;
10use Illuminate\Http\Request;
11
12/**
13 * Phase 12 — Admin Commission & Payout Management.
14 */
15class CommissionController extends Controller
16{
17    public function index(Request $request)
18    {
19        $query = Commission::with('vendor', 'order')->latest();
20
21        if ($request->filled('vendor_id')) {
22            $query->where('vendor_id', $request->vendor_id);
23        }
24        if ($request->filled('status')) {
25            $query->where('status', $request->status);
26        }
27
28        $commissions = $query->paginate(30);
29        $vendors = Vendor::active()->orderBy('name')->get();
30        $totalPending = Commission::pending()->sum('commission_amount');
31        $totalPaid = Commission::paid()->sum('commission_amount');
32
33        return view('admin.vendors.commissions', compact('commissions', 'vendors', 'totalPending', 'totalPaid'));
34    }
35
36    public function payouts(Request $request)
37    {
38        $query = Payout::with('vendor', 'markedBy')->latest();
39
40        if ($request->filled('vendor_id')) {
41            $query->where('vendor_id', $request->vendor_id);
42        }
43        if ($request->filled('status')) {
44            $query->where('status', $request->status);
45        }
46
47        $payouts = $query->paginate(20);
48        $vendors = Vendor::active()->orderBy('name')->get();
49
50        return view('admin.vendors.payouts', compact('payouts', 'vendors'));
51    }
52
53    public function createPayout(Request $request, PayoutService $payoutService)
54    {
55        $request->validate([
56            'vendor_id'    => 'required|exists:vendors,id',
57            'period_start' => 'required|date',
58            'period_end'   => 'required|date|after_or_equal:period_start',
59        ]);
60
61        $vendor = Vendor::findOrFail($request->vendor_id);
62        $payout = $payoutService->createPayout($vendor, $request->period_start, $request->period_end, auth()->id());
63
64        if ($payout->net_amount <= 0) {
65            $payoutService->cancel($payout);
66            return back()->with('error', 'No unpaid commissions found for this period.');
67        }
68
69        return back()->with('success', "Payout #{$payout->id} created — ৳{$payout->net_amount} net for {$vendor->name}.");
70    }
71
72    public function markPaid(Request $request, Payout $payout, PayoutService $payoutService)
73    {
74        $request->validate([
75            'payment_method'    => 'required|in:bank,bkash,nagad,cash',
76            'payment_reference' => 'nullable|string|max:255',
77        ]);
78
79        $payoutService->markPaid($payout, $request->payment_method, $request->payment_reference, auth()->id());
80
81        return back()->with('success', "Payout #{$payout->id} marked as paid.");
82    }
83
84    public function marketplaceSettings()
85    {
86        return view('admin.vendors.settings');
87    }
88
89    public function saveMarketplaceSettings(Request $request)
90    {
91        $settings = app(\App\Services\Setting\SettingService::class);
92
93        $settings->setMany('marketplace', [
94            'default_commission'   => $request->input('default_commission', 10),
95            'auto_approve_vendors' => $request->boolean('auto_approve_vendors') ? '1' : '0',
96            'vendor_can_set_shipping' => $request->boolean('vendor_can_set_shipping') ? '1' : '0',
97            'payout_cycle'         => $request->input('payout_cycle', 'monthly'),
98        ]);
99
100        return back()->with('success', 'Marketplace settings saved.');
101    }
102}