invoiceRepository->filter( $request->merge(['page' => $request->get('page') ?? 1])->all(), [ 'payment', 'customer' ] ); $title = 'List all invoices'; return view('administrator.pages.invoice.index', compact('title', 'invoices')); } public function create() { $title = 'Add new Invoice'; $customer = Customer::select('id', 'fullname')->where('status', 1)->get(); $payment = Payment::select('id', 'name')->where('status', 1)->get(); return view('administrator.pages.invoice.add', compact('title', 'customer', 'payment')); } public function store(Request $request) { $validated = $request->validate([ 'customer_id' => 'required|numeric', 'payment_method' => 'required|numeric', 'sub_total' => 'required|numeric', 'total' => 'required|numeric', ]); $invoiceData = [ 'date' => time(), 'due_date' => time() + (7 * 24 * 60 * 60), 'sub_total' => $validated['sub_total'], 'tax' => $validated['sub_total'] * 0.1, 'total' => $validated['total'], 'payment_method' => $validated['payment_method'], 'customer_id' => $validated['customer_id'], 'status' => 0, ]; DB::beginTransaction(); try { $invoice = $this->invoiceRepository->create($invoiceData); DB::commit(); return redirect()->route('administrator.pages.invoice.edit', ['id' => $invoice->id])->with('success', 'Invoice created successfully'); } catch (\Exception $error) { DB::rollBack(); return back()->withErrors($error->getMessage()); } } public function edit(int $id = 0) { $invoice = $this->invoiceRepository->findWithRelationships($id, ['payment', 'invoiceItem', 'customer']); if (!$invoice) { return back()->withErrors("Can't find Invoice by ID #" . $id); } $title = "View invoice #" . $id; return view("administrator.pages.invoice.edit", compact('title', 'invoice')); } public function update(InvoiceRequest $request, int $id = 0) { $invoice = $this->invoiceRepository->find($id); if (!$invoice) { return back()->withErrors("Invalid request"); } $request->validated(); $status = match (strtolower($request->get('action'))) { "paid" => 1, "cancel" => 2, default => 0 }; DB::beginTransaction(); try { $this->invoiceRepository->update($id, [ 'status' => $status, 'date_paid' => $status === 1 ? time() : null ]); DB::commit(); } catch (\Exception $error) { DB::rollBack(); return back()->withErrors($error->getMessage()); } return back()->with('success', "Updated Successfully"); } public function destroy(int $id = 0) { $invoice = $this->invoiceRepository->find($id); if (!$invoice) { return back()->withErrors("Invalid request"); } DB::beginTransaction(); try { $this->orderRepository->updateBy('invoice_id', $id, ['invoice_id' => 0]); $this->invoiceRepository->delete($id); DB::commit(); } catch (\Exception $error) { DB::rollBack(); return back()->withErrors($error->getMessage()); } return redirect()->route('administrator.pages.invoice.index')->with('success', 'Invoice deleted successfully'); } public function datatable(Request $request) { $query = $this->invoiceRepository->filter( $request->all(), ['payment', 'customer'], [], ['*'], true ); return DataTables::eloquent($query) ->addColumn('invoice_number', function ($d) { return view('administrator.pages.invoice.datatable.invoice_number', ['row' => $d])->render(); }) ->addColumn('date', function ($d) { return view('administrator.pages.invoice.datatable.date', ['row' => $d])->render(); }) ->addColumn('customer', function ($d) { return view('administrator.pages.invoice.datatable.customer', ['row' => $d])->render(); }) ->addColumn('payment', function ($d) { return view('administrator.pages.invoice.datatable.payment', ['row' => $d])->render(); }) ->addColumn('total', function ($d) { return view('administrator.pages.invoice.datatable.total', ['row' => $d])->render(); }) ->addColumn('status', function ($d) { return view('administrator.pages.invoice.datatable.status', ['row' => $d])->render(); }) ->addColumn('action', function ($d) { return view('administrator.pages.invoice.datatable.action', ['row' => $d])->render(); }) ->rawColumns(['invoice_number', 'date', 'customer', 'payment', 'total', 'status', 'action']) ->make(true); } }