diff --git a/app/Enums/PriceRequestStatus.php b/app/Enums/PriceRequestStatus.php new file mode 100644 index 0000000..1e8c1a6 --- /dev/null +++ b/app/Enums/PriceRequestStatus.php @@ -0,0 +1,33 @@ + 'Menunggu', + self::APPROVED => 'Disetujui', + self::REJECTED => 'Ditolak', + }; + } + + public function color() + { + return match ($this) { + self::PENDING => 'gray', + self::APPROVED => 'emerald', + self::REJECTED => 'red', + }; + } +} diff --git a/app/Livewire/Datatable/Studio/Catalog/BottlesTable.php b/app/Livewire/Datatable/Studio/Catalog/BottlesTable.php index a23d54a..41a0b7d 100644 --- a/app/Livewire/Datatable/Studio/Catalog/BottlesTable.php +++ b/app/Livewire/Datatable/Studio/Catalog/BottlesTable.php @@ -21,10 +21,16 @@ class BottlesTable extends DataTableComponent protected $model = Bottle::class; - protected ?int $refreshTime = 3000; + protected int $refreshTime = 3000; public function columns(): array { + $canSeePrice = PriceRequest::where('user_id', auth()->id()) + ->where('module', 'botol') + ->approved() + ->where('finalized_at', '>', now()->subMinute(10)) + ->exists(); + return [ Column::make('Nama') ->label(function ($row) { @@ -42,13 +48,7 @@ public function columns(): array ->html(), Column::make('Harga Beli', 'cost_price') - ->label(function ($row) { - $canSeePrice = PriceRequest::where('user_id', auth()->id()) - ->where('model', Bottle::class) - ->whereNotNull('approved_at') - ->where('expires_at', '>', now()) - ->exists(); - + ->label(function ($row) use ($canSeePrice) { if ($canSeePrice) { return currency($row->cost_price, 'Rp'); } @@ -69,22 +69,22 @@ public function columns(): array ->hideIf(! auth()->user()->hasRole(['Developer', 'Owner'])), Column::make('Harga Jual', 'sale_price') - ->label(fn ($row, $column) => currency($row->sale_price, 'Rp')) + ->label(fn($row, $column) => currency($row->sale_price, 'Rp')) ->searchable() ->sortable(), ImageColumn::make('Gambar') - ->location(fn ($row) => optional($row->getMedia('image')->first())->getUrl() ?? asset('assets/images/logo.png')) - ->attributes(fn ($row) => [ + ->location(fn($row) => optional($row->getMedia('image')->first())->getUrl() ?? asset('assets/images/logo.png')) + ->attributes(fn($row) => [ 'style' => 'width: 50px; height: 50px;', 'alt' => $row->name, ]), ArrayColumn::make('Outlet') ->data( - fn ($value, $row) => $row->outlets - ->filter(fn ($outlet) => auth()->user()->outlets->pluck('id')->contains($outlet->id)) - ->map(fn ($outlet) => [ + fn($value, $row) => $row->outlets + ->filter(fn($outlet) => auth()->user()->outlets->pluck('id')->contains($outlet->id)) + ->map(fn($outlet) => [ 'id' => $outlet->hash, 'bottle_id' => $row->hash, 'name' => $outlet->name, @@ -96,7 +96,7 @@ public function columns(): array $canAudit = auth()->user()->can('audit bottle'); $tag = $canAudit ? 'div' : 'a'; - $attrs = $canAudit ? '' : 'href="'.$route.'" wire:navigate'; + $attrs = $canAudit ? '' : 'href="' . $route . '" wire:navigate'; return Blade::render(" <{$tag} {$attrs} @@ -142,7 +142,7 @@ public function builder(): Builder ->with('outlets') ->whereHas( 'outlets', - fn ($q) => $q->whereIn('outlets.id', auth()->user()->outlets()->pluck('outlets.id')) + fn($q) => $q->whereIn('outlets.id', auth()->user()->outlets()->pluck('outlets.id')) ); } } diff --git a/app/Livewire/Datatable/Studio/Catalog/PerfumesTable.php b/app/Livewire/Datatable/Studio/Catalog/PerfumesTable.php index ccfb7d8..57b8f64 100644 --- a/app/Livewire/Datatable/Studio/Catalog/PerfumesTable.php +++ b/app/Livewire/Datatable/Studio/Catalog/PerfumesTable.php @@ -20,10 +20,16 @@ class PerfumesTable extends DataTableComponent protected $model = Perfume::class; - protected ?int $refreshTime = 3000; + protected $refreshTime = 3000; public function columns(): array { + $canSeePrice = PriceRequest::where('user_id', auth()->id()) + ->where('module', 'parfum') + ->approved() + ->where('finalized_at', '>', now()->subMinute(10)) + ->exists(); + return [ Column::make('Nama') ->label(function ($row) { @@ -41,24 +47,18 @@ public function columns(): array ->html(), ArrayColumn::make('Kategori') - ->data(fn ($value, $row) => $row->categories->pluck('name')->toArray()) - ->outputFormat(fn ($index, $value) => Blade::render(''.$value.'')) + ->data(fn($value, $row) => $row->categories->pluck('name')->toArray()) + ->outputFormat(fn($index, $value) => Blade::render('' . $value . '')) ->flexRow(['class' => 'gap-2 flex-wrap']), Column::make('Merek', 'brand.name')->searchable()->sortable(), Column::make('Concentration', 'concentration') - ->label(fn ($row, $column) => Blade::render(''.$row->concentration->label().'')) + ->label(fn($row, $column) => Blade::render('' . $row->concentration->label() . '')) ->html(), Column::make('Harga Beli', 'cost_price') - ->label(function ($row) { - $canSeePrice = PriceRequest::where('user_id', auth()->id()) - ->where('model', Perfume::class) - ->whereNotNull('approved_at') - ->where('expires_at', '>', now()) - ->exists(); - + ->label(function ($row) use ($canSeePrice) { if ($canSeePrice) { return currency($row->cost_price, 'Rp'); } @@ -79,15 +79,15 @@ public function columns(): array ->hideIf(! auth()->user()->hasRole(['Developer', 'Owner'])), Column::make('Harga Jual', 'sale_price') - ->label(fn ($row, $column) => currency($row->sale_price, 'Rp')) + ->label(fn($row, $column) => currency($row->sale_price, 'Rp')) ->searchable() ->sortable(), ArrayColumn::make('Outlet') ->data( - fn ($value, $row) => $row->outlets - ->filter(fn ($outlet) => auth()->user()->outlets->pluck('id')->contains($outlet->id)) - ->map(fn ($outlet) => [ + fn($value, $row) => $row->outlets + ->filter(fn($outlet) => auth()->user()->outlets->pluck('id')->contains($outlet->id)) + ->map(fn($outlet) => [ 'id' => $outlet->hash, 'perfume_id' => $row->hash, 'name' => $outlet->name, @@ -99,7 +99,7 @@ public function columns(): array $canAudit = auth()->user()->can('audit perfume'); $tag = $canAudit ? 'div' : 'a'; - $attrs = $canAudit ? '' : 'href="'.$route.'" wire:navigate'; + $attrs = $canAudit ? '' : 'href="' . $route . '" wire:navigate'; return Blade::render(" <{$tag} {$attrs} @@ -159,7 +159,7 @@ public function builder(): Builder ]) ->whereHas( 'outlets', - fn ($q) => $q->whereIn('outlets.id', auth()->user()->outlets()->pluck('outlets.id')) + fn($q) => $q->whereIn('outlets.id', auth()->user()->outlets()->pluck('outlets.id')) ); } } diff --git a/app/Livewire/Datatable/Studio/Catalog/ProductsTable.php b/app/Livewire/Datatable/Studio/Catalog/ProductsTable.php index 59cb4bc..5d93fd0 100644 --- a/app/Livewire/Datatable/Studio/Catalog/ProductsTable.php +++ b/app/Livewire/Datatable/Studio/Catalog/ProductsTable.php @@ -20,10 +20,16 @@ class ProductsTable extends DataTableComponent protected $model = Product::class; - protected ?int $refreshTime = 3000; + protected int $refreshTime = 3000; public function columns(): array { + $canSeePrice = PriceRequest::where('user_id', auth()->id()) + ->where('module', 'produk') + ->approved() + ->where('finalized_at', '>', now()->subMinute(10)) + ->exists(); + return [ Column::make('Nama') ->label(function ($row) { @@ -41,13 +47,7 @@ public function columns(): array ->html(), Column::make('Harga Beli', 'cost_price') - ->label(function ($row) { - $canSeePrice = PriceRequest::where('user_id', auth()->id()) - ->where('model', Product::class) - ->whereNotNull('approved_at') - ->where('expires_at', '>', now()) - ->exists(); - + ->label(function ($row) use ($canSeePrice) { if ($canSeePrice) { return currency($row->cost_price, 'Rp'); } @@ -68,15 +68,15 @@ public function columns(): array ->hideIf(! auth()->user()->hasRole(['Developer', 'Owner'])), Column::make('Harga Jual', 'sale_price') - ->label(fn ($row, $column) => currency($row->sale_price, 'Rp')) + ->label(fn($row, $column) => currency($row->sale_price, 'Rp')) ->searchable() ->sortable(), ArrayColumn::make('Outlet') ->data( - fn ($value, $row) => $row->outlets - ->filter(fn ($outlet) => auth()->user()->outlets->pluck('id')->contains($outlet->id)) - ->map(fn ($outlet) => [ + fn($value, $row) => $row->outlets + ->filter(fn($outlet) => auth()->user()->outlets->pluck('id')->contains($outlet->id)) + ->map(fn($outlet) => [ 'id' => $outlet->hash, 'product_id' => $row->hash, 'name' => $outlet->name, @@ -88,7 +88,7 @@ public function columns(): array $canAudit = auth()->user()->can('audit product'); $tag = $canAudit ? 'div' : 'a'; - $attrs = $canAudit ? '' : 'href="'.$route.'" wire:navigate'; + $attrs = $canAudit ? '' : 'href="' . $route . '" wire:navigate'; return Blade::render(" <{$tag} {$attrs} @@ -134,7 +134,7 @@ public function builder(): Builder ->with('outlets') ->whereHas( 'outlets', - fn ($q) => $q->whereIn('outlets.id', auth()->user()->outlets()->pluck('outlets.id')) + fn($q) => $q->whereIn('outlets.id', auth()->user()->outlets()->pluck('outlets.id')) ); } } diff --git a/app/Livewire/Datatable/Studio/Manage/PriceRequestsTable.php b/app/Livewire/Datatable/Studio/Manage/PriceRequestsTable.php new file mode 100644 index 0000000..eb9252d --- /dev/null +++ b/app/Livewire/Datatable/Studio/Manage/PriceRequestsTable.php @@ -0,0 +1,106 @@ +searchable(), + + Column::make('module', 'module') + ->format(fn($row) => ucfirst($row)) + ->searchable(), + + Column::make('Status', 'status') + ->label(fn($row, $column) => Blade::render('' . $row->status->label() . '')) + ->html(), + + Column::make('Tanggal') + ->label(function ($row) { + $startDate = formatDate($row->created_at); + $startAgo = timeAgo($row->created_at); + + $endDate = formatDate($row->finalized_at); + $endAgo = timeAgo($row->finalized_at); + + return << +
+ Tgl Permohonan: + {$startDate} + ({$startAgo}) +
+
+ Tgl Ditanggapi: + {$endDate} + ({$endAgo}) +
+ + HTML; + }) + ->html(), + + Column::make('Aksi') + ->label(function ($row) { + $actions = ''; + + if (auth()->user()->can('approve price request') && $row->status === PriceRequestStatus::PENDING) { + $actions .= view('components.datatables.confirm', [ + 'id' => $row->hash, + 'message' => 'Pemohon yang diterima bisa melihat data harga beli.', + 'confirmButtonText' => 'Ya, Terima', + 'target' => 'approve', + 'title' => 'Terima', + 'confirmButtonColor' => 'primary', + 'icon' => 'check-circle', + ])->render(); + } + + if (auth()->user()->can('reject price request') && $row->status === PriceRequestStatus::PENDING) { + $actions .= view('components.datatables.confirm', [ + 'id' => $row->hash, + 'message' => 'Jika ditolak, pomohon tidak dapat melihat data harga beli.', + 'confirmButtonText' => 'Ya, Tolak', + 'target' => 'reject', + 'title' => 'Tolak', + 'confirmButtonColor' => 'red', + 'icon' => 'x-circle', + ])->render(); + } + + return $actions; + }) + ->html() + ->hideIf(auth()->user()->cannot('approve price request') && auth()->user()->cannot('reject price request')), + ]; + } + + public function builder(): Builder + { + return PriceRequest::select( + 'price_requests.id', + 'price_requests.user_id', + 'module', + 'price_requests.status', + 'price_requests.created_at', + 'finalized_at' + ) + ->with(['user', 'user.employee']); + } +} diff --git a/app/Livewire/Studio/Manage/PriceRequest.php b/app/Livewire/Studio/Manage/PriceRequest.php new file mode 100644 index 0000000..60a6de6 --- /dev/null +++ b/app/Livewire/Studio/Manage/PriceRequest.php @@ -0,0 +1,77 @@ +canOrAbort('approve price request'); + + $priceRequest->update([ + 'status' => PriceRequestStatus::APPROVED->value, + 'finalized_at' => now() + ]); + + StorePushNotification::dispatch( + PushNotification::where('user_id', $priceRequest->user_id)->get(), + [ + 'title' => 'Permintaan Harga Disetujui ✅', + 'body' => "Selamat! Permintaan untuk melihat harga beli {$priceRequest->module} sudah disetujui 🎉", + ], + ); + + $this->dispatch('refreshDatatable'); + + $this->toast('Permintaan harga berhasil disetujui.'); + + Flux::modals()->close(); + } + + public function reject(PriceRequestModel $priceRequest) + { + $this->canOrAbort('reject price request'); + + $priceRequest->update([ + 'status' => PriceRequestStatus::REJECTED->value, + 'finalized_at' => now() + ]); + + StorePushNotification::dispatch( + PushNotification::where('user_id', $priceRequest->user_id)->get(), + [ + 'title' => 'Permintaan Harga Ditolak ❌', + 'body' => "Maaf, permintaan untuk melihat harga beli {$priceRequest->module} tidak dapat dipenuhi 🙏", + ], + ); + + $this->dispatch('refreshDatatable'); + + $this->toast('Permintaan harga berhasil ditolak.'); + + Flux::modals()->close(); + } + + public function render() + { + return view('livewire.studio.manage.price-requests', [ + 'pageTitle' => 'Permintaan Harga', + ]); + } +} diff --git a/app/Models/PriceRequest.php b/app/Models/PriceRequest.php index 7929bf7..24c93b5 100644 --- a/app/Models/PriceRequest.php +++ b/app/Models/PriceRequest.php @@ -2,6 +2,9 @@ namespace App\Models; +use App\Enums\PriceRequestStatus; +use Illuminate\Database\Eloquent\Attributes\Scope; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; @@ -13,6 +16,32 @@ class PriceRequest extends Model protected $guarded = ['id']; + protected function casts(): array + { + return [ + 'status' => PriceRequestStatus::class, + 'finalized_at' => 'datetime', + ]; + } + + #[Scope] + protected function pending(Builder $query): void + { + $query->where('status', PriceRequestStatus::PENDING->value); + } + + #[Scope] + protected function approved(Builder $query): void + { + $query->where('status', PriceRequestStatus::APPROVED->value); + } + + #[Scope] + protected function rejected(Builder $query): void + { + $query->where('status', PriceRequestStatus::REJECTED->value); + } + public function user(): BelongsTo { return $this->belongsTo(User::class); diff --git a/app/Providers/ViewServiceProvider.php b/app/Providers/ViewServiceProvider.php index f8dce8e..bf92c5b 100644 --- a/app/Providers/ViewServiceProvider.php +++ b/app/Providers/ViewServiceProvider.php @@ -2,6 +2,8 @@ namespace App\Providers; +use App\Enums\PriceRequestStatus; +use App\Models\PriceRequest; use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; @@ -9,7 +11,9 @@ class ViewServiceProvider extends ServiceProvider { public function boot(): void { - View::composer('*', function ($view) { + $priceRequestCount = PriceRequest::where('status', PriceRequestStatus::PENDING->value)->count(); + + View::composer('*', function ($view) use ($priceRequestCount) { $sidebar = [ [ 'heading' => 'Dasbor', @@ -165,6 +169,14 @@ public function boot(): void 'match' => 'studio.manage.article.*', 'can' => 'view article', ], + [ + 'label' => 'Permintaan Harga', + 'icon' => 'exclamation-triangle', + 'route' => 'studio.manage.price_request.index', + 'match' => 'studio.manage.price_request.*', + 'can' => 'view price request', + 'badge' => $priceRequestCount, + ], [ 'label' => 'FAQs', 'icon' => 'question-mark-circle', diff --git a/app/Traits/WithShowPrice.php b/app/Traits/WithShowPrice.php index 53d929e..c80e940 100644 --- a/app/Traits/WithShowPrice.php +++ b/app/Traits/WithShowPrice.php @@ -2,102 +2,57 @@ namespace App\Traits; -use App\Models\Bottle; -use App\Models\Perfume; +use App\Jobs\StorePushNotification; use App\Models\PriceRequest; -use App\Models\Product; +use App\Models\PushNotification; use App\Models\User; -use App\Models\Whatsapp; use Flux\Flux; -use Illuminate\Support\Facades\Http; -use Illuminate\Support\Facades\Log; -use Illuminate\Support\Facades\URL; +use Illuminate\Support\Facades\DB; trait WithShowPrice { public function requestPrice(string $module) { - switch ($module) { - case 'perfume': - $label = 'parfum'; - $model = Perfume::class; - break; - - case 'product': - $label = 'produk'; - $model = Product::class; - break; - - default: - $label = 'botol'; - $model = Bottle::class; - break; - } - $recentRequest = PriceRequest::where('user_id', auth()->id()) - ->where('model', $model) - ->where('created_at', '>', now()->subMinutes(30)) + ->where('module', $module) + ->pending() ->exists(); if ($recentRequest) { - $this->toast('Kamu baru saja mengajukan permintaan, tautan persetujuan masih berlaku selama 30 menit.', 'Peringatan', 'warning'); + $this->toast('Permohonan kamu sedang di proses oleh owner, mohon tunggu dan kami akan memberi tahu Anda jika prosesnya sudah selesai.', 'Peringatan', 'warning'); Flux::modal('show-price')->close(); return; } - $whatsapp = Whatsapp::first(); - $owner = User::role('owner')->with('employee')->first(); + $owner = User::role(['owner', 'Developer'])->with('employee')->first(); if (! $owner) { - $this->toast('Owner belum terdaftar, silakan hubungi Admin', 'Gagal', 'danger'); + $this->toast('Owner belum terdaftar, silakan hubungi Admin.', 'Gagal', 'danger'); Flux::modal('show-price')->close(); return; } - $phoneNumber = formatPhoneNumber($owner->employee?->phone_number, '62'); + $causerName = auth()->user()->employee?->full_name; - try { - $priceRequest = PriceRequest::create([ + DB::transaction(function () use ($module, $owner, $causerName) { + PriceRequest::create([ 'user_id' => auth()->id(), - 'model' => $model, - 'expires_at' => now()->addMinutes(30), + 'module' => $module, ]); - $signedUrl = URL::temporarySignedRoute( - 'price-request.approve', - $priceRequest->expires_at, - ['priceRequest' => $priceRequest->hash] + StorePushNotification::dispatch( + PushNotification::all(), + [ + 'title' => 'Permintaan Persetujuan Harga Beli', + 'body' => "Haloo {$owner->employee?->full_name}, saya {$causerName}, saya ingin mengajukan permintaan persetujuan untuk mengakses data harga beli {$module}.", + 'route' => route('studio.manage.price_request.index'), + ], ); + }); - $priceRequest->update([ - 'signature' => hash('sha256', $signedUrl), - ]); - - $causerName = auth()->user()->employee?->full_name; - - $response = Http::withHeaders([ - 'id' => $whatsapp->zawa_id, - 'session-id' => $whatsapp->session_id, - 'Content-Type' => 'application/json', - ])->post(config('services.zawa.url').'/message', [ - 'phone' => $phoneNumber, - 'type' => 'text', - 'text' => "Haloo {$owner->employee?->full_name}, saya {$causerName}, " - ."saya ingin mengajukan permintaan persetujuan untuk mengakses data harga beli {$label}." - ."\n\nSilakan klik tautan berikut untuk menyetujui:\n\n{$signedUrl}", - ]); - - if ($response->successful()) { - $this->toast('Permintaan persetujuan berhasil dikirim.'); - } else { - $this->toast('Permintaan persetujuan gagal dikirim, silakan coba lagi.', 'Gagal', 'danger'); - } - } catch (\Throwable $th) { - Log::error($th->getMessage()); - $this->toast('Opps, terjadi kesalahan. Silakan coba lagi dan jika masih terjadi, hubungi Administrator.', 'Gagal', 'danger'); - } + $this->toast('Permintaan persetujuan berhasil dikirim.'); Flux::modal('show-price')->close(); } diff --git a/database/migrations/2025_10_29_013939_create_price_requests_table.php b/database/migrations/2025_10_29_013939_create_price_requests_table.php index b419c23..5435a39 100644 --- a/database/migrations/2025_10_29_013939_create_price_requests_table.php +++ b/database/migrations/2025_10_29_013939_create_price_requests_table.php @@ -1,5 +1,6 @@ id(); $table->foreignId('user_id')->constrained()->cascadeOnDelete(); - $table->string('model', 20); - $table->string('signature')->unique()->nullable(); - $table->timestamp('last_requested_at')->nullable(); - $table->timestamp('expires_at')->nullable(); - $table->timestamp('approved_at')->nullable(); + $table->string('module', 20); + $table->enum('status', [PriceRequestStatus::values()])->default(PriceRequestStatus::PENDING)->comment(PriceRequestStatus::comment()); + $table->timestamp('finalized_at')->nullable(); $table->timestamp('created_at')->useCurrent(); $table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate(); $table->softDeletes(); diff --git a/database/seeders/RolePermissionSeeder.php b/database/seeders/RolePermissionSeeder.php index a7a453f..9b0ebfa 100644 --- a/database/seeders/RolePermissionSeeder.php +++ b/database/seeders/RolePermissionSeeder.php @@ -118,6 +118,10 @@ public function run(): void 'update article', 'delete article', + 'view price request', + 'approve price request', + 'reject price request', + 'view faq', 'create faq', 'update faq', diff --git a/resources/views/livewire/studio/catalog/bottle/index.blade.php b/resources/views/livewire/studio/catalog/bottle/index.blade.php index 3d8ce7d..24074c3 100644 --- a/resources/views/livewire/studio/catalog/bottle/index.blade.php +++ b/resources/views/livewire/studio/catalog/bottle/index.blade.php @@ -26,5 +26,5 @@ class="text-sm"> @include('components.confirmation.delete') - @include('components.confirmation.show-price', ['module' => 'bottle']) + @include('components.confirmation.show-price', ['module' => 'botol']) diff --git a/resources/views/livewire/studio/catalog/perfume/index.blade.php b/resources/views/livewire/studio/catalog/perfume/index.blade.php index 3c18889..aedc506 100644 --- a/resources/views/livewire/studio/catalog/perfume/index.blade.php +++ b/resources/views/livewire/studio/catalog/perfume/index.blade.php @@ -26,5 +26,5 @@ class="text-sm"> @include('components.confirmation.delete') - @include('components.confirmation.show-price', ['module' => 'perfume']) + @include('components.confirmation.show-price', ['module' => 'parfum']) diff --git a/resources/views/livewire/studio/catalog/product/index.blade.php b/resources/views/livewire/studio/catalog/product/index.blade.php index 1043cbd..595dc18 100644 --- a/resources/views/livewire/studio/catalog/product/index.blade.php +++ b/resources/views/livewire/studio/catalog/product/index.blade.php @@ -26,5 +26,5 @@ class="text-sm"> @include('components.confirmation.delete') - @include('components.confirmation.show-price', ['module' => 'product']) + @include('components.confirmation.show-price', ['module' => 'produk']) diff --git a/resources/views/livewire/studio/manage/price-requests.blade.php b/resources/views/livewire/studio/manage/price-requests.blade.php new file mode 100644 index 0000000..34b669e --- /dev/null +++ b/resources/views/livewire/studio/manage/price-requests.blade.php @@ -0,0 +1,13 @@ + +
+
+ {{ $pageTitle }} +
+
+ +
+ +
+ + @include('components.confirmation') +
diff --git a/routes/pages/studio.php b/routes/pages/studio.php index 13119bb..ec0f33d 100644 --- a/routes/pages/studio.php +++ b/routes/pages/studio.php @@ -33,6 +33,7 @@ use App\Livewire\Studio\Manage\Order\Create as OrderCreate; use App\Livewire\Studio\Manage\Order\Index as OrderIndex; use App\Livewire\Studio\Manage\Order\Show as OrderShow; +use App\Livewire\Studio\Manage\PriceRequest as PriceRequestComponent; use App\Livewire\Studio\Manage\Purchase\Create as PurchaseCreate; use App\Livewire\Studio\Manage\Purchase\Index as PurchaseIndex; use App\Livewire\Studio\Master\Formula as FormulaComponent; @@ -176,6 +177,12 @@ Route::get('/', FaqComponent::class)->name('index')->middleware('can:view faq'); Route::delete('/{faq}/delete', FaqComponent::class)->name('delete')->middleware('can:delete faq'); }); + + Route::prefix('price-requests')->name('price_request.')->group(function () { + Route::get('/', PriceRequestComponent::class)->name('index')->middleware('can:view price request'); + Route::patch('/{priceRequest}/approve', PriceRequestComponent::class)->name('approve')->middleware('can:approve price request'); + Route::patch('/{priceRequest}/reject', PriceRequestComponent::class)->name('reject')->middleware('can:reject price request'); + }); }); Route::prefix('feature')->name('studio.feature.')->group(function () {