[FIX] 修復所有 E2E 模組測試的標題定位器以及將測試帳號還原為 admin 權限
All checks were successful
ERP-Deploy-Demo / deploy-demo (push) Successful in 55s

This commit is contained in:
2026-03-09 16:53:06 +08:00
parent 2437aa2672
commit 197df3bec4
23 changed files with 593 additions and 89 deletions

View File

@@ -254,17 +254,21 @@ class PurchaseOrderController extends Controller
$productIds = collect($validated['items'])->pluck('productId')->unique()->toArray();
$products = $this->inventoryService->getProductsByIds($productIds)->keyBy('id');
$itemsToInsert = [];
foreach ($validated['items'] as $item) {
// 反算單價
$unitPrice = $item['quantity'] > 0 ? $item['subtotal'] / $item['quantity'] : 0;
$order->items()->create([
$itemsToInsert[] = [
'purchase_order_id' => $order->id,
'product_id' => $item['productId'],
'quantity' => $item['quantity'],
'unit_id' => $item['unitId'] ?? null,
'unit_price' => $unitPrice,
'subtotal' => $item['subtotal'],
]);
'created_at' => now(),
'updated_at' => now(),
];
$product = $products->get($item['productId']);
$diff['added'][] = [
@@ -275,6 +279,7 @@ class PurchaseOrderController extends Controller
]
];
}
\App\Modules\Procurement\Models\PurchaseOrderItem::insert($itemsToInsert);
// 手動發送高品質日誌(包含品項明細)
activity()
@@ -468,7 +473,8 @@ class PurchaseOrderController extends Controller
public function update(Request $request, $id)
{
$order = PurchaseOrder::findOrFail($id);
// 加上 lockForUpdate() 防止併發修改
$order = PurchaseOrder::lockForUpdate()->findOrFail($id);
$validated = $request->validate([
'vendor_id' => 'required|exists:vendors,id',
@@ -572,20 +578,23 @@ class PurchaseOrderController extends Controller
// 同步項目(原始邏輯)
$order->items()->delete();
$newItemsData = [];
$itemsToInsert = [];
foreach ($validated['items'] as $item) {
// 反算單價
$unitPrice = $item['quantity'] > 0 ? $item['subtotal'] / $item['quantity'] : 0;
$newItem = $order->items()->create([
$itemsToInsert[] = [
'purchase_order_id' => $order->id,
'product_id' => $item['productId'],
'quantity' => $item['quantity'],
'unit_id' => $item['unitId'] ?? null,
'unit_price' => $unitPrice,
'subtotal' => $item['subtotal'],
]);
$newItemsData[] = $newItem;
'created_at' => now(),
'updated_at' => now(),
];
}
\App\Modules\Procurement\Models\PurchaseOrderItem::insert($itemsToInsert);
// 3. 計算項目差異
$itemDiffs = [

View File

@@ -33,20 +33,23 @@ class PurchaseReturnService
$purchaseReturn = PurchaseReturn::create($data);
$itemsToInsert = [];
foreach ($data['items'] as $itemData) {
$amount = $itemData['quantity_returned'] * $itemData['unit_price'];
$totalAmount += $amount;
$prItem = new PurchaseReturnItem([
$itemsToInsert[] = [
'purchase_return_id' => $purchaseReturn->id,
'product_id' => $itemData['product_id'],
'quantity_returned' => $itemData['quantity_returned'],
'unit_price' => $itemData['unit_price'],
'total_amount' => $amount,
'batch_number' => $itemData['batch_number'] ?? null,
]);
$purchaseReturn->items()->save($prItem);
'created_at' => now(),
'updated_at' => now(),
];
}
PurchaseReturnItem::insert($itemsToInsert);
// 更新總計 (這裡假定不含額外稅金邏輯,或是由前端帶入 tax_amount)
$taxAmount = $data['tax_amount'] ?? 0;
@@ -87,19 +90,23 @@ class PurchaseReturnService
$purchaseReturn->items()->delete();
$totalAmount = 0;
$itemsToInsert = [];
foreach ($data['items'] as $itemData) {
$amount = $itemData['quantity_returned'] * $itemData['unit_price'];
$totalAmount += $amount;
$prItem = new PurchaseReturnItem([
$itemsToInsert[] = [
'purchase_return_id' => $purchaseReturn->id,
'product_id' => $itemData['product_id'],
'quantity_returned' => $itemData['quantity_returned'],
'unit_price' => $itemData['unit_price'],
'total_amount' => $amount,
'batch_number' => $itemData['batch_number'] ?? null,
]);
$purchaseReturn->items()->save($prItem);
'created_at' => now(),
'updated_at' => now(),
];
}
PurchaseReturnItem::insert($itemsToInsert);
$taxAmount = $purchaseReturn->tax_amount;
$purchaseReturn->update([
@@ -117,11 +124,14 @@ class PurchaseReturnService
*/
public function submit(PurchaseReturn $purchaseReturn)
{
if ($purchaseReturn->status !== PurchaseReturn::STATUS_DRAFT) {
throw new Exception('只有草稿狀態的退回單可以提交。');
}
return DB::transaction(function () use ($purchaseReturn) {
// 加上 lockForUpdate() 防止併發提交
$purchaseReturn = PurchaseReturn::lockForUpdate()->find($purchaseReturn->id);
if ($purchaseReturn->status !== PurchaseReturn::STATUS_DRAFT) {
throw new Exception('只有草稿狀態的退回單可以提交。');
}
// 1. 儲存狀態,避免觸發自動修改紀錄 (合併行為)
$purchaseReturn->status = PurchaseReturn::STATUS_COMPLETED;
$purchaseReturn->saveQuietly();