هذا الدليل هو مرجع التشغيل لنظام Affiliate في ChatAman. يشرح ما يفعله المسوّق، ما تعتمده الإدارة، متى تُنشأ العمولة، وكيف تُدار السحوبات والاستردادات بأمان.
1. الأدوار والصلاحيات
| الدور | الصلاحيات الأساسية |
|---|---|
| الزائر | يفتح رابط الإحالة العام /ref/{code} فقط. |
| المستخدم / المسوّق | يسجل في البرنامج، يشارك الرابط، يرى الإحالات والعمولات، يرفع KYC، يوقع العقد، ويطلب السحب. |
| مدير النظام | يعتمد أو يوقف المسوّقين، يدير قواعد العمولات، يراجع KYC، يدير العقود والمواد التسويقية، ويعتمد أو يدفع السحوبات. |
| النظام | يسجل النقرات، يربط المؤسسة بأول إحالة صالحة، ينشئ العمولة عند الدفع، ويعكسها عند الاسترداد. |
لا يستطيع المسوّق قراءة اتفاقيات أو وثائق KYC أو سجلات مالية تخص مسوّقاً آخر. ملفات KYC والعقود الموقعة خاصة؛ تنزيلها يمر عبر مسار مصرح به.
2. المصطلحات المهمة
| المصطلح | المعنى |
|---|---|
| Affiliate | المسوّق الذي يحصل على رابط وكود إحالة فريدين. |
| Referral | المؤسسة المنسوبة للمسوّق بعد التسجيل من رابط الإحالة. |
| Commission rule | قاعدة تحدد قيمة العمولة وشروطها وأولويتها. |
| Commission | عمولة ناتجة عن دفعة عميل محال. |
| Withdrawal | طلب سحب لرصيد عمولات معتمدة. |
| Allocation | الجزء المحجوز من عمولة محددة لتغطية طلب سحب محدد. |
| Reversal | عكس كامل أو جزئي للعمولة بعد refund أو chargeback. |
3. رحلة المسوّق من التسجيل حتى السحب
flowchart TD
A[المستخدم يسجل في Affiliate] --> B[الإدارة تعتمد الحساب]
B --> C[يشارك رابط /ref/{code}]
C --> D[زائر يسجل مؤسسة]
D --> E[Referral بحالة pending]
E --> F[أول دفعة ناجحة]
F --> G[Referral تصبح active وعمولة pending]
G --> H[اعتماد العمولة]
H --> I[KYC verified + Agreement signed]
I --> J[طلب سحب]
J --> K[الإدارة تعتمد السحب]
K --> L[الإدارة تسجل الدفع]
3.1 التسجيل والاعتماد
- يدخل المستخدم إلى
/affiliate. - إذا لم يكن مسجلاً، يختار عملة الحساب وطريقة السحب ثم يرسل طلب التسجيل.
- ينشئ النظام كود إحالة ورابطاً بالشكل
https://dev.chataman.com/ref/{CODE}. - يعتمد مدير النظام الحساب من لوحة الإدارة. لا يبدأ المسوّق في الحصول على عمولات قبل أن تكون حالة الحساب
active.
3.2 مشاركة رابط الإحالة
الرابط العام هو /ref/{code} وليس رابط تسجيل مباشر. عند فتحه:
- يسجل النظام النقرة مع حماية rate limit (
throttle:affiliate-clicks). - يحتفظ بكود الإحالة حتى يتم تسجيل المؤسسة.
- تربط المؤسسة بأول إحالة صالحة فقط؛ لا يمكن لمسوق آخر خطف نفس المؤسسة لاحقاً.
3.3 التحويل وأول دفعة
عند تسجيل المؤسسة من كود صالح ينشئ النظام Referral بحالة pending. عند أول BillingTransaction إيجابية من نوع payment:
- تتحول Referral إلى
active. - يحفظ النظام الخطة المرتبطة بالمؤسسة إن وجدت.
- يختار قاعدة العمولة الأنسب.
- ينشئ Commission بحالة
pending.
إذا كانت القاعدة غير متكررة (is_recurring = false) فلا تنشأ عمولة أخرى لنفس العميل. إذا كانت متكررة، تلتزم بحد الأشهر إن تم ضبطه.
4. إدارة قواعد العمولات
المسار الإداري: /admin/affiliates/commission-rules/list.
الحقول الرئيسية:
| الحقل | الاستخدام |
|---|---|
commission_type |
نسبة مئوية، مبلغ ثابت، أو شرائح. |
commission_rate |
النسبة أو القيمة الأساسية. |
affiliate_id |
تخصيص القاعدة لمسوق محدد. |
plan_id |
تخصيص القاعدة لخطة اشتراك محددة. |
priority |
ترتيب القواعد المتساوية في الخصوصية. الرقم الأكبر يفوز. |
is_recurring |
هل تنطبق على التجديدات أيضاً؟ |
recurring_months_limit |
الحد الأقصى لأشهر العمولة المتكررة. |
max_commission_per_client |
سقف إجمالي عمولات العميل الواحد. |
rule_valid_from/until |
فترة صلاحية القاعدة. |
ترتيب الاختيار ثابت لتفادي النتائج المفاجئة:
- مسوّق محدد + خطة محددة.
- مسوّق محدد لجميع الخطط.
- جميع المسوقين + خطة محددة.
- القاعدة العامة.
- داخل نفس المستوى، الأعلى
priorityثم الأحدث بالمعرف.
مثال عملي
- قاعدة عامة: 10% لجميع الخطط، أولوية 100.
- قاعدة Gold: 15% لخطة Gold، أولوية 10.
- قاعدة خاصة للمسوّق أحمد على Gold: 20%، أولوية 1.
دفعة عميل أحمد على Gold تستخدم 20% لأن القاعدة الأكثر تخصيصاً تتقدم على الأولوية العامة.
5. حالات العمولة والأرصدة
| الحالة | المعنى | أثرها على السحب |
|---|---|---|
pending |
أنشئت بعد الدفعة ولم تعتمد بعد. | غير قابلة للسحب. |
approved |
أصبحت رصيداً متاحاً. | قابلة للحجز للسحب. |
paid |
صُرف كامل صافي العمولة. | لا يمكن طلبها مجدداً. |
expired |
انتهت صلاحيتها قبل التحويل أو الاعتماد. | غير قابلة للسحب. |
cancelled |
ألغيت، غالباً بسبب استرداد كامل. | غير قابلة للسحب. |
لا تعتمد الحسابات على قيمة العمولة وحدها؛ تستخدم القيم التالية:
الصافي المتاح للعمولة = commission_amount - reversed_amount - paid_amount - الحجوزات النشطة
وهذا يمنع استخدام نفس العمولة في أكثر من طلب سحب ويتيح السحب الجزئي من عمولة واحدة.
6. دورة السحب
المسار للمسوّق: /affiliate/withdrawals.
شروط إرسال الطلب
يجب أن تكون كل الشروط التالية صحيحة:
- حساب المسوّق
active. - KYC حالته
verified. - يوجد عقد Affiliate موقع وغير ملغى.
- المبلغ يساوي أو يتجاوز
min_payout_threshold. - المبلغ لا يتجاوز الرصيد الصافي المتاح من العمولات المعتمدة.
ما الذي يحدث عند الطلب؟
ينشئ النظام Withdrawal بحالة pending، ثم يحجز بالضبط المبلغ المطلوب من أقدم العمولات المعتمدة. يمكن أن تكون الحصص كالتالي:
| العمولة | صافيها المتاح | الحجز لطلب 60 USD |
|---|---|---|
| #101 | 30 | 30 |
| #102 | 30 | 30 |
| #103 | 40 | 0 |
ما يفعله المدير
المسار الإداري: /admin/affiliates/withdrawals/list.
- راجع هوية المسوّق وطريقة السحب والتفاصيل.
- اعتمد المبلغ. يمكن اعتماده أقل من المطلوب، لكن ليس صفراً أو أكبر من المطلوب.
- بعد التحويل الخارجي، سجّل
transaction_referenceواضغط Paid. - لا تضغط Paid قبل إتمام التحويل الفعلي؛ هذا الإجراء يحرك الرصيد من
pending_balanceإلىpaid_balanceولا يعاد إذا كان السحب مدفوعاً بالفعل.
الرفض
السحب في pending أو approved يمكن رفضه. عند الرفض تحذف الحجوزات فوراً وتعود العمولات المتبقية متاحة لطلب جديد.
7. Refund وChargeback
أي BillingTransaction سالبة من نوع payment تعامل كاسترداد:
- يبحث النظام عن العمولة الأصلية باستخدام
original_transaction_idأو نفس payment entity. - يحسب نسبة الاسترداد من قيمة الدفعة الأصلية.
- ينشئ Reversal فريداً؛ إرسال نفس refund مرتين لا يكرر الخصم.
- يحدث
reversed_amountويُلغي العمولة عند عكسها بالكامل. - إذا كانت العمولة حُجزت في سحب نشط، يرفض النظام السحب ويلغي حجوزه.
- إذا كانت العمولة اعتمدت، ينقص الرصيد المعلق وإجمالي المكتسب. وإذا سبق دفعها قد ينتج رصيد تسوية سلبي يحتاج متابعة مالية.
مثال
دفعة 100 USD أنتجت عمولة 20 USD. Refund بقيمة 50 USD يعكس 10 USD من العمولة، وليس 20 USD.
8. KYC والعقد
KYC للمسوّق
المسار: /affiliate/kyc.
يرفع المسوّق بيانات الفرد أو الشركة ووثائق الهوية. القيود:
- الصور: JPG/JPEG/PNG.
- المستندات: PDF مسموح حيث يلزم.
- الحد الأقصى للملف: 10 MB.
- تظل الملفات على تخزين خاص، ولا تتاح إلا عبر صلاحيات الإدارة ورابط موقع.
حالات KYC: pending وverified وneeds_update وrejected.
العقد
المسار: /affiliate/agreement.
ينشئ المدير قالب العقد من /admin/affiliates/agreement-templates ثم يرسله للمسوّق. التوقيع:
- يطبق على عقد
pendingفقط ويكون idempotent عند تكرار الطلب. - يقبل توقيع PNG بصيغة base64 مع حدود الحجم والأبعاد.
- يحتفظ النظام بالنسخة الموقعة في تخزين خاص ويوفر تنزيلها للمسوّق صاحب العقد فقط.
9. المواد التسويقية والمسوقون الفرعيون والمكافآت
المواد التسويقية
المسار: /affiliate/assets.
تظهر المادة فقط إذا كانت نشطة، مناسبة للغة المسوّق، ويحقق المسوّق حد المستوى المطلوب. يستطيع المدير إدارتها من /admin/affiliates/assets وتتبع عدد التحميلات.
المسوقون الفرعيون
يمكن للمسوّق تسجيل مسوّق مستوى ثان عبر /affiliate/sub-affiliates/register. العمولات الفرعية تخضع لضوابط النظام ولا تكرر العمولة الأصلية؛ راجع إعدادات البرنامج قبل تفعيلها تجارياً.
مكافآت الإنجاز
ينشئ المدير أهدافاً من /admin/affiliates/bonus-milestones مثل عدد الإحالات أو الإيراد أو العملاء النشطين. تظهر المكافآت المكتسبة في /admin/affiliates/bonuses ويمكن اعتمادها منفردة أو جماعياً.
10. التشغيل اليومي للإدارة
بداية البرنامج
- أنشئ قاعدة عمولة عامة فعالة.
- أنشئ قالب عقد افتراضياً مناسباً للغة والمستوى.
- أضف مواد تسويقية قابلة للاستخدام.
- اعتمد أول مسوّق اختباري.
- افتح رابط الإحالة، سجل مؤسسة اختبارية، وسجل دفعة اختبارية.
- راجع أن العمولة ظهرت وأن الـaudit log سجل الخطوات.
روتين يومي
- راجع طلبات KYC الجديدة.
- راجع السحوبات المعتمدة فقط بعد التحقق من بيانات الدفع.
- راجع refunds والـchargebacks وأي سحب رفض تلقائياً بسببها.
- راقب Audit Log للعمليات الحساسة.
- راجع العمولات المعلقة والمنتهية ومؤشرات التحويل.
11. مسارات الواجهة الأساسية
للمسوّق
| الغرض | المسار |
|---|---|
| لوحة Affiliate | /affiliate |
| الإحالات | /affiliate/referrals |
| العمولات | /affiliate/commissions |
| السحوبات | /affiliate/withdrawals |
| العقد | /affiliate/agreement |
| التحقق | /affiliate/kyc |
| المواد | /affiliate/assets |
| التحليلات | /affiliate/analytics |
للإدارة
| الغرض | المسار |
|---|---|
| قائمة المسوقين | /admin/affiliates |
| القواعد | /admin/affiliates/commission-rules/list |
| السحوبات | /admin/affiliates/withdrawals/list |
| KYC | /admin/affiliates/kyc/list |
| العقود | /admin/affiliates/agreement-templates |
| المواد | /admin/affiliates/assets |
| المكافآت | /admin/affiliates/bonuses |
| سجل التدقيق | /admin/affiliates/audit-log |
12. قائمة اختبار قبل الإنتاج
نفذ الحالات التالية ببيانات اختبار مستقلة قبل تفعيل تحويلات فعلية:
- [ ] رابط الإحالة يسجل النقرة وينسب المؤسسة للمسوّق الصحيح.
- [ ] أول دفعة تحول Referral من
pendingإلىactiveوتنشئ عمولة واحدة. - [ ] القاعدة الخاصة بمسوّق وخطة تتغلب على القاعدة العامة.
- [ ] قاعدة غير متكررة لا تنشئ عمولة ثانية للعميل نفسه.
- [ ] سقف عمولة العميل يمنع تجاوز الحد حتى مع دفعات متزامنة.
- [ ] طلب سحب جزئي يحجز مبلغاً دقيقاً فقط.
- [ ] اعتماد سحب أقل من المطلوب يحرر الجزء غير المعتمد.
- [ ] Paid مرتين لا يخصم الرصيد مرتين.
- [ ] رفض السحب يحرر الحجوزات.
- [ ] Refund جزئي يعكس نسبة صحيحة من العمولة مرة واحدة فقط.
- [ ] Refund مع سحب نشط يرفض السحب ويمنع صرف عمولة مستردة.
- [ ] KYC والعقد يمنعان السحب حتى الاعتماد والتوقيع.
- [ ] العربية والإنجليزية لا تعرضان مفاتيح ترجمة أو اتجاه نص خاطئ.
- [ ] الموبايل لا يعرض horizontal overflow في Dashboard وCommissions وWithdrawals.
13. استكشاف الأخطاء
| العرض | فحص سريع | الإجراء |
|---|---|---|
| لا تظهر عمولة | راجع أن المعاملة payment موجبة، وأن Referral نشطة، وأن قاعدة فعالة تطابق الخطة. |
راجع BillingTransaction وAffiliate Audit Log. |
| لا يستطيع المسوّق السحب | تحقق من KYC والعقد والحد الأدنى والرصيد المعتمد غير المحجوز. | لا تعدل الرصيد يدوياً؛ عالج سبب المنع. |
| سحب لا يمكن دفعه | تحقق من حالة Withdrawal ومجموع Allocations والمبلغ المعتمد. | لا تحول الحالة يدوياً في قاعدة البيانات. |
| عمولة لم تعكس بعد Refund | تحقق من transaction الأصلية وmetadata/entity_id. |
أعد إرسال webhook آمن أو راجع سجل معاملات الدفع. |
| لا يعمل تنزيل العقد أو KYC | تحقق من جلسة المستخدم/المدير ومن صلاحية الرابط والملف الخاص. | لا تنقل الملف إلى public storage. |
14. ملاحظات أمان وتشغيل
- لا تستخدم حساب مدير أو طلب سحب حقيقياً لاختبار الواجهة.
- لا تعدل أرصدة Affiliate أو حالات Withdrawal مباشرة من قاعدة البيانات.
- احتفظ بمرجع التحويل الخارجي عند تعليم السحب Paid.
- راجع Audit Log قبل وبعد أي عملية مالية يدوية.
- اختبر webhook الدفع بعد أي تغيير في Billing أو مزود الدفع؛ فهو نقطة بدء العمولة التلقائية.
- استخدم بيئة dev أو sandbox للتجارب المالية، ثم انقل الإعدادات المعتمدة فقط إلى production.