MINI Sh3ll
<?php
namespace App\Solar\Repositories\Plant;
use App\Models\Plant;
use App\Models\Company;
use App\Models\CompanyUser;
use App\Models\Country;
use App\Models\Role;
use App\Models\PlantUser;
use App\Models\TreepyePlantDetails;
use App\User;
use DB;
use Exception;
use Illuminate\Support\Facades\Response;
use PhpParser\Node\Stmt\TryCatch;
use Illuminate\Support\Facades\Hash;
use App\Notifications\PlantAdmin;
use App\Models\ModulePermission;
use App\Solar\Repositories\Treepye\TreepyeInterface;
use App\Notifications\WelcomeMail;
use Faker\Factory as Faker;
use Auth;
class PlantRepository implements PlantInterface {
/**
* @var Plant
*/
private $plant;
private $api;
/**
* PlantRepository constructor.
* @param Plant $plant
*/
public function __construct(Plant $plant, TreepyeInterface $api) {
$this->plant = $plant;
$this->api = $api;
}
/**
* PlantRepository store function to .
* @param Plant $plant
*/
public function store($request) {
$message = ' ';
$plant = $this->plant;
$this->buildObject($plant, $request);
$plant->chart_color = '#'.$this->random_color();
$plant->save();
// Create plant on treepye and get response
if(config('treepye_constants.status')) {
$apiResponse = $this->api->createService($plant);
if (!empty($apiResponse)) {
if ($apiResponse['details']['code'] == 0) {
$treepyePlant = createPlant($plant, $apiResponse);
}
if ($apiResponse['details']['code'] == -1) {
$plant->status = 0;
$plant->save();
$message = 'Plant not created, please try after sometime.';
}
}
}
if ($request->plant_user == 1) {
$password = generate_password();
$request->request->add(['password' => $password]);
$user = $this->saveUser($request);
$plant->plant_users()->attach($user->id);
$companyUser = new CompanyUser();
$companyUser->company_id = $request->company_id;
$companyUser->user_id = $user->id;
$companyUser->save();
//$user->notify(new PlantAdmin($user));
$user->password = $password;
$user->notify(new welcomeMail($user));
}
if ($request->plant_user == 0) {
$plant->plant_users()->sync($request->plant_users);
$companyUser = new CompanyUser();
foreach ($request->plant_users as $plant_user) {
$companyUser->company_id = $request->company_id;
$companyUser->user_id = $plant_user;
$companyUser->save();
}
}
$result_array = array('plant' => $plant, 'message' => $message);
return $result_array;
}
/*
* Sync plant if it is inactive
*/
public function syncPlant($id) {
$plant = $this->find($id);
// Create plant on treepye and get response
$apiResponse = $this->api->createService($plant);
if (!empty($apiResponse)) {
if ($apiResponse['status'] == true) {
if ($apiResponse['details']['code'] == 0) {
$treepyePlant = createPlant($plant, $apiResponse);
$plant->status = 1;
$plant->save();
$flag = 1;
$message = 'Plant created successfully on treepye.';
}
if ($apiResponse['details']['code'] == -1) {
$plant->status = 0;
$plant->save();
$flag = 0;
$message = $apiResponse->message . ' on treepye.';
}
}
if ($apiResponse['status'] == false) {
$flag = 0;
$message = $apiResponse['error'];
}
}
$result_array = array('plant' => $plant, 'message' => $message, 'flag' => $flag);
return $result_array;
}
/*
* Build request and plant object
*/
public function buildObject($plant, $request) {
$plant->plant_name = ucfirst($request->plant_name);
$plant->company_id = $request->company_id;
$plant->capacity = $request->capacity;
$plant->data_logger = $request->data_logger;
$plant->inverter = $request->inverter;
$plant->country_id = $request->country_id;
$plant->state = ucfirst($request->state);
$plant->city = ucfirst($request->city);
$plant->address = ucfirst($request->address);
$plant->latitude = $request->latitude;
$plant->longitude = $request->longitude;
$plant->status = $request->status;
}
public function getPlant($id, $status) {
$plants = $this->plant->query();
//Checked auth user role,if role not superadmin listing according to company
if(\Auth::user()->roles->id != config('constants.role.superadmin.id') && \Auth::user()->roles->id != config('constants.role.scpl_user.id')){
$company_id = \Auth::user()->company_users->pluck('company_id')->first();
$plants = $plants->where('company_id',$company_id);
}
if(\Auth::user()->roles->id == config('constants.role.user.id')){
$plant_ids = PlantUser::where('user_id',\Auth::id())->pluck('plant_id')->all();
$plants->whereIn('id',$plant_ids);
}
if (isset($status)) {
$plants->where('status', '=', $status);
}
if (isset($id)) {
$plants->where('id', '=', $id);
}
$plantData = $plants->orderBy('id', 'DESC')->get();
return $plantData;
}
/*
* Get all plants name
*/
public function getAllPlantNames() {
if(\Auth::user()->role_id == config('constants.role.superadmin.id') || \Auth::user()->role_id == config('constants.role.scpl_user.id')) {
$plant = $this->plant->select('id', 'plant_name')->get();
}elseif(\Auth::user()->role_id == config('constants.role.company_admin.id') || \Auth::user()->role_id == config('constants.role.portal_admin.id') || \Auth::user()->role_id == config('constants.role.portal_support.id')) {
$company_id = CompanyUser::where('user_id',\Auth::id())->pluck('company_id')->all();
$plant = $this->plant->select('id', 'plant_name')->whereIn('company_id',$company_id)->get();
}else{
$plant_id = PlantUser::where('user_id',\Auth::id())->pluck('plant_id')->all();
$plant = $this->plant->select('id', 'plant_name')->whereIn('id',$plant_id)->get();
}
return $plant;
}
public function delete($id) {
$user = $this->plant->findOrFail($id);
$user->delete();
return $user;
}
public function getCompanies() {
$companies = Company::get();
//Checked auth user role,if role not superadmin listing according to company
if(\Auth::user()->roles->role_name != config('constants.role.superadmin.name') && \Auth::user()->roles->role_name != config('constants.role.scpl_user.name') ){
$company_id = \Auth::user()->company_users->pluck('company_id')->first();
$companies = Company::whereHas('company_user',function($q) use($company_id){
$q->where('company_id',$company_id );
})->get();
}
return $companies;
}
public function getCountries() {
return Country::get();
}
public function find($id) {
return $this->plant->newInstance()->with('treepye')->findOrFail($id);
}
public function update($id, $request) {
$plant = $this->plant->findOrFail($id);
$this->buildObject($plant, $request);
$plant->save();
return $plant;
}
public function getUsers($company_id) {
$company_users = User::whereHas('company_users',function($q) use($company_id) {
$q->where('company_id',$company_id);
})
->where('role_id',config('constants.role.user.id'))
->where('id', '!=' , \Auth::id())->get();
$existingCompanyUser = CompanyUser::pluck('user_id')->all();
$registerUser = User::where(['is_email_verified' => 1,'is_mobile_verified'=>1,'role_id'=>config('constants.role.user.id')])->whereNotIn('id',$existingCompanyUser)->get();
$users = $registerUser->merge($company_users);
$result = $users->all();
return $result;
}
public function saveUser($request) {
$user = new User();
$user->first_name = ucfirst($request->first_name);
$user->last_name = ucfirst($request->last_name);
$user->role_id = config('constants.role.user.id');
$user->email = $request->email;
$user->mobile = $request->mobile;
if($request->has('password')) {
$user->password = Hash::make($request->password);
}
$user->verify_token = generateRandomString('20');
$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.user');
$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')
]);
}
}
return $user;
}
/*
* Get Plant users for a particular plant
*/
public function getPlantUsersForPlant($id) {
return User::whereHas('plant_users', function($q) use($id) {
$q->where('plant_users.plant_id', $id);
})->get();
}
/*
* Generate random color for plant
*/
public function random_color_part() {
return str_pad( dechex( mt_rand( 0, 255 ) ), 2, '0', STR_PAD_LEFT);
}
public function random_color() {
return $this->random_color_part() . $this->random_color_part() . $this->random_color_part();
}
}
OHA YOOOO