authorize('viewAny', Expense::class); $limit = $request->has('limit') ? $request->limit : 10; $expenses = Expense::with('category', 'creator', 'fields') ->whereCompany() ->leftJoin('customers', 'customers.id', '=', 'expenses.customer_id') ->join('expense_categories', 'expense_categories.id', '=', 'expenses.expense_category_id') ->applyFilters($request->all()) ->select('expenses.*', 'expense_categories.name', 'customers.name as user_name') ->paginateData($limit); return ExpenseResource::collection($expenses) ->additional(['meta' => [ 'expense_total_count' => Expense::whereCompany()->count(), ]]); } /** * Store a newly created resource in storage. * * @return JsonResponse */ public function store(ExpenseRequest $request) { $this->authorize('create', Expense::class); $expense = $this->expenseService->create($request); return new ExpenseResource($expense); } /** * Display the specified resource. * * @return JsonResponse */ public function show(Expense $expense) { $this->authorize('view', $expense); return new ExpenseResource($expense); } /** * Update the specified resource in storage. * * @return JsonResponse */ public function update(ExpenseRequest $request, Expense $expense) { $this->authorize('update', $expense); $this->expenseService->update($expense, $request); return new ExpenseResource($expense); } public function delete(DeleteExpensesRequest $request) { $this->authorize('delete multiple expenses'); $ids = Expense::whereCompany() ->whereIn('id', $request->ids) ->pluck('id'); Expense::destroy($ids); return response()->json([ 'success' => true, ]); } public function showReceipt(Expense $expense) { $this->authorize('view', $expense); if ($expense) { $media = $expense->getFirstMedia('receipts'); if ($media) { return response()->file($media->getPath()); } return respondJson('receipt_does_not_exist', 'Receipt does not exist.'); } } public function uploadReceipt(UploadExpenseReceiptRequest $request, Expense $expense) { $this->authorize('update', $expense); $data = json_decode($request->attachment_receipt); if ($data) { if ($request->type === 'edit') { $expense->clearMediaCollection('receipts'); } $expense->addMediaFromBase64($data->data) ->usingFileName($data->name) ->toMediaCollection('receipts'); } return response()->json([ 'success' => 'Expense receipts uploaded successfully', ], 200); } public function downloadReceipt(Expense $expense) { $this->authorize('view', $expense); if ($expense) { $media = $expense->getFirstMedia('receipts'); if ($media) { $imagePath = $media->getPath(); $response = \Response::download($imagePath, $media->file_name); if (ob_get_contents()) { ob_end_clean(); } return $response; } } return response()->json([ 'error' => 'receipt_not_found', ]); } }