добавлен soft delete для компаний и агентов

This commit is contained in:
developer 2026-01-15 22:44:10 +08:00
parent 457a77f7c2
commit f011fd2eae
10 changed files with 106 additions and 22 deletions

View File

@ -46,4 +46,11 @@ public function restore($id)
'agent' => $id 'agent' => $id
]); ]);
} }
public function delete($id)
{
to_route('company.agents.delete', [
'agent' => $id
]);
}
} }

View File

@ -16,9 +16,15 @@ public function index(Request $request)
{ {
$companies = Company::orderBy('name'); $companies = Company::orderBy('name');
//if ($request->filter) { //if ($request->filter) {
if (!(!$request->filter || $request->filter == 'all')) if ($request->filter)
{ {
$companies->where('status', $request->filter); if ($request->filter == 'trashed') {
$companies->onlyTrashed();
} else {
if ($request->filter != 'all') {
$companies->where('status', $request->filter);
}
}
} }
$companies = $companies->get(); $companies = $companies->get();
return view('admin::companies.index', [ return view('admin::companies.index', [
@ -41,5 +47,14 @@ public function update(Request $request, Company $company)
$company->update($request->only('name', 'email', 'phone')); $company->update($request->only('name', 'email', 'phone'));
return to_route('admin.companies.edit', ['company' => $company]); return to_route('admin.companies.edit', ['company' => $company]);
} }
public function delete(Company $company) {
$company->delete();
return back()->withSuccess('Агентство было перемещено в корзину. Все пользователи, прикрепленные к агентству не смогут войти на портал.');
}
public function restore(Company $company) {
$company->restore();
return to_route('admin.companies.edit', ['company' => $company])->withSuccess('Агентство "' . $company->name . '" было восстановлено из корзины');
}
} }

View File

@ -29,11 +29,14 @@
Route::post('/admin/users/create', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'store'])->name('admin.users.create'); Route::post('/admin/users/create', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'store'])->name('admin.users.create');
Route::get('/admin/users/{user}/edit', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'edit'])->name('admin.users.edit'); Route::get('/admin/users/{user}/edit', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'edit'])->name('admin.users.edit');
Route::post('/admin/users/{user}/update', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'update'])->name('admin.users.update'); Route::post('/admin/users/{user}/update', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'update'])->name('admin.users.update');
Route::post('/admin/users/{user}/delete', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'delete'])->name('admin.users.delete');
Route::post('/admin/user-role/{userRole}/delete', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'deleteUserRole'])->name('admin.users.role.delete'); Route::post('/admin/user-role/{userRole}/delete', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'deleteUserRole'])->name('admin.users.role.delete');
Route::get('/admin/companies', [Modules\Admin\Http\Controllers\AdminCompaniesController::class, 'index'])->name('admin.companies'); Route::get('/admin/companies', [Modules\Admin\Http\Controllers\AdminCompaniesController::class, 'index'])->name('admin.companies');
Route::get('/admin/companies/{company}/edit', [Modules\Admin\Http\Controllers\AdminCompaniesController::class, 'edit'])->name('admin.companies.edit'); Route::get('/admin/companies/{company}/edit', [Modules\Admin\Http\Controllers\AdminCompaniesController::class, 'edit'])->name('admin.companies.edit')->withTrashed();
Route::post('/admin/companies/{company}/update', [Modules\Admin\Http\Controllers\AdminCompaniesController::class, 'update'])->name('admin.companies.update'); Route::post('/admin/companies/{company}/update', [Modules\Admin\Http\Controllers\AdminCompaniesController::class, 'update'])->name('admin.companies.update');
Route::post('/admin/companies/{company}/delete', [Modules\Admin\Http\Controllers\AdminUsersController::class, 'update'])->name('admin.companies.delete'); Route::post('/admin/companies/{company}/delete', [Modules\Admin\Http\Controllers\AdminCompaniesController::class, 'delete'])->name('admin.companies.delete');
Route::post('/admin/companies/{company}/restore', [Modules\Admin\Http\Controllers\AdminCompaniesController::class, 'restore'])->name('admin.companies.restore')->withTrashed();
Route::get('/admin/cities', [Modules\Admin\Http\Controllers\AdminCitiesController::class, 'index'])->name('admin.cities'); Route::get('/admin/cities', [Modules\Admin\Http\Controllers\AdminCitiesController::class, 'index'])->name('admin.cities');
Route::get('/admin/cities/managers', [Modules\Admin\Http\Controllers\AdminCityManagersController::class, 'index'])->name('admin.cities.managers'); Route::get('/admin/cities/managers', [Modules\Admin\Http\Controllers\AdminCityManagersController::class, 'index'])->name('admin.cities.managers');

View File

@ -2,7 +2,7 @@
@extends('layouts.admin') @extends('layouts.admin')
@section('content') @section('content')
<div> <div>
<div class="d-flex mb-3"> <div class="d-flex mb-3 align-items-center">
<form class="p-2 border rounded-3 border-1 bg-white" method="GET" action="{{ route('admin.companies') }}"> <form class="p-2 border rounded-3 border-1 bg-white" method="GET" action="{{ route('admin.companies') }}">
<input type="radio" class="btn-check" name="filter" value="all" id="status_all" autocomplete="off" <input type="radio" class="btn-check" name="filter" value="all" id="status_all" autocomplete="off"
onclick="this.form.submit()" {{ $filter == 'all' || !$filter ? 'checked' : '' }}> onclick="this.form.submit()" {{ $filter == 'all' || !$filter ? 'checked' : '' }}>
@ -16,6 +16,7 @@
@endforeach @endforeach
</form> </form>
<div class="ms-auto p-2"> <div class="ms-auto p-2">
<a class="btn btn-secondary" href="{{ route('admin.companies', ['filter' => 'trashed']) }}">Удаленные</a>
<!--<button class="btn btn-primary py-2 px-3 fs-5" data-bs-toggle="modal" data-bs-target="#createCityModal"> <!--<button class="btn btn-primary py-2 px-3 fs-5" data-bs-toggle="modal" data-bs-target="#createCityModal">
<i class="bi bi-plus"></i> Добавить комплекс <i class="bi bi-plus"></i> Добавить комплекс
</button>--> </button>-->
@ -63,11 +64,19 @@
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton"> <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<a class="dropdown-item" <a class="dropdown-item"
href="{{ route('admin.companies.edit', ['company' => $company]) }}">Редактировать</a> href="{{ route('admin.companies.edit', ['company' => $company]) }}">Редактировать</a>
<form method="post" @if($company->trashed())
action="{{ route('admin.companies.delete', ['company' => $company]) }}"> <form method="post"
action="{{ route('admin.companies.restore', ['company' => $company]) }}">
@csrf @csrf
<button class="dropdown-item" type="submit">Удалить</button> <button class="dropdown-item" type="submit">Восстановить</button>
</form> </form>
@else
<form method="post"
action="{{ route('admin.companies.delete', ['company' => $company]) }}">
@csrf
<button class="dropdown-item" type="submit">Удалить</button>
</form>
@endif
</div> </div>
</div> </div>
</td> </td>

View File

@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('companies', function (Blueprint $table)
{
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('companies', function (Blueprint $table)
{
$table->dropSoftDeletes();
});
}
};

View File

@ -23,10 +23,8 @@ public function index(Request $request)
} }
return view('main::company.agents.table', [ return view('main::company.agents.table', [
//'agents' => $agents->get(),
'status' => $request->status, 'status' => $request->status,
'cities' => City::all() 'cities' => City::all()
])->with('statuses', AgentStatus::class); ])->with('statuses', AgentStatus::class);
} }
} }

View File

@ -27,7 +27,12 @@ public function __invoke(Request $request, Agent $agent)
abort(404); abort(404);
return; return;
} }
$agent->delete();
if ($agent->trashed()) {
$agent->forceDelete();
} else {
$agent->delete();
};
return to_route('company.agents.table'); return to_route('company.agents.table');
} }
} }

View File

@ -2,15 +2,19 @@
namespace Modules\Main\Models\Company; namespace Modules\Main\Models\Company;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Modules\Payment\Traits\Paymentable; use Modules\Payment\Traits\Paymentable;
use Modules\Main\Models\City; use Modules\Main\Models\City;
use Modules\Bitrix\Traits\Bitrixable; use Modules\Bitrix\Traits\Bitrixable;
class Company extends Model class Company extends Model
{ {
use HasFactory; use HasFactory;
use SoftDeletes;
use Paymentable; use Paymentable;
use Bitrixable; use Bitrixable;
const STATUS_NEW = 'new'; const STATUS_NEW = 'new';

View File

@ -29,7 +29,7 @@
//Route::post('/company/agents/store/', Modules\Main\Http\Controllers\Company\CreateAgentController::class)->name('company.agents.store'); //Route::post('/company/agents/store/', Modules\Main\Http\Controllers\Company\CreateAgentController::class)->name('company.agents.store');
Route::post('/companies/agents/store/', Modules\Main\Http\Controllers\Company\CreateAgentController::class)->name('company.agents.store'); Route::post('/companies/agents/store/', Modules\Main\Http\Controllers\Company\CreateAgentController::class)->name('company.agents.store');
Route::post('/company/agents/{agent}/password/reset/', Modules\Main\Http\Controllers\Company\ResetAgentPasswordController::class)->name('company.agent.password.reset'); Route::post('/company/agents/{agent}/password/reset/', Modules\Main\Http\Controllers\Company\ResetAgentPasswordController::class)->name('company.agent.password.reset');
Route::get('/company/agents/{agent}/delete', Modules\Main\Http\Controllers\Company\DeleteAgentController::class)->name('company.agents.delete'); Route::get('/company/agents/{agent}/delete', Modules\Main\Http\Controllers\Company\DeleteAgentController::class)->name('company.agents.delete')->withTrashed();
Route::get('/company/agents/{agent}/restore', Modules\Main\Http\Controllers\Company\RestoreAgentController::class)->name('company.agents.restore'); Route::get('/company/agents/{agent}/restore', Modules\Main\Http\Controllers\Company\RestoreAgentController::class)->name('company.agents.restore');
}); });

View File

@ -1,5 +1,5 @@
<div> <div>
<div class="fs-5 bg-light p-0 m-0 border border-1 rounded-4 overflow-hidden"> <div class="fs-5 bg-light py-4 m-0 border border-1 rounded-4">
<table class="table m-0"> <table class="table m-0">
<tbody class=""> <tbody class="">
@foreach ($agents as $num => $agent) @foreach ($agents as $num => $agent)
@ -17,7 +17,7 @@
{{ $agent->user->email }} {{ $agent->user->email }}
</td> </td>
@if (!$agent->trashed()) @if (!$agent->trashed())
<td class="align-middle text-center"> <td class="align-middle text-end ">
<div class="dropdown" style=""> <div class="dropdown" style="">
<button class="btn btn-light" type="button" id="dropdownMenuButton" <button class="btn btn-light" type="button" id="dropdownMenuButton"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
@ -39,13 +39,26 @@
</td> </td>
@else @else
<td class="align-middle"> <td class="align-middle">
{{ $agent->deleted_at->diffForHumans() }} Уволен {{ $agent->deleted_at->diffForHumans() }}
<div> </td>
<a style="text-decoration: underline dotted;" href="#" <td class="align-middle text-end ">
wire:confirm = "Выбранный агент сможет создавать новые контакты.\nПродолжить?" <div class="dropdown" style="">
wire:click = "restore({{ $agent->id }})"> <button class="btn btn-light" type="button" id="dropdownMenuButton"
Восстановить data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
</a> <i class="bi bi-three-dots-vertical"></i>
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<a class="dropdown-item"
wire:confirm = "Выбранный агент сможет создавать новые контакты.\nПродолжить?"
wire:click = "restore({{ $agent->id }})">
Восстановить
</a>
<a class="dropdown-item"
wire:confirm = "Запись об этом агенте и всех его контактах будут безвозвратно удалены.\nПродолжить?"
wire:click = "delete({{ $agent->id }})">
Удалить навсегда
</a>
</div>
</div> </div>
</td> </td>
@endif @endif