validate($request, [ 'cluster' => 'required|string', 'address' => 'required|string', 'email' => 'required|string', 'type_paket' => ($request->type_account === 'Personal' ? 'required' : 'nullable') . '|in:Basic,Free', 'phone_no' => 'required', 'type_account' => 'string|in:Personal,Company', 'company_name' => 'required|string', 'username' => 'required|string' ]); try { $data = $request->all(); $company_name = $data['company_name']; $type_account = $data['type_account']; $refferal = $request->refferal ? $data['refferal'] : null; $cluster = $data['cluster']; $address = $data['address']; $phone_no = $data['phone_no']; $email = $data['email']; $username = $data['username']; $type_paket = $data['type_paket']; $company_address = $request->type_account === 'Company' ? $data['companyAddress'] : ''; $full_name = $request->type_account === 'Personal' ? $data['full_name'] : ''; // check email & username already exist $emailExists = Company::where('email', $email)->exists() || User::where('email', $email)->exists(); if ($emailExists) { return response()->json(['status' => 'failed', 'message' => 'Email already exists, please check again!', 'code' => 500], 500); } $usernameExists = User::where('username', $username)->exists(); if ($usernameExists) { return response()->json(['status' => 'failed', 'message' => 'Username already exists, please check again!', 'code' => 500], 500); } // Get last registration number $getCompany = $this->getCompany(); $formDataCompany = array( 'company_name' => $company_name, 'newRegistrationNumber' => $getCompany['newRegistrationNumber'], 'cluster' => $cluster, 'phone_no' => $phone_no, 'email' => $email, 'address' => $address, 'type_account' => $type_account, 'username' => $username, 'type_paket' => $type_paket, 'companyAddress' => $company_address, 'full_name' => $full_name ); if(empty($refferal)) { $addCompany = $this->addCompany($formDataCompany, null); } else { $getRefferal = $this->getRefferalCode($refferal); if(empty($getRefferal)) { return response()->json(['status' => 'failed', 'message' => 'Refferal code not found!', 'code' => 404], 404); } $addCompany = $this->addCompany($formDataCompany, (int)$getRefferal['id']); } if(empty($addCompany)) { return; } $addRole = $this->addRole((int)$addCompany['id']); if(empty($addRole)) { return; } $addHR = $this->addHR((int)$addCompany['id'], (int)$addRole['id'], $formDataCompany); if(empty($addHR)) { return; } $getMenu = $this->getMenu(); if(empty($getMenu)) { return; } $this->addTransaction((int)$addCompany['id'], $formDataCompany); $addMenuCompany = $this->addMenuCompany($getMenu, (int)$addCompany['id']); if(empty($addMenuCompany)) { return; } $addMenuRole = $this->addMenuRole($getMenu, (int)$addRole['id']); if(empty($addMenuRole)) { return; } DB::commit(); return response()->json(['status' => 'success', 'message' => 'Register is successful, please check your email!', 'generateRandom' => $addHR['generateRandom'], 'code' => 200], 200); } catch (\Throwable $th) { DB::rollBack(); Log::channel('daily')->error($th->getMessage()); return response()->json(['status' => 'failed', 'message' => 'Failed to register, please check again!', 'code' => 500], 500); } } protected function getRefferalCode($refferal) { $result = RefferalCode::query() ->select('id','code','amount','exp','type','allocation','description') ->where('code', $refferal) ->first(); return $result; } protected function addCompany($formData, $id_refferal) { $formData = array( 'company_name' => $formData['company_name'], 'registration_no' => $formData['newRegistrationNumber'], 'cluster' => $formData['cluster'], 'date_register' => Carbon::now(), 'template_id' => 1, 'email' => $formData['email'], 'address' => $formData['type_account'] === 'Company' ? $formData['companyAddress'] : $formData['address'], 'phone_no' => $formData['phone_no'], 'type_account' => $formData['type_account'], 'is_active' => true, 'discount_id' => $id_refferal === null ? null : $id_refferal ); $result = Company::create($formData); return $result; } protected function addRole($id_company) { $formData = [ 'name' => 'Admin', 'company_id' => $id_company, 'description' => '-' ]; $result = Role::create($formData); return $result; } protected function addHR($id_company, $id_role, $data) { $generateRandom = Str::random(8); $formData = array( 'name'=> $data['type_account'] === 'Company' ? $data['username'] : $data['full_name'], 'phone_number'=> $data['phone_no'], 'email'=> $data['email'], 'username' => $data['username'], 'password'=> md5($generateRandom), 'role_id'=> $id_role, 'ktp_number'=> $data['type_account'] === 'Company' ? 'CP-'. $generateRandom : 'PR-' . $generateRandom, 'employee_type'=> 'employee', 'address' => $data['address'], 'status_resource'=> 'active', 'company_id'=> $id_company ); $result = HumanResource::create($formData); if(!empty($result)) { $this->sendEmail($data['email'], $generateRandom); } return [ 'result' => $result, 'generateRandom' => $generateRandom ]; } protected function addMenuCompany($baseDataMenu, $id_company) { $data = MenuCompany::where('company_id', $id_company); if($data->exists()){ $data->delete(); } if (is_object($baseDataMenu) && count($baseDataMenu) > 0 && isset($baseDataMenu)) { $countRes = 0; foreach ($baseDataMenu as $menu) { $dataInsert = array( "menu_id" => $menu['id'], "parent_menu_id" => $menu['parent_id'], "company_id" => $id_company, "icon" => $menu['icon'], "alias_name" => $menu['alias_name'], "url" => $menu['url'], "sequence" => $menu['sequence'], "created_by" => $this->currentName ); $result = MenuCompany::create($dataInsert); if ($result) { $countRes++; } else { $countRes--; } } if ($countRes > 0) { return $result; } else { die(); } } else { die(); } } protected function addMenuRole($baseDataMenu, $id_role) { if (is_object($baseDataMenu) && count($baseDataMenu) > 0 && isset($baseDataMenu)) { $countRes = 0; foreach ($baseDataMenu as $menu) { $dataInsert = array( "menu_id" => $menu['id'], "role_id" => $id_role, ); $result = RoleMenu::create($dataInsert); if ($result) { $countRes++; } else { $countRes--; } } if ($countRes > 0) { return $result; } else { die(); } } else { die(); } } protected function addTransaction($id_company, $data) { $currentDate = Carbon::now(); $finalDate = $currentDate->copy()->addDays(30); if(is_array($data)) { $formData = array( 'company_id' => $id_company, 'type_paket' => $data['type_paket'], 'exp_ospro' => $finalDate, 'amount' => $data['type_paket'] === 'Free' ? 0 : 250000 ); $result = ProductTransaction::create($formData); return $result; } } protected function getMenu() { $result = Menu::query() ->select("id", "name", "parent_id", "alias_name", "icon", "url", "sequence") ->whereNotIn('alias_name', ['Dashboard Customer', 'Registration Management', 'Demo Management']) ->get(); return $result; } protected function getCompany() { $newRegistrationNumber = ''; $company = Company::query() ->select('id','type_account','registration_no','discount_id') ->orderByDesc('id') ->first(); if(!empty($company)) { $lastRegistrationNumber = $company['registration_no']; $lastNumber = (int)preg_replace('/\D/', '', $lastRegistrationNumber); $newNumber = $lastNumber + 1; $newRegistrationNumber = 'RG-'. $newNumber; } else{ return false; } return [ 'newRegistrationNumber' => $newRegistrationNumber ]; } public function sendEmail($email, $password) { $user = User::select('email', 'name', 'username')->where('email', $email)->first(); if (!$user) { return response()->json(['status' => 'error', 'message' => 'e-mail not found '], 400); } else { $this->reqHttpCurl($email, $password, $user->username, $user->name); return response()->json(['status' => 'error', 'code'=>400, 'message' => 'e-mail not found '], 400); } } private function reqHttpCurl($email, $password, $username, $name) { $postData = [ "to" => $email, "name" => $name, "username" => $username, "password" => $password, "from" => "app.integrasia@integrasiautama.com", "alias_from" => "OSPRO", "subject" => "Registration OSPRO", "body" => "registration-ospro" ]; $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => URL_EMAIL, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30000, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => json_encode($postData), CURLOPT_HTTPHEADER => array( // Set here requred headers "accept: */*", "accept-language: en-US,en;q=0.8", "content-type: application/json", ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { print_r(json_decode($response)); } } }