RoadFN APIs

دليل تكامل يدوي لواجهات LoginApi و BusinessApi

يقدّم هذا الملف توثيقًا يدويًا ومبسّطًا لأهم نقاط التكامل في المنصتين الداخليتين LoginApi و BusinessApi. تم تلخيص طريقة العمل، الحقول المطلوبة، والعلاقات بين الواجهات وفق فهم فريق RoadFN للكود المصدري الحالي لكي يتوافر لديك مرجع سريع حتى في حال تعذر الاطلاع على Swagger.

// أمثلة سريعة
POST /api/Login
{
  "userName": "demo",
  "password": "demo123",
  "deviceToken": "abcdef"
}

GET /api/Business/GenerateShipmentLink
Authorization: Bearer <token>

نظرة عامة

تعتمد أغلب العمليات على هوية المستخدم التجاري (BusinessUser) التي يتم الحصول عليها بعد تسجيل الدخول، مع استخدام رمز JWT في ترويسة Authorization: Bearer. تم استخراج الحقول أدناه من نماذج البيانات داخل المشروع: قد تختلف في حال تغيير قاعدة البيانات، لذا راجع Swagger عند الشك.

القيم المرجعية المشتركة

معظم الحقول التي تنتهي بـ Id تشير إلى جداول مرجعية مثل المدن، المناطق، حالة الشحنة، أو أنواع الشحنات. استخدم واجهات مثل GET /api/Areas و GET /api/Business/ListStatus للحصول على القيم الصحيحة قبل إرسالها.

التحكم في الصلاحيات

يتم تحديد صلاحيات الوصول من خلال مطالبات المستخدم في رمز JWT. لا يمكن الوصول إلى BusinessApi إلا من خلال أدوار business و Marketer.

بيئات العمل

استخدم عناوين النطاق التالية لتجربة الواجهات برمجيًا. كلا البيئتين متاحتان مع نفس نقاط النهاية الموثقة في هذا الملف.

الإنتاج (Live)

العنوان الأساسي: https://api.roadfn.com/. تأكد من استخدام مفاتيح الاعتماد الحقيقية واحترام حدود المعدل الخاصة بالحسابات الفعلية.

بيئة الاختبار (UAT)

العنوان الأساسي: https://uat.roadfn.com/. تسمح هذه البيئة بالتحقق من عمليات التكامل دون التأثير على بيانات الإنتاج، ويمكنك إنشاء حسابات تجريبية بحرية.

واجهات LoginApi

نقاط النهاية العامة التي تستخدم غالبًا قبل الحصول على رمز المصادقة.

POST /api/Login

يدقق بيانات الاعتماد ويصدر رمز JWT مع بيانات إضافية عن المستخدم.

المدخلات

userName body إلزامي

اسم المستخدم كما هو مخزن في جدول Users.

password body إلزامي

كلمة المرور بنفس الترميز الموجود في قاعدة البيانات (Plain Text وفق التطبيق الحالي).

deviceToken body إلزامي

معرف الجهاز المستخدم للإشعارات (FCM Token). يتم حفظه في Users.DeviceToken.

الاستجابات

200 كائن LoginResponse.

application/json

  • token – رمز JWT صالح ليوم واحد.
  • expires – تاريخ انتهاء الرمز.
  • role – قيمة من الثوابت Role (admin، business، Marketer...).
  • loginTrimAndConditions – يشير إلى ما إذا كان على المستخدم قبول الشروط.
  • loginTrimAndConditionsValue – النص الكامل للشروط من GetGlobalSettings باستخدام المفتاح LoginTrimAndConditions.
  • userName وfullName – بيانات تعريفية.
  • requiredChangePassword – يصبح true إذا حان موعد تغيير كلمة المرور.
  • mobileRoles – قائمة صلاحيات إضافية تظهر فقط للمسوقين (UserType = 9).
400/401 بيانات اعتماد غير صحيحة أو حساب مقفل.
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "role": "business",
  "userName": "demo",
  "fullName": "Demo Merchant",
  "expires": "2024-03-12T21:36:00Z",
  "requiredChangePassword": false,
  "loginTrimAndConditions": false,
  "loginTrimAndConditionsValue": "...النص...",
  "mobileRoles": []
}

واجهات BusinessApi

تتطلب جميع الطلبات ترويسة Authorization مع رمز JWT من /api/Login.

GET /api/Business/ShipmentChat

يجلب المحادثة الخاصة بشحنة معينة.

المدخلات

ShipmentId query إلزامي

معرف الشحنة في جدول Shipments.

الاستجابات

200 قائمة رسائل (UserCommint, Idate...).
GET /api/Business/ShipmentChat?ShipmentId=1024

POST /api/Business/AddCommentShipmentChat

إضافة تعليق جديد على محادثة شحنة وإرسال إشعار فوري.

المدخلات

shipmentId body إلزامي

معرف الشحنة المطلوب التعليق عليها.

userCommint body إلزامي

النص الفعلي للتعليق.

userId body

يتم تجاهله إذا تم اشتقاقه من الرمز. يُترك 0 عادة.

الاستجابات

200 الكائن بعد الحفظ (مع الحقول Idate و Iuser).
{
  "shipmentId": 1024,
  "userCommint": "تم التواصل مع العميل",
  "userId": 0
}

POST /api/Business/AddEmployee

إنشاء مستخدم تابع (موظف) لنفس التاجر مع صلاحية Business.

المدخلات

يتم تمرير كائن UserViewModel بالحقول التالية:

  • title – مسمى وظيفي قصير.
  • firstName / lastName – اسم الموظف.
  • userName – يجب أن يكون فريدًا.
  • userPassword – كلمة المرور الأولية.
  • mobileNo1 وmobileNo2 – أرقام للتواصل.
  • tel – هاتف أرضي اختياري.
  • address – عنوان الموظف.

الاستجابات

200 كائن المستخدم الجديد بعد الحفظ.

يتم نسخ معرف الفرع والمدينة من حساب التاجر الحالي، ويُعاد ضبط الدور إلى قيمة "3".

400 اسم المستخدم مستخدم مسبقًا.
{
  "title": "مندوب",
  "firstName": "أحمد",
  "lastName": "خالد",
  "userName": "ahmad.k",
  "userPassword": "Pass1234",
  "mobileNo1": "0790000000",
  "mobileNo2": null,
  "tel": null,
  "address": "عمّان - الصويفية"
}

POST /api/Business/AddMarketer

إضافة مسوّق ميداني مرتبط بالتاجر مع تحديد الحالات التي يمكنه متابعتها.

المدخلات

الكائن UserViewModelM يتضمن حقول الموظف السابقة بالإضافة إلى:

  • roleIds – قائمة معرفات صلاحيات من ListMarketerRole.
  • statuses – قائمة معرفات حالات الشحن المسموح بها (من ListStatus).

الاستجابات

200 المستخدم الذي تم إنشاؤه مع ربط الأدوار.
{
  "title": "مسوّق",
  "firstName": "سارة",
  "lastName": "علي",
  "userName": "sara.m",
  "userPassword": "Sara1234",
  "mobileNo1": "0791111111",
  "roleIds": [1, 2],
  "statuses": [10, 23]
}

POST /api/Business/GetMarketer

جلب بيانات مسوّق محدد مع الصلاحيات المرتبطة به.

المدخلات

Id body إلزامي

معرف المسوّق كما أعادته ListMarketer.

الاستجابات

200 كائن يحتوي على users و mobileRoles.

تعيد users قائمة (غالبًا عنصر واحد) من جدول Users، بينما mobileRoles تجمع تفاصيل الأدوار.

{
  "users": [
    {
      "id": 45,
      "firstName": "سارة",
      "userName": "sara.m",
      "allowStatus": "10,23"
    }
  ],
  "mobileRoles": [
    { "id": 1, "roleName": "FollowUp", "roleNote": "متابعة العملاء" }
  ]
}

POST /api/Business/UpdateEmployee

تعديل بيانات موظف تابع.

المدخلات

يتم إرسال UserViewModel مثل AddEmployee مع تمرير معرف المستخدم بالتالي:

UserId query إلزامي

الاستجابات

200 الكائن المحدث.

POST /api/Business/UpdateMarketer

تحديث بيانات مسوّق وإعادة تعيين صلاحياته.

المدخلات

نفس حقول UserViewModelM مع تمرير UserId كاستعلام. يتم حذف جميع الأدوار القديمة وإضافة القوائم الجديدة.

الاستجابات

200 المستخدم بعد التحديث.

GET /api/Business/ListMarketerRole

عرض جميع صلاحيات المسوّقين المتاحة لاستخدامها مع AddMarketer.

المدخلات

لا توجد معاملات.

الاستجابات

200 قائمة MobileRole (Id, RoleName, RoleNote).

GET /api/Business/ListStatus

جميع حالات الشحنات الممكنة.

المدخلات

لا يوجد.

الاستجابات

200 قائمة ShipmentStatuses.

GET /api/Business/ListEmployee

جلب جميع الموظفين المرتبطين بالتاجر الحالي .

المدخلات

لا توجد معاملات.

الاستجابات

200 قائمة Users.

GET /api/Business/ListMarketer

استرجاع كل المسوقين التابعين للتاجر.

المدخلات

لا توجد معاملات.

الاستجابات

200 قائمة Users.

GET /api/Business/Profile

بيانات Profile UserProfile.

المدخلات

لا يوجد.

الاستجابات

200 كائن UserProfile (بيانات الفرع، الشعار...).

GET /api/Business/BusinessNotification

قائمة الإشعارات الخاصة بالتاجر.

المدخلات

لا توجد معاملات.

الاستجابات

200 قائمة BusinessNotification.

POST /api/Business/ReadNotification

تعليم إشعار معين كمقروء وتحديث سجل NotificationLogs.

المدخلات

NotificationId body إلزامي

الاستجابات

200 الإشعار بعد التعديل.

GET /api/Business/Statistics

ملخص شامل للأداء (مدن الوجهة، أهم الموظفين...).

المدخلات

لا توجد معاملات.

الاستجابات

تجميع متعدد: يعيد بيانات من CountOfShipmentsPerToCityAndUser ويتم دمج مساهمات الموظفين التابعين.

POST /api/Business/CreateShipmentConfirm

إنشاء شحنة جديدة بالاعتماد على نموذج BussCreateShipmentViewModel.

المدخلات

أبرز الحقول المطلوبة:

  • ShipmentTrackingNo –رقم الشحنه.
  • qrAltId على النظام الخاص بك–رقم الشحنه.
  • ShipmentTypeIDنوع الشحنه اختياري 0.
  • clientName – اسم المستلم.
  • clientCityId / clientAreaId – من واجهات Cities و Areas.
  • clientPhone – رقم هاتف المستلم (10 أرقام).
  • ClientPhone2 – رقم هاتف المستلم (10 أرقام).
  • Remarks – ملاحظات.
  • IsReturn – اضافة طرد بدل .
  • clientAddress – عنوان التسليم.
  • shipmentTotal – إجمالي قيمة الشحنة (شامل التوصيل).
  • ShipmentQuantity – كمية الطرد 1.
  • IsForeign مستلم اجنبي.
  • DriverCanOpenShipment يمكن للسائق فتح الطرد.
  • retPayاحضار ضرد من مستلم.
  • shipmentContains – وصف محتوى الشحنة.

يتم حساب shipmentFees وshipmentPrice داخليًا عبر IShipmentService.

الاستجابات

200 الكائن بعد الإنشاء مع رقم الشحنة المحجوز.
400 عند فشل التحقق من البيانات أو حساب الرسوم.
{
  "clientName": "محمد",
  "clientCityId": "1",
  "clientAreaId": "5",
  "clientPhone": "0792222222",
  "clientAddress": "إربد - الحي الشرقي",
  "shipmentTotal": 50.0,
  "retPay": false,
  "shipmentContains": "ملابس"
}

GET /api/Business/StatusList

نسخة إضافية من قائمة الحالات مفلترة بحسب صلاحيات المسوّق عند الحاجة.

POST /api/Business/CreateShipmentDraft

حفظ شحنة كمسودة قبل التأكيد النهائي.

المدخلات

نفس حقول إنشاء الشحنة مع إمكانية ترك بعض الحقول فارغة، لكن يجب توفير معلومات العميل الأساسية.

الاستجابات

تعيد معرف المسودة مع تفاصيلها.

GET /api/Business/GetShipmentFee

حساب رسوم التوصيل بناءً على المدينة والمنطقة.

المدخلات

ToCityId query إلزامي
ToAreaId query إلزامي

الاستجابات

تعيد كائنًا يحتوي على deliveryFee وحقول مساعدة أخرى لحساب السعر النهائي.

GET /api/Business/GetAlert

إرجاع نص التحذير المرتبط بنوع الشحنة.

GET /api/Business/GetShipmentNots

ملاحظات عامة حول الشحنات للعرض في الواجهة.

POST /api/Business/ShipmentAddNote

إضافة ملاحظة داخلية على شحنة.

المدخلات

يتوقع الحقول shipmentId وnote على الأقل، بالإضافة إلى بيانات الحالة الجديدة إذا تطلب الأمر.

GET /api/Business/GetShipmentsTrackingGeneratedCode

حجز رقم تتبع جديد بناءً على هوية المستخدم.

GET /api/Business/Cities

قائمة المدن المتاحة لعمليات الشحن.

GET /api/Business/Areas

إرجاع المناطق لمدينة محددة (مماثل لواجهة LoginApi لكن ضمن سياق تجاري).

GET /api/Business/ShipmentsTypes

أنواع الشحنات مع رسائل التحذير المرتبطة بها.

GET /api/Business/ShipmentsSummary

ملخص إحصائي لأعداد الشحنات بحسب الحالة.

GET /api/Business/GetShipmentsDetails

تفاصيل شحنة فردية بما في ذلك العناوين وتتبع الحالة.

GET /api/Business/GetShipmentCountByClientMobile

إحصاء الشحنات المسجلة لرقم هاتف معين لضبط محاولات التكرار.

GET /api/Business/ShipmentList

قائمة الشحنات مع إمكانية التصفية حسب الحالة أو التاريخ (يتم تمرير معاملات Query متعددة في التطبيق).

GET /api/Business/ShipmentListBetweenDate

عرض الشحنات بين تاريخين محددين.

POST /api/Business/ShipmentListWithIds

إرجاع مجموعة شحنات بناءً على قائمة معرفات يتم تمريرها في الجسم.

POST /api/Business/UpdateShipment

تعديل تفاصيل شحنة موجودة (العنوان، القيمة، المحتوى...).

POST /api/Business/UpdateAddress

تحديث عنوان العميل في شحنة معينة.

POST /api/Business/UpdateClientMobile

تعديل رقم هاتف المستلم.

GET /api/Business/ListOfShippingFees

جميع رسوم الشحن المرتبطة بالتاجر.

GET /api/Business/GetAvailableStatusForShipment

إرجاع الحالات التي يمكن التحويل إليها بناءً على الحالة الحالية للشحنة ودور المستخدم.

POST /api/Business/UpdateShipmentStatus

تغيير حالة الشحنة مع تسجيل السجل التاريخي.

GET /api/Business/GetBusinessClient

معلومات العميل التجاري الحالي .

GET /api/Business/RPTPaymentHistoryUser

تقرير تاريخ المدفوعات للتاجر.

GET /api/Business/InvoiceBusinessUserShipments

شحنات الفواتير المفتوحة للتاجر.

GET /api/Business/ReportInvoiceBusiness

تقرير الفواتير الصادرة.

GET /api/Business/ReportReturnInvoiceBusiness

تقرير الفواتير الخاصة بالشحنات المرتجعة.

GET /api/Business/InvoiceReturnBusinessUserShipments

قائمة الشحنات المرتجعة المرتبطة بالفواتير.

POST /api/Business/ReceivingPayments

تأكيد استلام دفعة مالية من المكتب.

POST /api/Business/ReceivingReturnInvoice

تأكيد استلام فواتير المرتجعات.

POST /api/Business/ShipmentUploadFile

رفع ملف مرتبط بالشحنة (مثل إثبات التسليم).

يتوقع ملفًا مرفوعًا عبر multipart/form-data مع الحقل file، بالإضافة إلى معرف الشحنة.

GET /api/Business/DownloadFile

تحميل ملف تم رفعه مسبقًا لشحنة.

GET /api/Business/CustomerInvoiceRequest

عرض طلبات إصدار الفواتير التي قدمها التاجر.

POST /api/Business/RequestCustomerInvoice

تقديم طلب جديد لإصدار فاتورة اشتراك أو مستحقات.

المدخلات

note body

شرح الطلب (اختياري لكنه مفيد للتواصل).

الاستجابات

يعيد رسالة نصية توضح حالة الطلب (على سبيل المثال "تم استلام طلبك").