fix(t243): allow deleting unreferenced procurement drafts

This commit is contained in:
QiuSW
2026-07-29 16:45:25 +08:00
parent 62eee74a70
commit 24eef29076
12 changed files with 504 additions and 102 deletions
@@ -642,7 +642,63 @@ func (store *Store) DeleteFreightOrder(
return nil, repositoryFailure(err)
}
var inUse int
var hasPurchaseTask int
err = tx.QueryRowContext(
ctx,
`SELECT EXISTS (
SELECT 1
FROM freight_order_items AS item
JOIN procurement_requests AS request
ON request.freight_order_item_id = item.id
WHERE item.freight_order_id = ?
AND request.purchase_task_id IS NOT NULL
)`,
storedOrderID,
).Scan(&hasPurchaseTask)
if err != nil {
return nil, repositoryFailure(err)
}
if hasPurchaseTask != 0 {
return nil, usecase.ErrFreightOrderHasPurchaseTask
}
var hasReference int
err = tx.QueryRowContext(
ctx,
`SELECT EXISTS (
SELECT 1
FROM freight_order_items AS item
JOIN procurement_requests AS request
ON request.freight_order_item_id = item.id
WHERE item.freight_order_id = ?
AND request.reference_asset_id IS NOT NULL
)`,
storedOrderID,
).Scan(&hasReference)
if err != nil {
return nil, repositoryFailure(err)
}
if hasReference != 0 {
return nil, usecase.ErrFreightOrderHasReference
}
if _, err := tx.ExecContext(
ctx,
`DELETE FROM procurement_requests
WHERE freight_order_item_id IN (
SELECT id
FROM freight_order_items
WHERE freight_order_id = ?
)
AND reference_asset_id IS NULL
AND purchase_task_id IS NULL
AND status IN ('BLOCKED', 'NEEDS_IMAGE', 'SOURCE_CHANGED')`,
storedOrderID,
); err != nil {
return nil, repositoryFailure(err)
}
var remainingRequests int
err = tx.QueryRowContext(
ctx,
`SELECT EXISTS (
@@ -653,12 +709,12 @@ func (store *Store) DeleteFreightOrder(
WHERE item.freight_order_id = ?
)`,
storedOrderID,
).Scan(&inUse)
).Scan(&remainingRequests)
if err != nil {
return nil, repositoryFailure(err)
}
if inUse != 0 {
return nil, usecase.ErrFreightOrderInUse
if remainingRequests != 0 {
return nil, repositoryFailure(usecase.ErrRepositoryInvariant)
}
rows, err := tx.QueryContext(