feat: cli command to stamp uploaded invoice

This commit is contained in:
Björn Fromme
2025-04-22 10:57:49 +02:00
parent 5061e80e07
commit 25ac54ee92
2 changed files with 49 additions and 74 deletions
+49
View File
@@ -0,0 +1,49 @@
<?php
namespace App\Command;
use App\Entity\Disposition;
use App\Entity\Upload;
use App\Service\Pdf\InvoiceApprover;
use App\Service\Upload\UploadHandler;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
#[AsCommand(name: 'app:upload:stamp', description: 'Stamps upload of provided disposition as accepted invoice')]
class StampUploadCommand extends Command
{
public function __construct(
private readonly EntityManagerInterface $entityManager,
private readonly UploadHandler $uploadHandler,
private readonly InvoiceApprover $invoiceApprover,
) {
parent::__construct();
}
protected function configure(): void
{
$this->addArgument('uuid', InputArgument::REQUIRED, 'Disposition uuid');
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$disposition = $this
->entityManager
->getRepository(Disposition::class)
->findOneBy(['uuid' => $input->getArgument('uuid')])
;
$invoicePdf = $disposition->getDocumentByType(Upload::TYPE_INVOICE);
$this->uploadHandler->ensurePdf($invoicePdf);
$this->invoiceApprover->render($disposition);
$invoicePdf->setStatus(Upload::STATUS_PAID);
$this->entityManager->flush();
return Command::SUCCESS;
}
}
-74
View File
@@ -1,74 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Command;
use App\Entity\Disposition;
use App\Entity\Upload;
use App\Entity\User;
use App\Service\Pdf\InvoiceApprover;
use Doctrine\ORM\EntityManagerInterface;
use Spatie\Blink\Blink;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
#[AsCommand(name: 'app:uploads:stamp', description: 'Stamps all uploads of accepted invoices')]
class StampUploadsCommand extends Command
{
public function __construct(
private readonly EntityManagerInterface $entityManager,
private readonly InvoiceApprover $invoiceApprover,
) {
parent::__construct();
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$qb = $this->entityManager->createQueryBuilder();
$dispositions = $qb
->select('disposition', 'upload')
->from(Disposition::class, 'disposition')
->innerJoin('disposition.documents', 'upload')
->where($qb->expr()->andX(
$qb->expr()->eq('upload.type', ':type'),
$qb->expr()->eq('upload.status', ':status')
))
->setParameter('type', Upload::TYPE_INVOICE)
->setParameter('status', Upload::STATUS_PAID)
->getQuery()
->getResult();
$progressBar = new ProgressBar($output, count($dispositions));
$progressBar->start();
$blink = new Blink();
$userRepository = $this->entityManager->getRepository(User::class);
foreach ($dispositions as $disposition) {
/** @var Disposition $disposition */
$upload = $disposition->getDocumentByType(Upload::TYPE_INVOICE);
if (null === $upload->getApprovedBy()) {
$email = $upload->getUpdatedBy();
if ($blink->has($email)) {
$approvingUser = $blink->get($email);
} else {
$approvingUser = $userRepository->findOneBy(['email' => $email]);
$blink->put($email, $approvingUser);
}
if (null !== $approvingUser) {
$upload->setApprovedBy($approvingUser->getInitials());
}
}
$this->invoiceApprover->render($disposition);
$progressBar->advance();
}
$this->entityManager->flush();
$progressBar->finish();
return Command::SUCCESS;
}
}