рефакторинг: перенос модулей, доработка формы, добавлен модуль "менеджеры"
This commit is contained in:
parent
c876701fda
commit
e0b417a5f9
@ -4,40 +4,40 @@
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Agent\Agent;
|
||||
use App\Models\Agent\AgentStatus;
|
||||
use App\Models\Company\CompanyAdmin;
|
||||
use App\Models\City;
|
||||
use Modules\Main\Models\Agent\Agent;
|
||||
use Modules\Main\Models\Agent\AgentStatus;
|
||||
use Modules\Main\Models\Company\CompanyAdmin;
|
||||
use Modules\Main\Models\City;
|
||||
|
||||
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 )
|
||||
{
|
||||
{
|
||||
case AgentStatus::DISMISSED:
|
||||
$agents->whereNotNull('deleted_at');
|
||||
break;
|
||||
default:
|
||||
$agents->withTrashed();
|
||||
}
|
||||
}
|
||||
|
||||
return view('company.agents.table', [
|
||||
'agents' => $agents->get(),
|
||||
'status' => $request->status,
|
||||
'cities' => City::all()
|
||||
])->with('statuses', AgentStatus::class);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
abort(code: 401);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,10 +5,10 @@
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use App\Models\Company\Company;
|
||||
use App\Models\Company\Details;
|
||||
use App\Models\Company\CompanyAdmin;
|
||||
use App\Models\Company\CompanyType;
|
||||
use Modules\Main\Models\Company\Company;
|
||||
use Modules\Main\Models\Company\Details;
|
||||
use Modules\Main\Models\Company\CompanyAdmin;
|
||||
use Modules\Main\Models\Company\CompanyType;
|
||||
class DetailsController extends Controller
|
||||
{
|
||||
public function index($companyId = null)
|
||||
|
||||
@ -4,9 +4,8 @@
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Company\CompanyAdmin;
|
||||
use App\Models\Agent\Agent;
|
||||
use App\Models\User;
|
||||
use Modules\Main\Models\Company\CompanyAdmin;
|
||||
use Modules\Main\Models\Agent\Agent;
|
||||
|
||||
use App\Notifications\UserRegistered;
|
||||
|
||||
|
||||
@ -4,11 +4,9 @@
|
||||
|
||||
use Livewire\Component;
|
||||
use Livewire\WithPagination;
|
||||
use Livewire\WithoutUrlPagination;
|
||||
use App\Models\Company\CompanyAdmin;
|
||||
use App\Models\Agent\Agent;
|
||||
use App\Models\Agent\AgentStatus;
|
||||
use App\Models\Deal\Deal;
|
||||
use Modules\Main\Models\Company\CompanyAdmin;
|
||||
use Modules\Main\Models\Agent\Agent;
|
||||
use Modules\Main\Models\Agent\AgentStatus;
|
||||
|
||||
class AgentsTable extends Component
|
||||
{
|
||||
|
||||
@ -4,24 +4,24 @@
|
||||
|
||||
use Livewire\Component;
|
||||
|
||||
use App\Models\User\UserRole;
|
||||
use App\Models\User\Role;
|
||||
use Modules\User\Models\UserRole;
|
||||
use Modules\User\Models\Role;
|
||||
|
||||
|
||||
class MainMenu extends Component
|
||||
{
|
||||
{
|
||||
|
||||
public $userId;
|
||||
|
||||
public function mount()
|
||||
{
|
||||
{
|
||||
$this->userId = auth()->user()->id;
|
||||
}
|
||||
}
|
||||
public function render()
|
||||
{
|
||||
{
|
||||
return view('livewire.main-menu', [
|
||||
'userRoles' => UserRole::where('user_id', $this->userId)->pluck('role_id')->toArray(),
|
||||
'roles' => Role::class
|
||||
'roles' => Role::class
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -8,9 +8,9 @@
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
use Laravel\Sanctum\HasApiTokens;
|
||||
|
||||
use App\Models\User;
|
||||
use Modules\User\Models\User;
|
||||
use App\Models\Deal\Deal;
|
||||
use App\Models\Agent\Agent;
|
||||
use Modules\Main\Models\Agent\Agent;
|
||||
class Client extends User
|
||||
{
|
||||
protected $table = 'users';
|
||||
|
||||
@ -4,16 +4,14 @@
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
use App\Models\User\UserRole;
|
||||
use App\Models\User\Role;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
use Modules\User\Models\User;
|
||||
use Modules\User\Models\UserRole;
|
||||
use Modules\User\Models\Role;
|
||||
use Modules\Contracts\Models\Contract;
|
||||
use Modules\Main\Models\Complex;
|
||||
use Modules\Main\Models\Agent\Agent;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
use Modules\Bitrix\Traits\Bitrixable;
|
||||
|
||||
|
||||
class Deal extends Model
|
||||
{
|
||||
use HasFactory, Notifiable, Bitrixable;
|
||||
@ -31,7 +29,7 @@ public function complex()
|
||||
}
|
||||
public function user()
|
||||
{
|
||||
return $this->belongsTo(\App\Models\User::class, 'client_id');
|
||||
return $this->belongsTo(User::class, 'client_id');
|
||||
}
|
||||
public function agent()
|
||||
{
|
||||
|
||||
@ -4,9 +4,7 @@
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use App\Models\City;
|
||||
|
||||
use Modules\Main\Models\City;
|
||||
class AdminCitiesController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
|
||||
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Admin\Http\Controllers;
|
||||
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\CityManager\Models\CityManager;
|
||||
use Modules\Main\Models\City;
|
||||
class AdminCityManagersController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
return view('admin::cities.managers', [
|
||||
'managers' => CityManager::with(['user', 'city'])->get(),
|
||||
'cities' => City::all(),
|
||||
'filter' => $request->filter
|
||||
]);
|
||||
}
|
||||
}
|
||||
@ -2,15 +2,10 @@
|
||||
|
||||
namespace Modules\Admin\Http\Controllers;
|
||||
|
||||
use Modules\Post\Models\Post;
|
||||
use Modules\Post\Models\PostCategory;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use App\Models\Company\Company;
|
||||
use App\Models\Company\CompanyStatus;
|
||||
|
||||
use Modules\Main\Models\Company\Company;
|
||||
use Modules\Main\Models\Company\CompanyStatus;
|
||||
class AdminCompaniesController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
|
||||
@ -5,8 +5,8 @@
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use App\Models\Complex;
|
||||
use App\Models\City;
|
||||
use Modules\Main\Models\Complex;
|
||||
use Modules\Main\Models\City;
|
||||
|
||||
class AdminComplexesController extends Controller
|
||||
{
|
||||
|
||||
@ -1,14 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Admin\Http\Controllers;
|
||||
|
||||
use Modules\Admin\Models\Admin;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\User\UserRole;
|
||||
use App\Models\User\Role;
|
||||
use App\Models\User;
|
||||
|
||||
use Modules\User\Models\UserRole;
|
||||
use Modules\User\Models\Role;
|
||||
use Modules\User\Models\User;
|
||||
class AdminController extends Controller
|
||||
{
|
||||
public function index()
|
||||
|
||||
@ -8,9 +8,9 @@
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use App\Models\User\UserRole;
|
||||
use App\Models\User\Role;
|
||||
use App\Models\User;
|
||||
use Modules\User\Models\UserRole;
|
||||
use Modules\User\Models\Role;
|
||||
use Modules\User\Models\User;
|
||||
|
||||
class AdminUsersController extends Controller
|
||||
{
|
||||
|
||||
@ -5,8 +5,8 @@
|
||||
use Livewire\Component;
|
||||
|
||||
|
||||
use App\Models\User\UserRole;
|
||||
use App\Models\User\Role;
|
||||
use Modules\User\Models\UserRole;
|
||||
use Modules\User\Models\Role;
|
||||
|
||||
class AdminMenu extends Component
|
||||
{
|
||||
|
||||
@ -3,9 +3,9 @@
|
||||
namespace Modules\Admin\Http\Livewire;
|
||||
|
||||
use Livewire\Component;
|
||||
use App\Models\Company\Company;
|
||||
use App\Models\Complex;
|
||||
use App\Models\Agent\Agent;
|
||||
use Modules\Main\Models\Company\Company;
|
||||
use Modules\Main\Models\Complex;
|
||||
use Modules\Main\Models\Agent\Agent;
|
||||
class Payments extends Component
|
||||
{
|
||||
public $newValue;
|
||||
|
||||
@ -32,6 +32,7 @@
|
||||
Route::post('/admin/cities/create', [Modules\Admin\Http\Controllers\AdminCitiesController::class, 'create'])->name('admin.cities.create');
|
||||
Route::post('/admin/cities/{city}/delete', [Modules\Admin\Http\Controllers\AdminCitiesController::class, 'delete'])->name('admin.cities.delete');
|
||||
Route::post('/admin/cities/{city}/restore', [Modules\Admin\Http\Controllers\AdminCitiesController::class, 'restore'])->withTrashed()->name('admin.cities.restore');
|
||||
Route::get('/admin/cities/managers', [Modules\Admin\Http\Controllers\AdminCityManagersController::class, 'index'])->name('admin.cities.managers');
|
||||
|
||||
Route::get('/admin/complexes', [Modules\Admin\Http\Controllers\AdminComplexesController::class, 'index'])->name('admin.complexes');
|
||||
Route::get('/admin/complexes/{complex}/edit', [Modules\Admin\Http\Controllers\AdminComplexesController::class, 'edit'])->name('admin.complexes.edit');
|
||||
|
||||
67
app/Modules/Admin/Views/cities/managers.blade.php
Normal file
67
app/Modules/Admin/Views/cities/managers.blade.php
Normal file
@ -0,0 +1,67 @@
|
||||
@php($title = 'Менеджеры')
|
||||
@extends('layouts.admin')
|
||||
@section('content')
|
||||
<style>
|
||||
.collapsing {
|
||||
transition: none !important;
|
||||
}
|
||||
</style>
|
||||
<div class="d-flex mb-3">
|
||||
<form class="p-2 border rounded-3 border-1 bg-white" method="GET" action="{{ route('admin.cities.managers') }}">
|
||||
<input type="radio" class="btn-check" name="filter" value="all" id="option_all" autocomplete="off"
|
||||
onclick="this.form.submit()" {{ $filter == 'all' || !$filter ? 'checked' : '' }}>
|
||||
<label class="btn p-2 fs-5" for="option_all">Все</label>
|
||||
@foreach ($cities as $city)
|
||||
<input type="radio" class="btn-check" name="filter" value="{{ $city->id }}"
|
||||
id="option_city_{{ $city->id }}" autocomplete="off" onclick="this.form.submit()"
|
||||
{{ $filter == $city->id ? 'checked' : '' }}>
|
||||
<label class="btn p-2 fs-5" for="option_city_{{ $city->id }}">{{ $city->name }}</label>
|
||||
@endforeach
|
||||
</form>
|
||||
|
||||
|
||||
<div class="ms-auto p-2">
|
||||
<button class="btn btn-primary py-2 px-3 fs-5" data-bs-toggle="modal" data-bs-target="#createCityManagerModal">
|
||||
<i class="bi bi-plus"></i> Добавить менеджера
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fs-5 bg-light p-0 m-0 border border-1 rounded-4 py-3">
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Modal -->
|
||||
<div class="modal fade" id="createCityManagerModal" tabindex="-1" aria-labelledby="createCityModalLabel"
|
||||
aria-hidden="true">
|
||||
|
||||
<form class="modal-dialog modal-dialog-centered" action="{{ route('admin.cities.create') }}" method="post">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h1 class="modal-title fs-5" id="createCityModalLabel">Новый менеджер</h1>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
|
||||
<div class="my-3">
|
||||
@csrf
|
||||
<div class="form-floating">
|
||||
<select name="city" class="form-select" id="floatingSelectCity" aria-label="Укажите город">
|
||||
@foreach ($cities as $city)
|
||||
<option value="{{ $city->id }}" @if ($filter == $city->id) selected @endif>
|
||||
{{ $city->name }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
<label for="floatingSelectCity">Укажите город</label>
|
||||
</div>
|
||||
|
||||
@livewire('user-selector')
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="submit" class="btn btn-primary">Добавить</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@endsection
|
||||
@ -23,6 +23,10 @@ class="nav-link d-flex align-items-center gap-2 fs-5 border rounded-4"
|
||||
class="nav-link d-flex align-items-center gap-2 fs-5 border rounded-4"
|
||||
href="{{ route('admin.complexes', ['filter' => 'actual']) }}">ЖК</a>
|
||||
</li>
|
||||
<li class="nav-item text-center m-2"><a
|
||||
class="nav-link d-flex align-items-center gap-2 fs-5 border rounded-4"
|
||||
href="{{ route('admin.cities.managers') }}">Менеджеры</a>
|
||||
</li>
|
||||
<li>
|
||||
<h6 class="dropdown-header text-uppercase">Агентства</h6>
|
||||
</li>
|
||||
|
||||
@ -11,8 +11,11 @@
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('city_managers', function (Blueprint $table) {
|
||||
Schema::create('city_managers', function (Blueprint $table)
|
||||
{
|
||||
$table->id();
|
||||
$table->foreignId('city_id')->references('id')->on('cities')->onDelete('cascade');
|
||||
$table->foreignId('user_id')->references('id')->on('users')->onDelete('cascade');
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
@ -11,10 +11,9 @@
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('mains', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->timestamps();
|
||||
});
|
||||
DB::table('roles')->insert([
|
||||
['id' => 5, 'name' => 'City manager'],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -22,6 +21,6 @@ public function up(): void
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('mains');
|
||||
DB::table('roles')->where('id', 5)->delete();
|
||||
}
|
||||
};
|
||||
@ -1,11 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Modules\CityManager\Models;
|
||||
namespace Modules\CityManager\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
use App\Models\User;
|
||||
use Modules\Main\Models\City;
|
||||
class CityManager extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
protected $fillable = [
|
||||
'city_id',
|
||||
'user_id'
|
||||
];
|
||||
public function user()
|
||||
{
|
||||
return $this->belongsTo(User::class, 'user_id');
|
||||
}
|
||||
public function city()
|
||||
{
|
||||
return $this->belongsTo(City::class, 'city_id');
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,27 +0,0 @@
|
||||
<?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::create('client_create_forms', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('client_create_forms');
|
||||
}
|
||||
};
|
||||
@ -11,6 +11,8 @@ class ClientCreateLivewire extends Component
|
||||
public $availableAgents;
|
||||
public $complexes;
|
||||
public $maxClientsCount;
|
||||
public $maxClientPhonesCount;
|
||||
|
||||
/////////////////////
|
||||
public $agent;
|
||||
public $clients;
|
||||
@ -25,6 +27,7 @@ public function mount()
|
||||
$this->complexes = GetAvailableComplexes();
|
||||
$this->availableAgents = GetAvailableAgents();
|
||||
$this->maxClientsCount = 2;
|
||||
$this->maxClientPhonesCount = 2;
|
||||
$this->clientLabels = ['Основной контакт', 'Супруг/супруга'];
|
||||
|
||||
$this->status = FormStatus::NEW;
|
||||
@ -69,7 +72,7 @@ public function deleteContact($index = false)
|
||||
{
|
||||
unset($this->clients[$index]);
|
||||
$this->clients = array_values($this->clients);
|
||||
$this->updateCurrentClientIndex($index - 1);
|
||||
$this->setCurrentClient($index - 1);
|
||||
}
|
||||
}
|
||||
public function setCurrentClient($index)
|
||||
@ -106,8 +109,10 @@ public function saveClient()
|
||||
}
|
||||
public function addPhoneForClient()
|
||||
{
|
||||
$this->currentClient['phones'][] = '';
|
||||
|
||||
if (count($this->currentClient['phones']) < $this->maxClientPhonesCount)
|
||||
{
|
||||
$this->currentClient['phones'][] = '';
|
||||
}
|
||||
}
|
||||
public function render()
|
||||
{
|
||||
|
||||
@ -9,21 +9,20 @@
|
||||
</div>
|
||||
<div class="w-100" wire:loading.remove wire:target="save, resetData, back">
|
||||
@if ($status == FormStatus::NEW || $status == FormStatus::READY)
|
||||
<div class="h4 pb-2 mb-4 fw-bold ">
|
||||
<small>Добавить клиента</small>
|
||||
</div>
|
||||
<ul class="nav nav-tabs d-flex align-items-end border-0 pb-0">
|
||||
@foreach ($clients as $clientIndex => $clientItem)
|
||||
<li
|
||||
class="nav-item overflow-hidden @if ($clientIndex == $currentClientIndex) rounded-top border-top border-end border-start bg-light @else m-1 bg-secondary-subtle rounded rouded-5 @endif">
|
||||
<a class="nav-link me-1 border-0 @if ($clientIndex == $currentClientIndex) active text-primary @else p-1 text-dark @endif"
|
||||
<a class="nav-link me-1 border-0 @if ($clientIndex == $currentClientIndex) active text-primary @else py-1 text-dark @endif"
|
||||
aria-current="page" href="#" wire:click="setCurrentClient({{ $clientIndex }})">
|
||||
<i class="bi bi-person-standing"></i>
|
||||
@if (array_key_exists($clientIndex, $clientLabels))
|
||||
{{ $clientLabels[$clientIndex] }}
|
||||
@else
|
||||
Контакт {{ $clientIndex + 1 }}
|
||||
@endif
|
||||
<span class="d-none d-xl-inline">
|
||||
@if (array_key_exists($clientIndex, $clientLabels))
|
||||
{{ $clientLabels[$clientIndex] }}
|
||||
@else
|
||||
Контакт {{ $clientIndex + 1 }}
|
||||
@endif
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
@endforeach
|
||||
@ -41,11 +40,11 @@ class="bi bi-person-fill-add" viewBox="0 0 16 16">
|
||||
</li>
|
||||
@endif
|
||||
</ul>
|
||||
<div class="bg-light border border-1 rounded-bottom-4 mb-2" style="margin-top:-1px">
|
||||
<div class="p-2">
|
||||
<div class="row mb-2">
|
||||
<div class="bg-light border border-1 rounded-bottom-4 mb-2 pb-2" style="margin-top:-1px">
|
||||
<div class="mt-3">
|
||||
<div class="row mx-2 g-2">
|
||||
<div class="col-12 col-xl-6">
|
||||
<div class="form-floating mb-3">
|
||||
<div class="form-floating mb-3 m-xl-0">
|
||||
<input wire:model.live="currentClient.firstName" id="currentClient.firstName"
|
||||
type="text"
|
||||
class="form-control rounded-4 @error('currentClient.firstName') is-invalid @enderror"
|
||||
@ -60,7 +59,7 @@ class="form-control rounded-4 @error('currentClient.firstName') is-invalid @ende
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-xl-6">
|
||||
<div class="form-floating mb-3">
|
||||
<div class="form-floating mb-3 m-xl-0">
|
||||
<input wire:model.live="currentClient.secondName" id="currentClient.secondName"
|
||||
type="text"
|
||||
class="form-control rounded-4 @error('currentClient.secondName') is-invalid @enderror"
|
||||
@ -75,9 +74,7 @@ class="form-control rounded-4 @error('currentClient.secondName') is-invalid @end
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@foreach ($currentClient['phones'] as $phoneKey => $phone)
|
||||
<div class="row my-1">
|
||||
@foreach ($currentClient['phones'] as $phoneKey => $phone)
|
||||
<div class="col-12 hstack gap-2">
|
||||
<div class="form-floating me-auto w-100">
|
||||
<input wire:model="currentClient.phone.{{ $phoneKey }}"
|
||||
@ -85,14 +82,16 @@ class="form-control rounded-4 @error('currentClient.secondName') is-invalid @end
|
||||
class="form-control rounded-4 @error('currentClient.phone.{{ $phoneKey }}') is-invalid @enderror"
|
||||
name="currentClient.phone.{{ $phoneKey }}" required autocomplete="phone"
|
||||
placeholder="Телефон клиента">
|
||||
<label for="currentClient.phone.{{ $phoneKey }}">Телефон</label>
|
||||
<label for="currentClient.phone.{{ $phoneKey }}">Телефон
|
||||
{{ count($currentClient['phones']) > 1 ? ' ' . ($phoneKey + 1) : '' }}</label>
|
||||
@error('currentClient.phone.{{ $phoneKey }}')
|
||||
<span class="invalid-feedback" role="alert">
|
||||
<strong>{{ $message }}</strong>
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
@if (count($currentClient['phones']) == $phoneKey + 1)
|
||||
@if (count($currentClient['phones']) == $phoneKey + 1 &&
|
||||
count($this->currentClient['phones']) < $this->maxClientPhonesCount)
|
||||
<a class="" href="#" wire:click="addPhoneForClient"
|
||||
title="Добавить еще один телефон для клиента">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30"
|
||||
@ -105,25 +104,28 @@ class="form-control rounded-4 @error('currentClient.phone.{{ $phoneKey }}') is-i
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
@endforeach
|
||||
<div class="col-12">
|
||||
@if ($currentClientIndex == 0 && count($clients) <= 2)
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" wire:click="toggleSecondClient" type="checkbox"
|
||||
role="switch" id="switchCheckChecked"
|
||||
@if (count($clients) == 2) checked @endif>
|
||||
<label class="form-check-label" for="switchCheckChecked">Добавить контакт
|
||||
супруга/супруги</label>
|
||||
</div>
|
||||
@endif
|
||||
@if ($currentClientIndex > 0)
|
||||
<div class="text-end">
|
||||
<a wire:click="deleteContact" class="text-primary"
|
||||
style="text-decoration: underline dotted;" href="#">
|
||||
Удалить контакт</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
@endforeach
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@if ($currentClientIndex == 0 && count($clients) <= 2)
|
||||
<div class="form-check form-switch mx-2 my-1">
|
||||
<input class="form-check-input" wire:click="toggleSecondClient" type="checkbox" role="switch"
|
||||
id="switchCheckChecked" @if (count($clients) == 2) checked @endif>
|
||||
<label class="form-check-label" for="switchCheckChecked">Добавить контакт
|
||||
супруга/супруги</label>
|
||||
</div>
|
||||
@endif
|
||||
@if ($currentClientIndex > 0)
|
||||
<div class="mx-3 pb-2 text-end">
|
||||
<a wire:click="deleteContact" class="text-primary" style="text-decoration: underline dotted;"
|
||||
href="#">
|
||||
Удалить контакт</a>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
<div class="form-floating mb-3">
|
||||
<select wire:model.live="client.complexId"
|
||||
|
||||
@ -3,14 +3,11 @@
|
||||
namespace Modules\Contracts\Http\Livewire;
|
||||
|
||||
use Livewire\Component;
|
||||
use Modules\Main\Models\Company\Company;
|
||||
use Modules\Main\Models\Complex;
|
||||
use Modules\Main\Models\Agent\Agent;
|
||||
use App\Models\Deal\Deal;
|
||||
use Modules\Contracts\Models\Contract;
|
||||
use App\Models\Deal\ContractStatus;
|
||||
use App\Models\User\UserRole;
|
||||
use App\Models\User\Role;
|
||||
use Modules\Contracts\Models\ContractStatus;
|
||||
use Modules\User\Models\UserRole;
|
||||
use Modules\User\Models\Role;
|
||||
use Modules\Main\Models\Company\CompanyAdmin;
|
||||
|
||||
class ContractsTableLivewire extends Component
|
||||
|
||||
@ -6,17 +6,14 @@
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
|
||||
use Modules\Main\Models\Company\Company;
|
||||
use App\Models\User;
|
||||
use App\Models\User\UserRole;
|
||||
use App\Models\User\Role;
|
||||
use Modules\User\Models\User;
|
||||
use Modules\User\Models\UserRole;
|
||||
use Modules\User\Models\Role;
|
||||
use App\Models\Deal\Deal;
|
||||
|
||||
use App\Notifications\AgentCreated;
|
||||
use Modules\Payment\Traits\Paymentable;
|
||||
use Modules\Bitrix\Traits\Bitrixable;
|
||||
|
||||
class Agent extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
@ -5,8 +5,8 @@
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
use App\Models\User\UserRole;
|
||||
use App\Models\User\Role;
|
||||
use Modules\User\Models\UserRole;
|
||||
use Modules\User\Models\Role;
|
||||
|
||||
class CompanyAdmin extends Model
|
||||
{
|
||||
|
||||
5
app/Modules/User/Config/config.php
Normal file
5
app/Modules/User/Config/config.php
Normal file
@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
];
|
||||
17
app/Modules/User/Http/Controllers/UserController.php
Normal file
17
app/Modules/User/Http/Controllers/UserController.php
Normal file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\User\Http\Controllers;
|
||||
|
||||
use Modules\User\Models\User;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class UserController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view('user::index');
|
||||
}
|
||||
}
|
||||
20
app/Modules/User/Http/Livewire/UserSelectorLivewire.php
Normal file
20
app/Modules/User/Http/Livewire/UserSelectorLivewire.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\User\Http\Livewire;
|
||||
|
||||
use Livewire\Component;
|
||||
use Modules\Main\Models\Agent\Agent;
|
||||
use Modules\Contracts\Models\Contract;
|
||||
use Modules\Contracts\Models\ContractStatus;
|
||||
use Modules\User\Models\UserRole;
|
||||
use Modules\User\Models\Role;
|
||||
use Modules\Main\Models\Company\CompanyAdmin;
|
||||
|
||||
class UserSelectorLivewire extends Component
|
||||
{
|
||||
public $search;
|
||||
public function render()
|
||||
{
|
||||
return view('user::livewire.search.selector');
|
||||
}
|
||||
}
|
||||
@ -1,17 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\User;
|
||||
namespace Modules\User\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Role extends Model
|
||||
{
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
public const SUPER_ADMIN = '1';
|
||||
public const SUPER_ADMIN = '1';
|
||||
public const COMPANY_ADMIN = '2';
|
||||
public const AGENT = '3';
|
||||
public const CLIENT = '4';
|
||||
public const AGENT = '3';
|
||||
public const CLIENT = '4';
|
||||
public const CITY_MANAGER = '5';
|
||||
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
namespace Modules\User\Models;
|
||||
|
||||
use Illuminate\Contracts\Auth\MustVerifyEmail;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
@ -10,7 +10,7 @@
|
||||
|
||||
use App\Models\ForcedPassword;
|
||||
class User extends Authenticatable
|
||||
{
|
||||
{
|
||||
use HasApiTokens, HasFactory, Notifiable, ForcedPassword;
|
||||
|
||||
/**
|
||||
@ -42,16 +42,16 @@ class User extends Authenticatable
|
||||
*/
|
||||
protected $casts = [
|
||||
'email_verified_at' => 'datetime',
|
||||
'password' => 'hashed',
|
||||
'password' => 'hashed',
|
||||
];
|
||||
|
||||
public function getPartialsName()
|
||||
{
|
||||
{
|
||||
$name = explode(' ', $this->name);
|
||||
return [
|
||||
'firstName' => (array_key_exists(0, $name) ? $name[0] : ''),
|
||||
'firstName' => (array_key_exists(0, $name) ? $name[0] : ''),
|
||||
'secondName' => (array_key_exists(1, $name) ? $name[1] : ''),
|
||||
'familyName' => (array_key_exists(2, $name) ? $name[2] : '')
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,11 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\User;
|
||||
namespace Modules\User\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use App\Models\User;
|
||||
use App\Models\User\Role;
|
||||
use Modules\User\Models\User;
|
||||
use Modules\User\Models\Role;
|
||||
|
||||
class UserRole extends Model
|
||||
{
|
||||
71
app/Modules/User/Providers/ModuleServiceProvider.php
Normal file
71
app/Modules/User/Providers/ModuleServiceProvider.php
Normal file
@ -0,0 +1,71 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\User\Providers;
|
||||
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Illuminate\Support\Facades\Blade;
|
||||
use Livewire\Livewire;
|
||||
|
||||
class ModuleServiceProvider extends ServiceProvider
|
||||
{
|
||||
protected string $moduleName = 'User';
|
||||
|
||||
public function register()
|
||||
{
|
||||
$this->app->register(RouteServiceProvider::class);
|
||||
}
|
||||
|
||||
public function boot()
|
||||
{
|
||||
$this->registerViews();
|
||||
$this->registerLivewireViews();
|
||||
$this->registerMigrations();
|
||||
$this->registerConfig();
|
||||
$this->registerComponent();
|
||||
$this->registerLivewire();
|
||||
}
|
||||
|
||||
protected function registerViews()
|
||||
{
|
||||
$moduleViewsPath = __DIR__ . '/../Views';
|
||||
$this->loadViewsFrom(
|
||||
$moduleViewsPath,
|
||||
strtolower($this->moduleName)
|
||||
);
|
||||
}
|
||||
|
||||
protected function registerLivewireViews()
|
||||
{
|
||||
$moduleViewsPath = __DIR__ . '/../Views/livewire';
|
||||
$this->loadViewsFrom(
|
||||
$moduleViewsPath,
|
||||
strtolower($this->moduleName)
|
||||
);
|
||||
}
|
||||
|
||||
protected function registerMigrations()
|
||||
{
|
||||
$this->loadMigrationsFrom(
|
||||
app_path('Modules/' . $this->moduleName . '/Database/Migrations')
|
||||
);
|
||||
}
|
||||
|
||||
protected function registerConfig()
|
||||
{
|
||||
$path = app_path('Modules/' . $this->moduleName . '/Config/config.php');
|
||||
$this->mergeConfigFrom(
|
||||
$path,
|
||||
strtolower($this->moduleName)
|
||||
);
|
||||
}
|
||||
|
||||
protected function registerLivewire()
|
||||
{
|
||||
Livewire::component('user-selector', \Modules\User\Http\Livewire\UserSelectorLivewire::class);
|
||||
}
|
||||
|
||||
protected function registerComponent()
|
||||
{
|
||||
//Blade::component('<name>', \Modules\<NAME>\Http\Components\<NAME>::class);
|
||||
}
|
||||
}
|
||||
24
app/Modules/User/Providers/RouteServiceProvider.php
Normal file
24
app/Modules/User/Providers/RouteServiceProvider.php
Normal file
@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\User\Providers;
|
||||
|
||||
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
class RouteServiceProvider extends ServiceProvider
|
||||
{
|
||||
|
||||
public function map()
|
||||
{
|
||||
$this->registerWebRoutes();
|
||||
}
|
||||
|
||||
protected function registerWebRoutes()
|
||||
{
|
||||
//Add Web Routes with web Guard
|
||||
Route::middleware('web')
|
||||
//Set Default Controllers Namespace
|
||||
->namespace('Modules\\User\\Http\\Controllers')
|
||||
->group(app_path('Modules/User/Routes/web.php'));
|
||||
}
|
||||
}
|
||||
13
app/Modules/User/Routes/web.php
Normal file
13
app/Modules/User/Routes/web.php
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Modules\User\Http\Controllers\UserController;
|
||||
|
||||
Route::middleware(['auth'])->group(function() {
|
||||
|
||||
Route::get('/user', [UserController::class, 'index']);
|
||||
|
||||
Route::middleware(['hasAccess'])->group(function() {
|
||||
/** Routes that need to be protected - Маршруты которые нужно защитить */
|
||||
});
|
||||
});
|
||||
4
app/Modules/User/Views/index.blade.php
Normal file
4
app/Modules/User/Views/index.blade.php
Normal file
@ -0,0 +1,4 @@
|
||||
@extends('layouts.app')
|
||||
@section('content')
|
||||
<h1> Example views </h1>
|
||||
@endsection
|
||||
22
app/Modules/User/Views/livewire/search/selector.blade.php
Normal file
22
app/Modules/User/Views/livewire/search/selector.blade.php
Normal file
@ -0,0 +1,22 @@
|
||||
<div>
|
||||
<div class="position-relative">
|
||||
<div class="position-relative">
|
||||
<div class="position-absolute top-20" style="left: 10px;top:20%">
|
||||
<i class="bi bi-search"></i>
|
||||
</div>
|
||||
<input type="text" wire:model.blur="search" class="form-control py-2" placeholder="Поиск пользователя..."
|
||||
autocomplete="false" style="padding-right: 40px; padding-left: 35px;">
|
||||
<div class="position-absolute" style="right: 10px;top:20%">
|
||||
<button wire:click="clearSearch" class="btn-close" type="button"></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="position-absolute w-100 z-3">
|
||||
<div class="border rounded shadow bg-light-subtle" style="width: inherit;">
|
||||
<div class="d-grid justify-content-center align-item-center p-3">
|
||||
<i class="bi bi-person fs-2 text-center"></i>
|
||||
<p class="mb-0 fs-6 fw-semibold">Пользователь не найден</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -13,8 +13,8 @@
|
||||
|
|
||||
*/
|
||||
|
||||
'defaults' => [
|
||||
'guard' => 'web',
|
||||
'defaults' => [
|
||||
'guard' => 'web',
|
||||
'passwords' => 'users',
|
||||
],
|
||||
|
||||
@ -35,9 +35,9 @@
|
||||
|
|
||||
*/
|
||||
|
||||
'guards' => [
|
||||
'guards' => [
|
||||
'web' => [
|
||||
'driver' => 'session',
|
||||
'driver' => 'session',
|
||||
'provider' => 'users',
|
||||
],
|
||||
],
|
||||
@ -59,10 +59,10 @@
|
||||
|
|
||||
*/
|
||||
|
||||
'providers' => [
|
||||
'providers' => [
|
||||
'users' => [
|
||||
'driver' => 'eloquent',
|
||||
'model' => App\Models\User::class,
|
||||
'model' => Modules\User\Models\User::class,
|
||||
],
|
||||
|
||||
// 'users' => [
|
||||
@ -90,11 +90,11 @@
|
||||
|
|
||||
*/
|
||||
|
||||
'passwords' => [
|
||||
'passwords' => [
|
||||
'users' => [
|
||||
'provider' => 'users',
|
||||
'table' => 'password_reset_tokens',
|
||||
'expire' => 60,
|
||||
'table' => 'password_reset_tokens',
|
||||
'expire' => 60,
|
||||
'throttle' => 60,
|
||||
],
|
||||
],
|
||||
|
||||
@ -45,6 +45,7 @@
|
||||
<div class="modal-dialog modal-dialog-centered">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Добавить клиента</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body" style="">
|
||||
|
||||
@ -7,16 +7,16 @@
|
||||
<div class="vstack">
|
||||
@foreach ($clients as $client)
|
||||
<?php
|
||||
$cities = [];
|
||||
$complexesNames = [];
|
||||
$filterRow = [];
|
||||
$clientDeals = $client->deals;
|
||||
foreach ($clientDeals as $deal) {
|
||||
$filterRow[] = 'filter[deal_id][]=' . $deal->id;
|
||||
$cities[] = $deal->complex->city->name;
|
||||
$complexesNames[] = $deal->complex->name;
|
||||
}
|
||||
$filterRow = implode('&', $filterRow);
|
||||
$cities = array_unique($cities);
|
||||
$cities = implode(', ', array: $cities);
|
||||
$complexesNames = array_unique($complexesNames);
|
||||
$complexesNames = implode(', ', array: $complexesNames);
|
||||
$dealsWithContracts = $client->deals()->whereHas('contract');
|
||||
?>
|
||||
|
||||
@ -27,7 +27,7 @@
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
{{ $cities }}
|
||||
{{ $complexesNames }}
|
||||
</div>
|
||||
|
||||
<div class="col-3 align-middle">
|
||||
|
||||
@ -36,6 +36,9 @@ class="list-group-item list-group-item-action p-3 bg-white rounded border border
|
||||
</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" style="min-height:30em;">
|
||||
<div class="h4 pb-2 mb-2 fw-bold ">
|
||||
<small>Добавить клиента</small>
|
||||
</div>
|
||||
<livewire:ClientCreator />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user