query(); $mastertasks = MasterTask::select('*'); // filtrovanie na zaklade parametrov foreach ( $parameters as $field => $value ) { if (!$value) continue; switch ($field) { case 'created_at': $mastertasks->where($field, 'like', '%-' . $value . '-%'); break; case 'employee_id': $mastertasks->whereHas('subtasks', function ($query) use ($value) { $query->where('user_id', $value); }); break; default: $mastertasks->where($field, $value); break; } } $mastertasks = $mastertasks->get(); return response()->json([ 'mastertasks' => MasterTaskResource::collection($mastertasks) ], 200); } public function store(Request $request) { $created_by = User::getUserIdFromBearerToken($request->bearerToken()); $validator = Validator::make($request->all(), [ 'data.name' => 'required', 'data.description' => 'required', 'data.duration' => 'required', 'data.deadline' => 'required', 'data.project_id' => 'required', 'data.employees' => 'required', 'data.files' => 'max:51200', ], ['data.files.max' => 'File size must be less than 50MB']); if($validator->fails()){ return response()->json($validator->errors(), 400); } // validacia na max 50MB size pre attachmenty. neslo dat do klasickeho laravel validation, tak je to separe if ($files = $request->file('data')['files']) { foreach ( $files as $file ) { if ($file->getSize() > 52428800) return response()->json([ 'files' => 'File size must be less than 50MB', ], 400); } } // upratanie requestu, pretoze frontend pouziva inu nomenklaturu fieldov ako appka $data['data'] = $request->all()['data']; $data['data']['title'] = $request->all()['data']['name']; $data['data']['estimated_time'] = $request->all()['data']['duration']; $data['data']['created_by'] = $created_by; foreach ( $data['data']['employees'] as $key => $employee ) { $data['data']['employees'][$key]['user_id'] = $employee['id']; $data['data']['employees'][$key]['estimated_time'] = $employee['duration']; $data['data']['employees'][$key]['created_by'] = $created_by; } $request->merge($data); $mastertask = MasterTask::create($request->all()['data']); $mastertask->subtasks()->createMany($request->all()['data']['employees']); // upload attachmentu if ($request->file('data')) { $attachments = Attachment::uploadAttachmentsToS3($request->file('data')['files'], $mastertask); $mastertask->attachments()->createMany($attachments); } return response()->json([ 'message' => 'Master Task created successfully', 'mastertask' => $mastertask ], 201); } public function update($id, Request $request) { $validator = Validator::make($request->all(), [ 'data.name' => 'required', 'data.description' => 'required', 'data.duration' => 'required', 'data.deadline' => 'required', 'data.project_id' => 'required', 'data.file' => 'max:51200', ], ['data.file.max' => 'File size must be less than 50MB']); if ($validator->fails()){ return response()->json($validator->errors(), 400); } // upratanie requestu, pretoze frontend pouziva inu nomenklaturu fieldov ako appka $data['data'] = $request->all()['data']; $data['data']['title'] = $request->all()['data']['name']; $data['data']['estimated_time'] = $request->all()['data']['duration']; $request->merge($data); $mastertask = MasterTask::find($id); // ak je Master task v stave ukončený, nedovolime update. vynimkou je iba znovuotvorenie mastertasku if ($mastertask->is_finished == 1 && isset($request->all()['data']['is_finished']) && $request->all()['data']['is_finished'] == 1) { return response()->json([ 'message' => 'Cannot update mastertask with is_finished 1.', ], 400); } // ak chcem ukoncit mastertask, ktory nema ani jeden subtask, ktory ma natrackovany cas, tak to nedovolim if (isset($request->all()['data']['is_finished']) && $request->all()['data']['is_finished'] == 1) { $atLeastOneSubtaskHasTimesheet = false; foreach ($mastertask->subtasks as $subtask) { if ($subtask->timesheets()->exists()) { $atLeastOneSubtaskHasTimesheet = true; } } if (!$atLeastOneSubtaskHasTimesheet) return response()->json([ 'message' => 'Finishing mastertask is only possible where at least one subtask contains timesheet', ], 400); } $mastertask->update($request->all()['data']); // upload attachmentu // TODO prerobit na upsert if ($request->file('data')) { $attachments = Attachment::uploadAttachmentsToS3($request->file('data')['files'], $mastertask); $mastertask->attachments()->createMany($attachments); } return response()->json([ 'message' => 'Master Task updated successfully', 'mastertask' => $mastertask ]); // TODO V prípade, že sa menil zodpovedný team - Pre prebiehajúce sub tasky - Ukončia sa sub tasky pôvodného teamu a tie sa následne zarátajú do ERP Karat // TODO V prípade, že sa menil zodpovedný team - Pre nové sub tasky (s nenatrackovaným časom) budú tieto tasky zmazané } public function delete($id) { $mastertask = MasterTask::find($id); // nedovolit zmazanie mastertasku, ak existuje aspon jeden subtask s timesheetom foreach ($mastertask->subtasks as $subtask) { if ($subtask->timesheets()->exists()) { return response()->json([ 'message' => 'Cannot delete mastertask containing subtasks with submitted timesheets.', ], 400); } } $mastertask->deleteAttachments(); foreach ( $mastertask->subtasks as $subtask ) { $subtask->timeblocks()->delete(); } $mastertask->subtasks()->delete(); $mastertask->delete(); return response()->json([ 'message' => 'Master Task deleted successfully.', 'mastertask' => $mastertask ]); } }