diff --git a/app/Enums/PriceRequestStatus.php b/app/Enums/PriceRequestStatus.php deleted file mode 100644 index 00e5b0e..0000000 --- a/app/Enums/PriceRequestStatus.php +++ /dev/null @@ -1,33 +0,0 @@ - 'Menunggu', - self::APPROVED => 'Disetujui', - self::REJECTED => 'Ditolak', - }; - } - - public function color(): string - { - return match ($this) { - self::PENDING => 'gray', - self::APPROVED => 'emerald', - self::REJECTED => 'red', - }; - } -} diff --git a/app/Livewire/Datatable/Catalog/BottlesTable.php b/app/Livewire/Datatable/Catalog/BottlesTable.php index bac228e..42ec297 100644 --- a/app/Livewire/Datatable/Catalog/BottlesTable.php +++ b/app/Livewire/Datatable/Catalog/BottlesTable.php @@ -3,13 +3,11 @@ namespace App\Livewire\Datatable\Catalog; use App\Models\Bottle; -use App\Models\PriceRequest; use App\Traits\Datatable\WithConfiguration; use App\Traits\Datatable\WithPrependColumn; use App\Traits\Media\WithMediaHandler; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Blade; -use Illuminate\Support\Str; use Rappasoft\LaravelLivewireTables\DataTableComponent; use Rappasoft\LaravelLivewireTables\Views\Column; use Rappasoft\LaravelLivewireTables\Views\Columns\ArrayColumn; @@ -25,12 +23,6 @@ class BottlesTable extends DataTableComponent 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) { @@ -47,27 +39,6 @@ public function columns(): array }) ->html(), - Column::make('Harga Beli', 'cost_price') - ->label(function ($row) use ($canSeePrice) { - if ($canSeePrice) { - return formatCurrencyNumber($row->cost_price, 'Rp'); - } - - $masked = Str::mask(formatCurrencyNumber($row->cost_price, 'Rp'), '*', 2); - - return Blade::render(' - - - {{ $masked }} - - - ', ['masked' => $masked]); - }) - ->searchable() - ->sortable() - ->html() - ->hideIf(! auth()->user()->hasRole(['Developer', 'Owner'])), - Column::make('Harga Jual', 'sale_price') ->label(fn ($row, $column) => formatCurrencyNumber($row->sale_price, 'Rp')) ->searchable() diff --git a/app/Livewire/Datatable/Catalog/PerfumesTable.php b/app/Livewire/Datatable/Catalog/PerfumesTable.php index 361e7cf..f15f53c 100644 --- a/app/Livewire/Datatable/Catalog/PerfumesTable.php +++ b/app/Livewire/Datatable/Catalog/PerfumesTable.php @@ -3,13 +3,11 @@ namespace App\Livewire\Datatable\Catalog; use App\Models\Perfume; -use App\Models\PriceRequest; use App\Traits\Datatable\WithAppendColumn; use App\Traits\Datatable\WithConfiguration; use App\Traits\Datatable\WithPrependColumn; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Blade; -use Illuminate\Support\Str; use Rappasoft\LaravelLivewireTables\DataTableComponent; use Rappasoft\LaravelLivewireTables\Views\Column; use Rappasoft\LaravelLivewireTables\Views\Columns\ArrayColumn; @@ -24,12 +22,6 @@ class PerfumesTable extends DataTableComponent 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) { @@ -57,27 +49,6 @@ public function columns(): array ->label(fn ($row, $column) => Blade::render(''.$row->concentration->label().'')) ->html(), - Column::make('Harga Beli', 'cost_price') - ->label(function ($row) use ($canSeePrice) { - if ($canSeePrice) { - return formatCurrencyNumber($row->cost_price, 'Rp'); - } - - $masked = Str::mask(formatCurrencyNumber($row->cost_price, 'Rp'), '*', 2); - - return Blade::render(' - - - {{ $masked }} - - - ', ['masked' => $masked]); - }) - ->searchable() - ->sortable() - ->html() - ->hideIf(! auth()->user()->hasRole(['Developer', 'Owner'])), - Column::make('Harga Jual', 'sale_price') ->label(fn ($row, $column) => formatCurrencyNumber($row->sale_price, 'Rp')) ->searchable() diff --git a/app/Livewire/Datatable/Catalog/ProductsTable.php b/app/Livewire/Datatable/Catalog/ProductsTable.php index ac160fa..3e349f5 100644 --- a/app/Livewire/Datatable/Catalog/ProductsTable.php +++ b/app/Livewire/Datatable/Catalog/ProductsTable.php @@ -2,14 +2,12 @@ namespace App\Livewire\Datatable\Catalog; -use App\Models\PriceRequest; use App\Models\Product; use App\Traits\Datatable\WithAppendColumn; use App\Traits\Datatable\WithConfiguration; use App\Traits\Datatable\WithPrependColumn; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Blade; -use Illuminate\Support\Str; use Rappasoft\LaravelLivewireTables\DataTableComponent; use Rappasoft\LaravelLivewireTables\Views\Column; use Rappasoft\LaravelLivewireTables\Views\Columns\ArrayColumn; @@ -24,12 +22,6 @@ class ProductsTable extends DataTableComponent 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) { @@ -46,27 +38,6 @@ public function columns(): array }) ->html(), - Column::make('Harga Beli', 'cost_price') - ->label(function ($row) use ($canSeePrice) { - if ($canSeePrice) { - return formatCurrencyNumber($row->cost_price, 'Rp'); - } - - $masked = Str::mask(formatCurrencyNumber($row->cost_price, 'Rp'), '*', 2); - - return Blade::render(' - - - {{ $masked }} - - - ', ['masked' => $masked]); - }) - ->searchable() - ->sortable() - ->html() - ->hideIf(! auth()->user()->hasRole(['Developer', 'Owner'])), - Column::make('Harga Jual', 'sale_price') ->label(fn ($row, $column) => formatCurrencyNumber($row->sale_price, 'Rp')) ->searchable() diff --git a/app/Livewire/Datatable/Information/PriceRequestsTable.php b/app/Livewire/Datatable/Information/PriceRequestsTable.php deleted file mode 100644 index 2394720..0000000 --- a/app/Livewire/Datatable/Information/PriceRequestsTable.php +++ /dev/null @@ -1,106 +0,0 @@ -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 = formatDateLocalized($row->created_at); - $startAgo = formatRelativeTime($row->created_at); - - $endDate = formatDateLocalized($row->finalized_at); - $endAgo = formatRelativeTime($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.actions.table.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.actions.table.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/Catalog/Bottle/Index.php b/app/Livewire/Studio/Catalog/Bottle/Index.php index a682929..698a9f3 100644 --- a/app/Livewire/Studio/Catalog/Bottle/Index.php +++ b/app/Livewire/Studio/Catalog/Bottle/Index.php @@ -7,7 +7,6 @@ use App\Traits\Components\WithConfirmation; use App\Traits\Components\WithToast; use App\Traits\Notification\WithSubscribeNotification; -use App\Traits\Pricing\WithShowPrice; use App\Traits\Utilities\WithRequestNotification; use Flux\Flux; use Illuminate\Contracts\View\View; @@ -17,7 +16,7 @@ #[Title('Botol')] class Index extends Component { - use WithAuthorization, WithConfirmation, WithRequestNotification, WithShowPrice, WithSubscribeNotification, WithToast; + use WithAuthorization, WithConfirmation, WithRequestNotification, WithSubscribeNotification, WithToast; public function delete(Bottle $bottle): void { diff --git a/app/Livewire/Studio/Catalog/Perfume/Index.php b/app/Livewire/Studio/Catalog/Perfume/Index.php index 7ce4ae3..9944345 100644 --- a/app/Livewire/Studio/Catalog/Perfume/Index.php +++ b/app/Livewire/Studio/Catalog/Perfume/Index.php @@ -7,7 +7,6 @@ use App\Traits\Components\WithConfirmation; use App\Traits\Components\WithToast; use App\Traits\Notification\WithSubscribeNotification; -use App\Traits\Pricing\WithShowPrice; use App\Traits\Utilities\WithRequestNotification; use Flux\Flux; use Livewire\Attributes\Title; @@ -16,7 +15,7 @@ #[Title('Parfum')] class Index extends Component { - use WithAuthorization, WithConfirmation, WithRequestNotification, WithShowPrice, WithSubscribeNotification, WithToast; + use WithAuthorization, WithConfirmation, WithRequestNotification, WithSubscribeNotification, WithToast; public function delete(Perfume $perfume) { diff --git a/app/Livewire/Studio/Catalog/Product/Index.php b/app/Livewire/Studio/Catalog/Product/Index.php index 01761eb..7316b9c 100644 --- a/app/Livewire/Studio/Catalog/Product/Index.php +++ b/app/Livewire/Studio/Catalog/Product/Index.php @@ -7,7 +7,6 @@ use App\Traits\Components\WithConfirmation; use App\Traits\Components\WithToast; use App\Traits\Notification\WithSubscribeNotification; -use App\Traits\Pricing\WithShowPrice; use App\Traits\Utilities\WithRequestNotification; use Flux\Flux; use Illuminate\Contracts\View\View; @@ -17,7 +16,7 @@ #[Title('Produk')] class Index extends Component { - use WithAuthorization, WithConfirmation, WithRequestNotification, WithShowPrice, WithSubscribeNotification, WithToast; + use WithAuthorization, WithConfirmation, WithRequestNotification, WithSubscribeNotification, WithToast; public function delete(Product $product): void { diff --git a/app/Livewire/Studio/Information/PriceRequest.php b/app/Livewire/Studio/Information/PriceRequest.php deleted file mode 100644 index b859902..0000000 --- a/app/Livewire/Studio/Information/PriceRequest.php +++ /dev/null @@ -1,77 +0,0 @@ -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): void - { - $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(): View - { - return view('livewire.studio.information.price-requests', [ - 'pageTitle' => 'Permintaan Harga', - ]); - } -} diff --git a/app/Models/PriceRequest.php b/app/Models/PriceRequest.php deleted file mode 100644 index 24c93b5..0000000 --- a/app/Models/PriceRequest.php +++ /dev/null @@ -1,49 +0,0 @@ - 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/Models/User.php b/app/Models/User.php index a8abd9d..321478e 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -135,11 +135,6 @@ public function pointRecords(): HasMany return $this->hasMany(PointRecord::class); } - public function priceRequests(): HasMany - { - return $this->hasMany(PriceRequest::class); - } - public function purchaseItems(): HasMany { return $this->hasMany(PurchaseItem::class); diff --git a/app/Providers/ViewServiceProvider.php b/app/Providers/ViewServiceProvider.php index 2e1cd01..3a0c807 100644 --- a/app/Providers/ViewServiceProvider.php +++ b/app/Providers/ViewServiceProvider.php @@ -2,11 +2,8 @@ namespace App\Providers; -use App\Enums\PriceRequestStatus; -use App\Models\PriceRequest; use App\Settings\ContactSettings; use App\Settings\GeneralSettings; -use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; @@ -14,20 +11,7 @@ class ViewServiceProvider extends ServiceProvider { public function boot(): void { - if (! Schema::hasTable('price_requests')) { - return; - } - - if (Schema::hasTable('price_requests') && Schema::hasColumn('price_requests', 'status')) { - $priceRequestCount = PriceRequest::where( - 'status', - PriceRequestStatus::PENDING->value - )->count(); - } else { - $priceRequestCount = 0; - } - - View::composer('*', function ($view) use ($priceRequestCount) { + View::composer('*', function ($view) { $sidebar = [ [ 'heading' => 'Dasbor', @@ -230,14 +214,6 @@ public function boot(): void 'match' => 'studio.information.broadcast.*', 'can' => 'view broadcast', ], - [ - 'label' => 'Permintaan Harga', - 'icon' => 'exclamation-triangle', - 'route' => 'studio.information.price_request.index', - 'match' => 'studio.information.price_request.*', - 'can' => 'view price request', - 'badge' => $priceRequestCount, - ], [ 'label' => 'FAQs', 'icon' => 'question-mark-circle', diff --git a/app/Traits/Pricing/WithShowPrice.php b/app/Traits/Pricing/WithShowPrice.php deleted file mode 100644 index 2153132..0000000 --- a/app/Traits/Pricing/WithShowPrice.php +++ /dev/null @@ -1,59 +0,0 @@ -id()) - ->where('module', $module) - ->pending() - ->exists(); - - if ($recentRequest) { - $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; - } - - $owner = User::role(['owner', 'Developer'])->with('employee')->first(); - - if (! $owner) { - $this->toast('Owner belum terdaftar, silakan hubungi Admin.', 'Gagal', 'danger'); - Flux::modal('show-price')->close(); - - return; - } - - $causerName = auth()->user()->employee?->full_name; - - DB::transaction(function () use ($module, $owner, $causerName) { - PriceRequest::create([ - 'user_id' => auth()->id(), - 'module' => $module, - ]); - - 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.information.price_request.index'), - ], - ); - }); - - $this->toast('Permintaan persetujuan berhasil dikirim.'); - - Flux::modal('show-price')->close(); - } -} diff --git a/database/factories/PriceRequestFactory.php b/database/factories/PriceRequestFactory.php deleted file mode 100644 index bf9022c..0000000 --- a/database/factories/PriceRequestFactory.php +++ /dev/null @@ -1,51 +0,0 @@ -faker->randomElement(PriceRequestStatus::cases()); - - return [ - 'user_id' => User::factory(), - 'module' => $this->faker->randomElement(['product', 'perfume', 'bottle']), - 'status' => $status, - 'finalized_at' => $status === PriceRequestStatus::PENDING - ? null - : $this->faker->dateTime(), - ]; - } - - public function pending(): Factory - { - return $this->state(fn () => [ - 'status' => PriceRequestStatus::PENDING, - 'finalized_at' => null, - ]); - } - - public function approved(): Factory - { - return $this->state(fn () => [ - 'status' => PriceRequestStatus::APPROVED, - 'finalized_at' => $this->faker->dateTime(), - ]); - } - - public function rejected(): Factory - { - return $this->state(fn () => [ - 'status' => PriceRequestStatus::REJECTED, - 'finalized_at' => $this->faker->dateTime(), - ]); - } -} 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 deleted file mode 100644 index 7dcf19c..0000000 --- a/database/migrations/2025_10_29_013939_create_price_requests_table.php +++ /dev/null @@ -1,34 +0,0 @@ -id(); - $table->foreignId('user_id')->constrained()->cascadeOnDelete(); - $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(); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('price_requests'); - } -}; diff --git a/database/seeders/RolePermissionSeeder.php b/database/seeders/RolePermissionSeeder.php index faab3d9..c0080c9 100644 --- a/database/seeders/RolePermissionSeeder.php +++ b/database/seeders/RolePermissionSeeder.php @@ -128,10 +128,6 @@ public function run(): void 'update article', 'delete article', - 'view price request', - 'approve price request', - 'reject price request', - 'view faq', 'create faq', 'update faq', @@ -147,6 +143,7 @@ public function run(): void 'delete broadcast', 'view warehouse', + 'show warehouse', 'create warehouse', 'update warehouse', 'delete warehouse', diff --git a/resources/views/components/modals/confirmations/request-price.blade.php b/resources/views/components/modals/confirmations/request-price.blade.php deleted file mode 100644 index 61e8e6c..0000000 --- a/resources/views/components/modals/confirmations/request-price.blade.php +++ /dev/null @@ -1,19 +0,0 @@ - -
-
- Konfirmasi - Apakah Anda ingin mengajukan permintaan persetujuan kepada owner untuk - mengakses data harga beli? -
-
- - - Batal - - - Ya, Ajukan - -
-
-
diff --git a/resources/views/livewire/studio/catalog/bottle/index.blade.php b/resources/views/livewire/studio/catalog/bottle/index.blade.php index fa95df2..7e6d1e0 100644 --- a/resources/views/livewire/studio/catalog/bottle/index.blade.php +++ b/resources/views/livewire/studio/catalog/bottle/index.blade.php @@ -33,5 +33,4 @@ class="text-sm"> 'buttonColor' => 'danger', 'buttonText' => 'Ya, Hapus', ]) - @include('components.modals.confirmations.request-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 0823684..ea045b4 100644 --- a/resources/views/livewire/studio/catalog/perfume/index.blade.php +++ b/resources/views/livewire/studio/catalog/perfume/index.blade.php @@ -40,5 +40,4 @@ class="text-sm"> 'buttonColor' => 'danger', 'buttonText' => 'Ya, Hapus', ]) - @include('components.modals.confirmations.request-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 b02fbd5..5dcfe57 100644 --- a/resources/views/livewire/studio/catalog/product/index.blade.php +++ b/resources/views/livewire/studio/catalog/product/index.blade.php @@ -40,5 +40,4 @@ class="text-sm"> 'buttonColor' => 'danger', 'buttonText' => 'Ya, Hapus', ]) - @include('components.modals.confirmations.request-price', ['module' => 'produk']) diff --git a/resources/views/livewire/studio/information/price-requests.blade.php b/resources/views/livewire/studio/information/price-requests.blade.php deleted file mode 100644 index 018436f..0000000 --- a/resources/views/livewire/studio/information/price-requests.blade.php +++ /dev/null @@ -1,20 +0,0 @@ - -
-
- {{ $pageTitle }} -
-
- -
- -
- - @include('components.modals.confirmation', [ - 'modalName' => 'delete-confirmation', - 'modalTitle' => 'Apakah Anda yakin?', - 'modalMessage' => 'Data yang berelasi dengan data ini juga akan ikut terhapus.', - 'buttonVariant' => 'primary', - 'buttonColor' => 'danger', - 'buttonText' => 'Ya, Hapus', - ]) -