MINI Sh3ll
<?php
namespace App\Solar\Repositories\Company;
use App\Models\Company;
use App\Models\CompanyUser;
use App\Models\CompanyDomain;
use App\Models\Country;
use App\User;
use App\Models\Plant;
use App\Models\PlantUser;
use App\Models\Enquiry;
use App\Notifications\CompanyAdminMail;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Notification;
use App\Jobs\CompanyAdminJob;
use App\Models\ModulePermission;
use App\Notifications\WelcomeMail;
use App\Models\Panel;
use Faker\Factory as Faker;
class CompanyRepository implements CompanyInterface {
/**
* @var Company
*/
private $company;
private $user;
private $plant;
private $enquiry;
/**
* CompanyRepository constructor.
* @param Company $company
*/
public function __construct(Company $company, User $user, Plant $plant ,Enquiry $enquiry) {
$this->company = $company;
$this->user = $user;
$this->plant = $plant;
$this->enquiry = $enquiry;
}
/*
* Get country data
*/
public function getCountries() {
return Country::pluck('name', 'id')->prepend('Select Country', '');
}
/*
* Get company admins data
*/
public function getCompanyAdmins() {
return User::with('company_users')->where('role_id', config('constants.role.company_admin.id'))->get();
}
/*
* Get all company data
*/
public function getAll() {
return $this->company->with('country')->orderBy('id', 'DESC')->get();
}
/*
* Get all company name
*/
public function getAllCompanyNames() {
return $this->company->select('id', 'company_name')->orderBy('id', 'DESC')->get();
}
/*
* Get resource details
*/
public function getCompany($status, $id) {
$companies = $this->company->query();
if (isset($status)) {
$companies->where('status', '=', $status);
}
if (isset($id)) {
$companies->where('id', '=', $id);
}
$companyData = $companies->orderBy('id', 'DESC')->get();
return $companyData;
}
/*
* Store company details, assign company admin
*/
public function store($request) {
$company = $this->company;
$this->buildCompanyObject($company, $request);
$company->save();
// if ($company) {
// $panels = config('panel_constant.panel');
// foreach ($panels as $panel) {
// $panelDetail = new Panel();
// $panelDetail->company_id = $company->id;
// $panelDetail->api_type = $panel['key'];
// $panelDetail->chart_type = config('charts_constant.'.$panel['key'].'.barChart.key');
// $panelDetail->save();
// }
// }
$arr = $request->company_domains;
$count = count($request->company_domains);
for ($i = 0; $i < $count; $i++) {
$companyDomain = new CompanyDomain();
$companyDomain->company_id = $company->id;
$companyDomain->domain_name = $arr[$i];
$companyDomain->save();
}
$user = $this->user;
if ($request->user == 1) {
$password = generate_password();
$request->request->add(['password' => $password]);
$this->buildUserObject($user, $request);
$faker = Faker::create();
$user->otp = $faker->numberBetween(10000, 99999);
$user->save();
// send_otp funtion to send otp to phone number
send_otp($user->mobile, $user->otp);
ModulePermission::where('user_id', $user->id)->delete();
$permissions = config('permissions_constants.permission.company_admin');
$count = count($permissions);
if ($count > 0) {
for ($i = 0; $i < $count; $i++) {
$module_id = getModule($permissions[$i]['module_code']);
ModulePermission::updateOrCreate([
'module_id' => $module_id,
'user_id' => $user->id,
'has_access' => 1,
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')
]);
}
}
$company->company_users()->attach($user->id);
//$user->notify(new CompanyAdminMail($user));
$user->password = $password;
$user->notify(new welcomeMail($user));
}
if ($request->user == 0) {
$users = array();
$company->company_users()->sync($request->company_admins);
/* foreach ($request->company_admins as $id) {
$user = User::where('id', $id)->first();
$user->notify((new CompanyAdminMail($user))->delay(10));
} */
}
return $company;
}
/*
* Find company instance
*/
public function find($id) {
return $this->company->newInstance()->with('country')->findOrFail($id);
}
/*
* Update company details
*/
public function update($id, $request) {
$company = $this->company->findOrFail($id);
$this->buildCompanyObject($company, $request);
$company->save();
CompanyDomain::where('company_domains.company_id', $id)->delete();
$company_domains_arr = $request->company_domains;
$count = count($company_domains_arr);
for ($i = 0; $i < $count; $i++) {
$companyDomains[] = array(
'company_id' => $id,
'domain_name' => $company_domains_arr[$i],
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')
);
}
CompanyDomain::insert($companyDomains);
return $company;
}
/*
* Destroy company details
*/
public function delete($id) {
$status = false;
/*Old code*/
$company = $this->company->findOrFail($id);
if($company){
$activePlant = $this->plant::where('company_id',$company->id )->where('status','1')->where('deleted_at', null)->get();
if($activePlant->isEmpty()) {
$deletePlant = $this->plant::where('company_id',$company->id )->delete();
if($deletePlant){
$company = $company->delete();
if($company){
$status = true;
}
}
}
}
return $status;
}
/*
* Bind company and request object
*/
public function buildCompanyObject($company, $request) {
$company->company_name = ucfirst($request->company_name);
$company->country_id = $request->country_id;
$company->state = ucfirst($request->state);
$company->city = ucfirst($request->city);
$company->address = ucfirst($request->address);
$company->status = $request->status;
}
/*
* Bind user and request object
*/
public function buildUserObject($user, $request) {
$user->role_id = config('constants.role.company_admin.id');
$user->first_name = ucfirst($request->first_name);
$user->last_name = ucfirst($request->last_name);
$users = $this->user->get()->pluck('email')->toArray();
$email = $request->email;
$mobile = $request->mobile;
if (!in_array($email, $users)) {
$user->email = $email;
}
if (!in_array($mobile, $users)) {
$user->mobile = $mobile;
}
$user->mobile = $request->mobile;
if($request->has('password')) {
$user->password = Hash::make($request->password);
}
$user->verify_token = generateRandomString('20');
}
/*
* Get Company admins for a particular company
*/
public function getCompanyAdminsForCompany($id) {
return User::whereHas('company_users', function($q) use($id) {
$q->where('company_id', $id);
})->where('role_id', config('constants.role.company_admin.id'))->get();
}
public function getCompanyDomains($id) {
return CompanyDomain::where('company_domains.company_id', $id)->get();
}
//check domain already exist
public function checkDomain($domain)
{
return CompanyDomain::where('domain_name',$domain)->get();
}
}
OHA YOOOO