src/Controller/OkrController.php line 47

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Config;
  4. use App\Entity\MafoId\MafoAdvertisers;
  5. use App\Entity\OkrControl;
  6. use App\Services\Common;
  7. use App\Services\OkrComponents;
  8. use App\Services\UsersComponents;
  9. use Doctrine\Persistence\ManagerRegistry;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. /**
  16. *
  17. * OKR related routes with endpoint /api/okr/{route}
  18. *
  19. * @Route("/api/okr", name="okr_", host="%main_subdomain%")
  20. */
  21. class OkrController extends AbstractController
  22. {
  23. private $commonCalls;
  24. private $doctrine;
  25. private $userComponent;
  26. private $mafoFinancialToolsComponents;
  27. private $mmpComponents;
  28. private $okrComponents;
  29. public function __construct(Common $commonCalls, ManagerRegistry $doctrine, UsersComponents $userComponent, OkrComponents $okrComponents)
  30. {
  31. $this->commonCalls = $commonCalls;
  32. $this->doctrine = $doctrine;
  33. $this->userComponent = $userComponent;
  34. $this->okrComponents = $okrComponents;
  35. }
  36. /**
  37. * @Route("/okr-control", name="get_okr_control", methods={"GET"})
  38. */
  39. public function getOkrControl(Request $request)
  40. {
  41. $selectedColumns = $request->query->all('data') != '' ? $request->query->all('data') : [];
  42. $filters = $request->query->all('filters') ?? [];
  43. $excludedFlagForFilters = $request->query->all('excludedFlagForFilters') ?? [];
  44. $limit = $request->query->get('limit') ? $request->query->get(key: 'limit') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  45. $page = $request->query->get('page') ? $request->query->get('page') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  46. $sortBy = $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_BY;
  47. $sortType = $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  48. $dateStart = date('Y-m-1', strtotime('-0 month', strtotime($request->query->get('startDate'))));
  49. $dateEnd = date('Y-m-1', strtotime('+0 month ', strtotime($request->query->get('endDate'))));
  50. $advertiserIds = $advertiserManagersEmail = $hyperStatus = $addedByEmails = [];
  51. if (isset($filters)) {
  52. foreach ($filters as $key => $value) {
  53. $key === 'MULTISELECT_MAFO_ADVERTISERS' ? $advertiserIds = $value : false;
  54. $key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' ? $advertiserManagersEmail = $value : false;
  55. $key === 'MULTISELECT_MOBUPPS_TEAMS' ? $hyperStatus = $value : false;
  56. $key === 'MULTISELECT_ADDED_BY_FROM_MAFO_USERS' ? $addedByEmails = $value : false;
  57. }
  58. }
  59. $advertiserIdsExcluded = $hyperStatusExcluded = $addedByEmailsExcluded = $advertiserManagersEmailExcluded = false;
  60. if (isset($excludedFlagForFilters)) {
  61. foreach ($excludedFlagForFilters as $key => $value) {
  62. $key === 'MULTISELECT_MAFO_ADVERTISERS' ? $advertiserIdsExcluded = $value : false;
  63. $key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' ? $advertiserManagersEmailExcluded = $value : false;
  64. $key === 'MULTISELECT_MOBUPPS_TEAMS' ? $hyperStatusExcluded = $value : false;
  65. $key === 'MULTISELECT_ADDED_BY_FROM_MAFO_USERS' ? $addedByEmailsExcluded = $value : false;
  66. }
  67. }
  68. $accountManagerIds = [];
  69. if (!in_array(Config::ROLE_ADMIN, $this->getUser()->getRoles())) {
  70. $accountManagerIds = $this->okrComponents->applicableAccountManagerEmailIdsToUser($this->getUser());
  71. if ($advertiserManagersEmailExcluded && sizeof($advertiserManagersEmail) > 0) {
  72. $accountManagerIds = array_values(array_unique(array_diff($accountManagerIds, $advertiserManagersEmail)));
  73. $advertiserManagersEmailExcluded = false;
  74. } else {
  75. $advertiserManagersEmail = array_values(array_unique(array_intersect($advertiserManagersEmail, $accountManagerIds)));
  76. }
  77. } else {
  78. $accountManagerIds = $advertiserManagersEmail;
  79. }
  80. $searchArr = [
  81. 'accountManagerEmail' => ['value' => $accountManagerIds, 'excludeFlag' => $advertiserManagersEmailExcluded, 'alias' => 'adv', 'label' => 'accountManagerEmail'],
  82. 'mobuppsTeam' => ['value' => $hyperStatus, 'excludeFlag' => $hyperStatusExcluded, 'alias' => 'advTeam', 'label' => 'id'],
  83. 'addedByEmail' => ['value' => $addedByEmails, 'excludeFlag' => $addedByEmailsExcluded, 'alias' => 'a', 'label' => 'addedByEmail'],
  84. 'advertiserId' => ['value' => $advertiserIds, 'excludeFlag' => $advertiserIdsExcluded, 'alias' => 'adv', 'label' => 'id'],
  85. ];
  86. $okrControl = $this->doctrine->getRepository(OkrControl::class)->getOkrControlData($dateStart, $dateEnd, $searchArr, false, $getPaginatedData = true);
  87. foreach ($okrControl as $key => $value) {
  88. $okrControl[$key]['canEdit'] = $value['status'] == Config::OPEN_STATUS || in_array(Config::ROLE_ADMIN, $this->getUser()->getRoles());
  89. $okrControl[$key]['canApprove'] = $value['status'] == Config::OPEN_STATUS || in_array(Config::ROLE_ADMIN, $this->getUser()->getRoles());
  90. $okrControl[$key]['canApproveDataTip'] = $value['status'] == Config::APPROVED_STATUS ? "Already Approved" : "Approve";
  91. $okrControl[$key]['canDelete'] = $value['status'] == Config::OPEN_STATUS || in_array(Config::ROLE_ADMIN, $this->getUser()->getRoles());;
  92. $okrControl[$key]['canDeleteDataTip'] = "Delete";
  93. $okrControl[$key]['periodPretty'] = $value['period']->format('Y') . ' ' . Config::MONTH_ARRAY[$value['period']->format('m') - 1];
  94. $okrControl[$key]['statusPretty'] = strtoupper($value['status']);
  95. }
  96. $tableColumns = $this->commonCalls->getDataFromJsonFile(Config::TABLE_COLUMNS_WITH_JSON_FILE[Config::OKR_CONTROL]);
  97. if ($request->query->get('downloadCSV') == 1) {
  98. $this->commonCalls->downloadCSV($tableColumns, $okrControl, 'Okr Control');
  99. } else {
  100. return new JsonResponse($this->commonCalls->getPaginatedResponseForReports($okrControl, $tableColumns, $selectedColumns, $sortBy, $sortType, $limit, $page));
  101. }
  102. }
  103. /**
  104. * @Route("/okr-control", name="post_okr_control", methods={"POST"})
  105. */
  106. public function postOkrControl(Request $request)
  107. {
  108. $file = $request->files->get('file');
  109. $isCSV = $request->request->get('isCSV');
  110. $payload = [];
  111. if ($file && $isCSV === 'true') {
  112. $file = fopen($request->files->get('file')->getPathName(), 'r');
  113. $index = 0;
  114. while (($line = fgetcsv($file, null, $this->commonCalls->detectCSVDelimiter($request->files->get('file')->getPathName()))) !== FALSE) {
  115. if ($line && $index != 0) {
  116. foreach ($line as $key => $value) {
  117. if (preg_match("/\t/", $value)) {
  118. $value = explode("\t", $value)[0];
  119. } else if ($this->commonCalls->checkForString($value, ';')) {
  120. $value = explode(";", $value)[0];
  121. }
  122. $line[$key] = trim(preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $value));
  123. }
  124. $payload[] = [
  125. 'advertiserId' => $line[0],
  126. 'period' => new \Datetime(date('Y-m', strtotime($line[1]))),
  127. 'revenue' => $line[2],
  128. 'revisionComment' => $line[3],
  129. 'row' => $index + 1
  130. ];
  131. }
  132. $index += 1;
  133. }
  134. fclose($file);
  135. } else {
  136. $input = json_decode($request->getContent(), true);
  137. $advertiserId = $input['advertiserId'];
  138. $periodValueYear = $input['periodValueYear'];
  139. $periodValueMonth = $input['periodValueMonth'];
  140. $revenueValue = $input['revenueValue'];
  141. $revisionComment = $input['revisionComment'] ?? null;
  142. $payload[] = [
  143. 'advertiserId' => $advertiserId,
  144. 'period' => new \Datetime(date('Y-m', strtotime("{$input['periodValueYear']}-{$input['periodValueMonth']}-01"))),
  145. 'revenue' => $revenueValue,
  146. 'revisionComment' => $revisionComment,
  147. 'row' => null
  148. ];
  149. }
  150. $error = [];
  151. foreach ($payload as $key => $value) {
  152. $errorInRow = false;
  153. $rowMacro = '';
  154. if (isset($value['row']) && $value['row']) {
  155. $rowMacro = ' In row ' . $value['row'] . '.';
  156. }
  157. $advertiser = $this->doctrine->getRepository(MafoAdvertisers::class)->findOneBy(['id' => $value['advertiserId']]);
  158. if ($advertiser === null) {
  159. $error[] = 'Advertiser does not exists.' . $rowMacro;
  160. $errorInRow = true;
  161. }
  162. $accountManagerIds = $this->okrComponents->applicableAccountManagerEmailIdsToUser($this->getUser());
  163. if ($advertiser && ($advertiser->getAccountManagerEmail() === null || !in_array($advertiser->getAccountManagerEmail(), $accountManagerIds))) {
  164. // $error[] = 'User is not authorised to create OKR for this advertiser.' . $rowMacro;
  165. // $errorInRow = true;
  166. }
  167. if ($value['revenue'] < 0) {
  168. $error[] = 'Revenue value cannot be less than zero.' . $rowMacro;
  169. $errorInRow = true;
  170. }
  171. if ($errorInRow) {
  172. return $this->json([$error], Response::HTTP_BAD_REQUEST);
  173. }
  174. $okrExists = $this->doctrine->getRepository(OkrControl::class)->findOneBy(['advertiser' => $advertiser, 'period' => $value['period']]);
  175. if ($okrExists) {
  176. if ($okrExists->getIsDeleted()) {
  177. $this->doctrine->getRepository(OkrControl::class)->updateOkrControlById($okrExists->getId(), [
  178. 'revenue' => $value['revenue'],
  179. 'revisionComment' => $value['revisionComment'],
  180. 'isDeleted' => 0
  181. ]);
  182. } else {
  183. $error[] = 'OKR already exists for this advertiser and period.' . $rowMacro;
  184. $errorInRow = true;
  185. }
  186. } else {
  187. $this->doctrine->getRepository(OkrControl::class)->insertToOkrControl($advertiser, $value['period'], $value['revenue'], $value['revisionComment'], $this->getUser()->getEmail());
  188. }
  189. }
  190. if ($error) {
  191. return $this->json($error, Response::HTTP_BAD_REQUEST);
  192. }
  193. return new JsonResponse(['success' => true], Response::HTTP_OK);
  194. }
  195. /**
  196. * @Route("/okr-control/{id}", name="patch_okr_control", methods={"PATCH"})
  197. */
  198. public function patchOkrControl(Request $request, $id)
  199. {
  200. $payload = json_decode($request->getContent(), true);
  201. $okrControl = $this->doctrine->getRepository(OkrControl::class)->findOneBy(['id' => $id]);
  202. if (!$okrControl) {
  203. return new JsonResponse(['error' => 'OKR control not found'], Response::HTTP_NOT_FOUND);
  204. }
  205. if (isset($payload['status']) && $payload['status'] === Config::APPROVED_STATUS) {
  206. if ($payload['status'] === Config::APPROVED_STATUS) {
  207. $payload['approvedByEmail'] = $this->getUser()->getEmail();
  208. }
  209. $payload['dateApproved'] = new \DateTime('now');
  210. } else {
  211. $payload['status'] = Config::OPEN_STATUS;
  212. $payload['approvedByEmail'] = NULL;
  213. $payload['dateApproved'] = null;
  214. $payload['dateEdited'] = new \DateTime('now');
  215. }
  216. $accountManagerIds = $this->okrComponents->applicableAccountManagerEmailIdsToUser($this->getUser());
  217. if (!in_array($okrControl->getAdvertiser()->getAccountManagerEmail(), $accountManagerIds)) {
  218. $error[] = 'User is not authorised to update this OKR.';
  219. }
  220. $this->doctrine->getRepository(OkrControl::class)->updateOkrControlById($id, $payload);
  221. return new JsonResponse(['success' => true], Response::HTTP_OK);
  222. }
  223. /**
  224. * @Route("/okr-report", name="get_okr_report", methods={"GET"})
  225. */
  226. public function getOkrReport(Request $request)
  227. {
  228. $selectedColumns = $request->query->all('data') != '' ? $request->query->all('data') : [];
  229. $filters = $request->query->all('filters') ?? [];
  230. $excludedFlagForFilters = $request->query->all('excludedFlagForFilters') ?? [];
  231. $limit = $request->query->get('limit') ? $request->query->get(key: 'limit') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
  232. $page = $request->query->get('page') ? $request->query->get('page') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
  233. $sortBy = $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_BY;
  234. $sortType = $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
  235. $dateStart = $request->query->get('startDate');
  236. $dateEnd = $request->query->get('endDate');
  237. $advertiserIds = $advertiserManagersEmail = $mobuppsTeamIds = $addedByEmails = [];
  238. if (isset($filters)) {
  239. foreach ($filters as $key => $value) {
  240. $key === 'MULTISELECT_MAFO_ADVERTISERS' ? $advertiserIds = $value : false;
  241. $key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' ? $advertiserManagersEmail = $value : false;
  242. $key === 'MULTISELECT_MOBUPPS_TEAMS' ? $mobuppsTeamIds = $value : false;
  243. $key === 'MULTISELECT_ADDED_BY_FROM_MAFO_USERS' ? $addedByEmails = $value : false;
  244. }
  245. }
  246. $advertiserIdsExcluded = $mobuppsTeamIdsExcluded = $addedByEmailsExcluded = $advertiserManagersEmailExcluded = false;
  247. if (isset($excludedFlagForFilters)) {
  248. foreach ($excludedFlagForFilters as $key => $value) {
  249. $key === 'MULTISELECT_MAFO_ADVERTISERS' ? $advertiserIdsExcluded = $value : false;
  250. $key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' ? $advertiserManagersEmailExcluded = $value : false;
  251. $key === 'MULTISELECT_MOBUPPS_TEAMS' ? $mobuppsTeamIdsExcluded = $value : false;
  252. $key === 'MULTISELECT_ADDED_BY_FROM_MAFO_USERS' ? $addedByEmailsExcluded = $value : false;
  253. }
  254. }
  255. $reportData = $this->okrComponents->getReportData($dateStart, $dateEnd, [
  256. 'advertiserIds' => $advertiserIds,
  257. 'advertiserManagersEmail' => $advertiserManagersEmail,
  258. 'mobuppsTeamIds' => $mobuppsTeamIds,
  259. 'addedByEmails' => $addedByEmails,
  260. ], [
  261. 'advertiserIdsExcluded' => $advertiserIdsExcluded,
  262. 'advertiserManagersEmailExcluded' => $advertiserManagersEmailExcluded,
  263. 'mobuppsTeamIdsExcluded' => $mobuppsTeamIdsExcluded,
  264. 'addedByEmailsExcluded' => $addedByEmailsExcluded,
  265. ], $selectedColumns, $this->getUser());
  266. $tableColumns = $this->commonCalls->getDataFromJsonFile(Config::TABLE_COLUMNS_WITH_JSON_FILE[Config::OKR_REPORT]);
  267. if ($request->query->get('downloadCSV') == 1) {
  268. $this->commonCalls->downloadCSV($tableColumns, $reportData, 'Okr Report');
  269. } else {
  270. return new JsonResponse($this->commonCalls->getPaginatedResponseForReports($reportData, $tableColumns, $selectedColumns, $sortBy, $sortType, $limit, $page));
  271. }
  272. }
  273. }