%PDF- %PDF-
Direktori : /var/www/html/camillo/camillo-api-master/app/Http/Controllers/Api/v1/ |
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); } }