refactor: restructure stock management components and update routes

- Removed legacy stock management components including PurchaseForm, RestockForm, StockOpnameForm, and StockTransferForm.
- Updated routes to reflect new structure under 'studio.stock' namespace for better organization.
- Adjusted view files for stock management to align with the new routing and component structure.
- Modified action routes in the ViewServiceProvider to ensure proper access control and navigation.
- Cleaned up related test files to remove references to deleted components.
This commit is contained in:
Yoga Pangestu 2026-01-09 21:57:06 +07:00
parent dffc9f9e72
commit 293dd7d1fd
30 changed files with 104 additions and 97 deletions

View File

@ -34,7 +34,7 @@ public function columns(): array
if (auth()->user()->can('show stock opname')) {
$actions .= view('components.actions.table.new-page-action', [
'label' => 'Lihat',
'route' => route('studio.manage.stock_opname.show', ['stockOpname', $row->hash]),
'route' => route('studio.stock.stock_opname.show', ['stockOpname', $row->hash]),
'buttonColor' => 'blue',
'buttonIcon' => 'eye',
])->render();

View File

@ -1,6 +1,6 @@
<?php
namespace App\Livewire\Forms\Studio\Manage;
namespace App\Livewire\Forms\Studio\Stock;
use App\Models\Purchase;
use App\Rules\UnsignedInteger;

View File

@ -1,6 +1,6 @@
<?php
namespace App\Livewire\Forms\Studio\Manage;
namespace App\Livewire\Forms\Studio\Stock;
use App\Models\Restock;
use App\Traits\Media\WithMediaHandler;

View File

@ -1,6 +1,6 @@
<?php
namespace App\Livewire\Forms\Studio\Manage;
namespace App\Livewire\Forms\Studio\Stock;
use App\Models\StockOpname;
use App\Models\StockOpnameItem;

View File

@ -1,6 +1,6 @@
<?php
namespace App\Livewire\Forms\Studio\Manage;
namespace App\Livewire\Forms\Studio\Stock;
use App\Models\StockTransfer;
use App\Traits\Media\WithMediaHandler;

View File

@ -1,8 +1,8 @@
<?php
namespace App\Livewire\Studio\Manage\Purchase;
namespace App\Livewire\Studio\Stock\Purchase;
use App\Livewire\Forms\Studio\Manage\PurchaseForm;
use App\Livewire\Forms\Studio\Stock\PurchaseForm;
use App\Models\Bottle;
use App\Models\Perfume;
use App\Models\Product;
@ -64,14 +64,14 @@ public function save(): void
$this->form->store();
$this->redirectRoute('studio.manage.purchase.index', [
$this->redirectRoute('studio.stock.purchase.index', [
'notification' => 'Belanja berhasil ditambahkan.',
], navigate: true);
}
public function render(): View
{
return view('livewire.studio.manage.purchase.form', [
return view('livewire.studio.stock.purchase.form', [
'pageTitle' => 'Tambah Belanja',
]);
}

View File

@ -1,6 +1,6 @@
<?php
namespace App\Livewire\Studio\Manage\Purchase;
namespace App\Livewire\Studio\Stock\Purchase;
use App\Models\Purchase;
use App\Traits\Authorization\WithAuthorization;
@ -42,7 +42,7 @@ public function delete(Purchase $purchase): void
public function render(): View
{
return view('livewire.studio.manage.purchase.index', [
return view('livewire.studio.stock.purchase.index', [
'pageTitle' => 'Belanja',
]);
}

View File

@ -1,8 +1,8 @@
<?php
namespace App\Livewire\Studio\Manage\Restock;
namespace App\Livewire\Studio\Stock\Restock;
use App\Livewire\Forms\Studio\Manage\RestockForm;
use App\Livewire\Forms\Studio\Stock\RestockForm;
use App\Models\Warehouse;
use App\Traits\Authorization\WithAuthorization;
use App\Traits\Components\WithConfirmation;
@ -116,14 +116,14 @@ public function save(): void
return;
}
$this->redirectRoute('studio.manage.restock.index', [
$this->redirectRoute('studio.stock.restock.index', [
'notification' => 'Restock berhasil diproses.',
], navigate: true);
}
public function render(): View
{
return view('livewire.studio.manage.restock.form', [
return view('livewire.studio.stock.restock.form', [
'pageTitle' => 'Tambah Restock Toko',
]);
}

View File

@ -1,6 +1,6 @@
<?php
namespace App\Livewire\Studio\Manage\Restock;
namespace App\Livewire\Studio\Stock\Restock;
use App\Models\Restock;
use App\Traits\Authorization\WithAuthorization;
@ -42,7 +42,7 @@ public function delete(Restock $restock): void
public function render(): View
{
return view('livewire.studio.manage.restock.index', [
return view('livewire.studio.stock.restock.index', [
'pageTitle' => 'Restock Toko',
]);
}

View File

@ -1,6 +1,6 @@
<?php
namespace App\Livewire\Studio\Manage\StockOpname;
namespace App\Livewire\Studio\Stock\StockOpname;
use App\Enums\StockOpnameStatus;
use App\Models\StockOpname;
@ -59,7 +59,7 @@ public function requestApproval(StockOpname $stockOpname): void
$this->toast('Permohonan persetujuan berhasil diajukan.', 'Berhasil');
$this->redirectRoute('studio.manage.stock_opname.index', navigate: true);
$this->redirectRoute('studio.stock.stock_opname.index', navigate: true);
}
public function approveApproval(StockOpname $stockOpname): void
@ -120,12 +120,12 @@ public function approveApproval(StockOpname $stockOpname): void
$this->toast('Stock opname berhasil disetujui dan stok outlet disesuaikan.', 'Berhasil');
$this->redirectRoute('studio.manage.stock_opname.index', navigate: true);
$this->redirectRoute('studio.stock.stock_opname.index', navigate: true);
}
public function render(): View
{
return view('livewire.studio.manage.stock-opname.index', [
return view('livewire.studio.stock.stock-opname.index', [
'pageTitle' => 'Stock Opname',
]);
}

View File

@ -1,9 +1,9 @@
<?php
namespace App\Livewire\Studio\Manage\StockOpname;
namespace App\Livewire\Studio\Stock\StockOpname;
use App\Enums\StockOpnameStatus;
use App\Livewire\Forms\Studio\Manage\StockOpnameForm;
use App\Livewire\Forms\Studio\Stock\StockOpnameForm;
use App\Models\StockOpname;
use App\Models\StockOpnameItem;
use App\Traits\Authorization\WithAuthorization;
@ -61,7 +61,7 @@ public function updated(string $propertyName, $value): void
public function render(): View
{
return view('livewire.studio.manage.stock-opname.manage', [
return view('livewire.studio.stock.stock-opname.manage', [
'pageTitle' => 'Kelola Stock Opname',
]);
}

View File

@ -1,6 +1,6 @@
<?php
namespace App\Livewire\Studio\Manage\StockOpname;
namespace App\Livewire\Studio\Stock\StockOpname;
use App\Models\StockOpname;
use App\Models\StockOpnameItem;
@ -30,7 +30,7 @@ public function mount(StockOpname $stockOpname): void
public function render(): View
{
return view('livewire.studio.manage.stock-opname.show', [
return view('livewire.studio.stock.stock-opname.show', [
'pageTitle' => 'Lihat Stock Opname',
]);
}

View File

@ -1,8 +1,8 @@
<?php
namespace App\Livewire\Studio\Manage\StockTransfer;
namespace App\Livewire\Studio\Stock\StockTransfer;
use App\Livewire\Forms\Studio\Manage\StockTransferForm;
use App\Livewire\Forms\Studio\Stock\StockTransferForm;
use App\Models\Outlet;
use App\Traits\Authorization\WithAuthorization;
use App\Traits\Components\WithConfirmation;
@ -116,14 +116,14 @@ public function save(): void
return;
}
$this->redirectRoute('studio.manage.stock_transfer.index', [
$this->redirectRoute('studio.stock.stock_transfer.index', [
'notification' => 'Transfer stok berhasil diproses.',
], navigate: true);
}
public function render(): View
{
return view('livewire.studio.manage.stock-transfer.form', [
return view('livewire.studio.stock.stock-transfer.form', [
'pageTitle' => 'Tambah Transfer Stok Antar Outlet',
]);
}

View File

@ -1,6 +1,6 @@
<?php
namespace App\Livewire\Studio\Manage\StockTransfer;
namespace App\Livewire\Studio\Stock\StockTransfer;
use App\Models\StockTransfer;
use App\Traits\Authorization\WithAuthorization;
@ -42,7 +42,7 @@ public function delete(StockTransfer $stockTransfer): void
public function render(): View
{
return view('livewire.studio.manage.stock-transfer.index', [
return view('livewire.studio.stock.stock-transfer.index', [
'pageTitle' => 'Transfer Stok Antar Outlet',
]);
}

View File

@ -174,34 +174,6 @@ public function boot(): void
'match' => 'studio.manage.order.*',
'can' => 'view order',
],
[
'label' => 'Belanja',
'icon' => 'shopping-bag',
'route' => 'studio.manage.purchase.index',
'match' => 'studio.manage.purchase.*',
'can' => 'view purchase',
],
[
'label' => 'Restock Outlet',
'icon' => 'arrows-right-left',
'route' => 'studio.manage.restock.index',
'match' => 'studio.manage.restock.*',
'can' => 'view restock',
],
[
'label' => 'Transfer Stok',
'icon' => 'clipboard-document-list',
'route' => 'studio.manage.stock_transfer.index',
'match' => 'studio.manage.stock_transfer.*',
'can' => 'view stock transfer',
],
[
'label' => 'Stock Opname',
'icon' => 'clipboard-document-check',
'route' => 'studio.manage.stock_opname.index',
'match' => 'studio.manage.stock_opname.*',
'can' => 'view stock opname',
],
[
'label' => 'Artikel',
'icon' => 'newspaper',
@ -211,6 +183,39 @@ public function boot(): void
],
],
],
[
'heading' => 'Kelola',
'items' => [
[
'label' => 'Belanja',
'icon' => 'shopping-bag',
'route' => 'studio.stock.purchase.index',
'match' => 'studio.stock.purchase.*',
'can' => 'view purchase',
],
[
'label' => 'Restock Outlet',
'icon' => 'arrows-right-left',
'route' => 'studio.stock.restock.index',
'match' => 'studio.stock.restock.*',
'can' => 'view restock',
],
[
'label' => 'Transfer Stok',
'icon' => 'clipboard-document-list',
'route' => 'studio.stock.stock_transfer.index',
'match' => 'studio.stock.stock_transfer.*',
'can' => 'view stock transfer',
],
[
'label' => 'Stock Opname',
'icon' => 'clipboard-document-check',
'route' => 'studio.stock.stock_opname.index',
'match' => 'studio.stock.stock_opname.*',
'can' => 'view stock opname',
],
],
],
[
'heading' => 'Informasi',
'items' => [

View File

@ -4,7 +4,7 @@
<flux:heading size="xl">{{ $pageTitle }}</flux:heading>
</div>
<div>
<flux:button href="{{ route('studio.manage.purchase.index') }}" wire:navigate class="text-sm">
<flux:button href="{{ route('studio.stock.purchase.index') }}" wire:navigate class="text-sm">
Kembali
</flux:button>
</div>

View File

@ -5,7 +5,7 @@
</div>
@can('create purchase')
<div>
<flux:button href="{{ route('studio.manage.purchase.create') }}" variant="primary" wire:navigate
<flux:button href="{{ route('studio.stock.purchase.create') }}" variant="primary" wire:navigate
class="text-sm">
Tambah
</flux:button>

View File

@ -4,7 +4,7 @@
<flux:heading size="xl">{{ $pageTitle }}</flux:heading>
</div>
<div>
<flux:button href="{{ route('studio.manage.restock.index') }}" wire:navigate class="text-sm">
<flux:button href="{{ route('studio.stock.restock.index') }}" wire:navigate class="text-sm">
Kembali
</flux:button>
</div>

View File

@ -5,7 +5,7 @@
</div>
@can('create restock')
<div>
<flux:button href="{{ route('studio.manage.restock.create') }}" variant="primary" wire:navigate
<flux:button href="{{ route('studio.stock.restock.create') }}" variant="primary" wire:navigate
class="text-sm">
Tambah
</flux:button>

View File

@ -48,7 +48,7 @@
<div class="flex items-center mt-2 gap-2">
<flux:tooltip content="Lihat">
<flux:button variant="primary" color="blue" size="sm" icon="eye"
href="{{ route('studio.manage.stock_opname.show', ['stockOpname' => $item->hash]) }}"
href="{{ route('studio.stock.stock_opname.show', ['stockOpname' => $item->hash]) }}"
wire:navigate>
</flux:button>
</flux:tooltip>
@ -56,7 +56,7 @@
@if ($item->status === \App\Enums\StockOpnameStatus::PROCESS)
<flux:tooltip content="Kelola">
<flux:button variant="primary" color="yellow" size="sm" icon="document-text"
href="{{ route('studio.manage.stock_opname.manage', ['stockOpname' => $item->hash]) }}"
href="{{ route('studio.stock.stock_opname.manage', ['stockOpname' => $item->hash]) }}"
wire:navigate>
</flux:button>
</flux:tooltip>

View File

@ -4,7 +4,7 @@
<flux:heading size="xl">{{ $pageTitle }}</flux:heading>
</div>
<div>
<flux:button href="{{ route('studio.manage.stock_opname.index') }}" wire:navigate class="text-sm">
<flux:button href="{{ route('studio.stock.stock_opname.index') }}" wire:navigate class="text-sm">
Kembali
</flux:button>
</div>

View File

@ -4,7 +4,7 @@
<flux:heading size="xl">{{ $pageTitle }}</flux:heading>
</div>
<div>
<flux:button href="{{ route('studio.manage.stock_opname.index') }}" wire:navigate class="text-sm">
<flux:button href="{{ route('studio.stock.stock_opname.index') }}" wire:navigate class="text-sm">
Kembali
</flux:button>
</div>

View File

@ -4,7 +4,7 @@
<flux:heading size="xl">{{ $pageTitle }}</flux:heading>
</div>
<div>
<flux:button href="{{ route('studio.manage.stock_transfer.index') }}" wire:navigate class="text-sm">
<flux:button href="{{ route('studio.stock.stock_transfer.index') }}" wire:navigate class="text-sm">
Kembali
</flux:button>
</div>

View File

@ -5,7 +5,7 @@
</div>
@can('create stock transfer')
<div>
<flux:button href="{{ route('studio.manage.stock_transfer.create') }}" variant="primary" wire:navigate
<flux:button href="{{ route('studio.stock.stock_transfer.create') }}" variant="primary" wire:navigate
class="text-sm">
Tambah
</flux:button>

View File

@ -35,15 +35,6 @@
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\Purchase\Create as PurchaseCreate;
use App\Livewire\Studio\Manage\Purchase\Index as PurchaseIndex;
use App\Livewire\Studio\Manage\Restock\Create as RestockCreate;
use App\Livewire\Studio\Manage\Restock\Index as RestockIndex;
use App\Livewire\Studio\Manage\StockOpname\Index as StockOpnameIndex;
use App\Livewire\Studio\Manage\StockOpname\Manage as StockOpnameManage;
use App\Livewire\Studio\Manage\StockOpname\Show as StockOpnameShow;
use App\Livewire\Studio\Manage\StockTransfer\Create as StockTransferCreate;
use App\Livewire\Studio\Manage\StockTransfer\Index as StockTransferIndex;
use App\Livewire\Studio\Master\Category as CategoryComponent;
use App\Livewire\Studio\Master\Formula as FormulaComponent;
use App\Livewire\Studio\Master\Outlet\Create as OutletCreate;
@ -56,6 +47,15 @@
use App\Livewire\Studio\Master\Warehouse\Show as WarehouseShow;
use App\Livewire\Studio\Setting\Account as AccountComponent;
use App\Livewire\Studio\Setting\Application as ApplicationComponent;
use App\Livewire\Studio\Stock\Purchase\Create as PurchaseCreate;
use App\Livewire\Studio\Stock\Purchase\Index as PurchaseIndex;
use App\Livewire\Studio\Stock\Restock\Create as RestockCreate;
use App\Livewire\Studio\Stock\Restock\Index as RestockIndex;
use App\Livewire\Studio\Stock\StockOpname\Index as StockOpnameIndex;
use App\Livewire\Studio\Stock\StockOpname\Manage as StockOpnameManage;
use App\Livewire\Studio\Stock\StockOpname\Show as StockOpnameShow;
use App\Livewire\Studio\Stock\StockTransfer\Create as StockTransferCreate;
use App\Livewire\Studio\Stock\StockTransfer\Index as StockTransferIndex;
use Illuminate\Support\Facades\Route;
Route::middleware('auth')->prefix('studio')->group(function () {
@ -164,6 +164,14 @@
Route::get('/{order}/show', OrderShow::class)->name('show')->middleware('can:show order');
});
Route::prefix('articles')->name('article.')->group(function () {
Route::get('/', ArticleIndex::class)->name('index')->middleware('can:view article');
Route::get('/create', ArticleCreate::class)->name('create')->middleware('can:create article');
Route::get('/{article}/edit', ArticleEdit::class)->name('edit')->middleware('can:update article');
});
});
Route::prefix('stock')->name('studio.stock.')->group(function () {
Route::prefix('purchases')->name('purchase.')->group(function () {
Route::get('/', PurchaseIndex::class)->name('index')->middleware('can:view purchase');
Route::get('/create', PurchaseCreate::class)->name('create')->middleware('can:create purchase');
@ -184,12 +192,6 @@
Route::get('/{stockOpname}/show', StockOpnameShow::class)->name('show')->middleware('can:show stock opname');
Route::get('/{stockOpname}/manage', StockOpnameManage::class)->name('manage')->middleware('can:manage stock opname');
});
Route::prefix('articles')->name('article.')->group(function () {
Route::get('/', ArticleIndex::class)->name('index')->middleware('can:view article');
Route::get('/create', ArticleCreate::class)->name('create')->middleware('can:create article');
Route::get('/{article}/edit', ArticleEdit::class)->name('edit')->middleware('can:update article');
});
});
Route::prefix('information')->name('studio.information.')->group(function () {

View File

@ -1,7 +1,7 @@
<?php
use App\Livewire\Studio\Manage\Purchase\Create;
use App\Livewire\Studio\Manage\Purchase\Index;
use App\Livewire\Studio\Stock\Purchase\Create;
use App\Livewire\Studio\Stock\Purchase\Index;
use App\Models\Bottle;
use App\Models\Perfume;
use App\Models\Product;
@ -28,14 +28,14 @@
it('renders the purchase index page', function () {
$this->actingAs($this->user)
->get(route('studio.manage.purchase.index'))
->get(route('studio.stock.purchase.index'))
->assertOk()
->assertSeeLivewire(Index::class);
});
it('renders the purchase create page', function () {
$this->actingAs($this->user)
->get(route('studio.manage.purchase.create'))
->get(route('studio.stock.purchase.create'))
->assertOk()
->assertSeeLivewire(Create::class);
});
@ -162,7 +162,7 @@
->set('form.invoice_number', 'INV-001')
->call('save')
->assertHasNoErrors()
->assertRedirect(route('studio.manage.purchase.index', [
->assertRedirect(route('studio.stock.purchase.index', [
'notification' => 'Belanja berhasil ditambahkan.',
]));
@ -276,10 +276,10 @@
$this->user->permissions()->detach();
$this->actingAs($this->user)
->get(route('studio.manage.purchase.index'))
->get(route('studio.stock.purchase.index'))
->assertForbidden();
$this->actingAs($this->user)
->get(route('studio.manage.purchase.create'))
->get(route('studio.stock.purchase.create'))
->assertForbidden();
});

View File

@ -1,6 +1,6 @@
<?php
use App\Livewire\Studio\Manage\Restock\Create;
use App\Livewire\Studio\Stock\Restock\Create;
use App\Models\Bottle;
use App\Models\Perfume;
use App\Models\Product;
@ -84,7 +84,7 @@
->call('addItem', 'botol')
->call('save')
->assertRedirect(route('studio.manage.restock.index', ['notification' => 'Restock berhasil diproses.']));
->assertRedirect(route('studio.stock.restock.index', ['notification' => 'Restock berhasil diproses.']));
// Verify DB records
$this->assertDatabaseHas('restocks', [

View File

@ -1,6 +1,6 @@
<?php
use App\Livewire\Studio\Manage\Restock\Index;
use App\Livewire\Studio\Stock\Restock\Index;
use App\Models\Perfume;
use App\Models\Restock;
use App\Models\Warehouse;

View File

@ -1,7 +1,7 @@
<?php
use App\Enums\StockOpnameStatus;
use App\Livewire\Studio\Manage\StockOpname\Index;
use App\Livewire\Studio\Stock\StockOpname\Index;
use App\Models\Perfume;
use App\Models\StockOpname;
use App\Models\StockOpnameItem;

View File

@ -1,7 +1,7 @@
<?php
use App\Enums\StockOpnameStatus;
use App\Livewire\Studio\Manage\StockOpname\Manage;
use App\Livewire\Studio\Stock\StockOpname\Manage;
use App\Models\Perfume;
use App\Models\StockOpname;
use App\Models\StockOpnameItem;