authorize('create', [Mutation::class, $ledger]); $status = $request->user()->can('update', $ledger) ? 'approved' : 'pending'; $mutation = DB::transaction(function () use ($request, $ledger, $status) { $predefinedId = null; if ($request->filled('predefined_mutation_id')) { $predefinedId = \App\Models\PredefinedMutation::where('uuid', $request->input('predefined_mutation_id'))->value('id'); } $mutation = $ledger->mutations()->create([ ...$request->except(['media', 'type', 'status', 'predefined_mutation_id']), 'predefined_mutation_id' => $predefinedId, 'user_id' => $request->user()->id, 'type' => $request->input('type', $request->input('amount') >= 0 ? 'addition' : 'subtraction'), 'status' => $status, ]); if ($request->hasFile('media')) { foreach ($request->file('media') as $file) { $path = $file->store('media', 'public'); $mutation->media()->create([ 'file_path' => $path, 'file_name' => $file->getClientOriginalName(), 'mime_type' => $file->getMimeType(), ]); } } if ($status === 'approved') { $ledger->increment('score', $request->validated('amount')); } return $mutation; }); $recipients = $dynamic->participants()->where('users.id', '!=', $request->user()->id)->get(); $message = $status === 'approved' ? "{$request->user()->name} added a new entry: \"{$mutation->description}\"." : "{$request->user()->name} suggested a new entry: \"{$mutation->description}\"."; if ($recipients->isNotEmpty()) { Notification::send($recipients, new NewActivityNotification([ 'content' => $message, 'url' => route('dynamics.ledgers.show', [$dynamic, $ledger]), ])); } return redirect()->route('dynamics.ledgers.show', [$dynamic, $ledger]); } public function show(Request $request, Dynamic $dynamic, Ledger $ledger, Mutation $mutation) { $this->authorize('view', $mutation); $mutation->load('user', 'ledger', 'media', 'chat.messages.user'); $dynamic = $mutation->ledger->dynamic; $dynamic->load('participants'); return inertia('Mutations/Show', [ 'mutation' => $mutation, 'dynamic' => $dynamic, ]); } public function update(Request $request, Dynamic $dynamic, Ledger $ledger, Mutation $mutation) { $this->authorize('update', $mutation); $request->validate(['status' => ['required', 'string', 'in:approved,rejected']]); $oldStatus = $mutation->status; $newStatus = $request->input('status'); DB::transaction(function () use ($mutation, $ledger, $oldStatus, $newStatus) { $mutation->update(['status' => $newStatus]); if ($oldStatus !== 'approved' && $newStatus === 'approved') { $ledger->increment('score', $mutation->amount); } elseif ($oldStatus === 'approved' && $newStatus !== 'approved') { $ledger->decrement('score', $mutation->amount); } }); $user = $request->user(); $statusText = strtoupper($newStatus); // Notify the suggester $suggester = $mutation->user; if ($suggester && $suggester->id !== $user->id) { Notification::send($suggester, new NewActivityNotification([ 'content' => "Your suggestion \"{$mutation->description}\" was {$statusText} by {$user->name}.", 'url' => route('dynamics.ledgers.show', [$dynamic, $ledger]), ])); } return redirect()->back(); } public function void(Request $request, Dynamic $dynamic, Ledger $ledger, Mutation $mutation) { $this->authorize('void', $mutation); DB::transaction(function() use ($mutation, $ledger) { if ($mutation->status === 'approved') { $ledger->decrement('score', $mutation->amount); } $mutation->update(['status' => 'voided']); }); $recipients = $dynamic->participants()->where('users.id', '!=', $request->user()->id)->get(); if ($recipients->isNotEmpty()) { Notification::send($recipients, new NewActivityNotification([ 'content' => "{$request->user()->name} voided an entry: \"{$mutation->description}\".", 'url' => route('dynamics.ledgers.show', [$dynamic, $ledger]), ])); } return redirect()->route('dynamics.ledgers.show', [$dynamic, $ledger]); } }