Emergency button for missing persons

This commit is contained in:
Simon Pocrnjič
2025-10-09 00:01:15 +02:00
parent c177264b0b
commit 86898eac1a
6 changed files with 194 additions and 27 deletions
+71
View File
@@ -158,4 +158,75 @@ public function update(Client $client, Request $request)
return to_route('client.show', $client);
}
/**
* Emergency endpoint: if the linked person record is missing (hard deleted) or soft deleted,
* create a new minimal Person and re-point all related child records (emails, phones, addresses, bank accounts,
* client cases) from the old person_id to the new one, then update the client itself.
*/
public function emergencyCreatePerson(Client $client, Request $request)
{
$oldPersonId = $client->person_id;
// If person exists and is not trashed, abort nothing to do
/** @var \App\Models\Person\Person|null $existing */
$existing = \App\Models\Person\Person::withTrashed()->find($oldPersonId);
if ($existing && ! $existing->trashed()) {
return redirect()->back()->with('flash', [
'type' => 'info',
'message' => 'Person already exists emergency creation not needed.',
]);
}
$data = $request->validate([
'full_name' => ['nullable', 'string', 'max:255'],
'first_name' => ['nullable', 'string', 'max:255'],
'last_name' => ['nullable', 'string', 'max:255'],
'tax_number' => ['nullable', 'string', 'max:99'],
'social_security_number' => ['nullable', 'string', 'max:99'],
'description' => ['nullable', 'string', 'max:500'],
]);
// Provide sensible fallbacks.
$fullName = $data['full_name'] ?? trim(($data['first_name'] ?? '').' '.($data['last_name'] ?? ''));
if ($fullName === '') {
$fullName = 'Unknown Person';
}
$newPerson = null;
\DB::transaction(function () use ($oldPersonId, $client, $fullName, $data, &$newPerson) {
$newPerson = \App\Models\Person\Person::create([
'nu' => null, // boot event will generate
'first_name' => $data['first_name'] ?? null,
'last_name' => $data['last_name'] ?? null,
'full_name' => $fullName,
'gender' => null,
'birthday' => null,
'tax_number' => $data['tax_number'] ?? null,
'social_security_number' => $data['social_security_number'] ?? null,
'description' => $data['description'] ?? 'Emergency recreated person',
'group_id' => 1,
'type_id' => 2,
]);
// Re-point related records referencing the old (missing) person id
$tables = [
'emails', 'person_phones', 'person_addresses', 'bank_accounts', 'client_cases',
];
foreach ($tables as $table) {
\DB::table($table)->where('person_id', $oldPersonId)->update(['person_id' => $newPerson->id]);
}
// Finally update the client itself (only this one; avoid touching other potential clients)
$client->person_id = $newPerson->id;
$client->save();
});
return redirect()->back()->with('flash', [
'type' => 'success',
'message' => 'New person created and related records re-linked.',
'person_uuid' => $newPerson?->uuid,
]);
}
}