import { Tenant } from '../../database/entities/tenant.entity'; /** * رسم ثابت على كل عملية دفع → إيراد المستأجر (docs/24 §3.3). * * **مصدر واحد للرقم.** في سيرو كُتب رسم السحب (3500) في موضعين: الفحص يشترط * `amount + 3500` والتسوية تخصم `amount − 3500` — فتناقضا وتسرّب المال في كل * عملية (docs/21). لذلك لا يُكتب أي رسم في منطق الأعمال إطلاقاً؛ يُقرأ من هنا. */ /** الافتراضات حسب دولة المستأجر. تُتجاوَز من `tenant.settings.payments`. */ export const DEFAULT_TRANSACTION_FEE: Record = { sy: { fee: 35, currency: 'SYP' }, // بالليرة الجديدة (بعد حذف صفرين) eg: { fee: 5, currency: 'EGP' }, jo: { fee: 0.2, currency: 'JOD' }, // 20 قرشاً }; export const FALLBACK_FEE = { fee: 0, currency: 'JOD' }; /** * رسم العملية الفعلي للمستأجر. * * الأولوية: إعداد المستأجر ← افتراض دولته ← صفر. الافتراض الأخير **صفر لا * رقمٌ مخمَّن**: أن نعجز عن معرفة الرسم فنقتطع مبلغاً عشوائياً من مستخدم * حقيقي أسوأ من ألّا نقتطع شيئاً ونكتشف الإعداد الناقص من التقارير. */ export function transactionFeeFor(tenant: Pick): { fee: number; currency: string; } { const configured = tenant?.settings?.payments; const byCountry = DEFAULT_TRANSACTION_FEE[tenant?.countryPack ?? ''] ?? FALLBACK_FEE; const fee = Number(configured?.transaction_fee); return { // `Number.isFinite` لا `??`: قيمة `0` صالحة تماماً (مستأجر بلا رسوم)، // و`||` كان سيبتلعها ويعيدها إلى افتراض الدولة. fee: Number.isFinite(fee) && fee >= 0 ? fee : byCountry.fee, currency: configured?.currency ?? byCountry.currency, }; } /** * الرسم لا يتجاوز المبلغ نفسه. بلا هذا، شحنٌ صغير في سوريا (20 ل.س ورسمه 35) * يُنتج صافياً سالباً — أي أن المستخدم يدفع ويخرج برصيد أقل مما بدأ به. */ export function cappedFee(fee: number, amount: number): number { if (!(fee > 0)) return 0; return Math.min(fee, Math.max(0, Number(amount))); }