|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
|
|
|
use Carbon\Carbon;
|
|
|
|
use Illuminate\Support\Str;
|
|
|
|
use Illuminate\Http\Request;
|
|
|
|
use Illuminate\Support\Facades\{DB,Log};
|
|
|
|
use App\Models\{User, Company, HumanResource, Menu, ProductTransaction, RefferalCode, Role, RoleMenu, MenuCompany};
|
|
|
|
|
|
|
|
const URL_EMAIL = 'https://notifapp.odm-iu.com/service-mail/notif_mail.php';
|
|
|
|
class UserRegisterController extends Controller
|
|
|
|
{
|
|
|
|
public function add(Request $request)
|
|
|
|
{
|
|
|
|
DB::beginTransaction();
|
|
|
|
$this->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));
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|