. */ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Export; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Support\Export\ExportDataGenerator; use Illuminate\Contracts\View\Factory; use Illuminate\Http\Response as LaravelResponse; use Illuminate\View\View; /** * Class IndexController */ class IndexController extends Controller { private JournalRepositoryInterface $journalRepository; /** * IndexController constructor. * * @codeCoverageIgnore */ public function __construct() { parent::__construct(); // translations: $this->middleware( function ($request, $next) { app('view')->share('mainTitleIcon', 'fa-life-bouy'); app('view')->share('title', (string)trans('firefly.export_data_title')); $this->journalRepository = app(JournalRepositoryInterface::class); $this->middleware(IsDemoUser::class)->except(['index']); return $next($request); } ); } /** * @return LaravelResponse * @throws FireflyException */ public function export(): LaravelResponse { /** @var ExportDataGenerator $generator */ $generator = app(ExportDataGenerator::class); $generator->setUser(auth()->user()); $generator->setExportTransactions(true); // get first transaction in DB: $firstDate = today(config('app.timezone')); $firstDate->subYear(); $journal = $this->journalRepository->firstNull(); if (null !== $journal) { $firstDate = clone $journal->date; } $generator->setStart($firstDate); $result = $generator->export(); $name = sprintf('%s_transaction_export.csv', date('Y_m_d')); $quoted = sprintf('"%s"', addcslashes($name, '"\\')); // headers for CSV file. /** @var LaravelResponse $response */ $response = response($result['transactions']); $response ->header('Content-Description', 'File Transfer') ->header('Content-Type', 'text/x-csv') ->header('Content-Disposition', 'attachment; filename=' . $quoted) //->header('Content-Transfer-Encoding', 'binary') ->header('Connection', 'Keep-Alive') ->header('Expires', '0') ->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') ->header('Pragma', 'public') ->header('Content-Length', strlen($result['transactions'])); // return CSV file made from 'transactions' array. return $response; } /** * @return Factory|View */ public function index() { return prefixView('export.index'); } }