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/CoopAgreementController.php
<?php

namespace App\Http\Controllers\Admin;

use Gate;
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\ContactPerson;
use App\Models\CoopAgreement;
use App\Models\ReliabilityState;
use App\Models\CoopAgreementType;
use App\Models\AreasOfCooperation;
use App\Models\CoopAgreementState;
use App\Models\InternshipProvided;
use App\Http\Controllers\Controller;
use App\Models\DepartmentSubsection;
use App\Models\SubAreasOfCooperation;
use Yajra\DataTables\Facades\DataTables;
use Symfony\Component\HttpFoundation\Response;
use App\Http\Requests\StoreCoopAgreementRequest;
use App\Http\Requests\UpdateCoopAgreementRequest;
use App\Http\Controllers\Traits\MediaUploadingTrait;
use App\Http\Requests\MassDestroyCoopAgreementRequest;
use Spatie\MediaLibrary\MediaCollections\Models\Media;

class CoopAgreementController extends Controller
{
    use MediaUploadingTrait;

    public function index(Request $request)
    {
        abort_if(Gate::denies('coop_agreement_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        if ($request->ajax()) {
            $query = CoopAgreement::with(['social_partner', 'state', 'type', 'contactpeople', 'media'])->select(sprintf('%s.*', (new CoopAgreement)->table));
            $table = Datatables::of($query);

            $table->addColumn('placeholder', '&nbsp;');
            $table->addColumn('actions', '&nbsp;');

            $table->editColumn('actions', function ($row) {
                $viewGate      = 'coop_agreement_show';
                $editGate      = 'coop_agreement_edit';
                $deleteGate    = 'coop_agreement_delete';
                $crudRoutePart = 'coop-agreements';
                $modal         = true;
                $rowData       = $row;
                $upload_route  =  route('admin.coop-agreements.storeMedia');
                $file_size     = 20;

                return view('partials.datatablesActions', compact(
                    'viewGate',
                    'editGate',
                    'deleteGate',
                    'crudRoutePart',
                    'row',
                    'modal',
                    'rowData',
                    'upload_route',
                    'file_size'
                ));
            });

            $table->editColumn('id', function ($row) {
                return $row->id ? $row->id : '';
            });
            $table->addColumn('social_partner_name', function ($row) {
                return $row->social_partner ? $row->social_partner->name : '';
            });

            $table->editColumn('social_partner.companycode', function ($row) {
                return $row->social_partner ? (is_string($row->social_partner) ? $row->social_partner : $row->social_partner->companycode) : '';
            });
            $table->addColumn('state_name', function ($row) {
                return $row->state ? $row->state->name : '';
            });

            $table->addColumn('type_name', function ($row) {
                return $row->type ? $row->type->name : '';
            });

            $table->editColumn('number', function ($row) {
                return $row->number ? $row->number : '';
            });

            $table->editColumn('contactperson', function ($row) {
                $labels = [];
                foreach ($row->contactpeople as $contactperson) {
                    $labels[] = sprintf('<span class="label label-info label-many">%s</span>', $contactperson->name);
                }

                return implode(' ', $labels);
            });
            $table->editColumn('attachments', function ($row) {
                if (! $row->attachments) {
                    return '';
                }
                $links = [];
                foreach ($row->attachments as $media) {
                    $links[] = '<a href="' . $media->getUrl() . '" target="_blank">' . trans('global.downloadFile') . '</a>';
                }

                return implode(', ', $links);
            });

            $table->rawColumns(['actions', 'placeholder', 'social_partner', 'state', 'type', 'contactperson', 'attachments']);

            return $table->make(true);
        }

        $companies             = Company::get();
        $coop_agreement_states = CoopAgreementState::get();
        $coop_agreement_types  = CoopAgreementType::get();
        $contact_people        = ContactPerson::get();
        $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');
        $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'), '');
        $subAreasOfCooperations = SubAreasOfCooperation::get();
        $studyprograms = StudyProgram::pluck('name', 'id');
        $internshipsprovided = InternshipProvided::pluck('title', 'id');
        $companysizes = CompanySize::pluck('name', 'id');

        $startOfYear = now()->startOfYear();
        $endOfYear = now()->endOfYear();
        $agreementsThisYearCount = CoopAgreement::whereBetween('signing_date', [$startOfYear, $endOfYear])->count();

        return view('admin.coopAgreements.index', compact('companies', 'coop_agreement_states', 'coop_agreement_types', 'contact_people', 'social_partners', 'states', 'types', 'contactpeople', 'legalstatuses', 'contactpersons', 'coopagreements', 'coopareas', 'accountabledepartments', 'accountablesubsections', 'accountablepersonkks', 'reliabilities', 'subAreasOfCooperations', 'agreementsThisYearCount', 'studyprograms', 'internshipsprovided', 'companysizes'));
    }

    public function create()
    {
        abort_if(Gate::denies('coop_agreement_create'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        $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');

        return view('admin.coopAgreements.create', compact('contactpeople', 'social_partners', 'states', 'types'));
    }

    public function store(StoreCoopAgreementRequest $request)
    {
        $coopAgreement = CoopAgreement::create($request->all());
        $coopAgreement->contactpeople()->sync($request->input('contactpeople', []));
        //TODO: remove temp files weekly
        foreach ($request->input('attachments', []) as $file) {
            $coopAgreement->addMedia(storage_path('tmp/uploads/' . basename($file)))->toMediaCollection('attachments');
        }

        if ($media = $request->input('ck-media', false)) {
            Media::whereIn('id', $media)->update(['model_id' => $coopAgreement->id]);
        }

        if ($request->ajax()) {
            return response()->json([
                'success' => true,
                'message' => __('global.create_success'),
                'data' => ['id' => $coopAgreement->id, 'title' => $coopAgreement->number],
            ], 201);
        }

        return redirect()->route('admin.coop-agreements.index');
    }

    public function edit(CoopAgreement $coopAgreement)
    {
        abort_if(Gate::denies('coop_agreement_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        $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');

        $coopAgreement->load('social_partner', 'state', 'type', 'contactpeople');

        return view('admin.coopAgreements.edit', compact('contactpeople', 'coopAgreement', 'social_partners', 'states', 'types'));
    }

    public function update(UpdateCoopAgreementRequest $request, CoopAgreement $coopAgreement)
    {
        // dd($request->all());
        $coopAgreement->update($request->all());
        $coopAgreement->contactpeople()->sync($request->input('contactpeople', []));
        if (count($coopAgreement->attachments) > 0) {
            foreach ($coopAgreement->attachments as $media) {
                if (! in_array($media->file_name, $request->input('attachments', []))) {
                    $media->delete();
                }
            }
        }
        $media = $coopAgreement->attachments->pluck('file_name')->toArray();
        foreach ($request->input('attachments', []) as $file) {
            if (count($media) === 0 || ! in_array($file, $media)) {
                $coopAgreement->addMedia(storage_path('tmp/uploads/' . basename($file)))->toMediaCollection('attachments');
            }
        }

        if ($request->ajax()) {
            return response()->json([
                'success' => true,
                'data' => ['id' => $coopAgreement->id, 'title' => $coopAgreement->number ?? ''],
            ], 201);
        }

        return redirect()->route('admin.coop-agreements.index');
    }

    public function show(CoopAgreement $coopAgreement)
    {
        abort_if(Gate::denies('coop_agreement_show'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        $coopAgreement->load('social_partner', 'state', 'type', 'contactpeople', 'coopagreementsCompanies');

        return view('admin.coopAgreements.show', compact('coopAgreement'));
    }

    public function destroy(CoopAgreement $coopAgreement)
    {
        abort_if(Gate::denies('coop_agreement_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        $coopAgreement->delete();

        return back();
    }

    public function massDestroy(MassDestroyCoopAgreementRequest $request)
    {
        $coopAgreements = CoopAgreement::find(request('ids'));

        foreach ($coopAgreements as $coopAgreement) {
            $coopAgreement->delete();
        }

        return response(null, Response::HTTP_NO_CONTENT);
    }

    public function storeCKEditorImages(Request $request)
    {
        abort_if(Gate::denies('coop_agreement_create') && Gate::denies('coop_agreement_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        $model         = new CoopAgreement();
        $model->id     = $request->input('crud_id', 0);
        $model->exists = true;
        $media         = $model->addMediaFromRequest('upload')->toMediaCollection('ck-media');

        return response()->json(['id' => $media->id, 'url' => $media->getUrl()], Response::HTTP_CREATED);
    }
}