Emergency button for missing persons
This commit is contained in:
@@ -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,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user