requireAuth()) { return $redirect; } $request = Request::capture(); $search = (string) ($request->input('search') ?? ''); $householdId = (string) ($request->input('household_id') ?? ''); $page = max(1, (int) ($request->input('page') ?? 1)); $perPage = 20; $repo = new HouseholderNameRepository(database()); $total = $repo->countAll($search, $householdId); $pagination = new Pagination($total, $page, $perPage); $names = $repo->findPaged($page, $perPage, $search, $householdId); return $this->view('householder-names.index', [ 'pageTitle' => 'Householder Names', 'names' => $names, 'search' => $search, 'householdId' => $householdId, 'pagination' => $pagination, ]); } public function show(int|string $id): Response { if ($redirect = $this->requireAuth()) { return $redirect; } $name = (new HouseholderNameRepository(database()))->findWithHousehold((int) $id); if (!$name) { return Response::notFound('Householder name not found.'); } return $this->view('householder-names.show', [ 'pageTitle' => e($name['name']), 'name' => $name, ]); } public function create(): Response { if ($redirect = $this->requireAuth()) { return $redirect; } $request = Request::capture(); $households = (new HouseholdRepository(database()))->all(); return $this->view('householder-names.create', [ 'pageTitle' => 'New Householder Name', 'households' => $households, 'defaultHouseholdId' => (string) ($request->input('household_id') ?? ''), 'errors' => [], 'old' => [], ]); } public function store(): Response { if ($redirect = $this->requireAuth()) { return $redirect; } $request = Request::capture(); $households = (new HouseholdRepository(database()))->all(); if (!verify_csrf_token($request->input('_token'))) { return $this->view('householder-names.create', [ 'pageTitle' => 'New Householder Name', 'households' => $households, 'defaultHouseholdId' => '', 'errors' => ['_token' => ['Invalid request. Please try again.']], 'old' => $request->all(), ]); } $householdId = (string) ($request->input('household_id') ?? ''); $name = trim((string) ($request->input('name') ?? '')); $letterReturned = (int) (bool) $request->input('letter_returned'); $returnDate = trim((string) ($request->input('return_date') ?? '')) ?: null; $validator = (new Validator()) ->required('household_id', $householdId, 'Household is required.') ->required('name', $name, 'Name is required.') ->maxLength('name', $name, 255); if ($validator->fails()) { return $this->view('householder-names.create', [ 'pageTitle' => 'New Householder Name', 'households' => $households, 'defaultHouseholdId' => $householdId, 'errors' => $validator->errors(), 'old' => $request->all(), ]); } $now = date('Y-m-d H:i:s'); database()->execute( 'INSERT INTO householder_names (household_id, name, letter_returned, return_date, created_at, updated_at) VALUES (:household_id, :name, :letter_returned, :return_date, :now, :now)', ['household_id' => $householdId, 'name' => $name, 'letter_returned' => $letterReturned, 'return_date' => $returnDate, 'now' => $now] ); flash('success', "Householder name \"{$name}\" created."); return $this->redirect('/householder-names'); } public function edit(int|string $id): Response { if ($redirect = $this->requireAuth()) { return $redirect; } $name = (new HouseholderNameRepository(database()))->find((int) $id); if (!$name) { return Response::notFound('Householder name not found.'); } $households = (new HouseholdRepository(database()))->all(); return $this->view('householder-names.edit', [ 'pageTitle' => 'Edit Householder Name', 'name' => $name, 'households' => $households, 'errors' => [], ]); } public function update(int|string $id): Response { if ($redirect = $this->requireAuth()) { return $redirect; } $request = Request::capture(); $repo = new HouseholderNameRepository(database()); $name = $repo->find((int) $id); if (!$name) { return Response::notFound('Householder name not found.'); } if (!verify_csrf_token($request->input('_token'))) { flash('error', 'Invalid request.'); return $this->redirect('/householder-names/' . $id . '/edit'); } $householdId = (string) ($request->input('household_id') ?? ''); $nameVal = trim((string) ($request->input('name') ?? '')); $letterReturned = (int) (bool) $request->input('letter_returned'); $returnDate = trim((string) ($request->input('return_date') ?? '')) ?: null; $validator = (new Validator()) ->required('household_id', $householdId, 'Household is required.') ->required('name', $nameVal, 'Name is required.') ->maxLength('name', $nameVal, 255); $households = (new HouseholdRepository(database()))->all(); if ($validator->fails()) { return $this->view('householder-names.edit', [ 'pageTitle' => 'Edit Householder Name', 'name' => array_merge($name, ['name' => $nameVal, 'household_id' => $householdId]), 'households' => $households, 'errors' => $validator->errors(), ]); } database()->execute( 'UPDATE householder_names SET household_id = :household_id, name = :name, letter_returned = :letter_returned, return_date = :return_date, updated_at = :now WHERE id = :id', ['household_id' => $householdId, 'name' => $nameVal, 'letter_returned' => $letterReturned, 'return_date' => $returnDate, 'now' => date('Y-m-d H:i:s'), 'id' => $id] ); flash('success', "Householder name \"{$nameVal}\" updated."); return $this->redirect('/householder-names/' . $id); } public function delete(int|string $id): Response { if ($redirect = $this->requireAuth()) { return $redirect; } $request = Request::capture(); $name = (new HouseholderNameRepository(database()))->find((int) $id); if (!$name) { return Response::notFound('Householder name not found.'); } if (!verify_csrf_token($request->input('_token'))) { flash('error', 'Invalid request.'); return $this->redirect('/householder-names'); } $householdId = $name['household_id']; database()->execute('DELETE FROM householder_names WHERE id = :id', ['id' => $id]); flash('success', 'Householder name deleted.'); return $this->redirect('/households/' . $householdId); } public function markReturned(int|string $id): Response { if ($redirect = $this->requireAuth()) { return $redirect; } $request = Request::capture(); $repo = new HouseholderNameRepository(database()); $name = $repo->find((int) $id); if (!$name) { return Response::notFound('Householder name not found.'); } if (!verify_csrf_token($request->input('_token'))) { flash('error', 'Invalid request.'); return $this->redirect('/households/' . $name['household_id']); } $repo->toggleLetterReturned((int) $id); flash('success', 'Letter returned status updated.'); return $this->redirect('/households/' . $name['household_id']); } }