для регионаольного менеджера добавлена возможность дбавления агентов и создания сделок от их имени

This commit is contained in:
developer 2025-12-09 17:07:45 +08:00
parent 474c97d4e8
commit 7b5e42f0d0
10 changed files with 329 additions and 298 deletions

View File

@ -20,9 +20,8 @@ public function mount($status = null)
}
public function render()
{
$user = auth()->user();
$admin = CompanyAdmin::where('user_id', $user->id)->first();
$agents = Agent::where('company_id', $admin->company_id);
$agents = GetAvailableAgents('Builder');
if ($this->status == AgentStatus::DISMISSED)
{
$agents->onlyTrashed();

View File

@ -1,12 +1,28 @@
<?php
use Modules\ClientCreateForm\Http\Livewire\FormStatus;
?>
<div>
<div class="flex-fill">
<div class="w-100 text-center" wire:loading wire:target="save, resetData, back">
<div class="spinner-border " style="width: 4rem; height: 4rem;" role="status">
<span class="visually-hidden">Загрузка формы...</span>
</div>
</div>
@if(!$availableAgents)
<div class="w-100 text-center">
<div>
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" fill="currentColor" class="bi bi-lock"
viewBox="0 0 16 16">
<path fill-rule="evenodd"
d="M8 0a4 4 0 0 1 4 4v2.05a2.5 2.5 0 0 1 2 2.45v5a2.5 2.5 0 0 1-2.5 2.5h-7A2.5 2.5 0 0 1 2 13.5v-5a2.5 2.5 0 0 1 2-2.45V4a4 4 0 0 1 4-4M4.5 7A1.5 1.5 0 0 0 3 8.5v5A1.5 1.5 0 0 0 4.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 11.5 7zM8 1a3 3 0 0 0-3 3v2h6V4a3 3 0 0 0-3-3" />
</svg>
</div>
<div class="my-2">
Вы пока не можете добавлять контакты и сделки
</div>
</div>
@endif
@if($availableAgents && $complexes)
<div class="w-100" wire:loading.remove wire:target="save, resetData, back">
@if ($status == FormStatus::NEW || $status == FormStatus::IN_PROCESS || $status == FormStatus::READY)
<ul class="nav nav-tabs d-flex align-items-end border-0 pb-0">
@ -64,8 +80,7 @@ class="form-control rounded-4 @error('contacts.' . $currentContactIndex . '.firs
id="contacts.{{ $currentContactIndex }}.secondName" type="text"
class="form-control rounded-4 @error('contacts.' . $currentContactIndex . '.secondName') is-invalid @enderror"
name="contacts.{{ $currentContactIndex }}.secondName" required
autocomplete="contacts.{{ $currentContactIndex }}.secondName"
placeholder="Фамилия">
autocomplete="contacts.{{ $currentContactIndex }}.secondName" placeholder="Фамилия">
<label for="contacts.{{ $currentContactIndex }}.secondName">Фамилия</label>
@error('contacts.' . $currentContactIndex . '.secondName')
<span class="invalid-feedback" role="alert">
@ -78,15 +93,13 @@ class="form-control rounded-4 @error('contacts.' . $currentContactIndex . '.seco
@foreach ($contacts[$currentContactIndex]['phones'] as $phoneKey => $phone)
<div class="col-12 hstack gap-2">
<div class="form-floating me-auto w-100">
<input
wire:model.live="contacts.{{ $currentContactIndex }}.phones.{{ $phoneKey }}"
id="contacts.{{ $currentContactIndex }}.phones.{{ $phoneKey }}"
type="text" data-phone-pattern
<input wire:model.live="contacts.{{ $currentContactIndex }}.phones.{{ $phoneKey }}"
id="contacts.{{ $currentContactIndex }}.phones.{{ $phoneKey }}" type="text"
data-phone-pattern
class="form-control rounded-4 @error('contacts.' . $currentContactIndex . '.phones.' . $phoneKey) is-invalid @enderror"
name="contacts.{{ $currentContactIndex }}.phones.{{ $phoneKey }}" required
autocomplete="phone" placeholder="Телефон клиента">
<label
for="contacts.{{ $currentContactIndex }}.phones.{{ $phoneKey }}">Телефон
<label for="contacts.{{ $currentContactIndex }}.phones.{{ $phoneKey }}">Телефон
{{ count($contacts[$currentContactIndex]['phones']) > 1 ? ' ' . ($phoneKey + 1) : '' }}</label>
@error('contacts.' . $currentContactIndex . '.phones.' . $phoneKey)
@ -95,14 +108,15 @@ class="form-control rounded-4 @error('contacts.' . $currentContactIndex . '.phon
</span>
@enderror
</div>
@if (count($contacts[$currentContactIndex]['phones']) == $phoneKey + 1 &&
count($contacts[$currentContactIndex]['phones']) < $this->maxContactPhonesCount)
@if (
count($contacts[$currentContactIndex]['phones']) == $phoneKey + 1 &&
count($contacts[$currentContactIndex]['phones']) < $this->maxContactPhonesCount
)
<a class="" href="#" wire:click="addPhoneForClient"
title="Добавить еще один телефон для клиента">
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30"
fill="currentColor" class="bi bi-plus-circle" viewBox="0 0 16 16">
<path
d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16" />
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" fill="currentColor"
class="bi bi-plus-circle" viewBox="0 0 16 16">
<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16" />
<path
d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4" />
</svg>
@ -114,8 +128,7 @@ class="form-control rounded-4 @error('contacts.' . $currentContactIndex . '.phon
@if ($currentContactIndex == 0 && count($contacts) <= 2)
<div class="form-check form-switch">
<input class="form-check-input" wire:click="toggleSecondContact" type="checkbox"
role="switch" id="switchCheckChecked"
@if (count($contacts) == 2) checked @endif>
role="switch" id="switchCheckChecked" @if (count($contacts) == 2) checked @endif>
<label class="form-check-label" for="switchCheckChecked">Добавить контакт
супруга/супруги</label>
</div>
@ -133,9 +146,8 @@ class="form-control rounded-4 @error('contacts.' . $currentContactIndex . '.phon
</div>
<div class="form-floating mb-3">
<select wire:model.live="complexId"
class="form-select rounded-4 @error('complexId') is-invalid @enderror" id="complexId"
name="complexId" aria-label="Жилой комплекс">
<select wire:model.live="complexId" class="form-select rounded-4 @error('complexId') is-invalid @enderror"
id="complexId" name="complexId" aria-label="Жилой комплекс">
<option selected></option>
@foreach ($complexes as $complex)
<option value="{{ $complex['id'] }}">
@ -153,9 +165,8 @@ class="form-select rounded-4 @error('complexId') is-invalid @enderror" id="compl
@if (count($availableAgents) > 1)
<div class="form-floating mb-3">
<select wire:model.live="agentId"
class="form-select rounded-4 @error('agentId') is-invalid @enderror" id="agentId"
name="agent" aria-label="Агент">
<select wire:model.live="agentId" class="form-select rounded-4 @error('agentId') is-invalid @enderror"
id="agentId" name="agent" aria-label="Агент">
<option selected></option>
@foreach ($availableAgents as $agent)
<option value="{{ $agent['id'] }}">
@ -225,9 +236,10 @@ class="bi bi-emoji-astonished" viewBox="0 0 16 16">
</div>
@endif
</div>
@endif
@script
<script>
eventCalllback = function(e) {
eventCalllback = function (e) {
var el = e.target,
clearVal = el.dataset.phoneClear,
pattern = el.dataset.phonePattern,
@ -243,7 +255,7 @@ class="bi bi-emoji-astonished" viewBox="0 0 16 16">
}
}
if (def.length >= val.length) val = def;
e.target.value = matrix.replace(/./g, function(a) {
e.target.value = matrix.replace(/./g, function (a) {
return /[_\d]/.test(a) && i < val.length ? val.charAt(i++) : i >= val.length ? "" :
a
});

View File

@ -31,7 +31,7 @@ function AgentCompanyOfUser()
}
if (!function_exists('GetAvailableAgents')) {
function GetAvailableAgents()
function GetAvailableAgents($resultType = 'Collection')
{
$agents = false;
if ($adminCompany = AdminCompanyOfUser()) {
@ -39,7 +39,7 @@ function GetAvailableAgents()
} else {
$cityManager = CityManager::where('user_id', auth()->user()->id);
if ($cityManager->count()) {
$companies = Company::where('city_id', $cityManager->first()->city_id);
$companies = Company::whereIn('city_id', $cityManager->pluck('city_id'));
if ($companies->count()) {
$agents = Agent::whereIn('company_id', $companies->get()->pluck('id'));
}
@ -48,11 +48,15 @@ function GetAvailableAgents()
}
}
if ($agents === false) {
return [];
$agents = Agent::where('id', 0);
}
$agents->with('company:id,name');
$agents->with('user:id,name');
if ($resultType == 'Collection') {
return $agents->get();
} else {
return $agents;
};
}
}

View File

@ -13,14 +13,8 @@ class AgentsTableController extends Controller
{
public function index(Request $request)
{
$user = auth()->user();
$admin = CompanyAdmin::where('user_id', $user->id);
if ($admin->count())
{
$admin = $admin->first();
$agents = Agent::where('company_id', $admin->company_id);
switch ( $request->status )
{
$agents = Agent::where('company_id', GetAvailableAgents());
switch ($request->status) {
case AgentStatus::DISMISSED:
$agents->whereNotNull('deleted_at');
break;
@ -29,16 +23,10 @@ public function index(Request $request)
}
return view('main::company.agents.table', [
'agents' => $agents->get(),
'companyId' => $admin->company_id,
//'agents' => $agents->get(),
'status' => $request->status,
'cities' => City::all()
])->with('statuses', AgentStatus::class);
}
else
{
abort(code: 401);
return;
}
}
}

View File

@ -14,8 +14,9 @@
class CreateAgentController extends Controller
{
public function __invoke(Request $request, Company $company)
public function __invoke(Request $request)
{
$company = Company::findOrFail($request->company_id);
if ($request->user()->cannot('update', $company))
{
abort(403, 'Unauthorized action');

View File

@ -9,15 +9,19 @@
class CreateAgentLivewire extends Component
{
public $availableCompanies;
public $companyId;
public $containerId;
public function mount($containerId = 'createAgentModal', $companyId)
public function mount($containerId = 'createAgentModal')
{
$this->companyId = $companyId;
$this->containerId = $containerId;
$availableCompaniesIds = GetAvailableAgents('Builder')->pluck('company_id');
$this->availableCompanies = Company::whereIn('id', $availableCompaniesIds)->get();
if ($this->availableCompanies->count() == 1) {
$this->companyId = $this->availableCompanies->first()->id;
};
}
public function render()
{
return view('main::agent.livewire.create', [

View File

@ -13,8 +13,6 @@
Route::get('/main', [MainController::class, 'index']);
Route::get('/company/confirmer', function ()
{
return view(view: 'company.post_confirmer');
@ -26,7 +24,7 @@
Route::post('/company/{company}/details/', [Modules\Main\Http\Controllers\Company\DetailsController::class, 'store'])->name('company.details.store');
Route::get('/agents/table', [Modules\Main\Http\Controllers\Company\AgentsTableController::class, 'index'])->name('company.agents.table');
//Route::post('/company/agents/store/', Modules\Main\Http\Controllers\Company\CreateAgentController::class)->name('company.agents.store');
Route::post('/companies/{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('/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}/restore', Modules\Main\Http\Controllers\Company\RestoreAgentController::class)->name('company.agents.restore');

View File

@ -2,14 +2,38 @@
<div class="modal fade" id="{{ $containerId }}" tabindex="-1" aria-labelledby="createAgentModalLabel"
aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<form class="modal-content" action="{{ route('company.agents.store', ['company' => $companyId]) }}"
method="post">
<form class="modal-content" action="{{ route('company.agents.store') }}" method="post">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalLabel">Новый агент</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
@if($availableCompanies->count() == 0)
<div class="modal-body">
Нет доступных агентств для продолжения работы
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">ОК</button>
</div>
@else
<div class="modal-body">
@csrf
@if($availableCompanies->count() > 1)
<div class="mb-3">
<label for="companyId" class="form-label">Агентство</label>
<select wire:model="companyId" class="form-select @error('companyId') is-invalid @enderror"
id="companyId" name="company_id" aria-label="Агентство">
<option selected></option>
@foreach ($availableCompanies as $company)
<option value="{{ $company['id'] }}">
{{ $company['name'] }}
</option>
@endforeach
</select>
</div>
@elseif($availableCompanies->count() == 1)
<input type="hidden" class="form-control" id="company_id" name="company_id"
value="{{ $companyId }}">
@endif
<div class="mb-3">
<label for="agentName" class="form-label">Полное имя (ФИО)</label>
<input type="text" class="form-control" id="agentName" name="name">
@ -36,6 +60,7 @@
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<input type="submit" class="btn btn-primary" value="Добавить">
</div>
@endif
</form>
</div>
</div>

View File

@ -38,5 +38,5 @@
</div>
@endif
</div>
@livewire('company.agent.create', ['containerId' => 'createAgentModal', 'companyId' => $companyId])
@livewire('company.agent.create', ['containerId' => 'createAgentModal'])
@endsection

View File

@ -40,8 +40,8 @@ class="list-group-item list-group-item-action p-3 bg-white rounded border border
</div>
</div>
<div class="col-12 col-lg-6">
<div class="p-2 px-sm-4 py-sm-3 bg-primary border rounded-3 mx-auto h-100" style="min-height:30em;">
<div class="h4 pb-2 mb-2 fw-bold ">
<div class="p-2 px-sm-4 py-sm-3 bg-primary border rounded-3 mx-auto h-100" style="">
<div class="h4 pb-2 mb-2 fw-bold d-flex flex-column">
<small>Добавить клиента</small>
</div>
<livewire:ClientCreator />