<?php
namespace App\Controller;
use App\Config;
use App\Entity\MafoId\MafoAdvertisers;
use App\Entity\OkrControl;
use App\Services\Common;
use App\Services\OkrComponents;
use App\Services\UsersComponents;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
/**
*
* OKR related routes with endpoint /api/okr/{route}
*
* @Route("/api/okr", name="okr_", host="%main_subdomain%")
*/
class OkrController extends AbstractController
{
private $commonCalls;
private $doctrine;
private $userComponent;
private $mafoFinancialToolsComponents;
private $mmpComponents;
private $okrComponents;
public function __construct(Common $commonCalls, ManagerRegistry $doctrine, UsersComponents $userComponent, OkrComponents $okrComponents)
{
$this->commonCalls = $commonCalls;
$this->doctrine = $doctrine;
$this->userComponent = $userComponent;
$this->okrComponents = $okrComponents;
}
/**
* @Route("/okr-control", name="get_okr_control", methods={"GET"})
*/
public function getOkrControl(Request $request)
{
$selectedColumns = $request->query->all('data') != '' ? $request->query->all('data') : [];
$filters = $request->query->all('filters') ?? [];
$excludedFlagForFilters = $request->query->all('excludedFlagForFilters') ?? [];
$limit = $request->query->get('limit') ? $request->query->get(key: 'limit') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
$page = $request->query->get('page') ? $request->query->get('page') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
$sortBy = $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_BY;
$sortType = $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
$dateStart = date('Y-m-1', strtotime('-0 month', strtotime($request->query->get('startDate'))));
$dateEnd = date('Y-m-1', strtotime('+0 month ', strtotime($request->query->get('endDate'))));
$advertiserIds = $advertiserManagersEmail = $hyperStatus = $addedByEmails = [];
if (isset($filters)) {
foreach ($filters as $key => $value) {
$key === 'MULTISELECT_MAFO_ADVERTISERS' ? $advertiserIds = $value : false;
$key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' ? $advertiserManagersEmail = $value : false;
$key === 'MULTISELECT_MOBUPPS_TEAMS' ? $hyperStatus = $value : false;
$key === 'MULTISELECT_ADDED_BY_FROM_MAFO_USERS' ? $addedByEmails = $value : false;
}
}
$advertiserIdsExcluded = $hyperStatusExcluded = $addedByEmailsExcluded = $advertiserManagersEmailExcluded = false;
if (isset($excludedFlagForFilters)) {
foreach ($excludedFlagForFilters as $key => $value) {
$key === 'MULTISELECT_MAFO_ADVERTISERS' ? $advertiserIdsExcluded = $value : false;
$key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' ? $advertiserManagersEmailExcluded = $value : false;
$key === 'MULTISELECT_MOBUPPS_TEAMS' ? $hyperStatusExcluded = $value : false;
$key === 'MULTISELECT_ADDED_BY_FROM_MAFO_USERS' ? $addedByEmailsExcluded = $value : false;
}
}
$accountManagerIds = [];
if (!in_array(Config::ROLE_ADMIN, $this->getUser()->getRoles())) {
$accountManagerIds = $this->okrComponents->applicableAccountManagerEmailIdsToUser($this->getUser());
if ($advertiserManagersEmailExcluded && sizeof($advertiserManagersEmail) > 0) {
$accountManagerIds = array_values(array_unique(array_diff($accountManagerIds, $advertiserManagersEmail)));
$advertiserManagersEmailExcluded = false;
} else {
$advertiserManagersEmail = array_values(array_unique(array_intersect($advertiserManagersEmail, $accountManagerIds)));
}
} else {
$accountManagerIds = $advertiserManagersEmail;
}
$searchArr = [
'accountManagerEmail' => ['value' => $accountManagerIds, 'excludeFlag' => $advertiserManagersEmailExcluded, 'alias' => 'adv', 'label' => 'accountManagerEmail'],
'mobuppsTeam' => ['value' => $hyperStatus, 'excludeFlag' => $hyperStatusExcluded, 'alias' => 'advTeam', 'label' => 'id'],
'addedByEmail' => ['value' => $addedByEmails, 'excludeFlag' => $addedByEmailsExcluded, 'alias' => 'a', 'label' => 'addedByEmail'],
'advertiserId' => ['value' => $advertiserIds, 'excludeFlag' => $advertiserIdsExcluded, 'alias' => 'adv', 'label' => 'id'],
];
$okrControl = $this->doctrine->getRepository(OkrControl::class)->getOkrControlData($dateStart, $dateEnd, $searchArr, false, $getPaginatedData = true);
foreach ($okrControl as $key => $value) {
$okrControl[$key]['canEdit'] = $value['status'] == Config::OPEN_STATUS || in_array(Config::ROLE_ADMIN, $this->getUser()->getRoles());
$okrControl[$key]['canApprove'] = $value['status'] == Config::OPEN_STATUS || in_array(Config::ROLE_ADMIN, $this->getUser()->getRoles());
$okrControl[$key]['canApproveDataTip'] = $value['status'] == Config::APPROVED_STATUS ? "Already Approved" : "Approve";
$okrControl[$key]['canDelete'] = $value['status'] == Config::OPEN_STATUS || in_array(Config::ROLE_ADMIN, $this->getUser()->getRoles());;
$okrControl[$key]['canDeleteDataTip'] = "Delete";
$okrControl[$key]['periodPretty'] = $value['period']->format('Y') . ' ' . Config::MONTH_ARRAY[$value['period']->format('m') - 1];
$okrControl[$key]['statusPretty'] = strtoupper($value['status']);
}
$tableColumns = $this->commonCalls->getDataFromJsonFile(Config::TABLE_COLUMNS_WITH_JSON_FILE[Config::OKR_CONTROL]);
if ($request->query->get('downloadCSV') == 1) {
$this->commonCalls->downloadCSV($tableColumns, $okrControl, 'Okr Control');
} else {
return new JsonResponse($this->commonCalls->getPaginatedResponseForReports($okrControl, $tableColumns, $selectedColumns, $sortBy, $sortType, $limit, $page));
}
}
/**
* @Route("/okr-control", name="post_okr_control", methods={"POST"})
*/
public function postOkrControl(Request $request)
{
$file = $request->files->get('file');
$isCSV = $request->request->get('isCSV');
$payload = [];
if ($file && $isCSV === 'true') {
$file = fopen($request->files->get('file')->getPathName(), 'r');
$index = 0;
while (($line = fgetcsv($file, null, $this->commonCalls->detectCSVDelimiter($request->files->get('file')->getPathName()))) !== FALSE) {
if ($line && $index != 0) {
foreach ($line as $key => $value) {
if (preg_match("/\t/", $value)) {
$value = explode("\t", $value)[0];
} else if ($this->commonCalls->checkForString($value, ';')) {
$value = explode(";", $value)[0];
}
$line[$key] = trim(preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $value));
}
$payload[] = [
'advertiserId' => $line[0],
'period' => new \Datetime(date('Y-m', strtotime($line[1]))),
'revenue' => $line[2],
'revisionComment' => $line[3],
'row' => $index + 1
];
}
$index += 1;
}
fclose($file);
} else {
$input = json_decode($request->getContent(), true);
$advertiserId = $input['advertiserId'];
$periodValueYear = $input['periodValueYear'];
$periodValueMonth = $input['periodValueMonth'];
$revenueValue = $input['revenueValue'];
$revisionComment = $input['revisionComment'] ?? null;
$payload[] = [
'advertiserId' => $advertiserId,
'period' => new \Datetime(date('Y-m', strtotime("{$input['periodValueYear']}-{$input['periodValueMonth']}-01"))),
'revenue' => $revenueValue,
'revisionComment' => $revisionComment,
'row' => null
];
}
$error = [];
foreach ($payload as $key => $value) {
$errorInRow = false;
$rowMacro = '';
if (isset($value['row']) && $value['row']) {
$rowMacro = ' In row ' . $value['row'] . '.';
}
$advertiser = $this->doctrine->getRepository(MafoAdvertisers::class)->findOneBy(['id' => $value['advertiserId']]);
if ($advertiser === null) {
$error[] = 'Advertiser does not exists.' . $rowMacro;
$errorInRow = true;
}
$accountManagerIds = $this->okrComponents->applicableAccountManagerEmailIdsToUser($this->getUser());
if ($advertiser && ($advertiser->getAccountManagerEmail() === null || !in_array($advertiser->getAccountManagerEmail(), $accountManagerIds))) {
// $error[] = 'User is not authorised to create OKR for this advertiser.' . $rowMacro;
// $errorInRow = true;
}
if ($value['revenue'] < 0) {
$error[] = 'Revenue value cannot be less than zero.' . $rowMacro;
$errorInRow = true;
}
if ($errorInRow) {
return $this->json([$error], Response::HTTP_BAD_REQUEST);
}
$okrExists = $this->doctrine->getRepository(OkrControl::class)->findOneBy(['advertiser' => $advertiser, 'period' => $value['period']]);
if ($okrExists) {
if ($okrExists->getIsDeleted()) {
$this->doctrine->getRepository(OkrControl::class)->updateOkrControlById($okrExists->getId(), [
'revenue' => $value['revenue'],
'revisionComment' => $value['revisionComment'],
'isDeleted' => 0
]);
} else {
$error[] = 'OKR already exists for this advertiser and period.' . $rowMacro;
$errorInRow = true;
}
} else {
$this->doctrine->getRepository(OkrControl::class)->insertToOkrControl($advertiser, $value['period'], $value['revenue'], $value['revisionComment'], $this->getUser()->getEmail());
}
}
if ($error) {
return $this->json($error, Response::HTTP_BAD_REQUEST);
}
return new JsonResponse(['success' => true], Response::HTTP_OK);
}
/**
* @Route("/okr-control/{id}", name="patch_okr_control", methods={"PATCH"})
*/
public function patchOkrControl(Request $request, $id)
{
$payload = json_decode($request->getContent(), true);
$okrControl = $this->doctrine->getRepository(OkrControl::class)->findOneBy(['id' => $id]);
if (!$okrControl) {
return new JsonResponse(['error' => 'OKR control not found'], Response::HTTP_NOT_FOUND);
}
if (isset($payload['status']) && $payload['status'] === Config::APPROVED_STATUS) {
if ($payload['status'] === Config::APPROVED_STATUS) {
$payload['approvedByEmail'] = $this->getUser()->getEmail();
}
$payload['dateApproved'] = new \DateTime('now');
} else {
$payload['status'] = Config::OPEN_STATUS;
$payload['approvedByEmail'] = NULL;
$payload['dateApproved'] = null;
$payload['dateEdited'] = new \DateTime('now');
}
$accountManagerIds = $this->okrComponents->applicableAccountManagerEmailIdsToUser($this->getUser());
if (!in_array($okrControl->getAdvertiser()->getAccountManagerEmail(), $accountManagerIds)) {
$error[] = 'User is not authorised to update this OKR.';
}
$this->doctrine->getRepository(OkrControl::class)->updateOkrControlById($id, $payload);
return new JsonResponse(['success' => true], Response::HTTP_OK);
}
/**
* @Route("/okr-report", name="get_okr_report", methods={"GET"})
*/
public function getOkrReport(Request $request)
{
$selectedColumns = $request->query->all('data') != '' ? $request->query->all('data') : [];
$filters = $request->query->all('filters') ?? [];
$excludedFlagForFilters = $request->query->all('excludedFlagForFilters') ?? [];
$limit = $request->query->get('limit') ? $request->query->get(key: 'limit') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_SIZE;
$page = $request->query->get('page') ? $request->query->get('page') : Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
$sortBy = $request->query->get('sortBy') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_BY;
$sortType = $request->query->get('sortType') ?? Config::REPORTS_PAGINATION_DEFAULT_SORT_TYPE;
$dateStart = $request->query->get('startDate');
$dateEnd = $request->query->get('endDate');
$advertiserIds = $advertiserManagersEmail = $mobuppsTeamIds = $addedByEmails = [];
if (isset($filters)) {
foreach ($filters as $key => $value) {
$key === 'MULTISELECT_MAFO_ADVERTISERS' ? $advertiserIds = $value : false;
$key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' ? $advertiserManagersEmail = $value : false;
$key === 'MULTISELECT_MOBUPPS_TEAMS' ? $mobuppsTeamIds = $value : false;
$key === 'MULTISELECT_ADDED_BY_FROM_MAFO_USERS' ? $addedByEmails = $value : false;
}
}
$advertiserIdsExcluded = $mobuppsTeamIdsExcluded = $addedByEmailsExcluded = $advertiserManagersEmailExcluded = false;
if (isset($excludedFlagForFilters)) {
foreach ($excludedFlagForFilters as $key => $value) {
$key === 'MULTISELECT_MAFO_ADVERTISERS' ? $advertiserIdsExcluded = $value : false;
$key === 'MULTISELECT_ADVERTISER_MANAGER_FROM_MAFO_USERS' ? $advertiserManagersEmailExcluded = $value : false;
$key === 'MULTISELECT_MOBUPPS_TEAMS' ? $mobuppsTeamIdsExcluded = $value : false;
$key === 'MULTISELECT_ADDED_BY_FROM_MAFO_USERS' ? $addedByEmailsExcluded = $value : false;
}
}
$reportData = $this->okrComponents->getReportData($dateStart, $dateEnd, [
'advertiserIds' => $advertiserIds,
'advertiserManagersEmail' => $advertiserManagersEmail,
'mobuppsTeamIds' => $mobuppsTeamIds,
'addedByEmails' => $addedByEmails,
], [
'advertiserIdsExcluded' => $advertiserIdsExcluded,
'advertiserManagersEmailExcluded' => $advertiserManagersEmailExcluded,
'mobuppsTeamIdsExcluded' => $mobuppsTeamIdsExcluded,
'addedByEmailsExcluded' => $addedByEmailsExcluded,
], $selectedColumns, $this->getUser());
$tableColumns = $this->commonCalls->getDataFromJsonFile(Config::TABLE_COLUMNS_WITH_JSON_FILE[Config::OKR_REPORT]);
if ($request->query->get('downloadCSV') == 1) {
$this->commonCalls->downloadCSV($tableColumns, $reportData, 'Okr Report');
} else {
return new JsonResponse($this->commonCalls->getPaginatedResponseForReports($reportData, $tableColumns, $selectedColumns, $sortBy, $sortType, $limit, $page));
}
}
}