Tutorial/سجل الفواتير متعددة العملات

أنشئ سجل فواتير متعددة العملات في Excel

نزّل مصنف Excel للفواتير باليورو والجنيه والين والروبية، مع لقطات صرف مؤرخة وتحويلات USD بالمعادلات وسجل تدقيق.

ERexchangerate.dev·تحديث 8 سبتمبر 2026·8 دقائق قراءة

يحافظ المصنف على مبلغ الفاتورة بعملته الأصلية ويحوّله إلى USD باستخدام اللقطة المؤرخة التي تختارها. تبقى الصفوف المرحّلة قابلة لإعادة الإنتاج لأن التاريخ والمصدر وdata_updated_at والسعر محفوظة معاً.

Key points
مصنف جاهز مع فواتير ولقطات مؤرخة ومعادلات.
rate_per_usd هو عدد وحدات العملة مقابل USD واحد.
احفظ المصدر والجلسة وdata_updated_at للصف المرحّل.
يضيف Power Query لقطات جديدة دون استبدال القيم المثبتة.
الأسعار إرشادية وليست نصيحة ضريبية أو محاسبية.

نزّل المصنف

نزّل مصنف سجل الفواتير وافتحه في Excel. يحتوي على فواتير توضيحية ولقطات EUR/GBP/JPY/IDR وأعمدة USD وسجل تدقيق. استبدل الأمثلة بسجلاتك.

افهم أوراق العمل الأربع

تحتوي Invoice Tracker على الفواتير والمعادلات، وتحفظ FX Snapshots ملاحظة مؤرخة لكل عملة، وتسجل Audit Trail قرار التثبيت، وتشرح Read Me طريقة الاستخدام والحدود.

أضف فاتورة بعملتها الأصلية

أدخل رقم الفاتورة والعميل والتواريخ والعملة والصافي والضريبة وتاريخ السعر والحالة في الخلايا الزرقاء. اترك Net وTax وGross بعملة الفاتورة.

أضف لقطة الصرف المؤرخة

أضف الملاحظة التاريخية المستخدمة بالضبط. احفظ التاريخ والعملة وsource وmarket_session وdata_updated_at والسعر. السعر هو وحدات عملة الفاتورة مقابل USD واحد. استخدم Snapshot ID فريداً مثل EUR-20260602-v1، وتحقق من وجود صف واحد بالضبط ومن تطابق عملة اللقطة مع عملة الفاتورة. أضف v2 للتصحيح ولا تستبدل v1. يوضح data_updated_at وقت تحديث البيانات التاريخية، وليس effective_at.

Representative historical responsecopy
{
  "result": "success",
  "base": "USD",
  "date": "2026-06-02",
  "source": "ecb_daily",
  "sources": { "EUR": "ecb_daily" },
  "market_session": "open",
  "timestamp": "2026-09-08T11:52:18Z",
  "data_updated_at": "2026-06-02T00:00:00Z",
  "is_forward_filled": false,
  "rates": { "EUR": 0.85844 },
  "notice": "Indicative rates, not for settlement."
}

راجع أعمدة USD المحسوبة

يطابق المصنف التاريخ والعملة مع FX Snapshots ثم يقسم المبلغ على FX Rate / USD. Gross يساوي Net + Tax، وتبقى أعمدة USD فارغة عند غياب اللقطة. تمتد المعادلات إلى الصف100 للفواتير واللقطات؛ وسّع النطاقين معاً. Posted تسمية فقط ولا يقفل الخلايا أو يثبت المعادلات تلقائياً.

Excel formula · Net USDcopy
=IF(OR(F6<0,G6<0,H6<0,K6="",L6="Missing snapshot ID",L6="Duplicate snapshot ID",L6="Currency mismatch",L6="Invalid rate"),"",F6/K6)

ثبّت القيم المرحّلة

بعد ترحيل الفاتورة، لا تغيّر صف اللقطة. أضف صفاً جديداً للتصحيح أو إعادة العرض وسجّل السبب في Audit Trail إذا تغيّر المصدر.

أضف لقطة جديدة عبر Power Query

يستدعي سكريبت Power Query تاريخاً وعملة محددين. حمّل الناتج كصف جديد ولا تضع مفتاحاً في مصنف مشترك. يعيد Power Query تسعة أعمدة A:I. حمّلها أولاً إلى ورقة staging، ثم انسخ صف البيانات بلا العناوين والصقه كقيم ابتداءً من الصف7. Refresh All يستبدل ناتج الاستعلام ولا يضيف تاريخاً ثابتاً. في Windows استخدم Data → Get Data → From Other Sources → Blank Query، وفي Microsoft 365 for Mac استخدم Data → Get Data → Launch Power Query Editor. اختر Anonymous، واستخدم وسيطاً على الخادم عند الحاجة إلى مفتاح.

Power Query M · explicit snapshotcopy
let
    SnapshotDate = "2026-06-02",
    Currency = Text.Upper(Text.Trim("EUR")),
    Revision = "v1",
    SelectedDate = Date.FromText(SnapshotDate, [Format = "yyyy-MM-dd", Culture = "en-US"]),
    RelativePath = "v1/" & Date.ToText(SelectedDate, "yyyy-MM-dd") & "/USD",
    Endpoint = "https://api.exchangerate.dev/" & RelativePath & "?symbols=" & Currency,
    Payload = Json.Document(Web.Contents("https://api.exchangerate.dev", [
        RelativePath = RelativePath,
        Query = [symbols = Currency],
        Timeout = #duration(0, 0, 0, 10)
    ])),
    Source = if Payload[base] <> "USD" or Payload[date] <> SnapshotDate
        then error "Unexpected response base or date" else Payload,
    RawRate = Record.Field(Source[rates], Currency),
    Rate = if not Value.Is(RawRate, type number) or RawRate <= 0
        then error "Expected a positive numeric rate" else RawRate,
    SnapshotId = Currency & "-" & Text.Replace(SnapshotDate, "-", "") & "-" & Revision,
    Notes = "Response timestamp=" & Source[timestamp] & "; is_forward_filled=" &
        (if Source[is_forward_filled] then "true" else "false"),
    Snapshot = #table(
        {"Snapshot ID", "Snapshot Date", "Currency", "Source", "Market Session", "Data Updated At (UTC)", "Rate / USD", "API Endpoint", "Notes"},
        {{SnapshotId, SelectedDate, Currency, Record.Field(Source[sources], Currency), Source[market_session], Source[data_updated_at], Rate, Endpoint, Notes}}
    )
in
    Snapshot

احتفظ بسجل التدقيق

سجّل وقت الترحيل واللقطة والمصدر/الجلسة وسبب التثبيت. احتفظ بالاستجابة الأصلية عندما تحتاج عمليتك إلى دليل إضافي. احفظ في Notes طابع الاستجابة وis_forward_filled، وسجل Snapshot ID والمصدر والجلسة وسبب التصحيح.

استخدم النتيجة للتقارير فقط

هذا مثال للتقارير والتحليل فقط. لا يحدد الضرائب أو المحاسبة أو الامتثال أو التسوية أو مبلغ مزود الدفع. تنتهي السعة النموذجية عند الصف100؛ وسّع المعادلات ونطاقات البحث معاً.

ER
exchangerate.dev
exchangerate.dev

تابع القراءة

Referenceأضف لقطة الصرف المؤرخةاقرأ Tutorialأضف لقطة جديدة عبر Power Queryاقرأ Tutorialالحصول على أسعار الصرف في Pythonاقرأ
المزيد من المقارناتFixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.dev
تعلّمReading source and market_session in your pipelineIndicative vs executable FX rates: what a rates API actually gives youأسعار الصرف المرجعية للبنك المركزي الأوروبي، موضحة
أسعار مباشرةEUR/USDGBP/USDUSD/JPY