filled($field)) { $q->where($field, $request->query($field)); } } if ($request->filled('status')) { $status = $request->query('status'); if (Schema::hasColumn('event_charges', 'status')) { $q->where('status', $status); } elseif ($status === 'paid') { $q->where('event_paid', 1); } elseif ($status === 'pending') { $q->where(function ($qq) { $qq->whereNull('event_paid')->orWhere('event_paid', 0); }); } } return response()->json(['ok' => true, 'event_charges' => $q->orderByDesc('id')->paginate((int) $request->query('per_page', 25))]); } public function store(EventChargeLifecycleRequest $request): JsonResponse { $data = $this->normalizePayload($request->validated()); $data['created_by'] = optional($request->user())->id; if (Schema::hasColumn('event_charges', 'status')) { $data['status'] = $data['status'] ?? 'draft'; } $charge = EventCharge::query()->create($data); return response()->json(['ok' => true, 'event_charge' => $charge], 201); } public function show(int $eventCharge): JsonResponse { return response()->json(['ok' => true, 'event_charge' => EventCharge::query()->findOrFail($eventCharge)]); } public function update(EventChargeLifecycleRequest $request, int $eventCharge): JsonResponse { $charge = EventCharge::query()->findOrFail($eventCharge); $charge->fill($this->normalizePayload($request->validated()))->save(); return response()->json(['ok' => true, 'event_charge' => $charge->fresh()]); } public function destroy(int $eventCharge): JsonResponse { return $this->void($eventCharge); } public function approve(int $eventCharge): JsonResponse { $charge = EventCharge::query()->findOrFail($eventCharge); if (Schema::hasColumn('event_charges', 'status')) { $charge->status = 'approved'; } if (Schema::hasColumn('event_charges', 'charged')) { $charge->charged = 1; } $charge->save(); return response()->json(['ok' => true, 'event_charge' => $charge->fresh()]); } public function void(int $eventCharge): JsonResponse { $charge = EventCharge::query()->findOrFail($eventCharge); if (Schema::hasColumn('event_charges', 'status')) { $charge->status = 'voided'; } if (Schema::hasColumn('event_charges', 'charged')) { $charge->charged = 0; } $charge->save(); return response()->json(['ok' => true, 'event_charge' => $charge->fresh()]); } public function attachToInvoice(Request $request, int $eventCharge): JsonResponse { $request->validate(['invoice_id' => ['required', 'integer']]); $charge = EventCharge::query()->findOrFail($eventCharge); $invoiceId = (int) $request->input('invoice_id'); abort_if(! DB::table('invoices')->where('id', $invoiceId)->exists(), 404, 'Invoice not found.'); if (Schema::hasColumn('event_charges', 'invoice_id')) { $charge->invoice_id = $invoiceId; } if (Schema::hasColumn('event_charges', 'status')) { $charge->status = 'invoiced'; } if (Schema::hasColumn('event_charges', 'charged')) { $charge->charged = 1; } $charge->save(); return response()->json(['ok' => true, 'event_charge' => $charge->fresh(), 'warning' => Schema::hasColumn('event_charges', 'invoice_id') ? null : 'invoice_id column does not exist; charge marked as charged only.']); } private function normalizePayload(array $data): array { if (isset($data['title']) && ! isset($data['event_name'])) { $data['event_name'] = $data['title']; } unset($data['title'], $data['invoice_id']); return array_filter($data, fn ($v) => $v !== null); } }