تصميم تجربة مستخدم مختلفة للمالك المستقل vs المكتب العقاري في SaaS
في أملاكي (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