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.         if (empty($xeroId)) {
  181.             throw new \LogicException("xero ID doesn\'t get created successfully");
  182.         }
  183.         // $userInformation = $user->getUserInformation();
  184.         // $userInformation->setXeroId($xeroId);
  185.         // $this->em->persist($userInformation);
  186.         $defaultProduct $this->getDefaultProduct();
  187.         $orderDetails $this->invoiceService->createFilmInvoice($filmProject$defaultProduct$xeroId$orderDetails$user); // XERO CREATE INVOICE
  188.         $orderDetails->setXeroContactId($xeroId);
  189.         $this->em->persist($orderDetails);
  190.         $filmProject->setXeroId($xeroId); // Finally set xero ID on project
  191.         $this->em->persist($filmProject);
  192.         $this->em->flush();
  193.     }
  194.     /**
  195.      * Set film project to draft
  196.      *
  197.      * @param FilmProject $filmProject
  198.      * @return void
  199.      */
  200.     public function setFilmProjectToDraft(FilmProject $filmProject)
  201.     {
  202.         $filmProject->setStatus('draft');
  203.         if ( $filmProject->getResubmitCount() ) {
  204.             $filmProject->setStatus('resubmit');
  205.         }
  206.         $this->em->persist($filmProject);
  207.         $this->em->flush();
  208.     }
  209.     /**
  210.      * Set film project to ready for review
  211.      *
  212.      * @param FilmProject $filmProject
  213.      * @return void
  214.      */
  215.     public function setFilmProjectToReadyForReview(FilmProject $filmProject)
  216.     {
  217.         $filmProject->setStatus('ready for review');
  218.         $filmProject->setCreatedAt(new \DateTime('now'));
  219.         $this->em->persist($filmProject);
  220.         $this->em->flush();
  221.     }
  222.     /**
  223.      * Set film project created date to today
  224.      *
  225.      * @param FilmProject $filmProject
  226.      * @return void
  227.      */
  228.     public function setFilmProjectCreatedDateToday(FilmProject $filmProject)
  229.     {
  230.         $currentDatetime = new \DateTime('now');
  231.         $filmProject->setCreatedAt($currentDatetime);
  232.         $this->em->persist($filmProject);
  233.         $this->em->flush();
  234.     }
  235.     /**
  236.      * Update Wordpress object
  237.      *
  238.      * @param FilmProject $filmProject
  239.      * @return void
  240.      */
  241.     public function updateWordpressObject(FilmProject $filmProject)
  242.     {
  243.         $this->wpService->updateWpFilmProject($filmProject);
  244.         $this->wpService->createProjectUpdate($filmProject$this->filmProjectMemberRepository);
  245.     }
  246.     public function createWordpressObject(FilmProject $filmProject)
  247.     {
  248.         // Create wordpress project
  249.         $wordpressId $this->wpService->createWpFilmProject($filmProject);
  250.         $filmProject->setWordpressId($wordpressId);
  251.         $filmProject->setWordpressStatus(Constant::WP_STATUS_DRAFT);
  252.         $this->em->persist($filmProject);
  253.         $this->em->flush();
  254.     }
  255.     /**
  256.      * Approve film project
  257.      *
  258.      * @param FilmProject $filmProject
  259.      * @return void
  260.      */
  261.     public function approveFilmProject(FilmProject $filmProject
  262.     {
  263.         $filmProject
  264.             ->setStatus('approved')
  265.             ->setNote(null)
  266.         ;
  267.         // Create wordpress users for each member in the project
  268.         // $this->createUserProject($filmProject);
  269.         // Create wordpress project
  270.         // $wordpressId = $this->wpService->createWpFilmProject($filmProject);
  271.         // $filmProject->setWordpressId($wordpressId);
  272.         // $filmProject->setWordpressStatus(Constant::WP_STATUS_DRAFT);
  273.         // Update project members
  274.         $projectOwner $filmProject->getOwner();
  275.         $projectOwnerEmail $projectOwner->getEmail();
  276.         $allProjectMembers $filmProject->getAllMembers();
  277.         foreach($allProjectMembers as $projectMember) {
  278.             $existingUser $this->userRepository->findOneBy(['email' => $projectMember->getEmail()]);
  279.             if ($existingUser) {
  280.                 if ($projectOwnerEmail == $projectMember->getEmail()) {
  281.                     $projectMember->setIsActive(true);
  282.                     $this->wpService->addMemberFromProject($projectMember$existingUser);
  283.                 }
  284.             }
  285.         }
  286.         // Update wordpress donation
  287.         if ($filmProject->getDonations()) {
  288.             $this->wpService->updateFilmObjectDonationByProject($filmProject);
  289.         }
  290.         
  291.         // Approve campaign in Salesforce
  292.         $this->salesforceService->approveCampaign($filmProject);
  293.         $this->em->persist($filmProject);
  294.         $this->em->flush();
  295.     }
  296.     /**
  297.      * Ask to decline film project
  298.      *
  299.      * @param FilmProject $filmProject
  300.      * @return void
  301.      */
  302.     public function declineFilmProject(FilmProject $filmProject)
  303.     {
  304.         $filmProject
  305.             ->setStatus('declined')
  306.             ->setResubmitCount(0)
  307.         ;
  308.         // Update salesforce object to be declined
  309.         $this->salesforceService->declineCampaign($filmProject);
  310.         
  311.         $this->em->persist($filmProject);
  312.         $this->em->flush();
  313.         // Send email to filmmaker
  314.         $this->mailService->sendFilmProjectEmail(Constant::MAIL_FILM_DECLINED$filmProject);
  315.     }
  316.     /**
  317.      * Ask to resubmit film project
  318.      *
  319.      * @param FilmProject $filmProject
  320.      * @return void
  321.      */
  322.     public function resubmitFilmProject(FilmProject $filmProject)
  323.     {
  324.         $filmProject
  325.             ->setStatus('resubmit')
  326.             ->setResubmitCount(+1)
  327.         ;
  328.         // Update salesforce object to be asked to resubmit
  329.         $this->salesforceService->resubmitCampaign($filmProject);
  330.         
  331.         $this->em->persist($filmProject);
  332.         $this->em->flush();
  333.         // Send email to filmmaker admin
  334.         $this->mailService->sendFilmProjectEmail(Constant::MAIL_FILM_ASK_TO_RESUBMIT$filmProject);
  335.     }
  336.     /**
  337.      * Process film application payment 
  338.      *
  339.      * @param FilmProject $filmProject
  340.      * @return void
  341.      */
  342.     public function proceedPayment(FilmProject $filmProject)
  343.     {
  344.         $orderDetails $filmProject->getOrderDetails();
  345.         $orderBillingDetails $orderDetails->getOrderBillingDetails();
  346.         if ($orderBillingDetails->getCardId()) { // If use previous credit card
  347.             $orderDetails $this->mwService->processCardByCardId($orderDetails$orderBillingDetails->getCardId(), true);
  348.         } else { // New payment
  349.             $orderDetails $this->mwService->processCard($orderDetails$orderBillingDetails->getSavedCreditCardNumber(), true); // Process card with addCard value 1
  350.             $orderBillingDetails $orderDetails->getOrderBillingDetails();
  351.             if (!empty($orderBillingDetails->getCardId())){ // Save credit card to DB
  352.                 $user $orderDetails->getUser();
  353.                 $this->userService->saveUserCreditCard($user$orderBillingDetails->getCardId());
  354.             }
  355.         }
  356.         
  357.         $this->updateOrderDetails($orderDetails);
  358.         $this->changePaymentObjectToPaid($orderDetails->getPaymentDetails());
  359.     }
  360.     /**
  361.      * Send email 
  362.      *
  363.      * @param FilmProject $filmProject
  364.      * @return void
  365.      */
  366.     public function sendEmail(FilmProject $filmProjectEnvironment $twig null)
  367.     {
  368.         // $this->mailService->sendFilmProjectEmail(Constant::MAIL_FILM_SUBMITTED, $filmProject);
  369.         $orderDetails $filmProject->getOrderDetails();
  370.         // TODO: re-enable once Villar set up wkhtmltopdf on staging site
  371.         // Generate pdf report as well
  372.         $pdfExporter = new PdfExporter($this->twig$this->pdf);
  373.         $projectPdf $pdfExporter->convertProjectToPdf($filmProjecttrue);
  374.         $pdf $pdfExporter->convertFilmReceiptPdf($orderDetailstruetrue);
  375.         $attachmentPath = [
  376.             [
  377.                 'path' => '',
  378.                 'filename' => $filmProject->getTitle() .' receipt.pdf',
  379.                 'pdf' => $pdf,
  380.             ],
  381.             [
  382.                 'path' => '',
  383.                 'filename' => $filmProject->getTitle() .' report.pdf',
  384.                 'pdf' => $projectPdf,
  385.             ]
  386.         ];
  387.         $this->mailService->sendFilmProjectEmail(Constant::MAIL_FILM_PAYMENT_RECEIVED$filmProject$attachmentPath);
  388.     }
  389.     public function sendApprovedEmail(FilmProject $filmProject)
  390.     {
  391.         if (!$filmProject->getResubmitCount()) {
  392.             $this->mailService->sendFilmProjectEmail(Constant::MAIL_FILM_APPROVED$filmProject);
  393.         } else {
  394.             $this->mailService->sendFilmProjectEmail('MAIL_FILM_RESUBMIT_APPROVED'$filmProject);
  395.         }
  396.         
  397.         $this->sendMemberInvitationEmail($filmProject);
  398.     }
  399.     public function sendMemberInvitationEmail(FilmProject $filmProject)
  400.     {
  401.         $filmProjectTeam = [];
  402.         $filmAdmin $filmProject->getFilmProjectAdmin();
  403.         $filmProducer $filmProject->getFilmProjectProducer();
  404.         $filmDirector $filmProject->getFilmProjectDirector();
  405.         if (!$filmAdmin->isIsSent()) {
  406.             array_push($filmProjectTeam$filmAdmin);
  407.             $filmAdmin->approveSentEmail();
  408.             $this->em->persist($filmAdmin);
  409.         }
  410.         if (!$filmProducer->isIsSent()) {
  411.             array_push($filmProjectTeam$filmProducer);
  412.             $filmProducer->approveSentEmail();
  413.             $this->em->persist($filmProducer);
  414.         }
  415.         
  416.         if (!$filmDirector->isIsSent()) {
  417.             array_push($filmProjectTeam$filmDirector);
  418.             $filmDirector->approveSentEmail();
  419.             $this->em->persist($filmDirector);
  420.         }
  421.         
  422.         foreach($filmProject->getFilmProjectMembers() as $filmProjectMember) {
  423.             if (!$filmProjectMember->isIsSent()) {
  424.                 array_push($filmProjectTeam$filmProjectMember);
  425.                 $filmProjectMember->approveSentEmail();
  426.                 $this->em->persist($filmProjectMember);
  427.             }
  428.         }
  429.         // Check if user exists as filmmaker or donor
  430.         $isSentEmails = [];
  431.         $owner $filmProject->getOwner();
  432.         foreach ($filmProjectTeam as $member) {
  433.             if (!in_array($member->getEmail(), $isSentEmails)) {
  434.                 if ($member->getEmail() != $owner->getEmail()) {
  435.                     $status Constant::MAIL_FILM_MEMBER_STATUS;
  436.                     $user $this->userRepository->findOneBy(['email' => $member->getEmail()]);
  437.                     
  438.                     if($user) {
  439.                         // if ($user->isFilmmaker()) {
  440.                             $status Constant::MAIL_FILMMAKER_FILM_MEMBER_STATUS;
  441.                         // }
  442.                     }
  443.                     $this->mailService->sendFilmMemberEmail($status$filmProject$member);
  444.                     array_push($isSentEmails$member->getEmail());
  445.                 }
  446.             }
  447.         }
  448.         $this->em->flush();
  449.     }
  450.     
  451.     /**
  452.      * Get default film application product
  453.      *
  454.      * @return Product|null
  455.      */
  456.     public function getDefaultProduct(): ?Product
  457.     {
  458.         return $this->settingService->getDefaultFilmApplicationProduct();
  459.     }
  460.     protected function changePaymentObjectToPaid(PaymentDetails $paymentDetails
  461.     {
  462.         $paymentDetails->setPaid();
  463.         $this->em->persist($paymentDetails);
  464.         $this->em->flush();
  465.     }
  466.     protected function updateOrderDetails($orderDetails)
  467.     {
  468.         $orderDetails->setModifiedAt(new \DateTime('now'));
  469.         $this->em->persist($orderDetails);
  470.         $this->em->flush();
  471.     }
  472.     public function createOriginalCopy($entityInstance)
  473.     {
  474.         $filmProjectConverter = new FilmProjectObjectConverter();
  475.         $filmProjectOriginalCopy $entityInstance->getfilmprojectOriginal();
  476.         
  477.         if (empty($filmProjectOriginalCopy)) {
  478.             $filmProjectArr $filmProjectConverter->serializeFilmProjectDocument($entityInstance);
  479.             $filmProjectOriginalCopy = (new FilmProjectOriginal())
  480.                 ->setFilmProject($entityInstance)
  481.                 ->setData($filmProjectArr);
  482.             ;
  483.             $this->em->persist($filmProjectOriginalCopy);
  484.             $this->em->flush();
  485.         }
  486.     }
  487.     /**
  488.      * Publish project on Wordpress
  489.      *
  490.      * @param FilmProject $filmProject
  491.      * @return void
  492.      */
  493.     public function publishProject(FilmProject $filmProject)
  494.     {
  495.         $this->wpService->setProjectStatus($filmProjectConstant::WP_STATUS_PUBLISH);
  496.         $filmProject->setWordpressStatus(Constant::WP_STATUS_PUBLISH);
  497.         $this->em->persist($filmProject);
  498.         $this->em->flush();
  499.     }
  500.     /**
  501.      * Unpublish project on Wordpress
  502.      *
  503.      * @param FilmProject $filmProject
  504.      * @return void
  505.      */
  506.     public function unpublishProject(FilmProject $filmProject)
  507.     {
  508.         $this->wpService->setProjectStatus($filmProjectConstant::WP_STATUS_DRAFT);
  509.         $filmProject->setWordpressStatus(Constant::WP_STATUS_DRAFT);
  510.         $this->em->persist($filmProject);
  511.         $this->em->flush();
  512.     }
  513.     /**
  514.      * Archive project on Wordpress
  515.      *
  516.      * @param FilmProject $filmProject
  517.      * @return void
  518.      */
  519.     public function archiveProject(FilmProject $filmProject)
  520.     {
  521.         $this->wpService->deleteProject($filmProject);
  522.         $filmProject->setWordpressStatus(Constant::WP_STATUS_ARCHIVED_ALT);
  523.         $this->em->persist($filmProject);
  524.         $this->em->flush();
  525.     }
  526.     public function makePrivateProject(FilmProject $filmProjectstring $password)
  527.     {
  528.         $this->wpService->setProjectPrivate($filmProject$password);
  529.         $filmProject->setWordpressStatus(Constant::WP_STATUS_PROTECTED);
  530.         $filmProject->setWordpressPassword($password);
  531.         $this->em->persist($filmProject);
  532.         $this->em->flush();
  533.     }
  534.     public function makeHiddenProject(FilmProject $filmProject)
  535.     {
  536.         $this->wpService->setProjectHidden($filmProject);
  537.         $filmProject->setWordpressStatus(Constant::WP_STATUS_PRIVATE);
  538.         $this->em->persist($filmProject);
  539.         $this->em->flush();
  540.     }
  541.     public function createUserProject(FilmProject $filmProject)
  542.     {
  543.         $administrator $filmProject->getFilmProjectAdmin();
  544.         $producer $filmProject->getFilmProjectProducer();
  545.         $director $filmProject->getFilmProjectDirector();
  546.         $filmProjectMembers $filmProject->getFilmProjectMembers()->toArray();
  547.         $projectMembers = [$administrator$producer$director];
  548.         $projectMembers array_merge($projectMembers$filmProjectMembers);
  549.         foreach ($projectMembers as $projectMember) {
  550.             $wordpressId $projectMember->getWordpressId();
  551.             if (empty($wordpressId)) {
  552.                 // Start the user creation procedure
  553.                 $user $this->userRepository->findOneBy(['email' => $projectMember->getEmail()]);
  554.                 if (empty($user)) {
  555.                     $users $this->filmProjectMemberRepository->findBy(['email' => $projectMember->getEmail()]);
  556.                     if (!empty($users)) {
  557.                         
  558.                     }
  559.                 } else {
  560.                     $userInformation $user->getUserInformation(); // Main User will always have wordpress ID attached
  561.                     $wordpressId $userInformation->getWordpressId();
  562.                 }
  563.             }
  564.             $projectMember->setWordpressId($wordpressId);
  565.             $this->em->persist($projectMember);
  566.         }
  567.         
  568.         $this->em->flush();
  569.     }
  570.     /**
  571.      * hide donation box
  572.      *
  573.      * @param FilmProject $filmProject
  574.      * @return void
  575.      */
  576.     public function hideDonationBox(FilmProject $filmProject)
  577.     {
  578.         $filmProject->setIsHideDonationBox(true);
  579.         $this->wpService->setDonationBoxStatus($filmProject);
  580.         $this->em->persist($filmProject);
  581.         $this->em->flush();
  582.     }
  583.     /**
  584.      * Show donation box
  585.      *
  586.      * @param FilmProject $filmProject
  587.      * @return void
  588.      */
  589.     public function showDonationBox(FilmProject $filmProject)
  590.     {
  591.         $filmProject->setIsHideDonationBox(false);
  592.         $this->wpService->setDonationBoxStatus($filmProject);
  593.         $this->em->persist($filmProject);
  594.         $this->em->flush();
  595.     }
  596.     /**
  597.      * generate film project sponsors from partner name comma separated text
  598.      *
  599.      * @param FilmProject $filmProject
  600.      * @return void
  601.      */
  602.     public function generateSponsorsFromText(FilmProject $filmProject)
  603.     {
  604.         $filmProjectStoryImpact $filmProject->getFilmProjectStoryImpact();
  605.         $filmImpactPartnerString $filmProjectStoryImpact->getPartnerName();
  606.         if ($filmImpactPartnerString) {
  607.             $filmImpactPartnerArr explode(','$filmImpactPartnerString);
  608.             foreach ($filmImpactPartnerArr as $item) {
  609.                 $impactPartner = (new FilmProjectSponsor())
  610.                     ->setName($item)
  611.                 ;
  612.                 $filmProject->addFilmProjectSponsor($impactPartner);
  613.             }
  614.         }
  615.         $this->em->persist($filmProject);
  616.         $this->em->flush();
  617.     }
  618.     /**
  619.      * Generate text from sponsors
  620.      *
  621.      * @param FilmProject $filmProject
  622.      * @return void
  623.      */
  624.     public function generateTextFromSponsors(FilmProject $filmProject)
  625.     {
  626.         $filmProjectSponsors $filmProject->getFilmProjectSponsors();
  627.         $textArr = [];
  628.         if ($filmProjectSponsors) {
  629.             foreach($filmProjectSponsors as $filmProjectSponsor) {
  630.                 $partnerName $filmProjectSponsor->getName();
  631.                 array_push($textArr$partnerName);
  632.             }
  633.         }
  634.         $filmProjectStoryImpact $filmProject->getFilmProjectStoryImpact();
  635.         $filmProjectStoryImpact->setPartnerName(implode(', '$textArr));
  636.     }
  637.     public function checkIsProjectImage(FilmProject $filmProject)
  638.     {
  639.         $filmProjectDetails $filmProject->getFilmProjectDetails();
  640.         $heroImage $filmProjectDetails->getProjectHeroImage();
  641.         if (empty($heroImage) || $heroImage == '') return false;
  642.         return true;
  643.     }
  644.     public function checkIsProjectImageName(FilmProject $filmProject)
  645.     {
  646.         $filmProjectDetails $filmProject->getFilmProjectDetails();
  647.         $heroImage $filmProjectDetails->getProjectHeroImage();
  648.         if (strlen($heroImage) > 50) {
  649.             return false;
  650.         }
  651.         return true;
  652.     }
  653.     public function setExistingActiveMembers(FilmProject $filmProject
  654.     {
  655.         $filmProjectMembers $filmProject->getFilmProjectMembers(); // only newly added members
  656.         
  657.         foreach ($filmProjectMembers as $member) {
  658.             if (!$member->getEmail() || $member->isIsActive()) {
  659.                 continue;
  660.             }
  661.             $currentMembers $this->filmProjectMemberRepository->findMemberByEmailAndProject($member->getEmail(), $filmProject->getId());
  662.             foreach($currentMembers as $currentMember) {
  663.                 if (($currentMember->getEmail() == $member->getEmail()) && $currentMember->isIsActive()) { // if email same and already an active member
  664.                     $member->setIsActive(true);
  665.                     $member->setIsSent(true);
  666.                     // Finally, added this member directly to Wordpress
  667.                     $user $this->userRepository->findOneBy(['email' => $member->getEmail()]);
  668.                     if ($user) {
  669.                         $userInformation $user->getUserInformation(); // Main User will always have wordpress ID attached
  670.                         $wordpressId $userInformation->getWordpressId();
  671.                         $member->setWordpressId($wordpressId);
  672.                         $this->em->persist($member);
  673.                         $this->em->flush();
  674.                         $this->wpService->addMemberFromProject($member$user);
  675.                     }
  676.                     continue;
  677.                 }
  678.             }
  679.         }
  680.     }
  681.     public function resetProjectCrewMembers(FilmProject $filmProject)
  682.     {
  683.         $this->resetProjectAdmins($filmProject);
  684.         $this->resetWordpressIdCrewMembers($filmProject);
  685.         $this->wpService->resetCrewMembers($filmProject);
  686.     }
  687.     public function resetProjectAdmins(FilmProject $filmProject
  688.     {
  689.         $filmAdmin $filmProject->getFilmProjectAdmin();
  690.         $filmProducer $filmProject->getFilmProjectProducer();
  691.         $filmDirector $filmProject->getFilmProjectDirector();
  692.         $filmProjectAdmins = [$filmAdmin$filmProducer$filmDirector];
  693.         foreach ($filmProjectAdmins as $filmProjectAdmin) {
  694.             $user $this->userRepository->findOneBy(['email' => $filmProjectAdmin->getEmail()]);
  695.             if ($user) {
  696.                 $this->wpService->addMemberFromProject($filmProjectAdmin$user);
  697.             } else {
  698.                 $this->wpService->addNonMemberFromProject($filmProjectAdmin);
  699.             }
  700.         }
  701.     }
  702.     public function resetWordpressIdCrewMembers(FilmProject $filmProject)
  703.     {
  704.         $filmProjectMembers $filmProject->getFilmProjectMembers();
  705.         foreach($filmProjectMembers as $member) {
  706.             if (!$member->getWordpressId()) {
  707.                 continue;
  708.             }
  709.             $user $this->userRepository->findOneBy(['email' => $member->getEmail()]);
  710.             if ($user) {
  711.                 $userInformation $user->getUserInformation();
  712.                 $newWpId $userInformation->getWordpressId();
  713.                 
  714.                 $member->setWordpressId($newWpId);
  715.             } else {
  716.                 $member->setWordpressId(null);
  717.             }
  718.             $this->em->persist($member);
  719.         }
  720.         $this->em->flush();
  721.     }
  722. }