Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 30
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
SettlementController
0.00% covered (danger)
0.00%
0 / 30
0.00% covered (danger)
0.00%
0 / 5
56
0.00% covered (danger)
0.00%
0 / 1
 index
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 generate
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 show
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 markPaid
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 export
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace App\Http\Controllers\Admin;
4
5use App\Http\Controllers\Concerns\ResolvesContext;
6use App\Http\Controllers\Controller;
7use App\Models\MonthlySettlement;
8use App\Models\SettlementItem;
9use App\Services\ReportExportService;
10use App\Services\SettlementService;
11use Illuminate\Http\RedirectResponse;
12use Illuminate\Http\Request;
13use Illuminate\View\View;
14
15class SettlementController extends Controller
16{
17    use ResolvesContext;
18
19    public function index(): View
20    {
21        return view('admin.settlements.index', [
22            'settlements' => MonthlySettlement::query()->withCount('items')->where('store_id', $this->currentStore()->id)->latest()->paginate(20),
23        ]);
24    }
25
26    public function generate(Request $request, SettlementService $service): RedirectResponse
27    {
28        $data = $request->validate([
29            'period' => ['required', 'date_format:Y-m'],
30        ]);
31
32        [$year, $month] = array_map('intval', explode('-', $data['period']));
33        $settlement = $service->generate($this->currentStore(), $year, $month, $request->user());
34
35        return redirect()->route('admin.settlements.show', $settlement)->with('success', 'Fechamento gerado.');
36    }
37
38    public function show(MonthlySettlement $settlement): View
39    {
40        $settlement->load('items.influencer', 'commissions.order');
41        return view('admin.settlements.show', compact('settlement'));
42    }
43
44    public function markPaid(Request $request, SettlementItem $item, SettlementService $service): RedirectResponse
45    {
46        $data = $request->validate(['reference' => ['nullable', 'string', 'max:255']]);
47        $service->markItemPaid($item, $request->user(), $data['reference'] ?? null);
48        return back()->with('success', 'Pagamento registrado.');
49    }
50
51    public function export(MonthlySettlement $settlement, string $format, ReportExportService $exporter)
52    {
53        $settlement->load('items.influencer');
54        $headers = ['Influencer', 'ID', 'Cupom ativo', 'Valor bruto', 'Ajustes/Estornos', 'Valor final', 'Pix', 'Status'];
55        $rows = $settlement->items->map(function ($item) {
56            return [
57                $item->influencer->name,
58                $item->influencer->id,
59                $item->influencer->activeCoupon?->coupon_code_original,
60                number_format((float) $item->gross_amount, 2, ',', '.'),
61                number_format((float) $item->adjustments_amount, 2, ',', '.'),
62                number_format((float) $item->net_amount, 2, ',', '.'),
63                $item->influencer->pix_key,
64                $item->payment_status->label(),
65            ];
66        });
67
68        $filename = 'fechamento-'.$settlement->period_year.'-'.$settlement->period_month.'.'.($format === 'excel' ? 'xls' : 'csv');
69        return $format === 'excel' ? $exporter->excel($filename, $headers, $rows) : $exporter->csv($filename, $headers, $rows);
70    }
71}