src/Controller/Campaign/DatasetController.php line 485

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller\Campaign;
  4. use Symfony\Component\HttpFoundation\{
  5.     Request,
  6.     Response,
  7.     RedirectResponse
  8. };
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  11. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  12. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  13. use App\Common\Controllers\CrmCrudAbstractController;
  14. use App\Entity\{CampaignCallContactCallingStatusCampaignContact};
  15. use App\Services\{
  16.     Campaign\DatasetService,
  17.     Administration\CallingStatusService
  18. };
  19. use App\Form\Type\ImportType;
  20. use App\Form\Dataset\Type\CallType;
  21. use App\Common\Traits\TimeZoneTrait;
  22. class DatasetController extends CrmCrudAbstractController
  23. {
  24.     use TimeZoneTrait;
  25.     private const TEMPLATE_FOLDER 'campaign/dataset/';
  26.     /**
  27.      * @see CrmAbstractController
  28.      */
  29.     protected function initModuleDetails(): array
  30.     {
  31.         return [
  32.             'entityClassName' => Campaign::class,
  33.             'moduleService' => DatasetService::class,
  34.             'modulePrefix' => 'campaign_dataset',
  35.             'moduleTemplate' => self::TEMPLATE_FOLDER,
  36.             'hasPagin' => false,
  37.             'hasFilter' => false,
  38.             'defaultSort' => ['field' => 'csp.name''op' => 'ASC'],
  39.         ];
  40.     }
  41.     #[Route('/campaign/{id}/dataset/{h}'name'campaign_dataset_index'defaults: ['h' => 0])]
  42.     public function index(
  43.         Request $request,
  44.         DatasetService $datasetService,
  45.         Campaign $campaign,
  46.         string|int|null $h 0
  47.     ): Response {
  48.         return parent::getList(
  49.             $request,
  50.             $request->isXmlHttpRequest() ? parent::MODE_LISTING parent::MODE_INDEX,
  51.             $datasetService,
  52.             false,
  53.             [
  54.                 'campaign' => $campaign,
  55.                 'dayOfTheCampaign' => $datasetService->getDayOfTheCampaign($campaign->getStartDate()->format('Y-m-d')),
  56.                 'datasetFilters' => $datasetService->getDatasetFilternames($campaign),
  57.             ],
  58.             [$campaign,],
  59.             //($this->isGranted('ROLE_CUSTOMER')) ? '_customer_listing.html.twig' : null
  60.         );
  61.     }
  62.     #[Route('/campaign/{id}/dataset/overview'name'campaign_dataset_overview')]
  63.     public function overview(
  64.         DatasetService $datasetService,
  65.         Campaign $campaign
  66.     ): Response {
  67.         return $this->render(
  68.             $this->moduleTemplate 'overview.html.twig', [
  69.                 'overview' => $datasetService->datasetOverview($campaign),
  70.             ]
  71.         );
  72.     }
  73.     #[IsGranted("ROLE_PM")]
  74.     #[Route(
  75.         '/campaign/{id}/dataset/email-blast/csv-export',
  76.         name'campaign_dataset_email_blast_csv_export'
  77.     )]
  78.     public function emailBlastCsvExport(
  79.             Request $request,
  80.             DatasetService $datasetService,
  81.             Campaign $campaign
  82.     ): Response {
  83.         return parent::csvExportResponse(
  84.             $request,
  85.             $datasetService,
  86.             $datasetService->getEmailBlastCsvExportFilename(),
  87.             $datasetService->emailBlastCsvExport($campaign)
  88.         );
  89.     }
  90.     #[IsGranted("ROLE_PM")]
  91.     #[Route(
  92.         '/campaign/{id}/dataset/email-blast/import',
  93.         name'campaign_dataset_email_blast_import',
  94.         methods: ['GET''POST'],
  95.     )]
  96.     public function emailBlastImport(
  97.             Request $request,
  98.             DatasetService $datasetService,
  99.             Campaign $campaign
  100.     ): Response {
  101.         $form $this->createForm(ImportType::class, null, [
  102.             'action' => $this->generateUrl('campaign_dataset_email_blast_import', ['id' => $campaign->getId(),]),
  103.         ]);
  104.         $form->handleRequest($request);
  105.         if ($form->isSubmitted() && $form->isValid()) {
  106.             $data $form->getData();
  107.             try {
  108.                 $datasetService->importEmailBlast(
  109.                     $campaign,
  110.                     $data['csvFile'],
  111.                     (int) $request->request->get('emailNumber')
  112.                 );
  113.                 $this->addFlash('success''Done successfully !');
  114.             } catch (\Exception $exception) {
  115.                 $this->addFlash('error'$exception->getMessage());
  116.             }
  117.             return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
  118.         }
  119.         
  120.         return $this->render(
  121.             $this->moduleTemplate 'import_blast_email.html.twig', [
  122.                 'form' => $form->createView(),
  123.             ]
  124.         );
  125.     }
  126.     #[Security("is_granted('ROLE_PM') or is_granted('ROLE_EDM')")]
  127.     #[Route(
  128.         '/campaign/{id}/dataset/delete/by-contacts-id',
  129.         name'campaign_dataset_delete_by_contacts_id',
  130.         methods: ['GET''POST'],
  131.     )]
  132.     public function deleteByContactsId(
  133.             Request $request,
  134.             DatasetService $datasetService,
  135.             Campaign $campaign
  136.     ): Response {
  137.         $form $this->createForm(ImportType::class, null, [
  138.             'action' => $this->generateUrl('campaign_dataset_delete_by_contacts_id', ['id' => $campaign->getId(),]),
  139.         ]);
  140.         $form->handleRequest($request);
  141.         if ($form->isSubmitted() && $form->isValid()) {
  142.             $data $form->getData();
  143.             try {
  144.                 $datasetService->deleteContactsById($campaign$data['csvFile']);
  145.                 $this->addFlash('success''Done successfully !');
  146.             } catch (\Exception $exception) {
  147.                 $this->addFlash('error'$exception->getMessage());
  148.             }
  149.             return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
  150.         }
  151.         
  152.         return $this->render(
  153.             $this->moduleTemplate 'delete_contacts_id.html.twig', [
  154.                 'form' => $form->createView(),
  155.             ]
  156.         );
  157.     }
  158.     #[IsGranted("ROLE_PM")]
  159.     #[Route(
  160.         '/campaign/{id}/dataset/import-correct-data/cleansed',
  161.         name'campaign_dataset_import_correct_data',
  162.         methods: ['GET''POST'],
  163.     )]
  164.     public function importCorrectData(
  165.             Request $request,
  166.             DatasetService $datasetService,
  167.             Campaign $campaign
  168.     ): Response {
  169.         $form $this->createForm(ImportType::class, null, [
  170.             'action' => $this->generateUrl('campaign_dataset_import_correct_data', ['id' => $campaign->getId(),]),
  171.         ]);
  172.         $form->handleRequest($request);
  173.         if ($form->isSubmitted() && $form->isValid()) {
  174.             $data $form->getData();
  175.             try {
  176.                 $datasetService->importCorrectData($campaign$data['csvFile'], $request->get('fieldsToCorrect'));
  177.                 $this->addFlash('success''Done successfully !');
  178.             } catch (\Exception $exception) {
  179.                 $this->addFlash('error'$exception->getMessage());
  180.             }
  181.             return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
  182.         }
  183.         
  184.         return $this->render(
  185.             $this->moduleTemplate 'import_correct_data.html.twig', [
  186.                 'form' => $form->createView(),
  187.             ]
  188.         );
  189.     }
  190.     #[Route(
  191.         '/campaign/{id}/dataset/keywords/filter',
  192.         name'campaign_dataset_keywords',
  193.         methods: ['POST'],
  194.         options: ['expose' => true])
  195.     ]
  196.     public function setDatasetKeywords(Request $requestCampaign $campaign): RedirectResponse
  197.     {
  198.         $session $request->getSession();
  199.         $keywords json_decode($request->request->get('keywords'));
  200.         $session->set('campaign_dataset_keywords_' $campaign->getId(), $keywords);
  201.         return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
  202.     }
  203.     #[Route(
  204.         '/campaign/{id}/dataset/keywords-reset/filter',
  205.         name'campaign_dataset_keywords_reset',
  206.         methods: ['GET'],
  207.         options: ['expose' => true])
  208.     ]
  209.     public function resetDatasetKeywords(Request $requestCampaign $campaign): RedirectResponse
  210.     {
  211.         $session $request->getSession();
  212.         if ($session->has('campaign_dataset_keywords_' $campaign->getId())) {
  213.             $session->remove('campaign_dataset_keywords_' $campaign->getId());
  214.         }
  215.         return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
  216.     }
  217.     #[Route('/campaign/{id}/dataset/csp/status'name'campaign_dataset_csp_status')]
  218.     public function cspStatus(
  219.         DatasetService $datasetService,
  220.         Campaign $campaign
  221.     ): Response {
  222.         return $this->render(
  223.             $this->moduleTemplate 'csp_status.html.twig', [
  224.                 'cspStatus' => $datasetService->getCampaignCspStatus($campaign),
  225.             ]
  226.         );
  227.     }
  228.     #[Route('/campaign/{id}/dataset/search/add-contacts'name'campaign_dataset_add_contacts')]
  229.     public function datasetAddContacts(
  230.         DatasetService $datasetService,
  231.         Campaign $campaign
  232.     ): Response {
  233.         try {
  234.             $duplicatedCounts $datasetService->datasetAddContacts($campaign);
  235.             $this->addFlash('success''Done successfully !');
  236.             if ($duplicatedCounts['duplicatedContactsCount'] > 0) {
  237.                 $this->addFlash('success'sprintf('Number of double data: %d'$duplicatedCounts['duplicatedContactsCount']));
  238.             }
  239.             if ($duplicatedCounts['duplicatedRelatedContactsCount'] > 0) {
  240.                 $this->addFlash('success'sprintf('Number of duplicates (hierarchy contacts): %d'$duplicatedCounts['duplicatedRelatedContactsCount']));
  241.             }
  242.         } catch (\Exception $exception) {
  243.             $this->addFlash('error'$exception->getMessage());
  244.         }
  245.         return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
  246.     }
  247.     #[Route(
  248.         '/campaign/{id}/dataset/search/add-selected-contacts',
  249.         name'campaign_dataset_add_selected_contacts',
  250.         methods: ['POST']
  251.     )]
  252.     public function datasetAddSelectedContacts(
  253.         Request $request,
  254.         DatasetService $datasetService,
  255.         Campaign $campaign
  256.     ): Response {
  257.         try {
  258.             $duplicatedCounts $datasetService->datasetAddContacts(
  259.                 $campaign,
  260.                 (array) $request->get('search_results_contacts')
  261.             );
  262.             $this->addFlash('success''Done successfully !');
  263.             if ($duplicatedCounts['duplicatedContactsCount'] > 0) {
  264.                 $this->addFlash('success'sprintf('Number of double data: %d'$duplicatedCounts['duplicatedContactsCount']));
  265.             }
  266.             if ($duplicatedCounts['duplicatedRelatedContactsCount'] > 0) {
  267.                 $this->addFlash('success'sprintf('Number of duplicates (hierarchy contacts): %d'$duplicatedCounts['duplicatedRelatedContactsCount']));
  268.             }
  269.         } catch (\Exception $exception) {
  270.             $this->addFlash('error'$exception->getMessage());
  271.         }
  272.         return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
  273.     }
  274.     #[Security("is_granted('ROLE_PM') or is_granted('ROLE_EDM') or is_granted('ROLE_EPA')")]
  275.     #[Route(
  276.         '/campaign/{id}/dataset/csv-export/{operation}',
  277.         name'campaign_dataset_csv_export',
  278.         requirements: ['operation' => 'whole|clean|qualif'],
  279.     )]
  280.     public function datasetCsvExport(
  281.         Request $request,
  282.         DatasetService $datasetService,
  283.         Campaign $campaign,
  284.         string $operation
  285.     ): Response {
  286.         return parent::csvExportResponse(
  287.             $request,
  288.             $datasetService,
  289.             $datasetService->getDatasetCsvExportFilename($campaign$operation),
  290.             $datasetService->datasetCsvExport($campaign$operation)
  291.         );
  292.     }
  293.     #[Route(
  294.         '/campaign/{id}/dataset/save-delete-contacts/{operation}',
  295.         name'campaign_dataset_save_delete_contacts',
  296.         requirements: ['operation' => 'save|delete'],
  297.         options: ['expose' => true]
  298.     )]
  299.     public function saveDeleteContacts(
  300.         Request $request,
  301.         DatasetService $datasetService,
  302.         Campaign $campaign,
  303.         string $operation
  304.     ): Response {
  305.         $contactIds = (array) $request->get('dataset_contact_chck');
  306.         try {
  307.             $datasetService->saveDeleteDatasetContacts($campaign$operation$contactIds);
  308.             $this->addFlash('success''Done successfully !');
  309.         } catch (\Exception $exception) {
  310.             $this->addFlash('error'$exception->getMessage());
  311.         }
  312.         return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
  313.     }
  314.     #[Route('/campaign/{id}/dataset/filter/contacts'name'campaign_dataset_filter'options: ['expose' => true])]
  315.     public function filter(
  316.         DatasetService $datasetService,
  317.         CallingStatusService $callingStatusService,
  318.         Campaign $campaign
  319.     ): Response {
  320.         return $this->render(
  321.             $this->moduleTemplate 'filter.html.twig', [
  322.                 'data' => $datasetService->getDatasetCspCountries($campaign),
  323.                 'callingStatuses' => $callingStatusService->getList(),
  324.             ]
  325.         );
  326.     }
  327.     #[Route(
  328.         '/campaign/{id}/dataset/set-filter/contacts',
  329.         name'campaign_dataset_set_filter',
  330.         options: ['expose' => true]
  331.     )]
  332.     public function setFilter(Request $request,Campaign $campaign): Response
  333.     {
  334.         $session $request->getSession();
  335.         $filterData = [
  336.             'csp' => $request->request->get('csp'),
  337.             'csptype' => $request->request->get('csptype'),
  338.             'country' => $request->request->get('country'),
  339.             'region' => $request->request->get('region'),
  340.             'callstatus' => $request->request->get('callstatus'),
  341.             'phone' => (int) $request->request->get('phone'),
  342.             'priority' => (int) $request->request->get('priority'),
  343.             'clickLinks' => json_decode($request->request->get('clickLinks')),
  344.             'openCount' => json_decode($request->request->get('openCount')),
  345.         ];
  346.         $session->set('campaign_dataset_filters_' $campaign->getId(), $filterData);
  347.         return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
  348.     }
  349.     #[Route(
  350.         '/campaign/{id}/dataset/reset-filter/{key}',
  351.         name'campaign_dataset_reset_filter',
  352.         options: ['expose' => true]
  353.     )]
  354.     public function resetFilter(
  355.         Request $request,
  356.         DatasetService $datasetService,
  357.         Campaign $campaign,
  358.         string $key
  359.     ): Response {
  360.         $datasetService->removeFilter($campaign$key);
  361.         return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
  362.     }
  363.     #[Security("is_granted('ROLE_PM') or is_granted('ROLE_USER')")]
  364.     #[Route(
  365.         '/campaign/{id}/dataset/update-contact/status',
  366.         name'campaign_dataset_update_contact_status',
  367.         methods: ['POST'],
  368.         options: ['expose' => true]
  369.     )]
  370.     public function updateContactStatus(
  371.         Request $request,
  372.         DatasetService $datasetService,
  373.         Campaign $campaign
  374.     ): Response {
  375.         $contacts json_decode($request->request->get('contacts'));
  376.         $status = (int) $request->request->get('status');
  377.         $datasetService->updateContactStatus($campaign$contacts$status);
  378.         return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
  379.     }
  380.     #[Security("is_granted('ROLE_PM') or is_granted('ROLE_USER') or is_granted('ROLE_EDM') or is_granted('ROLE_EPA')")]
  381.     #[Route(
  382.         '/campaign/{id}/dataset/mark-as-unsubscribed/import',
  383.         name'campaign_dataset_mark_as_unsubscribed',
  384.         methods: ['GET''POST'],
  385.     )]
  386.     public function markAsUnsubscribed(
  387.         Request $request,
  388.         DatasetService $datasetService,
  389.         Campaign $campaign
  390.     ): Response {
  391.         $form $this->createForm(ImportType::class, null, [
  392.             'action' => $this->generateUrl('campaign_dataset_mark_as_unsubscribed', ['id' => $campaign->getId(),]),
  393.         ]);
  394.         $form->handleRequest($request);
  395.         if ($form->isSubmitted() && $form->isValid()) {
  396.             $data $form->getData();
  397.             try {
  398.                 $datasetService->markAsUnsubscribed(
  399.                     $campaign,
  400.                     $data['csvFile']
  401.                 );
  402.                 $this->addFlash('success''Done successfully !');
  403.             } catch (\Exception $exception) {
  404.                 $this->addFlash('error'$exception->getMessage());
  405.             }
  406.             return $this->redirectToRoute('campaign_dataset_index', ['id' => $campaign->getId(),]);
  407.         }
  408.         
  409.         return $this->render(
  410.             $this->moduleTemplate 'base_import_popup.html.twig', [
  411.                 'form' => $form->createView(),
  412.             ]
  413.         );
  414.     }
  415.     #[Route(
  416.         '/campaign/contact/{campaignContactId}/calling-status/{callStatus}/dataset/call'name'campaign_dataset_call'methods: ['GET''POST'], options: ['expose' => true]
  417.     )]
  418.     #[Route(
  419.         '/campaign/contact/{campaignContactId}/comment/dataset/call'name'campaign_dataset_comment_call'methods: ['GET''POST'], options: ['expose' => true]
  420.     )]
  421.     #[ParamConverter('campaignContact', class: CampaignContact::class, options: ['mapping' => ['campaignContactId' => 'id']])]
  422.     #[ParamConverter('callingStatus', class: CallingStatus::class, options: ['mapping' => ['callStatus' => 'id']])]
  423.     public function datasetCall(
  424.         Request $request,
  425.         DatasetService $datasetService,
  426.         CampaignContact $campaignContact,
  427.         ?CallingStatus $callingStatus null
  428.     ): Response {
  429.         $form $this->createForm(CallType::class, (new Call()), [
  430.             'action' => null !== $callingStatus
  431.                 $this->generateUrl('campaign_dataset_call', ['campaignContactId' => $campaignContact->getCampaign()->getId(), 'callStatus' => $callingStatus->getId(),])
  432.                 : $this->generateUrl('campaign_dataset_comment_call', ['campaignContactId' => $campaignContact->getCampaign()->getId(),]),
  433.             'callingStatus' => $callingStatus $callingStatus->getId() : $campaignContact->getCallingstatus()->getId(),
  434.             'call' => null,
  435.             'isComment' => null === $callingStatus,
  436.         ]);
  437.         $form->handleRequest($request);
  438.         if ($request->isMethod('POST')) {
  439.             try {
  440.                 $datasetService->updateCampaignContactStatus(
  441.                     $campaignContact,
  442.                     $callingStatus
  443.                 );
  444.                 $this->addFlash('success''Done successfully !');
  445.             } catch (\Exception $exception) {
  446.                 $this->addFlash('error'$exception->getMessage());
  447.             }
  448.             return new Response();
  449.         }
  450.         
  451.         return $this->render(
  452.             'campaign/call/add.html.twig', [
  453.                 'form' => $form->createView(),
  454.                 'campaignContact' => $campaignContact,
  455.                 'callingStatusName' => $callingStatus $callingStatus->getStatus() : $campaignContact->getCallingstatus()->getStatus(),
  456.                 'callingStatusId' => null !== $campaignContact->getCallingstatus() ? $campaignContact->getCallingstatus()->getId() : '',
  457.             ]
  458.         );
  459.     }
  460.     /*#[IsGranted("ROLE_CUSTOMER")]
  461.     #[Route('/campaign/contact/{campaignContactId}/customer-comment', name: 'campaign_dataset_customer_comment')]
  462.     #[ParamConverter('campaignContact', class: CampaignContact::class, options: ['mapping' => ['campaignContactId' => 'id']])]
  463.     public function getCustomerComment(
  464.         DatasetService $datasetService,
  465.         CampaignContact $campaignContact
  466.     ): Response {
  467.         return $this->render(
  468.             self::TEMPLATE_FOLDER . 'customer_comments.html.twig', [
  469.                 'campaignContact' => $campaignContact,
  470.                 'calls' => $datasetService->getCustomerComments($campaignContact),
  471.             ]
  472.         );
  473.     }
  474.     #[IsGranted("ROLE_CUSTOMER")]
  475.     #[Route('/campaign/{id}/customer-dataset/csv-export', name: 'campaign_dataset_customer_csv_export')]
  476.     public function csvExportCustomerDataset(
  477.         Request $request,
  478.         DatasetService $datasetService,
  479.         Campaign $campaign
  480.     ): Response {
  481.         return parent::csvExportResponse(
  482.             $request,
  483.             $datasetService,
  484.             $datasetService->getCsutomerCsvExportFilename(),
  485.             $datasetService->customerDatasetCsvExport($campaign)
  486.         );
  487.     }*/
  488. }