diff --git a/app/Enums/PriceType.php b/app/Enums/PriceType.php index b8b98ed..f2fa4ff 100644 --- a/app/Enums/PriceType.php +++ b/app/Enums/PriceType.php @@ -15,6 +15,7 @@ enum PriceType: string case ECER = 'ecer'; case TIKTOK = 'tiktok'; case SHOPEE = 'shopee'; + case HARGA_MODAL = 'harga_modal'; public function label(): string { @@ -26,6 +27,7 @@ public function label(): string self::ECER => 'Eceran', self::TIKTOK => 'TikTok', self::SHOPEE => 'Shopee', + self::HARGA_MODAL => 'Harga Modal', }; } diff --git a/app/Http/Controllers/Admin/Manage/StockController.php b/app/Http/Controllers/Admin/Manage/StockController.php index 8dd6e4b..5ee5fdb 100644 --- a/app/Http/Controllers/Admin/Manage/StockController.php +++ b/app/Http/Controllers/Admin/Manage/StockController.php @@ -43,21 +43,4 @@ public function verify(StockVerifyRequest $request, Cutting $cutting): RedirectR return redirect()->route('admin.manage.stocks.index'); } - - public function reject(Request $request, Cutting $cutting): RedirectResponse - { - $request->validate([ - 'reason' => ['required', 'string', 'max:500'], - ]); - - $this->stockService->reject( - $cutting, - $request->user(), - $request->validated('reason'), - ); - - $this->flashSuccess('Cutting berhasil ditolak dan dikembalikan ke proses.'); - - return redirect()->route('admin.manage.stocks.index'); - } } diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index 217e8e1..8b3a57e 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -2,8 +2,10 @@ namespace App\Http\Middleware; +use App\Enums\CuttingStatus; use App\Enums\EmployeeAdvanceStatus; use App\Enums\LeaveRequestStatus; +use App\Models\Cutting; use App\Models\EmployeeAdvance; use App\Models\LeaveRequest; use App\Services\System\Setting\SystemService; @@ -70,6 +72,7 @@ public function share(Request $request): array 'vapidPublicKey' => config('webpush.vapid.public_key'), 'pendingLeaveRequests' => fn () => $this->pendingLeaveRequests($request), 'pendingEmployeeAdvances' => fn () => $this->pendingEmployeeAdvances($request), + 'pendingCuttings' => fn () => $this->pendingCuttings($request), ]; } @@ -98,4 +101,17 @@ private function pendingEmployeeAdvances(Request $request): int ->where('status', EmployeeAdvanceStatus::PENDING) ->count(); } + + private function pendingCuttings(Request $request): int + { + $user = $request->user(); + + if ($user === null || ! $user->can('cuttings.view')) { + return 0; + } + + return Cutting::query() + ->where('status', CuttingStatus::COMPLETED) + ->count(); + } } diff --git a/app/Http/Requests/Admin/Manage/StockVerifyRequest.php b/app/Http/Requests/Admin/Manage/StockVerifyRequest.php index 498fea0..8281c43 100644 --- a/app/Http/Requests/Admin/Manage/StockVerifyRequest.php +++ b/app/Http/Requests/Admin/Manage/StockVerifyRequest.php @@ -32,7 +32,7 @@ public function rules(): array 'result_prices.*.product_variant_id' => ['required_with:result_prices', 'integer', 'exists:product_variants,id'], 'result_prices.*.prices' => ['required_with:result_prices', 'array', 'min:1'], 'result_prices.*.prices.*.type' => ['required', Rule::enum(PriceType::class)], - 'result_prices.*.prices.*.price' => ['required', 'integer', 'gt:0'], + 'result_prices.*.prices.*.price' => ['required', 'integer', 'min:0'], ]; } diff --git a/app/Services/Manage/StockService.php b/app/Services/Manage/StockService.php index 7da4667..8d1ce81 100644 --- a/app/Services/Manage/StockService.php +++ b/app/Services/Manage/StockService.php @@ -5,6 +5,7 @@ use App\Enums\CuttingStatus; use App\Models\Cutting; use App\Models\CuttingResultPrice; +use App\Models\ProductPrice; use App\Models\ProductVariant; use App\Models\RawMaterialPrice; use App\Models\User; @@ -101,6 +102,7 @@ public function verify( } $this->applyProductStockOnVerify($cutting); + $this->storeResultPrices($cutting, $resultPrices ?? []); if ($verificationNote !== null && trim($verificationNote) !== '') { @@ -190,18 +192,49 @@ private function deductRemainingMaterialStock(Cutting $cutting): void */ private function storeResultPrices(Cutting $cutting, array $resultPrices): void { - $costPerUnit = (int) ($cutting->cost_per_unit ?? 0); + // Extract harga_modal from the first variant's prices and set as cost_per_unit + $costPerUnit = 0; + foreach ($resultPrices as $resultData) { + foreach ($resultData['prices'] as $priceData) { + if ($priceData['type'] === 'harga_modal' && (int) $priceData['price'] > 0) { + $costPerUnit = (int) $priceData['price']; + break 2; + } + } + } + + if ($costPerUnit > 0) { + $cutting->cost_per_unit = $costPerUnit; + } else { + $costPerUnit = (int) ($cutting->cost_per_unit ?? 0); + } foreach ($resultPrices as $resultData) { foreach ($resultData['prices'] as $priceData) { if ((int) $priceData['price'] > 0) { - CuttingResultPrice::query()->create([ - 'cutting_id' => $cutting->id, - 'product_variant_id' => $resultData['product_variant_id'], - 'price_type' => $priceData['type'], - 'price' => (int) $priceData['price'], - 'cost_per_unit' => $costPerUnit, - ]); + // Store/update to cutting_result_prices + CuttingResultPrice::query()->updateOrCreate( + [ + 'cutting_id' => $cutting->id, + 'product_variant_id' => $resultData['product_variant_id'], + 'price_type' => $priceData['type'], + ], + [ + 'price' => (int) $priceData['price'], + 'cost_per_unit' => $costPerUnit, + ], + ); + + // Store/update in product_prices + ProductPrice::query()->updateOrCreate( + [ + 'variant_id' => $resultData['product_variant_id'], + 'type' => $priceData['type'], + ], + [ + 'price' => (int) $priceData['price'], + ], + ); } } } diff --git a/database/migrations/2026_06_21_140151_add_harga_modal_to_cutting_result_prices_table.php b/database/migrations/2026_06_21_140151_add_harga_modal_to_cutting_result_prices_table.php new file mode 100644 index 0000000..7094fb5 --- /dev/null +++ b/database/migrations/2026_06_21_140151_add_harga_modal_to_cutting_result_prices_table.php @@ -0,0 +1,23 @@ + Verifikasi Stok -
- Verifikasi hasil cutting untuk menambahkan stok produk ke toko. -
diff --git a/resources/js/pages/admin/manage/stocks/table/StockPendingSection.vue b/resources/js/pages/admin/manage/stocks/table/StockPendingSection.vue index 4157057..fbb27e0 100644 --- a/resources/js/pages/admin/manage/stocks/table/StockPendingSection.vue +++ b/resources/js/pages/admin/manage/stocks/table/StockPendingSection.vue @@ -10,15 +10,6 @@ defineProps<{