Обновлен способ вывода главного меню.

Обновлена обработка проверки на уникальность из битрикса
This commit is contained in:
developer 2025-12-09 09:11:33 +08:00
parent fc2e050ac6
commit 59bdd07bc0
13 changed files with 147 additions and 63 deletions

View File

@ -12,6 +12,7 @@
use Modules\Main\Models\Company\CompanyAdmin; use Modules\Main\Models\Company\CompanyAdmin;
use Modules\Main\Models\Deal\Deal; use Modules\Main\Models\Deal\Deal;
use Modules\Main\Models\Deal\DealStatus; use Modules\Main\Models\Deal\DealStatus;
use Modules\CityManager\Models\CityManager;
use Livewire\Attributes\On; use Livewire\Attributes\On;
@ -37,13 +38,21 @@ public function getDeals()
$clients = false; $clients = false;
$user = auth()->user(); $user = auth()->user();
if ($admin = CompanyAdmin::where('user_id', $user->id)->first()) if($cityManager = CityManager::where('user_id', auth()->id())->first()) {
{ $companies = $cityManager->city->companies->pluck('id');
$deals = Deal::whereIn('agent_id', function ($query) use ($admin) $deals = Deal::whereIn('agent_id', function ($query) use ($companies)
{ {
$query->select('id'); $query->select('id');
$query->from('agents'); $query->from('agents');
$query->where('company_id', $admin->company_id); $query->whereIn('company_id', $companies);
});
}
else if ($company = AdminCompanyOfUser()) {
$deals = Deal::whereIn('agent_id', function ($query) use ($company)
{
$query->select('id');
$query->from('agents');
$query->where('company_id', $company->id);
}); });
} }
elseif ($agent = Agent::where('user_id', $user->id)->first()) elseif ($agent = Agent::where('user_id', $user->id)->first())
@ -53,26 +62,24 @@ public function getDeals()
if (!$deals) { if (!$deals) {
return Client::where('id',0); return Client::where('id',0);
} }
$deals = $deals->pluck('id'); return $deals;
}
function getClients()
{
$deals = $this->getDeals();
$clients = Client::join('deal_clients', 'users.id', '=', 'deal_clients.client_id') $clients = Client::join('deal_clients', 'users.id', '=', 'deal_clients.client_id')
->whereIn('users.id', function ($query) use ($deals) ->whereIn('users.id', function ($query) use ($deals)
{ {
$query->select('client_id') $query->select('client_id')
->from('deal_clients') ->from('deal_clients')
->whereIn('deal_id', $deals); ->whereIn('deal_id', $deals->get()->pluck('id'));
}) })
->orderBy('deal_clients.id', 'desc') ->orderBy('deal_clients.id', 'desc')
->with('deals'); ->with('deals');
; ;
$clients = $clients->select('users.*'); $clients = $clients->select('users.*');
$clients = $clients->orderBy('name'); $clients = $clients->orderBy('name');
return $clients;
}
function getClients()
{
$clients = $this->getDeals();
if ($this->status && $this->status == DealStatus::UNIQUE) if ($this->status && $this->status == DealStatus::UNIQUE)
{ {

View File

@ -21,22 +21,20 @@ class BitrixApiController extends Controller
public const ACTION_CONFIRM_COMPANY = 'confirm_company'; public const ACTION_CONFIRM_COMPANY = 'confirm_company';
public function index(Request $request) public function index(Request $request)
{ {
if ($deal = Deal::where('confirm_token', $request->hash)->first())
{
switch ( $request->action ) switch ( $request->action )
{ {
case $this::ACTION_CONFIRM_DEAL: case $this::ACTION_CONFIRM_DEAL:
$deal = Deal::where('confirm_token', $request->token)->first();
$this->confirmDeal($deal, $request); $this->confirmDeal($deal, $request);
break; break;
case $this::ACTION_UPDATE_CONTRACT: case $this::ACTION_UPDATE_CONTRACT:
$deal = Deal::where('confirm_token', $request->token)->first();
$this->updateContract($deal, $request); $this->updateContract($deal, $request);
break; break;
case $this::ACTION_CONFIRM_COMPANY: case $this::ACTION_CONFIRM_COMPANY:
$this->confirmCompany($request); $this->confirmCompany($request);
break; break;
} }
return true;
}
return false; return false;
} }
@ -48,7 +46,7 @@ public function confirmCompany(Request $request)
public function confirmDeal(Deal $deal, Request $request) public function confirmDeal(Deal $deal, Request $request)
{ {
$agent = $deal->agent; $agent = $deal->agent;
if ((bool) $request->is_unique) if ((bool) $request->is_unique == true)
{ {
$deal->status = DealStatus::UNIQUE; $deal->status = DealStatus::UNIQUE;
$agent->user->notify(new UniqueContact($deal)); $agent->user->notify(new UniqueContact($deal));

View File

@ -13,6 +13,7 @@ class SendDeal extends BitrixSender
public function __construct(Deal $deal) public function __construct(Deal $deal)
{ {
$this->data = [ $this->data = [
'token' => $deal->confirm_token,
'complexName' => $deal->complex->name 'complexName' => $deal->complex->name
]; ];
} }

View File

@ -20,5 +20,8 @@ protected function registerWebRoutes()
//Set Default Controllers Namespace //Set Default Controllers Namespace
->namespace('Modules\\Bitrix\\Http\\Controllers') ->namespace('Modules\\Bitrix\\Http\\Controllers')
->group(app_path('Modules/Bitrix/Routes/web.php')); ->group(app_path('Modules/Bitrix/Routes/web.php'));
Route::middleware('api')
->prefix('api')
->group(base_path('Modules/Bitrix/Routes/api.php'));
} }
} }

View File

@ -0,0 +1,24 @@
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Modules\Bitrix\Http\Controllers\BitrixApiController;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "api" middleware group. Make something great!
|
*/
Route::middleware('auth:sanctum')->get('/user', function (Request $request)
{
return $request->user();
});
Route::get('/action', [BitrixApiController::class, 'index']);

View File

@ -8,6 +8,7 @@
use Modules\Contracts\Models\ContractStatus; use Modules\Contracts\Models\ContractStatus;
use Modules\User\Models\UserRole; use Modules\User\Models\UserRole;
use Modules\User\Models\Role; use Modules\User\Models\Role;
use Modules\CityManager\Models\CityManager;
use Modules\Main\Models\Company\CompanyAdmin; use Modules\Main\Models\Company\CompanyAdmin;
class ContractsTableLivewire extends Component class ContractsTableLivewire extends Component
@ -18,23 +19,25 @@ public function mount()
{ {
} }
/**
* Get array of available agents ids
* @return array
*/
function getSelectingAgents() function getSelectingAgents()
{ {
if ( if($cityManager = CityManager::where('user_id', auth()->id())->first()) {
$userRole = return $agentsIds = Agent::whereIn('company_id',$cityManager->city->companies->pluck('id'))->pluck('id');
UserRole::where('user_id', auth()->id()) }
->where('role_id', Role::COMPANY_ADMIN) elseif ($company = AdminCompanyOfUser())
->count() == 1
)
{ {
$companyAdmin = CompanyAdmin::where('user_id', auth()->id())->first(); $companyAdmin = CompanyAdmin::where('user_id', auth()->id())->first();
return $agentsIds = Agent::where('company_id', $companyAdmin->company_id)->pluck('id'); return $agentsIds = Agent::where('company_id',$company->id)->pluck('id');
} }
else elseif ($agent = Agent::where('user_id', auth()->id())->first())
{ {
$agent = Agent::where('user_id', auth()->id())->first();
return [$agent->id]; return [$agent->id];
} }
return [];
} }
private function getContracts() private function getContracts()

View File

@ -50,11 +50,14 @@ class="bi bi-arrow-right" viewBox="0 0 16 16">
{{ __('contracts.status_' . $contract->status) }} {{ __('contracts.status_' . $contract->status) }}
</div> </div>
</div> </div>
<div class="col col-md-6"> @if($contract->updated_at)
<div class="fs-6 text-secondary">Дата обновления</div> <div class="col col-md-6">
<div class="fw-bold fs-5 text-truncate text-dark-emphasis"> <div class="fs-6 text-secondary">Дата обновления</div>
{{ $contract->updated_at->format('d.m.y H:i') }}</div> <div class="fw-bold fs-5 text-truncate text-dark-emphasis">
</div> {{ $contract->updated_at?->format('d.m.y H:i') }}
</div>
</div>
@endif
</div> </div>
<div class="row my-4"> <div class="row my-4">
@if ($contract->square) @if ($contract->square)
@ -86,12 +89,13 @@ class="bi bi-arrow-right" viewBox="0 0 16 16">
</div> </div>
</div> </div>
</div> </div>
@if ($contract->status == 'SUCCESS') @if ($contract->status == 'SUCCESS')
<div class="col col-md-6"> <div class="col col-md-6">
<div class="fs-6 text-secondary">Вознаграждение</div> <div class="fs-6 text-secondary">Вознаграждение</div>
<div class="fw-bold fs-5 text-truncate text-dark-emphasis"> <div class="fw-bold fs-5 text-truncate text-dark-emphasis">
{{ number_format(GetAgentPaymentForContract($contract), 2, ',', ' ') }}</div> {{ number_format(GetAgentPaymentForContract($contract), 2, ',', ' ') }}
</div> </div>
</div>
@endif @endif
</div> </div>
@ -171,8 +175,7 @@ class="bi bi-record-circle-fill align-middle" viewBox="0 0 16 16">
<!-- Modal --> <!-- Modal -->
<div class="modal fade" id="contractCommentModal" tabindex="-1" aria-labelledby="exampleModalLabel" <div class="modal fade" id="contractCommentModal" tabindex="-1" aria-labelledby="exampleModalLabel"
aria-hidden="true"> aria-hidden="true">
<form class="modal-dialog" method="post" <form class="modal-dialog" method="post" action="{{ route('contract.comment', ['contract' => $contract]) }}">
action="{{ route('contract.comment', ['contract' => $contract]) }}">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalLabel">Комментарий к договору</h1> <h1 class="modal-title fs-5" id="exampleModalLabel">Комментарий к договору</h1>
@ -182,7 +185,8 @@ class="bi bi-record-circle-fill align-middle" viewBox="0 0 16 16">
@csrf @csrf
<div class="mb-3"> <div class="mb-3">
<label for="contractComment" class="form-label">Ваш комментарий</label> <label for="contractComment" class="form-label">Ваш комментарий</label>
<textarea class="form-control" id="contractComment" name="comment" rows="3">{{ $contract->comment }}</textarea> <textarea class="form-control" id="contractComment" name="comment"
rows="3">{{ $contract->comment }}</textarea>
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
@ -223,10 +227,10 @@ class="bi bi-record-circle-fill align-middle" viewBox="0 0 16 16">
<script> <script>
var images = document.querySelectorAll(".zoomable-container"); var images = document.querySelectorAll(".zoomable-container");
Array.prototype.forEach.call(images, function(img) { Array.prototype.forEach.call(images, function (img) {
// Do stuff here // Do stuff here
img.addEventListener('click', function() { img.addEventListener('click', function () {
console.log(img.classList.contains('zoomed')); console.log(img.classList.contains('zoomed'));
if (!img.classList.contains('zoomed')) { if (!img.classList.contains('zoomed')) {
img.classList.add('zoomed'); img.classList.add('zoomed');
@ -237,4 +241,4 @@ class="bi bi-record-circle-fill align-middle" viewBox="0 0 16 16">
}); });
}); });
</script> </script>
@endsection @endsection

View File

@ -52,7 +52,7 @@ function GetAvailableAgents()
} }
$agents->with('company:id,name'); $agents->with('company:id,name');
$agents->with('user:id,name'); $agents->with('user:id,name');
return $agents->get()->toArray(); return $agents->get();
} }
} }
@ -73,7 +73,7 @@ function GetAvailableComplexes()
} }
} }
if ($complexes) { if ($complexes) {
return $complexes->get()->toArray(); return $complexes->get();
} }
return []; return [];
} }
@ -95,6 +95,6 @@ function GetAvailableCities()
} }
$agents->with('company:id,name'); $agents->with('company:id,name');
$agents->with('user:id,name'); $agents->with('user:id,name');
return $agents->get()->toArray(); return $agents->get();
} }
} }

View File

@ -18,6 +18,27 @@ public function create(User $user): bool
} }
return false; return false;
} }
public function editAgentsTable(User $user): bool
{
dd(111);
if (UserRole::where('user_id', $user->id)->where('role_id', Role::COMPANY_ADMIN)->count() == 1)
{
return true;
}
return false;
}
public function editClientsTable(User $user): bool
{
if (UserRole::where('user_id', $user->id)->where('role_id', Role::COMPANY_ADMIN)->count() == 1)
{
return true;
}
if (UserRole::where('user_id', $user->id)->where('role_id', Role::CITY_MANAGER)->count() == 1)
{
return true;
}
return false;
}
public function update(User $user, Company $company): bool public function update(User $user, Company $company): bool
{ {
if (UserRole::where('user_id', $user->id)->where('role_id', Role::SUPER_ADMIN)->count() == 1) if (UserRole::where('user_id', $user->id)->where('role_id', Role::SUPER_ADMIN)->count() == 1)

View File

@ -5,6 +5,7 @@
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
use Modules\Main\Models\Company\Company;
class City extends Model class City extends Model
{ {
use HasFactory; use HasFactory;
@ -13,4 +14,9 @@ class City extends Model
protected $fillable = [ protected $fillable = [
'name' 'name'
]; ];
public function companies()
{
return $this->hasMany(Company::class);
}
} }

View File

@ -12,6 +12,10 @@
use Modules\Main\Models\Complex; use Modules\Main\Models\Complex;
use Modules\Main\Models\Agent\Agent; use Modules\Main\Models\Agent\Agent;
use Modules\Bitrix\Traits\Bitrixable; use Modules\Bitrix\Traits\Bitrixable;
use App\Notifications\Deal\DealCreated;
use App\Notifications\Deal\DealUnique;
use App\Notifications\Deal\DealNotUnique;
class Deal extends Model class Deal extends Model
{ {
use HasFactory, Notifiable, Bitrixable; use HasFactory, Notifiable, Bitrixable;
@ -56,10 +60,24 @@ public function contract()
protected static function booted(): void protected static function booted(): void
{ {
static::creating(function (Deal $deal) static::creating(function (Deal $deal) {
{
$deal->confirm_token = hash('sha256', json_encode($deal->all())); $deal->confirm_token = hash('sha256', json_encode($deal->all()));
}); });
static::created(function (Deal $deal) {
$deal->notify(new DealCreated());
});
static::updated(function (Deal $deal) {
if ($deal->wasChanged('status')) {
switch ($deal->status) {
case DealStatus::UNIQUE:
$deal->notify(new DealUnique());
break;
case DealStatus::NOT_UNIQUE:
$deal->notify(new DealNotUnique());
break;
}
}
});
} }

View File

@ -72,6 +72,10 @@ public function hasRole($roleId)
return false; return false;
} }
public function isCompanyAdmin()
{
return $this->hasRole(Role::COMPANY_ADMIN);
}
public function isAdmin() public function isAdmin()
{ {
return $this->hasRole(Role::SUPER_ADMIN); return $this->hasRole(Role::SUPER_ADMIN);

View File

@ -1,6 +1,6 @@
<?php <?php
$items = []; $items = [];
if (in_array($roles::AGENT, $userRoles) || in_array($roles::COMPANY_ADMIN, $userRoles)) { if (auth()->user()->hasRole($roles::AGENT) || auth()->user()->hasRole($roles::COMPANY_ADMIN) || auth()->user()->hasRole($roles::CITY_MANAGER)) {
$items[] = [ $items[] = [
'target' => 'route', 'target' => 'route',
'route' => 'home', 'route' => 'home',
@ -8,8 +8,6 @@
'icon' => 'columns-gap', 'icon' => 'columns-gap',
'primary_on_mobile' => true, 'primary_on_mobile' => true,
]; ];
}
if (in_array($roles::AGENT, $userRoles) || in_array($roles::COMPANY_ADMIN, $userRoles)) {
$items[] = [ $items[] = [
'target' => 'route', 'target' => 'route',
'route' => 'clients.table', 'route' => 'clients.table',
@ -17,7 +15,6 @@
'icon' => 'person', 'icon' => 'person',
'primary_on_mobile' => false, 'primary_on_mobile' => false,
]; ];
$items[] = [ $items[] = [
'target' => 'route', 'target' => 'route',
'route' => 'contracts', 'route' => 'contracts',
@ -25,7 +22,6 @@
'icon' => 'files-alt', 'icon' => 'files-alt',
'primary_on_mobile' => true, 'primary_on_mobile' => true,
]; ];
$items[] = [ $items[] = [
'target' => 'modal', 'target' => 'modal',
'modal' => '#plan7Modal', 'modal' => '#plan7Modal',
@ -35,14 +31,7 @@
]; ];
} }
$items[] = [ if (auth()->user()->hasRole($roles::COMPANY_ADMIN) || auth()->user()->hasRole($roles::CITY_MANAGER)) {
'target' => 'route',
'route' => 'posts',
'name' => 'Новости',
'icon' => 'layers',
];
if (in_array($roles::COMPANY_ADMIN, $userRoles)) {
$items[] = [ $items[] = [
'target' => 'route', 'target' => 'route',
'route' => 'company.agents.table', 'route' => 'company.agents.table',
@ -51,6 +40,13 @@
]; ];
} }
$items[] = [
'target' => 'route',
'route' => 'posts',
'name' => 'Новости',
'icon' => 'layers',
];
$items[] = [ $items[] = [
'target' => 'route', 'target' => 'route',
'route' => 'docs.index', 'route' => 'docs.index',
@ -67,8 +63,7 @@
'icon' => 'gear', 'icon' => 'gear',
]; ];
} }
if (auth()->user()->hasRole($roles::SUPER_ADMIN) || auth()->user()->hasRole($roles::CITY_MANAGER)) {
if (in_array($roles::SUPER_ADMIN, $userRoles)) {
$items[] = [ $items[] = [
'target' => 'route', 'target' => 'route',
'route' => 'admin.index', 'route' => 'admin.index',