Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
webbingbrasil/exams-module / Services / QuestionService.php
Size: Mime:
<?php
/**
 * Created by PhpStorm.
 * User: danilo
 * Date: 21/12/15
 * Time: 12:49
 */

namespace Modules\Exams\Services;

use Illuminate\Contracts\View\Factory;
use Modules\Exams\Contracts\Repositories\AnswerRepository;
use Modules\Exams\Contracts\Repositories\QuestionRepository;
use Modules\Exams\Contracts\Repositories\ExamRepository;
use Modules\Exams\Transformers\QuestionsDatatableTransformer;
use Yajra\Datatables\Datatables;
use Yajra\Datatables\Services\DataTable as DataTableService;

class QuestionService extends DataTableService
{

    // protected $printPreview  = 'path-to-print-preview-view';
    // protected $exportColumns = ['id', 'name'];
    // protected $printColumns  = '*';

    /**
     * @var QuestionRepository
     */
    protected $questionRepository;

    /**
     * Medico constructor.
     * @param ExamRepository $repository
     */
    public function __construct(QuestionRepository $questionRepository, Datatables $datatables, Factory $viewFactory)
    {
        parent::__construct($datatables, $viewFactory);
        $this->questionRepository = $questionRepository;
    }

    public function create(array $data, $exam)
    {
        try {
            $answers = array_intersect_key($data, array_flip(preg_grep('/^answer_\d+$/', array_keys($data), 0)));
            /** @var \Modules\Exams\Entities\Question $question */
            $question = $this->questionRepository->create([
                'title' => $data['title'],
                'exam_id' => $exam,
                'is_active' => $data['is_active']
            ]);
            foreach($answers as $key => $title){
                $temp = explode('_', $key);
                $question->answer()->create([
                    'title' => $title,
                    'is_active' => true,
                    'is_correct' => end($temp) == $data['is_correct'],
                    'question_id' => $question->id
                ]);
            }

            return $question;
        }
        catch (\Exception $e) {
            return false;
        }
    }

    public function update($id, array $data)
    {
        try {
            /** @var \Modules\Exams\Entities\Question $model */
            $model = $this->questionRepository->find($id);
            $model->fill([
                'title' => $data['title'],
                'is_active' => $data['is_active']
            ])->save();
            $answers = array_intersect_key($data, array_flip(preg_grep('/^answer_\d+$/', array_keys($data), 0)));
            foreach($answers as $key => $title){
                $temp = explode('_', $key);
                $aid = end($temp);
                $adata = [
                    'title' => $title,
                    'is_active' => true,
                    'is_correct' => $aid == $data['is_correct'],
                    'exam_id' => $model->exam_id,
                    'question_id' => $model->id
                ];

                $answer = $model->answer()->findOrNew($aid);
                if($answer) {
                    $answer->fill($adata)->save();
                }else{
                    $answer->create($adata);
                }
            }
            $deletes = explode(',', $data['delete_answer']);
            $query = $model->answer()->whereIn('id', $deletes);
            $query->update(['is_correct' => false]);
            $query->delete();

            return $model;
        }
        catch (\Exception $e) {
            die($e->getMessage());
            return false;
        }
    }

    public function findById($id)
    {
        return $this->questionRepository->find($id);
    }

    public function editId($id)
    {
        return $this->findById($id);
    }

    public function findAll()
    {
    }

    public function delete($id)
    {
        return $this->questionRepository->delete($id);
    }

    public function countActive()
    {
        return $this->questionRepository->countActive();
    }

    /**
     * Display ajax response.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function ajax()
    {
        $data = $this->datatables
                ->of($this->query())
                ->setTransformer(QuestionsDatatableTransformer::class)
                ->make(true);

        return $data;
    }

    /**
     * Get the query object to be processed by datatables.
     *
     * @return \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder
     */
    public function query()
    {
        $data = $this->questionRepository->getModel()->where('exam_id', \Request::route('exam_id'))->select(['id', 'title', 'exam_id', 'is_active']);

        return $this->applyScopes($data);
    }

    /**
     * Optional method if you want to use html builder.
     *
     * @return \Yajra\Datatables\Html\Builder
     */
    public function html()
    {
        $columns =[
            ['data' => 'title', 'name' => 'title', 'title' => trans('exams::questions.list.columns.name')],
            ['data' => 'is_active', 'name' => 'is_active', 'title' => trans('exams::questions.list.columns.is_active')]
        ];

        return $this->builder()
            ->columns($columns)
            ->addAction([
                'title' => trans('exams::questions.list.columns.action'),
                'sClass' => 'dt-actions'
            ])
            ->ajax('')
            ->parameters([
                'language' => trans('core::core.datatables'),
                'dom' => 'Bfrtip',
                'buttons' => [
                    'create',
                    'pdf',
                    'csv',
                    'print'
                ],
            ]);
    }
}