<?php
declare(strict_types=1);
namespace App\Controller\Campaign;
use Symfony\Component\HttpFoundation\{
Request,
Response,
RedirectResponse
};
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use App\Common\Controllers\CrmCrudAbstractController;
use App\Entity\{Campaign, Call, Contact, CallingStatus, CampaignContact};
use App\Services\{
Campaign\DatasetService,
Administration\CallingStatusService
};
use App\Form\Type\ImportType;
use App\Form\Dataset\Type\CallType;
use App\Common\Traits\TimeZoneTrait;
class DatasetController extends CrmCrudAbstractController
{
use TimeZoneTrait;
private const TEMPLATE_FOLDER = 'campaign/dataset/';
/**
* @see CrmAbstractController
*/
protected function initModuleDetails(): array
{
return [
'entityClassName' => Campaign::class,
'moduleService' => DatasetService::class,
'modulePrefix' => 'campaign_dataset',
'moduleTemplate' => self::TEMPLATE_FOLDER,
'hasPagin' => false,
'hasFilter' => false,
'defaultSort' => ['field' => 'csp.name', 'op' => 'ASC'],
];
}
#[Route('/campaign/{id}/dataset/{h}', name: 'campaign_dataset_index', defaults: ['h' => 0])]
public function index(
Request $request,
DatasetService $datasetService,
Campaign $campaign,
string|int|null $h = 0
): Response {
return parent::getList(
$request,
$request->isXmlHttpRequest() ? parent::MODE_LISTING : parent::MODE_INDEX,
$datasetService,
false,
[
'campaign' => $campaign,
'dayOfTheCampaign' => $datasetService->getDayOfTheCampaign($campaign->getStartDate()->format('Y-m-d')),
'datasetFilters' => $datasetService->getDatasetFilternames($campaign),
],
[$campaign,],
//($this->isGranted('ROLE_CUSTOMER')) ? '_customer_listing.html.twig' : null
);
}
#[Route('/campaign/{id}/dataset/overview', name: 'campaign_dataset_overview')]
public function overview(
DatasetService $datasetService,
Campaign $campaign
): Response {
return $this->render(
$this->moduleTemplate . 'overview.html.twig', [
'overview' => $datasetService->datasetOverview($campaign),
]
);
}
#[IsGranted("ROLE_PM")]
#[Route(
'/campaign/{id}/dataset/email-blast/csv-export',
name: 'campaign_dataset_email_blast_csv_export'
)]
public function emailBlastCsvExport(
Request $request,
DatasetService $datasetService,
Campaign $campaign
): Response {
return parent::csvExportResponse(
$request,
$datasetService,
$datasetService->getEmailBlastCsvExportFilename(),
$datasetService->emailBlastCsvExport($campaign)
);
}
#[IsGranted("ROLE_PM")]
#[Route(
'/campaign/{id}/dataset/email-blast/import',
name: 'campaign_dataset_email_blast_import',
methods: ['GET', 'POST'],
)]
public function emailBlastImport(
Request $request,
DatasetService $datasetService,
Campaign $campaign
): Response {
$form = $this->createForm(ImportType::class, null, [
'action' => $this->generateUrl('campaign_dataset_email_blast_import', ['id' => $campaign->getId(),]),
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
try {
$datasetService->importEmailBlast(
$campaign,
$data['csvFile'],
(int) $request->request->get('emailNumber')
);
$this->addFlash('success', 'Done successfully !');
} catch (\Exception $exception) {
$this->addFlash('error', $exception->getMessage());
}
return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
}
return $this->render(
$this->moduleTemplate . 'import_blast_email.html.twig', [
'form' => $form->createView(),
]
);
}
#[Security("is_granted('ROLE_PM') or is_granted('ROLE_EDM')")]
#[Route(
'/campaign/{id}/dataset/delete/by-contacts-id',
name: 'campaign_dataset_delete_by_contacts_id',
methods: ['GET', 'POST'],
)]
public function deleteByContactsId(
Request $request,
DatasetService $datasetService,
Campaign $campaign
): Response {
$form = $this->createForm(ImportType::class, null, [
'action' => $this->generateUrl('campaign_dataset_delete_by_contacts_id', ['id' => $campaign->getId(),]),
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
try {
$datasetService->deleteContactsById($campaign, $data['csvFile']);
$this->addFlash('success', 'Done successfully !');
} catch (\Exception $exception) {
$this->addFlash('error', $exception->getMessage());
}
return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
}
return $this->render(
$this->moduleTemplate . 'delete_contacts_id.html.twig', [
'form' => $form->createView(),
]
);
}
#[IsGranted("ROLE_PM")]
#[Route(
'/campaign/{id}/dataset/import-correct-data/cleansed',
name: 'campaign_dataset_import_correct_data',
methods: ['GET', 'POST'],
)]
public function importCorrectData(
Request $request,
DatasetService $datasetService,
Campaign $campaign
): Response {
$form = $this->createForm(ImportType::class, null, [
'action' => $this->generateUrl('campaign_dataset_import_correct_data', ['id' => $campaign->getId(),]),
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
try {
$datasetService->importCorrectData($campaign, $data['csvFile'], $request->get('fieldsToCorrect'));
$this->addFlash('success', 'Done successfully !');
} catch (\Exception $exception) {
$this->addFlash('error', $exception->getMessage());
}
return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
}
return $this->render(
$this->moduleTemplate . 'import_correct_data.html.twig', [
'form' => $form->createView(),
]
);
}
#[Route(
'/campaign/{id}/dataset/keywords/filter',
name: 'campaign_dataset_keywords',
methods: ['POST'],
options: ['expose' => true])
]
public function setDatasetKeywords(Request $request, Campaign $campaign): RedirectResponse
{
$session = $request->getSession();
$keywords = json_decode($request->request->get('keywords'));
$session->set('campaign_dataset_keywords_' . $campaign->getId(), $keywords);
return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
}
#[Route(
'/campaign/{id}/dataset/keywords-reset/filter',
name: 'campaign_dataset_keywords_reset',
methods: ['GET'],
options: ['expose' => true])
]
public function resetDatasetKeywords(Request $request, Campaign $campaign): RedirectResponse
{
$session = $request->getSession();
if ($session->has('campaign_dataset_keywords_' . $campaign->getId())) {
$session->remove('campaign_dataset_keywords_' . $campaign->getId());
}
return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
}
#[Route('/campaign/{id}/dataset/csp/status', name: 'campaign_dataset_csp_status')]
public function cspStatus(
DatasetService $datasetService,
Campaign $campaign
): Response {
return $this->render(
$this->moduleTemplate . 'csp_status.html.twig', [
'cspStatus' => $datasetService->getCampaignCspStatus($campaign),
]
);
}
#[Route('/campaign/{id}/dataset/search/add-contacts', name: 'campaign_dataset_add_contacts')]
public function datasetAddContacts(
DatasetService $datasetService,
Campaign $campaign
): Response {
try {
$duplicatedCounts = $datasetService->datasetAddContacts($campaign);
$this->addFlash('success', 'Done successfully !');
if ($duplicatedCounts['duplicatedContactsCount'] > 0) {
$this->addFlash('success', sprintf('Number of double data: %d', $duplicatedCounts['duplicatedContactsCount']));
}
if ($duplicatedCounts['duplicatedRelatedContactsCount'] > 0) {
$this->addFlash('success', sprintf('Number of duplicates (hierarchy contacts): %d', $duplicatedCounts['duplicatedRelatedContactsCount']));
}
} catch (\Exception $exception) {
$this->addFlash('error', $exception->getMessage());
}
return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
}
#[Route(
'/campaign/{id}/dataset/search/add-selected-contacts',
name: 'campaign_dataset_add_selected_contacts',
methods: ['POST']
)]
public function datasetAddSelectedContacts(
Request $request,
DatasetService $datasetService,
Campaign $campaign
): Response {
try {
$duplicatedCounts = $datasetService->datasetAddContacts(
$campaign,
(array) $request->get('search_results_contacts')
);
$this->addFlash('success', 'Done successfully !');
if ($duplicatedCounts['duplicatedContactsCount'] > 0) {
$this->addFlash('success', sprintf('Number of double data: %d', $duplicatedCounts['duplicatedContactsCount']));
}
if ($duplicatedCounts['duplicatedRelatedContactsCount'] > 0) {
$this->addFlash('success', sprintf('Number of duplicates (hierarchy contacts): %d', $duplicatedCounts['duplicatedRelatedContactsCount']));
}
} catch (\Exception $exception) {
$this->addFlash('error', $exception->getMessage());
}
return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
}
#[Security("is_granted('ROLE_PM') or is_granted('ROLE_EDM') or is_granted('ROLE_EPA')")]
#[Route(
'/campaign/{id}/dataset/csv-export/{operation}',
name: 'campaign_dataset_csv_export',
requirements: ['operation' => 'whole|clean|qualif'],
)]
public function datasetCsvExport(
Request $request,
DatasetService $datasetService,
Campaign $campaign,
string $operation
): Response {
return parent::csvExportResponse(
$request,
$datasetService,
$datasetService->getDatasetCsvExportFilename($campaign, $operation),
$datasetService->datasetCsvExport($campaign, $operation)
);
}
#[Route(
'/campaign/{id}/dataset/save-delete-contacts/{operation}',
name: 'campaign_dataset_save_delete_contacts',
requirements: ['operation' => 'save|delete'],
options: ['expose' => true]
)]
public function saveDeleteContacts(
Request $request,
DatasetService $datasetService,
Campaign $campaign,
string $operation
): Response {
$contactIds = (array) $request->get('dataset_contact_chck');
try {
$datasetService->saveDeleteDatasetContacts($campaign, $operation, $contactIds);
$this->addFlash('success', 'Done successfully !');
} catch (\Exception $exception) {
$this->addFlash('error', $exception->getMessage());
}
return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
}
#[Route('/campaign/{id}/dataset/filter/contacts', name: 'campaign_dataset_filter', options: ['expose' => true])]
public function filter(
DatasetService $datasetService,
CallingStatusService $callingStatusService,
Campaign $campaign
): Response {
return $this->render(
$this->moduleTemplate . 'filter.html.twig', [
'data' => $datasetService->getDatasetCspCountries($campaign),
'callingStatuses' => $callingStatusService->getList(),
]
);
}
#[Route(
'/campaign/{id}/dataset/set-filter/contacts',
name: 'campaign_dataset_set_filter',
options: ['expose' => true]
)]
public function setFilter(Request $request,Campaign $campaign): Response
{
$session = $request->getSession();
$filterData = [
'csp' => $request->request->get('csp'),
'csptype' => $request->request->get('csptype'),
'country' => $request->request->get('country'),
'region' => $request->request->get('region'),
'callstatus' => $request->request->get('callstatus'),
'phone' => (int) $request->request->get('phone'),
'priority' => (int) $request->request->get('priority'),
'clickLinks' => json_decode($request->request->get('clickLinks')),
'openCount' => json_decode($request->request->get('openCount')),
];
$session->set('campaign_dataset_filters_' . $campaign->getId(), $filterData);
return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
}
#[Route(
'/campaign/{id}/dataset/reset-filter/{key}',
name: 'campaign_dataset_reset_filter',
options: ['expose' => true]
)]
public function resetFilter(
Request $request,
DatasetService $datasetService,
Campaign $campaign,
string $key
): Response {
$datasetService->removeFilter($campaign, $key);
return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
}
#[Security("is_granted('ROLE_PM') or is_granted('ROLE_USER')")]
#[Route(
'/campaign/{id}/dataset/update-contact/status',
name: 'campaign_dataset_update_contact_status',
methods: ['POST'],
options: ['expose' => true]
)]
public function updateContactStatus(
Request $request,
DatasetService $datasetService,
Campaign $campaign
): Response {
$contacts = json_decode($request->request->get('contacts'));
$status = (int) $request->request->get('status');
$datasetService->updateContactStatus($campaign, $contacts, $status);
return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
}
#[Security("is_granted('ROLE_PM') or is_granted('ROLE_USER') or is_granted('ROLE_EDM') or is_granted('ROLE_EPA')")]
#[Route(
'/campaign/{id}/dataset/mark-as-unsubscribed/import',
name: 'campaign_dataset_mark_as_unsubscribed',
methods: ['GET', 'POST'],
)]
public function markAsUnsubscribed(
Request $request,
DatasetService $datasetService,
Campaign $campaign
): Response {
$form = $this->createForm(ImportType::class, null, [
'action' => $this->generateUrl('campaign_dataset_mark_as_unsubscribed', ['id' => $campaign->getId(),]),
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
try {
$datasetService->markAsUnsubscribed(
$campaign,
$data['csvFile']
);
$this->addFlash('success', 'Done successfully !');
} catch (\Exception $exception) {
$this->addFlash('error', $exception->getMessage());
}
return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
}
return $this->render(
$this->moduleTemplate . 'base_import_popup.html.twig', [
'form' => $form->createView(),
]
);
}
#[Route(
'/campaign/contact/{campaignContactId}/calling-status/{callStatus}/dataset/call', name: 'campaign_dataset_call', methods: ['GET', 'POST'], options: ['expose' => true]
)]
#[Route(
'/campaign/contact/{campaignContactId}/comment/dataset/call', name: 'campaign_dataset_comment_call', methods: ['GET', 'POST'], options: ['expose' => true]
)]
#[ParamConverter('campaignContact', class: CampaignContact::class, options: ['mapping' => ['campaignContactId' => 'id']])]
#[ParamConverter('callingStatus', class: CallingStatus::class, options: ['mapping' => ['callStatus' => 'id']])]
public function datasetCall(
Request $request,
DatasetService $datasetService,
CampaignContact $campaignContact,
?CallingStatus $callingStatus = null
): Response {
$form = $this->createForm(CallType::class, (new Call()), [
'action' => null !== $callingStatus
? $this->generateUrl('campaign_dataset_call', ['campaignContactId' => $campaignContact->getCampaign()->getId(), 'callStatus' => $callingStatus->getId(),])
: $this->generateUrl('campaign_dataset_comment_call', ['campaignContactId' => $campaignContact->getCampaign()->getId(),]),
'callingStatus' => $callingStatus ? $callingStatus->getId() : $campaignContact->getCallingstatus()->getId(),
'call' => null,
'isComment' => null === $callingStatus,
]);
$form->handleRequest($request);
if ($request->isMethod('POST')) {
try {
$datasetService->updateCampaignContactStatus(
$campaignContact,
$callingStatus
);
$this->addFlash('success', 'Done successfully !');
} catch (\Exception $exception) {
$this->addFlash('error', $exception->getMessage());
}
return new Response();
}
return $this->render(
'campaign/call/add.html.twig', [
'form' => $form->createView(),
'campaignContact' => $campaignContact,
'callingStatusName' => $callingStatus ? $callingStatus->getStatus() : $campaignContact->getCallingstatus()->getStatus(),
'callingStatusId' => null !== $campaignContact->getCallingstatus() ? $campaignContact->getCallingstatus()->getId() : '',
]
);
}
/*#[IsGranted("ROLE_CUSTOMER")]
#[Route('/campaign/contact/{campaignContactId}/customer-comment', name: 'campaign_dataset_customer_comment')]
#[ParamConverter('campaignContact', class: CampaignContact::class, options: ['mapping' => ['campaignContactId' => 'id']])]
public function getCustomerComment(
DatasetService $datasetService,
CampaignContact $campaignContact
): Response {
return $this->render(
self::TEMPLATE_FOLDER . 'customer_comments.html.twig', [
'campaignContact' => $campaignContact,
'calls' => $datasetService->getCustomerComments($campaignContact),
]
);
}
#[IsGranted("ROLE_CUSTOMER")]
#[Route('/campaign/{id}/customer-dataset/csv-export', name: 'campaign_dataset_customer_csv_export')]
public function csvExportCustomerDataset(
Request $request,
DatasetService $datasetService,
Campaign $campaign
): Response {
return parent::csvExportResponse(
$request,
$datasetService,
$datasetService->getCsutomerCsvExportFilename(),
$datasetService->customerDatasetCsvExport($campaign)
);
}*/
}