Flutter لأنظمة نقاط البيع: وضع عدم الاتصال أوّلًا
لا تعمل أنظمة الكاشير في بيئة مثالية. يسقط الإنترنت، تنقطع الكهرباء، ويجب أن يظل الفرع يبيع. هذه الورقة تلخّص النمط الذي نستخدمه في TtaKkaa Cashier لضمان عمل سلس بغضّ النظر عن الشبكة.المبادئ الثلاثةSource of truth محلي: …

لا تعمل أنظمة الكاشير في بيئة مثالية. يسقط الإنترنت، تنقطع الكهرباء، ويجب أن يظل الفرع يبيع. هذه الورقة تلخّص النمط الذي نستخدمه في TtaKkaa Cashier لضمان عمل سلس بغضّ النظر عن الشبكة.
المبادئ الثلاثة
- Source of truth محلي: قاعدة بيانات SQLite هي المرجع، والشبكة مجرّد مُزامِن.
- Events-first: كل عملية تبيع/مرتجع/تخفيض تُسجّل كـ event، لا تعديل مباشر للصفوف.
- Sync لا يقف خلف المستخدم: Queue في الخلفية، ولا ننتظره قبل إصدار الفاتورة.
المكدّس
- Drift (SQLite) للتخزين المحلي.
- Riverpod لإدارة الحالة.
- WorkManager لمزامنة ذكية عند توفر الشبكة.
- Laravel 11 كطرف بعيد يستقبل batch events.
حل التعارضات
نستخدم CRDT مبسّط لبنود الجرد: الإضافة والخفض تجميعية، ولا تتعارض حتى لو تمّت offline من عدّة فروع.
التحدّيات الشائعة
- الطابعة الحرارية: طباعة ESC/POS عبر Bluetooth حتى بدون إنترنت.
- قارئ الباركود: استماع لأحداث USB-HID مباشرة.
- تحديثات المنتج: تُطبَّق لحظة الاتصال مع resolvers لمنع تخريب الفواتير المعلّقة.
الخلاصة
تطبيقات نقاط البيع ليست «تطبيق موبايل متّصل» — بل نظام موزّع صغير يعمل في فرع واحد. خطّط على هذا الأساس وسيثبت النظام حتى في الحالات المتطرّفة.


