ldc-supportweb/app/Http/Controllers/Bo/InvoiceController.php

208 lines
7.1 KiB
PHP

<?php
namespace App\Http\Controllers\Bo;
use App\Enums\Invoices\InvoiceStatusEnum;
use App\Http\Controllers\Controller;
use App\Http\Requests\Bo\Invoices\StoreInvoiceRequest;
use App\Http\Requests\Bo\Invoices\UpdateInvoiceRequest;
use App\Models\Company;
use App\Models\Invoice;
use App\Models\Package;
use App\Models\Site;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Str;
class InvoiceController extends Controller
{
/**
* Display a listing of the resource.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\View\View
*/
public function index(Request $request): \Illuminate\Contracts\View\View
{
/** @var \Illuminate\Database\Eloquent\Builder $invoiceModels */
$invoiceModels = Invoice::query()->orderByDesc('created_at');
$status = intval($request->status);
$invoiceModels = $invoiceModels->when($status, function ($query) use ($status) {
$query->where('status', $status);
});
/** @var string $search Search field */
$search = $request->search;
if ($search) {
$this->searchQuery(
$invoiceModels,
$search,
null,
'firstname',
'lastname',
'ref',
);
}
$searchFields = trans('Nom, Prénom, Référence');
/** Sort columns with a query */
$this->sortQuery($invoiceModels);
/** Custom pagination */
$invoiceModels = $this->customPaginate($invoiceModels, $request->pagination);
return view('bo.pages.invoices.index', compact('invoiceModels', 'search', 'searchFields', 'status'));
}
/**
* Show model action.
*
* @param \App\Models\Invoice $invoice
* @return \Illuminate\Contracts\View\View
*/
public function show(Invoice $invoice): \Illuminate\Contracts\View\View
{
return view('bo.pages.invoices.show', ['invoiceModel' => $invoice]);
}
/**
* Show the form for creating a new resource.
*
* @param \App\Models\Invoice $invoice
* @return \Illuminate\Contracts\View\View
*/
public function create(Invoice $invoice): \Illuminate\Contracts\View\View
{
$packageModels = Package::get();
$taskRowModel = Invoice::getTaskStructure();
$siteModels = Site::orderBy('name', 'ASC')->get();
$companyModels = Company::get();
return view('bo.pages.invoices.create', [
'invoiceModel' => $invoice,
'taskRowModel' => $taskRowModel,
'packageModels' => $packageModels,
'siteModels' => $siteModels,
'companyModels' => $companyModels,
'invoiceStatusArray' => $invoice->getInvoiceStatusArray($invoice),
]);
}
/**
* Store a newly created resource in storage.
*
* @param \App\Http\Requests\Bo\Invoices\StoreInvoiceRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(StoreInvoiceRequest $request): \Illuminate\Http\RedirectResponse
{
return DB::transaction(function () use ($request) {
$invoice = new Invoice();
$invoice->fill($request->validated());
if ($invoice->saveOrFail()) {
return redirect()
->route('bo.invoices.edit', $invoice)
->with('success', trans(
'crud.messages.has_been_created',
['model' => Str::singular(trans('models.classes.invoices'))]
));
}
return redirect()
->back()
->with('error', trans(
'crud.messages.cannot_be_created',
['model' => Str::singular(trans('models.classes.invoices'))]
));
});
}
/**
* Edit model action.
*
* @param Invoice $invoice
* @return \Illuminate\Contracts\View\View
*/
public function edit(Invoice $invoice): \Illuminate\Contracts\View\View
{
$packageModels = Package::get();
$taskRowModel = Invoice::getTaskStructure();
$siteModels = Site::orderBy('name', 'ASC')->get();
$companyModels = Company::get();
return view('bo.pages.invoices.edit', [
'invoiceModel' => $invoice,
'taskRowModel' => $taskRowModel,
'packageModels' => $packageModels,
'siteModels' => $siteModels,
'companyModels' => $companyModels,
'invoiceStatusArray' => $invoice->getInvoiceStatusArray($invoice),
]);
}
/**
* Update the specified resource in storage.
*
* @param \App\Http\Requests\Bo\Invoices\UpdateInvoiceRequest $request
* @param \App\Models\Invoice $invoice
* @return \Illuminate\Http\RedirectResponse
*/
public function update(UpdateInvoiceRequest $request, Invoice $invoice): \Illuminate\Http\RedirectResponse
{
return DB::transaction(function () use ($request, $invoice) {
$invoice->fill(($invoice->status->value === InvoiceStatusEnum::opened->value) ? $request->validated() : []);
if ($invoice->saveOrFail()) {
return redirect()
->route('bo.invoices.edit', $invoice)
->with('success', __(
'crud.messages.has_been_updated',
['model' => __('models.classes.invoices')]
));
} //end if
return redirect()
->back()
->with('error', __(
'crud.messages.cannot_be_updated',
['model' => __('models.classes.invoices')]
));
});
}
/**
* Download Invoice.
*
* @param \App\Models\Invoice $invoice
* @return \Illuminate\Http\RedirectResponse|\Symfony\Component\HttpFoundation\Response
*/
public function download(Invoice $invoice)
{
if (Gate::allows('isAdmin')) {
return $invoice->generateInvoice()
->stream(Str::slug(trans('Devis :appname :date - ref :ref', [
'appname' => config('app.name'),
'date' => $invoice->created_at->isoFormat('YYYY-MM-DD'),
'ref' => $invoice->ref,
])) . '.pdf');
}
return redirect()->route('bo.invoices.index')
->with('error', __('crud.messages.cannot_be_updated', [
'model' => __('models.classes.invoices')
]));
}
/**
* Get a paginate resource.
*
* @param \Illuminate\Http\Request $request
* @return Illuminate\Http\JsonResponse
*/
public function jsonPaginate(Request $request): \Illuminate\Http\JsonResponse
{
$model = $request->targetModel;
return DB::transaction(function () use ($model) {
$models = $model::orderBy('name', 'ASC')->paginate(12);
return \response()->json($models ?? 500);
});
}
}