query('sort_col') && !request()->query('sort_way')) ? Invoice::query()->orderByDesc('created_at') : Invoice::query(); $status = intval($request->status); switch ($status) { case InvoiceStatusEnum::awaiting_signature->value: $invoiceModels->whereNotNull('sent_client_date')->whereNull('signed_date'); break; case InvoiceStatusEnum::awaiting_invoicing->value: $invoiceModels->whereNotNull('sent_client_date')->whereNotNull('signed_date')->whereNull('sent_accounting_date'); break; default: if ($status !== 0) { $invoiceModels->where('status', $status); } break; } /** @var string $search Search field */ $search = $request->search; if ($search) { $this->searchQuery( $invoiceModels, $search, null, 'firstname', 'lastname', 'ref', 'site_id', ); } $searchFields = trans('Nom, Prénom, Référence, Site'); /** 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 !== $invoice->updated_at ? $invoice->updated_at->isoFormat('YYYY-MM-DD') : $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::query()->orderBy('name', 'ASC')->paginate(12); return \response()->json($models ?? 500); }); } }