Dashboard fix, expense system, currency settings, visual upgrade

- Fix Dashboard stat card: show "Budget Remaining" instead of "Budget Spent"
  with correct remaining value accounting for campaign allocations
- Add expense system: budget entries now have income/expense type with
  server-side split, per-campaign and per-project expense tracking,
  colored amounts, type filters, and summary bar in Budgets page
- Add configurable currency in Settings (SAR ⃁ default, supports 10
  currencies) replacing all hardcoded SAR references across the app
- Replace PiggyBank icon with Landmark (culturally appropriate for KSA)
- Visual upgrade: mesh background, gradient text, premium stat cards with
  accent bars, section-card containers, sidebar active glow
- UX polish: consistent text-2xl headers, skeleton loaders for Finance
  and Budgets pages
- Finance page: expenses column in campaign/project breakdown tables,
  ROI accounts for expenses, expense stat card

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
fahed
2026-02-15 15:49:28 +03:00
parent f3e6fc848d
commit e76be78498
17 changed files with 2817 additions and 1379 deletions

View File

@@ -4,11 +4,13 @@
"nav.dashboard": "لوحة التحكم",
"nav.campaigns": "الحملات",
"nav.finance": "المالية والعائد",
"nav.financeDashboard": "لوحة التحكم",
"nav.budgets": "الميزانيات",
"nav.posts": "إنتاج المحتوى",
"nav.assets": "الأصول",
"nav.projects": "المشاريع",
"nav.tasks": "المهام",
"nav.team": "الفريق",
"nav.team": "الفرق",
"nav.settings": "الإعدادات",
"nav.users": "المستخدمين",
"nav.logout": "تسجيل الخروج",
@@ -46,6 +48,7 @@
"dashboard.activeCampaigns": "الحملات النشطة",
"dashboard.total": "إجمالي",
"dashboard.budgetSpent": "الميزانية المنفقة",
"dashboard.budgetRemaining": "الميزانية المتبقية",
"dashboard.of": "من",
"dashboard.noBudget": "لا توجد ميزانية بعد",
"dashboard.overdueTasks": "مهام متأخرة",
@@ -170,7 +173,45 @@
"tasks.deleted": "تم حذف المهمة بنجاح!",
"tasks.statusUpdated": "تم تحديث حالة المهمة!",
"tasks.canOnlyEditOwn": "يمكنك فقط تعديل مهامك الخاصة.",
"tasks.search": "بحث في المهام...",
"tasks.board": "لوحة",
"tasks.list": "قائمة",
"tasks.calendar": "تقويم",
"tasks.filters": "الفلاتر",
"tasks.allProjects": "جميع المشاريع",
"tasks.allBrands": "جميع العلامات",
"tasks.allPriorities": "جميع الأولويات",
"tasks.allStatuses": "جميع الحالات",
"tasks.allAssignees": "جميع المُسندين",
"tasks.allCreators": "جميع المنشئين",
"tasks.overdue": "متأخر",
"tasks.clearFilters": "مسح الفلاتر",
"tasks.details": "التفاصيل",
"tasks.discussion": "النقاش",
"tasks.unscheduled": "غير مجدول",
"tasks.today": "اليوم",
"tasks.project": "المشروع",
"tasks.brand": "العلامة التجارية",
"tasks.status": "الحالة",
"tasks.creator": "المنشئ",
"tasks.assignee": "المُسند إليه",
"tasks.commentCount": "{n} تعليقات",
"tasks.dueDateRange": "تاريخ الاستحقاق",
"tasks.noProject": "بدون مشروع",
"tasks.createdBy": "أنشأها",
"tasks.startDate": "تاريخ البدء",
"tasks.attachments": "المرفقات",
"tasks.uploadFile": "رفع ملف",
"tasks.setAsThumbnail": "تعيين كصورة مصغرة",
"tasks.removeThumbnail": "إزالة الصورة المصغرة",
"tasks.thumbnail": "الصورة المصغرة",
"tasks.dropOrClick": "اسحب ملفاً أو انقر للرفع",
"projects.thumbnail": "الصورة المصغرة",
"projects.uploadThumbnail": "رفع صورة مصغرة",
"projects.changeThumbnail": "تغيير الصورة المصغرة",
"projects.removeThumbnail": "إزالة الصورة المصغرة",
"team.title": "الفريق",
"team.members": "أعضاء الفريق",
"team.addMember": "إضافة عضو",
@@ -250,6 +291,8 @@
"settings.noBrands": "لا توجد علامات بعد. أضف أول علامة تجارية.",
"settings.moreComingSoon": "المزيد من الإعدادات قريباً",
"settings.additionalSettings": "سيتم إضافة إعدادات إضافية للإشعارات وتفضيلات العرض والمزيد هنا.",
"settings.currency": "العملة",
"settings.currencyHint": "ستُستخدم هذه العملة في جميع الصفحات المالية.",
"settings.preferences": "إدارة تفضيلاتك وإعدادات التطبيق",
"tutorial.skip": "تخطي",
@@ -303,5 +346,148 @@
"timeline.noItems": "لا توجد عناصر للعرض",
"timeline.addItems": "أضف عناصر بتواريخ لعرض الجدول الزمني",
"timeline.tracks": "المسارات",
"timeline.timeline": "الجدول الزمني"
"timeline.timeline": "الجدول الزمني",
"posts.details": "التفاصيل",
"posts.platformsLinks": "المنصات والروابط",
"posts.discussion": "النقاش",
"campaigns.details": "التفاصيل",
"campaigns.performance": "الأداء",
"campaigns.discussion": "النقاش",
"campaigns.name": "الاسم",
"campaigns.description": "الوصف",
"campaigns.brand": "العلامة التجارية",
"campaigns.status": "الحالة",
"campaigns.platforms": "المنصات",
"campaigns.startDate": "تاريخ البدء",
"campaigns.endDate": "تاريخ الانتهاء",
"campaigns.budget": "الميزانية",
"campaigns.goals": "الأهداف",
"campaigns.notes": "ملاحظات",
"campaigns.budgetSpent": "المنفق من الميزانية",
"campaigns.revenue": "الإيرادات",
"campaigns.impressions": "مرات الظهور",
"campaigns.clicks": "النقرات",
"campaigns.conversions": "التحويلات",
"campaigns.createCampaign": "إنشاء حملة",
"campaigns.editCampaign": "تعديل الحملة",
"campaigns.deleteCampaign": "حذف الحملة؟",
"campaigns.deleteConfirm": "هل أنت متأكد من حذف هذه الحملة؟ سيتم حذف جميع البيانات المرتبطة. لا يمكن التراجع.",
"tracks.details": "التفاصيل",
"tracks.metrics": "المقاييس",
"tracks.trackName": "اسم المسار",
"tracks.type": "النوع",
"tracks.platform": "المنصة",
"tracks.budgetAllocated": "الميزانية المخصصة",
"tracks.status": "الحالة",
"tracks.notes": "ملاحظات",
"tracks.budgetSpent": "المنفق من الميزانية",
"tracks.revenue": "الإيرادات",
"tracks.addTrack": "إضافة مسار",
"tracks.editTrack": "تعديل المسار",
"tracks.deleteTrack": "حذف المسار؟",
"tracks.deleteConfirm": "هل أنت متأكد من حذف هذا المسار؟ لا يمكن التراجع.",
"projects.details": "التفاصيل",
"projects.discussion": "النقاش",
"projects.name": "الاسم",
"projects.description": "الوصف",
"projects.brand": "العلامة التجارية",
"projects.owner": "المالك",
"projects.status": "الحالة",
"projects.startDate": "تاريخ البدء",
"projects.dueDate": "تاريخ الاستحقاق",
"projects.editProject": "تعديل المشروع",
"projects.deleteProject": "حذف المشروع؟",
"projects.deleteConfirm": "هل أنت متأكد من حذف هذا المشروع؟ لا يمكن التراجع.",
"team.details": "التفاصيل",
"team.workload": "عبء العمل",
"team.recentTasks": "المهام الأخيرة",
"team.recentPosts": "المنشورات الأخيرة",
"team.modules": "الوحدات",
"team.selectBrands": "اختر العلامات التجارية...",
"team.gridView": "عرض الشبكة",
"team.teamsView": "عرض الفرق",
"team.unassigned": "غير مُعيّن",
"modules.marketing": "التسويق",
"modules.projects": "المشاريع",
"modules.finance": "المالية",
"teams.title": "الفرق",
"teams.teams": "الفرق",
"teams.createTeam": "إنشاء فريق",
"teams.editTeam": "تعديل الفريق",
"teams.deleteTeam": "حذف الفريق؟",
"teams.deleteConfirm": "هل أنت متأكد من حذف هذا الفريق؟ لا يمكن التراجع.",
"teams.name": "اسم الفريق",
"teams.description": "الوصف",
"teams.members": "أعضاء",
"teams.details": "التفاصيل",
"teams.noTeams": "لا توجد فرق بعد",
"teams.selectMembers": "بحث عن أعضاء...",
"dates.today": "اليوم",
"dates.yesterday": "أمس",
"dates.thisWeek": "هذا الأسبوع",
"dates.lastWeek": "الأسبوع الماضي",
"dates.thisMonth": "هذا الشهر",
"dates.lastMonth": "الشهر الماضي",
"dates.thisQuarter": "هذا الربع",
"dates.thisYear": "هذا العام",
"dates.customRange": "نطاق مخصص",
"dates.clearDates": "مسح التواريخ",
"dashboard.myTasks": "مهامي",
"dashboard.projectProgress": "تقدم المشاريع",
"dashboard.noProjectsYet": "لا توجد مشاريع بعد",
"finance.project": "المشروع",
"finance.projectBudget": "ميزانية المشروع",
"finance.projectBreakdown": "توزيع المشاريع",
"finance.budgetFor": "ميزانية لـ",
"budgets.title": "الميزانيات",
"budgets.subtitle": "إضافة وإدارة سجلات الميزانية — تتبع المصدر والوجهة والتخصيص",
"budgets.addEntry": "إضافة سجل",
"budgets.editEntry": "تعديل السجل",
"budgets.deleteEntry": "حذف السجل؟",
"budgets.deleteConfirm": "هل أنت متأكد من حذف هذا السجل؟ لا يمكن التراجع.",
"budgets.searchEntries": "بحث في السجلات...",
"budgets.allCategories": "جميع الفئات",
"budgets.allDestinations": "جميع الوجهات",
"budgets.noEntries": "لا توجد سجلات ميزانية بعد. أضف أول سجل.",
"budgets.noMatch": "لا توجد سجلات تطابق الفلاتر.",
"budgets.label": "الوصف",
"budgets.labelPlaceholder": "مثال: ميزانية التسويق الربع الأول، شراء معدات...",
"budgets.amount": "المبلغ",
"budgets.dateReceived": "تاريخ الاستلام",
"budgets.source": "المصدر",
"budgets.sourcePlaceholder": "مثال: موافقة المدير، الميزانية السنوية...",
"budgets.destination": "الوجهة",
"budgets.selectDestination": "اختر الوجهة...",
"budgets.companyCard": "بطاقة الشركة",
"budgets.personalAccount": "حساب شخصي",
"budgets.corporateAccount": "حساب الشركة",
"budgets.otherDest": "أخرى",
"budgets.category": "الفئة",
"budgets.linkedTo": "مرتبط بـ",
"budgets.noCampaign": "بدون حملة",
"budgets.noProject": "بدون مشروع",
"budgets.general": "عام",
"budgets.notes": "ملاحظات",
"budgets.notesPlaceholder": "أي تفاصيل حول هذا السجل...",
"budgets.date": "التاريخ",
"budgets.type": "النوع",
"budgets.income": "دخل",
"budgets.expense": "مصروف",
"budgets.allTypes": "الكل",
"budgets.net": "صافي",
"budgets.dateExpensed": "التاريخ",
"dashboard.expenses": "المصروفات",
"finance.expenses": "إجمالي المصروفات"
}