feat: reduce number of backups created when processing PDF files

This commit is contained in:
Björn Fromme
2026-03-15 12:42:28 +01:00
parent 65187657f9
commit 0652ca9f8b
2 changed files with 141 additions and 2 deletions
+6 -2
View File
@@ -64,7 +64,7 @@ class InvoiceApprover extends AbstractPdfRenderer
{ {
$filesystem = new Filesystem(); $filesystem = new Filesystem();
if (!$filesystem->exists($source)) { if (false === $filesystem->exists($source)) {
return; return;
} }
@@ -72,7 +72,11 @@ class InvoiceApprover extends AbstractPdfRenderer
$filename = pathinfo($source, PATHINFO_FILENAME); $filename = pathinfo($source, PATHINFO_FILENAME);
$extension = pathinfo($source, PATHINFO_EXTENSION); $extension = pathinfo($source, PATHINFO_EXTENSION);
$target = sprintf('%s/%s.bak.%s', $path, $filename, $extension); $target = sprintf('%s/%s.orig.%s', $path, $filename, $extension);
if (true === $filesystem->exists($target)) {
return;
}
$filesystem->copy($source, $target); $filesystem->copy($source, $target);
} }
+135
View File
@@ -0,0 +1,135 @@
<?php
declare(strict_types=1);
namespace App\Tests\Service\Pdf;
use App\Entity\Application;
use App\Entity\Assignment;
use App\Entity\Destination;
use App\Entity\Disposition;
use App\Entity\JobProfile;
use App\Entity\Teamer;
use App\Entity\Upload;
use App\Service\Pdf\InvoiceApprover;
use App\Service\Pdf\InvoiceRenderer;
use App\Service\Pdf\Pdf;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Contracts\Translation\TranslatorInterface;
class InvoiceApproverTest extends WebTestCase
{
private string $projectDir;
private string $invoiceDir;
private string $pdfPath;
private string $origPath;
private Filesystem $filesystem;
protected function setUp(): void
{
self::bootKernel();
$this->projectDir = static::getContainer()->getParameter('kernel.project_dir');
$this->invoiceDir = $this->projectDir.'/uploads/invoice/t';
$this->pdfPath = $this->invoiceDir.'/test_approver_backup.pdf';
$this->origPath = $this->invoiceDir.'/test_approver_backup.orig.pdf';
$this->filesystem = new Filesystem();
$this->filesystem->mkdir($this->invoiceDir);
}
protected function tearDown(): void
{
$this->filesystem->remove($this->pdfPath);
$this->filesystem->remove($this->origPath);
parent::tearDown();
}
public function testSkipsBackupWhenOrigExists(): void
{
$disposition = $this->createDispositionWithInvoicePdf();
$origContent = file_get_contents($this->pdfPath);
$this->filesystem->copy($this->pdfPath, $this->origPath);
$approver = $this->createApprover();
$pdf = $approver->render($disposition);
$this->assertInstanceOf(Pdf::class, $pdf);
$this->assertFileExists($this->origPath);
$this->assertStringEqualsFile($this->origPath, $origContent);
}
public function testCreatesOrigBackupWhenNoneExists(): void
{
$disposition = $this->createDispositionWithInvoicePdf();
$this->assertFileDoesNotExist($this->origPath);
$approver = $this->createApprover();
$pdf = $approver->render($disposition);
$this->assertInstanceOf(Pdf::class, $pdf);
$this->assertFileExists($this->origPath);
}
private function createApprover(): InvoiceApprover
{
$translator = $this->createMock(TranslatorInterface::class);
/** @var TranslatorInterface $translator */
return new InvoiceApprover($translator, ['project_dir' => $this->projectDir]);
}
private function createDispositionWithInvoicePdf(): Disposition
{
$teamer = new Teamer();
$teamer
->setFirstName('Test')
->setLastName('User')
;
$destination = new Destination();
$destination
->setProduct('Testreise')
->setHotel('Testhotel')
->setCode('TEST01')
->setDateFrom(new \DateTimeImmutable('2025-01-01'))
->setDateTo(new \DateTimeImmutable('2025-01-08'))
->setCostUnit('100')
;
$jobProfile = new JobProfile();
$jobProfile->setName('Testprofil');
$jobProfile->setCostUnit('200');
$assignment = $this->createMock(Assignment::class);
$assignment->method('getDestination')->willReturn($destination);
$assignment->method('getJobProfile')->willReturn($jobProfile);
$application = new Application($assignment, $teamer);
$disposition = new Disposition($application);
// Create a minimal valid PDF at the expected path
$pdf = new Pdf();
$pdf->AddPage();
$pdf->SetFont('Arial', '', 12);
$pdf->Cell(40, 10, 'Test Invoice');
$pdf->Output('F', $this->pdfPath);
$invoice = new Upload();
$invoice
->setType(Upload::TYPE_INVOICE)
->setMimeType('application/pdf')
->setFilename('test_approver_backup.pdf')
->setApprovedBy('TESTER')
->setApprovedAt(new \DateTimeImmutable())
->setStatus(Upload::STATUS_PAID)
;
$disposition->addDocument($invoice);
return $disposition;
}
}