From 21e14f1191deb3b8b7ff441ef42515e29747935d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20Duli=C3=A7i?= Date: Sun, 23 May 2021 02:27:44 +0300 Subject: [PATCH] fixed import export --- app/Abstracts/Http/Controller.php | 11 +++- app/Exports/Common/Items.php | 4 +- app/Exports/Purchases/Bills.php | 12 ++-- app/Exports/Sales/Invoices.php | 12 ++-- app/Imports/Common/Items.php | 9 ++- app/Imports/Purchases/Bills.php | 9 ++- app/Imports/Sales/Invoices.php | 9 ++- app/Jobs/Common/CreateMediableForExport.php | 67 ++++++++++++++++---- config/excel.php | 6 +- config/filesystems.php | 7 ++ public/files/import/customers.xlsx | Bin 9034 -> 9033 bytes public/files/import/vendors.xlsx | Bin 6608 -> 9037 bytes 12 files changed, 112 insertions(+), 34 deletions(-) diff --git a/app/Abstracts/Http/Controller.php b/app/Abstracts/Http/Controller.php index 2bfe8931b..b5e1202e1 100644 --- a/app/Abstracts/Http/Controller.php +++ b/app/Abstracts/Http/Controller.php @@ -143,10 +143,17 @@ abstract class Controller extends BaseController public function exportExcel($class, $translation, $extension = 'xlsx') { try { - $file_name = Str::filename($translation) . '.' . $extension; + $file_name = Str::filename($translation) . '-' . time() . '.' . $extension; if (should_queue()) { - $class->queue($file_name)->onQueue('exports')->chain([ + $disk = 'temp'; + + if (config('excel.temporary_files.remote_disk') !== null) { + $disk = config('excel.temporary_files.remote_disk'); + $file_name = config('excel.temporary_files.remote_prefix') . $file_name; + } + + $class->queue($file_name, $disk)->onQueue('exports')->chain([ new CreateMediableForExport(user(), $file_name), ]); diff --git a/app/Exports/Common/Items.php b/app/Exports/Common/Items.php index c2865fc11..7f83a157a 100644 --- a/app/Exports/Common/Items.php +++ b/app/Exports/Common/Items.php @@ -21,8 +21,8 @@ class Items implements WithMultipleSheets public function sheets(): array { return [ - 'items' => new Base($this->ids), - 'item_taxes' => new ItemTaxes($this->ids), + new Base($this->ids), + new ItemTaxes($this->ids), ]; } } diff --git a/app/Exports/Purchases/Bills.php b/app/Exports/Purchases/Bills.php index 32a450235..3a5a9115b 100644 --- a/app/Exports/Purchases/Bills.php +++ b/app/Exports/Purchases/Bills.php @@ -25,12 +25,12 @@ class Bills implements WithMultipleSheets public function sheets(): array { return [ - 'bills' => new Base($this->ids), - 'bill_items' => new BillItems($this->ids), - 'bill_item_taxes' => new BillItemTaxes($this->ids), - 'bill_histories' => new BillHistories($this->ids), - 'bill_totals' => new BillTotals($this->ids), - 'bill_transactions' => new BillTransactions($this->ids), + new Base($this->ids), + new BillItems($this->ids), + new BillItemTaxes($this->ids), + new BillHistories($this->ids), + new BillTotals($this->ids), + new BillTransactions($this->ids), ]; } } diff --git a/app/Exports/Sales/Invoices.php b/app/Exports/Sales/Invoices.php index d6b8e8abc..3c2148d96 100644 --- a/app/Exports/Sales/Invoices.php +++ b/app/Exports/Sales/Invoices.php @@ -25,12 +25,12 @@ class Invoices implements WithMultipleSheets public function sheets(): array { return [ - 'invoices' => new Base($this->ids), - 'invoice_items' => new InvoiceItems($this->ids), - 'invoice_item_taxes' => new InvoiceItemTaxes($this->ids), - 'invoice_histories' => new InvoiceHistories($this->ids), - 'invoice_totals' => new InvoiceTotals($this->ids), - 'invoice_transactions' => new InvoiceTransactions($this->ids), + new Base($this->ids), + new InvoiceItems($this->ids), + new InvoiceItemTaxes($this->ids), + new InvoiceHistories($this->ids), + new InvoiceTotals($this->ids), + new InvoiceTransactions($this->ids), ]; } } diff --git a/app/Imports/Common/Items.php b/app/Imports/Common/Items.php index 8da2635cb..4cdb87612 100644 --- a/app/Imports/Common/Items.php +++ b/app/Imports/Common/Items.php @@ -4,10 +4,12 @@ namespace App\Imports\Common; use App\Imports\Common\Sheets\Items as Base; use App\Imports\Common\Sheets\ItemTaxes; +use Illuminate\Contracts\Queue\ShouldQueue; use Maatwebsite\Excel\Concerns\Importable; +use Maatwebsite\Excel\Concerns\WithChunkReading; use Maatwebsite\Excel\Concerns\WithMultipleSheets; -class Items implements WithMultipleSheets +class Items implements ShouldQueue, WithChunkReading, WithMultipleSheets { use Importable; @@ -18,4 +20,9 @@ class Items implements WithMultipleSheets 'item_taxes' => new ItemTaxes(), ]; } + + public function chunkSize(): int + { + return 100; + } } diff --git a/app/Imports/Purchases/Bills.php b/app/Imports/Purchases/Bills.php index 47edefe46..8f981ca66 100644 --- a/app/Imports/Purchases/Bills.php +++ b/app/Imports/Purchases/Bills.php @@ -8,10 +8,12 @@ use App\Imports\Purchases\Sheets\BillItemTaxes; use App\Imports\Purchases\Sheets\BillHistories; use App\Imports\Purchases\Sheets\BillTotals; use App\Imports\Purchases\Sheets\BillTransactions; +use Illuminate\Contracts\Queue\ShouldQueue; use Maatwebsite\Excel\Concerns\Importable; +use Maatwebsite\Excel\Concerns\WithChunkReading; use Maatwebsite\Excel\Concerns\WithMultipleSheets; -class Bills implements WithMultipleSheets +class Bills implements ShouldQueue, WithChunkReading, WithMultipleSheets { use Importable; @@ -26,4 +28,9 @@ class Bills implements WithMultipleSheets 'bill_transactions' => new BillTransactions(), ]; } + + public function chunkSize(): int + { + return 100; + } } diff --git a/app/Imports/Sales/Invoices.php b/app/Imports/Sales/Invoices.php index 66da032a5..a0eae11b7 100644 --- a/app/Imports/Sales/Invoices.php +++ b/app/Imports/Sales/Invoices.php @@ -8,10 +8,12 @@ use App\Imports\Sales\Sheets\InvoiceItemTaxes; use App\Imports\Sales\Sheets\InvoiceHistories; use App\Imports\Sales\Sheets\InvoiceTotals; use App\Imports\Sales\Sheets\InvoiceTransactions; +use Illuminate\Contracts\Queue\ShouldQueue; use Maatwebsite\Excel\Concerns\Importable; +use Maatwebsite\Excel\Concerns\WithChunkReading; use Maatwebsite\Excel\Concerns\WithMultipleSheets; -class Invoices implements WithMultipleSheets +class Invoices implements ShouldQueue, WithChunkReading, WithMultipleSheets { use Importable; @@ -26,4 +28,9 @@ class Invoices implements WithMultipleSheets 'invoice_transactions' => new InvoiceTransactions(), ]; } + + public function chunkSize(): int + { + return 100; + } } diff --git a/app/Jobs/Common/CreateMediableForExport.php b/app/Jobs/Common/CreateMediableForExport.php index 4f176340a..0522e2c36 100644 --- a/app/Jobs/Common/CreateMediableForExport.php +++ b/app/Jobs/Common/CreateMediableForExport.php @@ -3,8 +3,11 @@ namespace App\Jobs\Common; use App\Abstracts\JobShouldQueue; +use App\Models\Common\Media as MediaModel; use App\Notifications\Common\ExportCompleted; use Illuminate\Support\Facades\File; +use Illuminate\Support\Facades\Storage; +use MediaUploader; class CreateMediableForExport extends JobShouldQueue { @@ -33,18 +36,7 @@ class CreateMediableForExport extends JobShouldQueue */ public function handle() { - $source = storage_path('app/uploads/' . $this->file_name); - $destination = storage_path('app/uploads/' . company_id() . '/exports/'); - - // Create exports directory - if (!File::isDirectory($destination)) { - File::makeDirectory($destination); - } - - File::move($source, $destination . $this->file_name); - - // Create the media record - $media = $this->importMedia($this->file_name, 'exports'); + $media = $this->getQueuedMedia(); $this->user->attachMedia($media, 'export'); @@ -52,4 +44,55 @@ class CreateMediableForExport extends JobShouldQueue $this->user->notify(new ExportCompleted($download_url)); } + + public function getQueuedMedia() + { + return config('excel.temporary_files.remote_disk') !== null + ? $this->getRemoteQueuedMedia() + : $this->getLocalQueuedMedia(); + } + + public function getLocalQueuedMedia() + { + $source = storage_path('app/temp/' . $this->file_name); + + $destination = $this->getMediaFolder('exports'); + + $media = MediaUploader::makePrivate() + ->beforeSave(function(MediaModel $media) { + $media->company_id = company_id(); + }) + ->fromSource($source) + ->toDirectory($destination) + ->upload(); + + File::delete($source); + + return $media; + } + + public function getRemoteQueuedMedia() + { + $disk = config('excel.temporary_files.remote_disk'); + $prefix = config('excel.temporary_files.remote_prefix'); + + $content = Storage::disk($disk)->get($this->file_name); + + $file_name = str_replace([$prefix, '.xlsx', '.xls'], '', $this->file_name); + + $destination = $this->getMediaFolder('exports'); + + $media = MediaUploader::makePrivate() + ->beforeSave(function(MediaModel $media) { + $media->company_id = company_id(); + }) + ->fromString($content) + ->useFilename($file_name) + ->toDirectory($destination) + ->upload(); + + Storage::disk($disk)->delete($this->file_name); + + return $media; + } } diff --git a/config/excel.php b/config/excel.php index 6d06f6a38..1b34c6fcf 100644 --- a/config/excel.php +++ b/config/excel.php @@ -232,8 +232,8 @@ return [ | in conjunction with queued imports and exports. | */ - 'remote_disk' => env('EXCEL_TEMPORARY_FILES_REMOTE_DISK', null), - 'remote_prefix' => env('EXCEL_TEMPORARY_FILES_REMOTE_PREFIX', null), + 'remote_disk' => env('EXCEL_TEMPORARY_FILES_REMOTE_DISK'), + 'remote_prefix' => env('EXCEL_TEMPORARY_FILES_REMOTE_PREFIX'), /* |-------------------------------------------------------------------------- @@ -250,7 +250,7 @@ return [ | processed it. | */ - 'force_resync_remote' => env('EXCEL_TEMPORARY_FILES_FORCE_RESYNC_REMOTE', null), + 'force_resync_remote' => env('EXCEL_TEMPORARY_FILES_FORCE_RESYNC_REMOTE'), ], diff --git a/config/filesystems.php b/config/filesystems.php index 6e534f2c9..e6f2e18cc 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -72,6 +72,13 @@ return [ 'visibility' => 'public', ], + 'temp' => [ + 'driver' => 'local', + 'root' => storage_path('app/temp'), + 'url' => app()->runningInConsole() ? '' : url('/') . '/temp', + 'visibility' => 'private', + ], + 'uploads' => [ 'driver' => 'local', 'root' => storage_path('app/uploads'), diff --git a/public/files/import/customers.xlsx b/public/files/import/customers.xlsx index 06c6044a1b007fa05180f8aaff11b90098ec89b1..fd92ceedc8db882c8761af572bf30838be2152a6 100644 GIT binary patch delta 4183 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 W0AT(P=)b5e3=5ACsWAB8=KlcfnA58O delta 4202 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 diff --git a/public/files/import/vendors.xlsx b/public/files/import/vendors.xlsx index 55e0ee610870515110b0a92a862d6d9196d92982..64726d42f906658d94708f5cf29b0b9988912a45 100644 GIT binary patch literal 9037 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 literal 6608 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