refactor: remove ProductPendingAction and ProductStatus enums, update related references in Product model and services for improved code clarity and maintainability
This commit is contained in:
parent
13f2c6d745
commit
ec80f2145b
@ -48,7 +48,6 @@ enum Permission: string
|
|||||||
case PRODUCTS_UPDATE = 'products.update';
|
case PRODUCTS_UPDATE = 'products.update';
|
||||||
case PRODUCTS_DELETE = 'products.delete';
|
case PRODUCTS_DELETE = 'products.delete';
|
||||||
case PRODUCTS_TOGGLE_STATUS = 'products.toggle-status';
|
case PRODUCTS_TOGGLE_STATUS = 'products.toggle-status';
|
||||||
case PRODUCTS_VERIFY = 'products.verify';
|
|
||||||
|
|
||||||
case RAW_MATERIALS_VIEW = 'raw-materials.view';
|
case RAW_MATERIALS_VIEW = 'raw-materials.view';
|
||||||
case RAW_MATERIALS_CREATE = 'raw-materials.create';
|
case RAW_MATERIALS_CREATE = 'raw-materials.create';
|
||||||
@ -151,7 +150,6 @@ public function label(): string
|
|||||||
self::PRODUCTS_UPDATE => 'Ubah Produk',
|
self::PRODUCTS_UPDATE => 'Ubah Produk',
|
||||||
self::PRODUCTS_DELETE => 'Hapus Produk',
|
self::PRODUCTS_DELETE => 'Hapus Produk',
|
||||||
self::PRODUCTS_TOGGLE_STATUS => 'Ubah Status Produk',
|
self::PRODUCTS_TOGGLE_STATUS => 'Ubah Status Produk',
|
||||||
self::PRODUCTS_VERIFY => 'Setujui/Tolak Produk',
|
|
||||||
|
|
||||||
self::RAW_MATERIALS_VIEW => 'Lihat Bahan Baku',
|
self::RAW_MATERIALS_VIEW => 'Lihat Bahan Baku',
|
||||||
self::RAW_MATERIALS_CREATE => 'Tambah 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_VIEW, self::CUSTOMERS_CREATE, self::CUSTOMERS_UPDATE,
|
||||||
self::CUSTOMERS_DELETE => 'Pelanggan',
|
self::CUSTOMERS_DELETE => 'Pelanggan',
|
||||||
self::PRODUCTS_VIEW, self::PRODUCTS_CREATE, self::PRODUCTS_UPDATE,
|
self::PRODUCTS_VIEW, self::PRODUCTS_CREATE, self::PRODUCTS_UPDATE,
|
||||||
self::PRODUCTS_DELETE, self::PRODUCTS_TOGGLE_STATUS,
|
self::PRODUCTS_DELETE, self::PRODUCTS_TOGGLE_STATUS => 'Produk',
|
||||||
self::PRODUCTS_VERIFY => 'Produk',
|
|
||||||
self::RAW_MATERIALS_VIEW, self::RAW_MATERIALS_CREATE, self::RAW_MATERIALS_UPDATE,
|
self::RAW_MATERIALS_VIEW, self::RAW_MATERIALS_CREATE, self::RAW_MATERIALS_UPDATE,
|
||||||
self::RAW_MATERIALS_DELETE, self::RAW_MATERIALS_TOGGLE_STATUS => 'Bahan Baku',
|
self::RAW_MATERIALS_DELETE, self::RAW_MATERIALS_TOGGLE_STATUS => 'Bahan Baku',
|
||||||
self::PURCHASES_VIEW, self::PURCHASES_CREATE, self::PURCHASES_UPDATE,
|
self::PURCHASES_VIEW, self::PURCHASES_CREATE, self::PURCHASES_UPDATE,
|
||||||
|
|||||||
@ -1,15 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Enums;
|
|
||||||
|
|
||||||
enum ProductPendingAction: string
|
|
||||||
{
|
|
||||||
case DELETE = 'delete';
|
|
||||||
|
|
||||||
public function label(): string
|
|
||||||
{
|
|
||||||
return match ($this) {
|
|
||||||
self::DELETE => 'Penghapusan',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Enums;
|
|
||||||
|
|
||||||
use App\Traits\ProvidesEnumOptions;
|
|
||||||
|
|
||||||
enum ProductStatus: string
|
|
||||||
{
|
|
||||||
use ProvidesEnumOptions;
|
|
||||||
|
|
||||||
case PENDING = 'pending';
|
|
||||||
case APPROVED = 'approved';
|
|
||||||
case REJECTED = 'rejected';
|
|
||||||
|
|
||||||
public function label(): string
|
|
||||||
{
|
|
||||||
return match ($this) {
|
|
||||||
self::PENDING => 'Menunggu',
|
|
||||||
self::APPROVED => 'Disetujui',
|
|
||||||
self::REJECTED => 'Ditolak',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
use App\Enums\ProductStatus;
|
|
||||||
use App\Models\Category;
|
use App\Models\Category;
|
||||||
use App\Models\Product;
|
use App\Models\Product;
|
||||||
use App\Models\SystemConfiguration;
|
use App\Models\SystemConfiguration;
|
||||||
@ -26,7 +25,6 @@ public function index(): Response
|
|||||||
$categories = Category::whereHas('products')->get(['id', 'name', 'slug']);
|
$categories = Category::whereHas('products')->get(['id', 'name', 'slug']);
|
||||||
|
|
||||||
$products = Product::where('is_active', true)
|
$products = Product::where('is_active', true)
|
||||||
->where('status', ProductStatus::APPROVED)
|
|
||||||
->with([
|
->with([
|
||||||
'categories',
|
'categories',
|
||||||
'variants' => fn ($query) => $query
|
'variants' => fn ($query) => $query
|
||||||
|
|||||||
@ -1,34 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Requests\Admin\Master;
|
|
||||||
|
|
||||||
use App\Enums\Permission;
|
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
|
||||||
|
|
||||||
class RejectProductRequest extends FormRequest
|
|
||||||
{
|
|
||||||
public function authorize(): bool
|
|
||||||
{
|
|
||||||
return $this->user()?->can(Permission::PRODUCTS_VERIFY->value) ?? false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return array<string, mixed>
|
|
||||||
*/
|
|
||||||
public function rules(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'reason' => ['required', 'string', 'max:500'],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return array<string, string>
|
|
||||||
*/
|
|
||||||
public function attributes(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'reason' => 'alasan penolakan',
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -2,16 +2,10 @@
|
|||||||
|
|
||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
use App\Enums\ProductPendingAction;
|
|
||||||
use App\Enums\ProductStatus;
|
|
||||||
use App\Models\Concerns\HasRejection;
|
|
||||||
use App\Models\Concerns\InteractsWithActivityLog;
|
use App\Models\Concerns\InteractsWithActivityLog;
|
||||||
use Illuminate\Database\Eloquent\Attributes\Appends;
|
|
||||||
use Illuminate\Database\Eloquent\Attributes\Guarded;
|
use Illuminate\Database\Eloquent\Attributes\Guarded;
|
||||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
@ -19,25 +13,14 @@
|
|||||||
|
|
||||||
#[Guarded(['id'])]
|
#[Guarded(['id'])]
|
||||||
#[Sluggable(from: 'name', to: 'slug')]
|
#[Sluggable(from: 'name', to: 'slug')]
|
||||||
#[Appends([
|
|
||||||
'status_label',
|
|
||||||
'pending_action_label',
|
|
||||||
'rejection_reason',
|
|
||||||
'is_editable',
|
|
||||||
'can_verify',
|
|
||||||
])]
|
|
||||||
class Product extends Model
|
class Product extends Model
|
||||||
{
|
{
|
||||||
use HasFactory, HasRejection, InteractsWithActivityLog, SoftDeletes;
|
use HasFactory, InteractsWithActivityLog, SoftDeletes;
|
||||||
|
|
||||||
protected function casts(): array
|
protected function casts(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'is_active' => 'boolean',
|
'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);
|
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(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,6 @@
|
|||||||
namespace App\Services\Manage;
|
namespace App\Services\Manage;
|
||||||
|
|
||||||
use App\Enums\CuttingStatus;
|
use App\Enums\CuttingStatus;
|
||||||
use App\Enums\ProductStatus;
|
|
||||||
use App\Models\Cutting;
|
use App\Models\Cutting;
|
||||||
use App\Models\CuttingMaterial;
|
use App\Models\CuttingMaterial;
|
||||||
use App\Models\CuttingResult;
|
use App\Models\CuttingResult;
|
||||||
@ -184,8 +183,7 @@ public function productCatalog(?Cutting $cutting = null, ?User $user = null): Co
|
|||||||
->orderBy('created_at'),
|
->orderBy('created_at'),
|
||||||
])
|
])
|
||||||
->where(function (Builder $query) use ($selectedVariantIds): void {
|
->where(function (Builder $query) use ($selectedVariantIds): void {
|
||||||
$query->where('is_active', true)
|
$query->where('is_active', true);
|
||||||
->where('status', ProductStatus::APPROVED);
|
|
||||||
|
|
||||||
if ($selectedVariantIds !== []) {
|
if ($selectedVariantIds !== []) {
|
||||||
$query->orWhereHas(
|
$query->orWhereHas(
|
||||||
|
|||||||
@ -6,7 +6,6 @@
|
|||||||
use App\Enums\OrderStatus;
|
use App\Enums\OrderStatus;
|
||||||
use App\Enums\PaymentType;
|
use App\Enums\PaymentType;
|
||||||
use App\Enums\PriceType;
|
use App\Enums\PriceType;
|
||||||
use App\Enums\ProductStatus;
|
|
||||||
use App\Enums\ProductStockQuality;
|
use App\Enums\ProductStockQuality;
|
||||||
use App\Models\Customer;
|
use App\Models\Customer;
|
||||||
use App\Models\Order;
|
use App\Models\Order;
|
||||||
@ -144,8 +143,7 @@ public function catalogItems(?Order $order = null, ?User $user = null): Collecti
|
|||||||
->orderBy('created_at'),
|
->orderBy('created_at'),
|
||||||
])
|
])
|
||||||
->where(function (Builder $query) use ($orderVariantIds): void {
|
->where(function (Builder $query) use ($orderVariantIds): void {
|
||||||
$query->where('is_active', true)
|
$query->where('is_active', true);
|
||||||
->where('status', ProductStatus::APPROVED);
|
|
||||||
|
|
||||||
if ($orderVariantIds !== []) {
|
if ($orderVariantIds !== []) {
|
||||||
$query->orWhereHas(
|
$query->orWhereHas(
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
namespace Database\Factories;
|
namespace Database\Factories;
|
||||||
|
|
||||||
use App\Enums\ProductStatus;
|
|
||||||
use App\Models\Product;
|
use App\Models\Product;
|
||||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
@ -21,8 +20,6 @@ public function definition(): array
|
|||||||
'slug' => Str::slug($name),
|
'slug' => Str::slug($name),
|
||||||
'description' => fake()->optional()->paragraph(),
|
'description' => fake()->optional()->paragraph(),
|
||||||
'is_active' => true,
|
'is_active' => true,
|
||||||
'status' => ProductStatus::APPROVED,
|
|
||||||
'was_ever_approved' => true,
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use App\Enums\ProductStatus;
|
|
||||||
use Illuminate\Database\Migrations\Migration;
|
use Illuminate\Database\Migrations\Migration;
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
@ -11,7 +10,7 @@
|
|||||||
public function up(): void
|
public function up(): void
|
||||||
{
|
{
|
||||||
Schema::table('products', function (Blueprint $table) {
|
Schema::table('products', function (Blueprint $table) {
|
||||||
$table->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->string('pending_action', 20)->nullable()->after('status');
|
||||||
$table->boolean('was_ever_approved')->default(false)->after('pending_action');
|
$table->boolean('was_ever_approved')->default(false)->after('pending_action');
|
||||||
$table->timestamp('verified_at')->nullable()->after('was_ever_approved');
|
$table->timestamp('verified_at')->nullable()->after('was_ever_approved');
|
||||||
@ -20,7 +19,7 @@ public function up(): void
|
|||||||
});
|
});
|
||||||
|
|
||||||
DB::table('products')->update([
|
DB::table('products')->update([
|
||||||
'status' => ProductStatus::APPROVED->value,
|
'status' => 'approved',
|
||||||
'was_ever_approved' => true,
|
'was_ever_approved' => true,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('products', function (Blueprint $table) {
|
||||||
|
$table->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();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
namespace Database\Seeders;
|
namespace Database\Seeders;
|
||||||
|
|
||||||
use App\Enums\ProductStatus;
|
|
||||||
use App\Models\Category;
|
use App\Models\Category;
|
||||||
use App\Models\Product;
|
use App\Models\Product;
|
||||||
use App\Models\ProductVariant;
|
use App\Models\ProductVariant;
|
||||||
@ -78,8 +77,6 @@ public function run(): void
|
|||||||
'slug' => str()->slug($productData['name']),
|
'slug' => str()->slug($productData['name']),
|
||||||
'description' => $productData['description'],
|
'description' => $productData['description'],
|
||||||
'is_active' => true,
|
'is_active' => true,
|
||||||
'status' => ProductStatus::APPROVED,
|
|
||||||
'was_ever_approved' => true,
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$product->categories()->sync(
|
$product->categories()->sync(
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user