<?php
namespace App\Controller;
use App\Entity\AllegroDataAds;
use App\Entity\Project;
use App\Entity\RaportAdsNew;
use App\Entity\RaportDate;
use App\Form\RaportAdsFilterType;
use App\Form\RaportAdsNewType;
use App\Form\RaportDateType;
use App\Module\Slack\SlackManager;
use App\Repository\AllegroDataAdsRepository;
use App\Repository\ProjectRepository;
use App\Repository\RaportAdsNewRepository;
use App\Repository\RaportDateRepository;
use App\Service\PaginationService;
use Doctrine\Common\Collections\ArrayCollection;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\SerializerInterface;
class AllegroDataAdsController extends AbstractController
{
/**
* @Route("/allegro-data-ads", name="allegro_data_ads", methods={"POST"})
*/
public function index(Request $request, AllegroDataAdsRepository $allegroDataAdsRepository, ProjectRepository $projectRepository): Response
{
return $this->json(["error" => false, "message" => "success"]);
if (!$request->getContent()) {
return $this->json(["error" => true, "message" => "request body don't have a data field"]);
}
$data = json_decode($request->getContent(), true);
if (!$data) {
return $this->json(["error" => true, "message" => "json not valid"]);
}
$project = $projectRepository->findProjectByAllegroName($data['nickname']);
$allegroDataAds = new AllegroDataAds();
$allegroDataAds->setData($data)
->setProject($project[0] ?? null)
->setDate(new \DateTimeImmutable($data['date']." 12:00"));
$allegroDataAdsRepository->save($allegroDataAds);
//
// $allegroData = null;
// if(!isset($data['file'])) {
// $allegroData = $allegroDataAdsRepository->findData($data['nickname'], new \DateTimeImmutable($data['date']." 12:00"));
// }
//
// if ($allegroData) {
// foreach($allegroData as $allData) {
// if (isset($data['file']) && isset($allData->getData['file']) ||
// !isset($data['file']) && !isset($allData->getData['file'])) {
// $allData->setData($data);
// $allegroDataAdsRepository->save($allData);
//
// break;
// }
// }
// } else {
// $allegroDataAds = new AllegroDataAds();
// $allegroDataAds->setData($data)
// ->setProject($project[0] ?? null)
// ->setDate(new \DateTimeImmutable($data['date']." 12:00"));
//
// $allegroDataAdsRepository->save($allegroDataAds);
// }
return $this->json(["error" => false, "message" => "success"]);
}
/**
* @Route("/raport-ads", name="allegro_ads_chart")
*/
public function list(Request $request, RaportAdsNewRepository $raportAdsNewRepository, PaginationService $paginationService)
{
$page = $request->get("page") ?? 1;
$user = $this->getUser();
$leader = null;
if ($this->isGranted("ROLE_EMPLOYER") || $this->isGranted("ROLE_ADMIN")) {
$user = null;
}
$form = $this->createForm(RaportAdsFilterType::class, null, [
'user' => $this->getUser(),
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var Project $project */
$project = $form->get('project')->getData();
if ($project) {
$user = $project->getClient()->first();
}
if ($this->isGranted("ROLE_EMPLOYER")) {
$leaderData = $form->get('users')->getData();
if ($leaderData) {
$leader = $leaderData;
}
}
}
$raports = $raportAdsNewRepository->getRaportList($page, $user, $leader);
return $this->render('allegro_data_ads/index.html.twig', [
'raports' => $raports,
'form' => $form->createView(),
'page' => $page,
'pagination' => $paginationService->paginate(
$raportAdsNewRepository->countReportForUser($user),
$page
),
]);
}
/**
* @Route("/data-raportu", name="allegro_ads_raport_date")
*/
public function newRaportDate(Request $request, RaportDateRepository $raportDateRepository)
{
$raportDate = new RaportDate();
$form = $this->createForm(RaportDateType::class, $raportDate);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$raportDateRepository->save($raportDate);
$this->addFlash("success", "Pomyślnie dodana data");
return $this->redirectToRoute('allegro_ads_raport_date');
}
return $this->render('allegro_data_ads/raport_date.html.twig', [
'form' => $form->createView(),
'nextRaportList' => $raportDateRepository->getAllNextRaportDate(),
]);
}
/**
* @Route("/data-raportu-usun/{date}", name="allegro_ads_raport_date_delete")
*/
public function deleteRaportDateDelete(RaportDateRepository $raportDateRepository, RaportDate $date)
{
$raportDateRepository->remove($date);
$this->addFlash("info", "Pomyślnie usunięta data");
return $this->redirectToRoute('allegro_ads_raport_date');
}
/**
* @Route("/allegro-ads/nowy", name="allegro_ads_new")
*/
public function new(Request $request, RaportAdsNewRepository $raportAdsNewRepository)
{
$allegroAdsNew = new RaportAdsNew();
$form = $this->createForm(RaportAdsNewType::class, $allegroAdsNew, [
'user' => $this->getUser(),
'rangeDate' => "",
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$date = explode("do", $form->get("rangeDate")->getData());
$from = $date[0];
$to = $date[1];
$allegroAdsNew->setAccount($form->get('account')->getViewData())
->setDateFrom(new \DateTime($from))
->setDateTo(new \DateTime($to))
->setTypeGraphicStatistic($_REQUEST['type-graphic-statistic'])
->setTypeStatistic($_REQUEST['type-statistic']);
$raportAdsNewRepository->save($allegroAdsNew);
return $this->redirectToRoute('allegro_ads_chart');
}
return $this->render('allegro_data_ads/new.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/allegro-ads/edytuj/{allegroAdsNew}", name="allegro_ads_edit")
*/
public function edit(Request $request, RaportAdsNewRepository $raportAdsNewRepository, RaportAdsNew $allegroAdsNew)
{
$form = $this->createForm(RaportAdsNewType::class, $allegroAdsNew, [
'user' => $this->getUser(),
'rangeDate' => $allegroAdsNew->getDateFrom()->format("Y-m-d")." to ".$allegroAdsNew->getDateTo()->format("Y-m-d"),
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$date = explode("do", $form->get("rangeDate")->getData());
$from = $date[0];
$to = isset($date[1]) ? $date[1] : $date[0];
$allegroAdsNew->setAccount($form->get('account')->getViewData())
->setDateFrom(new \DateTime($from))
->setDateTo(new \DateTime($to));
$raportAdsNewRepository->save($allegroAdsNew);
return $this->redirectToRoute('allegro_ads_chart');
}
return $this->render('allegro_data_ads/new.html.twig', [
'form' => $form->createView(),
]);
}
/**
* @Route("/allegro-ads/usun/{allegroAdsNew}", name="allegro_ads_remove")
*/
public function remove(Request $request, RaportAdsNewRepository $raportAdsNewRepository, RaportAdsNew $allegroAdsNew)
{
$raportAdsNewRepository->remove($allegroAdsNew);
return $this->redirectToRoute('allegro_ads_chart');
}
/**
* @Route("/allegro-ads-slack/{allegroAdsNew}", name="allegro_ads_slack")
*/
public function slack(SlackManager $slackManager, RaportAdsNew $allegroAdsNew)
{
$link = "<https://czas.qsell.pl".$this->generateUrl('allegro_ads_new_show', ["raportAdsNew" => $allegroAdsNew->getId()])."|".$allegroAdsNew->getAccount().">";
$slackManager->write(":chart_with_upwards_trend: *PRZYGOTOWANY ZOSTAŁ RAPORT ALLEGRO ADS DLA KONTA:* ".PHP_EOL.PHP_EOL."*".$allegroAdsNew->getAccount()."*".PHP_EOL.PHP_EOL.":arrow_right: KLIKNIJ (".$link.") ABY SPRAWDZIĆ", $allegroAdsNew->getProject()->getClientSlackChannelId());
return $this->redirectToRoute('allegro_ads_chart');
}
/**
* @Route("/allegro-ads/pobierz/{raportAdsNew}", name="allegro_ads_new_download")
*/
public function download(RaportAdsNew $raportAdsNew, AllegroDataAdsRepository $allegroDataAdsRepository, SerializerInterface $serializer)
{
if ($this->isGranted("ROLE_CLIENT") && !$raportAdsNew->getProject()->getClient()->contains($this->getUser())) {
$this->addFlash("error", "Brak dostępu");
return $this->redirectToRoute('allegro_ads_chart');
}
$data = $allegroDataAdsRepository->findDataFile($raportAdsNew->getAccount(), $raportAdsNew->getDateFrom(), $raportAdsNew->getDateTo(), $raportAdsNew->getProject());
$arr = [];
$i = 0;
foreach ($data as $val) {
if ($raportAdsNew->getDateTo() < (new \DateTimeImmutable('2024-02-01 00:00:00'))) {
$fileData = str_replace("''", "\'", $val->getData()['file']);
$fileData = str_replace("'", "\"", $fileData);
$fileData = preg_replace('/(?<=\d)"(?=(?![,:}]))/', '\'', $fileData);
$file = $serializer->decode('['.$fileData.']', 'json');
} else {
$file = $val->getData()['file'];
}
if (!$file) {
continue;
}
foreach ($file as $f) {
$a = [];
foreach ($f as $key => $value) {
if ($key == "Nazwa kampanii" || $key == "Nazwa grupy reklam") {
continue;
}
if ($i == 0) {
$arr[0][] = $key;
}
$a[] = $value;
}
$arr[] = $a;
$i++;
}
}
$spreadsheet = new Spreadsheet();
$spreadsheet->getActiveSheet()->fromArray($arr);
$writer = new Xlsx($spreadsheet);
$response = new StreamedResponse(
function () use ($writer) {
$writer->save('php://output');
}
);
$response->headers->set('Content-Type', 'application/vnd.ms-excel');
$response->headers->set('Content-Disposition', 'attachment;filename="raport.xlsx"');
$response->headers->set('Cache-Control', 'max-age=0');
return $response;
}
/**
* @Route("/allegro-ads/{raportAdsNew}", name="allegro_ads_new_show")
*/
public function show(RaportAdsNew $raportAdsNew, AllegroDataAdsRepository $allegroDataAdsRepository)
{
if ($this->isGranted("ROLE_CLIENT") && !$raportAdsNew->getProject()->getClient()->contains($this->getUser())) {
$this->addFlash("error", "Brak dostępu");
return $this->redirectToRoute('allegro_ads_chart');
}
$file = false;
$data = $allegroDataAdsRepository->findDataFile($raportAdsNew->getAccount(), $raportAdsNew->getDateFrom(), $raportAdsNew->getDateTo(), $raportAdsNew->getProject());
if ($data) {
$file = true;
}
return $this->render('allegro_data_ads/show.html.twig', [
'raport' => $raportAdsNew,
'file' => $file,
]);
}
/**
* @Route("/raport/{raportAdsNew}/{account}", name="allegro_ads_new_show_last")
*/
public function showLast(string $raportAdsNew, string $account, RaportAdsNewRepository $raportAdsNewRepository, ProjectRepository $projectRepository, AllegroDataAdsRepository $allegroDataAdsRepository)
{
$raport = $raportAdsNewRepository->findOneBy([
"project" => $projectRepository->findOneBy(["name" => $raportAdsNew, "type" => Project::TYPE_ACTIVE]),
"account" => $account,
],
[
"id" => "DESC",
]);
// if (!$raport) {
// dd($projectRepository->findOneBy(["name" => $raportAdsNew, "type" => Project::TYPE_ACTIVE]), $raportAdsNewRepository->getLastRaport($projectRepository->findOneBy(["name" => $raportAdsNew]), $account));
// }
if ($this->isGranted("ROLE_CLIENT") && !$raport->getProject()->getClient()->contains($this->getUser())) {
$this->addFlash("error", "Brak dostępu");
return $this->redirectToRoute('allegro_ads_chart');
}
$file = false;
$data = $allegroDataAdsRepository->findDataFile($raport->getAccount(), $raport->getDateFrom(), $raport->getDateTo(), $raport->getProject());
if ($data) {
$file = true;
}
return $this->render('allegro_data_ads/show.html.twig', [
'raport' => $raport,
'file' => $file,
]);
}
/**
* @Route("/allegro-ads-project-account/{project}", name="allegro_ads_project_account")
*/
public function dataAccountAllegro(Project $project): JsonResponse
{
return $this->json(explode(",", $project->getAllegroAccount()));
}
/**
* @Route("/allegro-ads-json/{project}", name="allegro_ads_json")
*/
public function dataJson(Request $request, Project $project, RaportAdsNewRepository $raportAdsNewRepository): JsonResponse
{
$date = explode("do", $request->get("range"));
$from = $date[0];
$to = $date[1];
$datas = $project->getAllegroDataAds()->filter(function (AllegroDataAds $allegroDataAds) use ($from, $to) {
if ($allegroDataAds->getDate() >= new \DateTime($from) && $allegroDataAds->getDate() <= (new \DateTime($to))->modify("+1 day")) {
return $allegroDataAds->getData();
}
});
$iterator = $datas->getIterator();
$iterator->uasort(function ($a, $b) {
return $a->getDate() <=> $b->getDate();
});
$datas = new ArrayCollection(iterator_to_array($iterator));
$ad = [];
$count = [];
if ($request->get("instant") || $request->get("week")) {
$raportAdsNew = null;
if ($request->get("instant")) {
$raportAdsNew = $raportAdsNewRepository->find($request->get("raportId"));
}
if ($request->get("week") || $raportAdsNew->getTypeStatistic() == 1) {
foreach ($datas as $data) {
if (isset($data->getData()['file']) || isset($data->getData()['graphic-ads'])) {
continue;
}
if (trim(strtolower($data->getData()['nickname'])) == trim(strtolower($request->get("nickname")))) {
$date = (new \DateTimeImmutable())->setISODate($data->getDate()->format("Y"), $data->getDate()->format("W"))->format("Y-m-d");
if (!isset($ad[$date])) {
$ad[$date] = [];
$count[$date] = 0;
}
$count[$date]++;
$ad[$date] = [
"nickname" => $data->getData()['nickname'],
"klikniecia" => $this->stringToFloat($data->getData()['klikniecia']) + $this->getDataArray($date, $ad, 'klikniecia'),
"odslony" => $this->stringToFloat($data->getData()['odslony']) + $this->getDataArray($date, $ad, 'odslony'),
"ctr" => $this->stringToFloat($data->getData()['ctr']) + $this->getDataArray($date, $ad, 'ctr'),
"cpc" => $this->stringToFloat($data->getData()['cpc']) + $this->getDataArray($date, $ad, 'cpc'),
"koszt" => $this->stringToFloat($data->getData()['koszt']) + $this->getDataArray($date, $ad, 'koszt'),
"zwrot" => $this->stringToFloat($data->getData()['zwrot']) + $this->getDataArray($date, $ad, 'zwrot'),
"zainteresowanie" => $this->stringToFloat($data->getData()['zainteresowanie']) + $this->getDataArray($date, $ad, 'zainteresowanie'),
"sprzedane" => $this->stringToFloat($data->getData()['sprzedane']) + $this->getDataArray($date, $ad, 'sprzedane'),
"wartosc" => $this->stringToFloat($data->getData()['wartosc']) + $this->getDataArray($date, $ad, 'wartosc'),
"date" => $date,
];
}
}
$allegroData = [];
foreach ($ad as $key => $data) {
$data['ctr'] = $data['ctr'] / $count[$key];
$data['cpc'] = $data['cpc'] / $count[$key];
$data['zwrot'] = $data['zwrot'] / $count[$key];
$allegroData[] = [
"data" => $data,
"date" => $key,
];
}
return $this->json($allegroData);
}
}
$allegroData = [];
foreach ($datas as $data) {
if (trim(strtolower($data->getData()['nickname'])) == trim(strtolower($request->get("nickname")))) {
if (isset($data->getData()['klikniecia'])) {
$dataParse = [
"nickname" => $data->getData()['nickname'],
"klikniecia" => (string)$data->getData()['klikniecia'],
"odslony" => (string)$data->getData()['odslony'],
"ctr" => (string)$data->getData()['ctr'],
"cpc" => (string)$data->getData()['cpc'],
"koszt" => (string)$data->getData()['koszt'],
"zwrot" => (string)$data->getData()['zwrot'],
"zainteresowanie" => (string)$data->getData()['zainteresowanie'],
"sprzedane" => (string)$data->getData()['sprzedane'],
"wartosc" => (string)$data->getData()['wartosc'],
];
} else {
$dataParse = $data->getData();
}
$allegroData[] = [
"data" => $dataParse,
"date" => $data->getDate()->format("m-d"),
];
}
}
return $this->json($allegroData);
}
private function getDataArray(string $date, array $ad, string $name)
{
if (isset($ad[$date][$name])) {
$string = str_replace(" ", "", $ad[$date][$name]);
$string = str_replace("zł", "", $string);
return (float)str_replace(",", ".", $string);
}
return 0;
}
private function stringToFloat(string $string): float
{
$string = str_replace(" ", "", $string);
$string = str_replace("zł", "", $string);
return (float)str_replace(",", ".", $string);
}
private function floatToString(string $string): float
{
return (string)str_replace(".", ",", $string);
}
/**
* @Route("/allegro-ads-graphic-json/{project}", name="allegro_ads_graphic_json")
*/
public function dataGrphicJson(Request $request, Project $project, RaportAdsNewRepository $raportAdsNewRepository): JsonResponse
{
$date = explode("do", $request->get("from"));
$from = $date[0];
$to = $date[1];
$datas = $project->getAllegroDataAds()->filter(function (AllegroDataAds $allegroDataAds) use ($from, $to) {
if ($allegroDataAds->getDate() >= new \DateTime($from) && $allegroDataAds->getDate() <= (new \DateTime($to))->modify("+1 day") && isset($allegroDataAds->getData()['graphic-ads'])) {
return $allegroDataAds->getData();
}
});
$iterator = $datas->getIterator();
$iterator->uasort(function ($a, $b) {
return $a->getDate() <=> $b->getDate();
});
$datas = new ArrayCollection(iterator_to_array($iterator));
$ad = [];
$count = [];
if ($request->get("instant") || $request->get("week")) {
$raportAdsNew = null;
if ($request->get("instant")) {
$raportAdsNew = $raportAdsNewRepository->find($request->get("raportId"));
}
if ($request->get("week") || $raportAdsNew->getTypeGraphicStatistic() == 1) {
foreach ($datas as $data) {
if (!isset($data->getData()['graphic-ads'])) {
continue;
}
if (trim(strtolower($data->getData()['nickname'])) == trim(strtolower($request->get("nickname")))) {
$date = (new \DateTimeImmutable())->setISODate($data->getDate()->format("Y"), $data->getDate()->format("W"))->format("Y-m-d");
if (!isset($ad[$date])) {
$ad[$date] = [];
$count[$date] = 0;
}
$count[$date]++;
$ad[$date] = [
"nickname" => $data->getData()['nickname'],
"klikniecia" => $this->stringToFloat($data->getData()['graphic-ads']['klikniecia']) + $this->getDataArray($date, $ad, 'klikniecia'),
"odslony" => $this->stringToFloat($data->getData()['graphic-ads']['odslony']) + $this->getDataArray($date, $ad, 'odslony'),
"ctr" => $this->stringToFloat($data->getData()['graphic-ads']['ctr']) + $this->getDataArray($date, $ad, 'ctr'),
"cpm" => $this->stringToFloat($data->getData()['graphic-ads']['cpm']) + $this->getDataArray($date, $ad, 'cpm'),
"koszt" => $this->stringToFloat($data->getData()['graphic-ads']['koszt']) + $this->getDataArray($date, $ad, 'koszt'),
"zwroty" => $this->stringToFloat($data->getData()['graphic-ads']['zwroty']) + $this->getDataArray($date, $ad, 'zwroty'),
"zasieg" => isset($data->getData()['graphic-ads']['zasieg']) ? $this->stringToFloat($data->getData()['graphic-ads']['zasieg']) + $this->getDataArray($date, $ad, 'zasieg') : "0",
"zaitnteresowanie" => $this->stringToFloat($data->getData()['graphic-ads']['zaitnteresowanie'] ?? $data->getData()['graphic-ads']['zainteresowanie']) + $this->getDataArray($date, $ad, 'zainteresowanie'),
"sprzedanewsp" => isset($data->getData()['graphic-ads']['sprzedanewsp']) ? $this->stringToFloat($data->getData()['graphic-ads']['sprzedanewsp']) + $this->getDataArray($date, $ad, 'sprzedanewsp') : "0",
"sprzedane" => $this->stringToFloat($data->getData()['graphic-ads']['sprzedane']) + $this->getDataArray($date, $ad, 'sprzedane'),
"wartosc" => $this->stringToFloat($data->getData()['graphic-ads']['wartosc']) + $this->getDataArray($date, $ad, 'wartosc'),
"date" => $date,
];
}
}
$allegroData = [];
foreach ($ad as $key => $data) {
$data['ctr'] = $data['ctr'] / $count[$key];
$data['cpm'] = $data['cpm'] / $count[$key];
$allegroData[] = [
"data" => ["graphic-ads" => $data],
"date" => $key,
];
}
return $this->json($allegroData);
}
}
$allegroData = [];
foreach ($datas as $data) {
if (trim(strtolower($data->getData()['nickname'])) == trim(strtolower($request->get("nickname")))) {
$allegroData[] = [
"data" => $data->getData(),
"date" => $data->getDate()->format("m-d"),
];
}
}
return $this->json($allegroData);
}
}