modelCustomer = $modelCustomer; $this->modelAgent = $modelAgent; $this->modelAgentUser = $modelAgentUser; } /** * Summary of createCustomer * @param array $input * @return array */ public function createCustomer($input) { // format data input $dataInput = $this->formatCreateCustomer($input); // check agent user with code input $checkAgentUser = $this->modelAgentUser->where('code', $dataInput['agents_code'])->first(); $now = Carbon::now(); if (empty($checkAgentUser)) { return array('status' => false, 'msg' => $this->getMessageReturn('no_data_agent')); } $agentId = $checkAgentUser->agent_id; \DB::beginTransaction(); try { $dataInsert = Arr::except($dataInput, ['agents_code']); // remove agents_code array $dateNotToo = Carbon::now()->subDays(self::DISTANCE_DAY_DEFAULT); $customerAgent = $this->modelCustomer->where('agent_id', $agentId)->where('phone', $dataInput['phone'])->latest()->first(); // tìm các dữ liệu từ ngày hiện tại trừ đi không được quá 15 ngày $customerAgentAll = $this->modelCustomer->where('phone', $dataInput['phone'])->where('agent_id', '<>', $agentId)->where('created_at', '>=', $dateNotToo)->latest()->first(); $dataInsert['created_at'] = now(); if (!empty($customerAgentAll)) { // chưa quá 15 ngày thì lấy cái agent_id cũ, đang trực thuộc $dataInsert['agent_id'] = $customerAgentAll->agent_id; $result = $this->modelCustomer->insert($dataInsert); } else { // quá 15 ngày thì lấy agent_id check ra từ mã đại lý $dataInsert['agent_id'] = $agentId; $result = $this->modelCustomer->insert($dataInsert); // nếu agent id cũ != cái hiện tại check $this->modelCustomer->where('phone', $dataInput['phone'])->where('agent_id', '<>', $agentId)->delete(); } \DB::commit(); return ['status' => true, 'msg' => $this->getMessageReturn('success_insert_customer')]; } catch (\Exception $e) { \DB::rollBack(); } return ['status' => false, 'msg' => $this->getMessageReturn('failed_insert')]; } /** * Summary of myCustomer * @param array $input * @return array */ public function myCustomer($input) { $listCustomer = []; $finalAgentData = []; $myAgent = $this->modelAgentUser->where('user_id', auth()->user()->id)->latest()->first(); if (empty($myAgent) || empty($myAgent->agent_id)) { return ['status' => false, 'msg' => $this->getMessageReturn('no_data_agent')]; } $agentId = $myAgent->agent_id; $queryAgent = $this->modelCustomer->where('agent_id', $agentId); if (!empty($input['start_date']) && !empty($input['end_date'])) { $startDate = Carbon::createFromFormat('Y-m-d', $input['start_date']); $endDate = Carbon::createFromFormat('Y-m-d', $input['end_date'])->addDay(); $queryAgent->whereBetween('created_at', [$startDate->toDateString(), $endDate->toDateString()]); } if (!empty($input['keyword'])) { $queryAgent->where('name', 'LIKE', '%' . $input['keyword'] . '%') ->orWhere('phone', 'LIKE', '%' . $input['keyword'] . '%') ->orWhere('email', 'LIKE', '%' . $input['keyword'] . '%'); ; } // dd($queryAgent->toSql(),$queryAgent->getBindings()); $listCustomer = $queryAgent->orderBy('created_at', 'desc')->get(); if (!empty($listCustomer)) { foreach ($listCustomer as $listC) { $finalAgentData[] = [ 'id' => $listC->id ?? '', 'guest_name' => $listC->name ?? '', 'phone' => $listC->phone ?? '', 'email' => $listC->email ?? '', 'grade' => $listC->grade ?? '', 'date_receive' => $listC->created_at ?? '', 'message' => $listC->msg ?? '' ]; } } return ['status' => true, 'data' => $finalAgentData, 'msg' => $this->getMessageReturn('success')]; } /** * Summary of listAgentOfGeneral * @param mixed $input * @return array */ public function listAgentOfGeneral($input) { $data = []; $myAgent = $this->modelAgentUser->where('user_id', auth()->user()->id)->latest()->first(); if (empty($myAgent) || empty($myAgent->agent_id)) { return ['status' => false, 'msg' => $this->getMessageReturn('no_data_agent')]; } else { $myAgentInfo = $this->modelAgent->find($myAgent->agent_id); if (empty($myAgentInfo)) { return ['status' => false, 'msg' => $this->getMessageReturn('no_agent')]; } } $agentId = $myAgentInfo->id; $myAgentDown = $this->modelAgentUser->byAgentRoot($agentId)->joinAgent(); if (!empty($input['start_date']) && !empty($input['end_date'])) { $startDate = Carbon::createFromFormat('Y-m-d', $input['start_date']); $endDate = Carbon::createFromFormat('Y-m-d', $input['end_date'])->addDay(); $myAgentDown->betweenDates($startDate->toDateString(), $endDate->toDateString()); } if (!empty($input['keyword'])) { $myAgentDown->searchAgentName($input['keyword']); } if (!empty($input['grant'])) { $myAgentDown->onlyGrant($input['grant']); } $listAgentGet = $myAgentDown->get(); if (!empty($listAgentGet)) { $listAgentById = []; foreach ($listAgentGet as $kAgent) { // get parent id by path $kAgent->grant_parent_id = $this->getParentAgent($kAgent->parent_path); $listAgentById[$kAgent->agent_id] = $kAgent; } } $finalDataTemp = []; if (!empty($listAgentById)) { foreach ($listAgentById as $vByAgent) { if (!empty($listAgentById[$vByAgent->grant_parent_id])) { $agentParent = $listAgentById[$vByAgent->grant_parent_id]; $upGrant = $agentParent->code ?? null; } if ($agentId == $vByAgent->agent_id) continue; // skip agent root if (!empty($input['up_grant'])) { // if existing up_geant if ($upGrant != $input['up_grant']) continue; // skip } $finalDataTemp[] = [ 'id' => $vByAgent->id ?? '', 'name' => $vByAgent->agent_name ?? '', 'agents_code' => $vByAgent->code ?? '', 'created_date' => $vByAgent->created_at ?? '', 'phone' => $vByAgent->agent_phone ?? '', 'email' => $vByAgent->agent_email ?? '', 'grant' => $vByAgent->grant ?? '', 'up_grant' => $upGrant ?? '' ]; } } $data = $finalDataTemp; return ['status' => true, 'data' => $data, 'msg' => $this->getMessageReturn('success')]; } /** * Summary of getChildAgent * @param mixed $input * @return array */ public function getParentAgent($parentPath) { $parts = explode('-', $parentPath); // remove element null $parts = array_filter($parts, fn($part) => $part !== ''); if (count($parts) == 1) { return min($parts); } else { return $parts[count($parts) - 1] ?? null; } } /** * Summary of myAgentList * @param mixed $input * @return array */ public function myAgentList($input) { $data = []; //get data general $myAgent = $this->modelAgentUser->where('user_id', auth()->user()->id)->latest()->first(); if (empty($myAgent) || empty($myAgent->agent_id)) { return ['status' => false, 'msg' => $this->getMessageReturn('no_data_agent')]; } else { $myAgentInfo = $this->modelAgent->find($myAgent->agent_id); if (empty($myAgentInfo)) { return ['status' => false, 'msg' => $this->getMessageReturn('no_agent')]; } } $agentId = $myAgentInfo->id; //init query $myAgentDown = $this->modelAgentUser->byParentPath($agentId)->joinAgent(); //condition startdate & enddate if (!empty($input['start_date']) && !empty($input['end_date'])) { $startDate = Carbon::createFromFormat('Y-m-d', $input['start_date']); $endDate = Carbon::createFromFormat('Y-m-d', $input['end_date'])->addDay(); $myAgentDown->betweenDates($startDate->toDateString(), $endDate->toDateString()); } //condition keyword search if (!empty($input['keyword'])) { $myAgentDown->searchAgentName($input['keyword']); } if (!empty($input['grant'])) { $myAgentDown->onlyGrant($input['grant']); } //execute query get list $listAgentGet = $myAgentDown->get(); $finalData = []; if (!empty($listAgentGet)) { $listAgentById = []; //array by agent_id and get parent agent foreach ($listAgentGet as $kAgent) { // get parent id by path $kAgent->grant_parent_id = $this->getParentAgent($kAgent->parent_path); $listAgentById[$kAgent->agent_id] = $kAgent; } foreach ($listAgentGet as $vAgent) { if (!empty($listAgentById[$vAgent->grant_parent_id])) { $agentParent = $listAgentById[$vAgent->grant_parent_id]; $upGrant = $agentParent->code ?? null; } if (!empty($input['up_grant'])) { // if existing up_geant if ($upGrant != $input['up_grant']) continue; // skip } // lay danh sach 2 con cua parent $processPath = $this->processParentPath($agentId, $vAgent->parent_path); if (!empty($processPath) && in_array($vAgent->agent_id, $processPath)) { // $finalData[] = $vAgent; $finalData[] = [ 'id' => $vAgent->id ?? '', 'name' => $vAgent->agent_name ?? '', 'agents_code' => $vAgent->code ?? '', 'created_date' => $vAgent->created_at ?? '', 'phone' => $vAgent->agent_phone ?? '', 'email' => $vAgent->agent_email ?? '', 'grant' => $vAgent->grant ?? '', 'up_grant' => $upGrant ?? '' ]; } } } $data = $finalData; return ['status' => true, 'data' => $data, 'msg' => $this->getMessageReturn('success')]; } /** * Summary of processPath * @param mixed $parentPath * @param mixed $agentId * @return array */ public function processParentPath($agentId, $parentPath) { // find index agentId $position = strpos($parentPath, '-' . $agentId . '-'); if ($position !== false) { // cat chuoi tu vi tri ngay sau agentId $substring = substr($parentPath, $position + strlen('-' . $agentId . '-')); if (empty($substring)) { return []; } // tach chuoi thanh cac mang phan tu $numbers = explode('-', trim($substring, '-')); // lay 2 mang dau tien sau agentId $result = array_slice($numbers, 0, 2); // ghep lai thanh chuoi // $final_path = '-' . implode('-', $result) . '-'; $final_path = $result; } else { return []; } return $final_path; } /** * Summary of formatCreateCustomer * @param array $data * @return array */ public function formatCreateCustomer($data) { $format = []; if (!empty($data['agents_code'])) { $format['agents_code'] = $data['agents_code']; } if (!empty($data['guest_name'])) { $format['name'] = $data['guest_name']; } if (!empty($data['phone'])) { $format['phone'] = $data['phone']; } if (!empty($data['email'])) { $format['email'] = $data['email']; } if (!empty($data['grade'])) { $format['grade'] = $data['grade']; } if (!empty($data['grade'])) { $format['grade'] = $data['grade']; } if (!empty($data['message'])) { $format['msg'] = $data['message']; } return $format; } /** * Summary of getMessageReturn * @param mixed $errorKey * @return array */ public function getMessageReturn($errorKey) { $msgArr = [ 'no_data_agent' => 'Đại lý không tồn tại.', 'success_insert_customer' => 'Thêm khách hàng thành công.', 'failed_insert' => 'Thêm khách hàng thành công.', 'success' => 'Load data thành công.', 'no_agent' => 'Không tìm thấy đại lý.', ]; return $msgArr[$errorKey] ?? "Không có dữ liệu."; } }