Current File : /home/tradevaly/public_html/vendor/maatwebsite/excel/src/Jobs/ReadChunk.php |
<?php
namespace Maatwebsite\Excel\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Concerns\WithCustomValueBinder;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\ImportFailed;
use Maatwebsite\Excel\Files\RemoteTemporaryFile;
use Maatwebsite\Excel\Files\TemporaryFile;
use Maatwebsite\Excel\Filters\ChunkReadFilter;
use Maatwebsite\Excel\HasEventBus;
use Maatwebsite\Excel\Imports\HeadingRowExtractor;
use Maatwebsite\Excel\Sheet;
use Maatwebsite\Excel\Transactions\TransactionHandler;
use PhpOffice\PhpSpreadsheet\Cell\Cell;
use PhpOffice\PhpSpreadsheet\Reader\IReader;
use Throwable;
class ReadChunk implements ShouldQueue
{
use Queueable, HasEventBus, InteractsWithQueue;
/**
* @var int
*/
public $timeout;
/**
* @var int
*/
public $tries;
/**
* @var int
*/
public $maxExceptions;
/**
* @var WithChunkReading
*/
private $import;
/**
* @var IReader
*/
private $reader;
/**
* @var TemporaryFile
*/
private $temporaryFile;
/**
* @var string
*/
private $sheetName;
/**
* @var object
*/
private $sheetImport;
/**
* @var int
*/
private $startRow;
/**
* @var int
*/
private $chunkSize;
/**
* @param WithChunkReading $import
* @param IReader $reader
* @param TemporaryFile $temporaryFile
* @param string $sheetName
* @param object $sheetImport
* @param int $startRow
* @param int $chunkSize
*/
public function __construct(WithChunkReading $import, IReader $reader, TemporaryFile $temporaryFile, string $sheetName, $sheetImport, int $startRow, int $chunkSize)
{
$this->import = $import;
$this->reader = $reader;
$this->temporaryFile = $temporaryFile;
$this->sheetName = $sheetName;
$this->sheetImport = $sheetImport;
$this->startRow = $startRow;
$this->chunkSize = $chunkSize;
$this->timeout = $import->timeout ?? null;
$this->tries = $import->tries ?? null;
$this->maxExceptions = $import->maxExceptions ?? null;
}
/**
* Get the middleware the job should be dispatched through.
*
* @return array
*/
public function middleware()
{
return (method_exists($this->import, 'middleware')) ? $this->import->middleware() : [];
}
/**
* Determine the time at which the job should timeout.
*
* @return \DateTime
*/
public function retryUntil()
{
return (method_exists($this->import, 'retryUntil')) ? $this->import->retryUntil() : null;
}
/**
* @param TransactionHandler $transaction
*
* @throws \Maatwebsite\Excel\Exceptions\SheetNotFoundException
* @throws \PhpOffice\PhpSpreadsheet\Reader\Exception
*/
public function handle(TransactionHandler $transaction)
{
if (method_exists($this->import, 'setChunkOffset')) {
$this->import->setChunkOffset($this->startRow);
}
if ($this->sheetImport instanceof WithCustomValueBinder) {
Cell::setValueBinder($this->sheetImport);
}
$headingRow = HeadingRowExtractor::headingRow($this->sheetImport);
$filter = new ChunkReadFilter(
$headingRow,
$this->startRow,
$this->chunkSize,
$this->sheetName
);
$this->reader->setReadFilter($filter);
$this->reader->setReadDataOnly(true);
$this->reader->setReadEmptyCells(false);
$spreadsheet = $this->reader->load(
$this->temporaryFile->sync()->getLocalPath()
);
$sheet = Sheet::byName(
$spreadsheet,
$this->sheetName
);
if ($sheet->getHighestRow() < $this->startRow) {
$sheet->disconnect();
$this->cleanUpTempFile();
return;
}
$transaction(function () use ($sheet) {
$sheet->import(
$this->sheetImport,
$this->startRow
);
$sheet->disconnect();
$this->cleanUpTempFile();
});
}
/**
* @param Throwable $e
*/
public function failed(Throwable $e)
{
if ($this->temporaryFile instanceof RemoteTemporaryFile) {
$this->temporaryFile->deleteLocalCopy();
}
if ($this->import instanceof WithEvents) {
$this->registerListeners($this->import->registerEvents());
$this->raise(new ImportFailed($e));
if (method_exists($this->import, 'failed')) {
$this->import->failed($e);
}
}
}
private function cleanUpTempFile()
{
if (!config('excel.temporary_files.force_resync_remote')) {
return true;
}
if (!$this->temporaryFile instanceof RemoteTemporaryFile) {
return true;
}
return $this->temporaryFile->deleteLocalCopy();
}
}