diff --git a/backend/app/Http/Controllers/InternshipController.php b/backend/app/Http/Controllers/InternshipController.php index e31adf2..0097452 100644 --- a/backend/app/Http/Controllers/InternshipController.php +++ b/backend/app/Http/Controllers/InternshipController.php @@ -7,7 +7,6 @@ use App\Models\Internship; use App\Models\InternshipStatus; use App\Models\User; use Illuminate\Http\Request; -use Carbon\Carbon; class InternshipController extends Controller { @@ -61,6 +60,36 @@ class InternshipController extends Controller return response()->json($internship); } + public function get_default_agreement(Request $request, int $id) + { + $user = auth()->user(); + $internship = Internship::find($id); + + if (!$internship) { + return response()->json([ + 'message' => 'No such internship exists.' + ], 400); + } + + if ($user->role !== 'ADMIN' && $internship->user_id !== $user->id && $user->id !== $internship->company->contact) { + abort(403, 'Unauthorized'); + } + + $contact = User::find($internship->company->contact); + + $html = view('agreement.default', [ + 'company' => $internship->company, + 'companyContact' => $contact, + 'internship' => $internship, + 'student' => $internship->student, + 'student_address' => "Hlavná 123, Nitra", + ])->render(); + + return response($html, 200) + ->header('Content-Type', 'application/html') + ->header('Content-Disposition', 'attachment; filename="agreement_' . $id . '.html"'); + } + public function get_agreement(int $id) { $user = auth()->user(); diff --git a/backend/resources/views/agreement/default.blade.php b/backend/resources/views/agreement/default.blade.php new file mode 100644 index 0000000..ec0562a --- /dev/null +++ b/backend/resources/views/agreement/default.blade.php @@ -0,0 +1,300 @@ + + + + + + + Dohoda o odbornej praxi študenta + + + + +
+ Platnosť tlačiva od 1.10.2024 (aplikovaná informatika) +
+ +
+ DOHODA O ODBORNEJ PRAXI ŠTUDENTA +
+
+ uzatvorená v zmysle § 51 Občianskeho zákonníka a Zákona č. 131/2002 Z.z. o vysokých školách +
+ +
+ Univerzita Konštantína Filozofa v Nitre
+
+ Fakulta prírodných vied a informatiky
+ Trieda A. Hlinku 1, 949 01 Nitra
+ v zastúpení prof. RNDr. František Petrovič, PhD., MBA - dekan fakulty
+ e-mail: dfpvai@ukf.sk     tel. 037/6408 555 +
+
+ +
+ Poskytovateľ odbornej praxe (organizácia, resp. inštitúcia)
+
+ {{ $company->name }} v zastúpení {{ $companyContact->name }} +
+
+ +
+ Študent:
+
+ + + + + + + + + + + + + + + + + +
Meno a priezvisko:{{ $student->name }}
Adresa trvalého bydliska:{{ $student_address }}
Kontakt študenta FPVaI UKF v Nitre:{{ $student->email }}
Študijný program:aplikovaná informatika
+
+
+ +
+ uzatvárajú túto dohodu o odbornej praxi študenta. +
+ +
I. Predmet dohody
+ +
+ Predmetom tejto dohody je vykonanie odbornej praxe študenta v rozsahu 150 hodín, v termíne od + {{ \Carbon\Carbon::parse($internship->start)->format('d.m.Y') }} do + {{ \Carbon\Carbon::parse($internship->end)->format('d.m.Y') }} bezodplatne. +
+ +
II. Práva a povinnosti účastníkov dohody
+ +
1. Fakulta prírodných vied a informatiky Univerzity Konštantína Filozofa v Nitre: +
+
+ 1.1 Poverí svojho zamestnanca: Mgr. Dominik Halvoník, PhD. (ďalej garant odbornej praxe) garanciou odbornej + praxe. +
+
+ 1.2 Prostredníctvom garanta odbornej praxe: +
+ a) poskytne študentovi: +
+ - informácie o organizácii praxe, o podmienkach dojednania dohody o odbornej praxi, o obsahovom + zameraní odbornej praxe a o požiadavkách na obsahovú náplň správy z odbornej praxe,
+ - návrh dohody o odbornej praxi študenta, +
+ b) rozhodne o udelení hodnotenia „ABS" (absolvoval) študentovi na základe dokladu „Výkaz o vykonanej + odbornej praxi", vydaného poskytovateľom odbornej praxe a na základe študentom vypracovanej správy o + odbornej praxi, ktorej súčasťou je verejná obhajoba výsledkov odbornej praxe,

+ c) spravuje vyplnenú a účastníkmi podpísanú dohodu o odbornej praxi. +
+
+ +
2. Poskytovateľ odbornej praxe:
+
+ 2.1 poverí svojho zamestnanca (tútor - zodpovedný za odbornú prax v organizácii) + {{ $companyContact->name }}, ktorý bude dohliadať na dodržiavanie dohody o + odbornej praxi, plnenie obsahovej náplne odbornej praxe a bude nápomocný pri získavaní potrebných údajov pre + vypracovanie správy z odbornej praxe, +
+
+ 2.2 na začiatku praxe vykoná poučenie o bezpečnosti a ochrane zdravia pri práci v zmysle platných predpisov, +
+ +
+ +
+ 2.3 vzniknuté organizačné problémy súvisiace s plnením dohody rieši spolu s garantom odbornej praxe, +
+
+ 2.4 po ukončení odbornej praxe vydá študentovi „Výkaz o vykonanej odbornej praxi", ktorý obsahuje popis + vykonávaných činností a stručné hodnotenie študenta a je jedným z predpokladov úspešného ukončenia predmetu + Odborná prax, +
+
+ 2.5 umožní garantovi odbornej praxe a garantovi študijného predmetu kontrolu študentom plnených úloh. +
+ +
3. Študent FPVaI UKF v Nitre:
+
+ 3.1 osobne zabezpečí podpísanie tejto dohody o odbornej praxi študenta, +
+
+ 3.2 zodpovedne vykonáva činnosti pridelené tútorom odbornej praxe, +
+
+ 3.3 zabezpečí doručenie dokladu „Výkaz o vykonanej odbornej praxi" najneskôr v termínoch predpísaných + garantom pre daný semester, +
+
+ 3.4 okamžite, bez zbytočného odkladu informuje garanta odbornej praxe o problémoch, ktoré bránia plneniu + odbornej praxe. +
+ +
III. Všeobecné a záverečné ustanovenia
+ +
+ 1. Dohoda sa uzatvára na dobu určitú. Dohoda nadobúda platnosť a účinnosť dňom podpísania obidvomi zmluvnými + stranami. Obsah dohody sa môže meniť písomne len po súhlase jej zmluvných strán. +
+
+ 2. Diela vytvorené študentom sa spravujú režimom zamestnaneckého diela podľa § 90 zákona č. 185/2015 Z. z. + (Autorský zákon). V prípade, že sa dielo stane školským dielom podľa § 93 citovaného zákona, Fakulta + prírodných vied a informatiky Univerzity Konštantína Filozofa v Nitre týmto udeľuje Poskytovateľovi odbornej + praxe výhradnú, časovo a teritoriálne neobmedzenú, bezodplatnú licenciu na akékoľvek použitie alebo + sublicenciu diel vytvorených študentom počas trvania odbornej praxe. +
+
+ 3. Dohoda sa uzatvára v 3 vyhotoveniach, každá zmluvná strana obdrží jedno vyhotovenie dohody. +
+ +
+
+ V Nitre, dňa{{ \Carbon\Carbon::parse(now())->format('d.m.Y') }}. +
+
+ V Nitre, dňa {{ \Carbon\Carbon::parse(now())->format('d.m.Y') }} +
+
+ +
+
+
+ prof. RNDr. František Petrovič, PhD., MBA
+ dekan FPVaI UKF v Nitre +
+
+
+
+ {{ $companyContact->name }}
+ štatutárny zástupca pracoviska odb. praxe +
+ +
+
+
+ +
+ {{ $student->name }} +
+
+
+ + + \ No newline at end of file diff --git a/backend/routes/api.php b/backend/routes/api.php index 7d6d64b..61c7fff 100644 --- a/backend/routes/api.php +++ b/backend/routes/api.php @@ -43,20 +43,21 @@ Route::prefix('/internships')->group(function () { Route::get("/", [InternshipController::class, 'all'])->name("api.internships"); Route::get("/my", [InternshipController::class, 'all_my'])->name("api.internships.my"); - Route::middleware("auth:sanctum")->group(function () { - Route::prefix('/{id}')->group(function () { - Route::get("/", [InternshipController::class, 'get'])->name("api.internships.get"); - Route::put("/status", [InternshipStatusController::class, 'update'])->name("api.internships.status.update"); - Route::get("/statuses", [InternshipStatusController::class, 'get'])->name("api.internships.get"); - Route::get("/next-statuses", [InternshipStatusController::class, 'get_next_states'])->name("api.internships.status.next.get"); - Route::get("/agreement", [InternshipController::class, 'get_agreement'])->name("api.internships.agreement.get"); - Route::get("/report", [InternshipController::class, 'get_report'])->name("api.internships.report.get"); - Route::post("/documents", [InternshipController::class, 'update_documents'])->name("api.internships.documents.set"); - Route::post("/basic", [InternshipController::class, 'update_basic'])->name("api.internships.update.basic"); - }); - - Route::put("/new", [InternshipController::class, 'store'])->name("api.internships.create"); + //Route::middleware("auth:sanctum")->group(function () { + Route::prefix('/{id}')->group(function () { + Route::get("/", [InternshipController::class, 'get'])->name("api.internships.get"); + Route::put("/status", [InternshipStatusController::class, 'update'])->name("api.internships.status.update"); + Route::get("/statuses", [InternshipStatusController::class, 'get'])->name("api.internships.get"); + Route::get("/next-statuses", [InternshipStatusController::class, 'get_next_states'])->name("api.internships.status.next.get"); + Route::get("/default-agreement", [InternshipController::class, 'get_default_agreement'])->name("api.internships.agreement.default.get"); + Route::get("/agreement", [InternshipController::class, 'get_agreement'])->name("api.internships.agreement.get"); + Route::get("/report", [InternshipController::class, 'get_report'])->name("api.internships.report.get"); + Route::post("/documents", [InternshipController::class, 'update_documents'])->name("api.internships.documents.set"); + Route::post("/basic", [InternshipController::class, 'update_basic'])->name("api.internships.update.basic"); }); + + Route::put("/new", [InternshipController::class, 'store'])->name("api.internships.create"); + //}); }); Route::prefix('/companies')->middleware("auth:sanctum")->group(function () { diff --git a/frontend/app/components/InternshipAgreementDownloader.vue b/frontend/app/components/InternshipAgreementDownloader.vue new file mode 100644 index 0000000..20126fe --- /dev/null +++ b/frontend/app/components/InternshipAgreementDownloader.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/frontend/app/components/InternshipDocumentViewer.vue b/frontend/app/components/InternshipDocumentViewer.vue index 0c99e1a..38a9819 100644 --- a/frontend/app/components/InternshipDocumentViewer.vue +++ b/frontend/app/components/InternshipDocumentViewer.vue @@ -30,15 +30,17 @@ async function downloadReport() {