From 444a28f899031ad27c6fbd82682383772a3017b8 Mon Sep 17 00:00:00 2001 From: ajikamaludin Date: Sun, 18 Sep 2022 18:23:07 +0700 Subject: [PATCH] export done --- app/Http/Controllers/DocumentController.php | 66 +++++++- composer.json | 1 + composer.lock | 161 +++++++++++++++++++- resources/js/Pages/Document/Index.jsx | 4 +- resources/js/Pages/Document/ModalFilter.jsx | 10 +- routes/web.php | 3 +- 6 files changed, 233 insertions(+), 12 deletions(-) diff --git a/app/Http/Controllers/DocumentController.php b/app/Http/Controllers/DocumentController.php index 23d9f08..2909770 100644 --- a/app/Http/Controllers/DocumentController.php +++ b/app/Http/Controllers/DocumentController.php @@ -6,6 +6,8 @@ use App\Models\Department; use App\Models\Document; use App\Models\TypeDoc; use Illuminate\Http\Request; +use OpenSpout\Writer\Common\Creator\Style\StyleBuilder; +use Rap2hpoutre\FastExcel\FastExcel; class DocumentController extends Controller { @@ -14,21 +16,23 @@ class DocumentController extends Controller $query = Document::with(['department', 'type'])->orderBy('created_at'); if ($request->q != null || $request->q != '') { - $query->where('no_doc', 'like', '%'.$request->q.'%') + $query->where(function ($query) use ($request) { + $query->where('no_doc', 'like', '%'.$request->q.'%') ->orWhere('company_name', 'like', '%'.$request->q.'%') ->orWhere('pic_name', 'like', '%'.$request->q.'%') ->orWhere('email', 'like', '%'.$request->q.'%'); + }); } - if ($request->department_id != ''){ + if ($request->department_id != '') { $query->where('department_id', $request->department_id); } - if ($request->status != ''){ + if ($request->status != '') { $query->where('status', $request->status); } - if ($request->type_doc_id != ''){ + if ($request->type_doc_id != '') { $query->where('type_doc_id', $request->type_doc_id); } @@ -138,7 +142,7 @@ class DocumentController extends Controller ]); $file = $request->file('document'); - if($file != null) { + if ($file != null) { $file->store('documents', 'public'); $doc->document = $file->hashName(); } @@ -157,6 +161,58 @@ class DocumentController extends Controller ]); } + public function export(Request $request) + { + $query = Document::with(['department', 'type', 'creator'])->orderBy('created_at'); + + if ($request->q != null || $request->q != '') { + $query->where(function ($query) use ($request) { + $query->where('no_doc', 'like', '%'.$request->q.'%') + ->orWhere('company_name', 'like', '%'.$request->q.'%') + ->orWhere('pic_name', 'like', '%'.$request->q.'%') + ->orWhere('email', 'like', '%'.$request->q.'%'); + }); + } + + if ($request->department_id != '') { + $query->where('department_id', $request->department_id); + } + + if ($request->status != '') { + $query->where('status', $request->status); + } + + if ($request->type_doc_id != '') { + $query->where('type_doc_id', $request->type_doc_id); + } + + $collections = collect([]); + foreach ($query->get() as $document) { + $collections->add([ + 'no dokumen' => $document->no_doc, + 'jenis dokumen' => $document->type->name, + 'nama perusahaan' => $document->company_name, + 'nama pihak pertama' => $document->first_person_name, + 'nama pihak kedua' => $document->second_person_name, + 'tanggal mulai' => $document->start_date, + 'tanggal selesai' => $document->end_date, + 'department' => $document->department->name, + 'nama pic' => $document->pic_name, + 'email' => $document->email, + 'catata' => $document->note, + 'status' => $document->status, + 'user_creator' => $document->creator->name, + ]); + } + + $date = now()->format('d-m-y'); + $header_style = (new StyleBuilder())->setFontBold()->build(); + + return (new FastExcel($collections)) + ->headerStyle($header_style) + ->download("documents-$date.xlsx"); + } + public function destroy(Document $doc) { $doc->delete(); diff --git a/composer.json b/composer.json index 323cbe3..b9e1a1b 100644 --- a/composer.json +++ b/composer.json @@ -11,6 +11,7 @@ "laravel/framework": "^9.19", "laravel/sanctum": "^2.8", "laravel/tinker": "^2.7", + "rap2hpoutre/fast-excel": "^4.1", "tightenco/ziggy": "^1.0" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 317d912..3843b31 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "49d0eed73c35e5e17c8c427170a67feb", + "content-hash": "8662250ffc62667a51719994af603665", "packages": [ { "name": "brick/math", @@ -2174,6 +2174,95 @@ ], "time": "2022-08-01T11:03:24+00:00" }, + { + "name": "openspout/openspout", + "version": "v3.7.4", + "source": { + "type": "git", + "url": "https://github.com/openspout/openspout.git", + "reference": "dfbbd53b5edcd486b45a37f6a04fac33073c70f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/openspout/openspout/zipball/dfbbd53b5edcd486b45a37f6a04fac33073c70f3", + "reference": "dfbbd53b5edcd486b45a37f6a04fac33073c70f3", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-filter": "*", + "ext-libxml": "*", + "ext-xmlreader": "*", + "ext-zip": "*", + "php": "~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0" + }, + "require-dev": { + "ext-zlib": "*", + "friendsofphp/php-cs-fixer": "^3.4", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "ext-iconv": "To handle non UTF-8 CSV files (if \"php-intl\" is not already installed or is too limited)", + "ext-intl": "To handle non UTF-8 CSV files (if \"iconv\" is not already installed)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "OpenSpout\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Adrien Loison", + "email": "adrien@box.com" + } + ], + "description": "PHP Library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way", + "homepage": "https://github.com/openspout/openspout", + "keywords": [ + "OOXML", + "csv", + "excel", + "memory", + "odf", + "ods", + "office", + "open", + "php", + "read", + "scale", + "spreadsheet", + "stream", + "write", + "xlsx" + ], + "support": { + "issues": "https://github.com/openspout/openspout/issues", + "source": "https://github.com/openspout/openspout/tree/v3.7.4" + }, + "funding": [ + { + "url": "https://paypal.me/filippotessarotto", + "type": "custom" + }, + { + "url": "https://github.com/Slamdunk", + "type": "github" + } + ], + "time": "2022-03-31T06:15:15+00:00" + }, { "name": "phpoption/phpoption", "version": "1.9.0", @@ -2906,6 +2995,76 @@ ], "time": "2022-09-16T03:22:46+00:00" }, + { + "name": "rap2hpoutre/fast-excel", + "version": "v4.1.0", + "source": { + "type": "git", + "url": "https://github.com/rap2hpoutre/fast-excel.git", + "reference": "724557e844170a231fd4515bbc3ea435ca622e7d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rap2hpoutre/fast-excel/zipball/724557e844170a231fd4515bbc3ea435ca622e7d", + "reference": "724557e844170a231fd4515bbc3ea435ca622e7d", + "shasum": "" + }, + "require": { + "illuminate/support": "5.3.* || 5.4.* || 5.5.* || 5.6.* || 5.7.* || 5.8.* || ^6.0 || ^7.0 || ^8.0 || ^9.0", + "openspout/openspout": "^3", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "illuminate/database": "^6.20.12 || ^7.30.4 || ^8.24.0 || ^9.0", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "3.*" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Rap2hpoutre\\FastExcel\\Providers\\FastExcelServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/functions/fastexcel.php" + ], + "psr-4": { + "Rap2hpoutre\\FastExcel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "rap2h", + "email": "raphaelht@gmail.com" + } + ], + "description": "Fast Excel import/export for Laravel", + "keywords": [ + "csv", + "excel", + "laravel", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/rap2hpoutre/fast-excel/issues", + "source": "https://github.com/rap2hpoutre/fast-excel/tree/v4.1.0" + }, + "funding": [ + { + "url": "https://github.com/rap2hpoutre", + "type": "github" + } + ], + "time": "2022-07-21T14:21:25+00:00" + }, { "name": "symfony/console", "version": "v6.1.4", diff --git a/resources/js/Pages/Document/Index.jsx b/resources/js/Pages/Document/Index.jsx index c872b9c..b092db7 100644 --- a/resources/js/Pages/Document/Index.jsx +++ b/resources/js/Pages/Document/Index.jsx @@ -39,7 +39,7 @@ export default function Document(props) { const handleFilter = (filter) => { setSearch({ ...search, - ...filter + ...filter, }) } @@ -92,7 +92,7 @@ export default function Document(props) { -
+
diff --git a/resources/js/Pages/Document/ModalFilter.jsx b/resources/js/Pages/Document/ModalFilter.jsx index a2fe9c6..cd367e4 100644 --- a/resources/js/Pages/Document/ModalFilter.jsx +++ b/resources/js/Pages/Document/ModalFilter.jsx @@ -1,4 +1,5 @@ import React, { useState } from 'react' +import { Inertia } from '@inertiajs/inertia' import { statuses } from '@/utils' import InputLabel from '@/Components/InputLabel' @@ -31,8 +32,11 @@ export default function ModalFilter(props) { }) } - const onClickExport = () => { - // call export url + const params = { + q: filter.q, + ype_doc_id: type, + status: status, + department_id: dep } return ( @@ -95,7 +99,7 @@ export default function ModalFilter(props) {
Filter
Reset
-
Export
+ Export
diff --git a/routes/web.php b/routes/web.php index 4ec3686..2ae3146 100644 --- a/routes/web.php +++ b/routes/web.php @@ -23,7 +23,7 @@ Route::get('/', function () { }); Route::middleware(['auth'])->group(function () { - Route::get('/dashboard',[GeneralController::class, 'index'])->name('dashboard'); + Route::get('/dashboard', [GeneralController::class, 'index'])->name('dashboard'); Route::get('/users', [UserController::class, 'index'])->name('users.index'); Route::post('/users', [UserController::class, 'store'])->name('users.store'); @@ -31,6 +31,7 @@ Route::middleware(['auth'])->group(function () { Route::delete('/users/{user}', [UserController::class, 'destroy'])->name('users.destroy'); Route::get('/docs', [DocumentController::class, 'index'])->name('docs.index'); + Route::get('/docs/export', [DocumentController::class, 'export'])->name('docs.export'); Route::get('/docs/create', [DocumentController::class, 'create'])->name('docs.create'); Route::post('/docs', [DocumentController::class, 'store'])->name('docs.store'); Route::delete('/docs/{doc}', [DocumentController::class, 'destroy'])->name('docs.destroy');