2018-03-22 06:07:30 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Services;
|
|
|
|
|
|
|
|
use App\Interfaces\ImportExport;
|
|
|
|
use App\Interfaces\Service;
|
2018-03-23 01:55:56 +08:00
|
|
|
use App\Services\ImportExport\AircraftExporter;
|
2018-03-23 02:04:13 +08:00
|
|
|
use App\Services\ImportExport\AirportExporter;
|
2018-03-23 06:17:37 +08:00
|
|
|
use App\Services\ImportExport\ExpenseExporter;
|
2018-03-23 01:43:58 +08:00
|
|
|
use App\Services\ImportExport\FlightExporter;
|
2018-03-22 06:07:30 +08:00
|
|
|
use Illuminate\Support\Collection;
|
|
|
|
use League\Csv\CharsetConverter;
|
|
|
|
use League\Csv\Writer;
|
2018-03-23 01:43:58 +08:00
|
|
|
use Illuminate\Support\Facades\Storage;
|
2018-03-23 01:48:27 +08:00
|
|
|
use Log;
|
2018-03-22 06:07:30 +08:00
|
|
|
|
|
|
|
/**
|
2018-03-22 08:12:36 +08:00
|
|
|
* Class ExportService
|
2018-03-22 06:07:30 +08:00
|
|
|
* @package App\Services
|
|
|
|
*/
|
2018-03-22 08:12:36 +08:00
|
|
|
class ExportService extends Service
|
2018-03-22 06:07:30 +08:00
|
|
|
{
|
|
|
|
/**
|
2018-03-23 01:43:58 +08:00
|
|
|
* @param string $path
|
2018-03-22 06:07:30 +08:00
|
|
|
* @return Writer
|
|
|
|
*/
|
2018-03-23 01:43:58 +08:00
|
|
|
public function openCsv($path): Writer
|
2018-03-22 06:07:30 +08:00
|
|
|
{
|
2018-03-23 01:43:58 +08:00
|
|
|
$writer = Writer::createFromPath($path, 'w+');
|
2018-03-22 06:07:30 +08:00
|
|
|
CharsetConverter::addTo($writer, 'utf-8', 'iso-8859-15');
|
|
|
|
return $writer;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Run the actual importer
|
|
|
|
* @param Collection $collection
|
|
|
|
* @param ImportExport $exporter
|
2018-03-23 01:43:58 +08:00
|
|
|
* @return string
|
2018-03-22 06:07:30 +08:00
|
|
|
* @throws \League\Csv\CannotInsertRecord
|
|
|
|
*/
|
2018-03-23 01:43:58 +08:00
|
|
|
protected function runExport(Collection $collection, ImportExport $exporter): string
|
2018-03-22 06:07:30 +08:00
|
|
|
{
|
2018-03-23 01:43:58 +08:00
|
|
|
$filename = 'export_' . $exporter->assetType . '.csv';
|
2018-03-23 01:48:27 +08:00
|
|
|
|
|
|
|
// Create the directory - makes it inside of storage/app
|
|
|
|
Storage::makeDirectory('import');
|
|
|
|
$path = storage_path('/app/import/export_'.$filename.'.csv');
|
2018-03-23 01:43:58 +08:00
|
|
|
|
2018-03-23 02:04:13 +08:00
|
|
|
Log::info('Exporting "'.$exporter->assetType.'" to ' . $path);
|
|
|
|
|
2018-03-23 01:43:58 +08:00
|
|
|
$writer = $this->openCsv($path);
|
|
|
|
|
|
|
|
// Write out the header first
|
2018-03-22 06:07:30 +08:00
|
|
|
$writer->insertOne($exporter->getColumns());
|
2018-03-23 01:43:58 +08:00
|
|
|
|
|
|
|
// Write the rest of the rows
|
2018-03-22 06:07:30 +08:00
|
|
|
foreach ($collection as $row) {
|
|
|
|
$writer->insertOne($exporter->export($row));
|
|
|
|
}
|
|
|
|
|
2018-03-23 01:43:58 +08:00
|
|
|
return $path;
|
2018-03-22 06:07:30 +08:00
|
|
|
}
|
|
|
|
|
2018-03-23 01:55:56 +08:00
|
|
|
/**
|
|
|
|
* Export all of the aircraft
|
|
|
|
* @param Collection $aircraft
|
|
|
|
* @return mixed
|
|
|
|
* @throws \League\Csv\CannotInsertRecord
|
|
|
|
*/
|
|
|
|
public function exportAircraft($aircraft)
|
|
|
|
{
|
|
|
|
$exporter = new AircraftExporter();
|
|
|
|
return $this->runExport($aircraft, $exporter);
|
|
|
|
}
|
|
|
|
|
2018-03-23 02:04:13 +08:00
|
|
|
/**
|
|
|
|
* Export all of the airports
|
|
|
|
* @param Collection $airports
|
|
|
|
* @return mixed
|
|
|
|
* @throws \League\Csv\CannotInsertRecord
|
|
|
|
*/
|
|
|
|
public function exportAirports($airports)
|
|
|
|
{
|
|
|
|
$exporter = new AirportExporter();
|
|
|
|
return $this->runExport($airports, $exporter);
|
|
|
|
}
|
|
|
|
|
2018-03-23 06:17:37 +08:00
|
|
|
/**
|
|
|
|
* Export all of the airports
|
|
|
|
* @param Collection $expenses
|
|
|
|
* @return mixed
|
|
|
|
* @throws \League\Csv\CannotInsertRecord
|
|
|
|
*/
|
|
|
|
public function exportExpenses($expenses)
|
|
|
|
{
|
|
|
|
$exporter = new ExpenseExporter();
|
|
|
|
return $this->runExport($expenses, $exporter);
|
|
|
|
}
|
|
|
|
|
2018-03-22 06:07:30 +08:00
|
|
|
/**
|
|
|
|
* Export all of the flights
|
2018-03-23 01:55:56 +08:00
|
|
|
* @param Collection $flights
|
2018-03-22 06:07:30 +08:00
|
|
|
* @return mixed
|
2018-03-23 01:55:56 +08:00
|
|
|
* @throws \League\Csv\CannotInsertRecord
|
2018-03-22 06:07:30 +08:00
|
|
|
*/
|
2018-03-23 01:43:58 +08:00
|
|
|
public function exportFlights($flights)
|
2018-03-22 06:07:30 +08:00
|
|
|
{
|
|
|
|
$exporter = new FlightExporter();
|
2018-03-23 01:43:58 +08:00
|
|
|
return $this->runExport($flights, $exporter);
|
2018-03-22 06:07:30 +08:00
|
|
|
}
|
|
|
|
}
|