fix(db): fill item_receipts.confirmed_by in office paths; resilient per-statement v2.6 upgrade (root cause of 500 on receipt)
This commit is contained in:
@@ -535,6 +535,18 @@ async def _decision_for_line_item(db: AsyncSession, line_item_id: UUID) -> ItemD
|
||||
return decision
|
||||
|
||||
|
||||
async def _fallback_confirmer_id(db: AsyncSession) -> UUID:
|
||||
"""item_receipts.confirmed_by is NOT NULL — office (unauthenticated)
|
||||
receipt paths reuse the dev-user row (same pattern as pm.py)."""
|
||||
from app.models.procurement import User
|
||||
dev = await db.scalar(select(User).where(User.casdoor_id == "dev"))
|
||||
if dev is None:
|
||||
dev = User(casdoor_id="dev", first_name="کاربر", last_name="آزمایشی", role="pm")
|
||||
db.add(dev)
|
||||
await db.flush()
|
||||
return dev.id
|
||||
|
||||
|
||||
async def arrive_quote(db: AsyncSession, quote_id: UUID, actor: str | None = None) -> Quote:
|
||||
"""Full-arrival shortcut: receipt for every non-rejected line item."""
|
||||
async with db.begin():
|
||||
@@ -551,7 +563,13 @@ async def arrive_quote(db: AsyncSession, quote_id: UUID, actor: str | None = Non
|
||||
continue
|
||||
existing = await db.scalar(select(ItemReceipt).where(ItemReceipt.item_decision_id == decision.id))
|
||||
if existing is None:
|
||||
db.add(ItemReceipt(item_decision_id=decision.id, received_qty=li.quantity))
|
||||
db.add(
|
||||
ItemReceipt(
|
||||
item_decision_id=decision.id,
|
||||
confirmed_by=await _fallback_confirmer_id(db),
|
||||
received_qty=li.quantity,
|
||||
)
|
||||
)
|
||||
|
||||
quote.status = "arrived"
|
||||
quote.arrived_date = utcnow()
|
||||
@@ -587,6 +605,7 @@ async def arrive_items(db: AsyncSession, quote_id: UUID, payload: ArriveItemsIn,
|
||||
db.add(
|
||||
ItemReceipt(
|
||||
item_decision_id=decision.id,
|
||||
confirmed_by=await _fallback_confirmer_id(db),
|
||||
received_at=item.received_at or utcnow(),
|
||||
received_qty=item.received_qty,
|
||||
on_time=item.on_time,
|
||||
|
||||
Reference in New Issue
Block a user