обнвлена страница с договорами, добавлены фильтры

This commit is contained in:
Thekindbull 2025-08-17 15:56:28 +08:00
parent 043653df9c
commit aa802811f1
7 changed files with 130 additions and 41 deletions

View File

@ -44,6 +44,7 @@ public function syncDeals(Agent $agent)
$deals = json_decode($data, true); $deals = json_decode($data, true);
foreach ($deals as $deal) foreach ($deals as $deal)
{ {
$inDeal = $deal['deal'];//входящие данные по сделке
if (count($deal['contacts']) == 0) if (count($deal['contacts']) == 0)
{ {
continue; continue;
@ -62,7 +63,7 @@ public function syncDeals(Agent $agent)
} }
; ;
$dealItem = false; //собственный, не из битрикса $dealItem = false; //собственный, не из битрикса
$bitrixId = BitrixId::where('bx_id', $deal['deal']['deal_id']) $bitrixId = BitrixId::where('bx_id', $inDeal['deal_id'])
->where('bitrixable_type', Deal::class); ->where('bitrixable_type', Deal::class);
//Загрузка сделок //Загрузка сделок
if ($bitrixId->count() == 0) if ($bitrixId->count() == 0)
@ -80,8 +81,6 @@ public function syncDeals(Agent $agent)
$bitrixId = $bitrixId->first(); $bitrixId = $bitrixId->first();
$dealItem = Deal::find($bitrixId->bitrixable_id); $dealItem = Deal::find($bitrixId->bitrixable_id);
} }
;
$inDeal = $deal['deal'];//входящие данные по сделке
if ($dealItem) if ($dealItem)
{ {
$importedCount++; $importedCount++;

View File

@ -0,0 +1,16 @@
<?php
use Modules\Contracts\Models\ContractStatus;
if (!function_exists('GetContractStatuses'))
{
function GetContractStatuses()
{
return [
ContractStatus::NEW => ContractStatus::getName(ContractStatus::NEW),
ContractStatus::RESERVATION => ContractStatus::getName(ContractStatus::RESERVATION),
ContractStatus::SUCCESS => ContractStatus::getName(ContractStatus::SUCCESS),
ContractStatus::DECLINE => ContractStatus::getName(ContractStatus::DECLINE),
ContractStatus::TREATY => ContractStatus::getName(ContractStatus::TREATY),
];
}
}

View File

@ -10,10 +10,23 @@
class ContractsController extends Controller class ContractsController extends Controller
{ {
public function index() public function index(Request $request)
{ {
$mode = 'all';
$filter = [];
if ($request->exists('mode'))
{
$mode = $request->mode;
}
if ($request->exists('filter'))
{
$filter = $request->filter;
}
return view('contracts::index', [ return view('contracts::index', [
'status' => 'all' 'mode' => $mode,
'filter' => $filter
]); ]);
} }
@ -25,7 +38,6 @@ public function delete(Contract $contract)
if ($deal->delete()) if ($deal->delete())
{ {
return back()->with('success', 'Договор был успешно удален из базы данных'); return back()->with('success', 'Договор был успешно удален из базы данных');
} }
} }
return back()->withErrors('Не удалось корректно удалить договор и сделку. Попробуйте позже.'); return back()->withErrors('Не удалось корректно удалить договор и сделку. Попробуйте позже.');

View File

@ -15,6 +15,8 @@
class ContractsTableLivewire extends Component class ContractsTableLivewire extends Component
{ {
public $mode = false;
public $filter = [];
public function mount() public function mount()
{ {
@ -37,17 +39,48 @@ function getSelectingAgents()
return [$agent->id]; return [$agent->id];
} }
} }
public function render()
{
private function getContracts()
{
$contracts = Contract::whereHas('deal', function ($dealSubQuery) $contracts = Contract::whereHas('deal', function ($dealSubQuery)
{ {
$dealSubQuery->with('deals') $dealSubQuery->with('deals')
->whereIn('agent_id', $this->getSelectingAgents()); ->whereIn('agent_id', $this->getSelectingAgents());
}); });
$this->appendMode($contracts);
$this->appendFilter($contracts);
return $contracts->get();
}
private function appendMode(&$query)
{
if ($this->mode == 'active')
{
$query->whereIn('status', [
ContractStatus::NEW ,
ContractStatus::RESERVATION,
ContractStatus::SUCCESS,
]);
}
if ($this->mode == 'finished')
{
$query->whereIn('status', [
ContractStatus::DECLINE,
ContractStatus::TREATY
]);
}
}
private function appendFilter(&$query)
{
foreach ($this->filter as $fKey => $fValue)
{
$query->where($fKey, $fValue);
}
}
public function render()
{
return view('contracts::livewire.table.index', [ return view('contracts::livewire.table.index', [
'contracts' => $contracts->get(), 'contracts' => $this->getContracts(),
'statuses' => ContractStatus::class 'statuses' => ContractStatus::class
]); ]);
} }

View File

@ -23,6 +23,7 @@ public function boot()
$this->registerConfig(); $this->registerConfig();
$this->registerComponent(); $this->registerComponent();
$this->registerLivewire(); $this->registerLivewire();
$this->registerHelpers();
} }
protected function registerViews() protected function registerViews()
@ -69,4 +70,13 @@ protected function registerComponent()
{ {
//Blade::component('<name>', \Modules\<NAME>\Http\Components\<NAME>::class); //Blade::component('<name>', \Modules\<NAME>\Http\Components\<NAME>::class);
} }
protected function registerHelpers()
{
$files = glob(__DIR__ . '/../Helpers/' . "*.php");
foreach ($files as $key => $file)
{
require_once $file;
}
}
} }

View File

@ -5,7 +5,7 @@
Route::middleware(['auth'])->group(function () Route::middleware(['auth'])->group(function ()
{ {
Route::get('/contracts', [ContractsController::class, 'index'])->name('contracts'); Route::any('/contracts', [ContractsController::class, 'index'])->name('contracts');
Route::post('/contracts/{contract}/delete', [ContractsController::class, 'delete'])->name('contract.delete'); Route::post('/contracts/{contract}/delete', [ContractsController::class, 'delete'])->name('contract.delete');
}); });

View File

@ -1,29 +1,32 @@
@extends('layouts.app') @extends('layouts.app')
@section('content') @section('content')
<div> <form method="get" action="{{ Request::fullUrl() }}">
<form class="d-block d-md-flex mb-3" method="GET" action="{{ route('contracts') }}"> <div class="d-block d-md-flex mb-3">
<div class="border rounded-3 border-1 p-1 bg-white"> <div class="border rounded-3 border-1 p-1 bg-white">
<input type="radio" class="btn-check" name="status" value="active" id="option6" autocomplete="off" <input type="radio" class="btn-check" name="mode" value="all" id="mode_all" autocomplete="off"
onclick="this.form.submit()" {{ $status == 'active' ? 'checked' : '' }}> onclick="this.form.submit()" {{ $mode == 'all' ? 'checked' : '' }}>
<label class="btn p-2 fs-5" for="option6">Активные</label> <label class="btn p-2 fs-5" for="mode_all">Все</label>
<input type="radio" class="btn-check" name="status" value="finished" id="option7" autocomplete="off" <input type="radio" class="btn-check" name="mode" value="active" id="mode_active" autocomplete="off"
onclick="this.form.submit()" {{ $status == 'finished' ? 'checked' : '' }}> onclick="this.form.submit()" {{ $mode == 'active' ? 'checked' : '' }}>
<label class="btn p-2 fs-5" for="option7">Оконченные</label> <label class="btn p-2 fs-5" for="mode_active">Активные</label>
<input type="radio" class="btn-check" name="mode" value="finished" id="mode_finished"
autocomplete="off" onclick="this.form.submit()" {{ $mode == 'finished' ? 'checked' : '' }}>
<label class="btn p-2 fs-5" for="mode_finished">Оконченные</label>
</div> </div>
<div class="ms-auto hstack gap-2"> <div class="ms-auto hstack gap-2">
<button type="button" class="btn bg-white p-3 fw-bold border rounded-3 border-1" data-bs-toggle="modal" <button type="button" class="lh-1 btn bg-white p-3 fw-bold border rounded-3 border-1"
data-bs-target="#contractFilterModal"> data-bs-toggle="modal" data-bs-target="#contractFilterModal">
Фильтр <i class="bi bi-person-plus"></i> Фильтр
<span class="position-relative">
<i class="bi bi-person-plus"></i>
@if ($filter)
<span class="notices-badge animation-blink"></span>
@endif
</span>
</button> </button>
</div> </div>
</form>
</div>
<div>
@livewire('contracts.table')
</div>
<!-- Modal --> <!-- Modal -->
<div class="modal fade" id="contractFilterModal" tabindex="-1" aria-labelledby="contractFilterModalLabel" <div class="modal fade" id="contractFilterModal" tabindex="-1" aria-labelledby="contractFilterModalLabel"
aria-hidden="true"> aria-hidden="true">
@ -34,6 +37,14 @@
</div> </div>
<div class="modal-body" style=""> <div class="modal-body" style="">
<div class="mb-3">
<label for="statusFilter" class="form-label">Статус</label>
<select class="form-select" name="filter[status]" id="statusFilter">
@foreach ($statuses = GetContractStatuses() as $key => $status)
<option value="{{ $key }}">{{ $status }}</option>
@endforeach
</select>
</div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
@ -42,4 +53,12 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</form>
<div>
@livewire('contracts.table', [
'mode' => $mode,
'filter' => $filter,
])
</div>
@endsection @endsection