successPaginated($this->service->list($this->scope($request), $request->validated(), $request->user(), $this->tenantId($request)), InvoiceResource::class, 'Daftar tagihan berhasil diambil'); } public function options(Request $request) { return $this->success($this->service->options($request->user(), $this->tenantId($request)), 'Pilihan tagihan berhasil diambil'); } public function store(StoreInvoiceRequest $request) { return $this->created(new InvoiceResource($this->service->create($request->validated(), $request->user(), $this->tenantId($request))), 'Tagihan berhasil dibuat'); } public function show(Request $request, int $id) { $invoice = $this->service->find($id); $this->authorizeTenant($request, $invoice->tenant_id); return $this->success(new InvoiceResource($invoice), 'Detail tagihan berhasil diambil'); } public function update(UpdateInvoiceRequest $request, int $id) { $invoice = $this->service->find($id); $this->authorizeTenant($request, $invoice->tenant_id); return $this->updated(new InvoiceResource($this->service->update($invoice, $request->validated(), $request->user())), 'Tagihan berhasil diperbarui'); } public function pay(PayInvoiceRequest $request, int $id) { $invoice = $this->service->find($id); $this->authorizeTenant($request, $invoice->tenant_id); return $this->updated(new InvoiceResource($this->service->pay($invoice, $request->validated(), $request->user())), 'Pembayaran manual berhasil dicatat'); } public function cancel(Request $request, int $id) { $invoice = $this->service->find($id); $this->authorizeTenant($request, $invoice->tenant_id); return $this->updated(new InvoiceResource($this->service->cancel($invoice, $request->user())), 'Tagihan berhasil dibatalkan'); } private function scope(Request $request): string { return $request->route()->defaults['invoice_scope'] ?? 'running'; } private function tenantId(Request $request): ?int { return $request->attributes->get('tenant_id'); } private function authorizeTenant(Request $request, int $tenantId): void { abort_unless($request->user()->isMasterAdmin() || $tenantId === $this->tenantId($request), 403); } }