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);
}
}