%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /var/www/html/camillo/camillo-api-master/app/Http/Controllers/Api/v1/
Upload File :
Create Path :
Current File : /var/www/html/camillo/camillo-api-master/app/Http/Controllers/Api/v1/IndividualController.php

<?php

namespace App\Http\Controllers\Api\v1;

use App\Enums\UsertypeEnum;
use App\Http\Controllers\Controller;
use App\Http\Requests\CreateAndAssociateRequest;
use App\Http\Resources\FamilyIndividualCollection;
use App\Http\Resources\IndividualResource;
use App\Http\Resources\RollCall;
use App\Mail\TutorInvitation;
use App\Models\Individual;
use App\Models\Minor;
use App\Services\SmsService;
use App\Traits\ApiUser;
use App\User;
use Carbon\Carbon;
use Complex\Exception;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Symfony\Component\HttpKernel\Exception\HttpException;

class IndividualController extends Controller
{
    use ApiUser;

    /**
     * Shows all family members
     * @param Request $request
     * @param Minor $minor
     * @return FamilyIndividualCollection
     */
    public function getFamilyByMinor(Request $request, Minor $minor)
    {
        $user = $this->getLoggedUser();

        $user->isTutor($minor);

        $individuals = Individual::whereHas('minors', function($query) use ($minor){
            $query->where('minor_id', $minor->id);
        })->get();

        return new FamilyIndividualCollection($individuals, $minor);
    }

    /**
     * Updates a family member
     * @param Request $request
     * @param Minor $minor
     * @param Individual $individual
     * @return \Illuminate\Contracts\Routing\ResponseFactory|Response
     */
    public function updateFamilyMember(Request $request, Minor $minor, Individual $individual)
    {
        $user = $this->getLoggedUser();

        $user->isFamilyAdmin($minor);

        $fields = $request->all();
        
        if(array_key_exists("birth_date", $fields)){
            $date = Carbon::parse($fields["birth_date"]);
            $fields["birth_date"] = $date;
        }


        $individual->fill($fields);

        if(!$individual->save()){
            throw new HttpException(Response::HTTP_NOT_MODIFIED, __('update_failed'));
        }

        $individual->refresh();

        $attributes = [];
        if(array_key_exists("relative", $fields)) {
            $attributes["relative"] = $fields["relative"];
        }

        if(array_key_exists("is_admin", $fields)) {
            $attributes["is_admin"] = $fields["is_admin"];
        }

        if(count($attributes) > 0){
            try {
                $individual->minors()->updateExistingPivot($minor->id, $attributes);
            } catch (Exception $exception) {
                throw new HttpException(Response::HTTP_NOT_MODIFIED, __('update_failed'));
            }

        }

        return response(Response::HTTP_OK);
    }

    /**
     * Send invitation to an individual to join the app
     * @param Request $request
     * @param Minor $minor
     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\JsonResponse|Response
     */
    public function inviteFamilyMember(Request $request, Minor $minor)
    {
        $user = $this->getLoggedUser();

        $user->isFamilyAdmin($minor);

        $this->validate($request, [
            'fiscal_code' => 'required|size:16',
            'email' => 'required|email',
            'relative' => 'required|string'
        ]);

        $fiscal_code = $request->input('fiscal_code', false);
        $relation = $request->input('relative');

        $individual = Individual::where('fiscal_code', $fiscal_code)->first();
        $already_minor = $minor->isTutor($individual);

        if($already_minor) {
            return response(__('is_already_tutor'), Response::HTTP_NOT_MODIFIED);
        }

        if($individual){
            try {
                $individual->minors()->attach([$minor->id => ["relative" => $relation]]);

            } catch (\Exception $e) {
                return response()->json(['error' => $e->getMessage()], Response::HTTP_BAD_REQUEST);
            }

            return response(__('tutor_association_successful'), Response::HTTP_CREATED);
        }

        $email = $request->input('email');

        try {
            Mail::to($email)->send(new TutorInvitation($user->individual, $minor, $relation));
        } catch (\Exception $e) {
            return response()->json(['error' => $e->getMessage()], Response::HTTP_BAD_REQUEST);
        }
        return response(Response::HTTP_OK);
    }

    /**
     * Looks for the existence of an individual by Fiscal Code
     * @param Request $request
     * @param Minor $minor
     * @return \Illuminate\Http\JsonResponse
     */
    public function searchIndividualByFiscalCode(Request $request, Minor $minor)
    {
        $user = $this->getLoggedUser();

        $user->isFamilyAdmin($minor);

        $this->validate($request, ['fiscal_code' => 'required|size:16']);

        $fiscal_code = $request->input('fiscal_code', false);

        $individual = Individual::where('fiscal_code', $fiscal_code)->first();

        if(!$individual){
            return response()->json(["data" =>"no individual_found"], Response::HTTP_NO_CONTENT);
        }

        $already_associated = $minor->isTutor($individual);

        if($already_associated) {
            return response(__('is_already_tutor'), Response::HTTP_NOT_MODIFIED);
        }

        $isTutor = $individual->user()->whereHas('usertype', function ($u) {
            $u->where('role', UsertypeEnum::TUTOR);
        })->exists();

        if(!$isTutor) {
            return response(__('is_not_a_tutor'), Response::HTTP_CONFLICT);
        }

        return response()->json(["individual" => $individual, "minor_id" => $minor->id], Response::HTTP_OK);
    }

    /**
     * Associates an existing individual to a minor
     * @param Request $request
     * @param Individual $individual
     * @param Minor $minor
     * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\JsonResponse|Response
     */
    public function associateIndividualToMinor(Request $request, Minor $minor, Individual $individual)
    {
        $user = $this->getLoggedUser();

        $user->isFamilyAdmin($minor);

        $this->validate($request, [
            'relative' => 'required|string',
            'is_admin' => 'required|boolean'
        ]);

        $relation = $request->input('relative');
        $is_admin = $request->input('is_admin');

        $already_associated = $minor->isTutor($individual);

        if($already_associated) {
            return response(__('is_already_tutor'), Response::HTTP_NOT_MODIFIED);
        }

        try {
            $individual->minors()->attach([$minor->id => ["relative" => $relation, "is_admin" => $is_admin]]);

        } catch (\Exception $e) {
            return response()->json(['error' => $e->getMessage()], Response::HTTP_BAD_REQUEST);
        }

        $minor_name = "$minor->name $minor->surname!";
        $sms = new SmsService($individual, "minor_association", $minor_name);
        if(!$sms->send_invitation()){
            return response(__('tutor_association_successful_without_sms'), Response::HTTP_PARTIAL_CONTENT);
        }


        return response(__('tutor_association_successful'), Response::HTTP_NO_CONTENT);
    }

    /**
     * Creates and associates a new individual to a minor
     * @param CreateAndAssociateRequest|Request $request
     * @param Minor $minor
     * @return \Illuminate\Contracts\Routing\ResponseFactory|Response
     */
    public function createAndAssociateIndividualToMinor(CreateAndAssociateRequest $request, Minor $minor)
    {
        $user = $this->getLoggedUser();
        $user->isFamilyAdmin($minor);

        $data = $request->validated();

        DB::beginTransaction();
//            $random_string = str_random(8);
        try {
            $random_string = "password";

            $individual_user = new User;
            $individual_user->name = $data['user']['name'];
            $individual_user->email = isset($data['user']['username']) ? $data['user']['username'] : explode('@', $data['user']['email'])[0];
            $individual_user->password = Hash::make($random_string);
            $individual_user->usertype_id = 3;
            $individual_user->active = false;

            if (!$individual_user->save()) {
                throw new \Exception($individual_user->getErrors());
            }

            $individual_user->refresh();

            $individual = new Individual;
            $individual->name = $data['individual']['name'];
            $individual->surname = $data['individual']['surname'];
            //            $individual->birth_date = Carbon::parse($data['individual']['birth_date']);
            $individual->email = $data['user']['email'];
            $individual->fiscal_code = $data['individual']['fiscal_code'];
            $individual->mobile = $data['individual']['mobile'];
            $individual->phone = $data['individual']['phone'];
            $individual->show_contacts = $data['individual']['show_contacts'];
            $individual->user()->associate($individual_user);

            if (!$individual->save()) {
                throw new \Exception($individual->getErrors());
            }

            $relation = $data['relation']['relative'];
            $is_admin = $data['relation']['is_admin'];

            $individual->minors()->attach([$minor->id => ["relative" => $relation, "is_admin" => $is_admin]]);

            $hash = Hash::make($individual->fiscal_code . time());
            $token = str_replace(["$","#","%",".",",","@","/","\\"],rand(0,9), $hash);

            $individual_user->remember_token = $token;
            $individual_user->save();

            $url = env("WEBAPP_BASE_URL", "https://app-staging.camillo.online") . "/confirm?token=" . $token;

            //send SMS
            $sms = new SmsService($individual, "sms_invitation", $url);

            if (!$sms->send_invitation()) {
                throw new HttpException(Response::HTTP_INTERNAL_SERVER_ERROR);
            }
            DB::commit();
        }
        catch (HttpException $exception) {
            DB::rollBack();
            throw new HttpException(Response::HTTP_INTERNAL_SERVER_ERROR);
        }
        catch (\Exception $exception) {
            DB::rollBack();
            $response = response()->json(['error' => $exception->getMessage()], Response::HTTP_BAD_REQUEST);
            return $response;
        }

        return response([], Response::HTTP_NO_CONTENT);
    }

    /**
     * @param Request $request
     * @return \Illuminate\Contracts\Routing\ResponseFactory|Response
     */
    public function updateProfile(Request $request)
    {
        $user = $this->getLoggedUser();

        $individual = $user->individual;

        if(!$individual){
            throw new HttpException(Response::HTTP_PRECONDITION_FAILED, __('update_failed'));
        }

        $fields = $request->all();

        if(array_key_exists("birth_date", $fields)){
            $date = Carbon::parse($fields["birth_date"]);
            $fields["birth_date"] = $date;
        }


        $individual->fill($fields);

        if(!$individual->save()){
            throw new HttpException(Response::HTTP_NOT_MODIFIED, __('update_failed'));
        }

        return response(Response::HTTP_OK);
    }
}

Zerion Mini Shell 1.0