input('search')) { $query->where(function ($q) use ($search) { $q->where('partner_name', 'like', "%{$search}%") ->orWhere('invoice_no', 'like', "%{$search}%"); }); } if ($period = $request->input('period')) { $query->where('period', $period); } if ($type = $request->input('type')) { if ($type !== 'all') { $query->where('type', $type); } } if ($status = $request->input('status')) { if ($status !== 'all') { $query->where('status', $status); } } $records = $query->orderBy('invoice_date', 'desc') ->get() ->map(function ($record) { return [ 'id' => $record->id, 'period' => $record->period, 'type' => $record->type, 'partnerName' => $record->partner_name, 'invoiceNo' => $record->invoice_no, 'invoiceDate' => $record->invoice_date?->format('Y-m-d'), 'supplyAmount' => $record->supply_amount, 'vatAmount' => $record->vat_amount, 'totalAmount' => $record->total_amount, 'status' => $record->status, 'memo' => $record->memo, ]; }); // 해당 기간 통계 $periodQuery = VatRecord::forTenant($tenantId); if ($period = $request->input('period')) { $periodQuery->where('period', $period); } $periodRecords = $periodQuery->get(); $stats = [ 'salesSupply' => $periodRecords->where('type', 'sales')->sum('supply_amount'), 'salesVat' => $periodRecords->where('type', 'sales')->sum('vat_amount'), 'purchaseSupply' => $periodRecords->where('type', 'purchase')->sum('supply_amount'), 'purchaseVat' => $periodRecords->where('type', 'purchase')->sum('vat_amount'), 'total' => $periodRecords->count(), ]; // 사용 중인 기간 목록 $periods = VatRecord::forTenant($tenantId) ->select('period') ->distinct() ->orderBy('period', 'desc') ->pluck('period') ->toArray(); return response()->json([ 'success' => true, 'data' => $records, 'stats' => $stats, 'periods' => $periods, ]); } public function store(Request $request): JsonResponse { $request->validate([ 'partnerName' => 'required|string|max:100', 'invoiceNo' => 'required|string|max:50', 'period' => 'required|string|max:20', 'type' => 'required|in:sales,purchase', 'supplyAmount' => 'required|integer|min:0', ]); $tenantId = session('selected_tenant_id', 1); $record = VatRecord::create([ 'tenant_id' => $tenantId, 'period' => $request->input('period'), 'type' => $request->input('type', 'sales'), 'partner_name' => $request->input('partnerName'), 'invoice_no' => $request->input('invoiceNo'), 'invoice_date' => $request->input('invoiceDate'), 'supply_amount' => $request->input('supplyAmount', 0), 'vat_amount' => $request->input('vatAmount', 0), 'total_amount' => $request->input('totalAmount', 0), 'status' => $request->input('status', 'pending'), 'memo' => $request->input('memo'), ]); return response()->json([ 'success' => true, 'message' => '세금계산서가 등록되었습니다.', 'data' => ['id' => $record->id], ]); } public function update(Request $request, int $id): JsonResponse { $tenantId = session('selected_tenant_id', 1); $record = VatRecord::forTenant($tenantId)->findOrFail($id); $request->validate([ 'partnerName' => 'required|string|max:100', 'invoiceNo' => 'required|string|max:50', 'period' => 'required|string|max:20', 'type' => 'required|in:sales,purchase', 'supplyAmount' => 'required|integer|min:0', ]); $record->update([ 'period' => $request->input('period'), 'type' => $request->input('type'), 'partner_name' => $request->input('partnerName'), 'invoice_no' => $request->input('invoiceNo'), 'invoice_date' => $request->input('invoiceDate'), 'supply_amount' => $request->input('supplyAmount', 0), 'vat_amount' => $request->input('vatAmount', 0), 'total_amount' => $request->input('totalAmount', 0), 'status' => $request->input('status'), 'memo' => $request->input('memo'), ]); return response()->json([ 'success' => true, 'message' => '세금계산서가 수정되었습니다.', ]); } public function destroy(int $id): JsonResponse { $tenantId = session('selected_tenant_id', 1); $record = VatRecord::forTenant($tenantId)->findOrFail($id); $record->delete(); return response()->json([ 'success' => true, 'message' => '세금계산서가 삭제되었습니다.', ]); } }