123 lines
3.7 KiB
PHP
123 lines
3.7 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Invoice;
|
|
use App\Models\InvoiceItem;
|
|
use Mpdf\Mpdf;
|
|
|
|
class AdminInvoiceController extends Controller
|
|
{
|
|
// -------------------------------------------------------------
|
|
// INVOICE LIST PAGE
|
|
// -------------------------------------------------------------
|
|
public function index()
|
|
{
|
|
$invoices = Invoice::latest()->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
|
|
]);
|
|
}
|
|
}
|