توثيق تقنِكس لنقاط البيع
دليل تقنِكس لنقاط البيع: تثبيت التطبيق وتشغيله وتهيئة أودو وربط الجهاز والبيع والدفع والإيصالات والعمل دون اتصال والطلبات والمزامنة وطاولات المطعم وتذاكر المطبخ والشاشات الاحترافية وإغلاق الجلسة والإعدادات والسمات ومحرك الضرائب والبنية والأمان والدقة والحدود.
يشرح الإصدار 1.0.0حُدّث في 30 أكتوبر 2026
ابدأ من هنا
pos.order.sync_from_ui). لا توجد وحدة أودو تُثبَّت: التطبيق يعمل خارج أودو ويتصل به. الواجهة بالعربية والإنجليزية، وهو جاهز للتشغيل (يكفيك Node.js) ومعه الشيفرة المصدرية الكاملة، لشركة واحدة وبعدد غير محدود من الأجهزة.التطبيق للمقاهي والمتاجر والمطاعم التي تعمل على أودو 19، وللمُركِّبين الذين يجهّزون أودو لعملائهم. الترخيص لشركة واحدة: على المُركِّب أن يشتري نسخة لكل شركة عميلة (الفصل 30).
الصور في هذا الدليل من متجر تجريبي اسمه Harbor Café & Market (بالدولار الأمريكي، العنوان 1200 Harbor Walk, Dearborn MI). فيه نقطتا بيع:
- المتجر الرئيسي: تجزئة ومقهى. الأسعار المعروضة شاملة الضريبة، وتقريب النقد 0.05 على الدفع النقدي، وبرنامج الولاء «مكافآت هاربر»، وكود الخصم SUMMER10.
- مطعم هاربر: طابقان هما «الطابق الأرضي» و«التراس»، وطابعتان للمطبخ والبار. الأسعار المعروضة دون الضريبة.
أمين الصندوق في الصور هو Tom Becker، وهو مستخدم عادي لنقطة البيع. عنوان أودو الظاهر في الصور خادم تجريبي محلي؛ عندك سيكون عنوان أودو الخاص بشركتك.
أودو علامة تجارية لشركة Odoo S.A. وهذا المنتج لم تصنعه Odoo S.A. ولم تعتمده.
ماذا تحصل عليه
| الميزة | ما تفعله | الفصل |
|---|---|---|
| الإعداد واختبار الاتصال | شاشة اربط هذا الجهاز بأودو: العنوان وقاعدة البيانات واسم الدخول ومفتاح API، ثم تقرير يذكر ما ينقص المستخدم من صلاحيات. | 6 |
| اختيار نقطة البيع والنقد الافتتاحي | بطاقة لكل نقطة بيع، وفتح الجلسة بعدّ الأوراق والعملات أو بإدخال المبلغ. | 7 |
| شاشة البيع | بحث بالاسم أو المرجع أو الباركود، وفئات ومفضلة، وخصم وملاحظة وقائمة أسعار، ولوحة أرقام، وماسح باركود. | 8 |
| المتغيرات والكومبو | نافذة خيارات المنتج (الحجم واللون والإضافات) وبطاقات اختيار لكل مجموعة في الكومبو. | 9 |
| العملاء | بحث وتعديل وعميل جديد. يمكن إنشاء العميل دون اتصال عندما يسمح أودو للمستخدم بذلك. | 10 |
| الدفع والإيصال | عدة طرق دفع، وباقٍ، وتقريب النقد، وخيار الفاتورة. إيصال بعرض 58 أو 80 مم مع باركود ورمز QR. | 11 |
| العمل دون اتصال | كل ما يلزم للبيع محفوظ على الجهاز، وقائمة انتظار ترسل الطلبات بالترتيب عند عودة الاتصال. | 12 |
| الطلبات | إعادة طباعة واسترداد وإعادة مزامنة وتصدير JSON وحذف الطلبات التي رفضها أودو. | 13 |
| شاشة المزامنة | قائمة الانتظار وسجل الأحداث وحالة الاتصال والبيانات المحفوظة والتخزين وملف التشخيص. | 14 |
| المطعم (عند تثبيت وحدة المطعم في أودو) | مخطط الصالة والطاولات، وتذاكر المطبخ، وتقسيم الفاتورة، والنقل والدمج، والإكرامية. | 15 |
| الميزات الاحترافية (داخل السعر) | لوحة المؤشرات، والاستعلام عن المخزون، والحجز بعربون، والولاء وأكواد الخصم. | 16 إلى 19 |
| إغلاق الجلسة | عدّ النقد، وملخص الجلسة، وتقرير الإغلاق. | 20 |
| الإعدادات | خمسة مظاهر ولون للعلامة، والكثافة وحجم النص واللغة والأرقام، وقفل PIN، ورمز المدير، وملف الإعدادات. | 21 |
| تطبيق ويب جاهز للتشغيل | الجهاز مبنيّ مسبقًا مع ملف تشغيل لويندوز وماك ولينكس: فُكّ الضغط وشغّله وافتح العنوان. يكفي أن يكون Node.js مثبّتًا. | 4 |
| الحزمة | الشيفرة المصدرية والاختبارات وملف Dockerfile وأمثلة nginx. | 4 و24 |
التقنية: Next.js 16 وReact 19 وTypeScript وTailwind CSS 4. البيانات المحلية في IndexedDB عبر Dexie، وحالة الواجهة في Zustand، والتحقق من البيانات بـ Zod.
ما تحتاج إليه
| البند | التفاصيل |
|---|---|
| أودو | الإصدار 19 Community مع تطبيق نقطة البيع. نسخة Enterprise لم تُختبر. إذا كان الخادم أقدم من 19 فإن شاشة الإعداد تحذّر ولا ترفض، لكن الإصدارات الأخرى لم تُختبر. |
| وحدات أودو الاختيارية | المطعم (pos_restaurant) لشاشات المطعم، والولاء (pos_loyalty) لنقاط العملاء وأكواد الخصم، والخصم (pos_discount) للخصم على الطلب كله. |
| لتشغيل التطبيق | Node.js 20.9 أو أحدث (وهو كل ما يحتاجه التطبيق الجاهز للتشغيل)، أو Docker. ملف الصورة المرفق يستخدم Node 24 ويبني الشيفرة المصدرية. |
| HTTPS | لا يُثبَّت التطبيق (PWA) ولا يعمل دون اتصال إلا من عنوان https:// أو من http://localhost. جهّز شهادة TLS للعنوان الذي يفتحه الجهاز (الفصل 4). |
| المتصفح على جهاز البيع | متصفح من عائلة Chromium (Chrome أو Edge) فيه Service Workers وIndexedDB وWeb Locks. Safari وFirefox لم يُختبرا. |
| مستخدم أودو | مستخدم لكل جهاز أو لكل أمين صندوق: مستخدم داخلي مع صلاحية نقطة البيع / مستخدم، ومعه مفتاح API (الفصل 5). |
| الطابعات والماسحات | اختيارية. الطباعة عبر المتصفح فقط، والماسح يعمل كلوحة مفاتيح. لم تُجرَّب الطابعات والماسحات وأدراج النقد على أجهزة حقيقية (الفصل 27). |
التثبيت والتشغيل
الخيار 1: تطبيق الويب الجاهز للتشغيل
لا شيء لتثبيته ولا لبنائه.
- ثبّت Node.js 20.9 أو أحدث من nodejs.org (الأمر
node -vيعرض الإصدار الذي عندك). - فُكّ ضغط الحزمة، ثم فُكّ ضغط الملف
taqnix-pos-terminal-webapp.zipالذي فيها. المجلدtaqnix-pos-terminal-webappهو التطبيق الجاهز. - افتح نافذة أوامر (موجّه الأوامر في ويندوز) داخل هذا المجلد وشغّل التطبيق مع عنوان أودو:
sh start.sh https://erp.example.comعلى ماك ولينكس، وstart.bat https://erp.example.comعلى ويندوز. - افتح
http://localhost:3000في Chrome أو Edge واربط الجهاز بأودو (الفصل 6). لإيقافه اضغط Ctrl+C.
# macOS and Linux, in the folder taqnix-pos-terminal-webapp sh start.sh https://erp.example.com # Windows (Command Prompt, or double-click start.bat) start.bat https://erp.example.com # another port; every option sh start.sh https://erp.example.com --port 3100 sh start.sh --help # the same without the launcher script node run.cjs https://erp.example.com
ملف التشغيل يتحقق من إصدار Node.js، ويضيف عنوان أودو الذي تكتبه إلى POS_ALLOWED_ORIGINS، ويقرأ الملف .env (انسخ .env.example إلى .env لتحفظ إعداداتك)، وينبّهك إذا كان المنفذ مشغولًا. وفي المجلد أيضًا ملف README.txt خاص به.
يستمع التطبيق على هذا الحاسوب فقط (127.0.0.1) ما لم تطلب غير ذلك. وهذا يكفي للتجربة ولجهاز بيع على الحاسوب نفسه: العنوان http://localhost يُعدّ آمنًا في المتصفح، فيُثبَّت التطبيق ويعمل دون اتصال. لأجهزة بيع على أجهزة أخرى شغّله بالخيار --host 0.0.0.0 (أو POS_HOST=0.0.0.0) وضع أمامه HTTPS (أدناه). ولتشغيله مع الحاسوب وإعادة تشغيله بعد أي توقف شغّل node run.cjs بمدير عمليات تستخدمه عندك (systemd أو pm2 أو مجدول مهام ويندوز).
الخيار 2: البناء من الشيفرة المصدرية
لمن يعدّل التطبيق أو يريد بناءه على خادمه.
- فُكّ ضغط الحزمة ثم الملف
taqnix-pos-terminal.zipوادخل إلى المجلدsrc/pos-terminal(الذي فيه الملفpackage.json). - ثبّت الاعتماديات بالأمر
npm ci. - انسخ الملف
.env.exampleإلى.envواكتب فيه عنوان أودو فيPOS_ALLOWED_ORIGINS. - ابنِ التطبيق بالأمر
npm run build. ينتج عنه نسخة الإنتاج وملف الـ service worker وملف التراخيص. - شغّله بالأمر
npm start. المنفذ الافتراضي 3000، ويُغيَّر بالخيار-p. - افتح عنوان التطبيق من متصفح جهاز البيع (القسم الأخير من هذا الفصل).
npm ci npm run dev # development server on http://localhost:3000 (permissive proxy defaults) npm run build # production build + service worker (scripts/make-sw.mjs) + licences file npm start # production server (NODE_ENV=production), port 3000 (-p to change) POS_STANDALONE=1 npm run build # .next/standalone, used by the Dockerfile npm run pack:webapp # after that build: a ready-to-run folder in webapp-dist/, like the one in the package docker compose up -d # build + run with the settings of .env (copy .env.example)
متغيرات البيئة
تُكتب في الملف .env (أو في بيئة الحاوية). في وضع التطوير (npm run dev) يُسمح بأي عنوان أودو وبالعناوين الخاصة.
| المتغير | معناه |
|---|---|
POS_ALLOWED_ORIGINS | قائمة مفصولة بفواصل بعناوين أودو التي يسمح لها الوسيط /api/odoo بالوصول. في الإنتاج لا يُسمح بغيرها. |
POS_ALLOW_ANY_ORIGIN=1 | يقبل أي عنوان أودو يُكتب في شاشة الإعداد. للشبكات الموثوقة وللتطوير فقط: على خادم مفتوح للإنترنت يحوّل الوسيط إلى مرحّل نحو أي خادم عام. |
POS_ALLOW_PRIVATE=1 | يسمح بالعناوين الخاصة (10.x و192.168.x و127.0.0.1) للعناوين التي لم تُذكر صراحة. عناوين link-local وبيانات السحابة الوصفية مرفوضة دائمًا. |
POS_TRUST_PROXY=1 | يفعّله من يضع التطبيق خلف وسيط عكسي يكتب X-Forwarded-For وX-Forwarded-Host وX-Forwarded-Proto. بدونه تُتجاهل هذه الترويسات. |
POS_DISABLE_JSONRPC=1 | يرفض /jsonrpc: تعمل مفاتيح API فقط ولا تُقبل كلمات مرور أودو. موصى به على أودو 19. |
POS_CONNECT_SRC | عناوين إضافية تُضاف إلى connect-src في سياسة الأمان. للوضع المباشر فقط (الفصل 6). |
POS_PROXY_LOG=1 | يسجّل الطريقة والمسار والحالة للطلبات المارّة، ولا يسجّل محتواها ولا المفاتيح. |
POS_HOST، PORT | للتطبيق الجاهز للتشغيل فقط: العنوان (الافتراضي 127.0.0.1 أي هذا الحاسوب فقط) والمنفذ (الافتراضي 3000) اللذان يستمع عليهما. القيمة 0.0.0.0 تفتحه للشبكة: خلف HTTPS فقط. |
POS_ALLOWED_ORIGINS=https://erp.example.com # POS_ALLOW_ANY_ORIGIN=1 # POS_ALLOW_PRIVATE=1 # POS_CONNECT_SRC=https://erp.example.com # POS_TRUST_PROXY=1 # POS_DISABLE_JSONRPC=1 # POS_HOST=127.0.0.1 # PORT=3000
Docker
يأتي مع الحزمة ملفا Dockerfile وdocker-compose.yml. الأمر docker compose up -d يبني الصورة ويشغّلها بإعدادات الملف .env.
# docker-compose.yml
services:
pos:
build: .
restart: unless-stopped
ports:
- "3000:3000"
env_file: .env
# without compose (header of the Dockerfile)
docker build -t taqnix-pos . && docker run -p 3000:3000 --env-file .env taqnix-posواجهة HTTPS بـ nginx
المثال deploy/nginx.conf.example يضع TLS أمام التطبيق. النقاط المهمة فيه:
- شغّل التطبيق مع
POS_TRUST_PROXY=1لأن nginx هو الذي يكتب ترويساتX-Forwarded-*. - الملف
/sw.jsلا يُخزَّن مؤقتًا أبدًا، لا في nginx ولا في أي CDN، وإلا لن تصل التحديثات. client_max_body_size 26m: يقبل الوسيط حتى 25 ميغابايت (طلبات فيها بنود كثيرة، وصور).- العنوان العام يحتاج إلى حماية: VPN أو SSO أو قائمة عناوين مسموحة (الفصل 25).
# TLS front for the terminal (a PWA can only be installed from https:// or http://localhost).
# Run the app with POS_TRUST_PROXY=1 behind this proxy (it writes the X-Forwarded-* headers below).
# Internet-facing? /api/odoo has no login of its own: restrict who reaches it (VPN, SSO / identity-aware
# proxy, or an IP allow-list like the commented `allow`/`deny` lines below).
server {
listen 443 ssl http2;
server_name pos.example.com;
ssl_certificate /etc/letsencrypt/live/pos.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pos.example.com/privkey.pem;
client_max_body_size 26m; # the proxy accepts up to 25 MB (orders with many lines, images)
# allow 203.0.113.0/24; # the shop's public address(es)
# deny all;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
# overwrite (never append) what the client sent: the app trusts these only with POS_TRUST_PROXY=1
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 70s; # the proxy gives Odoo 60 s
}
# The service worker must never be cached by a CDN or by nginx
location = /sw.js {
proxy_pass http://127.0.0.1:3000;
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
}
}التثبيت على جهاز البيع
- افتح عنوان التطبيق
https://...في Chrome أو Edge. - اضغط زر التثبيت في المتصفح. وعندما يسمح المتصفح يعرض التطبيق أيضًا شريطًا صغيرًا فيه الرسالة «ثبّت التطبيق على هذا الجهاز لاستخدامه بملء الشاشة وتشغيله أسرع.» وزرّا تثبيت وتجاهل.
- شغّل التطبيق المثبّت من قائمة التطبيقات أو من سطح المكتب. تجد حالة التثبيت أيضًا في الإعدادات ثم حول.
جهّز أودو
- أنشئ لكل جهاز (أو لكل أمين صندوق) مستخدمًا في أودو: مستخدم داخلي مع المجموعة نقطة البيع / مستخدم فقط.
- من تفضيلات هذا المستخدم افتح أمان الحساب وأنشئ مفتاح API جديد بالنطاق
rpc. انسخ المفتاح فورًا: لا يعرضه أودو مرة ثانية. استعمل المفتاح بدل كلمة المرور في شاشة الإعداد. - اضبط نقطة البيع في أودو: طرق الدفع (طريقة نقدية واحدة لكل نقطة بيع)، ومراقبة النقد إن أردت عدّ الدرج عند الفتح والإغلاق، ودفتر اليومية الذي تصدر منه الفواتير إذا أردت استعمال خيار فاتورة.
- اضغط اختبار الاتصال في التطبيق (الفصل 6). التقرير يقول لك ما ينقص هذا المستخدم.
صلاحيات اختيارية
المستخدم العادي لنقطة البيع لا يملك بعض الصلاحيات في أودو 19. لا يمنعه ذلك من البيع، لكن بعض الميزات تحتاج إليها:
| الصلاحية في أودو | ما تفتحه في التطبيق |
|---|---|
| جهات الاتصال / الإنشاء | إنشاء العملاء. بدونها يحفظ التطبيق العميل الجديد على الجهاز ويرفضه أودو عند الإرسال، وتبقى الطلبات التي تنتظره في قائمة الانتظار. |
| المنتجات / الإنشاء | حفظ القيم النصية الحرة لخصائص المنتج (الخيار «أخرى (حدد)»). |
| المحاسبة / الفوترة | تسجيل إيداع النقد وسحبه. لا يوجد زر لذلك في هذا التطبيق: سجّل الحركات النقدية في أودو. |
| صلاحيات قراءة المحاسبة | طباعة تقرير Z الكامل من أودو. بدونها يعرض التطبيق ملخصًا للجلسة، ويطبع المدير التقرير الكامل من أودو. |
| المخزون / مستخدم | بيع المنتجات المتتبَّعة بالدفعة أو بالرقم التسلسلي. بدونها يرفض أودو الطلب وتبقى في شاشة المزامنة. |
| مسؤول نقطة البيع | لا يلزم للبيع. يحتاج إليه من سيغلق في أودو جلسة علقت في حالة «قيد الإغلاق» (الفصل 20). |
الضرائب والأوضاع المالية
اربط في كل وضع مالي كل ضريبة صراحةً بضريبة أخرى، ولو كانت ضريبة نسبتها 0 %. الوضع المالي بلا أسطر ضرائب يتصرف في أودو 19 نفسه تصرفًا غير متسق: عميل أودو يُبقي الضرائب والخادم يحذفها، فلا تتطابق قيود الجلسة مع الطلبات (الفصل 23). لا يستطيع التطبيق التمييز بين هذا الوضع ووضع لا يُحوّل شيئًا.
للمطعم
الطوابق والطاولات وطابعات الطلبات وفئات المطبخ ومنتج الإكرامية وأنواع الخدمة تُضبط كلها في أودو، من نقطة البيع ثم الإعدادات ثم مخططات الصالة. مستخدم نقطة البيع يقرأ الطاولات فقط. عدّل المخطط في أودو ثم اضغط تنزيل البيانات الآن في شاشة المزامنة (الفصل 15).
ربط الجهاز بأودو
في أعلى الشاشة شريحتان لاختيار اللغة (العربية وEnglish) والمظهر (فاتح وداكن ومحيط وغابة وغروب). يمكنك تغييرهما قبل الاتصال وبعده.
| الحقل | ماذا تكتب |
|---|---|
| عنوان الخادم | العنوان الذي تفتح به أودو، مثل https://erp.example.com، دون مسار صفحة. إذا لم تكتب البروتوكول جرّب التطبيق https أولًا، ثم http فقط لـ localhost والعناوين الخاصة والأسماء المحلية (.local و.lan والأسماء المؤلفة من كلمة واحدة)، ويقول التقرير عندها إنه استعمل HTTP. العنوان المكتوب بـ https:// لا يُخفَّض إلى HTTP أبدًا. |
| قاعدة البيانات | اسم قاعدة البيانات. الزر البحث عن قواعد البيانات يسأل الخادم عن القائمة ويحوّل الحقل إلى قائمة اختيار. بعض الخوادم لا تنشر القائمة: عندها اكتب الاسم. |
| اسم الدخول | اسم دخول مستخدم أودو الذي جهّزته في الفصل 5. |
| كلمة المرور أو مفتاح API | يُنصح بمفتاح API لمستخدم له صلاحية نقطة البيع فقط. إذا لصقت المفتاح ومعه مسافة أو سطر جديد في آخره يقصّه التطبيق (مفتاح أودو 40 خانة سداسية عشرية). كلمة المرور تُرسل كما كُتبت. زر العين يُظهر النص أو يخفيه. |
إعدادات متقدمة
| الإعداد | المعنى |
|---|---|
| طريقة الاتصال | عبر هذا التطبيق (وسيط) هو الخيار الموصى به ويعمل مع أي خادم أودو دون تعديله: المتصفح يكلّم هذا التطبيق وهو يكلّم أودو. مباشرة إلى أودو فقط إذا كان الوسيط العكسي لأودو يسمح لهذا التطبيق بالاتصال (CORS): المثال deploy/odoo-cors.nginx.example والمتغير POS_CONNECT_SRC. |
| البروتوكول | تلقائي يستخدم JSON-2 إذا كان الخادم يدعمه، وإلا JSON-RPC. يمكنك اختيار JSON-2 أو JSON-RPC صراحة. JSON-2 يحتاج إلى مفتاح API؛ مع كلمة المرور يستخدم الجهاز JSON-RPC، وأودو سيزيله في الإصدار 20. |
| مهلة الطلب (بالثواني) | مدة انتظار أودو قبل أن يعمل الجهاز دون اتصال. القيمة الافتراضية 30، ومن 5 إلى 120. |
| القفل برمز PIN | يشفّر المفتاح المحفوظ على الجهاز، ويُطلب الرمز عند تشغيل الجهاز. من 6 إلى 12 رقمًا، وتكتبه مرتين (الفصل 25). |
اختبار الاتصال
الزر اختبار الاتصال يتحقق بالترتيب من أن العنوان خادم أودو، ومن قاعدة البيانات، ومن الدخول، ثم من صلاحية نقطة البيع. ويعرض تقريرًا:
| في التقرير | معناه |
|---|---|
| الخادم | إصدار أودو. إن كان أقدم من 19 تظهر الملاحظة «هذا الخادم ليس أودو 19.» وهي تحذير لا يمنع الحفظ. |
| قاعدة البيانات والمستخدم | ما اتصل به الجهاز فعلًا. |
| صلاحية نقطة البيع | «نعم» إذا كان المستخدم يستطيع استعمال نقطة البيع. |
| البروتوكول المستخدم | JSON-2 أو JSON-RPC. |
| نقاط البيع | عدد نقاط البيع التي يستطيع المستخدم فتحها. إن كان صفرًا فلن يكتمل الاتصال. |
| الوحدات المكتشفة | نقطة البيع، والمطعم، والولاء، والخصم، والمخزون. الوحدة غير المثبتة تُخفي ميزاتها من الجهاز. |
| الملاحظات | ما ينقص المستخدم من صلاحيات اختيارية (الفصل 5) مع الحل، وتنبيهات عن البروتوكول والعنوان. |
الزر حفظ ومتابعة يعمل بعد أن تكتمل الحقول الأربعة ولا يكون في التقرير خطأ. إن لم تختبر الاتصال قبل ذلك فإنه يختبره أولًا، ثم يحفظ الاتصال على هذا الجهاز وينقلك إلى اختيار نقطة البيع.
أشهر المشكلات
| الرسالة | الحل |
|---|---|
| «الخادم لا يستجيب.» | تحقّق من العنوان ومن أن الخادم يعمل. |
| «هذا العنوان لا يبدو خادم أودو.» | يجب أن يكون العنوان عنوان خادم أودو نفسه. |
| «قاعدة البيانات هذه غير موجودة على الخادم.» | استخدم البحث عن قواعد البيانات أو اطلب الاسم الدقيق من المسؤول. |
| «اسم الدخول أو كلمة المرور / مفتاح API غير مقبول.» | تحقّق من اسم الدخول والصق مفتاح API من جديد (التفضيلات ثم أمان الحساب في أودو). |
| «لا يستطيع هذا المستخدم استخدام نقطة البيع.» | في أودو امنح المستخدم صلاحية «نقطة البيع / مستخدم». |
| «رفض هذا التطبيق تمرير الطلبات إلى ذلك الخادم.» | أضف الخادم إلى POS_ALLOWED_ORIGINS في بيئة هذا التطبيق (الفصل 4). |
بقية الرسائل وحلولها في الفصل 28.
اختيار نقطة البيع وفتح الجلسة
تعرض كل بطاقة اسم نقطة البيع ونوعها (تجزئة أو مطعم)، وشارة مراقبة النقد إذا كانت نقطة البيع تعدّ النقد، وحالة الجلسة:
| الحالة على البطاقة | الزر | المعنى |
|---|---|---|
| مغلقة | فتح | لا توجد جلسة. سيطلب منك النقد الافتتاحي. |
| الجلسة مفتوحة (أو «الجلسة مفتوحة بواسطة» اسم مستخدم) | متابعة | توجد جلسة مفتوحة فتتابعها دون عدّ جديد. |
| الجلسة بانتظار النقد الافتتاحي | فتح | فُتحت الجلسة في أودو ولم يُعدّ النقد بعد. |
| الجلسة قيد الإغلاق: اطلب مساعدة المدير | معطّل | أودو لا يقبل طلبات في هذه الجلسة. يُنهي المدير إغلاقها في أودو (الفصل 20). |
الزر تغيير الخادم في الأعلى يعيدك إلى شاشة الإعداد. إذا كانت على الجهاز طلبات لم تُرسل إلى الخادم السابق يرفض الجهاز الانتقال إلى خادم آخر ويقول «طلبات الخادم السابق لم تُرسل بعد. أرسلها قبل تغيير الخادم.»
النقد الافتتاحي
تفتح النافذة النقد الافتتاحي عندما تختار نقطة بيع لا جلسة مفتوحة لها. اختر طريقة الإدخال:
- عدّ الأوراق والعملات: فئات الأوراق والعملات تأتي من أودو، ولكل فئة عدّاد. الإجمالي يُحسب لك.
- إدخال المبلغ: تكتب مبلغ الدرج الإجمالي في الحقل النقد في الدرج.
اكتب عند الحاجة ملاحظة الافتتاح ثم اضغط فتح الجلسة. إن لم تكن نقطة البيع تعدّ النقد عند الافتتاح تظهر العبارة «نقطة البيع هذه لا تعدّ النقد عند الافتتاح.»
| موضوع | التفاصيل |
|---|---|
| معرّف الجهاز | أودو يعطي كل جهاز معرّفًا خاصًا به عند فتح الجلسة أول مرة. لذلك افتح الجلسة مرة واحدة على الأقل والجهاز متصل؛ وإلا تظهر الرسالة «افتح الجلسة مرة واحدة أثناء الاتصال لتسجيل هذا الجهاز.» |
| البدء دون اتصال | إذا كانت بيانات الجهاز موجودة وجلسته مفتوحة فإنه يتابع الجلسة المحفوظة دون هذه النافذة ويعرض الحالة «غير متصل» (الفصل 12). |
| إغلاق الجلسة من المكتب | يفحص الجهاز حالة الجلسة نحو مرة كل دقيقة أثناء الاتصال. إذا أُغلقت من أودو يظهر شريط أحمر في أعلى الشاشة: «أُغلقت هذه الجلسة على جهاز آخر. افتح جلسة جديدة.» مع الزر افتح جلسة جديدة. وإذا أُلغي مفتاح API يظهر الزر أدخل بيانات دخول جديدة. ويستمر البيع، والطلبات المنتظرة تذهب إلى الجلسة الجديدة. |
شاشة البيع
المنتجات
- ابحث بالاسم أو المرجع أو الباركود: البحث يبدأ بعد توقف الكتابة لحظة قصيرة، ويغطي الاسم والمرجع الداخلي والباركود. الضغط على Enter يضيف المنتج إذا كان الباركود أو المرجع مطابقًا تمامًا أو إذا بقيت نتيجة واحدة.
- الفئات: شرائح بألوان نقطة البيع في الصف الأول، وبعضها يحوي فئات فرعية. الكل يعرض كل المنتجات، والمفضلة ما علّمته مفضلًا في أودو.
- بطاقة المنتج: صورة (أو حرفان من الاسم) والاسم والسعر. المنتج الذي له خيارات تظهر عليه الشارة خيارات، والكومبو الشارة كومبو.
- لمسة واحدة تضيف المنتج إلى الطلب. المنتج نفسه بالخيارات نفسها والسعر نفسه يُدمج في بند واحد وتزيد كميته، كما تفعل نقطة بيع أودو.
- الزر «...» على البطاقة، أو الضغط المطوّل عليها نحو نصف ثانية، يفتح نافذة الخيارات (الكمية والملاحظة وخيارات المنتج، الفصل 9).
- إذا كان الكتالوج كبيرًا جدًا تتوقف الشبكة عند 1,200 بطاقة وتقول «ابحث أو اختر فئة لعرض بقية المنتجات.»
لوحة الطلب
يظهر في أعلى اللوحة رقم الطلب وعدد البنود وزر العميل (الفصل 10)، ثم شرائح اختيارية: نقاط الولاء (الفصل 19) وقائمة الأسعار (تظهر إذا كان في نقطة البيع أكثر من قائمة أسعار). كل بند يعرض كميته واسمه مع خياراته وسعر الوحدة وإجماليه، وخصمه إن وُجد. تحت البنود الإجمالي الفرعي ثم سطر لكل ضريبة ثم الإجمالي.
| الزر | ما يفعله |
|---|---|
| الخصم | نافذة بنسب سريعة 5 و10 و15 و20 % ولوحة أرقام. إذا كانت الوحدة pos_discount مثبتة وعُيّن منتج الخصم فتختار بين الطلب كاملًا والبند المحدد؛ وإلا فالخصم على البند المحدد. |
| ملاحظة | حقلان: ملاحظة للعميل (تُطبع على الإيصال) وملاحظة داخلية (للموظفين فقط، لا تُطبع للعميل). |
| قائمة الأسعار | تغيير قائمة أسعار الطلب. يظهر الزر إذا كان هناك أكثر من قائمة. |
| لوحة الأرقام | إظهار لوحة الأرقام أو إخفاؤها. الوضع تلقائي في الإعدادات يظهرها عندما يبلغ ارتفاع النافذة 900 بكسل أو أكثر. |
| المزيد | تعليق الطلب (يحفظه ويفتح طلبًا جديدًا)، وطلب جديد، واسترداد (ينقلك إلى الطلبات)، وإلغاء الطلب (يبقى في السجل بحالة ملغى ولا يُرسل إلى أودو)، وقائمة الطلبات المعلّقة لاستئنافها. وتضيف الميزات المفعّلة أزرارها هنا: الحجوزات (الفصل 18) والمكافآت وكود الخصم (الفصل 19) وأزرار المطعم (الفصل 15). |
لوحة الأرقام لها ثلاثة أوضاع لتعديل البند المحدد: الكمية وخصم % والسعر. اضغط الوضع ثم اكتب الرقم. لا يمكن تغيير سعر عنصر داخل كومبو.
على الجهاز اللوحي الرأسي (768×1024) تنطوي لوحة الطلب في شريط سفلي فيه الزر مراجعة الطلب مع عدد البنود والإجمالي والزر الدفع.
ماسح الباركود
يعمل الماسح كلوحة مفاتيح: يكتب الرمز بسرعة كبيرة ثم Enter. يتعرّف الجهاز على المسح من سرعة الأحرف (أقل من 35 ملّي ثانية بين حرف وآخر افتراضيًا، وثلاثة أحرف على الأقل). تُضبط المهلة وأقصر باركود في الإعدادات ثم الجهاز. ويقرأ الجهاز الأنواع حسب قواعد أودو الافتراضية للباركود:
| النوع | الصيغة | النتيجة |
|---|---|---|
| منتج | أي رمز مطابق لباركود المنتج أو للمرجع الداخلي | يُضاف المنتج. |
| وزن | EAN-13 يبدأ بـ 21 | يُضاف المنتج بالوزن المكتوب في الرمز (كيلوغرام بثلاث منازل عشرية). |
| سعر | EAN-13 يبدأ بـ 23 | يُضاف المنتج بالسعر المكتوب في الرمز. |
| خصم | يبدأ بـ 22 ثم رقمان | يُطبَّق الخصم بالنسبة المئوية على البند المحدد. |
| عميل | يبدأ بـ 042 | يُحدَّد العميل الذي له هذا الباركود. |
| بطاقة أمين صندوق | يبدأ بـ 041 | غير مستعملة: «بطاقات أمناء الصندوق غير مستخدمة على هذا الجهاز.» |
الرمز غير المعروف يعطي «باركود غير معروف» مع الرمز. أثناء الكتابة داخل حقل نص عادي (مثل حقل ملاحظة) لا يُعدّ ما تكتب مسحًا.
اختصارات لوحة المفاتيح
تعمل في شاشة البيع. زر اختصارات لوحة المفاتيح في الشريط العلوي، أو المفتاح ?، يعرض القائمة.
| المفتاح | الأثر |
|---|---|
F2 أو / | البحث عن المنتجات |
F4 | اختيار عميل |
F8 أو Ctrl+Enter | الانتقال إلى الدفع |
F9 | طلب جديد |
Q وD وP | لوحة الأرقام: الكمية، والخصم، والسعر |
↑ و↓ | تحديد البند السابق أو التالي |
Del | إزالة البند المحدد |
Enter | تصديق الدفع (في شاشة الدفع) |
Esc | إغلاق نافذة، أو العودة من شاشة الدفع إلى الطلب |
المتغيرات والكومبو
خيارات المنتج
تظهر لكل خاصية مجموعة أزرار. تأتي المجموعات من أودو بأحد أشكال العرض الثلاثة: شرائح للاختيار الواحد، وعيّنات ألوان للألوان، ومربعات متعددة الاختيار للإضافات. الزيادة في السعر تظهر بجانب كل خيار (مثل «+ 0.50»). الخيارات التي لا يسمح بها أودو معًا (الاستثناءات) تُعطَّل، والتركيبة غير المتاحة تعرض «هذه التركيبة غير متاحة.»
- أخرى (حدد) قيمة نصية حرة: يظهر حقل نص تكتب فيه ما تريد، ولا يُضاف المنتج قبل كتابته. حفظ هذه القيمة في أودو يحتاج صلاحية «المنتجات / الإنشاء» (الفصل 5)؛ بدونها يرفض أودو الطلب وتبقى المشكلة في شاشة المزامنة.
- ملاحظة: نص حر يبقى على البند، مثل «بدون بصل».
- العدّاد يحدد الكمية، والسعر الظاهر يتغير مع كل اختيار.
- الزر إضافة إلى الطلب يضيف البند. يظهر في الطلب اسم المنتج مع خياراته بين قوسين.
الكومبو
يعرض الكومبو بطاقة لكل مجموعة. عنوان المجموعة يبيّن ما اخترته وما هو مطلوب (مثل «1 من 1»)، والشارة «عنصر واحد مشمول» تعني أن عنصرًا واحدًا من المجموعة داخل سعر الكومبو. العناصر الإضافية لها سعر يظهر بجانبها، والعنصر المشمول يحمل الكلمة «مشمول». يكون الزر إضافة إلى الطلب معطّلًا إلى أن تكتمل كل المجموعات، ويعرض الإجمالي الجاري. إذا كان لعنصر خيارات (حجم مثلًا) فتُسأل عنها أيضًا.
في الطلب يظهر الكومبو كبند واحد تحته عناصره (كما في صورة الطلب في الفصل 8)، وعلى الإيصال تظهر العناصر تحت اسم الكومبو. حذف الكومبو أو تغيير كميته يشمل عناصره كلها، ويوزّع الجهاز سعر الكومبو على العناصر بالقاعدة التي تستعملها نقطة بيع أودو.
العملاء
اختيار عميل للطلب
اضغط العميل في لوحة الطلب أو المفتاح F4. تنزلق لوحة فيها حقل بحث عن العملاء بالاسم أو الهاتف أو البريد أو الباركود (يُقبل الهاتف بأي صيغة، مثل +1 313 555 0111 أو 3135550111)، وزر جديد. اضغط النتيجة لتختارها. بعد الاختيار تظهر بطاقة العميل مع قائمة أسعاره ووضعه المالي، وفيها الزر إزالة لفصل العميل عن الطلب.
عند اختيار العميل ينتقل إلى الطلب ما يلي: قائمة أسعاره، ووضعه المالي (الذي يحوّل الضرائب). يعيد الجهاز حساب الإجماليات فورًا.
شاشة العملاء
في أعلاها العملاء وعدد العملاء الموجودين على هذا الجهاز، وزر عميل جديد. القائمة مرتبة أبجديًا مع فهرس للحروف. اضغط عميلًا لترى بطاقته: الهاتف والبريد والعنوان والرقم الضريبي والباركود، وقائمة الأسعار والوضع المالي، والطلبات الأخيرة على هذا الجهاز.
| الزر | ما يفعله |
|---|---|
| استخدامه للطلب الحالي | يضع العميل على الطلب المفتوح وينقلك إلى شاشة البيع. |
| تعديل | تعديل بيانات العميل. يحتاج إلى اتصال بأودو وإلى صلاحية «جهات الاتصال / الإنشاء». لا يُعدَّل عميل ما زال بانتظار الإنشاء في أودو. |
| البحث في أودو | يظهر مع الرسالة «جزء فقط من العملاء موجود على هذا الجهاز.» ويبحث في أودو نفسه ويحفظ النتائج على الجهاز. للكتالوجات الكبيرة. |
عميل جديد
الحقول: الاسم (مطلوب) وهذه شركة والهاتف والبريد الإلكتروني والشارع والمدينة والرمز البريدي والدولة والولاية / المنطقة والرقم الضريبي والباركود. اضغط إنشاء العميل. يُحفظ العميل على الجهاز فورًا ويمكن استعماله في الطلبات، ويظهر بالشارة «ستتم مزامنته». يُرسل إلى أودو عند الاتصال (أو فورًا إن كان متصلًا)، ثم يأخذ رقمه في أودو، ويتبعه ما كان ينتظره من طلبات.
الدفع والإيصال والطباعة
- اضغط طريقة دفع: يُضاف سطر دفع بالمبلغ المتبقي كله.
- عدّل المبلغ بلوحة الأرقام، أو اضغط المبلغ المطلوب تمامًا ليأخذ السطر ما بقي، أو
+10و+20و+50لإضافة هذه المبالغ إلى السطر المحدد. - للدفع بأكثر من طريقة أضف سطرًا آخر بطريقة أخرى. اضغط أيقونة سلة المهملات على السطر لحذفه.
- راقب المربع الرمادي: المتبقي بالبرتقالي إلى أن يُدفع الطلب، ثم الباقي بالأخضر إن زاد المدفوع.
- اضغط تصديق (أو
Enter). للعودة إلى الطلب اضغط السهم أوEsc.
| القاعدة | التفاصيل |
|---|---|
| الباقي | لا يُعاد الباقي إلا نقدًا. إذا زاد المدفوع ولا توجد دفعة نقدية يقول الجهاز «لا يُعاد الباقي إلا نقدًا. خفّض المبلغ أو أضف دفعة نقدية.» |
| تقريب النقد | إذا كانت نقطة البيع تقرّب النقد (المتجر الرئيسي: 0.05 على النقد) يظهر سطر «تقريب النقد» في الملخص، ويجب أن يكون المبلغ النقدي مضاعفًا للتقريب. |
| حساب العميل | الدفع على حساب العميل (الآجل) يحتاج إلى عميل. وإلا يقول الجهاز «اختر عميلًا للدفع على حساب العميل.» ويفتح لوحة العملاء. |
| فاتورة | المفتاح يطلب فاتورة للعميل. يحتاج إلى عميل. ينشئ أودو الفاتورة عند وصول الطلب إليه، ودون اتصال تُنشأ بعد الإرسال. |
| الاسترداد | في طلب الاسترداد تكون المبالغ سالبة، ويظهر «المبلغ المسترد للعميل» بدل المتبقي. |
| الدفعات المحجوزة | الدفعة التي استلمها أودو (عربون) مقفلة بقفل صغير ولا تُعدَّل ولا تُحذف (الفصل 18). |
المنتجات المتتبَّعة بالدفعة أو الرقم التسلسلي
عند إضافة منتج متتبَّع يفتح الجهاز نافذة لإدخال الأرقام: الأرقام التسلسلية (رقم واحد لكل وحدة، تكتبه أو تمسحه ثم تضيفه، ولا يُباع الرقم نفسه مرتين) أو الدفعة (اسم الدفعة والكمية المأخوذة منها، ودفعة أخرى تصبح بندًا جديدًا). يقبل أودو هذه الأرقام فقط من مستخدم له صلاحية «المخزون / مستخدم». بدونها يبقى الطلب في شاشة المزامنة مع الرسالة «صلاحية ناقصة» واسم المجموعة حتى تُمنح الصلاحية وتعيد المحاولة.
الإيصال
بعد تصديق تظهر بطاقة تم استلام الدفع مع الباقي وحالة الإرسال: على هذا الجهاز ثم بانتظار المزامنة أو جارٍ الإرسال إلى أودو… ثم في أودو (أو خطأ في المزامنة). تحتها اختيار عرض الورق 80 مم أو 58 مم، وزر طباعة، وزر طلب جديد.
يتألف الإيصال من: كتلة الشركة (الاسم والعنوان والرقم الضريبي والهاتف والبريد)، ورقم الإيصال والتاريخ واسم من خدمك ورقم الطلب، والعميل، والبنود وعلى كل بند حرف ضريبته (A وC...) ومعها خياراته وعناصر الكومبو، والإجمالي الفرعي، والضرائب لكل مجموعة ضريبية مع أساسها، والإجمالي، وطرق الدفع والباقي، وملاحظة العميل، ونص التذييل. في آخره باركود Code-128 لرقم الإيصال، ورمز QR فيه رابط بوابة أودو مع رمز الطلب: يمسحه العميل ليحصل على فاتورته.
الطباعة
- طباعة تفتح نافذة طباعة المتصفح وتطبع الإيصال وحده.
- الإعدادات ثم الجهاز: عرض ورق الإيصال (58 أو 80 مم) وطباعة الإيصال تلقائيًا (تفتح النافذة فور التصديق).
- الطباعة عبر المتصفح فقط. يعرض Chrome نافذة الطباعة في كل مرة إلا إذا شُغِّل بالخيار
--kiosk-printing: عندها يطبع صامتًا على الطابعة الافتراضية للنظام. - لا يتحدث الجهاز مع الطابعات بأوامر ESC/POS مباشرة، ولا يقود صندوق IoT. طابعات الإيصالات والمطبخ يجب أن يستطيع نظام التشغيل الطباعة عليها (الفصلان 21 و27).
العمل دون اتصال
ما يحفظه الجهاز
في IndexedDB داخل المتصفح: المنتجات ومتغيراتها والكومبو والعملاء والضرائب والأوضاع المالية وقوائم الأسعار وبرامج الولاء وإعدادات نقطة البيع، والطلبات المفتوحة والمدفوعة التي لم تُرسل. يبدأ الجهاز دون شبكة منذ أول زيارة ناجحة لأن ملفات التطبيق نفسها محفوظة عند الجهاز بواسطة الـ service worker (الفصل 4).
الشريط العلوي يوضح الحالة: متصل، أو غير متصل، أو «غير متصل · طلبان بانتظار الإرسال» (يتغير الرقم). الضغط عليه يفتح شاشة المزامنة. عند التصديق دون اتصال يقول الإيصال: «حُفظ على هذا الجهاز. سيُرسل إلى أودو تلقائيًا.»
قائمة الانتظار
- تُرسل الطلبات واحدًا واحدًا، الأقدم أولًا. لا يُرسل طلب قبل أن يكتمل السابق.
- كل طلب يُرسل مرة واحدة: لكل طلب معرّف فريد، وإذا ضاع رد أودو ثم أعاد الجهاز الإرسال فإن أودو يتعرّف على الطلب بمعرّفه ولا ينشئ نسخة ثانية.
- العملاء الذين أُنشئوا دون اتصال يُرسلون قبل الطلبات التي تنتظرهم، وتأخذ الطلبات رقم العميل في أودو بعد إنشائه.
- متى يحاول الجهاز؟ عند عودة الاتصال، وعند العودة إلى نافذة التطبيق، ومرة كل 30 ثانية ما دام في الانتظار شيء، وعند الضغط على مزامنة الآن. وإذا بقي المتصفح «متصلًا» بينما أودو أو التطبيق متوقف، يفحص الجهاز أودو بطلب خفيف ويرسل حالما يجيب.
| نوع الخطأ | ماذا يفعل الجهاز |
|---|---|
| خطأ شبكة (لا اتصال، انتهاء المهلة، أودو مشغول أو غير متاح) | يعيد المحاولة تلقائيًا بمهل متزايدة: 5 ثوانٍ، ثم 15 ثانية، ثم 45 ثانية، ثم دقيقتين، ثم 5 دقائق، وبعدها كل 15 دقيقة. عودة الاتصال تُنهي الانتظار فورًا. |
| خطأ عمل (صلاحية ناقصة، رفض أودو للبيانات، جلسة غير موجودة...) | لا فائدة من التكرار. يبقى الطلب على الجهاز في تبويب الأخطاء مع السبب وطريقة الإصلاح. بعد الإصلاح اضغط إعادة المزامنة. |
التنزيل من أودو
بعد التنزيل الكامل الأول يطلب الجهاز التغييرات فقط (المنتجات والأسعار والعملاء...) كل 5 دقائق أثناء الاتصال (من الإعدادات ثم البيانات)، وعند الضغط على تنزيل البيانات الآن. إذا تغيّرت ضريبة بعد أن بِعتَ طلبًا فإن الجهاز يسجّل ذلك في سجل الأحداث ويرسل الطلب كما سُجّل وقت البيع، لأن العميل دفع هذا المبلغ. إذا فتحت التطبيق في تبويبين من المتصفح نفسه فإنهما يتشاركان البيانات، ويرسل واحد منهما فقط في كل مرة.
ما الذي قد يسوء
| الحالة | النتيجة والحل |
|---|---|
| مسح بيانات المتصفح أو الموقع | تضيع الطلبات التي لم تُرسل. لذلك تحذّر بطاقة التخزين في شاشة المزامنة عندما لا يضمن المتصفح الاحتفاظ بالبيانات، وفيها زر الاحتفاظ بالبيانات على هذا الجهاز. أرسل كل الطلبات قبل أن تمسح شيئًا. |
| أُغلقت الجلسة في أودو أثناء البيع دون اتصال | يضع أودو الطلبات في الجلسة المفتوحة لنقطة البيع نفسها. إن لم توجد جلسة مفتوحة تنتظر الطلبات حتى تفتح واحدة (يظهر شريط أحمر بالزر افتح جلسة جديدة). |
| مستخدم أودو ينقصه صلاحية | يبقى الطلب في الأخطاء مع «صلاحية ناقصة: ...». امنح الصلاحية ثم إعادة المحاولة. |
| مفتاح API أُلغي أو تغيّرت كلمة المرور | يظهر شريط أحمر بالزر أدخل بيانات دخول جديدة. الطلبات غير المرسلة تبقى على الجهاز. |
الطلبات
في الأعلى التبويبات: اليوم وهذه الجلسة وبانتظار الإرسال (طلبات حُفظت دون اتصال) والأخطاء (طلبات رفضها أودو أو نبّه عليها) والمسودات (الطلبات المعلّقة وطلبات الطاولات المفتوحة) والحجز بعربون. تحت التبويبات حقل بحث (الإيصال أو العميل أو المبلغ) وترتيب (الأحدث والأقدم والأكبر والأصغر).
في تفاصيل الطلب: حالته (مدفوع أو مُرحّل أو ملغى أو مسودة أو حجز بعربون أو استرداد) وحالة إرساله (تمت المزامنة أو بانتظار الإرسال أو إعادة المحاولة أو خطأ في المزامنة...)، والعميل، ورقم الإيصال ورقم التتبع والفاتورة، والبنود، والإجماليات، والمدفوعات، وسجل المزامنة (متى أُنشئ الطلب على الجهاز ومتى أكّده أودو وبأي اسم).
| الزر | متى وماذا |
|---|---|
| استئناف | للطلب المسودة الذي لم يُرسل (معلّق أو طاولة): يفتحه في شاشة البيع لتتابعه. |
| إعادة الطباعة | يعيد بناء إيصال سبق تسليمه ويفتح الطباعة. إذا نقصت بيانات منتج على الجهاز نزّل البيانات من شاشة المزامنة. |
| استرداد | للطلبات التي أكّدها أودو فقط. أما الطلب الذي لم يصل إلى أودو فتقول الشاشة «لم يصل هذا الطلب إلى أودو بعد» ويصبح الاسترداد متاحًا بعد مزامنته؛ والطلب الذي رفضه أودو لا يُسترد (لا شيء في أودو ليُسترد). |
| إعادة المزامنة | يعيد الطلب إلى قائمة الانتظار بعد أن تصلح سبب الرفض. |
| تصدير JSON | ينزّل الطلب كاملًا بصيغة JSON، لإرساله إلى الدعم أو لإدخاله في أودو يدويًا. |
| حذف | للطلبات التي رفضها أودو فقط. يُنزَّل ملف JSON الخاص بالطلب أولًا، ثم تكتب كلمة «حذف» وتذكر السبب. الحذف نهائي من هذا الجهاز، والطلب المحذوف لا يُحتسب في الجلسة: إن كان العميل قد دفع فسوِّ المبلغ خارج الجهاز. |
الاسترداد
اضغط استرداد على طلب أكّده أودو. تفتح نافذة فيها كل بند مع عدّاد، وتحت كل بند «المُباع» و«المُسترد». اضغط استرداد الكل أو اختر البنود والكميات، ويظهر «المبلغ المُعاد». يحسب الجهاز ما سُبق استرداده من هذا الجهاز فلا تتجاوز الكمية ما بقي. ثم متابعة الاسترداد: تفتح شاشة الدفع بمبالغ سالبة لتردّ المبلغ للعميل بطريقة الدفع المناسبة (الفصل 11). في الإعدادات يمكنك طلب رمز المدير قبل الاسترداد.
شاشة المزامنة
الأزرار في الأعلى: مزامنة الآن (إرسال ما ينتظر)، وتنزيل البيانات الآن (جلب تغييرات أودو)، وإغلاق الجلسة (الفصل 20)، وتصدير التشخيص (ملف للدعم، بلا كلمات مرور ولا مفاتيح: لا يحوي من الطلبات إلا هويتها وحالة مزامنتها، ولا بنودها ولا عملاءها). الزران الأولان يعملان أثناء الاتصال فقط.
قائمة الانتظار
تعرض الطلبات والتغييرات الأخرى في طريقها إلى أودو (عميل جديد وتعديل عميل ونقاط الولاء وإلغاء طلب الطاولة في أودو وإيداع / سحب نقدي وإغلاق الجلسة)، المشكلات أولًا ثم الأقدم. لكل عنصر حالته وعدد محاولاته وموعد المحاولة التالية («المحاولة التالية خلال ...») وآخر خطأ مع طريقة إصلاحه. إعادة المحاولة الآن أو إعادة محاولة الكل ترسل في الحال. إذا كانت الرسالة تقول «لن يُرسل مجددًا» فالطلب لن يُرسل ثانية فراجعه في أودو (مثل طلب حفظه أودو دون أن يتحقق من دفعه).
سجل الأحداث
آخر الأحداث بمرشحات الكل والتحذيرات والأخطاء. يحتفظ الجهاز بآخر 500 حدث. أسطر السجل تُحفظ بالإنجليزية.
الاتصال والبيانات والتخزين
| البطاقة | ما فيها |
|---|---|
| الاتصال | حالة متصل أو غير متصل، والخادم وطريقة الاتصال، وقاعدة البيانات والمستخدم وإصدار أودو وطريقة الاتصال (JSON-2 أو JSON-RPC)، وآخر طلب مُرسل وآخر تنزيل للبيانات، وزمن الاستجابة مع زر قياس يطلب من الخادم ويقيس المدة. |
| البيانات على هذا الجهاز | نسخة بيانات أودو التي يبيع بها الجهاز: آخر تنزيل كامل وآخر تحديث وجدول بعدد السجلات لكل نموذج أودو. إذا لم يكتمل تنزيل المنتجات تظهر عبارة تقول إنه يُستكمل مع التنزيل التالي. الزر إعادة تنزيل كل شيء ينزّل المنتجات والعملاء والضرائب والأسعار من جديد، ويبقى على الجهاز دون تغيير: الطلبات غير المرسلة، والتغييرات المنتظرة، والمسودات، والاتصال ورمز PIN، وإعدادات الجهاز. يستمر البيع أثناء التنزيل. |
| التخزين | المساحة المستعملة من حصة المتصفح، وهل يضمن المتصفح الاحتفاظ بالبيانات. إذا لم يضمن تظهر الجملة «قد يحذف المتصفح بيانات الجهاز (ومعها الطلبات غير المرسلة) عند امتلاء مساحة الجهاز.» وزر الاحتفاظ بالبيانات. وتنبّه البطاقة عندما تقترب المساحة من الامتلاء. |
المطعم: الطاولات والمطبخ والتقسيم والإكرامية
pos_restaurant) مثبتة في أودو ونقطة البيع المختارة نقطة بيع مطعم. «المتجر الرئيسي» في المتجر التجريبي نقطة تجزئة: لا طاولات فيه ولا ضيوف ولا مطبخ، ولا يُحمَّل شيء من شيفرة المطعم. الأمثلة في هذا الفصل من «مطعم هاربر».مخطط الصالة
افتح الطاولات من الشريط الجانبي. في الأعلى تبويب لكل طابق (الطابق الأرضي والتراس) وعليه عدد الطاولات المفتوحة، وشرائح بعدد الطاولات في كل حالة: شاغرة ومشغولة وبانتظار الدفع، وزر دمج. الطاولات تظهر في مواضعها وأشكالها وأحجامها من أودو (مربعة أو دائرية)، والمخطط يتكيّف مع الشاشة. في الواجهة العربية لا ينعكس المخطط: المواضع مواضع فعلية في القاعة، والباقي هو الذي ينعكس.
تعرض كل طاولة رقمها ونقطة بلون الطاولة في أودو، وإذا كانت مشغولة إجمالي طلبها وعدد الضيوف والدقائق منذ الفتح. الحالة بانتظار الدفع تعني أن الفاتورة طُبعت ولم يتغير الطلب بعدها: إذا أضفت صنفًا بعد الطباعة عادت الطاولة مشغولة. الشارة الحمراء (قبعة الطباخ) تعدّ البنود التي لم تُرسل بعد إلى المطبخ. العمود الجانبي الطاولات المفتوحة (على الشاشات العريضة) يسرد الطاولات المفتوحة مع الضيوف والمدة وعدد الأصناف التي لم تُرسل.
طلب الطاولة
اضغط طاولة: تفتح شاشة البيع وطلب هذه الطاولة (طلب جديد إن كانت شاغرة). تضاف إلى لوحة الطلب شريحة الطاولة بعدد الضيوف، وزر اطلب، وعلى كل بند علامة: في المطبخ (وصل إلى المطبخ) أو لم يُرسل (جديد) أو «+1 للإرسال» أو «1 للإلغاء» عند تغيير الكمية بعد الإرسال.
الضغط على شريحة الطاولة يفتح لوحة فيها:
- الضيوف: عدّاد عدد الضيوف.
- نوع الخدمة: أنواع الخدمة المعرّفة في أودو (مثل تناول الطعام في المطعم أو السفري أو التوصيل). تغييره يغيّر قائمة أسعار الطلب ووضعه المالي كما في أودو.
- تقسيم الفاتورة والفاتورة ونقل وفك الدمج ومخطط الصالة (للعودة إلى المخطط).
- المطبخ: ما سيُرسل الآن، وزر اطلب، ومعاينة التذكرة، وإعادة الطباعة، وسجل عدد التذاكر المطبوعة.
إرسال الطلب إلى المطبخ
الزر اطلب يرسل ما تغيّر فقط منذ آخر إرسال. الرقم على الزر هو عدد التغييرات (إرسال 3 تغييرات إلى المطبخ). يطبع الجهاز تذكرة لكل طابعة مطبخ، فيذهب كل صنف إلى الطابعة التي تحوي فئته في أودو. الأصناف التي لا تأخذها أي طابعة تُطبع على محطة افتراضية اسمها أصناف أخرى، وإذا لم تُضبط أي طابعة طلبات تُطبع كلها هناك. التذكرة مقسّمة إلى أقسام: جديد وتعديل (يُكتب +1 أو -1 مع «الكمية الآن») وملغى. وفي رأسها الطاولة والطابق ونوع الخدمة ومرجع الطلب وعدد الضيوف والنادل (النادل) والوقت، ومعها ملاحظات الأصناف والملاحظة الداخلية وملاحظة العميل وخيارات الصنف، وعناصر الكومبو تحت اسم الكومبو. لا تُرسل إلى المطبخ الإكراميات ولا الخصومات ولا المكافآت.
معاينة التذكرة تعرض التذاكر قبل الإرسال، وإعادة الطباعة تعيد طباعة آخر تذكرة وتحمل الشارة نسخة مكررة. كل تذكرة مهمة طباعة مستقلة من المتصفح (الفصل 11)؛ يعرض Chrome نافذة الطباعة لكل تذكرة إلا إذا شُغِّل بالخيار --kiosk-printing. لا يقود التطبيق صندوق IoT ولا طابعات Epson ePOS الشبكية المضبوطة في أودو: كل محطة مطبخ تحتاج إلى طابعة يستطيع نظام التشغيل الطباعة عليها، أو إلى متصفح ثانٍ عند المحطة (الفصل 27).
تقسيم الفاتورة
اضغط تقسيم الفاتورة (من لوحة الطاولة أو من المزيد). لكل بند عدّاد بالكمية التي ستنتقل إلى الفاتورة الجديدة، وزر الكل. الأداة حصة متساوية: اكتب عدد الضيوف ثم اضغط «تحديد حصة من 4 حصص» فيحدد الجهاز جزءًا من كل بند (وحدات كاملة)، وتعدّل بعده ما تشاء، ومسح يمسح الاختيار. تعرض النافذة الفاتورة الجديدة وما يبقى على الطاولة. ثم اختر إبقاؤها مفتوحة أو دفع هذه الفاتورة.
| نقطة | التفاصيل |
|---|---|
| الفاتورة الجديدة | طلب مستقل يسمّى «5B» ثم «5C»... يُرسل إلى أودو وحده ويُدفع وحده. لا يُربط في أودو بالطاولة (لأن أودو يدمج كل مسودة تحمل رقم طاولة مع مسودة الطاولة)؛ الربط بالطاولة محلي على الجهاز، وتظهر الفاتورة على طاولتها في المخطط. |
| عناصر الكومبو | تنتقل مع الكومبو الذي تتبعه. |
| ما لا يُقسَّم | طلب مدفوع، أو طلب عليه دفعات. |
| الكميات والمبالغ | مجموع الكميات لكل منتج قبل التقسيم وبعده واحد. إذا قُسِّم بند واحد بين فاتورتين فقد ينتقل سنت واحد بين الفاتورتين بسبب تقريب الضريبة لكل سطر، كما يفعل أودو. |
| سجل المطبخ | ما أُرسل إلى المطبخ ينتقل مع الكميات، فلا يُطبع صنف مرتين. |
الفاتورة والإكرامية
الفاتورة تفتح معاينة الفاتورة: فاتورة مبدئية عنوانها «فاتورة - ليست إيصال دفع». لإضافة الإكرامية اختر بلا إكرامية أو 5% أو 10% أو 15% أو 20% من قيمة الفاتورة، أو اكتب مبلغ آخر واضغط تطبيق. تصبح الإكرامية بندًا بمنتج الإكرامية المضبوط في أودو، وتُستبدل إذا غيّرتها وتُحذف إذا اخترت بلا إكرامية. طباعة الفاتورة تطبع الفاتورة المبدئية وتصبح الطاولة «بانتظار الدفع»، والدفع ينقلك إلى شاشة الدفع (الفصل 11).
النقل والدمج
نقل في لوحة الطاولة ينقلك إلى المخطط مع الرسالة «نقل {الطلب}: اضغط على الطاولة الجديدة». إذا كانت الطاولة الجديدة شاغرة تتغير الطاولة فقط. وإذا كانت مشغولة تنضم الأصناف إلى طلبها (الأصناف المتطابقة تجتمع) ثم يُلغى طلب الطاولة القديمة. وللدمج اضغط دمج على المخطط: اختر الطاولة التي تريد نقلها («دمج الطاولات: اضغط على الطاولة المراد نقلها») ثم الطاولة الهدف. وللتراجع اضغط فك الدمج داخل الطلب: تعود الأصناف القادمة من طاولة أخرى إلى طلب جديد على تلك الطاولة، بشرط أن تكون شاغرة. حفظ الوجهة يسبق إلغاء المصدر، فلو انقطع التطبيق في اللحظة بينهما بقيت الأصناف في الطلبين ولا تضيع.
| ما يختلف عن أودو عمدًا | التفاصيل |
|---|---|
| عناصر الكومبو | تذهب إلى طابعة منتجها هو. أودو يرسلها إلى كل الطابعات. |
| تتبع الأصناف | يتتبع الجهاز كل البنود، لأن الأصناف التي لا تأخذها طابعة تُطبع على المحطة الافتراضية. أودو يتتبع فئات الطابعات فقط. |
لوحة المؤشرات
| العنصر | ما يعرضه |
|---|---|
| الفترة | الجلسة واليوم و7 أيام و30 يومًا. زر تحديث يعيد الحساب. |
| البطاقات | المبيعات والطلبات ومتوسط الفاتورة والضريبة والخصومات (خصومات البنود فقط، لا يدخل فيها خصم الطلب كله). |
| المخطط | المبيعات بالساعة للجلسة أو اليوم، والمبيعات باليوم للفترات الأطول. |
| طرق الدفع | دائرة بنسبة كل طريقة ومبلغها. وإذا اختلف مجموع المدفوعات عن المبيعات بفعل تقريب النقد تظهر ملاحظة بالفرق (يُقرَّب النقد المستلم إلى أصغر عملة بينما تبقى المبيعات بإجمالي الطلبات الدقيق). |
| الأكثر مبيعًا | المنتجات مرتبة بالمبلغ مع الكمية والمبلغ. |
مصدر الأرقام: أرقام أودو للفترة المختارة، مضافًا إليها طلبات هذا الجهاز التي لم تُرسل بعد (فلا يضيع منها شيء ولا يُحسب شيء مرتين). تحت العنوان وقت الحساب «حتى 02:51 م» وعدد الطلبات المنتظرة المشمولة. دون اتصال تعرض اللوحة آخر إجابة محفوظة للفترة نفسها مع طلبات الجهاز، وتكتب «نتيجة محفوظة من ... (دون اتصال)» أو «هذا الجهاز فقط (دون اتصال)».
الاستعلام عن المخزون
اكتب في حقل ابحث عن منتج الاسم أو المرجع أو الباركود، واختر النتيجة. تظهر لكل مستودع الأعمدة: المتوفر والمحجوز والمتاح والوارد. مستودع نقطة البيع الحالية يأتي أولًا بالشارة هذا المتجر. الكمية المنخفضة (أقل من 5) تُظهر الشارة «مخزون منخفض»، والكمية 0 أو أقل «نفد من المخزون»، وكلاهما مظلل. حسب الموقع يفتح الكميات لكل موقع داخل المستودع. المنتج الذي له متغيرات يظهر بعدد متغيراته.
دون اتصال يعرض الجهاز آخر نتيجة سبق أن استعلمت عنها لهذا المنتج مع وقتها، ويقول «دون اتصال: هذه آخر نتيجة من أودو وليست المخزون الحالي.» ومن لم يُستعلم عنه من قبل يقول «دون اتصال ولم يُستعلم عنه على هذا الجهاز من قبل.» لا تظهر الكميات على بطاقات المنتجات في شاشة البيع.
الحجز بعربون
شروط الحجز، وإلا يرفضه الجهاز برسالة:
| الشرط | الرسالة عند عدم تحققه |
|---|---|
| للطلب عميل | «اختر عميلًا أولًا: الحجز يحتاج إلى من يدين بالباقي.» |
| أُدخل عربون كدفعة | «أدخل العربون كدفعة أولًا.» |
| المدفوع أقل من الإجمالي | «الطلب مدفوع بالكامل: صدّقه بدلًا من ذلك.» |
| لا باقٍ | «لا يمكن إعادة باقٍ من العربون.» |
| لا عربون على حساب العميل | «الدفع على حساب العميل ليس عربونًا.» |
| ليس طلب طاولة | «لا يمكن أن يكون طلب الطاولة حجزًا.» |
- حدّد العميل وأضف المنتجات، ثم اضغط الدفع.
- أضف دفعة العربون بطريقة الدفع (دون باقٍ).
- في لوحة الحجز بعربون ترى المدفوع والمبلغ المتبقي. اضغط إبقاء الطلب مفتوحًا بعربون.
- يظهر إيصال إيصال العربون (عنوانه «حجز - عربون»، وفي ذيله «احتفظ بهذا الإيصال لاستلام طلبك.») فسلّمه للعميل.
يُرسل الطلب إلى أودو مسودةً مع دفعات العربون. الدفعة التي أُخذت لا تُعدَّل ولا تُحذف من شاشة الدفع، ولا يمكن إلغاء الطلب من الجهاز («سبق استلام عربون على هذا الطلب: حصّل المبلغ المتبقي أو أعد العربون في أودو بدلًا من إلغائه.»).
تحصيل الباقي
افتح المزيد ثم الحجوزات (أو تبويب الحجز بعربون في الطلبات). تعرض القائمة لكل حجز العميل والرقم والتاريخ والإجمالي والمدفوع والمبلغ المتبقي، وفي رأسها إجمالي المستحق. اضغط تحصيل الدفعة: يعود الطلب إلى شاشة الدفع وتضيف الدفعة الأخيرة وتصدّق. الطلب نفسه يكتمل في أودو ويحتفظ بالدفعتين.
الولاء وأكواد الخصم
pos_loyalty).اختر عميلًا ثم افتح المزيد وبعدها المكافآت وكود الخصم. وتظهر شريحة النقاط في لوحة الطلب برصيد العميل بعد هذا الطلب. إذا لم يكن للعميل بطاقة تقول اللوحة إن بطاقة جديدة ستُنشأ مع الطلب. دون عميل تقول «اختر عميلًا لكسب النقاط واستخدامها.»
| العنصر | التفاصيل |
|---|---|
| بطاقة الولاء | الرصيد كما قرأه الجهاز من أودو ووقت قراءته، ثم هذا الطلب (النقاط التي سيكسبها) وبعده. دون اتصال يعرض آخر رصيد معروف. |
| المكافآت | المكافآت التي يكفيها رصيد العميل، لكل منها تطبيق وعدد النقاط. التي لا يكفيها الرصيد تقول «تحتاج إلى ... نقطة». |
| كود الخصم | اكتب الكود واضغط تطبيق. يعمل دون اتصال لأن الجهاز يعرف قواعد الأكواد. الرسائل: «قُبل كود الخصم» أو «هذا ليس كود خصم لنقطة البيع هذه.» أو «انتهت صلاحية كود الخصم هذا.» أو «كود الخصم هذا لم يبدأ بعد.» أو «كود الخصم هذا يحتاج إلى قائمة أسعار أخرى.» |
ما يدعمه الجهاز وما لا يدعمه
| مدعوم | غير مدعوم |
|---|---|
برامج من نوع بطاقة الولاء (loyalty) وكود الخصم (promo_code)؛ القواعد التلقائية والقواعد بكود؛ نقاط لكل طلب أو لكل مبلغ أو لكل وحدة؛ حد أدنى للمبلغ (بالضريبة أو دونها) أو للكمية؛ تصفية المنتجات؛ تواريخ البرنامج؛ قوائم الأسعار؛ حد الاستعمال؛ البرامج الاسمية.المكافآت: خصم (نسبة أو مبلغ للطلب أو مبلغ لكل نقطة) على الطلب أو على أرخص بند أو على منتجات محددة، مع حد أقصى للخصم وتصفير المحفظة؛ ومنتج مجاني من المنتجات الموجودة أصلًا في الطلب. | بطاقات الهدايا والمحفظة الإلكترونية، والقسائم، وقسائم الطلب التالي، وعروض اشترِ X واحصل على Y، والعروض التلقائية، وأكواد البطاقات، وتقسيم النقاط، والمكافآت متعددة المنتجات. لا يعرضها الجهاز ولا يتظاهر بتنفيذها. |
- المنتجان «Gift Card» و«Top-up eWallet» في أودو يختفيان من الكتالوج ومن البحث بالباركود إذا كانا مرتبطين ببرنامج بطاقة هدايا أو محفظة مفعّل، لأن الجهاز لا يستطيع إنشاء البطاقة أو شحنها. إن لم يكن المنتج مرتبطًا ببرنامج مفعّل فهو منتج عادي كما في أودو.
- استعمال نقاط البطاقة يحتاج إلى اتصال: يتحقق الجهاز من أودو أولًا. دون اتصال تظهر «استخدام النقاط يحتاج إلى اتصال». إذا رفض أودو تظهر «رفض أودو: النقاط غير كافية.»
- تُؤكَّد النقاط في أودو بعد إرسال الطلب (عنصر نقاط الولاء في قائمة انتظار المزامنة). والنقاط التي أنفقتها طلبات لم يؤكدها أودو بعد تُخصم من رصيد البطاقة قبل عرض أي مكافأة.
- المكافآت المطبَّقة تتبع الطلب: تُعاد حساباتها بعد كل تغيير، وما لم يعد صالحًا يُزال مع رسالة. إذا أوقفت الميزة والطلب مفتوح تُزال بيانات الولاء منه فورًا.
إغلاق الجلسة
افتح إغلاق الجلسة من قائمة الجلسة في الشريط العلوي، أو من زر إغلاق الجلسة في شاشة المزامنة، أو من الإعدادات ثم هوية الجهاز.
قبل الإغلاق
تعرض الشاشة قائمة فحوص. لا يتقدم الإغلاق إلا إذا تحققت:
| الفحص | ماذا تفعل إذا لم يتحقق |
|---|---|
| متصل بأودو | الإغلاق يتطلب اتصالًا. استمر في البيع وأغلق عند عودته؛ لا يضيع شيء في الأثناء. |
| أُرسل كل شيء إلى أودو | اضغط مزامنة الآن أو فتح شاشة المزامنة. يجب أن تصل كل الطلبات والتغييرات المنتظرة. |
| لا توجد طلبات مسودة مفتوحة | يرفض أودو إغلاق جلسة فيها مسودات. الطلبات المسودة على هذا الجهاز لكل منها استئناف أو إلغاء. والمسودات المفتوحة في أودو (من أجهزة أخرى أو طاولات) لكل منها خياران: إلغاؤها مع الإغلاق أو الإبقاء عليها. ما كان عليه عربون (حجز) لا يُلغى بهذه الطريقة لأن إلغاءه يحذف دفعاته: حصّل المتبقي أو أعد العربون في أودو أولًا. |
| مبيعات حساب العميل لها عميل | يرفض أودو الإغلاق إذا كان هناك طلب مدفوع على «حساب العميل» دون عميل. حدّد العميل في أودو (نقطة البيع ثم الطلبات)، ثم اضغط التحقق مجددًا. |
| عدّ النقد وأكّد | الخطوة التالية في هذه الشاشة. |
عدّ النقد
في النقد في الدرج اختر عدّ الأوراق والعملات أو إدخال الإجمالي. تظهر النقد المعدود والمتوقع والمعدود والفرق بحالته: «لا يوجد فرق» أو «أكثر من المتوقع» أو «أقل من المتوقع». في طرق الدفع الأخرى اكتب إجمالي جهاز البطاقات إذا اختلف عن أودو؛ يُرحَّل الفرق عند الإغلاق. وتحتها ملخص الجلسة: الطلبات والمبيعات والنقد والمدفوعات من أودو، والضرائب وأكثر المنتجات مبيعًا من طلبات هذا الجهاز. وملاحظة الإغلاق ملاحظة للمدير تُحفظ على الجلسة في أودو.
إذا كان الفرق أكبر من الحد المضبوط في الإعدادات ثم الأمان (فرق النقد الذي يتطلب تأكيدًا، والقيمة الافتراضية 5) فتظهر عبارة تنبّهك، وعند الإغلاق يُطلب منك كتابة اسم الجلسة للتأكيد.
الإغلاق
- اضغط إغلاق الجلسة (الزر الأحمر).
- اقرأ نافذة التأكيد «إغلاق ...؟»: يتوقف أودو عن قبول الطلبات ويرحّل القيود، ولا يمكن التراجع من الجهاز.
- إذا كان الفرق فوق الحد اكتب اسم الجلسة.
- تظهر نافذة أُغلقت الجلسة و«أغلق أودو الجلسة.» وفيها تقرير الإغلاق.
طباعة تقرير الإغلاق يطبع التقرير ليوقّعه المسؤول. فتح جلسة جديدة يعيدك إلى اختيار نقطة البيع، وتسجيل الخروج يخرج من هذا الجهاز.
تقرير Z الكامل في أودو («تفاصيل المبيعات»، من نقطة البيع ثم التقارير) يحتاج إلى صلاحيات محاسبية لا يملكها أمين الصندوق العادي: يطبعه المدير في أودو. أما ملخص الجلسة في هذه الشاشة فيعرض ما يستطيع الجهاز قراءته من أودو ومن طلباته.
الإعدادات
القائمة الجانبية فيها الأقسام: المظهر والجهاز والطباعة والبيانات والأمان والميزات وملف الإعدادات وهوية الجهاز وحول.
المظهر
| الإعداد | المعنى |
|---|---|
| المظهر | خمسة مظاهر جاهزة: فاتح وداكن ومحيط وغابة وغروب (الفصل 22). |
| لون العلامة التجارية | منتقي ألوان وحقل بصيغة #1a2b3c. يعرض الجهاز نسبة التباين لنص الأزرار ولون البطاقات بالمستوى (AAA أو AA أو «للنص الكبير فقط» أو «منخفض جدًا»). إذا كان اللون باهتًا أو داكنًا جدًا على المظهر المختار استعمل الجهاز لونًا قريبًا يبقي الأزرار واضحة وأخبرك. «استخدام لون السمة» يعيد لون المظهر. |
| الكثافة | مضغوط أو عادي أو مريح: تباعد العناصر وأحجامها. |
| حجم النص | 90% أو 100% أو 110% أو 125%. |
| اللغة | English أو العربية. الاتجاه (يمين لليسار) يتبع اللغة. |
| الأرقام | 123 (الأرقام الغربية، وهي الافتراضية) أو ١٢٣ (الأرقام العربية الهندية). |
الجهاز
| الإعداد | المعنى |
|---|---|
| عرض ورق الإيصال | 58 أو 80 مم. |
| لوحة الأرقام في لوحة الطلب | تلقائي ودائمًا ومخفية. |
| طباعة الإيصال تلقائيًا | يفتح نافذة الطباعة فور تصديق البيع. |
| عرض صور المنتجات | عند الإيقاف تُعرض الأسماء فقط على البطاقات، وهو أسرع على الأجهزة اللوحية القديمة. |
| الأصوات | تنبيه قصير عند المسح وعند الأخطاء. |
| ماسح الباركود | تشغيل قراءة الماسح، مع أقصى زمن بين الأحرف (20 إلى 120 ملّي ثانية) وأقصر باركود (من 3 إلى 12 حرفًا). الإدخال الأسرع يُعدّ مسحًا والأبطأ كتابة. |
الطباعة
تُطبع الإيصالات عبر المتصفح على الطابعة التي تختارها. يفتح الجهاز نافذة الطباعة في النظام: اختر طابعة الإيصالات مرة واحدة ويتذكرها المتصفح؛ واضبط الهوامش على «بلا» وحجم الورق على عرض اللفافة؛ والتطبيق المثبّت يطبع دون ترويسة شريط العنوان. الزر طباعة صفحة اختبار يطبع صفحة فيها عرض الورق ونصًا عربيًا للتجربة. طابعات المطبخ والبار قائمة للقراءة فقط تأتي من أودو، وإن لم تُضبط طابعة تقول «لا توجد طابعة طلبات مضبوطة لنقطة البيع هذه.» التطبيق يطبع تذاكره عبر المتصفح، وطباعة IoT Box وEpson ePOS لا يقودها هذا الجهاز (الفصل 27).
البيانات
| الإعداد | المعنى |
|---|---|
| التحقق من تغييرات أودو كل | كل كم دقيقة يطلب الجهاز تغييرات المنتجات والأسعار والعملاء أثناء الاتصال: 1 أو 2 أو 5 (الافتراضي) أو 10 أو 15 أو 30 أو 60 دقيقة. يعرض الإعداد وقت آخر تنزيل. |
| عدد المنتجات في كل صفحة تنزيل | 50 أو 100 أو 200 أو 500 أو 1000 منتج. الصفحات الأصغر تناسب الاتصال البطيء. |
| الاحتفاظ بالطلبات المرسلة لمدة | من 3 أيام إلى 365 يومًا (الافتراضي 14). بعدها تُحذف الطلبات التي أكّدها أودو من الجهاز. الطلبات التي لم يؤكدها أودو لا تُحذف أبدًا. |
| تنزيل صور المنتجات | ينزّل الصور للعمل دون اتصال، ويستهلك مساحة أكبر. |
قسم الأمان في الفصل 25.
الميزات
تشغّل المفاتيح الميزات الاختيارية لهذا الجهاز أو توقفها. الميزة التي تحتاج وحدة غير مثبتة في أودو تظهر بالعبارة «تتطلب ... في أودو» ولا يُحمَّل شيء منها. المطعم يظهر هنا لنقطة بيع المطعم. اللوحة والمخزون يعملان أثناء الاتصال وتبقى آخر نتيجة مقروءة دونه.
ملف الإعدادات
تصدير الإعدادات ينزّل ملف JSON بإعدادات هذا الجهاز. استيراد الإعدادات يقرأ ملفًا ويعرض جدولًا بما سيتغير (الإعداد والآن وبعد الاستيراد) قبل أن تضغط تطبيق. لا يحتوي الملف على اتصال أودو ولا المفاتيح ولا كلمات المرور ولا الرموز. الملف من إصدار أحدث من الجهاز يُرفض: حدّث الجهاز أولًا. إذا كان الاستيراد يوقف حماية برمز المدير فيُطلب رمز المدير.
هوية الجهاز
تعرض كيف يعرف أودو هذا الجهاز: معرّف الجهاز وخادم أودو وقاعدة البيانات واسم الدخول ومستخدم أودو والاتصال ونقطة البيع والجلسة، وزر إغلاق الجلسة.
حول
| العنصر | المعنى |
|---|---|
| الإصدار والبناء | رقم إصدار التطبيق ومعرّف البناء. أعطهما للدعم عند السؤال. |
| الوحدات المثبّتة | وحدات أودو المكتشفة، وعليها علامة عند وجودها. |
| تثبيت التطبيق | «مثبّت كتطبيق» أو «يعمل في المتصفح». |
| التحقق من وجود تحديث | «محدّث»، أو «إصدار جديد جاهز: اضغط تحديث في الشريط» (الفصل 29). |
| التراخيص | نص تراخيص الأجزاء المضمَّنة. يُحمَّل من التطبيق مرة واحدة. |
| مسح البيانات المحلية | للحالة التي يعرض فيها الجهاز بيانات خاطئة. مسح مع الاحتفاظ بالطلبات غير المرسلة يحذف المنتجات والعملاء والطلبات المرسلة والصور ثم ينزّلها من جديد، ويُبقي الطلبات والعمليات التي لم يؤكدها أودو والاتصال والإعدادات. مسح كل شيء يحذف أيضًا الطلبات غير المرسلة (لن تصل إلى أودو أبدًا: تضيع المبيعات والمدفوعات)، ويطلب منك أن تكتب عدد الطلبات التي ستضيع للتأكيد الأخير. |
المظاهر ولون العلامة واللغات (للمطورين)
كيف تعمل المظاهر
كل لون ونصف قطر وحجم في الواجهة متغير CSS اسمه يبدأ بـ --pos- على العنصر :root[data-theme=...] في الملف src/app/globals.css. أهمها: --pos-bg و--pos-surface و--pos-surface-2 و--pos-border و--pos-fg و--pos-muted و--pos-primary و--pos-primary-fg و--pos-accent و--pos-success و--pos-warning و--pos-danger. تربط الكتلة @theme inline فئات Tailwind بهذه المتغيرات (مثل bg-surface وtext-fg وbg-primary)، فتغيير المظهر يغيّر المتغيرات فقط. الألوان التي لا يحددها مظهر تأتي من :root (المظهر الفاتح).
إضافة مظهر
هذه خمسة مواضع، والمثال هو المظهر «محيط» الحقيقي:
/* 1. src/app/globals.css: one block of variables per theme (the tokens a theme does not set come from :root) */
:root[data-theme="ocean"] {
--pos-bg: #eaf3f9;
--pos-surface: #ffffff;
--pos-surface-2: #dcebf4;
--pos-border: #c4dbe9;
--pos-fg: #0e2433;
--pos-muted: #516c7e;
--pos-primary: #0a6595;
--pos-primary-fg: #ffffff;
--pos-accent: #06687f;
}
/* 2. src/lib/theme/prefs.ts: the list of names */
export const THEMES = ['light', 'dark', 'ocean', 'forest', 'sunset'] as const
/* 3. src/lib/theme/themes.ts: the colours of the small theme chips (a test keeps them equal to the stylesheet) */
ocean: { bg: '#eaf3f9', surface: '#ffffff', primary: '#0a6595', accent: '#06687f' },
/* 4. src/app/layout.tsx: the boot script, so there is no flash of the wrong theme */
var T=['light','dark','ocean','forest','sunset'];
/* 5. src/lib/i18n/en/core.ts and ar/core.ts: the name shown on the chip */
'theme.ocean': 'Ocean',الاختبار src/lib/theme/contrast-themes.test.ts يقيس تباين كل زوج ألوان يستعمله النص في كل مظهر ويفشل إن نزل عن 4.5:1، ويتأكد من أن ألوان الشرائح الصغيرة تطابق الملف globals.css. شغّله بعد إضافة المظهر: npx vitest run src/lib/theme.
لون العلامة التجارية (الإعدادات ثم المظهر) يغيّر --pos-primary وحده، ويختار الجهاز لون النص فوقه تلقائيًا بالتباين الأفضل. لا يحتاج إلى مظهر جديد.
اتجاه الصفحة (RTL)
الاتجاه يتبع اللغة: يكتب التطبيق dir على العنصر html (rtl للعربية). الأنماط تستعمل خصائص منطقية (مثل ms-* وps-* وtext-start) بدل اليمين واليسار، فتنقلب الواجهة وحدها. المبالغ تُعزل لتبقى بالاتجاه من اليسار إلى اليمين. مخطط صالة المطعم لا ينقلب لأن مواضع الطاولات مواضع فعلية.
إضافة لغة
لكل لغة مجلد src/lib/i18n/<lang>/ فيه الملفات نفسها التي في src/lib/i18n/en/ (close وcore وcustomers وlock وorders وpayment وpro وrestaurant وscreens وsell وsettings وsetup وsync)، وبالمفاتيح نفسها. الاختبار في src/lib/i18n/ يفشل إن نقص مفتاح أو متغير نصي في الترجمة. الرسائل التي فيها عدد تحتاج أشكال الجمع التي تتطلبها اللغة: في الإنجليزية شكلان، وفي العربية ستة (zero وone وtwo وfew وmany وother). المصطلحات المعتمدة في src/lib/i18n/GLOSSARY.md.
اللغتان الحاليتان مكتوبتان صراحة في الشيفرة، فلإضافة لغة ثالثة عدّل أيضًا:
src/lib/theme/prefs.ts: النوعLangوالقائمةLANGSوالتحقق من القيمة المحفوظة.src/lib/i18n/index.ts(دالةdirOfللاتجاه) وformat.ts(رمز اللغة للأرقام والتواريخ) وplural.ts(قواعد الجمع).src/app/layout.tsx: سكربت الإقلاع الذي يضبط اللغة والاتجاه قبل الرسم.src/components/setup/prefs-chips.tsx: شرائح اختيار اللغة.- تسجيل الرسائل بـ
registerMessagesفيsrc/lib/i18n/messages.tsوsrc/lib/screens/messages.tsوملف تسجيل الميزات فيsrc/components/extensions/.
كيف تُحسب الإجماليات
المحرك مكتوب بـ TypeScript ومنقول من شيفرة أودو 19: ملف الضرائب account_tax.js وقواعد نقطة البيع (قوائم الأسعار والأوضاع المالية والكومبو والمتغيرات وتقريب النقد والخصم العام). يدعم تقريب الضريبة لكل بند ولكل الطلب (round_per_line وround_globally). ملفات المحرك في src/lib/engine/ ومذكورة في الملف NOTICE وتبقى تحت رخصة LGPL-3.0 (نصها في LICENSE-LGPL-3.0.txt)، والمسموح لك تعديلها وإعادة توزيعها بتلك الرخصة.
كيف فُحص
| الفحص | النتيجة |
|---|---|
| 667 سيناريو أُنشئت في أودو 19 بأدوات بايثون الخاصة به: 399 طلبًا و216 سعر وحدة و36 كومبو و16 خصمًا عامًا، على ضرائب (نسبة ومبلغ ثابت وقسمة ومجموعة، مشمولة وغير مشمولة، وسالبة...) وأوضاع مالية وتقريبات نقد وقوائم أسعار وعملات بخانات عشرية مختلفة. | الجهاز = بايثون في 667 من 667 سيناريو. و447 من الطلبات أُرسلت إلى أودو بـ sync_from_ui وقُرئت ثانيةً. |
| الجافاسكربت الخاص بنقطة بيع أودو نفسه، مشغَّلًا على السيناريوهات نفسها. | الجهاز = جافاسكربت أودو في 664 من 667 (ثلاثة استثناءات موثّقة). |
إعادة إنتاج مستقلة: 1,149 طلبًا بُنيت بمسار البيع الحقيقي في الجهاز (بيع واسترداد، تقريب نقد، خصم عام، قوائم أسعار، كومبو، متغيرات) وأُرسلت إلى أودو 19 بـ sync_from_ui بصفة أمين صندوق. | حُفظ منها 1,085 ورفض أودو 64 بخطأ صلاحيات على منتجات الدفعة / الرقم التسلسلي لمستخدم نقطة بيع فقط. كل طلب أُعيد حسابه ببايثون وجافاسكربت أودو: الجهاز = بايثون على كل الطلبات. |
| اختبارات خصائص (property tests): مجموع إجماليات البنود = إجمالي الطلب، والإجمالي = قبل الضريبة + الضريبة، والاسترداد = سالب الأصل، وترتيب البنود لا يغيّر إجماليات التقريب الشامل. | ناجحة (ضمن 3,336 اختبارًا، الفصل 26). |
أين يختلف أودو عن نفسه
في الحالات التالية يختلف عميل أودو (جافاسكربت نقطة البيع) عن خادمه (بايثون). الجهاز يحسب كما تحسب نقطة بيع أودو، لأن هذا ما يُرسَل ويُحفظ:
| الحالة | ماذا يحدث |
|---|---|
| تقريب النقد على الطلب كله | تُرسل نقطة البيع الإجمالي قبل التقريب وتدفع المبلغ المقرّب، والخادم يحسب إجماليًا مقرّبًا. المحفوظ هو ما أرسله العميل، إلا إذا أُعطي باقٍ: فيضيف الخادم دفعة سالبة ويعيد الحساب فيصير الإجمالي المحفوظ مقرّبًا والمدفوع صافيًا بعد الباقي. |
| حساب الخادم لبنود الطلب في الواجهة الخلفية | يقرّب إجمالي البند مرة واحدة ويتجاهل بيانات الضريبة الإضافية، بينما تقرّب نقطة البيع لكل ضريبة. الفرق 0.01 في بعض البنود، وإجماليات الطلب تتفق. |
| وضع مالي بلا أي ربط ضريبي | نقطة بيع أودو (والجهاز) تُبقي الضرائب، والخادم يحذفها كلها. مع الباقي يعيد الخادم الحساب دون ضريبة ويحتفظ بالطلب باسم «/» (غير مُصدَّق)، وعند الإغلاق يُرحَّل الفرق إلى حساب فروق تقريب النقد إن كانت نقطة البيع تقرّب النقد، وإلا يمنع الإغلاق. الحل: اربط كل ضريبة صراحة بضريبة أخرى، ولو كانت 0 % (الفصل 5). الجهاز لا يستطيع التمييز بين هذا الوضع ووضع لا يربط شيئًا. |
| التسعير | الخادم لا يعيد تسعير بنود نقطة البيع. الكمية السالبة لا تطابق أي قاعدة في قائمة الأسعار داخل نقطة البيع بينما تطبّق الواجهة الخلفية قواعد الحد الأدنى صفر. وقاعدة مبنية على قائمة أسعار أخرى تُسقط السعر الإضافي للقيم التي لا تنشئ متغيرًا. والبنود خارج نافذة التواريخ وقت التحميل لا تصل إلى نقطة البيع. |
| تقريب كامل للطلب مع دفعة غير نقدية وباقٍ نقدي | حالة نادرة: تقرّب نقطة البيع المتبقي النقدي، وعند وجود باقٍ يعيد الخادم الإجمالي مقرّبًا ويرفض الدفع (الاسم «/»). |
round_globally مع بند سعره سالب يشارك بنودًا موجبة في الضريبة نفسها | تقرّب نقطة البيع البند السالب في مجموعته والفاتورة تقرّبه مع الباقي: فرق 0.01 في ضريبة الفاتورة. والبيع الذي إجماليه سالب يعيد الخادم حسابه بكميات معكوسة (0.01). |
وللجهاز اختلافان مقصودان عن عميل أودو: يصفّي عناصر قائمة الأسعار بتواريخها وقت البيع أيضًا (نقطة البيع تصفّيها عند التحميل فقط، فجهاز يعمل أيامًا يُبقي عروضًا منتهية)، ويقرّب إجماليات البنود إلى العملة.
ما لا يدعمه المحرك
- الضرائب المحسوبة بشيفرة بايثون (النوع
code): يقول الجهاز «لا يمكن حساب إحدى ضرائب هذا المنتج دون اتصال. اطلب من المدير مراجعة إعداد الضرائب.» - قوائم الأسعار بعملة غير عملة نقطة البيع، وتحويل وحدات القياس في قوائم الأسعار: تُتجاهل، كما تفعل نقطة بيع أودو.
- الخصم العام في نقطة بيع عملتها غير عملة الشركة: تُترك مبالغ عملة الشركة في بيانات الضريبة الإضافية ويحسبها الخادم.
- الدولة المالية البرتغالية (
PT) فُحصت بأدوات بايثون فقط. - الضريبة المجهولة على بند (من شركة أخرى أو محذوفة) تُسقط ويرفض الخادم مزامنة هذا البند.
- نقاط الولاء لا يحسبها المحرك: تعاملها طبقة الولاء (الفصل 19).
البنية البرمجية (للمطورين)
الأجزاء
| الجزء | الدور |
|---|---|
صفحة واحدة / | الشاشات تُبدَّل بقيمة في حالة الواجهة (Zustand) لا بمسارات Next.js. هكذا تعمل إعادة تحميل كاملة من ملف HTML واحد محفوظ دون اتصال. |
/api/odoo | الوسيط: يمرّر طلبات المتصفح إلى أودو بعد فحصها (الفصل 25). |
/manifest.webmanifest و/sw.js | بيان التثبيت (PWA) وملف service worker الذي يولّده scripts/make-sw.mjs بعد البناء. |
المجلد في src/ | ما فيه |
|---|---|
lib/odoo | الاتصال بأودو: عميل واحد بطريقتين (/json/2/<model>/<method> بمفتاح API في ترويسة Authorization: bearer مع X-Odoo-Database، و/jsonrpc)، وفحص الاتصال، والأخطاء، والوسيط. |
lib/db | قاعدة Dexie (IndexedDB)، والاستعلامات، وتشفير المفتاح برمز PIN. |
lib/sync | التنزيل (كامل وتراكمي)، والإرسال، والمجدول، وتحويل الطلب إلى ما يفهمه أودو، والعمليات (عملاء، نقد، إغلاق). |
lib/engine | محرك الأسعار والضرائب (TypeScript صرف: لا DOM ولا شبكة). |
lib/pos | مخزن الطلب الحالي ودورة حياته، والإيصال، والباركود، والماسح. |
lib/restaurant وlib/pro | منطق المطعم، والميزات الاحترافية (لوحة المؤشرات والمخزون والحجز والولاء). |
lib/i18n وlib/theme | الترجمة والمظاهر. |
lib/terminal | الواجهة الوحيدة من الشاشات إلى البيانات: useTerminal والدوال التي تفتح الجلسة وتحفظ الطلبات وتغلق الجلسة. |
lib/features | سجل الميزات. |
components/... | الشاشات والمكوّنات: shell وsell وpayment وreceipt وsetup وsettings وorders وcustomers وsync وclose وlock وrestaurant وpro وui. |
خارج src/: المجلد deploy/ (أمثلة nginx، وdeploy/webapp/ وفيه ملف التشغيل وREADME للتطبيق الجاهز للتشغيل) والمجلد scripts/ (مولّدا service worker وملف التراخيص، وscripts/pack-webapp.mjs الذي يجمّع المجلد الجاهز للتشغيل من نسخة البناء المستقلة بالأمر npm run pack:webapp).
البيانات المحلية
في IndexedDB جدول لكل نموذج أودو، باسم النموذج مع استبدال النقطة بـ «_» (مثل product_product وres_partner وaccount_tax وloyalty_program وrestaurant_table)، ومفتاحه id. وجداول الجهاز: orders (مفتاحها uuid)، وops (قائمة العمليات غير الطلبات: عميل جديد، حركة نقد، إغلاق جلسة، نقاط ولاء، إلغاء طلب طاولة)، وimages (صور المنتجات)، وlog (سجل الأحداث، 500 حدث)، وmeta (الاتصال والهوية والجلسة والوحدات المثبتة وعلامة آخر تنزيل...).
من أودو وإليه
- التنزيل بمحمّل أودو نفسه
pos.session.load_dataلكل شيء عدا المنتجات، وهي تُنزَّل صفحات بـproduct.template.load_product_from_posبحقول أودو وقواعده. التنزيل التراكمي يعتمد علامة وقت الخادم، ويراجع الحذف بـpos.session.filter_local_data. - الطلبات:
pos.order.sync_from_uiطلبًا واحدًا في كل استدعاء، وفريد بمعرّف الطلب. المسودات (الطاولات والحجز) تُرسل بحالةdraft. - الخطأ يُصنَّف: خطأ شبكة (يُعاد) أو خطأ عمل (يتوقف ويبقى للمراجعة).
سجل الميزات وإضافة ميزة احترافية
كل شاشة اختيارية ميزة تسجّل نفسها بالدالة registerFeature: معرّف، وفئة، وما تحتاجه من وحدات أودو أو اتصال، وموضعها في الشريط الجانبي، ودالة تحمّل شاشتها. الميزة التي تنقصها وحدة لا تُحمَّل شيفرتها ولا تظهر. خطوات إضافة ميزة اسمها «giftcards» مثلًا:
- المنطق في
src/lib/pro/giftcards/: دوال صرفة مع اختباراتها. الشبكة عبرgetOdooCaller()فقط (تعيد null دون اتصال) والتحقق من كل جواب بـ Zod. - ما يجب أن يبقى مقروءًا دون اتصال يُخزَّن بـ
readCacheوwriteCache(مفتاحpro.giftcards.*فيmeta). - الواجهة في
src/components/pro/giftcards/: شاشة بتصدير افتراضي و/أو شريحة داخل شاشة أخرى (تُحمَّل بـlazy()). - الرسائل: مفاتيح
pro.giftcards.*فيsrc/lib/i18n/en/pro.tsوفيar/pro.ts(الاختبار يفشل إن نقص مفتاح عربي). - التسجيل في ملف الميزات الاحترافية في
src/components/extensions/(المثال أدناه). - أضف المعرّف إلى
PRO_FEATURE_IDSفيsrc/lib/pro/features.tsونصّيpro.feature.giftcardsوpro.feature.giftcards_desc: فيكون له مفتاح في الإعدادات ثم الميزات (مفعّل افتراضيًا). - لا تستورد شيفرة الميزة استيرادًا مباشرًا من ملف التسجيل: الميزة المعطّلة أو الوحدة الناقصة يجب ألا تحمّل شيئًا.
// the registration file of the Pro features (src/components/extensions/): one call per feature
registerFeature({
id: 'giftcards',
title: 'Gift cards',
tier: 'pro',
requires: { modules: ['pos_loyalty'] },
nav: { icon: 'gift', labelKey: 'pro.giftcards.title', order: 65 }, // place in the left rail (stock is 60, sync is 70)
screen: () => import('@/components/pro/giftcards/giftcards-screen'), // loaded only when the feature is on
// optional: cartSlot, paymentSlot, orderActions, settingsPanel
})الاختبارات
npm test # Vitest: unit and integration tests (a fake Odoo inside the test process), engine tests npm run typecheck # TypeScript npm run lint # ESLint
الاختبارات الحيّة (أمام أودو 19 حقيقي) تُتخطّى ما لم تضبط هذه المتغيرات:
POS_TEST_URL=http://localhost:8069 POS_TEST_DB=mydb POS_TEST_LOGIN=cashier POS_TEST_SECRET=<api key> \ POS_TEST_ADMIN_SECRET=<admin api key> npx vitest run tests/live
| المجال | الاختبارات الناجحة |
|---|---|
| المحرك: سيناريوهات مقابل أودو (1,783) واختبارات وحدات وخصائص (55) وانحدارات مالية (28) | 1,866 |
| الاتصال والوسيط وقاعدة الجهاز والمزامنة (أودو مزيف داخل العملية) | 393 |
| المظاهر وتباين الألوان | 357 |
| منطق الشاشات (الطلبات والعملاء والمزامنة والإعدادات والإغلاق والقفل والتشخيص) | 257 |
| مسار الطلب والإيصال والباركود والماسح | 158 |
| مكوّنات الواجهة | 89 |
| المطعم (المخطط والمطبخ والتقسيم والدمج والإكرامية) | 85 |
| الميزات الاحترافية (لوحة المؤشرات والمخزون والحجز والولاء) | 66 |
| اللغات (مفاتيح الإنجليزية والعربية والجمع والتنسيق) | 54 |
| سجل الميزات وPWA وأخرى | 11 |
| المجموع | 3,336 |
إضافة إلى ذلك 66 اختبارًا حيًا تحتاج إلى أودو يعمل وتُتخطّى افتراضيًا.
الأمان
مفتاح أودو على الجهاز
يحفظ المتصفح مفتاح API (أو كلمة المرور) في IndexedDB. مع رمز PIN للقفل يُشفَّر المفتاح بـ PBKDF2-SHA-256 (310,000 تكرار) وAES-GCM ويُطلب الرمز عند تشغيل الجهاز وبعد القفل التلقائي. الرمز من 6 إلى 12 رقمًا. من يملك نسخة من ملفات المتصفح يستطيع تجربة الرموز القصيرة دون اتصال، وعدّاد المحاولات في الملفات نفسها. لذلك:
- الرمز يحمي من الوصول العابر، لا من فحص القرص جنائيًا.
- استعمل مفتاح API واحدًا لكل جهاز، لمستخدم من مجموعة نقطة البيع فقط (الفصل 5).
- إذا ضاع الجهاز فألغِ مفتاحه في أودو (التفضيلات ثم أمان الحساب).
| الإعداد | ماذا يفعل |
|---|---|
| رمز PIN للقفل | تعيين رمز ثم تغيير أو إزالة (يُطلب الرمز الحالي). الأخطاء المتكررة تُبطئ المحاولات التالية. |
| القفل التلقائي بعد | أبدًا أو 1 أو 2 أو 5 أو 10 أو 15 أو 30 دقيقة دون لمس. لا يُتاح إلا بعد تعيين رمز القفل. وزر القفل في الشريط العلوي (قفل الجهاز) يظهر عندما يكون الجهاز محميًا برمز. |
| رمز المدير | من 4 إلى 12 رقمًا، يُحفظ على الجهاز مجزّأً ومملّحًا فقط. تتصاعد مهلة الانتظار بعد الرموز الخاطئة. |
| طلب رمز المدير قبل | مفاتيح: الخصومات وتغيير الأسعار والاستردادات وحذف بند وإلغاء طلب. لا تعمل حتى يُعيَّن رمز المدير. تبقى موافقة المدير صالحة نحو 20 ثانية لنفس الإجراء على نفس البند أو الطلب، كي لا يُسأل عند كل ضغطة. وإيقاف أي حماية (من المفتاح أو باستيراد ملف إعدادات) يطلب رمز المدير أيضًا. |
| فرق النقد الذي يتطلب تأكيدًا | حد الفرق الذي يطلب كتابة اسم الجلسة عند الإغلاق (الفصل 20). |
عندما يكون الجهاز مقفلًا تظهر الشاشة الجهاز مقفل. يمكنك فتح القفل بالرمز، أو تسجيل الخروج من هذا الجهاز دون رمز: يحذف الجهاز عندها بيانات الدخول إلى أودو والبيانات المنزّلة، وتبقى الطلبات التي لم تُرسل بعد على الجهاز وتُرسل بعد تسجيل الدخول التالي.
الوسيط /api/odoo
- يمرّر إلى أودو مسارات مسموحة فقط (
/jsonrpcو/json/2/...وإصدار الخادم وصور المنتجات وقائمة القواعد)، ولا يتبع التحويلات، ولا يمرّر ملفات تعريف الارتباط من المتصفح ولا يعيدSet-Cookie. - يفحص كل عنوان يُحَلّ إليه اسم خادم أودو. عناوين link-local وبيانات السحابة الوصفية مرفوضة دائمًا. والشبكات الخاصة مرفوضة إلا بـ
POS_ALLOW_PRIVATEأو إذا ذُكر العنوان فيPOS_ALLOWED_ORIGINS. - محاولات الدخول الفاشلة: 10 في 10 دقائق ثم الرد
429مدة 10 دقائق. دونPOS_TRUST_PROXY=1يتشارك كل العملاء هذه الحصة لكل خادم أودو، فعشر محاولات فاشلة من أي جهة توقف الدخول والمزامنة لكل الأجهزة عشر دقائق. - فحص المصدر نفسه (أن الطلب من الصفحة نفسها)، وحد 25 ميغابايت و60 ثانية، والسجلات بلا محتوى ولا مفاتيح.
- ترويسات سياسة الأمان (Content-Security-Policy وغيرها) في
next.config.ts، ولا تسمح الصفحة بالاتصال إلا بنفسها (والعناوين المذكورة فيPOS_CONNECT_SRC).
/api/odoo بلا تسجيل دخول خاص به: من يصل إليه يستطيع تجربة بيانات دخول على أودو الخاص بك. إذا كان الخادم مفتوحًا للإنترنت فضعه خلف TLS وخلف VPN أو SSO / وسيط يعرف هوية المستخدم أو قائمة عناوين مسموحة.| قائمة فحص قبل التشغيل | ما يلزم |
|---|---|
| HTTPS | شهادة TLS صالحة للعنوان (الفصل 4). |
| الوجهات | POS_ALLOWED_ORIGINS بعنوان أودو فقط. لا POS_ALLOW_ANY_ORIGIN على خادم مفتوح للإنترنت. |
| الوسيط العكسي | POS_TRUST_PROXY=1 مع nginx الذي يكتب ترويسات X-Forwarded-*. |
| كلمات المرور | POS_DISABLE_JSONRPC=1: مفاتيح API فقط. |
| الوصول | VPN أو SSO أو قائمة عناوين مسموحة أمام /api/odoo. |
| المفاتيح | مفتاح لكل جهاز، بمستخدم نقطة بيع فقط، يُلغى عند الضياع. |
| الأجهزة | رمز PIN للقفل وقفل تلقائي ورمز مدير على الأجهزة المشتركة. |
/sw.js | لا يُخزَّن مؤقتًا في nginx ولا في CDN. |
ما مدى الدقة
الإجماليات
يحسب الجهاز الأسعار والضرائب والتقريب بمحرك منقول من شيفرة نقطة بيع أودو 19 (الفصل 23). فُحص مقابل أدوات بايثون في أودو نفسه على 667 سيناريو (يطابقها الجهاز كلها)، وأُرسل 447 منها إلى أودو بـ sync_from_ui وقُرئت ثانيةً. ومقابل جافاسكربت نقطة بيع أودو يطابق الجهاز 664 سيناريو من 667، والثلاثة الباقية استثناءات موثّقة. وأُعيد إنتاج 1,149 طلبًا بمسار البيع الحقيقي وأُرسلت إلى أودو بصفة أمين صندوق: يطابق الجهاز بايثون في كل طلب (حُفظ 1,085 ورفض أودو 64 بخطأ صلاحيات على منتجات الدفعة / الرقم التسلسلي).
في بضع حالات يختلف عميل أودو عن خادمه (وضع مالي بلا ربط ضريبي، وتقريب النقد على الطلب كله مع باقٍ، وسعر سالب مع التقريب الشامل). الجهاز يتبع عميل أودو. الجدول في الفصل 23، وأهمها: لا تترك وضعًا ماليًا بلا ربط ضريبي صريح.
ضمانات العمل دون اتصال
| الضمان | كيف |
|---|---|
| لا يضيع طلب مصدَّق | يُكتب الطلب في IndexedDB قبل أن يُعرض الإيصال، ثم يدخل قائمة الانتظار. |
| يُرسل مرة واحدة | لكل طلب معرّف فريد يتعرّف عليه أودو، فإعادة الإرسال بعد ضياع الرد آمنة. الطلبات تُرسل بالترتيب واحدًا واحدًا. |
| لا يُحذف قبل أن يؤكده أودو | الطلبات المؤكدة تُحذف من الجهاز بعد مدة الاحتفاظ (14 يومًا افتراضيًا)، وغير المؤكدة لا تُحذف أبدًا. الحذف اليدوي لا يتم إلا لطلب رفضه أودو وبعد تنزيل ملف JSON وكتابة سبب. |
| إجمالي البيع كما دفعه العميل | لو تغيّرت ضريبة بعد البيع أُرسل الطلب بما سُجّل وقت البيع. |
ما قيس وأين
| القياس | النتيجة |
|---|---|
| أول تنزيل كامل لـ 20,000 منتج و20,000 عميل | 24.5 ثانية، وحجم IndexedDB نحو 21 ميغابايت |
| إعادة التحميل الدافئة حتى شبكة منتجات قابلة للاستعمال | من 0.78 إلى 0.87 ثانية |
| البحث عن منتج | نحو 80 ملّي ثانية، منها 60 ملّي ثانية مهلة توقف الكتابة |
| التمرير | 60 إطارًا في الثانية |
| إضافة منتج إلى الطلب | الوسيط 1.7 ملّي ثانية |
| 1,000 طلب حُفظت دون اتصال ثم أُرسلت | 169 ثانية، بالترتيب ودون تكرار |
| حجم جافاسكربت التطبيق | 1.75 ميغابايت خام و511 كيلوبايت بعد الضغط (gzip) في المجموع |
| البدء دون اتصال من أول زيارة | جرى التأكد منه مع إيقاف الخادم |
الاختبارات
الأمر npm test ينجح بـ 3,336 اختبارًا (Vitest)، ويتخطى 66 اختبارًا حيًا تحتاج إلى أودو 19 يعمل. تفصيلها في الفصل 24.
ما لم يُفحص
- الطابعات (الإيصالات والمطبخ) والماسحات وأدراج النقد وأجهزة الدفع على أجهزة حقيقية.
- Safari وFirefox. الفحص على Chrome وEdge.
- أودو Enterprise، وإصدارات أودو غير 19.
- صورة Docker: الملفات مرفقة والصورة لم تُبنَ ولم تُختبر هنا.
- أداء الأجهزة اللوحية.
الحدود
| الحد | التفاصيل | ماذا تفعل |
|---|---|---|
| الطباعة عبر المتصفح فقط | لا أوامر ESC/POS مباشرة، ولا صندوق IoT، ولا طباعة Epson ePOS الشبكية يقودها الجهاز. تذاكر المطبخ تطبع كلها عبر المتصفح. يعرض Chrome نافذة الطباعة إلا إذا شُغِّل بالخيار --kiosk-printing. | اجعل لكل محطة مطبخ طابعة يطبع عليها نظام التشغيل، أو متصفحًا ثانيًا عندها. شغّل Chrome بخيار الطباعة الصامتة. |
| الأجهزة غير مجرَّبة | الطابعات والماسحات وأدراج النقد وأجهزة الدفع لم تُجرَّب على أجهزة حقيقية. | جرّب أجهزتك قبل الافتتاح. |
| المتصفحات | الفحص على Chrome وEdge. Safari وFirefox لم يُفحصا. المزامنة في الخلفية (Background Sync) ميزة في Chromium، والطلبات تُرسل ما دامت صفحة الجهاز مفتوحة. | استعمل Chrome أو Edge، وأبقِ التطبيق مفتوحًا. |
| صلاحيات أمين الصندوق | المستخدم العادي لنقطة البيع لا يستطيع إنشاء عملاء، ولا حفظ قيم نصية حرة لخصائص المنتج، ولا تسجيل إيداع النقد وسحبه، ولا طباعة تقرير Z الكامل من أودو. والمنتجات المتتبَّعة بالدفعة أو الرقم التسلسلي تحتاج «المخزون / مستخدم». | امنح الصلاحيات المناسبة (الفصل 5) أو نفّذ الإجراء في أودو. |
| لا زر لإيداع النقد وسحبه | لا يوجد زر لذلك في التطبيق. | سجّل الحركات النقدية في أودو. |
| إغلاق الجلسة | يحتاج إلى اتصال بأودو ويُرفض ما دامت هناك طلبات غير مرسلة أو مسودات. | أرسل كل شيء ثم أغلق (الفصل 20). |
| لغة سجل الأحداث | أسطر سجل الأحداث في شاشة المزامنة مكتوبة بالإنجليزية، حتى حين يكون الجهاز بالعربية. | اقرأ حالات الطلبات ورسائلها في شاشة الطلبات، وأرسل الأسطر الإنجليزية إلى الدعم عند طلب المساعدة. |
| المطعم: الدورات | لا يوجد «إطلاق دورة» (دورات الطعام). البنود تحتفظ برقم الدورة من أودو فقط. | أرسل الأصناف للمطبخ حين تريدها. |
| المطعم: تعديل المخطط | تعديل الطوابق والطاولات ومواضعها يتم في أودو. | عدّل في أودو ثم تنزيل البيانات الآن. |
| المطعم: الإكرامية بعد الدفع | الإكرامية بعد دفع البطاقة (capture) غير مدعومة. | أضف الإكرامية قبل الدفع من معاينة الفاتورة. |
| الحجز بعربون | إلغاء حجز مع رد العربون لا يتم من الجهاز. ولا يغلق أودو جلسة فيها حجوزات مفتوحة. | حصّل الباقي، أو الغِ وأعد العربون في أودو. |
| الولاء | مدعوم: برامج بطاقة الولاء وكود الخصم (الفصل 19). غير مدعوم: بطاقات الهدايا والمحفظة الإلكترونية والقسائم وقسائم الطلب التالي واشترِ X واحصل على Y والعروض التلقائية وأكواد البطاقات. منتجا «Gift Card» و«Top-up eWallet» المرتبطان ببرنامج مفعّل يختفيان من الكتالوج ومن البحث بالباركود. | استعمل هذه البرامج من نقطة بيع أودو، أو عطّلها. |
| الأوضاع المالية | يجب ربط الضرائب صراحة، ولو بضريبة 0 %. الوضع بلا أسطر ضرائب غير متسق في أودو 19 نفسه. | عدّل الوضع المالي في أودو (الفصلان 5 و23). |
| ما لا يدعمه الجهاز | تعدد الشركات، وقوائم الأسعار بعملات مختلفة (تُتجاهل كما في نقطة بيع أودو)، وتسجيل دخول الموظفين برمز في وحدة pos_hr (أمناء الصندوق هم مستخدمو أودو)، وربط أجهزة الدفع، وطلب الزبون الذاتي (الكشك)، والدفع عبر الإنترنت. | استعمل نقطة بيع أودو الأصلية لهذه الحالات. |
| JSON-RPC | مسار كلمات المرور /jsonrpc تعدّه أودو 19 متقادمًا وسيزيله في الإصدار 20. | استعمل مفتاح API (JSON-2)، وفعّل POS_DISABLE_JSONRPC=1. |
| قفل PIN | قفل راحة: يحمي من الوصول العابر لا من فحص القرص (الفصل 25). | مفتاح لكل جهاز بأقل الصلاحيات وإلغاؤه عند الضياع. |
| Docker | الملفان مرفقان والصورة لم تُبنَ ولم تُختبر هنا. | جرّبها على خادم تجريبي. |
| التطبيق الجاهز للتشغيل | شُغّل على ماك مع Node.js 24. وفي Chrome ثُبّتت هذه النسخة وخزّنت كل ملفاتها وبدأت دون اتصال والخادم متوقف واتصلت بأودو؛ أما اختبارات البيع والمزامنة فجرت على النسخة المبنية من الشيفرة المصدرية (الشيفرة نفسها). لم يُجرَّب start.bat على ويندوز ولا لينكس ولا Node.js 20 و22. | جرّبه على حاسوبك أولًا؛ وإن لم يبدأ start.bat فشغّل node run.cjs في موجّه الأوامر. |
| إصدارات أودو | أودو Enterprise لم يُختبر. يحذّر الإعداد (ولا يرفض) إذا كان الخادم أقدم من 19، والإصدارات الأخرى لم تُختبر. | استعمل أودو 19 Community. |
| الأداء | قيس على جهاز Mac لا على جهاز لوحي (الفصل 26). | قِس على أجهزتك. |
حل المشكلات
أثناء الاتصال والإعداد
الرسائل الست الأولى في الفصل 6. هذه بقيتها:
| الرسالة | السبب | الحل |
|---|---|---|
| «هذا الخادم ليس أودو 19.» | إصدار الخادم أقدم من 19 (تحذير لا يمنع الحفظ). | حدّث أودو إلى 19.0. |
| «أجاب أودو بالرمز 404 على /json/2: سيُستخدم JSON-RPC بدلًا منه.» | الخادم لا يقدّم JSON-2. | حدّث أودو إلى 19.0. |
| «يحتاج JSON-2 إلى مفتاح API؛ مع كلمة المرور يستخدم الجهاز JSON-RPC.» | كُتبت كلمة مرور بدل مفتاح. | أنشئ مفتاح API للمستخدم واستعمله. |
| «يعمل JSON-RPC لكن أودو سيزيله في الإصدار 20.» | المسار القديم يعمل. | انتقل إلى مفتاح API وفعّل POS_DISABLE_JSONRPC=1. |
| «مفتاح API هذا يخص مستخدمًا غير اسم الدخول المكتوب.» | المفتاح لمستخدم آخر. | اكتب اسم دخول صاحب المفتاح. |
| «محاولات دخول فاشلة كثيرة من هذه الشبكة...» أو «محاولات دخول فاشلة كثيرة. انتظر دقيقة ثم حاول مرة أخرى.» | أودو يحدّ المحاولات الفاشلة، والوسيط يحدّها أيضًا: 10 محاولات في 10 دقائق ثم رد 429 عشر دقائق. دون POS_TRUST_PROXY=1 تتشارك كل الأجهزة هذه الحصة. | انتظر، وصحّح بيانات الدخول، وفعّل POS_TRUST_PROXY=1 خلف الوسيط العكسي. |
| «لا توجد نقطة بيع يستطيع هذا المستخدم فتحها.» | لا نقطة بيع مرتبطة بالمستخدم. | أنشئ نقطة بيع في أودو (نقطة البيع ثم الإعدادات) أو امنحه الوصول. |
| «هذا المستخدم ليس مستخدمًا داخليًا. قد ترفضه بعض ميزات أودو.» | حساب بوابة أو مشاركة. | اجعله مستخدمًا داخليًا. |
| «تعذّرت قراءة الوحدات المثبتة: تبقى ميزات المطعم والولاء مخفية.» | لم يستطع الجهاز قراءة قائمة الوحدات. | أعد الاختبار؛ تحقّق من صلاحيات المستخدم. |
| «هذه المحطة تقبل مفاتيح API فقط: تسجيل الدخول بكلمة المرور معطل على هذا الخادم.» | فُعّل POS_DISABLE_JSONRPC=1. | استعمل مفتاح API. |
| «تعذّر الاتصال بـ {الخادم}.» | الاسم أو المنفذ خطأ أو أودو متوقف. | تحقّق من اسم المضيف والمنفذ ومن أن أودو يعمل. |
| «لا يستطيع هذا الجهاز الوصول إلى خادمه الخاص (التطبيق الذي يمرّر الطلبات إلى أودو). قد يكون أودو نفسه سليمًا.» | التطبيق (Node.js) متوقف أو لا يُوصل إليه، وليست المشكلة في أودو. | تحقّق من أن تطبيق الجهاز يعمل ويمكن الوصول إليه، ثم أعد الاختبار. |
| «أجاب الخادم على {العنوان} (HTTP عادي). استخدم HTTPS في بيئة التشغيل.» | كتبت العنوان دون بروتوكول وردّ الخادم على HTTP. | اكتب عنوان HTTPS في الإنتاج. |
أثناء البيع
| ما تراه | السبب | الحل |
|---|---|---|
| شريط أحمر: «أُغلقت هذه الجلسة على جهاز آخر. افتح جلسة جديدة.» | أُغلقت الجلسة من أودو أو من جهاز آخر. | اضغط افتح جلسة جديدة. الطلبات المنتظرة تذهب إلى الجلسة الجديدة. |
| شريط أحمر: «هذه الجلسة قيد الإغلاق: يجب أن يُكمل المدير إغلاقها في أودو.» | بدأ الإغلاق وتعثّر في أودو. | يُنهيه المدير في أودو (الفصل 20). |
| شريط أحمر: «رفض أودو تسجيل الدخول...» | أُلغي مفتاح API أو تغيّرت كلمة المرور أو أُرشف المستخدم. | اضغط أدخل بيانات دخول جديدة. الطلبات غير المرسلة تبقى. |
| الجهاز مقفل: «الجهاز مقفل. افتحه برمز PIN أولًا.» | القفل اليدوي أو التلقائي. | اكتب رمز PIN. إن نسيته فسجّل الخروج وأعد الإعداد؛ الطلبات غير المرسلة تبقى. |
| «الكتالوج غير جاهز» أو «منتجات نقطة البيع هذه وأسعارها غير موجودة على الجهاز بعد.» | لم يكتمل التنزيل الأول. | اتصل ثم اضغط تنزيل البيانات الآن (أو إعادة تنزيل البيانات). |
| «يتطلب هذا اتصالًا بأودو.» | ميزة تحتاج إلى اتصال (إغلاق الجلسة، المخزون، استعمال نقاط الولاء). | انتظر عودة الاتصال. |
| «تعذّر الوصول إلى أودو. يواصل الجهاز العمل دون اتصال.» | أودو لا يستجيب. | تحقّق من الشبكة ومن خادم أودو. الطلبات محفوظة. |
| «Node.js 20.9 or newer is required …» عند تشغيل التطبيق الجاهز | إصدار Node.js أقدم من 20.9 أو غير مثبّت. | ثبّت أحدث إصدار LTS من nodejs.org وافتح نافذة أوامر جديدة وتحقق بالأمر node -v. |
| «Port 3000 is already in use …» | التطبيق يعمل أصلًا أو برنامج آخر يستخدم هذا المنفذ. | أوقفه أو شغّل بمنفذ آخر: sh start.sh --port 3100. |
| جهاز آخر لا يستطيع فتح عنوان التطبيق الجاهز للتشغيل | التطبيق يستمع على هذا الحاسوب فقط (127.0.0.1) ما لم تطلب غير ذلك. | شغّله بالخيار --host 0.0.0.0 خلف HTTPS (الفصل 4) واسمح بالمنفذ في جدار الحماية للحاسوب. |
| «لا يستجيب الخادم الخاص بهذا الجهاز. تبقى الطلبات على الجهاز وتُرسل لاحقًا.» | تطبيق Node.js الذي يمرّر الطلبات متوقف أو لا يصله الجهاز. | تحقّق من تشغيل التطبيق (الفصل 4). أودو قد يكون سليمًا. |
| «قد يحذف المتصفح بيانات الجهاز (ومعها الطلبات غير المرسلة)...» | المتصفح لا يضمن الاحتفاظ بالبيانات. | اضغط الاحتفاظ بالبيانات على هذا الجهاز في بطاقة التخزين، وثبّت التطبيق. |
| «المساحة شبه ممتلئة...» | قرب امتلاء مساحة الجهاز. | زامن الطلبات المنتظرة ووفّر مساحة على الجهاز. |
| نافذة الطباعة تظهر في كل مرة | هكذا يعمل Chrome. | شغّله بالخيار --kiosk-printing ليطبع صامتًا على الطابعة الافتراضية. |
| لا يظهر زر تثبيت التطبيق | الصفحة ليست على HTTPS (ولا على localhost)، أو المتصفح لا يدعم. | افتح عنوان HTTPS في Chrome أو Edge (الفصل 4). |
طلبات لم تصل إلى أودو
تجدها في الطلبات ثم الأخطاء، وفي شاشة المزامنة. الرسالة تحت الطلب تقول السبب:
| الرسالة | السبب | الحل |
|---|---|---|
| «ينقص مستخدم أودو على هذا الجهاز صلاحية (صلاحية ناقصة: ...)» | مثل «المخزون / مستخدم» لمنتج متتبَّع بالدفعة أو الرقم التسلسلي، أو «المنتجات / الإنشاء» لقيمة نصية حرة. | اطلب من مسؤول أودو منح الصلاحية ثم إعادة المحاولة. |
| «رفض أودو إنشاء العميل أو تعديله: ... جهات الاتصال / الإنشاء» | المستخدم لا يملك صلاحية إنشاء العملاء. | امنحه الصلاحية ثم إعادة المحاولة. الطلبات التي تنتظر هذا العميل تبقى على الجهاز. |
| «ينتظر هذا الطلب حتى يُنشأ العميل الجديد في أودو...» | الطلب مرتبط بعميل لم يُنشأ في أودو بعد. | لا شيء: يُرسل تلقائيًا بعد إنشائه. |
| «لا توجد جلسة مفتوحة في أودو لنقطة البيع هذه...» | أُغلقت الجلسة أو تعثّر إغلاقها. | افتح جلسة جديدة أو اطلب من المدير إكمال الإغلاق؛ يُرسل الطلب فور فتح جلسة. |
| «كانت هذه الطاولة مفتوحة على جهاز آخر: دمج أودو الطلبين في طلب الطاولة المفتوح...» (تعارض الدمج) | جهازان فتحا الطاولة نفسها، فدمج أودو الطلبين. | الطلبان محفوظان هنا ولم يُرسل شيء مرتين. افتح طلب الطاولة في أودو وقارنه بهذا الطلب المدفوع ثم احذف الطلب غير الصحيح. |
| «حفظ أودو الطلب كمدفوع لكنه لم يتمكن من التحقق من دفعه (اسمه '/')...» | الإجماليات أو المدفوعات لا تتفق عند أودو (مثل وضع مالي بلا ربط ضريبي). | لن يُرسل مجددًا: راجع مدفوعات هذا الطلب في أودو. |
| «رفض أودو هذا السجل. لن تفيد إعادة المحاولة قبل إصلاح السبب...» | رفض بسبب بيانات. | صدّر JSON للدعم، وأصلح السبب في أودو، ثم أعد المحاولة. |
| «لم يجتز الطلب فحص الأمان قبل الإرسال (الإجماليات أو المدفوعات غير متطابقة)...» | فحص الجهاز الداخلي رفض الطلب قبل إرساله. | يبقى الطلب على الجهاز: صدّر JSON للدعم. |
| «تعذّر الوصول إلى أودو حاليًا. يحتفظ الجهاز بالطلب ويعيد المحاولة تلقائيًا...» | خطأ شبكة. | لا شيء: يعيد الجهاز المحاولة بمهل متزايدة (الفصل 12). |
التحديث والنسخ الاحتياطي
تحديث الخادم
- احتفظ بنسخة من الملف
.envومن أي ملفات عدّلتها. - التطبيق الجاهز للتشغيل: فُكّ ضغط الملف
taqnix-pos-terminal-webapp.zipالجديد في مجلد جديد وانسخ ملف.envإليه، ثم أوقف الجهاز القديم وشغّل الجديد. - من الشيفرة المصدرية: استبدل ملفات التطبيق بملفات الإصدار الجديد، ونفّذ الأمرين أدناه ثم أعد تشغيل التطبيق (أو أعد بناء صورة Docker).
npm ci && npm run build
تحديثات الإصدار 1.x مشمولة بالشراء.
على جهاز البيع
عند فتح التطبيق ينزّل الـ service worker الإصدار الجديد في الخلفية. عندما يكتمل تظهر رسالة «إصدار جديد من الجهاز جاهز.» وزرّان: تحديث ولاحقًا. اضغط تحديث في وقت هادئ: يحفظ الجهاز الطلب المفتوح ثم يعيد التحميل. ما دمت لم تضغط فالجهاز يستمر على الإصدار القديم ولا يعيد التحميل وحده. وللسؤال بنفسك: الإعدادات ثم حول ثم التحقق من وجود تحديث.
- الطلبات التي لم تُرسل بعد تبقى في المتصفح عبر التحديثات.
- قبل أن تمسح بيانات المتصفح أو تغيّر خادم أودو أرسل كل الطلبات: يرفض الجهاز الانتقال إلى خادم آخر ما دامت عليه طلبات غير مرسلة.
- ملف الإعدادات (الإعدادات ثم ملف الإعدادات) ينقل إعدادات الجهاز إلى جهاز آخر أو يحفظها قبل مسح البيانات. لا يحوي اتصالًا ولا مفاتيح.
النسخ الاحتياطي
بيانات البيع في أودو: خذ نسخها الاحتياطية كما تفعل مع أودو. ما على الجهاز نسخة من بيانات أودو يمكن تنزيلها من جديد (إعادة تنزيل كل شيء)، فلا يحتاج إلى نسخة احتياطية. الشيء الوحيد الذي لا يوجد إلا على الجهاز هو الطلبات التي لم تصل إلى أودو بعد: شاشة المزامنة تقول لك عددها. أرسلها قبل أي عملية مسح.
الدعم
support@taqnix.com. تحديثات الإصدار 1.x مشمولة بالشراء.اكتب في رسالتك: إصدار أودو، والمتصفح ونظام التشغيل، ولقطة للشاشة، وملف تصدير التشخيص من شاشة المزامنة. ملف التشخيص لا يحتوي مفاتيح ولا كلمات مرور، ولا بنود الطلبات ولا العملاء.
الترخيص باختصار
النص الكامل في الملف licensing/license.txt.
| البند | ما يعنيه |
|---|---|
| الاستعمال | شراء واحد لشركة واحدة (الكيان القانوني الذي اشترى، بفروعه وعدد غير محدود من أجهزته). لك أن تثبّت الشيفرة المصدرية وتشغّلها وتعدّلها لعملك، على خادمك أو خادم مزوّد استضافة. المُركِّب ينشر للعميل فقط إن كان لكل شركة عميلة شراؤها. |
| التحديثات | الإصدار الذي اشتريته وكل تحديثات 1.x. |
| غير مسموح | إعادة البيع، والترخيص من الباطن، ونشر الشيفرة المصدرية، وتقديم التطبيق (معدّلًا أو لا) خدمة مستضافة متعددة المستأجرين أو منتجًا منافسًا أو قالبًا. |
| أجزاء بتراخيص أخرى | ملفات محرك الضرائب والأسعار (src/lib/engine/) منقولة من أودو 19 وتبقى تحت LGPL-3.0؛ الخطان Inter وIBM Plex Sans Arabic برخصة SIL OFL 1.1؛ وحزم npm بتراخيصها (MIT وApache-2.0). |
| بلا ضمان | يُقدَّم البرنامج كما هو. أنت مسؤول عن التأكد من أن الإيصالات والضرائب والتقارير توافق القوانين المطبّقة، وعن اختبار الجهاز على أودو الخاص بك قبل استعماله في المتجر. |
أودو علامة تجارية لشركة Odoo S.A. وهذا المنتج لم تصنعه Odoo S.A. ولم تعتمده.