From 69ab2b056d54fb941b76f76359937e6c924349be Mon Sep 17 00:00:00 2001 From: Jagad R R Date: Mon, 16 Dec 2024 17:01:55 +0700 Subject: [PATCH 1/3] added forms country & vehicle running cost (kurang fitur pendukung) --- .env | 3 +- .../Forms/FormUpCountryController.php | 163 +++++++++++++++- .../Forms/FormVehicleController.php | 183 ++++++++++++++++++ app/Models/FormUpCountry.php | 10 + app/Models/FormVehicleRunningCost.php | 5 + app/Models/UserHasCabang.php | 10 + composer.json | 1 + composer.lock | 61 +++++- config/filesystems.php | 7 +- database/seeds/DatabaseSeeder.php | 14 +- database/seeds/RolePermissionSeeder3.php | 126 ++++++++++++ .../pages/forms/upcountry/create.blade.php | 54 ++++-- .../pages/forms/upcountry/edit.blade.php | 59 ++++-- .../pages/forms/upcountry/index.blade.php | 79 +++++--- .../pages/forms/vehicle/create.blade.php | 89 +++++++++ .../pages/forms/vehicle/edit.blade.php | 88 +++++++++ .../pages/forms/vehicle/index.blade.php | 109 +++++++++++ .../views/backend/pages/roles/index.blade.php | 2 +- .../views/backend/pages/users/index.blade.php | 2 +- routes/web.php | 25 ++- 20 files changed, 1012 insertions(+), 78 deletions(-) create mode 100644 app/Http/Controllers/Forms/FormVehicleController.php create mode 100644 database/seeds/RolePermissionSeeder3.php create mode 100644 resources/views/backend/pages/forms/vehicle/create.blade.php create mode 100644 resources/views/backend/pages/forms/vehicle/edit.blade.php create mode 100644 resources/views/backend/pages/forms/vehicle/index.blade.php diff --git a/.env b/.env index d80988b..0750f1e 100644 --- a/.env +++ b/.env @@ -68,6 +68,7 @@ AWS_USE_PATH_STYLE_ENDPOINT=false VITE_APP_NAME="${APP_NAME}" -NEXT_CLOUD_URL=https://mkt.tunggal-pharma.com/ +NEXT_CLOUD_URL=https://mkt.tunggal-pharma.com/remote.php/dav/files/user_dev/ NEXT_CLOUD_USERNAME=user_dev NEXT_CLOUD_PASSWORD=userdev12345 +NEXT_CLOUD_PATHPREFIX="" diff --git a/app/Http/Controllers/Forms/FormUpCountryController.php b/app/Http/Controllers/Forms/FormUpCountryController.php index e28fa01..8dc04e0 100644 --- a/app/Http/Controllers/Forms/FormUpCountryController.php +++ b/app/Http/Controllers/Forms/FormUpCountryController.php @@ -6,40 +6,189 @@ use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Models\FormUpCountry; use App\Models\Rayon; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Storage; +use App\Models\Region; +use App\Models\Cabang; +use App\Models\UserHasCabang; +use App\Models\Kategori; class FormUpCountryController extends Controller { public function index() { - return view('backend.pages.forms.upcountry.index'); - } + $this->checkAuthorization(auth()->user(), ['forms.country.view']); + + $forms = FormUpCountry::with('rayon')->where('user_id', auth()->user()->id)->get(); + return view('backend.pages.forms.upcountry.index', [ + 'forms' => $forms + ]); + } public function create() { + $this->checkAuthorization(auth()->user(), ['forms.country.create']); + return view('backend.pages.forms.upcountry.create', [ 'rayons' => Rayon::all() ]); } - public function store() + public function store(Request $request) { + $this->checkAuthorization(auth()->user(), ['forms.country.create']); + $request->validate([ + 'rayon_id' => 'required|exists:rayon,id', + 'tanggal' => 'required', + 'tujuan' => 'required', + 'jarak' => 'required', + 'allowance' => 'required', + 'transport_dalkot' => 'required', + 'transport_ankot' => 'required', + 'hotel' => 'required', + 'total' => 'required', + 'bukti1' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', + 'bukti2' => 'nullable|file|mimes:xlsx,xls,csv', + 'bukti3' => 'nullable|file|mimes:pdf', + ]); + + $cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; + $region = Region::where('id', $cabang->region_id)->first(); + $kategori = Kategori::where('name', 'Up Country')->first(); + + $filePaths = []; + $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/upcountry/'; + + // check if folder not exists + // if (!Storage::disk('nextcloud')->exists(trim($folderPath, '/'))) { + // Storage::disk('nextcloud')->makeDirectory(trim($folderPath, '/')); + // } + + // Store files to Nextcloud and collect their paths + if ($request->hasFile('bukti1')) { + $filePaths['bukti1'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti1'), $request->file('bukti1')->getClientOriginalName()); + } + if ($request->hasFile('bukti2')) { + $filePaths['bukti2'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti2'), $request->file('bukti2')->getClientOriginalName()); + } + if ($request->hasFile('bukti3')) { + $filePaths['bukti3'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti3'), $request->file('bukti3')->getClientOriginalName()); + } + + // Generate sequence number and expense number + $sequence_number = FormUpCountry::withTrashed()->where('expense_number', 'like', $region->code . '-' . $cabang->code . '-UPC-' . date('ym') . '%')->count() + 1; + $formatted_sequence_number = str_pad($sequence_number, 4, '0', STR_PAD_LEFT); + $expense_number = $region->code . '-' . $cabang->code . '-UPC-' . date('ym') . $formatted_sequence_number; + + // Save the form data + FormUpCountry::create([ + 'expense_number' => $expense_number, + 'user_id' => auth()->user()->id, + 'rayon_id' => $request->rayon_id, + 'tanggal' => $request->tanggal, + 'tujuan' => $request->tujuan, + 'jarak' => $request->jarak, + 'allowance' => $request->allowance, + 'transport_dalkot' => $request->transport_dalkot, + 'transport_ankot' => $request->transport_ankot, + 'hotel' => $request->hotel, + 'total' => $request->total, + 'bukti1' => $filePaths['bukti1'] ?? null, + 'bukti2' => $filePaths['bukti2'] ?? null, + 'bukti3' => $filePaths['bukti3'] ?? null, + 'account_number' => $kategori->account_number, + 'status' => 'On Progress', + ]); + + session()->flash('success', 'Form has been created.'); + return redirect()->route('forms.up-country'); } - public function edit() + public function edit($id) { + $this->checkAuthorization(auth()->user(), ['forms.country.edit']); + + $form = FormUpCountry::with('rayon')->findOrfail($id); return view('backend.pages.forms.upcountry.edit', [ - 'rayons' => Rayon::all() + 'rayons' => Rayon::all(), + 'form' => $form ]); } - public function update() + public function update(Request $request, $id) { + $this->checkAuthorization(auth()->user(), ['forms.country.edit']); + $request->validate([ + 'rayon_id' => 'required|exists:rayon,id', + 'tanggal' => 'required', + 'tujuan' => 'required', + 'jarak' => 'required', + 'allowance' => 'required', + 'transport_dalkot' => 'required', + 'transport_ankot' => 'required', + 'hotel' => 'required', + 'total' => 'required', + 'bukti1' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', + 'bukti2' => 'nullable|file|mimes:xlsx,xls,csv', + 'bukti3' => 'nullable|file|mimes:pdf', + ]); + + $cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; + $region = Region::where('id', $cabang->region_id)->first(); + $kategori = Kategori::where('name', 'Up Country')->first(); + + $filePaths = []; + $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/upcountry/'; + + // check if folder not exists + // if (!Storage::disk('nextcloud')->exists(trim($folderPath, '/'))) { + // Storage::disk('nextcloud')->makeDirectory(trim($folderPath, '/')); + // } + + // Store files to Nextcloud and collect their paths + if ($request->hasFile('bukti1')) { + $filePaths['bukti1'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti1'), $request->file('bukti1')->getClientOriginalName()); + } + if ($request->hasFile('bukti2')) { + $filePaths['bukti2'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti2'), $request->file('bukti2')->getClientOriginalName()); + } + if ($request->hasFile('bukti3')) { + $filePaths['bukti3'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti3'), $request->file('bukti3')->getClientOriginalName()); + } + + // Save the form data + $form = FormUpCountry::findOrfail($id); + $form->update([ + 'rayon_id' => $request->rayon_id, + 'tanggal' => $request->tanggal, + 'tujuan' => $request->tujuan, + 'jarak' => $request->jarak, + 'allowance' => $request->allowance, + 'transport_dalkot' => $request->transport_dalkot, + 'transport_ankot' => $request->transport_ankot, + 'hotel' => $request->hotel, + 'total' => $request->total, + 'bukti1' => $filePaths['bukti1'] ?? $form->bukti1, + 'bukti2' => $filePaths['bukti2'] ?? $form->bukti2, + 'bukti3' => $filePaths['bukti3'] ?? $form->bukti3, + 'account_number' => $kategori->account_number, + 'status' => 'On Progress', + ]); + + session()->flash('success', 'Form has been updated.'); + return redirect()->route('forms.up-country'); } - public function destroy() + public function destroy($id) { + $this->checkAuthorization(auth()->user(), ['forms.country.delete']); + + $form = FormUpCountry::findOrfail($id); + $form->delete(); + session()->flash('success', 'Form has been deleted.'); + return redirect()->route('forms.up-country'); } } \ No newline at end of file diff --git a/app/Http/Controllers/Forms/FormVehicleController.php b/app/Http/Controllers/Forms/FormVehicleController.php new file mode 100644 index 0000000..95812bf --- /dev/null +++ b/app/Http/Controllers/Forms/FormVehicleController.php @@ -0,0 +1,183 @@ +checkAuthorization(auth()->user(), ['forms.vehicle.view']); + + $forms = FormVehicleRunningCost::where('user_id', auth()->user()->id)->get(); + return view('backend.pages.forms.vehicle.index', [ + 'forms' => $forms + ]); + } + + public function create() + { + $this->checkAuthorization(auth()->user(), ['forms.vehicle.create']); + + return view('backend.pages.forms.vehicle.create'); + } + + public function store(Request $request) + { + $this->checkAuthorization(auth()->user(), ['forms.vehicle.create']); + + $request->validate([ + 'tanggal' => 'required', + 'liter' => 'required', + 'harga' => 'required', + 'jarak' => 'required', + 'tipe_bensin' => 'required|in:pertalite,pertamax', + 'nopol' => 'required', + 'keterangan' => 'required', + 'bukti1' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', + 'bukti2' => 'nullable|file|mimes:xlsx,xls,csv', + 'bukti3' => 'nullable|file|mimes:pdf', + ]); + + $cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; + $region = Region::where('id', $cabang->region_id)->first(); + $kategori = Kategori::where('name', 'Vehicle Running Cost')->first(); + + $filePaths = []; + $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/vehicle/'; + + // check if folder not exists + // if (!Storage::disk('nextcloud')->exists(trim($folderPath, '/'))) { + // Storage::disk('nextcloud')->makeDirectory(trim($folderPath, '/')); + // } + + // Store files to Nextcloud and collect their paths + if ($request->hasFile('bukti1')) { + $filePaths['bukti1'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti1'), $request->file('bukti1')->getClientOriginalName()); + } + if ($request->hasFile('bukti2')) { + $filePaths['bukti2'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti2'), $request->file('bukti2')->getClientOriginalName()); + } + if ($request->hasFile('bukti3')) { + $filePaths['bukti3'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti3'), $request->file('bukti3')->getClientOriginalName()); + } + + // Generate sequence number and expense number + $sequence_number = FormVehicleRunningCost::withTrashed()->where('expense_number', 'like', $region->code . '-' . $cabang->code . '-VHC-' . date('ym') . '%')->count() + 1; + $formatted_sequence_number = str_pad($sequence_number, 4, '0', STR_PAD_LEFT); + $expense_number = $region->code . '-' . $cabang->code . '-VHC-' . date('ym') . $formatted_sequence_number; + + // Save the form data + FormVehicleRunningCost::create([ + 'expense_number' => $expense_number, + 'user_id' => auth()->user()->id, + 'tanggal' => $request->tanggal, + 'liter' => $request->liter, + 'harga' => $request->harga, + 'jarak' => $request->jarak, + 'tipe_bensin' => $request->tipe_bensin, + 'nopol' => $request->nopol, + 'keterangan' => $request->keterangan, + 'bukti1' => $filePaths['bukti1'] ?? null, + 'bukti2' => $filePaths['bukti2'] ?? null, + 'bukti3' => $filePaths['bukti3'] ?? null, + 'account_number' => $kategori->account_number, + 'status' => 'On Progress', + ]); + + session()->flash('success', 'Form has been created.'); + return redirect()->route('forms.vehicle'); + } + + public function edit($id) + { + $this->checkAuthorization(auth()->user(), ['forms.vehicle.edit']); + + $form = FormVehicleRunningCost::findOrfail($id); + return view('backend.pages.forms.vehicle.edit', [ + 'form' => $form + ]); + } + + public function update(Request $request, $id) + { + $this->checkAuthorization(auth()->user(), ['forms.vehicle.edit']); + + $request->validate([ + 'tanggal' => 'required', + 'liter' => 'required', + 'harga' => 'required', + 'jarak' => 'required', + 'tipe_bensin' => 'required|in:pertalite,pertamax', + 'nopol' => 'required', + 'keterangan' => 'required', + 'bukti1' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', + 'bukti2' => 'nullable|file|mimes:xlsx,xls,csv', + 'bukti3' => 'nullable|file|mimes:pdf', + ]); + + $cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; + $region = Region::where('id', $cabang->region_id)->first(); + $kategori = Kategori::where('name', 'Vehicle Running Cost')->first(); + + $filePaths = []; + $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/vehicle/'; + + // check if folder not exists + // if (!Storage::disk('nextcloud')->exists(trim($folderPath, '/'))) { + // Storage::disk('nextcloud')->makeDirectory(trim($folderPath, '/')); + // } + + // Store files to Nextcloud and collect their paths + if ($request->hasFile('bukti1')) { + $filePaths['bukti1'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti1'), $request->file('bukti1')->getClientOriginalName()); + } + if ($request->hasFile('bukti2')) { + $filePaths['bukti2'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti2'), $request->file('bukti2')->getClientOriginalName()); + } + if ($request->hasFile('bukti3')) { + $filePaths['bukti3'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti3'), $request->file('bukti3')->getClientOriginalName()); + } + + // Save the form data + $form = FormVehicleRunningCost::findOrfail($id); + $form->update([ + 'tanggal' => $request->tanggal, + 'liter' => $request->liter, + 'harga' => $request->harga, + 'jarak' => $request->jarak, + 'tipe_bensin' => $request->tipe_bensin, + 'nopol' => $request->nopol, + 'keterangan' => $request->keterangan, + 'bukti1' => $filePaths['bukti1'] ?? $form->bukti1, + 'bukti2' => $filePaths['bukti2'] ?? $form->bukti2, + 'bukti3' => $filePaths['bukti3'] ?? $form->bukti3, + 'account_number' => $kategori->account_number, + 'status' => 'On Progress', + ]); + + session()->flash('success', 'Form has been updated.'); + return redirect()->route('forms.vehicle'); + } + + public function destroy($id) + { + $this->checkAuthorization(auth()->user(), ['forms.vehicle.delete']); + + $form = FormVehicleRunningCost::findOrfail($id); + $form->delete(); + + session()->flash('success', 'Form has been deleted.'); + return redirect()->route('forms.vehicle'); + } +} \ No newline at end of file diff --git a/app/Models/FormUpCountry.php b/app/Models/FormUpCountry.php index 5cdfca3..6f2be10 100644 --- a/app/Models/FormUpCountry.php +++ b/app/Models/FormUpCountry.php @@ -28,4 +28,14 @@ class FormUpCountry extends Model 'account_number', 'status', ]; + + public function user() + { + return $this->belongsTo('App\Models\Admin'); + } + + public function rayon() + { + return $this->belongsTo('App\Models\Rayon'); + } } diff --git a/app/Models/FormVehicleRunningCost.php b/app/Models/FormVehicleRunningCost.php index 3f18764..b666677 100644 --- a/app/Models/FormVehicleRunningCost.php +++ b/app/Models/FormVehicleRunningCost.php @@ -26,4 +26,9 @@ class FormVehicleRunningCost extends Model 'account_number', 'status', ]; + + public function user() + { + return $this->belongsTo('App\Models\Admin', 'user_id'); + } } diff --git a/app/Models/UserHasCabang.php b/app/Models/UserHasCabang.php index 8a1ccdd..21a136e 100644 --- a/app/Models/UserHasCabang.php +++ b/app/Models/UserHasCabang.php @@ -14,4 +14,14 @@ class UserHasCabang extends Model 'user_id', 'cabang_id', ]; + + public function user() + { + return $this->belongsTo('App\Models\Admin'); + } + + public function cabang() + { + return $this->belongsTo('App\Models\Cabang'); + } } diff --git a/composer.json b/composer.json index 8a819be..c646c79 100644 --- a/composer.json +++ b/composer.json @@ -16,6 +16,7 @@ "laravolt/avatar": "^6.0", "nino/laravel-nextcloud-fs": "^2.0", "phpoffice/phpspreadsheet": "^3.5", + "singlequote/laravel-webdav": "^1.1", "spatie/laravel-html": "^3.11", "spatie/laravel-menu": "^4.2", "spatie/laravel-permission": "^6.10", diff --git a/composer.lock b/composer.lock index 4b406ec..fd8a12c 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": "e20816a5ac8758dcf14572597c4d7627", + "content-hash": "83771e2a711327eac79ef3f7b30673da", "packages": [ { "name": "barryvdh/laravel-dompdf", @@ -4797,6 +4797,65 @@ }, "time": "2024-09-06T07:37:46+00:00" }, + { + "name": "singlequote/laravel-webdav", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/singlequote/laravel-webdav.git", + "reference": "07bb4f177fc61b65d7dd0aaa37779a82ff100681" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/singlequote/laravel-webdav/zipball/07bb4f177fc61b65d7dd0aaa37779a82ff100681", + "reference": "07bb4f177fc61b65d7dd0aaa37779a82ff100681", + "shasum": "" + }, + "require": { + "laravel/framework": ">=10", + "league/flysystem-webdav": "^3.15", + "php": "^8.1" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "WebDav": "SingleQuote\\WebDav\\WebDavFacade" + }, + "providers": [ + "SingleQuote\\WebDav\\WebDavServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "SingleQuote\\WebDav\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Wim Pruiksma", + "email": "wim@quotec.nl", + "homepage": "https://quotec.nl/" + } + ], + "homepage": "https://github.com/singlequote/laravel-webdav", + "keywords": [ + "Flysystem", + "WebDAV", + "filesystem", + "laravel" + ], + "support": { + "issues": "https://github.com/singlequote/laravel-webdav/issues", + "source": "https://github.com/singlequote/laravel-webdav/tree/1.1.1" + }, + "time": "2024-06-07T12:41:19+00:00" + }, { "name": "spatie/laravel-html", "version": "3.11.1", diff --git a/config/filesystems.php b/config/filesystems.php index 2ac1540..1de83d6 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -58,11 +58,14 @@ return [ ], 'nextcloud' => [ - 'driver' => 'nextcloud', + 'driver' => 'webdav', 'baseUri' => env('NEXT_CLOUD_URL'), 'userName' => env('NEXT_CLOUD_USERNAME'), 'password' => env('NEXT_CLOUD_PASSWORD'), - 'directory' => '', + 'pathPrefix' => env("NEXT_CLOUD_PATHPREFIX", ''), + 'options' => [ + 'verify' => false, + ], ], ], diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php index 871b6cb..d706f7d 100644 --- a/database/seeds/DatabaseSeeder.php +++ b/database/seeds/DatabaseSeeder.php @@ -7,6 +7,7 @@ use Database\Seeds\RolePermissionSeeder; use Database\Seeds\MenuSeeder; use Database\Seeds\RayonSeeder; use Database\Seeds\RolePermissionSeeder2; +use Database\Seeds\RolePermissionSeeder3; class DatabaseSeeder extends Seeder { @@ -17,11 +18,12 @@ class DatabaseSeeder extends Seeder */ public function run() { - $this->call(UserSeeder::class); - $this->call(AdminSeeder::class); - $this->call(RolePermissionSeeder::class); - $this->call(MenuSeeder::class); - $this->call(RayonSeeder::class); - $this->call(RolePermissionSeeder2::class); + // $this->call(UserSeeder::class); + // $this->call(AdminSeeder::class); + // $this->call(RolePermissionSeeder::class); + // $this->call(MenuSeeder::class); + // $this->call(RayonSeeder::class); + // $this->call(RolePermissionSeeder2::class); + $this->call(RolePermissionSeeder3::class); } } diff --git a/database/seeds/RolePermissionSeeder3.php b/database/seeds/RolePermissionSeeder3.php new file mode 100644 index 0000000..06053a7 --- /dev/null +++ b/database/seeds/RolePermissionSeeder3.php @@ -0,0 +1,126 @@ + 'forms.country', + 'permissions' => [ + 'forms.country.view', + 'forms.country.create', + 'forms.country.edit', + 'forms.country.delete', + 'forms.country.approve', + ] + ], + [ + 'group_name' => 'forms.vehicle', + 'permissions' => [ + 'forms.vehicle.view', + 'forms.vehicle.create', + 'forms.vehicle.edit', + 'forms.vehicle.delete', + 'forms.vehicle.approve', + ] + ], + [ + 'group_name' => 'forms.entertainment', + 'permissions' => [ + 'forms.entertainment.view', + 'forms.entertainment.create', + 'forms.entertainment.edit', + 'forms.entertainment.delete', + 'forms.entertainment.approve', + ] + ], + [ + 'group_name' => 'forms.meeting', + 'permissions' => [ + 'forms.meeting.view', + 'forms.meeting.create', + 'forms.meeting.edit', + 'forms.meeting.delete', + 'forms.meeting.approve', + ] + ], + [ + 'group_name' => 'forms.other', + 'permissions' => [ + 'forms.other.view', + 'forms.other.create', + 'forms.other.edit', + 'forms.other.delete', + 'forms.other.approve', + ] + ] + ]; + + // Do same for the admin guard for tutorial purposes. + $admin = Admin::where('username', 'superadmin')->first(); + $roleSuperAdmin = $this->maybeCreateSuperAdminRole($admin); + + // Create and Assign Permissions + for ($i = 0; $i < count($permissions); $i++) { + $permissionGroup = $permissions[$i]['group_name']; + for ($j = 0; $j < count($permissions[$i]['permissions']); $j++) { + $permissionExist = Permission::where('name', $permissions[$i]['permissions'][$j])->first(); + if (is_null($permissionExist)) { + $permission = Permission::create( + [ + 'name' => $permissions[$i]['permissions'][$j], + 'group_name' => $permissionGroup, + 'guard_name' => 'admin' + ] + ); + $roleSuperAdmin->givePermissionTo($permission); + $permission->assignRole($roleSuperAdmin); + } + } + } + + // Assign super admin role permission to superadmin user + if ($admin) { + $admin->assignRole($roleSuperAdmin); + } + } + + private function maybeCreateSuperAdminRole($admin): Role + { + if (is_null($admin)) { + $roleSuperAdmin = Role::create(['name' => 'superadmin', 'guard_name' => 'admin']); + } else { + $roleSuperAdmin = Role::where('name', 'superadmin')->where('guard_name', 'admin')->first(); + } + + if (is_null($roleSuperAdmin)) { + $roleSuperAdmin = Role::create(['name' => 'superadmin', 'guard_name' => 'admin']); + } + + return $roleSuperAdmin; + } +} diff --git a/resources/views/backend/pages/forms/upcountry/create.blade.php b/resources/views/backend/pages/forms/upcountry/create.blade.php index 3205b90..a362425 100644 --- a/resources/views/backend/pages/forms/upcountry/create.blade.php +++ b/resources/views/backend/pages/forms/upcountry/create.blade.php @@ -24,12 +24,14 @@
-
+ + @csrf + @include('backend.layouts.partials.messages')
- @foreach ($rayons as $rayon) @@ -38,50 +40,50 @@
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
@@ -92,4 +94,30 @@
+ + @endsection diff --git a/resources/views/backend/pages/forms/upcountry/edit.blade.php b/resources/views/backend/pages/forms/upcountry/edit.blade.php index 546f645..5e1279b 100644 --- a/resources/views/backend/pages/forms/upcountry/edit.blade.php +++ b/resources/views/backend/pages/forms/upcountry/edit.blade.php @@ -24,72 +24,101 @@
- + + @csrf + @method('PUT') + @include('backend.layouts.partials.messages')
- @foreach ($rayons as $rayon) - + @endforeach
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
+ + @endsection diff --git a/resources/views/backend/pages/forms/upcountry/index.blade.php b/resources/views/backend/pages/forms/upcountry/index.blade.php index 515614b..2f8a739 100644 --- a/resources/views/backend/pages/forms/upcountry/index.blade.php +++ b/resources/views/backend/pages/forms/upcountry/index.blade.php @@ -26,9 +26,11 @@

List Data Forms Up Country Anda

- - Add New Expense Up Country - + @if (auth()->user()->can('forms.country.create')) + + Add New Expense Up Country + + @endif

@@ -45,41 +47,58 @@ Tujuan Jarak Allowance - Transport Dalkot - Transport Ankot - Hotel + Total Bukti 1 Bukti 2 Bukti 3 Account Number + Status Aksi - - 1 - John Doe - Rayon 1 - 2021-09-01 - Surabaya - 100 - 100000 - 10000 - 5000 - 50000 - file1.jpg - file2.jpg - file3.jpg - 1234567890 - - - - - - - - - + @foreach ($forms as $item) + + {{ $loop->iteration }} + {{ $item->user->name }} + {{ $item->rayon->code }} + {{ $item->tanggal }} + {{ $item->tujuan }} + {{ $item->jarak }} km + {{ number_format($item->allowance, 0, ',', '.') }} + {{ number_format($item->total, 0, ',', '.') }} + {{ $item->bukti1 }} + {{ $item->bukti2 }} + {{ $item->bukti3 }} + {{ $item->account_number }} + + @if ($item->status == 'On Progress') + {{ $item->status }} + @elseif ($item->status == 'Completed') + {{ $item->status }} + @else + {{ $item->status }} + @endif + + + @if (auth()->user()->can('forms.country.edit')) + + + + @endif + + @if (auth()->user()->can('forms.country.delete')) +
+ @csrf + @method('DELETE') + +
+ @endif + + + @endforeach
diff --git a/resources/views/backend/pages/forms/vehicle/create.blade.php b/resources/views/backend/pages/forms/vehicle/create.blade.php new file mode 100644 index 0000000..481f18e --- /dev/null +++ b/resources/views/backend/pages/forms/vehicle/create.blade.php @@ -0,0 +1,89 @@ +@extends('layouts.app') + +@section('title') + Dashboard +@endsection + +@section('admin-content') +
+
+
+
+

Tambahkan Expense Vehicle Running Cost Baru

+
+
+ +
+
+
+
+
+
+
+
+
+ @csrf + @include('backend.layouts.partials.messages') +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+@endsection diff --git a/resources/views/backend/pages/forms/vehicle/edit.blade.php b/resources/views/backend/pages/forms/vehicle/edit.blade.php new file mode 100644 index 0000000..9f1a6f5 --- /dev/null +++ b/resources/views/backend/pages/forms/vehicle/edit.blade.php @@ -0,0 +1,88 @@ +@extends('layouts.app') + +@section('title') + Dashboard +@endsection + +@section('admin-content') +
+
+
+
+

Edit Expense Vehicle Running Cost

+
+
+ +
+
+
+
+
+
+
+
+
+ @csrf + @method('PUT') + @include('backend.layouts.partials.messages') +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+@endsection diff --git a/resources/views/backend/pages/forms/vehicle/index.blade.php b/resources/views/backend/pages/forms/vehicle/index.blade.php new file mode 100644 index 0000000..1fd3170 --- /dev/null +++ b/resources/views/backend/pages/forms/vehicle/index.blade.php @@ -0,0 +1,109 @@ +@extends('layouts.app') + +@section('title') + Dashboard +@endsection + +@section('admin-content') +
+
+
+
+

Forms Vehicle Running Cost

+
+
+ +
+
+
+
+
+
+
+
+

List Data Forms Vehicle Running Cost Anda

+

+ @if (auth()->user()->can('forms.vehicle.create')) + + Add New Expense Vehicle Running Cost + + @endif +

+
+
+ @include('backend.layouts.partials.messages') + + + + + + + + + + + + + + + + + + + + + @foreach ($forms as $item) + + + + + + + + + + + + + + + + + @endforeach + +
#NamaTanggalLiterHargaJarakTipe BensinNomor PolisiBukti 1Bukti 2Bukti 3Account NumberStatusAksi
{{ $loop->iteration }}{{ $item->user->name }}{{ \Carbon\Carbon::parse($item->tanggal)->locale('id')->isoFormat('dddd, D MMMM Y HH:mm:ss') }}{{ $item->liter }}{{ $item->harga }}{{ $item->jarak }}{{ $item->tipe_bensin }}{{ $item->nopol }}{{ $item->bukti1 }}{{ $item->bukti2 }}{{ $item->bukti3 }}{{ $item->account_number }} + @if ($item->status == 'On Progress') + {{ $item->status }} + @elseif ($item->status == 'Completed') + {{ $item->status }} + @else + {{ $item->status }} + @endif + + @if (auth()->user()->can('forms.vehicle.edit')) + + + + @endif + + @if (auth()->user()->can('forms.vehicle.delete')) +
+ @csrf + @method('DELETE') + +
+ @endif +
+
+
+
+
+
+@endsection diff --git a/resources/views/backend/pages/roles/index.blade.php b/resources/views/backend/pages/roles/index.blade.php index a22eaa6..a1df828 100644 --- a/resources/views/backend/pages/roles/index.blade.php +++ b/resources/views/backend/pages/roles/index.blade.php @@ -25,7 +25,7 @@
-
+

{{ $pageInfo['sub_title'] }}

diff --git a/resources/views/backend/pages/users/index.blade.php b/resources/views/backend/pages/users/index.blade.php index 5d30068..ed2b44c 100644 --- a/resources/views/backend/pages/users/index.blade.php +++ b/resources/views/backend/pages/users/index.blade.php @@ -38,7 +38,7 @@
-
+

Users List

diff --git a/routes/web.php b/routes/web.php index 453304b..8f5f568 100644 --- a/routes/web.php +++ b/routes/web.php @@ -12,6 +12,8 @@ use App\Http\Controllers\Forms\FormUpCountryController; use App\Http\Controllers\Master\RayonController; use App\Http\Controllers\Master\CostCentreController; use App\Http\Controllers\Master\CategoryController; +use App\Http\Controllers\Forms\FormVehicleController; +use Illuminate\Support\Facades\Storage; Auth::routes(); @@ -70,9 +72,30 @@ Route::middleware(['auth:admin', 'menu'])->group(function () { Route::get('/up-country/edit/{id}', [FormUpCountryController::class, 'edit'])->name('forms.up-country.edit'); Route::put('/up-country/update/{id}', [FormUpCountryController::class, 'update'])->name('forms.up-country.update'); Route::delete('/up-country/destroy/{id}', [FormUpCountryController::class, 'destroy'])->name('forms.up-country.destroy'); + + // Vehicle Running Cost + Route::get('/vehicle-running-cost', [FormVehicleController::class, 'index'])->name('forms.vehicle'); + Route::get('/vehicle-running-cost/create', [FormVehicleController::class, 'create'])->name('forms.vehicle.create'); + Route::post('/vehicle-running-cost/store', [FormVehicleController::class, 'store'])->name('forms.vehicle.store'); + Route::get('/vehicle-running-cost/edit/{id}', [FormVehicleController::class, 'edit'])->name('forms.vehicle.edit'); + Route::put('/vehicle-running-cost/update/{id}', [FormVehicleController::class, 'update'])->name('forms.vehicle.update'); + Route::delete('/vehicle-running-cost/destroy/{id}', [FormVehicleController::class, 'destroy'])->name('forms.vehicle.destroy'); }); //Menu Role Route::get('/auth/menu-tree/{id}', [MenuRoleController::class, 'index'])->name('auth.menurole.index'); Route::post('/auth/menu-tree/submit', [MenuRoleController::class, 'saveMenu'])->name('auth.menurole.submit'); -}); \ No newline at end of file +}); + +Route::get('/test-nextcloud', function () { + $disk = Storage::disk('nextcloud'); + $folderPath = 'test-directory'; + + // Check if directory exists + if (!$disk->exists($folderPath)) { + $disk->makeDirectory($folderPath); + return "Directory created: $folderPath"; + } + + return "Directory already exists: $folderPath"; +}); From 24b9a828560c8e6d8ed70e8b448b6f176252729a Mon Sep 17 00:00:00 2001 From: Jagad R R Date: Wed, 18 Dec 2024 12:56:16 +0700 Subject: [PATCH 2/3] added form entertaiment and fix file upload --- .env | 2 +- app/Helpers/NextCloudHelper.php | 87 ++++++- ...ormEntertainmentPresentationController.php | 229 ++++++++++++++++++ .../Forms/FormUpCountryController.php | 82 +++++-- .../Forms/FormVehicleController.php | 82 +++++-- app/Models/FormEntertaimentPresentation.php | 5 + .../forms/entertainment/create.blade.php | 89 +++++++ .../pages/forms/entertainment/edit.blade.php | 90 +++++++ .../pages/forms/entertainment/index.blade.php | 136 +++++++++++ .../pages/forms/upcountry/index.blade.php | 35 ++- .../pages/forms/vehicle/index.blade.php | 35 ++- routes/web.php | 26 +- 12 files changed, 836 insertions(+), 62 deletions(-) create mode 100644 app/Http/Controllers/Forms/FormEntertainmentPresentationController.php create mode 100644 resources/views/backend/pages/forms/entertainment/create.blade.php create mode 100644 resources/views/backend/pages/forms/entertainment/edit.blade.php create mode 100644 resources/views/backend/pages/forms/entertainment/index.blade.php diff --git a/.env b/.env index 0750f1e..e49cef4 100644 --- a/.env +++ b/.env @@ -68,7 +68,7 @@ AWS_USE_PATH_STYLE_ENDPOINT=false VITE_APP_NAME="${APP_NAME}" -NEXT_CLOUD_URL=https://mkt.tunggal-pharma.com/remote.php/dav/files/user_dev/ +NEXT_CLOUD_URL=https://mkt.tunggal-pharma.com NEXT_CLOUD_USERNAME=user_dev NEXT_CLOUD_PASSWORD=userdev12345 NEXT_CLOUD_PATHPREFIX="" diff --git a/app/Helpers/NextCloudHelper.php b/app/Helpers/NextCloudHelper.php index cc4391e..49b78ee 100644 --- a/app/Helpers/NextCloudHelper.php +++ b/app/Helpers/NextCloudHelper.php @@ -4,6 +4,7 @@ namespace App\Helpers; use GuzzleHttp\Client; use GuzzleHttp\Exception\RequestException; +use Illuminate\Support\Str; class NextCloudHelper { @@ -19,17 +20,78 @@ class NextCloudHelper public static function createFolder($baseUrl, $username, $password, $folderPath) { $client = new Client(); - $url = rtrim($baseUrl, '/') . "/remote.php/dav/files/{$username}/" . ltrim($folderPath, '/'); - + $folders = explode('/', ltrim($folderPath, '/')); // Split the folder path into an array + $currentPath = ''; // Initialize an empty string to build the path progressively + + foreach ($folders as $folder) { + $currentPath .= '/' . $folder; // Add the current folder to the path + + // Build the URL to create the folder + $url = rtrim($baseUrl, '/') . "/mktia/remote.php/dav/files/{$username}" . $currentPath; + + try { + // Attempt to create the current folder + $response = $client->request('MKCOL', $url, [ + 'auth' => [$username, $password], + 'verify' => false // Disable SSL verification (only for testing purposes) + ]); + + // If folder creation is successful, proceed to the next folder + if ($response->getStatusCode() === 201) { + echo "Folder '$currentPath' created successfully.\n"; + } + } catch (RequestException $e) { + // Handle errors, such as folder already existing + if ($e->getCode() === 409) { + echo "Folder '$currentPath' already exists.\n"; + } else { + // For other errors + echo "Failed to create folder '$currentPath': " . $e->getMessage() . "\n"; + } + } + } + + return [ + 'success' => true, + 'status' => 200, + 'message' => 'All folders processed.' + ]; + } + + public static function uploadFile($folderPath, $fileObject, $fileName) + { + $baseUrl = env('NEXT_CLOUD_URL'); + $username = env('NEXT_CLOUD_USERNAME'); + $password= env('NEXT_CLOUD_PASSWORD'); + + // Ensure the folder exists (or create it) + $folderResponse = self::createFolder($baseUrl, $username, $password, $folderPath); + + // Check if folder creation was successful or if it already exists + if (!$folderResponse['success']) { + return [ + 'success' => false, + 'status' => $folderResponse['status'], + 'message' => 'Failed to create folder: ' . $folderResponse['message'] + ]; + } + + $client = new Client(); + $url = rtrim($baseUrl, '/') . "/mktia/remote.php/dav/files/{$username}/" . ltrim($folderPath, '/') . '/' . $fileName; + try { - $response = $client->request('MKCOL', $url, [ - 'auth' => [$username, $password] + // If fileObject is a stream, we can use it directly + // If it's raw content, ensure it's being properly passed + $response = $client->request('PUT', $url, [ + 'auth' => [$username, $password], + 'body' => $fileObject, // File content or stream + 'verify' => false // Disable SSL verification (only for testing purposes) ]); return [ 'success' => true, 'status' => $response->getStatusCode(), - 'message' => 'Folder created successfully.' + 'message' => 'File uploaded successfully.' ]; } catch (RequestException $e) { return [ @@ -39,8 +101,19 @@ class NextCloudHelper ]; } } - - + + + public static function getFileUrl($filePath) + { + $baseUrl = env('NEXT_CLOUD_URL'); + $username = env('NEXT_CLOUD_USERNAME'); + + // Build the user-specific WebDAV file URL + $relativePath = "/mktia/remote.php/dav/files/{$username}/" . ltrim($filePath, '/'); + + // Return the full accessible URL + return rtrim($baseUrl, '/') . '/' . $relativePath; + } /** * Create a user in Nextcloud. diff --git a/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php b/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php new file mode 100644 index 0000000..3960240 --- /dev/null +++ b/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php @@ -0,0 +1,229 @@ +checkAuthorization(auth()->user(), ['forms.entertainment.view']); + + $forms = FormEntertaimentPresentation::where('user_id', auth()->user()->id)->get(); + return view('backend.pages.forms.entertainment.index', [ + 'forms' => $forms + ]); + } + + public function create() + { + $this->checkAuthorization(auth()->user(), ['forms.entertainment.create']); + + return view('backend.pages.forms.entertainment.create'); + } + + public function store(Request $request) + { + $this->checkAuthorization(auth()->user(), ['forms.entertainment.create']); + + $request->validate([ + 'tanggal' => 'required', + 'jenis' => 'required|in:entertainment,presentation,sponsorship', + 'keterangan' => 'required', + 'total' => 'required|integer', + 'name' => 'required', + 'alamat' => 'required', + 'nik_or_npwp' => 'required', + 'bukti1' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', + 'bukti2' => 'nullable|file|mimes:xlsx,xls,csv', + 'bukti3' => 'nullable|file|mimes:pdf', + ]); + + $cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; + $region = Region::where('id', $cabang->region_id)->first(); + $kategori = Kategori::where('name', 'Entertainment & Presentation')->first(); + + $filePaths = []; + $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/entertainment'; + + if ($request->hasFile('bukti1')) { + $bukti1 = $request->file('bukti1'); + $filename = Str::uuid() . '.' . $bukti1->extension(); + + $filePaths['bukti1'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti1->getContent(), + $filename + ); + + } + if ($request->hasFile('bukti2')) { + $bukti2 = $request->file('bukti2'); + $filename = Str::uuid() . '.' . $bukti2->extension(); + + $filePaths['bukti2'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti2->getContent(), + $filename + ); + } + if ($request->hasFile('bukti3')) { + $bukti3 = $request->file('bukti3'); + $filename = Str::uuid() . '.' . $bukti3->extension(); + + $filePaths['bukti3'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti3->getContent(), + $filename + ); + } + + // Generate sequence number and expense number + $sequence_number = FormEntertaimentPresentation::withTrashed()->where('expense_number', 'like', $region->code . '-' . $cabang->code . '-ETY-' . date('ym') . '%')->count() + 1; + $formatted_sequence_number = str_pad($sequence_number, 4, '0', STR_PAD_LEFT); + $expense_number = $region->code . '-' . $cabang->code . '-ETY-' . date('ym') . $formatted_sequence_number; + + // Save the form data + FormEntertaimentPresentation::create([ + 'expense_number' => $expense_number, + 'user_id' => auth()->user()->id, + 'tanggal' => $request->tanggal, + 'jenis' => $request->jenis, + 'keterangan' => $request->keterangan, + 'total' => $request->total, + 'name' => $request->name, + 'alamat' => $request->alamat, + 'nik_or_npwp' => $request->nik_or_npwp, + 'bukti1' => $filePaths['bukti1'] ?? null, + 'bukti2' => $filePaths['bukti2'] ?? null, + 'bukti3' => $filePaths['bukti3'] ?? null, + 'account_number' => $kategori->account_number, + 'status' => 'On Progress', + ]); + + session()->flash('success', 'Form has been created.'); + return redirect()->route('forms.entertainment'); + } + + public function edit($id) + { + $this->checkAuthorization(auth()->user(), ['forms.entertainment.edit']); + + $form = FormEntertaimentPresentation::findOrfail($id); + return view('backend.pages.forms.entertainment.edit', [ + 'form' => $form + ]); + } + + public function update(Request $request, $id) + { + $this->checkAuthorization(auth()->user(), ['forms.entertainment.edit']); + + $request->validate([ + 'tanggal' => 'required', + 'jenis' => 'required|in:entertainment,presentation,sponsorship', + 'keterangan' => 'required', + 'total' => 'required|integer', + 'name' => 'required', + 'alamat' => 'required', + 'nik_or_npwp' => 'required', + 'bukti1' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', + 'bukti2' => 'nullable|file|mimes:xlsx,xls,csv', + 'bukti3' => 'nullable|file|mimes:pdf', + ]); + + $cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; + $region = Region::where('id', $cabang->region_id)->first(); + $kategori = Kategori::where('name', 'Entertainment & Presentation')->first(); + + $filePaths = []; + $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/entertainment/'; + + if ($request->hasFile('bukti1')) { + $bukti1 = $request->file('bukti1'); + $filename = Str::uuid() . '.' . $bukti1->extension(); + + $filePaths['bukti1'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti1->getContent(), + $filename + ); + + } + if ($request->hasFile('bukti2')) { + $bukti2 = $request->file('bukti2'); + $filename = Str::uuid() . '.' . $bukti2->extension(); + + $filePaths['bukti2'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti2->getContent(), + $filename + ); + } + if ($request->hasFile('bukti3')) { + $bukti3 = $request->file('bukti3'); + $filename = Str::uuid() . '.' . $bukti3->extension(); + + $filePaths['bukti3'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti3->getContent(), + $filename + ); + } + + // Save the form data + $form = FormEntertaimentPresentation::findOrfail($id); + $form->update([ + 'tanggal' => $request->tanggal, + 'jenis' => $request->jenis, + 'keterangan' => $request->keterangan, + 'total' => $request->total, + 'name' => $request->name, + 'alamat' => $request->alamat, + 'nik_or_npwp' => $request->nik_or_npwp, + 'bukti1' => $filePaths['bukti1'] ?? null, + 'bukti2' => $filePaths['bukti2'] ?? null, + 'bukti3' => $filePaths['bukti3'] ?? null, + 'account_number' => $kategori->account_number, + 'status' => 'On Progress', + ]); + + session()->flash('success', 'Form has been updated.'); + return redirect()->route('forms.entertainment'); + } + + public function destroy($id) + { + $this->checkAuthorization(auth()->user(), ['forms.entertainment.delete']); + + $form = FormEntertaimentPresentation::findOrfail($id); + $form->delete(); + + session()->flash('success', 'Form has been deleted.'); + return redirect()->route('forms.entertainment'); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Forms/FormUpCountryController.php b/app/Http/Controllers/Forms/FormUpCountryController.php index 8dc04e0..9eea225 100644 --- a/app/Http/Controllers/Forms/FormUpCountryController.php +++ b/app/Http/Controllers/Forms/FormUpCountryController.php @@ -12,6 +12,8 @@ use App\Models\Region; use App\Models\Cabang; use App\Models\UserHasCabang; use App\Models\Kategori; +use App\Helpers\NextCloudHelper; +use Illuminate\Support\Str; class FormUpCountryController extends Controller { @@ -60,20 +62,42 @@ class FormUpCountryController extends Controller $filePaths = []; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/upcountry/'; - // check if folder not exists - // if (!Storage::disk('nextcloud')->exists(trim($folderPath, '/'))) { - // Storage::disk('nextcloud')->makeDirectory(trim($folderPath, '/')); - // } + if ($request->hasFile('bukti1')) { + $bukti1 = $request->file('bukti1'); + $filename = Str::uuid() . '.' . $bukti1->extension(); + + $filePaths['bukti1'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti1->getContent(), + $filename + ); - // Store files to Nextcloud and collect their paths - if ($request->hasFile('bukti1')) { - $filePaths['bukti1'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti1'), $request->file('bukti1')->getClientOriginalName()); } if ($request->hasFile('bukti2')) { - $filePaths['bukti2'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti2'), $request->file('bukti2')->getClientOriginalName()); + $bukti2 = $request->file('bukti2'); + $filename = Str::uuid() . '.' . $bukti2->extension(); + + $filePaths['bukti2'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti2->getContent(), + $filename + ); } if ($request->hasFile('bukti3')) { - $filePaths['bukti3'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti3'), $request->file('bukti3')->getClientOriginalName()); + $bukti3 = $request->file('bukti3'); + $filename = Str::uuid() . '.' . $bukti3->extension(); + + $filePaths['bukti3'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti3->getContent(), + $filename + ); } // Generate sequence number and expense number @@ -142,20 +166,42 @@ class FormUpCountryController extends Controller $filePaths = []; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/upcountry/'; - // check if folder not exists - // if (!Storage::disk('nextcloud')->exists(trim($folderPath, '/'))) { - // Storage::disk('nextcloud')->makeDirectory(trim($folderPath, '/')); - // } - - // Store files to Nextcloud and collect their paths if ($request->hasFile('bukti1')) { - $filePaths['bukti1'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti1'), $request->file('bukti1')->getClientOriginalName()); + $bukti1 = $request->file('bukti1'); + $filename = Str::uuid() . '.' . $bukti1->extension(); + + $filePaths['bukti1'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti1->getContent(), + $filename + ); + } if ($request->hasFile('bukti2')) { - $filePaths['bukti2'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti2'), $request->file('bukti2')->getClientOriginalName()); + $bukti2 = $request->file('bukti2'); + $filename = Str::uuid() . '.' . $bukti2->extension(); + + $filePaths['bukti2'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti2->getContent(), + $filename + ); } if ($request->hasFile('bukti3')) { - $filePaths['bukti3'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti3'), $request->file('bukti3')->getClientOriginalName()); + $bukti3 = $request->file('bukti3'); + $filename = Str::uuid() . '.' . $bukti3->extension(); + + $filePaths['bukti3'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti3->getContent(), + $filename + ); } // Save the form data diff --git a/app/Http/Controllers/Forms/FormVehicleController.php b/app/Http/Controllers/Forms/FormVehicleController.php index 95812bf..3835042 100644 --- a/app/Http/Controllers/Forms/FormVehicleController.php +++ b/app/Http/Controllers/Forms/FormVehicleController.php @@ -12,6 +12,8 @@ use App\Models\Region; use App\Models\Cabang; use App\Models\UserHasCabang; use App\Models\Kategori; +use App\Helpers\NextCloudHelper; +use Illuminate\Support\Str; class FormVehicleController extends Controller { @@ -56,20 +58,42 @@ class FormVehicleController extends Controller $filePaths = []; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/vehicle/'; - // check if folder not exists - // if (!Storage::disk('nextcloud')->exists(trim($folderPath, '/'))) { - // Storage::disk('nextcloud')->makeDirectory(trim($folderPath, '/')); - // } + if ($request->hasFile('bukti1')) { + $bukti1 = $request->file('bukti1'); + $filename = Str::uuid() . '.' . $bukti1->extension(); + + $filePaths['bukti1'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti1->getContent(), + $filename + ); - // Store files to Nextcloud and collect their paths - if ($request->hasFile('bukti1')) { - $filePaths['bukti1'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti1'), $request->file('bukti1')->getClientOriginalName()); } if ($request->hasFile('bukti2')) { - $filePaths['bukti2'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti2'), $request->file('bukti2')->getClientOriginalName()); + $bukti2 = $request->file('bukti2'); + $filename = Str::uuid() . '.' . $bukti2->extension(); + + $filePaths['bukti2'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti2->getContent(), + $filename + ); } if ($request->hasFile('bukti3')) { - $filePaths['bukti3'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti3'), $request->file('bukti3')->getClientOriginalName()); + $bukti3 = $request->file('bukti3'); + $filename = Str::uuid() . '.' . $bukti3->extension(); + + $filePaths['bukti3'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti3->getContent(), + $filename + ); } // Generate sequence number and expense number @@ -133,20 +157,42 @@ class FormVehicleController extends Controller $filePaths = []; $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/vehicle/'; - // check if folder not exists - // if (!Storage::disk('nextcloud')->exists(trim($folderPath, '/'))) { - // Storage::disk('nextcloud')->makeDirectory(trim($folderPath, '/')); - // } - - // Store files to Nextcloud and collect their paths if ($request->hasFile('bukti1')) { - $filePaths['bukti1'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti1'), $request->file('bukti1')->getClientOriginalName()); + $bukti1 = $request->file('bukti1'); + $filename = Str::uuid() . '.' . $bukti1->extension(); + + $filePaths['bukti1'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti1->getContent(), + $filename + ); + } if ($request->hasFile('bukti2')) { - $filePaths['bukti2'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti2'), $request->file('bukti2')->getClientOriginalName()); + $bukti2 = $request->file('bukti2'); + $filename = Str::uuid() . '.' . $bukti2->extension(); + + $filePaths['bukti2'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti2->getContent(), + $filename + ); } if ($request->hasFile('bukti3')) { - $filePaths['bukti3'] = Storage::disk('nextcloud')->putFileAs($folderPath, $request->file('bukti3'), $request->file('bukti3')->getClientOriginalName()); + $bukti3 = $request->file('bukti3'); + $filename = Str::uuid() . '.' . $bukti3->extension(); + + $filePaths['bukti3'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti3->getContent(), + $filename + ); } // Save the form data diff --git a/app/Models/FormEntertaimentPresentation.php b/app/Models/FormEntertaimentPresentation.php index 02293ea..6aab6aa 100644 --- a/app/Models/FormEntertaimentPresentation.php +++ b/app/Models/FormEntertaimentPresentation.php @@ -26,4 +26,9 @@ class FormEntertaimentPresentation extends Model 'account_number', 'status', ]; + + public function user() + { + return $this->belongsTo('App\Models\Admin'); + } } diff --git a/resources/views/backend/pages/forms/entertainment/create.blade.php b/resources/views/backend/pages/forms/entertainment/create.blade.php new file mode 100644 index 0000000..72d11a1 --- /dev/null +++ b/resources/views/backend/pages/forms/entertainment/create.blade.php @@ -0,0 +1,89 @@ +@extends('layouts.app') + +@section('title') + Dashboard +@endsection + +@section('admin-content') +
+
+
+
+

Tambahkan Expense Entertainment & Presentation

+
+
+ +
+
+
+
+
+
+
+
+
+ @csrf + @include('backend.layouts.partials.messages') +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+@endsection diff --git a/resources/views/backend/pages/forms/entertainment/edit.blade.php b/resources/views/backend/pages/forms/entertainment/edit.blade.php new file mode 100644 index 0000000..768892d --- /dev/null +++ b/resources/views/backend/pages/forms/entertainment/edit.blade.php @@ -0,0 +1,90 @@ +@extends('layouts.app') + +@section('title') + Dashboard +@endsection + +@section('admin-content') +
+
+
+
+

Edit Expense Entertainment & Presentation

+
+
+ +
+
+
+
+
+
+
+
+
+ @csrf + @method('PUT') + @include('backend.layouts.partials.messages') +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+@endsection diff --git a/resources/views/backend/pages/forms/entertainment/index.blade.php b/resources/views/backend/pages/forms/entertainment/index.blade.php new file mode 100644 index 0000000..5c548a3 --- /dev/null +++ b/resources/views/backend/pages/forms/entertainment/index.blade.php @@ -0,0 +1,136 @@ +@extends('layouts.app') + +@section('title') + Dashboard +@endsection + +@section('admin-content') +
+
+
+
+

Forms Entertainment & Presentation

+
+
+ +
+
+
+
+
+
+
+
+

List Data Forms Entertainment & Presentation

+

+ @if (auth()->user()->can('forms.entertainment.create')) + + Add New Expense Entertainment & Presentation + + @endif +

+
+
+ @include('backend.layouts.partials.messages') + + + + + + + + + + + + + + + + + + + + + @php + use App\Helpers\NextCloudHelper; + @endphp + @foreach ($forms as $item) + + + + + + + + + + + + + + + + + @endforeach + +
#NamaTanggalJenisKeteranganTotalNama PenerimaNPWP / NIKBukti 1Bukti 2Bukti 3Account NumberStatusAksi
{{ $loop->iteration }}{{ $item->user->name }}{{ \Carbon\Carbon::parse($item->tanggal)->locale('id')->isoFormat('D MMMM Y') }}{{ $item->jenis }}{{ $item->keterangan }}{{ number_format($item->total, 0, ',', '.') }}{{ $item->name }}{{ $item->nik_or_npwp }} + @if ($item->bukti1) + + Download + + @else + - + @endif + + @if ($item->bukti2) + + Download + + @else + - + @endif + + @if ($item->bukti3) + + Download + + @else + - + @endif + {{ $item->account_number }} + @if ($item->status == 'On Progress') + {{ $item->status }} + @elseif ($item->status == 'Completed') + {{ $item->status }} + @else + {{ $item->status }} + @endif + + @if (auth()->user()->can('forms.entertainment.edit')) + + + + @endif + + @if (auth()->user()->can('forms.entertainment.delete')) +
+ @csrf + @method('DELETE') + +
+ @endif +
+
+
+
+
+
+@endsection diff --git a/resources/views/backend/pages/forms/upcountry/index.blade.php b/resources/views/backend/pages/forms/upcountry/index.blade.php index 2f8a739..7864948 100644 --- a/resources/views/backend/pages/forms/upcountry/index.blade.php +++ b/resources/views/backend/pages/forms/upcountry/index.blade.php @@ -57,19 +57,46 @@ + @php + use App\Helpers\NextCloudHelper; + @endphp @foreach ($forms as $item) {{ $loop->iteration }} {{ $item->user->name }} {{ $item->rayon->code }} - {{ $item->tanggal }} + {{ \Carbon\Carbon::parse($item->tanggal)->locale('id')->isoFormat('D MMMM Y') }} {{ $item->tujuan }} {{ $item->jarak }} km {{ number_format($item->allowance, 0, ',', '.') }} {{ number_format($item->total, 0, ',', '.') }} - {{ $item->bukti1 }} - {{ $item->bukti2 }} - {{ $item->bukti3 }} + + @if ($item->bukti1) + + Download + + @else + - + @endif + + + @if ($item->bukti2) + + Download + + @else + - + @endif + + + @if ($item->bukti3) + + Download + + @else + - + @endif + {{ $item->account_number }} @if ($item->status == 'On Progress') diff --git a/resources/views/backend/pages/forms/vehicle/index.blade.php b/resources/views/backend/pages/forms/vehicle/index.blade.php index 1fd3170..498f96e 100644 --- a/resources/views/backend/pages/forms/vehicle/index.blade.php +++ b/resources/views/backend/pages/forms/vehicle/index.blade.php @@ -57,19 +57,46 @@ + @php + use App\Helpers\NextCloudHelper; + @endphp @foreach ($forms as $item) {{ $loop->iteration }} {{ $item->user->name }} {{ \Carbon\Carbon::parse($item->tanggal)->locale('id')->isoFormat('dddd, D MMMM Y HH:mm:ss') }} {{ $item->liter }} - {{ $item->harga }} + {{ number_format($item->harga, 0, ',', '.') }} {{ $item->jarak }} {{ $item->tipe_bensin }} {{ $item->nopol }} - {{ $item->bukti1 }} - {{ $item->bukti2 }} - {{ $item->bukti3 }} + + @if ($item->bukti1) + + Download + + @else + - + @endif + + + @if ($item->bukti2) + + Download + + @else + - + @endif + + + @if ($item->bukti3) + + Download + + @else + - + @endif + {{ $item->account_number }} @if ($item->status == 'On Progress') diff --git a/routes/web.php b/routes/web.php index 8f5f568..cf0aab8 100644 --- a/routes/web.php +++ b/routes/web.php @@ -13,7 +13,9 @@ use App\Http\Controllers\Master\RayonController; use App\Http\Controllers\Master\CostCentreController; use App\Http\Controllers\Master\CategoryController; use App\Http\Controllers\Forms\FormVehicleController; +use App\Http\Controllers\Forms\FormEntertainmentPresentationController; use Illuminate\Support\Facades\Storage; +use App\Helpers\NextCloudHelper; Auth::routes(); @@ -80,6 +82,14 @@ Route::middleware(['auth:admin', 'menu'])->group(function () { Route::get('/vehicle-running-cost/edit/{id}', [FormVehicleController::class, 'edit'])->name('forms.vehicle.edit'); Route::put('/vehicle-running-cost/update/{id}', [FormVehicleController::class, 'update'])->name('forms.vehicle.update'); Route::delete('/vehicle-running-cost/destroy/{id}', [FormVehicleController::class, 'destroy'])->name('forms.vehicle.destroy'); + + // Entertainment & Presentation + Route::get('/entertainment-presentation', [FormEntertainmentPresentationController::class, 'index'])->name('forms.entertainment'); + Route::get('/entertainment-presentation/create', [FormEntertainmentPresentationController::class, 'create'])->name('forms.entertainment.create'); + Route::post('/entertainment-presentation/store', [FormEntertainmentPresentationController::class, 'store'])->name('forms.entertainment.store'); + Route::get('/entertainment-presentation/edit/{id}', [FormEntertainmentPresentationController::class, 'edit'])->name('forms.entertainment.edit'); + Route::put('/entertainment-presentation/update/{id}', [FormEntertainmentPresentationController::class, 'update'])->name('forms.entertainment.update'); + Route::delete('/entertainment-presentation/destroy/{id}', [FormEntertainmentPresentationController::class, 'destroy'])->name('forms.entertainment.destroy'); }); //Menu Role @@ -88,14 +98,10 @@ Route::middleware(['auth:admin', 'menu'])->group(function () { }); Route::get('/test-nextcloud', function () { - $disk = Storage::disk('nextcloud'); - $folderPath = 'test-directory'; - - // Check if directory exists - if (!$disk->exists($folderPath)) { - $disk->makeDirectory($folderPath); - return "Directory created: $folderPath"; - } - - return "Directory already exists: $folderPath"; + $baseUrl = env('NEXT_CLOUD_URL'); + $adminUsername = env('NEXT_CLOUD_USERNAME'); + $adminPassword = env('NEXT_CLOUD_PASSWORD'); + + $response = NextCloudHelper::createFolder($baseUrl, $adminUsername, $adminPassword, 'test-folder'); + dd($response); }); From cd28280fb630db8abf30e6de2f27348387d479da Mon Sep 17 00:00:00 2001 From: Jagad R R Date: Thu, 19 Dec 2024 10:51:27 +0700 Subject: [PATCH 3/3] added crud for form meeting & seminar --- ...ormEntertainmentPresentationController.php | 6 +- .../Forms/FormMeetingSeminarController.php | 217 ++++++++++++++++++ .../Forms/FormUpCountryController.php | 4 +- .../Forms/FormVehicleController.php | 4 +- app/Models/FormMeetingSeminar.php | 5 + .../pages/forms/meeting/create.blade.php | 124 ++++++++++ .../pages/forms/meeting/edit.blade.php | 125 ++++++++++ .../pages/forms/meeting/index.blade.php | 134 +++++++++++ .../views/layouts/partials/scripts.blade.php | 1 + routes/web.php | 9 + 10 files changed, 622 insertions(+), 7 deletions(-) create mode 100644 app/Http/Controllers/Forms/FormMeetingSeminarController.php create mode 100644 resources/views/backend/pages/forms/meeting/create.blade.php create mode 100644 resources/views/backend/pages/forms/meeting/edit.blade.php create mode 100644 resources/views/backend/pages/forms/meeting/index.blade.php diff --git a/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php b/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php index 3960240..5c5e62e 100644 --- a/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php +++ b/app/Http/Controllers/Forms/FormEntertainmentPresentationController.php @@ -42,7 +42,7 @@ class FormEntertainmentPresentationController extends Controller 'tanggal' => 'required', 'jenis' => 'required|in:entertainment,presentation,sponsorship', 'keterangan' => 'required', - 'total' => 'required|integer', + 'total' => 'required', 'name' => 'required', 'alamat' => 'required', 'nik_or_npwp' => 'required', @@ -141,7 +141,7 @@ class FormEntertainmentPresentationController extends Controller 'tanggal' => 'required', 'jenis' => 'required|in:entertainment,presentation,sponsorship', 'keterangan' => 'required', - 'total' => 'required|integer', + 'total' => 'required', 'name' => 'required', 'alamat' => 'required', 'nik_or_npwp' => 'required', @@ -155,7 +155,7 @@ class FormEntertainmentPresentationController extends Controller $kategori = Kategori::where('name', 'Entertainment & Presentation')->first(); $filePaths = []; - $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/entertainment/'; + $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/entertainment'; if ($request->hasFile('bukti1')) { $bukti1 = $request->file('bukti1'); diff --git a/app/Http/Controllers/Forms/FormMeetingSeminarController.php b/app/Http/Controllers/Forms/FormMeetingSeminarController.php new file mode 100644 index 0000000..90b1ee1 --- /dev/null +++ b/app/Http/Controllers/Forms/FormMeetingSeminarController.php @@ -0,0 +1,217 @@ +checkAuthorization(auth()->user(), ['forms.meeting.view']); + + $forms = FormMeetingSeminar::where('user_id', auth()->user()->id)->get(); + return view('backend.pages.forms.meeting.index', [ + 'forms' => $forms + ]); + } + + public function create() + { + $this->checkAuthorization(auth()->user(), ['forms.meeting.create']); + + return view('backend.pages.forms.meeting.create'); + } + + public function store(Request $request) + { + $this->checkAuthorization(auth()->user(), ['forms.meeting.create']); + + $request->validate([ + 'allowance' => 'required', + 'transport_ankot' => 'required', + 'hotel' => 'required', + 'total' => 'required', + 'bukti1' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', + 'bukti2' => 'nullable|file|mimes:xlsx,xls,csv', + 'bukti3' => 'nullable|file|mimes:pdf', + ]); + + $cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; + $region = Region::where('id', $cabang->region_id)->first(); + $kategori = Kategori::where('name', 'Meeting & Seminar')->first(); + + $filePaths = []; + $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/meeting'; + + if ($request->hasFile('bukti1')) { + $bukti1 = $request->file('bukti1'); + $filename = Str::uuid() . '.' . $bukti1->extension(); + + $filePaths['bukti1'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti1->getContent(), + $filename + ); + + } + if ($request->hasFile('bukti2')) { + $bukti2 = $request->file('bukti2'); + $filename = Str::uuid() . '.' . $bukti2->extension(); + + $filePaths['bukti2'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti2->getContent(), + $filename + ); + } + if ($request->hasFile('bukti3')) { + $bukti3 = $request->file('bukti3'); + $filename = Str::uuid() . '.' . $bukti3->extension(); + + $filePaths['bukti3'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti3->getContent(), + $filename + ); + } + + // Generate sequence number and expense number + $sequence_number = FormMeetingSeminar::withTrashed()->where('expense_number', 'like', $region->code . '-' . $cabang->code . '-MTG-' . date('ym') . '%')->count() + 1; + $formatted_sequence_number = str_pad($sequence_number, 4, '0', STR_PAD_LEFT); + $expense_number = $region->code . '-' . $cabang->code . '-MTG-' . date('ym') . $formatted_sequence_number; + + // Save the form data + FormMeetingSeminar::create([ + 'expense_number' => $expense_number, + 'user_id' => auth()->user()->id, + 'allowance' => $request->allowance, + 'transport_ankot' => $request->transport_ankot, + 'hotel' => $request->hotel, + 'total' => $request->total, + 'bukti1' => $filePaths['bukti1'] ?? null, + 'bukti2' => $filePaths['bukti2'] ?? null, + 'bukti3' => $filePaths['bukti3'] ?? null, + 'account_number' => $kategori->account_number, + 'status' => 'On Progress', + ]); + + session()->flash('success', 'Form has been created.'); + return redirect()->route('forms.meeting'); + } + + public function edit($id) + { + $this->checkAuthorization(auth()->user(), ['forms.meeting.edit']); + + $form = FormMeetingSeminar::findOrfail($id); + return view('backend.pages.forms.meeting.edit', [ + 'form' => $form + ]); + } + + public function update(Request $request, $id) + { + $this->checkAuthorization(auth()->user(), ['forms.meeting.edit']); + + $request->validate([ + 'allowance' => 'required', + 'transport_ankot' => 'required', + 'hotel' => 'required', + 'total' => 'required', + 'bukti1' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', + 'bukti2' => 'nullable|file|mimes:xlsx,xls,csv', + 'bukti3' => 'nullable|file|mimes:pdf', + ]); + + $cabang = UserHasCabang::with('cabang')->where('user_id', auth()->user()->id)->first()->cabang; + $region = Region::where('id', $cabang->region_id)->first(); + $kategori = Kategori::where('name', 'Meeting & Seminar')->first(); + + $filePaths = []; + $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/meeting'; + + if ($request->hasFile('bukti1')) { + $bukti1 = $request->file('bukti1'); + $filename = Str::uuid() . '.' . $bukti1->extension(); + + $filePaths['bukti1'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti1->getContent(), + $filename + ); + + } + if ($request->hasFile('bukti2')) { + $bukti2 = $request->file('bukti2'); + $filename = Str::uuid() . '.' . $bukti2->extension(); + + $filePaths['bukti2'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti2->getContent(), + $filename + ); + } + if ($request->hasFile('bukti3')) { + $bukti3 = $request->file('bukti3'); + $filename = Str::uuid() . '.' . $bukti3->extension(); + + $filePaths['bukti3'] = $folderPath . '/' . $filename; + + NextCloudHelper::uploadFile( + $folderPath, + $bukti3->getContent(), + $filename + ); + } + + // Save the form data + $form = FormMeetingSeminar::findOrfail($id); + $form->update([ + 'allowance' => $request->allowance, + 'transport_ankot' => $request->transport_ankot, + 'hotel' => $request->hotel, + 'total' => $request->total, + 'bukti1' => $filePaths['bukti1'] ?? $form->bukti1, + 'bukti2' => $filePaths['bukti2'] ?? $form->bukti2, + 'bukti3' => $filePaths['bukti3'] ?? $form->bukti3, + 'account_number' => $kategori->account_number, + 'status' => 'On Progress', + ]); + + session()->flash('success', 'Form has been updated.'); + return redirect()->route('forms.meeting'); + } + + public function destroy($id) + { + $this->checkAuthorization(auth()->user(), ['forms.meeting.delete']); + + $form = FormMeetingSeminar::findOrfail($id); + $form->delete(); + + session()->flash('success', 'Form has been deleted.'); + return redirect()->route('forms.meeting'); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Forms/FormUpCountryController.php b/app/Http/Controllers/Forms/FormUpCountryController.php index 9eea225..a352504 100644 --- a/app/Http/Controllers/Forms/FormUpCountryController.php +++ b/app/Http/Controllers/Forms/FormUpCountryController.php @@ -60,7 +60,7 @@ class FormUpCountryController extends Controller $kategori = Kategori::where('name', 'Up Country')->first(); $filePaths = []; - $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/upcountry/'; + $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/upcountry'; if ($request->hasFile('bukti1')) { $bukti1 = $request->file('bukti1'); @@ -164,7 +164,7 @@ class FormUpCountryController extends Controller $kategori = Kategori::where('name', 'Up Country')->first(); $filePaths = []; - $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/upcountry/'; + $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/upcountry'; if ($request->hasFile('bukti1')) { $bukti1 = $request->file('bukti1'); diff --git a/app/Http/Controllers/Forms/FormVehicleController.php b/app/Http/Controllers/Forms/FormVehicleController.php index 3835042..b35716e 100644 --- a/app/Http/Controllers/Forms/FormVehicleController.php +++ b/app/Http/Controllers/Forms/FormVehicleController.php @@ -56,7 +56,7 @@ class FormVehicleController extends Controller $kategori = Kategori::where('name', 'Vehicle Running Cost')->first(); $filePaths = []; - $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/vehicle/'; + $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/vehicle'; if ($request->hasFile('bukti1')) { $bukti1 = $request->file('bukti1'); @@ -155,7 +155,7 @@ class FormVehicleController extends Controller $kategori = Kategori::where('name', 'Vehicle Running Cost')->first(); $filePaths = []; - $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/vehicle/'; + $folderPath = '/expense/' . $region->code . '/' . $cabang->code . '/vehicle'; if ($request->hasFile('bukti1')) { $bukti1 = $request->file('bukti1'); diff --git a/app/Models/FormMeetingSeminar.php b/app/Models/FormMeetingSeminar.php index c6b949d..574c311 100644 --- a/app/Models/FormMeetingSeminar.php +++ b/app/Models/FormMeetingSeminar.php @@ -23,4 +23,9 @@ class FormMeetingSeminar extends Model 'account_number', 'status', ]; + + public function user() + { + return $this->belongsTo(Admin::class, 'user_id'); + } } diff --git a/resources/views/backend/pages/forms/meeting/create.blade.php b/resources/views/backend/pages/forms/meeting/create.blade.php new file mode 100644 index 0000000..e19a0ef --- /dev/null +++ b/resources/views/backend/pages/forms/meeting/create.blade.php @@ -0,0 +1,124 @@ +@extends('layouts.app') + +@section('title') + Dashboard +@endsection + +@section('admin-content') + + +
+
+
+
+

Tambahkan Expense Meeting & Seminar Baru

+
+
+ +
+
+
+
+
+
+
+
+
+ @csrf + @include('backend.layouts.partials.messages') +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+ + + + +@endsection diff --git a/resources/views/backend/pages/forms/meeting/edit.blade.php b/resources/views/backend/pages/forms/meeting/edit.blade.php new file mode 100644 index 0000000..6d9838f --- /dev/null +++ b/resources/views/backend/pages/forms/meeting/edit.blade.php @@ -0,0 +1,125 @@ +@extends('layouts.app') + +@section('title') + Dashboard +@endsection + +@section('admin-content') + + +
+
+
+
+

Edit Expense Meeting & Seminar

+
+
+ +
+
+
+
+
+
+
+
+
+ @csrf + @method('PUT') + @include('backend.layouts.partials.messages') +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+ + + + +@endsection diff --git a/resources/views/backend/pages/forms/meeting/index.blade.php b/resources/views/backend/pages/forms/meeting/index.blade.php new file mode 100644 index 0000000..00bcf64 --- /dev/null +++ b/resources/views/backend/pages/forms/meeting/index.blade.php @@ -0,0 +1,134 @@ +@extends('layouts.app') + +@section('title') + Dashboard +@endsection + +@section('admin-content') +
+
+
+
+

Forms Meeting Seminar

+
+
+ +
+
+
+
+
+
+
+
+

List Data Forms Meeting Seminar Anda

+

+ @if (auth()->user()->can('forms.meeting.create')) + + Add New Expense Meeting Seminar + + @endif +

+
+
+ @include('backend.layouts.partials.messages') + + + + + + + + + + + + + + + + + + + + @php + use App\Helpers\NextCloudHelper; + @endphp + @foreach ($forms as $item) + + + + + + + + + + + + + + + + @endforeach + +
#NamaTanggalAllowanceTransport AnkotHotelTotalBukti 1Bukti 2Bukti 3Account NumberStatusAksi
{{ $loop->iteration }}{{ $item->user->name }}{{ \Carbon\Carbon::parse($item->created_at)->locale('id')->isoFormat('D MMMM Y') }}{{ number_format($item->allowance, 0, ',', '.') }}{{ number_format($item->transport_ankot, 0, ',', '.') }}{{ number_format($item->hotel, 0, ',', '.') }}{{ number_format($item->total, 0, ',', '.') }} + @if ($item->bukti1) + + Download + + @else + - + @endif + + @if ($item->bukti2) + + Download + + @else + - + @endif + + @if ($item->bukti3) + + Download + + @else + - + @endif + {{ $item->account_number }} + @if ($item->status == 'On Progress') + {{ $item->status }} + @elseif ($item->status == 'Completed') + {{ $item->status }} + @else + {{ $item->status }} + @endif + + @if (auth()->user()->can('forms.meeting.edit')) + + + + @endif + + @if (auth()->user()->can('forms.meeting.delete')) +
+ @csrf + @method('DELETE') + +
+ @endif +
+
+
+
+
+
+@endsection diff --git a/resources/views/layouts/partials/scripts.blade.php b/resources/views/layouts/partials/scripts.blade.php index 371f808..a619aeb 100644 --- a/resources/views/layouts/partials/scripts.blade.php +++ b/resources/views/layouts/partials/scripts.blade.php @@ -15,6 +15,7 @@ +