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

View File

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

View File

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