feat(inventory): 強化調撥單功能,支援販賣機貨道欄位、開放商品重複加入及優化過帳庫存檢核
This commit is contained in:
103
tests/Feature/InventoryTransferImportTest.php
Normal file
103
tests/Feature/InventoryTransferImportTest.php
Normal file
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Modules\Core\Models\User;
|
||||
use App\Modules\Inventory\Models\InventoryTransferOrder;
|
||||
use App\Modules\Inventory\Models\Product;
|
||||
use App\Modules\Inventory\Models\Warehouse;
|
||||
use App\Modules\Inventory\Imports\InventoryTransferItemImport;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Tests\TestCase;
|
||||
|
||||
class InventoryTransferImportTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
protected $user;
|
||||
protected $fromWarehouse;
|
||||
protected $toWarehouse;
|
||||
protected $order;
|
||||
protected $product;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
$this->user = User::create([
|
||||
'name' => 'Test User',
|
||||
'username' => 'testuser',
|
||||
'email' => 'test@example.com',
|
||||
'password' => bcrypt('password'),
|
||||
]);
|
||||
$this->actingAs($this->user);
|
||||
|
||||
$this->fromWarehouse = Warehouse::create([
|
||||
'code' => 'W1',
|
||||
'name' => 'From Warehouse',
|
||||
'type' => 'standard',
|
||||
]);
|
||||
$this->toWarehouse = Warehouse::create([
|
||||
'code' => 'W2',
|
||||
'name' => 'To Warehouse',
|
||||
'type' => 'standard',
|
||||
]);
|
||||
|
||||
$this->order = InventoryTransferOrder::create([
|
||||
'doc_no' => 'TO' . time(),
|
||||
'from_warehouse_id' => $this->fromWarehouse->id,
|
||||
'to_warehouse_id' => $this->toWarehouse->id,
|
||||
'status' => 'draft',
|
||||
'created_by' => $this->user->id,
|
||||
]);
|
||||
|
||||
$this->product = Product::create([
|
||||
'code' => 'P001',
|
||||
'name' => 'Test Product',
|
||||
'status' => 'enabled',
|
||||
]);
|
||||
}
|
||||
|
||||
/** @test */
|
||||
public function it_can_import_items_with_chinese_headers()
|
||||
{
|
||||
// 建立假 Excel,使用中文標題
|
||||
$content = [
|
||||
['商品代碼', '批號', '數量', '備註'],
|
||||
['P001', 'BATCH001', '10', 'Imported Via Test'],
|
||||
['P001', '', '5', 'Batch should be NO-BATCH'],
|
||||
];
|
||||
|
||||
// 這裡我們直接呼叫 Import 類別來測試,避免多層模擬
|
||||
$import = new InventoryTransferItemImport($this->order);
|
||||
|
||||
// 我們模擬 Maatwebsite\Excel 傳入的 Collection
|
||||
// 注意:Excel 預設會將標題 slugify。如果 "商品代碼" 被 slugify,我們的 Import 類別會在那邊掛掉。
|
||||
// 所以這個測試可以幫我們確認 keys 是否如預期。
|
||||
|
||||
// 如果 WithHeadingRow 是用 slug 處理,那 keys 會是 slug 化的版本。
|
||||
// 但如果我們在 Import 類別中直接讀取 $row['商品代碼'],我們得確定它真的在那裡。
|
||||
|
||||
$rows = collect([
|
||||
collect(['商品代碼' => 'P001', '批號' => 'BATCH001', '數量' => '10', '備註' => 'Imported Via Test']),
|
||||
collect(['商品代碼' => 'P001', '批號' => '', '數量' => '5', '備註' => 'Batch should be NO-BATCH']),
|
||||
]);
|
||||
|
||||
$import->collection($rows);
|
||||
|
||||
$this->assertDatabaseHas('inventory_transfer_items', [
|
||||
'transfer_order_id' => $this->order->id,
|
||||
'product_id' => $this->product->id,
|
||||
'batch_number' => 'BATCH001',
|
||||
'quantity' => 10,
|
||||
]);
|
||||
|
||||
$this->assertDatabaseHas('inventory_transfer_items', [
|
||||
'transfer_order_id' => $this->order->id,
|
||||
'product_id' => $this->product->id,
|
||||
'batch_number' => 'NO-BATCH',
|
||||
'quantity' => 5,
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user