get(); return view('admin.invoice', compact('invoices')); } // ------------------------------------------------------------- // POPUP VIEW (AJAX) // ------------------------------------------------------------- public function popup($id) { $invoice = Invoice::with('items')->findOrFail($id); return view('admin.popup_invoice', compact('invoice')); } // ------------------------------------------------------------- // EDIT INVOICE PAGE // ------------------------------------------------------------- public function edit($id) { $invoice = Invoice::findOrFail($id); return view('admin.invoice_edit', compact('invoice')); } // ------------------------------------------------------------- // UPDATE INVOICE // ------------------------------------------------------------- public function update(Request $request, $id) { $invoice = Invoice::findOrFail($id); // Validate editable fields $data = $request->validate([ 'invoice_date' => 'required|date', 'due_date' => 'required|date|after_or_equal:invoice_date', 'payment_method' => 'nullable|string', 'reference_no' => 'nullable|string|max:255', 'final_amount' => 'required|numeric|min:0', 'gst_percent' => 'required|numeric|min:0|max:28', 'status' => 'required|in:pending,paid,overdue', 'notes' => 'nullable|string', ]); // Auto-calc $gst_amount = ($data['final_amount'] * $data['gst_percent']) / 100; $final_amount_with_gst = $data['final_amount'] + $gst_amount; $data['gst_amount'] = $gst_amount; $data['final_amount_with_gst'] = $final_amount_with_gst; // Update DB $invoice->update($data); // Generate PDF $this->generateInvoicePDF($invoice); return redirect() ->route('admin.invoices.index') ->with('success', 'Invoice updated & PDF generated successfully.'); } // ------------------------------------------------------------- // PDF GENERATION USING mPDF // ------------------------------------------------------------- public function generateInvoicePDF($invoice) { // PDF Name $fileName = 'invoice-' . $invoice->invoice_number . '.pdf'; // Save directly in /public/invoices $folder = public_path('invoices/'); // Create folder if not exists if (!file_exists($folder)) { mkdir($folder, 0777, true); } // Full path $filePath = $folder . $fileName; // Delete old file if (file_exists($filePath)) { unlink($filePath); } // Initialize mPDF $mpdf = new Mpdf([ 'mode' => 'utf-8', 'format' => 'A4', 'default_font' => 'sans-serif' ]); // Load HTML view $html = view('admin.pdf.invoice', compact('invoice'))->render(); // Generate $mpdf->WriteHTML($html); // Save to public/invoices $mpdf->Output($filePath, 'F'); // Save path in DB $invoice->update([ 'pdf_path' => 'invoices/' . $fileName ]); } }