feat: move brand name to one config and redesign the accounting card

اپ: نام برند در همه‌ی صفحه‌ها و پیام‌ها یکسان شده و از یک تنظیم مرکزی خوانده می‌شود.
اپ: کارت حسابداری در صفحه‌ی مشتری بازطراحی شد؛ مانده‌ها و وضعیت لینک واضح‌تر نمایش داده می‌شوند.
پنل: کارت حسابداری در پرونده‌ی مشتری بازطراحی شد؛ مانده‌ها، آخرین ارسال و فرم لینک دستی واضح‌تر شده‌اند.
پنل: ستون «کد» در جدول‌ها به‌طور پیش‌فرض پنهان است و از انتخاب ستون‌ها قابل نمایش است.
پنل: تغییر نمایش ستون‌ها در جدول‌ها بلافاصله اعمال می‌شود.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
s.esmaeili
2026-10-14 13:31:20 +03:30
co-authored by Claude Haiku 5.5
parent 5d2a1efb0c
commit 532ceee189
100 changed files with 1870 additions and 579 deletions
+67
View File
@@ -0,0 +1,67 @@
# طرح: ستون مانده‌ی حسابداری در لیست مشتریان عمده
تاریخ: ۱۴۰۵/۰۷/۲۲ — وضعیت: **پیاده‌سازی شد** (۱۴۰۵/۰۷/۲۲) — تصمیم‌ها: کلمه‌ی بدهکار/بستانکار؛ ستون‌های فعلی هنگام اتصال «بدهی داخل اپ» نام می‌گیرند؛ اپ کارشناس فروش بعداً
## مشکل
در لیست مشتریان عمده، ستون‌های «بدهی گرمی» و «بدهی ریالی» بدهیِ **داخل اپ** را نشان می‌دهند
(جمع سفارش‌هایی که در منتزر ثبت شده). مشتری‌هایی که از نرم‌افزار حسابداری آمده‌اند هنوز در اپ
سفارشی ندارند، پس این ستون‌ها برایشان صفر است.
مانده‌ی واقعیِ حسابداری درست خوانده و ذخیره می‌شود (بررسی ۱۴۰۵/۰۷/۲۲: هر ۷۳۳ مشتری واردشده از زرین
مانده دارند، ۳۸۴ نفر غیرصفر؛ مثلاً محمدرضا لطیفی کد ۹۶۱: ۷۲٫۲۸ گرم بدهکار) ولی فقط در صفحه‌ی
«مشاهده اطلاعات» هر مشتری دیده می‌شود، نه در لیست.
## راه‌حل: ستون‌های پویا
| وضعیت اتصال حسابداری | چه نمایش داده می‌شود |
|---|---|
| به **زرین** وصل است | دو ستون «مانده‌ی زرین (گرم)» و «مانده‌ی زرین (ریال)» |
| به **ته‌حساب** وصل است | دو ستون «مانده‌ی ته‌حساب (گرم)» و «مانده‌ی ته‌حساب (ریال)» |
| به هیچ‌کدام وصل نیست (یا اتصال خاموش است) | این دو ستون اصلاً نشان داده نمی‌شوند |
نام نرم‌افزار و وصل‌بودن از همان‌جایی خوانده می‌شود که دکمه‌ی «سینک با زرین» بالای لیست می‌خواند
(`admin/accounting-status`)، پس دکمه و ستون‌ها همیشه با هم هماهنگ‌اند.
ستون‌های فعلی «بدهی گرمی / ریالی» (بدهی داخل اپ) **دست نمی‌خورند**، چون سقف اعتبار هنوز با آن‌ها
حساب می‌شود.
## نحوه‌ی نمایش هر خانه
| حالت | نمایش |
|---|---|
| مشتری بدهکار است | عدد + «بدهکار» به رنگ قرمز — مثلاً `۷۲٫۲۸ بدهکار` |
| مشتری طلبکار است | عدد + «بستانکار» به رنگ سبز — مثلاً `۱۶۷۳٫۹۳ بستانکار` |
| مانده صفر است | `۰` |
| مشتری به حسابی در نرم‌افزار وصل نیست | `—` |
با بردن موس روی عدد، زمان آخرین به‌روزرسانی مانده نشان داده می‌شود (چون اگر «سینک مانده» خاموش
باشد، عدد فقط با زدن دکمه‌ی سینک تازه می‌شود).
## کجاها
هر پنج لیست مشتریان عمده (عمده، بنکداران، مغازه‌داران حضوری، تأییدنشده، بایگانی) چون همه یک جدول
مشترک دارند. مرتب‌سازی (مشتری‌های وصل‌نشده همیشه آخر) و فیلتر عددی روی ستون‌های جدید کار می‌کند. (دکمه‌ی چاپ جدول از قبل کاری انجام نمی‌دهد؛ ربطی به این طرح ندارد.)
## تغییرات فنی (خلاصه)
- **API** — `admin-customers.service.ts`: در خروجی هر ردیف سه فیلد `acc_remain`، `acc_rial_remain`،
`acc_at` (از `accountingGoldBalance` / `accountingRialBalance` / `accountingBalanceAt`) و `acc_linked`؛
و نگاشت مرتب‌سازی/فیلتر برای دو ستون اول. هیچ تغییری در دفتر حساب و محاسبه‌ی بدهی اپ نیست.
- **پنل** — `omdeListModel.ts` / `OmdeCustomerList.vue`: بعد از خواندن وضعیت اتصال، اگر وصل بود دو ستون
با نام نرم‌افزار اضافه می‌شوند؛ اسلات نمایش بدهکار/بستانکار.
- بدون migration و بدون تغییر در پایگاه داده.
## سؤال‌ها از شما
1. **نمایش بدهکار/بستانکار:** پیشنهاد من همان جدول بالاست (عدد مثبت + کلمه‌ی «بدهکار» قرمز یا
«بستانکار» سبز). جایگزین: فقط عدد با علامت منفی برای طلبکار — کوتاه‌تر است ولی ۲۴۸ مشتری
طلبکار طلا داریم و علامت منفی راحت اشتباه خوانده می‌شود. **پیشنهاد: کلمه‌ی بدهکار/بستانکار.**
2. **ستون‌های فعلی «بدهی گرمی / ریالی» بمانند؟** وقتی حسابداری وصل است، این ستون‌ها فقط بدهی
سفارش‌های داخل اپ را نشان می‌دهند و ممکن است گیج‌کننده باشند. سه راه:
الف) بمانند کنار ستون‌های جدید (کنترل سقف اعتبار هم دیده شود)؛
ب) وقتی وصل است پنهان شوند و فقط ستون حسابداری بماند؛
ج) بمانند ولی اسمشان «بدهی داخل اپ» شود.
**پیشنهاد: ج** — چیزی پنهان نمی‌شود و اشتباه هم خوانده نمی‌شوند.
3. **اپ کارشناس فروش** هم ستون «بدهی» دارد و همین مشکل را دارد. همین الان آن را هم درست کنیم یا
بعداً؟ **پیشنهاد: بعداً، جدا** — این طرح فقط پنل مدیریت.
+1 -1
View File
@@ -345,7 +345,7 @@ schema جدید **یک مدل `Order`** دارد.
### باگ/کوییرک legacy که وفادار پورت شد
| # | مورد | محل | وضعیت |
|---|---|---|---|
| 14 | در `OmdeNonVerifiedList` هر دو شاخه‌ی popconfirm مرحله‌ی یک `rejectStepOne` را صدا می‌زنند — یعنی از آن صفحه هرگز نمی‌شود تایید کرد | `OmdeNonVerifiedList.vue:64` | **عیناً پورت شد** پشت prop به نام `rejectOnlyStepOne` |
| 14 | در `OmdeNonVerifiedList` هر دو شاخه‌ی popconfirm مرحله‌ی یک `rejectStepOne` را صدا می‌زنند — یعنی از آن صفحه هرگز نمی‌شود تایید کرد | `OmdeNonVerifiedList.vue:64` | ابتدا عیناً پورت شد؛ **۱۴۰۵/۰۷/۲۲ (2026-10-14) رفع شد** — «تایید» حالا تایید می‌کند |
| 15 | در منوی «حساب کاربری»، آیکون از `getStsIcon` (وضعیت سفارش) گرفته می‌شود ولی رنگش از `getActiveIcon` | `OmdeList.vue:124` | عیناً پورت شد |
| 16 | `ReagentListModel` ستون `name` را دو بار اضافه می‌کند (یکی نمایان، یکی مخفی) | `ReagentListModel.js:10-11` | عیناً پورت شد |
| 17 | tooltip «فعال سازی سفارش سفارش» (کلمه تکراری) | `ReagentList.vue:51` | عیناً پورت شد |
+61
View File
@@ -0,0 +1,61 @@
# جابه‌جایی مشکی و زرشکی در اپ مشتری (user-app-v2)
**وضعیت:** تأیید شد و انجام شد (2026-10-14). زرشکی دقیق برند: `#7C0035`. خروج ← مشکی؛ کارت‌های بزرگ (موجودی، دعوت، نوار نرخ) ← خودِ زرشکی برند `#7C0035` در هر دو حالت روشن و تیره (به درخواست صاحب کار، به‌جای زرشکی تیره).
**تاریخ:** ۱۴۰۵/۰۷/۲۲ (2026-10-14)
## هدف
- رنگ اصلی اپ از **مشکی** به **زرشکی** تغییر کند و مشکی نقش فرعی داشته باشد.
- مشکی کمتر دیده شود و زرشکی در اولویت باشد.
- **ظاهر و ساختار صفحه‌ها تغییر نمی‌کند**؛ فقط رنگ همان دکمه‌ها و کارت‌های فعلی عوض می‌شود.
## خارج از این کار (دست نمی‌خورد)
- **رنگ متن‌ها**: متن‌ها همان مشکی/خاکستری فعلی می‌مانند. اگر متن زرشکی شود، خواندنش سخت می‌شود.
- **سرمه‌ای و برنزیِ باقی‌مانده از اپ قدیمی**: این‌ها شامل نوار وضعیت گوشی، نوار نرخ طلا، اسپینر، `SheetArt`، `ActingAsBar` و پنجرهٔ به‌روزرسانی هستند و اگر خواستید، بعداً جداگانه انجام می‌شوند.
- اپ قدیمی `user-app` و پنل مدیریت.
## وضعیت فعلی
در این اپ، **«مشکیِ پُر»** (`@ink`) رنگ اصلی است و **زرشکی** (`@wine`) فقط برای تأکید، حالت فشرده، نشان‌ها و دکمهٔ خروج استفاده می‌شود.
## تغییرات
### ۱) هر جا که پس‌زمینه مشکیِ پُر است ← زرشکی (متن روی آن سفید)
این‌ها دکمه‌های اصلی، گزینه‌های انتخاب‌شده و کلیدها هستند:
| بخش | فایل |
|---|---|
| دکمه‌های سبد خرید (۴ مورد) | `views/CartView.vue` |
| دکمهٔ ورود | `views/user/LoginView.vue` |
| دکمهٔ ثبت‌نام | `views/user/RegisterView.vue` |
| گزینهٔ انتخاب‌شدهٔ وزن/سایز و دکمهٔ صفحهٔ محصول | `components/product/SingleProduct.vue` |
| برچسب روی کارت محصول | `components/product/ProductCard.vue` |
| چیپ‌های جستجو و فیلتر | `views/search/SearchView.vue`، `components/search/Filters.vue` |
| فیلترهای سفارش‌ها | `views/user/OrdersView.vue` |
| کلید روشن/خاموش | `components/ui/ToggleSwitch.vue` |
| بازشدن منوی کشویی | `components/ui/DropDown.vue` |
| دکمهٔ اصلی پنجره‌های پایین صفحه | `components/ui/IslandSheet.vue` |
| علاقه‌مندی‌ها، صفحهٔ تنظیمات ظاهر | `FavoritesView.vue`، `AppearanceView.vue` |
| دکمه‌های بخش کارشناس | `expert/ChildOrdersView.vue`، `expert/CustomerChoiceView.vue` |
حاشیهٔ گزینهٔ انتخاب‌شده (در تنظیمات ظاهر) و حاشیهٔ خانهٔ کد تأیید (OTP) در هنگام تایپ هم از مشکی به زرشکی تغییر می‌کنند.
### ۲) جاهایی که زرشکی قبلاً «رنگ دوم» بوده ← زرشکی تیره
برخی جاها زرشکی برای این بوده که از مشکیِ اصلی متمایز شوند؛ مثلاً چیپ فیلترِ فعال در جستجو و مرحلهٔ فعال سفارش. اکنون که رنگ اصلی زرشکی شده، این موارد **زرشکی تیره** (`@wineDeep`) می‌شوند تا تفاوت حفظ شود و مشکی هم وارد کار نشود.
### ۳) کارت‌های تیرهٔ بزرگ ← زرشکی تیره
کارت موجودی و دعوت به ورود در داشبورد، و نوار نرخ در صفحهٔ اصلی، اکنون مشکی هستند. با تغییر **یک مقدار** (`heroSurface`)، هر سه زرشکی تیره می‌شوند و گرادیان کارت موجودی از زرشکی تیره به زرشکی می‌رود.
### ۴) حالت تیره (Dark mode)
در حالت تیره همان قاعده برقرار است: دکمه‌ها با زرشکیِ روشن‌ترِ حالت تیره نمایش داده می‌شوند و متن روی آن‌ها سفید است. کارت‌های بزرگ هم زرشکی خیلی تیره می‌شوند، نه خاکستری.
## سؤال‌ها از شما
۱. **دکمهٔ «خروج»** اکنون زرشکی است تا از بقیه جدا باشد. اگر همه‌چیز زرشکی شود، این دکمه دیگر متمایز نیست.
- **پیشنهاد من:** خروج **مشکی** شود (عملاً جای دو رنگ عوض می‌شود). این یکی از معدود جاهایی است که مشکی می‌ماند.
- گزینهٔ دیگر: قرمز (رنگ خطا).
۲. **کارت‌های بزرگ داشبورد** (بند ۳): زرشکی تیره شوند یا مشکی بمانند؟
- **پیشنهاد من:** زرشکی تیره، چون خواستید مشکی کمتر دیده شود. نتیجه این است که صفحهٔ داشبورد به‌وضوح زرشکی دیده می‌شود.
## بعد از انجام
- بیلد اپ و بررسی چشمی صفحه‌های اصلی، سبد خرید، محصول، جستجو، ورود و داشبورد، در هر دو حالت روشن و تیره.
- یک خط یادداشت انتشار برای کاربر: «اپ: رنگ اصلی برنامه زرشکی شد».
+51
View File
@@ -0,0 +1,51 @@
# برند پروژه (زرتاج) — چک‌لیست تغییر نام
نام برند **زرتاج / Zartaj** است. برای عوض کردن نام دوباره **لازم نیست کل کد را بگردید**؛ فقط موارد همین فهرست.
## ۱. جاهایی که باید عوض شوند (فقط همین‌ها)
| چه چیزی | کجا | توضیح |
|---|---|---|
| نام فارسی، نام لاتین، عنوان تب مرورگر، آدرس سایت | [`brand.ts`](../brand.ts) در ریشهٔ پروژه | پنل ادمین، اپ مشتری و اپ مشتری v2 همه از همین یک فایل می‌خوانند: عنوان صفحه، نام نصب PWA، عنوان صفحهٔ ورود، پیام خوش‌آمد، متن‌های راهنما، لینک محصول. |
| نام برند در **همهٔ پیامک‌ها** | متغیر محیطی `BRAND_NAME` روی سرور API | خالی باشد = «زرتاج» (پیش‌فرض در [`apps/api/src/common/brand.ts`](../apps/api/src/common/brand.ts)). بعد از تغییر فقط API را ری‌استارت کنید. |
| لینک سایت در پیامک خوش‌آمد | متغیر محیطی `BRAND_SITE_URL` روی سرور API | پیش‌فرض فعلاً `https://bnk.montzar.ir` است (دامنهٔ زنده). |
| لوگو | فایل‌های تصویر با نام ثابت `brand-*` (پایین) | نام فایل‌ها عمومی است؛ فقط خود تصویر را با همان نام جایگزین کنید. |
### فایل‌های لوگو
- `apps/user-app/public/img/brand-logo.png` و `.webp`
- `apps/user-app/src/assets/img/brand-logo.png`
- `apps/user-app-v2/public/img/brand-logo.png` و `.webp`
- `apps/user-app-v2/src/assets/img/brand-logo.png`
- `apps/admin-panel/src/assets/images/logo/brand-icon.png` و `.webp`، `brand-horizontal.png`
- آیکون‌های PWA و favicon: `apps/*/public/icon-192.png`، `icon-512.png`، `favicon.*`
- اسکریپت ساخت همهٔ این‌ها از یک تصویر: [`scripts/generate-brand-icons.py`](../scripts/generate-brand-icons.py) (مسیر تصویر ورودی را در خط اول آن عوض کنید)
### بعد از تغییر
1. `dist` هر سه فرانت و `apps/api/release` را دوباره بسازید (طبق روال انتشار).
2. اگر در دیتابیس فعلی برندی به نام قدیمی در «برندهای محصول» هست، از پنل ادمین ویرایشش کنید (seed فقط دیتابیس خالی را پر می‌کند).
## ۲. عمداً عوض نشده‌اند (نام داخلی، دیده نمی‌شوند)
این‌ها به کاربر نمایش داده نمی‌شوند و تغییرشان خرابی می‌آورد:
| مورد | چرا عوض نشد |
|---|---|
| کلیدهای مرورگر مثل `gold-bank:token` | تغییر = خروج همهٔ مشتری‌ها از اپ |
| جدول `_goldbank_migrations`، نام دیتابیس `goldbank`، سرویس داکر `goldbank-api` | تغییر = خراب شدن مایگریشن و استقرار روی سرور |
| نام پکیج‌ها `@gold-bank/*` و پوشهٔ پروژه | فقط نام فنی |
| شناسهٔ برند محصول `brand-montzar` در دیتابیس | کلید اصلی است و محصولات به آن وصل‌اند؛ عنوانش به «زرتاج طلا» تغییر کرد |
| پوشه‌های `henza_admin`، `henza_pwa`، `henza_server` و ارجاع‌های کد به آن‌ها | کد سیستم قدیمی، فقط برای مرجع |
| آدرس‌های `henzagold.com` در توضیحات کد | سابقهٔ سیستم قدیمی، اجرا نمی‌شوند |
| پوشهٔ `docs/` (سوابق) | سابقهٔ کار است، نه متن برنامه |
## ۳. بررسی سریع
برای اطمینان از اینکه نام قدیمی جایی در متن‌های برنامه نمانده:
```bash
grep -rn "منتزر\|Montzar\|هنزا" apps/*/src apps/*/index.html apps/api/prisma/seed.ts
```
خروجی خالی یعنی تمیز است.