HEX
Server: Apache
System: Linux WWW 6.1.0-40-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.153-1 (2025-09-20) x86_64
User: web11 (1011)
PHP: 8.2.29
Disabled: NONE
Upload Files
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', '&nbsp;');
            $table->addColumn('actions', '&nbsp;');

            $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]);
    }

}