mirror of
https://github.com/InvoiceShelf/InvoiceShelf.git
synced 2026-04-15 17:24:10 +00:00
New backend endpoint POST /invoices/{id}/convert-to-estimate that
creates a draft estimate from an invoice, copying items, taxes,
custom fields, and financial data. Frontend wired with dropdown
action, store method, and API service call.
172 lines
4.4 KiB
PHP
172 lines
4.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Company\Invoice;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests;
|
|
use App\Http\Requests\DeleteInvoiceRequest;
|
|
use App\Http\Requests\SendInvoiceRequest;
|
|
use App\Http\Resources\EstimateResource;
|
|
use App\Http\Resources\InvoiceResource;
|
|
use App\Jobs\GenerateInvoicePdfJob;
|
|
use App\Models\Estimate;
|
|
use App\Models\Invoice;
|
|
use App\Services\InvoiceService;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Mail\Markdown;
|
|
|
|
class InvoicesController extends Controller
|
|
{
|
|
public function __construct(
|
|
private readonly InvoiceService $invoiceService,
|
|
) {}
|
|
|
|
/**
|
|
* Display a listing of the resource.
|
|
*
|
|
* @return JsonResponse
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
$this->authorize('viewAny', Invoice::class);
|
|
|
|
$limit = $request->input('limit', 10);
|
|
|
|
$invoices = Invoice::whereCompany()
|
|
->applyFilters($request->all())
|
|
->with('customer')
|
|
->latest()
|
|
->paginateData($limit);
|
|
|
|
return InvoiceResource::collection($invoices)
|
|
->additional(['meta' => [
|
|
'invoice_total_count' => Invoice::whereCompany()->count(),
|
|
]]);
|
|
}
|
|
|
|
/**
|
|
* Store a newly created resource in storage.
|
|
*
|
|
* @param Request $request
|
|
* @return JsonResponse
|
|
*/
|
|
public function store(Requests\InvoicesRequest $request)
|
|
{
|
|
$this->authorize('create', Invoice::class);
|
|
|
|
$invoice = $this->invoiceService->create($request);
|
|
|
|
if ($request->has('invoiceSend')) {
|
|
$this->invoiceService->send($invoice, $request->only(['subject', 'body']));
|
|
}
|
|
|
|
GenerateInvoicePdfJob::dispatch($invoice);
|
|
|
|
return new InvoiceResource($invoice);
|
|
}
|
|
|
|
/**
|
|
* Display the specified resource.
|
|
*
|
|
* @return JsonResponse
|
|
*/
|
|
public function show(Request $request, Invoice $invoice)
|
|
{
|
|
$this->authorize('view', $invoice);
|
|
|
|
return new InvoiceResource($invoice);
|
|
}
|
|
|
|
/**
|
|
* Update the specified resource in storage.
|
|
*
|
|
* @param Request $request
|
|
* @return JsonResponse
|
|
*/
|
|
public function update(Requests\InvoicesRequest $request, Invoice $invoice)
|
|
{
|
|
$this->authorize('update', $invoice);
|
|
|
|
$invoice = $this->invoiceService->update($invoice, $request);
|
|
|
|
GenerateInvoicePdfJob::dispatch($invoice, true);
|
|
|
|
return new InvoiceResource($invoice);
|
|
}
|
|
|
|
/**
|
|
* delete the specified resources in storage.
|
|
*
|
|
* @param Request $request
|
|
* @return JsonResponse
|
|
*/
|
|
public function delete(DeleteInvoiceRequest $request)
|
|
{
|
|
$this->authorize('delete multiple invoices');
|
|
|
|
$ids = Invoice::whereCompany()
|
|
->whereIn('id', $request->ids)
|
|
->pluck('id');
|
|
|
|
$this->invoiceService->delete($ids);
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
]);
|
|
}
|
|
|
|
public function send(SendInvoiceRequest $request, Invoice $invoice)
|
|
{
|
|
$this->authorize('send invoice', $invoice);
|
|
|
|
$this->invoiceService->send($invoice, $request->all());
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
]);
|
|
}
|
|
|
|
public function sendPreview(SendInvoiceRequest $request, Invoice $invoice)
|
|
{
|
|
$this->authorize('send invoice', $invoice);
|
|
|
|
$markdown = new Markdown(view(), config('mail.markdown'));
|
|
|
|
$data = $this->invoiceService->sendInvoiceData($invoice, $request->all());
|
|
$data['url'] = $invoice->invoicePdfUrl;
|
|
|
|
return $markdown->render('emails.send.invoice', ['data' => $data]);
|
|
}
|
|
|
|
public function clone(Request $request, Invoice $invoice)
|
|
{
|
|
$this->authorize('view', $invoice);
|
|
$this->authorize('create', Invoice::class);
|
|
|
|
$newInvoice = $this->invoiceService->clone($invoice);
|
|
|
|
return new InvoiceResource($newInvoice);
|
|
}
|
|
|
|
public function convertToEstimate(Request $request, Invoice $invoice)
|
|
{
|
|
$this->authorize('create', Estimate::class);
|
|
|
|
$estimate = $this->invoiceService->convertToEstimate($invoice);
|
|
|
|
return new EstimateResource($estimate);
|
|
}
|
|
|
|
public function changeStatus(Request $request, Invoice $invoice)
|
|
{
|
|
$this->authorize('send invoice', $invoice);
|
|
|
|
$this->invoiceService->changeStatus($invoice, $request->status);
|
|
|
|
return response()->json([
|
|
'success' => true,
|
|
]);
|
|
}
|
|
}
|