PHP 7.4.33
Preview: ScoreRepository.php Size: 11.37 KB
/var/www/multi-event-cfp.bitkit.dk/httpdocs/app/Repositories/ScoreRepository.php
<?php

namespace App\Repositories;

use App\Models\Abstracts;
use App\Models\Score;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use App\Exports\ExportScoresClass;
use App\Models\Event;
use Log;

class ScoreRepository extends Repository
{
    public function __construct($event = null)
    {
        $this->for($event);
    }

    public function model(): Score
    {
        return new Score;
    }

    /**
     * @param Event $event
     * @param $abstractId
     * @param $score
     * @return mixed
     */
    public function createOrUpdate(Event $event, $abstractId, $score)
    {
        /** @var Abstracts $abstract */
        $abstract = Abstracts::find($abstractId);
        if (!$abstract)
            validationErrorResponse(['Invalid abstract id']);

        //validation check
        $scoreSettings = $event->score_settings->toArray();
        $scoreCriteria = $scoreSettings['scores'];
        $errorMessage = [];
        $submittedScore = $score;
        $values = collect($submittedScore['values']);
        foreach ($scoreCriteria as $criterion) {
            $label = $criterion['label'];
            if ($label !== null && $label !== '') {
                $field = getField($values, $label, 'label');
                if (!empty($field)) {
                    $field = array_shift($field);
                    if (!($field['value'] ?? false))
                        $errorMessage[] = $label . " is required";
                } else {
                    $errorMessage[] = $label . " is required";
                }
            }
        }
        if (count($errorMessage) > 0)
            validationErrorResponse($errorMessage);

        $userId = authUser()->id;
        $score = Score::whereAbstractId($abstract->id)
            ->whereUserId($userId)
            ->whereEventId($event->id)
            ->first();
        if (!$score) {
            $score = Score::create([
                'abstract_id' => $abstract->id,
                'event_id' => $event->id,
                'user_id' => $userId,
                'score' => $submittedScore
            ]);
        } else {
            $score->score = $submittedScore;
            $score->save();
        }

        //todo: change these two into jobs
        $abstract->useRepository()->calculateAbstractScore($abstract);
        $abstract->useRepository()->calculateAbstractsRank($event->id, 'create');
        $abstract->useRepository()->countNoOfVotesForAbstract($abstract);

        return $score;
    }

    public function delete(Score $score)
    {
        $abstract = $score->parentAbstract;
        $score->delete();

        //calculating abstract average score and overall rank
        $abstract->useRepository()->calculateAbstractScore($abstract);
        $abstract->useRepository()->calculateAbstractsRank($abstract->event->id, 'delete');
        $abstract->useRepository()->countNoOfVotesForAbstract($abstract);
    }

    public function exportScores($abstracts, $event)
    {

        //abstract and submitter headings
        $heading =
            [
                'Abstract ID',
                'Selection Status',
                'Submitter First Name',
                'Submitter Last Name',
                'Submitter Company',
                'Submitter Country',
                'Submitter Job Title',
                'Submitter Email',
                'Submitter Industry',
            ];


        $presenterHeading = [];
        $excelData = [];
        foreach ($abstracts as $abstract) {
            //abstract headings
            $abstractHeading = [];
            // abstract fields
            $desiredFieldIds = ['category', 'subcategory', 'title', 'abstract'];
            foreach ($event->form_settings as $key => $form_setting) {

                if (in_array($form_setting['field_id'], $desiredFieldIds)) {
                    $enabled = isset($form_setting['enabled']) ? $form_setting['enabled'] : true;

                    if ($enabled) {
                        $abstractHeading[] = $form_setting['label'];
                    }
                }
            }
            // Score settings
            $scoresArray = $event->score_settings;

            // Initialize score headings with 'Reviewer Name'
            $scoreHeading = ['Reviewer Name'];

            // Create an array to hold score labels
            $scoreLabels = [];

            // Get score labels and append to score labels array
            if (isset($scoresArray['scores'])) {
                foreach ($scoresArray['scores'] as $value) {
                    if (!empty($value['label'])) {
                        $scoreLabels[] = $value['label'];
                    }
                }
            }

            // Append the scoreLabels array to score headings
            $scoreHeading = array_merge($scoreHeading, $scoreLabels);

            // Append additional headings
            $scoreHeading[] = 'Average Score';
            $scoreHeading[] = 'Comment';

            //presenters
            $presenters = $abstract->users('abstract_presenter')->get();

            //presenters headings
            if ($presenters->count() > count($presenterHeading) / 14) {
                $i = $presenters->count() - (count($presenterHeading) / 14);
                $currentPerson = count($presenterHeading) / 14;
                for ($j = 0; $j < $i; $j++) {
                    $currentPerson++;
                    $presenterHeading[] = "Presenter $currentPerson First Name";
                    $presenterHeading[] = "Presenter $currentPerson Last Name";
                    $presenterHeading[] = "Presenter $currentPerson Email";
                    $presenterHeading[] = "Presenter $currentPerson Job Title";
                    $presenterHeading[] = "Presenter $currentPerson Company Name";
                    $presenterHeading[] = "Presenter $currentPerson Address";
                    $presenterHeading[] = "Presenter $currentPerson Town/City";
                    $presenterHeading[] = "Presenter $currentPerson State/Province";
                    $presenterHeading[] = "Presenter $currentPerson Country";
                    $presenterHeading[] = "Presenter $currentPerson Phone Number";
                    $presenterHeading[] = "Presenter $currentPerson Industry Area";
                    $presenterHeading[] = "Presenter $currentPerson Biography";
                    $presenterHeading[] = "Presenter $currentPerson Headshot";
                    $presenterHeading[] = "Presenter $currentPerson Company Logo";
                }
            }

            //scores
            $scores = $abstract->scores;
            $data = [];
            foreach ($scores as $score) {
                $data['abstract_id'] = $abstract->id;
                $data['selection_status'] = $abstract->selection_status;

                //submitter data
                $submitter = $abstract->users('abstract_submitter')->first();

                $data['submitter_first_name'] = $submitter->first_name;
                $data['submitter_last_name'] = $submitter->last_name;
                $data['submitter_company'] = $submitter->company;
                $data['submitter_country'] = $submitter->country;
                $data['submitter_job_title'] = $submitter->job_title;
                $data['submitter_email'] = $submitter->email;
                $data['submitter_industry'] = $submitter->industry_code;

                // Get abstract data and form settings
                $abstractData = $abstract->data;
                $formSettings = $event->form_settings;

                // Iterate through form settings
                foreach ($formSettings as $formSetting) {
                    // Get field ID
                    $fieldId = $formSetting['field_id'];

                    // Filter abstract data for the current field ID
                    $abstractItem = array_filter(
                        (array) $abstractData,
                        fn($data) => $fieldId === $data['field_id']
                    );

                    // Check if the field is enabled
                    $enabled = isset($formSetting['enabled']) ? $formSetting['enabled'] : true;
                    // abstract fields
                    $desiredFieldIds = ['category', 'subcategory', 'title', 'abstract'];

                    if ($abstractItem) {
                        // Retrieve the first matching abstract item
                        $abstractItem = reset($abstractItem);

                        if (in_array($fieldId, $desiredFieldIds) && $enabled) {
                            // Set field value from abstract item or default to empty
                            $data[$fieldId] = $abstractItem['value'] ?? '';
                        }
                    } else {
                        if (in_array($fieldId, $desiredFieldIds) && $enabled) {
                            // Set field value to empty
                            $data[$fieldId] = '';
                        }
                    }
                }

                //score details
                $data['reviewer_name'] = $score->user->name;
                if (isset($score->score['values'])) {
                    foreach ($score->score['values'] as $index => $scoreValue) {
                        // Check if the value exist
                        if (isset($scoreValue['value']) && isset($scoreLabels[$index]) && $scoreValue['value']) {
                            // Use the score labels to the data label
                            $data[strtolower($scoreLabels[$index])] = $scoreValue['value'];
                        }
                    }
                }

                $data['average_score'] = $score->score['average'];
                $data['comment'] = $score->score['comment'];

                //presenters details
                foreach ($presenters as $key => $person) {
                    $data["presenter_" . ($key + 1) . "_first_name"] = $person['name'];
                    $data["presenter_" . ($key + 1) . "_last_name"] = $person['last_name'];
                    $data["presenter_" . ($key + 1) . "_email"] = $person['email'];
                    $data["presenter_" . ($key + 1) . "_job_title"] = $person['job_title'];
                    $data["presenter_" . ($key + 1) . "_company"] = $person['company'];
                    $data["presenter_" . ($key + 1) . "_address"] = $person['company_address'];
                    $data["presenter_" . ($key + 1) . "_city"] = $person['city'];
                    $data["presenter_" . ($key + 1) . "_state"] = $person['state'];
                    $data["presenter_" . ($key + 1) . "_country"] = $person['country'];
                    $data["presenter_" . ($key + 1) . "_phone"] = $person['phone'];
                    $data["presenter_" . ($key + 1) . "_industry_code"] = $person['industry_code'];
                    $data["presenter_" . ($key + 1) . "_biography"] = $person['biography'];
                    $data["person_" . ($key + 1) . "_headshot"] = $person['avatar'] ? config('app.url') . '/' . $person['avatar']['value'] : null;
                    $data["person_" . ($key + 1) . "_company_logo"] = $person['company_logo'] ? config('app.url') . '/' . $person['company_logo']['value'] : null;
                }

                $excelData[] = $data;
            }
        }
        $heading = array_merge($heading, $abstractHeading, $scoreHeading, $presenterHeading);
        $finalData = array_merge([$heading], $excelData);

        $excel = Excel::download(new ExportScoresClass($finalData, count($abstractHeading)), 'scores.xlsx');

        return $excel;
    }
}

Directory Contents

Dirs: 0 × Files: 17
Name Size Perms Modified Actions
75.27 KB lrw-rw-r-- 2026-04-30 09:24:04
Edit Download
1.21 KB lrw-rw-r-- 2025-04-21 06:11:52
Edit Download
65 B lrw-r--r-- 2024-02-09 12:37:30
Edit Download
8.53 KB lrw-rw-r-- 2025-03-03 05:39:26
Edit Download
4.14 KB lrw-rw-r-- 2025-10-28 05:24:52
Edit Download
8.53 KB lrw-rw-r-- 2025-10-28 05:24:35
Edit Download
37.58 KB lrw-rw-r-- 2026-04-07 05:00:51
Edit Download
8.71 KB lrw-r--r-- 2024-02-09 12:37:30
Edit Download
59.48 KB lrwxrwxr-x 2026-04-30 09:24:03
Edit Download
4.78 KB lrw-r--r-- 2024-02-09 12:37:30
Edit Download
10.79 KB lrw-rw-r-- 2025-04-21 06:11:52
Edit Download
11.37 KB lrw-rw-r-- 2024-07-24 04:42:48
Edit Download
72.51 KB lrw-rw-r-- 2026-04-22 04:31:21
Edit Download
11.43 KB lrw-rw-r-- 2024-09-20 05:02:14
Edit Download
6.57 KB lrw-rw-r-- 2026-03-31 07:16:20
Edit Download
4.26 KB lrw-r--r-- 2024-02-09 12:37:30
Edit Download
128.96 KB lrw-rw-r-- 2026-05-07 09:06:13
Edit Download
If ZipArchive is unavailable, a .tar will be created (no compression).