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