query(); $mastertasks = MasterTask::select('*'); // filtrovanie na zaklade parametrov foreach ($parameters as $field => $value) { if ( ! $value) { continue; } switch ($field) { // deadline riesim, aby zobrazovalo aj mastertasky, ktore zacali v minulosti (v porovnani s prave zobrazenym mesiacom) ale deadline maju po tomto mesiaci case 'month': $mastertasks->whereDate('created_at', '<=', $parameters['year'] . '-' . $parameters['month'] . '-31') ->whereDate('deadline', '>=', $parameters['year'] . '-' . $parameters['month'] . '-01'); // $mastertasks->where('created_at', 'like', $parameters['year'] . '-' . $parameters['month'] . '-%') // ->orWhereDate('deadline', '>=', // $parameters['year'] . '-' . $parameters['month'] . '-01'); break; case 'employee_id': $mastertasks->whereHas('subtasks', function ($query) use ($value) { $query->where('user_id', $value); }); break; case 'team_id': // ak je zadany team, tak najdem vsetkych userov, ktori su v tomto teame. potom najdem vsetky subtasky, ktore su priradene ludom v tomto teame. nevyhladavam na zaklade team_id v master_taskoch, pretoze toto je nepresne. Jandl chce vidiet tasky aj pre jednotlivcov v danom teame aj ked ten task nebol assignuty pod tymto teamom $userIdArray = User::whereHas('teams', function ($query) use ($value) { $query->where('team_id', $value); })->get()->pluck('id')->toArray(); $mastertasks->whereHas('subtasks', function ($query) use ($userIdArray) { $query->where('user_id', $userIdArray); }); break; // vracia vsetky mastertasky v jednoduchom formate pre potreby dropdownu na FE (problem bol dlhy load time na zaciatku appky) case 'simple': $mastertasks = MasterTask::select('id', 'title', 'project_id', 'color'); break; // year sa pouziva iba pri month case 'year': break; default: $mastertasks->where($field, $value); break; } } $mastertasks = $mastertasks->get(); return response()->json([ 'mastertasks' => (isset($parameters['simple'])) ? MasterTaskSimpleResource::collection($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', ]); 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')) { foreach ($files['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) { $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', ]); if ($validator->fails()) { return response()->json($validator->errors(), 400); } $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 that is finished.', ], 400); } // znovuotvorenie mastertasku if ($mastertask->is_finished == 1 && isset($request->all()['data']['is_finished']) && $request->all()['data']['is_finished'] == 0) { $mastertask->is_finished = 0; $mastertask->save(); return response()->json([ 'message' => 'Master Task opened successfully', 'mastertask' => $mastertask ]); } // ak chcem ukoncit mastertask, ktory nema ani jeden subtask, ktory ma natrackovany cas, tak to nedovolim if ($mastertask->is_finished == 0 && 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->is_finished = 1; $mastertask->save(); return response()->json([ 'message' => 'Master Task finished successfully', 'mastertask' => $mastertask ]); } // validacia na max 50MB size pre attachmenty. neslo dat do klasickeho laravel validation, tak je to separe if ($files = $request->file('data')) { foreach ($files['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']; 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->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); } // pre existujuce subtasky // Pre sub tasky s natrackovaným časom - Ukončia sa sub tasky pôvodného teamu // Pre sub tasky s nenatrackovaným časom budú tieto tasky zmazané // foreach ($mastertask->subtasks as $subtask) { // if ($subtask->timesheets()->exists()) { // $subtask->is_finished = 1; // $subtask->save(); // } else { // $subtask->delete(); // } // } // vytvorim subtasky nanovo // $mastertask->subtasks()->createMany($request->all()['data']['employees']); return response()->json([ 'message' => 'Master Task updated successfully', 'mastertask' => $mastertask ]); } 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 ]); } }