Skip to main content

Command Palette

Search for a command to run...

تصميم تجربة مستخدم مختلفة للمالك المستقل vs المكتب العقاري في SaaS

Updated
2 min read

في أملاكي (amlakire.com)، نخدم ٦ أنواع مستخدمين مختلفة على نفس المنصة. التحدي: كيف تصمم تجربة مبسّطة للمالك المستقل دون التضحية بالميزات التي يحتاجها المكتب العقاري؟

أنواع المستخدمين:

enum UserType {
  SUPER_ADMIN    // مشرف النظام
  AGENCY_ADMIN   // صاحب مكتب عقاري
  AGENCY_STAFF   // موظف مكتب
  OWNER          // مالك مستقل ← هذا محور مقالنا
  LINKED_OWNER   // مالك تابع لمكتب (قراءة فقط)
  TENANT         // مستأجر
}

الفرق في التجربة:

العنصر AGENCY_ADMIN OWNER (مستقل)
فلتر الملاك يظهر (يدير عقارات لعدة ملاك) مخفي (هو المالك الوحيد)
إدارة الموظفين يظهر مخفي
العمولات يظهر مخفي
لوحة التحكم كاملة (إحصائيات مكتب) مبسّطة (عقاراته فقط)
الصلاحيات كاملة كاملة على عقاراته

التنفيذ:

// hooks/useUserType.ts
export function useUserType() {
  const { user } = useAuth();

  return {
    showOwnerFilter: user?.userType === 'AGENCY_ADMIN',
    canEdit: user?.userType !== 'LINKED_OWNER',
    showStaffMenu: user?.userType === 'AGENCY_ADMIN',
    showCommissions: user?.userType === 'AGENCY_ADMIN',
  };
}

القاعدة الذهبية: لا تحذف الميزات — أخفِها. نفس الكود، نفس الـ API، لكن الواجهة تتكيّف مع نوع المستخدم.

Data Isolation:

المالك المستقل لا يرى إلا بياناته. الـ API يفلتر تلقائياً:

// في كل service
async findAll(userId: string, userType: string) {
  if (userType === 'OWNER') {
    return this.prisma.property.findMany({
      where: { owner: { userId } }
    });
  }
  // ...
}

مبني في: amlakire.com