full generation for accompanying period

This commit is contained in:
2021-12-01 15:43:34 +01:00
parent 9d0e1a82e7
commit 7719d2b073
14 changed files with 248 additions and 108 deletions

View File

@@ -13,25 +13,24 @@ namespace Chill\DocGeneratorBundle\Controller;
use Base64Url\Base64Url;
use ChampsLibres\AsyncUploaderBundle\TempUrl\TempUrlGeneratorInterface;
use Chill\DocGeneratorBundle\Context\HouseholdMemberSelectionContext;
use Chill\DocGeneratorBundle\Context\ContextManager;
use Chill\DocGeneratorBundle\Context\Exception\ContextNotFoundException;
use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate;
use Chill\DocGeneratorBundle\Repository\DocGeneratorTemplateRepository;
use Chill\DocStoreBundle\Entity\StoredObject;
use Chill\MainBundle\Pagination\PaginatorFactory;
use Chill\MainBundle\Serializer\Model\Collection;
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation;
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluationDocument;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\TransferException;
use PhpOffice\PhpWord\TemplateProcessor;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
// TODO à mettre dans services
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
@@ -42,20 +41,32 @@ final class DocGeneratorTemplateController extends AbstractController
{
private HttpClientInterface $client;
private ContextManager $contextManager;
private DocGeneratorTemplateRepository $docGeneratorTemplateRepository;
private KernelInterface $kernel;
private LoggerInterface $logger;
private PaginatorFactory $paginatorFactory;
private TempUrlGeneratorInterface $tempUrlGenerator;
public function __construct(
ContextManager $contextManager,
DocGeneratorTemplateRepository $docGeneratorTemplateRepository,
LoggerInterface $logger,
PaginatorFactory $paginatorFactory,
TempUrlGeneratorInterface $tempUrlGenerator,
KernelInterface $kernel,
HttpClientInterface $client
) {
$this->contextManager = $contextManager;
$this->docGeneratorTemplateRepository = $docGeneratorTemplateRepository;
$this->logger = $logger;
$this->paginatorFactory = $paginatorFactory;
$this->tempUrlGenerator = $tempUrlGenerator;
$this->kernel = $kernel;
$this->client = $client;
}
@@ -67,13 +78,12 @@ final class DocGeneratorTemplateController extends AbstractController
* )
*/
public function generateDocFromTemplateAction(
TempUrlGeneratorInterface $tempUrlGenerator,
DocGeneratorTemplate $template,
string $entityClassName,
int $entityId,
Request $request
): Response {
$getUrlGen = $tempUrlGenerator->generate(
$getUrlGen = $this->tempUrlGenerator->generate(
'GET',
$template->getFile()->getFilename()
);
@@ -102,25 +112,29 @@ final class DocGeneratorTemplateController extends AbstractController
exit;
}
if (fwrite($handle, $dataDecrypted) === false) {
if (false === $ftemplate = fwrite($handle, $dataDecrypted)) {
echo "Cannot write to file ({$tmpfnameDeCrypted})";
exit;
}
dump("Success, wrote ({$dataDecrypted}) to file ({$tmpfnameDeCrypted})");
dump("Success, wrote (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);
try {
$context = $this->contextManager->getContextByDocGeneratorTemplate($template);
} catch (ContextNotFoundException $e) {
throw new NotFoundHttpException($e->getMessage(), $e);
}
$datas = $context->getData($entity);
dump('process the data', $datas);
/*
$templateProcessor = new TemplateProcessor($tmpfnameDeCrypted);
foreach ($datas['setValues'] as $setValuesConf) {
@@ -130,28 +144,32 @@ final class DocGeneratorTemplateController extends AbstractController
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(
$getUrlGen = $this->tempUrlGenerator->generate(
'PUT',
$genDocName
);
unlink($tmpfnameDeCrypted);
unlink($tmpfnameGenerated);
//unlink($tmpfnameGenerated);
$client = new Client();
try {
/*
$putResponse = $client->request('PUT', $getUrlGen->url, [
'body' => $fileContent,
]);
*/
$putResponse = $client->request('PUT', $getUrlGen->url, [
'body' => $ftemplate,
]);
if ($putResponse->getStatusCode() === 201) {
$em = $this->getDoctrine()->getManager();
@@ -163,14 +181,16 @@ final class DocGeneratorTemplateController extends AbstractController
$em->persist($storedObject);
// Only for evaluation
if ($entity instanceof AccompanyingPeriodWorkEvaluation) {
$doc = new AccompanyingPeriodWorkEvaluationDocument();
$doc
->setStoredObject($storedObject)
->setTemplate($template);
$entity->addDocument($doc);
$em->persist($doc);
try {
$context->storeGenerated($template, $storedObject, $entity);
} catch (\Exception $e) {
$this->logger->error('Could not store the associated document to entity', [
'entityClassName' => $entityClassName,
'entityId' => $entityId,
'contextKey' => $context->getName(),
]);
throw $e;
}
$em->flush();
@@ -184,7 +204,7 @@ final class DocGeneratorTemplateController extends AbstractController
throw $e;
}
throw new Exception('Unable to generate document.');
throw new \Exception('Unable to generate document.');
}
/**