open_project_url = config('app.open_project_url', false); $this->open_project_token = config('app.open_project_token', false); $this->open_project_project_id = config('app.open_project_project_id', false); $this->open_project_task_name = config('app.open_project_task_name', false); $this->open_project_group_id = config('app.open_project_group_id', false); $this->open_project_special_nicks_list = config('app.open_project_special_nicks_list', false); $this->open_project_work_package_type_id = config('app.open_project_work_package_type_id', false); $this->open_project_work_package_user_owner_id = config('app.open_project_work_package_user_owner_id', false); } private function open_project_project_member_task_id(stdClass $open_project_member) { try { $filter = [ [ "subject" => [ "operator" => "~", "values" => [$this->open_project_task_name . ' ' . $open_project_member->name] ] ] ]; $filter = json_encode($filter); $open_project_project_work_packages_url = $this->open_project_url . '/api/v3/projects/' . $this->open_project_project_id . '/work_packages'; $open_project_project_member_task_id = Http::withBasicAuth('apikey', $this->open_project_token)->withHeaders(['Accept' => 'application/hal+json'])->get($open_project_project_work_packages_url, [ 'filters' => $filter ]); $open_project_project_member_task_id->throw(); } catch (\Exception $e) { Log::error('open_project_add_task_to_agent E-OPEN_PROJECT-URL - ' . $e->getMessage()); throw new RuntimeException("E-OPEN_PROJECT-URL"); } $open_project_project_member_task_id = json_decode($open_project_project_member_task_id->body()); try { $open_project_project_member_task_id = $open_project_project_member_task_id->_embedded->elements; return $open_project_project_member_task_id['0']->id; } catch (\Exception $e) { Log::error('open_project_project_member_task_id - No Task ' . $this->open_project_task_name . ' ' . $open_project_member->name . 'found ' . $e->getMessage()); return null; } } private function open_project_get_main_group_members() { try { $open_project_main_group_members_url = $this->open_project_url . '/api/v3/groups/' . $this->open_project_group_id; $open_project_main_group_members = Http::withBasicAuth('apikey', $this->open_project_token)->withHeaders(['Accept' => 'application/hal+json'])->get($open_project_main_group_members_url); $open_project_main_group_members->throw(); } catch (\Exception $e) { Log::error('open_project_add_task_to_agent E-OPEN_PROJECT-URL - ' . $e->getMessage()); throw new RuntimeException("E-OPEN_PROJECT-URL"); } $open_project_main_group_members = json_decode($open_project_main_group_members->body()); $open_project_main_group_members = $open_project_main_group_members->_embedded->members; foreach ($open_project_main_group_members as $open_project_member) { if (!isset($open_project_member->name)) throw new RuntimeException("E-OPEN_PROJECT-MEMBERS-NO-NAME"); $open_project_project_member_task_id = $this->open_project_project_member_task_id($open_project_member); if (!$open_project_project_member_task_id) break; $open_project_member_list[] = ['name' => strtolower($open_project_member->name), 'id' => $open_project_member->id, 'work_package_id' => $open_project_project_member_task_id, 'total' => 0]; } return $open_project_member_list; } private function git_extract_agents_total_sum(array $issues, array $company_agents) { $issues_totals = end($issues); $agents_total_cost = []; foreach ($company_agents as $agent_name) { $agents_total_cost[$agent_name] = $issues_totals[$agent_name . ' costo']; } return $agents_total_cost; } private function git_open_project_handle_nick_discrepancies(array $open_project_member_list) { try { $open_project_special_nicks_list = json_decode($this->open_project_special_nicks_list); foreach ($open_project_member_list as &$open_project_member) { foreach ($open_project_special_nicks_list as $nick_on_open_project => $nick_on_git) { if ($open_project_member['name'] == $nick_on_open_project) { $open_project_member['name'] = $nick_on_git; } } } return $open_project_member_list; } catch (\Exception $e) { Log::error('git_open_project_handle_nick_discrepancies E-OPEN_PROJECT-NICK - ' . $e->getMessage() . ' ' . $e->getFile() . ' ' . $e->getLine()); throw new RuntimeException("E-OPEN_PROJECT-NICK"); } } private function open_project_add_to_members_total(array $open_project_member_list, array $git_extract_agents_total_sum) { try { if (isset($this->open_project_special_nicks_list)) { $open_project_member_list = $this->git_open_project_handle_nick_discrepancies($open_project_member_list); } foreach ($open_project_member_list as &$open_project_member) { $open_project_member['total'] = $git_extract_agents_total_sum[$open_project_member['name']]; } return $open_project_member_list; } catch (\Exception $e) { Log::error('open_project_add_to_members_total E-OPEN_PROJECT-ADD-TOTAL - ' . $e->getMessage()); throw new RuntimeException("E-OPEN_PROJECT-ADD-TOTAL"); } } private function set_parent_of_child_task($child_id, $parent_id) { try { $open_project_work_package_set_parent = $this->open_project_url . '/api/v3/work_packages/' . $child_id; $request_body = [ 'parent' => $parent_id, ]; $open_project_work_package_parent = Http::withBasicAuth('apikey', $this->open_project_token)->withHeaders(['Accept' => 'application/hal+json'])->post($open_project_work_package_set_parent, json_encode($request_body)); $open_project_work_package_parent->throw(); return true; } catch (\Exception $e) { Log::error('open_project_add_task_to_agent E-OPEN_PROJECT-URL - ' . $e->getMessage()); throw new RuntimeException("E-OPEN_PROJECT-URL"); } } function open_project_create_tasks(string $package_name, array $open_project_member) { try { $open_project_work_package_creation_url = $this->open_project_url . '/api/v3/projects/' . $this->open_project_project_id . '/work_packages'; $request_body = [ 'subject' => $package_name, 'description' => [ "format" => 'plain', "raw" => $open_project_member['total'], ], "_links" => [ "type" => [ "href" => "/api/v3/types/1".$this->open_project_work_package_type_id ], "assignee" => [ "href" => "/api/v3/users/".$this->open_project_work_package_user_owner_id ], "responsible" => [ "href" => "/api/v3/users/".$this->open_project_work_package_user_owner_id ], 'project' => [ 'href' => '/api/v3/projects/' . $this->open_project_project_id ]] ]; $open_project_work_package_creation = Http::withBasicAuth('apikey', $this->open_project_token)->withHeaders(['Accept' => 'application/hal+json'])->post($open_project_work_package_creation_url, json_encode($request_body)); $open_project_work_package_creation->throw(); return $open_project_work_package_creation->json()['id']; } catch (\Exception $e) { Log::error('Error creating work package', [ 'status' => $open_project_work_package_creation->status(), 'body' => $open_project_work_package_creation->body(), ]); Log::error('open_project_create_tasks E-OPEN_PROJECT-CREATE-SINGLE-TASK - ' . $e->getMessage() . ' ' . $e->getFile() . ' ' . $e->getLine()); throw new RuntimeException("E-OPEN_PROJECT-URL"); } } private function open_project_handle_tasks_creation(array $open_project_members_with_total, string $from_date, string $to_date) { try { $package_name = $from_date . ' - ' . $to_date; foreach ($open_project_members_with_total as $open_project_member) { $child_work_package = $this->open_project_create_tasks($package_name, $open_project_member); return $this->set_parent_of_child_task($child_work_package, $open_project_member['work_package_id']); } } catch (\Exception $e) { Log::error('open_project_add_task_to_agent E-OPEN_PROJECT-URL - ' . $e->getMessage() . ' ' . $e->getFile() . ' ' . $e->getLine()); throw new RuntimeException("E-OPEN_PROJECT-URL"); } } function open_project_add_task_to_agent(array $issues, array $company_agents, string $from_date, string $to_date) { try { $open_project_member_list = $this->open_project_get_main_group_members(); $git_extract_agents_total_sum = $this->git_extract_agents_total_sum($issues, $company_agents); $open_project_members_with_total = $this->open_project_add_to_members_total($open_project_member_list, $git_extract_agents_total_sum); return $this->open_project_handle_tasks_creation($open_project_members_with_total, $from_date, $to_date); } catch (\Exception $e) { Log::error('open_project - ' . $e->getMessage()); return false; } } }