Nawaat CRM — Agent Instructions
تعليمات للوكلاء الذين يعملون على هذا المستودع. للبشر: راجع README.md.
Nawaat CRM : Next.js 16 + Prisma + PostgreSQL + Meilisearch
واجهة عربية RTL
Server Actions في lib/actions/
Bot API في app/api/v1/bot/ (محمي بـ x-api-key)
Dashboard API يستخدم requireDashboardAuth() من lib/route-auth.ts
middleware.ts يحمي لوحة التحكم — redirect إلى /login بدون JWT
لا نظام أدوار — كل مستخدم مسجّل = صلاحيات كاملة
JWT cookie (auth-token) عبر middleware.ts + requireAuth() في Server Actions
ثلاث طبقات API:
Dashboard: JWT (requireDashboardAuth)
Bot: x-api-key (validateApiKey)
استثناءات عامة: getStoreSettings(), getOrderById(), getDefaultCurrency() (login + فاتورة)
الأمر
الوظيفة
npm run dev
تشغيل Next.js في وضع التطوير (يُشغَّل تلقائياً داخل حاوية Docker)
npm run build
بناء الإنتاج
npm run start
تشغيل بناء الإنتاج
npm run lint
ESLint
الأمر
الوظيفة
npm run up
تشغيل postgres + rabbitmq + meilisearch + nextjs
npm run down
إيقاف الخدمات
npm run rebuild
إعادة بناء وتشغيل الحاويات
npm run logs
سجلات جميع خدمات التطوير
npm run logs:app
سجلات حاوية التطبيق فقط
npm run shell
shell داخل حاوية nextjs
npm run reset:dev
إيقاف مع حذف volumes ثم إعادة التشغيل — يحذف بيانات postgres و rabbitmq و meilisearch
Prisma — داخل حاوية التطوير
يتطلب npm run up أولاً (حاوية nawaat_nextjs_dev).
الأمر
الوظيفة
npm run db:migrate
prisma migrate dev — إنشاء وتطبيق migrations
npm run db:generate
prisma generate — بعد كل تغيير في schema
npm run db:seed
بذر بيانات التطوير
npm run db:push
prisma db push — تطوير فقط ؛ بديل سريع لـ migrate، ممنوع في الإنتاج
الأمر
الوظيفة
npm run prod:deploy
بناء وتشغيل بيئة الإنتاج
npm run prod:down
إيقاف بيئة الإنتاج
npm run prod:logs
سجلات خدمات الإنتاج
npm run prod:shell
shell داخل حاوية الإنتاج (nawaat_nextjs)
npm run prod:migrate
prisma migrate deploy يدوياً — اختياري؛ الحاوية تشغّله تلقائياً عند البدء
npm test placeholder حالياً — لا يوجد إطار اختبار (Jest/Vitest/Playwright) في المشروع.
منافذ التطوير: app 3000, postgres 5430, meilisearch 7700, rabbitmq 5672 / 15672.
المسار
الدور
app/(dashboard)/
صفحات لوحة التحكم
app/api/v1/bot/
Bot API (x-api-key)
app/api/v1/bot/orders/
Orders Bot API (x-api-key) — مصدر HTTP واحد
lib/orders/
منطق Bot Orders API (service, snapshot, schemas)
lib/actions/
منطق الأعمال (Server Actions)
lib/api-utils.ts
validateApiKey, apiSuccess, apiError
lib/action-utils.ts
safeAction, safeActionWithRevalidation
lib/order-utils.ts
resolveItemPrice
lib/meilisearch.ts
عميل Meilisearch
lib/prisma-includes.ts
Prisma include/select constants
prisma/schema.prisma
مصدر الحقيقة للبيانات
app/(dashboard)/product-attributes/
كتالوج صفات المنتج (ProductAttribute)
lib/actions/product-attributes.ts
CRUD صفات المنتج
التسعير عبر PriceLabel وليس tiers ثابتة (RETAIL/WHOLESALE/VIP في README قديم — تجاهله)
ProductPrice = مفتاح فريد: productId + priceLabelId + unitId (بالعملة الافتراضية دائماً)
التحويل لعملات أخرى عبر exchangeRate في lib/currency-utils.ts (convertFromDefault)
كل عميل له priceLabelId اختياري + عملات عبر CustomerCurrency (تفضيل عرض)
عند إنشاء طلب: snapshot إلزامي في OrderItem:
unitPrice, currencyId, priceLabelId (بعد التحويل إن لزم)
عرض السعر: resolveItemPrice() في lib/order-utils.ts
snapshot (unitPrice) — الأولوية
تسعيرة العميل من ProductPrice
التسعيرة الافتراضية (isDefault)
أي سعر
Bot check-price: يفلتر بـ customer.priceLabelId ويحوّل لعملات العميل
الحالات: pending, confirmed, processing, shipped, delivered, cancelled
مصدر الحقيقة: lib/order-constants.ts
updateOrder يرفض items فارغة
deliveryInfo نص حر لبيانات التوصيل
فاتورة: app/invoice/[id]/page.tsx
export const getX = ( ) => safeAction ( ( ) => prisma . x . findMany ( ) , 'رسالة خطأ' )
export const createX = ( data ) =>
safeActionWithRevalidation ( ( ) => prisma . x . create ( { data } ) , '/path' , 'رسالة خطأ' )
'use server' في أعلى كل ملف action
requireAuth() للعمليات الحساسة — لا أدوار
استثناءات: auth.ts, getStoreSettings(), getOrderById(), getDefaultCurrency()
تعديلات المخزون: upsertProductToMeilisearch(id).catch(console.warn)
const authError = validateApiKey ( req )
if ( authError ) return authError
return apiSuccess ( data ) // أو apiError(message, status, { code })
لا تضع أسراراً في الملفات المُلتزَم بها
لا تعتمد على README للتقنيات الحالية
لا تستخدم db push --accept-data-loss على بيانات حقيقية
Meilisearch: الأخطاء تُعالَج بصمت — لا تُعطّل التطبيق
أقل diff ممكن — لا تعيد هيكلة ملفات غير مطلوبة
Server Actions في lib/actions/ — لا منطق أعمال في components
شغّل Bugbot review على تغييرات الفرع (branch changes)
أصلح findings الصحيحة
npm run lint و npm run build
gh pr create مع body يتضمن Test plan
Skills: nawaat-pricing, nawaat-orders, nawaat-meilisearch, nawaat-inventory
Rules: .cursor/rules/*.mdc
Frontend: frontend-architecture, frontend-design, frontend-patterns, frontend-state
خريطة معمارية: PROJECT.md