✳️ أولًا: توضيح شامل حول التعامل بين العملات والتقارير
🧾 1. الشراء بأي عملة؟
- كل عملية شراء تسجّل بالعملة التي تمت بها فعليًا (عملة المورد أو الدفع).
- ممكن تاجر في الأردن يشتري من تركيا بالليرة التركية.
📌 إذن:
فاتورة الشراء = تُخزن بعملة “الليرة” في هذه الحالة.
💰 2. البيع بأي عملة؟
- يتم البيع حسب عملة الفرع الذي ينفذ العملية.
- كل فرع مرتبط بعملة تشغيلية (functional currency)، مثلاً:
- فرع الأردن → JOD
- فرع تركيا → TRY
- فرع دبي → AED
📌 إذن:
فواتير البيع = تُخزن بعملة الفرع مباشرة.
📊 3. التقارير بأي عملة؟
- كل العمليات (شراء/بيع/مصاريف…) تُسجّل بعملتها الخاصة.
- ثم عند استخراج التقرير، يتم تحويل جميع القيم إلى عملة رئيسية موحدة (مثلاً USD أو JOD).
⬅️ يتم ذلك باستخدام جدول أسعار صرف محفوظ فيه التاريخ والسعر.
🔁 4. فرق سعر الصرف بين وقت العملية ووقت التقرير؟
مثال:
- قبضت 1000 ليرة تركية بتاريخ 1 يناير، وكان سعر الصرف = 30 → تساوي 33.33 USD
- في التقرير السنوي بتاريخ 30 يونيو، سعر الصرف صار = 40 → نفس 1000 ليرة = 25 USD
🎯 النظام يقوم بـ تحويل حسب السعر في وقت العملية الفعلية، مش السعر الحالي.
📌 إذن:
الأرباح والخسائر تُحسب بدقة حسب سعر الصرف المسجّل وقت العملية (وليس حسب تقرير اليوم).
🔒 هذا يمنع التضليل المالي.
✅ الآن: خطة العمل الكاملة خطوة بخطوة
🔹 المرحلة 1: البنية الأساسية – العملات
- أضف عمود
currency_code
في جدولbranches
- كل فرع يعمل بعملة تشغيله الخاصة.
- أنشئ جدول
currencies
يحتوي على كل العملات الأساسية:currency_code
مثل USD, JOD, TRYname_ar
,symbol
,decimal_places
, …
- أنشئ جدول
exchange_rates
لتسجيل أسعار الصرف اليومية:currency_code
,base_currency
,rate
,date
🔹 المرحلة 2: أسعار البيع حسب الفرع
- أنشئ جدول
branch_product_prices
:branch_id
,product_id
,sale_price
,min_sale_price
- عند عرض المنتج داخل الفاتورة:
- يتم جلب السعر من
branch_product_prices
حسب الفرع المختار.
- يتم جلب السعر من
- لو ما في سعر خاص للفرع؟
- يرجع النظام للسعر العام من
warehouses_products
.
- يرجع النظام للسعر العام من
🔹 المرحلة 3: تسجيل العمليات
- تعديل فواتير البيع والشراء لتحتوي:
currency_code
exchange_rate_at_time
- عند إنشاء أي عملية مالية:
- يتم أخذ العملة من الفرع (أو المورد).
- يتم جلب سعر الصرف الحالي وحفظه مع العملية.
🔹 المرحلة 4: حركة النقد والخزائن
- الخزائن المرتبطة بكل فرع تعمل بنفس عملة الفرع.
cash_boxes
يجب أن تحتوي علىcurrency_code
.
- عند التحويل بين خزنتين بعملتين مختلفتين:
- يتم تسجيل العملية بسعر صرف لحظي محفوظ.
cash_transactions
يسجل دائمًا العملة وقيمتها المحولة (إن وجدت).
🔹 المرحلة 5: التقارير المالية الموحدة
- التقرير الشهري/السنوي يكون على مستوى
vendor
. - عند جمع البيانات من عدة فروع أو بعملات مختلفة:
- يتم تحويل القيم إلى
base_currency
حسبexchange_rate_at_time
المسجل في كل عملية.
- تُعرض تفاصيل التحويل داخل التقرير (لتوضيح الفروقات في الصرف إن وُجدت).
🔹 المرحلة 6: الإعدادات والمرونة
- يُسمح لكل تاجر بتحديد:
base_currency
(عملة التقارير).- إمكانية السماح بعملات متعددة أو لا.
- واجهة تغيير أسعار البيع لكل فرع يجب أن تكون بسيطة وسريعة.
✅ مثال واقعي داخل النظام:
- فرع اسطنبول (TRY) اشترى منتجات بـ 1000 ليرة (TRY)
- سجلنا سعر الصرف: 1 USD = 30 TRY
→ النظام يحفظ الفاتورة بالليرة، ويحسب تكلفتها بـ 33.33 USD - بعد شهرين، سعر الصرف صار 40
→ عند مراجعة التقارير، ما نعيد الحساب، نعرض الفاتورة بقيمتها الأصلية حسب وقتها (33.33 USD)
✅ خطة تنفيذ نظام العملات المتعددة وأسعار البيع حسب الفروع
🟢 المرحلة 1: التحضير البنيوي
1. ربط كل فرع بعملة
- تعديل جدول
branches
: إضافة عمودcurrency_code
(مثلJOD
,USD
,TRY
). - في حال لم يتم تحديد عملة للفرع، يعتمد على
vendors.currency_code
مؤقتًا كخيار fallback.
2. جدول العملات
- إنشاء جدول
currencies
:currency_code
,name_ar
,symbol
,decimal_places
,status
3. جدول أسعار الصرف
- إنشاء جدول
exchange_rates
:currency_code
,base_currency
,exchange_rate
,rate_date
4. ربط الخزينة بالعملة
- تعديل جدول
cash_boxes
: إضافةcurrency_code
لتحديد عملة الخزنة.
🟡 المرحلة 2: إدارة الأسعار حسب الفروع
5. إنشاء جدول branch_product_prices
- الأعمدة:
branch_id
,product_id
,sale_price
,min_sale_price
- هذا هو الجدول المركزي الذي يُخزن سعر البيع لكل منتج في كل فرع.
6. تعديل شاشة تعديل المنتج
- إضافة تبويب لعرض/تعديل الأسعار حسب الفروع مباشرة.
🟠 المرحلة 3: المعالجة أثناء العمليات
7. تعديل فواتير البيع
- إضافة الأعمدة:
currency_code
(عملة الفاتورة)exchange_rate_at_time
(لحفظ سعر الصرف وقت البيع)
8. تعديل منطق إنشاء الفاتورة
- عند اختيار الفرع، يتم تلقائيًا:
- تحديد العملة من الفرع
- جلب سعر البيع من
branch_product_prices
- تسجيل سعر الصرف من
exchange_rates
9. تعديل عمليات الشراء (إن وجدت)
- نفس المنطق أعلاه ينطبق على الشراء، ويُخزن العملة المستخدمة وقت الشراء.
🔵 المرحلة 4: النقد والتحويلات
10. عند التحويل بين خزائن بعملات مختلفة
- يجب تسجيل العملية بسعر الصرف في تلك اللحظة.
- تُحسب الفرق في القيمة عند التحويل وتسجل كـ “فرق صرف”.
11. تعديل cash_transactions
- إضافة
currency_code
,exchange_rate_used
,original_amount
لتوثيق كل عملية.
🔴 المرحلة 5: التقارير الذكية
12. إعداد العملة الأساسية للتقارير
- يتم تحديد
base_currency
في إعدادات النظام (مثلاً USD).
13. توليد التقارير:
- يتم تحويل كل العمليات إلى العملة الأساسية حسب
exchange_rate_at_time
المخزّن. - يجب توفير خيارين:
- عرض الأرقام حسب العملة الأصلية للعملية.
- أو توحيد الأرقام وعرضها بالعملة الأساسية.
14. التقارير تشمل:
- تقارير المبيعات
- الأرباح
- النقدية بالخزائن
- حركة المنتجات
- الجرد
🟣 المرحلة 6: الواجهات والإعدادات
15. إنشاء الصفحات التالية:
الصفحة | الوظيفة |
---|---|
currencies_list.php | إدارة العملات |
exchange_rates.php | أسعار الصرف |
branch_prices.php | أسعار المنتجات لكل فرع |
branch_currency_settings.php | إعداد العملة لكل فرع |
16. أزرار القائمة (أضفتها سابقًا)
- يتم ربط هذه الصفحات مباشرة مع الأزرار:
phpCopyEdit<li class="load_new_panel_page" data-page="currencies_list" data-target="middle">إدارة العملات</li>
<li class="load_new_panel_page" data-page="exchange_rates" data-target="middle">أسعار الصرف</li>
<li class="load_new_panel_page" data-page="branch_prices" data-target="middle">أسعار البيع حسب الفروع</li>
<li class="load_new_panel_page" data-page="branch_currency_settings" data-target="middle">عملة كل فرع</li>
📌 ملحوظات ختامية:
- كل عملية تخزن بالعملة الحقيقية التي تمت بها + سعر الصرف وقتها.
- لا يتم التحويل لسعر صرف جديد عند عرض تقارير قديمة.
- هذا السيناريو يتيح لك التوسع مستقبلًا في:
- الفواتير الضريبية حسب عملة الفرع.
- تقييم الأداء المحاسبي حسب الدولة أو العملة.
- دعم الشيكات أو الدفع الإلكتروني بعملات مختلفة.