feat(orders): recent orders view with receipt / kitchen / bar reprint
CI/CD / CI · API (dotnet build + test) (push) Successful in 41s
CI/CD / CI · Admin API (dotnet build) (push) Successful in 30s
CI/CD / CI · Dashboard (tsc) (push) Successful in 1m10s
CI/CD / CI · Admin Web (tsc) (push) Successful in 38s
CI/CD / CI · Website (tsc) (push) Successful in 46s
CI/CD / CI · Koja (tsc) (push) Successful in 50s
CI/CD / Deploy · all services (push) Successful in 3m34s

Adds a "سفارش‌ها" (Orders) nav page listing closed orders by day (date +
branch filter, paged), each with reprint actions:
- چاپ فاکتور  → customer receipt
- فیش آشپزخانه → kitchen ticket (all stations)
- one button per print station (e.g. Bar) → reprints only that station's items

Backend: the kitchen print endpoint gains an optional ?stationId= to reprint a
single station; PrintKitchenTicketAsync filters its station groups accordingly
(NO_STATION_ITEMS when that station has nothing on the order). Nav gated by
ViewOrders (visible to branch staff too). fa/en/ar strings added.

Note: local backend build couldn't run (NU1301 — NuGet restore network timeout);
dashboard typecheck is clean and the C# changes are minimal — CI builds via the
Nexus mirror.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-06-21 23:15:34 +03:30
parent 1264606410
commit c360fbb068
10 changed files with 321 additions and 6 deletions
+21
View File
@@ -118,6 +118,7 @@
"menu": "القائمة",
"crm": "العملاء",
"coupons": "القسائم",
"orders": "الطلبات",
"inventory": "المخزون",
"hr": "الموارد البشرية",
"reports": "التقارير",
@@ -333,6 +334,9 @@
"posDeviceHint": "عند الدفع بالبطاقة، يُرسل المبلغ عبر HTTP (POST /pay) إلى الجهاز على الشبكة المحلية.",
"posDeviceIp": "عنوان IP لجهاز نقطة البيع",
"testSent": "تم إرسال الاختبار إلى الطابعة.",
"sent": "تم الإرسال إلى الطابعة.",
"noStationItems": "لا توجد أصناف لهذه المحطة في هذا الطلب.",
"printFailed": "فشلت الطباعة.",
"stations": {
"title": "محطات طباعة المطبخ والبار",
"subtitle": "امنح كل قسم تحضير طابعته الخاصة ووجّه فئات القائمة إليها.",
@@ -1086,6 +1090,23 @@
}
}
},
"recentOrders": {
"title": "الطلبات الأخيرة",
"subtitle": "تصفّح الطلبات المغلقة وأعد طباعة فاتورة العميل وتذاكر المطبخ/البار.",
"date": "التاريخ",
"branch": "الفرع",
"allBranches": "كل الفروع",
"empty": "لا توجد طلبات لهذا اليوم.",
"loadFailed": "تعذّر تحميل الطلبات.",
"retry": "إعادة المحاولة",
"prevPage": "السابق",
"nextPage": "التالي",
"table": "الطاولة",
"statusPaid": "مدفوع",
"statusCancelled": "ملغى",
"receipt": "الفاتورة",
"kitchen": "تذكرة المطبخ"
},
"notifications": {
"title": "الإشعارات",
"pageTitle": "الإشعارات",
+21
View File
@@ -129,6 +129,7 @@
"crm": "CRM",
"coupons": "Coupons",
"menu": "Menu",
"orders": "Orders",
"inventory": "Inventory",
"hr": "HR",
"reports": "Reports",
@@ -352,6 +353,9 @@
"posDeviceHint": "On card payment, the amount is sent via HTTP (POST /pay) to the device on your LAN.",
"posDeviceIp": "POS device IP address",
"testSent": "Test sent to the printer.",
"sent": "Sent to the printer.",
"noStationItems": "This order has no items for that station.",
"printFailed": "Print failed.",
"stations": {
"title": "Kitchen & bar print stations",
"subtitle": "Give each prep area its own printer and route menu categories to it.",
@@ -1146,6 +1150,23 @@
}
}
},
"recentOrders": {
"title": "Recent orders",
"subtitle": "Browse closed orders and reprint the customer receipt and the kitchen / bar tickets.",
"date": "Date",
"branch": "Branch",
"allBranches": "All branches",
"empty": "No orders for this day.",
"loadFailed": "Could not load orders.",
"retry": "Retry",
"prevPage": "Previous",
"nextPage": "Next",
"table": "Table",
"statusPaid": "Paid",
"statusCancelled": "Cancelled",
"receipt": "Receipt",
"kitchen": "Kitchen ticket"
},
"notifications": {
"title": "Notifications",
"pageTitle": "Notifications",
+21
View File
@@ -129,6 +129,7 @@
"crm": "مشتریان",
"coupons": "کوپن‌ها",
"menu": "منو",
"orders": "سفارش‌ها",
"inventory": "انبار",
"hr": "منابع انسانی",
"reports": "گزارش‌ها",
@@ -352,6 +353,9 @@
"posDeviceHint": "هنگام پرداخت کارتی، مبلغ به آدرس HTTP دستگاه ارسال می‌شود (POST /pay).",
"posDeviceIp": "آدرس IP دستگاه پوز",
"testSent": "تست به پرینتر ارسال شد.",
"sent": "به پرینتر ارسال شد.",
"noStationItems": "این سفارش آیتمی برای این ایستگاه ندارد.",
"printFailed": "چاپ ناموفق بود.",
"stations": {
"title": "ایستگاه‌های چاپ آشپزخانه و بار",
"subtitle": "برای هر بخش آماده‌سازی یک پرینتر جدا بگذارید و دسته‌های منو را به آن وصل کنید.",
@@ -1147,6 +1151,23 @@
}
}
},
"recentOrders": {
"title": "سفارش‌های اخیر",
"subtitle": "سفارش‌های بسته‌شده را ببینید و فاکتور مشتری و فیش آشپزخانه/بار را دوباره چاپ کنید.",
"date": "تاریخ",
"branch": "شعبه",
"allBranches": "همه شعب",
"empty": "سفارشی برای این روز نیست.",
"loadFailed": "بارگذاری سفارش‌ها ناموفق بود.",
"retry": "تلاش مجدد",
"prevPage": "قبلی",
"nextPage": "بعدی",
"table": "میز",
"statusPaid": "پرداخت‌شده",
"statusCancelled": "لغوشده",
"receipt": "فاکتور",
"kitchen": "فیش آشپزخانه"
},
"notifications": {
"title": "اعلان‌ها",
"pageTitle": "اعلان‌ها",