Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 78
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
BusinessGoals
0.00% covered (danger)
0.00%
0 / 78
0.00% covered (danger)
0.00%
0 / 4
702
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 list_business_goals
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
6
 business_goals
0.00% covered (danger)
0.00%
0 / 47
0.00% covered (danger)
0.00%
0 / 1
306
 update_business_goals
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 1
42
1<?php
2
3namespace App\Http\Controllers;
4
5use App\Models\TblBusinessGoals;
6use Illuminate\Http\Request;
7use Illuminate\Support\Facades\App;
8use Illuminate\Support\Facades\Cache;
9use Illuminate\Contracts\Routing\ResponseFactory;
10use Illuminate\Http\Response;
11use Illuminate\Support\Facades\DB;
12use Illuminate\Support\Facades\Storage;
13use Illuminate\Support\Facades\Log;
14use SendGrid\Mail\Mail;
15use GuzzleHttp\Client;
16use App\Exceptions\AppException;
17
18class BusinessGoals extends Controller
19{
20    private $locale;
21    private $userId;
22    private array $business_goals = [];
23
24    public function __construct(){        
25        $this->locale = request()->header('Locale-Id');
26        $this->userId = request()->header('User-Id');
27
28        App::setLocale($this->locale);
29    }
30
31    function list_business_goals(Request $request): ResponseFactory|Response{
32
33        try {
34
35            $data = $request->all();
36
37            $this->business_goals($data);
38
39            return response([
40                'message' => 'OK',
41                'data' => $this->business_goals,
42            ]);
43
44        } catch (\Exception $e) {
45            report(AppException::fromException($e, 'LIST_BUSINESS_GOALS_EXCEPTION'));
46            return response(['message' => 'KO', 'error' => $e->getMessage()]);
47        }
48
49    }
50
51    function business_goals(array $params): void{
52
53        $where = '';
54
55        if (isset($params['budget_type_group_id']) && $params['budget_type_group_id'] != null) {
56            $budgetTypeGroupIds = implode(',', $params['budget_type_group_id']);
57            if (count($params['budget_type_group_id']) > 0) {
58                $where .= " AND bg.budget_type_group_id IN ({$budgetTypeGroupIds}, 999999999)";
59            }
60        } else {
61            $where .= ' AND bg.budget_type_group_id > 0';
62        }
63
64        if (isset($params['user_id']) && $params['user_id'] != null) {
65            $userIds = implode(',', $params['user_id']);
66            if (count($params['user_id']) > 0) {
67                $where .= " AND bg.user_id IN ({$userIds}) OR (bg.is_default = 1 {$where})";
68            }
69        }
70
71        if (isset($params['role_id']) && $params['role_id'] != null) {
72            $roleIds = implode(',', $params['role_id']);
73            if (count($params['role_id']) > 0) {
74                $where .= " AND bg.role_id IN ({$roleIds}, 999999999)";
75            }
76        }
77
78        $query = "SELECT
79                    bg.id,
80                    bg.budget_type_group_id,
81                    CASE 
82                        WHEN bg.budget_type_group_id = 999999999 THEN 'Default'
83                        ELSE btg.name
84                    END budget_type,
85                    CASE
86                        WHEN bg.is_commercial_type = 1 THEN r.name 
87                        ELSE u.name 
88                    END users, 
89                    bg.is_commercial_type, 
90                    bg.issue_objective, 
91                    bg.acceptance_objective, 
92                    bg.new_objective, 
93                    bg.role_id, 
94                    bg.user_id,
95                    bg.is_default,
96                    bg.is_amount
97                FROM
98                    tbl_business_goals bg 
99                LEFT JOIN tbl_budget_type_groups btg 
100                    ON btg.budget_type_group_id = bg.budget_type_group_id
101                LEFT JOIN tbl_roles r 
102                    ON bg.role_id = r.role_id 
103                LEFT JOIN tbl_users u 
104                    ON bg.user_id = u.id
105                WHERE bg.id > 0 {$where}
106                ORDER BY 
107                    FIELD(bg.role_id, 999999999) DESC,
108                    FIELD(btg.budget_type_group_id, 999999999) DESC,
109                    FIELD(bg.is_commercial_type, 1) DESC,
110                    bg.role_id ASC,
111                    btg.priority ASC";
112
113        $data = DB::select($query);
114
115        $result = ['users' => [], 'roles' => [], 'budget_types' => []];
116
117        foreach ($data as $item) {
118
119            if ($item->budget_type != null) {
120                $key = $item->is_commercial_type === 1 ? 'roles' : 'users';
121
122                $id = $item->user_id;
123                if ($key == 'roles') {
124                    $id = $item->role_id;
125                }
126
127                /** @phpstan-ignore-next-line */
128                if (! array_key_exists($id, $result[$key])) {
129
130                    $result[$key][$id] = [
131                        $key == 'roles' ? 'role_id' : 'user_id' => $id,
132                        'name' => $item->is_default === 1 ? 'Default' : $item->users,
133                        'id' => $item->id,
134                        'is_default' => $item->is_default,
135                        'is_amount' => $item->is_amount,
136                        'budget_types' => [],
137                    ];
138
139                }
140
141                $result[$key][$id]['budget_types'][] = [
142                    'id' => $item->id,
143                    'budget_type_group_id' => $item->budget_type_group_id,
144                    'budget_type' => $item->budget_type,
145                    'issue_objective' => $item->issue_objective,
146                    'acceptance_objective' => $item->acceptance_objective,
147                    'new_objective' => $item->new_objective,
148                ];
149
150                array_push($result['budget_types'], $item->budget_type);
151            }
152        }
153
154        $result['users'] = array_values($result['users']);
155        $result['roles'] = array_values($result['roles']);
156        $result['budget_types'] = array_values(array_unique($result['budget_types']));
157
158        $this->business_goals = $result;
159    }
160
161    function update_business_goals(Request $request): ResponseFactory|Response{
162
163        try {
164
165            $data = $request->all();
166
167            foreach ($data as $item) {
168                $id = $item['id'];
169                unset($item['id']);
170
171                $item['updated_at'] = date('Y-m-d H:i:s');
172
173                if (isset($item['is_amount'])) {
174                    $bg = TblBusinessGoals::where('id', $id)->first();
175                    if (is_numeric($bg->user_id)) {
176                        TblBusinessGoals::where('user_id', $bg->user_id)->update($item);
177                    }
178
179                    if (is_numeric($bg->role_id)) {
180                        TblBusinessGoals::where('role_id', $bg->role_id)->update($item);
181                    }
182                }
183
184                TblBusinessGoals::where('id', $id)->update($item);
185            }
186
187            Cache::flush();
188
189            return response([
190                'message' => 'OK',
191            ]);
192
193        } catch (\Exception $e) {
194            report(AppException::fromException($e, 'UPDATE_BUSINESS_GOALS_EXCEPTION'));
195            return response(['message' => 'KO', 'error' => $e->getMessage()]);
196        }
197
198    }
199}