الفريق والأدوار والصلاحيات

للمتجر مالك واحد فقط وأي عدد من أعضاء الفريق. وكل دور مرتبط بهذا المتجر وحده، فالسؤال ليس أبداً «أي متجر يرى هذا الشخص» بل «ما الذي يستطيع فعله في هذا المتجر».

المالك والفريق

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

كل دور مقيّد بمتجر واحد، ويفرض الخادم هذا القيد على كل طلب. لذلك لا يستطيع حساب فريق قراءة طلبات تاجر آخر ولو بمعرّف صحيح، ولا يستطيع ذلك مفتاح صادر عن هذا الحساب.

لا يصل أي دور فريق إلى إعدادات المتجر. هذا مقصود وغير قابل للضبط: لا يستطيع عضو الفريق دعوة أعضاء آخرين أو إزالتهم، ولا نقل النطاق، ولا تغيير الخطة، ولا الاطلاع على الفوترة. فإن كنت تبني شيئاً يحتاج ذلك، فهو يحتاج المالك.

حزم الصلاحيات الأربع

تُجمَّع الصلاحيات في أربع حزم، كل واحدة مكتفية بذاتها: فهي تتضمن أصلاً صلاحيات القراءة التي تحتاجها شاشاتها، فلا تضطر لجمع حزمتين لمجرد أن تُحمَّل صفحة واحدة.

الحزمةما تتيحه
ordersقراءة الطلبات وتحديثها، وقراءة الزبائن والمنتجات وطرق الدفع والتوصيل المرتبطة بها، وقراءة الفروع التي تحتاجها نقطة البيع قبل أن تفتح.
catalogإنشاء المنتجات والخيارات والصور والوسوم وقراءتها وتعديلها وحذفها.
marketingإدارة العروض الترويجية — الكوبونات وحملات الخصم.
reportsقراءة فقط عبر الطلبات والزبائن والمنتجات.

القوالب ليست حزماً

حين يدعو المالك شخصاً فإنه يختار قالباً لا قائمة حزم. ثلاثة قوالب جاهزة، والرابع يتيح له مزج الحزم يدوياً. وتتشابه الأسماء مع أسماء الحزم، وهو ما يستحق قراءة متأنية لمرة واحدة.

القالبما يحصل عليه الشخص
ordersحزمة الطلبات تماماً.
catalogحزمة المنتجات إضافةً إلى السمات المخصصة واستيراد المنتجات وتصديرها — أي أكثر من الحزمة التي تحمل الاسم نفسه.
fullكل ما يستطيعه المالك ما عدا إعدادات المتجر ومفاتيح الواجهة. مدير، لا مالك ثانٍ.
customاتحاد الحزم التي اختارها المالك.

تُنشأ الأدوار لكل قالب أو لكل مجموعة حزم لا لكل شخص، فعضوان بالقالب نفسه يتشاركان الدور نفسه. وإزالة أحدهما لا تمسّ الآخر.

إدارة الفريق عبر الواجهة

ثلاث عمليات، جميعها للمالك وحده. تعرض `myStaff` أعضاء الفريق مع قالب كل عضو، وتنشئ `inviteStaff` الحساب، وتحذفه `removeStaff` بمعرّف المدير.

graphql
# List the team
query { myStaff { id firstName lastName emailAddress template } }

# Invite someone with the canned "orders" template
mutation {
  inviteStaff(input: {
    firstName: "Rana", lastName: "Haddad",
    emailAddress: "[email protected]",
    password: "set-by-the-owner",
    template: "orders"
  }) { id template }
}

# Or mix bundles by hand
mutation {
  inviteStaff(input: {
    firstName: "Omar", lastName: "Nasr",
    emailAddress: "[email protected]",
    password: "set-by-the-owner",
    template: "custom", bundles: ["orders", "reports"]
  }) { id template }
}

# Remove someone
mutation { removeStaff(administratorId: "42") }
لاحظ أن `inviteStaff` تأخذ كلمة مرور: المالك هو من يحدد الأولى ويسلّمها للعضو. لا توجد بعد رسالة دعوة برابط «اختر كلمة مرورك»، فلا تبنِ مساراً ينتظرها.

كم شخصاً يمكنك إضافته

عدد أعضاء الفريق محدود بخطة المتجر. والحد يُضبط لكل خطة وقد يتغير دون إصدار جديد، لذلك اقرأه من لوحة تحكم المتجر بدل تثبيت رقم في شيفرتك — والدعوة التي تتجاوز الحد تفشل برسالة خطأ واضحة.

هذا ليس مجموعة زبائن

أعضاء الفريق أشخاص يسجّلون الدخول ويديرون المتجر. أما مجموعات الزبائن فهي شرائح من مشتري المتجر تُستخدم لتسعير الجملة. كيانان مختلفان بواجهتين مختلفتين، وتشابه التسمية أوقع كثيرين في اللبس.