Custom Backend OSPRO Surveyor Indonesia
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

345 lines
12 KiB

<?php
namespace App\Http\Controllers;
use Carbon\Carbon;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
6 months ago
use Illuminate\Support\Facades\{DB,Log};
use App\Models\{User, Company, HumanResource, Menu, ProductTransaction, RefferalCode, Role, RoleMenu, MenuCompany};
6 months ago
const URL_EMAIL = 'https://notifapp.odm-iu.com/service-mail/notif_mail.php';
class UserRegisterController extends Controller
{
public function add(Request $request)
{
6 months ago
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'];
6 months ago
$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'];
6 months ago
$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,
6 months ago
'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)) {
6 months ago
return response()->json(['status' => 'failed', 'message' => 'Refferal code not found!', 'code' => 404], 404);
}
6 months ago
$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']);
6 months ago
if(empty($addMenuRole)) {
return;
}
6 months ago
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'],
6 months ago
'address' => $formData['type_account'] === 'Company' ? $formData['companyAddress'] : $formData['address'],
'phone_no' => $formData['phone_no'],
'type_account' => $formData['type_account'],
'is_active' => true,
6 months ago
'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)
{
6 months ago
$generateRandom = Str::random(8);
$formData = array(
6 months ago
'name'=> $data['type_account'] === 'Company' ? $data['username'] : $data['full_name'],
'phone_number'=> $data['phone_no'],
'email'=> $data['email'],
'username' => $data['username'],
6 months ago
'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',
6 months ago
'company_id'=> $id_company
);
$result = HumanResource::create($formData);
6 months ago
if(!empty($result)) {
$this->sendEmail($data['email'], $generateRandom);
}
return [
'result' => $result,
6 months ago
'generateRandom' => $generateRandom
];
}
protected function addMenuCompany($baseDataMenu, $id_company)
{
$data = MenuCompany::where('company_id', $id_company);
if($data->exists()){
$data->delete();
}
6 months ago
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 {
6 months ago
die();
}
} else {
6 months ago
die();
}
}
protected function addMenuRole($baseDataMenu, $id_role)
{
6 months ago
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 {
6 months ago
die();
}
} else {
6 months ago
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;
6 months ago
} else{
return false;
}
return [
'newRegistrationNumber' => $newRegistrationNumber
];
}
6 months ago
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));
}
}
}