feat: refactor cache configuration to use class constants for improved readability and maintainability; update Cutting and Order tests to utilize service classes directly

This commit is contained in:
Yoga Pangestu 2026-07-08 15:35:26 +07:00
parent 1c4f82529c
commit 5b9c294bf2
3 changed files with 163 additions and 89 deletions

View File

@ -1,6 +1,78 @@
<?php
use App\Enums\ActivityEventLabel;
use App\Enums\CashTransactionType;
use App\Enums\CuttingStatus;
use App\Enums\EmployeeAdvanceStatus;
use App\Enums\EmploymentStatus;
use App\Enums\Gender;
use App\Enums\LeaveRequestStatus;
use App\Enums\MarketplaceFeeScope;
use App\Enums\MarketplaceFeeValueType;
use App\Enums\OrderChannel;
use App\Enums\OrderStatus;
use App\Enums\OwnerVerificationAction;
use App\Enums\OwnerVerificationStatus;
use App\Enums\PaymentType;
use App\Enums\PayrollAdjustmentType;
use App\Enums\PayrollPeriodStatus;
use App\Enums\PayrollStatus;
use App\Enums\Permission;
use App\Enums\PriceType;
use App\Enums\ProductStockQuality;
use App\Enums\RawMaterialUnit;
use App\Enums\Role;
use App\Enums\StokOpnameStatus;
use App\Models\Attendance;
use App\Models\CashAccount;
use App\Models\CashTransaction;
use App\Models\Category;
use App\Models\Customer;
use App\Models\Cutting;
use App\Models\CuttingMaterial;
use App\Models\CuttingMaterialCombination;
use App\Models\CuttingResult;
use App\Models\CuttingResultPrice;
use App\Models\Employee;
use App\Models\EmployeeAdvance;
use App\Models\EmployeeAdvancePayment;
use App\Models\Expense;
use App\Models\HomepageConfiguration;
use App\Models\LeaveRequest;
use App\Models\Notification;
use App\Models\Order;
use App\Models\OrderItem;
use App\Models\OwnerVerificationRequest;
use App\Models\Payroll;
use App\Models\PayrollAdjustment;
use App\Models\PayrollPeriod;
use App\Models\Product;
use App\Models\ProductPrice;
use App\Models\ProductVariant;
use App\Models\Purchase;
use App\Models\PurchaseItem;
use App\Models\PushSubscription;
use App\Models\RawMaterial;
use App\Models\RawMaterialPrice;
use App\Models\Rejection;
use App\Models\RetailStockHistory;
use App\Models\StokOpname;
use App\Models\StokOpnameItem;
use App\Models\Supplier;
use App\Models\SystemConfiguration;
use App\Models\User;
use App\Models\UserProfile;
use App\Settings\HomepageSettings;
use App\Settings\HrSettings;
use App\Settings\MarketplaceSettings;
use App\Settings\SocialMediaSettings;
use App\Settings\SystemSettings;
use Illuminate\Database\Eloquent\Relations\MorphPivot;
use Illuminate\Database\Eloquent\Relations\Pivot;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
use Spatie\Activitylog\Models\Activity;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
return [
@ -133,92 +205,92 @@
'serializable_classes' => [
// Core PHP and Laravel Classes
Illuminate\Support\Collection::class,
Collection::class,
Illuminate\Database\Eloquent\Collection::class,
Carbon\Carbon::class,
Illuminate\Support\Carbon::class,
stdClass::class,
Illuminate\Database\Eloquent\Relations\Pivot::class,
Illuminate\Database\Eloquent\Relations\MorphPivot::class,
Pivot::class,
MorphPivot::class,
// Spatie Packages Classes
Spatie\Permission\Models\Role::class,
Spatie\Permission\Models\Permission::class,
Spatie\Activitylog\Models\Activity::class,
Spatie\MediaLibrary\MediaCollections\Models\Media::class,
Activity::class,
Media::class,
// Application Settings
App\Settings\HomepageSettings::class,
App\Settings\HrSettings::class,
App\Settings\MarketplaceSettings::class,
App\Settings\SocialMediaSettings::class,
App\Settings\SystemSettings::class,
HomepageSettings::class,
HrSettings::class,
MarketplaceSettings::class,
SocialMediaSettings::class,
SystemSettings::class,
// Application Models
App\Models\Attendance::class,
App\Models\CashAccount::class,
App\Models\CashTransaction::class,
App\Models\Category::class,
App\Models\Customer::class,
App\Models\Cutting::class,
App\Models\CuttingMaterial::class,
App\Models\CuttingMaterialCombination::class,
App\Models\CuttingResult::class,
App\Models\CuttingResultPrice::class,
App\Models\Employee::class,
App\Models\EmployeeAdvance::class,
App\Models\EmployeeAdvancePayment::class,
App\Models\Expense::class,
App\Models\HomepageConfiguration::class,
App\Models\LeaveRequest::class,
App\Models\Notification::class,
App\Models\Order::class,
App\Models\OrderItem::class,
App\Models\OwnerVerificationRequest::class,
App\Models\Payroll::class,
App\Models\PayrollAdjustment::class,
App\Models\PayrollPeriod::class,
App\Models\Product::class,
App\Models\ProductPrice::class,
App\Models\ProductVariant::class,
App\Models\Purchase::class,
App\Models\PurchaseItem::class,
App\Models\PushSubscription::class,
App\Models\RawMaterial::class,
App\Models\RawMaterialPrice::class,
App\Models\Rejection::class,
App\Models\RetailStockHistory::class,
App\Models\StokOpname::class,
App\Models\StokOpnameItem::class,
App\Models\Supplier::class,
App\Models\SystemConfiguration::class,
App\Models\User::class,
App\Models\UserProfile::class,
Attendance::class,
CashAccount::class,
CashTransaction::class,
Category::class,
Customer::class,
Cutting::class,
CuttingMaterial::class,
CuttingMaterialCombination::class,
CuttingResult::class,
CuttingResultPrice::class,
Employee::class,
EmployeeAdvance::class,
EmployeeAdvancePayment::class,
Expense::class,
HomepageConfiguration::class,
LeaveRequest::class,
Notification::class,
Order::class,
OrderItem::class,
OwnerVerificationRequest::class,
Payroll::class,
PayrollAdjustment::class,
PayrollPeriod::class,
Product::class,
ProductPrice::class,
ProductVariant::class,
Purchase::class,
PurchaseItem::class,
PushSubscription::class,
RawMaterial::class,
RawMaterialPrice::class,
Rejection::class,
RetailStockHistory::class,
StokOpname::class,
StokOpnameItem::class,
Supplier::class,
SystemConfiguration::class,
User::class,
UserProfile::class,
// Application Enums
App\Enums\ActivityEventLabel::class,
App\Enums\CashTransactionType::class,
App\Enums\CuttingStatus::class,
App\Enums\EmployeeAdvanceStatus::class,
App\Enums\EmploymentStatus::class,
App\Enums\Gender::class,
App\Enums\LeaveRequestStatus::class,
App\Enums\MarketplaceFeeScope::class,
App\Enums\MarketplaceFeeValueType::class,
App\Enums\OrderChannel::class,
App\Enums\OrderStatus::class,
App\Enums\OwnerVerificationAction::class,
App\Enums\OwnerVerificationStatus::class,
App\Enums\PaymentType::class,
App\Enums\PayrollAdjustmentType::class,
App\Enums\PayrollPeriodStatus::class,
App\Enums\PayrollStatus::class,
App\Enums\Permission::class,
App\Enums\PriceType::class,
App\Enums\ProductStockQuality::class,
App\Enums\RawMaterialUnit::class,
App\Enums\Role::class,
App\Enums\StokOpnameStatus::class,
ActivityEventLabel::class,
CashTransactionType::class,
CuttingStatus::class,
EmployeeAdvanceStatus::class,
EmploymentStatus::class,
Gender::class,
LeaveRequestStatus::class,
MarketplaceFeeScope::class,
MarketplaceFeeValueType::class,
OrderChannel::class,
OrderStatus::class,
OwnerVerificationAction::class,
OwnerVerificationStatus::class,
PaymentType::class,
PayrollAdjustmentType::class,
PayrollPeriodStatus::class,
PayrollStatus::class,
Permission::class,
PriceType::class,
ProductStockQuality::class,
RawMaterialUnit::class,
Role::class,
StokOpnameStatus::class,
],
];

View File

@ -12,6 +12,7 @@
use App\Models\RawMaterial;
use App\Models\RawMaterialPrice;
use App\Models\User;
use App\Services\Manage\CuttingService;
use Database\Seeders\RolePermissionSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Storage;
@ -1130,15 +1131,15 @@ function setupDraftItems(User $user): array
$user = createCuttingUserWithPermission(PermissionEnum::CUTTINGS_VIEW, PermissionEnum::CUTTINGS_CREATE);
$rawMaterial = RawMaterial::factory()->create(['is_active' => true]);
$priceWithStock = RawMaterialPrice::factory()->create(['raw_material_id' => $rawMaterial->id, 'stock' => 10]);
$priceWithStock = RawMaterialPrice::factory()->create(['raw_material_id' => $rawMaterial->id, 'stock' => 10]);
$priceWithoutStock = RawMaterialPrice::factory()->create(['raw_material_id' => $rawMaterial->id, 'stock' => 0]);
$this->actingAs($user)
->get(route('admin.manage.cuttings.create'))
->assertOk();
$service = app(\App\Services\Manage\CuttingService::class);
$catalog = $service->rawMaterialCatalog(user: $user);
$service = app(CuttingService::class);
$catalog = $service->rawMaterialCatalog(user: $user);
$material = $catalog->firstWhere('id', $rawMaterial->id);
$priceIds = $material->prices->pluck('id')->all();
@ -1155,12 +1156,12 @@ function setupDraftItems(User $user): array
$cutting = Cutting::factory()->create(['created_by_id' => $user->id]);
CuttingMaterial::factory()->create([
'cutting_id' => $cutting->id,
'cutting_id' => $cutting->id,
'raw_material_price_id' => $priceZeroStock->id,
]);
$service = app(\App\Services\Manage\CuttingService::class);
$catalog = $service->rawMaterialCatalog($cutting);
$service = app(CuttingService::class);
$catalog = $service->rawMaterialCatalog($cutting);
$material = $catalog->firstWhere('id', $rawMaterial->id);
$priceIds = $material?->prices->pluck('id')->all() ?? [];

View File

@ -12,6 +12,7 @@
use App\Models\ProductPrice;
use App\Models\ProductVariant;
use App\Models\User;
use App\Services\Manage\OrderService;
use Database\Seeders\CashAccountSeeder;
use Database\Seeders\RolePermissionSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
@ -622,14 +623,14 @@ function setupOrderDraftItems(User $user): ProductVariant
$product = Product::factory()->create(['is_active' => true]);
$variantWithStock = ProductVariant::factory()->create(['product_id' => $product->id, 'stock' => 10, 'reject_stock' => 0, 'retail_stock' => 0]);
$variantAllZero = ProductVariant::factory()->create(['product_id' => $product->id, 'stock' => 0, 'reject_stock' => 0, 'retail_stock' => 0]);
$variantRejectOnly = ProductVariant::factory()->create(['product_id' => $product->id, 'stock' => 0, 'reject_stock' => 5, 'retail_stock' => 0]);
$variantRetailOnly = ProductVariant::factory()->create(['product_id' => $product->id, 'stock' => 0, 'reject_stock' => 0, 'retail_stock' => 3]);
$variantWithStock = ProductVariant::factory()->create(['product_id' => $product->id, 'stock' => 10, 'reject_stock' => 0, 'retail_stock' => 0]);
$variantAllZero = ProductVariant::factory()->create(['product_id' => $product->id, 'stock' => 0, 'reject_stock' => 0, 'retail_stock' => 0]);
$variantRejectOnly = ProductVariant::factory()->create(['product_id' => $product->id, 'stock' => 0, 'reject_stock' => 5, 'retail_stock' => 0]);
$variantRetailOnly = ProductVariant::factory()->create(['product_id' => $product->id, 'stock' => 0, 'reject_stock' => 0, 'retail_stock' => 3]);
$service = app(\App\Services\Manage\OrderService::class);
$service = app(OrderService::class);
$catalog = $service->catalogItems(user: $user);
$found = $catalog->firstWhere('id', $product->id);
$found = $catalog->firstWhere('id', $product->id);
$variantIds = $found?->variants->pluck('id')->all() ?? [];
@ -644,21 +645,21 @@ function setupOrderDraftItems(User $user): ProductVariant
$product = Product::factory()->create(['is_active' => true]);
$variantAllZero = ProductVariant::factory()->create([
'product_id' => $product->id,
'stock' => 0,
'product_id' => $product->id,
'stock' => 0,
'reject_stock' => 0,
'retail_stock' => 0,
]);
$order = Order::factory()->create(['created_by_id' => $user->id]);
OrderItem::factory()->create([
'order_id' => $order->id,
'order_id' => $order->id,
'product_variant_id' => $variantAllZero->id,
]);
$service = app(\App\Services\Manage\OrderService::class);
$service = app(OrderService::class);
$catalog = $service->catalogItems($order);
$found = $catalog->firstWhere('id', $product->id);
$found = $catalog->firstWhere('id', $product->id);
$variantIds = $found?->variants->pluck('id')->all() ?? [];