Consolidate Pdf controllers: 6 -> 1 DocumentPdfController

Merge InvoicePdfController, EstimatePdfController, PaymentPdfController
into DocumentPdfController with invoice(), estimate(), payment() methods.

Delete DownloadInvoicePdfController and DownloadPaymentPdfController
(dead code — not mapped in any routes).

Move DownloadReceiptController logic to ExpensesController::downloadReceipt()
(expense receipts, not PDF documents).
This commit is contained in:
Darko Gjorgjijoski
2026-04-03 22:16:20 +02:00
parent b9e34ff25c
commit 6f095210d6
9 changed files with 73 additions and 186 deletions

View File

@@ -133,4 +133,26 @@ class ExpensesController extends Controller
'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',
]);
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace App\Http\Controllers\Pdf;
use App\Http\Controllers\Controller;
use App\Models\Estimate;
use App\Models\Invoice;
use App\Models\Payment;
use App\Services\EstimateService;
use App\Services\InvoiceService;
use Illuminate\Http\Request;
class DocumentPdfController extends Controller
{
public function __construct(
private readonly InvoiceService $invoiceService,
private readonly EstimateService $estimateService,
) {}
public function invoice(Request $request, Invoice $invoice)
{
if ($request->has('preview')) {
return $this->invoiceService->getPdfData($invoice);
}
return $invoice->getGeneratedPDFOrStream('invoice');
}
public function estimate(Request $request, Estimate $estimate)
{
if ($request->has('preview')) {
return $this->estimateService->getPdfData($estimate);
}
return $estimate->getGeneratedPDFOrStream('estimate');
}
public function payment(Request $request, Payment $payment)
{
if ($request->has('preview')) {
return view('app.pdf.payment.payment');
}
return $payment->getGeneratedPDFOrStream('payment');
}
}

View File

@@ -1,24 +0,0 @@
<?php
namespace App\Http\Controllers\Pdf;
use App\Http\Controllers\Controller;
use App\Models\Invoice;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class DownloadInvoicePdfController extends Controller
{
/**
* Handle the incoming request.
*
* @param Request $request
* @return Response
*/
public function __invoke(Invoice $invoice)
{
$path = storage_path('app/temp/invoice/'.$invoice->id.'.pdf');
return response()->download($path);
}
}

View File

@@ -1,24 +0,0 @@
<?php
namespace App\Http\Controllers\Pdf;
use App\Http\Controllers\Controller;
use App\Models\Payment;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class DownloadPaymentPdfController extends Controller
{
/**
* Handle the incoming request.
*
* @param Request $request
* @return Response
*/
public function __invoke(Payment $payment)
{
$path = storage_path('app/temp/payment/'.$payment->id.'.pdf');
return response()->download($path);
}
}

View File

@@ -1,39 +0,0 @@
<?php
namespace App\Http\Controllers\Pdf;
use App\Http\Controllers\Controller;
use App\Models\Expense;
use Illuminate\Http\Request;
class DownloadReceiptController extends Controller
{
/**
* Handle the incoming request.
*
* @param Request $request
* @param string $hash
* @return \Illuminate\Http\Response
*/
public function __invoke(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',
]);
}
}

View File

@@ -1,30 +0,0 @@
<?php
namespace App\Http\Controllers\Pdf;
use App\Http\Controllers\Controller;
use App\Models\Estimate;
use App\Services\EstimateService;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class EstimatePdfController extends Controller
{
public function __construct(
private readonly EstimateService $estimateService,
) {}
/**
* Handle the incoming request.
*
* @return Response
*/
public function __invoke(Request $request, Estimate $estimate)
{
if ($request->has('preview')) {
return $this->estimateService->getPdfData($estimate);
}
return $estimate->getGeneratedPDFOrStream('estimate');
}
}

View File

@@ -1,30 +0,0 @@
<?php
namespace App\Http\Controllers\Pdf;
use App\Http\Controllers\Controller;
use App\Models\Invoice;
use App\Services\InvoiceService;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class InvoicePdfController extends Controller
{
public function __construct(
private readonly InvoiceService $invoiceService,
) {}
/**
* Handle the incoming request.
*
* @return Response
*/
public function __invoke(Request $request, Invoice $invoice)
{
if ($request->has('preview')) {
return $this->invoiceService->getPdfData($invoice);
}
return $invoice->getGeneratedPDFOrStream('invoice');
}
}

View File

@@ -1,25 +0,0 @@
<?php
namespace App\Http\Controllers\Pdf;
use App\Http\Controllers\Controller;
use App\Models\Payment;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class PaymentPdfController extends Controller
{
/**
* Handle the incoming request.
*
* @return Response
*/
public function __invoke(Request $request, Payment $payment)
{
if ($request->has('preview')) {
return view('app.pdf.payment.payment');
}
return $payment->getGeneratedPDFOrStream('payment');
}
}

View File

@@ -13,10 +13,7 @@ use App\Http\Controllers\CustomerPortal\InvoicePdfController as CustomerInvoiceP
use App\Http\Controllers\CustomerPortal\PaymentPdfController as CustomerPaymentPdfController;
use App\Http\Controllers\Modules\ScriptController;
use App\Http\Controllers\Modules\StyleController;
use App\Http\Controllers\Pdf\DownloadReceiptController;
use App\Http\Controllers\Pdf\EstimatePdfController;
use App\Http\Controllers\Pdf\InvoicePdfController;
use App\Http\Controllers\Pdf\PaymentPdfController;
use App\Http\Controllers\Pdf\DocumentPdfController;
use App\Models\Company;
use Illuminate\Support\Facades\Route;
@@ -72,7 +69,7 @@ Route::middleware('auth:sanctum')->prefix('reports')->group(function () {
// download expense receipt
// -------------------------------------------------
Route::get('/expenses/{expense}/download-receipt', DownloadReceiptController::class);
Route::get('/expenses/{expense}/download-receipt', [ExpensesController::class, 'downloadReceipt']);
Route::get('/expenses/{expense}/receipt', [ExpensesController::class, 'showReceipt']);
});
@@ -83,15 +80,9 @@ Route::middleware('pdf-auth')->group(function () {
// invoice pdf
// -------------------------------------------------
Route::get('/invoices/pdf/{invoice:unique_hash}', InvoicePdfController::class);
// estimate pdf
// -------------------------------------------------
Route::get('/estimates/pdf/{estimate:unique_hash}', EstimatePdfController::class);
// payment pdf
// -------------------------------------------------
Route::get('/payments/pdf/{payment:unique_hash}', PaymentPdfController::class);
Route::get('/invoices/pdf/{invoice:unique_hash}', [DocumentPdfController::class, 'invoice']);
Route::get('/estimates/pdf/{estimate:unique_hash}', [DocumentPdfController::class, 'estimate']);
Route::get('/payments/pdf/{payment:unique_hash}', [DocumentPdfController::class, 'payment']);
});
// customer pdf endpoints for invoice, estimate and Payment