Otázka 05 / 15

Export do účetnictví

Účetní hlásí, že měsíční export objednávek do účetnictví trvá desítky minut a za prosinec spadl na nedostatek paměti. Před půl rokem trval pár vteřin, od té doby e-shop zhruba ztrojnásobil počet objednávek a kód exportu se neměnil. Tady je část modulu, která export dělá. Co se děje a co bys udělal?

Ctrl/Cmd+klik na metodu, třídu nebo konstantu otevře její deklaraci, Alt+← vrátí zpět.

app › Services › Accounting › MonthlyOrderExport.php
<?php declare(strict_types=1);

namespace App\Services\Accounting;

use App\Repositories\OrderRepository;
use DateTimeImmutable;

final class MonthlyOrderExport
{
    private const string CSV_DELIMITER = ';';

    public function __construct(
        private readonly OrderRepository $orderRepository,
        private readonly AccountingRowMapper $accountingRowMapper,
    )
    {}

    public function exportToFile(DateTimeImmutable $month, string $targetPath): void
    {
        $rows = [];
        foreach ($this->orderRepository->findCompletedInMonth($month) as $order) {
            $rows[] = $this->accountingRowMapper->map($order);
        }

        $handle = fopen($targetPath, 'wb');
        if ($handle === false) {
            throw new \RuntimeException("Cannot open accounting export file {$targetPath}");
        }

        foreach ($rows as $row) {
            fputcsv($handle, $row, self::CSV_DELIMITER, escape: '');
        }
        fclose($handle);
    }
}