<?php
namespace App\Controller;
use App\Config;
use App\Entity\MafoId\MafoAdvertisers;
use App\Entity\MafoId\MafoAdvertisersMapping;
use App\Entity\MafoId\MafoAffiliateRating;
use App\Entity\MafoId\MafoAffiliates;
use App\Entity\MafoId\MafoAffiliatesMapping;
use App\Entity\MafoId\MafoAffiliateMmpPartnerMapping;
use App\Services\Common;
use App\Services\UsersComponents;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
/**
*
* Offer related routes with endpoint /api/offers/{route}
*
* @Route("/api/database", name="database_tools_")
*/
class DatabaseController extends AbstractController
{
private $commonCalls;
private $doctrine;
private $projectDir;
private $userComponents;
private $parentUsersByUser;
private $usersByRoles;
public function __construct(Common $commonCalls, ManagerRegistry $doctrine, string $projectDir, UsersComponents $userComponents)
{
$this->commonCalls = $commonCalls;
$this->doctrine = $doctrine;
$this->projectDir = $projectDir;
$this->userComponents = $userComponents;
}
/**
* @Route("/advertisers", methods={"GET"})
*/
public function getAdvertisersAction(Request $request)
{
$limit = $request->query->get('limit') ? $request->query->get('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;
$queryParams = $request->query->all();
$mafoAdvertiserIds = $queryParams['mafoAdvertiserIds'] ?? [];
$accountManagerEmailIds = $queryParams['accountManagerEmailIds'] ?? [];
$salesManagerEmailIds = $queryParams['salesManagerEmailIds'] ?? [];
$tuneMobileAdvertiserIds = $queryParams['tuneMobileAdvertiserIds'] ?? [];
$tuneWebAdvertiserIds = $queryParams['tuneWebAdvertiserIds'] ?? [];
$hyperClientIds = $queryParams['hyperClientIds'] ?? [];
$downloadDataAsCSV = $request->query->get('downloadCSV') == 1 ? true : false;
if ($downloadDataAsCSV) {
$limit = Config::REPORTS_PAGINATION_DEFAULT_CSV_PAGE_SIZE;
$page = Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
}
$filters = [
'id' => $mafoAdvertiserIds,
'accountManagerEmail' => $accountManagerEmailIds,
'salesManagerEmail' => $salesManagerEmailIds
];
$advertiserMappingFilters = [
[
'systemIdentifier' => Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE,
'systemIdentifierId' => $tuneMobileAdvertiserIds
],
[
'systemIdentifier' => Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB,
'systemIdentifierId' => $tuneWebAdvertiserIds
],
[
'systemIdentifier' => Config::MAFO_SYSTEM_IDENTIFIER_HYPER,
'systemIdentifierId' => $hyperClientIds
]
];
$advertisers = $this->doctrine->getRepository(MafoAdvertisers::class)->getAdvertisers($filters, $advertiserMappingFilters, $limit, $page, $sortBy, $sortType);
$advertisersTotalCount = $this->doctrine->getRepository(MafoAdvertisers::class)->getAdvertisers($filters, $advertiserMappingFilters, $limit, $page, $sortBy, $sortType, true);
$finalArr = [];
foreach ($advertisers as $advertiser) {
// if (!isset($finalArr[$advertiser['id']])) {
$mappings = [
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE => [],
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB => [],
Config::MAFO_SYSTEM_IDENTIFIER_HYPER => null,
Config::MAFO_SYSTEM_IDENTIFIER_COPPER => []
];
$mappedIdsBySystemIdentifier = explode('|', $advertiser['systemIdentifiers']);
foreach ($mappedIdsBySystemIdentifier as $mappedIdBySystemIdentifier) {
$mappedIdBySystemIdentifier = explode(':', $mappedIdBySystemIdentifier);
foreach ($mappings as $key => $value) {
if (
$key == $mappedIdBySystemIdentifier[0] &&
isset($mappedIdBySystemIdentifier[2]) &&
isset($mappedIdBySystemIdentifier[1])
) {
$name = $mappedIdBySystemIdentifier[2] != '' ? $mappedIdBySystemIdentifier[2] : '';
$mappings[$key][] = [
'id' => $mappedIdBySystemIdentifier[1],
'name' => $name,
'label' => $mappedIdBySystemIdentifier[1] . ($name != "" ? " - " : "") . $name
];
}
}
}
$finalArr[$advertiser['id']] = [
'id' => $advertiser['id'],
'name' => $advertiser['name'],
'accountManagerEmail' => $advertiser['accountManagerEmail'],
'accountManagerName' => $advertiser['accountManagerName'],
'salesManagerEmail' => $advertiser['salesManagerEmail'],
'salesManagerName' => $advertiser['salesManagerName'],
'mappings' => $mappings,
'canEdit' => $this->canUserEditAdvertiserOrPublisher($this->getUser()->getEmail(), $advertiser['accountManagerEmail']),
];
}
if ($downloadDataAsCSV) {
$rows = [['Advertiser Id', 'Company', 'Account Manager Email', 'Sales Manager Email', 'Tune Mobile Advertiser Ids', 'Tune Mobile Advertisers', 'Tune Web Advertiser Ids', 'Tune Web Advertisers', 'Hyper Client Id']];
foreach ($finalArr as $key => $value) {
$rows[] = [
$value['id'],
$value['name'],
$value['accountManagerEmail'],
$value['salesManagerEmail'],
$value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE] ? implode(',', array_column($value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE], 'id')) : '',
$value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE] ? implode(',', array_column($value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE], 'label')) : '',
$value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB] ? implode(',', array_column($value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB], 'id')) : '',
$value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB] ? implode(',', array_column($value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB], 'label')) : '',
$value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_HYPER] ? implode(',', array_column($value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_HYPER], 'id')) : '',
];
}
$spreadsheet = new Spreadsheet();
$spreadsheet->getProperties()->setCreator('MAFO')
->setLastModifiedBy('MAFO')
->setTitle('Advertisers')
->setSubject('Advertisers')
->setDescription('Searched Advertisers');
$i = 0;
$spreadsheet->getActiveSheet()
->fromArray(
$rows,
NULL,
'A1'
);
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="advertisers.xls"');
header('Cache-Control: max-age=0');
$writer = IOFactory::createWriter($spreadsheet, 'Xls');
$writer->save('php://output');
exit;
}
$totalRecordCount = $advertisersTotalCount ?? null;
$noOfPages = ceil($totalRecordCount / $limit);
return new JsonResponse([
'response' => [
'status' => 'success',
'data' => array_values($finalArr),
'metadata' => [
"total" => $totalRecordCount,
"limit" => $limit,
"page" => $page,
"pages" => $noOfPages
]
]
]);
}
/**
* @Route("/advertisers/{id}", methods={"GET"})
*/
public function getAdvertisersByIdAction(Request $request, $id)
{
$advertiserInfo = $this->doctrine->getManager()->getRepository(MafoAdvertisers::class)->getAdvertiserById($id);
$finalArr = [];
foreach ($advertiserInfo as $advertiser) {
if (!isset($finalArr[$advertiser['id']])) {
$finalArr[$advertiser['id']] = [
'id' => $advertiser['id'],
'name' => $advertiser['name'],
'accountManagerEmail' => $advertiser['accountManagerEmail'],
'accountManagerName' => $advertiser['accountManagerName'],
'salesManagerEmail' => $advertiser['salesManagerEmail'],
'salesManagerName' => $advertiser['salesManagerName'],
'discountType' => $advertiser['discountType'],
'discountValue' => $advertiser['discountValue'],
'singularOrganizationKey' => $advertiser['singularOrganizationKey'],
'canEdit' => $this->canUserEditAdvertiserOrPublisher($this->getUser()->getEmail(), $advertiser['accountManagerEmail']),
'mappings' => [
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE => [],
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB => [],
Config::MAFO_SYSTEM_IDENTIFIER_HYPER => [],
Config::MAFO_SYSTEM_IDENTIFIER_COPPER => []
]
];
}
foreach ($finalArr[$advertiser['id']]['mappings'] as $k => $v) {
if (isset($advertiser['systemIdentifier']) && $advertiser['systemIdentifier'] == $k) {
if (is_array($v)) {
if ($k === Config::MAFO_SYSTEM_IDENTIFIER_HYPER) {
$finalArr[$advertiser['id']]['mappings'][$k] = [
'value' => $advertiser['systemIdentifierId'],
'label' => $advertiser['systemIdentifierId'] . " - " . $advertiser['systemIdentifierId'],
];
} else if ($k === Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE) {
$finalArr[$advertiser['id']]['mappings'][$k][] = [
'value' => $advertiser['systemIdentifierId'],
'label' => $advertiser['systemIdentifierId'] . " - " . $advertiser['tuneAdvertiserCompany'],
];
} else if ($k === Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB) {
$finalArr[$advertiser['id']]['mappings'][$k][] = [
'value' => $advertiser['systemIdentifierId'],
'label' => $advertiser['tuneAdvertiserCompany'] ? $advertiser['systemIdentifierId'] . " - " . $advertiser['tuneAdvertiserCompany'] : $advertiser['systemIdentifierId'],
];
} else {
$finalArr[$advertiser['id']]['mappings'][$k][] = [
'value' => $advertiser['systemIdentifierId'],
'label' => $advertiser['systemIdentifierId'],
];
}
}
}
}
}
return new JsonResponse([
'response' => [
'status' => 'success',
'data' => $finalArr[$id],
'metadata' => [
"total" => 1,
"limit" => 1,
"page" => 1,
"pages" => 1
]
]
]);
}
/**
* @Route("/advertisers", methods={"POST"})
*/
public function postAdvertisersAction(Request $request)
{
$payload = json_decode($request->getContent(), true);
$advertiserName = $payload['advertiserName'];
$mobileAdvertiserIds = $payload['mobileAdvertiserIds'];
$webAdvertiserIds = $payload['webAdvertiserIds'];
$hyperClientId = $payload['hyperClientId'];
$copperIds = $payload['copperIds'];
$accountManagerEmail = $payload['accountManagerEmail'];
$salesManagerEmail = $payload['salesManagerEmail'];
$discountType = $payload['discountType'];
$discountValue = $payload['discountValue'];
$singularOrganizationKey = $payload['singularOrganizationKey'] ?? null;
$error = [];
$arr = [
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE => $mobileAdvertiserIds,
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB => $webAdvertiserIds,
Config::MAFO_SYSTEM_IDENTIFIER_COPPER => $copperIds
];
if ($hyperClientId) {
$arr[Config::MAFO_SYSTEM_IDENTIFIER_HYPER] = [$hyperClientId];
}
foreach ($arr as $key => $ids) {
foreach ($ids as $id) {
$entityExists = $this->doctrine->getRepository(MafoAdvertisersMapping::class)->findOneBy([
'systemIdentifier' => $key,
'systemIdentifierId' => $id,
'deletedAt' => null
]);
if ($entityExists) {
$error[] = "ID: $id already exists for " . (Config::MAFO_SYSTEM_IDENTIFIER_MAPPING[$key]['pretty'] ?? $key) . " advertiser for MAFO ID: " . $entityExists->getMafoAdvertiserId()->getId();
}
}
}
if (!$advertiserName) {
$error[] = "Advertiser name is required";
}
if (!$discountType) {
$error[] = "Discount type is required";
if (!$discountValue) {
$error[] = "Discount value is required";
} else if ($discountValue < 0 || $discountValue > 100) {
$error[] = "Discount value must be between 0 and 100";
}
}
// Validate unique Singular Organization Key
if ($singularOrganizationKey) {
$existingAdvertiser = $this->doctrine->getRepository(MafoAdvertisers::class)->findOneBy([
'singularOrganizationKey' => $singularOrganizationKey
]);
if ($existingAdvertiser) {
$error[] = "Singular Organization Key '$singularOrganizationKey' is already used by Advertiser ID: " . $existingAdvertiser->getId() . " (" . $existingAdvertiser->getName() . ")";
}
}
if ($error) {
return new JsonResponse(['status' => 'error', 'message' => $error], 400);
}
// var_dump($advertiserName, $accountManagerEmail, $salesManagerEmail, );
$mafoAdvertiserEntity = $this->doctrine->getRepository(MafoAdvertisers::class)->insertToMafoAdvertisers($advertiserName, $accountManagerEmail, $salesManagerEmail, $this->getUser()->getEmail(), Config::ACTIVE_STATUS, $discountType, $discountValue, $singularOrganizationKey);
foreach ($arr as $key => $ids) {
foreach ($ids as $id) {
$this->doctrine->getRepository(MafoAdvertisersMapping::class)->insertToMafoAdvertisersMapping($mafoAdvertiserEntity, $key, $id, $this->getUser()->getEmail());
}
}
$scriptString = "--mafoAdvertiserId=" . $mafoAdvertiserEntity->getId();
$execCommand = "php -d memory_limit=512M " . $this->projectDir . "/bin/console app:mafoIdAdvertiserMappingChange $scriptString --env=prod > /dev/null &";
exec($execCommand);
return new JsonResponse(['status' => 'success']);
}
/**
* @Route("/advertisers/{id}", methods={"PATCH"})
*/
public function patchAdvertisersAction(Request $request, $id)
{
$payload = json_decode($request->getContent(), true);
$advertiserName = $payload['advertiserName'];
$mobileAdvertiserIds = $payload['mobileAdvertiserIds'];
$webAdvertiserIds = $payload['webAdvertiserIds'];
$copperIds = $payload['copperIds'];
$accountManagerEmail = $payload['accountManagerEmail'];
$salesManagerEmail = $payload['salesManagerEmail'];
$hyperClientId = $payload['hyperClientId'] ?? null;
$discountType = $payload['discountType'];
$discountValue = $payload['discountValue'];
$singularOrganizationKey = $payload['singularOrganizationKey'] ?? null;
$error = [];
// Validate unique Singular Organization Key (exclude current advertiser)
if ($singularOrganizationKey) {
$existingAdvertiser = $this->doctrine->getRepository(MafoAdvertisers::class)->findOneBy([
'singularOrganizationKey' => $singularOrganizationKey
]);
if ($existingAdvertiser && $existingAdvertiser->getId() != $id) {
$error[] = "Singular Organization Key '$singularOrganizationKey' is already used by Advertiser ID: " . $existingAdvertiser->getId() . " (" . $existingAdvertiser->getName() . ")";
}
}
if ($error) {
return new JsonResponse(['status' => 'error', 'message' => $error], 400);
}
$mafoAdvertiserEntity = $this->doctrine->getRepository(MafoAdvertisers::class)->updateMafoAdvertisersById($id, [
'name' => $advertiserName,
'accountManagerEmail' => $accountManagerEmail,
'salesManagerEmail' => $salesManagerEmail,
'discountType' => $discountType,
'discountValue' => $discountValue,
'singularOrganizationKey' => $singularOrganizationKey,
'updatedByEmail' => $this->getUser()->getEmail()
]);
if ($mafoAdvertiserEntity) {
$arr = [
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE => $mobileAdvertiserIds,
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB => $webAdvertiserIds,
Config::MAFO_SYSTEM_IDENTIFIER_HYPER => [],
Config::MAFO_SYSTEM_IDENTIFIER_COPPER => $copperIds
];
if ($hyperClientId) {
$arr[Config::MAFO_SYSTEM_IDENTIFIER_HYPER] = [$hyperClientId];
}
foreach ($arr as $key => $value) {
$existingCombinations = $this->doctrine->getRepository(MafoAdvertisersMapping::class)->findBy([
'mafoAdvertiserId' => $mafoAdvertiserEntity,
'systemIdentifier' => $key
]);
$existingIds = array_map(function ($item) {
return $item->getSystemIdentifierId();
}, $existingCombinations);
$newIds = array_diff($value, $existingIds);
foreach ($newIds as $newId) {
$entityExists = $this->doctrine->getRepository(MafoAdvertisersMapping::class)->findOneBy([
'systemIdentifier' => $key,
'systemIdentifierId' => $newId,
]);
if ($entityExists) {
$error[] = "ID: $newId already exists for $key system for MAFO ID: " . $entityExists->getMafoAdvertiserId()->getId();
}
}
if ($error) {
return new JsonResponse(['status' => 'error', 'message' => $error], 400);
}
foreach ($newIds as $newId) {
$this->doctrine->getRepository(MafoAdvertisersMapping::class)->insertToMafoAdvertisersMapping($mafoAdvertiserEntity, $key, $newId, $this->getUser()->getEmail());
}
$idsToBeDeleted = array_diff($existingIds, $value);
foreach ($idsToBeDeleted as $idToBeDeleted) {
$existingCombinations = $this->doctrine->getRepository(MafoAdvertisersMapping::class)->findOneBy([
'mafoAdvertiserId' => $mafoAdvertiserEntity,
'systemIdentifier' => $key,
'systemIdentifierId' => $idToBeDeleted
]);
$this->doctrine->getRepository(MafoAdvertisersMapping::class)->remove($existingCombinations, true);
// $this->doctrine->getRepository(MafoAdvertisersMapping::class)->updateMafoAdvertisersMappingById($existingCombinations->getId(), [
// 'deletedAt' => new \Datetime('now'),
// 'updatedByEmail' => $this->getUser()->getEmail()
// ]);
}
$checkIfIdsDeletedOrNot = array_intersect($existingIds, $value);
if (!empty($checkIfIdsDeletedOrNot)) {
foreach ($checkIfIdsDeletedOrNot as $checkIfIdDeletedOrNot) {
$isCombinationDeleted = $this->doctrine->getRepository(MafoAdvertisersMapping::class)->findOneBy([
'mafoAdvertiserId' => $mafoAdvertiserEntity,
'systemIdentifier' => $key,
'systemIdentifierId' => $checkIfIdDeletedOrNot,
]);
if ($isCombinationDeleted->getDeletedAt() !== null) {
$this->doctrine->getRepository(MafoAdvertisersMapping::class)->updateMafoAdvertisersMappingById($isCombinationDeleted->getId(), [
'deletedAt' => null,
'updatedByEmail' => $this->getUser()->getEmail()
]);
}
}
}
}
$scriptString = "--mafoAdvertiserId=" . $mafoAdvertiserEntity->getId();
$execCommand = "php -d memory_limit=512M " . $this->projectDir . "/bin/console app:mafoIdAdvertiserMappingChange $scriptString --env=prod > /dev/null &";
exec($execCommand);
}
return new JsonResponse(['status' => 'success']);
}
/**
* @Route("/affiliates", methods={"GET"})
*/
public function getAffiliatesAction(Request $request)
{
$limit = $request->query->get('limit') ? $request->query->get('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;
$queryParams = $request->query->all();
$mafoAffiliateIds = $queryParams['mafoAffiliateIds'] ?? [];
$accountManagerEmailIds = $queryParams['accountManagerEmailIds'] ?? [];
$salesManagerEmailIds = $queryParams['salesManagerEmailIds'] ?? [];
$mobileTuneAffiliateIds = $queryParams['mobileTuneAffiliateIds'] ?? [];
$webTuneAffiliateIds = $queryParams['webTuneAffiliateIds'] ?? [];
$hyperPublisherIds = $queryParams['hyperPublisherIds'] ?? [];
$mmpPartnerIds = $queryParams['mmpPartnerIds'] ?? [];
$downloadDataAsCSV = $request->query->get('downloadCSV') == 1 ? true : false;
if ($downloadDataAsCSV) {
$limit = Config::REPORTS_PAGINATION_DEFAULT_CSV_PAGE_SIZE;
$page = Config::REPORTS_PAGINATION_DEFAULT_PAGE_NUMBER;
}
$filters = [
'id' => $mafoAffiliateIds,
'accountManagerEmail' => $accountManagerEmailIds,
'salesManagerEmail' => $salesManagerEmailIds
];
$affiliateMappingFilters = [
[
'systemIdentifier' => Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE,
'systemIdentifierId' => $mobileTuneAffiliateIds
],
[
'systemIdentifier' => Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB,
'systemIdentifierId' => $webTuneAffiliateIds
],
[
'systemIdentifier' => Config::MAFO_SYSTEM_IDENTIFIER_HYPER,
'systemIdentifierId' => $hyperPublisherIds
]
];
// Filter by MMP Partner IDs if provided
if (is_array($mmpPartnerIds) && count($mmpPartnerIds) > 0) {
$mmpMappedAffiliates = $this->doctrine->getRepository(MafoAffiliateMmpPartnerMapping::class)->getMappingByMmpPartnerIds($mmpPartnerIds);
$mmpMappedAffiliateIds = array_unique(array_column($mmpMappedAffiliates, 'mafoAffiliateId'));
if (is_array($mafoAffiliateIds) && count($mafoAffiliateIds) > 0) {
$filters['id'] = array_values(array_intersect($mafoAffiliateIds, $mmpMappedAffiliateIds));
} else {
$filters['id'] = $mmpMappedAffiliateIds;
}
}
$affiliates = $this->doctrine->getRepository(MafoAffiliates::class)->getAffiliates($filters, $affiliateMappingFilters, $limit, $page, $sortBy, $sortType);
$affiliatesTotalCount = $this->doctrine->getRepository(MafoAffiliates::class)->getAffiliates($filters, $affiliateMappingFilters, $limit, $page, $sortBy, $sortType, true);
// Get all MMP partner mappings for the affiliates
$affiliateIds = array_column($affiliates, 'id');
$allMmpMappings = [];
if (count($affiliateIds) > 0) {
$mmpMappingData = $this->doctrine->getRepository(MafoAffiliateMmpPartnerMapping::class)->getMappingByMafoAffiliateIds($affiliateIds, false);
foreach ($mmpMappingData as $mapping) {
if (!isset($allMmpMappings[$mapping['mafoAffiliateId']])) {
$allMmpMappings[$mapping['mafoAffiliateId']] = [];
}
$allMmpMappings[$mapping['mafoAffiliateId']][] = [
'mmpPartnerId' => $mapping['mmpPartnerId'],
'mmpSource' => $mapping['mmpPartnerSource']
];
}
}
$finalArr = [];
foreach ($affiliates as $affiliate) {
$mappings = [
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE => [],
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB => [],
Config::MAFO_SYSTEM_IDENTIFIER_HYPER => [],
Config::MAFO_SYSTEM_IDENTIFIER_COPPER => []
];
$mappedIdsBySystemIdentifier = explode('|', $affiliate['systemIdentifiers']);
foreach ($mappedIdsBySystemIdentifier as $mappedIdBySystemIdentifier) {
$mappedIdBySystemIdentifier = explode(':', $mappedIdBySystemIdentifier);
foreach ($mappings as $key => $value) {
if ($key == $mappedIdBySystemIdentifier[0]) {
$name = $mappedIdBySystemIdentifier[2] != '' ? $mappedIdBySystemIdentifier[2] : '';
$mappings[$key][] = [
'id' => $mappedIdBySystemIdentifier[1],
'name' => $name,
'label' => $mappedIdBySystemIdentifier[1] . ($name != "" ? " - " : "") . $name
];
}
}
}
// if (!isset($finalArr[$affiliate['id']])) {
$finalArr[$affiliate['id']] = [
'id' => $affiliate['id'],
'name' => $affiliate['name'],
'accountManagerEmail' => $affiliate['accountManagerEmail'],
'accountManagerName' => $affiliate['accountManagerName'],
'salesManagerEmail' => $affiliate['salesManagerEmail'],
'salesManagerName' => $affiliate['salesManagerName'],
'mappings' => $mappings,
'mmpMappedData' => $allMmpMappings[$affiliate['id']] ?? [],
'canEdit' => $this->canUserEditAdvertiserOrPublisher($this->getUser()->getEmail(), $affiliate['accountManagerEmail']),
];
// }
// foreach ($finalArr[$affiliate['id']]['mappings'] as $k => $v) {
// if (isset($affiliate['systemIdentifier']) && $affiliate['systemIdentifier'] == $k) {
// if (is_array($v)) {
// $finalArr[$affiliate['id']]['mappings'][$k][] = $affiliate['systemIdentifierId'];
// } else {
// $finalArr[$affiliate['id']]['mappings'][$k] = $affiliate['systemIdentifierId'];
// }
// }
// }
}
if ($downloadDataAsCSV) {
$rows = [['Affiliate Id', 'Company', 'Account Manager Email', 'Sales Manager Email', 'Tune Mobile Affiliate Ids', 'Tune Mobile Affiliates', 'Tune Web Affiliate Ids', 'Tune Web Affiliates', 'Hyper Publisher Id', 'MMP Mapped Partners']];
foreach ($finalArr as $key => $value) {
$rows[] = [
$value['id'],
$value['name'],
$value['accountManagerEmail'],
$value['salesManagerEmail'],
$value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE] ? implode(',', array_column($value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE], 'id')) : '',
$value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE] ? implode(',', array_column($value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE], 'label')) : '',
$value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB] ? implode(',', array_column($value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB], 'id')) : '',
$value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB] ? implode(',', array_column($value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB], 'label')) : '',
$value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_HYPER] ? implode(',', array_column($value['mappings'][Config::MAFO_SYSTEM_IDENTIFIER_HYPER], 'id')) : '',
$value['mmpMappedData'] ? implode(',', array_column($value['mmpMappedData'], 'mmpPartnerId')) : '',
];
}
$spreadsheet = new Spreadsheet();
$spreadsheet->getProperties()->setCreator('MAFO')
->setLastModifiedBy('MAFO')
->setTitle('Affiliates')
->setSubject('Affiliates')
->setDescription('Searched Affiliates');
$i = 0;
$spreadsheet->getActiveSheet()
->fromArray(
$rows,
NULL,
'A1'
);
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="affiliates.xls"');
header('Cache-Control: max-age=0');
$writer = IOFactory::createWriter($spreadsheet, 'Xls');
$writer->save('php://output');
exit;
}
$totalRecordCount = $affiliatesTotalCount ?? null;
$noOfPages = ceil($totalRecordCount / $limit);
return new JsonResponse([
'response' => [
'status' => 'success',
'data' => array_values($finalArr),
'metadata' => [
"total" => $totalRecordCount,
"limit" => $limit,
"page" => $page,
"pages" => $noOfPages
]
]
]);
}
/**
* @Route("/affiliates/{id}", methods={"GET"})
*/
public function getAffiliatesByIdAction(Request $request, $id)
{
$affiliateInfo = $this->doctrine->getManager()->getRepository(MafoAffiliates::class)->getAffiliateById($id);
$hyperPublisherData = $this->commonCalls->getHyperPublisherCachedListByKeys();
$finalArr = [];
foreach ($affiliateInfo as $affiliate) {
if (!isset($finalArr[$affiliate['id']])) {
$finalArr[$affiliate['id']] = [
'id' => $affiliate['id'],
'name' => $affiliate['name'],
'accountManagerEmail' => $affiliate['accountManagerEmail'],
'accountManagerName' => $affiliate['accountManagerName'],
'salesManagerEmail' => $affiliate['salesManagerEmail'],
'salesManagerName' => $affiliate['salesManagerName'],
'partnerPaymentDueDate' => $affiliate['partnerPaymentDueDate'],
'canEdit' => $this->canUserEditAdvertiserOrPublisher($this->getUser()->getEmail(), $affiliate['accountManagerEmail']),
'mappings' => [
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE => [],
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB => [],
Config::MAFO_SYSTEM_IDENTIFIER_HYPER => [],
Config::MAFO_SYSTEM_IDENTIFIER_COPPER => []
]
];
}
foreach ($finalArr[$affiliate['id']]['mappings'] as $k => $v) {
if (isset($affiliate['systemIdentifier']) && $affiliate['systemIdentifier'] == $k) {
if (is_array($v)) {
if ($k === Config::MAFO_SYSTEM_IDENTIFIER_HYPER) {
$hyperPublisherName = array_key_exists($affiliate['systemIdentifierId'], $hyperPublisherData) ? $hyperPublisherData[$affiliate['systemIdentifierId']]['SupplierFullName'] : $affiliate['systemIdentifierId'];
$finalArr[$affiliate['id']]['mappings'][$k] = [
'value' => $affiliate['systemIdentifierId'],
'label' => $affiliate['systemIdentifierId'] . ' - ' . $hyperPublisherName,
];
} else if ($k === Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE) {
$finalArr[$affiliate['id']]['mappings'][$k][] = [
'value' => $affiliate['systemIdentifierId'],
'label' => $affiliate['systemIdentifierId'] . " - " . $affiliate['tuneAffiliateCompany'],
];
} else if ($k === Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB) {
$finalArr[$affiliate['id']]['mappings'][$k][] = [
'value' => $affiliate['systemIdentifierId'],
'label' => $affiliate['tuneAffiliateCompany'] ? $affiliate['systemIdentifierId'] . " - " . $affiliate['tuneAffiliateCompany'] : $affiliate['systemIdentifierId'],
];
} else {
$finalArr[$affiliate['id']]['mappings'][$k][] = [
'value' => $affiliate['systemIdentifierId'],
'label' => $affiliate['systemIdentifierId'],
];
}
}
}
}
}
return new JsonResponse([
'response' => [
'status' => 'success',
'data' => $finalArr[$id],
'metadata' => [
"total" => 1,
"limit" => 1,
"page" => 1,
"pages" => 1
]
]
]);
}
/**
* @Route("/affiliates", methods={"POST"})
*/
public function postAffiliatesAction(Request $request)
{
$payload = json_decode($request->getContent(), true);
$affiliateName = $payload['affiliateName'];
$mobileAffiliateIds = $payload['mobileAffiliateIds'];
$webAffiliateIds = $payload['webAffiliateIds'];
$hyperClientId = $payload['hyperClientId'] ?? null;
$copperIds = $payload['copperIds'];
$accountManagerEmail = $payload['accountManagerEmail'];
$salesManagerEmail = $payload['salesManagerEmail'];
$partnerPaymentDueDate = isset($payload['partnerPaymentDueDate']) && $payload['partnerPaymentDueDate'] !== '' ? (int) $payload['partnerPaymentDueDate'] : null;
$error = [];
$arr = [
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE => $mobileAffiliateIds,
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB => $webAffiliateIds,
Config::MAFO_SYSTEM_IDENTIFIER_COPPER => $copperIds
];
if ($hyperClientId) {
$arr[Config::MAFO_SYSTEM_IDENTIFIER_HYPER] = [$hyperClientId];
}
foreach ($arr as $key => $ids) {
foreach ($ids as $id) {
$entityExists = $this->doctrine->getRepository(MafoAffiliatesMapping::class)->findOneBy([
'systemIdentifier' => $key,
'systemIdentifierId' => $id,
'deletedAt' => null
]);
if ($entityExists) {
$error[] = "ID: $id already exists for " . (Config::MAFO_SYSTEM_IDENTIFIER_MAPPING[$key]['pretty'] ?? $key) . " affiliate for MAFO ID: " . $entityExists->getMafoAffiliateId()->getId();
}
}
}
if (!$affiliateName) {
$error[] = "Affiliate name is required";
}
if ($error) {
return new JsonResponse(['status' => 'error', 'message' => $error], 400);
}
$mafoAffiliateEntity = $this->doctrine->getRepository(MafoAffiliates::class)->insertToMafoAffiliates($affiliateName, $accountManagerEmail, $salesManagerEmail, $this->getUser()->getEmail(), $partnerPaymentDueDate);
foreach ($arr as $key => $ids) {
foreach ($ids as $id) {
$this->doctrine->getRepository(MafoAffiliatesMapping::class)->insertToMafoAffiliatesMapping($mafoAffiliateEntity, $key, $id, $this->getUser()->getEmail());
}
}
return new JsonResponse(['status' => 'success']);
}
/**
* @Route("/affiliates/{id}", methods={"PATCH"})
*/
public function patchAffiliatesAction(Request $request, $id)
{
$payload = json_decode($request->getContent(), true);
$affiliateName = $payload['affiliateName'];
$mobileAffiliateIds = $payload['mobileAffiliateIds'];
$webAffiliateIds = $payload['webAffiliateIds'];
$copperIds = $payload['copperIds'];
$accountManagerEmail = $payload['accountManagerEmail'];
$salesManagerEmail = $payload['salesManagerEmail'];
$hyperClientId = $payload['hyperClientId'] ?? null;
$partnerPaymentDueDate = isset($payload['partnerPaymentDueDate']) && $payload['partnerPaymentDueDate'] !== '' ? (int) $payload['partnerPaymentDueDate'] : null;
$error = [];
$mafoAffiliateEntity = $this->doctrine->getRepository(MafoAffiliates::class)->updateMafoAffiliatesById($id, [
'name' => $affiliateName,
'accountManagerEmail' => $accountManagerEmail,
'salesManagerEmail' => $salesManagerEmail,
'partnerPaymentDueDate' => $partnerPaymentDueDate,
'updatedByEmail' => $this->getUser()->getEmail()
]);
if ($mafoAffiliateEntity) {
$arr = [
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_MOBILE => $mobileAffiliateIds,
Config::MAFO_SYSTEM_IDENTIFIER_TUNE_WEB => $webAffiliateIds,
Config::MAFO_SYSTEM_IDENTIFIER_HYPER => [],
Config::MAFO_SYSTEM_IDENTIFIER_COPPER => $copperIds
];
if ($hyperClientId) {
$arr[Config::MAFO_SYSTEM_IDENTIFIER_HYPER] = [$hyperClientId];
}
foreach ($arr as $key => $value) {
$existingCombinations = $this->doctrine->getRepository(MafoAffiliatesMapping::class)->findBy([
'mafoAffiliateId' => $mafoAffiliateEntity,
'systemIdentifier' => $key
]);
$existingIds = array_map(function ($item) {
return $item->getSystemIdentifierId();
}, $existingCombinations);
$newIds = array_diff($value, $existingIds);
foreach ($newIds as $newId) {
$entityExists = $this->doctrine->getRepository(MafoAffiliatesMapping::class)->findOneBy([
'systemIdentifier' => $key,
'systemIdentifierId' => $newId,
]);
if ($entityExists) {
$error[] = "ID: $newId already exists for $key system for MAFO ID: " . $entityExists->getMafoAffiliateId()->getId();
}
}
if ($error) {
return new JsonResponse(['status' => 'error', 'message' => $error], 400);
}
foreach ($newIds as $newId) {
$this->doctrine->getRepository(MafoAffiliatesMapping::class)->insertToMafoAffiliatesMapping($mafoAffiliateEntity, $key, $newId, $this->getUser()->getEmail());
}
$idsToBeDeleted = array_diff($existingIds, $value);
foreach ($idsToBeDeleted as $idToBeDeleted) {
$existingCombinations = $this->doctrine->getRepository(MafoAffiliatesMapping::class)->findOneBy([
'mafoAffiliateId' => $mafoAffiliateEntity,
'systemIdentifier' => $key,
'systemIdentifierId' => $idToBeDeleted,
]);
// $this->doctrine->getRepository(MafoAffiliatesMapping::class)->updateMafoAffiliatesMappingById($existingCombinations->getId(), [
// 'deletedAt' => new \Datetime('now'),
// 'updatedByEmail' => $this->getUser()->getEmail()
// ]);
$this->doctrine->getRepository(MafoAffiliatesMapping::class)->remove($existingCombinations, true);
}
$checkIfIdsDeletedOrNot = array_intersect($existingIds, $value);
if (!empty($checkIfIdsDeletedOrNot)) {
foreach ($checkIfIdsDeletedOrNot as $checkIfIdDeletedOrNot) {
$isCombinationDeleted = $this->doctrine->getRepository(MafoAffiliatesMapping::class)->findOneBy([
'mafoAffiliateId' => $mafoAffiliateEntity,
'systemIdentifier' => $key,
'systemIdentifierId' => $checkIfIdDeletedOrNot,
]);
if ($isCombinationDeleted->getDeletedAt() !== null) {
$this->doctrine->getRepository(MafoAffiliatesMapping::class)->updateMafoAffiliatesMappingById($isCombinationDeleted->getId(), [
'deletedAt' => null,
'updatedByEmail' => $this->getUser()->getEmail()
]);
}
}
}
}
}
return new JsonResponse(['status' => 'success']);
}
private function canUserEditAdvertiserOrPublisher($userEmail, $accountManagerEmail)
{
if (!isset($this->parentUsersByUser)) {
$this->parentUsersByUser = $this->userComponents->getParentUsersByUser();
}
if (!isset($this->usersByRoles)) {
$this->usersByRoles = $this->userComponents->getUsersByRole();
}
if (
$userEmail === $accountManagerEmail ||
(
array_key_exists($accountManagerEmail, $this->parentUsersByUser) &&
in_array($userEmail, $this->parentUsersByUser[$accountManagerEmail])
) ||
in_array($userEmail, $this->usersByRoles[Config::ROLE_ADMIN])
) {
return true;
}
return false;
}
/**
* @Route("/mafo-affiliate-rating", methods={"GET"})
*/
public function affiliateRatingGetAction(Request $request)
{
$period = date('Y-m-01', strtotime("-1 month"));
$affiliateRatingData = $this->doctrine->getRepository(MafoAffiliateRating::class)->getAffiliateRatingDataByPeriod($request->query->get('mafoAffiliateId'), $period);
return new JsonResponse($affiliateRatingData);
}
/**
* @Route("/mafo-affiliate-rating", methods={"POST"})
*/
public function affiliateRatingAction(Request $request)
{
$payload = json_decode($request->getContent(), true);
extract($payload);
$period = new \Datetime(date('Y-m-01', strtotime("-1 month")));
$checkAffiliateExistForPeriod = $this->doctrine->getRepository(MafoAffiliateRating::class)->findOneBy([
'mafoAffiliateId' => $mafoAffiliateId,
'period' => $period
]);
if ($checkAffiliateExistForPeriod) {
$this->doctrine->getRepository(MafoAffiliateRating::class)->updateAdjustAppDetailsById($checkAffiliateExistForPeriod->getId(), [
'qualityFeedback' => $qualityFeedback,
'responsivenessFeedback' => $responsivenessFeedback,
'clickControlFeedback' => $clickControlFeedback,
'impressionControlFeedback' => $impressionControlFeedback,
]);
} else {
$this->doctrine->getRepository(MafoAffiliateRating::class)->insertToAffiliateRating($affiliateId, $period, $qualityFeedback, $clickControlFeedback, $impressionControlFeedback, $responsivenessFeedback, []);
}
return new JsonResponse(true);
}
}