kernel = $kernel; } /** * @Route( * "{_locale}/doc/gen/generate/from/{template}/for/{entityClassName}/{entityId}", * name="chill_docgenerator_generate_from_template" * ) */ public function generateDocFromTemplateAction( TempUrlGeneratorInterface $tempUrlGenerator, DocGeneratorTemplate $template, string $entityClassName, int $entityId, Request $request ): Response { $getUrlGen = $tempUrlGenerator->generate( 'GET', $template->getFile()->getFilename()); $data = file_get_contents($getUrlGen->url); $iv = $template->getFile()->getIv(); // iv as an Array $ivGoodFormat = pack('C*', ...$iv); // iv as a String (ok for openssl_decrypt) $method = 'AES-256-CBC'; $key = $template->getFile()->getKeyInfos()['k']; $keyGoodFormat = Base64Url::decode($key); $dataDecrypted = openssl_decrypt($data, $method, $keyGoodFormat, 1, $ivGoodFormat); if ($dataDecrypted === FALSE) { throw new \Exception("Error during Decrypt ", 1); } $tmpfnameDeCrypted = tempnam($this->kernel->getCacheDir(), 'DECRYPT_DOC_TEMPLATE'); // plus ou moins if (!$handle = fopen($tmpfnameDeCrypted, 'a')) { echo "Cannot open file ($tmpfnameDeCrypted)"; exit; } if (fwrite($handle, $dataDecrypted) === FALSE) { echo "Cannot write to file ($tmpfnameDeCrypted)"; exit; } dump("Success, wrote ($dataDecrypted) to file ($tmpfnameDeCrypted)"); fclose($handle); $entity = $this->getDoctrine()->getRepository($entityClassName)->find($entityId); if ($template->getContext() === HouseholdMemberSelectionContext::class) { $context = new HouseholdMemberSelectionContext(); $datas = $context->getData($entity); } else { throw new \Exception('Not implemented', 1); } $templateProcessor = new TemplateProcessor($tmpfnameDeCrypted); foreach ($datas['setValues'] as $setValuesConf) { $templateProcessor->setValues($setValuesConf); } foreach ($datas['cloneRowAndSetValues'] as $cloneRowAndSetValues) { $templateProcessor->cloneRowAndSetValues($cloneRowAndSetValues[0], $cloneRowAndSetValues[1]); } $tmpfnameGenerated = tempnam($this->kernel->getCacheDir(), 'DOC_GENERATED'); $templateProcessor->saveAs($tmpfnameGenerated); $fileContent = fopen($tmpfnameGenerated, 'rb'); // the generated file content $genDocName = 'doc_' . sprintf('%010d', mt_rand()) . '.docx'; $getUrlGen = $tempUrlGenerator->generate( 'PUT', $genDocName ); unlink($tmpfnameDeCrypted); unlink($tmpfnameGenerated); $client = new Client(); try { $putResponse = $client->request('PUT', $getUrlGen->url, [ 'body' => $fileContent, ]); if ($putResponse->getStatusCode() === 201) { $em = $this->getDoctrine()->getManager(); $storedObject = new StoredObject(); $storedObject // currently, only docx is supported ->setType('application/vnd.openxmlformats-officedocument.wordprocessingml.document') ->setFilename($genDocName); $em->persist($storedObject); // Only for evaluation if ($entity instanceof AccompanyingPeriodWorkEvaluation) { $doc = new AccompanyingPeriodWorkEvaluationDocument(); $doc ->setStoredObject($storedObject) ->setTemplate($template); $entity->addDocument($doc); $em->persist($doc); } $em->flush(); return $this->redirectToRoute('chill_wopi_file_edit', [ 'fileId' => $storedObject->getUuid(), 'returnPath' => $request->query->get('returnPath', '/'), ]); } } catch (TransferException $e) { throw $e; } throw new Exception('Unable to generate document.'); } /** * @Route( * "{_locale}/doc/gen/templates/for/{entityClassName}", * name="chill_docgenerator_templates_for_entity_api" * ) */ public function listTemplateApiAction( string $entityClassName, DocGeneratorTemplateRepository $templateRepository ): Response { $entities = $templateRepository->findByEntity($entityClassName); $ret = []; foreach ($entities as $entity) { $ret[] = [ 'id' => $entity->getId(), 'name' => $entity->getName(), 'description' => $entity->getDescription(), ]; } return new JsonResponse(['results' => $ret]); } }