261 lines
13 KiB
PHP
261 lines
13 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use App\Http\Controllers\QrController;
|
|
|
|
class EstateController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
$filters = $request->only(['search', 'period', 'status', 'appraiser', 'purpose_id']);
|
|
$size = $request->get('size', 20);
|
|
|
|
$query = DB::table('estate_orders as o')
|
|
->selectRaw('o.*, o.ordered_customer as customer, CONCAT_WS(\' \', o.owner_last_name, o.owner_first_name, o.owner_patronymic) as owner')
|
|
->addSelect([
|
|
'purpose_uz' => DB::table('purposes')->select('uz')->whereColumn('id', 'o.purpose_id'),
|
|
'purpose_ru' => DB::table('purposes')->select('ru')->whereColumn('id', 'o.purpose_id'),
|
|
'purpose_cr' => DB::table('purposes')->select('cr')->whereColumn('id', 'o.purpose_id'),
|
|
'region_uz' => DB::table('regions')->select('uz')->whereColumn('id', 'o.region'),
|
|
'district_uz' => DB::table('districts')->select('uz')->whereColumn('id', 'o.district'),
|
|
])
|
|
->orderByDesc('o.id');
|
|
|
|
if (!empty($filters['search'])) {
|
|
$s = '%' . $filters['search'] . '%';
|
|
$query->where(function ($q) use ($s) {
|
|
$q->where('o.number', 'like', $s)->orWhere('o.ordered_customer', 'like', $s);
|
|
});
|
|
}
|
|
if (!empty($filters['status'])) $query->where('o.status', $filters['status']);
|
|
if (!empty($filters['purpose_id'])) $query->where('o.purpose_id', $filters['purpose_id']);
|
|
|
|
$rawOrders = $query->paginate($size)->withQueryString();
|
|
|
|
$orders = $rawOrders->through(function ($o) {
|
|
$o->purposeOne = (object)['uz' => $o->purpose_uz, 'ru' => $o->purpose_ru, 'cr' => $o->purpose_cr];
|
|
return $o;
|
|
});
|
|
|
|
$stats = DB::table('estate_orders')->selectRaw('status, count(*) as cnt')->groupBy('status')->pluck('cnt', 'status');
|
|
$purposeCases = DB::table('purposes')->get();
|
|
|
|
return view('estate.index', compact('orders', 'stats', 'filters', 'size', 'purposeCases'));
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
$purposeCases = DB::table('purposes')->get();
|
|
$regions = DB::table('regions')->get();
|
|
$districts = DB::table('districts')->get();
|
|
$concerns = DB::table('concerns')->get();
|
|
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->where('status', 'active')->get();
|
|
$dillers = DB::table('users')->whereRaw('LOWER(role) = ?', ['diller'])->where('status', 'active')->get();
|
|
return view('estate.create', compact('purposeCases', 'regions', 'districts', 'concerns', 'appraisers', 'dillers'));
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
if ($request->has('cost')) {
|
|
$request->merge(['cost' => preg_replace('/\D/', '', $request->cost)]);
|
|
}
|
|
|
|
$request->validate([
|
|
'number' => 'required',
|
|
'purpose_id' => 'required',
|
|
'ordered_customer' => 'required',
|
|
'customer_type' => 'required|in:physical,juridical',
|
|
'owner_type' => 'required|in:physical,juridical',
|
|
'name_of_object' => 'required',
|
|
'region' => 'required',
|
|
'district' => 'required',
|
|
'address' => 'required',
|
|
'cost' => 'required|numeric',
|
|
]);
|
|
|
|
$id = DB::table('estate_orders')->insertGetId([
|
|
'number' => $request->number,
|
|
'status' => $request->status ?? 'draft',
|
|
'purpose_id' => $request->purpose_id,
|
|
'diller_id' => $request->diller_id ?: null,
|
|
'ordered_customer' => $request->ordered_customer,
|
|
'ordered_customer_phone' => $request->ordered_customer_phone,
|
|
'customer_type' => $request->customer_type,
|
|
'customer_last_name' => $request->customer_last_name,
|
|
'customer_first_name' => $request->customer_first_name,
|
|
'customer_patronymic' => $request->customer_patronymic,
|
|
'customer_company' => $request->customer_company,
|
|
'owner_type' => $request->owner_type,
|
|
'owner_last_name' => $request->owner_last_name,
|
|
'owner_first_name' => $request->owner_first_name,
|
|
'owner_patronymic' => $request->owner_patronymic,
|
|
'owner_company' => $request->owner_company,
|
|
'contract_date' => $request->contract_date,
|
|
'name_of_object' => $request->name_of_object,
|
|
'region' => $request->region,
|
|
'district' => $request->district,
|
|
'address' => $request->address,
|
|
'home' => $request->home,
|
|
'area' => $request->area,
|
|
'overall_area' => $request->overall_area,
|
|
'usefull_area' => $request->usefull_area,
|
|
'live_area' => $request->live_area,
|
|
'cost' => (int)str_replace(',', '', $request->cost ?? 0),
|
|
'note' => $request->note,
|
|
'created_at' => $request->created_at ?? now(),
|
|
'updated_at' => now(),
|
|
]);
|
|
QrController::generateQr($id, 'estate_');
|
|
return redirect()->route('estate.show', $id);
|
|
}
|
|
|
|
public function edit($id)
|
|
{
|
|
$order = DB::table('estate_orders')->find($id);
|
|
$purposeCases = DB::table('purposes')->get();
|
|
$regions = DB::table('regions')->get();
|
|
$districts = DB::table('districts')->get();
|
|
$concerns = DB::table('concerns')->get();
|
|
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->where('status', 'active')->get();
|
|
$dillers = DB::table('users')->whereRaw('LOWER(role) = ?', ['diller'])->where('status', 'active')->get();
|
|
return view('estate.edit', compact('order', 'purposeCases', 'regions', 'districts', 'concerns', 'appraisers', 'dillers'));
|
|
}
|
|
|
|
public function update(Request $request, $id)
|
|
{
|
|
if ($request->has('cost')) {
|
|
$request->merge(['cost' => preg_replace('/\D/', '', $request->cost)]);
|
|
}
|
|
|
|
$request->validate([
|
|
'number' => 'required',
|
|
'purpose_id' => 'required',
|
|
'ordered_customer' => 'required',
|
|
'customer_type' => 'required|in:physical,juridical',
|
|
'owner_type' => 'required|in:physical,juridical',
|
|
'name_of_object' => 'required',
|
|
'region' => 'required',
|
|
'district' => 'required',
|
|
'address' => 'required',
|
|
'cost' => 'required|numeric',
|
|
]);
|
|
|
|
DB::table('estate_orders')->where('id', $id)->update([
|
|
'number' => $request->number,
|
|
'status' => $request->status,
|
|
'purpose_id' => $request->purpose_id,
|
|
'diller_id' => $request->diller_id ?: null,
|
|
'ordered_customer' => $request->ordered_customer,
|
|
'ordered_customer_phone' => $request->ordered_customer_phone,
|
|
'customer_type' => $request->customer_type,
|
|
'customer_last_name' => $request->customer_last_name,
|
|
'customer_first_name' => $request->customer_first_name,
|
|
'customer_patronymic' => $request->customer_patronymic,
|
|
'customer_company' => $request->customer_company,
|
|
'owner_type' => $request->owner_type,
|
|
'owner_last_name' => $request->owner_last_name,
|
|
'owner_first_name' => $request->owner_first_name,
|
|
'owner_patronymic' => $request->owner_patronymic,
|
|
'owner_company' => $request->owner_company,
|
|
'contract_date' => $request->contract_date,
|
|
'name_of_object' => $request->name_of_object,
|
|
'region' => $request->region,
|
|
'district' => $request->district,
|
|
'address' => $request->address,
|
|
'home' => $request->home,
|
|
'area' => $request->area,
|
|
'overall_area' => $request->overall_area,
|
|
'usefull_area' => $request->usefull_area,
|
|
'live_area' => $request->live_area,
|
|
'cost' => (int)str_replace(',', '', $request->cost ?? 0),
|
|
'note' => $request->note,
|
|
'created_at' => $request->created_at,
|
|
'updated_at' => now(),
|
|
]);
|
|
return redirect()->route('estate.show', $id);
|
|
}
|
|
|
|
public function show($order)
|
|
{
|
|
$order = DB::table('estate_orders as o')
|
|
->selectRaw('o.*, o.ordered_customer as customer, CONCAT_WS(\' \', o.owner_last_name, o.owner_first_name, o.owner_patronymic) as owner')
|
|
->addSelect([
|
|
'purpose_uz' => DB::table('purposes')->select('uz')->whereColumn('id', 'o.purpose_id'),
|
|
'purpose_ru' => DB::table('purposes')->select('ru')->whereColumn('id', 'o.purpose_id'),
|
|
'purpose_cr' => DB::table('purposes')->select('cr')->whereColumn('id', 'o.purpose_id'),
|
|
'region_uz' => DB::table('regions')->select('uz')->whereColumn('id', 'o.region'),
|
|
'district_uz' => DB::table('districts')->select('uz')->whereColumn('id', 'o.district'),
|
|
])
|
|
->where('o.id', $order)->first();
|
|
|
|
if ($order) {
|
|
$order->purposeOne = (object)['uz' => $order->purpose_uz, 'ru' => $order->purpose_ru, 'cr' => $order->purpose_cr];
|
|
$order->regions = DB::table('regions')->find($order->region);
|
|
$order->districts = DB::table('districts')->find($order->district);
|
|
$dillerUser = $order->diller_id ? DB::table('users')->find($order->diller_id) : null;
|
|
$order->diller = $dillerUser->name ?? '';
|
|
$order->dillerUser = $dillerUser;
|
|
}
|
|
|
|
$members = DB::table('order_members as om')
|
|
->leftJoin('users as u', 'u.id', '=', 'om.user_id')
|
|
->select('om.*', 'u.name', 'u.avatar', 'u.phone', 'u.role')
|
|
->where('om.order_id', $order->id ?? 0)->where('om.order_type', 'estate_')->get();
|
|
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->where('status', 'active')->get();
|
|
$isAppraisers = $members->where('user_id', auth()->id())->count() > 0;
|
|
$files = DB::table('files')->where('order_id', $order->id ?? 0)->where('order_type', 'estate_')->get();
|
|
$conclusions = DB::table('files')->where('order_id', $order->id ?? 0)->where('order_type', 'conclusion_')->get();
|
|
return view('estate.show', compact('order', 'members', 'appraisers', 'isAppraisers', 'files', 'conclusions'));
|
|
}
|
|
|
|
public function showActivities($order)
|
|
{
|
|
$order = DB::table('estate_orders')->find($order);
|
|
$actions = DB::table('tracking_actions')->where('order_id', $order->id ?? 0)->latest()->get();
|
|
return view('estate.show-activities', compact('order', 'actions'));
|
|
}
|
|
|
|
public function showTeam($order)
|
|
{
|
|
$order = DB::table('estate_orders')->find($order);
|
|
$members = DB::table('order_members as om')
|
|
->leftJoin('users as u', 'u.id', '=', 'om.user_id')
|
|
->select('om.*', 'u.name', 'u.avatar', 'u.phone', 'u.role')
|
|
->where('om.order_id', $order->id ?? 0)->where('om.order_type', 'estate_')->get()
|
|
->map(function ($member) {
|
|
$member->started = DB::table('order_members')->where('user_id', $member->user_id)->count();
|
|
$member->finished = 0;
|
|
$member->approved = 0;
|
|
$member->rejected = 0;
|
|
return $member;
|
|
});
|
|
$appraisers = DB::table('users')->whereRaw('LOWER(role) = ?', ['appraiser'])->where('status', 'active')->get();
|
|
return view('estate.show-team', compact('order', 'members', 'appraisers'));
|
|
}
|
|
|
|
public function showDocuments($order, Request $request)
|
|
{
|
|
$order = DB::table('estate_orders')->find($order);
|
|
$type = $request->get('type', 'ALL');
|
|
$filesQuery = DB::table('files')->where('order_id', $order->id ?? 0)->where('order_type', 'estate_');
|
|
if ($type !== 'ALL') {
|
|
$filesQuery->where('type', $type);
|
|
}
|
|
$files = $filesQuery->paginate(20)->withQueryString();
|
|
$allFiles = DB::table('files')->where('order_id', $order->id ?? 0)->where('order_type', 'estate_')->get();
|
|
$countDocs = $allFiles->whereIn('type', ['passport_customer', 'certificate', 'appraiser_certificate', 'insurance_policy', 'participate_certificate'])->count();
|
|
$countMediaFiles = $allFiles->whereIn('type', ['object_photo', 'object_files', 'compares'])->count();
|
|
$otherFiles = $allFiles->where('type', 'additional')->count();
|
|
$sizeInStorage = $allFiles->sum('size_in_bytes');
|
|
return view('estate.show-documents', compact('order', 'files', 'type', 'countDocs', 'countMediaFiles', 'otherFiles', 'sizeInStorage'));
|
|
}
|
|
|
|
public function orderClone($id)
|
|
{
|
|
return redirect()->route('estate.index');
|
|
}
|
|
}
|