src/Service/FilmApplicationService.php line 204

Open in your IDE?
  1. <?php
  2. namespace App\Service;
  3. use App\Entity\FilmProject;
  4. use App\Entity\FilmProjectDetails;
  5. use App\Entity\FilmProjectFunding;
  6. use App\Entity\FilmProjectMember;
  7. use App\Entity\FilmProjectOriginal;
  8. use App\Entity\FilmProjectSponsor;
  9. use App\Entity\FilmProjectStoryImpact;
  10. use App\Entity\FilmProjectTimeline;
  11. use App\Entity\PaymentDetails;
  12. use App\Entity\Product;
  13. use App\Entity\User;
  14. use App\Repository\FilmProjectMemberRepository;
  15. use App\Repository\UserRepository;
  16. use App\Serializer\FilmProjectObjectConverter;
  17. use App\Service\Xero\ContactService;
  18. use App\Service\Xero\InvoiceService;
  19. use App\String\Constant;
  20. use App\Utility\PdfExporter;
  21. use Doctrine\ORM\EntityManagerInterface;
  22. use Knp\Snappy\Pdf;
  23. use Twig\Environment;
  24. class FilmApplicationService 
  25. {
  26.     private OrderDetailsService $orderDetailsService;
  27.     private SalesforceService $salesforceService;
  28.     private WordpressService $wpService;
  29.     private EntityManagerInterface $em;
  30.     private MerchantWarriorService $mwService;
  31.     private ContactService $xeroContactService;
  32.     private InvoiceService $invoiceService;
  33.     private MailService $mailService;
  34.     private SettingService $settingService;
  35.     private UserService $userService;
  36.     private Environment $twig;
  37.     private Pdf $pdf;
  38.     private UserRepository $userRepository;
  39.     private FilmProjectMemberRepository $filmProjectMemberRepository;
  40.     public function __construct(OrderDetailsService $orderDetailsServiceSalesforceService $salesforceServiceWordpressService $wpServiceEntityManagerInterface $emMerchantWarriorService $mwServiceContactService $xeroContactServiceInvoiceService $invoiceServiceMailService $mailServiceSettingService $settingServiceUserService $userServiceEnvironment $twigPdf $pdfUserRepository $userRepositoryFilmProjectMemberRepository $filmProjectMemberRepository)
  41.     {
  42.         $this->orderDetailsService $orderDetailsService;
  43.         $this->salesforceService $salesforceService;
  44.         $this->wpService $wpService;
  45.         $this->em $em;
  46.         $this->xeroContactService $xeroContactService;
  47.         $this->invoiceService $invoiceService;
  48.         $this->mwService $mwService;
  49.         $this->mailService $mailService;
  50.         $this->settingService $settingService;
  51.         $this->userService $userService;
  52.         $this->twig $twig;
  53.         $this->pdf $pdf;
  54.         $this->userRepository $userRepository;
  55.         $this->filmProjectMemberRepository $filmProjectMemberRepository;
  56.     }
  57.     /**
  58.      * Create film project skeleton object
  59.      *
  60.      * @param User $user
  61.      * @return FilmProject
  62.      */
  63.     public function createFilmProjectObj(User $user)
  64.     {
  65.         $filmProjectAdmin = (new FilmProjectMember())->setRole('Administrator');
  66.         $filmProjectProducer = (new FilmProjectMember())->setRole('Producer');
  67.         $filmProjectDirector = (new FilmProjectMember())->setRole('Director');
  68.         $filmProjectDetails = new FilmProjectDetails();
  69.         $filmProjectStoryImpact = new FilmProjectStoryImpact();
  70.         $filmProjectTimeline = new FilmProjectTimeline();
  71.         $filmProjectFunding = new FilmProjectFunding();
  72.         $filmApplicationOrder $this->orderDetailsService->createFilmApplicationOrderObj($user);
  73.         $filmProject = (new FilmProject())
  74.             ->setStatus('draft')
  75.             ->setFilmProjectAdmin($filmProjectAdmin)
  76.             ->setFilmProjectProducer($filmProjectProducer)
  77.             ->setFilmProjectDirector($filmProjectDirector)
  78.             ->setFilmProjectDetails($filmProjectDetails)
  79.             ->setFilmProjectStoryImpact($filmProjectStoryImpact)
  80.             ->setFilmProjectTimeline($filmProjectTimeline)
  81.             ->setFilmProjectFunding($filmProjectFunding)
  82.             ->setOwner($user)
  83.             ->setOrderDetails($filmApplicationOrder)
  84.             ->setProduct($this->settingService->getDefaultDonationProduct())
  85.         ;
  86.         
  87.         $filmApplicationOrder->setFilmProject($filmProject);
  88.         return $filmProject;
  89.     }
  90.     /**
  91.      * Create campaign salesforce object along with its relations
  92.      *
  93.      * @param FilmProject $entityInstance
  94.      * @return void
  95.      */
  96.     public function createCampaignSalesforce(FilmProject $entityInstance)
  97.     {
  98.         // Create salesforce objects before invoice creation
  99.         $filmProjectAdmin $entityInstance->getFilmProjectAdmin();
  100.         $filmProjectProducer $entityInstance->getFilmProjectProducer();
  101.         $filmProjectDirector $entityInstance->getFilmProjectDirector();
  102.         $projectMembers = [$filmProjectAdmin$filmProjectProducer$filmProjectDirector];
  103.         foreach ($projectMembers as $projectMember) {
  104.             // $this->em->persist($projectMember);
  105.             // $this->em->flush();
  106.             $accountSalesforceId $this->salesforceService->createAccountFromFilmProjectMember($projectMember);
  107.             if ($accountSalesforceId) {
  108.                 $projectMember->setAccountSalesforceId($accountSalesforceId);
  109.             }
  110.             $salesforceId $this->salesforceService->createContactFromFilmMember($projectMember);
  111.             $projectMember->setSalesforceId($salesforceId);
  112.             $this->em->persist($projectMember);
  113.             $this->em->flush();
  114.         }
  115.         $salesforceId $this->salesforceService->createCampaign($entityInstance);
  116.         $entityInstance->setSalesforceId($salesforceId);
  117.         $this->em->persist($entityInstance);
  118.         $this->em->flush();
  119.     }
  120.     public function updateCampaignSalesforce(FilmProject $entityInstance)
  121.     {
  122.         // Create salesforce objects before invoice creation
  123.         $filmProjectAdmin $entityInstance->getFilmProjectAdmin();
  124.         $filmProjectProducer $entityInstance->getFilmProjectProducer();
  125.         $filmProjectDirector $entityInstance->getFilmProjectDirector();
  126.         $filmProjectMembers $entityInstance->getFilmProjectMembers()->toArray();
  127.         $projectMembers = [$filmProjectAdmin$filmProjectProducer$filmProjectDirector];
  128.         $projectMembers array_merge($projectMembers$filmProjectMembers);
  129.         foreach ($projectMembers as $projectMember) {
  130.             // $accountSalesforceId = $projectMember->getAccountSalesforceId();
  131.             // if (empty($accountSalesforceId) && !empty($projectMember->getOrganisation())) {
  132.             //     $accountSalesforceId = $this->salesforceService->createAccountFromFilmProjectMember($projectMember);
  133.                 
  134.             //     if ($accountSalesforceId) $projectMember->setAccountSalesforceId($accountSalesforceId);
  135.             // }
  136.             if (!empty($projectMember->getOrganisation())) {
  137.                 $accountSalesforceId $this->salesforceService->createAccountFromFilmProjectMember($projectMember);
  138.                 
  139.                 if ($accountSalesforceId) {
  140.                     $projectMember->setAccountSalesforceId($accountSalesforceId);
  141.                 }
  142.             }
  143.             $salesforceId $projectMember->getSalesforceId();
  144.             if (empty($salesforceId)) {
  145.                 $salesforceId $this->salesforceService->createContactFromFilmMember($projectMember);
  146.                 $projectMember->setSalesforceId($salesforceId);
  147.             } else {
  148.                 $this->salesforceService->createContactFromFilmMember($projectMember);
  149.             }
  150.             $this->em->persist($projectMember);
  151.             $this->em->flush();
  152.         }
  153.         $salesforceId $this->salesforceService->updateCampaign($entityInstance);
  154.         $entityInstance->setModifiedAt(new \DateTime('now'));
  155.         $this->em->persist($entityInstance);
  156.         $this->em->flush();
  157.     }
  158.     public function updateCampaignSalesforceAdmin(FilmProject $entityInstance) {
  159.         $salesforceId $this->salesforceService->updateCampaignAdmin($entityInstance);
  160.     }
  161.     public function createTransactionSalesforce(FilmProject $entityInstance)
  162.     {
  163.         $id $this->salesforceService->createFilmApplicationTransaction($entityInstance);
  164.         $orderDetails $entityInstance->getOrderDetails();
  165.         $orderDetails->setSalesforceId($id);
  166.         $this->em->persist($orderDetails);
  167.         $this->em->flush();
  168.     }
  169.     /**
  170.      * Create invoice from film project application
  171.      *
  172.      * @param User $user
  173.      * @param FilmProject $filmProject
  174.      * @return void
  175.      */
  176.     public function createFilmProjectInvoice(?User $user nullFilmProject $filmProject$isUpdate false
  177.     {
  178.         $orderDetails $filmProject->getOrderDetails();
  179.         $xeroId $this->xeroContactService->findContactByprojectName($filmProject) ?? $this->xeroContactService->createContactByProjectName($filmProject);
  180.         
  181.         if (empty($xeroId)) {
  182.             throw new \LogicException("xero ID doesn\'t get created successfully");
  183.         }
  184.         // $userInformation = $user->getUserInformation();
  185.         // $userInformation->setXeroId($xeroId);
  186.         // $this->em->persist($userInformation);
  187.         $defaultProduct $this->getDefaultProduct();
  188.         $orderDetails $this->invoiceService->createFilmInvoice($filmProject$defaultProduct$xeroId$orderDetails$user); // XERO CREATE INVOICE
  189.         $orderDetails->setXeroContactId($xeroId);
  190.         $this->em->persist($orderDetails);
  191.         $filmProject->setXeroId($xeroId); // Finally set xero ID on project
  192.         $this->em->persist($filmProject);
  193.         $this->em->flush();
  194.     }
  195.     /**
  196.      * Set film project to draft
  197.      *
  198.      * @param FilmProject $filmProject
  199.      * @return void
  200.      */
  201.     public function setFilmProjectToDraft(FilmProject $filmProject)
  202.     {
  203.         $filmProject->setStatus('draft');
  204.         if ( $filmProject->getResubmitCount() ) {
  205.             $filmProject->setStatus('resubmit');
  206.         }
  207.         $this->em->persist($filmProject);
  208.         $this->em->flush();
  209.     }
  210.     /**
  211.      * Set film project to ready for review
  212.      *
  213.      * @param FilmProject $filmProject
  214.      * @return void
  215.      */
  216.     public function setFilmProjectToReadyForReview(FilmProject $filmProject)
  217.     {
  218.         $filmProject->setStatus('ready for review');
  219.         $filmProject->setCreatedAt(new \DateTime('now'));
  220.         $this->em->persist($filmProject);
  221.         $this->em->flush();
  222.     }
  223.     /**
  224.      * Set film project created date to today
  225.      *
  226.      * @param FilmProject $filmProject
  227.      * @return void
  228.      */
  229.     public function setFilmProjectCreatedDateToday(FilmProject $filmProject)
  230.     {
  231.         $currentDatetime = new \DateTime('now');
  232.         $filmProject->setCreatedAt($currentDatetime);
  233.         $this->em->persist($filmProject);
  234.         $this->em->flush();
  235.     }
  236.     /**
  237.      * Update Wordpress object
  238.      *
  239.      * @param FilmProject $filmProject
  240.      * @return void
  241.      */
  242.     public function updateWordpressObject(FilmProject $filmProject)
  243.     {
  244.         $this->wpService->updateWpFilmProject($filmProject);
  245.         $this->wpService->createProjectUpdate($filmProject$this->filmProjectMemberRepository);
  246.     }
  247.     public function createWordpressObject(FilmProject $filmProject)
  248.     {
  249.         // Create wordpress project
  250.         $wordpressId $this->wpService->createWpFilmProject($filmProject);
  251.         $filmProject->setWordpressId($wordpressId);
  252.         $filmProject->setWordpressStatus(Constant::WP_STATUS_DRAFT);
  253.         $this->em->persist($filmProject);
  254.         $this->em->flush();
  255.     }
  256.     /**
  257.      * Approve film project
  258.      *
  259.      * @param FilmProject $filmProject
  260.      * @return void
  261.      */
  262.     public function approveFilmProject(FilmProject $filmProject
  263.     {
  264.         $filmProject
  265.             ->setStatus('approved')
  266.             ->setNote(null)
  267.             ->setProjectApprovalDate(new \DateTime())
  268.         ;
  269.         // Create wordpress users for each member in the project
  270.         // $this->createUserProject($filmProject);
  271.         // Create wordpress project
  272.         // $wordpressId = $this->wpService->createWpFilmProject($filmProject);
  273.         // $filmProject->setWordpressId($wordpressId);
  274.         // $filmProject->setWordpressStatus(Constant::WP_STATUS_DRAFT);
  275.         // Update project members
  276.         $projectOwner $filmProject->getOwner();
  277.         $projectOwnerEmail $projectOwner->getEmail();
  278.         $allProjectMembers $filmProject->getAllMembers();
  279.         foreach($allProjectMembers as $projectMember) {
  280.             $existingUser $this->userRepository->findOneBy(['email' => $projectMember->getEmail()]);
  281.             if ($existingUser) {
  282.                 if ($projectOwnerEmail == $projectMember->getEmail()) {
  283.                     $projectMember->setIsActive(true);
  284.                     $this->wpService->addMemberFromProject($projectMember$existingUser);
  285.                 }
  286.             }
  287.         }
  288.         // Update wordpress donation
  289.         if ($filmProject->getDonations()) {
  290.             $this->wpService->updateFilmObjectDonationByProject($filmProject);
  291.         }
  292.         
  293.         // Approve campaign in Salesforce
  294.         $this->salesforceService->approveCampaign($filmProject);
  295.         $this->em->persist($filmProject);
  296.         $this->em->flush();
  297.     }
  298.     /**
  299.      * Ask to decline film project
  300.      *
  301.      * @param FilmProject $filmProject
  302.      * @return void
  303.      */
  304.     public function declineFilmProject(FilmProject $filmProject)
  305.     {
  306.         $filmProject
  307.             ->setStatus('declined')
  308.             ->setResubmitCount(0)
  309.         ;
  310.         // Update salesforce object to be declined
  311.         $this->salesforceService->declineCampaign($filmProject);
  312.         
  313.         $this->em->persist($filmProject);
  314.         $this->em->flush();
  315.         // Send email to filmmaker
  316.         $this->mailService->sendFilmProjectEmail(Constant::MAIL_FILM_DECLINED$filmProject);
  317.     }
  318.     /**
  319.      * Ask to resubmit film project
  320.      *
  321.      * @param FilmProject $filmProject
  322.      * @return void
  323.      */
  324.     public function resubmitFilmProject(FilmProject $filmProject)
  325.     {
  326.         $filmProject
  327.             ->setStatus('resubmit')
  328.             ->setResubmitCount(+1)
  329.         ;
  330.         // Update salesforce object to be asked to resubmit
  331.         $this->salesforceService->resubmitCampaign($filmProject);
  332.         
  333.         $this->em->persist($filmProject);
  334.         $this->em->flush();
  335.         // Send email to filmmaker admin
  336.         $this->mailService->sendFilmProjectEmail(Constant::MAIL_FILM_ASK_TO_RESUBMIT$filmProject);
  337.     }
  338.     /**
  339.      * Process film application payment 
  340.      *
  341.      * @param FilmProject $filmProject
  342.      * @return void
  343.      */
  344.     public function proceedPayment(FilmProject $filmProject)
  345.     {
  346.         $orderDetails $filmProject->getOrderDetails();
  347.         $orderBillingDetails $orderDetails->getOrderBillingDetails();
  348.         if ($orderBillingDetails->getCardId()) { // If use previous credit card
  349.             $orderDetails $this->mwService->processCardByCardId($orderDetails$orderBillingDetails->getCardId(), true);
  350.         } else { // New payment
  351.             $orderDetails $this->mwService->processCard($orderDetails$orderBillingDetails->getSavedCreditCardNumber(), true); // Process card with addCard value 1
  352.             $orderBillingDetails $orderDetails->getOrderBillingDetails();
  353.             if (!empty($orderBillingDetails->getCardId())){ // Save credit card to DB
  354.                 $user $orderDetails->getUser();
  355.                 $this->userService->saveUserCreditCard($user$orderBillingDetails->getCardId());
  356.             }
  357.         }
  358.         
  359.         $this->updateOrderDetails($orderDetails);
  360.         $this->changePaymentObjectToPaid($orderDetails->getPaymentDetails());
  361.     }
  362.     /**
  363.      * Send email 
  364.      *
  365.      * @param FilmProject $filmProject
  366.      * @return void
  367.      */
  368.     public function sendEmail(FilmProject $filmProjectEnvironment $twig null)
  369.     {
  370.         // $this->mailService->sendFilmProjectEmail(Constant::MAIL_FILM_SUBMITTED, $filmProject);
  371.         $orderDetails $filmProject->getOrderDetails();
  372.         // TODO: re-enable once Villar set up wkhtmltopdf on staging site
  373.         // Generate pdf report as well
  374.         $pdfExporter = new PdfExporter($this->twig$this->pdf);
  375.         $projectPdf $pdfExporter->convertProjectToPdf($filmProjecttrue);
  376.         $pdf $pdfExporter->convertFilmReceiptPdf($orderDetailstruetrue);
  377.         $attachmentPath = [
  378.             [
  379.                 'path' => '',
  380.                 'filename' => $filmProject->getTitle() .' receipt.pdf',
  381.                 'pdf' => $pdf,
  382.             ],
  383.             [
  384.                 'path' => '',
  385.                 'filename' => $filmProject->getTitle() .' report.pdf',
  386.                 'pdf' => $projectPdf,
  387.             ]
  388.         ];
  389.         $this->mailService->sendFilmProjectEmail(Constant::MAIL_FILM_PAYMENT_RECEIVED$filmProject$attachmentPath);
  390.     }
  391.     public function sendApprovedEmail(FilmProject $filmProject)
  392.     {
  393.         if (!$filmProject->getResubmitCount()) {
  394.             $this->mailService->sendFilmProjectEmail(Constant::MAIL_FILM_APPROVED$filmProject);
  395.         } else {
  396.             $this->mailService->sendFilmProjectEmail('MAIL_FILM_RESUBMIT_APPROVED'$filmProject);
  397.         }
  398.         
  399.         $this->sendMemberInvitationEmail($filmProject);
  400.     }
  401.     public function sendMemberInvitationEmail(FilmProject $filmProject)
  402.     {
  403.         $filmProjectTeam = [];
  404.         $filmAdmin $filmProject->getFilmProjectAdmin();
  405.         $filmProducer $filmProject->getFilmProjectProducer();
  406.         $filmDirector $filmProject->getFilmProjectDirector();
  407.         if (!$filmAdmin->isIsSent()) {
  408.             array_push($filmProjectTeam$filmAdmin);
  409.             $filmAdmin->approveSentEmail();
  410.             $this->em->persist($filmAdmin);
  411.         }
  412.         if (!$filmProducer->isIsSent()) {
  413.             array_push($filmProjectTeam$filmProducer);
  414.             $filmProducer->approveSentEmail();
  415.             $this->em->persist($filmProducer);
  416.         }
  417.         
  418.         if (!$filmDirector->isIsSent()) {
  419.             array_push($filmProjectTeam$filmDirector);
  420.             $filmDirector->approveSentEmail();
  421.             $this->em->persist($filmDirector);
  422.         }
  423.         
  424.         foreach($filmProject->getFilmProjectMembers() as $filmProjectMember) {
  425.             if (!$filmProjectMember->isIsSent()) {
  426.                 array_push($filmProjectTeam$filmProjectMember);
  427.                 $filmProjectMember->approveSentEmail();
  428.                 $this->em->persist($filmProjectMember);
  429.             }
  430.         }
  431.         // Check if user exists as filmmaker or donor
  432.         $isSentEmails = [];
  433.         $owner $filmProject->getOwner();
  434.         foreach ($filmProjectTeam as $member) {
  435.             if (!in_array($member->getEmail(), $isSentEmails)) {
  436.                 if ($member->getEmail() != $owner->getEmail()) {
  437.                     $status Constant::MAIL_FILM_MEMBER_STATUS;
  438.                     $user $this->userRepository->findOneBy(['email' => $member->getEmail()]);
  439.                     
  440.                     if($user) {
  441.                         // if ($user->isFilmmaker()) {
  442.                             $status Constant::MAIL_FILMMAKER_FILM_MEMBER_STATUS;
  443.                         // }
  444.                     }
  445.                     $this->mailService->sendFilmMemberEmail($status$filmProject$member);
  446.                     array_push($isSentEmails$member->getEmail());
  447.                 }
  448.             }
  449.         }
  450.         $this->em->flush();
  451.     }
  452.     
  453.     /**
  454.      * Get default film application product
  455.      *
  456.      * @return Product|null
  457.      */
  458.     public function getDefaultProduct(): ?Product
  459.     {
  460.         return $this->settingService->getDefaultFilmApplicationProduct();
  461.     }
  462.     protected function changePaymentObjectToPaid(PaymentDetails $paymentDetails
  463.     {
  464.         $paymentDetails->setPaid();
  465.         $this->em->persist($paymentDetails);
  466.         $this->em->flush();
  467.     }
  468.     protected function updateOrderDetails($orderDetails)
  469.     {
  470.         $orderDetails->setModifiedAt(new \DateTime('now'));
  471.         $this->em->persist($orderDetails);
  472.         $this->em->flush();
  473.     }
  474.     public function createOriginalCopy($entityInstance)
  475.     {
  476.         $filmProjectConverter = new FilmProjectObjectConverter();
  477.         $filmProjectOriginalCopy $entityInstance->getfilmprojectOriginal();
  478.         
  479.         if (empty($filmProjectOriginalCopy)) {
  480.             $filmProjectArr $filmProjectConverter->serializeFilmProjectDocument($entityInstance);
  481.             $filmProjectOriginalCopy = (new FilmProjectOriginal())
  482.                 ->setFilmProject($entityInstance)
  483.                 ->setData($filmProjectArr);
  484.             ;
  485.             $this->em->persist($filmProjectOriginalCopy);
  486.             $this->em->flush();
  487.         }
  488.     }
  489.     /**
  490.      * Publish project on Wordpress
  491.      *
  492.      * @param FilmProject $filmProject
  493.      * @return void
  494.      */
  495.     public function publishProject(FilmProject $filmProject)
  496.     {
  497.         $this->wpService->setProjectStatus($filmProjectConstant::WP_STATUS_PUBLISH);
  498.         $filmProject->setWordpressStatus(Constant::WP_STATUS_PUBLISH);
  499.         $this->em->persist($filmProject);
  500.         $this->em->flush();
  501.     }
  502.     /**
  503.      * Unpublish project on Wordpress
  504.      *
  505.      * @param FilmProject $filmProject
  506.      * @return void
  507.      */
  508.     public function unpublishProject(FilmProject $filmProject)
  509.     {
  510.         $this->wpService->setProjectStatus($filmProjectConstant::WP_STATUS_DRAFT);
  511.         $filmProject->setWordpressStatus(Constant::WP_STATUS_DRAFT);
  512.         $this->em->persist($filmProject);
  513.         $this->em->flush();
  514.     }
  515.     /**
  516.      * Archive project on Wordpress
  517.      *
  518.      * @param FilmProject $filmProject
  519.      * @return void
  520.      */
  521.     public function archiveProject(FilmProject $filmProject)
  522.     {
  523.         $this->wpService->deleteProject($filmProject);
  524.         $filmProject->setWordpressStatus(Constant::WP_STATUS_ARCHIVED_ALT);
  525.         $this->em->persist($filmProject);
  526.         $this->em->flush();
  527.     }
  528.     public function makePrivateProject(FilmProject $filmProjectstring $password)
  529.     {
  530.         $this->wpService->setProjectPrivate($filmProject$password);
  531.         $filmProject->setWordpressStatus(Constant::WP_STATUS_PROTECTED);
  532.         $filmProject->setWordpressPassword($password);
  533.         $this->em->persist($filmProject);
  534.         $this->em->flush();
  535.     }
  536.     public function makeHiddenProject(FilmProject $filmProject)
  537.     {
  538.         $this->wpService->setProjectHidden($filmProject);
  539.         $filmProject->setWordpressStatus(Constant::WP_STATUS_PRIVATE);
  540.         $this->em->persist($filmProject);
  541.         $this->em->flush();
  542.     }
  543.     public function createUserProject(FilmProject $filmProject)
  544.     {
  545.         $administrator $filmProject->getFilmProjectAdmin();
  546.         $producer $filmProject->getFilmProjectProducer();
  547.         $director $filmProject->getFilmProjectDirector();
  548.         $filmProjectMembers $filmProject->getFilmProjectMembers()->toArray();
  549.         $projectMembers = [$administrator$producer$director];
  550.         $projectMembers array_merge($projectMembers$filmProjectMembers);
  551.         foreach ($projectMembers as $projectMember) {
  552.             $wordpressId $projectMember->getWordpressId();
  553.             if (empty($wordpressId)) {
  554.                 // Start the user creation procedure
  555.                 $user $this->userRepository->findOneBy(['email' => $projectMember->getEmail()]);
  556.                 if (empty($user)) {
  557.                     $users $this->filmProjectMemberRepository->findBy(['email' => $projectMember->getEmail()]);
  558.                     if (!empty($users)) {
  559.                         
  560.                     }
  561.                 } else {
  562.                     $userInformation $user->getUserInformation(); // Main User will always have wordpress ID attached
  563.                     $wordpressId $userInformation->getWordpressId();
  564.                 }
  565.             }
  566.             $projectMember->setWordpressId($wordpressId);
  567.             $this->em->persist($projectMember);
  568.         }
  569.         
  570.         $this->em->flush();
  571.     }
  572.     /**
  573.      * hide donation box
  574.      *
  575.      * @param FilmProject $filmProject
  576.      * @return void
  577.      */
  578.     public function hideDonationBox(FilmProject $filmProject)
  579.     {
  580.         $filmProject->setIsHideDonationBox(true);
  581.         $this->wpService->setDonationBoxStatus($filmProject);
  582.         $this->em->persist($filmProject);
  583.         $this->em->flush();
  584.     }
  585.     /**
  586.      * Show donation box
  587.      *
  588.      * @param FilmProject $filmProject
  589.      * @return void
  590.      */
  591.     public function showDonationBox(FilmProject $filmProject)
  592.     {
  593.         $filmProject->setIsHideDonationBox(false);
  594.         $this->wpService->setDonationBoxStatus($filmProject);
  595.         $this->em->persist($filmProject);
  596.         $this->em->flush();
  597.     }
  598.     /**
  599.      * generate film project sponsors from partner name comma separated text
  600.      *
  601.      * @param FilmProject $filmProject
  602.      * @return void
  603.      */
  604.     public function generateSponsorsFromText(FilmProject $filmProject)
  605.     {
  606.         $filmProjectStoryImpact $filmProject->getFilmProjectStoryImpact();
  607.         $filmImpactPartnerString $filmProjectStoryImpact->getPartnerName();
  608.         if ($filmImpactPartnerString) {
  609.             $filmImpactPartnerArr explode(','$filmImpactPartnerString);
  610.             foreach ($filmImpactPartnerArr as $item) {
  611.                 $impactPartner = (new FilmProjectSponsor())
  612.                     ->setName($item)
  613.                 ;
  614.                 $filmProject->addFilmProjectSponsor($impactPartner);
  615.             }
  616.         }
  617.         $this->em->persist($filmProject);
  618.         $this->em->flush();
  619.     }
  620.     /**
  621.      * Generate text from sponsors
  622.      *
  623.      * @param FilmProject $filmProject
  624.      * @return void
  625.      */
  626.     public function generateTextFromSponsors(FilmProject $filmProject)
  627.     {
  628.         $filmProjectSponsors $filmProject->getFilmProjectSponsors();
  629.         $textArr = [];
  630.         if ($filmProjectSponsors) {
  631.             foreach($filmProjectSponsors as $filmProjectSponsor) {
  632.                 $partnerName $filmProjectSponsor->getName();
  633.                 array_push($textArr$partnerName);
  634.             }
  635.         }
  636.         $filmProjectStoryImpact $filmProject->getFilmProjectStoryImpact();
  637.         $filmProjectStoryImpact->setPartnerName(implode(', '$textArr));
  638.     }
  639.     public function checkIsProjectImage(FilmProject $filmProject)
  640.     {
  641.         $filmProjectDetails $filmProject->getFilmProjectDetails();
  642.         $heroImage $filmProjectDetails->getProjectHeroImage();
  643.         if (empty($heroImage) || $heroImage == '') return false;
  644.         return true;
  645.     }
  646.     public function checkIsProjectImageName(FilmProject $filmProject)
  647.     {
  648.         $filmProjectDetails $filmProject->getFilmProjectDetails();
  649.         $heroImage $filmProjectDetails->getProjectHeroImage();
  650.         if (strlen($heroImage) > 50) {
  651.             return false;
  652.         }
  653.         return true;
  654.     }
  655.     public function setExistingActiveMembers(FilmProject $filmProject
  656.     {
  657.         $filmProjectMembers $filmProject->getFilmProjectMembers(); // only newly added members
  658.         
  659.         foreach ($filmProjectMembers as $member) {
  660.             if (!$member->getEmail() || $member->isIsActive()) {
  661.                 continue;
  662.             }
  663.             $currentMembers $this->filmProjectMemberRepository->findMemberByEmailAndProject($member->getEmail(), $filmProject->getId());
  664.             foreach($currentMembers as $currentMember) {
  665.                 if (($currentMember->getEmail() == $member->getEmail()) && $currentMember->isIsActive()) { // if email same and already an active member
  666.                     $member->setIsActive(true);
  667.                     $member->setIsSent(true);
  668.                     // Finally, added this member directly to Wordpress
  669.                     $user $this->userRepository->findOneBy(['email' => $member->getEmail()]);
  670.                     if ($user) {
  671.                         $userInformation $user->getUserInformation(); // Main User will always have wordpress ID attached
  672.                         $wordpressId $userInformation->getWordpressId();
  673.                         $member->setWordpressId($wordpressId);
  674.                         $this->em->persist($member);
  675.                         $this->em->flush();
  676.                         $this->wpService->addMemberFromProject($member$user);
  677.                     }
  678.                     continue;
  679.                 }
  680.             }
  681.         }
  682.     }
  683.     public function resetProjectCrewMembers(FilmProject $filmProject)
  684.     {
  685.         $this->resetProjectAdmins($filmProject);
  686.         $this->resetWordpressIdCrewMembers($filmProject);
  687.         $this->wpService->resetCrewMembers($filmProject);
  688.     }
  689.     public function resetProjectAdmins(FilmProject $filmProject
  690.     {
  691.         $filmAdmin $filmProject->getFilmProjectAdmin();
  692.         $filmProducer $filmProject->getFilmProjectProducer();
  693.         $filmDirector $filmProject->getFilmProjectDirector();
  694.         $filmProjectAdmins = [$filmAdmin$filmProducer$filmDirector];
  695.         foreach ($filmProjectAdmins as $filmProjectAdmin) {
  696.             $user $this->userRepository->findOneBy(['email' => $filmProjectAdmin->getEmail()]);
  697.             if ($user) {
  698.                 $this->wpService->addMemberFromProject($filmProjectAdmin$user);
  699.             } else {
  700.                 $this->wpService->addNonMemberFromProject($filmProjectAdmin);
  701.             }
  702.         }
  703.     }
  704.     public function resetWordpressIdCrewMembers(FilmProject $filmProject)
  705.     {
  706.         $filmProjectMembers $filmProject->getFilmProjectMembers();
  707.         foreach($filmProjectMembers as $member) {
  708.             if (!$member->getWordpressId()) {
  709.                 continue;
  710.             }
  711.             $user $this->userRepository->findOneBy(['email' => $member->getEmail()]);
  712.             if ($user) {
  713.                 $userInformation $user->getUserInformation();
  714.                 $newWpId $userInformation->getWordpressId();
  715.                 
  716.                 $member->setWordpressId($newWpId);
  717.             } else {
  718.                 $member->setWordpressId(null);
  719.             }
  720.             $this->em->persist($member);
  721.         }
  722.         $this->em->flush();
  723.     }
  724. }