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) { // Sanitize cost before validation if ($request->has('cost')) { $request->merge([ 'cost' => str_replace(',', '', $request->cost) ]); } $request->validate([ 'number' => 'required', 'purpose_id' => 'required', 'ordered_customer' => 'required', 'ordered_customer_phone' => 'required', 'customer_type' => 'required|in:physical,juridical', 'owner_type' => 'required|in:physical,juridical', 'name_of_object' => 'required', 'region' => 'required', 'district' => 'required', 'address' => 'required', 'tech_passport' => '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, 'tech_passport' => $request->tech_passport, 'tech_given_date' => $request->tech_given_date, 'tech_given_whom' => $request->tech_given_whom, '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) { // Sanitize cost before validation if ($request->has('cost')) { $request->merge([ 'cost' => str_replace(',', '', $request->cost) ]); } $request->validate([ 'number' => 'required', 'purpose_id' => 'required', 'ordered_customer' => 'required', 'ordered_customer_phone' => 'required', 'customer_type' => 'required|in:physical,juridical', 'owner_type' => 'required|in:physical,juridical', 'name_of_object' => 'required', 'region' => 'required', 'district' => 'required', 'address' => 'required', 'tech_passport' => '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, 'tech_passport' => $request->tech_passport, 'tech_given_date' => $request->tech_given_date, 'tech_given_whom' => $request->tech_given_whom, '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'); } }