采购单优化
This commit is contained in:
@@ -335,6 +335,87 @@ class PurchaseEditTest extends ProcurementTestCase
|
||||
$this->assertSame('40.00', (string) $purchase->actual_amount, '2 包 × 每包成本 20.00');
|
||||
}
|
||||
|
||||
/** 门店购买详情:按商品聚合该门店采购汇总(数量/包规/单位/单价/预计金额),仅含该门店明细 */
|
||||
public function test_store_summary_returns_aggregated_items(): void
|
||||
{
|
||||
[$purchase, $product, $stores] = $this->buildPurchase();
|
||||
$this->actingAsSysUser();
|
||||
|
||||
$response = $this->getJson("/purchase/order/{$purchase->id}/store?store_id={$stores[0]->id}")
|
||||
->assertOk()
|
||||
->assertJsonPath('success', true);
|
||||
|
||||
$data = $response->json('data');
|
||||
$this->assertSame($stores[0]->name, $data['store']['name']);
|
||||
$this->assertCount(1, $data['items']);
|
||||
|
||||
$row = $data['items'][0];
|
||||
$this->assertSame($product->id, $row['product_id']);
|
||||
$this->assertSame('10斤/箱', $row['product_spec']);
|
||||
$this->assertSame('斤', $row['unit']);
|
||||
$this->assertSame('10.00', (string) $row['price']);
|
||||
$this->assertSame(2, $row['quantity']);
|
||||
$this->assertSame('20.00', (string) $row['amount']);
|
||||
|
||||
// 另一门店只见自身明细
|
||||
$this->getJson("/purchase/order/{$purchase->id}/store?store_id={$stores[1]->id}")
|
||||
->assertOk()
|
||||
->assertJsonPath('data.items.0.quantity', 3)
|
||||
->assertJsonPath('data.items.0.amount', '30.00');
|
||||
}
|
||||
|
||||
/** 门店购买详情:同一商品多笔订单不同单价 → 数量合计、金额求和、单价为加权平均 */
|
||||
public function test_store_summary_aggregates_multiple_orders_with_weighted_price(): void
|
||||
{
|
||||
$level = CustomerLevelModel::factory()->create();
|
||||
$store = StoreModel::factory()->create(['level_id' => $level->id]);
|
||||
$product = ProductModel::factory()->create([
|
||||
'status' => ProductModel::STATUS_ON,
|
||||
'cost_price' => 20,
|
||||
'spec' => '10斤/箱',
|
||||
'unit' => '斤',
|
||||
]);
|
||||
ProductPriceModel::factory()->create(['product_id' => $product->id, 'level_id' => $level->id, 'price' => 10.00]);
|
||||
|
||||
$this->actingAsMiniUser(UserModel::factory()->forStore($store->id)->create());
|
||||
foreach ([2, 3] as $qty) {
|
||||
$this->postJson('/mini/order', ['items' => [['product_id' => $product->id, 'quantity' => $qty]]])
|
||||
->assertJsonPath('success', true);
|
||||
}
|
||||
StoreOrderModel::query()->update(['status' => StoreOrderModel::STATUS_SUMMARIZED]);
|
||||
|
||||
$this->actingAsSysUser();
|
||||
$this->postJson('/purchase/order/generate', ['purchase_date' => now()->toDateString()])
|
||||
->assertJsonPath('success', true);
|
||||
|
||||
$purchase = PurchaseOrderModel::first();
|
||||
// 第二笔明细单价改为 20.00,构造同商品双单价:2×10 + 3×20
|
||||
$secondItem = StoreOrderItemModel::orderBy('id')->skip(1)->first();
|
||||
$this->putJson("/purchase/order/cell/{$secondItem->id}", ['quantity' => 3, 'price' => 20])
|
||||
->assertJsonPath('success', true);
|
||||
|
||||
$this->getJson("/purchase/order/{$purchase->id}/store?store_id={$store->id}")
|
||||
->assertOk()
|
||||
->assertJsonPath('data.items.0.quantity', 5)
|
||||
->assertJsonPath('data.items.0.price', '16.00', '(20+60) ÷ 5 加权平均')
|
||||
->assertJsonPath('data.items.0.amount', '80.00');
|
||||
}
|
||||
|
||||
/** 门店购买详情参数校验:缺少门店参数 / 采购单不存在均拒绝 */
|
||||
public function test_store_summary_rejects_missing_or_invalid_params(): void
|
||||
{
|
||||
[$purchase] = $this->buildPurchase();
|
||||
$this->actingAsSysUser();
|
||||
|
||||
$this->getJson("/purchase/order/{$purchase->id}/store")
|
||||
->assertJsonPath('success', false)
|
||||
->assertJsonPath('msg', '缺少门店参数');
|
||||
|
||||
$this->getJson('/purchase/order/99999/store?store_id=1')
|
||||
->assertJsonPath('success', false)
|
||||
->assertJsonPath('msg', '采购单不存在');
|
||||
}
|
||||
|
||||
/** 采购单已完成:单元格编辑/同步、行修改均拒绝,明细不变 */
|
||||
public function test_edits_rejected_when_purchase_completed(): void
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user