Files
ERP/frontend/src/lib/constants.ts
T
ali_mohaghegh ac76af2ffe feat(frontend): fulfillment split, API-driven topics, hub-and-spoke nav, stock-count modal, FOUND ceiling, semantic colors
- bug1: quote header fulfillment counter («رسید: X از Y قلم» amber / «تکمیل
  شد» green / «در راه»); expanded line items visually split into the
  received part (رسید شده ✓ + date + target warehouse from the receipt
  allocations) and the in-transit remainder — quantities always sum to the
  original line (invariant D holds, display-only split)
- bug2: 8-topic grids (suppliers/wizard/units) now come from
  /material-categories via the store (new lib/topics.ts; fixed the mismatched
  «ابزار و تجهیزات ساخت» label); suppliers topic->category resolution no
  longer falls back to an arbitrary category; duplicate month/status lists
  reuse the shared dictionaries; TopicGrid gained a loading EmptyState
- bug3: hub-and-spoke — the tab strip renders only on the warehouse
  dashboard; sub-views hide it and navigate back via «بازگشت به داشبورد»;
  «افزایش موجود» became the «تغییر موجودی» entry button
- bug4: stock count goes through a confirmation modal (current vs counted
  vs variance with کسری/مازاد badges) before posting STOCK_COUNT; numbers
  parsed defensively
- bug5: found qty is capped client-side (red input + inline warning, submit
  disabled) and backend returns 422 when exceeding the missing balance;
  fully-recovered losses drop off the pending list
- bug6+7: quantities render as absolute values with semantic color coding
  (emerald inflow / rose outflow / blue neutral) across dashboard timeline,
  daily control and the change-inventory form
2026-09-02 18:15:32 +03:30

21 lines
884 B
TypeScript

// ============================================================
// ثابت‌های سراسری — برچسب‌های UI ثابت (وضعیت‌ها و ...)
// تاپیک‌ها/دسته‌ها اینجا نیستند — از API می‌آیند (lib/topics.ts)
// ============================================================
export const STATUS_LABEL: Record<string, string> = {
offered: "پیشنهاد شده",
accepted: "پذیرفته شده",
arrived: "رسیده",
rejected: "رد شده",
expired: "منقضی شده",
};
export const STATUS_ORDER = ["offered", "accepted", "arrived"];
// در ویرایش، وضعیت فقط می‌تواند به مراحل قبلی برگردد
export function statusOptionsFor(current: string): string[] {
const idx = STATUS_ORDER.indexOf(current);
return idx < 0 ? STATUS_ORDER : STATUS_ORDER.slice(0, idx + 1);
}