src/Repository/CourseCertificateRepository.php line 593

Open in your IDE?
  1. <?php
  2. namespace EADPlataforma\Repository;
  3. use EADPlataforma\Entity\Course;
  4. use EADPlataforma\Entity\CourseCertificate;
  5. use EADPlataforma\Entity\CourseTeam;
  6. use EADPlataforma\Entity\LessonModule;
  7. use EADPlataforma\Entity\Enrollment;
  8. use EADPlataforma\Entity\CourseCertificateTemplate;
  9. use EADPlataforma\Entity\User;
  10. use EADPlataforma\Entity\UserCustomField;
  11. use EADPlataforma\Entity\Trash;
  12. use EADPlataforma\Enum\CourseCertificateEnum;
  13. use EADPlataforma\Enum\CourseTeamEnum;
  14. use EADPlataforma\Enum\EnrollmentEnum;
  15. use EADPlataforma\Enum\ServicesEnum;
  16. use EADPlataforma\Enum\UserCustomFieldEnum;
  17. use EADPlataforma\Enum\LessonModuleEnum;
  18. use EADPlataforma\Enum\TrashEnum;
  19. use EADPlataforma\Enum\TagsMarketingEnum;
  20. use EADPlataforma\Enum\WebhookEnum;
  21. use EADPlataforma\Enum\NotificationEnum;
  22. use EADPlataforma\Enum\UserEnum;
  23. use \PDO;
  24. /**
  25.  * @method CourseCertificate|null find($id, $lockMode = null, $lockVersion = null)
  26.  * @method CourseCertificate|null findOneBy(array $criteria, array $orderBy = null)
  27.  * @method CourseCertificate[]    findAll()
  28.  * @method CourseCertificate[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  29.  */
  30. class CourseCertificateRepository extends AbstractRepository
  31. {
  32.     public function getEntityClass(){
  33.         return CourseCertificate::class;
  34.     }
  35.     public function getConnectionName(){
  36.         return "school";
  37.     }
  38.     public function findItems()
  39.     {
  40.         return $this->createQueryBuilder('cc')->getQuery()->getResult();
  41.     }
  42.     public function getCourseCertificateByCode(?string $code null, ?string $date null)
  43.     {
  44.         if(empty($code) || empty($date)){
  45.             return;
  46.         }
  47.         $courseCertificate $this->getCourseCertificateByNewCode($code$date);
  48.         if(!$courseCertificate){
  49.             $courseCertificate $this->getCourseCertificateByOldCode($code$date);
  50.         }
  51.         return $courseCertificate;
  52.     }
  53.     public function getCourseCertificateByOldCode(?string $code null, ?string $date null)
  54.     {
  55.         if(empty($code) || empty($date)){
  56.             return;
  57.         }
  58.         
  59.         $query $this->createQueryBuilder('cc');
  60.         $query->andWhere('cc.deleted = :deleted');
  61.         $query->andWhere('DATE(cc.dateEnd) = :date');
  62.         $codeInt = (int)$code;
  63.         if(empty($codeInt) || !ctype_digit($code)){
  64.             $query->setParameter('code'$code);
  65.             $query->andWhere('cc.code = :code');
  66.         }else{
  67.             $query->setParameter('code'$code);
  68.             $query->setParameter('codeInt', (int)$code);
  69.             $query->andWhere('(cc.code = :code OR cc.code = :codeInt)');
  70.         }
  71.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  72.         $isAdm $userPermissionUtil->canAccessAdm();
  73.         if($this->getUser() && !$isAdm){
  74.             $query->setParameter('user'$this->getUser()->getId());
  75.             $query->andWhere('cc.user = :user');
  76.         }
  77.         $query->setParameter('date'$date);
  78.         $query->setParameter('deleted'CourseCertificateEnum::ITEM_NO_DELETED);
  79.         $query->setMaxResults(1);
  80.         return $query->getQuery()->getOneOrNullResult();
  81.     }
  82.     public function getCourseCertificateByNewCode(?string $code null, ?string $date null)
  83.     {
  84.         if(empty($code) || empty($date)){
  85.             return;
  86.         }
  87.         
  88.         $query $this->createQueryBuilder('cc');
  89.         $query->andWhere('cc.deleted = :deleted');
  90.         $query->andWhere('DATE(cc.dateEnd) = :date');
  91.         $codeInt = (int)$code;
  92.         if(empty($codeInt) || !ctype_digit($code)){
  93.             $query->setParameter('code'$code);
  94.             $query->andWhere('cc.newCode = :code');
  95.         }else{
  96.             $query->setParameter('code'$code);
  97.             $query->setParameter('codeInt', (int)$code);
  98.             $query->andWhere('(cc.newCode = :code OR cc.newCode = :codeInt)');
  99.         }
  100.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  101.         $isAdm $userPermissionUtil->canAccessAdm();
  102.         if($this->getUser() && !$isAdm){
  103.             $query->setParameter('user'$this->getUser()->getId());
  104.             $query->andWhere('cc.user = :user');
  105.         }
  106.         $query->setParameter('date'$date);
  107.         $query->setParameter('deleted'CourseCertificateEnum::ITEM_NO_DELETED);
  108.         $query->setMaxResults(1);
  109.         return $query->getQuery()->getOneOrNullResult();
  110.     }
  111.     public function getCourseCertificateNumber(
  112.         ?string $dateStart null
  113.         ?string $dateEnd null
  114.     )
  115.     {
  116.         $query $this->createQueryBuilder('cc');
  117.         $query->select("COUNT(0) AS total");
  118.         $query->andWhere('cc.deleted = :deleted');
  119.         if(!is_null($dateStart) && !is_null($dateEnd)){
  120.             $query->andWhere('DATE(cc.dateIssue) BETWEEN :dateStart AND :dateEnd');
  121.             $query->setParameter('dateStart'$dateStart);
  122.             $query->setParameter('dateEnd'$dateEnd);
  123.         }
  124.         $query->setParameter('deleted'CourseCertificateEnum::ITEM_NO_DELETED);
  125.         $query->setMaxResults(1);
  126.         $result = (object)$query->getQuery()->getOneOrNullResult();
  127.         return $result->total;
  128.     }
  129.     public function getCourseCertificateMaxCode()
  130.     {
  131.         $sql "
  132.             SELECT 
  133.                 MAX(cc.id) AS max
  134.             FROM course_certificate AS cc
  135.         ";
  136.         $stmt $this->em->getConnection()->prepare($sql);
  137.         $stmt->execute();
  138.         $data $stmt->fetchAll(PDO::FETCH_CLASS);
  139.         if(!empty($data[0])){
  140.             return $data[0]->max;
  141.         }
  142.         return $this->count([]);
  143.     }
  144.     public function generateCertificateCode(?int $certificateNumber null)
  145.     {
  146.         $code null;
  147.         if($this->configuration->get('certificate_random_code') == CourseCertificateEnum::YES){
  148.             $stringUtil $this->generalService->getUtil('StringUtil');
  149.             $code $stringUtil->randomText(6);
  150.         }else{
  151.             if(empty($certificateNumber)){
  152.                 $certificateNumber $this->getCourseCertificateMaxCode() + 1;
  153.             }
  154.             $code str_pad($certificateNumber7'0'STR_PAD_LEFT);
  155.         }
  156.         return $code;
  157.     }
  158.     public function createCertificate(
  159.         Enrollment $enrollment,
  160.         CourseCertificateTemplate $courseCertificateTemplate,
  161.         float $finalGrade,
  162.         ?string $dateStart null,
  163.         ?string $dateEnd null
  164.     )
  165.     {
  166.         $course $enrollment->getCourse();
  167.         $user $enrollment->getUser();
  168.         $courseCertificate $this->findOneBy([
  169.             "course" => $course->getId(),
  170.             "user" => $user->getId(),
  171.         ]);
  172.         if($courseCertificate && !$courseCertificate->isDeleted()){
  173.             return (object)[
  174.                 "errors" => false,
  175.                 "courseCertificate" => $courseCertificate,
  176.             ];
  177.         }
  178.         $courseCertificate = new CourseCertificate();
  179.         if($finalGrade 10){
  180.             $finalGrade 10;
  181.         }else if($finalGrade 0){
  182.             $finalGrade 0;
  183.         }
  184.         if(empty($dateEnd)){
  185.             $dateEnd date('Y-m-d H:i:s');
  186.         }
  187.         if(empty($dateStart)){
  188.             $dateStart $enrollment->getDateStart();
  189.             
  190.             $minPeriod $course->getConfigPeriodMinConclusion();
  191.             if(!empty($minPeriod)){    
  192.                 $timeStart strtotime("{$dateStart} + {$minPeriod} days ");
  193.                 $timeEnd strtotime($dateEnd);
  194.     
  195.                 if($timeStart $timeEnd){
  196.                     $dateStart date(
  197.                         'Y-m-d H:i:s'
  198.                         strtotime("{$dateEnd} - {$minPeriod} days ")
  199.                     );
  200.                 }
  201.             }
  202.         }
  203.         $dateExpired null;
  204.         if(!empty($course->getCertificatePeriod())){
  205.             $dateExpired date("Y-m-d"strtotime("{$dateEnd} + {$course->getCertificatePeriod()} days"));
  206.         }
  207.         $courseCertificate->setNewCode($this->generateCertificateCode());
  208.         $courseCertificate->setFinalAverage($finalGrade);
  209.         $courseCertificate->setDateStart($dateStart);
  210.         $courseCertificate->setDateEnd($dateEnd);
  211.         $courseCertificate->setWorkload($course->getWorkload());
  212.         $courseCertificate->setUserName($user->getName());
  213.         $courseCertificate->setUserEmail($user->getEmail());
  214.         $courseCertificate->setUserDocument($user->getDocument());
  215.         $courseCertificate->setDateExpired($dateExpired);
  216.         $frontJson null;
  217.         $backJson null;
  218.         
  219.         if($courseCertificateTemplate)
  220.         {
  221.             $courseCertificate->setCourseCertificateTemplate($courseCertificateTemplate);
  222.             $frontJson $courseCertificateTemplate->getFrontDefaultJson();
  223.             $backJson $courseCertificateTemplate->getBackDefaultJson();
  224.         }else{
  225.             $courseCertificate->setCourseCertificateTemplate(
  226.                 $course->getCourseCertificateTemplate()
  227.             );
  228.             $frontJson =  $course->getCourseCertificateTemplate()->getFrontDefaultJson();
  229.             $backJson =  $course->getCourseCertificateTemplate()->getBackDefaultJson();
  230.         }
  231.         $stringUtil $this->generalService->getUtil('StringUtil');
  232.         $frontJson $stringUtil->characterCorrector($frontJson);
  233.         $backJson $stringUtil->characterCorrector($backJson);
  234.         $courseCertificate->setFrontJson($frontJson);
  235.         $courseCertificate->setBackJson($backJson);
  236.         $courseCertificate->setCourse($course);
  237.         $courseCertificate->setUser($user);
  238.         $entityUtil $this->generalService->getUtil('EntityUtil');
  239.         $errors $entityUtil->setEntity($courseCertificate)->validateEntity();
  240.         if($errors){
  241.             return (object)[
  242.                 "errors" => $errors,
  243.                 "courseCertificate" => null,
  244.             ];
  245.         }
  246.         $this->em->persist($courseCertificate);
  247.         $this->em->flush();
  248.         $this->processCertificate($courseCertificatetrue);
  249.         
  250.         return (object)[
  251.             "errors" => false,
  252.             "courseCertificate" => $courseCertificate,
  253.         ];
  254.     }
  255.     public function processCertificate(
  256.         CourseCertificate $courseCertificate
  257.         ?bool $sendEmail false
  258.     )
  259.     {
  260.         $course $courseCertificate->getCourse();
  261.         $userFrom $course->getUser();
  262.         $userTo $courseCertificate->getUser();
  263.         
  264.         $marketingService $this->generalService->getService('Marketing\\MarketingService');
  265.         $marketingService->setTag(TagsMarketingEnum::TAG_ISSUE_CERTIFICATE);
  266.         $marketingService->setTextComplement($course->getTitle());
  267.         $marketingService->setUser($userTo);
  268.         $marketingService->send();
  269.         $notificationService $this->generalService->getService('NotificationService');
  270.         $notificationService->create(
  271.             $userFrom,
  272.             $userTo,
  273.             NotificationEnum::ORIGIN_COURSE_CERTIFICATE_ISSUE,
  274.             $courseCertificate->getId()
  275.         );
  276.         $code $courseCertificate->getNewCode() ?? $courseCertificate->getCode();
  277.         if($sendEmail){
  278.             $client $this->configuration->getClient();
  279.             $emailService $this->generalService->getService('EmailService');
  280.             
  281.             if($emailService->checkUserToSend($userTo)){
  282.                 $emailService->setToEmail($userTo->getEmail());
  283.                 $emailService->setToName($userTo->getName());
  284.                 $subText $this->configuration->getLanguage('certificate.subject''email');
  285.                 $subject "{$subText} - {$client->getBrand()}";
  286.                 $emailService->setSubject($subject);
  287.                 $domain "https://{$client->getDomainPrimary()}";
  288.                 $dateEnd $courseCertificate->getDateEnd('Y-m-d');
  289.                 
  290.                 $emailService->setData([
  291.                     "userName" => $userTo->getName(),
  292.                     "courseTitle" => $course->getTitle(),
  293.                     "certificateCode" => $code,
  294.                     "btnLink" => "{$domain}/certificate/view/{$code}/{$dateEnd}",
  295.                 ]);
  296.                 $emailService->setTemplateBody("certificate");
  297.                 $emailService->send();
  298.             }
  299.         }
  300.         $enrollmentRepository $this->em->getRepository(Enrollment::class);
  301.         $enrollment $enrollmentRepository->findOneBy([
  302.             "user" => $userTo,
  303.             "course" => $course,
  304.         ]);
  305.         $userWebhook $this->em->getRepository(User::class)->getToWebhook($userTo);
  306.         $dataObj = (object)[
  307.             "user" => $userWebhook,
  308.             "course" => (object)[
  309.                 "id" => (string)$course->getId(),
  310.                 "name" => $course->getTitle(),
  311.                 "certificate_average" => $course->getCertificateAverage(),
  312.             ],
  313.             "certificate" => (object)[
  314.                 "id" => (string)$courseCertificate->getId(),
  315.                 "code" => $code,
  316.                 "final_average" => $courseCertificate->getFinalAverage(),
  317.                 "workload" => $courseCertificate->getWorkload(),
  318.                 "dates" => (object)[
  319.                     "start" => $courseCertificate->getDateStart(),
  320.                     "end" => $courseCertificate->getDateEnd(),
  321.                 ],
  322.             ],
  323.         ];
  324.         if($enrollment){
  325.             $dataObj->enrollment $enrollment->toWebhook();
  326.         }
  327.         
  328.         $webhookService $this->generalService->getService('WebhookService');
  329.         $webhookService->addItemList(WebhookEnum::CERTIFICATE$dataObj);
  330.     }
  331.     public function generateCertificate(
  332.         CourseCertificate $courseCertificate
  333.         bool $download false
  334.     ){
  335.        // $courseCertificateTemplate = $courseCertificate->getCourseCertificateTemplate();
  336.         
  337.         $dataNames = [
  338.             "aluno_nome",
  339.             "aluno_email",
  340.             "aluno_cpf",
  341.             "aluno_telefone",
  342.             "aluno_data_nascimento",
  343.             "aluno_cidade",
  344.             "aluno_uf",
  345.             "aluno_frequencia",
  346.             "aluno_progresso",
  347.             "cod",
  348.             "certificado_nota",
  349.             "certificado_dia_inicio",
  350.             "certificado_dia_fim",
  351.             "certificado_data_validade",
  352.             "matricula_dia_cadastro",
  353.             "certificado_carga_horaria",
  354.             "qrcode_frente",
  355.             "qrcode_verso",
  356.             "curso_titulo",
  357.             "curso_professor",
  358.             "curso_modulos",
  359.             "curso_modulos_carga_horaria",
  360.             "nome_responsavel",
  361.             "cargo",
  362.             "atribuicao",
  363.             "ead_nome",
  364.             "ead_cnpj",
  365.             "ead_dominio",
  366.         ];
  367.         if($this->configuration->checkModuleIsAbleOnPlan('customFormModule')){
  368.             $userCustomFieldRepository $this->em->getRepository(UserCustomField::class);
  369.             $customFields $userCustomFieldRepository->getUserCustomFieldsToShow();
  370.             foreach ($customFields as $key => $field) {
  371.                 $dataNames[] = "campo_{$field->getId()}";
  372.             }
  373.         }
  374.         $frontJson =  $courseCertificate->getFrontJson();
  375.         $backJson $courseCertificate->getBackJson();
  376.         foreach ($dataNames as $key => $value) {
  377.             $frontJson str_replace("[[ {$value} ]]""{{ {$value}|raw }}"$frontJson);
  378.             $backJson  str_replace("[[ {$value} ]]""{{ {$value}|raw }}"$backJson);
  379.             $frontJson str_replace("[[{$value}]]""{{ {$value}|raw }}"$frontJson);
  380.             $backJson  str_replace("[[{$value}]]""{{ {$value}|raw }}"$backJson);
  381.         }
  382.         $frontObj json_decode($frontJson);
  383.         $backObj json_decode($backJson);
  384.         if(!empty($frontObj->objects)){
  385.             $auxObj = [];
  386.             foreach ($frontObj->objects as $key => $objCanvas) {
  387.                 if(!empty($objCanvas)){
  388.                     $obj $this->prepareCanvasObj($objCanvas);
  389.                     if(!empty($obj)){
  390.                         $auxObj[] = $obj;
  391.                     }
  392.                 }
  393.             }
  394.             $frontObj->objects $auxObj;
  395.         }
  396.         if(!empty($backObj->objects)){
  397.             $auxObj = [];
  398.             foreach ($backObj->objects as $key => $objCanvas) {
  399.                 if(!empty($objCanvas)){
  400.                     $obj $this->prepareCanvasObj($objCanvas);
  401.                     if(!empty($obj)){
  402.                         $auxObj[] = $obj;
  403.                     }
  404.                 }
  405.             }
  406.             $backObj->objects $auxObj;
  407.         }
  408.         $frontImage null;
  409.         if(!empty($frontObj->backgroundImage)){
  410.             $frontImage $this->prepareCanvasImage($frontObj->backgroundImage->src);
  411.         }
  412.         $backImage null;
  413.         if(!empty($backObj->backgroundImage)){
  414.             $backImage $this->prepareCanvasImage($backObj->backgroundImage->src);
  415.         }
  416.         
  417.         $data = [
  418.             "frontColor" => (!empty($frontObj->background) ? $frontObj->background null),
  419.             "backColor" => (!empty($backObj->background) ? $backObj->background null),
  420.             "frontObjects" => (!empty($frontObj->objects) ? $frontObj->objects : []),
  421.             "backObjects" => (!empty($backObj->objects) ? $backObj->objects : []),
  422.             "frontImage" => $frontImage,
  423.             "backImage" => $backImage,
  424.         ];
  425.         $dataInfo $this->prepareDataToPdf($courseCertificate);
  426.         $data array_merge($data$dataInfo);
  427.         $pdfService $this->generalService->getService('PdfService');
  428.         $pdfService->setFileName($courseCertificate->getNewCode() ?? $courseCertificate->getCode());
  429.         $pdfService->setTemplateBody("certificate");
  430.         $pdfService->setData($data);
  431.         return $pdfService->generate(true$download);
  432.     }
  433.     public function prepareDataToPdf(CourseCertificate $courseCertificate)
  434.     {
  435.         $user $courseCertificate->getUser();
  436.         $course $courseCertificate->getCourse();
  437.         $cityName = ( $user->getCity() ? $user->getCity()->getName() : '' );
  438.         $stateUf = ( $user->getCity() ? $user->getCity()->getState()->getName() : '' );
  439.         $client $this->configuration->getClient();
  440.         $schoolName $client->getBrand();
  441.         $schoolDocument $client->getDocument();
  442.         $schoolDomain $this->configuration->getActiveDomain();
  443.         $filter = [
  444.             "course" => $course
  445.             "deleted" => CourseCertificateEnum::ITEM_NO_DELETED,
  446.             "status" => LessonModuleEnum::PUBLISHED 
  447.         ];
  448.         $lessonModules $this->em->getRepository(LessonModule::class)->findBy(
  449.             $filter, [ "order" => "ASC" ]
  450.         );
  451.         
  452.         $lessonModulesText '';
  453.         $lessonModulesWorkload '';
  454.         foreach ($lessonModules as $key => $lessonModule) {
  455.             $lessonModulesText .= "{$lessonModule->getOrder()}{$lessonModule->getTitle()}</br>";
  456.             $lessonModulesWorkload .= "{$lessonModule->getOrder()}{$lessonModule->getWorkload()}</br>";
  457.         }  
  458.         $dateTimeUtil $this->generalService->getUtil('DateTimeUtil');
  459.         $configuration $this->generalService->getService('ConfigurationService');
  460.         $urlCertView $this->generalService->generateUrl('certificatePage', [ 
  461.             "code" => $courseCertificate->getNewCode() ?? $courseCertificate->getCode(),
  462.             "date" => $courseCertificate->getDateEnd('Y-m-d')
  463.         ]);
  464.         $urlView "https://{$schoolDomain}{$urlCertView}";
  465.         $qrCodeFrente "https://api.ead.dev/qrcode?data={$urlView}&w=130&h=130";
  466.         $qrCodeVerso "https://api.ead.dev/qrcode?data={$urlView}&w=300&h=300";
  467.         $enrollment $this->em->getRepository(Enrollment::class)->findOneBy([
  468.             "deleted" => EnrollmentEnum::ITEM_NO_DELETED,
  469.             "user" => $user->getId(),
  470.             "course" => $course->getId(),
  471.         ]);
  472.         $data = [
  473.             "aluno_nome" => mb_strtoupper($courseCertificate->getUserName()),
  474.             "aluno_email" => $courseCertificate->getUserEmail(),
  475.             "aluno_cpf" => $courseCertificate->getUserDocument(),
  476.             "aluno_telefone" => $user->getPhone(),
  477.             "aluno_data_nascimento" => $user->getBirthdate('d/m/Y'),
  478.             "aluno_cidade" => $cityName,
  479.             "aluno_uf" => $stateUf,
  480.             "aluno_frequencia" => '100%',
  481.             "aluno_progresso" => '100%',
  482.             "cod" => $courseCertificate->getNewCode() ?? $courseCertificate->getCode(),
  483.             "certificado_nota" => $courseCertificate->getFinalAverage(),
  484.             "certificado_dia_inicio" => $courseCertificate->getDateStart('d/m/Y'),
  485.             "certificado_dia_fim" => $courseCertificate->getDateEnd('d/m/Y'),
  486.             "certificado_data_validade" => $courseCertificate->getDateExpired('d/m/Y'),
  487.             "matricula_dia_cadastro" => ($enrollment $enrollment->getDateRegister('d/m/Y') : ''),
  488.             "certificado_carga_horaria" => ($courseCertificate->getWorkload() ? $dateTimeUtil->workloadFormat(
  489.                 $courseCertificate->getWorkload(),
  490.                 true,
  491.                 $configuration->getLanguageModule('util')
  492.             ) : ''),
  493.             "qrcode_frente" => $qrCodeFrente,
  494.             "qrcode_verso" => $qrCodeVerso,
  495.             "curso_titulo" => $course->getTitle(),
  496.             "curso_professor" => $course->getUser()->getName(),
  497.             "curso_modulos" => $lessonModulesText,
  498.             "curso_modulos_carga_horaria" => $lessonModulesWorkload,
  499.             "nome_responsavel" => $course->getUser()->getName(),
  500.             "cargo" => $course->getUser()->getUserProfile()->getName(),
  501.             "atribuicao" => $schoolName,
  502.             "ead_nome" => $schoolName,
  503.             "ead_cnpj" => $schoolDocument,
  504.             "ead_dominio" => $schoolDomain,
  505.         ];
  506.         if($this->configuration->checkModuleIsAbleOnPlan('customFormModule')){
  507.             $userCustomFieldRepository $this->em->getRepository(UserCustomField::class);
  508.             $customFields $userCustomFieldRepository->getUserCustomFieldsToShow();
  509.             foreach ($customFields as $key => $field) {
  510.                 $data["campo_{$field->getId()}"] = "";
  511.             }
  512.             $userCustomField $user->getCustomField();
  513.             if(!empty($userCustomField)){
  514.                 $userCustomField json_decode($userCustomField);
  515.                 foreach ($userCustomField as $key => $field) {
  516.                     if(!empty($field->fieldId)){
  517.                         if($field->type != UserCustomFieldEnum::FIELD_MULTIPLE){
  518.                             if($field->type != UserCustomFieldEnum::FIELD_FILE){
  519.                                 if(isset($data["campo_{$field->fieldId}"])){
  520.                                     $data["campo_{$field->fieldId}"] = null;
  521.                                     if(isset($field->value)){
  522.                                         $data["campo_{$field->fieldId}"] = $field->value;
  523.                                     }
  524.                                 }
  525.                             }
  526.                         }
  527.                     }
  528.                 }
  529.             }
  530.         }
  531.         return $data;
  532.     }
  533.     public function prepareCanvasObj($obj)
  534.     {
  535.         $obj = (object)$obj;
  536.         if(empty($obj)){
  537.             return;
  538.         }
  539.         
  540.         if(isset($obj->type)){
  541.             if($obj->type == 'textbox'){
  542.                 if(strpos($obj->text'qrcode_frente')){
  543.                     $obj->src $obj->text;
  544.                     $obj->type "image";
  545.                     $obj->width 100;
  546.                     $obj->height 100;
  547.                 }else if(strpos($obj->text'qrcode_verso')){
  548.                     $obj->src $obj->text;
  549.                     $obj->type "image";
  550.                     $obj->width 200;
  551.                     $obj->height 200;
  552.                 }
  553.                 $obj->text htmlspecialchars_decode($obj->text);
  554.                 $obj->text str_replace("\n""</br>"$obj->text);
  555.             }else if($obj->type == 'image'){
  556.                 $obj->src $this->prepareCanvasImage($obj->src);
  557.             }
  558.         }else{
  559.             $obj->type 'textbox';
  560.         }
  561.         $obj->top = (isset($obj->top) ? str_replace(',''.'$obj->top) : 0);
  562.         $obj->left = (isset($obj->left) ? str_replace(',''.'$obj->left) : 0);
  563.         $obj->width = (isset($obj->width) ? str_replace(',''.'$obj->width) : 0);
  564.         $obj->height = (isset($obj->height) ? str_replace(',''.'$obj->height) : 0);
  565.         $obj->scaleX = (isset($obj->scaleX) ? str_replace(',''.'$obj->scaleX) : 0);
  566.         $obj->scaleY = (isset($obj->scaleY) ? str_replace(',''.'$obj->scaleY) : 0);
  567.         if(isset($obj->fontSize)){
  568.             $obj->fontSize str_replace(',''.'$obj->fontSize);
  569.             $obj->fontSize = (int)$obj->fontSize $obj->scaleY;
  570.         }else{
  571.             $obj->fontSize 12 $obj->scaleY;
  572.         }
  573.         $obj->width $obj->width $obj->scaleX;
  574.         $obj->height $obj->height $obj->scaleY;
  575.         if(empty($obj->flipX)){
  576.             $obj->flipX 1;
  577.         }else{
  578.             $obj->flipX = -1;
  579.         }
  580.         if(empty($obj->flipY)){
  581.             $obj->flipX 1;
  582.         }else{
  583.             $obj->flipY = -1;
  584.         }
  585.         return $obj;
  586.     }
  587.     public function prepareCanvasImage($image)
  588.     {
  589.         $info $this->generalService->getServiceAccess(ServicesEnum::AWS_S3);
  590.         $clientConnection $this->configuration->getClientConnection();
  591.         $serverUser $clientConnection->getServerUser();
  592.         $image explode('upload/'$image);
  593.         $image end($image);
  594.         $imageUrl "https:{$info->cdnLink}client/{$serverUser}/upload/{$image}";
  595.         return $imageUrl;
  596.     }
  597.     public function export(?int $courseId null, ?int $userId null
  598.                            $dateStart null$dateEnd null$isPermissionMiddle)
  599.     {
  600.         if(is_null($userId)){
  601.             $userId $this->getUser()->getId();
  602.         }
  603.         $query $this->createQueryBuilder('cc');
  604.         $query->innerJoin('EADPlataforma:User''u''WITH''u.id = cc.user');
  605.         $query->innerJoin('EADPlataforma:Course''c''WITH''c.id = cc.course');
  606.         $courseTeamClass CourseTeam::class;
  607.         if($isPermissionMiddle){
  608.             $subQuery "SELECT (cTeam.course) FROM $courseTeamClass cTeam WHERE cTeam.deleted = 0 AND cTeam.user = $userId";
  609.             $query->andWhere("c.id IN ($subQuery)");
  610.         } else {
  611.             
  612.         }
  613.         $query->andWhere('cc.deleted = :deleted');
  614.         $query->setParameter('deleted'CourseCertificateEnum::NO);
  615.         $query->andWhere('u.status != :userStatus');
  616.         $query->setParameter('userStatus'UserEnum::INACTIVE);
  617.         
  618.         if(!is_null($dateStart) && !is_null($dateEnd)){
  619.             $query->andWhere('DATE(cc.dateIssue) BETWEEN :dateStart AND :dateEnd');
  620.             $query->setParameter('dateStart'$dateStart);
  621.             $query->setParameter('dateEnd'$dateEnd);
  622.         }
  623.        
  624.         if(!empty($courseId)){
  625.             $query->andWhere('cc.course = :course')->setParameter('course'$courseId);
  626.         }
  627.         return $query->getQuery()->execute();
  628.     }
  629.     public function getResumeCourseCertificate($userId$offset 0$searchText null
  630.                                                ?string $categories null)
  631.     {
  632.         $query $this->createQueryBuilder('cc');
  633.         $query->innerJoin('EADPlataforma:Course''c''WITH''cc.course = c');
  634.         $query->andWhere('cc.user = :userId');
  635.         $query->andWhere('cc.deleted = :deleted');
  636.         
  637.         if(!empty($searchText)){
  638.             $query->andWhere('c.title LIKE :searchText OR cc.code LIKE :searchText');
  639.             $query->setParameter('searchText''%'.$searchText.'%');
  640.         }
  641.         if(!empty($categories)){
  642.             $query->andWhere('c.category IN (:categories) ');
  643.             $query->setParameter('categories'$categories);
  644.         }
  645.         $query->setParameter('userId'$userId);
  646.         $query->setParameter('deleted'CourseCertificateEnum::NO);
  647.         $query->setFirstResult($offset);
  648.         $query->setMaxResults(10);
  649.         $query->addOrderBy('cc.dateEnd''DESC');
  650.         $data $query->getQuery()->execute();
  651.         
  652.         return $data;
  653.     }
  654.     
  655.     public function getCountResumeCourseCertificate($userId$searchText null,
  656.                                                     ?string $categories null)
  657.     {
  658.         $query $this->createQueryBuilder('cc');
  659.         $query->select("count(cc.id) AS total");
  660.         $query->innerJoin('EADPlataforma:Course''c''WITH''cc.course = c');
  661.         $query->andWhere('cc.user = :userId');
  662.         $query->andWhere('cc.deleted = :deleted');
  663.         
  664.         if(!empty($searchText)){
  665.             $query->andWhere('c.title LIKE :searchText OR cc.code LIKE :searchText');
  666.             $query->setParameter('searchText''%'.$searchText.'%');
  667.         }
  668.         if(!empty($categories)){
  669.             $query->andWhere('c.category IN (:categories) ');
  670.             $query->setParameter('categories'$categories);
  671.         }
  672.         $query->setParameter('userId'$userId);
  673.         $query->setParameter('deleted'CourseCertificateEnum::NO);
  674.         $query->addOrderBy('cc.dateEnd''DESC');
  675.         $result = (object)$query->getQuery()->getOneOrNullResult();
  676.         
  677.         return $result->total;
  678.     }
  679.     public function restore(CourseCertificate $courseCertificate$typeItem)
  680.     {
  681.         $itemId $courseCertificate->getId();
  682.         $courseCertificate->setUserDelete($this->getUser());
  683.         $courseCertificate->setDateDelete(date('Y-m-d H:i:s'));
  684.         $courseCertificate->restore();
  685.         $this->em->getRepository(Trash::class)->deleteTrash($itemId$typeItem);
  686.     }
  687.     public function delete(CourseCertificate $courseCertificate$typeItem$permission$isTrash$isApi false)
  688.     {
  689.         $userPermissionUtil $this->generalService->getUtil('UserPermissionUtil');
  690.         if($isTrash == 1){
  691.             $permission $userPermissionUtil->getPermission("trash""delete");
  692.         }
  693.         
  694.         $isInTeam false;
  695.         $course $courseCertificate->getCourse();
  696.         if($this->getUser()){
  697.             $isInTeam $this->em->getRepository(CourseTeam::class)->userExistInCourseTeam(
  698.                 $course
  699.                 $this->getUser()
  700.             );
  701.         }
  702.         if($isInTeam || $userPermissionUtil->isHigh($permission)){
  703.             $courseCertificate->setUserDelete($this->getUser());
  704.             $courseCertificate->setDateDelete(date('Y-m-d H:i:s'));
  705.             $courseCertificate->individual();
  706.             if($courseCertificate->isOnTrash() || $courseCertificate->isDeleted() || $isApi){
  707.                 $courseCertificate->delete();
  708.                 $itemId $courseCertificate->getId();
  709.                 $this->em->getRepository(Trash::class)->deleteTrash($itemId$typeItem);
  710.             }
  711.             if(!$courseCertificate->isOnTrash() && !$courseCertificate->isDeleted()){
  712.                 $courseCertificate->trash();
  713.                 $this->em->getRepository(Trash::class)->insertTrash(
  714.                     $courseCertificate
  715.                     $typeItem,
  716.                     'COD: '.$courseCertificate->getNewCode().' - '.$courseCertificate->getUserName() ?? 
  717.                     $courseCertificate->getCode().' - '.$courseCertificate->getUserName()
  718.                 );
  719.             }
  720.         }
  721.         $this->em->flush();
  722.     }
  723.     public function restoreByUser($userId$deleted$typeDelete$userDelete$dateNow){
  724.         $sql "UPDATE EADPlataforma:CourseCertificate AS cc 
  725.                 SET cc.deleted = :deleted, cc.userDelete = :userDelete, 
  726.                     cc.dateDelete = :dateNow
  727.                 WHERE cc.deleted = (1 - :deleted)
  728.                 AND cc.typeDelete = :typeDelete
  729.                 AND cc.user = :userId";
  730.         $query $this->em->createQuery($sql);
  731.         $query->setParameter('userId'$userId);
  732.         $query->setParameter('deleted'$deleted);
  733.         $query->setParameter('typeDelete'$typeDelete);
  734.         $query->setParameter('userDelete'$userDelete);
  735.         $query->setParameter('dateNow'$dateNow);
  736.         $query->execute();
  737.         
  738.         return true;
  739.     }
  740.     public function deleteByUser($userId$deleted$typeDelete$userDelete$dateNow){
  741.         $sql "UPDATE EADPlataforma:CourseCertificate AS cc 
  742.                 SET cc.deleted = :deleted, cc.typeDelete = :typeDelete,
  743.                     cc.userDelete = :userDelete, cc.dateDelete = :dateNow
  744.                 WHERE cc.deleted = (:deleted - 1)
  745.                 AND cc.user = :userId";
  746.         $query $this->em->createQuery($sql);
  747.         $query->setParameter('userId'$userId);
  748.         $query->setParameter('deleted'$deleted);
  749.         $query->setParameter('typeDelete'$typeDelete);
  750.         $query->setParameter('userDelete'$userDelete);
  751.         $query->setParameter('dateNow'$dateNow);
  752.         $query->execute();
  753.         
  754.         return true;
  755.     }
  756.     public function deleteTrashCron()
  757.     {
  758.         $sql "UPDATE EADPlataforma:CourseCertificate AS cc SET cc.deleted = 2 
  759.                 WHERE cc.dateDelete <= :date AND cc.deleted = 1 ";
  760.         $query $this->em->createQuery($sql);
  761.         $query->setParameter('date'date('Y-m-d H:i:s'strtotime('-90 days')));
  762.         $query->execute();
  763.     }
  764.     public function updateTemplateOnCertificate(CourseCertificateTemplate $courseCertificateTemplate)
  765.     {
  766.         $sql "UPDATE EADPlataforma:CourseCertificate AS cc 
  767.                 SET cc.frontJson = :frontJson, cc.backJson = :backJson
  768.                 WHERE cc.deleted = :deleted AND cc.courseCertificateTemplate = :id";
  769.         $query $this->em->createQuery($sql);
  770.         $query->setParameter('frontJson'$courseCertificateTemplate->getFrontDefaultJson());
  771.         $query->setParameter('backJson'$courseCertificateTemplate->getBackDefaultJson());
  772.         $query->setParameter('deleted'CourseCertificateEnum::ITEM_NO_DELETED);
  773.         $query->setParameter('id'$courseCertificateTemplate->getId());
  774.         $query->execute();
  775.     }
  776.     public function setCourseCertificate(array $params)
  777.     {
  778.         if (!empty($params['id'])){
  779.             $courseCertificate $this->findOneBy(["id" => $params['id']]);
  780.         }
  781.         (isset($params['courseCertificateTemplate']) && $courseCertificate->setCourseCertificateTemplate($params['courseCertificateTemplate']));
  782.         (isset($params['course']) && $courseCertificate->setCourse($params['course']));
  783.         (isset($params['user']) && $courseCertificate->setUser($params['user']));
  784.         (isset($params['userName']) && $courseCertificate->setUserName($params['userName']));
  785.         (isset($params['userEmail']) && $courseCertificate->setUserEmail($params['userEmail']));
  786.         (isset($params['userDocument']) && $courseCertificate->setUserDocument($params['userDocument']));
  787.         (isset($params['frontJson']) && $courseCertificate->setFrontJson($params['frontJson']));
  788.         (isset($params['backJson']) && $courseCertificate->setBackJson($params['backJson']));
  789.         (isset($params['newCode']) && $courseCertificate->setNewCode($params['newCode']));
  790.         (isset($params['finalAverage']) && $courseCertificate->setFinalAverage($params['finalAverage']));
  791.         (isset($params['dateStart']) && $courseCertificate->setDateStart($params['dateStart']));
  792.         (isset($params['dateEnd']) && $courseCertificate->setDateEnd($params['dateEnd']));
  793.         (isset($params['dateExpired']) && $courseCertificate->setDateExpired($params['dateExpired']));
  794.         (isset($params['workload']) && $courseCertificate->setWorkload($params['workload']));
  795.         (isset($params['dateIssue']) && $courseCertificate->setDateIssue($params['dateIssue']));
  796.         return $courseCertificate;
  797.     }
  798.     public function setNewCourseCertificate(array $params)
  799.     {
  800.         $courseCertificate = new CourseCertificate();
  801.         (isset($params['courseCertificateTemplate']) && $courseCertificate->setCourseCertificateTemplate($params['courseCertificateTemplate']));
  802.         (isset($params['course']) && $courseCertificate->setCourse($params['course']));
  803.         (isset($params['user']) && $courseCertificate->setUser($params['user']));
  804.         (isset($params['userName']) && $courseCertificate->setUserName($params['userName']));
  805.         (isset($params['userEmail']) && $courseCertificate->setUserEmail($params['userEmail']));
  806.         (isset($params['userDocument']) && $courseCertificate->setUserDocument($params['userDocument']));
  807.         (isset($params['frontJson']) && $courseCertificate->setFrontJson($params['frontJson']));
  808.         (isset($params['backJson']) && $courseCertificate->setBackJson($params['backJson']));
  809.         (isset($params['newCode']) && $courseCertificate->setNewCode($params['newCode']));
  810.         (isset($params['finalAverage']) && $courseCertificate->setFinalAverage($params['finalAverage']));
  811.         (isset($params['dateStart']) && $courseCertificate->setDateStart($params['dateStart']));
  812.         (isset($params['dateEnd']) && $courseCertificate->setDateEnd($params['dateEnd']));
  813.         (isset($params['dateExpired']) && $courseCertificate->setDateExpired($params['dateExpired']));
  814.         (isset($params['workload']) && $courseCertificate->setWorkload($params['workload']));
  815.         (isset($params['dateIssue']) && $courseCertificate->setDateIssue($params['dateIssue']));
  816.         return $courseCertificate;
  817.     }
  818.     public function paginateCertificates(array $dataFilters)
  819.     {
  820.         $filter = [];
  821.         $userClass User::class;
  822.         $courseClass Course::class;
  823.         $courseTeamClass CourseTeam::class;
  824.         $filter["whereText"] = " cc.id > 0 ";
  825.         $columnNotUseInFilter = [
  826.             "(
  827.                 CASE 
  828.                     WHEN cc.newCode IS NOT NULL THEN cc.newCode
  829.                     ELSE cc.code
  830.                 END
  831.             ) AS code",
  832.         ];
  833.         $columns = [
  834.             "cc.id",
  835.             "cc.code AS oldCode",
  836.             "cc.newCode",
  837.             "u.name"
  838.             "u.email",
  839.             "c.title",
  840.             "DATE_FORMAT(cc.dateIssue, '%Y-%m-%d %H:%i:%s') AS dateIssue",
  841.             "DATE_FORMAT(cc.dateStart, '%Y-%m-%d %H:%i:%s') AS dateStart"
  842.             "DATE_FORMAT(cc.dateEnd, '%Y-%m-%d %H:%i:%s') AS dateEnd",
  843.             "DATE_FORMAT(cc.dateDelete, '%Y-%m-%d %H:%i:%s') AS dateDelete",
  844.             "ud.name AS userDelete"
  845.         ];
  846.         $joins = [
  847.             "{$userClass} AS u" => "u.id = cc.user AND u.deleted = 0",
  848.             "{$courseClass} AS c" => "c.id = cc.course",
  849.             "{$userClass} AS ud" => ["LEFT""ud.id = cc.userDelete"]
  850.         ];
  851.         if(!empty($dataFilters['courseId'])){
  852.             $filter["cc.course"] = $dataFilters['courseId'];
  853.         }
  854.         
  855.         if(!empty($dataFilters['userManager'])){
  856.             $filter["whereText"] .= 
  857.                 AND c.id IN (
  858.                     SELECT
  859.                         IDENTITY(ct.course)
  860.                     FROM {$courseTeamClass} AS ct 
  861.                     WHERE ct.deleted = 0 
  862.                     AND ct.user = '" $dataFilters['userManager'] . "'
  863.                 )
  864.             ";
  865.         }
  866.         if(!empty($dataFilters['dateStart']) && !empty($dataFilters['dateEnd'])){
  867.             $filter["whereText"] .= " AND DATE_FORMAT(cc.dateStart, '%Y-%m-%d') BETWEEN '" $dataFilters['dateStart'] . "' AND '" $dataFilters['dateEnd'] . "'";
  868.             
  869.         }
  870.         $order = [ "cc.id" => "DESC" ];
  871.         if(!empty($dataFilters['orderParam'])){
  872.             $order json_decode($dataFilters['orderParam'], true);
  873.         }
  874.         return $this->paginate(
  875.             "cc"
  876.             $dataFilters['searchText'], 
  877.             $columns
  878.             $joins
  879.             $filter
  880.             $order
  881.             $dataFilters['limit'], 
  882.             $dataFilters['offset'],
  883.             $dataFilters['filterDelete'],
  884.             false,
  885.             $columnNotUseInFilter
  886.         );
  887.     }
  888.     public function getCourseCertificateReturn($courseCertificateId)
  889.     {
  890.         $courseCertificate $this->findOneBy([
  891.             "id" => $courseCertificateId,
  892.             "deleted" => CourseCertificateEnum::ITEM_NO_DELETED
  893.         ]);
  894.         return empty($courseCertificate) ? false $courseCertificate->toReturn();
  895.     }
  896. }