From ec80f2145b5422240657b8aca71134d30bffd5b7 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Sun, 21 Jun 2026 12:36:36 +0700 Subject: [PATCH] refactor: remove ProductPendingAction and ProductStatus enums, update related references in Product model and services for improved code clarity and maintainability --- app/Enums/Permission.php | 5 +- app/Enums/ProductPendingAction.php | 15 ----- app/Enums/ProductStatus.php | 23 ------- app/Http/Controllers/HomeController.php | 2 - .../Admin/Master/RejectProductRequest.php | 34 ---------- app/Models/Product.php | 64 +------------------ app/Services/Manage/CuttingService.php | 4 +- app/Services/Manage/OrderService.php | 4 +- database/factories/ProductFactory.php | 3 - ...add_approval_columns_to_products_table.php | 5 +- ...p_approval_columns_from_products_table.php | 29 +++++++++ database/seeders/ProductSeeder.php | 3 - 12 files changed, 35 insertions(+), 156 deletions(-) delete mode 100644 app/Enums/ProductPendingAction.php delete mode 100644 app/Enums/ProductStatus.php delete mode 100644 app/Http/Requests/Admin/Master/RejectProductRequest.php create mode 100644 database/migrations/2026_06_21_052600_drop_approval_columns_from_products_table.php diff --git a/app/Enums/Permission.php b/app/Enums/Permission.php index ca618bf..3638b6b 100644 --- a/app/Enums/Permission.php +++ b/app/Enums/Permission.php @@ -48,7 +48,6 @@ enum Permission: string case PRODUCTS_UPDATE = 'products.update'; case PRODUCTS_DELETE = 'products.delete'; case PRODUCTS_TOGGLE_STATUS = 'products.toggle-status'; - case PRODUCTS_VERIFY = 'products.verify'; case RAW_MATERIALS_VIEW = 'raw-materials.view'; case RAW_MATERIALS_CREATE = 'raw-materials.create'; @@ -151,7 +150,6 @@ public function label(): string self::PRODUCTS_UPDATE => 'Ubah Produk', self::PRODUCTS_DELETE => 'Hapus Produk', self::PRODUCTS_TOGGLE_STATUS => 'Ubah Status Produk', - self::PRODUCTS_VERIFY => 'Setujui/Tolak Produk', self::RAW_MATERIALS_VIEW => 'Lihat Bahan Baku', self::RAW_MATERIALS_CREATE => 'Tambah Bahan Baku', @@ -230,8 +228,7 @@ public function group(): string self::CUSTOMERS_VIEW, self::CUSTOMERS_CREATE, self::CUSTOMERS_UPDATE, self::CUSTOMERS_DELETE => 'Pelanggan', self::PRODUCTS_VIEW, self::PRODUCTS_CREATE, self::PRODUCTS_UPDATE, - self::PRODUCTS_DELETE, self::PRODUCTS_TOGGLE_STATUS, - self::PRODUCTS_VERIFY => 'Produk', + self::PRODUCTS_DELETE, self::PRODUCTS_TOGGLE_STATUS => 'Produk', self::RAW_MATERIALS_VIEW, self::RAW_MATERIALS_CREATE, self::RAW_MATERIALS_UPDATE, self::RAW_MATERIALS_DELETE, self::RAW_MATERIALS_TOGGLE_STATUS => 'Bahan Baku', self::PURCHASES_VIEW, self::PURCHASES_CREATE, self::PURCHASES_UPDATE, diff --git a/app/Enums/ProductPendingAction.php b/app/Enums/ProductPendingAction.php deleted file mode 100644 index 1b772b0..0000000 --- a/app/Enums/ProductPendingAction.php +++ /dev/null @@ -1,15 +0,0 @@ - 'Penghapusan', - }; - } -} diff --git a/app/Enums/ProductStatus.php b/app/Enums/ProductStatus.php deleted file mode 100644 index e9a20e7..0000000 --- a/app/Enums/ProductStatus.php +++ /dev/null @@ -1,23 +0,0 @@ - 'Menunggu', - self::APPROVED => 'Disetujui', - self::REJECTED => 'Ditolak', - }; - } -} diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index e05479b..29fa019 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -2,7 +2,6 @@ namespace App\Http\Controllers; -use App\Enums\ProductStatus; use App\Models\Category; use App\Models\Product; use App\Models\SystemConfiguration; @@ -26,7 +25,6 @@ public function index(): Response $categories = Category::whereHas('products')->get(['id', 'name', 'slug']); $products = Product::where('is_active', true) - ->where('status', ProductStatus::APPROVED) ->with([ 'categories', 'variants' => fn ($query) => $query diff --git a/app/Http/Requests/Admin/Master/RejectProductRequest.php b/app/Http/Requests/Admin/Master/RejectProductRequest.php deleted file mode 100644 index 758d6bc..0000000 --- a/app/Http/Requests/Admin/Master/RejectProductRequest.php +++ /dev/null @@ -1,34 +0,0 @@ -user()?->can(Permission::PRODUCTS_VERIFY->value) ?? false; - } - - /** - * @return array - */ - public function rules(): array - { - return [ - 'reason' => ['required', 'string', 'max:500'], - ]; - } - - /** - * @return array - */ - public function attributes(): array - { - return [ - 'reason' => 'alasan penolakan', - ]; - } -} diff --git a/app/Models/Product.php b/app/Models/Product.php index aa8b8ea..8fb0500 100644 --- a/app/Models/Product.php +++ b/app/Models/Product.php @@ -2,16 +2,10 @@ namespace App\Models; -use App\Enums\ProductPendingAction; -use App\Enums\ProductStatus; -use App\Models\Concerns\HasRejection; use App\Models\Concerns\InteractsWithActivityLog; -use Illuminate\Database\Eloquent\Attributes\Appends; use Illuminate\Database\Eloquent\Attributes\Guarded; -use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; @@ -19,25 +13,14 @@ #[Guarded(['id'])] #[Sluggable(from: 'name', to: 'slug')] -#[Appends([ - 'status_label', - 'pending_action_label', - 'rejection_reason', - 'is_editable', - 'can_verify', -])] class Product extends Model { - use HasFactory, HasRejection, InteractsWithActivityLog, SoftDeletes; + use HasFactory, InteractsWithActivityLog, SoftDeletes; protected function casts(): array { return [ 'is_active' => 'boolean', - 'status' => ProductStatus::class, - 'pending_action' => ProductPendingAction::class, - 'was_ever_approved' => 'boolean', - 'verified_at' => 'datetime', ]; } @@ -50,49 +33,4 @@ public function variants(): HasMany { return $this->hasMany(ProductVariant::class); } - - public function verifiedBy(): BelongsTo - { - return $this->belongsTo(User::class, 'verified_by_id'); - } - - public function submittedBy(): BelongsTo - { - return $this->belongsTo(User::class, 'submitted_by_id'); - } - - public function canVerify(): Attribute - { - return Attribute::make( - get: fn () => $this->status === ProductStatus::PENDING, - ); - } - - public function isEditable(): Attribute - { - return Attribute::make( - get: fn () => in_array($this->status, [ProductStatus::PENDING, ProductStatus::REJECTED], true), - ); - } - - public function pendingActionLabel(): Attribute - { - return Attribute::make( - get: fn () => $this->pending_action?->label(), - ); - } - - public function rejectionReason(): Attribute - { - return Attribute::make( - get: fn () => $this->rejection?->reason, - ); - } - - public function statusLabel(): Attribute - { - return Attribute::make( - get: fn () => $this->status?->label(), - ); - } } diff --git a/app/Services/Manage/CuttingService.php b/app/Services/Manage/CuttingService.php index fb9f0c2..fc703d2 100644 --- a/app/Services/Manage/CuttingService.php +++ b/app/Services/Manage/CuttingService.php @@ -3,7 +3,6 @@ namespace App\Services\Manage; use App\Enums\CuttingStatus; -use App\Enums\ProductStatus; use App\Models\Cutting; use App\Models\CuttingMaterial; use App\Models\CuttingResult; @@ -184,8 +183,7 @@ public function productCatalog(?Cutting $cutting = null, ?User $user = null): Co ->orderBy('created_at'), ]) ->where(function (Builder $query) use ($selectedVariantIds): void { - $query->where('is_active', true) - ->where('status', ProductStatus::APPROVED); + $query->where('is_active', true); if ($selectedVariantIds !== []) { $query->orWhereHas( diff --git a/app/Services/Manage/OrderService.php b/app/Services/Manage/OrderService.php index 42be869..e84fa77 100644 --- a/app/Services/Manage/OrderService.php +++ b/app/Services/Manage/OrderService.php @@ -6,7 +6,6 @@ use App\Enums\OrderStatus; use App\Enums\PaymentType; use App\Enums\PriceType; -use App\Enums\ProductStatus; use App\Enums\ProductStockQuality; use App\Models\Customer; use App\Models\Order; @@ -144,8 +143,7 @@ public function catalogItems(?Order $order = null, ?User $user = null): Collecti ->orderBy('created_at'), ]) ->where(function (Builder $query) use ($orderVariantIds): void { - $query->where('is_active', true) - ->where('status', ProductStatus::APPROVED); + $query->where('is_active', true); if ($orderVariantIds !== []) { $query->orWhereHas( diff --git a/database/factories/ProductFactory.php b/database/factories/ProductFactory.php index 805f8c1..9bf337e 100644 --- a/database/factories/ProductFactory.php +++ b/database/factories/ProductFactory.php @@ -2,7 +2,6 @@ namespace Database\Factories; -use App\Enums\ProductStatus; use App\Models\Product; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Str; @@ -21,8 +20,6 @@ public function definition(): array 'slug' => Str::slug($name), 'description' => fake()->optional()->paragraph(), 'is_active' => true, - 'status' => ProductStatus::APPROVED, - 'was_ever_approved' => true, ]; } diff --git a/database/migrations/2026_06_19_100001_add_approval_columns_to_products_table.php b/database/migrations/2026_06_19_100001_add_approval_columns_to_products_table.php index b1cd24d..5717168 100644 --- a/database/migrations/2026_06_19_100001_add_approval_columns_to_products_table.php +++ b/database/migrations/2026_06_19_100001_add_approval_columns_to_products_table.php @@ -1,6 +1,5 @@ string('status', 20)->default(ProductStatus::PENDING->value)->after('is_active'); + $table->string('status', 20)->default('pending')->after('is_active'); $table->string('pending_action', 20)->nullable()->after('status'); $table->boolean('was_ever_approved')->default(false)->after('pending_action'); $table->timestamp('verified_at')->nullable()->after('was_ever_approved'); @@ -20,7 +19,7 @@ public function up(): void }); DB::table('products')->update([ - 'status' => ProductStatus::APPROVED->value, + 'status' => 'approved', 'was_ever_approved' => true, ]); } diff --git a/database/migrations/2026_06_21_052600_drop_approval_columns_from_products_table.php b/database/migrations/2026_06_21_052600_drop_approval_columns_from_products_table.php new file mode 100644 index 0000000..898dc49 --- /dev/null +++ b/database/migrations/2026_06_21_052600_drop_approval_columns_from_products_table.php @@ -0,0 +1,29 @@ +dropConstrainedForeignId('submitted_by_id'); + $table->dropConstrainedForeignId('verified_by_id'); + $table->dropColumn(['status', 'pending_action', 'was_ever_approved', 'verified_at']); + }); + } + + public function down(): void + { + Schema::table('products', function (Blueprint $table) { + $table->string('status', 20)->default('pending')->after('is_active'); + $table->string('pending_action', 20)->nullable()->after('status'); + $table->boolean('was_ever_approved')->default(false)->after('pending_action'); + $table->timestamp('verified_at')->nullable()->after('was_ever_approved'); + $table->foreignId('verified_by_id')->nullable()->after('verified_at')->constrained('users')->nullOnDelete(); + $table->foreignId('submitted_by_id')->nullable()->after('verified_by_id')->constrained('users')->nullOnDelete(); + }); + } +}; diff --git a/database/seeders/ProductSeeder.php b/database/seeders/ProductSeeder.php index c8627f2..2896d3e 100644 --- a/database/seeders/ProductSeeder.php +++ b/database/seeders/ProductSeeder.php @@ -2,7 +2,6 @@ namespace Database\Seeders; -use App\Enums\ProductStatus; use App\Models\Category; use App\Models\Product; use App\Models\ProductVariant; @@ -78,8 +77,6 @@ public function run(): void 'slug' => str()->slug($productData['name']), 'description' => $productData['description'], 'is_active' => true, - 'status' => ProductStatus::APPROVED, - 'was_ever_approved' => true, ]); $product->categories()->sync(