File: /var/www/ivs.kaunokolegija.lt/laravel/app/Http/Controllers/Admin/CompanyController.php
<?php
namespace App\Http\Controllers\Admin;
use Gate;
use Carbon\Carbon;
use App\Models\User;
use App\Models\Company;
use App\Models\Department;
use App\Models\CompanySize;
use App\Models\LegalStatus;
use App\Models\StudyProgram;
use Illuminate\Http\Request;
use App\Models\ActivityEntry;
use App\Models\ContactPerson;
use App\Models\CoopAgreement;
use App\Imports\CompaniesImport;
use App\Models\ReliabilityState;
use App\Models\CoopAgreementType;
use App\Models\AreasOfCooperation;
use App\Models\CoopAgreementState;
use App\Models\InternshipProvided;
use App\Mail\UpdateCompanyInfoMail;
use Illuminate\Support\Facades\URL;
use App\Http\Controllers\Controller;
use App\Models\DepartmentSubsection;
use Illuminate\Support\Facades\Mail;
use Maatwebsite\Excel\Facades\Excel;
use App\Models\SubAreasOfCooperation;
use Yajra\DataTables\Facades\DataTables;
use App\Http\Requests\StoreCompanyRequest;
use App\Http\Requests\UpdateCompanyRequest;
use Symfony\Component\HttpFoundation\Response;
use App\Http\Controllers\Traits\CsvImportTrait;
use App\Http\Requests\MassDestroyCompanyRequest;
class CompanyController extends Controller
{
use CsvImportTrait;
public function index(Request $request)
{
abort_if(Gate::denies('company_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');
if ($request->ajax()) {
$query = Company::with(['legalstatus', 'contactpersons', 'coopagreements', 'coopareas', 'accountabledepartments', 'accountablesubsections', 'accountablepersonkks', 'reliability', 'subareasofcooperation', 'studyprograms', 'internshipsprovided', 'socialPartnerActivityEntries', 'companysize'])->select(sprintf('%s.*', (new Company)->table));
if ($request->coopType) {
$query->whereHas('coopagreements', function ($q) use ($request) {
$q->where('type_id', $request->coopType);
});
}
if ($request->validityFrom) {
$query->whereHas('coopagreements', function ($q) use ($request) {
$q->whereDate('validity_date', '>=', $request->validityFrom);
});
}
if ($request->validityTo) {
$query->whereHas('coopagreements', function ($q) use ($request) {
$q->whereDate('validity_date', '<=', $request->validityTo);
});
}
if ($request->accountableDepartments) {
$query->whereHas('accountabledepartments', function ($q) use ($request) {
$q->where('id', $request->accountableDepartments);
});
}
// Ar tikrai sito reikia?
if ($request->accountableSubsections) {
$query->whereHas('accountablesubsections', function ($q) use ($request) {
$q->where('id', $request->accountableSubsections);
});
}
if ($request->studyPrograms) {
$query->whereHas('studyPrograms', function ($q) use ($request) {
$q->where('study_programs.id', $request->studyPrograms);
});
}
if ($request->companyName) {
$query->where('name', 'like', '%' . $request->companyName . '%');
}
if ($request->legalStatus) {
$query->where('legalstatus_id', $request->legalStatus);
}
if ($request->raisedFundsFrom) {
$query->where('raised_funds', '>=', $request->raisedFundsFrom);
}
if ($request->raisedFundsTo) {
$query->where('raised_funds', '<=', $request->raisedFundsTo);
}
if ($request->internshipsProvided) {
$query->whereHas('internshipsprovided', function ($q) use ($request) {
$q->where('internship_provideds.id', $request->internshipsProvided);
});
}
if ($request->socialPartnerActivityEntries) {
$query->whereHas('socialPartnerActivityEntries', function ($q) use ($request) {
$q->where('id', $request->socialPartnerActivityEntries);
});
}
if ($request->hasCoop !== null) {
if ($request->hasCoop == "1") {
$query->whereHas('coopagreements', function ($q) {
$q->whereNotNull('signing_date')
->orWhereDate('validity_date', '>=', now());
});
} elseif ($request->hasCoop == "0") { // Companies that do NOT have a valid coop agreement
$query->whereDoesntHave('coopagreements', function ($q) {
$q->whereNotNull('signing_date')
->orWhereDate('validity_date', '>=', now());
});
}
}
if ($request->coopAreas) {
$query->whereHas('coopareas', function ($q) use ($request) {
$q->where('id', $request->coopAreas);
});
}
if ($request->companySize) {
$query->where('company_size_id', $request->companySize);
}
$table = Datatables::of($query);
$table->addColumn('placeholder', ' ');
$table->addColumn('actions', ' ');
$table->editColumn('actions', function ($row) {
$viewGate = 'company_show';
$editGate = 'company_edit';
$deleteGate = 'company_delete';
$crudRoutePart = 'companies';
$modal = true;
$rowData = $row;
return view('partials.datatablesActions', compact(
'viewGate',
'editGate',
'deleteGate',
'crudRoutePart',
'row',
'modal',
'rowData'
));
});
$table->editColumn('id', function ($row) {
return $row->id ? $row->id : '';
});
$table->editColumn('name', function ($row) {
return $row->name ? $row->name : '';
});
$table->addColumn('legalstatus_name', function ($row) {
return $row->legalstatus ? $row->legalstatus->name : '';
});
$table->editColumn('companycode', function ($row) {
return $row->companycode ? $row->companycode : '';
});
$table->editColumn('vatcode', function ($row) {
return $row->vatcode ? $row->vatcode : '';
});
$table->editColumn('raised_funds', function ($row) {
return $row->raised_funds ?: '';
});
$table->addColumn('internshipsprovided', function ($row) {
return $row->internshipsprovided->pluck('title')->implode(', ');
});
$table->editColumn('mainaddress', function ($row) {
return $row->mainaddress ? $row->mainaddress : '';
});
$table->editColumn('company_size', function ($row) {
return $row->companysize ? $row->companysize->name : '';
});
$table->editColumn('website', function ($row) {
return $row->website ? $row->website : '';
});
$table->editColumn('directorname', function ($row) {
return $row->directorname ? $row->directorname : '';
});
$table->editColumn('contactpersons', function ($row) {
$labels = [];
foreach ($row->contactpersons as $contactperson) {
$labels[] = sprintf('<span class="label label-info label-many">%s</span>', $contactperson->email);
}
return implode(' ', $labels);
});
$table->editColumn('coopagreements', function ($row) {
$labels = [];
foreach ($row->coopagreements as $coopagreement) {
$labels[] = sprintf('<span class="label label-info label-many">%s</span>', $coopagreement->number);
}
return implode(' ', $labels);
});
$table->editColumn('coopareas', function ($row) {
$labels = [];
foreach ($row->coopareas as $cooparea) {
$labels[] = sprintf('<span class="label label-info label-many">%s</span>', $cooparea->name);
}
return implode(' ', $labels);
});
$table->editColumn('subareasofcooperation', function ($row) {
$labels = [];
foreach ($row->subAreasOfCooperation as $subareasofcooperation) {
$labels[] = sprintf('<span class="label label-info label-many">%s</span>', $subareasofcooperation->name);
}
return implode(' ', $labels);
});
$table->editColumn('accountabledepartment', function ($row) {
$labels = [];
foreach ($row->accountabledepartments as $accountabledepartment) {
$labels[] = sprintf('<span class="label label-info label-many">%s</span>', $accountabledepartment->name);
}
return implode(' ', $labels);
});
$table->editColumn('accountablesubsection', function ($row) {
$labels = [];
foreach ($row->accountablesubsections as $accountablesubsection) {
$labels[] = sprintf('<span class="label label-info label-many">%s</span>', $accountablesubsection->name);
}
return implode(' ', $labels);
});
$table->editColumn('accountablepersonkk', function ($row) {
$labels = [];
foreach ($row->accountablepersonkks as $accountablepersonkk) {
$labels[] = sprintf('<span class="label label-info label-many">%s</span>', $accountablepersonkk->name);
}
return implode(' ', $labels);
});
$table->addColumn('reliability_name', function ($row) {
return $row->reliability ? $row->reliability->name : '';
});
$table->editColumn('additional_field_1', function ($row) {
return $row->additional_field_1 ?: '';
});
$table->editColumn('additional_field_2', function ($row) {
return $row->additional_field_2 ?: '';
});
$table->editColumn('additional_field_3', function ($row) {
return $row->additional_field_3 ?: '';
});
$table->editColumn('additional_field_4', function ($row) {
return $row->additional_field_4 ?: '';
});
$table->editColumn('additional_field_5', function ($row) {
return $row->additional_field_5 ?: '';
});
$table->rawColumns(['actions', 'placeholder', 'legalstatus', 'contactpersons', 'coopagreements', 'coopareas', 'accountabledepartment', 'accountablesubsection', 'accountablepersonkk', 'reliability', 'subareasofcooperation']);
return $table->make(true);
}
$legal_statuses = LegalStatus::get();
$contact_people = ContactPerson::get();
$coop_agreements = CoopAgreement::get();
$areas_of_cooperations = AreasOfCooperation::get();
$departments = Department::get();
$department_subsections = DepartmentSubsection::get();
$users = User::get();
$reliability_states = ReliabilityState::get();
$subAreasOfCooperations = SubAreasOfCooperation::get();
$legalstatuses = LegalStatus::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), '');
$contactpersons = ContactPerson::pluck('email', 'id');
$coopagreements = CoopAgreement::pluck('number', 'id');
$coopareas = AreasOfCooperation::pluck('name', 'id');
$subareasofcooperation = SubAreasOfCooperation::pluck('name', 'id');
$accountabledepartments = Department::pluck('name', 'id');
$accountablesubsections = DepartmentSubsection::pluck('name', 'id');
$accountablepersonkks = User::pluck('name', 'id');
$reliabilities = ReliabilityState::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), '');
$social_partners = Company::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), '');
$states = CoopAgreementState::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), '');
$types = CoopAgreementType::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), '');
$contactpeople = ContactPerson::pluck('name', 'id');
$studyprograms = StudyProgram::pluck('name', 'id');
$internshipsprovided = InternshipProvided::pluck('title', 'id');
$activityentries = ActivityEntry::all();
$companysizes = CompanySize::pluck('name', 'id');
return view('admin.companies.index', compact('legal_statuses', 'contact_people', 'coop_agreements', 'areas_of_cooperations', 'departments', 'department_subsections', 'users', 'reliability_states', 'accountabledepartments', 'accountablepersonkks', 'accountablesubsections', 'contactpersons', 'coopagreements', 'coopareas', 'legalstatuses', 'reliabilities', 'social_partners', 'states', 'types', 'contactpeople', 'subAreasOfCooperations', 'subareasofcooperation', 'studyprograms', 'internshipsprovided', 'activityentries', 'companysizes'));
}
public function create()
{
abort_if(Gate::denies('company_create'), Response::HTTP_FORBIDDEN, '403 Forbidden');
$legalstatuses = LegalStatus::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), '');
$contactpersons = ContactPerson::pluck('email', 'id');
$coopagreements = CoopAgreement::pluck('number', 'id');
$coopareas = AreasOfCooperation::pluck('name', 'id');
$accountabledepartments = Department::pluck('name', 'id');
$accountablesubsections = DepartmentSubsection::pluck('name', 'id');
$accountablepersonkks = User::pluck('name', 'id');
$reliabilities = ReliabilityState::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), '');
return view('admin.companies.create', compact('accountabledepartments', 'accountablepersonkks', 'accountablesubsections', 'contactpersons', 'coopagreements', 'coopareas', 'legalstatuses', 'reliabilities'));
}
public function store(StoreCompanyRequest $request)
{
$company = Company::create($request->all());
$company->contactpersons()->sync($request->input('contactpersons', []));
$company->coopagreements()->sync($request->input('coopagreements', []));
$company->coopareas()->sync($request->input('coopareas', []));
$company->accountabledepartments()->sync($request->input('accountabledepartments', []));
$company->accountablesubsections()->sync($request->input('accountablesubsections', []));
$company->accountablepersonkks()->sync($request->input('accountablepersonkks', []));
$company->subareasofcooperation()->sync($request->input('subareasofcooperation', []));
$company->studyprograms()->sync($request->input('studyprograms', []));
$company->internshipsprovided()->sync($request->input('internshipsprovided', []));
if ($request->ajax()) {
return response()->json([
'success' => true,
'message' => __('Sukurta sekmingai'),
'data' => $company,
], 201);
}
return redirect()->route('admin.companies.index');
}
public function edit(Company $company)
{
abort_if(Gate::denies('company_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden');
$legalstatuses = LegalStatus::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), '');
$contactpersons = ContactPerson::pluck('email', 'id');
$coopagreements = CoopAgreement::pluck('number', 'id');
$coopareas = AreasOfCooperation::pluck('name', 'id');
$accountabledepartments = Department::pluck('name', 'id');
$accountablesubsections = DepartmentSubsection::pluck('name', 'id');
$accountablepersonkks = User::pluck('name', 'id');
$reliabilities = ReliabilityState::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), '');
$company->load('legalstatus', 'contactpersons', 'coopagreements', 'coopareas', 'accountabledepartments', 'accountablesubsections', 'accountablepersonkks', 'reliability');
return view('admin.companies.edit', compact('accountabledepartments', 'accountablepersonkks', 'accountablesubsections', 'company', 'contactpersons', 'coopagreements', 'coopareas', 'legalstatuses', 'reliabilities'));
}
public function update(UpdateCompanyRequest $request, Company $company)
{
$company->update($request->all());
$company->contactpersons()->sync($request->input('contactpersons', []));
$company->coopagreements()->sync($request->input('coopagreements', []));
$company->coopareas()->sync($request->input('coopareas', []));
$company->accountabledepartments()->sync($request->input('accountabledepartments', []));
$company->accountablesubsections()->sync($request->input('accountablesubsections', []));
$company->accountablepersonkks()->sync($request->input('accountablepersonkks', []));
$company->subareasofcooperation()->sync($request->input('subareasofcooperation', []));
$company->studyprograms()->sync($request->input('studyprograms', []));
$company->internshipsprovided()->sync($request->input('internshipsprovided', []));
if ($request->ajax()){
return response()->json([
'success' => true,
'data' => $company,
]);
}
return redirect()->route('admin.companies.index');
}
public function show(Company $company)
{
abort_if(Gate::denies('company_show'), Response::HTTP_FORBIDDEN, '403 Forbidden');
$social_partners = Company::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), '');
$subareasofcooperation = SubAreasOfCooperation::pluck('name', 'id');
$legalstatuses = LegalStatus::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), '');
$coopagreements = CoopAgreement::pluck('number', 'id');
$accountabledepartments = Department::pluck('name', 'id');
$accountablesubsections = DepartmentSubsection::pluck('name', 'id');
$accountablepersonkks = User::pluck('name', 'id');
$reliabilities = ReliabilityState::pluck('name', 'id')->prepend(trans('global.pleaseSelect'), '');
$company->load('legalstatus', 'contactpersons', 'coopagreements', 'coopareas', 'accountabledepartments', 'accountablesubsections', 'accountablepersonkks', 'reliability', 'socialPartnerActivityEntries', 'socialPartnerCoopAgreements', 'socialPartnerContactPeople');
return view('admin.companies.show', compact('company', 'social_partners', 'subareasofcooperation', 'legalstatuses', 'coopagreements', 'accountabledepartments', 'accountablesubsections', 'accountablepersonkks', 'reliabilities'));
}
public function destroy(Company $company)
{
abort_if(Gate::denies('company_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden');
$company->forceDelete();
return back();
}
public function massDestroy(MassDestroyCompanyRequest $request)
{
$companies = Company::find(request('ids'));
foreach ($companies as $company) {
$company->forceDelete();
}
return response(null, Response::HTTP_NO_CONTENT);
}
public function import(Request $request)
{
$request->validate([
'file' => 'required|file|mimes:xlsx,xls,csv',
]);
try {
$file = $request->file('file');
$import = new CompaniesImport();
Excel::import($import, $file);
return redirect()->back()->with('success', __('global.create_success'));
} catch (\Exception $e) {
return redirect()->back()->with('error', 'An error occurred: ' . $e->getMessage());
}
}
public function sendUpdateEmail(Request $request)
{
$ids = $request->input('ids');
if (empty($ids)) {
$companies = Company::all();
} else {
$companies = Company::whereIn('id', $ids)->get();
}
foreach ($companies as $company) {
// dd($company->contactpersons()->first()->email);
$firstEmail = $company->contactpersons()->first()?->email;
if (empty($firstEmail) || !filter_var($firstEmail, FILTER_VALIDATE_EMAIL)) {
continue;
}
$sendEmail = false;
if (is_null($company->update_email_sent_at)) {
$sendEmail = true;
} else {
$sentAt = Carbon::parse($company->update_email_sent_at);
if ($sentAt->diffInDays(now()) > 7) {
$sendEmail = true;
}
}
// Regardless, allow the company to update info again by resetting the flag.
$company->info_updated_by_company = false;
if ($sendEmail) {
$updateLink = URL::temporarySignedRoute(
'company.updateInfo',
now()->addDays(7),
['company' => $company->id]
);
Mail::to($firstEmail)->send(new UpdateCompanyInfoMail($company, $updateLink));
$company->update_email_sent_at = now();
}
$company->save();
}
return response()->json(['success' => true]);
}
}