403 lines
15 KiB
PHP
403 lines
15 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace App\Http\Controllers\SuperAdmin;
|
||
|
|
||
|
use App\Company;
|
||
|
use App\Currency;
|
||
|
use App\EmployeeDetails;
|
||
|
use App\GlobalCurrency;
|
||
|
use App\Helper\Files;
|
||
|
use App\Helper\Reply;
|
||
|
use App\Http\Requests\SuperAdmin\Companies\DeleteRequest;
|
||
|
use App\Http\Requests\SuperAdmin\Companies\PackageUpdateRequest;
|
||
|
use App\Http\Requests\SuperAdmin\Companies\StoreRequest;
|
||
|
use App\Http\Requests\SuperAdmin\Companies\UpdateRequest;
|
||
|
use App\LanguageSetting;
|
||
|
use App\OfflineInvoice;
|
||
|
use App\OfflinePaymentMethod;
|
||
|
use App\Package;
|
||
|
use App\Role;
|
||
|
use App\Scopes\CompanyScope;
|
||
|
use App\StripeInvoice;
|
||
|
use App\Traits\CurrencyExchange;
|
||
|
use App\User;
|
||
|
use Carbon\Carbon;
|
||
|
use Illuminate\Http\Request;
|
||
|
use Illuminate\Support\Facades\DB;
|
||
|
use Yajra\DataTables\Facades\DataTables;
|
||
|
|
||
|
class SuperAdminCompanyController extends SuperAdminBaseController
|
||
|
{
|
||
|
use CurrencyExchange;
|
||
|
|
||
|
/**
|
||
|
* AdminProductController constructor.
|
||
|
*/
|
||
|
public function __construct()
|
||
|
{
|
||
|
parent::__construct();
|
||
|
$this->pageTitle = 'Companies';
|
||
|
$this->pageIcon = 'icon-layers';
|
||
|
$this->colClass = '6';
|
||
|
if (module_enabled('Subdomain')) {
|
||
|
$this->colClass = '4';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Display a listing of the resource.
|
||
|
*
|
||
|
* @return \Illuminate\Http\Response
|
||
|
*/
|
||
|
public function index()
|
||
|
{
|
||
|
$this->totalCompanies = Company::count();
|
||
|
$this->packages = Package::all();
|
||
|
return view('super-admin.companies.index', $this->data);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Show the form for creating a new resource.
|
||
|
*
|
||
|
* @return \Illuminate\Http\Response
|
||
|
*/
|
||
|
public function create()
|
||
|
{
|
||
|
$this->timezones = \DateTimeZone::listIdentifiers(\DateTimeZone::ALL);
|
||
|
$this->currencies = GlobalCurrency::all();
|
||
|
return view('super-admin.companies.create', $this->data);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Store a newly created resource in storage.
|
||
|
* @param StoreRequest $request
|
||
|
* @return array
|
||
|
*/
|
||
|
public function store(StoreRequest $request)
|
||
|
{
|
||
|
DB::beginTransaction();
|
||
|
|
||
|
$company = new Company();
|
||
|
|
||
|
$companyDetail = $this->storeAndUpdate($company, $request);
|
||
|
|
||
|
$globalCurrency = GlobalCurrency::findOrFail($request->currency_id);
|
||
|
$currency = Currency::where('currency_code', $globalCurrency->currency_code)
|
||
|
->where('company_id', $companyDetail->id)->first();
|
||
|
|
||
|
if (is_null($currency)) {
|
||
|
$currency = new Currency();
|
||
|
$currency->currency_name = $globalCurrency->currency_name;
|
||
|
$currency->currency_symbol = $globalCurrency->currency_symbol;
|
||
|
$currency->currency_code = $globalCurrency->currency_code;
|
||
|
$currency->is_cryptocurrency = $globalCurrency->is_cryptocurrency;
|
||
|
$currency->usd_price = $globalCurrency->usd_price;
|
||
|
$currency->company_id = $companyDetail->id;
|
||
|
$currency->save();
|
||
|
}
|
||
|
|
||
|
$company->currency_id = $currency->id;
|
||
|
$company->save();
|
||
|
|
||
|
$user = $company->addUser($company, $request);
|
||
|
$company->addEmployeeDetails($user);
|
||
|
|
||
|
$adminRole = Role::where('name', 'admin')->where('company_id', $companyDetail->id)->withoutGlobalScope('active')->first();
|
||
|
$user->roles()->attach($adminRole->id);
|
||
|
|
||
|
$employeeRole = Role::where('name', 'employee')->where('company_id', $user->company_id)->first();
|
||
|
$user->roles()->attach($employeeRole->id);
|
||
|
|
||
|
DB::commit();
|
||
|
return Reply::redirect(route('super-admin.companies.index'), 'Company added successfully.');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Display the specified resource.
|
||
|
*
|
||
|
* @param int $id
|
||
|
*/
|
||
|
public function show($id)
|
||
|
{
|
||
|
//
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @param $companyId
|
||
|
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
|
||
|
* @throws \Throwable
|
||
|
*/
|
||
|
public function editPackage($companyId)
|
||
|
{
|
||
|
$packages = Package::all();
|
||
|
$global = $this->global;
|
||
|
$company = Company::find($companyId);
|
||
|
$currentPackage = Package::find($company->package_id);
|
||
|
$lastInvoice = StripeInvoice::where('company_id', $companyId)->orderBy('created_at', 'desc')->first();
|
||
|
$packageInfo = [];
|
||
|
foreach ($packages as $package) {
|
||
|
$packageInfo[$package->id] = [
|
||
|
'monthly' => $package->monthly_price,
|
||
|
'annual' => $package->annual_price
|
||
|
];
|
||
|
}
|
||
|
|
||
|
$offlinePaymentMethod = OfflinePaymentMethod::whereNull('company_id')->get();
|
||
|
$modal = view('super-admin.companies.editPackage', compact('packages', 'company', 'currentPackage', 'lastInvoice', 'packageInfo', 'global', 'offlinePaymentMethod'))->render();
|
||
|
|
||
|
return response(['status' => 'success', 'data' => $modal], 200);
|
||
|
}
|
||
|
|
||
|
public function updatePackage(PackageUpdateRequest $request, $companyId)
|
||
|
{
|
||
|
$company = Company::find($companyId);
|
||
|
|
||
|
try {
|
||
|
$package = Package::find($request->package);
|
||
|
$company->package_id = $package->id;
|
||
|
$company->package_type = $request->packageType;
|
||
|
$company->status = 'active';
|
||
|
|
||
|
$payDate = $request->pay_date ? Carbon::parse($request->pay_date) : Carbon::now();
|
||
|
|
||
|
$company->licence_expire_on = ($company->package_type == 'monthly') ?
|
||
|
$payDate->copy()->addMonth()->format('Y-m-d') :
|
||
|
$payDate->copy()->addYear()->format('Y-m-d');
|
||
|
|
||
|
$nextPayDate = $request->next_pay_date ? Carbon::parse($request->next_pay_date) : $company->licence_expire_on;
|
||
|
|
||
|
if ($company->isDirty('package_id') || $company->isDirty('package_type')) {
|
||
|
$offlineInvoice = new OfflineInvoice();
|
||
|
} else {
|
||
|
$offlineInvoice = OfflineInvoice::where('company_id', $companyId)->orderBy('created_at', 'desc')->first();
|
||
|
if (!$offlineInvoice) {
|
||
|
$offlineInvoice = new OfflineInvoice();
|
||
|
}
|
||
|
}
|
||
|
$offlineInvoice->company_id = $company->id;
|
||
|
$offlineInvoice->package_id = $company->package_id;
|
||
|
$offlineInvoice->package_type = $request->packageType;
|
||
|
$offlineInvoice->amount = $request->amount ?: $package->{$request->packageType . '_price'};
|
||
|
$offlineInvoice->pay_date = $payDate;
|
||
|
$offlineInvoice->next_pay_date = $nextPayDate;
|
||
|
$offlineInvoice->status = 'paid';
|
||
|
|
||
|
$offlineInvoice->save();
|
||
|
$company->save();
|
||
|
|
||
|
return response(['status' => 'success', 'message' => 'Package Updated Successfully.'], 200);
|
||
|
} catch (\Exception $e) {
|
||
|
return $e;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Show the form for editing the specified resource.
|
||
|
*
|
||
|
* @param int $id
|
||
|
* @return \Illuminate\Http\Response
|
||
|
*/
|
||
|
public function edit($id)
|
||
|
{
|
||
|
$this->company = Company::find($id);
|
||
|
|
||
|
$this->timezones = \DateTimeZone::listIdentifiers(\DateTimeZone::ALL);
|
||
|
$this->currencies = Currency::where('company_id', $id)->get();
|
||
|
$this->packages = Package::all();
|
||
|
$this->companyUser = User::where('company_id', $id)->withoutGlobalScope('active')->first();
|
||
|
|
||
|
return view('super-admin.companies.edit', $this->data);
|
||
|
}
|
||
|
|
||
|
public function defaultLanguage()
|
||
|
{
|
||
|
$this->languages = LanguageSetting::where('status', 'enabled')->get();
|
||
|
return view('super-admin.companies.default-language', $this->data);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param Request $request
|
||
|
* @return array
|
||
|
*/
|
||
|
public function defaultLanguageUpdate(Request $request)
|
||
|
{
|
||
|
$this->global->new_company_locale = $request->default_language;
|
||
|
$this->global->save();
|
||
|
|
||
|
return Reply::success(__('messages.defaultCompanyLanguage'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Update the specified resource in storage.
|
||
|
*
|
||
|
* @param UpdateRequest $request
|
||
|
* @param int $id
|
||
|
* @return array
|
||
|
*/
|
||
|
public function update(UpdateRequest $request, $id)
|
||
|
{
|
||
|
$company = Company::find($id);
|
||
|
$this->storeAndUpdate($company, $request);
|
||
|
|
||
|
$company->currency_id = $request->currency_id;
|
||
|
$company->save();
|
||
|
|
||
|
$user = User::where('company_id', $id)->withoutGlobalScope('active')->first();
|
||
|
$user->email = $request->email;
|
||
|
|
||
|
if (!is_null($request->password)) {
|
||
|
$user->password = bcrypt($request->password);
|
||
|
}
|
||
|
$user->save();
|
||
|
|
||
|
|
||
|
return Reply::redirect(route('super-admin.companies.index'), __('messages.updateSuccess'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Remove the specified resource from storage.
|
||
|
*
|
||
|
* @param DeleteRequest $request
|
||
|
* @param int $id
|
||
|
* @return array
|
||
|
*/
|
||
|
public function destroy(DeleteRequest $request, $id)
|
||
|
{
|
||
|
Company::destroy($id);
|
||
|
return Reply::success(__('messages.deleteSuccess'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param Request $request
|
||
|
* @return mixed
|
||
|
* @throws \Exception
|
||
|
*/
|
||
|
public function data(Request $request)
|
||
|
{
|
||
|
$packages = Company::with('currency', 'package');
|
||
|
|
||
|
if ($request->package != 'all' && $request->package != '') {
|
||
|
$packages = $packages->where('package_id', $request->package);
|
||
|
}
|
||
|
|
||
|
if ($request->type != 'all' && $request->type != '') {
|
||
|
$packages = $packages->where('package_type', $request->type);
|
||
|
}
|
||
|
|
||
|
return Datatables::of($packages)
|
||
|
->addColumn('action', function ($row) {
|
||
|
$companyUser = User::withoutGlobalScope(CompanyScope::class)->withoutGlobalScope('active')->where('company_id', $row->id)->first();
|
||
|
|
||
|
$list = '<p><a href="' . route('super-admin.companies.edit', [$row->id]) . '" class="btn btn-info btn-circle"
|
||
|
data-toggle="tooltip" data-original-title="Edit"><i class="fa fa-pencil" aria-hidden="true"></i></a></p>';
|
||
|
|
||
|
if ($companyUser && $companyUser->email_verification_code != null) {
|
||
|
$list .= '<p><a href="javascript:;" class="btn btn-success btn-circle verify-user"
|
||
|
data-toggle="tooltip" data-user-id="' . $companyUser->id . '" data-original-title="' . __('modules.company.verifyNow') . '"><i class="fa fa-check" aria-hidden="true"></i></a></p>';
|
||
|
} else if (module_enabled('Subdomain')) {
|
||
|
$list .= '<p><a href="javascript:;" class="btn btn-success btn-circle domain-params"
|
||
|
data-toggle="tooltip" data-company-id="' . $row->id . '" data-company-url="' . request()->getScheme() . '://' . $row->sub_domain . '" data-original-title="Domain Notify to company admins"><i class="fa fa-bell" aria-hidden="true"></i></a></p>';
|
||
|
}
|
||
|
|
||
|
$list .= '<p><a href="javascript:;" class="btn btn-danger btn-circle sa-params"
|
||
|
data-toggle="tooltip" data-user-id="' . $row->id . '" data-original-title="Delete"><i class="fa fa-times" aria-hidden="true"></i></a></p>';
|
||
|
return $list;
|
||
|
})
|
||
|
->editColumn('company_name', function ($row) {
|
||
|
return ucfirst($row->company_name) . '<br />' . '<img src="' . $row->logo_url . '" class="img-responsive" style="max-height: 35px" />';
|
||
|
})
|
||
|
->editColumn('status', function ($row) {
|
||
|
$class = ($row->status == 'active') ? 'label-custom' : 'label-danger';
|
||
|
return '<span class="label ' . $class . '">' . ucfirst($row->status) . '</span>';
|
||
|
})
|
||
|
->editColumn('company_email', function ($row) {
|
||
|
return '<a href="mailto:' . $row->company_email . '" target="_blank">' . $row->company_email . '</a>';
|
||
|
})
|
||
|
->editColumn('sub_domain', function ($row) {
|
||
|
return '<a href="http://' . $row->sub_domain . '" target="_blank">' . $row->sub_domain . '</a>';
|
||
|
})
|
||
|
->editColumn('last_login', function ($row) {
|
||
|
if ($row->last_login != null) {
|
||
|
return $row->last_login->diffForHumans();
|
||
|
}
|
||
|
return '-';
|
||
|
})
|
||
|
->editColumn('package', function ($row) {
|
||
|
$package = '<div class="w-100 text-center">';
|
||
|
$package .= '<div class="m-b-5">' . ucwords($row->package->name) . ' (' . ucfirst($row->package_type) . ')' . '</div>';
|
||
|
|
||
|
$package .= '<a href="javascript:;" class="label label-custom package-update-button"
|
||
|
data-toggle="tooltip" data-company-id="' . $row->id . '" data-original-title="Change"><i class="fa fa-edit" aria-hidden="true"></i> Change </a>';
|
||
|
$package .= '</div>';
|
||
|
return $package;
|
||
|
})
|
||
|
->addColumn('details', function ($row) {
|
||
|
$companyUser = User::withoutGlobalScope(CompanyScope::class)->withoutGlobalScope('active')->where('company_id', $row->id)->first();
|
||
|
|
||
|
if ($companyUser && $companyUser->email_verification_code == null) {
|
||
|
$verified = '<i class="fa fa-check-circle" style="color: green;"></i>';
|
||
|
} else if ($companyUser && $companyUser->email_verification_code != null) {
|
||
|
$verified = '<i class="fa fa-times" style="color: red;"></i>';
|
||
|
} else {
|
||
|
$verified = '-';
|
||
|
}
|
||
|
|
||
|
$registerDate = $row->created_at->format('d-m-Y');
|
||
|
$totalUsers = User::withoutGlobalScope(CompanyScope::class)->withoutGlobalScope('active')->where('company_id', $row->id)->count();
|
||
|
|
||
|
$string = "<ul class='p-l-20'>";
|
||
|
$string .= "<li>" . __('modules.superadmin.verified') . ": " . $verified . "</li>";
|
||
|
$string .= "<li>" . __('modules.superadmin.registerDate') . ": " . $registerDate . "</li>";
|
||
|
$string .= "<li>" . __('modules.superadmin.totalUsers') . ": " . $totalUsers . "</li>";
|
||
|
$string .= "</ul>";
|
||
|
|
||
|
return $string;
|
||
|
})
|
||
|
->rawColumns(['action', 'details', 'company_email', 'company_name', 'status', 'package', 'sub_domain'])
|
||
|
->make(true);
|
||
|
}
|
||
|
|
||
|
public function storeAndUpdate($company, $request)
|
||
|
{
|
||
|
$company->company_name = $request->input('company_name');
|
||
|
$company->company_email = $request->input('company_email');
|
||
|
$company->company_phone = $request->input('company_phone');
|
||
|
$company->website = $request->input('website');
|
||
|
$company->address = $request->input('address');
|
||
|
$company->timezone = $request->input('timezone');
|
||
|
$company->locale = $request->input('locale');
|
||
|
$company->status = $request->status;
|
||
|
|
||
|
if ($request->hasFile('logo')) {
|
||
|
$company->logo = Files::upload($request->logo, 'app-logo');
|
||
|
}
|
||
|
|
||
|
$company->last_updated_by = $this->user->id;
|
||
|
|
||
|
if (module_enabled('Subdomain')) {
|
||
|
$company->sub_domain = $request->sub_domain;
|
||
|
}
|
||
|
|
||
|
$company->save();
|
||
|
|
||
|
|
||
|
try {
|
||
|
$this->updateExchangeRatesCompanyWise($company);
|
||
|
} catch (\Exception $e) {
|
||
|
}
|
||
|
|
||
|
|
||
|
return $company;
|
||
|
}
|
||
|
|
||
|
public function verifyUser()
|
||
|
{
|
||
|
$userId = request('user_id');
|
||
|
$user = User::withoutGlobalScope(CompanyScope::class)->withoutGlobalScope('active')->find($userId);
|
||
|
User::emailVerify($user->email_verification_code);
|
||
|
|
||
|
return Reply::success(__('messages.updateSuccess'));
|
||
|
}
|
||
|
}
|