Skip to content

Latest commit

 

History

9 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Bayan (بيان) — MVP

مشروع Kotlin Multiplatform (KMP) + SQLDelight + Jetpack Compose، حسب القرارات المتفق عليها:

  • يعمل حاليًا على Android، والبنية جاهزة لإضافة Desktop/iOS لاحقًا بدون إعادة كتابة قاعدة البيانات
  • Offline-first بالكامل: كل البيانات تُخزَّن محليًا فورًا عبر SQLDelight، والتطبيق يعمل ١٠٠٪ بدون إنترنت
  • مصادقة ومزامنة سحابية عبر Supabase (Postgres): حساب واحد يفتحه المستخدم من أي جهاز (أندرويد/آيفون/كمبيوتر)، والمزامنة تصير تلقائيًا لما يتوفر اتصال — بدون ما توقف العمل المحلي
  • كل جدول يحتوي businessId لدعم تعدد الأنشطة التجارية مستقبلاً (ميزة "رجل الأعمال")؛ حاليًا businessId = معرّف المستخدم بـ Supabase (حساب واحد = نشاط تجاري واحد)

إعداد Supabase (مطلوب مرة واحدة فقط)

  1. من supabase.com — أنشئ حساب ومشروع مجاني (بدون بطاقة بنكية)
  2. من القائمة الجانبية SQL Editor → New query → الصق محتوى supabase/schema.sql كامل → Run
    • هذا الملف ينشئ الجداول (product, customer, invoice, invoice_item, payment, expense) + سياسات RLS التي تضمن إن كل مستخدم يشوف بياناته فقط
  3. من Authentication → Providers: تأكد إن "Email" مفعّل (مفعّل افتراضيًا)
  4. الـ Project URL والـ anon/publishable key مُضمّنين مسبقًا بـ SupabaseClientProvider.kt (آمنين للتضمين بالعميل لأن كل الصلاحيات مفروضة عبر RLS)

تنبيه مهم (خطة Supabase المجانية): أي مشروع ما يستقبل طلبات لمدة 7 أيام متتالية يتوقف تلقائيًا (pause) لحد ما تدخل للوحة التحكم وتفعّله يدويًا. البيانات ما تنمسح، بس المزامنة تتوقف مؤقتًا. الحل: جدولة "نبضة" أسبوعية بسيطة (مثلاً عبر GitHub Actions) أو الاعتماد على فتح المستخدم للتطبيق بشكل دوري.

بنية المشروع

Bayan/
├── settings.gradle.kts
├── build.gradle.kts
├── supabase/
│   └── schema.sql                  ← مخطط Postgres + RLS (يُشغَّل يدويًا بلوحة تحكم Supabase)
├── shared/                          ← المنطق المشترك (يُعاد استخدامه لاحقًا مع Desktop/iOS)
│   ├── build.gradle.kts
│   └── src/
│       ├── commonMain/
│       │   ├── sqldelight/com/bayan/app/db/
│       │   │   ├── Business.sq      ← جدول الأنشطة التجارية
│       │   │   ├── Product.sq       ← جدول المنتجات
│       │   │   ├── Customer.sq      ← جدول العملاء/الموردين
│       │   │   ├── Invoice.sq       ← الفواتير وبنودها
│       │   │   ├── Payment.sq       ← دفعات/تسديدات يدوية (كشف الحساب)
│       │   │   └── Expense.sq       ← المصروفات
│       │   └── kotlin/com/bayan/app/
│       │       ├── domain/
│       │       │   ├── model/                        (Product, Party, Invoice, Expense, AuthUser...)
│       │       │   └── repository/                   (واجهات المستودعات، منها AuthRepository)
│       │       └── data/
│       │           ├── DatabaseDriverFactory.kt       (expect)
│       │           ├── remote/SupabaseClientProvider.kt ← إعداد عميل Supabase (URL + key)
│       │           └── repository/                    (التنفيذ الفعلي، منها AuthRepositoryImpl)
│       └── androidMain/
│           └── kotlin/com/bayan/app/data/DatabaseDriverFactory.kt  (actual)
└── androidApp/                       ← واجهة Android (Compose)
    └── src/main/
        ├── AndroidManifest.xml
        └── kotlin/com/bayan/app/android/
            ├── MainActivity.kt        ← بوابة المصادقة + التنقل بين الشاشات
            ├── auth/                  ← تسجيل الدخول / حساب جديد
            ├── dashboard/, sales/, invoices/, expenses/, products/, parties/

ما تم إنجازه

  • المنتجات: عرض، إضافة، حذف (soft delete)، تنبيه انخفاض المخزون
  • العملاء والموردون (نفس الجدول، مفصولين بـ type): عرض، إضافة، حذف، رصيد (له/عليه)
  • فاتورة البيع: سلة + عميل اختياري + دفع (نقد/تحويل/دين) → تنقص المخزون وتحدّث دين العميل تلقائيًا بعملية واحدة (transaction)
  • قائمة الفواتير السابقة + تفاصيل كل فاتورة (الأصناف، الكمية × السعر، الربح المحقق)
  • كشف حساب موحّد لكل عميل/مورد (فواتير + دفعات يدوية) مع إمكانية تسجيل تسديد/دفعة-سلفة
  • شاشة مصروفات مستقلة: سجل كامل، فلترة بالتصنيف (تلقائية حسب بياناتك)، حذف مباشر
  • لوحة التحكم: مبيعات/أرباح/مصروفات اليوم، صافي اليوم، إجمالي الديون، منتجات قليلة، إضافة مصروف سريع
  • تسجيل الدخول / حساب جديد عبر Supabase (بريد + كلمة سر)، بحيث نفس الحساب يفتح نفس البيانات من أي جهاز
  • قاعدة بيانات محلية حقيقية (SQLDelight) تعمل بدون إنترنت بالكامل
  • دعم RTL كامل للعربية بالواجهة

الخطوة التالية المقترحة (طبقة المزامنة)

المرحلة الحالية أضافت المصادقة فقط (تسجيل دخول/حساب موحّد يحدد businessId). البيانات نفسها لسا محلية بالكامل (SQLDelight) ولسا ما فيه رفع/سحب تلقائي مع جداول Supabase. الخطوة الجاية:

  1. طبقة "Sync Engine" تراقب التغييرات المحلية (إضافة/تعديل/حذف) وترفعها لجداول Supabase لما يتوفر اتصال
  2. سحب التغييرات القادمة من جهاز آخر لنفس الحساب وتطبيقها محليًا (conflict resolution بسيط بالاعتماد على updatedAt)
  3. مؤشر بالواجهة يوضح حالة المزامنة (متزامن / جارِ الرفع / بدون اتصال)

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages