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

Обновлена обработка проверки на уникальность из битрикса
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\Deal\Deal;
use Modules\Main\Models\Deal\DealStatus;
use Modules\CityManager\Models\CityManager;
use Livewire\Attributes\On;
@ -37,13 +38,21 @@ public function getDeals()
$clients = false;
$user = auth()->user();
if ($admin = CompanyAdmin::where('user_id', $user->id)->first())
{
$deals = Deal::whereIn('agent_id', function ($query) use ($admin)
if($cityManager = CityManager::where('user_id', auth()->id())->first()) {
$companies = $cityManager->city->companies->pluck('id');
$deals = Deal::whereIn('agent_id', function ($query) use ($companies)
{
$query->select('id');
$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())
@ -53,26 +62,24 @@ public function getDeals()
if (!$deals) {
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')
->whereIn('users.id', function ($query) use ($deals)
{
$query->select('client_id')
->from('deal_clients')
->whereIn('deal_id', $deals);
->whereIn('deal_id', $deals->get()->pluck('id'));
})
->orderBy('deal_clients.id', 'desc')
->with('deals');
;
$clients = $clients->select('users.*');
$clients = $clients->orderBy('name');
return $clients;
}
function getClients()
{
$clients = $this->getDeals();
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 function index(Request $request)
{
if ($deal = Deal::where('confirm_token', $request->hash)->first())
{
switch ( $request->action )
{
case $this::ACTION_CONFIRM_DEAL:
$deal = Deal::where('confirm_token', $request->token)->first();
$this->confirmDeal($deal, $request);
break;
case $this::ACTION_UPDATE_CONTRACT:
$deal = Deal::where('confirm_token', $request->token)->first();
$this->updateContract($deal, $request);
break;
case $this::ACTION_CONFIRM_COMPANY:
$this->confirmCompany($request);
break;
}
return true;
}
return false;
}
@ -48,7 +46,7 @@ public function confirmCompany(Request $request)
public function confirmDeal(Deal $deal, Request $request)
{
$agent = $deal->agent;
if ((bool) $request->is_unique)
if ((bool) $request->is_unique == true)
{
$deal->status = DealStatus::UNIQUE;
$agent->user->notify(new UniqueContact($deal));

View File

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

View File

@ -20,5 +20,8 @@ protected function registerWebRoutes()
//Set Default Controllers Namespace
->namespace('Modules\\Bitrix\\Http\\Controllers')
->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\User\Models\UserRole;
use Modules\User\Models\Role;
use Modules\CityManager\Models\CityManager;
use Modules\Main\Models\Company\CompanyAdmin;
class ContractsTableLivewire extends Component
@ -18,23 +19,25 @@ public function mount()
{
}
/**
* Get array of available agents ids
* @return array
*/
function getSelectingAgents()
{
if (
$userRole =
UserRole::where('user_id', auth()->id())
->where('role_id', Role::COMPANY_ADMIN)
->count() == 1
)
if($cityManager = CityManager::where('user_id', auth()->id())->first()) {
return $agentsIds = Agent::whereIn('company_id',$cityManager->city->companies->pluck('id'))->pluck('id');
}
elseif ($company = AdminCompanyOfUser())
{
$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 [];
}
private function getContracts()

View File

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

View File

@ -52,7 +52,7 @@ function GetAvailableAgents()
}
$agents->with('company:id,name');
$agents->with('user:id,name');
return $agents->get()->toArray();
return $agents->get();
}
}
@ -73,7 +73,7 @@ function GetAvailableComplexes()
}
}
if ($complexes) {
return $complexes->get()->toArray();
return $complexes->get();
}
return [];
}
@ -95,6 +95,6 @@ function GetAvailableCities()
}
$agents->with('company: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;
}
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
{
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\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Modules\Main\Models\Company\Company;
class City extends Model
{
use HasFactory;
@ -13,4 +14,9 @@ class City extends Model
protected $fillable = [
'name'
];
public function companies()
{
return $this->hasMany(Company::class);
}
}

View File

@ -12,6 +12,10 @@
use Modules\Main\Models\Complex;
use Modules\Main\Models\Agent\Agent;
use Modules\Bitrix\Traits\Bitrixable;
use App\Notifications\Deal\DealCreated;
use App\Notifications\Deal\DealUnique;
use App\Notifications\Deal\DealNotUnique;
class Deal extends Model
{
use HasFactory, Notifiable, Bitrixable;
@ -56,10 +60,24 @@ public function contract()
protected static function booted(): void
{
static::creating(function (Deal $deal)
{
static::creating(function (Deal $deal) {
$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;
}
public function isCompanyAdmin()
{
return $this->hasRole(Role::COMPANY_ADMIN);
}
public function isAdmin()
{
return $this->hasRole(Role::SUPER_ADMIN);

View File

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