deepsite / wallets.js
almortamoh's picture
Upload 36 files
a79063d verified
raw
history blame
14.9 kB
// إدارة المحافظ الإلكترونية
class WalletManager {
constructor() {
this.supportedWallets = {
jawali: {
id: 'jawali',
name: 'جوالي',
nameEn: 'Jawali',
provider: 'WeCash YE',
packageId: 'com.ama.wecashmobileapp',
icon: 'https://play-lh.googleusercontent.com/NuKV_Snecpx633RHzIWvFauG32WBAk-jt3lcZOajw2w7VD8Hdt8h5Lb0pYLopB_Qk4Y=w240-h480',
color: '#4361ee',
features: ['transfer', 'bills', 'recharge', 'qr'],
supportedCurrencies: ['YER', 'SAR', 'USD'],
maxTransfer: 3000000,
fees: {
transfer: 20,
billPayment: 15,
recharge: 10
}
},
onecash: {
id: 'onecash',
name: 'ONE Cash',
nameEn: 'ONE Cash',
provider: 'ONECASHYE',
packageId: 'com.one.onecustomer',
icon: 'https://play-lh.googleusercontent.com/OF2xMRUmNH47BIaOTbv7GgvmLRTQbT1xHkFF_Ocswx6Jq5gfX4VlfAl_275UmjH2pg=w240-h480',
color: '#059669',
features: ['transfer', 'bills', 'recharge', 'qr', 'international'],
supportedCurrencies: ['YER', 'SAR', 'USD'],
maxTransfer: 3000000,
fees: {
transfer: 0, // مجاني للمستخدمين
billPayment: 10,
recharge: 5
}
},
cash: {
id: 'cash',
name: 'Cash',
nameEn: 'Cash',
provider: 'Tamkeen Financial',
packageId: 'com.tamkeen.sms',
icon: 'https://play-lh.googleusercontent.com/zkV8HeO6iF2xa77ObHdKfAXfrfjU5fgWB0XsWt7_DmG4VGSKob2jU_CrqWyKQtghQyE=w240-h480',
color: '#dc2626',
features: ['transfer', 'bills', 'recharge', 'qr', 'offline'],
supportedCurrencies: ['YER'],
maxTransfer: 2000000,
fees: {
transfer: 25,
billPayment: 20,
recharge: 15
}
},
jaib: {
id: 'jaib',
name: 'Jaib',
nameEn: 'Jaib Digital Wallet',
provider: 'AHD Financial',
packageId: 'com.ahd.jaib',
icon: 'https://play-lh.googleusercontent.com/EAaXnjh1FVPYpI5qWZwWvZIV5oD1hm9auDX0owOgREBjMAzYKX9od1USWRzlXIhRvKMx=w240-h480',
color: '#7c3aed',
features: ['transfer', 'bills', 'recharge', 'qr', 'entertainment'],
supportedCurrencies: ['YER'],
maxTransfer: 1500000,
fees: {
transfer: 15,
billPayment: 12,
recharge: 8
}
},
mfloos: {
id: 'mfloos',
name: 'mFloos',
nameEn: 'mFloos - Customers',
provider: 'Alkuraimi Islamic Microfinance Bank',
packageId: 'wallet.mfloos.com.mflooswallet.customer',
icon: 'https://play-lh.googleusercontent.com/mNvakjEk-3VX7icU5w4xmAhT4MQgGAGcQYpRvPkBLVTzD-sYnmzAH_wuglMujTsaqQ=w240-h480',
color: '#0891b2',
features: ['transfer', 'bills', 'recharge', 'banking'],
supportedCurrencies: ['YER'],
maxTransfer: 1000000,
fees: {
transfer: 10,
billPayment: 8,
recharge: 5
}
},
mobilemoney: {
id: 'mobilemoney',
name: 'Mobile Money',
nameEn: 'Mobile Money Wallet',
provider: 'CAC Bank',
packageId: 'cac.mobilemoney.app',
icon: 'https://play-lh.googleusercontent.com/51r7PLMlK0gVvITgOoJ7BnGX-9Gq3_ayiSiHHxSDbJZPCgABXI_LnU6jNCHAefWHvSPV=w240-h480',
color: '#ea580c',
features: ['transfer', 'bills', 'recharge', 'atm'],
supportedCurrencies: ['YER'],
maxTransfer: 2500000,
fees: {
transfer: 18,
billPayment: 15,
recharge: 12
}
}
};
this.userWallets = [];
this.init();
}
// تهيئة مدير المحافظ
init() {
this.loadUserWallets();
}
// تحميل محافظ المستخدم
loadUserWallets() {
const savedWallets = localStorage.getItem('unifiedWallet_userWallets');
if (savedWallets) {
this.userWallets = JSON.parse(savedWallets);
}
}
// حفظ محافظ المستخدم
saveUserWallets() {
localStorage.setItem('unifiedWallet_userWallets', JSON.stringify(this.userWallets));
}
// إضافة محفظة جديدة
async addWallet(walletId, accountNumber, pin) {
const walletInfo = this.supportedWallets[walletId];
if (!walletInfo) {
throw new Error('محفظة غير مدعومة');
}
// التحقق من صحة البيانات
if (!this.validateAccountNumber(accountNumber)) {
throw new Error('رقم الحساب غير صحيح');
}
if (!this.validatePin(pin)) {
throw new Error('رمز PIN غير صحيح');
}
// التحقق من عدم وجود المحفظة مسبقاً
const existingWallet = this.userWallets.find(w => w.id === walletId);
if (existingWallet) {
throw new Error('هذه المحفظة مضافة مسبقاً');
}
// محاكاة التحقق من المحفظة
await this.verifyWalletCredentials(walletId, accountNumber, pin);
// إضافة المحفظة
const newWallet = {
id: walletId,
accountNumber: accountNumber,
pin: this.encryptPin(pin),
balance: await this.fetchWalletBalance(walletId, accountNumber),
status: 'active',
addedAt: new Date().toISOString(),
lastSync: new Date().toISOString()
};
this.userWallets.push(newWallet);
this.saveUserWallets();
return newWallet;
}
// إزالة محفظة
removeWallet(walletId) {
const index = this.userWallets.findIndex(w => w.id === walletId);
if (index === -1) {
throw new Error('المحفظة غير موجودة');
}
this.userWallets.splice(index, 1);
this.saveUserWallets();
}
// تحديث رصيد محفظة
async updateWalletBalance(walletId) {
const wallet = this.userWallets.find(w => w.id === walletId);
if (!wallet) {
throw new Error('المحفظة غير موجودة');
}
const newBalance = await this.fetchWalletBalance(walletId, wallet.accountNumber);
wallet.balance = newBalance;
wallet.lastSync = new Date().toISOString();
this.saveUserWallets();
return newBalance;
}
// تحديث جميع الأرصدة
async updateAllBalances() {
const updatePromises = this.userWallets.map(wallet =>
this.updateWalletBalance(wallet.id)
);
await Promise.all(updatePromises);
}
// تنفيذ تحويل
async executeTransfer(fromWalletId, toWalletId, amount, recipientNumber, pin) {
const fromWallet = this.userWallets.find(w => w.id === fromWalletId);
if (!fromWallet) {
throw new Error('محفظة المرسل غير موجودة');
}
const fromWalletInfo = this.supportedWallets[fromWalletId];
const toWalletInfo = this.supportedWallets[toWalletId];
// التحقق من الرصيد
const fee = fromWalletInfo.fees.transfer;
const totalAmount = amount + fee;
if (fromWallet.balance < totalAmount) {
throw new Error('الرصيد غير كافي');
}
// التحقق من الحد الأقصى للتحويل
if (amount > fromWalletInfo.maxTransfer) {
throw new Error(`الحد الأقصى للتحويل هو ${fromWalletInfo.maxTransfer.toLocaleString()} ر.ي`);
}
// التحقق من رمز PIN
if (!this.verifyPin(pin, fromWallet.pin)) {
throw new Error('رمز PIN غير صحيح');
}
// تنفيذ التحويل
await this.processTransfer({
fromWallet: fromWalletId,
toWallet: toWalletId,
amount: amount,
fee: fee,
recipientNumber: recipientNumber,
timestamp: new Date().toISOString()
});
// تحديث الرصيد
fromWallet.balance -= totalAmount;
this.saveUserWallets();
return {
success: true,
transactionId: this.generateTransactionId(),
amount: amount,
fee: fee,
total: totalAmount,
newBalance: fromWallet.balance
};
}
// دفع فاتورة
async payBill(walletId, billType, billNumber, amount, pin) {
const wallet = this.userWallets.find(w => w.id === walletId);
if (!wallet) {
throw new Error('المحفظة غير موجودة');
}
const walletInfo = this.supportedWallets[walletId];
const fee = walletInfo.fees.billPayment;
const totalAmount = amount + fee;
if (wallet.balance < totalAmount) {
throw new Error('الرصيد غير كافي');
}
if (!this.verifyPin(pin, wallet.pin)) {
throw new Error('رمز PIN غير صحيح');
}
// تنفيذ دفع الفاتورة
await this.processBillPayment({
wallet: walletId,
billType: billType,
billNumber: billNumber,
amount: amount,
fee: fee,
timestamp: new Date().toISOString()
});
wallet.balance -= totalAmount;
this.saveUserWallets();
return {
success: true,
transactionId: this.generateTransactionId(),
amount: amount,
fee: fee,
total: totalAmount,
newBalance: wallet.balance
};
}
// شحن رصيد
async rechargeBalance(walletId, phoneNumber, amount, pin) {
const wallet = this.userWallets.find(w => w.id === walletId);
if (!wallet) {
throw new Error('المحفظة غير موجودة');
}
const walletInfo = this.supportedWallets[walletId];
const fee = walletInfo.fees.recharge;
const totalAmount = amount + fee;
if (wallet.balance < totalAmount) {
throw new Error('الرصيد غير كافي');
}
if (!this.verifyPin(pin, wallet.pin)) {
throw new Error('رمز PIN غير صحيح');
}
// تنفيذ شحن الرصيد
await this.processRecharge({
wallet: walletId,
phoneNumber: phoneNumber,
amount: amount,
fee: fee,
timestamp: new Date().toISOString()
});
wallet.balance -= totalAmount;
this.saveUserWallets();
return {
success: true,
transactionId: this.generateTransactionId(),
amount: amount,
fee: fee,
total: totalAmount,
newBalance: wallet.balance
};
}
// الحصول على معلومات محفظة
getWalletInfo(walletId) {
return this.supportedWallets[walletId];
}
// الحصول على محافظ المستخدم
getUserWallets() {
return this.userWallets.map(userWallet => {
const walletInfo = this.supportedWallets[userWallet.id];
return {
...walletInfo,
...userWallet,
accountNumber: userWallet.accountNumber
};
});
}
// التحقق من صحة رقم الحساب
validateAccountNumber(accountNumber) {
return /^[0-9]{9}$/.test(accountNumber);
}
// التحقق من صحة رمز PIN
validatePin(pin) {
return /^[0-9]{4,6}$/.test(pin);
}
// تشفير رمز PIN
encryptPin(pin) {
// تشفير بسيط للتجربة - في الإنتاج يجب استخدام تشفير قوي
return btoa(pin);
}
// فك تشفير رمز PIN
decryptPin(encryptedPin) {
return atob(encryptedPin);
}
// التحقق من رمز PIN
verifyPin(pin, encryptedPin) {
return pin === this.decryptPin(encryptedPin);
}
// توليد معرف معاملة
generateTransactionId() {
return 'TXN' + Date.now() + Math.random().toString(36).substr(2, 5).toUpperCase();
}
// محاكاة التحقق من بيانات المحفظة
async verifyWalletCredentials(walletId, accountNumber, pin) {
// محاكاة استدعاء API للتحقق
await new Promise(resolve => setTimeout(resolve, 1500));
// في التطبيق الحقيقي، سيتم التحقق من البيانات مع خوادم المحفظة
return true;
}
// محاكاة جلب رصيد المحفظة
async fetchWalletBalance(walletId, accountNumber) {
// محاكاة استدعاء API لجلب الرصيد
await new Promise(resolve => setTimeout(resolve, 1000));
// إرجاع رصيد عشوائي للتجربة
return Math.floor(Math.random() * 50000) + 1000;
}
// محاكاة تنفيذ التحويل
async processTransfer(transferData) {
await new Promise(resolve => setTimeout(resolve, 2000));
// في التطبيق الحقيقي، سيتم إرسال البيانات لخوادم المحفظة
console.log('تم تنفيذ التحويل:', transferData);
}
// محاكاة دفع الفاتورة
async processBillPayment(billData) {
await new Promise(resolve => setTimeout(resolve, 1500));
console.log('تم دفع الفاتورة:', billData);
}
// محاكاة شحن الرصيد
async processRecharge(rechargeData) {
await new Promise(resolve => setTimeout(resolve, 1000));
console.log('تم شحن الرصيد:', rechargeData);
}
}
// تصدير الكلاس للاستخدام في التطبيق الرئيسي
window.WalletManager = WalletManager;